From xen-devel-bounces@lists.xen.org Wed Apr 04 13:31:46 2012
Return-path: <xen-devel-bounces@lists.xen.org>
Envelope-to: archives@lists.xen.org
Delivery-date: Wed, 04 Apr 2012 13:31:46 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xen.org>)
	id 1SFQIl-00081d-1l; Wed, 04 Apr 2012 13:31:07 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fantonifabio@tiscali.it>) id 1SFQIi-00081Y-HT
	for xen-devel@lists.xensource.com; Wed, 04 Apr 2012 13:31:05 +0000
Received: from [85.158.138.51:30103] by server-3.bemta-3.messagelabs.com id
	F9/B5-10665-71D4C7F4; Wed, 04 Apr 2012 13:31:03 +0000
X-Env-Sender: fantonifabio@tiscali.it
X-Msg-Ref: server-4.tower-174.messagelabs.com!1333546260!20770312!1
X-Originating-IP: [82.57.200.103]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG,
	ML_RADAR_SPEW_LINKS_14,ML_RADAR_SPEW_LINKS_23,spamassassin: 
X-StarScan-Version: 6.5.7; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22399 invoked from network); 4 Apr 2012 13:31:00 -0000
Received: from smtp207.alice.it (HELO smtp207.alice.it) (82.57.200.103)
	by server-4.tower-174.messagelabs.com with SMTP;
	4 Apr 2012 13:31:00 -0000
Received: from [192.168.178.50] (87.2.83.254) by smtp207.alice.it (8.6.023.02)
	id 4F05A6650A8171D7 for xen-devel@lists.xensource.com;
	Wed, 4 Apr 2012 15:30:58 +0200
Message-ID: <4F7C4D0A.1070809@tiscali.it>
Date: Wed, 04 Apr 2012 15:30:50 +0200
From: Fabio Fantoni <fantonifabio@tiscali.it>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:11.0) Gecko/20120327 Thunderbird/11.0.1
MIME-Version: 1.0
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH v2] Autoconf: add variable for pass arbitrary
 options to qemu upstream
X-BeenThere: xen-devel@lists.xen.org
X-Mailman-Version: 2.1.13
Precedence: list
Reply-To: fantonifabio@tiscali.it
List-Id: Xen developer discussion <xen-devel.lists.xen.org>
List-Unsubscribe: <http://lists.xen.org/cgi-bin/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xen.org?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xen.org>
List-Help: <mailto:xen-devel-request@lists.xen.org?subject=help>
List-Subscribe: <http://lists.xen.org/cgi-bin/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xen.org?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============7463004862380400107=="
Sender: xen-devel-bounces@lists.xen.org
Errors-To: xen-devel-bounces@lists.xen.org

Questo è un messaggio firmato digitalmente in formato MIME.

--===============7463004862380400107==
Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha1; boundary="------------ms040009030202020409000402"

Questo è un messaggio firmato digitalmente in formato MIME.

--------------ms040009030202020409000402
Content-Type: multipart/mixed;
 boundary="------------050506080203010500080701"

This is a multi-part message in MIME format.
--------------050506080203010500080701
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: quoted-printable

Autoconf: add variable for pass arbitrary options to qemu upstream v2

Signed-off-by: Fabio Fantoni <fabio.fantoni@heliman.it>

Patch attached.

--------------050506080203010500080701
Content-Type: text/plain; charset=windows-1252;
 name="autoconf_add_arbitrary_options_qemuu_v2.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
 filename="autoconf_add_arbitrary_options_qemuu_v2.patch"

# HG changeset patch
# User Fabio Fantoni
# Date 1333545026 -7200
# Node ID 9fb366d55ed2c192f3c0871e678de2a9e5067165
# Parent  527b8ae57ff2fce676c662fb42e31e65007b2036
autoconf: add variable for pass arbitrary options to qemu upstream v2

Signed-off-by: Fabio Fantoni <fabio.fantoni@heliman.it>

diff -r 527b8ae57ff2 -r 9fb366d55ed2 config/Tools.mk.in
--- a/config/Tools.mk.in	mer apr 04 14:36:16 2012 +0200
+++ b/config/Tools.mk.in	mer apr 04 15:10:26 2012 +0200
@@ -44,3 +44,4 @@
 CONFIG_GCRYPT       :=3D @libgcrypt@
 CONFIG_EXT2FS       :=3D @libext2fs@
 CURSES_LIBS         :=3D @CURSES_LIBS@
+CONFIG_QEMUU_ADD_PAR:=3D @qemuu_add_par@
diff -r 527b8ae57ff2 -r 9fb366d55ed2 tools/Makefile
--- a/tools/Makefile	mer apr 04 14:36:16 2012 +0200
+++ b/tools/Makefile	mer apr 04 15:10:26 2012 +0200
@@ -157,6 +157,7 @@
 		--datadir=3D$(SHAREDIR)/qemu-xen \
 		--disable-kvm \
 		--python=3D$(PYTHON) \
+		$(CONFIG_QEMUU_ADD_PAR) \
 		$(IOEMU_CONFIGURE_CROSS); \
 	$(MAKE) install
=20
diff -r 527b8ae57ff2 -r 9fb366d55ed2 tools/configure
--- a/tools/configure	mer apr 04 14:36:16 2012 +0200
+++ b/tools/configure	mer apr 04 15:10:26 2012 +0200
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.67 for Xen Hypervisor 4.2.
+# Generated by GNU Autoconf 2.68 for Xen Hypervisor 4.2.
 #
 # Report bugs to <xen-devel@lists.xensource.com>.
 #
@@ -91,6 +91,7 @@
 IFS=3D" ""	$as_nl"
=20
 # Find who we are.  Look in the path if we contain no directory separato=
r.
+as_myself=3D
 case $0 in #((
   *[\\/]* ) as_myself=3D$0 ;;
   *) as_save_IFS=3D$IFS; IFS=3D$PATH_SEPARATOR
@@ -216,11 +217,18 @@
   # We cannot yet assume a decent shell, so we have to provide a
 	# neutralization value for shells without unset; and this also
 	# works around shells that cannot unset nonexistent variables.
+	# Preserve -v and -x to the replacement shell.
 	BASH_ENV=3D/dev/null
 	ENV=3D/dev/null
 	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
 	export CONFIG_SHELL
-	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+	case $- in # ((((
+	  *v*x* | *x*v* ) as_opts=3D-vx ;;
+	  *v* ) as_opts=3D-v ;;
+	  *x* ) as_opts=3D-x ;;
+	  * ) as_opts=3D ;;
+	esac
+	exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
 fi
=20
     if test x$as_have_required =3D xno; then :
@@ -645,6 +653,7 @@
 APPEND_INCLUDES
 PREPEND_LIB
 PREPEND_INCLUDES
+qemuu_add_par
 debug
 lomount
 miniterm
@@ -722,6 +731,9 @@
 enable_miniterm
 enable_lomount
 enable_debug
+enable_qemuu_spice
+enable_qemuu_usbredir
+enable_qemuu_debug
 '
       ac_precious_vars=3D'build_alias
 host_alias
@@ -1153,7 +1165,7 @@
     $as_echo "$as_me: WARNING: you should use --build, --host, --target"=
 >&2
     expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
-    : ${build_alias=3D$ac_option} ${host_alias=3D$ac_option} ${target_al=
ias=3D$ac_option}
+    : "${build_alias=3D$ac_option} ${host_alias=3D$ac_option} ${target_a=
lias=3D$ac_option}"
     ;;
=20
   esac
@@ -1376,6 +1388,9 @@
   --enable-miniterm       Enable miniterm (default is DISABLED)
   --enable-lomount        Enable lomount (default is DISABLED)
   --disable-debug         Disable debug build of tools (default is ENABL=
ED)
+  --enable-qemuu-spice	Enable Spice build on qemu upstream
+  --enable-qemuu-usbredir	Enable usb redirection build on qemu upstream
+  --enable-qemuu-debug	Enable debug build on qemu upstream
=20
 Some influential environment variables:
   CC          C compiler command
@@ -1475,7 +1490,7 @@
 if $ac_init_version; then
   cat <<\_ACEOF
 Xen Hypervisor configure 4.2
-generated by GNU Autoconf 2.67
+generated by GNU Autoconf 2.68
=20
 Copyright (C) 2010 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
@@ -1521,7 +1536,7 @@
=20
 	ac_retval=3D1
 fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=3D=
; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
   as_fn_set_status $ac_retval
=20
 } # ac_fn_c_try_compile
@@ -1558,7 +1573,7 @@
=20
     ac_retval=3D1
 fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=3D=
; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
   as_fn_set_status $ac_retval
=20
 } # ac_fn_c_try_cpp
@@ -1571,10 +1586,10 @@
 ac_fn_c_check_header_mongrel ()
 {
   as_lineno=3D${as_lineno-"$1"} as_lineno_stack=3Das_lineno_stack=3D$as_=
lineno_stack
-  if eval "test \"\${$3+set}\"" =3D set; then :
+  if eval \${$3+:} false; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
 $as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" =3D set; then :
+if eval \${$3+:} false; then :
   $as_echo_n "(cached) " >&6
 fi
 eval ac_res=3D\$$3
@@ -1641,7 +1656,7 @@
 esac
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
 $as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" =3D set; then :
+if eval \${$3+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   eval "$3=3D\$ac_header_compiler"
@@ -1650,7 +1665,7 @@
 	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
 $as_echo "$ac_res" >&6; }
 fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=3D=
; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
=20
 } # ac_fn_c_check_header_mongrel
=20
@@ -1691,7 +1706,7 @@
        ac_retval=3D$ac_status
 fi
   rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=3D=
; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
   as_fn_set_status $ac_retval
=20
 } # ac_fn_c_try_run
@@ -1705,7 +1720,7 @@
   as_lineno=3D${as_lineno-"$1"} as_lineno_stack=3Das_lineno_stack=3D$as_=
lineno_stack
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
 $as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" =3D set; then :
+if eval \${$3+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -1723,7 +1738,7 @@
 eval ac_res=3D\$$3
 	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
 $as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=3D=
; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
=20
 } # ac_fn_c_check_header_compile
=20
@@ -1768,11 +1783,65 @@
   # interfere with the next link command; also delete a directory that i=
s
   # left behind by Apple's compiler.  We do this before executing the ac=
tions.
   rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=3D=
; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
   as_fn_set_status $ac_retval
=20
 } # ac_fn_c_try_link
=20
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cach=
e
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+  as_lineno=3D${as_lineno-"$1"} as_lineno_stack=3Das_lineno_stack=3D$as_=
lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=3Dno"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+	 return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+	    return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  eval "$3=3Dyes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=3D\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
 # ac_fn_c_check_func LINENO FUNC VAR
 # ----------------------------------
 # Tests whether FUNC exists, setting the cache variable VAR accordingly
@@ -1781,7 +1850,7 @@
   as_lineno=3D${as_lineno-"$1"} as_lineno_stack=3Das_lineno_stack=3D$as_=
lineno_stack
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
 $as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" =3D set; then :
+if eval \${$3+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -1836,64 +1905,10 @@
 eval ac_res=3D\$$3
 	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
 $as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=3D=
; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
=20
 } # ac_fn_c_check_func
=20
-# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
-# -------------------------------------------
-# Tests whether TYPE exists after having included INCLUDES, setting cach=
e
-# variable VAR accordingly.
-ac_fn_c_check_type ()
-{
-  as_lineno=3D${as_lineno-"$1"} as_lineno_stack=3Das_lineno_stack=3D$as_=
lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" =3D set; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=3Dno"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof ($2))
-	 return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof (($2)))
-	    return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  eval "$3=3Dyes"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=3D\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=3D=
; unset as_lineno;}
-
-} # ac_fn_c_check_type
-
 # ac_fn_c_find_intX_t LINENO BITS VAR
 # -----------------------------------
 # Finds a signed integer type with width BITS, setting cache variable VA=
R
@@ -1903,7 +1918,7 @@
   as_lineno=3D${as_lineno-"$1"} as_lineno_stack=3Das_lineno_stack=3D$as_=
lineno_stack
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5
 $as_echo_n "checking for int$2_t... " >&6; }
-if eval "test \"\${$3+set}\"" =3D set; then :
+if eval \${$3+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   eval "$3=3Dno"
@@ -1964,7 +1979,7 @@
 eval ac_res=3D\$$3
 	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
 $as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=3D=
; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
=20
 } # ac_fn_c_find_intX_t
=20
@@ -1977,7 +1992,7 @@
   as_lineno=3D${as_lineno-"$1"} as_lineno_stack=3Das_lineno_stack=3D$as_=
lineno_stack
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
 $as_echo_n "checking for $2.$3... " >&6; }
-if eval "test \"\${$4+set}\"" =3D set; then :
+if eval \${$4+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -2021,7 +2036,7 @@
 eval ac_res=3D\$$4
 	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
 $as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=3D=
; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
=20
 } # ac_fn_c_check_member
=20
@@ -2034,7 +2049,7 @@
   as_lineno=3D${as_lineno-"$1"} as_lineno_stack=3Das_lineno_stack=3D$as_=
lineno_stack
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5
 $as_echo_n "checking for uint$2_t... " >&6; }
-if eval "test \"\${$3+set}\"" =3D set; then :
+if eval \${$3+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   eval "$3=3Dno"
@@ -2074,7 +2089,7 @@
 eval ac_res=3D\$$3
 	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
 $as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=3D=
; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
=20
 } # ac_fn_c_find_uintX_t
 cat >config.log <<_ACEOF
@@ -2082,7 +2097,7 @@
 running configure, to aid debugging if configure makes a mistake.
=20
 It was created by Xen Hypervisor $as_me 4.2, which was
-generated by GNU Autoconf 2.67.  Invocation command line was
+generated by GNU Autoconf 2.68.  Invocation command line was
=20
   $ $0 $@
=20
@@ -2340,7 +2355,7 @@
       || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd'=
:" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "failed to load site script $ac_site_file
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
   fi
 done
=20
@@ -2493,7 +2508,7 @@
 set dummy ${ac_tool_prefix}gcc; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" =3D set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -2533,7 +2548,7 @@
 set dummy gcc; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" =3D set; then :
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_CC"; then
@@ -2586,7 +2601,7 @@
 set dummy ${ac_tool_prefix}cc; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" =3D set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -2626,7 +2641,7 @@
 set dummy cc; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" =3D set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -2685,7 +2700,7 @@
 set dummy $ac_tool_prefix$ac_prog; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" =3D set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -2729,7 +2744,7 @@
 set dummy $ac_prog; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" =3D set; then :
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_CC"; then
@@ -2784,7 +2799,7 @@
 test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`=
$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
=20
 # Provide some information about the compiler.
 $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" =
>&5
@@ -2899,7 +2914,7 @@
 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error 77 "C compiler cannot create executables
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
@@ -2942,7 +2957,7 @@
   { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "cannot compute suffix of executables: cannot compile and=
 link
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
 fi
 rm -f conftest conftest$ac_cv_exeext
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
@@ -3001,7 +3016,7 @@
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "cannot run C compiled programs.
 If you meant to cross compile, use \`--host'.
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
     fi
   fi
 fi
@@ -3012,7 +3027,7 @@
 ac_clean_files=3D$ac_clean_files_save
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object f=
iles" >&5
 $as_echo_n "checking for suffix of object files... " >&6; }
-if test "${ac_cv_objext+set}" =3D set; then :
+if ${ac_cv_objext+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3053,7 +3068,7 @@
 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
 fi
 rm -f conftest.$ac_cv_objext conftest.$ac_ext
 fi
@@ -3063,7 +3078,7 @@
 ac_objext=3D$OBJEXT
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using t=
he GNU C compiler" >&5
 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; }=

-if test "${ac_cv_c_compiler_gnu+set}" =3D set; then :
+if ${ac_cv_c_compiler_gnu+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3100,7 +3115,7 @@
 ac_save_CFLAGS=3D$CFLAGS
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g=
" >&5
 $as_echo_n "checking whether $CC accepts -g... " >&6; }
-if test "${ac_cv_prog_cc_g+set}" =3D set; then :
+if ${ac_cv_prog_cc_g+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_save_c_werror_flag=3D$ac_c_werror_flag
@@ -3178,7 +3193,7 @@
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to acce=
pt ISO C89" >&5
 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if test "${ac_cv_prog_cc_c89+set}" =3D set; then :
+if ${ac_cv_prog_cc_c89+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_cv_prog_cc_c89=3Dno
@@ -3286,7 +3301,7 @@
   CPP=3D
 fi
 if test -z "$CPP"; then
-  if test "${ac_cv_prog_CPP+set}" =3D set; then :
+  if ${ac_cv_prog_CPP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
       # Double quotes because CPP needs to be expanded
@@ -3402,7 +3417,7 @@
   { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
 fi
=20
 ac_ext=3Dc
@@ -3414,7 +3429,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles =
long lines and -e" >&5
 $as_echo_n "checking for grep that handles long lines and -e... " >&6; }=

-if test "${ac_cv_path_GREP+set}" =3D set; then :
+if ${ac_cv_path_GREP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -z "$GREP"; then
@@ -3477,7 +3492,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
 $as_echo_n "checking for egrep... " >&6; }
-if test "${ac_cv_path_EGREP+set}" =3D set; then :
+if ${ac_cv_path_EGREP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
@@ -3544,7 +3559,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header file=
s" >&5
 $as_echo_n "checking for ANSI C header files... " >&6; }
-if test "${ac_cv_header_stdc+set}" =3D set; then :
+if ${ac_cv_header_stdc+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3673,7 +3688,7 @@
=20
=20
   ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_=
minix_config_h" "$ac_includes_default"
-if test "x$ac_cv_header_minix_config_h" =3D x""yes; then :
+if test "x$ac_cv_header_minix_config_h" =3D xyes; then :
   MINIX=3Dyes
 else
   MINIX=3D
@@ -3695,7 +3710,7 @@
=20
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe t=
o define __EXTENSIONS__" >&5
 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&=
6; }
-if test "${ac_cv_safe_to_define___extensions__+set}" =3D set; then :
+if ${ac_cv_safe_to_define___extensions__+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3738,7 +3753,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5=

 $as_echo_n "checking build system type... " >&6; }
-if test "${ac_cv_build+set}" =3D set; then :
+if ${ac_cv_build+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_build_alias=3D$build_alias
@@ -3754,7 +3769,7 @@
 $as_echo "$ac_cv_build" >&6; }
 case $ac_cv_build in
 *-*-*) ;;
-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5 ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
 esac
 build=3D$ac_cv_build
 ac_save_IFS=3D$IFS; IFS=3D'-'
@@ -3772,7 +3787,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
 $as_echo_n "checking host system type... " >&6; }
-if test "${ac_cv_host+set}" =3D set; then :
+if ${ac_cv_host+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "x$host_alias" =3D x; then
@@ -3787,7 +3802,7 @@
 $as_echo "$ac_cv_host" >&6; }
 case $ac_cv_host in
 *-*-*) ;;
-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5 ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
 esac
 host=3D$ac_cv_host
 ac_save_IFS=3D$IFS; IFS=3D'-'
@@ -4121,6 +4136,22 @@
 debug=3D$ax_cv_debug
=20
=20
+# Check whether --enable-qemuu-spice was given.
+if test "${enable_qemuu_spice+set}" =3D set; then :
+  enableval=3D$enable_qemuu_spice; qemuu_add_par+=3D" --enable-spice"
+fi
+
+# Check whether --enable-qemuu-usbredir was given.
+if test "${enable_qemuu_usbredir+set}" =3D set; then :
+  enableval=3D$enable_qemuu_usbredir; qemuu_add_par+=3D" --enable-usb-re=
dir"
+fi
+
+# Check whether --enable-qemuu-debug was given.
+if test "${enable_qemuu_debug+set}" =3D set; then :
+  enableval=3D$enable_qemuu_debug; qemuu_add_par+=3D" --enable-debug"
+fi
+
+
=20
=20
=20
@@ -4158,7 +4189,7 @@
 # Checks for programs.
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does no=
t truncate output" >&5
 $as_echo_n "checking for a sed that does not truncate output... " >&6; }=

-if test "${ac_cv_path_SED+set}" =3D set; then :
+if ${ac_cv_path_SED+:} false; then :
   $as_echo_n "(cached) " >&6
 else
             ac_script=3Ds/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbb=
bbbbbbbbbbbbbbbbbbbbbbb/
@@ -4235,7 +4266,7 @@
 set dummy ${ac_tool_prefix}gcc; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" =3D set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -4275,7 +4306,7 @@
 set dummy gcc; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" =3D set; then :
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_CC"; then
@@ -4328,7 +4359,7 @@
 set dummy ${ac_tool_prefix}cc; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" =3D set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -4368,7 +4399,7 @@
 set dummy cc; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" =3D set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -4427,7 +4458,7 @@
 set dummy $ac_tool_prefix$ac_prog; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" =3D set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -4471,7 +4502,7 @@
 set dummy $ac_prog; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" =3D set; then :
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_CC"; then
@@ -4526,7 +4557,7 @@
 test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`=
$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
=20
 # Provide some information about the compiler.
 $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" =
>&5
@@ -4555,7 +4586,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using t=
he GNU C compiler" >&5
 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; }=

-if test "${ac_cv_c_compiler_gnu+set}" =3D set; then :
+if ${ac_cv_c_compiler_gnu+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4592,7 +4623,7 @@
 ac_save_CFLAGS=3D$CFLAGS
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g=
" >&5
 $as_echo_n "checking whether $CC accepts -g... " >&6; }
-if test "${ac_cv_prog_cc_g+set}" =3D set; then :
+if ${ac_cv_prog_cc_g+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_save_c_werror_flag=3D$ac_c_werror_flag
@@ -4670,7 +4701,7 @@
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to acce=
pt ISO C89" >&5
 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if test "${ac_cv_prog_cc_c89+set}" =3D set; then :
+if ${ac_cv_prog_cc_c89+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_cv_prog_cc_c89=3Dno
@@ -4780,7 +4811,7 @@
 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
 set x ${MAKE-make}
 ac_make=3D`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" =3D set; then =
:
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat >conftest.make <<\_ACEOF
@@ -4824,7 +4855,7 @@
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible i=
nstall" >&5
 $as_echo_n "checking for a BSD-compatible install... " >&6; }
 if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" =3D set; then :
+if ${ac_cv_path_install+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   as_save_IFS=3D$IFS; IFS=3D$PATH_SEPARATOR
@@ -4904,7 +4935,7 @@
 set dummy perl; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_PERL+set}" =3D set; then :
+if ${ac_cv_path_PERL+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $PERL in
@@ -4951,7 +4982,7 @@
 set dummy curl-config; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_CURL+set}" =3D set; then :
+if ${ac_cv_path_CURL+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $CURL in
@@ -4996,7 +5027,7 @@
 set dummy xml2-config; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_XML+set}" =3D set; then :
+if ${ac_cv_path_XML+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $XML in
@@ -5047,7 +5078,7 @@
 set dummy ${ac_tool_prefix}ocamlc; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAMLC+set}" =3D set; then :
+if ${ac_cv_prog_OCAMLC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAMLC"; then
@@ -5087,7 +5118,7 @@
 set dummy ocamlc; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAMLC+set}" =3D set; then :
+if ${ac_cv_prog_ac_ct_OCAMLC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAMLC"; then
@@ -5158,7 +5189,7 @@
 set dummy ${ac_tool_prefix}ocamlopt; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAMLOPT+set}" =3D set; then :
+if ${ac_cv_prog_OCAMLOPT+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAMLOPT"; then
@@ -5198,7 +5229,7 @@
 set dummy ocamlopt; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAMLOPT+set}" =3D set; then :
+if ${ac_cv_prog_ac_ct_OCAMLOPT+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAMLOPT"; then
@@ -5268,7 +5299,7 @@
 set dummy ${ac_tool_prefix}ocamlc.opt; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAMLCDOTOPT+set}" =3D set; then :
+if ${ac_cv_prog_OCAMLCDOTOPT+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAMLCDOTOPT"; then
@@ -5308,7 +5339,7 @@
 set dummy ocamlc.opt; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAMLCDOTOPT+set}" =3D set; then :
+if ${ac_cv_prog_ac_ct_OCAMLCDOTOPT+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAMLCDOTOPT"; then
@@ -5372,7 +5403,7 @@
 set dummy ${ac_tool_prefix}ocamlopt.opt; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAMLOPTDOTOPT+set}" =3D set; then :
+if ${ac_cv_prog_OCAMLOPTDOTOPT+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAMLOPTDOTOPT"; then
@@ -5412,7 +5443,7 @@
 set dummy ocamlopt.opt; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAMLOPTDOTOPT+set}" =3D set; then :
+if ${ac_cv_prog_ac_ct_OCAMLOPTDOTOPT+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAMLOPTDOTOPT"; then
@@ -5481,7 +5512,7 @@
 set dummy ${ac_tool_prefix}ocaml; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAML+set}" =3D set; then :
+if ${ac_cv_prog_OCAML+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAML"; then
@@ -5521,7 +5552,7 @@
 set dummy ocaml; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAML+set}" =3D set; then :
+if ${ac_cv_prog_ac_ct_OCAML+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAML"; then
@@ -5575,7 +5606,7 @@
 set dummy ${ac_tool_prefix}ocamldep; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAMLDEP+set}" =3D set; then :
+if ${ac_cv_prog_OCAMLDEP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAMLDEP"; then
@@ -5615,7 +5646,7 @@
 set dummy ocamldep; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAMLDEP+set}" =3D set; then :
+if ${ac_cv_prog_ac_ct_OCAMLDEP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAMLDEP"; then
@@ -5669,7 +5700,7 @@
 set dummy ${ac_tool_prefix}ocamlmktop; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAMLMKTOP+set}" =3D set; then :
+if ${ac_cv_prog_OCAMLMKTOP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAMLMKTOP"; then
@@ -5709,7 +5740,7 @@
 set dummy ocamlmktop; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAMLMKTOP+set}" =3D set; then :
+if ${ac_cv_prog_ac_ct_OCAMLMKTOP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAMLMKTOP"; then
@@ -5763,7 +5794,7 @@
 set dummy ${ac_tool_prefix}ocamlmklib; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAMLMKLIB+set}" =3D set; then :
+if ${ac_cv_prog_OCAMLMKLIB+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAMLMKLIB"; then
@@ -5803,7 +5834,7 @@
 set dummy ocamlmklib; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAMLMKLIB+set}" =3D set; then :
+if ${ac_cv_prog_ac_ct_OCAMLMKLIB+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAMLMKLIB"; then
@@ -5857,7 +5888,7 @@
 set dummy ${ac_tool_prefix}ocamldoc; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAMLDOC+set}" =3D set; then :
+if ${ac_cv_prog_OCAMLDOC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAMLDOC"; then
@@ -5897,7 +5928,7 @@
 set dummy ocamldoc; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAMLDOC+set}" =3D set; then :
+if ${ac_cv_prog_ac_ct_OCAMLDOC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAMLDOC"; then
@@ -5951,7 +5982,7 @@
 set dummy ${ac_tool_prefix}ocamlbuild; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAMLBUILD+set}" =3D set; then :
+if ${ac_cv_prog_OCAMLBUILD+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAMLBUILD"; then
@@ -5991,7 +6022,7 @@
 set dummy ocamlbuild; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAMLBUILD+set}" =3D set; then :
+if ${ac_cv_prog_ac_ct_OCAMLBUILD+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAMLBUILD"; then
@@ -6054,7 +6085,7 @@
 set dummy bash; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_BASH+set}" =3D set; then :
+if ${ac_cv_path_BASH+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $BASH in
@@ -6111,7 +6142,7 @@
 set dummy $PYTHON; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_PYTHONPATH+set}" =3D set; then :
+if ${ac_cv_path_PYTHONPATH+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $PYTHONPATH in
@@ -6187,7 +6218,7 @@
     print distutils.sysconfig.get_config_var("LDFLAGS")'`"
=20
 ac_fn_c_check_header_mongrel "$LINENO" "Python.h" "ac_cv_header_Python_h=
" "$ac_includes_default"
-if test "x$ac_cv_header_Python_h" =3D x""yes; then :
+if test "x$ac_cv_header_Python_h" =3D xyes; then :
=20
 else
   as_fn_error $? "Unable to find Python development headers" "$LINENO" 5=

@@ -6197,7 +6228,7 @@
 as_ac_Lib=3D`$as_echo "ac_cv_lib_python$ac_python_version''_PyArg_ParseT=
uple" | $as_tr_sh`
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PyArg_ParseTuple i=
n -lpython$ac_python_version" >&5
 $as_echo_n "checking for PyArg_ParseTuple in -lpython$ac_python_version.=
=2E. " >&6; }
-if eval "test \"\${$as_ac_Lib+set}\"" =3D set; then :
+if eval \${$as_ac_Lib+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=3D$LIBS
@@ -6252,7 +6283,7 @@
 set dummy xgettext; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_XGETTEXT+set}" =3D set; then :
+if ${ac_cv_path_XGETTEXT+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $XGETTEXT in
@@ -6295,11 +6326,11 @@
 fi
=20
 ac_fn_c_check_header_mongrel "$LINENO" "uuid/uuid.h" "ac_cv_header_uuid_=
uuid_h" "$ac_includes_default"
-if test "x$ac_cv_header_uuid_uuid_h" =3D x""yes; then :
+if test "x$ac_cv_header_uuid_uuid_h" =3D xyes; then :
=20
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uuid_clear in =
-luuid" >&5
 $as_echo_n "checking for uuid_clear in -luuid... " >&6; }
-if test "${ac_cv_lib_uuid_uuid_clear+set}" =3D set; then :
+if ${ac_cv_lib_uuid_uuid_clear+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=3D$LIBS
@@ -6333,7 +6364,7 @@
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_uuid_uuid_cl=
ear" >&5
 $as_echo "$ac_cv_lib_uuid_uuid_clear" >&6; }
-if test "x$ac_cv_lib_uuid_uuid_clear" =3D x""yes; then :
+if test "x$ac_cv_lib_uuid_uuid_clear" =3D xyes; then :
   libuuid=3D"y"
 fi
=20
@@ -6342,7 +6373,7 @@
=20
=20
 ac_fn_c_check_header_mongrel "$LINENO" "uuid.h" "ac_cv_header_uuid_h" "$=
ac_includes_default"
-if test "x$ac_cv_header_uuid_h" =3D x""yes; then :
+if test "x$ac_cv_header_uuid_h" =3D xyes; then :
   libuuid=3D"y"
 fi
=20
@@ -6355,11 +6386,11 @@
=20
=20
 ac_fn_c_check_header_mongrel "$LINENO" "curses.h" "ac_cv_header_curses_h=
" "$ac_includes_default"
-if test "x$ac_cv_header_curses_h" =3D x""yes; then :
+if test "x$ac_cv_header_curses_h" =3D xyes; then :
=20
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clear in -lcur=
ses" >&5
 $as_echo_n "checking for clear in -lcurses... " >&6; }
-if test "${ac_cv_lib_curses_clear+set}" =3D set; then :
+if ${ac_cv_lib_curses_clear+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=3D$LIBS
@@ -6393,7 +6424,7 @@
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_clear=
" >&5
 $as_echo "$ac_cv_lib_curses_clear" >&6; }
-if test "x$ac_cv_lib_curses_clear" =3D x""yes; then :
+if test "x$ac_cv_lib_curses_clear" =3D xyes; then :
   curses=3D"y"
 else
   curses=3D"n"
@@ -6406,11 +6437,11 @@
=20
=20
 ac_fn_c_check_header_mongrel "$LINENO" "ncurses.h" "ac_cv_header_ncurses=
_h" "$ac_includes_default"
-if test "x$ac_cv_header_ncurses_h" =3D x""yes; then :
+if test "x$ac_cv_header_ncurses_h" =3D xyes; then :
=20
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clear in -lncu=
rses" >&5
 $as_echo_n "checking for clear in -lncurses... " >&6; }
-if test "${ac_cv_lib_ncurses_clear+set}" =3D set; then :
+if ${ac_cv_lib_ncurses_clear+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=3D$LIBS
@@ -6444,7 +6475,7 @@
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_clea=
r" >&5
 $as_echo "$ac_cv_lib_ncurses_clear" >&6; }
-if test "x$ac_cv_lib_ncurses_clear" =3D x""yes; then :
+if test "x$ac_cv_lib_ncurses_clear" =3D xyes; then :
   ncurses=3D"y"
 else
   ncurses=3D"n"
@@ -6491,7 +6522,7 @@
 set dummy ${ac_tool_prefix}pkg-config; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_PKG_CONFIG+set}" =3D set; then :
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $PKG_CONFIG in
@@ -6534,7 +6565,7 @@
 set dummy pkg-config; ac_word=3D$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" =3D set; then :
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $ac_pt_PKG_CONFIG in
@@ -6679,7 +6710,7 @@
 See the pkg-config man page for more details.
=20
 To get pkg-config, see <http://pkg-config.freedesktop.org/>.
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
 else
 	glib_CFLAGS=3D$pkg_cv_glib_CFLAGS
 	glib_LIBS=3D$pkg_cv_glib_LIBS
@@ -6715,11 +6746,11 @@
=20
 # Checks for libraries.
 ac_fn_c_check_header_mongrel "$LINENO" "bzlib.h" "ac_cv_header_bzlib_h" =
"$ac_includes_default"
-if test "x$ac_cv_header_bzlib_h" =3D x""yes; then :
+if test "x$ac_cv_header_bzlib_h" =3D xyes; then :
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BZ2_bzDecompressIn=
it in -lbz2" >&5
 $as_echo_n "checking for BZ2_bzDecompressInit in -lbz2... " >&6; }
-if test "${ac_cv_lib_bz2_BZ2_bzDecompressInit+set}" =3D set; then :
+if ${ac_cv_lib_bz2_BZ2_bzDecompressInit+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=3D$LIBS
@@ -6753,7 +6784,7 @@
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bz2_BZ2_bzDe=
compressInit" >&5
 $as_echo "$ac_cv_lib_bz2_BZ2_bzDecompressInit" >&6; }
-if test "x$ac_cv_lib_bz2_BZ2_bzDecompressInit" =3D x""yes; then :
+if test "x$ac_cv_lib_bz2_BZ2_bzDecompressInit" =3D xyes; then :
   zlib=3D"$zlib -DHAVE_BZLIB -lbz2"
 fi
=20
@@ -6762,11 +6793,11 @@
=20
=20
 ac_fn_c_check_header_mongrel "$LINENO" "lzma.h" "ac_cv_header_lzma_h" "$=
ac_includes_default"
-if test "x$ac_cv_header_lzma_h" =3D x""yes; then :
+if test "x$ac_cv_header_lzma_h" =3D xyes; then :
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lzma_stream_decode=
r in -llzma" >&5
 $as_echo_n "checking for lzma_stream_decoder in -llzma... " >&6; }
-if test "${ac_cv_lib_lzma_lzma_stream_decoder+set}" =3D set; then :
+if ${ac_cv_lib_lzma_lzma_stream_decoder+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=3D$LIBS
@@ -6800,7 +6831,7 @@
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzma_lzma_st=
ream_decoder" >&5
 $as_echo "$ac_cv_lib_lzma_lzma_stream_decoder" >&6; }
-if test "x$ac_cv_lib_lzma_lzma_stream_decoder" =3D x""yes; then :
+if test "x$ac_cv_lib_lzma_lzma_stream_decoder" =3D xyes; then :
   zlib=3D"$zlib -DHAVE_LZMA -llzma"
 fi
=20
@@ -6809,11 +6840,11 @@
=20
=20
 ac_fn_c_check_header_mongrel "$LINENO" "lzo/lzo1x.h" "ac_cv_header_lzo_l=
zo1x_h" "$ac_includes_default"
-if test "x$ac_cv_header_lzo_lzo1x_h" =3D x""yes; then :
+if test "x$ac_cv_header_lzo_lzo1x_h" =3D xyes; then :
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lzo1x_decompress i=
n -llzo2" >&5
 $as_echo_n "checking for lzo1x_decompress in -llzo2... " >&6; }
-if test "${ac_cv_lib_lzo2_lzo1x_decompress+set}" =3D set; then :
+if ${ac_cv_lib_lzo2_lzo1x_decompress+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=3D$LIBS
@@ -6847,7 +6878,7 @@
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzo2_lzo1x_d=
ecompress" >&5
 $as_echo "$ac_cv_lib_lzo2_lzo1x_decompress" >&6; }
-if test "x$ac_cv_lib_lzo2_lzo1x_decompress" =3D x""yes; then :
+if test "x$ac_cv_lib_lzo2_lzo1x_decompress" =3D xyes; then :
   zlib=3D"$zlib -DHAVE_LZO1X -llzo2"
 fi
=20
@@ -6858,7 +6889,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for io_setup in -laio"=
 >&5
 $as_echo_n "checking for io_setup in -laio... " >&6; }
-if test "${ac_cv_lib_aio_io_setup+set}" =3D set; then :
+if ${ac_cv_lib_aio_io_setup+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=3D$LIBS
@@ -6892,7 +6923,7 @@
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_aio_io_setup=
" >&5
 $as_echo "$ac_cv_lib_aio_io_setup" >&6; }
-if test "x$ac_cv_lib_aio_io_setup" =3D x""yes; then :
+if test "x$ac_cv_lib_aio_io_setup" =3D xyes; then :
   system_aio=3D"y"
 else
   system_aio=3D"n"
@@ -6901,7 +6932,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MD5 in -lcrypto" >=
&5
 $as_echo_n "checking for MD5 in -lcrypto... " >&6; }
-if test "${ac_cv_lib_crypto_MD5+set}" =3D set; then :
+if ${ac_cv_lib_crypto_MD5+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=3D$LIBS
@@ -6935,7 +6966,7 @@
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_MD5" =
>&5
 $as_echo "$ac_cv_lib_crypto_MD5" >&6; }
-if test "x$ac_cv_lib_crypto_MD5" =3D x""yes; then :
+if test "x$ac_cv_lib_crypto_MD5" =3D xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_LIBCRYPTO 1
 _ACEOF
@@ -6948,7 +6979,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ext2fs_open2 in -l=
ext2fs" >&5
 $as_echo_n "checking for ext2fs_open2 in -lext2fs... " >&6; }
-if test "${ac_cv_lib_ext2fs_ext2fs_open2+set}" =3D set; then :
+if ${ac_cv_lib_ext2fs_ext2fs_open2+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=3D$LIBS
@@ -6982,7 +7013,7 @@
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ext2fs_ext2f=
s_open2" >&5
 $as_echo "$ac_cv_lib_ext2fs_ext2fs_open2" >&6; }
-if test "x$ac_cv_lib_ext2fs_ext2fs_open2" =3D x""yes; then :
+if test "x$ac_cv_lib_ext2fs_ext2fs_open2" =3D xyes; then :
   libext2fs=3D"y"
 else
   libext2fs=3D"n"
@@ -6991,7 +7022,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcry_md_hash_buffe=
r in -lgcrypt" >&5
 $as_echo_n "checking for gcry_md_hash_buffer in -lgcrypt... " >&6; }
-if test "${ac_cv_lib_gcrypt_gcry_md_hash_buffer+set}" =3D set; then :
+if ${ac_cv_lib_gcrypt_gcry_md_hash_buffer+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=3D$LIBS
@@ -7025,7 +7056,7 @@
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gcrypt_gcry_=
md_hash_buffer" >&5
 $as_echo "$ac_cv_lib_gcrypt_gcry_md_hash_buffer" >&6; }
-if test "x$ac_cv_lib_gcrypt_gcry_md_hash_buffer" =3D x""yes; then :
+if test "x$ac_cv_lib_gcrypt_gcry_md_hash_buffer" =3D xyes; then :
   libgcrypt=3D"y"
 else
   libgcrypt=3D"n"
@@ -7034,7 +7065,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in =
-lpthread" >&5
 $as_echo_n "checking for pthread_create in -lpthread... " >&6; }
-if test "${ac_cv_lib_pthread_pthread_create+set}" =3D set; then :
+if ${ac_cv_lib_pthread_pthread_create+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=3D$LIBS
@@ -7068,7 +7099,7 @@
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthr=
ead_create" >&5
 $as_echo "$ac_cv_lib_pthread_pthread_create" >&6; }
-if test "x$ac_cv_lib_pthread_pthread_create" =3D x""yes; then :
+if test "x$ac_cv_lib_pthread_pthread_create" =3D xyes; then :
=20
 else
   as_fn_error $? "Could not find libpthread" "$LINENO" 5
@@ -7076,7 +7107,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -=
lrt" >&5
 $as_echo_n "checking for clock_gettime in -lrt... " >&6; }
-if test "${ac_cv_lib_rt_clock_gettime+set}" =3D set; then :
+if ${ac_cv_lib_rt_clock_gettime+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=3D$LIBS
@@ -7110,7 +7141,7 @@
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_get=
time" >&5
 $as_echo "$ac_cv_lib_rt_clock_gettime" >&6; }
-if test "x$ac_cv_lib_rt_clock_gettime" =3D x""yes; then :
+if test "x$ac_cv_lib_rt_clock_gettime" =3D xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_LIBRT 1
 _ACEOF
@@ -7121,7 +7152,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for yajl_alloc in -lya=
jl" >&5
 $as_echo_n "checking for yajl_alloc in -lyajl... " >&6; }
-if test "${ac_cv_lib_yajl_yajl_alloc+set}" =3D set; then :
+if ${ac_cv_lib_yajl_yajl_alloc+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=3D$LIBS
@@ -7155,7 +7186,7 @@
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_yajl_yajl_al=
loc" >&5
 $as_echo "$ac_cv_lib_yajl_yajl_alloc" >&6; }
-if test "x$ac_cv_lib_yajl_yajl_alloc" =3D x""yes; then :
+if test "x$ac_cv_lib_yajl_yajl_alloc" =3D xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_LIBYAJL 1
 _ACEOF
@@ -7168,7 +7199,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for deflateCopy in -lz=
" >&5
 $as_echo_n "checking for deflateCopy in -lz... " >&6; }
-if test "${ac_cv_lib_z_deflateCopy+set}" =3D set; then :
+if ${ac_cv_lib_z_deflateCopy+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=3D$LIBS
@@ -7202,7 +7233,7 @@
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_deflateCop=
y" >&5
 $as_echo "$ac_cv_lib_z_deflateCopy" >&6; }
-if test "x$ac_cv_lib_z_deflateCopy" =3D x""yes; then :
+if test "x$ac_cv_lib_z_deflateCopy" =3D xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_LIBZ 1
 _ACEOF
@@ -7215,7 +7246,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libiconv_open in -=
liconv" >&5
 $as_echo_n "checking for libiconv_open in -liconv... " >&6; }
-if test "${ac_cv_lib_iconv_libiconv_open+set}" =3D set; then :
+if ${ac_cv_lib_iconv_libiconv_open+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=3D$LIBS
@@ -7249,7 +7280,7 @@
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_libico=
nv_open" >&5
 $as_echo "$ac_cv_lib_iconv_libiconv_open" >&6; }
-if test "x$ac_cv_lib_iconv_libiconv_open" =3D x""yes; then :
+if test "x$ac_cv_lib_iconv_libiconv_open" =3D xyes; then :
   libiconv=3D"y"
 else
   libiconv=3D"n"
@@ -7258,11 +7289,22 @@
=20
=20
 # Checks for header files.
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_=
default"
+if test "x$ac_cv_type_size_t" =3D xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
 # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
 # for constant arguments.  Useless!
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" =
>&5
 $as_echo_n "checking for working alloca.h... " >&6; }
-if test "${ac_cv_working_alloca_h+set}" =3D set; then :
+if ${ac_cv_working_alloca_h+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -7295,7 +7337,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
 $as_echo_n "checking for alloca... " >&6; }
-if test "${ac_cv_func_alloca_works+set}" =3D set; then :
+if ${ac_cv_func_alloca_works+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -7314,7 +7356,7 @@
  #pragma alloca
 #   else
 #    ifndef alloca /* predefined by HP cc +Olibcalls */
-char *alloca ();
+void *alloca (size_t);
 #    endif
 #   endif
 #  endif
@@ -7358,7 +7400,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' ne=
eds Cray hooks" >&5
 $as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; }
-if test "${ac_cv_os_cray+set}" =3D set; then :
+if ${ac_cv_os_cray+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -7399,7 +7441,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C =
alloca" >&5
 $as_echo_n "checking stack direction for C alloca... " >&6; }
-if test "${ac_cv_c_stack_direction+set}" =3D set; then :
+if ${ac_cv_c_stack_direction+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" =3D yes; then :
@@ -7470,7 +7512,7 @@
 # Checks for typedefs, structures, and compiler characteristics.
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that con=
forms to C99" >&5
 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; }
-if test "${ac_cv_header_stdbool_h+set}" =3D set; then :
+if ${ac_cv_header_stdbool_h+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -7502,7 +7544,7 @@
 	char b[false =3D=3D 0 ? 1 : -1];
 	char c[__bool_true_false_are_defined =3D=3D 1 ? 1 : -1];
 	char d[(bool) 0.5 =3D=3D true ? 1 : -1];
-	bool e =3D &s;
+	/* See body of main program for 'e'.  */
 	char f[(_Bool) 0.0 =3D=3D false ? 1 : -1];
 	char g[true];
 	char h[sizeof (_Bool)];
@@ -7513,25 +7555,6 @@
 	_Bool n[m];
 	char o[sizeof n =3D=3D m * sizeof n[0] ? 1 : -1];
 	char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
-#	if defined __xlc__ || defined __GNUC__
-	 /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0
-	    reported by James Lemley on 2005-10-05; see
-	    http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.ht=
ml
-	    This test is not quite right, since xlc is allowed to
-	    reject this program, as the initializer for xlcbug is
-	    not one of the forms that C requires support for.
-	    However, doing the test right would require a runtime
-	    test, and that would make cross-compilation harder.
-	    Let us hope that IBM fixes the xlc bug, and also adds
-	    support for this kind of constant expression.  In the
-	    meantime, this test will reject xlc, which is OK, since
-	    our stdbool.h substitute should suffice.  We also test
-	    this with GCC, where it should work, to detect more
-	    quickly whether someone messes up the test in the
-	    future.  */
-	 char digs[] =3D "0123456789";
-	 int xlcbug =3D 1 / (&(digs + 5)[-2 + (bool) 1] =3D=3D &digs[4] ? 1 : -=
1);
-#	endif
 	/* Catch a bug in an HP-UX C compiler.  See
 	   http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
 	   http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.htm=
l
@@ -7543,6 +7566,7 @@
 main ()
 {
=20
+	bool e =3D &s;
 	*pq |=3D q;
 	*pq |=3D ! q;
 	/* Refer to every declared value, to avoid compiler optimizations.  */
@@ -7563,7 +7587,7 @@
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h=
" >&5
 $as_echo "$ac_cv_header_stdbool_h" >&6; }
 ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_de=
fault"
-if test "x$ac_cv_type__Bool" =3D x""yes; then :
+if test "x$ac_cv_type__Bool" =3D xyes; then :
=20
 cat >>confdefs.h <<_ACEOF
 #define HAVE__BOOL 1
@@ -7580,7 +7604,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types=
=2Eh" >&5
 $as_echo_n "checking for uid_t in sys/types.h... " >&6; }
-if test "${ac_cv_type_uid_t+set}" =3D set; then :
+if ${ac_cv_type_uid_t+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -7610,7 +7634,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
 $as_echo_n "checking for inline... " >&6; }
-if test "${ac_cv_c_inline+set}" =3D set; then :
+if ${ac_cv_c_inline+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_cv_c_inline=3Dno
@@ -7695,7 +7719,7 @@
 esac
=20
 ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_=
default"
-if test "x$ac_cv_type_mode_t" =3D x""yes; then :
+if test "x$ac_cv_type_mode_t" =3D xyes; then :
=20
 else
=20
@@ -7706,7 +7730,7 @@
 fi
=20
 ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_de=
fault"
-if test "x$ac_cv_type_off_t" =3D x""yes; then :
+if test "x$ac_cv_type_off_t" =3D xyes; then :
=20
 else
=20
@@ -7717,7 +7741,7 @@
 fi
=20
 ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_de=
fault"
-if test "x$ac_cv_type_pid_t" =3D x""yes; then :
+if test "x$ac_cv_type_pid_t" =3D xyes; then :
=20
 else
=20
@@ -7729,7 +7753,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict key=
word" >&5
 $as_echo_n "checking for C/C++ restrict keyword... " >&6; }
-if test "${ac_cv_c_restrict+set}" =3D set; then :
+if ${ac_cv_c_restrict+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_cv_c_restrict=3Dno
@@ -7774,7 +7798,7 @@
  esac
=20
 ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_=
default"
-if test "x$ac_cv_type_size_t" =3D x""yes; then :
+if test "x$ac_cv_type_size_t" =3D xyes; then :
=20
 else
=20
@@ -7785,7 +7809,7 @@
 fi
=20
 ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_include=
s_default"
-if test "x$ac_cv_type_ssize_t" =3D x""yes; then :
+if test "x$ac_cv_type_ssize_t" =3D xyes; then :
=20
 else
=20
@@ -7796,7 +7820,7 @@
 fi
=20
 ac_fn_c_check_member "$LINENO" "struct stat" "st_blksize" "ac_cv_member_=
struct_stat_st_blksize" "$ac_includes_default"
-if test "x$ac_cv_member_struct_stat_st_blksize" =3D x""yes; then :
+if test "x$ac_cv_member_struct_stat_st_blksize" =3D xyes; then :
=20
 cat >>confdefs.h <<_ACEOF
 #define HAVE_STRUCT_STAT_ST_BLKSIZE 1
@@ -7806,7 +7830,7 @@
 fi
=20
 ac_fn_c_check_member "$LINENO" "struct stat" "st_blocks" "ac_cv_member_s=
truct_stat_st_blocks" "$ac_includes_default"
-if test "x$ac_cv_member_struct_stat_st_blocks" =3D x""yes; then :
+if test "x$ac_cv_member_struct_stat_st_blocks" =3D xyes; then :
=20
 cat >>confdefs.h <<_ACEOF
 #define HAVE_STRUCT_STAT_ST_BLOCKS 1
@@ -7826,7 +7850,7 @@
=20
=20
 ac_fn_c_check_member "$LINENO" "struct stat" "st_rdev" "ac_cv_member_str=
uct_stat_st_rdev" "$ac_includes_default"
-if test "x$ac_cv_member_struct_stat_st_rdev" =3D x""yes; then :
+if test "x$ac_cv_member_struct_stat_st_rdev" =3D xyes; then :
=20
 cat >>confdefs.h <<_ACEOF
 #define HAVE_STRUCT_STAT_ST_RDEV 1
@@ -7890,7 +7914,7 @@
   esac
=20
 ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_inc=
ludes_default"
-if test "x$ac_cv_type_ptrdiff_t" =3D x""yes; then :
+if test "x$ac_cv_type_ptrdiff_t" =3D xyes; then :
=20
 cat >>confdefs.h <<_ACEOF
 #define HAVE_PTRDIFF_T 1
@@ -7903,7 +7927,7 @@
 # Checks for library functions.
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for error_at_line" >&5=

 $as_echo_n "checking for error_at_line... " >&6; }
-if test "${ac_cv_lib_error_at_line+set}" =3D set; then :
+if ${ac_cv_lib_error_at_line+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -7939,7 +7963,7 @@
 for ac_header in vfork.h
 do :
   ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h=
" "$ac_includes_default"
-if test "x$ac_cv_header_vfork_h" =3D x""yes; then :
+if test "x$ac_cv_header_vfork_h" =3D xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_VFORK_H 1
 _ACEOF
@@ -7963,7 +7987,7 @@
 if test "x$ac_cv_func_fork" =3D xyes; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&=
5
 $as_echo_n "checking for working fork... " >&6; }
-if test "${ac_cv_func_fork_works+set}" =3D set; then :
+if ${ac_cv_func_fork_works+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" =3D yes; then :
@@ -8016,7 +8040,7 @@
 if test "x$ac_cv_func_vfork" =3D xyes; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >=
&5
 $as_echo_n "checking for working vfork... " >&6; }
-if test "${ac_cv_func_vfork_works+set}" =3D set; then :
+if ${ac_cv_func_vfork_works+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" =3D yes; then :
@@ -8151,7 +8175,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE =
value needed for large files" >&5
 $as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files.=
=2E. " >&6; }
-if test "${ac_cv_sys_largefile_source+set}" =3D set; then :
+if ${ac_cv_sys_largefile_source+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   while :; do
@@ -8219,7 +8243,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctl=
y handles trailing slash" >&5
 $as_echo_n "checking whether lstat correctly handles trailing slash... "=
 >&6; }
-if test "${ac_cv_func_lstat_dereferences_slashed_symlink+set}" =3D set; =
then :
+if ${ac_cv_func_lstat_dereferences_slashed_symlink+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   rm -f conftest.sym conftest.file
@@ -8281,7 +8305,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sys/types.h de=
fines makedev" >&5
 $as_echo_n "checking whether sys/types.h defines makedev... " >&6; }
-if test "${ac_cv_header_sys_types_h_makedev+set}" =3D set; then :
+if ${ac_cv_header_sys_types_h_makedev+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -8309,7 +8333,7 @@
=20
 if test $ac_cv_header_sys_types_h_makedev =3D no; then
 ac_fn_c_check_header_mongrel "$LINENO" "sys/mkdev.h" "ac_cv_header_sys_m=
kdev_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_mkdev_h" =3D x""yes; then :
+if test "x$ac_cv_header_sys_mkdev_h" =3D xyes; then :
=20
 $as_echo "#define MAJOR_IN_MKDEV 1" >>confdefs.h
=20
@@ -8319,7 +8343,7 @@
=20
   if test $ac_cv_header_sys_mkdev_h =3D no; then
     ac_fn_c_check_header_mongrel "$LINENO" "sys/sysmacros.h" "ac_cv_head=
er_sys_sysmacros_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_sysmacros_h" =3D x""yes; then :
+if test "x$ac_cv_header_sys_sysmacros_h" =3D xyes; then :
=20
 $as_echo "#define MAJOR_IN_SYSMACROS 1" >>confdefs.h
=20
@@ -8332,7 +8356,7 @@
 for ac_header in stdlib.h
 do :
   ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib=
_h" "$ac_includes_default"
-if test "x$ac_cv_header_stdlib_h" =3D x""yes; then :
+if test "x$ac_cv_header_stdlib_h" =3D xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_STDLIB_H 1
 _ACEOF
@@ -8343,7 +8367,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatibl=
e malloc" >&5
 $as_echo_n "checking for GNU libc compatible malloc... " >&6; }
-if test "${ac_cv_func_malloc_0_nonnull+set}" =3D set; then :
+if ${ac_cv_func_malloc_0_nonnull+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" =3D yes; then :
@@ -8398,7 +8422,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys=
/time.h may both be included" >&5
 $as_echo_n "checking whether time.h and sys/time.h may both be included.=
=2E. " >&6; }
-if test "${ac_cv_header_time+set}" =3D set; then :
+if ${ac_cv_header_time+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -8473,7 +8497,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mktime" >&=
5
 $as_echo_n "checking for working mktime... " >&6; }
-if test "${ac_cv_func_working_mktime+set}" =3D set; then :
+if ${ac_cv_func_working_mktime+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" =3D yes; then :
@@ -8702,7 +8726,7 @@
 for ac_func in getpagesize
 do :
   ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize"
-if test "x$ac_cv_func_getpagesize" =3D x""yes; then :
+if test "x$ac_cv_func_getpagesize" =3D xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_GETPAGESIZE 1
 _ACEOF
@@ -8712,7 +8736,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5
 $as_echo_n "checking for working mmap... " >&6; }
-if test "${ac_cv_func_mmap_fixed_mapped+set}" =3D set; then :
+if ${ac_cv_func_mmap_fixed_mapped+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" =3D yes; then :
@@ -8879,7 +8903,7 @@
 for ac_header in stdlib.h
 do :
   ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib=
_h" "$ac_includes_default"
-if test "x$ac_cv_header_stdlib_h" =3D x""yes; then :
+if test "x$ac_cv_header_stdlib_h" =3D xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_STDLIB_H 1
 _ACEOF
@@ -8890,7 +8914,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatibl=
e realloc" >&5
 $as_echo_n "checking for GNU libc compatible realloc... " >&6; }
-if test "${ac_cv_func_realloc_0_nonnull+set}" =3D set; then :
+if ${ac_cv_func_realloc_0_nonnull+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" =3D yes; then :
@@ -8943,13 +8967,17 @@
 fi
=20
=20
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strnlen" >=
&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strnlen" =
>&5
 $as_echo_n "checking for working strnlen... " >&6; }
-if test "${ac_cv_func_strnlen_working+set}" =3D set; then :
+if ${ac_cv_func_strnlen_working+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" =3D yes; then :
-  ac_cv_func_strnlen_working=3Dno
+  # Guess no on AIX systems, yes otherwise.
+		case "$host_os" in
+		  aix*) ac_cv_func_strnlen_working=3Dno;;
+		  *)    ac_cv_func_strnlen_working=3Dyes;;
+		esac
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
@@ -8998,7 +9026,7 @@
=20
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strtod" >&=
5
 $as_echo_n "checking for working strtod... " >&6; }
-if test "${ac_cv_func_strtod+set}" =3D set; then :
+if ${ac_cv_func_strtod+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" =3D yes; then :
@@ -9057,14 +9085,14 @@
 esac
=20
 ac_fn_c_check_func "$LINENO" "pow" "ac_cv_func_pow"
-if test "x$ac_cv_func_pow" =3D x""yes; then :
+if test "x$ac_cv_func_pow" =3D xyes; then :
=20
 fi
=20
 if test $ac_cv_func_pow =3D no; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pow in -lm" >&5
 $as_echo_n "checking for pow in -lm... " >&6; }
-if test "${ac_cv_lib_m_pow+set}" =3D set; then :
+if ${ac_cv_lib_m_pow+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=3D$LIBS
@@ -9098,7 +9126,7 @@
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_pow" >&5
 $as_echo "$ac_cv_lib_m_pow" >&6; }
-if test "x$ac_cv_lib_m_pow" =3D x""yes; then :
+if test "x$ac_cv_lib_m_pow" =3D xyes; then :
   POW_LIB=3D-lm
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot find library =
containing definition of pow" >&5
@@ -9194,10 +9222,21 @@
      :end' >>confcache
 if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
   if test -w "$cache_file"; then
-    test "x$cache_file" !=3D "x/dev/null" &&
+    if test "x$cache_file" !=3D "x/dev/null"; then
       { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_fil=
e" >&5
 $as_echo "$as_me: updating cache $cache_file" >&6;}
-    cat confcache >$cache_file
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
   else
     { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cac=
he $cache_file" >&5
 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
@@ -9229,7 +9268,7 @@
=20
=20
=20
-: ${CONFIG_STATUS=3D./config.status}
+: "${CONFIG_STATUS=3D./config.status}"
 ac_write_fail=3D0
 ac_clean_files_save=3D$ac_clean_files
 ac_clean_files=3D"$ac_clean_files $CONFIG_STATUS"
@@ -9330,6 +9369,7 @@
 IFS=3D" ""	$as_nl"
=20
 # Find who we are.  Look in the path if we contain no directory separato=
r.
+as_myself=3D
 case $0 in #((
   *[\\/]* ) as_myself=3D$0 ;;
   *) as_save_IFS=3D$IFS; IFS=3D$PATH_SEPARATOR
@@ -9637,7 +9677,7 @@
 # values after options handling.
 ac_log=3D"
 This file was extended by Xen Hypervisor $as_me 4.2, which was
-generated by GNU Autoconf 2.67.  Invocation command line was
+generated by GNU Autoconf 2.68.  Invocation command line was
=20
   CONFIG_FILES    =3D $CONFIG_FILES
   CONFIG_HEADERS  =3D $CONFIG_HEADERS
@@ -9699,7 +9739,7 @@
 ac_cs_config=3D"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\=
$]/\\\\&/g'`"
 ac_cs_version=3D"\\
 Xen Hypervisor config.status 4.2
-configured by $0, generated by GNU Autoconf 2.67,
+configured by $0, generated by GNU Autoconf 2.68,
   with options \\"\$ac_cs_config\\"
=20
 Copyright (C) 2010 Free Software Foundation, Inc.
@@ -9823,7 +9863,7 @@
     "../config/Tools.mk") CONFIG_FILES=3D"$CONFIG_FILES ../config/Tools.=
mk" ;;
     "config.h") CONFIG_HEADERS=3D"$CONFIG_HEADERS config.h" ;;
=20
-  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5=
 ;;
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5=
;;
   esac
 done
=20
@@ -9845,9 +9885,10 @@
 # after its creation but before its name has been assigned to `$tmp'.
 $debug ||
 {
-  tmp=3D
+  tmp=3D ac_tmp=3D
   trap 'exit_status=3D$?
-  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit=
_status
+  : "${ac_tmp:=3D$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
 ' 0
   trap 'as_fn_exit 1' 1 2 13 15
 }
@@ -9855,12 +9896,13 @@
=20
 {
   tmp=3D`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
+  test -d "$tmp"
 }  ||
 {
   tmp=3D./conf$$-$RANDOM
   (umask 077 && mkdir "$tmp")
 } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO"=
 5
+ac_tmp=3D$tmp
=20
 # Set up the scripts for CONFIG_FILES section.
 # No need to generate them if there are no CONFIG_FILES.
@@ -9882,7 +9924,7 @@
   ac_cs_awk_cr=3D$ac_cr
 fi
=20
-echo 'BEGIN {' >"$tmp/subs1.awk" &&
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
 _ACEOF
=20
=20
@@ -9910,7 +9952,7 @@
 rm -f conf$$subs.sh
=20
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=3D1
-cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
 _ACEOF
 sed -n '
 h
@@ -9958,7 +10000,7 @@
 rm -f conf$$subs.awk
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=3D1
 _ACAWK
-cat >>"\$tmp/subs1.awk" <<_ACAWK &&
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
   for (key in S) S_is_set[key] =3D 1
   FS =3D "=07"
=20
@@ -9990,7 +10032,7 @@
   sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
 else
   cat
-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
   || as_fn_error $? "could not setup config files machinery" "$LINENO" 5=

 _ACEOF
=20
@@ -10024,7 +10066,7 @@
 # No need to generate them if there are no CONFIG_HEADERS.
 # This happens for instance with `./config.status Makefile'.
 if test -n "$CONFIG_HEADERS"; then
-cat >"$tmp/defines.awk" <<\_ACAWK ||
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
 BEGIN {
 _ACEOF
=20
@@ -10036,8 +10078,8 @@
 # handling of long lines.
 ac_delim=3D'%!_!# '
 for ac_last_try in false false :; do
-  ac_t=3D`sed -n "/$ac_delim/p" confdefs.h`
-  if test -z "$ac_t"; then
+  ac_tt=3D`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
     break
   elif $ac_last_try; then
     as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
@@ -10138,7 +10180,7 @@
   esac
   case $ac_mode$ac_tag in
   :[FHL]*:*);;
-  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
   :[FH]-) ac_tag=3D-:-;;
   :[FH]*) ac_tag=3D$ac_tag:$ac_tag.in;;
   esac
@@ -10157,7 +10199,7 @@
     for ac_f
     do
       case $ac_f in
-      -) ac_f=3D"$tmp/stdin";;
+      -) ac_f=3D"$ac_tmp/stdin";;
       *) # Look for the file first in the build tree, then in the source=
 tree
 	 # (if the path is not absolute).  The absolute path cannot be DOS-styl=
e,
 	 # because $ac_f cannot contain `:'.
@@ -10166,7 +10208,7 @@
 	   [\\/$]*) false;;
 	   *) test -f "$srcdir/$ac_f" && ac_f=3D"$srcdir/$ac_f";;
 	   esac ||
-	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;;
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
       esac
       case $ac_f in *\'*) ac_f=3D`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\'=
'/g"`;; esac
       as_fn_append ac_file_inputs " '$ac_f'"
@@ -10192,8 +10234,8 @@
     esac
=20
     case $ac_tag in
-    *:-:* | *:-) cat >"$tmp/stdin" \
-      || as_fn_error $? "could not create $ac_file" "$LINENO" 5  ;;
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
     esac
     ;;
   esac
@@ -10323,21 +10365,22 @@
 s&@INSTALL@&$ac_INSTALL&;t t
 $ac_datarootdir_hack
 "
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" =
>$tmp/out \
-  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.aw=
k" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5=

=20
 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
-  { ac_out=3D`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"=
; } &&
-  { ac_out=3D`sed -n '/^[	 ]*datarootdir[	 ]*:*=3D/p' "$tmp/out"`; test =
-z "$ac_out"; } &&
+  { ac_out=3D`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_o=
ut"; } &&
+  { ac_out=3D`sed -n '/^[	 ]*datarootdir[	 ]*:*=3D/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a =
reference to the variable \`datarootdir'
 which seems to be undefined.  Please make sure it is defined" >&5
 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable=
 \`datarootdir'
 which seems to be undefined.  Please make sure it is defined" >&2;}
=20
-  rm -f "$tmp/stdin"
+  rm -f "$ac_tmp/stdin"
   case $ac_file in
-  -) cat "$tmp/out" && rm -f "$tmp/out";;
-  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
   esac \
   || as_fn_error $? "could not create $ac_file" "$LINENO" 5
  ;;
@@ -10348,20 +10391,20 @@
   if test x"$ac_file" !=3D x-; then
     {
       $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
-    } >"$tmp/config.h" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
       || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
       { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&=
5
 $as_echo "$as_me: $ac_file is unchanged" >&6;}
     else
       rm -f "$ac_file"
-      mv "$tmp/config.h" "$ac_file" \
+      mv "$ac_tmp/config.h" "$ac_file" \
 	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
     fi
   else
     $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
       || as_fn_error $? "could not create -" "$LINENO" 5
   fi
  ;;
diff -r 527b8ae57ff2 -r 9fb366d55ed2 tools/configure.ac
--- a/tools/configure.ac	mer apr 04 14:36:16 2012 +0200
+++ b/tools/configure.ac	mer apr 04 15:10:26 2012 +0200
@@ -44,6 +44,16 @@
 AX_ARG_DEFAULT_DISABLE([miniterm], [Enable miniterm])
 AX_ARG_DEFAULT_DISABLE([lomount], [Enable lomount])
 AX_ARG_DEFAULT_ENABLE([debug], [Disable debug build of tools])
+AC_ARG_ENABLE([qemuu-spice],
+[  --enable-qemuu-spice	Enable Spice build on qemu upstream],
+[qemuu_add_par+=3D" --enable-spice"])
+AC_ARG_ENABLE([qemuu-usbredir],
+[  --enable-qemuu-usbredir	Enable usb redirection build on qemu upstream=
],
+[qemuu_add_par+=3D" --enable-usb-redir"])
+AC_ARG_ENABLE([qemuu-debug],
+[  --enable-qemuu-debug	Enable debug build on qemu upstream],
+[qemuu_add_par+=3D" --enable-debug"])
+AC_SUBST(qemuu_add_par)
=20
 AC_ARG_VAR([PREPEND_INCLUDES],
     [List of include folders to prepend to CFLAGS (without -I)])

--------------050506080203010500080701--

--------------ms040009030202020409000402
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"
Content-Description: Firma crittografica S/MIME

MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIINhjCC
BjQwggQcoAMCAQICASAwDQYJKoZIhvcNAQEFBQAwfTELMAkGA1UEBhMCSUwxFjAUBgNVBAoT
DVN0YXJ0Q29tIEx0ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNp
Z25pbmcxKTAnBgNVBAMTIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA3
MTAyNDIxMDI1NVoXDTE3MTAyNDIxMDI1NVowgYwxCzAJBgNVBAYTAklMMRYwFAYDVQQKEw1T
dGFydENvbSBMdGQuMSswKQYDVQQLEyJTZWN1cmUgRGlnaXRhbCBDZXJ0aWZpY2F0ZSBTaWdu
aW5nMTgwNgYDVQQDEy9TdGFydENvbSBDbGFzcyAyIFByaW1hcnkgSW50ZXJtZWRpYXRlIENs
aWVudCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMsohUWcASz7GfKrpTOM
KqANy9BV7V0igWdGxA8IU77L3aTxErQ+fcxtDYZ36Z6GH0YFn7fq5RADteP0AYzrCA+EQTfi
8q1+kA3m0nwtwXG94M5sIqsvs7lRP1aycBke/s5g9hJHryZ2acScnzczjBCAo7X1v5G3yw8M
DP2m2RCye0KfgZ4nODerZJVzhAlOD9YejvAXZqHksw56HzElVIoYSZ3q4+RJuPXXfIoyby+Y
2m1E+YzX5iCZXBx05gk6MKAW1vaw4/v2OOLy6FZH3XHHtOkzUreG//CsFnB9+uaYSlR65cdG
zTsmoIK8WH1ygoXhRBm98SD7Hf/r3FELNvUCAwEAAaOCAa0wggGpMA8GA1UdEwEB/wQFMAMB
Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSuVYNv7DHKufcd+q9rMfPIHeOsuzAfBgNV
HSMEGDAWgBROC+8apEBbpRdphzDKNGhD0EGu8jBmBggrBgEFBQcBAQRaMFgwJwYIKwYBBQUH
MAGGG2h0dHA6Ly9vY3NwLnN0YXJ0c3NsLmNvbS9jYTAtBggrBgEFBQcwAoYhaHR0cDovL3d3
dy5zdGFydHNzbC5jb20vc2ZzY2EuY3J0MFsGA1UdHwRUMFIwJ6AloCOGIWh0dHA6Ly93d3cu
c3RhcnRzc2wuY29tL3Nmc2NhLmNybDAnoCWgI4YhaHR0cDovL2NybC5zdGFydHNzbC5jb20v
c2ZzY2EuY3JsMIGABgNVHSAEeTB3MHUGCysGAQQBgbU3AQIBMGYwLgYIKwYBBQUHAgEWImh0
dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93
d3cuc3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwDQYJKoZIhvcNAQEFBQADggIBADqp
Jw3I07QWke9plNBpxUxcffc7nUrIQpJHDci91DFG7fVhHRkMZ1J+BKg5UNUxIFJ2Z9B90Mic
c/NXcs7kPBRdn6XGO/vPc87Y6R+cWS9Nc9+fp3Enmsm94OxOwI9wn8qnr/6o3mD4noP9Jphw
UPTXwHovjavRnhUQHLfo/i2NG0XXgTHXS2Xm0kVUozXqpYpAdumMiB/vezj1QHQJDmUdPYMc
p+reg9901zkyT3fDW/ivJVv6pWtkh6Pw2ytZT7mvg7YhX3V50Nv860cV11mocUVcqBLv0gcT
+HBDYtbuvexNftwNQKD5193A7zN4vG7CTYkXxytSjKuXrpEatEiFPxWgb84nVj25SU5q/r1X
hwby6mLhkbaXslkVtwEWT3Van49rKjlK4XrUKYYWtnfzq6aSak5u0Vpxd1rY79tWhD3EdCvO
hNz/QplNa+VkIsrcp7+8ZhP1l1b2U6MaxIVteuVMD3X0vziIwr7jxYae9FZjbxlpUemqXjcC
0QaFfN7qI0JsQMALL7iGRBg7K0CoOBzECdD3fuZil5kU/LP9cr1BK31U0Uy651bFnAMMMkqh
AChIbn0ei72VnbpSsrrSdF0BAGYQ8vyHae5aCg+H75dVCV33K6FuxZrf09yTz+Vx/PkdRUYk
XmZz/OTfyJXsUOUXrym6KvI2rYpccSk5MIIHSjCCBjKgAwIBAgICHmMwDQYJKoZIhvcNAQEF
BQAwgYwxCzAJBgNVBAYTAklMMRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMSswKQYDVQQLEyJT
ZWN1cmUgRGlnaXRhbCBDZXJ0aWZpY2F0ZSBTaWduaW5nMTgwNgYDVQQDEy9TdGFydENvbSBD
bGFzcyAyIFByaW1hcnkgSW50ZXJtZWRpYXRlIENsaWVudCBDQTAeFw0xMjAzMTgyMjE0MzBa
Fw0xNDAzMjAwODU3MDlaMIGMMRkwFwYDVQQNExBlQjZPRTM3UlJOUHlsNW0yMQswCQYDVQQG
EwJJVDEQMA4GA1UECBMHQmVyZ2FtbzEQMA4GA1UEBxMHUm92ZXR0YTEWMBQGA1UEAxMNRmFi
aW8gRmFudG9uaTEmMCQGCSqGSIb3DQEJARYXZmFudG9uaWZhYmlvQHRpc2NhbGkuaXQwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1XhckXsX23vgJq76s2f0KT8U8Msov5QgV
10eQBb2wL/TzcmqtZotI7ztKVhio3ehHg+mfu+3EqOkX9Umgut8rP0bPi7AGjkPXbOTT/cSU
Xz2Kw31VGOmiOVoUFGvpQitp3weCkhUJLBipI8EpNyBXpjtQ9yCpnIAqfuc77ybfSnCy7tTR
MBq1BUkfjH1+GL45riosuS4+F+MSUvlYzLiT4rAduAX1Y2IuORDsf9Bce8GBxa6syP9rCyzl
Vk7DIX5k8j2vlnyRATIypn5CQLQxGT6e0f6ac4gvWOHwO2QEBsmZKKs1ZidE4q/9OoNXYX6A
jnHtp1H1vcrek/vVcs19AgMBAAGjggOyMIIDrjAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAd
BgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwHQYDVR0OBBYEFFan8cbEWWBmSTWFtLk2
YNdAcGUbMB8GA1UdIwQYMBaAFK5Vg2/sMcq59x36r2sx88gd46y7MCIGA1UdEQQbMBmBF2Zh
bnRvbmlmYWJpb0B0aXNjYWxpLml0MIICIQYDVR0gBIICGDCCAhQwggIQBgsrBgEEAYG1NwEC
AjCCAf8wLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYw
NAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYw
gfcGCCsGAQUFBwICMIHqMCcWIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MAMC
AQEagb5UaGlzIGNlcnRpZmljYXRlIHdhcyBpc3N1ZWQgYWNjb3JkaW5nIHRvIHRoZSBDbGFz
cyAyIFZhbGlkYXRpb24gcmVxdWlyZW1lbnRzIG9mIHRoZSBTdGFydENvbSBDQSBwb2xpY3ks
IHJlbGlhbmNlIG9ubHkgZm9yIHRoZSBpbnRlbmRlZCBwdXJwb3NlIGluIGNvbXBsaWFuY2Ug
b2YgdGhlIHJlbHlpbmcgcGFydHkgb2JsaWdhdGlvbnMuMIGcBggrBgEFBQcCAjCBjzAnFiBT
dGFydENvbSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTADAgECGmRMaWFiaWxpdHkgYW5kIHdh
cnJhbnRpZXMgYXJlIGxpbWl0ZWQhIFNlZSBzZWN0aW9uICJMZWdhbCBhbmQgTGltaXRhdGlv
bnMiIG9mIHRoZSBTdGFydENvbSBDQSBwb2xpY3kuMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6
Ly9jcmwuc3RhcnRzc2wuY29tL2NydHUyLWNybC5jcmwwgY4GCCsGAQUFBwEBBIGBMH8wOQYI
KwYBBQUHMAGGLWh0dHA6Ly9vY3NwLnN0YXJ0c3NsLmNvbS9zdWIvY2xhc3MyL2NsaWVudC9j
YTBCBggrBgEFBQcwAoY2aHR0cDovL2FpYS5zdGFydHNzbC5jb20vY2VydHMvc3ViLmNsYXNz
Mi5jbGllbnQuY2EuY3J0MCMGA1UdEgQcMBqGGGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tLzAN
BgkqhkiG9w0BAQUFAAOCAQEAjzHNqifpDVMkH1TSPFZVIiQ4fh49/V5JMpstgqEZPDaDe5r8
h+fMBZtUa6LLMco03Z9BNEXlqlXKiFk8feVYB8obEjz7YYq1XhO9q7JUmkSs0WGIH4xU0XB1
kPC8T8H+5E//84poYSFHE4pA+Ff68UANP2/EuFJWMjegiefnOr8aM42OAcUkjEWSlautIIX8
oD2GizwQYjWdDDjEonbuMKFP6rY2xGI3PSLI3IVU2opb0/itNhQui3WRxafloJqTlriY8m8+
qSLr2HGftbBlbyzVWB8o//aW0H0LMabjkIvrm7Zmh2vcCxiSxGBwYASuSYXGuQiKAgGptUs1
XJLZuzGCA80wggPJAgEBMIGTMIGMMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20g
THRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzE4MDYG
A1UEAxMvU3RhcnRDb20gQ2xhc3MgMiBQcmltYXJ5IEludGVybWVkaWF0ZSBDbGllbnQgQ0EC
Ah5jMAkGBSsOAwIaBQCgggIOMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcN
AQkFMQ8XDTEyMDQwNDEzMzA1MFowIwYJKoZIhvcNAQkEMRYEFLlo/opChODbbWsspBoLTPJ3
p2WyMF8GCSqGSIb3DQEJDzFSMFAwCwYJYIZIAWUDBAECMAoGCCqGSIb3DQMHMA4GCCqGSIb3
DQMCAgIAgDANBggqhkiG9w0DAgIBQDAHBgUrDgMCBzANBggqhkiG9w0DAgIBKDCBpAYJKwYB
BAGCNxAEMYGWMIGTMIGMMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEr
MCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzE4MDYGA1UEAxMv
U3RhcnRDb20gQ2xhc3MgMiBQcmltYXJ5IEludGVybWVkaWF0ZSBDbGllbnQgQ0ECAh5jMIGm
BgsqhkiG9w0BCRACCzGBlqCBkzCBjDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29t
IEx0ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcxODA2
BgNVBAMTL1N0YXJ0Q29tIENsYXNzIDIgUHJpbWFyeSBJbnRlcm1lZGlhdGUgQ2xpZW50IENB
AgIeYzANBgkqhkiG9w0BAQEFAASCAQBqBa3rgRryb+8f5SiC6zQ3csJbu4PKNJ3memWCVWOE
r6sfplbTEaDGywf8POASI01MWf5l7NC+/umJgL5qz3xvlxaCa36QOLggezmerOyk+ws0ewTM
46tZrr+k68WjnH0bXxYa2ZcZX3el61G0ymzqNbZJjB04aPAnd21A4fZ8EBB3zMlIhv4ODHG6
XqO+2fOJ8dMyHcuosvjSB0SjD/VMk9uj05jpkqJ6C/550E4De76h3Xr23Y6+ZvhndcLiGmCm
soPbZo/9Ho8heNnkOzCOyEVCiCm19ePFCEpif26jphQJR/rtMMRWhpEwARLF0Rn7+6B6aonP
T3VQ4SEcNpCZAAAAAAAA
--------------ms040009030202020409000402--


--===============7463004862380400107==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

--===============7463004862380400107==--


From xen-changelog-bounces@lists.xen.org Fri Apr 06 02:33:29 2012
Return-path: <xen-changelog-bounces@lists.xen.org>
Envelope-to: archives@lists.xen.org
Delivery-date: Fri, 06 Apr 2012 02:33:29 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-changelog-bounces@lists.xen.org>)
	id 1SFyzQ-0004YN-LW; Fri, 06 Apr 2012 02:33:28 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen@xenbits.xen.org>) id 1SFyzO-0004Uj-Vy
	for xen-changelog@lists.xensource.com; Fri, 06 Apr 2012 02:33:27 +0000
Received: from [193.109.254.147:2377] by server-1.bemta-14.messagelabs.com id
	55/26-29372-6F55E7F4; Fri, 06 Apr 2012 02:33:26 +0000
X-Env-Sender: xen@xenbits.xen.org
X-Msg-Ref: server-14.tower-27.messagelabs.com!1333679600!3470662!1
X-Originating-IP: [50.57.168.107]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Version: 6.5.7; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23459 invoked from network); 6 Apr 2012 02:33:21 -0000
Received: from mail.xen.org (HELO mail.xen.org) (50.57.168.107)
	by server-14.tower-27.messagelabs.com with AES256-SHA encrypted SMTP;
	6 Apr 2012 02:33:21 -0000
Received: from xenbits.xen.org ([50.57.170.242])
	by mail.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen@xenbits.xen.org>) id 1SFyzH-0003NF-NQ
	for xen-changelog@lists.xensource.com; Fri, 06 Apr 2012 02:33:19 +0000
Received: from xen by xenbits.xen.org with local (Exim 4.72)
	(envelope-from <xen@xenbits.xen.org>) id 1SFyzH-0008MX-KO
	for xen-changelog@lists.xensource.com; Fri, 06 Apr 2012 02:33:19 +0000
Message-Id: <E1SFyzH-0008MX-KO@xenbits.xen.org>
Date: Fri, 06 Apr 2012 02:33:19 +0000
From: Xen patchbot-unstable <patchbot@xen.org>
To: xen-changelog@lists.xensource.com
Subject: [Xen-changelog] [xen-unstable] PV-GRUB: add support for btrfs
X-BeenThere: xen-changelog@lists.xen.org
X-Mailman-Version: 2.1.13
Precedence: list
Reply-To: xen-devel@lists.xensource.com
List-Id: BK change log <xen-changelog.lists.xen.org>
List-Unsubscribe: <http://lists.xen.org/cgi-bin/mailman/options/xen-changelog>, 
	<mailto:xen-changelog-request@lists.xen.org?subject=unsubscribe>
List-Post: <mailto:xen-changelog@lists.xen.org>
List-Help: <mailto:xen-changelog-request@lists.xen.org?subject=help>
List-Subscribe: <http://lists.xen.org/cgi-bin/mailman/listinfo/xen-changelog>, 
	<mailto:xen-changelog-request@lists.xen.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: xen-changelog-bounces@lists.xen.org
Errors-To: xen-changelog-bounces@lists.xen.org

# HG changeset patch
# User Matt Wilson <msw@amazon.com>
# Date 1333534155 -3600
# Node ID c2954b4acd69deae140328772028c8ef45818ae4
# Parent  d1c985425e7841891ec1e3c0d4dc224be7b8d3cc
PV-GRUB: add support for btrfs

This patch adds btrfs support to the GRUB tree used to build PV-GRUB.
The original patch is from Gentoo:
https://bugs.gentoo.org/show_bug.cgi?id=283637

Signed-off-by: Matt Wilson <msw@amazon.com>
Committed-by: Ian Jackson <ian.jackson.citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
---


diff -r d1c985425e78 -r c2954b4acd69 stubdom/grub.patches/61btrfs.diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stubdom/grub.patches/61btrfs.diff	Wed Apr 04 11:09:15 2012 +0100
@@ -0,0 +1,3512 @@
+diff -up grub-upstream.wip/AUTHORS.btrfs grub-upstream.wip/AUTHORS
+--- grub-upstream.wip/AUTHORS.btrfs	2004-03-27 16:25:17.000000000 +0000
++++ grub-upstream.wip/AUTHORS	2012-03-20 05:07:09.000000000 +0000
+@@ -41,6 +41,8 @@ Kristoffer Branemyr added VSTa filesyste
+ 
+ Serguei Tzukanov added JFS and XFS support.
+ 
++Edward Shishkin added Btrfs support.
++
+ Jason Thomas added Linux DAC960 support and support for hiding/unhiding
+ logical partitions, and did a significant bugfix for the terminal stuff.
+ 
+diff -up grub-upstream.wip/configure.ac.btrfs grub-upstream.wip/configure.ac
+--- grub-upstream.wip/configure.ac.btrfs	2012-03-20 05:06:49.000000000 +0000
++++ grub-upstream.wip/configure.ac	2012-03-20 05:07:09.000000000 +0000
+@@ -274,6 +274,13 @@ if test x"$enable_reiserfs" != xno; then
+   FSYS_CFLAGS="$FSYS_CFLAGS -DFSYS_REISERFS=1"
+ fi
+ 
++AC_ARG_ENABLE(btrfs,
++  [  --disable-btrfs         disable BtrFS support in Stage 2])
++
++if test x"$enable_btrfs" != xno; then
++  FSYS_CFLAGS="$FSYS_CFLAGS -DFSYS_BTRFS=1"
++fi
++
+ AC_ARG_ENABLE(vstafs,
+   [  --disable-vstafs        disable VSTa FS support in Stage 2])
+ 
+diff -up grub-upstream.wip/docs/grub.texi.btrfs grub-upstream.wip/docs/grub.texi
+--- grub-upstream.wip/docs/grub.texi.btrfs	2012-03-20 05:06:49.000000000 +0000
++++ grub-upstream.wip/docs/grub.texi	2012-03-20 05:07:09.000000000 +0000
+@@ -1761,6 +1761,7 @@ itself. Usually, this is put in a filesy
+ @itemx jfs_stage1_5
+ @itemx minix_stage1_5
+ @itemx reiserfs_stage1_5
++@itemx btrfs_stage1_5
+ @itemx vstafs_stage1_5
+ @itemx xfs_stage1_5
+ 
+diff -up grub-upstream.wip/grub/Makefile.am.btrfs grub-upstream.wip/grub/Makefile.am
+--- grub-upstream.wip/grub/Makefile.am.btrfs	2005-02-02 20:38:19.000000000 +0000
++++ grub-upstream.wip/grub/Makefile.am	2012-03-20 05:07:09.000000000 +0000
+@@ -8,7 +8,7 @@ endif
+ 
+ AM_CPPFLAGS = -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 \
+ 	-DFSYS_ISO9660=1 -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 \
+-	-DFSYS_UFS2=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \
++	-DFSYS_BTRFS=1 -DFSYS_UFS2=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \
+ 	-DUSE_MD5_PASSWORDS=1 -DSUPPORT_HERCULES=1 \
+ 	$(SERIAL_FLAGS) -I$(top_srcdir)/stage2 \
+ 	-I$(top_srcdir)/stage1 -I$(top_srcdir)/lib
+diff -up grub-upstream.wip/INSTALL.btrfs grub-upstream.wip/INSTALL
+--- grub-upstream.wip/INSTALL.btrfs	2005-05-08 02:43:15.000000000 +0000
++++ grub-upstream.wip/INSTALL	2012-03-20 05:07:09.000000000 +0000
+@@ -207,6 +207,9 @@ operates.
+ `--disable-reiserfs'
+      Omit the ReiserFS support in Stage 2.
+ 
++`--disable-btrfs'
++     Omit the BtrFS support in Stage 2.
++
+ `--disable-vstafs'
+      Omit the VSTa filesystem support in Stage 2.
+ 
+diff -up /dev/null grub-upstream.wip/stage2/btrfs.h
+--- /dev/null	2009-06-03 06:46:26.160951000 +0000
++++ grub-upstream.wip/stage2/btrfs.h	2012-03-20 05:07:09.000000000 +0000
+@@ -0,0 +1,1415 @@
++/* btrfs.h - an extraction from btrfs-progs-0.18/ctree.h into one file
++ *
++ * Copyright (C) 2007 Oracle.  All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public
++ * License v2 as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this program; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 021110-1307, USA.
++ */
++
++/* include/asm-i386/types.h */
++
++typedef __signed__ char __s8;
++typedef unsigned char __u8;
++typedef __signed__ short __s16;
++typedef unsigned short __u16;
++typedef __signed__ int __s32;
++typedef unsigned int __u32;
++typedef unsigned long long __u64;
++typedef __signed__ long long __s64;
++
++typedef __s8 s8;
++typedef __u8 u8;
++typedef __u16 u16;
++typedef __u32 u32;
++typedef __u64 u64;
++typedef __s64 s64;
++
++#define __bitwise
++
++typedef u16 __bitwise __le16;
++typedef u32 __bitwise __le32;
++typedef u64 __bitwise __le64;
++
++/* linux/posix_type.h */
++typedef long linux_off_t;
++
++/* linux/little_endian.h */
++#define cpu_to_le64(x) ((__u64) (x))
++#define le64_to_cpu(x) ((__u64) (x))
++#define cpu_to_le32(x) ((__u32) (x))
++#define le32_to_cpu(x) ((__u32) (x))
++#define cpu_to_le16(x) ((__u16) (x))
++#define le16_to_cpu(x) ((__u16) (x))
++#define le8_to_cpu(x) ((__u8) (x))
++#define cpu_to_le8(x) ((__u8) (x))
++
++/* linux/stat.h */
++#define S_IFMT  00170000
++#define S_IFLNK  0120000
++#define S_IFREG  0100000
++#define S_IFDIR  0040000
++#define S_ISLNK(m)     (((m) & S_IFMT) == S_IFLNK)
++#define S_ISREG(m)      (((m) & S_IFMT) == S_IFREG)
++#define S_ISDIR(m)      (((m) & S_IFMT) == S_IFDIR)
++
++struct btrfs_root;
++#define BTRFS_MAGIC "_BHRfS_M"
++
++#define BTRFS_SUPER_INFO_OFFSET (64 * 1024)
++#define BTRFS_SUPER_INFO_SIZE 4096
++
++#define BTRFS_SUPER_MIRROR_MAX  3
++#define BTRFS_SUPER_MIRROR_SHIFT 12
++
++#define PATH_MAX                1024   /* include/linux/limits.h */
++#define MAX_LINK_COUNT             5   /* number of symbolic links
++                                          to follow */
++#define BTRFS_MAX_LEVEL 8
++#define BTRFS_ROOT_TREE_OBJECTID 1ULL
++#define BTRFS_EXTENT_TREE_OBJECTID 2ULL
++#define BTRFS_CHUNK_TREE_OBJECTID 3ULL
++#define BTRFS_DEV_TREE_OBJECTID 4ULL
++#define BTRFS_FS_TREE_OBJECTID 5ULL
++#define BTRFS_ROOT_TREE_DIR_OBJECTID 6ULL
++#define BTRFS_CSUM_TREE_OBJECTID 7ULL
++
++#define BTRFS_ORPHAN_OBJECTID -5ULL
++#define BTRFS_TREE_LOG_OBJECTID -6ULL
++#define BTRFS_TREE_LOG_FIXUP_OBJECTID -7ULL
++#define BTRFS_TREE_RELOC_OBJECTID -8ULL
++#define BTRFS_DATA_RELOC_TREE_OBJECTID -9ULL
++#define BTRFS_EXTENT_CSUM_OBJECTID -10ULL
++
++#define BTRFS_MULTIPLE_OBJECTIDS -255ULL
++#define BTRFS_FIRST_FREE_OBJECTID 256ULL
++#define BTRFS_LAST_FREE_OBJECTID -256ULL
++#define BTRFS_FIRST_CHUNK_TREE_OBJECTID 256ULL
++#define BTRFS_DEV_ITEMS_OBJECTID 1ULL
++
++
++#define BTRFS_NAME_LEN 255
++#define BTRFS_CSUM_SIZE 32
++#define BTRFS_CSUM_TYPE_CRC32  0
++
++static int btrfs_csum_sizes[] = { 4, 0 };
++
++/* four bytes for CRC32 */
++#define BTRFS_CRC32_SIZE 4
++#define BTRFS_EMPTY_DIR_SIZE 0
++
++#define BTRFS_FT_UNKNOWN       0
++#define BTRFS_FT_REG_FILE      1
++#define BTRFS_FT_DIR           2
++#define BTRFS_FT_CHRDEV                3
++#define BTRFS_FT_BLKDEV                4
++#define BTRFS_FT_FIFO          5
++#define BTRFS_FT_SOCK          6
++#define BTRFS_FT_SYMLINK       7
++#define BTRFS_FT_XATTR         8
++#define BTRFS_FT_MAX           9
++
++#define BTRFS_UUID_SIZE 16
++
++#define BTRFS_DEFAULT_NUM_DEVICES     1
++#define BTRFS_DEFAULT_NODE_SIZE       4096
++#define BTRFS_DEFAULT_LEAF_SIZE       4096
++#define BTRFS_NUM_CACHED_DEVICES      128
++
++#define WARN_ON(c)
++#define cassert(cond) ({ switch (-1) { case (cond): case 0: break; } })
++#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
++
++#define offsetof(type, memb) \
++       ((unsigned long)(&((type *)0)->memb))
++
++struct btrfs_disk_key {
++       __le64 objectid;
++       u8 type;
++       __le64 offset;
++} __attribute__ ((__packed__));
++
++/* cpu key */
++struct btrfs_key {
++       u64 objectid;
++       u8 type;
++       u64 offset;
++} __attribute__ ((__packed__));
++
++/* this represents a divice in a chunk tree */
++struct btrfs_dev_item {
++       __le64 devid; /* internal device id */
++       __le64 total_bytes; /* size of the device */
++       __le64 bytes_used;
++       __le32 io_align; /* optimal io alignment */
++       __le32 io_width; /* optimal io width */
++       __le32 sector_size; /* minimal io size */
++       __le64 type; /* type and info about this device */
++       __le64 generation; /* expected generation */
++        __le64 start_offset; /* of the partition on a device */
++
++       /* info for allocation decisions */
++       __le32 dev_group;
++
++        u8 seek_speed; /* 0-100 (100 is fastest) */
++       u8 bandwidth;  /* 0-100 (100 is fastest) */
++
++        u8 uuid[BTRFS_UUID_SIZE]; /* dev uuid generated by btrfs */
++       u8 fsid[BTRFS_UUID_SIZE]; /* uuid of the host FS */
++} __attribute__ ((__packed__));
++
++struct btrfs_stripe {
++       __le64 devid;
++       __le64 offset;
++       u8 dev_uuid[BTRFS_UUID_SIZE];
++} __attribute__ ((__packed__));
++
++struct btrfs_chunk {
++       /* size of this chunk in bytes */
++       __le64 length;
++       __le64 owner; /* objectid of the root referincing this chunk */
++       __le64 stripe_len;
++       __le64 type;
++       __le32 io_align; /* optimal io alignment for this chunk */
++       __le32 io_width; /* optimal io width for this chunk */
++       __le32 sector_size; /* minimal io size for this chunk */
++       __le16 num_stripes;
++       __le16 sub_stripes; /* sub stripes (for raid10) */
++       struct btrfs_stripe stripe;
++} __attribute__ ((__packed__));
++
++static inline unsigned long btrfs_chunk_item_size(int num_stripes)
++{
++       return sizeof(struct btrfs_chunk) +
++               sizeof(struct btrfs_stripe) * (num_stripes - 1);
++}
++
++#define BTRFS_FSID_SIZE 16
++#define BTRFS_HEADER_FLAG_WRITTEN (1 << 0)
++
++struct btrfs_header {
++       /* these first four must match the super block */
++       u8 csum[BTRFS_CSUM_SIZE];
++       u8 fsid[BTRFS_FSID_SIZE]; /* uuid of the host fs */
++       __le64 bytenr; /* which block this node is supposed to live in */
++       __le64 flags;
++
++       /* allowed to be different from the super from here on down */
++       u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
++       __le64 generation;
++       __le64 owner;
++       __le32 nritems;
++       u8 level;
++} __attribute__ ((__packed__));
++
++#define BTRFS_NODEPTRS_PER_BLOCK(r) (((r)->nodesize - \
++                               sizeof(struct btrfs_header)) / \
++                               sizeof(struct btrfs_key_ptr))
++#define __BTRFS_LEAF_DATA_SIZE(bs) ((bs) - sizeof(struct btrfs_header))
++#define BTRFS_LEAF_DATA_SIZE(r) (__BTRFS_LEAF_DATA_SIZE(r->leafsize))
++#define BTRFS_MAX_INLINE_DATA_SIZE(r) (BTRFS_LEAF_DATA_SIZE(r) - \
++                                       sizeof(struct btrfs_item) - \
++                                       sizeof(struct btrfs_file_extent_item))
++
++#define BTRFS_SUPER_FLAG_SEEDING       (1ULL << 32)
++#define BTRFS_SUPER_FLAG_METADUMP      (1ULL << 33)
++
++/*
++ * a portion of superblock which is used
++ * for chunk translation (up to 14 chunks
++ * with 3 stripes each.
++ */
++#define BTRFS_SYSTEM_CHUNK_ARRAY_SIZE 2048
++#define BTRFS_LABEL_SIZE 256
++
++/*
++ * the super block basically lists the main trees of the FS
++ * it currently lacks any block count etc etc
++ */
++
++struct btrfs_super_block {
++       u8 csum[BTRFS_CSUM_SIZE];
++       /* the first 3 fields must match struct btrfs_header */
++       u8 fsid[BTRFS_FSID_SIZE];    /* FS specific uuid */
++       __le64 bytenr; /* this block number */
++       __le64 flags;
++
++       /* allowed to be different from the btrfs_header from here own down */
++       __le64 magic;
++       __le64 generation;
++       __le64 root;        /* tree root */
++       __le64 chunk_root;
++       __le64 log_root;
++
++       /* this will help find the new super based on the log root */
++       __le64 log_root_transid;
++       __le64 total_bytes;
++       __le64 bytes_used;
++       __le64 root_dir_objectid;
++       __le64 num_devices;
++       __le32 sectorsize;
++       __le32 nodesize;
++       __le32 leafsize;
++       __le32 stripesize;
++       __le32 sys_chunk_array_size;
++       __le64 chunk_root_generation;
++       __le64 compat_flags;
++       __le64 compat_ro_flags;
++       __le64 incompat_flags;
++       __le16 csum_type;
++       u8 root_level;
++       u8 chunk_root_level;
++       u8 log_root_level;
++       struct btrfs_dev_item dev_item;
++
++       char label[BTRFS_LABEL_SIZE];
++
++       /* future expansion */
++       __le64 reserved[32];
++       u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
++} __attribute__ ((__packed__));
++
++/*
++ * Compat flags that we support.  If any incompat flags are set other than the
++ * ones specified below then we will fail to mount
++ */
++#define BTRFS_FEATURE_COMPAT_SUPP      0x0
++#define BTRFS_FEATURE_COMPAT_RO_SUPP   0x0
++#define BTRFS_FEATURE_INCOMPAT_SUPP    0x0
++
++/* Item header for per-leaf lookup */
++struct btrfs_item {
++       struct btrfs_disk_key key;
++       __le32 offset;
++       __le32 size;
++} __attribute__ ((__packed__));
++
++/*
++ * Format of the leaves:
++ * [item0, item1....itemN] [free space] [dataN...data1, data0]
++ */
++struct btrfs_leaf {
++       struct btrfs_header header;
++       struct btrfs_item items[];
++} __attribute__ ((__packed__));
++
++/*
++ * keys-pointers pairs for per-node (non-leaf) lookup
++ */
++struct btrfs_key_ptr {
++       struct btrfs_disk_key key;
++       __le64 blockptr;
++       __le64 generation;
++} __attribute__ ((__packed__));
++
++struct btrfs_node {
++       struct btrfs_header header;
++       struct btrfs_key_ptr ptrs[];
++} __attribute__ ((__packed__));
++
++struct btrfs_device {
++	/* the internal btrfs device id */
++	u64 devid;
++	/* the internal grub device representation */
++	unsigned long drive;
++	unsigned long part;
++	unsigned long length;
++};
++
++struct extent_buffer {
++       /* metadata */
++       struct btrfs_device dev;
++       u64 start;
++       u64 dev_bytenr;
++       u32 len;
++       /* data */
++       char *data;
++};
++
++static inline void read_extent_buffer(struct extent_buffer *eb,
++                                     void *dst, unsigned long start,
++                                     unsigned long len)
++{
++       memcpy(dst, eb->data + start, len);
++}
++
++static inline void write_extent_buffer(struct extent_buffer *eb,
++                                      const void *src, unsigned long start,
++                                      unsigned long len)
++{
++       memcpy(eb->data + start, src, len);
++}
++
++/*
++ * NOTE:
++ * don't increase a number of levels for grub-0.97!
++ */
++typedef enum {
++       FIRST_EXTERNAL_LOOKUP_POOL,
++       SECOND_EXTERNAL_LOOKUP_POOL,
++       INTERNAL_LOOKUP_POOL,
++       LAST_LOOKUP_POOL
++} lookup_pool_id;
++
++/*             Relationship between lookup pools:
++ *  depth
++ *
++ *    ^             +----> INTERNAL <----+
++ *    |             |                    |
++ *    |             |                    |
++ *    -        FIRST_EXTERNAL     SECOND_EXTERNAL
++ */
++
++struct btrfs_path {
++       lookup_pool_id lpid;
++       struct extent_buffer nodes[BTRFS_MAX_LEVEL];
++       int slots[BTRFS_MAX_LEVEL];
++};
++
++/*
++ * items in the extent btree are used to record the objectid of the
++ * owner of the block and the number of references
++ */
++struct btrfs_extent_item {
++       __le32 refs;
++} __attribute__ ((__packed__));
++
++struct btrfs_extent_ref {
++       __le64 root;
++       __le64 generation;
++       __le64 objectid;
++       __le32 num_refs;
++} __attribute__ ((__packed__));
++
++/* dev extents record free space on individual devices.  The owner
++ * field points back to the chunk allocation mapping tree that allocated
++ * the extent.  The chunk tree uuid field is a way to double check the owner
++ */
++struct btrfs_dev_extent {
++       __le64 chunk_tree;
++       __le64 chunk_objectid;
++       __le64 chunk_offset;
++       __le64 length;
++       u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
++} __attribute__ ((__packed__));
++
++struct btrfs_inode_ref {
++       __le64 index;
++       __le16 name_len;
++       /* name goes here */
++} __attribute__ ((__packed__));
++
++struct btrfs_timespec {
++       __le64 sec;
++       __le32 nsec;
++} __attribute__ ((__packed__));
++
++typedef enum {
++       BTRFS_COMPRESS_NONE = 0,
++       BTRFS_COMPRESS_ZLIB = 1,
++       BTRFS_COMPRESS_LAST = 2,
++} btrfs_compression_type;
++
++/* we don't understand any encryption methods right now */
++typedef enum {
++       BTRFS_ENCRYPTION_NONE = 0,
++       BTRFS_ENCRYPTION_LAST = 1,
++} btrfs_encryption_type;
++
++struct btrfs_inode_item {
++       /* nfs style generation number */
++       __le64 generation;
++       /* transid that last touched this inode */
++       __le64 transid;
++       __le64 size;
++       __le64 nbytes;
++       __le64 block_group;
++       __le32 nlink;
++       __le32 uid;
++       __le32 gid;
++       __le32 mode;
++       __le64 rdev;
++       __le64 flags;
++
++       /* modification sequence number for NFS */
++       __le64 sequence;
++
++       /*
++        * a little future expansion, for more than this we can
++        * just grow the inode item and version it
++        */
++       __le64 reserved[4];
++       struct btrfs_timespec atime;
++       struct btrfs_timespec ctime;
++       struct btrfs_timespec mtime;
++       struct btrfs_timespec otime;
++} __attribute__ ((__packed__));
++
++struct btrfs_dir_item {
++       struct btrfs_disk_key location;
++       __le64 transid;
++       __le16 data_len;
++       __le16 name_len;
++       u8 type;
++} __attribute__ ((__packed__));
++
++struct btrfs_root_item {
++       struct btrfs_inode_item inode;
++       __le64 generation;
++       __le64 root_dirid;
++       __le64 bytenr;
++       __le64 byte_limit;
++       __le64 bytes_used;
++       __le64 last_snapshot;
++       __le64 flags;
++       __le32 refs;
++       struct btrfs_disk_key drop_progress;
++       u8 drop_level;
++       u8 level;
++} __attribute__ ((__packed__));
++
++/*
++ * this is used for both forward and backward root refs
++ */
++struct btrfs_root_ref {
++       __le64 dirid;
++       __le64 sequence;
++       __le16 name_len;
++} __attribute__ ((__packed__));
++
++#define BTRFS_FILE_EXTENT_INLINE 0
++#define BTRFS_FILE_EXTENT_REG 1
++#define BTRFS_FILE_EXTENT_PREALLOC 2
++
++struct btrfs_file_extent_item {
++       /*
++        * transaction id that created this extent
++        */
++       __le64 generation;
++       /*
++        * max number of bytes to hold this extent in ram
++        * when we split a compressed extent we can't know how big
++        * each of the resulting pieces will be.  So, this is
++        * an upper limit on the size of the extent in ram instead of
++        * an exact limit.
++        */
++       __le64 ram_bytes;
++
++       /*
++        * 32 bits for the various ways we might encode the data,
++        * including compression and encryption.  If any of these
++        * are set to something a given disk format doesn't understand
++        * it is treated like an incompat flag for reading and writing,
++        * but not for stat.
++        */
++       u8 compression;
++       u8 encryption;
++       __le16 other_encoding; /* spare for later use */
++
++       /* are we inline data or a real extent? */
++       u8 type;
++
++       /*
++        * disk space consumed by the extent, checksum blocks are included
++        * in these numbers
++        */
++       __le64 disk_bytenr;
++       __le64 disk_num_bytes;
++       /*
++        * the logical offset in file blocks (no csums)
++        * this extent record is for.  This allows a file extent to point
++        * into the middle of an existing extent on disk, sharing it
++        * between two snapshots (useful if some bytes in the middle of the
++        * extent have changed
++        */
++       __le64 offset;
++       /*
++        * the logical number of file blocks (no csums included)
++        */
++       __le64 num_bytes;
++
++} __attribute__ ((__packed__));
++
++struct btrfs_csum_item {
++       u8 csum;
++} __attribute__ ((__packed__));
++
++/* tag for the radix tree of block groups in ram */
++#define BTRFS_BLOCK_GROUP_DATA     (1 << 0)
++#define BTRFS_BLOCK_GROUP_SYSTEM   (1 << 1)
++#define BTRFS_BLOCK_GROUP_METADATA (1 << 2)
++#define BTRFS_BLOCK_GROUP_RAID0    (1 << 3)
++#define BTRFS_BLOCK_GROUP_RAID1    (1 << 4)
++#define BTRFS_BLOCK_GROUP_DUP     (1 << 5)
++#define BTRFS_BLOCK_GROUP_RAID10   (1 << 6)
++
++struct btrfs_block_group_item {
++       __le64 used;
++       __le64 chunk_objectid;
++       __le64 flags;
++} __attribute__ ((__packed__));
++
++/*
++ * in ram representation of the tree.  extent_root is used for all allocations
++ * and for the extent tree extent_root root.
++ */
++struct btrfs_root {
++       struct extent_buffer   node;
++       char                   data[4096];
++       struct btrfs_root_item root_item;
++       u64 objectid;
++       
++       /* data allocations are done in sectorsize units */
++       u32 sectorsize;
++
++       /* node allocations are done in nodesize units */
++       u32 nodesize;
++
++       /* leaf allocations are done in leafsize units */
++       u32 leafsize;
++
++       /* leaf allocations are done in leafsize units */
++       u32 stripesize;
++};
++
++struct btrfs_file_info {
++	struct btrfs_key key;
++};
++
++struct btrfs_root;
++struct btrfs_fs_devices;
++struct btrfs_fs_info {
++       u8 fsid[BTRFS_FSID_SIZE];
++       struct btrfs_root fs_root;
++       struct btrfs_root tree_root;
++       struct btrfs_root chunk_root;
++
++       struct btrfs_file_info file_info; /* currently opened file */
++       struct btrfs_path paths [LAST_LOOKUP_POOL];
++
++       char mbr[SECTOR_SIZE];
++
++       int sb_mirror;
++       u64 sb_transid;
++       struct btrfs_device sb_dev;
++       struct btrfs_super_block sb_copy;
++
++       struct btrfs_device devices[BTRFS_NUM_CACHED_DEVICES + 1];
++};
++
++/*
++ * inode items have the data typically returned from stat and store other
++ * info about object characteristics.  There is one for every file and dir in
++ * the FS
++ */
++#define BTRFS_INODE_ITEM_KEY           1
++#define BTRFS_INODE_REF_KEY            12
++#define BTRFS_XATTR_ITEM_KEY           24
++#define BTRFS_ORPHAN_ITEM_KEY          48
++
++#define BTRFS_DIR_LOG_ITEM_KEY  60
++#define BTRFS_DIR_LOG_INDEX_KEY 72
++/*
++ * dir items are the name -> inode pointers in a directory.  There is one
++ * for every name in a directory.
++ */
++#define BTRFS_DIR_ITEM_KEY     84
++#define BTRFS_DIR_INDEX_KEY    96
++
++/*
++ * extent data is for file data
++ */
++#define BTRFS_EXTENT_DATA_KEY  108
++
++/*
++ * csum items have the checksums for data in the extents
++ */
++#define BTRFS_CSUM_ITEM_KEY    120
++/*
++ * extent csums are stored in a separate tree and hold csums for
++ * an entire extent on disk.
++ */
++#define BTRFS_EXTENT_CSUM_KEY  128
++
++/*
++ * root items point to tree roots.  There are typically in the root
++ * tree used by the super block to find all the other trees
++ */
++#define BTRFS_ROOT_ITEM_KEY    132
++
++/*
++ * root backrefs tie subvols and snapshots to the directory entries that
++ * reference them
++ */
++#define BTRFS_ROOT_BACKREF_KEY 144
++
++/*
++ * root refs make a fast index for listing all of the snapshots and
++ * subvolumes referenced by a given root.  They point directly to the
++ * directory item in the root that references the subvol
++ */
++#define BTRFS_ROOT_REF_KEY     156
++
++/*
+++ * extent items are in the extent map tree.  These record which blocks
+++ * are used, and how many references there are to each block
+++ */
++#define BTRFS_EXTENT_ITEM_KEY  168
++#define BTRFS_EXTENT_REF_KEY   180
++
++/*
++ * block groups give us hints into the extent allocation trees.  Which
++ * blocks are free etc etc
++ */
++#define BTRFS_BLOCK_GROUP_ITEM_KEY 192
++
++#define BTRFS_DEV_EXTENT_KEY   204
++#define BTRFS_DEV_ITEM_KEY     216
++#define BTRFS_CHUNK_ITEM_KEY   228
++
++/*
++ * string items are for debugging.  They just store a short string of
++ * data in the FS
++ */
++#define BTRFS_STRING_ITEM_KEY  253
++/*
++ * Inode flags
++ */
++#define BTRFS_INODE_NODATASUM          (1 << 0)
++#define BTRFS_INODE_NODATACOW          (1 << 1)
++#define BTRFS_INODE_READONLY           (1 << 2)
++
++#define read_eb_member(eb, ptr, type, member, result) (                        \
++       read_extent_buffer(eb, (char *)(result),                        \
++                          ((unsigned long)(ptr)) +                     \
++                           offsetof(type, member),                     \
++                          sizeof(((type *)0)->member)))
++
++#define BTRFS_SETGET_HEADER_FUNCS(name, type, member, bits)            \
++static inline u##bits btrfs_##name(struct extent_buffer *eb)           \
++{                                                                      \
++       struct btrfs_header *h = (struct btrfs_header *)eb->data;       \
++       return le##bits##_to_cpu(h->member);                            \
++}                                                                      \
++static inline void btrfs_set_##name(struct extent_buffer *eb,          \
++                                   u##bits val)                        \
++{                                                                      \
++       struct btrfs_header *h = (struct btrfs_header *)eb->data;       \
++       h->member = cpu_to_le##bits(val);                               \
++}
++
++#define BTRFS_SETGET_FUNCS(name, type, member, bits)                   \
++static inline u##bits btrfs_##name(struct extent_buffer *eb,           \
++                                  type *s)                             \
++{                                                                      \
++       unsigned long offset = (unsigned long)s;                        \
++       type *p = (type *) (eb->data + offset);                         \
++       return le##bits##_to_cpu(p->member);                            \
++}                                                                      \
++static inline void btrfs_set_##name(struct extent_buffer *eb,          \
++                                   type *s, u##bits val)               \
++{                                                                      \
++       unsigned long offset = (unsigned long)s;                        \
++       type *p = (type *) (eb->data + offset);                         \
++       p->member = cpu_to_le##bits(val);                               \
++}
++
++#define BTRFS_SETGET_STACK_FUNCS(name, type, member, bits)             \
++static inline u##bits btrfs_##name(type *s)                            \
++{                                                                      \
++       return le##bits##_to_cpu(s->member);                            \
++}                                                                      \
++static inline void btrfs_set_##name(type *s, u##bits val)              \
++{                                                                      \
++       s->member = cpu_to_le##bits(val);                               \
++}
++
++BTRFS_SETGET_FUNCS(device_type, struct btrfs_dev_item, type, 64);
++BTRFS_SETGET_FUNCS(device_total_bytes, struct btrfs_dev_item, total_bytes, 64);
++BTRFS_SETGET_FUNCS(device_bytes_used, struct btrfs_dev_item, bytes_used, 64);
++BTRFS_SETGET_FUNCS(device_io_align, struct btrfs_dev_item, io_align, 32);
++BTRFS_SETGET_FUNCS(device_io_width, struct btrfs_dev_item, io_width, 32);
++BTRFS_SETGET_FUNCS(device_start_offset, struct btrfs_dev_item,
++                  start_offset, 64);
++BTRFS_SETGET_FUNCS(device_sector_size, struct btrfs_dev_item, sector_size, 32);
++BTRFS_SETGET_FUNCS(device_id, struct btrfs_dev_item, devid, 64);
++BTRFS_SETGET_FUNCS(device_group, struct btrfs_dev_item, dev_group, 32);
++BTRFS_SETGET_FUNCS(device_seek_speed, struct btrfs_dev_item, seek_speed, 8);
++BTRFS_SETGET_FUNCS(device_bandwidth, struct btrfs_dev_item, bandwidth, 8);
++BTRFS_SETGET_FUNCS(device_generation, struct btrfs_dev_item, generation, 64);
++
++BTRFS_SETGET_STACK_FUNCS(stack_device_type, struct btrfs_dev_item, type, 64);
++BTRFS_SETGET_STACK_FUNCS(stack_device_total_bytes, struct btrfs_dev_item,
++                        total_bytes, 64);
++BTRFS_SETGET_STACK_FUNCS(stack_device_bytes_used, struct btrfs_dev_item,
++                        bytes_used, 64);
++BTRFS_SETGET_STACK_FUNCS(stack_device_io_align, struct btrfs_dev_item,
++                        io_align, 32);
++BTRFS_SETGET_STACK_FUNCS(stack_device_io_width, struct btrfs_dev_item,
++                        io_width, 32);
++BTRFS_SETGET_STACK_FUNCS(stack_device_sector_size, struct btrfs_dev_item,
++                        sector_size, 32);
++BTRFS_SETGET_STACK_FUNCS(stack_device_id, struct btrfs_dev_item, devid, 64);
++BTRFS_SETGET_STACK_FUNCS(stack_device_group, struct btrfs_dev_item,
++                        dev_group, 32);
++BTRFS_SETGET_STACK_FUNCS(stack_device_seek_speed, struct btrfs_dev_item,
++                        seek_speed, 8);
++BTRFS_SETGET_STACK_FUNCS(stack_device_bandwidth, struct btrfs_dev_item,
++                        bandwidth, 8);
++BTRFS_SETGET_STACK_FUNCS(stack_device_generation, struct btrfs_dev_item,
++                        generation, 64);
++
++static inline char *btrfs_device_uuid(struct btrfs_dev_item *d)
++{
++       return (char *)d + offsetof(struct btrfs_dev_item, uuid);
++}
++
++static inline char *btrfs_device_fsid(struct btrfs_dev_item *d)
++{
++       return (char *)d + offsetof(struct btrfs_dev_item, fsid);
++}
++
++BTRFS_SETGET_FUNCS(chunk_length, struct btrfs_chunk, length, 64);
++BTRFS_SETGET_FUNCS(chunk_owner, struct btrfs_chunk, owner, 64);
++BTRFS_SETGET_FUNCS(chunk_stripe_len, struct btrfs_chunk, stripe_len, 64);
++BTRFS_SETGET_FUNCS(chunk_io_align, struct btrfs_chunk, io_align, 32);
++BTRFS_SETGET_FUNCS(chunk_io_width, struct btrfs_chunk, io_width, 32);
++BTRFS_SETGET_FUNCS(chunk_sector_size, struct btrfs_chunk, sector_size, 32);
++BTRFS_SETGET_FUNCS(chunk_type, struct btrfs_chunk, type, 64);
++BTRFS_SETGET_FUNCS(chunk_num_stripes, struct btrfs_chunk, num_stripes, 16);
++BTRFS_SETGET_FUNCS(chunk_sub_stripes, struct btrfs_chunk, sub_stripes, 16);
++BTRFS_SETGET_FUNCS(stripe_devid, struct btrfs_stripe, devid, 64);
++BTRFS_SETGET_FUNCS(stripe_offset, struct btrfs_stripe, offset, 64);
++
++static inline char *btrfs_stripe_dev_uuid(struct btrfs_stripe *s)
++{
++       return (char *)s + offsetof(struct btrfs_stripe, dev_uuid);
++}
++
++BTRFS_SETGET_STACK_FUNCS(stack_chunk_length, struct btrfs_chunk, length, 64);
++BTRFS_SETGET_STACK_FUNCS(stack_chunk_owner, struct btrfs_chunk, owner, 64);
++BTRFS_SETGET_STACK_FUNCS(stack_chunk_stripe_len, struct btrfs_chunk,
++                        stripe_len, 64);
++BTRFS_SETGET_STACK_FUNCS(stack_chunk_io_align, struct btrfs_chunk,
++                        io_align, 32);
++BTRFS_SETGET_STACK_FUNCS(stack_chunk_io_width, struct btrfs_chunk,
++                        io_width, 32);
++BTRFS_SETGET_STACK_FUNCS(stack_chunk_sector_size, struct btrfs_chunk,
++                        sector_size, 32);
++BTRFS_SETGET_STACK_FUNCS(stack_chunk_type, struct btrfs_chunk, type, 64);
++BTRFS_SETGET_STACK_FUNCS(stack_chunk_num_stripes, struct btrfs_chunk,
++                        num_stripes, 16);
++BTRFS_SETGET_STACK_FUNCS(stack_chunk_sub_stripes, struct btrfs_chunk,
++                        sub_stripes, 16);
++BTRFS_SETGET_STACK_FUNCS(stack_stripe_devid, struct btrfs_stripe, devid, 64);
++BTRFS_SETGET_STACK_FUNCS(stack_stripe_offset, struct btrfs_stripe, offset, 64);
++
++static inline struct btrfs_stripe *btrfs_stripe_nr(struct btrfs_chunk *c,
++                                                  int nr)
++{
++       unsigned long offset = (unsigned long)c;
++       offset += offsetof(struct btrfs_chunk, stripe);
++       offset += nr * sizeof(struct btrfs_stripe);
++       return (struct btrfs_stripe *)offset;
++}
++
++static inline char *btrfs_stripe_dev_uuid_nr(struct btrfs_chunk *c, int nr)
++{
++       return btrfs_stripe_dev_uuid(btrfs_stripe_nr(c, nr));
++}
++
++static inline u64 btrfs_stripe_offset_nr(struct extent_buffer *eb,
++                                        struct btrfs_chunk *c, int nr)
++{
++       return btrfs_stripe_offset(eb, btrfs_stripe_nr(c, nr));
++}
++
++static inline void btrfs_set_stripe_offset_nr(struct extent_buffer *eb,
++                                            struct btrfs_chunk *c, int nr,
++                                            u64 val)
++{
++       btrfs_set_stripe_offset(eb, btrfs_stripe_nr(c, nr), val);
++}
++
++static inline u64 btrfs_stripe_devid_nr(struct extent_buffer *eb,
++                                        struct btrfs_chunk *c, int nr)
++{
++       return btrfs_stripe_devid(eb, btrfs_stripe_nr(c, nr));
++}
++
++static inline void btrfs_set_stripe_devid_nr(struct extent_buffer *eb,
++                                            struct btrfs_chunk *c, int nr,
++                                            u64 val)
++{
++       btrfs_set_stripe_devid(eb, btrfs_stripe_nr(c, nr), val);
++}
++
++/* struct btrfs_block_group_item */
++BTRFS_SETGET_STACK_FUNCS(block_group_used, struct btrfs_block_group_item,
++                        used, 64);
++BTRFS_SETGET_FUNCS(disk_block_group_used, struct btrfs_block_group_item,
++                        used, 64);
++BTRFS_SETGET_STACK_FUNCS(block_group_chunk_objectid,
++                       struct btrfs_block_group_item, chunk_objectid, 64);
++
++BTRFS_SETGET_FUNCS(disk_block_group_chunk_objectid,
++                  struct btrfs_block_group_item, chunk_objectid, 64);
++BTRFS_SETGET_FUNCS(disk_block_group_flags,
++                  struct btrfs_block_group_item, flags, 64);
++BTRFS_SETGET_STACK_FUNCS(block_group_flags,
++                       struct btrfs_block_group_item, flags, 64);
++
++/* struct btrfs_inode_ref */
++BTRFS_SETGET_FUNCS(inode_ref_name_len, struct btrfs_inode_ref, name_len, 16);
++BTRFS_SETGET_FUNCS(inode_ref_index, struct btrfs_inode_ref, index, 64);
++
++/* struct btrfs_inode_item */
++BTRFS_SETGET_FUNCS(inode_generation, struct btrfs_inode_item, generation, 64);
++BTRFS_SETGET_FUNCS(inode_sequence, struct btrfs_inode_item, sequence, 64);
++BTRFS_SETGET_FUNCS(inode_transid, struct btrfs_inode_item, transid, 64);
++BTRFS_SETGET_FUNCS(inode_size, struct btrfs_inode_item, size, 64);
++BTRFS_SETGET_FUNCS(inode_nbytes, struct btrfs_inode_item, nbytes, 64);
++BTRFS_SETGET_FUNCS(inode_block_group, struct btrfs_inode_item, block_group, 64);
++BTRFS_SETGET_FUNCS(inode_nlink, struct btrfs_inode_item, nlink, 32);
++BTRFS_SETGET_FUNCS(inode_uid, struct btrfs_inode_item, uid, 32);
++BTRFS_SETGET_FUNCS(inode_gid, struct btrfs_inode_item, gid, 32);
++BTRFS_SETGET_FUNCS(inode_mode, struct btrfs_inode_item, mode, 32);
++BTRFS_SETGET_FUNCS(inode_rdev, struct btrfs_inode_item, rdev, 64);
++BTRFS_SETGET_FUNCS(inode_flags, struct btrfs_inode_item, flags, 64);
++
++BTRFS_SETGET_STACK_FUNCS(stack_inode_generation,
++                        struct btrfs_inode_item, generation, 64);
++BTRFS_SETGET_STACK_FUNCS(stack_inode_sequence,
++                        struct btrfs_inode_item, generation, 64);
++BTRFS_SETGET_STACK_FUNCS(stack_inode_size,
++                        struct btrfs_inode_item, size, 64);
++BTRFS_SETGET_STACK_FUNCS(stack_inode_nbytes,
++                        struct btrfs_inode_item, nbytes, 64);
++BTRFS_SETGET_STACK_FUNCS(stack_inode_block_group,
++                        struct btrfs_inode_item, block_group, 64);
++BTRFS_SETGET_STACK_FUNCS(stack_inode_nlink,
++                        struct btrfs_inode_item, nlink, 32);
++BTRFS_SETGET_STACK_FUNCS(stack_inode_uid,
++                        struct btrfs_inode_item, uid, 32);
++BTRFS_SETGET_STACK_FUNCS(stack_inode_gid,
++                        struct btrfs_inode_item, gid, 32);
++BTRFS_SETGET_STACK_FUNCS(stack_inode_mode,
++                        struct btrfs_inode_item, mode, 32);
++BTRFS_SETGET_STACK_FUNCS(stack_inode_rdev,
++                        struct btrfs_inode_item, rdev, 64);
++BTRFS_SETGET_STACK_FUNCS(stack_inode_flags,
++                        struct btrfs_inode_item, flags, 64);
++
++BTRFS_SETGET_FUNCS(timespec_sec, struct btrfs_timespec, sec, 64);
++BTRFS_SETGET_FUNCS(timespec_nsec, struct btrfs_timespec, nsec, 32);
++BTRFS_SETGET_STACK_FUNCS(stack_timespec_sec, struct btrfs_timespec,
++                        sec, 64);
++BTRFS_SETGET_STACK_FUNCS(stack_timespec_nsec, struct btrfs_timespec,
++                        nsec, 32);
++
++/* struct btrfs_dev_extent */
++BTRFS_SETGET_FUNCS(dev_extent_chunk_tree, struct btrfs_dev_extent,
++                  chunk_tree, 64);
++BTRFS_SETGET_FUNCS(dev_extent_chunk_objectid, struct btrfs_dev_extent,
++                  chunk_objectid, 64);
++BTRFS_SETGET_FUNCS(dev_extent_chunk_offset, struct btrfs_dev_extent,
++                  chunk_offset, 64);
++BTRFS_SETGET_FUNCS(dev_extent_length, struct btrfs_dev_extent, length, 64);
++
++static inline u8 *btrfs_dev_extent_chunk_tree_uuid(struct btrfs_dev_extent *dev)
++{
++       unsigned long ptr = offsetof(struct btrfs_dev_extent, chunk_tree_uuid);
++       return (u8 *)((unsigned long)dev + ptr);
++}
++
++/* struct btrfs_extent_ref */
++BTRFS_SETGET_FUNCS(ref_root, struct btrfs_extent_ref, root, 64);
++BTRFS_SETGET_FUNCS(ref_generation, struct btrfs_extent_ref, generation, 64);
++BTRFS_SETGET_FUNCS(ref_objectid, struct btrfs_extent_ref, objectid, 64);
++BTRFS_SETGET_FUNCS(ref_num_refs, struct btrfs_extent_ref, num_refs, 32);
++
++BTRFS_SETGET_STACK_FUNCS(stack_ref_root, struct btrfs_extent_ref, root, 64);
++BTRFS_SETGET_STACK_FUNCS(stack_ref_generation, struct btrfs_extent_ref,
++                        generation, 64);
++BTRFS_SETGET_STACK_FUNCS(stack_ref_objectid, struct btrfs_extent_ref,
++                        objectid, 64);
++BTRFS_SETGET_STACK_FUNCS(stack_ref_num_refs, struct btrfs_extent_ref,
++                        num_refs, 32);
++
++/* struct btrfs_extent_item */
++BTRFS_SETGET_FUNCS(extent_refs, struct btrfs_extent_item, refs, 32);
++BTRFS_SETGET_STACK_FUNCS(stack_extent_refs, struct btrfs_extent_item,
++                        refs, 32);
++
++/* struct btrfs_node */
++BTRFS_SETGET_FUNCS(key_blockptr, struct btrfs_key_ptr, blockptr, 64);
++BTRFS_SETGET_FUNCS(key_generation, struct btrfs_key_ptr, generation, 64);
++
++static inline u64 btrfs_node_blockptr(struct extent_buffer *eb, int nr)
++{
++       unsigned long ptr;
++       ptr = offsetof(struct btrfs_node, ptrs) +
++               sizeof(struct btrfs_key_ptr) * nr;
++       return btrfs_key_blockptr(eb, (struct btrfs_key_ptr *)ptr);
++}
++
++static inline void btrfs_set_node_blockptr(struct extent_buffer *eb,
++                                          int nr, u64 val)
++{
++       unsigned long ptr;
++       ptr = offsetof(struct btrfs_node, ptrs) +
++               sizeof(struct btrfs_key_ptr) * nr;
++       btrfs_set_key_blockptr(eb, (struct btrfs_key_ptr *)ptr, val);
++}
++
++static inline u64 btrfs_node_ptr_generation(struct extent_buffer *eb, int nr)
++{
++       unsigned long ptr;
++       ptr = offsetof(struct btrfs_node, ptrs) +
++               sizeof(struct btrfs_key_ptr) * nr;
++       return btrfs_key_generation(eb, (struct btrfs_key_ptr *)ptr);
++}
++
++static inline void btrfs_set_node_ptr_generation(struct extent_buffer *eb,
++                                                int nr, u64 val)
++{
++       unsigned long ptr;
++       ptr = offsetof(struct btrfs_node, ptrs) +
++               sizeof(struct btrfs_key_ptr) * nr;
++       btrfs_set_key_generation(eb, (struct btrfs_key_ptr *)ptr, val);
++}
++
++static inline unsigned long btrfs_node_key_ptr_offset(int nr)
++{
++       return offsetof(struct btrfs_node, ptrs) +
++               sizeof(struct btrfs_key_ptr) * nr;
++}
++
++static inline void btrfs_node_key(struct extent_buffer *eb,
++                                 struct btrfs_disk_key *disk_key, int nr)
++{
++       unsigned long ptr;
++       ptr = btrfs_node_key_ptr_offset(nr);
++       read_eb_member(eb, (struct btrfs_key_ptr *)ptr,
++                      struct btrfs_key_ptr, key, disk_key);
++}
++
++/* struct btrfs_item */
++BTRFS_SETGET_FUNCS(item_offset, struct btrfs_item, offset, 32);
++BTRFS_SETGET_FUNCS(item_size, struct btrfs_item, size, 32);
++
++static inline unsigned long btrfs_item_nr_offset(int nr)
++{
++       return offsetof(struct btrfs_leaf, items) +
++               sizeof(struct btrfs_item) * nr;
++}
++
++static inline struct btrfs_item *btrfs_item_nr(struct extent_buffer *eb,
++                                              int nr)
++{
++       return (struct btrfs_item *)btrfs_item_nr_offset(nr);
++}
++
++static inline u32 btrfs_item_end(struct extent_buffer *eb,
++                                struct btrfs_item *item)
++{
++       return btrfs_item_offset(eb, item) + btrfs_item_size(eb, item);
++}
++
++static inline u32 btrfs_item_end_nr(struct extent_buffer *eb, int nr)
++{
++       return btrfs_item_end(eb, btrfs_item_nr(eb, nr));
++}
++
++static inline u32 btrfs_item_offset_nr(struct extent_buffer *eb, int nr)
++{
++       return btrfs_item_offset(eb, btrfs_item_nr(eb, nr));
++}
++
++static inline u32 btrfs_item_size_nr(struct extent_buffer *eb, int nr)
++{
++       return btrfs_item_size(eb, btrfs_item_nr(eb, nr));
++}
++
++static inline void btrfs_item_key(struct extent_buffer *eb,
++                          struct btrfs_disk_key *disk_key, int nr)
++{
++       struct btrfs_item *item = btrfs_item_nr(eb, nr);
++       read_eb_member(eb, item, struct btrfs_item, key, disk_key);
++}
++
++/*
++ * struct btrfs_root_ref
++ */
++BTRFS_SETGET_FUNCS(root_ref_dirid, struct btrfs_root_ref, dirid, 64);
++BTRFS_SETGET_FUNCS(root_ref_sequence, struct btrfs_root_ref, sequence, 64);
++BTRFS_SETGET_FUNCS(root_ref_name_len, struct btrfs_root_ref, name_len, 16);
++
++/* struct btrfs_dir_item */
++BTRFS_SETGET_FUNCS(dir_data_len, struct btrfs_dir_item, data_len, 16);
++BTRFS_SETGET_FUNCS(dir_type, struct btrfs_dir_item, type, 8);
++BTRFS_SETGET_FUNCS(dir_name_len, struct btrfs_dir_item, name_len, 16);
++BTRFS_SETGET_FUNCS(dir_transid, struct btrfs_dir_item, transid, 64);
++
++static inline void btrfs_dir_item_key(struct extent_buffer *eb,
++                                     struct btrfs_dir_item *item,
++                                     struct btrfs_disk_key *key)
++{
++       read_eb_member(eb, item, struct btrfs_dir_item, location, key);
++}
++
++/* struct btrfs_disk_key */
++BTRFS_SETGET_STACK_FUNCS(disk_key_objectid, struct btrfs_disk_key,
++                        objectid, 64);
++BTRFS_SETGET_STACK_FUNCS(disk_key_offset, struct btrfs_disk_key, offset, 64);
++BTRFS_SETGET_STACK_FUNCS(disk_key_type, struct btrfs_disk_key, type, 8);
++
++static inline void btrfs_disk_key_to_cpu(struct btrfs_key *cpu,
++                                        struct btrfs_disk_key *disk)
++{
++       cpu->offset = le64_to_cpu(disk->offset);
++       cpu->type = disk->type;
++       cpu->objectid = le64_to_cpu(disk->objectid);
++}
++
++static inline void btrfs_cpu_key_to_disk(struct btrfs_disk_key *disk,
++                                        struct btrfs_key *cpu)
++{
++       disk->offset = cpu_to_le64(cpu->offset);
++       disk->type = cpu->type;
++       disk->objectid = cpu_to_le64(cpu->objectid);
++}
++
++static inline void btrfs_node_key_to_cpu(struct extent_buffer *eb,
++                                 struct btrfs_key *key, int nr)
++{
++       struct btrfs_disk_key disk_key;
++       btrfs_node_key(eb, &disk_key, nr);
++       btrfs_disk_key_to_cpu(key, &disk_key);
++}
++
++static inline void btrfs_item_key_to_cpu(struct extent_buffer *eb,
++                                 struct btrfs_key *key, int nr)
++{
++       struct btrfs_disk_key disk_key;
++       btrfs_item_key(eb, &disk_key, nr);
++       btrfs_disk_key_to_cpu(key, &disk_key);
++}
++
++static inline void btrfs_dir_item_key_to_cpu(struct extent_buffer *eb,
++                                     struct btrfs_dir_item *item,
++                                     struct btrfs_key *key)
++{
++       struct btrfs_disk_key disk_key;
++       btrfs_dir_item_key(eb, item, &disk_key);
++       btrfs_disk_key_to_cpu(key, &disk_key);
++}
++
++static inline u8 btrfs_key_type(struct btrfs_key *key)
++{
++       return key->type;
++}
++
++static inline void btrfs_set_key_type(struct btrfs_key *key, u8 val)
++{
++       key->type = val;
++}
++
++static inline u64 btrfs_super_devid(struct btrfs_super_block *disk_super)
++{
++	return le64_to_cpu(disk_super->dev_item.devid);
++}
++
++/* struct btrfs_header */
++BTRFS_SETGET_HEADER_FUNCS(header_bytenr, struct btrfs_header, bytenr, 64);
++BTRFS_SETGET_HEADER_FUNCS(header_generation, struct btrfs_header,
++                         generation, 64);
++BTRFS_SETGET_HEADER_FUNCS(header_owner, struct btrfs_header, owner, 64);
++BTRFS_SETGET_HEADER_FUNCS(header_nritems, struct btrfs_header, nritems, 32);
++BTRFS_SETGET_HEADER_FUNCS(header_flags, struct btrfs_header, flags, 64);
++BTRFS_SETGET_HEADER_FUNCS(header_level, struct btrfs_header, level, 8);
++
++/* struct btrfs_root_item */
++BTRFS_SETGET_FUNCS(disk_root_generation, struct btrfs_root_item,
++                  generation, 64);
++BTRFS_SETGET_FUNCS(disk_root_refs, struct btrfs_root_item, refs, 32);
++BTRFS_SETGET_FUNCS(disk_root_bytenr, struct btrfs_root_item, bytenr, 64);
++BTRFS_SETGET_FUNCS(disk_root_level, struct btrfs_root_item, level, 8);
++
++BTRFS_SETGET_STACK_FUNCS(root_generation, struct btrfs_root_item,
++                        generation, 64);
++BTRFS_SETGET_STACK_FUNCS(root_bytenr, struct btrfs_root_item, bytenr, 64);
++BTRFS_SETGET_STACK_FUNCS(root_level, struct btrfs_root_item, level, 8);
++BTRFS_SETGET_STACK_FUNCS(root_dirid, struct btrfs_root_item, root_dirid, 64);
++BTRFS_SETGET_STACK_FUNCS(root_refs, struct btrfs_root_item, refs, 32);
++BTRFS_SETGET_STACK_FUNCS(root_flags, struct btrfs_root_item, flags, 64);
++BTRFS_SETGET_STACK_FUNCS(root_used, struct btrfs_root_item, bytes_used, 64);
++BTRFS_SETGET_STACK_FUNCS(root_limit, struct btrfs_root_item, byte_limit, 64);
++BTRFS_SETGET_STACK_FUNCS(root_last_snapshot, struct btrfs_root_item,
++                        last_snapshot, 64);
++
++/* struct btrfs_super_block */
++
++BTRFS_SETGET_STACK_FUNCS(super_bytenr, struct btrfs_super_block, bytenr, 64);
++BTRFS_SETGET_STACK_FUNCS(super_flags, struct btrfs_super_block, flags, 64);
++BTRFS_SETGET_STACK_FUNCS(super_generation, struct btrfs_super_block,
++                        generation, 64);
++BTRFS_SETGET_STACK_FUNCS(super_root, struct btrfs_super_block, root, 64);
++BTRFS_SETGET_STACK_FUNCS(super_sys_array_size,
++                        struct btrfs_super_block, sys_chunk_array_size, 32);
++BTRFS_SETGET_STACK_FUNCS(super_chunk_root_generation,
++                        struct btrfs_super_block, chunk_root_generation, 64);
++BTRFS_SETGET_STACK_FUNCS(super_root_level, struct btrfs_super_block,
++                        root_level, 8);
++BTRFS_SETGET_STACK_FUNCS(super_chunk_root, struct btrfs_super_block,
++                        chunk_root, 64);
++BTRFS_SETGET_STACK_FUNCS(super_chunk_root_level, struct btrfs_super_block,
++                        chunk_root_level, 8);
++BTRFS_SETGET_STACK_FUNCS(super_log_root, struct btrfs_super_block,
++                        log_root, 64);
++BTRFS_SETGET_STACK_FUNCS(super_log_root_transid, struct btrfs_super_block,
++                        log_root_transid, 64);
++BTRFS_SETGET_STACK_FUNCS(super_log_root_level, struct btrfs_super_block,
++                        log_root_level, 8);
++BTRFS_SETGET_STACK_FUNCS(super_total_bytes, struct btrfs_super_block,
++                        total_bytes, 64);
++BTRFS_SETGET_STACK_FUNCS(super_bytes_used, struct btrfs_super_block,
++                        bytes_used, 64);
++BTRFS_SETGET_STACK_FUNCS(super_sectorsize, struct btrfs_super_block,
++                        sectorsize, 32);
++BTRFS_SETGET_STACK_FUNCS(super_nodesize, struct btrfs_super_block,
++                        nodesize, 32);
++BTRFS_SETGET_STACK_FUNCS(super_leafsize, struct btrfs_super_block,
++                        leafsize, 32);
++BTRFS_SETGET_STACK_FUNCS(super_stripesize, struct btrfs_super_block,
++                        stripesize, 32);
++BTRFS_SETGET_STACK_FUNCS(super_root_dir, struct btrfs_super_block,
++                        root_dir_objectid, 64);
++BTRFS_SETGET_STACK_FUNCS(super_num_devices, struct btrfs_super_block,
++                        num_devices, 64);
++BTRFS_SETGET_STACK_FUNCS(super_compat_flags, struct btrfs_super_block,
++                        compat_flags, 64);
++BTRFS_SETGET_STACK_FUNCS(super_compat_ro_flags, struct btrfs_super_block,
++                        compat_flags, 64);
++BTRFS_SETGET_STACK_FUNCS(super_incompat_flags, struct btrfs_super_block,
++                        incompat_flags, 64);
++BTRFS_SETGET_STACK_FUNCS(super_csum_type, struct btrfs_super_block,
++                        csum_type, 16);
++
++static inline int btrfs_super_csum_size(struct btrfs_super_block *s)
++{
++       int t = btrfs_super_csum_type(s);
++       //BUG_ON(t >= ARRAY_SIZE(btrfs_csum_sizes));
++       return btrfs_csum_sizes[t];
++}
++
++static inline unsigned long btrfs_leaf_data(struct extent_buffer *l)
++{
++       return offsetof(struct btrfs_leaf, items);
++}
++
++/* struct btrfs_file_extent_item */
++BTRFS_SETGET_FUNCS(file_extent_type, struct btrfs_file_extent_item, type, 8);
++
++static inline unsigned long btrfs_file_extent_inline_start(struct
++                                                  btrfs_file_extent_item *e)
++{
++       unsigned long offset = (unsigned long)e;
++       offset += offsetof(struct btrfs_file_extent_item, disk_bytenr);
++       return offset;
++}
++
++static inline u32 btrfs_file_extent_calc_inline_size(u32 datasize)
++{
++       return offsetof(struct btrfs_file_extent_item, disk_bytenr) + datasize;
++}
++
++BTRFS_SETGET_FUNCS(file_extent_disk_bytenr, struct btrfs_file_extent_item,
++                  disk_bytenr, 64);
++BTRFS_SETGET_FUNCS(file_extent_generation, struct btrfs_file_extent_item,
++                  generation, 64);
++BTRFS_SETGET_FUNCS(file_extent_disk_num_bytes, struct btrfs_file_extent_item,
++                  disk_num_bytes, 64);
++BTRFS_SETGET_FUNCS(file_extent_offset, struct btrfs_file_extent_item,
++                 offset, 64);
++BTRFS_SETGET_FUNCS(file_extent_num_bytes, struct btrfs_file_extent_item,
++                  num_bytes, 64);
++BTRFS_SETGET_FUNCS(file_extent_ram_bytes, struct btrfs_file_extent_item,
++                  ram_bytes, 64);
++BTRFS_SETGET_FUNCS(file_extent_compression, struct btrfs_file_extent_item,
++                  compression, 8);
++BTRFS_SETGET_FUNCS(file_extent_encryption, struct btrfs_file_extent_item,
++                  encryption, 8);
++BTRFS_SETGET_FUNCS(file_extent_other_encoding, struct btrfs_file_extent_item,
++                  other_encoding, 16);
++
++/* this returns the number of file bytes represented by the inline item.
++ * If an item is compressed, this is the uncompressed size
++ */
++static inline u32 btrfs_file_extent_inline_len(struct extent_buffer *eb,
++                                       struct btrfs_file_extent_item *e)
++{
++       return btrfs_file_extent_ram_bytes(eb, e);
++}
++
++/*
++ * this returns the number of bytes used by the item on disk, minus the
++ * size of any extent headers.  If a file is compressed on disk, this is
++ * the compressed size
++ */
++static inline u32 btrfs_file_extent_inline_item_len(struct extent_buffer *eb,
++                                                   struct btrfs_item *e)
++{
++       unsigned long offset;
++       offset = offsetof(struct btrfs_file_extent_item, disk_bytenr);
++       return btrfs_item_size(eb, e) - offset;
++}
++
++static inline u32 btrfs_level_size(struct btrfs_root *root, int level) {
++       if (level == 0)
++               return root->leafsize;
++       return root->nodesize;
++}
++
++static inline u32 btrfs_root_level_size(struct btrfs_super_block *sb) {
++       return btrfs_super_root_level(sb) == 0 ?
++               btrfs_super_leafsize(sb) :
++               btrfs_super_nodesize(sb);
++}
++
++static inline u32 btrfs_chunk_root_level_size(struct btrfs_super_block *sb) {
++       return btrfs_super_chunk_root_level(sb) == 0 ?
++               btrfs_super_leafsize(sb) :
++               btrfs_super_nodesize(sb);
++}
++
++/* helper function to cast into the data area of the leaf. */
++#define btrfs_item_ptr(leaf, slot, type) \
++       ((type *)(btrfs_leaf_data(leaf) + \
++       btrfs_item_offset_nr(leaf, slot)))
++
++#define btrfs_item_ptr_offset(leaf, slot) \
++       ((unsigned long)(btrfs_leaf_data(leaf) + \
++       btrfs_item_offset_nr(leaf, slot)))
++
++/*volumes.h */
++
++struct btrfs_fs_devices {
++       u8 fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */
++
++       /* the device with this id has the most recent coyp of the super */
++       u64 latest_devid;
++       u64 latest_trans;
++       u64 lowest_devid;
++       int latest_bdev;
++       int lowest_bdev;
++       int seeding;
++       struct btrfs_fs_devices *seed;
++};
++
++struct btrfs_bio_stripe {
++	struct btrfs_device dev;
++	u64 physical;
++};
++
++#define MAX_NRSTRIPES 8
++struct btrfs_multi_bio {
++       int error;
++       int num_stripes;
++       struct btrfs_bio_stripe stripes[MAX_NRSTRIPES];
++};
++
++#define btrfs_multi_bio_size(n) (sizeof(struct btrfs_multi_bio) + \
++                           (sizeof(struct btrfs_bio_stripe) * (n)))
++
++static int aux_tree_lookup(struct btrfs_root *root,
++                          struct btrfs_key *key,
++                          struct btrfs_path *path);
++
++struct cache_extent {
++       u64 start;
++       u64 size;
++};
++
++struct map_lookup {
++       struct cache_extent ce;
++       u64 type;
++       int io_align;
++       int io_width;
++       int stripe_len;
++       int sector_size;
++       int num_stripes;
++       int sub_stripes;
++        struct btrfs_bio_stripe stripes[MAX_NRSTRIPES];
++};
++
++/* "VFS" things */
++
++/* file types recognized by grub */
++typedef enum {
++       BTRFS_REGULAR_FILE,
++       BTRFS_DIRECTORY_FILE,
++       BTRFS_SYMLINK_FILE,
++       BTRFS_UNKNOWN_FILE
++} btrfs_file_type;
++
++static inline int coord_is_root(struct btrfs_root *root,
++                               struct btrfs_path *path)
++{
++       return btrfs_header_bytenr(&path->nodes[0]) ==
++               btrfs_header_bytenr(&root->node);
++}
++
++static inline btrfs_file_type btrfs_get_file_type (int mode)
++{
++       if (S_ISLNK(mode))
++               return BTRFS_SYMLINK_FILE;
++       if (S_ISREG(mode))
++               return BTRFS_REGULAR_FILE;
++       if (S_ISDIR(mode))
++               return BTRFS_DIRECTORY_FILE;
++       return BTRFS_UNKNOWN_FILE;
++}
++
++#define min_t(type,x,y)                                                       \
++       ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })
++#define max_t(type,x,y)                                                       \
++       ({ type __x = (x); type __y = (y); __x > __y ? __x: __y; })
++
++
++int sys_array_lookup(struct map_lookup *map, u64 logical);
++int tree_chunk_lookup(struct map_lookup *map,
++                     u64 logical);
++int __btrfs_map_block(u64 logical, u64 *length,
++                     struct btrfs_multi_bio *multi_ret, int mirror_num);
++int read_tree_block(struct btrfs_root *root,
++                   struct extent_buffer *eb,
++                   u64 bytenr, /* logical */
++                   u32 blocksize,
++                   u64 parent_transid,
++                   lookup_pool_id lpid);
++int check_read_chunk(struct btrfs_key *key,
++                    struct extent_buffer *leaf,
++                    struct btrfs_chunk *chunk,
++                    struct map_lookup *map,
++                    u64 logical);
++/*
++  Local variables:
++  c-indentation-style: "K&R"
++  mode-name: "LC"
++  c-basic-offset: 8
++  tab-width: 8
++  fill-column: 80
++  scroll-step: 1
++  End:
++*/
+\ No newline at end of file
+diff -up grub-upstream.wip/stage2/builtins.c.btrfs grub-upstream.wip/stage2/builtins.c
+--- grub-upstream.wip/stage2/builtins.c.btrfs	2012-03-20 05:06:49.000000000 +0000
++++ grub-upstream.wip/stage2/builtins.c	2012-03-20 05:11:13.000000000 +0000
+@@ -2456,6 +2456,16 @@ install_func (char *arg, int flags)
+ 	  else
+ #endif /* GRUB_UTIL */
+ 	    {
++ 	      /*
++	       * FIXME: Ugly hack.
++	       * Do not write to btrfs partition
++	       * without a help of the file system!
++	       */
++ 	      if (!strcmp(fsys_table[fsys_type].name, "btrfs"))
++ 		{
++ 		  errnum = ERR_BAD_ARGUMENT;
++ 		  goto fail;
++ 		}
+ 	      if (! devwrite (saved_sector - part_start, 1, stage2_buffer))
+ 		goto fail;
+ 	    }
+@@ -4281,6 +4291,7 @@ setup_func (char *arg, int flags)
+     {"jfs",      "/jfs_stage1_5"},
+     {"minix",    "/minix_stage1_5"},
+     {"reiserfs", "/reiserfs_stage1_5"},
++    {"btrfs",    "/btrfs_stage1_5"},
+     {"vstafs",   "/vstafs_stage1_5"},
+     {"xfs",      "/xfs_stage1_5"}
+   };
+diff -up grub-upstream.wip/stage2/disk_io.c.btrfs grub-upstream.wip/stage2/disk_io.c
+--- grub-upstream.wip/stage2/disk_io.c.btrfs	2012-03-20 05:06:49.000000000 +0000
++++ grub-upstream.wip/stage2/disk_io.c	2012-03-20 05:07:09.000000000 +0000
+@@ -78,6 +78,9 @@ struct fsys_entry fsys_table[NUM_FSYS + 
+ # ifdef FSYS_ISO9660
+   {"iso9660", iso9660_mount, iso9660_read, iso9660_dir, 0, 0},
+ # endif
++# ifdef FSYS_BTRFS
++  {"btrfs", btrfs_mount, btrfs_read, btrfs_dir, 0, btrfs_embed},
++# endif
+   /* XX FFS should come last as it's superblock is commonly crossing tracks
+      on floppies from track 1 to 2, while others only use 1.  */
+ # ifdef FSYS_FFS
+diff -up grub-upstream.wip/stage2/filesys.h.btrfs grub-upstream.wip/stage2/filesys.h
+--- grub-upstream.wip/stage2/filesys.h.btrfs	2004-05-14 19:36:43.000000000 +0000
++++ grub-upstream.wip/stage2/filesys.h	2012-03-20 05:07:09.000000000 +0000
+@@ -77,6 +77,16 @@ int reiserfs_embed (int *start_sector, i
+ #define FSYS_REISERFS_NUM 0
+ #endif
+ 
++#ifdef FSYS_BTRFS
++#define FSYS_BTRFS_NUM 1
++int btrfs_mount (void);
++int btrfs_read (char *buf, int len);
++int btrfs_dir (char *dirname);
++int btrfs_embed (int *start_sector, int needed_sectors);
++#else
++#define FSYS_BTRFS_NUM 0
++#endif
++
+ #ifdef FSYS_VSTAFS
+ #define FSYS_VSTAFS_NUM 1
+ int vstafs_mount (void);
+@@ -127,8 +137,8 @@ int iso9660_dir (char *dirname);
+ #ifndef NUM_FSYS
+ #define NUM_FSYS	\
+   (FSYS_FFS_NUM + FSYS_FAT_NUM + FSYS_EXT2FS_NUM + FSYS_MINIX_NUM	\
+-   + FSYS_REISERFS_NUM + FSYS_VSTAFS_NUM + FSYS_JFS_NUM + FSYS_XFS_NUM	\
+-   + FSYS_TFTP_NUM + FSYS_ISO9660_NUM + FSYS_UFS2_NUM)
++   + FSYS_REISERFS_NUM + FSYS_BTRFS_NUM + FSYS_VSTAFS_NUM + FSYS_JFS_NUM \
++   + FSYS_XFS_NUM + FSYS_TFTP_NUM + FSYS_ISO9660_NUM + FSYS_UFS2_NUM)
+ #endif
+ 
+ /* defines for the block filesystem info area */
+diff -up /dev/null grub-upstream.wip/stage2/fsys_btrfs.c
+--- /dev/null	2009-06-03 06:46:26.160951000 +0000
++++ grub-upstream.wip/stage2/fsys_btrfs.c	2012-03-20 05:07:09.000000000 +0000
+@@ -0,0 +1,1820 @@
++/* fsys_btrfs.c - an implementation for the Btrfs filesystem
++ *
++ * Copyright 2009 Red Hat, Inc.  All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
++ */
++
++#ifdef FSYS_BTRFS
++
++#include "shared.h"
++#include "filesys.h"
++#include "btrfs.h"
++
++#define BTRFS_VERBOSE 0
++
++/* Cache layouts */
++
++#define LOOKUP_CACHE_BUF_SIZE   (4096)
++#define LOOKUP_CACHE_SIZE       (LOOKUP_CACHE_BUF_SIZE * LAST_LOOKUP_POOL)
++#define BTRFS_FS_INFO							\
++	((struct btrfs_fs_info *)((unsigned long)FSYS_BUF +		\
++				  LOOKUP_CACHE_SIZE))
++#define BTRFS_CACHE_SIZE         (sizeof(struct btrfs_fs_info) +	\
++				  LOOKUP_CACHE_SIZE)
++#define BTRFS_TREE_ROOT          (&BTRFS_FS_INFO->tree_root)
++#define BTRFS_CHUNK_ROOT         (&BTRFS_FS_INFO->chunk_root)
++#define BTRFS_FS_ROOT            (&BTRFS_FS_INFO->fs_root)
++#define BTRFS_SUPER              (&BTRFS_FS_INFO->sb_copy)
++#define BTRFS_DEVICES            (&BTRFS_FS_INFO->devices[0])
++#define BTRFS_FILE_INFO          (&BTRFS_FS_INFO->file_info)
++#define BTRFS_FILE_INFO_KEY      (&BTRFS_FILE_INFO->key)
++
++#define BTRFS_VOLATILE_DEV_CACHE				        \
++	(&BTRFS_FS_INFO->devices[BTRFS_NUM_CACHED_DEVICES])
++
++#define LOOKUP_CACHE_BUF(id) ((char *)((unsigned long)FSYS_BUF +	\
++				       id * LOOKUP_CACHE_BUF_SIZE))
++
++#define noop   do {; } while (0)
++
++#if BTRFS_VERBOSE
++#define btrfs_msg(format, ...) printf(format , ## __VA_ARGS__)
++#else
++#define btrfs_msg(format, args...) noop
++#endif
++
++/* compile-time check to make sure we don't overlap
++   filesystem buffer */
++static inline void check_btrfs_cache_size(void)
++{
++	cassert(BTRFS_CACHE_SIZE <= FSYS_BUFLEN);
++}
++
++static inline u64 btrfs_sb_offset(int mirror)
++{
++	u64 start = 16 * 1024;
++	if (mirror)
++		return start << (BTRFS_SUPER_MIRROR_SHIFT * mirror);
++	return BTRFS_SUPER_INFO_OFFSET;
++}
++
++static inline char *grab_lookup_cache(lookup_pool_id lpid)
++{
++	char *buf = LOOKUP_CACHE_BUF(lpid);
++	memset(buf, 0, LOOKUP_CACHE_BUF_SIZE);
++	return buf;
++}
++
++static inline struct btrfs_path *btrfs_grab_path(lookup_pool_id lpid)
++{
++	return &BTRFS_FS_INFO->paths[lpid];
++}
++
++static inline void btrfs_set_path_key(struct btrfs_path *path,
++				      struct btrfs_key *key)
++{
++	btrfs_item_key_to_cpu(&path->nodes[0],
++			      key,
++			      path->slots[0]);
++}
++
++static inline void btrfs_update_file_info(struct btrfs_path *path)
++{
++	btrfs_set_path_key(path, BTRFS_FILE_INFO_KEY);
++}
++
++static inline void btrfs_set_root_dir_key(struct btrfs_key *key)
++{
++	key->objectid = BTRFS_FIRST_FREE_OBJECTID;
++	btrfs_set_key_type(key, BTRFS_INODE_ITEM_KEY);
++	key->offset = 0;
++}
++
++static inline void copy_extent_buffer(struct extent_buffer *dst,
++				      struct extent_buffer *src)
++{
++	char *data = dst->data;
++	memcpy(dst, src, sizeof(*dst));
++	memcpy(data, src->data, 4096);
++	dst->data = data;
++}
++
++static inline void move_extent_buffer(struct extent_buffer *dst,
++				      struct extent_buffer *src)
++{
++	memcpy(dst, src, sizeof(*dst));
++}
++
++static inline void init_btrfs_root (struct btrfs_root *root)
++{
++	root->node.data = root->data;
++}
++
++static inline void init_btrfs_path(lookup_pool_id lpid)
++{
++	struct btrfs_path *path;
++	path = btrfs_grab_path(lpid);
++	path->lpid = lpid;
++}
++
++static inline void init_btrfs_info(void)
++{
++	int i;
++	
++	memset(BTRFS_FS_INFO, 0, sizeof(struct btrfs_fs_info));
++	for(i = 0; i < LAST_LOOKUP_POOL; i++)
++		init_btrfs_path(i);
++	init_btrfs_root(BTRFS_TREE_ROOT);
++	init_btrfs_root(BTRFS_CHUNK_ROOT);
++	init_btrfs_root(BTRFS_FS_ROOT);
++}
++
++static void setup_root(struct btrfs_root *root,
++		       u32 nodesize,
++		       u32 leafsize,
++		       u32 sectorsize,
++		       u32 stripesize,
++		       u64 objectid)
++{
++	root->nodesize = nodesize;
++	root->leafsize = leafsize;
++	root->sectorsize = sectorsize;
++	root->stripesize = stripesize;
++	root->objectid = objectid;
++}
++
++/*
++ * Pick up the latest root of a
++ * tree with specified @objectid
++ */
++static int btrfs_find_last_root(struct btrfs_root *tree_root,
++				u64 objectid,
++				struct btrfs_root_item *item,
++				lookup_pool_id lpid)
++{
++	int ret;
++	int slot;
++	struct btrfs_key search_key;
++	struct btrfs_key found_key;
++	struct btrfs_path *path;
++
++	search_key.objectid = objectid;
++	search_key.type = BTRFS_ROOT_ITEM_KEY;
++	search_key.offset = (u64)-1;
++	path = btrfs_grab_path(lpid);
++
++	ret = aux_tree_lookup(tree_root, &search_key, path);
++	if (ret < 0)
++		return 1;
++	slot = path->slots[0];
++	WARN_ON(slot == 0);
++	slot -= 1;
++	btrfs_item_key_to_cpu(&path->nodes[0], &found_key, slot);
++	if (found_key.objectid != objectid)
++		return 1;
++	
++	read_extent_buffer(&path->nodes[0], item,
++			   btrfs_item_ptr_offset(&path->nodes[0], slot),
++			   sizeof(*item));
++	return 0;
++}
++
++static int find_setup_root(struct btrfs_root *tree_root,
++			   u32 nodesize,
++			   u32 leafsize,
++			   u32 sectorsize,
++			   u32 stripesize,
++			   u64 objectid,
++			   struct btrfs_root *dest_root,
++			   u64 bytenr,
++			   u32 blocksize,
++			   u64 generation,
++			   lookup_pool_id lpid)
++{
++	int ret;
++	struct extent_buffer eb;
++
++	setup_root(dest_root,
++		   nodesize,
++		   leafsize,
++		   sectorsize,
++		   stripesize,
++		   objectid);
++	if (tree_root) {
++		/*
++		 * pick up the latest version
++		 * of the root we want to set up
++		 */
++		ret = btrfs_find_last_root(tree_root, objectid,
++					   &dest_root->root_item,
++					   lpid);
++		if (ret)
++			return ret;
++		bytenr = btrfs_root_bytenr(&dest_root->root_item);
++		blocksize = btrfs_level_size(dest_root,
++				       btrfs_root_level(&dest_root->root_item));
++		generation = btrfs_root_generation(&dest_root->root_item);
++	}
++	ret = read_tree_block(dest_root,
++			      &eb,
++			      bytenr,
++			      blocksize,
++			      generation,
++			      lpid);
++	if (!ret)
++		return 1;
++	copy_extent_buffer(&dest_root->node, &eb);
++	return 0;
++}
++
++static inline int btrfs_strncmp(const char *cs, const char *ct, int count)
++{
++	signed char __res = 0;
++
++	while (count) {
++		if ((__res = *cs - *ct++) != 0 || !*cs++)
++			break;
++		count--;
++	}
++	return __res;
++}
++
++/*
++ * the same as devread, but accepts
++ * device number, start and length.
++ */
++static int btrfs_devread(unsigned long drive, unsigned long part,
++			 unsigned long dev_len, int sector,
++			 int byte_offset, int byte_len, char *buf)
++{
++	if (sector < 0
++	    || ((sector + ((byte_offset + byte_len - 1) >> SECTOR_BITS))
++		>= dev_len)) {
++		errnum = ERR_OUTSIDE_PART;
++		return 0;
++	}
++	sector += byte_offset >> SECTOR_BITS;
++	byte_offset &= SECTOR_SIZE - 1;
++#if !defined(STAGE1_5)
++	if (disk_read_hook && debug)
++		printf ("<%d, %d, %d>", sector, byte_offset, byte_len);
++#endif /* !STAGE1_5 */
++	return rawread(drive, part + sector, byte_offset,
++		       byte_len, buf);
++}
++
++static int btrfs_check_super(void)
++{
++	struct btrfs_super_block *sb = BTRFS_SUPER;
++
++	if (sb->nodesize != BTRFS_DEFAULT_NODE_SIZE) {
++		btrfs_msg("Btrfs node size (%d) != %d unsupported\n",
++			  sb->nodesize, BTRFS_DEFAULT_NODE_SIZE);
++		goto error;
++	}
++	if (sb->leafsize != BTRFS_DEFAULT_LEAF_SIZE) {
++ 	        btrfs_msg("Btrfs leaf size (%d) != %d unsupported\n",
++			  sb->leafsize, BTRFS_DEFAULT_LEAF_SIZE);
++		goto error;
++	}
++	
++ 	return 0;
++error:
++	return 1;
++}
++
++/* lift the super block */
++static int btrfs_uptodate_super_copy(struct btrfs_fs_info *fs)
++{
++	errnum = ERR_NONE;
++	btrfs_devread(BTRFS_FS_INFO->sb_dev.drive,
++		      BTRFS_FS_INFO->sb_dev.part,
++		      BTRFS_FS_INFO->sb_dev.length,
++		      btrfs_sb_offset(BTRFS_FS_INFO->sb_mirror) >> SECTOR_BITS,
++		      0,
++		      sizeof(struct btrfs_super_block),
++		      (char *)BTRFS_SUPER);
++	return btrfs_check_super();
++}
++  
++/*
++ * Looking for a btrfs super block by magic, @fsid and @devid
++ * (the last two ones are optional). Update latest transid (if
++ * any). Return 0, if such super block was found. Otherwise,
++ * return 1.
++ *
++ * NOTE:
++ * After calling this function the sb_copy of global btrfs_fs_info
++ * can contain garbage, so the caller is responsible for this to be
++ * uptodate (see the function btrfs_uptodate_super_copy()).
++ */
++static int btrfs_find_super(struct btrfs_device *dev, char *fsid, u64 *devid)
++{
++	int i, ret;
++	int found = 0;
++
++	for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) {
++		ret = btrfs_devread(dev->drive,
++				    dev->part,
++				    dev->length,
++				    btrfs_sb_offset(i) >> SECTOR_BITS,
++				    0,
++				    sizeof(struct btrfs_super_block),
++				    (char *)BTRFS_SUPER);
++		if (!ret) {
++			if (errnum == ERR_OUTSIDE_PART) {
++				errnum = ERR_NONE;
++				break;
++			} else {
++				errnum = ERR_NONE;
++				continue;
++			}
++		}
++		if (btrfs_super_bytenr(BTRFS_SUPER) != btrfs_sb_offset(i) ||
++		    btrfs_strncmp((char *)(&BTRFS_SUPER->magic),
++				  BTRFS_MAGIC,
++				  sizeof(BTRFS_SUPER->magic)))
++			continue;
++		if (fsid &&
++		    btrfs_strncmp(fsid,
++				  (char *)BTRFS_SUPER->fsid,
++				  BTRFS_FSID_SIZE))
++			return 1;
++		if (devid &&
++		    *devid != btrfs_super_devid(BTRFS_SUPER))
++			return 1;
++		found = 1;
++		dev->devid = btrfs_super_devid(BTRFS_SUPER);
++
++		if (btrfs_super_generation(BTRFS_SUPER) >
++		    BTRFS_FS_INFO->sb_transid) {
++			BTRFS_FS_INFO->sb_transid =
++				btrfs_super_generation(BTRFS_SUPER);
++			BTRFS_FS_INFO->sb_mirror = i;
++			BTRFS_FS_INFO->sb_dev.devid =
++				btrfs_super_devid(BTRFS_SUPER);
++			BTRFS_FS_INFO->sb_dev.drive = dev->drive;
++			BTRFS_FS_INFO->sb_dev.part = dev->part;
++			BTRFS_FS_INFO->sb_dev.length = dev->length;
++		}
++	}
++	return !found;
++}
++
++/*
++ * "Discern" a btrfs device by fsid and
++ * optionaly by devid (if lookup is set).
++ * Populate persistent device cache (if
++ * there are free slots).
++ */
++static int btrfs_discerner(struct btrfs_device **dev, int lookup)
++{
++	if (btrfs_find_super(*dev,
++			     (char *)BTRFS_FS_INFO->fsid,
++			     (lookup ? &(*dev)->devid : 0)))
++		/* not found */
++		return 0;
++	if (*dev < BTRFS_VOLATILE_DEV_CACHE) {
++		/* populate persistent device cache */
++		memcpy(*dev + 1, *dev, sizeof(struct btrfs_device));
++		(*dev)++;
++	}
++	return 1;
++}
++
++/*
++ * Scan available grub devices and call discerner
++ * for them. Return a number of discerned devices
++ * The scanner was stolen from print_completions().
++ *
++ * Preconditions:
++ * The global structure btrfs_fs_info contains
++ * the latest valid version of btrfs superblock
++ * (the field @sb_copy)
++ */
++static u64 scan_grub_devices(struct btrfs_device *dev,
++			     int (*discerner)(struct btrfs_device **, int),
++			     int lookup)
++{
++	int i, j;
++	u64 count = 0;
++	struct geometry geom;
++
++	for (i = 0; i < 2; i++)
++		for (j = 0; j < 8; j++) {
++			unsigned long part = 0xFFFFFF;
++			int type, entry, gpt_count, gpt_size;
++			unsigned long offset, ext_offset, gpt_offset;
++
++			dev->drive = (i * 0x80) + j;
++			if (get_diskinfo(dev->drive, &geom))
++				continue;
++			while (1) {
++				int ret;
++				buf_drive = -1;
++				errnum = ERR_NONE;
++				ret = next_partition(dev->drive, 0xFFFFFF,
++						     &part, &type, &dev->part,
++						     &dev->length, &offset,
++						     &entry, &ext_offset,
++						     &gpt_offset, &gpt_count,
++						     &gpt_size,
++						     BTRFS_FS_INFO->mbr);
++				if (!ret)
++					break;
++				if (discerner(&dev, lookup)) {
++					count++;
++					if (lookup)
++						goto exit;
++				}
++			}
++		}
++#if 0
++	errnum = ERR_NONE;
++	if (cdrom_drive != GRUB_INVALID_DRIVE &&
++	    !get_diskinfo(cdrom_drive, &geom)) {
++		dev->drive = cdrom_drive;
++		dev->part = 0;
++		dev->length = geom.total_sectors;
++		if (discerner(&dev, lookup)) {
++			count++;
++			if (lookup)
++				goto exit;
++		}
++	}
++#ifdef SUPPORT_NETBOOT
++	errnum = ERR_NONE;
++	if (network_ready &&
++	    !get_diskinfo(NETWORK_DRIVE, &geom)) {
++		dev->drive = NETWORK_DRIVE;
++		dev->part = 0;
++		dev->length = geom.total_sectors;
++		if (discerner(&dev, lookup)) {
++			count++;
++			if (lookup)
++				goto exit;
++		}
++	}
++#endif /* SUPPORT_NETBOOT */
++#endif /* 0 */
++ exit:
++	return count;
++}
++
++#if 0
++static int btrfs_next_item(struct btrfs_root *root,
++			   struct btrfs_path *path);
++
++/*
++ * Scan the chunk tree for dev items
++ * and call a seeker for all of them.
++ * Preconditions: chunk root is installed
++ * to the global btrfs_fs_info.
++ */
++static int scan_dev_tree(struct btrfs_device* (*seeker)(u64))
++{
++	int ret;
++	u64 num_devices = 0;
++	struct btrfs_key key;
++	struct btrfs_key found_key;
++	struct btrfs_path *path;
++	struct btrfs_root *root;
++
++	root = BTRFS_CHUNK_ROOT;
++	path = btrfs_grab_path(FIRST_EXTERNAL_LOOKUP_POOL);
++	key.objectid = BTRFS_DEV_ITEMS_OBJECTID;
++	key.type = 0;
++	key.offset = 0;
++
++	ret = aux_tree_lookup(root, &key, path);
++	if (ret == -1)
++		goto corrupted;
++	while (1) {
++		struct btrfs_device *result;
++		struct btrfs_dev_item *dev_item;
++
++		btrfs_item_key_to_cpu(&path->nodes[0],
++				      &found_key,
++				      path->slots[0]);
++		if (found_key.objectid != BTRFS_DEV_ITEMS_OBJECTID)
++			break;
++		dev_item = btrfs_item_ptr(&path->nodes[0],
++					  path->slots[0],
++					  struct btrfs_dev_item);
++		result = seeker(btrfs_device_id(&path->nodes[0], dev_item));
++		if (result == NULL) {
++			btrfs_msg("Btrfs device %llu is not available\n",
++				  btrfs_device_id(&path->nodes[0], dev_item));
++			goto missed_dev;
++		}
++		num_devices++;
++		ret = btrfs_next_item(root, path);
++		if (ret)
++			break;
++	}
++	if (num_devices == btrfs_super_num_devices(BTRFS_SUPER))
++		return 0;
++ corrupted:
++	errnum = ERR_FSYS_CORRUPT;
++	return 1;
++ missed_dev:
++	errnum = ERR_FSYS_MOUNT;
++	return 1;
++}
++#endif /* 0 */
++
++/*
++ * Find a grub btrfs device by devid.
++ * Preconditions: global btrfs_fs_info
++ * contains a copy of btrfs super block.
++ *
++ * Return pointer to the cached device on success.
++ * Otherwise return NULL.
++ */
++static struct btrfs_device *btrfs_lookup_device(u64 devid)
++{
++	int i, result;
++	struct btrfs_device *cdev;
++
++	for (i = 0; i < BTRFS_NUM_CACHED_DEVICES; i++) {
++		cdev = &BTRFS_DEVICES[i];
++		if (cdev->devid == devid)
++			goto found_in_cache;
++		if (cdev->devid == 0)
++			goto not_found_in_cache;
++	}
++not_found_in_cache:
++	cdev = BTRFS_VOLATILE_DEV_CACHE;
++	cdev->devid = devid;
++	result = scan_grub_devices(cdev,
++				   btrfs_discerner,
++				   1);
++	if (result == 0)
++		/*
++		 * At mount time we have figured out that
++		 * number of available devices is not less
++		 * then number of devices recorded in the
++		 * super block. Hence we treat this case as
++		 * file system corruption.
++		 */
++		goto corrupt;
++	result = btrfs_uptodate_super_copy(BTRFS_FS_INFO);
++	if (result)
++		goto corrupt;
++found_in_cache:
++	return cdev;
++corrupt:
++	errnum = ERR_FSYS_CORRUPT;
++	return NULL;
++}
++
++static int btrfs_find_device(struct btrfs_device *dev)
++{
++	struct btrfs_device *cdev;
++
++	if (btrfs_super_num_devices(BTRFS_SUPER) == 1) {
++		dev->drive = current_drive;
++		dev->part = part_start;
++		dev->length = part_length;
++		return 0;
++	}
++	cdev = btrfs_lookup_device(dev->devid);
++	if (cdev == NULL)
++		return 1;
++	dev->drive  = cdev->drive;
++	dev->part   = cdev->part;
++	dev->length = cdev->length;
++	return 0;
++}
++
++static inline void init_btrfs_volatile_dev_cache(void)
++{
++	BTRFS_VOLATILE_DEV_CACHE->devid = 0;
++	BTRFS_VOLATILE_DEV_CACHE->drive = current_drive;
++	BTRFS_VOLATILE_DEV_CACHE->part = part_start;
++	BTRFS_VOLATILE_DEV_CACHE->length = part_length;
++}
++
++/*
++ * check availability of btrfs devices
++ * and populate the persistent device cache
++ */
++static int btrfs_check_devices(void)
++{
++	u64 num_dev;
++
++	if (btrfs_super_num_devices(BTRFS_SUPER) == 1)
++		return 0;
++	num_dev = scan_grub_devices(BTRFS_DEVICES,
++				    btrfs_discerner, 0);
++	if (btrfs_uptodate_super_copy(BTRFS_FS_INFO))
++		return 1;
++	if (num_dev < btrfs_super_num_devices(BTRFS_SUPER)) {
++		btrfs_msg("Some (%llu) Btrfs devices is not available\n",
++			  btrfs_super_num_devices(BTRFS_SUPER) - num_dev);
++	        return 1;
++	}
++	return 0;
++}
++
++int btrfs_mount(void)
++{
++	int ret;
++
++	check_btrfs_cache_size();
++	init_btrfs_info();
++	init_btrfs_volatile_dev_cache();
++
++	ret = btrfs_find_super(BTRFS_VOLATILE_DEV_CACHE, NULL, NULL);
++	if (ret) {
++		btrfs_msg("Drive %lu, partition %lu: no Btrfs metadata\n",
++			  current_drive, part_start);
++		goto error;
++	}
++	ret = btrfs_uptodate_super_copy(BTRFS_FS_INFO);
++	if (ret)
++		goto error;
++	BTRFS_FS_INFO->sb_transid =
++		btrfs_super_generation(BTRFS_SUPER);
++	memcpy(BTRFS_FS_INFO->fsid,
++	       BTRFS_SUPER->fsid,
++	       BTRFS_FSID_SIZE);
++	ret = btrfs_check_devices();
++	if (ret)
++		goto error;
++	/* setup chunk root */
++	ret = find_setup_root(NULL,
++			      btrfs_super_nodesize(BTRFS_SUPER),
++			      btrfs_super_leafsize(BTRFS_SUPER),
++			      btrfs_super_sectorsize(BTRFS_SUPER),
++			      btrfs_super_stripesize(BTRFS_SUPER),
++			      BTRFS_CHUNK_TREE_OBJECTID,
++			      BTRFS_CHUNK_ROOT,
++			      btrfs_super_chunk_root(BTRFS_SUPER),
++			      btrfs_chunk_root_level_size(BTRFS_SUPER),
++			      btrfs_super_chunk_root_generation(BTRFS_SUPER),
++			      FIRST_EXTERNAL_LOOKUP_POOL);
++	if (ret)
++		return 0;
++	/* setup tree root */
++	ret = find_setup_root(NULL,
++			      btrfs_super_nodesize(BTRFS_SUPER),
++			      btrfs_super_leafsize(BTRFS_SUPER),
++			      btrfs_super_sectorsize(BTRFS_SUPER),
++			      btrfs_super_stripesize(BTRFS_SUPER),
++			      BTRFS_ROOT_TREE_OBJECTID,
++			      BTRFS_TREE_ROOT,
++			      btrfs_super_root(BTRFS_SUPER),
++			      btrfs_root_level_size(BTRFS_SUPER),
++			      btrfs_super_generation(BTRFS_SUPER),
++			      FIRST_EXTERNAL_LOOKUP_POOL);
++	if (ret)
++		return 0;
++	/* setup fs_root */
++	ret = find_setup_root(BTRFS_TREE_ROOT,
++			      btrfs_super_nodesize(BTRFS_SUPER),
++			      btrfs_super_leafsize(BTRFS_SUPER),
++			      btrfs_super_sectorsize(BTRFS_SUPER),
++			      btrfs_super_stripesize(BTRFS_SUPER),
++			      BTRFS_FS_TREE_OBJECTID,
++			      BTRFS_FS_ROOT,
++			      0,
++			      0,
++			      0,
++			      FIRST_EXTERNAL_LOOKUP_POOL);
++	return !ret;
++
++error:
++	errnum = ERR_FSYS_MOUNT;
++	return 0;
++}
++
++/*
++ * Check, whether @chunk is the map for a
++ * block with @logical block number.
++ * If yes, then fill the @map.
++ * Return 1 on affirmative result,
++ * otherwise return 0.
++ */
++int check_read_chunk(struct btrfs_key *key,
++			    struct extent_buffer *leaf,
++			    struct btrfs_chunk *chunk,
++			    struct map_lookup *map,
++			    u64 logical)
++{
++	int i, ret;
++	u64 chunk_start;
++	u64 chunk_size;
++	int num_stripes;
++
++	chunk_start = key->offset;
++	chunk_size = btrfs_chunk_length(leaf, chunk);
++
++	if (logical + 1 > chunk_start + chunk_size ||
++	    logical < chunk_start)
++		/* not a fit */
++		return 0;
++	num_stripes = btrfs_chunk_num_stripes(leaf, chunk);
++	map->ce.start = chunk_start;
++	map->ce.size = chunk_size;
++	map->num_stripes = num_stripes;
++	map->io_width = btrfs_chunk_io_width(leaf, chunk);
++	map->io_align = btrfs_chunk_io_align(leaf, chunk);
++	map->sector_size = btrfs_chunk_sector_size(leaf, chunk);
++	map->stripe_len = btrfs_chunk_stripe_len(leaf, chunk);
++	map->type = btrfs_chunk_type(leaf, chunk);
++	map->sub_stripes = btrfs_chunk_sub_stripes(leaf, chunk);
++
++	for (i = 0; i < num_stripes; i++) {
++		map->stripes[i].physical =
++			btrfs_stripe_offset_nr(leaf, chunk, i);
++		map->stripes[i].dev.devid =
++			btrfs_stripe_devid_nr(leaf, chunk, i);
++		ret = btrfs_find_device(&map->stripes[i].dev);
++		if (ret)
++			return 0;
++	}
++	return 1;
++}
++
++static void init_extent_buffer(struct extent_buffer *eb,
++			       struct btrfs_device *dev,
++			       u64 logical,
++			       u32 blocksize,
++			       u64 physical,
++			       lookup_pool_id lpid)
++{
++	if (dev)
++		memcpy(&eb->dev, dev, sizeof(*dev));
++	eb->start = logical;
++	eb->len = blocksize;
++	eb->dev_bytenr = physical;
++	eb->data = grab_lookup_cache(lpid);
++}
++
++/*
++ * Search for a map by logical offset in sys array.
++ * Return -1 on errors;
++ * Return 1 if the map is found,
++ * Return 0 if the map is not found.
++ */
++int sys_array_lookup(struct map_lookup *map, u64 logical)
++{
++	struct extent_buffer sb;
++	struct btrfs_disk_key *disk_key;
++	struct btrfs_chunk *chunk;
++	struct btrfs_key key;
++	u32 num_stripes;
++	u32 array_size;
++	u32 len = 0;
++	u8 *ptr;
++	unsigned long sb_ptr;
++	u32 cur;
++	int ret;
++	int i = 0;
++
++	sb.data = (char *)BTRFS_SUPER;
++	array_size = btrfs_super_sys_array_size(BTRFS_SUPER);
++
++	ptr = BTRFS_SUPER->sys_chunk_array;
++	sb_ptr = offsetof(struct btrfs_super_block, sys_chunk_array);
++	cur = 0;
++
++	while (cur < array_size) {
++		disk_key = (struct btrfs_disk_key *)ptr;
++		btrfs_disk_key_to_cpu(&key, disk_key);
++
++		len = sizeof(*disk_key);
++		ptr += len;
++		sb_ptr += len;
++		cur += len;
++
++		if (key.type == BTRFS_CHUNK_ITEM_KEY) {
++			chunk = (struct btrfs_chunk *)sb_ptr;
++			ret = check_read_chunk(&key, &sb,
++					       chunk, map, logical);
++			if (ret)
++				/* map is found */
++				return ret;
++			num_stripes = btrfs_chunk_num_stripes(&sb, chunk);
++			len = btrfs_chunk_item_size(num_stripes);
++		} else {
++			errnum = ERR_FSYS_CORRUPT;
++			return -1;
++		}
++		ptr += len;
++		sb_ptr += len;
++		cur += len;
++		i++;
++	}
++	return 0;
++}
++
++/*
++ * Search for a map by logical offset in the chunk tree.
++ * Return 1 if map is found, otherwise return 0.
++ */
++static int chunk_tree_lookup(struct map_lookup *map,
++			     u64 logical)
++{
++	int ret;
++	int slot;
++	struct extent_buffer *leaf;
++	struct btrfs_key key;
++	struct btrfs_key found_key;
++	struct btrfs_chunk *chunk;
++	struct btrfs_path *path;
++
++	path = btrfs_grab_path(INTERNAL_LOOKUP_POOL);
++
++	key.objectid = BTRFS_FIRST_CHUNK_TREE_OBJECTID;
++	key.offset = logical;
++	key.type = BTRFS_CHUNK_ITEM_KEY;
++
++	ret = aux_tree_lookup(BTRFS_CHUNK_ROOT, &key, path);
++	if (ret < 0)
++		return 0;
++	leaf = &path->nodes[0];
++	slot = path->slots[0];
++	if (ret == 1) {
++		WARN_ON(slot == 0);
++		slot -= 1;
++	}
++	btrfs_item_key_to_cpu(leaf, &found_key, slot);
++	if (found_key.type != BTRFS_CHUNK_ITEM_KEY)
++		return 0;
++	chunk = btrfs_item_ptr(leaf, slot, struct btrfs_chunk);
++	return check_read_chunk(&found_key, leaf,
++				chunk, map, logical);
++}
++
++/*
++ * Btrfs logical/physical block mapper.
++ * Look for an appropriate map-extent and
++ * perform a translation. Return 1 on errors.
++ */
++static int btrfs_map_block(u64 logical, u64 *length,
++			   struct btrfs_multi_bio *multi,
++			   int mirror_num)
++{
++	struct map_lookup map;
++	u64 offset;
++	u64 stripe_offset;
++	u64 stripe_nr;
++	struct cache_extent *ce;
++	int stripe_index;
++	int i;
++	int ret;
++
++	memset(&map, 0, sizeof(map));
++	ret = sys_array_lookup(&map, logical);
++	if (ret == -1) {
++		errnum = ERR_FSYS_CORRUPT;
++		return 1;
++	}
++	if (ret == 0) {
++		ret = chunk_tree_lookup(&map, logical);
++		if (!ret) {
++			/* something should be found! */
++			errnum = ERR_FSYS_CORRUPT;
++			return 1;
++		}
++	}
++	/* do translation */
++	ce = &map.ce;
++
++	offset = logical - ce->start;
++	stripe_nr = offset / map.stripe_len;
++	stripe_offset = stripe_nr * map.stripe_len;
++	WARN_ON(offset < stripe_offset);
++
++	stripe_offset = offset - stripe_offset;
++
++	if (map.type & (BTRFS_BLOCK_GROUP_RAID0 | BTRFS_BLOCK_GROUP_RAID1 |
++			 BTRFS_BLOCK_GROUP_RAID10 |
++			 BTRFS_BLOCK_GROUP_DUP)) {
++		*length = min_t(u64, ce->size - offset,
++			      map.stripe_len - stripe_offset);
++	} else {
++		*length = ce->size - offset;
++	}
++	multi->num_stripes = 1;
++	stripe_index = 0;
++	if (map.type & BTRFS_BLOCK_GROUP_RAID1) {
++		if (mirror_num)
++			stripe_index = mirror_num - 1;
++		else
++			stripe_index = stripe_nr % map.num_stripes;
++	} else if (map.type & BTRFS_BLOCK_GROUP_RAID10) {
++		int factor = map.num_stripes / map.sub_stripes;
++
++		stripe_index = stripe_nr % factor;
++		stripe_index *= map.sub_stripes;
++
++		if (mirror_num)
++			stripe_index += mirror_num - 1;
++		else
++			stripe_index = stripe_nr % map.sub_stripes;
++
++		stripe_nr = stripe_nr / factor;
++	} else if (map.type & BTRFS_BLOCK_GROUP_DUP) {
++		if (mirror_num)
++			stripe_index = mirror_num - 1;
++	} else {
++		stripe_index = stripe_nr % map.num_stripes;
++		stripe_nr = stripe_nr / map.num_stripes;
++	}
++	WARN_ON(stripe_index >= map.num_stripes);
++
++	for (i = 0; i < multi->num_stripes; i++) {
++		asm("" : "+r"(multi));
++		multi->stripes[i].physical =
++			map.stripes[stripe_index].physical + stripe_offset +
++			stripe_nr * map.stripe_len;
++		memcpy(&multi->stripes[i].dev,
++		       &map.stripes[stripe_index].dev,
++		       sizeof(struct btrfs_device));
++		stripe_index++;
++	}
++	return 0;
++}
++
++static u64 read_data_extent(u64 logical_start, u64 to_read, char *pos)
++{
++	int ret;
++	u64 length;
++	struct btrfs_multi_bio multi;
++
++	while (to_read) {
++		ret = btrfs_map_block(logical_start, &length, &multi, 0);
++		if (ret) {
++			errnum = ERR_FSYS_CORRUPT;
++			return ret;
++		}
++		if (length > to_read)
++			length = to_read;
++		disk_read_func = disk_read_hook;
++		ret = btrfs_devread(multi.stripes[0].dev.drive,
++				    multi.stripes[0].dev.part,
++				    multi.stripes[0].dev.length,
++				    multi.stripes[0].physical >> SECTOR_BITS,
++				    logical_start & ((u64)SECTOR_SIZE - 1),
++				    length,
++				    pos);
++		disk_read_func = NULL;
++		if (!ret)
++			return 1;
++		btrfs_msg("BTRFS data extent: read %llu bytes\n", length);
++		to_read -= length;
++		pos += length;
++		logical_start += length;
++	}
++	return 0;
++}
++
++static int read_extent_from_disk(struct extent_buffer *eb)
++{
++	WARN_ON(eb->dev_bytenr % SECTOR_BITS);
++	return btrfs_devread(eb->dev.drive,
++			     eb->dev.part,
++			     eb->dev.length,
++			     eb->dev_bytenr >> SECTOR_BITS,
++			     0,
++			     eb->len,
++			     eb->data);
++}
++
++static int verify_parent_transid(struct extent_buffer *eb, u64 parent_transid)
++{
++	return parent_transid && (btrfs_header_generation(eb) != parent_transid);
++}
++
++static int btrfs_num_copies(u64 logical, u64 len)
++{
++	return 1;
++}
++
++static int check_tree_block(struct btrfs_root *root, struct extent_buffer *buf)
++{
++	return 0;
++}
++
++static int csum_tree_block(struct btrfs_root *root, struct extent_buffer *buf,
++		    int verify)
++{
++	return 0;
++}
++
++/*
++ * Read a block of logical number @bytenr
++ * from disk to buffer @eb.
++ * Return 1 on success.
++ */
++int read_tree_block(struct btrfs_root *root,
++		    struct extent_buffer *eb,
++		    u64 bytenr, /* logical */
++		    u32 blocksize,
++		    u64 parent_transid,
++		    lookup_pool_id lpid)
++{
++	int ret;
++	int dev_nr;
++	u64 length;
++	struct btrfs_multi_bio multi;
++	int mirror_num = 0;
++	int num_copies;
++
++	dev_nr = 0;
++	length = blocksize;
++	while (1) {
++		ret = btrfs_map_block(bytenr,
++				      &length, &multi, mirror_num);
++		if (ret) {
++			errnum = ERR_FSYS_CORRUPT;
++			return 0;
++		}
++		init_extent_buffer(eb,
++				   &multi.stripes[0].dev,
++				   bytenr,
++				   blocksize,
++				   multi.stripes[0].physical,
++				   lpid);
++
++		ret = read_extent_from_disk(eb);
++		if (ret &&
++		    check_tree_block(root, eb) == 0 &&
++		    csum_tree_block(root, eb, 1) == 0 &&
++		    verify_parent_transid(eb, parent_transid) == 0)
++			return 1;
++
++		num_copies = btrfs_num_copies(eb->start, eb->len);
++		if (num_copies == 1)
++			break;
++		mirror_num++;
++		if (mirror_num > num_copies)
++			break;
++	}
++	return 0;
++}
++
++/*
++ * Read a child pointed by @slot node pointer
++ * of @parent. Put the result to @parent.
++ * Return 1 on success.
++ */
++static int parent2child(struct btrfs_root *root,
++			struct extent_buffer *parent,
++			int slot,
++			lookup_pool_id lpid)
++{
++	int level;
++
++	WARN_ON(slot < 0);
++	WARN_ON(slot >= btrfs_header_nritems(parent));
++
++	level = btrfs_header_level(parent);
++	WARN_ON(level <= 0);
++
++	return read_tree_block(root,
++			       parent,
++			       btrfs_node_blockptr(parent, slot),
++			       btrfs_level_size(root, level - 1),
++			       btrfs_node_ptr_generation(parent, slot),
++			       lpid);
++}
++
++static int btrfs_comp_keys(struct btrfs_disk_key *disk, struct btrfs_key *k2)
++{
++	struct btrfs_key k1;
++
++	btrfs_disk_key_to_cpu(&k1, disk);
++
++	if (k1.objectid > k2->objectid)
++		return 1;
++	if (k1.objectid < k2->objectid)
++		return -1;
++	if (k1.type > k2->type)
++		return 1;
++	if (k1.type < k2->type)
++		return -1;
++	if (k1.offset > k2->offset)
++		return 1;
++	if (k1.offset < k2->offset)
++		return -1;
++	return 0;
++}
++
++static int bin_search(struct extent_buffer *eb, unsigned long p,
++		      int item_size, struct btrfs_key *key,
++		      int max, int *slot)
++{
++	int low = 0;
++	int high = max;
++	int mid;
++	int ret;
++	unsigned long offset;
++	struct btrfs_disk_key *tmp;
++
++	while(low < high) {
++		mid = (low + high) / 2;
++		offset = p + mid * item_size;
++
++		tmp = (struct btrfs_disk_key *)(eb->data + offset);
++		ret = btrfs_comp_keys(tmp, key);
++
++		if (ret < 0)
++			low = mid + 1;
++		else if (ret > 0)
++			high = mid;
++		else {
++			*slot = mid;
++			return 0;
++		}
++	}
++	*slot = low;
++	return 1;
++}
++
++/* look for a key in a node */
++static int node_lookup(struct extent_buffer *eb,
++		       struct btrfs_key *key,
++		       int *slot)
++{
++	if (btrfs_header_level(eb) == 0) {
++		return bin_search(eb,
++				  offsetof(struct btrfs_leaf, items),
++				  sizeof(struct btrfs_item),
++				  key, btrfs_header_nritems(eb),
++				  slot);
++	} else {
++		return bin_search(eb,
++				  offsetof(struct btrfs_node, ptrs),
++				  sizeof(struct btrfs_key_ptr),
++				  key, btrfs_header_nritems(eb),
++				  slot);
++	}
++	return -1;
++}
++
++static inline int check_node(struct extent_buffer *buf, int slot)
++{
++	return 0;
++}
++
++/*
++ * Look for an item by key in read-only tree.
++ * Return 0, if key was found. Return -1 on io errors.
++ *
++ * Preconditions: btrfs_mount already executed.
++ * Postconditions: if returned value is non-negative,
++ * then path[0] represents the found position in the
++ * tree. All components of the @path from leaf to root
++ * are valid except their data buffers (only path[0]
++ * has valid attached data buffer).
++ */
++
++int aux_tree_lookup(struct btrfs_root *root,
++		    struct btrfs_key *key,
++		    struct btrfs_path *path)
++{
++	int ret;
++	int slot = 0;
++	int level;
++	struct extent_buffer node;
++	init_extent_buffer(&node,
++			   NULL,
++			   0,
++			   0,
++			   0,
++			   path->lpid);
++	copy_extent_buffer(&node, &root->node);
++	do {
++		level = btrfs_header_level(&node);
++		ret = check_node(&node, slot);
++		if (ret)
++			return -1;
++		move_extent_buffer(&path->nodes[level],
++				   &node);
++		ret = node_lookup(&node, key, &slot);
++		if (ret < 0)
++			return ret;
++		if (level) {
++		        /*
++			 * non-leaf,
++			 * jump to the next level
++			 */
++			if (ret && slot > 0)
++			        slot -= 1;
++			ret = parent2child(root, &node, slot, path->lpid);
++			if (ret == 0)
++				return -1;
++		}
++		path->slots[level] = slot;
++	} while (level);
++	return ret;
++}
++
++static int readup_buffer(struct extent_buffer *buf, lookup_pool_id lpid)
++{
++	buf->data = grab_lookup_cache(lpid);
++	return read_extent_from_disk(buf);
++}
++
++/*
++ * Find the next leaf in accordance with tree order;
++ * walk up the tree as far as required to find it.
++ * Returns 0 if something was found, or 1 if there
++ * are no greater leaves. Returns < 0 on io errors.
++ *
++ * Preconditions: all @path components from leaf to
++ * root have valid meta-data fields. path[0] has a
++ * valid attached data buffer with initial leaf.
++ * Postcondition: the same as above, but path[0] has
++ * an attached data buffer with the next leaf.
++ */
++static int btrfs_next_leaf(struct btrfs_root *root,
++			   struct btrfs_path *path)
++{
++	int res;
++	int slot;
++	int level = 1;
++	struct extent_buffer *buf;
++
++	while(level < BTRFS_MAX_LEVEL) {
++		buf = &path->nodes[level];
++		slot = path->slots[level] + 1;
++		/*
++		 * lift data on this level
++		 */
++		res = readup_buffer(buf, path->lpid);
++		if (!res)
++			break;
++		if (slot >= btrfs_header_nritems(buf)) {
++			/* alas, go to parent (if any) */
++			level++;
++			res = 1;
++			continue;
++		}
++		break;
++	}
++	if (!res)
++		return 1;
++	/*
++	 * At this level slot points to
++	 * the subtree we are interested in.
++	 */
++	path->slots[level] = slot;
++	while(level) {
++		struct extent_buffer tmp;
++		move_extent_buffer(&tmp, &path->nodes[level]);
++		res = parent2child(root, &tmp, slot, path->lpid);
++		if (res == 0)
++			return -1;
++		level --;
++		slot = 0;
++		move_extent_buffer(&path->nodes[level], &tmp);
++		path->slots[level] = slot;
++	}
++	return 0;
++}
++
++/* Preconditions: path is valid, data buffer
++ * is attached to leaf node.
++ * Postcondition: path is updated to point to
++ * the next position with respect to the tree
++ * order.
++ *
++ * Return -1 on io errors.
++ * Return 0, if next item was found.
++ * Return 1, if next item wasn't found (no more items).
++ */
++static int btrfs_next_item(struct btrfs_root *root,
++			   struct btrfs_path *path)
++{
++	WARN_ON(path->slots[0] >= btrfs_header_nritems(&path->nodes[0]));
++
++	path->slots[0] += 1;
++
++	if (path->slots[0] < btrfs_header_nritems(&path->nodes[0]))
++		return 0;
++	if (coord_is_root(root, path))
++		/* no more items */
++		return 1;
++	return btrfs_next_leaf(root, path);
++}
++
++/*
++ * check if we can reuse results of previous
++ * search for read operation
++ */
++static int path_is_valid(struct btrfs_path *path,
++			 struct btrfs_key *key, u64 offset)
++{
++	btrfs_item_key_to_cpu(&path->nodes[0],
++			      key,
++			      path->slots[0]);
++	if (BTRFS_FILE_INFO_KEY->objectid != key->objectid)
++		return 0;
++	if (btrfs_key_type(key) == BTRFS_INODE_ITEM_KEY)
++		return 1;
++	if (btrfs_key_type(key) != BTRFS_EXTENT_DATA_KEY)
++		return 0;
++	return BTRFS_FILE_INFO_KEY->offset <= offset;
++}
++
++/* ->read_func() */
++int btrfs_read(char *buf, int len)
++{
++	int ret;
++	struct btrfs_root *fs_root;
++	struct btrfs_path *path;
++	struct btrfs_key  path_key;
++	u64 ioff;
++	u64 bytes;
++	int to_read;
++	char *pos = buf;
++
++	fs_root = BTRFS_FS_ROOT;
++	path = btrfs_grab_path(FIRST_EXTERNAL_LOOKUP_POOL);
++
++	if (!path_is_valid(path, &path_key, filepos)) {
++		ret = aux_tree_lookup(fs_root, BTRFS_FILE_INFO_KEY, path);
++		if (ret < 0)
++			errnum = ERR_FSYS_CORRUPT;
++	}
++	while (!errnum) {
++		struct btrfs_item *item;
++		struct btrfs_file_extent_item *fi;
++		u64 from;
++
++		btrfs_item_key_to_cpu(&path->nodes[0],
++				      &path_key,
++				      path->slots[0]);
++		if (BTRFS_FILE_INFO_KEY->objectid != path_key.objectid)
++			break;
++		if (btrfs_key_type(&path_key) != BTRFS_EXTENT_DATA_KEY)
++			goto next;
++		/*
++		 * current position is extent item
++		 */
++		item = btrfs_item_nr(&path->nodes[0], path->slots[0]);
++		fi = btrfs_item_ptr(&path->nodes[0],
++				    path->slots[0],
++				    struct btrfs_file_extent_item);
++		if (btrfs_file_extent_compression(&path->nodes[0], fi)) {
++		       btrfs_msg("Btrfs transparent compression unsupported\n");
++		       errnum = ERR_BAD_FILETYPE;
++		       goto exit;
++		}
++		ioff = filepos - path_key.offset;
++
++		switch (btrfs_file_extent_type(&path->nodes[0], fi)) {
++		case BTRFS_FILE_EXTENT_INLINE:
++			bytes = btrfs_file_extent_inline_item_len(&path->
++								  nodes[0],
++								  item);
++			if (path_key.offset + bytes < filepos)
++				goto next;
++			to_read = bytes - ioff;
++			if (to_read > len)
++				to_read = len;
++			from = ioff + btrfs_file_extent_inline_start(fi);
++			if (disk_read_hook != NULL) {
++				disk_read_func = disk_read_hook;
++				ret = btrfs_devread(path->nodes[0].dev.drive,
++						    path->nodes[0].dev.part,
++						    path->nodes[0].dev.length,
++						    path->nodes[0].dev_bytenr >>
++						    SECTOR_BITS,
++						    from,
++						    to_read,
++						    pos);
++				disk_read_func = NULL;
++				if (ret)
++					goto exit;
++			} else
++				memcpy(pos,
++				       path->nodes[0].data + from,
++				       to_read);
++			btrfs_msg("BTRFS inline extent: read %d bytes pos %d\n",
++				  to_read, filepos);
++			break;
++		case BTRFS_FILE_EXTENT_REG:
++			bytes = btrfs_file_extent_num_bytes(&path->nodes[0],
++							    fi);
++			if (path_key.offset + bytes < filepos)
++				goto next;
++			to_read = bytes - ioff;
++			if (to_read > len)
++				to_read = len;
++			from = ioff +
++				btrfs_file_extent_disk_bytenr(&path->nodes[0],
++							      fi) +
++				btrfs_file_extent_offset(&path->nodes[0],
++							 fi);
++			ret = read_data_extent(from, to_read, pos);
++			if (ret)
++				goto exit;
++			break;
++		case BTRFS_FILE_EXTENT_PREALLOC:
++			btrfs_msg("Btrfs preallocated extents unsupported\n");
++			errnum = ERR_BAD_FILETYPE;
++			goto exit;
++		default:
++			errnum = ERR_FSYS_CORRUPT;
++			goto exit;
++		}
++		len -= to_read;
++		pos += to_read;
++		filepos += to_read;
++		if (len == 0)
++			break;
++		/* not everything was read */
++	next:
++		ret = btrfs_next_item(fs_root, path);
++		if (ret < 0) {
++			errnum = ERR_FSYS_CORRUPT;
++			break;
++		}
++		btrfs_update_file_info(path);
++		continue;
++	}
++exit:
++	return errnum ? 0 : pos - buf;
++}
++
++static int btrfs_follow_link(struct btrfs_root *root,
++			     struct btrfs_path *path,
++			     char **dirname, char *linkbuf,
++			     int *link_count,
++			     struct btrfs_inode_item *sd)
++{
++	int ret;
++	int len;
++	char *name = *dirname;
++
++	if (++(*link_count) > MAX_LINK_COUNT) {
++		errnum = ERR_SYMLINK_LOOP;
++		return 0;
++	}
++	/* calculate remaining name size */
++	filemax = btrfs_inode_size(&path->nodes[0], sd);
++	for (len = 0;
++	     name[len] && isspace(name[len]);
++	     len ++);
++
++	if (filemax + len > PATH_MAX - 1) {
++		errnum = ERR_FILELENGTH;
++		return 0;
++	}
++	grub_memmove(linkbuf + filemax, name, len + 1);
++	btrfs_update_file_info(path);
++	filepos = 0;
++	/* extract symlink content */
++	while (1) {
++		u64 oid = BTRFS_FILE_INFO_KEY->objectid;
++		ret = btrfs_next_item(root, path);
++		if (ret)
++			break;
++		btrfs_update_file_info(path);
++		if (oid != BTRFS_FILE_INFO_KEY->objectid)
++			break;
++		if (btrfs_key_type(BTRFS_FILE_INFO_KEY) ==
++		    BTRFS_EXTENT_DATA_KEY)
++			goto found;
++	}
++	/* no target was found */
++	errnum = ERR_FSYS_CORRUPT;
++	return 0;
++found:
++	/* fill the rest of linkbuf with the content */
++	ret = btrfs_read(linkbuf, filemax);
++	if (ret != filemax) {
++		errnum = ERR_FSYS_CORRUPT;
++		return 0;
++	}
++	return 1;
++}
++
++static int update_fs_root(struct btrfs_root *fs_root,
++			  struct btrfs_key *location)
++{
++	int ret;
++	struct btrfs_root *tree_root;
++
++	if (location->offset != (u64)-1)
++		return 0;
++	tree_root = &BTRFS_FS_INFO->tree_root;
++	ret = find_setup_root(tree_root,
++			      tree_root->nodesize,
++			      tree_root->leafsize,
++			      tree_root->sectorsize,
++			      tree_root->stripesize,
++			      location->objectid,
++			      fs_root,
++			      0,
++			      0,
++			      0,
++			      SECOND_EXTERNAL_LOOKUP_POOL);
++	if (ret)
++		return ret;
++	location->objectid = btrfs_root_dirid(&fs_root->root_item);
++	btrfs_set_key_type(location, BTRFS_INODE_ITEM_KEY);
++	location->offset = 0;
++	return 0;
++}
++
++#ifndef STAGE1_5
++static inline void update_possibilities(void)
++{
++	if (print_possibilities > 0)
++		print_possibilities =
++			-print_possibilities;
++}
++#endif
++
++/*
++ * Look for a directory item by name.
++ * Print possibilities, if needed.
++ * Postconditions: on success @sd_key points
++ * to the key contained in the directory entry.
++ */
++static int btrfs_de_index_by_name(struct btrfs_root *root,
++				  struct btrfs_path *path,
++				  char **dirname,
++				  struct btrfs_key *sd_key)
++{
++	char ch;
++	int ret;
++	char *rest;
++	struct btrfs_dir_item *di;
++#ifndef STAGE1_5
++	int do_possibilities = 0;
++#endif
++	for (; **dirname == '/'; (*dirname)++);
++	for (rest = *dirname;
++	     (ch = *rest) && !isspace(ch) && ch != '/';
++	     rest++);
++	*rest = 0; /* for substrung() */
++#ifndef STAGE1_5
++	if (print_possibilities && ch != '/')
++		do_possibilities = 1;
++#endif
++	/* scan a directory */
++	while (1) {
++		u32 total;
++		u32 cur = 0;
++		u32 len;
++		struct btrfs_key di_key;
++		struct btrfs_disk_key location;
++		struct btrfs_item *item;
++
++		/* extract next dir entry */
++		ret = btrfs_next_item(root, path);
++		if (ret)
++			break;
++		item = btrfs_item_nr(&path->nodes[0],
++				     path->slots[0]);
++		btrfs_item_key_to_cpu(&path->nodes[0],
++				      &di_key,
++				      path->slots[0]);
++		if (di_key.objectid != sd_key->objectid)
++			/* no more entries */
++			break;
++		di = btrfs_item_ptr(&path->nodes[0],
++				    path->slots[0],
++				    struct btrfs_dir_item);
++		/*
++		 * working around special cases:
++		 * btrfs doesn't maintain directory entries
++		 * which contain names "." and ".."
++		 */
++		if (!substring(".", *dirname)) {
++#ifndef STAGE1_5
++			if (do_possibilities) {
++				update_possibilities();
++				return 1;
++			}
++#endif
++			goto found;
++		}
++		if (!substring("..", *dirname)) {
++			if (di_key.type != BTRFS_INODE_REF_KEY)
++				continue;
++			sd_key->objectid = di_key.offset;
++			btrfs_set_key_type(sd_key, BTRFS_INODE_ITEM_KEY);
++			sd_key->offset = 0;
++#ifndef STAGE1_5
++			if (do_possibilities) {
++				update_possibilities();
++				return 1;
++			}
++#endif
++			goto found;
++		}
++		if (di_key.type != BTRFS_DIR_ITEM_KEY)
++			continue;
++		total = btrfs_item_size(&path->nodes[0], item);
++		/* scan a directory item */
++		while (cur < total) {
++			char tmp;
++			int result;
++			char *filename;
++			char *end_of_name;
++			int name_len;
++			int data_len;
++
++			btrfs_dir_item_key(&path->nodes[0], di, &location);
++
++			name_len = btrfs_dir_name_len(&path->nodes[0], di);
++			data_len = btrfs_dir_data_len(&path->nodes[0], di);
++
++			WARN_ON(name_len > BTRFS_NAME_LEN);
++
++			filename = (char *)(path->nodes[0].data +
++					    (unsigned long)(di + 1));
++			end_of_name = filename + name_len;
++			/*
++			 * working around not null-terminated
++			 * directory names in btrfs: just
++			 * a short-term overwrite of the
++			 * cache with the following rollback
++			 * of the change.
++			 */
++			tmp = *end_of_name;
++			*end_of_name = 0;
++			result = substring(*dirname, filename);
++			*end_of_name = tmp;
++#ifndef STAGE1_5
++			if (do_possibilities) {
++				if (result <= 0) {
++					update_possibilities();
++					*end_of_name = 0;
++					print_a_completion(filename);
++					*end_of_name = tmp;
++				}
++			}
++			else
++#endif
++				if (result == 0) {
++				      btrfs_dir_item_key_to_cpu(&path->nodes[0],
++								di, sd_key);
++				      goto found;
++				}
++			len = sizeof(*di) + name_len + data_len;
++			di = (struct btrfs_dir_item *)((char *)di + len);
++			cur += len;
++		}
++	}
++#ifndef STAGE1_5
++	if (print_possibilities < 0)
++		return 1;
++#endif
++	errnum = ERR_FILE_NOT_FOUND;
++	*rest = ch;
++	return 0;
++ found:
++	*rest = ch;
++	*dirname = rest;
++	return 1;
++}
++
++/*
++ * ->dir_func().
++ * Postcondition: on a non-zero return BTRFS_FS_INFO
++ * contains the latest fs_root of file's subvolume.
++ * BTRFS_FS_INFO points to a subvolume of a file we
++ * were trying to look up.
++ * BTRFS_FILE_INFO contains info of the file we were
++ * trying to look up.
++ */
++
++int btrfs_dir(char *dirname)
++{
++	int ret;
++	int mode;
++	u64 size;
++	int linkcount = 0;
++	char linkbuf[PATH_MAX];
++
++	struct btrfs_path *path;
++	struct btrfs_root *root;
++
++	struct btrfs_key sd_key;
++	struct btrfs_inode_item *sd;
++	struct btrfs_key parent_sd_key;
++
++	root = BTRFS_FS_ROOT;
++	path = btrfs_grab_path(FIRST_EXTERNAL_LOOKUP_POOL);
++
++	btrfs_set_root_dir_key(&sd_key);
++	while (1) {
++		struct extent_buffer *leaf;
++		ret = aux_tree_lookup(root, &sd_key, path);
++		if (ret)
++			return 0;
++		leaf = &path->nodes[0];
++		sd = btrfs_item_ptr(leaf,
++				    path->slots[0],
++				    struct btrfs_inode_item);
++		mode = btrfs_inode_mode(leaf, sd);
++		size = btrfs_inode_size(leaf, sd);
++		switch (btrfs_get_file_type(mode)) {
++		case BTRFS_SYMLINK_FILE:
++			ret = btrfs_follow_link(root,
++						path,
++						&dirname,
++						linkbuf,
++						&linkcount,
++						sd);
++			if (!ret)
++				return 0;
++			dirname = linkbuf;
++			if (*dirname == '/')
++				/* absolute name */
++				btrfs_set_root_dir_key(&sd_key);
++			else
++				memcpy(&sd_key, &parent_sd_key,
++				       sizeof(sd_key));
++			continue;
++		case BTRFS_REGULAR_FILE:
++			/*
++			 * normally we want to exit here
++			 */
++			if (*dirname && !isspace (*dirname)) {
++				errnum = ERR_BAD_FILETYPE;
++				return 0;
++			}
++			filepos = 0;
++			filemax = btrfs_inode_size(leaf, sd);
++			btrfs_update_file_info(path);
++			return 1;
++		case BTRFS_DIRECTORY_FILE:
++			memcpy(&parent_sd_key, &sd_key, sizeof(sd_key));
++			ret = btrfs_de_index_by_name(root,
++						     path,
++						     &dirname,
++						     &sd_key);
++			if (!ret)
++				return 0;
++#ifndef STAGE1_5
++			if (print_possibilities < 0)
++				return 1;
++#endif
++			/*
++			 * update fs_tree:
++			 * subvolume stuff goes here
++			 */
++			ret = update_fs_root(root, &sd_key);
++			if (ret)
++				return 0;
++			continue;
++		case BTRFS_UNKNOWN_FILE:
++		default:
++			btrfs_msg("Btrfs: bad file type\n");
++			errnum = ERR_BAD_FILETYPE;
++			return 0;
++		}
++	}
++}
++
++int btrfs_embed(int *start_sector, int needed_sectors)
++{
++	int ret;
++	init_btrfs_info();
++	init_btrfs_volatile_dev_cache();
++
++	ret = btrfs_find_super(BTRFS_VOLATILE_DEV_CACHE, NULL, NULL);
++	if (ret)
++		return 0;
++	ret = btrfs_uptodate_super_copy(BTRFS_FS_INFO);
++	if (ret)
++		return 0;
++	*start_sector = 1; /* reserve first sector for stage1 */
++	return needed_sectors <=
++		((BTRFS_SUPER_INFO_OFFSET >> SECTOR_BITS) - 1);
++}
++#endif /* FSYS_BTRFS */
++
++/*
++  Local variables:
++  c-indentation-style: "K&R"
++  mode-name: "LC"
++  c-basic-offset: 8
++  tab-width: 8
++  fill-column: 80
++  scroll-step: 1
++  End:
++*/
+diff -up grub-upstream.wip/stage2/Makefile.am.btrfs grub-upstream.wip/stage2/Makefile.am
+--- grub-upstream.wip/stage2/Makefile.am.btrfs	2012-03-20 05:06:49.000000000 +0000
++++ grub-upstream.wip/stage2/Makefile.am	2012-03-20 05:07:09.000000000 +0000
+@@ -17,13 +17,13 @@ INCLUDES = -I$(top_srcdir)/stage1
+ noinst_LIBRARIES = libgrub.a
+ libgrub_a_SOURCES = boot.c builtins.c char_io.c cmdline.c common.c \
+ 	disk_io.c fsys_ext2fs.c fsys_fat.c fsys_ffs.c fsys_iso9660.c \
+-	fsys_jfs.c fsys_minix.c fsys_reiserfs.c fsys_ufs2.c \
++	fsys_jfs.c fsys_minix.c fsys_reiserfs.c fsys_btrfs.c fsys_ufs2.c \
+ 	fsys_vstafs.c fsys_xfs.c gunzip.c md5.c serial.c stage2.c \
+ 	terminfo.c tparm.c graphics.c
+ libgrub_a_CFLAGS = $(GRUB_CFLAGS) -I$(top_srcdir)/lib \
+ 	-DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 \
+ 	-DFSYS_ISO9660=1 -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 \
+-	-DFSYS_UFS2=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \
++	-DFSYS_BTRFS=1 -DFSYS_UFS2=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \
+ 	-DUSE_MD5_PASSWORDS=1 -DSUPPORT_SERIAL=1 -DSUPPORT_HERCULES=1
+ 
+ # Stage 2 and Stage 1.5's.
+@@ -34,24 +34,26 @@ EXTRA_PROGRAMS = nbloader.exec pxeloader
+ if DISKLESS_SUPPORT
+ pkglib_DATA = stage2 stage2_eltorito e2fs_stage1_5 fat_stage1_5 \
+ 	ffs_stage1_5 iso9660_stage1_5 jfs_stage1_5 minix_stage1_5 \
+-	reiserfs_stage1_5 ufs2_stage1_5 vstafs_stage1_5 xfs_stage1_5 \
+-	nbgrub pxegrub
++	reiserfs_stage1_5 btrfs_stage1_5 ufs2_stage1_5 vstafs_stage1_5 \
++	xfs_stage1_5 nbgrub pxegrub
+ noinst_DATA = pre_stage2 start start_eltorito nbloader pxeloader diskless
+ noinst_PROGRAMS = pre_stage2.exec start.exec start_eltorito.exec \
+ 	e2fs_stage1_5.exec fat_stage1_5.exec ffs_stage1_5.exec \
+ 	iso9660_stage1_5.exec jfs_stage1_5.exec minix_stage1_5.exec \
+-	reiserfs_stage1_5.exec ufs2_stage1_5.exec vstafs_stage1_5.exec \
+-	xfs_stage1_5.exec nbloader.exec pxeloader.exec diskless.exec
++	reiserfs_stage1_5.exec btrfs_stage1_5.exec ufs2_stage1_5.exec \
++	vstafs_stage1_5.exec xfs_stage1_5.exec nbloader.exec \
++	pxeloader.exec diskless.exec
+ else
+ pkglib_DATA = stage2 stage2_eltorito e2fs_stage1_5 fat_stage1_5 \
+ 	ffs_stage1_5 iso9660_stage1_5 jfs_stage1_5 minix_stage1_5 \
+-	reiserfs_stage1_5 ufs2_stage1_5 vstafs_stage1_5 xfs_stage1_5
++	reiserfs_stage1_5 btrfs_stage1_5 ufs2_stage1_5 vstafs_stage1_5 \
++	xfs_stage1_5
+ noinst_DATA = pre_stage2 start start_eltorito
+ noinst_PROGRAMS = pre_stage2.exec start.exec start_eltorito.exec \
+ 	e2fs_stage1_5.exec fat_stage1_5.exec ffs_stage1_5.exec \
+ 	iso9660_stage1_5.exec jfs_stage1_5.exec minix_stage1_5.exec \
+-	reiserfs_stage1_5.exec ufs2_stage1_5.exec vstafs_stage1_5.exec \
+-	xfs_stage1_5.exec
++	reiserfs_stage1_5.exec btrfs_stage1_5.exec ufs2_stage1_5.exec \
++	vstafs_stage1_5.exec xfs_stage1_5.exec
+ endif
+ MOSTLYCLEANFILES = $(noinst_PROGRAMS)
+ 
+@@ -95,15 +97,17 @@ STAGE1_5_COMPILE = $(STAGE2_COMPILE) -DN
+ pre_stage2_exec_SOURCES = asm.S bios.c boot.c builtins.c char_io.c \
+ 	cmdline.c common.c console.c disk_io.c fsys_ext2fs.c \
+ 	fsys_fat.c fsys_ffs.c fsys_iso9660.c fsys_jfs.c fsys_minix.c \
+-	fsys_reiserfs.c fsys_ufs2.c fsys_vstafs.c fsys_xfs.c gunzip.c \
+-	hercules.c md5.c serial.c smp-imps.c stage2.c terminfo.c tparm.c \
+-	graphics.c
++	fsys_reiserfs.c fsys_btrfs.c fsys_ufs2.c fsys_vstafs.c fsys_xfs.c \
++	gunzip.c hercules.c md5.c serial.c smp-imps.c stage2.c terminfo.c \
++	tparm.c graphics.c
+ pre_stage2_exec_CFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS)
+ pre_stage2_exec_CCASFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS)
+ pre_stage2_exec_LDFLAGS = $(PRE_STAGE2_LINK)
+ 
+ if NETBOOT_SUPPORT
+-pre_stage2_exec_LDADD = ../netboot/libdrivers.a
++pre_stage2_exec_LDADD = ../netboot/libdrivers.a -lgcc
++else
++pre_stage2_exec_LDADD = -lgcc
+ endif
+ 
+ if DISKLESS_SUPPORT
+@@ -197,6 +201,16 @@ reiserfs_stage1_5_exec_CCASFLAGS = $(STA
+ 	-DNO_BLOCK_FILES=1
+ reiserfs_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
+ 
++# For btrfs_stage1_5 target.
++btrfs_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c \
++       disk_io.c stage1_5.c fsys_btrfs.c bios.c
++btrfs_stage1_5_exec_CFLAGS = $(STAGE1_5_COMPILE) -DFSYS_BTRFS=1 \
++       -DNO_BLOCK_FILES=1
++btrfs_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) -DFSYS_BTRFS=1 \
++       -DNO_BLOCK_FILES=1
++btrfs_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
++btrfs_stage1_5_exec_LDADD = -lgcc
++
+ # For vstafs_stage1_5 target.
+ vstafs_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c \
+ 	disk_io.c stage1_5.c fsys_vstafs.c bios.c
+@@ -240,7 +254,7 @@ diskless_exec_CFLAGS = $(STAGE2_COMPILE)
+ diskless_exec_CCASFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS) \
+ 	-DSUPPORT_DISKLESS=1
+ diskless_exec_LDFLAGS = $(PRE_STAGE2_LINK)
+-diskless_exec_LDADD = ../netboot/libdrivers.a
++diskless_exec_LDADD = ../netboot/libdrivers.a -lgcc
+ 
+ diskless_size.h: diskless
+ 	-rm -f $@
+diff -up grub-upstream.wip/stage2/shared.h.btrfs grub-upstream.wip/stage2/shared.h
+--- grub-upstream.wip/stage2/shared.h.btrfs	2012-03-20 05:06:49.000000000 +0000
++++ grub-upstream.wip/stage2/shared.h	2012-03-20 05:07:09.000000000 +0000
+@@ -207,11 +207,12 @@ extern char *grub_scratch_mem;
+ #define STAGE2_ID_FAT_STAGE1_5		3
+ #define STAGE2_ID_MINIX_STAGE1_5	4
+ #define STAGE2_ID_REISERFS_STAGE1_5	5
+-#define STAGE2_ID_VSTAFS_STAGE1_5	6
+-#define STAGE2_ID_JFS_STAGE1_5		7
+-#define STAGE2_ID_XFS_STAGE1_5		8
+-#define STAGE2_ID_ISO9660_STAGE1_5	9
+-#define STAGE2_ID_UFS2_STAGE1_5		10
++#define STAGE2_ID_BTRFS_STAGE1_5	6
++#define STAGE2_ID_VSTAFS_STAGE1_5	7
++#define STAGE2_ID_JFS_STAGE1_5		8
++#define STAGE2_ID_XFS_STAGE1_5		9
++#define STAGE2_ID_ISO9660_STAGE1_5	10
++#define STAGE2_ID_UFS2_STAGE1_5		11
+ 
+ #ifndef STAGE1_5
+ # define STAGE2_ID	STAGE2_ID_STAGE2
+@@ -226,6 +227,8 @@ extern char *grub_scratch_mem;
+ #  define STAGE2_ID	STAGE2_ID_MINIX_STAGE1_5
+ # elif defined(FSYS_REISERFS)
+ #  define STAGE2_ID	STAGE2_ID_REISERFS_STAGE1_5
++# elif defined(FSYS_BTRFS)
++#  define STAGE2_ID	STAGE2_ID_BTRFS_STAGE1_5
+ # elif defined(FSYS_VSTAFS)
+ #  define STAGE2_ID	STAGE2_ID_VSTAFS_STAGE1_5
+ # elif defined(FSYS_JFS)

_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xen.org
http://lists.xensource.com/xen-changelog

From xen-changelog-bounces@lists.xen.org Fri Apr 06 02:33:28 2012
Return-path: <xen-changelog-bounces@lists.xen.org>
Envelope-to: archives@lists.xen.org
Delivery-date: Fri, 06 Apr 2012 02:33:28 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-changelog-bounces@lists.xen.org>)
	id 1SFyzO-0004Ul-JT; Fri, 06 Apr 2012 02:33:26 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen@xenbits.xen.org>) id 1SFyzL-0004Qa-TE
	for xen-changelog@lists.xensource.com; Fri, 06 Apr 2012 02:33:24 +0000
Received: from [193.109.254.147:2285] by server-4.bemta-14.messagelabs.com id
	D6/D8-11570-3F55E7F4; Fri, 06 Apr 2012 02:33:23 +0000
X-Env-Sender: xen@xenbits.xen.org
X-Msg-Ref: server-11.tower-27.messagelabs.com!1333679590!3483425!1
X-Originating-IP: [50.57.168.107]
X-SpamReason: No, hits=1.0 required=7.0 tests=BODY_DONG,BODY_RANDOM_LONG
X-StarScan-Version: 6.5.7; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14994 invoked from network); 6 Apr 2012 02:33:11 -0000
Received: from mail.xen.org (HELO mail.xen.org) (50.57.168.107)
	by server-11.tower-27.messagelabs.com with AES256-SHA encrypted SMTP;
	6 Apr 2012 02:33:11 -0000
Received: from xenbits.xen.org ([50.57.170.242])
	by mail.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen@xenbits.xen.org>) id 1SFyz8-0003MW-3U
	for xen-changelog@lists.xensource.com; Fri, 06 Apr 2012 02:33:10 +0000
Received: from xen by xenbits.xen.org with local (Exim 4.72)
	(envelope-from <xen@xenbits.xen.org>) id 1SFyz7-0008Iq-PJ
	for xen-changelog@lists.xensource.com; Fri, 06 Apr 2012 02:33:09 +0000
Message-Id: <E1SFyz7-0008Iq-PJ@xenbits.xen.org>
Date: Fri, 06 Apr 2012 02:33:08 +0000
From: Xen patchbot-unstable <patchbot@xen.org>
To: xen-changelog@lists.xensource.com
Subject: [Xen-changelog] [xen-unstable] remove ia64
X-BeenThere: xen-changelog@lists.xen.org
X-Mailman-Version: 2.1.13
Precedence: list
Reply-To: xen-devel@lists.xensource.com
List-Id: BK change log <xen-changelog.lists.xen.org>
List-Unsubscribe: <http://lists.xen.org/cgi-bin/mailman/options/xen-changelog>, 
	<mailto:xen-changelog-request@lists.xen.org?subject=unsubscribe>
List-Post: <mailto:xen-changelog@lists.xen.org>
List-Help: <mailto:xen-changelog-request@lists.xen.org?subject=help>
List-Subscribe: <http://lists.xen.org/cgi-bin/mailman/listinfo/xen-changelog>, 
	<mailto:xen-changelog-request@lists.xen.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: xen-changelog-bounces@lists.xen.org
Errors-To: xen-changelog-bounces@lists.xen.org

# HG changeset patch
# User Jan Beulich <jbeulich@suse.com>
# Date 1333449335 -7200
# Node ID 8aa1697d57e480e00b5aaef587c940b52055c064
# Parent  2386288b1bf12e550e267c53976dba51eed8e74d
remove ia64

It retains IA64-specific bits in code imported from elsewhere (e.g.
ACPI, EFI) as well as in the public headers.

It also doesn't touch the tools, mini-os, and unmodified_drivers
sub-trees.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
---


diff -r 2386288b1bf1 -r 8aa1697d57e4 MAINTAINERS
--- a/MAINTAINERS	Mon Apr 02 18:14:31 2012 +0100
+++ b/MAINTAINERS	Tue Apr 03 12:35:35 2012 +0200
@@ -138,14 +138,6 @@ M:	Tim Deegan <tim@xen.org>
 S:	Supported
 F:	tools/debugger/kdd/
 
-IA64 ARCHITECTURE
-M:	KUWAMURA Shin'ya <kuwa@jp.fujitsu.com>
-S:	Supported
-L:	xen-ia64-devel@lists.xensource.com
-F:	xen/arch/ia64/*
-F:	xen/include/asm-ia64/*
-F:	tools/libxc/ia64/*
-
 INTEL(R) TRUSTED EXECUTION TECHNOLOGY (TXT)
 M:	Joseph Cihula <joseph.cihula@intel.com>
 M:	Gang Wei <gang.wei@intel.com>
diff -r 2386288b1bf1 -r 8aa1697d57e4 config/ia64.mk
--- a/config/ia64.mk	Mon Apr 02 18:14:31 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-CONFIG_IA64 := y
-CONFIG_IA64_$(XEN_OS) := y
-
-CONFIG_IOEMU := y
-CONFIG_XCUTILS := y
-CONFIG_XENCOMM := y
diff -r 2386288b1bf1 -r 8aa1697d57e4 xen/arch/ia64/Makefile
--- a/xen/arch/ia64/Makefile	Mon Apr 02 18:14:31 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-subdir-y += xen
-subdir-y += vmx
-subdir-y += linux
-subdir-y += linux-xen
-
-ALL_OBJS := linux-xen/head.o $(ALL_OBJS)
-
-$(TARGET)-syms: $(ALL_OBJS) xen.lds.s
-	$(MAKE) -f $(BASEDIR)/Rules.mk $(BASEDIR)/common/symbols-dummy.o
-	$(LD) $(LDFLAGS) -T xen.lds.s -N -Map $(@D)/.$(@F).0.map $(ALL_OBJS) \
-		$(BASEDIR)/common/symbols-dummy.o -o $(@D)/.$(@F).0 
-	$(NM) -n $(@D)/.$(@F).0 | $(BASEDIR)/tools/symbols >$(@D)/.$(@F).0.S 
-	$(MAKE) -f $(BASEDIR)/Rules.mk $(@D)/.$(@F).0.o 
-	$(LD) $(LDFLAGS) -T xen.lds.s -N -Map $(@D)/.$(@F).1.map $(ALL_OBJS) \
-		$(@D)/.$(@F).0.o -o $(@D)/.$(@F).1 
-	$(NM) -n $(@D)/.$(@F).1 | $(BASEDIR)/tools/symbols >$(@D)/.$(@F).1.S 
-	$(MAKE) -f $(BASEDIR)/Rules.mk $(@D)/.$(@F).1.o 
-	$(LD) $(LDFLAGS) -T xen.lds.s -N -Map $@.map $(ALL_OBJS) \
-		$(@D)/.$(@F).1.o -o $@
-	rm -f $(@D)/.$(@F).[0-9]* 
-
-$(TARGET): $(TARGET)-syms
-	$(NM) -n $< | grep -v ' [aUw] ' > $(@D)/System.map 
-	$(OBJCOPY) -R .note -R .comment -S $< $@
-
-# Headers do not depend on auto-generated header, but object files do.
-$(ALL_OBJS): $(BASEDIR)/include/asm-ia64/asm-xsi-offsets.h
-
-asm-offsets.s: asm-offsets.c \
-    $(BASEDIR)/include/asm-ia64/.offsets.h.stamp 
-	$(CC) $(CFLAGS) -DGENERATE_ASM_OFFSETS -DIA64_TASK_SIZE=0 -S -o $@ $<
-
-asm-xsi-offsets.s: asm-xsi-offsets.c
-	$(CC) $(CFLAGS) -S -o $@ $<
-
-$(BASEDIR)/include/asm-ia64/asm-xsi-offsets.h: asm-xsi-offsets.s
-	@(set -e; \
-	  echo "/*"; \
-	  echo " * DO NOT MODIFY."; \
-	  echo " *"; \
-	  echo " * This file was auto-generated from $<"; \
-	  echo " *"; \
-	  echo " */"; \
-	  echo ""; \
-	  echo "#ifndef __ASM_XSI_OFFSETS_H__"; \
-	  echo "#define __ASM_XSI_OFFSETS_H__"; \
-	  echo ""; \
-	  sed -ne "/^->/{s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; s:->::; p;}"; \
-	  echo ""; \
-	  echo "#endif") <$< >$@
-
-$(BASEDIR)/include/asm-ia64/.offsets.h.stamp:
-# Need such symbol link to make linux headers available
-	[ -e $(BASEDIR)/include/linux ] \
-	 || ln -sf $(BASEDIR)/include/xen $(BASEDIR)/include/linux
-	[ -e $(BASEDIR)/include/asm-ia64/xen ] \
-	 || ln -sf $(BASEDIR)/include/asm-ia64/linux $(BASEDIR)/include/asm-ia64/xen
-	touch $@
-
-# I'm sure a Makefile wizard would know a better way to do this
-xen.lds.s: xen/xen.lds.S
-	$(CC) -E $(CPPFLAGS) -P -DXEN $(AFLAGS) \
-		-o xen.lds.s xen/xen.lds.S
-
-.PHONY: clean
-clean::
-	rm -f *.o *~ core  xen.lds.s $(BASEDIR)/include/asm-ia64/.offsets.h.stamp asm-offsets.s map.out
-	rm -f asm-xsi-offsets.s $(BASEDIR)/include/asm-ia64/asm-xsi-offsets.h
-	rm -f $(BASEDIR)/System.map
-	rm -f $(BASEDIR)/include/linux
-	rm -f $(BASEDIR)/include/asm-ia64/xen
diff -r 2386288b1bf1 -r 8aa1697d57e4 xen/arch/ia64/Rules.mk
--- a/xen/arch/ia64/Rules.mk	Mon Apr 02 18:14:31 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-########################################
-# ia64-specific definitions
-
-ia64 := y
-HAS_ACPI := y
-HAS_VGA  := y
-HAS_CPUFREQ := y
-HAS_PCI := y
-HAS_PASSTHROUGH := y
-HAS_NS16550 := y
-HAS_KEXEC := y
-xenoprof := y
-no_warns ?= n
-vti_debug ?= n
-vmx_panic ?= n
-vhpt_disable ?= n
-xen_ia64_expose_p2m	?= y
-xen_ia64_pervcpu_vhpt	?= y
-xen_ia64_tlb_track	?= y
-xen_ia64_tlb_track_cnt	?= n
-xen_ia64_tlbflush_clock	?= y
-xen_ia64_disable_optvfault ?= n
-
-# If they are enabled,
-# shrink struct page_info assuming all mfn can be addressed by 32 bits.
-# However, with 50bit ia64 architected physical address and 16KB page size,
-# mfn isn't always assessed by 32bit. So they are disabled by default.
-xen_ia64_shrink_page_list ?= n
-xen_ia64_pickle_domain ?= n
-
-# Used only by linux/Makefile.
-AFLAGS_KERNEL  += -mconstant-gp -nostdinc $(CPPFLAGS)
-
-CFLAGS	+= -nostdinc -fno-builtin -fno-common
-CFLAGS	+= -mconstant-gp
-#CFLAGS  += -O3		# -O3 over-inlines making debugging tough!
-CFLAGS	+= -O2		# but no optimization causes compile errors!
-CFLAGS	+= -fomit-frame-pointer -D__KERNEL__
-CFLAGS	+= -iwithprefix include
-CPPFLAGS+= -I$(BASEDIR)/include						\
-	   -I$(BASEDIR)/include/asm-ia64				\
-	   -I$(BASEDIR)/include/asm-ia64/linux 				\
-	   -I$(BASEDIR)/include/asm-ia64/linux-xen 			\
-	   -I$(BASEDIR)/include/asm-ia64/linux-null 			\
-	   -I$(BASEDIR)/arch/ia64/linux -I$(BASEDIR)/arch/ia64/linux-xen
-CFLAGS	+= $(CPPFLAGS)
-#CFLAGS  += -Wno-pointer-arith -Wredundant-decls
-CFLAGS	+= -DIA64 -DXEN -DLINUX_2_6
-CFLAGS	+= -ffixed-r13 -mfixed-range=f2-f5,f12-f127,b2-b5
-CFLAGS	+= -g
-ifeq ($(vti_debug),y)
-CFLAGS  += -DVTI_DEBUG
-endif
-ifeq ($(vmx_panic),y)
-CFLAGS  += -DCONFIG_VMX_PANIC
-endif
-ifeq ($(xen_ia64_expose_p2m),y)
-CFLAGS	+= -DCONFIG_XEN_IA64_EXPOSE_P2M
-endif
-ifeq ($(xen_ia64_pervcpu_vhpt),y)
-CFLAGS	+= -DCONFIG_XEN_IA64_PERVCPU_VHPT
-ifeq ($(vhpt_disable),y)
-$(error "both xen_ia64_pervcpu_vhpt=y and vhpt_disable=y are enabled. they can't be enabled simultaneously. disable one of them.")
-endif
-endif
-ifeq ($(xen_ia64_tlb_track),y)
-CFLAGS	+= -DCONFIG_XEN_IA64_TLB_TRACK
-endif
-ifeq ($(xen_ia64_tlb_track_cnt),y)
-CFLAGS	+= -DCONFIG_TLB_TRACK_CNT
-endif
-ifeq ($(xen_ia64_tlbflush_clock),y)
-CFLAGS += -DCONFIG_XEN_IA64_TLBFLUSH_CLOCK
-endif
-ifeq ($(no_warns),y)
-CFLAGS	+= -Wa,--fatal-warnings -Werror -Wno-uninitialized
-endif
-ifneq ($(vhpt_disable),y)
-CFLAGS += -DVHPT_ENABLED=1
-else
-CFLAGS += -DVHPT_ENABLED=0
-endif
-ifeq ($(xen_ia64_disable_optvfault),y)
-CFLAGS += -DCONFIG_XEN_IA64_DISABLE_OPTVFAULT
-endif
-ifeq ($(xen_ia64_shrink_page_list),y)
-CFLAGS += -DCONFIG_IA64_SHRINK_PAGE_LIST
-endif
-ifeq ($(xen_ia64_pickle_domain),y)
-CFLAGS += -DCONFIG_IA64_PICKLE_DOMAIN
-endif
-
-LDFLAGS = -g
diff -r 2386288b1bf1 -r 8aa1697d57e4 xen/arch/ia64/asm-offsets.c
--- a/xen/arch/ia64/asm-offsets.c	Mon Apr 02 18:14:31 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,273 +0,0 @@
-/*
- * Generate definitions needed by assembly language modules.
- * This code generates raw asm output which is post-processed
- * to extract and format the required data.
- */
-
-#include <xen/config.h>
-#include <xen/sched.h>
-#include <asm/processor.h>
-#include <asm/ptrace.h>
-#include <asm/mca.h>
-#include <public/xen.h>
-#include <asm/tlb.h>
-#include <asm/regs.h>
-#include <asm/xenmca.h>
-
-#define task_struct vcpu
-
-#define DEFINE(sym, val) \
-        asm volatile("\n->" #sym " (%0) " #val : : "i" (val))
-
-#define BLANK() asm volatile("\n->" : : )
-
-#define OFFSET(_sym, _str, _mem) \
-    DEFINE(_sym, offsetof(_str, _mem));
-
-void foo(void)
-{
-	DEFINE(IA64_TASK_SIZE, sizeof (struct task_struct));
-	DEFINE(IA64_THREAD_INFO_SIZE, sizeof (struct thread_info));
-	DEFINE(IA64_PT_REGS_SIZE, sizeof (struct pt_regs));
-	DEFINE(IA64_SWITCH_STACK_SIZE, sizeof (struct switch_stack));
-	DEFINE(IA64_CPU_SIZE, sizeof (struct cpuinfo_ia64));
-	DEFINE(UNW_FRAME_INFO_SIZE, sizeof (struct unw_frame_info));
-	DEFINE(MAPPED_REGS_T_SIZE, sizeof (mapped_regs_t));
-
-	BLANK();
-	DEFINE(IA64_MCA_CPU_INIT_STACK_OFFSET, offsetof (struct ia64_mca_cpu, init_stack));
-
-	BLANK();
-	DEFINE(VCPU_VTM_OFFSET_OFS, offsetof(struct vcpu, arch.arch_vmx.vtm.vtm_offset));
-	DEFINE(VCPU_VTM_LAST_ITC_OFS, offsetof(struct vcpu, arch.arch_vmx.vtm.last_itc));
-	DEFINE(VCPU_VRR0_OFS, offsetof(struct vcpu, arch.arch_vmx.vrr[0]));
-	DEFINE(VCPU_ITR0_OFS, offsetof(struct vcpu, arch.itrs[0]));
-	DEFINE(VCPU_CALLBACK_OFS, offsetof(struct vcpu, arch.event_callback_ip));
-#ifdef   VTI_DEBUG
-	DEFINE(IVT_CUR_OFS, offsetof(struct vcpu, arch.arch_vmx.ivt_current));
-	DEFINE(IVT_DBG_OFS, offsetof(struct vcpu, arch.arch_vmx.ivt_debug));
-	DEFINE(IVT_DEBUG_SIZE, sizeof(struct ivt_debug));
-#endif
-	DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
-	DEFINE(TI_PRE_COUNT, offsetof(struct thread_info, preempt_count));
-
-	BLANK();
-
-	DEFINE(IA64_TASK_THREAD_KSP_OFFSET, offsetof (struct vcpu, arch._thread.ksp));
-	DEFINE(IA64_TASK_THREAD_ON_USTACK_OFFSET, offsetof (struct vcpu, arch._thread.on_ustack));
-
-	DEFINE(IA64_VCPU_HYPERCALL_CONTINUATION_OFS, offsetof (struct vcpu, arch.hypercall_continuation));
-	DEFINE(IA64_VCPU_FP_PSR_OFFSET, offsetof (struct vcpu, arch.fp_psr));
-	DEFINE(IA64_VCPU_META_RID_DT_OFFSET, offsetof (struct vcpu, arch.metaphysical_rid_dt));
-	DEFINE(IA64_VCPU_META_RID_D_OFFSET, offsetof (struct vcpu, arch.metaphysical_rid_d));
-	DEFINE(IA64_VCPU_META_SAVED_RR0_OFFSET, offsetof (struct vcpu, arch.metaphysical_saved_rr0));
-	DEFINE(IA64_VCPU_BREAKIMM_OFFSET, offsetof (struct vcpu, arch.breakimm));
-	DEFINE(IA64_VCPU_IVA_OFFSET, offsetof (struct vcpu, arch.iva));
-	DEFINE(IA64_VCPU_EVENT_CALLBACK_IP_OFFSET, offsetof (struct vcpu, arch.event_callback_ip));
-	DEFINE(IA64_VCPU_IRR0_OFFSET, offsetof (struct vcpu, arch.irr[0]));
-	DEFINE(IA64_VCPU_IRR3_OFFSET, offsetof (struct vcpu, arch.irr[3]));
-	DEFINE(IA64_VCPU_INSVC3_OFFSET, offsetof (struct vcpu, arch.insvc[3]));
-	DEFINE(IA64_VCPU_STARTING_RID_OFFSET, offsetof (struct vcpu, arch.starting_rid));
-	DEFINE(IA64_VCPU_ENDING_RID_OFFSET, offsetof (struct vcpu, arch.ending_rid));
-	DEFINE(IA64_VCPU_RID_BITS_OFFSET, offsetof (struct vcpu, arch.rid_bits));
-	DEFINE(IA64_VCPU_DOMAIN_ITM_OFFSET, offsetof (struct vcpu, arch.domain_itm));
-	DEFINE(IA64_VCPU_DOMAIN_ITM_LAST_OFFSET, offsetof (struct vcpu, arch.domain_itm_last));
-	DEFINE(IA64_VCPU_ITLB_OFFSET, offsetof (struct vcpu, arch.itlb));
-	DEFINE(IA64_VCPU_DTLB_OFFSET, offsetof (struct vcpu, arch.dtlb));
-	DEFINE(IA64_VCPU_VHPT_PG_SHIFT_OFFSET, offsetof (struct vcpu, arch.vhpt_pg_shift));
-
-	BLANK();
-
-	DEFINE(IA64_VCPU_SHADOW_BITMAP_OFFSET, offsetof (struct vcpu, arch.shadow_bitmap));
-
-	BLANK();
-
-	DEFINE(IA64_CPUINFO_ITM_NEXT_OFFSET, offsetof (struct cpuinfo_ia64, itm_next));
-	DEFINE(IA64_CPUINFO_KSOFTIRQD_OFFSET, offsetof (struct cpuinfo_ia64, ksoftirqd));
-
-
-	BLANK();
-
-	DEFINE(IA64_PT_REGS_B6_OFFSET, offsetof (struct pt_regs, b6));
-	DEFINE(IA64_PT_REGS_B7_OFFSET, offsetof (struct pt_regs, b7));
-	DEFINE(IA64_PT_REGS_AR_CSD_OFFSET, offsetof (struct pt_regs, ar_csd));
-	DEFINE(IA64_PT_REGS_AR_SSD_OFFSET, offsetof (struct pt_regs, ar_ssd));
-	DEFINE(IA64_PT_REGS_R8_OFFSET, offsetof (struct pt_regs, r8));
-	DEFINE(IA64_PT_REGS_R9_OFFSET, offsetof (struct pt_regs, r9));
-	DEFINE(IA64_PT_REGS_R10_OFFSET, offsetof (struct pt_regs, r10));
-	DEFINE(IA64_PT_REGS_R11_OFFSET, offsetof (struct pt_regs, r11));
-	DEFINE(IA64_PT_REGS_CR_IPSR_OFFSET, offsetof (struct pt_regs, cr_ipsr));
-	DEFINE(IA64_PT_REGS_CR_IIP_OFFSET, offsetof (struct pt_regs, cr_iip));
-	DEFINE(IA64_PT_REGS_CR_IFS_OFFSET, offsetof (struct pt_regs, cr_ifs));
-	DEFINE(IA64_PT_REGS_AR_UNAT_OFFSET, offsetof (struct pt_regs, ar_unat));
-	DEFINE(IA64_PT_REGS_AR_PFS_OFFSET, offsetof (struct pt_regs, ar_pfs));
-	DEFINE(IA64_PT_REGS_AR_RSC_OFFSET, offsetof (struct pt_regs, ar_rsc));
-	DEFINE(IA64_PT_REGS_AR_RNAT_OFFSET, offsetof (struct pt_regs, ar_rnat));
-
-	DEFINE(IA64_PT_REGS_AR_BSPSTORE_OFFSET, offsetof (struct pt_regs, ar_bspstore));
-	DEFINE(IA64_PT_REGS_PR_OFFSET, offsetof (struct pt_regs, pr));
-	DEFINE(IA64_PT_REGS_B0_OFFSET, offsetof (struct pt_regs, b0));
-	DEFINE(IA64_PT_REGS_LOADRS_OFFSET, offsetof (struct pt_regs, loadrs));
-	DEFINE(IA64_PT_REGS_R1_OFFSET, offsetof (struct pt_regs, r1));
-	DEFINE(IA64_PT_REGS_R12_OFFSET, offsetof (struct pt_regs, r12));
-	DEFINE(IA64_PT_REGS_R13_OFFSET, offsetof (struct pt_regs, r13));
-	DEFINE(IA64_PT_REGS_AR_FPSR_OFFSET, offsetof (struct pt_regs, ar_fpsr));
-	DEFINE(IA64_PT_REGS_R15_OFFSET, offsetof (struct pt_regs, r15));
-	DEFINE(IA64_PT_REGS_R14_OFFSET, offsetof (struct pt_regs, r14));
-	DEFINE(IA64_PT_REGS_R2_OFFSET, offsetof (struct pt_regs, r2));
-	DEFINE(IA64_PT_REGS_R3_OFFSET, offsetof (struct pt_regs, r3));
-	DEFINE(IA64_PT_REGS_R16_OFFSET, offsetof (struct pt_regs, r16));
-	DEFINE(IA64_PT_REGS_R17_OFFSET, offsetof (struct pt_regs, r17));
-	DEFINE(IA64_PT_REGS_R18_OFFSET, offsetof (struct pt_regs, r18));
-	DEFINE(IA64_PT_REGS_R19_OFFSET, offsetof (struct pt_regs, r19));
-	DEFINE(IA64_PT_REGS_R20_OFFSET, offsetof (struct pt_regs, r20));
-	DEFINE(IA64_PT_REGS_R21_OFFSET, offsetof (struct pt_regs, r21));
-	DEFINE(IA64_PT_REGS_R22_OFFSET, offsetof (struct pt_regs, r22));
-	DEFINE(IA64_PT_REGS_R23_OFFSET, offsetof (struct pt_regs, r23));
-	DEFINE(IA64_PT_REGS_R24_OFFSET, offsetof (struct pt_regs, r24));
-	DEFINE(IA64_PT_REGS_R25_OFFSET, offsetof (struct pt_regs, r25));
-	DEFINE(IA64_PT_REGS_R26_OFFSET, offsetof (struct pt_regs, r26));
-	DEFINE(IA64_PT_REGS_R27_OFFSET, offsetof (struct pt_regs, r27));
-	DEFINE(IA64_PT_REGS_R28_OFFSET, offsetof (struct pt_regs, r28));
-	DEFINE(IA64_PT_REGS_R29_OFFSET, offsetof (struct pt_regs, r29));
-	DEFINE(IA64_PT_REGS_R30_OFFSET, offsetof (struct pt_regs, r30));
-	DEFINE(IA64_PT_REGS_R31_OFFSET, offsetof (struct pt_regs, r31));
-	DEFINE(IA64_PT_REGS_AR_CCV_OFFSET, offsetof (struct pt_regs, ar_ccv));
-	DEFINE(IA64_PT_REGS_F6_OFFSET, offsetof (struct pt_regs, f6));
-	DEFINE(IA64_PT_REGS_F7_OFFSET, offsetof (struct pt_regs, f7));
-	DEFINE(IA64_PT_REGS_F8_OFFSET, offsetof (struct pt_regs, f8));
-	DEFINE(IA64_PT_REGS_F9_OFFSET, offsetof (struct pt_regs, f9));
-	DEFINE(IA64_PT_REGS_F10_OFFSET, offsetof (struct pt_regs, f10));
-	DEFINE(IA64_PT_REGS_F11_OFFSET, offsetof (struct pt_regs, f11));
-	DEFINE(IA64_PT_REGS_R4_OFFSET, offsetof (struct pt_regs, r4));
-	DEFINE(IA64_PT_REGS_R5_OFFSET, offsetof (struct pt_regs, r5));
-	DEFINE(IA64_PT_REGS_R6_OFFSET, offsetof (struct pt_regs, r6));
-	DEFINE(IA64_PT_REGS_R7_OFFSET, offsetof (struct pt_regs, r7));
-	DEFINE(IA64_PT_REGS_EML_UNAT_OFFSET, offsetof (struct pt_regs, eml_unat));
-	DEFINE(IA64_VCPU_IIPA_OFFSET, offsetof (struct vcpu, arch.arch_vmx.cr_iipa));
-	DEFINE(IA64_VCPU_ISR_OFFSET, offsetof (struct vcpu, arch.arch_vmx.cr_isr));
-	DEFINE(IA64_VCPU_CAUSE_OFFSET, offsetof (struct vcpu, arch.arch_vmx.cause));
-	DEFINE(IA64_VCPU_OPCODE_OFFSET, offsetof (struct vcpu, arch.arch_vmx.opcode));
-	DEFINE(SWITCH_MPTA_OFFSET,offsetof(struct vcpu ,arch.arch_vmx.mpta));
-	DEFINE(IA64_PT_REGS_R16_SLOT, (((offsetof(struct pt_regs, r16)-sizeof(struct pt_regs))>>3)&0x3f));
-	DEFINE(IA64_PT_REGS_R2_SLOT, (((offsetof(struct pt_regs, r16)-sizeof(struct pt_regs))>>3)&0x3f));
-	DEFINE(IA64_PT_REGS_R8_SLOT, (((offsetof(struct pt_regs, r16)-sizeof(struct pt_regs))>>3)&0x3f));
-	DEFINE(IA64_VCPU_FLAGS_OFFSET,offsetof(struct vcpu ,arch.arch_vmx.flags));
-	DEFINE(IA64_VCPU_MMU_MODE_OFFSET,offsetof(struct vcpu, arch.arch_vmx.mmu_mode));
-
-	BLANK();
-
-	DEFINE(IA64_SWITCH_STACK_CALLER_UNAT_OFFSET, offsetof (struct switch_stack, caller_unat));
-	DEFINE(IA64_SWITCH_STACK_AR_FPSR_OFFSET, offsetof (struct switch_stack, ar_fpsr));
-	DEFINE(IA64_SWITCH_STACK_F2_OFFSET, offsetof (struct switch_stack, f2));
-	DEFINE(IA64_SWITCH_STACK_F3_OFFSET, offsetof (struct switch_stack, f3));
-	DEFINE(IA64_SWITCH_STACK_F4_OFFSET, offsetof (struct switch_stack, f4));
-	DEFINE(IA64_SWITCH_STACK_F5_OFFSET, offsetof (struct switch_stack, f5));
-	DEFINE(IA64_SWITCH_STACK_F12_OFFSET, offsetof (struct switch_stack, f12));
-	DEFINE(IA64_SWITCH_STACK_F13_OFFSET, offsetof (struct switch_stack, f13));
-	DEFINE(IA64_SWITCH_STACK_F14_OFFSET, offsetof (struct switch_stack, f14));
-	DEFINE(IA64_SWITCH_STACK_F15_OFFSET, offsetof (struct switch_stack, f15));
-	DEFINE(IA64_SWITCH_STACK_F16_OFFSET, offsetof (struct switch_stack, f16));
-	DEFINE(IA64_SWITCH_STACK_F17_OFFSET, offsetof (struct switch_stack, f17));
-	DEFINE(IA64_SWITCH_STACK_F18_OFFSET, offsetof (struct switch_stack, f18));
-	DEFINE(IA64_SWITCH_STACK_F19_OFFSET, offsetof (struct switch_stack, f19));
-	DEFINE(IA64_SWITCH_STACK_F20_OFFSET, offsetof (struct switch_stack, f20));
-	DEFINE(IA64_SWITCH_STACK_F21_OFFSET, offsetof (struct switch_stack, f21));
-	DEFINE(IA64_SWITCH_STACK_F22_OFFSET, offsetof (struct switch_stack, f22));
-	DEFINE(IA64_SWITCH_STACK_F23_OFFSET, offsetof (struct switch_stack, f23));
-	DEFINE(IA64_SWITCH_STACK_F24_OFFSET, offsetof (struct switch_stack, f24));
-	DEFINE(IA64_SWITCH_STACK_F25_OFFSET, offsetof (struct switch_stack, f25));
-	DEFINE(IA64_SWITCH_STACK_F26_OFFSET, offsetof (struct switch_stack, f26));
-	DEFINE(IA64_SWITCH_STACK_F27_OFFSET, offsetof (struct switch_stack, f27));
-	DEFINE(IA64_SWITCH_STACK_F28_OFFSET, offsetof (struct switch_stack, f28));
-	DEFINE(IA64_SWITCH_STACK_F29_OFFSET, offsetof (struct switch_stack, f29));
-	DEFINE(IA64_SWITCH_STACK_F30_OFFSET, offsetof (struct switch_stack, f30));
-	DEFINE(IA64_SWITCH_STACK_F31_OFFSET, offsetof (struct switch_stack, f31));
-	DEFINE(IA64_SWITCH_STACK_R4_OFFSET, offsetof (struct switch_stack, r4));
-	DEFINE(IA64_SWITCH_STACK_R5_OFFSET, offsetof (struct switch_stack, r5));
-	DEFINE(IA64_SWITCH_STACK_R6_OFFSET, offsetof (struct switch_stack, r6));
-	DEFINE(IA64_SWITCH_STACK_R7_OFFSET, offsetof (struct switch_stack, r7));
-	DEFINE(IA64_SWITCH_STACK_B0_OFFSET, offsetof (struct switch_stack, b0));
-	DEFINE(IA64_SWITCH_STACK_B1_OFFSET, offsetof (struct switch_stack, b1));
-	DEFINE(IA64_SWITCH_STACK_B2_OFFSET, offsetof (struct switch_stack, b2));
-	DEFINE(IA64_SWITCH_STACK_B3_OFFSET, offsetof (struct switch_stack, b3));
-	DEFINE(IA64_SWITCH_STACK_B4_OFFSET, offsetof (struct switch_stack, b4));
-	DEFINE(IA64_SWITCH_STACK_B5_OFFSET, offsetof (struct switch_stack, b5));
-	DEFINE(IA64_SWITCH_STACK_AR_PFS_OFFSET, offsetof (struct switch_stack, ar_pfs));
-	DEFINE(IA64_SWITCH_STACK_AR_LC_OFFSET, offsetof (struct switch_stack, ar_lc));
-	DEFINE(IA64_SWITCH_STACK_AR_UNAT_OFFSET, offsetof (struct switch_stack, ar_unat));
-	DEFINE(IA64_SWITCH_STACK_AR_RNAT_OFFSET, offsetof (struct switch_stack, ar_rnat));
-	DEFINE(IA64_SWITCH_STACK_AR_BSPSTORE_OFFSET, offsetof (struct switch_stack, ar_bspstore));
-	DEFINE(IA64_SWITCH_STACK_PR_OFFSET, offsetof (struct switch_stack, pr));
-
-	BLANK();
-
-	DEFINE(IA64_VPD_BASE_OFFSET, offsetof (struct vcpu, arch.privregs));
-	DEFINE(IA64_VPD_VIFS_OFFSET, offsetof (mapped_regs_t, ifs));
-	DEFINE(IA64_VPD_VHPI_OFFSET, offsetof (mapped_regs_t, vhpi));
-	DEFINE(IA64_VPD_VB1REG_OFFSET, offsetof (mapped_regs_t, bank1_regs[0]));
-	DEFINE(IA64_VPD_VB0REG_OFFSET, offsetof (mapped_regs_t, bank0_regs[0]));
-	DEFINE(IA64_VPD_VB1NAT_OFFSET, offsetof (mapped_regs_t, vnat));
-	DEFINE(IA64_VPD_VB0NAT_OFFSET, offsetof (mapped_regs_t, vbnat));
- 	DEFINE(IA64_VLSAPIC_INSVC_BASE_OFFSET, offsetof (struct vcpu, arch.insvc[0]));
-	DEFINE(IA64_VPD_VPTA_OFFSET, offsetof (struct mapped_regs, pta));
-	DEFINE(XXX_THASH_SIZE, sizeof (thash_data_t));
-
-	BLANK();
-	DEFINE(IA64_CPUINFO_NSEC_PER_CYC_OFFSET, offsetof (struct cpuinfo_ia64, nsec_per_cyc));
-	DEFINE(IA64_CPUINFO_PTCE_BASE_OFFSET, offsetof (struct cpuinfo_ia64, ptce_base));
-	DEFINE(IA64_CPUINFO_PTCE_COUNT_OFFSET, offsetof (struct cpuinfo_ia64, ptce_count));
-	DEFINE(IA64_TIMESPEC_TV_NSEC_OFFSET, offsetof (struct timespec, tv_nsec));
-
-
-	DEFINE(CLONE_IDLETASK_BIT, 12);
-	DEFINE(CLONE_SETTLS_BIT, 19);
-	DEFINE(IA64_CPUINFO_NSEC_PER_CYC_OFFSET, offsetof (struct cpuinfo_ia64, nsec_per_cyc));
-
-	BLANK();
-	DEFINE(IA64_KR_CURRENT_OFFSET, offsetof (cpu_kr_ia64_t, _kr[IA64_KR_CURRENT]));
-	DEFINE(IA64_KR_PT_BASE_OFFSET, offsetof (cpu_kr_ia64_t, _kr[IA64_KR_PT_BASE]));
-	DEFINE(IA64_KR_IO_BASE_OFFSET, offsetof (cpu_kr_ia64_t, _kr[IA64_KR_IO_BASE]));
-	DEFINE(IA64_KR_PERCPU_DATA_OFFSET, offsetof (cpu_kr_ia64_t, _kr[IA64_KR_PER_CPU_DATA]));
-	DEFINE(IA64_KR_IO_BASE_OFFSET, offsetof (cpu_kr_ia64_t, _kr[IA64_KR_IO_BASE]));
-	DEFINE(IA64_KR_CURRENT_STACK_OFFSET, offsetof (cpu_kr_ia64_t, _kr[IA64_KR_CURRENT_STACK]));
-
-#ifdef PERF_COUNTERS
-	BLANK();
-	DEFINE(IA64_PERFC_recover_to_page_fault, PERFC_recover_to_page_fault);
-	DEFINE(IA64_PERFC_recover_to_break_fault, PERFC_recover_to_break_fault);
-	DEFINE(IA64_PERFC_fast_vhpt_translate, PERFC_fast_vhpt_translate);
-	DEFINE(IA64_PERFC_fast_hyperprivop, PERFC_fast_hyperprivop);
-	DEFINE(IA64_PERFC_fast_reflect, PERFC_fast_reflect);
-#endif
-
-	BLANK();
-	DEFINE(IA64_CPUINFO_PTCE_BASE_OFFSET,
-	       offsetof(struct cpuinfo_ia64, ptce_base));
-	DEFINE(IA64_CPUINFO_PTCE_COUNT_OFFSET,
-	       offsetof(struct cpuinfo_ia64, ptce_count));
-	DEFINE(IA64_CPUINFO_PTCE_STRIDE_OFFSET,
-	       offsetof(struct cpuinfo_ia64, ptce_stride));
-
-	BLANK();
-	DEFINE(IA64_MCA_CPU_PROC_STATE_DUMP_OFFSET,
-	       offsetof(struct ia64_mca_cpu, proc_state_dump));
-	DEFINE(IA64_MCA_CPU_STACK_OFFSET,
-	       offsetof(struct ia64_mca_cpu, stack));
-	DEFINE(IA64_MCA_CPU_STACKFRAME_OFFSET,
-	       offsetof(struct ia64_mca_cpu, stackframe));
-	DEFINE(IA64_MCA_CPU_RBSTORE_OFFSET,
-	       offsetof(struct ia64_mca_cpu, rbstore));
-
-#if VHPT_ENABLED
-	DEFINE(IA64_VCPU_VHPT_PAGE_OFFSET,
-	       offsetof(struct vcpu, arch.vhpt_page));
-	DEFINE(IA64_VCPU_VHPT_MADDR_OFFSET,
-	       offsetof(struct vcpu, arch.vhpt_maddr));
-#endif
-
-	BLANK();
-	DEFINE(IA64_MCA_TLB_INFO_SIZE, sizeof(struct ia64_mca_tlb_info));
-	DEFINE(IA64_MCA_PERCPU_OFFSET,
-	       offsetof(struct ia64_mca_tlb_info, percpu_paddr));
-}
diff -r 2386288b1bf1 -r 8aa1697d57e4 xen/arch/ia64/asm-xsi-offsets.c
--- a/xen/arch/ia64/asm-xsi-offsets.c	Mon Apr 02 18:14:31 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-/* -*-  Mode:C; c-basic-offset:4; tab-width:4; indent-tabs-mode:nil -*- */
-/*
- * asm-xsi-offsets.c_
- * Copyright (c) 2005, Intel Corporation.
- *      Kun Tian (Kevin Tian) <kevin.tian@intel.com>
- *      Eddie Dong  <eddie.dong@intel.com>
- *      Fred Yang <fred.yang@intel.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
- * Place - Suite 330, Boston, MA 02111-1307 USA.
- *
- */
-
-/*
- * Generate definitions needed by assembly language modules.
- * This code generates raw asm output which is post-processed
- * to extract and format the required data.
- */
-
-#include <xen/config.h>
-#include <xen/sched.h>
-#include <asm/processor.h>
-#include <asm/ptrace.h>
-#include <public/xen.h>
-#include <asm/tlb.h>
-#include <asm/regs.h>
-
-#define task_struct vcpu
-
-#define DEFINE(sym, val) \
-        asm volatile("\n->" #sym " (%0) " #val : : "i" (val))
-
-#define BLANK() asm volatile("\n->" : : )
-
-#define DEFINE_MAPPED_REG_OFS(sym, field) \
-	DEFINE(sym, (XMAPPEDREGS_OFS + offsetof(mapped_regs_t, field)))
-
-void foo(void)
-{
-	DEFINE_MAPPED_REG_OFS(XSI_PSR_I_ADDR_OFS, interrupt_mask_addr);
-	DEFINE_MAPPED_REG_OFS(XSI_IPSR_OFS, ipsr);
-	DEFINE_MAPPED_REG_OFS(XSI_IIP_OFS, iip);
-	DEFINE_MAPPED_REG_OFS(XSI_IFS_OFS, ifs);
-	DEFINE_MAPPED_REG_OFS(XSI_PRECOVER_IFS_OFS, precover_ifs);
-	DEFINE_MAPPED_REG_OFS(XSI_ISR_OFS, isr);
-	DEFINE_MAPPED_REG_OFS(XSI_IFA_OFS, ifa);
-	DEFINE_MAPPED_REG_OFS(XSI_IIPA_OFS, iipa);
-	DEFINE_MAPPED_REG_OFS(XSI_IIM_OFS, iim);
-	DEFINE_MAPPED_REG_OFS(XSI_TPR_OFS, tpr);
-	DEFINE_MAPPED_REG_OFS(XSI_IHA_OFS, iha);
-	DEFINE_MAPPED_REG_OFS(XSI_ITIR_OFS, itir);
-	DEFINE_MAPPED_REG_OFS(XSI_ITV_OFS, itv);
-	DEFINE_MAPPED_REG_OFS(XSI_PTA_OFS, pta);
-	DEFINE_MAPPED_REG_OFS(XSI_VPSR_DFH_OFS, vpsr_dfh);
-	DEFINE_MAPPED_REG_OFS(XSI_HPSR_DFH_OFS, hpsr_dfh);
-	DEFINE_MAPPED_REG_OFS(XSI_PSR_IC_OFS, interrupt_collection_enabled);
-	DEFINE_MAPPED_REG_OFS(XSI_VPSR_PP_OFS, vpsr_pp);
-	DEFINE_MAPPED_REG_OFS(XSI_METAPHYS_OFS, metaphysical_mode);
-	DEFINE_MAPPED_REG_OFS(XSI_BANKNUM_OFS, banknum);
-	DEFINE_MAPPED_REG_OFS(XSI_BANK0_R16_OFS, bank0_regs[0]);
-	DEFINE_MAPPED_REG_OFS(XSI_BANK1_R16_OFS, bank1_regs[0]);
-	DEFINE_MAPPED_REG_OFS(XSI_B0NATS_OFS, vbnat);
-	DEFINE_MAPPED_REG_OFS(XSI_B1NATS_OFS, vnat);
-	DEFINE_MAPPED_REG_OFS(XSI_RR0_OFS, rrs[0]);
-	DEFINE_MAPPED_REG_OFS(XSI_KR0_OFS, krs[0]);
-}
diff -r 2386288b1bf1 -r 8aa1697d57e4 xen/arch/ia64/linux-xen/Makefile
--- a/xen/arch/ia64/linux-xen/Makefile	Mon Apr 02 18:14:31 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-subdir-y += sn
-
-obj-y += cmdline.o
-obj-y += efi.o
-obj-y += entry.o
-obj-y += irq_ia64.o
-obj-y += mca.o
-obj-y += mca_asm.o
-obj-y += mm_contig.o
-obj-y += process-linux-xen.o
-obj-y += sal.o
-obj-y += setup.o
-obj-y += smpboot.o
-obj-y += smp.o
-obj-y += time.o
-obj-y += tlb.o
-obj-y += unaligned.o
-obj-y += unwind.o
-obj-y += iosapic.o
-obj-y += numa.o
-obj-y += perfmon.o
-obj-y += perfmon_default_smpl.o
-obj-y += acpi.o
-obj-y += acpi_numa.o
diff -r 2386288b1bf1 -r 8aa1697d57e4 xen/arch/ia64/linux-xen/README.origin
--- a/xen/arch/ia64/linux-xen/README.origin	Mon Apr 02 18:14:31 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-# Source files in this directory are near-identical copies of linux-2.6.13
-# files:
-
-# NOTE: ALL changes to these files should be clearly marked
-# (e.g. with #ifdef XEN or XEN in a comment) so that they can be
-# easily updated to future versions of the corresponding Linux files.
-
-cmdline.c		-> linux/lib/cmdline.c
-entry.h			-> linux/arch/ia64/kernel/entry.h
-entry.S			-> linux/arch/ia64/kernel/entry.S
-head.S			-> linux/arch/ia64/kernel/head.S
-hpsim_ssc.h		-> linux/arch/ia64/hp/sim/hpsim_ssc.h
-irq_ia64.c		-> linux/arch/ia64/kernel/irq_ia64.c
-mca.c			-> linux/arch/ia64/kernel/mca.c
-mca_asm.S		-> linux/arch/ia64/kernel/mca_asm.S
-minstate.h		-> linux/arch/ia64/kernel/minstate.h
-mm_contig.c		-> linux/arch/ia64/mm/contig.c
-numa.c			-> linux/arch/ia64/kernel/numa.c
-process-linux-xen.c	-> linux/arch/ia64/kernel/process.c
-sal.c			-> linux/arch/ia64/kernel/sal.c
-setup.c			-> linux/arch/ia64/kernel/setup.c
-smp.c			-> linux/arch/ia64/kernel/smp.c
-smpboot.c		-> linux/arch/ia64/kernel/smpboot.c
-time.c			-> linux/arch/ia64/kernel/time.c
-tlb.c			-> linux/arch/ia64/mm/tlb.c
-unaligned.c		-> linux/arch/ia64/kernel/unaligned.c
-unwind.c		-> linux/arch/ia64/kernel/unwind.c
-unwind_decoder.c	-> linux/arch/ia64/kernel/unwind_decoder.c
-unwind_i.h		-> linux/arch/ia64/kernel/unwind_i.h
-
-# The files below are from Linux-2.6.16
-iosapic.c		-> linux/arch/ia64/kernel/iosapic.c
-
-# The files below are from Linux-2.6.16.33
-perfmon.c		-> linux/arch/kernel/perfmon.c
-perfmon_default_smpl.c	-> linux/arch/kernel/perfmon_default_smpl.c
-perfmon_generic.h	-> linux/arch/kernel/perfmon_generic.h
-perfmon_itanium.h	-> linux/arch/kernel/perfmon_itanium.h
-perfmon_mckinley.h	-> linux/arch/kernel/perfmon_mckinley.h
-perfmon_montecito.h	-> linux/arch/kernel/perfmon_montecito.h
-
-# The files below are from Linux-2.6.21
-efi.c			-> linux/arch/ia64/kernel/efi.c
-
-# The files below are from Linux-2.6.26-rc5
-acpi.c			-> linux/arch/ia64/kernel/acpi.c
-acpi_numa.c		-> linux/drivers/acpi/numa.c
\ No newline at end of file
diff -r 2386288b1bf1 -r 8aa1697d57e4 xen/arch/ia64/linux-xen/acpi.c
--- a/xen/arch/ia64/linux-xen/acpi.c	Mon Apr 02 18:14:31 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1098 +0,0 @@
-/*
- *  acpi.c - Architecture-Specific Low-Level ACPI Support
- *
- *  Copyright (C) 1999 VA Linux Systems
- *  Copyright (C) 1999,2000 Walt Drummond <drummond@valinux.com>
- *  Copyright (C) 2000, 2002-2003 Hewlett-Packard Co.
- *	David Mosberger-Tang <davidm@hpl.hp.com>
- *  Copyright (C) 2000 Intel Corp.
- *  Copyright (C) 2000,2001 J.I. Lee <jung-ik.lee@intel.com>
- *  Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
- *  Copyright (C) 2001 Jenna Hall <jenna.s.hall@intel.com>
- *  Copyright (C) 2001 Takayoshi Kochi <t-kochi@bq.jp.nec.com>
- *  Copyright (C) 2002 Erich Focht <efocht@ess.nec.de>
- *  Copyright (C) 2004 Ashok Raj <ashok.raj@intel.com>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/smp.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/irq.h>
-#include <linux/acpi.h>
-#include <linux/efi.h>
-#include <linux/mmzone.h>
-#include <linux/nodemask.h>
-#include <asm/io.h>
-#include <asm/iosapic.h>
-#include <asm/machvec.h>
-#include <asm/page.h>
-#include <asm/system.h>
-#include <asm/numa.h>
-#include <asm/sal.h>
-#include <asm/cyclone.h>
-#include <asm/xen/hypervisor.h>
-#ifdef XEN
-#include <asm/hw_irq.h>
-#include <asm/numa.h>
-extern u8 numa_slit[MAX_NUMNODES * MAX_NUMNODES];
-#endif
-
-
-#define BAD_MADT_ENTRY(entry, end) (                                        \
-		(!entry) || (unsigned long)entry + sizeof(*entry) > end ||  \
-		((struct acpi_subtable_header *)entry)->length < sizeof(*entry))
-
-#define PREFIX			"ACPI: "
-
-void (*pm_idle) (void) __read_mostly;
-EXPORT_SYMBOL(pm_idle);
-void (*pm_power_off) (void) __read_mostly;
-EXPORT_SYMBOL(pm_power_off);
-
-unsigned int acpi_cpei_override;
-unsigned int acpi_cpei_phys_cpuid;
-
-unsigned long acpi_wakeup_address = 0;
-
-#ifdef CONFIG_IA64_GENERIC
-static unsigned long __init acpi_find_rsdp(void)
-{
-	unsigned long rsdp_phys = 0;
-
-	if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
-		rsdp_phys = efi.acpi20;
-	else if (efi.acpi != EFI_INVALID_TABLE_ADDR)
-		printk(KERN_WARNING PREFIX
-		       "v1.0/r0.71 tables no longer supported\n");
-	return rsdp_phys;
-}
-#endif
-
-const char __init *
-acpi_get_sysname(void)
-{
-#ifdef CONFIG_IA64_GENERIC
-	unsigned long rsdp_phys;
-	struct acpi_table_rsdp *rsdp;
-	struct acpi_table_xsdt *xsdt;
-	struct acpi_table_header *hdr;
-
-	rsdp_phys = acpi_find_rsdp();
-	if (!rsdp_phys) {
-		printk(KERN_ERR
-		       "ACPI 2.0 RSDP not found, default to \"dig\"\n");
-		return "dig";
-	}
-
-	rsdp = (struct acpi_table_rsdp *)__va(rsdp_phys);
-	if (strncmp(rsdp->signature, ACPI_SIG_RSDP, sizeof(ACPI_SIG_RSDP) - 1)) {
-		printk(KERN_ERR
-		       "ACPI 2.0 RSDP signature incorrect, default to \"dig\"\n");
-		return "dig";
-	}
-
-	xsdt = (struct acpi_table_xsdt *)__va(rsdp->xsdt_physical_address);
-	hdr = &xsdt->header;
-	if (strncmp(hdr->signature, ACPI_SIG_XSDT, sizeof(ACPI_SIG_XSDT) - 1)) {
-		printk(KERN_ERR
-		       "ACPI 2.0 XSDT signature incorrect, default to \"dig\"\n");
-		return "dig";
-	}
-
-	if (!strcmp(hdr->oem_id, "HP")) {
-		return "hpzx1";
-	} else if (!strcmp(hdr->oem_id, "SGI")) {
-		if (!strcmp(hdr->oem_table_id + 4, "UV"))
-			return "uv";
-		else
-			return "sn2";
-#ifndef XEN
-	} else if (is_running_on_xen() && !strcmp(hdr->oem_id, "XEN")) {
-		return "xen";
-#endif
-	}
-
-	return "dig";
-#else
-# if defined (CONFIG_IA64_HP_SIM)
-	return "hpsim";
-# elif defined (CONFIG_IA64_HP_ZX1)
-	return "hpzx1";
-# elif defined (CONFIG_IA64_HP_ZX1_SWIOTLB)
-	return "hpzx1_swiotlb";
-# elif defined (CONFIG_IA64_SGI_SN2)
-	return "sn2";
-# elif defined (CONFIG_IA64_SGI_UV)
-	return "uv";
-# elif defined (CONFIG_IA64_DIG)
-	return "dig";
-# elif defined (CONFIG_IA64_XEN)
-	return "xen";
-# else
-#	error Unknown platform.  Fix acpi.c.
-# endif
-#endif
-}
-
-#ifdef CONFIG_ACPI
-
-#define ACPI_MAX_PLATFORM_INTERRUPTS	256
-
-/* Array to record platform interrupt vectors for generic interrupt routing. */
-int platform_intr_list[ACPI_MAX_PLATFORM_INTERRUPTS] = {
-	[0 ... ACPI_MAX_PLATFORM_INTERRUPTS - 1] = -1
-};
-
-/*
- * Interrupt routing API for device drivers.  Provides interrupt vector for
- * a generic platform event.  Currently only CPEI is implemented.
- */
-int acpi_request_vector(u32 int_type)
-{
-	int vector = -1;
-
-	if (int_type < ACPI_MAX_PLATFORM_INTERRUPTS) {
-		/* corrected platform error interrupt */
-		vector = platform_intr_list[int_type];
-	} else
-		printk(KERN_ERR
-		       "acpi_request_vector(): invalid interrupt type\n");
-	return vector;
-}
-
-char *__init __acpi_map_table(unsigned long phys_addr, unsigned long size)
-{
-	return __va(phys_addr);
-}
-
-/* --------------------------------------------------------------------------
-                            Boot-time Table Parsing
-   -------------------------------------------------------------------------- */
-
-static int total_cpus __initdata;
-static int available_cpus __initdata;
-struct acpi_table_madt *acpi_madt __initdata;
-static u8 has_8259;
-
-static int __init
-acpi_parse_lapic_addr_ovr(struct acpi_subtable_header * header,
-			  const unsigned long end)
-{
-	struct acpi_madt_local_apic_override *lapic;
-
-	lapic = (struct acpi_madt_local_apic_override *)header;
-
-	if (BAD_MADT_ENTRY(lapic, end))
-		return -EINVAL;
-
-	if (lapic->address) {
-		iounmap(ipi_base_addr);
-		ipi_base_addr = ioremap(lapic->address, 0);
-	}
-	return 0;
-}
-
-#ifdef XEN
-
-#define MAX_LOCAL_SAPIC 255
-static u16 ia64_acpiid_to_sapicid[ MAX_LOCAL_SAPIC ] =
-		{[0 ... MAX_LOCAL_SAPIC - 1] = 0xffff };
-
-/* acpi id to cpu id */
-int get_cpu_id(u32 acpi_id)
-{
-	int i;
-	u16 apic_id;
-
-	if ( acpi_id >= MAX_LOCAL_SAPIC )
-		return -EINVAL;
-
-	apic_id = ia64_acpiid_to_sapicid[acpi_id];
-	if ( apic_id == 0xffff )
-		return -EINVAL;
-
-	for ( i = 0; i < NR_CPUS; i++ )
-	{
-		if ( apic_id == ia64_cpu_to_sapicid[i] )
-			return i;
-	}
-
-	return -1;
-}
-
-int arch_acpi_set_pdc_bits(u32 acpi_id, u32 *pdc, u32 mask)
-{
-	pdc[2] |= ACPI_PDC_EST_CAPABILITY_SMP & mask;
-	return 0;
-}
-
-#endif
-
-static int __init
-acpi_parse_lsapic(struct acpi_subtable_header * header, const unsigned long end)
-{
-	struct acpi_madt_local_sapic *lsapic;
-
-	lsapic = (struct acpi_madt_local_sapic *)header;
-
-	/*Skip BAD_MADT_ENTRY check, as lsapic size could vary */
-
-	if (lsapic->lapic_flags & ACPI_MADT_ENABLED) {
-#ifdef CONFIG_SMP
-		smp_boot_data.cpu_phys_id[available_cpus] =
-		    (lsapic->id << 8) | lsapic->eid;
-#endif
-#ifdef XEN
-        ia64_acpiid_to_sapicid[lsapic->processor_id] =
-            (lsapic->id << 8) | lsapic->eid;
-#endif
-		++available_cpus;
-	}
-
-	total_cpus++;
-	return 0;
-}
-
-static int __init
-acpi_parse_lapic_nmi(struct acpi_subtable_header * header, const unsigned long end)
-{
-	struct acpi_madt_local_apic_nmi *lacpi_nmi;
-
-	lacpi_nmi = (struct acpi_madt_local_apic_nmi *)header;
-
-	if (BAD_MADT_ENTRY(lacpi_nmi, end))
-		return -EINVAL;
-
-	/* TBD: Support lapic_nmi entries */
-	return 0;
-}
-
-static int __init
-acpi_parse_iosapic(struct acpi_subtable_header * header, const unsigned long end)
-{
-	struct acpi_madt_io_sapic *iosapic;
-
-	iosapic = (struct acpi_madt_io_sapic *)header;
-
-	if (BAD_MADT_ENTRY(iosapic, end))
-		return -EINVAL;
-
-#ifndef XEN
-	return iosapic_init(iosapic->address, iosapic->global_irq_base);
-#else
-	return iosapic_init(iosapic->address, iosapic->global_irq_base,
-			    iosapic->id);
-#endif
-}
-
-static unsigned int __initdata acpi_madt_rev;
-
-static int __init
-acpi_parse_plat_int_src(struct acpi_subtable_header * header,
-			const unsigned long end)
-{
-	struct acpi_madt_interrupt_source *plintsrc;
-	int vector;
-
-	plintsrc = (struct acpi_madt_interrupt_source *)header;
-
-	if (BAD_MADT_ENTRY(plintsrc, end))
-		return -EINVAL;
-
-	/*
-	 * Get vector assignment for this interrupt, set attributes,
-	 * and program the IOSAPIC routing table.
-	 */
-	vector = iosapic_register_platform_intr(plintsrc->type,
-						plintsrc->global_irq,
-						plintsrc->io_sapic_vector,
-						plintsrc->eid,
-						plintsrc->id,
-						((plintsrc->inti_flags & ACPI_MADT_POLARITY_MASK) ==
-						 ACPI_MADT_POLARITY_ACTIVE_HIGH) ?
-						IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW,
-						((plintsrc->inti_flags & ACPI_MADT_TRIGGER_MASK) ==
-						 ACPI_MADT_TRIGGER_EDGE) ?
-						IOSAPIC_EDGE : IOSAPIC_LEVEL);
-
-	platform_intr_list[plintsrc->type] = vector;
-	if (acpi_madt_rev > 1) {
-		acpi_cpei_override = plintsrc->flags & ACPI_MADT_CPEI_OVERRIDE;
-	}
-
-	/*
-	 * Save the physical id, so we can check when its being removed
-	 */
-	acpi_cpei_phys_cpuid = ((plintsrc->id << 8) | (plintsrc->eid)) & 0xffff;
-
-	return 0;
-}
-
-#ifdef CONFIG_HOTPLUG_CPU
-
-#ifdef XEN
-unsigned int force_cpei_retarget = 0;
-#endif
-
-unsigned int can_cpei_retarget(void)
-{
-	extern int cpe_vector;
-	extern unsigned int force_cpei_retarget;
-
-	/*
-	 * Only if CPEI is supported and the override flag
-	 * is present, otherwise return that its re-targettable
-	 * if we are in polling mode.
-	 */
-	if (cpe_vector > 0) {
-		if (acpi_cpei_override || force_cpei_retarget)
-			return 1;
-		else
-			return 0;
-	}
-	return 1;
-}
-
-unsigned int is_cpu_cpei_target(unsigned int cpu)
-{
-	unsigned int logical_id;
-
-	logical_id = cpu_logical_id(acpi_cpei_phys_cpuid);
-
-	if (logical_id == cpu)
-		return 1;
-	else
-		return 0;
-}
-
-void set_cpei_target_cpu(unsigned int cpu)
-{
-	acpi_cpei_phys_cpuid = cpu_physical_id(cpu);
-}
-#endif
-
-unsigned int get_cpei_target_cpu(void)
-{
-	return acpi_cpei_phys_cpuid;
-}
-
-static int __init
-acpi_parse_int_src_ovr(struct acpi_subtable_header * header,
-		       const unsigned long end)
-{
-	struct acpi_madt_interrupt_override *p;
-
-	p = (struct acpi_madt_interrupt_override *)header;
-
-	if (BAD_MADT_ENTRY(p, end))
-		return -EINVAL;
-
-	iosapic_override_isa_irq(p->source_irq, p->global_irq,
-				 ((p->inti_flags & ACPI_MADT_POLARITY_MASK) ==
-				  ACPI_MADT_POLARITY_ACTIVE_HIGH) ?
-				 IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW,
-				 ((p->inti_flags & ACPI_MADT_TRIGGER_MASK) ==
-				 ACPI_MADT_TRIGGER_EDGE) ?
-				 IOSAPIC_EDGE : IOSAPIC_LEVEL);
-	return 0;
-}
-
-static int __init
-acpi_parse_nmi_src(struct acpi_subtable_header * header, const unsigned long end)
-{
-	struct acpi_madt_nmi_source *nmi_src;
-
-	nmi_src = (struct acpi_madt_nmi_source *)header;
-
-	if (BAD_MADT_ENTRY(nmi_src, end))
-		return -EINVAL;
-
-	/* TBD: Support nimsrc entries */
-	return 0;
-}
-
-static void __init acpi_madt_oem_check(char *oem_id, char *oem_table_id)
-{
-	if (!strncmp(oem_id, "IBM", 3) && (!strncmp(oem_table_id, "SERMOW", 6))) {
-
-		/*
-		 * Unfortunately ITC_DRIFT is not yet part of the
-		 * official SAL spec, so the ITC_DRIFT bit is not
-		 * set by the BIOS on this hardware.
-		 */
-		sal_platform_features |= IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT;
-
-#ifndef XEN
-		cyclone_setup();
-#endif
-	}
-}
-
-static int __init acpi_parse_madt(struct acpi_table_header *table)
-{
-	if (!table)
-		return -EINVAL;
-
-	acpi_madt = (struct acpi_table_madt *)table;
-
-	acpi_madt_rev = acpi_madt->header.revision;
-
-	/* remember the value for reference after free_initmem() */
-#ifdef CONFIG_ITANIUM
-	has_8259 = 1;		/* Firmware on old Itanium systems is broken */
-#else
-	has_8259 = acpi_madt->flags & ACPI_MADT_PCAT_COMPAT;
-#endif
-	iosapic_system_init(has_8259);
-
-	/* Get base address of IPI Message Block */
-
-	if (acpi_madt->address)
-		ipi_base_addr = ioremap(acpi_madt->address, 0);
-
-	printk(KERN_INFO PREFIX "Local APIC address %p\n", ipi_base_addr);
-
-	acpi_madt_oem_check(acpi_madt->header.oem_id,
-			    acpi_madt->header.oem_table_id);
-
-	return 0;
-}
-
-#ifdef CONFIG_ACPI_NUMA
-
-#undef SLIT_DEBUG
-
-#define PXM_FLAG_LEN ((MAX_PXM_DOMAINS + 1)/32)
-
-static int __initdata srat_num_cpus;	/* number of cpus */
-static u32 __devinitdata pxm_flag[PXM_FLAG_LEN];
-#define pxm_bit_set(bit)	(set_bit(bit,(void *)pxm_flag))
-#define pxm_bit_test(bit)	(test_bit(bit,(void *)pxm_flag))
-static struct acpi_table_slit __initdata *slit_table;
-cpumask_t early_cpu_possible_map = CPU_MASK_NONE;
-
-static int __init
-get_processor_proximity_domain(struct acpi_srat_cpu_affinity *pa)
-{
-	int pxm;
-
-	pxm = pa->proximity_domain_lo;
-	if (srat_rev >= 2) {
-		pxm += pa->proximity_domain_hi[0] << 8;
-		pxm += pa->proximity_domain_hi[1] << 16;
-		pxm += pa->proximity_domain_hi[2] << 24;
-	} else if (ia64_platform_is("sn2"))
-		pxm += pa->proximity_domain_hi[0] << 8;
-	return pxm;
-}
-
-static int __init
-get_memory_proximity_domain(struct acpi_srat_mem_affinity *ma)
-{
-	int pxm;
-
-	pxm = ma->proximity_domain;
-	if (!ia64_platform_is("sn2") && srat_rev < 2)
-		pxm &= 0xff;
-
-	return pxm;
-}
-
-/*
- * ACPI 2.0 SLIT (System Locality Information Table)
- * http://devresource.hp.com/devresource/Docs/TechPapers/IA64/slit.pdf
- */
-void __init acpi_numa_slit_init(struct acpi_table_slit *slit)
-{
-	u32 len;
-
-	len = sizeof(struct acpi_table_header) + 8
-	    + slit->locality_count * slit->locality_count;
-	if (slit->header.length != len) {
-		printk(KERN_ERR
-		       "ACPI 2.0 SLIT: size mismatch: %d expected, %d actual\n",
-		       len, slit->header.length);
-		memset(numa_slit, 10, sizeof(numa_slit));
-		return;
-	}
-	slit_table = slit;
-}
-
-void __init
-acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa)
-{
-	int pxm;
-
-	if (!(pa->flags & ACPI_SRAT_CPU_ENABLED))
-		return;
-
-	pxm = get_processor_proximity_domain(pa);
-
-	/* record this node in proximity bitmap */
-	pxm_bit_set(pxm);
-
-	node_cpuid[srat_num_cpus].phys_id =
-	    (pa->apic_id << 8) | (pa->local_sapic_eid);
-	/* nid should be overridden as logical node id later */
-	node_cpuid[srat_num_cpus].nid = pxm;
-	cpumask_set_cpu(srat_num_cpus, &early_cpu_possible_map);
-	srat_num_cpus++;
-}
-
-void __init
-acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)
-{
-	unsigned long paddr, size;
-	int pxm;
-	struct node_memblk_s *p, *q, *pend;
-
-	pxm = get_memory_proximity_domain(ma);
-
-	/* fill node memory chunk structure */
-	paddr = ma->base_address;
-	size = ma->length;
-
-	/* Ignore disabled entries */
-	if (!(ma->flags & ACPI_SRAT_MEM_ENABLED))
-		return;
-
-	/* record this node in proximity bitmap */
-	pxm_bit_set(pxm);
-
-	/* Insertion sort based on base address */
-	pend = &node_memblk[num_node_memblks];
-	for (p = &node_memblk[0]; p < pend; p++) {
-		if (paddr < p->start_paddr)
-			break;
-	}
-	if (p < pend) {
-		for (q = pend - 1; q >= p; q--)
-			*(q + 1) = *q;
-	}
-	p->start_paddr = paddr;
-	p->size = size;
-	p->nid = pxm;
-	num_node_memblks++;
-}
-
-void __init acpi_numa_arch_fixup(void)
-{
-	int i, j, node_from, node_to;
-
-	/* If there's no SRAT, fix the phys_id and mark node 0 online */
-	if (srat_num_cpus == 0) {
-		node_set_online(0);
-		node_cpuid[0].phys_id = hard_smp_processor_id();
-		return;
-	}
-
-	/*
-	 * MCD - This can probably be dropped now.  No need for pxm ID to node ID
-	 * mapping with sparse node numbering iff MAX_PXM_DOMAINS <= MAX_NUMNODES.
-	 */
-	nodes_clear(node_online_map);
-	for (i = 0; i < MAX_PXM_DOMAINS; i++) {
-		if (pxm_bit_test(i)) {
-			int nid = acpi_map_pxm_to_node(i);
-			node_set_online(nid);
-		}
-	}
-
-	/* set logical node id in memory chunk structure */
-	for (i = 0; i < num_node_memblks; i++)
-		node_memblk[i].nid = pxm_to_node(node_memblk[i].nid);
-
-	/* assign memory bank numbers for each chunk on each node */
-	for_each_online_node(i) {
-		int bank;
-
-		bank = 0;
-		for (j = 0; j < num_node_memblks; j++)
-			if (node_memblk[j].nid == i)
-				node_memblk[j].bank = bank++;
-	}
-
-	/* set logical node id in cpu structure */
-	for_each_possible_early_cpu(i)
-		node_cpuid[i].nid = pxm_to_node(node_cpuid[i].nid);
-
-	printk(KERN_INFO "Number of logical nodes in system = %d\n",
-	       num_online_nodes());
-	printk(KERN_INFO "Number of memory chunks in system = %d\n",
-	       num_node_memblks);
-
-	if (!slit_table)
-		return;
-	memset(numa_slit, -1, sizeof(numa_slit));
-	for (i = 0; i < slit_table->locality_count; i++) {
-		if (!pxm_bit_test(i))
-			continue;
-		node_from = pxm_to_node(i);
-		for (j = 0; j < slit_table->locality_count; j++) {
-			if (!pxm_bit_test(j))
-				continue;
-			node_to = pxm_to_node(j);
-			node_distance(node_from, node_to) =
-			    slit_table->entry[i * slit_table->locality_count + j];
-		}
-	}
-
-#ifdef SLIT_DEBUG
-	printk("ACPI 2.0 SLIT locality table:\n");
-	for_each_online_node(i) {
-		for_each_online_node(j)
-		    printk("%03d ", node_distance(i, j));
-		printk("\n");
-	}
-#endif
-}
-#endif				/* CONFIG_ACPI_NUMA */
-
-#ifndef XEN
-/*
- * success: return IRQ number (>=0)
- * failure: return < 0
- */
-int acpi_register_gsi(u32 gsi, int triggering, int polarity)
-{
-	if (acpi_irq_model == ACPI_IRQ_MODEL_PLATFORM)
-		return gsi;
-
-	if (has_8259 && gsi < 16)
-		return isa_irq_to_vector(gsi);
-
-	return iosapic_register_intr(gsi,
-				     (polarity ==
-				      ACPI_ACTIVE_HIGH) ? IOSAPIC_POL_HIGH :
-				     IOSAPIC_POL_LOW,
-				     (triggering ==
-				      ACPI_EDGE_SENSITIVE) ? IOSAPIC_EDGE :
-				     IOSAPIC_LEVEL);
-}
-
-void acpi_unregister_gsi(u32 gsi)
-{
-	if (acpi_irq_model == ACPI_IRQ_MODEL_PLATFORM)
-		return;
-
-	if (has_8259 && gsi < 16)
-		return;
-
-	iosapic_unregister_intr(gsi);
-}
-#endif
-
-static int __init acpi_parse_fadt(struct acpi_table_header *table)
-{
-	struct acpi_table_header *fadt_header;
-	struct acpi_table_fadt *fadt;
-
-	if (!table)
-		return -EINVAL;
-
-	fadt_header = (struct acpi_table_header *)table;
-	if (fadt_header->revision != 3)
-		return -ENODEV;	/* Only deal with ACPI 2.0 FADT */
-
-	fadt = (struct acpi_table_fadt *)fadt_header;
-
-#ifndef XEN
-	acpi_register_gsi(fadt->sci_interrupt, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW);
-#endif
-	return 0;
-}
-
-int __init acpi_boot_init(void)
-{
-
-	/*
-	 * MADT
-	 * ----
-	 * Parse the Multiple APIC Description Table (MADT), if exists.
-	 * Note that this table provides platform SMP configuration
-	 * information -- the successor to MPS tables.
-	 */
-
-	if (acpi_table_parse(ACPI_SIG_MADT, acpi_parse_madt)) {
-		printk(KERN_ERR PREFIX "Can't find MADT\n");
-		goto skip_madt;
-	}
-
-	/* Local APIC */
-
-	if (acpi_table_parse_madt
-	    (ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE, acpi_parse_lapic_addr_ovr, 0) < 0)
-		printk(KERN_ERR PREFIX
-		       "Error parsing LAPIC address override entry\n");
-
-	if (acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_SAPIC, acpi_parse_lsapic, NR_CPUS)
-	    < 1)
-		printk(KERN_ERR PREFIX
-		       "Error parsing MADT - no LAPIC entries\n");
-
-	if (acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_APIC_NMI, acpi_parse_lapic_nmi, 0)
-	    < 0)
-		printk(KERN_ERR PREFIX "Error parsing LAPIC NMI entry\n");
-
-	/* I/O APIC */
-
-	if (acpi_table_parse_madt
-	    (ACPI_MADT_TYPE_IO_SAPIC, acpi_parse_iosapic, NR_IOSAPICS) < 1) {
-		if (!ia64_platform_is("sn2"))
-			printk(KERN_ERR PREFIX
-			       "Error parsing MADT - no IOSAPIC entries\n");
-	}
-
-	/* System-Level Interrupt Routing */
-
-	if (acpi_table_parse_madt
-	    (ACPI_MADT_TYPE_INTERRUPT_SOURCE, acpi_parse_plat_int_src,
-	     ACPI_MAX_PLATFORM_INTERRUPTS) < 0)
-		printk(KERN_ERR PREFIX
-		       "Error parsing platform interrupt source entry\n");
-
-	if (acpi_table_parse_madt
-	    (ACPI_MADT_TYPE_INTERRUPT_OVERRIDE, acpi_parse_int_src_ovr, 0) < 0)
-		printk(KERN_ERR PREFIX
-		       "Error parsing interrupt source overrides entry\n");
-
-	if (acpi_table_parse_madt(ACPI_MADT_TYPE_NMI_SOURCE, acpi_parse_nmi_src, 0) < 0)
-		printk(KERN_ERR PREFIX "Error parsing NMI SRC entry\n");
-      skip_madt:
-
-	/*
-	 * FADT says whether a legacy keyboard controller is present.
-	 * The FADT also contains an SCI_INT line, by which the system
-	 * gets interrupts such as power and sleep buttons.  If it's not
-	 * on a Legacy interrupt, it needs to be setup.
-	 */
-	if (acpi_table_parse(ACPI_SIG_FADT, acpi_parse_fadt))
-		printk(KERN_ERR PREFIX "Can't find FADT\n");
-
-#ifdef XEN
-	acpi_dmar_init();
-#endif
-
-#ifdef CONFIG_SMP
-	if (available_cpus == 0) {
-		printk(KERN_INFO "ACPI: Found 0 CPUS; assuming 1\n");
-		printk(KERN_INFO "CPU 0 (0x%04x)", hard_smp_processor_id());
-		smp_boot_data.cpu_phys_id[available_cpus] =
-		    hard_smp_processor_id();
-		available_cpus = 1;	/* We've got at least one of these, no? */
-	}
-	smp_boot_data.cpu_count = available_cpus;
-
-	smp_build_cpu_map();
-# ifdef CONFIG_ACPI_NUMA
-	if (srat_num_cpus == 0) {
-		int cpu, i = 1;
-		for (cpu = 0; cpu < smp_boot_data.cpu_count; cpu++)
-			if (smp_boot_data.cpu_phys_id[cpu] !=
-			    hard_smp_processor_id())
-				node_cpuid[i++].phys_id =
-				    smp_boot_data.cpu_phys_id[cpu];
-	}
-# endif
-#endif
-#ifdef CONFIG_ACPI_NUMA
-	build_cpu_to_node_map();
-#endif
-	/* Make boot-up look pretty */
-	printk(KERN_INFO "%d CPUs available, %d CPUs total\n", available_cpus,
-	       total_cpus);
-	return 0;
-}
-
-int acpi_gsi_to_irq(u32 gsi, unsigned int *irq)
-{
-	int tmp;
-
-	if (has_8259 && gsi < 16)
-		*irq = isa_irq_to_vector(gsi);
-	else {
-		tmp = gsi_to_irq(gsi);
-		if (tmp == -1)
-			return -1;
-		*irq = tmp;
-	}
-	return 0;
-}
-
-/*
- *  ACPI based hotplug CPU support
- */
-#ifdef CONFIG_ACPI_HOTPLUG_CPU
-static
-int acpi_map_cpu2node(acpi_handle handle, int cpu, long physid)
-{
-#ifdef CONFIG_ACPI_NUMA
-	int pxm_id;
-	int nid;
-
-	pxm_id = acpi_get_pxm(handle);
-	/*
-	 * We don't have cpu-only-node hotadd. But if the system equips
-	 * SRAT table, pxm is already found and node is ready.
-  	 * So, just pxm_to_nid(pxm) is OK.
-	 * This code here is for the system which doesn't have full SRAT
-  	 * table for possible cpus.
-	 */
-	nid = acpi_map_pxm_to_node(pxm_id);
-	node_cpuid[cpu].phys_id = physid;
-	node_cpuid[cpu].nid = nid;
-#endif
-	return (0);
-}
-
-int additional_cpus __initdata = -1;
-
-static __init int setup_additional_cpus(char *s)
-{
-	if (s)
-		additional_cpus = simple_strtol(s, NULL, 0);
-
-	return 0;
-}
-
-early_param("additional_cpus", setup_additional_cpus);
-
-/*
- * cpu_possible_map should be static, it cannot change as CPUs
- * are onlined, or offlined. The reason is per-cpu data-structures
- * are allocated by some modules at init time, and dont expect to
- * do this dynamically on cpu arrival/departure.
- * cpu_present_map on the other hand can change dynamically.
- * In case when cpu_hotplug is not compiled, then we resort to current
- * behaviour, which is cpu_possible == cpu_present.
- * - Ashok Raj
- *
- * Three ways to find out the number of additional hotplug CPUs:
- * - If the BIOS specified disabled CPUs in ACPI/mptables use that.
- * - The user can overwrite it with additional_cpus=NUM
- * - Otherwise don't reserve additional CPUs.
- */
-__init void prefill_possible_map(void)
-{
-	int i;
-	int possible, disabled_cpus;
-
-	disabled_cpus = total_cpus - available_cpus;
-
- 	if (additional_cpus == -1) {
- 		if (disabled_cpus > 0)
-			additional_cpus = disabled_cpus;
- 		else
-			additional_cpus = 0;
- 	}
-
-	possible = available_cpus + additional_cpus;
-
-	if (possible > NR_CPUS)
-		possible = NR_CPUS;
-
-	printk(KERN_INFO "SMP: Allowing %d CPUs, %d hotplug CPUs\n",
-		possible, max((possible - available_cpus), 0));
-
-	for (i = 0; i < possible; i++)
-		cpumask_set_cpu(i, &cpu_possible_map);
-}
-
-#ifndef XEN
-int acpi_map_lsapic(acpi_handle handle, int *pcpu)
-{
-	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
-	union acpi_object *obj;
-	struct acpi_madt_local_sapic *lsapic;
-	cpumask_t tmp_map;
-	long physid;
-	int cpu;
-
-	if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer)))
-		return -EINVAL;
-
-	if (!buffer.length || !buffer.pointer)
-		return -EINVAL;
-
-	obj = buffer.pointer;
-	if (obj->type != ACPI_TYPE_BUFFER)
-	{
-		kfree(buffer.pointer);
-		return -EINVAL;
-	}
-
-	lsapic = (struct acpi_madt_local_sapic *)obj->buffer.pointer;
-
-	if ((lsapic->header.type != ACPI_MADT_TYPE_LOCAL_SAPIC) ||
-	    (!(lsapic->lapic_flags & ACPI_MADT_ENABLED))) {
-		kfree(buffer.pointer);
-		return -EINVAL;
-	}
-
-	physid = ((lsapic->id << 8) | (lsapic->eid));
-
-	kfree(buffer.pointer);
-	buffer.length = ACPI_ALLOCATE_BUFFER;
-	buffer.pointer = NULL;
-
-	cpumask_complement(&tmp_map, &cpu_present_map);
-	cpu = cpumask_first(&tmp_map);
-	if (cpu >= nr_cpu_ids)
-		return -EINVAL;
-
-	acpi_map_cpu2node(handle, cpu, physid);
-
-	cpumask_set_cpu(cpu, &cpu_present_map);
-	ia64_cpu_to_sapicid[cpu] = physid;
-
-	*pcpu = cpu;
-	return (0);
-}
-
-EXPORT_SYMBOL(acpi_map_lsapic);
-
-int acpi_unmap_lsapic(int cpu)
-{
-	ia64_cpu_to_sapicid[cpu] = -1;
-	cpumask_clear_cpu(cpu, &cpu_present_map);
-
-#ifdef CONFIG_ACPI_NUMA
-	/* NUMA specific cleanup's */
-#endif
-
-	return (0);
-}
-
-EXPORT_SYMBOL(acpi_unmap_lsapic);
-#endif /* XEN */
-#endif				/* CONFIG_ACPI_HOTPLUG_CPU */
-
-#ifndef XEN
-#ifdef CONFIG_ACPI_NUMA
-static acpi_status __devinit
-acpi_map_iosapic(acpi_handle handle, u32 depth, void *context, void **ret)
-{
-	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
-	union acpi_object *obj;
-	struct acpi_madt_io_sapic *iosapic;
-	unsigned int gsi_base;
-	int pxm, node;
-
-	/* Only care about objects w/ a method that returns the MADT */
-	if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer)))
-		return AE_OK;
-
-	if (!buffer.length || !buffer.pointer)
-		return AE_OK;
-
-	obj = buffer.pointer;
-	if (obj->type != ACPI_TYPE_BUFFER ||
-	    obj->buffer.length < sizeof(*iosapic)) {
-		kfree(buffer.pointer);
-		return AE_OK;
-	}
-
-	iosapic = (struct acpi_madt_io_sapic *)obj->buffer.pointer;
-
-	if (iosapic->header.type != ACPI_MADT_TYPE_IO_SAPIC) {
-		kfree(buffer.pointer);
-		return AE_OK;
-	}
-
-	gsi_base = iosapic->global_irq_base;
-
-	kfree(buffer.pointer);
-
-	/*
-	 * OK, it's an IOSAPIC MADT entry, look for a _PXM value to tell
-	 * us which node to associate this with.
-	 */
-	pxm = acpi_get_pxm(handle);
-	if (pxm < 0)
-		return AE_OK;
-
-	node = pxm_to_node(pxm);
-
-	if (node >= MAX_NUMNODES || !node_online(node) ||
-	    cpus_empty(node_to_cpumask(node)))
-		return AE_OK;
-
-	/* We know a gsi to node mapping! */
-	map_iosapic_to_node(gsi_base, node);
-	return AE_OK;
-}
-
-static int __init
-acpi_map_iosapics (void)
-{
-	acpi_get_devices(NULL, acpi_map_iosapic, NULL, NULL);
-	return 0;
-}
-
-fs_initcall(acpi_map_iosapics);
-#endif				/* CONFIG_ACPI_NUMA */
-
-int __ref acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base)
-{
-	int err;
-
-	if ((err = iosapic_init(phys_addr, gsi_base)))
-		return err;
-
-#ifdef CONFIG_ACPI_NUMA
-	acpi_map_iosapic(handle, 0, NULL, NULL);
-#endif				/* CONFIG_ACPI_NUMA */
-
-	return 0;
-}
-
-EXPORT_SYMBOL(acpi_register_ioapic);
-
-int acpi_unregister_ioapic(acpi_handle handle, u32 gsi_base)
-{
-	return iosapic_remove(gsi_base);
-}
-
-EXPORT_SYMBOL(acpi_unregister_ioapic);
-#endif /* XEN */
-
-/*
- * acpi_save_state_mem() - save kernel state
- *
- * TBD when when IA64 starts to support suspend...
- */
-int acpi_save_state_mem(void) { return 0; } 
-
-/*
- * acpi_restore_state()
- */
-void acpi_restore_state_mem(void) {}
-
-/*
- * do_suspend_lowlevel()
- */
-void do_suspend_lowlevel(void) {}
-
-#endif				/* CONFIG_ACPI */
diff -r 2386288b1bf1 -r 8aa1697d57e4 xen/arch/ia64/linux-xen/acpi_numa.c
--- a/xen/arch/ia64/linux-xen/acpi_numa.c	Mon Apr 02 18:14:31 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,276 +0,0 @@
-/*
- *  acpi_numa.c - ACPI NUMA support
- *
- *  Copyright (C) 2002 Takayoshi Kochi <t-kochi@bq.jp.nec.com>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- */
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/errno.h>
-#include <linux/acpi.h>
-#include <acpi/acmacros.h>
-
-#ifndef XEN
-#define ACPI_NUMA	0x80000000
-#define _COMPONENT	ACPI_NUMA
-ACPI_MODULE_NAME("numa");
-#else
-#define NID_INVAL	-1
-#define PXM_INVAL	-1
-#endif
-
-#ifndef XEN
-static nodemask_t nodes_found_map = NODE_MASK_NONE;
-#else
-/* the above causes error: initializer element is not constant
- * anyway NODE_MASK_NONE is 0 filled array.
- */
-static nodemask_t nodes_found_map;
-#endif
-
-/* maps to convert between proximity domain and logical node ID */
-static int pxm_to_node_map[MAX_PXM_DOMAINS]
-				= { [0 ... MAX_PXM_DOMAINS - 1] = NID_INVAL };
-static int node_to_pxm_map[MAX_NUMNODES]
-				= { [0 ... MAX_NUMNODES - 1] = PXM_INVAL };
-
-int pxm_to_node(int pxm)
-{
-	if (pxm < 0)
-		return NID_INVAL;
-	return pxm_to_node_map[pxm];
-}
-
-int node_to_pxm(int node)
-{
-	if (node < 0)
-		return PXM_INVAL;
-	return node_to_pxm_map[node];
-}
-
-void __acpi_map_pxm_to_node(int pxm, int node)
-{
-	pxm_to_node_map[pxm] = node;
-	node_to_pxm_map[node] = pxm;
-}
-
-int acpi_map_pxm_to_node(int pxm)
-{
-	int node = pxm_to_node_map[pxm];
-
-	if (node < 0){
-		if (nodes_weight(nodes_found_map) >= MAX_NUMNODES)
-			return NID_INVAL;
-		node = first_unset_node(nodes_found_map);
-		__acpi_map_pxm_to_node(pxm, node);
-		node_set(node, nodes_found_map);
-	}
-
-	return node;
-}
-
-#ifndef XEN
-#if 0
-void __cpuinit acpi_unmap_pxm_to_node(int node)
-{
-	int pxm = node_to_pxm_map[node];
-	pxm_to_node_map[pxm] = NID_INVAL;
-	node_to_pxm_map[node] = PXM_INVAL;
-	node_clear(node, nodes_found_map);
-}
-#endif  /*  0  */
-
-static void __init
-acpi_table_print_srat_entry(struct acpi_subtable_header *header)
-{
-
-	ACPI_FUNCTION_NAME("acpi_table_print_srat_entry");
-
-	if (!header)
-		return;
-
-	switch (header->type) {
-
-	case ACPI_SRAT_TYPE_CPU_AFFINITY:
-#ifdef ACPI_DEBUG_OUTPUT
-		{
-			struct acpi_srat_cpu_affinity *p =
-			    (struct acpi_srat_cpu_affinity *)header;
-			ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-					  "SRAT Processor (id[0x%02x] eid[0x%02x]) in proximity domain %d %s\n",
-					  p->apic_id, p->local_sapic_eid,
-					  p->proximity_domain_lo,
-					  (p->flags & ACPI_SRAT_CPU_ENABLED)?
-					  "enabled" : "disabled"));
-		}
-#endif				/* ACPI_DEBUG_OUTPUT */
-		break;
-
-	case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
-#ifdef ACPI_DEBUG_OUTPUT
-		{
-			struct acpi_srat_mem_affinity *p =
-			    (struct acpi_srat_mem_affinity *)header;
-			ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-					  "SRAT Memory (0x%lx length 0x%lx type 0x%x) in proximity domain %d %s%s\n",
-					  (unsigned long)p->base_address,
-					  (unsigned long)p->length,
-					  p->memory_type, p->proximity_domain,
-					  (p->flags & ACPI_SRAT_MEM_ENABLED)?
-					  "enabled" : "disabled",
-					  (p->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE)?
-					  " hot-pluggable" : ""));
-		}
-#endif				/* ACPI_DEBUG_OUTPUT */
-		break;
-
-	default:
-		printk(KERN_WARNING PREFIX
-		       "Found unsupported SRAT entry (type = 0x%x)\n",
-		       header->type);
-		break;
-	}
-}
-
-static int __init acpi_parse_slit(struct acpi_table_header *table)
-{
-	struct acpi_table_slit *slit;
-	u32 localities;
-
-	if (!table)
-		return -EINVAL;
-
-	slit = (struct acpi_table_slit *)table;
-
-	/* downcast just for %llu vs %lu for i386/ia64  */
-	localities = (u32) slit->locality_count;
-
-	acpi_numa_slit_init(slit);
-
-	return 0;
-}
-
-static int __init
-acpi_parse_processor_affinity(struct acpi_subtable_header * header,
-			      const unsigned long end)
-{
-	struct acpi_srat_cpu_affinity *processor_affinity;
-
-	processor_affinity = (struct acpi_srat_cpu_affinity *)header;
-	if (!processor_affinity)
-		return -EINVAL;
-
-	acpi_table_print_srat_entry(header);
-
-	/* let architecture-dependent part to do it */
-	acpi_numa_processor_affinity_init(processor_affinity);
-
-	return 0;
-}
-
-static int __init
-acpi_parse_memory_affinity(struct acpi_subtable_header * header,
-			   const unsigned long end)
-{
-	struct acpi_srat_mem_affinity *memory_affinity;
-
-	memory_affinity = (struct acpi_srat_mem_affinity *)header;
-	if (!memory_affinity)
-		return -EINVAL;
-
-	acpi_table_print_srat_entry(header);
-
-	/* let architecture-dependent part to do it */
-	acpi_numa_memory_affinity_init(memory_affinity);
-
-	return 0;
-}
-
-static int __init acpi_parse_srat(struct acpi_table_header *table)
-{
-	struct acpi_table_srat *srat;
-
-	if (!table)
-		return -EINVAL;
-
-	srat = (struct acpi_table_srat *)table;
-
-	return 0;
-}
-
-static int __init
-acpi_table_parse_srat(enum acpi_srat_type id,
-		      acpi_table_entry_handler handler, unsigned int max_entries)
-{
-	return acpi_table_parse_entries(ACPI_SIG_SRAT,
-					    sizeof(struct acpi_table_srat), id,
-					    handler, max_entries);
-}
-
-int __init acpi_numa_init(void)
-{
-	/* SRAT: Static Resource Affinity Table */
-	if (!acpi_table_parse(ACPI_SIG_SRAT, acpi_parse_srat)) {
-		acpi_table_parse_srat(ACPI_SRAT_TYPE_CPU_AFFINITY,
-				      acpi_parse_processor_affinity, NR_CPUS);
-		acpi_table_parse_srat(ACPI_SRAT_TYPE_MEMORY_AFFINITY,
-				      acpi_parse_memory_affinity,
-				      NR_NODE_MEMBLKS);
-	}
-
-	/* SLIT: System Locality Information Table */
-	acpi_table_parse(ACPI_SIG_SLIT, acpi_parse_slit);
-
-	acpi_numa_arch_fixup();
-	return 0;
-}
-
-int acpi_get_pxm(acpi_handle h)
-{
-	unsigned long pxm;
-	acpi_status status;
-	acpi_handle handle;
-	acpi_handle phandle = h;
-
-	do {
-		handle = phandle;
-		status = acpi_evaluate_integer(handle, "_PXM", NULL, &pxm);
-		if (ACPI_SUCCESS(status))
-			return pxm;
-		status = acpi_get_parent(handle, &phandle);
-	} while (ACPI_SUCCESS(status));
-	return -1;
-}
-
-int acpi_get_node(acpi_handle *handle)
-{
-	int pxm, node = -1;
-
-	pxm = acpi_get_pxm(handle);
-	if (pxm >= 0)
-		node = acpi_map_pxm_to_node(pxm);
-
-	return node;
-}
-EXPORT_SYMBOL(acpi_get_node);
-#endif /* XEN */
diff -r 2386288b1bf1 -r 8aa1697d57e4 xen/arch/ia64/linux-xen/cmdline.c
--- a/xen/arch/ia64/linux-xen/cmdline.c	Mon Apr 02 18:14:31 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,131 +0,0 @@
-/*
- * linux/lib/cmdline.c
- * Helper functions generally used for parsing kernel command line
- * and module options.
- *
- * Code and copyrights come from init/main.c and arch/i386/kernel/setup.c.
- *
- * This source code is licensed under the GNU General Public License,
- * Version 2.  See the file COPYING for more details.
- *
- * GNU Indent formatting options for this file: -kr -i8 -npsl -pcs
- *
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#ifdef XEN
-#include <xen/lib.h>
-#endif
-
-
-/**
- *	get_option - Parse integer from an option string
- *	@str: option string
- *	@pint: (output) integer value parsed from @str
- *
- *	Read an int from an option string; if available accept a subsequent
- *	comma as well.
- *
- *	Return values:
- *	0 : no int in string
- *	1 : int found, no subsequent comma
- *	2 : int found including a subsequent comma
- */
-
-int get_option (char **str, int *pint)
-{
-	char *cur = *str;
-
-	if (!cur || !(*cur))
-		return 0;
-#ifndef XEN
-	*pint = simple_strtol (cur, str, 0);
-#else
-	*pint = simple_strtol (cur, (const char**)str, 0);
-#endif
-	if (cur == *str)
-		return 0;
-	if (**str == ',') {
-		(*str)++;
-		return 2;
-	}
-
-	return 1;
-}
-
-/**
- *	get_options - Parse a string into a list of integers
- *	@str: String to be parsed
- *	@nints: size of integer array
- *	@ints: integer array
- *
- *	This function parses a string containing a comma-separated
- *	list of integers.  The parse halts when the array is
- *	full, or when no more numbers can be retrieved from the
- *	string.
- *
- *	Return value is the character in the string which caused
- *	the parse to end (typically a null terminator, if @str is
- *	completely parseable).
- */
- 
-char *get_options(const char *str, int nints, int *ints)
-{
-	int res, i = 1;
-
-	while (i < nints) {
-		res = get_option ((char **)&str, ints + i);
-		if (res == 0)
-			break;
-		i++;
-		if (res == 1)
-			break;
-	}
-	ints[0] = i - 1;
-	return (char *)str;
-}
-
-/**
- *	memparse - parse a string with mem suffixes into a number
- *	@ptr: Where parse begins
- *	@retptr: (output) Pointer to next char after parse completes
- *
- *	Parses a string into a number.  The number stored at @ptr is
- *	potentially suffixed with %K (for kilobytes, or 1024 bytes),
- *	%M (for megabytes, or 1048576 bytes), or %G (for gigabytes, or
- *	1073741824).  If the number is suffixed with K, M, or G, then
- *	the return value is the number multiplied by one kilobyte, one
- *	megabyte, or one gigabyte, respectively.
- */
-
-unsigned long long memparse (char *ptr, char **retptr)
-{
-#ifndef XEN
-	unsigned long long ret = simple_strtoull (ptr, retptr, 0);
-#else
-	unsigned long long ret = simple_strtoull (ptr, (const char**)retptr, 0);
-#endif
-
-	switch (**retptr) {
-	case 'G':
-	case 'g':
-		ret <<= 10;
-	case 'M':
-	case 'm':
-		ret <<= 10;
-	case 'K':
-	case 'k':
-		ret <<= 10;
-		(*retptr)++;
-	default:
-		break;
-	}
-	return ret;
-}
-
-
-EXPORT_SYMBOL(memparse);
-EXPORT_SYMBOL(get_option);
-EXPORT_SYMBOL(get_options);
diff -r 2386288b1bf1 -r 8aa1697d57e4 xen/arch/ia64/linux-xen/efi.c
--- a/xen/arch/ia64/linux-xen/efi.c	Mon Apr 02 18:14:31 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1334 +0,0 @@
-/*
- * Extensible Firmware Interface
- *
- * Based on Extensible Firmware Interface Specification version 0.9 April 30, 1999
- *
- * Copyright (C) 1999 VA Linux Systems
- * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
- * Copyright (C) 1999-2003 Hewlett-Packard Co.
- *	David Mosberger-Tang <davidm@hpl.hp.com>
- *	Stephane Eranian <eranian@hpl.hp.com>
- * (c) Copyright 2006 Hewlett-Packard Development Company, L.P.
- *	Bjorn Helgaas <bjorn.helgaas@hp.com>
- *
- * All EFI Runtime Services are not implemented yet as EFI only
- * supports physical mode addressing on SoftSDV. This is to be fixed
- * in a future version.  --drummond 1999-07-20
- *
- * Implemented EFI runtime services and virtual mode calls.  --davidm
- *
- * Goutham Rao: <goutham.rao@intel.com>
- *	Skip non-WB memory and ignore empty memory ranges.
- */
-#include <linux/module.h>
-#include <linux/bootmem.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/types.h>
-#include <linux/time.h>
-#include <linux/efi.h>
-#include <linux/kexec.h>
-
-#include <asm/io.h>
-#include <asm/kregs.h>
-#include <asm/meminit.h>
-#include <asm/pgtable.h>
-#include <asm/processor.h>
-#include <asm/mca.h>
-
-#define EFI_DEBUG	0
-
-extern efi_status_t efi_call_phys (void *, ...);
-#ifdef XEN
-/* this should be defined in linux/kernel.h */
-extern unsigned long long memparse (char *ptr, char **retptr);
-/* this should be defined in linux/efi.h */
-//#define EFI_INVALID_TABLE_ADDR          (void *)(~0UL)
-#endif
-
-struct efi efi;
-EXPORT_SYMBOL(efi);
-static efi_runtime_services_t *runtime;
-#if defined(XEN) && !defined(CONFIG_VIRTUAL_FRAME_TABLE)
-// this is a temporary hack to avoid CONFIG_VIRTUAL_MEM_MAP
-static unsigned long mem_limit = ~0UL, max_addr = 0x100000000UL, min_addr = 0UL;
-#else
-static unsigned long mem_limit = ~0UL, max_addr = ~0UL, min_addr = 0UL;
-#endif
-
-#define efi_call_virt(f, args...)	(*(f))(args)
-
-#define STUB_GET_TIME(prefix, adjust_arg)							  \
-static efi_status_t										  \
-prefix##_get_time (efi_time_t *tm, efi_time_cap_t *tc)						  \
-{												  \
-	struct ia64_fpreg fr[6];								  \
-	efi_time_cap_t *atc = NULL;								  \
-	efi_status_t ret;									  \
-	XEN_EFI_RR_DECLARE(rr6, rr7);								  \
-												  \
-	if (tc)											  \
-		atc = adjust_arg(tc);								  \
-	ia64_save_scratch_fpregs(fr);								  \
-	XEN_EFI_RR_ENTER(rr6, rr7);								  \
-	ret = efi_call_##prefix((efi_get_time_t *) __va(runtime->get_time), adjust_arg(tm), atc); \
-	XEN_EFI_RR_LEAVE(rr6, rr7);								  \
-	ia64_load_scratch_fpregs(fr);								  \
-	return ret;										  \
-}
-
-#define STUB_SET_TIME(prefix, adjust_arg)							\
-static efi_status_t										\
-prefix##_set_time (efi_time_t *tm)								\
-{												\
-	struct ia64_fpreg fr[6];								\
-	efi_status_t ret;									\
-	XEN_EFI_RR_DECLARE(rr6, rr7);								  \
-												\
-	ia64_save_scratch_fpregs(fr);								\
-	XEN_EFI_RR_ENTER(rr6, rr7);								  \
-	ret = efi_call_##prefix((efi_set_time_t *) __va(runtime->set_time), adjust_arg(tm));	\
-	XEN_EFI_RR_LEAVE(rr6, rr7);								  \
-	ia64_load_scratch_fpregs(fr);								\
-	return ret;										\
-}
-
-#define STUB_GET_WAKEUP_TIME(prefix, adjust_arg)						\
-static efi_status_t										\
-prefix##_get_wakeup_time (efi_bool_t *enabled, efi_bool_t *pending, efi_time_t *tm)		\
-{												\
-	struct ia64_fpreg fr[6];								\
-	efi_status_t ret;									\
-	XEN_EFI_RR_DECLARE(rr6, rr7);								  \
-												\
-	ia64_save_scratch_fpregs(fr);								\
-	XEN_EFI_RR_ENTER(rr6, rr7);								  \
-	ret = efi_call_##prefix((efi_get_wakeup_time_t *) __va(runtime->get_wakeup_time),	\
-				adjust_arg(enabled), adjust_arg(pending), adjust_arg(tm));	\
-	XEN_EFI_RR_LEAVE(rr6, rr7);								  \
-	ia64_load_scratch_fpregs(fr);								\
-	return ret;										\
-}
-
-#define STUB_SET_WAKEUP_TIME(prefix, adjust_arg)						\
-static efi_status_t										\
-prefix##_set_wakeup_time (efi_bool_t enabled, efi_time_t *tm)					\
-{												\
-	struct ia64_fpreg fr[6];								\
-	efi_time_t *atm = NULL;									\
-	efi_status_t ret;									\
-	XEN_EFI_RR_DECLARE(rr6, rr7);								  \
-												\
-	if (tm)											\
-		atm = adjust_arg(tm);								\
-	ia64_save_scratch_fpregs(fr);								\
-	XEN_EFI_RR_ENTER(rr6, rr7);								  \
-	ret = efi_call_##prefix((efi_set_wakeup_time_t *) __va(runtime->set_wakeup_time),	\
-				enabled, atm);							\
-	XEN_EFI_RR_LEAVE(rr6, rr7);								  \
-	ia64_load_scratch_fpregs(fr);								\
-	return ret;										\
-}
-
-#define STUB_GET_VARIABLE(prefix, adjust_arg)						\
-static efi_status_t									\
-prefix##_get_variable (efi_char16_t *name, efi_guid_t *vendor, u32 *attr,		\
-		       unsigned long *data_size, void *data)				\
-{											\
-	struct ia64_fpreg fr[6];							\
-	u32 *aattr = NULL;									\
-	efi_status_t ret;								\
-	XEN_EFI_RR_DECLARE(rr6, rr7);								  \
-											\
-	if (attr)									\
-		aattr = adjust_arg(attr);						\
-	ia64_save_scratch_fpregs(fr);							\
-	XEN_EFI_RR_ENTER(rr6, rr7);								  \
-	ret = efi_call_##prefix((efi_get_variable_t *) __va(runtime->get_variable),	\
-				adjust_arg(name), adjust_arg(vendor), aattr,		\
-				adjust_arg(data_size), adjust_arg(data));		\
-	XEN_EFI_RR_LEAVE(rr6, rr7);								  \
-	ia64_load_scratch_fpregs(fr);							\
-	return ret;									\
-}
-
-#define STUB_GET_NEXT_VARIABLE(prefix, adjust_arg)						\
-static efi_status_t										\
-prefix##_get_next_variable (unsigned long *name_size, efi_char16_t *name, efi_guid_t *vendor)	\
-{												\
-	struct ia64_fpreg fr[6];								\
-	efi_status_t ret;									\
-	XEN_EFI_RR_DECLARE(rr6, rr7);								  \
-												\
-	ia64_save_scratch_fpregs(fr);								\
-	XEN_EFI_RR_ENTER(rr6, rr7);								  \
-	ret = efi_call_##prefix((efi_get_next_variable_t *) __va(runtime->get_next_variable),	\
-				adjust_arg(name_size), adjust_arg(name), adjust_arg(vendor));	\
-	XEN_EFI_RR_LEAVE(rr6, rr7);								  \
-	ia64_load_scratch_fpregs(fr);								\
-	return ret;										\
-}
-
-#define STUB_SET_VARIABLE(prefix, adjust_arg)						\
-static efi_status_t									\
-prefix##_set_variable (efi_char16_t *name, efi_guid_t *vendor, unsigned long attr,	\
-		       unsigned long data_size, void *data)				\
-{											\
-	struct ia64_fpreg fr[6];							\
-	efi_status_t ret;								\
-	XEN_EFI_RR_DECLARE(rr6, rr7);								  \
-											\
-	ia64_save_scratch_fpregs(fr);							\
-	XEN_EFI_RR_ENTER(rr6, rr7);								  \
-	ret = efi_call_##prefix((efi_set_variable_t *) __va(runtime->set_variable),	\
-				adjust_arg(name), adjust_arg(vendor), attr, data_size,	\
-				adjust_arg(data));					\
-	XEN_EFI_RR_LEAVE(rr6, rr7);								  \
-	ia64_load_scratch_fpregs(fr);							\
-	return ret;									\
-}
-
-#define STUB_GET_NEXT_HIGH_MONO_COUNT(prefix, adjust_arg)					\
-static efi_status_t										\
-prefix##_get_next_high_mono_count (u32 *count)							\
-{												\
-	struct ia64_fpreg fr[6];								\
-	efi_status_t ret;									\
-	XEN_EFI_RR_DECLARE(rr6, rr7);								  \
-												\
-	ia64_save_scratch_fpregs(fr);								\
-	XEN_EFI_RR_ENTER(rr6, rr7);								  \
-	ret = efi_call_##prefix((efi_get_next_high_mono_count_t *)				\
-				__va(runtime->get_next_high_mono_count), adjust_arg(count));	\
-	XEN_EFI_RR_LEAVE(rr6, rr7);								  \
-	ia64_load_scratch_fpregs(fr);								\
-	return ret;										\
-}
-
-#define STUB_RESET_SYSTEM(prefix, adjust_arg)					\
-static void									\
-prefix##_reset_system (int reset_type, efi_status_t status,			\
-		       unsigned long data_size, efi_char16_t *data)		\
-{										\
-	struct ia64_fpreg fr[6];						\
-	efi_char16_t *adata = NULL;						\
-	XEN_EFI_RR_DECLARE(rr6, rr7);								  \
-										\
-	if (data)								\
-		adata = adjust_arg(data);					\
-										\
-	ia64_save_scratch_fpregs(fr);						\
-	XEN_EFI_RR_ENTER(rr6, rr7);						\
-	efi_call_##prefix((efi_reset_system_t *) __va(runtime->reset_system),	\
-			  reset_type, status, data_size, adata);		\
-	/* should not return, but just in case... */				\
-	XEN_EFI_RR_LEAVE(rr6, rr7);								  \
-	ia64_load_scratch_fpregs(fr);						\
-}
-
-#define phys_ptr(arg)	((__typeof__(arg)) ia64_tpa(arg))
-
-STUB_GET_TIME(phys, phys_ptr)
-STUB_SET_TIME(phys, phys_ptr)
-STUB_GET_WAKEUP_TIME(phys, phys_ptr)
-STUB_SET_WAKEUP_TIME(phys, phys_ptr)
-STUB_GET_VARIABLE(phys, phys_ptr)
-STUB_GET_NEXT_VARIABLE(phys, phys_ptr)
-STUB_SET_VARIABLE(phys, phys_ptr)
-STUB_GET_NEXT_HIGH_MONO_COUNT(phys, phys_ptr)
-STUB_RESET_SYSTEM(phys, phys_ptr)
-
-#define id(arg)	arg
-
-STUB_GET_TIME(virt, id)
-STUB_SET_TIME(virt, id)
-STUB_GET_WAKEUP_TIME(virt, id)
-STUB_SET_WAKEUP_TIME(virt, id)
-STUB_GET_VARIABLE(virt, id)
-STUB_GET_NEXT_VARIABLE(virt, id)
-STUB_SET_VARIABLE(virt, id)
-STUB_GET_NEXT_HIGH_MONO_COUNT(virt, id)
-STUB_RESET_SYSTEM(virt, id)
-
-#ifndef XEN
-void
-efi_gettimeofday (struct timespec *ts)
-{
-	efi_time_t tm;
-
-	memset(ts, 0, sizeof(ts));
-	if ((*efi.get_time)(&tm, NULL) != EFI_SUCCESS)
-		return;
-
-	ts->tv_sec = mktime(tm.year, tm.month, tm.day, tm.hour, tm.minute, tm.second);
-	ts->tv_nsec = tm.nanosecond;
-}
-#endif
-
-static int
-is_memory_available (efi_memory_desc_t *md)
-{
-	if (!(md->attribute & EFI_MEMORY_WB))
-		return 0;
-
-	switch (md->type) {
-	      case EFI_LOADER_CODE:
-	      case EFI_LOADER_DATA:
-	      case EFI_BOOT_SERVICES_CODE:
-	      case EFI_BOOT_SERVICES_DATA:
-	      case EFI_CONVENTIONAL_MEMORY:
-		return 1;
-	}
-	return 0;
-}
-
-typedef struct kern_memdesc {
-	u64 attribute;
-	u64 start;
-	u64 num_pages;
-} kern_memdesc_t;
-
-static kern_memdesc_t *kern_memmap;
-
-#define efi_md_size(md)	(md->num_pages << EFI_PAGE_SHIFT)
-
-static inline u64
-kmd_end(kern_memdesc_t *kmd)
-{
-	return (kmd->start + (kmd->num_pages << EFI_PAGE_SHIFT));
-}
-
-static inline u64
-efi_md_end(efi_memory_desc_t *md)
-{
-	return (md->phys_addr + efi_md_size(md));
-}
-
-static inline int
-efi_wb(efi_memory_desc_t *md)
-{
-	return (md->attribute & EFI_MEMORY_WB);
-}
-
-static inline int
-efi_uc(efi_memory_desc_t *md)
-{
-	return (md->attribute & EFI_MEMORY_UC);
-}
-
-static void
-walk (efi_freemem_callback_t callback, void *arg, u64 attr)
-{
-	kern_memdesc_t *k;
-	u64 start, end, voff;
-
-	voff = (attr == EFI_MEMORY_WB) ? PAGE_OFFSET : __IA64_UNCACHED_OFFSET;
-	for (k = kern_memmap; k->start != ~0UL; k++) {
-		if (k->attribute != attr)
-			continue;
-		start = PAGE_ALIGN(k->start);
-		end = (k->start + (k->num_pages << EFI_PAGE_SHIFT)) & PAGE_MASK;
-		if (start < end)
-			if ((*callback)(start + voff, end + voff, arg) < 0)
-				return;
-	}
-}
-
-/*
- * Walks the EFI memory map and calls CALLBACK once for each EFI memory descriptor that
- * has memory that is available for OS use.
- */
-void
-efi_memmap_walk (efi_freemem_callback_t callback, void *arg)
-{
-	walk(callback, arg, EFI_MEMORY_WB);
-}
-
-/*
- * Walks the EFI memory map and calls CALLBACK once for each EFI memory descriptor that
- * has memory that is available for uncached allocator.
- */
-void
-efi_memmap_walk_uc (efi_freemem_callback_t callback, void *arg)
-{
-	walk(callback, arg, EFI_MEMORY_UC);
-}
-
-/*
- * Look for the PAL_CODE region reported by EFI and maps it using an
- * ITR to enable safe PAL calls in virtual mode.  See IA-64 Processor
- * Abstraction Layer chapter 11 in ADAG
- */
-
-#ifdef XEN
-static void *
-__efi_get_pal_addr (void)
-#else
-void *
-efi_get_pal_addr (void)
-#endif
-{
-	void *efi_map_start, *efi_map_end, *p;
-	efi_memory_desc_t *md;
-	u64 efi_desc_size;
-	int pal_code_count = 0;
-	u64 vaddr, mask;
-
-	efi_map_start = __va(ia64_boot_param->efi_memmap);
-	efi_map_end   = efi_map_start + ia64_boot_param->efi_memmap_size;
-	efi_desc_size = ia64_boot_param->efi_memdesc_size;
-
-	for (p = efi_map_start; p < efi_map_end; p += efi_desc_size) {
-		md = p;
-		if (md->type != EFI_PAL_CODE)
-			continue;
-
-		if (++pal_code_count > 1) {
-			printk(KERN_ERR "Too many EFI Pal Code memory ranges, dropped @ %lx\n",
-			       md->phys_addr);
-			continue;
-		}
-		/*
-		 * The only ITLB entry in region 7 that is used is the one installed by
-		 * __start().  That entry covers a 64MB range.
-		 */
-		mask  = ~((1 << KERNEL_TR_PAGE_SHIFT) - 1);
-		vaddr = PAGE_OFFSET + md->phys_addr;
-
-		/*
-		 * We must check that the PAL mapping won't overlap with the kernel
-		 * mapping.
-		 *
-		 * PAL code is guaranteed to be aligned on a power of 2 between 4k and
-		 * 256KB and that only one ITR is needed to map it. This implies that the
-		 * PAL code is always aligned on its size, i.e., the closest matching page
-		 * size supported by the TLB. Therefore PAL code is guaranteed never to
-		 * cross a 64MB unless it is bigger than 64MB (very unlikely!).  So for
-		 * now the following test is enough to determine whether or not we need a
-		 * dedicated ITR for the PAL code.
-		 */
-		if ((vaddr & mask) == (KERNEL_START & mask)) {
-			printk(KERN_INFO "%s: no need to install ITR for PAL code\n",
-			       __FUNCTION__);
-			continue;
-		}
-
-		if (md->num_pages << EFI_PAGE_SHIFT > IA64_GRANULE_SIZE)
-			panic("Woah!  PAL code size bigger than a granule!");
-
-#if EFI_DEBUG
-		mask  = ~((1 << IA64_GRANULE_SHIFT) - 1);
-
-		printk(KERN_INFO "CPU %d: mapping PAL code [0x%lx-0x%lx) into [0x%lx-0x%lx)\n",
-			smp_processor_id(), md->phys_addr,
-			md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT),
-			vaddr & mask, (vaddr & mask) + IA64_GRANULE_SIZE);
-#endif
-		return __va_efi(md->phys_addr);
-	}
-	printk(KERN_WARNING "%s: no PAL-code memory-descriptor found\n",
-	       __FUNCTION__);
-	return NULL;
-}
-
-#ifdef XEN
-static void *pal_vaddr = 0;
-
-void *
-efi_get_pal_addr(void)
-{
-	if (!pal_vaddr)
-		pal_vaddr = __efi_get_pal_addr();
-	return pal_vaddr;
-}
-#endif
-
-#ifdef XEN
-static void
-__efi_unmap_pal_code (void *pal_vaddr)
-{
-	ia64_ptr(0x1, GRANULEROUNDDOWN((unsigned long)pal_vaddr),
-		 IA64_GRANULE_SHIFT);
-}
-
-void
-efi_unmap_pal_code (void)
-{
-	void *pal_vaddr = efi_get_pal_addr ();
-	u64 psr;
-
-	if (!pal_vaddr)
-		return;
-
-	/*
-	 * Cannot write to CRx with PSR.ic=1
-	 */
-	psr = ia64_clear_ic();
-	__efi_unmap_pal_code(pal_vaddr);
-	ia64_set_psr(psr);		/* restore psr */
-	ia64_srlz_i();
-}
-#endif
-
-void
-efi_map_pal_code (void)
-{
-	void *pal_vaddr = efi_get_pal_addr ();
-	u64 psr;
-
-	if (!pal_vaddr)
-		return;
-
-	/*
-	 * Cannot write to CRx with PSR.ic=1
-	 */
-	psr = ia64_clear_ic();
-#ifdef XEN
-	/* pal_vaddr must be unpinned before pinning
-	 * This is needed in the case of a nested EFI, PAL or SAL call */
-	__efi_unmap_pal_code(pal_vaddr);
-#endif
-	ia64_itr(0x1, IA64_TR_PALCODE, GRANULEROUNDDOWN((unsigned long) pal_vaddr),
-		 pte_val(pfn_pte(__pa(pal_vaddr) >> PAGE_SHIFT, PAGE_KERNEL)),
-		 IA64_GRANULE_SHIFT);
-	ia64_set_psr(psr);		/* restore psr */
-	ia64_srlz_i();
-}
-
-void __init
-efi_init (void)
-{
-	void *efi_map_start, *efi_map_end;
-	efi_config_table_t *config_tables;
-	efi_char16_t *c16;
-	u64 efi_desc_size;
-	char *cp, vendor[100] = "unknown";
-	int i;
-
-	/* it's too early to be able to use the standard kernel command line support... */
-#ifdef XEN
-	extern char saved_command_line[];
-	for (cp = saved_command_line; *cp; ) {
-#else
-	for (cp = boot_command_line; *cp; ) {
-#endif
-		if (memcmp(cp, "mem=", 4) == 0) {
-			mem_limit = memparse(cp + 4, &cp);
-		} else if (memcmp(cp, "max_addr=", 9) == 0) {
-			max_addr = GRANULEROUNDDOWN(memparse(cp + 9, &cp));
-		} else if (memcmp(cp, "min_addr=", 9) == 0) {
-			min_addr = GRANULEROUNDDOWN(memparse(cp + 9, &cp));
-		} else {
-			while (*cp != ' ' && *cp)
-				++cp;
-			while (*cp == ' ')
-				++cp;
-		}
-	}
-	if (min_addr != 0UL)
-		printk(KERN_INFO "Ignoring memory below %luMB\n", min_addr >> 20);
-	if (max_addr != ~0UL)
-		printk(KERN_INFO "Ignoring memory above %luMB\n", max_addr >> 20);
-
-	efi.systab = __va(ia64_boot_param->efi_systab);
-
-	/*
-	 * Verify the EFI Table
-	 */
-	if (efi.systab == NULL)
-		panic("Woah! Can't find EFI system table.\n");
-	if (efi.systab->hdr.signature != EFI_SYSTEM_TABLE_SIGNATURE)
-		panic("Woah! EFI system table signature incorrect\n");
-	if ((efi.systab->hdr.revision >> 16) == 0)
-		printk(KERN_WARNING "Warning: EFI system table version "
-		       "%d.%02d, expected 1.00 or greater\n",
-		       efi.systab->hdr.revision >> 16,
-		       efi.systab->hdr.revision & 0xffff);
-
-	config_tables = __va(efi.systab->tables);
-
-	/* Show what we know for posterity */
-	c16 = __va(efi.systab->fw_vendor);
-	if (c16) {
-		for (i = 0;i < (int) sizeof(vendor) - 1 && *c16; ++i)
-			vendor[i] = *c16++;
-		vendor[i] = '\0';
-	}
-
-	printk(KERN_INFO "EFI v%u.%.02u by %s:",
-	       efi.systab->hdr.revision >> 16, efi.systab->hdr.revision & 0xffff, vendor);
-
-	efi.mps        = EFI_INVALID_TABLE_ADDR;
-	efi.acpi       = EFI_INVALID_TABLE_ADDR;
-	efi.acpi20     = EFI_INVALID_TABLE_ADDR;
-	efi.smbios     = EFI_INVALID_TABLE_ADDR;
-	efi.sal_systab = EFI_INVALID_TABLE_ADDR;
-	efi.boot_info  = EFI_INVALID_TABLE_ADDR;
-	efi.hcdp       = EFI_INVALID_TABLE_ADDR;
-	efi.uga        = EFI_INVALID_TABLE_ADDR;
-
-	for (i = 0; i < (int) efi.systab->nr_tables; i++) {
-		if (efi_guidcmp(config_tables[i].guid, MPS_TABLE_GUID) == 0) {
-			efi.mps = config_tables[i].table;
-			printk(" MPS=0x%lx", config_tables[i].table);
-		} else if (efi_guidcmp(config_tables[i].guid, ACPI_20_TABLE_GUID) == 0) {
-			efi.acpi20 = config_tables[i].table;
-			printk(" ACPI 2.0=0x%lx", config_tables[i].table);
-		} else if (efi_guidcmp(config_tables[i].guid, ACPI_TABLE_GUID) == 0) {
-			efi.acpi = config_tables[i].table;
-			printk(" ACPI=0x%lx", config_tables[i].table);
-		} else if (efi_guidcmp(config_tables[i].guid, SMBIOS_TABLE_GUID) == 0) {
-			efi.smbios = config_tables[i].table;
-			printk(" SMBIOS=0x%lx", config_tables[i].table);
-		} else if (efi_guidcmp(config_tables[i].guid, SAL_SYSTEM_TABLE_GUID) == 0) {
-			efi.sal_systab = config_tables[i].table;
-			printk(" SALsystab=0x%lx", config_tables[i].table);
-		} else if (efi_guidcmp(config_tables[i].guid, HCDP_TABLE_GUID) == 0) {
-			efi.hcdp = config_tables[i].table;
-			printk(" HCDP=0x%lx", config_tables[i].table);
-		}
-	}
-	printk("\n");
-
-	runtime = __va(efi.systab->runtime);
-	efi.get_time = phys_get_time;
-	efi.set_time = phys_set_time;
-	efi.get_wakeup_time = phys_get_wakeup_time;
-	efi.set_wakeup_time = phys_set_wakeup_time;
-	efi.get_variable = phys_get_variable;
-	efi.get_next_variable = phys_get_next_variable;
-	efi.set_variable = phys_set_variable;
-	efi.get_next_high_mono_count = phys_get_next_high_mono_count;
-	efi.reset_system = phys_reset_system;
-
-	efi_map_start = __va(ia64_boot_param->efi_memmap);
-	efi_map_end   = efi_map_start + ia64_boot_param->efi_memmap_size;
-	efi_desc_size = ia64_boot_param->efi_memdesc_size;
-
-#if EFI_DEBUG
-	/* print EFI memory map: */
-	{
-		efi_memory_desc_t *md;
-		void *p;
-
-		for (i = 0, p = efi_map_start; p < efi_map_end; ++i, p += efi_desc_size) {
-			md = p;
-			printk("mem%02u: type=%u, attr=0x%lx, range=[0x%016lx-0x%016lx) (%luMB)\n",
-			       i, md->type, md->attribute, md->phys_addr,
-			       md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT),
-			       md->num_pages >> (20 - EFI_PAGE_SHIFT));
-		}
-	}
-#endif
-
-#ifndef XEN
-	efi_map_pal_code();
-#endif
-	efi_enter_virtual_mode();
-}
-
-void
-efi_enter_virtual_mode (void)
-{
-	void *efi_map_start, *efi_map_end, *p;
-	efi_memory_desc_t *md;
-	efi_status_t status;
-	u64 efi_desc_size;
-
-	efi_map_start = __va(ia64_boot_param->efi_memmap);
-	efi_map_end   = efi_map_start + ia64_boot_param->efi_memmap_size;
-	efi_desc_size = ia64_boot_param->efi_memdesc_size;
-
-	for (p = efi_map_start; p < efi_map_end; p += efi_desc_size) {
-		md = p;
-#ifdef XEN
-		if (md->attribute & EFI_MEMORY_RUNTIME) {
-			if (md->attribute & EFI_MEMORY_WB)
-				md->virt_addr = __IA64_EFI_CACHED_OFFSET|
-						md->phys_addr;
-			else if (md->attribute & (EFI_MEMORY_UC|EFI_MEMORY_WC|
-						  EFI_MEMORY_WT))
-				md->virt_addr = __IA64_EFI_UNCACHED_OFFSET|
-						md->phys_addr;
-		}
-#else
-		if (md->attribute & EFI_MEMORY_RUNTIME) {
-			/*
-			 * Some descriptors have multiple bits set, so the order of
-			 * the tests is relevant.
-			 */
-			if (md->attribute & EFI_MEMORY_WB) {
-				md->virt_addr = (u64) __va(md->phys_addr);
-			} else if (md->attribute & EFI_MEMORY_UC) {
-				md->virt_addr = (u64) ioremap(md->phys_addr, 0);
-			} else if (md->attribute & EFI_MEMORY_WC) {
-#if 0
-				md->virt_addr = ia64_remap(md->phys_addr, (_PAGE_A | _PAGE_P
-									   | _PAGE_D
-									   | _PAGE_MA_WC
-									   | _PAGE_PL_0
-									   | _PAGE_AR_RW));
-#else
-				printk(KERN_INFO "EFI_MEMORY_WC mapping\n");
-				md->virt_addr = (u64) ioremap(md->phys_addr, 0);
-#endif
-			} else if (md->attribute & EFI_MEMORY_WT) {
-#if 0
-				md->virt_addr = ia64_remap(md->phys_addr, (_PAGE_A | _PAGE_P
-									   | _PAGE_D | _PAGE_MA_WT
-									   | _PAGE_PL_0
-									   | _PAGE_AR_RW));
-#else
-				printk(KERN_INFO "EFI_MEMORY_WT mapping\n");
-				md->virt_addr = (u64) ioremap(md->phys_addr, 0);
-#endif
-			}
-		}
-#endif
-	}
-
-	status = efi_call_phys(__va(runtime->set_virtual_address_map),
-			       ia64_boot_param->efi_memmap_size,
-			       efi_desc_size, ia64_boot_param->efi_memdesc_version,
-			       ia64_boot_param->efi_memmap);
-	if (status != EFI_SUCCESS) {
-		printk(KERN_WARNING "warning: unable to switch EFI into virtual mode "
-		       "(status=%lu)\n", status);
-		return;
-	}
-
-	/*
-	 * Now that EFI is in virtual mode, we call the EFI functions more efficiently:
-	 */
-	efi.get_time = virt_get_time;
-	efi.set_time = virt_set_time;
-	efi.get_wakeup_time = virt_get_wakeup_time;
-	efi.set_wakeup_time = virt_set_wakeup_time;
-	efi.get_variable = virt_get_variable;
-	efi.get_next_variable = virt_get_next_variable;
-	efi.set_variable = virt_set_variable;
-	efi.get_next_high_mono_count = virt_get_next_high_mono_count;
-	efi.reset_system = virt_reset_system;
-}
-
-/*
- * Walk the EFI memory map looking for the I/O port range.  There can only be one entry of
- * this type, other I/O port ranges should be described via ACPI.
- */
-u64
-efi_get_iobase (void)
-{
-	void *efi_map_start, *efi_map_end, *p;
-	efi_memory_desc_t *md;
-	u64 efi_desc_size;
-
-	efi_map_start = __va(ia64_boot_param->efi_memmap);
-	efi_map_end   = efi_map_start + ia64_boot_param->efi_memmap_size;
-	efi_desc_size = ia64_boot_param->efi_memdesc_size;
-
-	for (p = efi_map_start; p < efi_map_end; p += efi_desc_size) {
-		md = p;
-		if (md->type == EFI_MEMORY_MAPPED_IO_PORT_SPACE) {
-			if (md->attribute & EFI_MEMORY_UC)
-				return md->phys_addr;
-		}
-	}
-	return 0;
-}
-
-static struct kern_memdesc *
-kern_memory_descriptor (unsigned long phys_addr)
-{
-	struct kern_memdesc *md;
-
-	for (md = kern_memmap; md->start != ~0UL; md++) {
-		if (phys_addr - md->start < (md->num_pages << EFI_PAGE_SHIFT))
-			 return md;
-	}
-	return NULL;
-}
-
-static efi_memory_desc_t *
-efi_memory_descriptor (unsigned long phys_addr)
-{
-	void *efi_map_start, *efi_map_end, *p;
-	efi_memory_desc_t *md;
-	u64 efi_desc_size;
-
-	efi_map_start = __va(ia64_boot_param->efi_memmap);
-	efi_map_end   = efi_map_start + ia64_boot_param->efi_memmap_size;
-	efi_desc_size = ia64_boot_param->efi_memdesc_size;
-
-	for (p = efi_map_start; p < efi_map_end; p += efi_desc_size) {
-		md = p;
-
-		if (phys_addr - md->phys_addr < (md->num_pages << EFI_PAGE_SHIFT))
-			 return md;
-	}
-	return NULL;
-}
-
-u32
-efi_mem_type (unsigned long phys_addr)
-{
-	efi_memory_desc_t *md = efi_memory_descriptor(phys_addr);
-
-	if (md)
-		return md->type;
-	return 0;
-}
-
-u64
-efi_mem_attributes (unsigned long phys_addr)
-{
-	efi_memory_desc_t *md = efi_memory_descriptor(phys_addr);
-
-	if (md)
-		return md->attribute;
-	return 0;
-}
-EXPORT_SYMBOL(efi_mem_attributes);
-
-u64
-efi_mem_attribute (unsigned long phys_addr, unsigned long size)
-{
-	unsigned long end = phys_addr + size;
-	efi_memory_desc_t *md = efi_memory_descriptor(phys_addr);
-	u64 attr;
-
-	if (!md)
-		return 0;
-
-	/*
-	 * EFI_MEMORY_RUNTIME is not a memory attribute; it just tells
-	 * the kernel that firmware needs this region mapped.
-	 */
-	attr = md->attribute & ~EFI_MEMORY_RUNTIME;
-	do {
-		unsigned long md_end = efi_md_end(md);
-
-		if (end <= md_end)
-			return attr;
-
-		md = efi_memory_descriptor(md_end);
-		if (!md || (md->attribute & ~EFI_MEMORY_RUNTIME) != attr)
-			return 0;
-	} while (md);
-	return 0;
-}
-
-u64
-kern_mem_attribute (unsigned long phys_addr, unsigned long size)
-{
-	unsigned long end = phys_addr + size;
-	struct kern_memdesc *md;
-	u64 attr;
-
-	/*
-	 * This is a hack for ioremap calls before we set up kern_memmap.
-	 * Maybe we should do efi_memmap_init() earlier instead.
-	 */
-	if (!kern_memmap) {
-		attr = efi_mem_attribute(phys_addr, size);
-		if (attr & EFI_MEMORY_WB)
-			return EFI_MEMORY_WB;
-		return 0;
-	}
-
-	md = kern_memory_descriptor(phys_addr);
-	if (!md)
-		return 0;
-
-	attr = md->attribute;
-	do {
-		unsigned long md_end = kmd_end(md);
-
-		if (end <= md_end)
-			return attr;
-
-		md = kern_memory_descriptor(md_end);
-		if (!md || md->attribute != attr)
-			return 0;
-	} while (md);
-	return 0;
-}
-EXPORT_SYMBOL(kern_mem_attribute);
-
-#ifndef XEN
-int
-valid_phys_addr_range (unsigned long phys_addr, unsigned long size)
-{
-	u64 attr;
-
-	/*
-	 * /dev/mem reads and writes use copy_to_user(), which implicitly
-	 * uses a granule-sized kernel identity mapping.  It's really
-	 * only safe to do this for regions in kern_memmap.  For more
-	 * details, see Documentation/ia64/aliasing.txt.
-	 */
-	attr = kern_mem_attribute(phys_addr, size);
-	if (attr & EFI_MEMORY_WB || attr & EFI_MEMORY_UC)
-		return 1;
-	return 0;
-}
-
-int
-valid_mmap_phys_addr_range (unsigned long pfn, unsigned long size)
-{
-	/*
-	 * MMIO regions are often missing from the EFI memory map.
-	 * We must allow mmap of them for programs like X, so we
-	 * currently can't do any useful validation.
-	 */
-	return 1;
-}
-
-pgprot_t
-phys_mem_access_prot(struct file *file, unsigned long pfn, unsigned long size,
-		     pgprot_t vma_prot)
-{
-	unsigned long phys_addr = pfn << PAGE_SHIFT;
-	u64 attr;
-
-	/*
-	 * For /dev/mem mmap, we use user mappings, but if the region is
-	 * in kern_memmap (and hence may be covered by a kernel mapping),
-	 * we must use the same attribute as the kernel mapping.
-	 */
-	attr = kern_mem_attribute(phys_addr, size);
-	if (attr & EFI_MEMORY_WB)
-		return pgprot_cacheable(vma_prot);
-	else if (attr & EFI_MEMORY_UC)
-		return pgprot_noncached(vma_prot);
-
-	/*
-	 * Some chipsets don't support UC access to memory.  If
-	 * WB is supported, we prefer that.
-	 */
-	if (efi_mem_attribute(phys_addr, size) & EFI_MEMORY_WB)
-		return pgprot_cacheable(vma_prot);
-
-	return pgprot_noncached(vma_prot);
-}
-#endif
-
-int __init
-efi_uart_console_only(void)
-{
-	efi_status_t status;
-	char *s, name[] = "ConOut";
-	efi_guid_t guid = EFI_GLOBAL_VARIABLE_GUID;
-	efi_char16_t *utf16, name_utf16[32];
-	unsigned char data[1024];
-	unsigned long size = sizeof(data);
-	struct efi_generic_dev_path *hdr, *end_addr;
-	int uart = 0;
-
-	/* Convert to UTF-16 */
-	utf16 = name_utf16;
-	s = name;
-	while (*s)
-		*utf16++ = *s++ & 0x7f;
-	*utf16 = 0;
-
-	status = efi.get_variable(name_utf16, &guid, NULL, &size, data);
-	if (status != EFI_SUCCESS) {
-		printk(KERN_ERR "No EFI %s variable?\n", name);
-		return 0;
-	}
-
-	hdr = (struct efi_generic_dev_path *) data;
-	end_addr = (struct efi_generic_dev_path *) ((u8 *) data + size);
-	while (hdr < end_addr) {
-		if (hdr->type == EFI_DEV_MSG &&
-		    hdr->sub_type == EFI_DEV_MSG_UART)
-			uart = 1;
-		else if (hdr->type == EFI_DEV_END_PATH ||
-			  hdr->type == EFI_DEV_END_PATH2) {
-			if (!uart)
-				return 0;
-			if (hdr->sub_type == EFI_DEV_END_ENTIRE)
-				return 1;
-			uart = 0;
-		}
-		hdr = (struct efi_generic_dev_path *) ((u8 *) hdr + hdr->length);
-	}
-	printk(KERN_ERR "Malformed %s value\n", name);
-	return 0;
-}
-
-/*
- * Look for the first granule aligned memory descriptor memory
- * that is big enough to hold EFI memory map. Make sure this
- * descriptor is atleast granule sized so it does not get trimmed
- */
-struct kern_memdesc *
-find_memmap_space (void)
-{
-	u64	contig_low=0, contig_high=0;
-	u64	as = 0, ae;
-	void *efi_map_start, *efi_map_end, *p, *q;
-	efi_memory_desc_t *md, *pmd = NULL, *check_md;
-	u64	space_needed, efi_desc_size;
-	unsigned long total_mem = 0;
-
-	efi_map_start = __va(ia64_boot_param->efi_memmap);
-	efi_map_end   = efi_map_start + ia64_boot_param->efi_memmap_size;
-	efi_desc_size = ia64_boot_param->efi_memdesc_size;
-
-	/*
-	 * Worst case: we need 3 kernel descriptors for each efi descriptor
-	 * (if every entry has a WB part in the middle, and UC head and tail),
-	 * plus one for the end marker.
-	 */
-	space_needed = sizeof(kern_memdesc_t) *
-		(3 * (ia64_boot_param->efi_memmap_size/efi_desc_size) + 1);
-
-	for (p = efi_map_start; p < efi_map_end; pmd = md, p += efi_desc_size) {
-		md = p;
-		if (!efi_wb(md)) {
-			continue;
-		}
-		if (pmd == NULL || !efi_wb(pmd) || efi_md_end(pmd) != md->phys_addr) {
-			contig_low = GRANULEROUNDUP(md->phys_addr);
-			contig_high = efi_md_end(md);
-			for (q = p + efi_desc_size; q < efi_map_end; q += efi_desc_size) {
-				check_md = q;
-				if (!efi_wb(check_md))
-					break;
-				if (contig_high != check_md->phys_addr)
-					break;
-				contig_high = efi_md_end(check_md);
-			}
-			contig_high = GRANULEROUNDDOWN(contig_high);
-		}
-		if (!is_memory_available(md) || md->type == EFI_LOADER_DATA)
-			continue;
-
-		/* Round ends inward to granule boundaries */
-		as = max(contig_low, md->phys_addr);
-		ae = min(contig_high, efi_md_end(md));
-
-		/* keep within max_addr= and min_addr= command line arg */
-		as = max(as, min_addr);
-		ae = min(ae, max_addr);
-		if (ae <= as)
-			continue;
-
-		/* avoid going over mem= command line arg */
-		if (total_mem + (ae - as) > mem_limit)
-			ae -= total_mem + (ae - as) - mem_limit;
-
-		if (ae <= as)
-			continue;
-
-		if (ae - as > space_needed)
-			break;
-	}
-	if (p >= efi_map_end)
-		panic("Can't allocate space for kernel memory descriptors");
-
-	return __va(as);
-}
-
-/*
- * Walk the EFI memory map and gather all memory available for kernel
- * to use.  We can allocate partial granules only if the unavailable
- * parts exist, and are WB.
- */
-void
-efi_memmap_init(unsigned long *s, unsigned long *e)
-{
-	struct kern_memdesc *k, *prev = NULL;
-	u64	contig_low=0, contig_high=0;
-	u64	as, ae, lim;
-	void *efi_map_start, *efi_map_end, *p, *q;
-	efi_memory_desc_t *md, *pmd = NULL, *check_md;
-	u64	efi_desc_size;
-	unsigned long total_mem = 0;
-
-	k = kern_memmap = find_memmap_space();
-
-	efi_map_start = __va(ia64_boot_param->efi_memmap);
-	efi_map_end   = efi_map_start + ia64_boot_param->efi_memmap_size;
-	efi_desc_size = ia64_boot_param->efi_memdesc_size;
-
-	for (p = efi_map_start; p < efi_map_end; pmd = md, p += efi_desc_size) {
-		md = p;
-		if (!efi_wb(md)) {
-			if (efi_uc(md) && (md->type == EFI_CONVENTIONAL_MEMORY ||
-				    	   md->type == EFI_BOOT_SERVICES_DATA)) {
-				k->attribute = EFI_MEMORY_UC;
-				k->start = md->phys_addr;
-				k->num_pages = md->num_pages;
-				k++;
-			}
-			continue;
-		}
-#ifdef XEN
-		/* this works around a problem in the ski bootloader */
-		if (running_on_sim && md->type != EFI_CONVENTIONAL_MEMORY)
-			continue;
-#endif
-		if (pmd == NULL || !efi_wb(pmd) || efi_md_end(pmd) != md->phys_addr) {
-			contig_low = GRANULEROUNDUP(md->phys_addr);
-			contig_high = efi_md_end(md);
-			for (q = p + efi_desc_size; q < efi_map_end; q += efi_desc_size) {
-				check_md = q;
-				if (!efi_wb(check_md))
-					break;
-				if (contig_high != check_md->phys_addr)
-					break;
-				contig_high = efi_md_end(check_md);
-			}
-			contig_high = GRANULEROUNDDOWN(contig_high);
-		}
-		if (!is_memory_available(md))
-			continue;
-
-#ifdef CONFIG_CRASH_DUMP
-		/* saved_max_pfn should ignore max_addr= command line arg */
-		if (saved_max_pfn < (efi_md_end(md) >> PAGE_SHIFT))
-			saved_max_pfn = (efi_md_end(md) >> PAGE_SHIFT);
-#endif
-		/*
-		 * Round ends inward to granule boundaries
-		 * Give trimmings to uncached allocator
-		 */
-		if (md->phys_addr < contig_low) {
-			lim = min(efi_md_end(md), contig_low);
-			if (efi_uc(md)) {
-				if (k > kern_memmap && (k-1)->attribute == EFI_MEMORY_UC &&
-				    kmd_end(k-1) == md->phys_addr) {
-					(k-1)->num_pages += (lim - md->phys_addr) >> EFI_PAGE_SHIFT;
-				} else {
-					k->attribute = EFI_MEMORY_UC;
-					k->start = md->phys_addr;
-					k->num_pages = (lim - md->phys_addr) >> EFI_PAGE_SHIFT;
-					k++;
-				}
-			}
-			as = contig_low;
-		} else
-			as = md->phys_addr;
-
-		if (efi_md_end(md) > contig_high) {
-			lim = max(md->phys_addr, contig_high);
-			if (efi_uc(md)) {
-				if (lim == md->phys_addr && k > kern_memmap &&
-				    (k-1)->attribute == EFI_MEMORY_UC &&
-				    kmd_end(k-1) == md->phys_addr) {
-					(k-1)->num_pages += md->num_pages;
-				} else {
-					k->attribute = EFI_MEMORY_UC;
-					k->start = lim;
-					k->num_pages = (efi_md_end(md) - lim) >> EFI_PAGE_SHIFT;
-					k++;
-				}
-			}
-			ae = contig_high;
-		} else
-			ae = efi_md_end(md);
-
-		/* keep within max_addr= and min_addr= command line arg */
-		as = max(as, min_addr);
-		ae = min(ae, max_addr);
-		if (ae <= as)
-			continue;
-
-		/* avoid going over mem= command line arg */
-		if (total_mem + (ae - as) > mem_limit)
-			ae -= total_mem + (ae - as) - mem_limit;
-
-		if (ae <= as)
-			continue;
-		if (prev && kmd_end(prev) == md->phys_addr) {
-			prev->num_pages += (ae - as) >> EFI_PAGE_SHIFT;
-			total_mem += ae - as;
-			continue;
-		}
-		k->attribute = EFI_MEMORY_WB;
-		k->start = as;
-		k->num_pages = (ae - as) >> EFI_PAGE_SHIFT;
-		total_mem += ae - as;
-		prev = k++;
-	}
-	k->start = ~0L; /* end-marker */
-
-	/* reserve the memory we are using for kern_memmap */
-	*s = (u64)kern_memmap;
-	*e = (u64)++k;
-}
-
-#ifndef XEN
-void
-efi_initialize_iomem_resources(struct resource *code_resource,
-			       struct resource *data_resource)
-{
-	struct resource *res;
-	void *efi_map_start, *efi_map_end, *p;
-	efi_memory_desc_t *md;
-	u64 efi_desc_size;
-	char *name;
-	unsigned long flags;
-
-	efi_map_start = __va(ia64_boot_param->efi_memmap);
-	efi_map_end   = efi_map_start + ia64_boot_param->efi_memmap_size;
-	efi_desc_size = ia64_boot_param->efi_memdesc_size;
-
-	res = NULL;
-
-	for (p = efi_map_start; p < efi_map_end; p += efi_desc_size) {
-		md = p;
-
-		if (md->num_pages == 0) /* should not happen */
-			continue;
-
-		flags = IORESOURCE_MEM;
-		switch (md->type) {
-
-			case EFI_MEMORY_MAPPED_IO:
-			case EFI_MEMORY_MAPPED_IO_PORT_SPACE:
-				continue;
-
-			case EFI_LOADER_CODE:
-			case EFI_LOADER_DATA:
-			case EFI_BOOT_SERVICES_DATA:
-			case EFI_BOOT_SERVICES_CODE:
-			case EFI_CONVENTIONAL_MEMORY:
-				if (md->attribute & EFI_MEMORY_WP) {
-					name = "System ROM";
-					flags |= IORESOURCE_READONLY;
-				} else {
-					name = "System RAM";
-				}
-				break;
-
-			case EFI_ACPI_MEMORY_NVS:
-				name = "ACPI Non-volatile Storage";
-				flags |= IORESOURCE_BUSY;
-				break;
-
-			case EFI_UNUSABLE_MEMORY:
-				name = "reserved";
-				flags |= IORESOURCE_BUSY | IORESOURCE_DISABLED;
-				break;
-
-			case EFI_RESERVED_TYPE:
-			case EFI_RUNTIME_SERVICES_CODE:
-			case EFI_RUNTIME_SERVICES_DATA:
-			case EFI_ACPI_RECLAIM_MEMORY:
-			default:
-				name = "reserved";
-				flags |= IORESOURCE_BUSY;
-				break;
-		}
-
-		if ((res = kzalloc(sizeof(struct resource), GFP_KERNEL)) == NULL) {
-			printk(KERN_ERR "failed to alocate resource for iomem\n");
-			return;
-		}
-
-		res->name = name;
-		res->start = md->phys_addr;
-		res->end = md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT) - 1;
-		res->flags = flags;
-
-		if (insert_resource(&iomem_resource, res) < 0)
-			kfree(res);
-		else {
-			/*
-			 * We don't know which region contains
-			 * kernel data so we try it repeatedly and
-			 * let the resource manager test it.
-			 */
-			insert_resource(res, code_resource);
-			insert_resource(res, data_resource);
-#ifdef CONFIG_KEXEC
-                        insert_resource(res, &efi_memmap_res);
-                        insert_resource(res, &boot_param_res);
-			if (crashk_res.end > crashk_res.start)
-				insert_resource(res, &crashk_res);
-#endif
-		}
-	}
-}
-#endif /* XEN */
-
-#if defined(CONFIG_KEXEC) || defined(XEN)
-/* find a block of memory aligned to 64M exclude reserved regions
-   rsvd_regions are sorted
- */
-unsigned long __init
-kdump_find_rsvd_region (unsigned long size,
-		struct rsvd_region *r, int n)
-{
-  int i;
-  u64 start, end;
-  u64 alignment = 1UL << _PAGE_SIZE_64M;
-  void *efi_map_start, *efi_map_end, *p;
-  efi_memory_desc_t *md;
-  u64 efi_desc_size;
-
-  efi_map_start = __va(ia64_boot_param->efi_memmap);
-  efi_map_end   = efi_map_start + ia64_boot_param->efi_memmap_size;
-  efi_desc_size = ia64_boot_param->efi_memdesc_size;
-
-  for (p = efi_map_start; p < efi_map_end; p += efi_desc_size) {
-	  md = p;
-	  if (!efi_wb(md))
-		  continue;
-	  start = ALIGN(md->phys_addr, alignment);
-	  end = efi_md_end(md);
-	  for (i = 0; i < n; i++) {
-		if (__pa(r[i].start) >= start && __pa(r[i].end) < end) {
-			if (__pa(r[i].start) > start + size)
-				return start;
-			start = ALIGN(__pa(r[i].end), alignment);
-			if (i < n-1 && __pa(r[i+1].start) < start + size)
-				continue;
-			else
-				break;
-		}
-	  }
-	  if (end > start + size)
-		return start;
-  }
-
-  printk(KERN_WARNING "Cannot reserve 0x%lx byte of memory for crashdump\n",
-	size);
-  return ~0UL;
-}
-#endif
-
-#ifndef XEN
-#ifdef CONFIG_PROC_VMCORE
-/* locate the size find a the descriptor at a certain address */
-unsigned long
-vmcore_find_descriptor_size (unsigned long address)
-{
-	void *efi_map_start, *efi_map_end, *p;
-	efi_memory_desc_t *md;
-	u64 efi_desc_size;
-	unsigned long ret = 0;
-
-	efi_map_start = __va(ia64_boot_param->efi_memmap);
-	efi_map_end   = efi_map_start + ia64_boot_param->efi_memmap_size;
-	efi_desc_size = ia64_boot_param->efi_memdesc_size;
-
-	for (p = efi_map_start; p < efi_map_end; p += efi_desc_size) {
-		md = p;
-		if (efi_wb(md) && md->type == EFI_LOADER_DATA
-		    && md->phys_addr == address) {
-			ret = efi_md_size(md);
-			break;
-		}
-	}
-
-	if (ret == 0)
-		printk(KERN_WARNING "Cannot locate EFI vmcore descriptor\n");
-
-	return ret;
-}
-#endif
-#endif /* XEN */
diff -r 2386288b1bf1 -r 8aa1697d57e4 xen/arch/ia64/linux-xen/entry.S
--- a/xen/arch/ia64/linux-xen/entry.S	Mon Apr 02 18:14:31 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1851 +0,0 @@
-/*
- * ia64/kernel/entry.S
- *
- * Kernel entry points.
- *
- * Copyright (C) 1998-2003, 2005 Hewlett-Packard Co
- *	David Mosberger-Tang <davidm@hpl.hp.com>
- * Copyright (C) 1999, 2002-2003
- *	Asit Mallick <Asit.K.Mallick@intel.com>
- * 	Don Dugger <Don.Dugger@intel.com>
- *	Suresh Siddha <suresh.b.siddha@intel.com>
- *	Fenghua Yu <fenghua.yu@intel.com>
- * Copyright (C) 1999 VA Linux Systems
- * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
- */
-/*
- * ia64_switch_to now places correct virtual mapping in in TR2 for
- * kernel stack. This allows us to handle interrupts without changing
- * to physical mode.
- *
- * Jonathan Nicklin	<nicklin@missioncriticallinux.com>
- * Patrick O'Rourke	<orourke@missioncriticallinux.com>
- * 11/07/2000
- */
-/*
- * Global (preserved) predicate usage on syscall entry/exit path:
- *
- *	pKStk:		See entry.h.
- *	pUStk:		See entry.h.
- *	pSys:		See entry.h.
- *	pNonSys:	!pSys
- */
-
-#include <linux/config.h>
-
-#include <asm/asmmacro.h>
-#include <asm/cache.h>
-#ifdef XEN
-#include <xen/errno.h>
-#else
-#include <asm/errno.h>
-#endif
-#include <asm/kregs.h>
-#include <asm/offsets.h>
-#include <asm/pgtable.h>
-#include <asm/percpu.h>
-#include <asm/processor.h>
-#include <asm/thread_info.h>
-#include <asm/unistd.h>
-
-#include "minstate.h"
-
-#ifndef XEN
-	/*
-	 * execve() is special because in case of success, we need to
-	 * setup a null register window frame.
-	 */
-ENTRY(ia64_execve)
-	/*
-	 * Allocate 8 input registers since ptrace() may clobber them
-	 */
-	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
-	alloc loc1=ar.pfs,8,2,4,0
-	mov loc0=rp
-	.body
-	mov out0=in0			// filename
-	;;				// stop bit between alloc and call
-	mov out1=in1			// argv
-	mov out2=in2			// envp
-	add out3=16,sp			// regs
-	br.call.sptk.many rp=sys_execve
-.ret0:
-#ifdef CONFIG_IA32_SUPPORT
-	/*
-	 * Check if we're returning to ia32 mode. If so, we need to restore ia32 registers
-	 * from pt_regs.
-	 */
-	adds r16=PT(CR_IPSR)+16,sp
-	;;
-	ld8 r16=[r16]
-#endif
-	cmp4.ge p6,p7=r8,r0
-	mov ar.pfs=loc1			// restore ar.pfs
-	sxt4 r8=r8			// return 64-bit result
-	;;
-	stf.spill [sp]=f0
-(p6)	cmp.ne pKStk,pUStk=r0,r0	// a successful execve() lands us in user-mode...
-	mov rp=loc0
-(p6)	mov ar.pfs=r0			// clear ar.pfs on success
-(p7)	br.ret.sptk.many rp
-
-	/*
-	 * In theory, we'd have to zap this state only to prevent leaking of
-	 * security sensitive state (e.g., if current->mm->dumpable is zero).  However,
-	 * this executes in less than 20 cycles even on Itanium, so it's not worth
-	 * optimizing for...).
-	 */
-	mov ar.unat=0; 		mov ar.lc=0
-	mov r4=0;		mov f2=f0;		mov b1=r0
-	mov r5=0;		mov f3=f0;		mov b2=r0
-	mov r6=0;		mov f4=f0;		mov b3=r0
-	mov r7=0;		mov f5=f0;		mov b4=r0
-	ldf.fill f12=[sp];	mov f13=f0;		mov b5=r0
-	ldf.fill f14=[sp];	ldf.fill f15=[sp];	mov f16=f0
-	ldf.fill f17=[sp];	ldf.fill f18=[sp];	mov f19=f0
-	ldf.fill f20=[sp];	ldf.fill f21=[sp];	mov f22=f0
-	ldf.fill f23=[sp];	ldf.fill f24=[sp];	mov f25=f0
-	ldf.fill f26=[sp];	ldf.fill f27=[sp];	mov f28=f0
-	ldf.fill f29=[sp];	ldf.fill f30=[sp];	mov f31=f0
-#ifdef CONFIG_IA32_SUPPORT
-	tbit.nz p6,p0=r16, IA64_PSR_IS_BIT
-	movl loc0=ia64_ret_from_ia32_execve
-	;;
-(p6)	mov rp=loc0
-#endif
-	br.ret.sptk.many rp
-END(ia64_execve)
-
-/*
- * sys_clone2(u64 flags, u64 ustack_base, u64 ustack_size, u64 parent_tidptr, u64 child_tidptr,
- *	      u64 tls)
- */
-GLOBAL_ENTRY(sys_clone2)
-	/*
-	 * Allocate 8 input registers since ptrace() may clobber them
-	 */
-	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
-	alloc r16=ar.pfs,8,2,6,0
-	DO_SAVE_SWITCH_STACK
-	adds r2=PT(R16)+IA64_SWITCH_STACK_SIZE+16,sp
-	mov loc0=rp
-	mov loc1=r16				// save ar.pfs across do_fork
-	.body
-	mov out1=in1
-	mov out3=in2
-	tbit.nz p6,p0=in0,CLONE_SETTLS_BIT
-	mov out4=in3	// parent_tidptr: valid only w/CLONE_PARENT_SETTID
-	;;
-(p6)	st8 [r2]=in5				// store TLS in r16 for copy_thread()
-	mov out5=in4	// child_tidptr:  valid only w/CLONE_CHILD_SETTID or CLONE_CHILD_CLEARTID
-	adds out2=IA64_SWITCH_STACK_SIZE+16,sp	// out2 = &regs
-	mov out0=in0				// out0 = clone_flags
-	br.call.sptk.many rp=do_fork
-.ret1:	.restore sp
-	adds sp=IA64_SWITCH_STACK_SIZE,sp	// pop the switch stack
-	mov ar.pfs=loc1
-	mov rp=loc0
-	br.ret.sptk.many rp
-END(sys_clone2)
-
-/*
- * sys_clone(u64 flags, u64 ustack_base, u64 parent_tidptr, u64 child_tidptr, u64 tls)
- *	Deprecated.  Use sys_clone2() instead.
- */
-GLOBAL_ENTRY(sys_clone)
-	/*
-	 * Allocate 8 input registers since ptrace() may clobber them
-	 */
-	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
-	alloc r16=ar.pfs,8,2,6,0
-	DO_SAVE_SWITCH_STACK
-	adds r2=PT(R16)+IA64_SWITCH_STACK_SIZE+16,sp
-	mov loc0=rp
-	mov loc1=r16				// save ar.pfs across do_fork
-	.body
-	mov out1=in1
-	mov out3=16				// stacksize (compensates for 16-byte scratch area)
-	tbit.nz p6,p0=in0,CLONE_SETTLS_BIT
-	mov out4=in2	// parent_tidptr: valid only w/CLONE_PARENT_SETTID
-	;;
-(p6)	st8 [r2]=in4				// store TLS in r13 (tp)
-	mov out5=in3	// child_tidptr:  valid only w/CLONE_CHILD_SETTID or CLONE_CHILD_CLEARTID
-	adds out2=IA64_SWITCH_STACK_SIZE+16,sp	// out2 = &regs
-	mov out0=in0				// out0 = clone_flags
-	br.call.sptk.many rp=do_fork
-.ret2:	.restore sp
-	adds sp=IA64_SWITCH_STACK_SIZE,sp	// pop the switch stack
-	mov ar.pfs=loc1
-	mov rp=loc0
-	br.ret.sptk.many rp
-END(sys_clone)
-#endif
-
-/*
- * prev_task <- ia64_switch_to(struct task_struct *next)
- *	With Ingo's new scheduler, interrupts are disabled when this routine gets
- *	called.  The code starting at .map relies on this.  The rest of the code
- *	doesn't care about the interrupt masking status.
- */
-GLOBAL_ENTRY(ia64_switch_to)
-	.prologue
-	alloc r16=ar.pfs,1,0,0,0
-	DO_SAVE_SWITCH_STACK
-	.body
-
-	adds r22=IA64_TASK_THREAD_KSP_OFFSET,r13
-#ifdef XEN
-	movl r24=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_STACK_OFFSET;;
-	ld8 r27=[r24]
-	adds r21=IA64_TASK_THREAD_KSP_OFFSET,in0
-	dep r20=0,in0,60,4		// physical address of "next"
-#else
-	movl r25=init_task
-	mov r27=IA64_KR(CURRENT_STACK)
-	adds r21=IA64_TASK_THREAD_KSP_OFFSET,in0
-	dep r20=0,in0,61,3		// physical address of "next"
-#endif
-	;;
-	st8 [r22]=sp			// save kernel stack pointer of old task
-	shr.u r26=r20,IA64_GRANULE_SHIFT
-#ifdef XEN
-	;;
-	/*
-	 * If we've already mapped this task's page, we can skip doing it again.
-	 */
-	cmp.eq p7,p6=r26,r27
-(p6)	br.cond.dpnt .map
-#else	
-	cmp.eq p7,p6=r25,in0
-	;;
-	/*
-	 * If we've already mapped this task's page, we can skip doing it again.
-	 */
-(p6)	cmp.eq p7,p6=r26,r27
-(p6)	br.cond.dpnt .map
-#endif	
-	;;
-.done:
-(p6)	ssm psr.ic			// if we had to map, reenable the psr.ic bit FIRST!!!
-	;;
-(p6)	srlz.d
-	ld8 sp=[r21]			// load kernel stack pointer of new task
-#ifdef XEN
-	add r25=IA64_KR_CURRENT_OFFSET-IA64_KR_CURRENT_STACK_OFFSET,r24
-	;;
-	st8 [r25]=in0			// update "current" application register
-	;;
-	bsw.0
-	;;
-	mov r8=r13			// return pointer to previously running task
-	mov r13=in0			// set "current" pointer
-	mov r21=in0
-	;;
-	bsw.1
-	;;
-#else
-	mov IA64_KR(CURRENT)=in0	// update "current" application register
-	mov r8=r13          // return pointer to previously running task
-	mov r13=in0         // set "current" pointer
-#endif
-	DO_LOAD_SWITCH_STACK
-
-#ifdef CONFIG_SMP
-	sync.i				// ensure "fc"s done by this CPU are visible on other CPUs
-#endif
-	br.ret.sptk.many rp		// boogie on out in new context
-
-.map:
-	rsm psr.ic			// interrupts (psr.i) are already disabled here
-	movl r25=PAGE_KERNEL
-#ifdef XEN	
-	movl r27=IA64_GRANULE_SHIFT << 2
-#endif
-	;;
-	srlz.d
-	or r23=r25,r20			// construct PA | page properties
-#ifdef XEN
-	ptr.d in0,r27			// to purge dtr[IA64_TR_VHPT] and dtr[IA64_TR_VPD]
-#else
-	movl r27=IA64_GRANULE_SHIFT << 2	
-#endif
-	;;
-	mov cr.itir=r27
-	mov cr.ifa=in0			// VA of next task...
-#ifdef XEN
-	srlz.d
-#endif
-	;;
-	mov r25=IA64_TR_CURRENT_STACK
-#ifdef XEN
-	st8 [r24]=r26			// remember last page we mapped...
-#else
-	mov IA64_KR(CURRENT_STACK)=r26	// remember last page we mapped...
-#endif
-	;;
-	itr.d dtr[r25]=r23		// wire in new mapping...
-	br.cond.sptk .done
-END(ia64_switch_to)
-
-/*
- * Note that interrupts are enabled during save_switch_stack and load_switch_stack.  This
- * means that we may get an interrupt with "sp" pointing to the new kernel stack while
- * ar.bspstore is still pointing to the old kernel backing store area.  Since ar.rsc,
- * ar.rnat, ar.bsp, and ar.bspstore are all preserved by interrupts, this is not a
- * problem.  Also, we don't need to specify unwind information for preserved registers
- * that are not modified in save_switch_stack as the right unwind information is already
- * specified at the call-site of save_switch_stack.
- */
-
-/*
- * save_switch_stack:
- *	- r16 holds ar.pfs
- *	- b7 holds address to return to
- *	- rp (b0) holds return address to save
- */
-GLOBAL_ENTRY(save_switch_stack)
-	.prologue
-	.altrp b7
-	flushrs			// flush dirty regs to backing store (must be first in insn group)
-	.save @priunat,r17
-	mov r17=ar.unat		// preserve caller's
-	.body
-#ifdef CONFIG_ITANIUM
-	adds r2=16+128,sp
-	adds r3=16+64,sp
-	adds r14=SW(R4)+16,sp
-	;;
-	st8.spill [r14]=r4,16		// spill r4
-	lfetch.fault.excl.nt1 [r3],128
-	;;
-	lfetch.fault.excl.nt1 [r2],128
-	lfetch.fault.excl.nt1 [r3],128
-	;;
-	lfetch.fault.excl [r2]
-	lfetch.fault.excl [r3]
-	adds r15=SW(R5)+16,sp
-#else
-	add r2=16+3*128,sp
-	add r3=16,sp
-	add r14=SW(R4)+16,sp
-	;;
-	st8.spill [r14]=r4,SW(R6)-SW(R4)	// spill r4 and prefetch offset 0x1c0
-	lfetch.fault.excl.nt1 [r3],128	//		prefetch offset 0x010
-	;;
-	lfetch.fault.excl.nt1 [r3],128	//		prefetch offset 0x090
-	lfetch.fault.excl.nt1 [r2],128	//		prefetch offset 0x190
-	;;
-	lfetch.fault.excl.nt1 [r3]	//		prefetch offset 0x110
-	lfetch.fault.excl.nt1 [r2]	//		prefetch offset 0x210
-	adds r15=SW(R5)+16,sp
-#endif
-	;;
-	st8.spill [r15]=r5,SW(R7)-SW(R5)	// spill r5
-	mov.m ar.rsc=0			// put RSE in mode: enforced lazy, little endian, pl 0
-	add r2=SW(F2)+16,sp		// r2 = &sw->f2
-	;;
-	st8.spill [r14]=r6,SW(B0)-SW(R6)	// spill r6
-	mov.m r18=ar.fpsr		// preserve fpsr
-	add r3=SW(F3)+16,sp		// r3 = &sw->f3
-	;;
-	stf.spill [r2]=f2,32
-	mov.m r19=ar.rnat
-	mov r21=b0
-
-	stf.spill [r3]=f3,32
-	st8.spill [r15]=r7,SW(B2)-SW(R7)	// spill r7
-	mov r22=b1
-	;;
-	// since we're done with the spills, read and save ar.unat:
-	mov.m r29=ar.unat
-	mov.m r20=ar.bspstore
-	mov r23=b2
-	stf.spill [r2]=f4,32
-	stf.spill [r3]=f5,32
-	mov r24=b3
-	;;
-	st8 [r14]=r21,SW(B1)-SW(B0)		// save b0
-	st8 [r15]=r23,SW(B3)-SW(B2)		// save b2
-	mov r25=b4
-	mov r26=b5
-	;;
-	st8 [r14]=r22,SW(B4)-SW(B1)		// save b1
-	st8 [r15]=r24,SW(AR_PFS)-SW(B3)		// save b3
-	mov r21=ar.lc		// I-unit
-	stf.spill [r2]=f12,32
-	stf.spill [r3]=f13,32
-	;;
-	st8 [r14]=r25,SW(B5)-SW(B4)		// save b4
-	st8 [r15]=r16,SW(AR_LC)-SW(AR_PFS)	// save ar.pfs
-	stf.spill [r2]=f14,32
-	stf.spill [r3]=f15,32
-	;;
-	st8 [r14]=r26				// save b5
-	st8 [r15]=r21				// save ar.lc
-	stf.spill [r2]=f16,32
-	stf.spill [r3]=f17,32
-	;;
-	stf.spill [r2]=f18,32
-	stf.spill [r3]=f19,32
-	;;
-	stf.spill [r2]=f20,32
-	stf.spill [r3]=f21,32
-	;;
-	stf.spill [r2]=f22,32
-	stf.spill [r3]=f23,32
-	;;
-	stf.spill [r2]=f24,32
-	stf.spill [r3]=f25,32
-	;;
-	stf.spill [r2]=f26,32
-	stf.spill [r3]=f27,32
-	;;
-	stf.spill [r2]=f28,32
-	stf.spill [r3]=f29,32
-	;;
-	stf.spill [r2]=f30,SW(AR_UNAT)-SW(F30)
-	stf.spill [r3]=f31,SW(PR)-SW(F31)
-	add r14=SW(CALLER_UNAT)+16,sp
-	;;
-	st8 [r2]=r29,SW(AR_RNAT)-SW(AR_UNAT)	// save ar.unat
-	st8 [r14]=r17,SW(AR_FPSR)-SW(CALLER_UNAT) // save caller_unat
-	mov r21=pr
-	;;
-	st8 [r2]=r19,SW(AR_BSPSTORE)-SW(AR_RNAT) // save ar.rnat
-	st8 [r3]=r21				// save predicate registers
-	;;
-	st8 [r2]=r20				// save ar.bspstore
-	st8 [r14]=r18				// save fpsr
-	mov ar.rsc=3		// put RSE back into eager mode, pl 0
-	br.cond.sptk.many b7
-END(save_switch_stack)
-
-/*
- * load_switch_stack:
- *	- "invala" MUST be done at call site (normally in DO_LOAD_SWITCH_STACK)
- *	- b7 holds address to return to
- *	- must not touch r8-r11
- */
-#ifdef XEN
-GLOBAL_ENTRY(load_switch_stack)
-#else
-ENTRY(load_switch_stack)
-#endif
-	.prologue
-	.altrp b7
-
-	.body
-	lfetch.fault.nt1 [sp]
-	adds r2=SW(AR_BSPSTORE)+16,sp
-	adds r3=SW(AR_UNAT)+16,sp
-	mov ar.rsc=0						// put RSE into enforced lazy mode
-	adds r14=SW(CALLER_UNAT)+16,sp
-	adds r15=SW(AR_FPSR)+16,sp
-	;;
-	ld8 r27=[r2],(SW(B0)-SW(AR_BSPSTORE))	// bspstore
-	ld8 r29=[r3],(SW(B1)-SW(AR_UNAT))	// unat
-	;;
-	ld8 r21=[r2],16		// restore b0
-	ld8 r22=[r3],16		// restore b1
-	;;
-	ld8 r23=[r2],16		// restore b2
-	ld8 r24=[r3],16		// restore b3
-	;;
-	ld8 r25=[r2],16		// restore b4
-	ld8 r26=[r3],16		// restore b5
-	;;
-	ld8 r16=[r2],(SW(PR)-SW(AR_PFS))	// ar.pfs
-	ld8 r17=[r3],(SW(AR_RNAT)-SW(AR_LC))	// ar.lc
-	;;
-	ld8 r28=[r2]		// restore pr
-	ld8 r30=[r3]		// restore rnat
-	;;
-	ld8 r18=[r14],16	// restore caller's unat
-	ld8 r19=[r15],24	// restore fpsr
-	;;
-	ldf.fill f2=[r14],32
-	ldf.fill f3=[r15],32
-	;;
-	ldf.fill f4=[r14],32
-	ldf.fill f5=[r15],32
-	;;
-	ldf.fill f12=[r14],32
-	ldf.fill f13=[r15],32
-	;;
-	ldf.fill f14=[r14],32
-	ldf.fill f15=[r15],32
-	;;
-	ldf.fill f16=[r14],32
-	ldf.fill f17=[r15],32
-	;;
-	ldf.fill f18=[r14],32
-	ldf.fill f19=[r15],32
-	mov b0=r21
-	;;
-	ldf.fill f20=[r14],32
-	ldf.fill f21=[r15],32
-	mov b1=r22
-	;;
-	ldf.fill f22=[r14],32
-	ldf.fill f23=[r15],32
-	mov b2=r23
-	;;
-	mov ar.bspstore=r27
-	mov ar.unat=r29		// establish unat holding the NaT bits for r4-r7
-	mov b3=r24
-	;;
-	ldf.fill f24=[r14],32
-	ldf.fill f25=[r15],32
-	mov b4=r25
-	;;
-	ldf.fill f26=[r14],32
-	ldf.fill f27=[r15],32
-	mov b5=r26
-	;;
-	ldf.fill f28=[r14],32
-	ldf.fill f29=[r15],32
-	mov ar.pfs=r16
-	;;
-	ldf.fill f30=[r14],32
-	ldf.fill f31=[r15],24
-	mov ar.lc=r17
-	;;
-	ld8.fill r4=[r14],16
-	ld8.fill r5=[r15],16
-	mov pr=r28,-1
-	;;
-	ld8.fill r6=[r14],16
-	ld8.fill r7=[r15],16
-
-	mov ar.unat=r18				// restore caller's unat
-	mov ar.rnat=r30				// must restore after bspstore but before rsc!
-	mov ar.fpsr=r19				// restore fpsr
-	mov ar.rsc=3				// put RSE back into eager mode, pl 0
-	br.cond.sptk.many b7
-END(load_switch_stack)
-
-#ifndef XEN
-GLOBAL_ENTRY(execve)
-	mov r15=__NR_execve			// put syscall number in place
-	break __BREAK_SYSCALL
-	br.ret.sptk.many rp
-END(execve)
-
-GLOBAL_ENTRY(clone)
-	mov r15=__NR_clone			// put syscall number in place
-	break __BREAK_SYSCALL
-	br.ret.sptk.many rp
-END(clone)
-
-	/*
-	 * Invoke a system call, but do some tracing before and after the call.
-	 * We MUST preserve the current register frame throughout this routine
-	 * because some system calls (such as ia64_execve) directly
-	 * manipulate ar.pfs.
-	 */
-GLOBAL_ENTRY(ia64_trace_syscall)
-	PT_REGS_UNWIND_INFO(0)
-	/*
-	 * We need to preserve the scratch registers f6-f11 in case the system
-	 * call is sigreturn.
-	 */
-	adds r16=PT(F6)+16,sp
-	adds r17=PT(F7)+16,sp
-	;;
- 	stf.spill [r16]=f6,32
- 	stf.spill [r17]=f7,32
-	;;
- 	stf.spill [r16]=f8,32
- 	stf.spill [r17]=f9,32
-	;;
- 	stf.spill [r16]=f10
- 	stf.spill [r17]=f11
-	br.call.sptk.many rp=syscall_trace_enter // give parent a chance to catch syscall args
-	adds r16=PT(F6)+16,sp
-	adds r17=PT(F7)+16,sp
-	;;
-	ldf.fill f6=[r16],32
-	ldf.fill f7=[r17],32
-	;;
-	ldf.fill f8=[r16],32
-	ldf.fill f9=[r17],32
-	;;
-	ldf.fill f10=[r16]
-	ldf.fill f11=[r17]
-	// the syscall number may have changed, so re-load it and re-calculate the
-	// syscall entry-point:
-	adds r15=PT(R15)+16,sp			// r15 = &pt_regs.r15 (syscall #)
-	;;
-	ld8 r15=[r15]
-	mov r3=NR_syscalls - 1
-	;;
-	adds r15=-1024,r15
-	movl r16=sys_call_table
-	;;
-	shladd r20=r15,3,r16			// r20 = sys_call_table + 8*(syscall-1024)
-	cmp.leu p6,p7=r15,r3
-	;;
-(p6)	ld8 r20=[r20]				// load address of syscall entry point
-(p7)	movl r20=sys_ni_syscall
-	;;
-	mov b6=r20
-	br.call.sptk.many rp=b6			// do the syscall
-.strace_check_retval:
-	cmp.lt p6,p0=r8,r0			// syscall failed?
-	adds r2=PT(R8)+16,sp			// r2 = &pt_regs.r8
-	adds r3=PT(R10)+16,sp			// r3 = &pt_regs.r10
-	mov r10=0
-(p6)	br.cond.sptk strace_error		// syscall failed ->
-	;;					// avoid RAW on r10
-.strace_save_retval:
-.mem.offset 0,0; st8.spill [r2]=r8		// store return value in slot for r8
-.mem.offset 8,0; st8.spill [r3]=r10		// clear error indication in slot for r10
-	br.call.sptk.many rp=syscall_trace_leave // give parent a chance to catch return value
-.ret3:	br.cond.sptk .work_pending_syscall_end
-
-strace_error:
-	ld8 r3=[r2]				// load pt_regs.r8
-	sub r9=0,r8				// negate return value to get errno value
-	;;
-	cmp.ne p6,p0=r3,r0			// is pt_regs.r8!=0?
-	adds r3=16,r2				// r3=&pt_regs.r10
-	;;
-(p6)	mov r10=-1
-(p6)	mov r8=r9
-	br.cond.sptk .strace_save_retval
-END(ia64_trace_syscall)
-
-	/*
-	 * When traced and returning from sigreturn, we invoke syscall_trace but then
-	 * go straight to ia64_leave_kernel rather than ia64_leave_syscall.
-	 */
-GLOBAL_ENTRY(ia64_strace_leave_kernel)
-	PT_REGS_UNWIND_INFO(0)
-{	/*
-	 * Some versions of gas generate bad unwind info if the first instruction of a
-	 * procedure doesn't go into the first slot of a bundle.  This is a workaround.
-	 */
-	nop.m 0
-	nop.i 0
-	br.call.sptk.many rp=syscall_trace_leave // give parent a chance to catch return value
-}
-.ret4:	br.cond.sptk ia64_leave_kernel
-END(ia64_strace_leave_kernel)
-#endif
-
-GLOBAL_ENTRY(ia64_ret_from_clone)
-	PT_REGS_UNWIND_INFO(0)
-{	/*
-	 * Some versions of gas generate bad unwind info if the first instruction of a
-	 * procedure doesn't go into the first slot of a bundle.  This is a workaround.
-	 */
-	nop.m 0
-	nop.i 0
-	/*
-	 * We need to call schedule_tail() to complete the scheduling process.
-	 * Called by ia64_switch_to() after do_fork()->copy_thread().  r8 contains the
-	 * address of the previously executing task.
-	 */
-	br.call.sptk.many rp=ia64_invoke_schedule_tail
-}
-#ifdef XEN
-	// new domains are cloned but not exec'ed so switch to user mode here
-	cmp.ne pKStk,pUStk=r0,r0
-	adds r16 = IA64_VCPU_FLAGS_OFFSET, r13
-	;;
-	ld8 r16 = [r16]				// arch.arch_vmx.flags
-	;;
-	cmp.eq p6,p0 = r16, r0
-(p6)	br.cond.spnt ia64_leave_kernel		// !VMX_DOMAIN
-	;;
-	adds r16 = PT(CR_IFS)+16, r12
-	;;
-	ld8 r16 = [r16]
-	cmp.eq pNonSys,pSys=r0,r0		// pSys=0,pNonSys=1
-	;;
-	cmp.eq p6,p7 = 0x6, r16
-(p7)	br.cond.sptk ia64_leave_hypervisor	// VMX_DOMAIN
-	;;
-	/*
-	 * cr.ifs.v==0 && cr.ifm(ar.pfm)==6 means that HYPERVISOR_suspend
-	 * has been called. (i.e. HVM with PV driver is restored here)
-	 * We need to allocate a dummy RSE stack frame to resume.
-	 */
-	alloc r32=ar.pfs, 0, 0, 6, 0
-	cmp.eq pSys,pNonSys=r0,r0		// pSys=1,pNonSys=0
-	;;
-	bsw.0
-	;;
-	mov r21=r13				// set current
-	;;
-	bsw.1
-	;;
-	mov r8=r0
-	br.cond.sptk.many ia64_leave_hypercall
-#else
-.ret8:
-	adds r2=TI_FLAGS+IA64_TASK_SIZE,r13
-	;;
-	ld4 r2=[r2]
-	;;
-	mov r8=0
-	and r2=_TIF_SYSCALL_TRACEAUDIT,r2
-	;;
-	cmp.ne p6,p0=r2,r0
-(p6)	br.cond.spnt .strace_check_retval
-#endif
-	;;					// added stop bits to prevent r8 dependency
-END(ia64_ret_from_clone)
-	// fall through
-GLOBAL_ENTRY(ia64_ret_from_syscall)
-	PT_REGS_UNWIND_INFO(0)
-	cmp.ge p6,p7=r8,r0			// syscall executed successfully?
-	adds r2=PT(R8)+16,sp			// r2 = &pt_regs.r8
-	mov r10=r0				// clear error indication in r10
-#ifndef XEN    
-(p7)	br.cond.spnt handle_syscall_error	// handle potential syscall failure
-#endif
-END(ia64_ret_from_syscall)
-	// fall through
-/*
- * ia64_leave_syscall(): Same as ia64_leave_kernel, except that it doesn't
- *	need to switch to bank 0 and doesn't restore the scratch registers.
- *	To avoid leaking kernel bits, the scratch registers are set to
- *	the following known-to-be-safe values:
- *
- *		  r1: restored (global pointer)
- *		  r2: cleared
- *		  r3: 1 (when returning to user-level)
- *	      r8-r11: restored (syscall return value(s))
- *		 r12: restored (user-level stack pointer)
- *		 r13: restored (user-level thread pointer)
- *		 r14: set to __kernel_syscall_via_epc
- *		 r15: restored (syscall #)
- *	     r16-r17: cleared
- *		 r18: user-level b6
- *		 r19: cleared
- *		 r20: user-level ar.fpsr
- *		 r21: user-level b0
- *		 r22: cleared
- *		 r23: user-level ar.bspstore
- *		 r24: user-level ar.rnat
- *		 r25: user-level ar.unat
- *		 r26: user-level ar.pfs
- *		 r27: user-level ar.rsc
- *		 r28: user-level ip
- *		 r29: user-level psr
- *		 r30: user-level cfm
- *		 r31: user-level pr
- *	      f6-f11: cleared
- *		  pr: restored (user-level pr)
- *		  b0: restored (user-level rp)
- *	          b6: restored
- *		  b7: set to __kernel_syscall_via_epc
- *	     ar.unat: restored (user-level ar.unat)
- *	      ar.pfs: restored (user-level ar.pfs)
- *	      ar.rsc: restored (user-level ar.rsc)
- *	     ar.rnat: restored (user-level ar.rnat)
- *	 ar.bspstore: restored (user-level ar.bspstore)
- *	     ar.fpsr: restored (user-level ar.fpsr)
- *	      ar.ccv: cleared
- *	      ar.csd: cleared
- *	      ar.ssd: cleared
- */
-ENTRY(ia64_leave_syscall)
-	PT_REGS_UNWIND_INFO(0)
-	/*
-	 * work.need_resched etc. mustn't get changed by this CPU before it returns to
-	 * user- or fsys-mode, hence we disable interrupts early on.
-	 *
-	 * p6 controls whether current_thread_info()->flags needs to be check for
-	 * extra work.  We always check for extra work when returning to user-level.
-	 * With CONFIG_PREEMPT, we also check for extra work when the preempt_count
-	 * is 0.  After extra work processing has been completed, execution
-	 * resumes at .work_processed_syscall with p6 set to 1 if the extra-work-check
-	 * needs to be redone.
-	 */
-#ifdef CONFIG_PREEMPT
-	rsm psr.i				// disable interrupts
-	cmp.eq pLvSys,p0=r0,r0			// pLvSys=1: leave from syscall
-(pKStk) adds r20=TI_PRE_COUNT+IA64_TASK_SIZE,r13
-	;;
-	.pred.rel.mutex pUStk,pKStk
-(pKStk) ld4 r21=[r20]			// r21 <- preempt_count
-(pUStk)	mov r21=0			// r21 <- 0
-	;;
-	cmp.eq p6,p0=r21,r0		// p6 <- pUStk || (preempt_count == 0)
-#else /* !CONFIG_PREEMPT */
-(pUStk)	rsm psr.i
-	cmp.eq pLvSys,p0=r0,r0		// pLvSys=1: leave from syscall
-(pUStk)	cmp.eq.unc p6,p0=r0,r0		// p6 <- pUStk
-#endif
-.work_processed_syscall:
-	adds r2=PT(LOADRS)+16,r12
-	adds r3=PT(AR_BSPSTORE)+16,r12
-#ifdef XEN
-	;;
-#else
-	adds r18=TI_FLAGS+IA64_TASK_SIZE,r13
-	;;
-(p6)	ld4 r31=[r18]				// load current_thread_info()->flags
-#endif
-	ld8 r19=[r2],PT(B6)-PT(LOADRS)		// load ar.rsc value for "loadrs"
-	nop.i 0
-	;;
-#ifndef XEN    
-	mov r16=ar.bsp				// M2  get existing backing store pointer
-#endif    
-	ld8 r18=[r2],PT(R9)-PT(B6)		// load b6
-#ifndef XEN
-(p6)	and r15=TIF_WORK_MASK,r31		// any work other than TIF_SYSCALL_TRACE?
-#endif
-	;;
-	ld8 r23=[r3],PT(R11)-PT(AR_BSPSTORE)	// load ar.bspstore (may be garbage)
-#ifndef XEN
-(p6)	cmp4.ne.unc p6,p0=r15, r0		// any special work pending?
-(p6)	br.cond.spnt .work_pending_syscall
-#endif
-	;;
-	// start restoring the state saved on the kernel stack (struct pt_regs):
-	ld8 r9=[r2],PT(CR_IPSR)-PT(R9)
-	ld8 r11=[r3],PT(CR_IIP)-PT(R11)
-(pNonSys) break 0		//      bug check: we shouldn't be here if pNonSys is TRUE!
-	;;
-	invala			// M0|1 invalidate ALAT
-	rsm psr.i | psr.ic	// M2   turn off interrupts and interruption collection
-#ifndef XEN
-	cmp.eq p9,p0=r0,r0	// A    set p9 to indicate that we should restore cr.ifs
-#endif
-
-	ld8 r29=[r2],16		// M0|1 load cr.ipsr
-	ld8 r28=[r3],16		// M0|1 load cr.iip
-	mov r22=r0		// A    clear r22
-	;;
-	ld8 r30=[r2],16		// M0|1 load cr.ifs
-	ld8 r25=[r3],16		// M0|1 load ar.unat
-(pUStk) add r14=IA64_TASK_THREAD_ON_USTACK_OFFSET,r13
-	;;
-	ld8 r26=[r2],PT(B0)-PT(AR_PFS)	// M0|1 load ar.pfs
-(pKStk)	mov r22=psr			// M2   read PSR now that interrupts are disabled
-	nop 0
-	;;
-	ld8 r21=[r2],PT(AR_RNAT)-PT(B0) // M0|1 load b0
-	ld8 r27=[r3],PT(PR)-PT(AR_RSC)	// M0|1 load ar.rsc
-	mov f6=f0			// F    clear f6
-	;;
-	ld8 r24=[r2],PT(AR_FPSR)-PT(AR_RNAT)	// M0|1 load ar.rnat (may be garbage)
-	ld8 r31=[r3],PT(R1)-PT(PR)		// M0|1 load predicates
-	mov f7=f0				// F    clear f7
-	;;
-	ld8 r20=[r2],PT(R12)-PT(AR_FPSR)	// M0|1 load ar.fpsr
-	ld8.fill r1=[r3],16			// M0|1 load r1
-(pUStk) mov r17=1				// A
-	;;
-(pUStk) st1 [r14]=r17				// M2|3
-	ld8.fill r13=[r3],16			// M0|1
-	mov f8=f0				// F    clear f8
-	;;
-	ld8.fill r12=[r2]			// M0|1 restore r12 (sp)
-#ifdef XEN    
-	ld8.fill r2=[r3]			// M0|1
-#else    
-	ld8.fill r15=[r3]			// M0|1 restore r15
-#endif    
-	mov b6=r18				// I0   restore b6
-
-#ifdef XEN
-	movl r17=THIS_CPU(ia64_phys_stacked_size_p8)    // A
-#else
-	addl r17=THIS_CPU(ia64_phys_stacked_size_p8),r0 // A
-#endif
-	mov f9=f0					// F    clear f9
-(pKStk) br.cond.dpnt.many skip_rbs_switch		// B
-
-	srlz.d				// M0   ensure interruption collection is off (for cover)
-	shr.u r18=r19,16		// I0|1 get byte size of existing "dirty" partition
-#ifndef XEN    
-	cover				// B    add current frame into dirty partition & set cr.ifs
-#endif    
-	;;
-(pUStk) ld4 r17=[r17]			// M0|1 r17 = cpu_data->phys_stacked_size_p8
-	mov r19=ar.bsp			// M2   get new backing store pointer
-	mov f10=f0			// F    clear f10
-
-	nop.m 0
-#ifdef XEN
-	mov r14=r0
-#else
-	movl r14=__kernel_syscall_via_epc // X
-#endif
-	;;
-	mov.m ar.csd=r0			// M2   clear ar.csd
-	mov.m ar.ccv=r0			// M2   clear ar.ccv
-	mov b7=r14			// I0   clear b7 (hint with __kernel_syscall_via_epc)
-
-	mov.m ar.ssd=r0			// M2   clear ar.ssd
-	mov f11=f0			// F    clear f11
-	br.cond.sptk.many rbs_switch	// B
-END(ia64_leave_syscall)
-
-#ifdef CONFIG_IA32_SUPPORT
-GLOBAL_ENTRY(ia64_ret_from_ia32_execve)
-	PT_REGS_UNWIND_INFO(0)
-	adds r2=PT(R8)+16,sp			// r2 = &pt_regs.r8
-	adds r3=PT(R10)+16,sp			// r3 = &pt_regs.r10
-	;;
-	.mem.offset 0,0
-	st8.spill [r2]=r8	// store return value in slot for r8 and set unat bit
-	.mem.offset 8,0
-	st8.spill [r3]=r0	// clear error indication in slot for r10 and set unat bit
-END(ia64_ret_from_ia32_execve)
-	// fall through
-#endif /* CONFIG_IA32_SUPPORT */
-GLOBAL_ENTRY(ia64_leave_kernel)
-	PT_REGS_UNWIND_INFO(0)
-	/*
-	 * work.need_resched etc. mustn't get changed by this CPU before it returns to
-	 * user- or fsys-mode, hence we disable interrupts early on.
-	 *
-	 * p6 controls whether current_thread_info()->flags needs to be check for
-	 * extra work.  We always check for extra work when returning to user-level.
-	 * With CONFIG_PREEMPT, we also check for extra work when the preempt_count
-	 * is 0.  After extra work processing has been completed, execution
-	 * resumes at .work_processed_syscall with p6 set to 1 if the extra-work-check
-	 * needs to be redone.
-	 */
-#ifdef CONFIG_PREEMPT
-	rsm psr.i				// disable interrupts
-	cmp.eq p0,pLvSys=r0,r0			// pLvSys=0: leave from kernel
-(pKStk)	adds r20=TI_PRE_COUNT+IA64_TASK_SIZE,r13
-	;;
-	.pred.rel.mutex pUStk,pKStk
-(pKStk)	ld4 r21=[r20]			// r21 <- preempt_count
-(pUStk)	mov r21=0			// r21 <- 0
-	;;
-	cmp.eq p6,p0=r21,r0		// p6 <- pUStk || (preempt_count == 0)
-#else
-(pUStk)	rsm psr.i
-	cmp.eq p0,pLvSys=r0,r0		// pLvSys=0: leave from kernel
-(pUStk)	cmp.eq.unc p6,p0=r0,r0		// p6 <- pUStk
-#endif
-.work_processed_kernel:
-#ifdef XEN
-	;;
-(pUStk)	ssm psr.i
-(pUStk)	br.call.sptk.many b0=do_softirq
-(pUStk)	rsm psr.i
-	;;
-(pUStk)	br.call.sptk.many b0=reflect_event
-	;;
-	adds r7 = PT(EML_UNAT)+16,r12
-	;;
-	ld8 r7 = [r7]
-	;;
-	mov ar.unat=r7  /* load eml_unat  */
-	mov r31=r0
-
-#else
-	adds r17=TI_FLAGS+IA64_TASK_SIZE,r13
-	;;
-(p6)	ld4 r31=[r17]				// load current_thread_info()->flags
-#endif
-	adds r21=PT(PR)+16,r12
-	;;
-
-	lfetch [r21],PT(CR_IPSR)-PT(PR)
-	adds r2=PT(B6)+16,r12
-	adds r3=PT(R16)+16,r12
-	;;
-	lfetch [r21]
-	ld8 r28=[r2],8		// load b6
-	adds r29=PT(R24)+16,r12
-
-#ifdef XEN
-	ld8.fill r16=[r3]
-	adds r3=PT(AR_CSD)-PT(R16),r3
-#else
-	ld8.fill r16=[r3],PT(AR_CSD)-PT(R16)
-#endif
-	adds r30=PT(AR_CCV)+16,r12
-(p6)	and r19=TIF_WORK_MASK,r31		// any work other than TIF_SYSCALL_TRACE?
-	;;
-	ld8.fill r24=[r29]
-	ld8 r15=[r30]		// load ar.ccv
-(p6)	cmp4.ne.unc p6,p0=r19, r0		// any special work pending?
-	;;
-	ld8 r29=[r2],16		// load b7
-	ld8 r30=[r3],16		// load ar.csd
-#ifndef XEN
-(p6)	br.cond.spnt .work_pending
-#endif
-	;;
-	ld8 r31=[r2],16		// load ar.ssd
-	ld8.fill r8=[r3],16
-	;;
-	ld8.fill r9=[r2],16
-	ld8.fill r10=[r3],PT(R17)-PT(R10)
-	;;
-	ld8.fill r11=[r2],PT(R18)-PT(R11)
-	ld8.fill r17=[r3],16
-	;;
-	ld8.fill r18=[r2],16
-	ld8.fill r19=[r3],16
-	;;
-	ld8.fill r20=[r2],16
-	ld8.fill r21=[r3],16
-	mov ar.csd=r30
-	mov ar.ssd=r31
-	;;
-	rsm psr.i | psr.ic	// initiate turning off of interrupt and interruption collection
-	invala			// invalidate ALAT
-	;;
-	ld8.fill r22=[r2],24
-	ld8.fill r23=[r3],24
-	mov b6=r28
-	;;
-	ld8.fill r25=[r2],16
-	ld8.fill r26=[r3],16
-	mov b7=r29
-	;;
-	ld8.fill r27=[r2],16
-	ld8.fill r28=[r3],16
-	;;
-	ld8.fill r29=[r2],16
-	ld8.fill r30=[r3],24
-	;;
-	ld8.fill r31=[r2],PT(F9)-PT(R31)
-	adds r3=PT(F10)-PT(F6),r3
-	;;
-	ldf.fill f9=[r2],PT(F6)-PT(F9)
-	ldf.fill f10=[r3],PT(F8)-PT(F10)
-	;;
-	ldf.fill f6=[r2],PT(F7)-PT(F6)
-	;;
-	ldf.fill f7=[r2],PT(F11)-PT(F7)
-#ifdef XEN
-	ldf.fill f8=[r3],PT(R5)-PT(F8)
-	;;
-	ldf.fill f11=[r2],PT(R4)-PT(F11)
-	mov ar.ccv=r15
-	;;
-	ld8.fill r4=[r2],16
-	ld8.fill r5=[r3],16
-	;;
-	ld8.fill r6=[r2]
-	ld8.fill r7=[r3]
-	;;
-	srlz.d	// ensure that inter. collection is off (VHPT is don't care, since text is pinned)
-    ;;
-	bsw.0			// switch back to bank 0 (no stop bit required beforehand...)
-	;;
-#else
-	ldf.fill f8=[r3],32
-	;;
-	srlz.d	// ensure that inter. collection is off (VHPT is don't care, since text is pinned)
-	mov ar.ccv=r15
-	;;
-	ldf.fill f11=[r2]
-	bsw.0			// switch back to bank 0 (no stop bit required beforehand...)
-	;;
-#endif
-#ifdef XEN
-(pUStk) movl r18=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
-(pUStk) ld8 r18=[r18]
-#else
-(pUStk)	mov r18=IA64_KR(CURRENT)// M2 (12 cycle read latency)
-#endif
-	adds r16=PT(CR_IPSR)+16,r12
-	adds r17=PT(CR_IIP)+16,r12
-
-(pKStk)	mov r22=psr		// M2 read PSR now that interrupts are disabled
-	nop.i 0
-	nop.i 0
-	;;
-	ld8 r29=[r16],16	// load cr.ipsr
-	ld8 r28=[r17],16	// load cr.iip
-	;;
-	ld8 r30=[r16],16	// load cr.ifs
-	ld8 r25=[r17],16	// load ar.unat
-	;;
-	ld8 r26=[r16],16	// load ar.pfs
-	ld8 r27=[r17],16	// load ar.rsc
-#ifndef XEN	
-	cmp.eq p9,p0=r0,r0	// set p9 to indicate that we should restore cr.ifs
-#endif
-	;;
-	ld8 r24=[r16],16	// load ar.rnat (may be garbage)
-	ld8 r23=[r17],16	// load ar.bspstore (may be garbage)
-	;;
-	ld8 r31=[r16],16	// load predicates
-	ld8 r21=[r17],16	// load b0
-	;;
-	ld8 r19=[r16],16	// load ar.rsc value for "loadrs"
-	ld8.fill r1=[r17],16	// load r1
-	;;
-	ld8.fill r12=[r16],16
-	ld8.fill r13=[r17],16
-(pUStk)	adds r18=IA64_TASK_THREAD_ON_USTACK_OFFSET,r18
-	;;
-	ld8 r20=[r16],16	// ar.fpsr
-	ld8.fill r15=[r17],16
-	;;
-	ld8.fill r14=[r16],16
-	ld8.fill r2=[r17]
-(pUStk)	mov r17=1
-	;;
-	ld8.fill r3=[r16]
-(pUStk)	st1 [r18]=r17		// restore current->thread.on_ustack
-	shr.u r18=r19,16	// get byte size of existing "dirty" partition
-	;;
-	mov r16=ar.bsp		// get existing backing store pointer
-#ifdef XEN
-	movl r17=THIS_CPU(ia64_phys_stacked_size_p8)
-#else
-	addl r17=THIS_CPU(ia64_phys_stacked_size_p8),r0
-#endif
-	;;
-	ld4 r17=[r17]		// r17 = cpu_data->phys_stacked_size_p8
-(pKStk)	br.cond.dpnt skip_rbs_switch
-
-	/*
-	 * Restore user backing store.
-	 *
-	 * NOTE: alloc, loadrs, and cover can't be predicated.
-	 */
-(pNonSys) br.cond.dpnt dont_preserve_current_frame
-	cover				// add current frame into dirty partition and set cr.ifs
-	;;
-	mov r19=ar.bsp			// get new backing store pointer
-rbs_switch:
-	sub r16=r16,r18			// krbs = old bsp - size of dirty partition
-#ifndef XEN
-	cmp.ne p9,p0=r0,r0		// clear p9 to skip restore of cr.ifs
-#endif
-	;;
-	sub r19=r19,r16			// calculate total byte size of dirty partition
-	add r18=64,r18			// don't force in0-in7 into memory...
-	;;
-	shl r19=r19,16			// shift size of dirty partition into loadrs position
-	;;
-dont_preserve_current_frame:
-	/*
-	 * To prevent leaking bits between the kernel and user-space,
-	 * we must clear the stacked registers in the "invalid" partition here.
-	 * Not pretty, but at least it's fast (3.34 registers/cycle on Itanium,
-	 * 5 registers/cycle on McKinley).
-	 */
-#	define pRecurse	p6
-#	define pReturn	p7
-#ifdef CONFIG_ITANIUM
-#	define Nregs	10
-#else
-#	define Nregs	14
-#endif
-	alloc loc0=ar.pfs,2,Nregs-2,2,0
-	shr.u loc1=r18,9		// RNaTslots <= floor(dirtySize / (64*8))
-	sub r17=r17,r18			// r17 = (physStackedSize + 8) - dirtySize
-	;;
-	mov ar.rsc=r19			// load ar.rsc to be used for "loadrs"
-	shladd in0=loc1,3,r17
-	mov in1=0
-	;;
-	TEXT_ALIGN(32)
-rse_clear_invalid:
-#ifdef CONFIG_ITANIUM
-	// cycle 0
- { .mii
-	alloc loc0=ar.pfs,2,Nregs-2,2,0
-	cmp.lt pRecurse,p0=Nregs*8,in0	// if more than Nregs regs left to clear, (re)curse
-	add out0=-Nregs*8,in0
-}{ .mfb
-	add out1=1,in1			// increment recursion count
-	nop.f 0
-	nop.b 0				// can't do br.call here because of alloc (WAW on CFM)
-	;;
-}{ .mfi	// cycle 1
-	mov loc1=0
-	nop.f 0
-	mov loc2=0
-}{ .mib
-	mov loc3=0
-	mov loc4=0
-(pRecurse) br.call.sptk.many b0=rse_clear_invalid
-
-}{ .mfi	// cycle 2
-	mov loc5=0
-	nop.f 0
-	cmp.ne pReturn,p0=r0,in1	// if recursion count != 0, we need to do a br.ret
-}{ .mib
-	mov loc6=0
-	mov loc7=0
-(pReturn) br.ret.sptk.many b0
-}
-#else /* !CONFIG_ITANIUM */
-	alloc loc0=ar.pfs,2,Nregs-2,2,0
-	cmp.lt pRecurse,p0=Nregs*8,in0	// if more than Nregs regs left to clear, (re)curse
-	add out0=-Nregs*8,in0
-	add out1=1,in1			// increment recursion count
-	mov loc1=0
-	mov loc2=0
-	;;
-	mov loc3=0
-	mov loc4=0
-	mov loc5=0
-	mov loc6=0
-	mov loc7=0
-(pRecurse) br.call.dptk.few b0=rse_clear_invalid
-	;;
-	mov loc8=0
-	mov loc9=0
-	cmp.ne pReturn,p0=r0,in1	// if recursion count != 0, we need to do a br.ret
-	mov loc10=0
-	mov loc11=0
-(pReturn) br.ret.dptk.many b0
-#endif /* !CONFIG_ITANIUM */
-#	undef pRecurse
-#	undef pReturn
-	;;
-	alloc r17=ar.pfs,0,0,0,0	// drop current register frame
-	;;
-	loadrs
-	;;
-skip_rbs_switch:
-	mov ar.unat=r25		// M2
-(pKStk)	extr.u r22=r22,21,1	// I0 extract current value of psr.pp from r22
-(pLvSys)mov r19=r0		// A  clear r19 for leave_syscall, no-op otherwise
-	;;
-(pUStk)	mov ar.bspstore=r23	// M2
-(pKStk)	dep r29=r22,r29,21,1	// I0 update ipsr.pp with psr.pp
-(pLvSys)mov r16=r0		// A  clear r16 for leave_syscall, no-op otherwise
-	;;
-	mov cr.ipsr=r29		// M2
-	mov ar.pfs=r26		// I0
-(pLvSys)mov r17=r0		// A  clear r17 for leave_syscall, no-op otherwise
-#ifdef XEN
-	mov cr.ifs=r30		// M2
-#else    
-(p9)	mov cr.ifs=r30		// M2
-#endif
-	mov b0=r21		// I0
-(pLvSys)mov r18=r0		// A  clear r18 for leave_syscall, no-op otherwise
-
-	mov ar.fpsr=r20		// M2
-	mov cr.iip=r28		// M2
-	nop 0
-	;;
-(pUStk)	mov ar.rnat=r24		// M2 must happen with RSE in lazy mode
-	nop 0
-#ifdef XEN    
-(pLvSys)mov r15=r0
-#else
-(pLvSys)mov r2=r0
-#endif
-
-	mov ar.rsc=r27		// M2
-	mov pr=r31,-1		// I0
-	rfi			// B
-
-#ifndef XEN
-	/*
-	 * On entry:
-	 *	r20 = &current->thread_info->pre_count (if CONFIG_PREEMPT)
-	 *	r31 = current->thread_info->flags
-	 * On exit:
-	 *	p6 = TRUE if work-pending-check needs to be redone
-	 */
-.work_pending_syscall:
-	add r2=-8,r2
-	add r3=-8,r3
-	;;
-	st8 [r2]=r8
-	st8 [r3]=r10
-.work_pending:
-	tbit.nz p6,p0=r31,TIF_SIGDELAYED		// signal delayed from  MCA/INIT/NMI/PMI context?
-(p6)	br.cond.sptk.few .sigdelayed
-	;;
-	tbit.z p6,p0=r31,TIF_NEED_RESCHED		// current_thread_info()->need_resched==0?
-(p6)	br.cond.sptk.few .notify
-#ifdef CONFIG_PREEMPT
-(pKStk) dep r21=-1,r0,PREEMPT_ACTIVE_BIT,1
-	;;
-(pKStk) st4 [r20]=r21
-	ssm psr.i		// enable interrupts
-#endif
-	br.call.spnt.many rp=schedule
-.ret9:	cmp.eq p6,p0=r0,r0				// p6 <- 1
-	rsm psr.i		// disable interrupts
-	;;
-#ifdef CONFIG_PREEMPT
-(pKStk)	adds r20=TI_PRE_COUNT+IA64_TASK_SIZE,r13
-	;;
-(pKStk)	st4 [r20]=r0		// preempt_count() <- 0
-#endif
-(pLvSys)br.cond.sptk.few  .work_pending_syscall_end
-	br.cond.sptk.many .work_processed_kernel	// re-check
-
-.notify:
-(pUStk)	br.call.spnt.many rp=notify_resume_user
-.ret10:	cmp.ne p6,p0=r0,r0				// p6 <- 0
-(pLvSys)br.cond.sptk.few  .work_pending_syscall_end
-	br.cond.sptk.many .work_processed_kernel	// don't re-check
-
-// There is a delayed signal that was detected in MCA/INIT/NMI/PMI context where
-// it could not be delivered.  Deliver it now.  The signal might be for us and
-// may set TIF_SIGPENDING, so redrive ia64_leave_* after processing the delayed
-// signal.
-
-.sigdelayed:
-	br.call.sptk.many rp=do_sigdelayed
-	cmp.eq p6,p0=r0,r0				// p6 <- 1, always re-check
-(pLvSys)br.cond.sptk.few  .work_pending_syscall_end
-	br.cond.sptk.many .work_processed_kernel	// re-check
-
-.work_pending_syscall_end:
-	adds r2=PT(R8)+16,r12
-	adds r3=PT(R10)+16,r12
-	;;
-	ld8 r8=[r2]
-	ld8 r10=[r3]
-	br.cond.sptk.many .work_processed_syscall	// re-check
-#endif
-
-END(ia64_leave_kernel)
-
-ENTRY(handle_syscall_error)
-	/*
-	 * Some system calls (e.g., ptrace, mmap) can return arbitrary values which could
-	 * lead us to mistake a negative return value as a failed syscall.  Those syscall
-	 * must deposit a non-zero value in pt_regs.r8 to indicate an error.  If
-	 * pt_regs.r8 is zero, we assume that the call completed successfully.
-	 */
-	PT_REGS_UNWIND_INFO(0)
-	ld8 r3=[r2]		// load pt_regs.r8
-	;;
-	cmp.eq p6,p7=r3,r0	// is pt_regs.r8==0?
-	;;
-(p7)	mov r10=-1
-(p7)	sub r8=0,r8		// negate return value to get errno
-	br.cond.sptk ia64_leave_syscall
-END(handle_syscall_error)
-
-	/*
-	 * Invoke schedule_tail(task) while preserving in0-in7, which may be needed
-	 * in case a system call gets restarted.
-	 */
-GLOBAL_ENTRY(ia64_invoke_schedule_tail)
-	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
-	alloc loc1=ar.pfs,8,2,1,0
-	mov loc0=rp
-	mov out0=r8				// Address of previous task
-	;;
-	br.call.sptk.many rp=schedule_tail
-.ret11:	mov ar.pfs=loc1
-	mov rp=loc0
-	br.ret.sptk.many rp
-END(ia64_invoke_schedule_tail)
-
-#ifndef XEN
-	/*
-	 * Setup stack and call do_notify_resume_user().  Note that pSys and pNonSys need to
-	 * be set up by the caller.  We declare 8 input registers so the system call
-	 * args get preserved, in case we need to restart a system call.
-	 */
-ENTRY(notify_resume_user)
-	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
-	alloc loc1=ar.pfs,8,2,3,0 // preserve all eight input regs in case of syscall restart!
-	mov r9=ar.unat
-	mov loc0=rp				// save return address
-	mov out0=0				// there is no "oldset"
-	adds out1=8,sp				// out1=&sigscratch->ar_pfs
-(pSys)	mov out2=1				// out2==1 => we're in a syscall
-	;;
-(pNonSys) mov out2=0				// out2==0 => not a syscall
-	.fframe 16
-	.spillsp ar.unat, 16
-	st8 [sp]=r9,-16				// allocate space for ar.unat and save it
-	st8 [out1]=loc1,-8			// save ar.pfs, out1=&sigscratch
-	.body
-	br.call.sptk.many rp=do_notify_resume_user
-.ret15:	.restore sp
-	adds sp=16,sp				// pop scratch stack space
-	;;
-	ld8 r9=[sp]				// load new unat from sigscratch->scratch_unat
-	mov rp=loc0
-	;;
-	mov ar.unat=r9
-	mov ar.pfs=loc1
-	br.ret.sptk.many rp
-END(notify_resume_user)
-
-GLOBAL_ENTRY(sys_rt_sigsuspend)
-	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
-	alloc loc1=ar.pfs,8,2,3,0 // preserve all eight input regs in case of syscall restart!
-	mov r9=ar.unat
-	mov loc0=rp				// save return address
-	mov out0=in0				// mask
-	mov out1=in1				// sigsetsize
-	adds out2=8,sp				// out2=&sigscratch->ar_pfs
-	;;
-	.fframe 16
-	.spillsp ar.unat, 16
-	st8 [sp]=r9,-16				// allocate space for ar.unat and save it
-	st8 [out2]=loc1,-8			// save ar.pfs, out2=&sigscratch
-	.body
-	br.call.sptk.many rp=ia64_rt_sigsuspend
-.ret17:	.restore sp
-	adds sp=16,sp				// pop scratch stack space
-	;;
-	ld8 r9=[sp]				// load new unat from sw->caller_unat
-	mov rp=loc0
-	;;
-	mov ar.unat=r9
-	mov ar.pfs=loc1
-	br.ret.sptk.many rp
-END(sys_rt_sigsuspend)
-
-ENTRY(sys_rt_sigreturn)
-	PT_REGS_UNWIND_INFO(0)
-	/*
-	 * Allocate 8 input registers since ptrace() may clobber them
-	 */
-	alloc r2=ar.pfs,8,0,1,0
-	.prologue
-	PT_REGS_SAVES(16)
-	adds sp=-16,sp
-	.body
-	cmp.eq pNonSys,pSys=r0,r0		// sigreturn isn't a normal syscall...
-	;;
-	/*
-	 * leave_kernel() restores f6-f11 from pt_regs, but since the streamlined
-	 * syscall-entry path does not save them we save them here instead.  Note: we
-	 * don't need to save any other registers that are not saved by the stream-lined
-	 * syscall path, because restore_sigcontext() restores them.
-	 */
-	adds r16=PT(F6)+32,sp
-	adds r17=PT(F7)+32,sp
-	;;
- 	stf.spill [r16]=f6,32
- 	stf.spill [r17]=f7,32
-	;;
- 	stf.spill [r16]=f8,32
- 	stf.spill [r17]=f9,32
-	;;
- 	stf.spill [r16]=f10
- 	stf.spill [r17]=f11
-	adds out0=16,sp				// out0 = &sigscratch
-	br.call.sptk.many rp=ia64_rt_sigreturn
-.ret19:	.restore sp,0
-	adds sp=16,sp
-	;;
-	ld8 r9=[sp]				// load new ar.unat
-	mov.sptk b7=r8,ia64_leave_kernel
-	;;
-	mov ar.unat=r9
-	br.many b7
-END(sys_rt_sigreturn)
-#endif
-
-GLOBAL_ENTRY(ia64_prepare_handle_unaligned)
-	.prologue
-	/*
-	 * r16 = fake ar.pfs, we simply need to make sure privilege is still 0
-	 */
-	mov r16=r0
-	DO_SAVE_SWITCH_STACK
-	br.call.sptk.many rp=ia64_handle_unaligned	// stack frame setup in ivt
-.ret21:	.body
-	DO_LOAD_SWITCH_STACK
-	br.cond.sptk.many rp				// goes to ia64_leave_kernel
-END(ia64_prepare_handle_unaligned)
-
-	//
-	// unw_init_running(void (*callback)(info, arg), void *arg)
-	//
-#	define EXTRA_FRAME_SIZE	((UNW_FRAME_INFO_SIZE+15)&~15)
-
-GLOBAL_ENTRY(unw_init_running)
-	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
-	alloc loc1=ar.pfs,2,3,3,0
-	;;
-	ld8 loc2=[in0],8
-	mov loc0=rp
-	mov r16=loc1
-	DO_SAVE_SWITCH_STACK
-	.body
-
-	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
-	.fframe IA64_SWITCH_STACK_SIZE+EXTRA_FRAME_SIZE
-	SWITCH_STACK_SAVES(EXTRA_FRAME_SIZE)
-	adds sp=-EXTRA_FRAME_SIZE,sp
-	.body
-	;;
-	adds out0=16,sp				// &info
-	mov out1=r13				// current
-	adds out2=16+EXTRA_FRAME_SIZE,sp	// &switch_stack
-	br.call.sptk.many rp=unw_init_frame_info
-1:	adds out0=16,sp				// &info
-	mov b6=loc2
-	mov loc2=gp				// save gp across indirect function call
-	;;
-	ld8 gp=[in0]
-	mov out1=in1				// arg
-	br.call.sptk.many rp=b6			// invoke the callback function
-1:	mov gp=loc2				// restore gp
-
-	// For now, we don't allow changing registers from within
-	// unw_init_running; if we ever want to allow that, we'd
-	// have to do a load_switch_stack here:
-	.restore sp
-	adds sp=IA64_SWITCH_STACK_SIZE+EXTRA_FRAME_SIZE,sp
-
-	mov ar.pfs=loc1
-	mov rp=loc0
-	br.ret.sptk.many rp
-END(unw_init_running)
-
-#ifdef XEN
-GLOBAL_ENTRY(ia64_do_multicall_call)
-	movl r2=ia64_hypercall_table;;
-	shladd r2=r38,3,r2;;
-	ld8 r2=[r2];;
-	mov b6=r2
-	br.sptk.many b6;;
-END(ia64_do_multicall_call)
-
-    
-	.rodata
-	.align 8
-	.globl ia64_hypercall_table
-ia64_hypercall_table:
-	data8 do_ni_hypercall		/* do_set_trap_table *//*  0 */
-	data8 do_ni_hypercall		/* do_mmu_update */
-	data8 do_ni_hypercall		/* do_set_gdt */
-	data8 do_ni_hypercall		/* do_stack_switch */
-	data8 do_ni_hypercall		/* do_set_callbacks */
-	data8 do_ni_hypercall		/* do_fpu_taskswitch *//*  5 */
-	data8 do_sched_op_compat
-	data8 do_platform_op
-	data8 do_ni_hypercall		/* do_set_debugreg */
-	data8 do_ni_hypercall		/* do_get_debugreg */
-	data8 do_ni_hypercall		/* do_update_descriptor * 10 */
-	data8 do_ni_hypercall		/* do_ni_hypercall */
-	data8 do_memory_op
-	data8 do_multicall
-	data8 do_ni_hypercall		/* do_update_va_mapping */
-	data8 do_ni_hypercall		/* do_set_timer_op */  /* 15 */
-	data8 do_ni_hypercall
-	data8 do_xen_version
-	data8 do_console_io
-	data8 do_ni_hypercall
-	data8 do_grant_table_op				       /* 20 */
-	data8 do_ni_hypercall		/* do_vm_assist */
-	data8 do_ni_hypercall		/* do_update_va_mapping_othe */
-	data8 do_ni_hypercall		/* (x86 only) */
-	data8 do_vcpu_op		/* do_vcpu_op */
-	data8 do_ni_hypercall		/* (x86_64 only) */    /* 25 */
-	data8 do_ni_hypercall		/* do_mmuext_op */
-	data8 do_ni_hypercall		/* do_acm_op */
-	data8 do_ni_hypercall		/* do_nmi_op */
-	data8 do_sched_op
-	data8 do_callback_op		/*  */                 /* 30 */
-	data8 do_xenoprof_op		/*  */
-	data8 do_event_channel_op
-	data8 do_physdev_op
-	data8 do_hvm_op			/*  */
-	data8 do_sysctl			/*  */                  /* 35 */
-	data8 do_domctl			/*  */
-	data8 do_kexec_op		/*  */
-	data8 do_tmem_op		/*  */
-	data8 do_ni_hypercall		/*  */
-	data8 do_ni_hypercall		/*  */                 /* 40 */
-	data8 do_ni_hypercall		/*  */
-	data8 do_ni_hypercall		/*  */
-	data8 do_ni_hypercall		/*  */
-	data8 do_ni_hypercall		/*  */
-	data8 do_ni_hypercall		/*  */                 /* 45 */
-	data8 do_ni_hypercall		/*  */
-	data8 do_ni_hypercall		/*  */
-	data8 do_dom0vp_op              /* dom0vp_op */
-	data8 do_pirq_guest_eoi		/* arch_1 */
-	data8 do_ia64_debug_op		/* arch_2 */           /* 50 */
-	data8 do_ni_hypercall		/* arch_3 */
-	data8 do_ni_hypercall		/* arch_4 */
-	data8 do_ni_hypercall		/* arch_5 */
-	data8 do_ni_hypercall		/* arch_6 */
-	data8 do_ni_hypercall		/* arch_7 */           /* 55 */
-	data8 do_ni_hypercall
-	data8 do_ni_hypercall
-	data8 do_ni_hypercall
-	data8 do_ni_hypercall
-	data8 do_ni_hypercall                                  /* 60 */
-	data8 do_ni_hypercall
-	data8 do_ni_hypercall
-	data8 do_ni_hypercall
-
-	// guard against failures to increase NR_hypercalls
-	.org ia64_hypercall_table + 8*NR_hypercalls
-
-#else
-	.rodata
-	.align 8
-	.globl sys_call_table
-sys_call_table:
-	data8 sys_ni_syscall		//  This must be sys_ni_syscall!  See ivt.S.
-	data8 sys_exit				// 1025
-	data8 sys_read
-	data8 sys_write
-	data8 sys_open
-	data8 sys_close
-	data8 sys_creat				// 1030
-	data8 sys_link
-	data8 sys_unlink
-	data8 ia64_execve
-	data8 sys_chdir
-	data8 sys_fchdir			// 1035
-	data8 sys_utimes
-	data8 sys_mknod
-	data8 sys_chmod
-	data8 sys_chown
-	data8 sys_lseek				// 1040
-	data8 sys_getpid
-	data8 sys_getppid
-	data8 sys_mount
-	data8 sys_umount
-	data8 sys_setuid			// 1045
-	data8 sys_getuid
-	data8 sys_geteuid
-	data8 sys_ptrace
-	data8 sys_access
-	data8 sys_sync				// 1050
-	data8 sys_fsync
-	data8 sys_fdatasync
-	data8 sys_kill
-	data8 sys_rename
-	data8 sys_mkdir				// 1055
-	data8 sys_rmdir
-	data8 sys_dup
-	data8 sys_pipe
-	data8 sys_times
-	data8 ia64_brk				// 1060
-	data8 sys_setgid
-	data8 sys_getgid
-	data8 sys_getegid
-	data8 sys_acct
-	data8 sys_ioctl				// 1065
-	data8 sys_fcntl
-	data8 sys_umask
-	data8 sys_chroot
-	data8 sys_ustat
-	data8 sys_dup2				// 1070
-	data8 sys_setreuid
-	data8 sys_setregid
-	data8 sys_getresuid
-	data8 sys_setresuid
-	data8 sys_getresgid			// 1075
-	data8 sys_setresgid
-	data8 sys_getgroups
-	data8 sys_setgroups
-	data8 sys_getpgid
-	data8 sys_setpgid			// 1080
-	data8 sys_setsid
-	data8 sys_getsid
-	data8 sys_sethostname
-	data8 sys_setrlimit
-	data8 sys_getrlimit			// 1085
-	data8 sys_getrusage
-	data8 sys_gettimeofday
-	data8 sys_settimeofday
-	data8 sys_select
-	data8 sys_poll				// 1090
-	data8 sys_symlink
-	data8 sys_readlink
-	data8 sys_uselib
-	data8 sys_swapon
-	data8 sys_swapoff			// 1095
-	data8 sys_reboot
-	data8 sys_truncate
-	data8 sys_ftruncate
-	data8 sys_fchmod
-	data8 sys_fchown			// 1100
-	data8 ia64_getpriority
-	data8 sys_setpriority
-	data8 sys_statfs
-	data8 sys_fstatfs
-	data8 sys_gettid			// 1105
-	data8 sys_semget
-	data8 sys_semop
-	data8 sys_semctl
-	data8 sys_msgget
-	data8 sys_msgsnd			// 1110
-	data8 sys_msgrcv
-	data8 sys_msgctl
-	data8 sys_shmget
-	data8 sys_shmat
-	data8 sys_shmdt				// 1115
-	data8 sys_shmctl
-	data8 sys_syslog
-	data8 sys_setitimer
-	data8 sys_getitimer
-	data8 sys_ni_syscall			// 1120		/* was: ia64_oldstat */
-	data8 sys_ni_syscall					/* was: ia64_oldlstat */
-	data8 sys_ni_syscall					/* was: ia64_oldfstat */
-	data8 sys_vhangup
-	data8 sys_lchown
-	data8 sys_remap_file_pages		// 1125
-	data8 sys_wait4
-	data8 sys_sysinfo
-	data8 sys_clone
-	data8 sys_setdomainname
-	data8 sys_newuname			// 1130
-	data8 sys_adjtimex
-	data8 sys_ni_syscall					/* was: ia64_create_module */
-	data8 sys_init_module
-	data8 sys_delete_module
-	data8 sys_ni_syscall			// 1135		/* was: sys_get_kernel_syms */
-	data8 sys_ni_syscall					/* was: sys_query_module */
-	data8 sys_quotactl
-	data8 sys_bdflush
-	data8 sys_sysfs
-	data8 sys_personality			// 1140
-	data8 sys_ni_syscall		// sys_afs_syscall
-	data8 sys_setfsuid
-	data8 sys_setfsgid
-	data8 sys_getdents
-	data8 sys_flock				// 1145
-	data8 sys_readv
-	data8 sys_writev
-	data8 sys_pread64
-	data8 sys_pwrite64
-	data8 sys_sysctl			// 1150
-	data8 sys_mmap
-	data8 sys_munmap
-	data8 sys_mlock
-	data8 sys_mlockall
-	data8 sys_mprotect			// 1155
-	data8 ia64_mremap
-	data8 sys_msync
-	data8 sys_munlock
-	data8 sys_munlockall
-	data8 sys_sched_getparam		// 1160
-	data8 sys_sched_setparam
-	data8 sys_sched_getscheduler
-	data8 sys_sched_setscheduler
-	data8 sys_sched_yield
-	data8 sys_sched_get_priority_max	// 1165
-	data8 sys_sched_get_priority_min
-	data8 sys_sched_rr_get_interval
-	data8 sys_nanosleep
-	data8 sys_nfsservctl
-	data8 sys_prctl				// 1170
-	data8 sys_getpagesize
-	data8 sys_mmap2
-	data8 sys_pciconfig_read
-	data8 sys_pciconfig_write
-	data8 sys_perfmonctl			// 1175
-	data8 sys_sigaltstack
-	data8 sys_rt_sigaction
-	data8 sys_rt_sigpending
-	data8 sys_rt_sigprocmask
-	data8 sys_rt_sigqueueinfo		// 1180
-	data8 sys_rt_sigreturn
-	data8 sys_rt_sigsuspend
-	data8 sys_rt_sigtimedwait
-	data8 sys_getcwd
-	data8 sys_capget			// 1185
-	data8 sys_capset
-	data8 sys_sendfile64
-	data8 sys_ni_syscall		// sys_getpmsg (STREAMS)
-	data8 sys_ni_syscall		// sys_putpmsg (STREAMS)
-	data8 sys_socket			// 1190
-	data8 sys_bind
-	data8 sys_connect
-	data8 sys_listen
-	data8 sys_accept
-	data8 sys_getsockname			// 1195
-	data8 sys_getpeername
-	data8 sys_socketpair
-	data8 sys_send
-	data8 sys_sendto
-	data8 sys_recv				// 1200
-	data8 sys_recvfrom
-	data8 sys_shutdown
-	data8 sys_setsockopt
-	data8 sys_getsockopt
-	data8 sys_sendmsg			// 1205
-	data8 sys_recvmsg
-	data8 sys_pivot_root
-	data8 sys_mincore
-	data8 sys_madvise
-	data8 sys_newstat			// 1210
-	data8 sys_newlstat
-	data8 sys_newfstat
-	data8 sys_clone2
-	data8 sys_getdents64
-	data8 sys_getunwind			// 1215
-	data8 sys_readahead
-	data8 sys_setxattr
-	data8 sys_lsetxattr
-	data8 sys_fsetxattr
-	data8 sys_getxattr			// 1220
-	data8 sys_lgetxattr
-	data8 sys_fgetxattr
-	data8 sys_listxattr
-	data8 sys_llistxattr
-	data8 sys_flistxattr			// 1225
-	data8 sys_removexattr
-	data8 sys_lremovexattr
-	data8 sys_fremovexattr
-	data8 sys_tkill
-	data8 sys_futex				// 1230
-	data8 sys_sched_setaffinity
-	data8 sys_sched_getaffinity
-	data8 sys_set_tid_address
-	data8 sys_fadvise64_64
-	data8 sys_tgkill 			// 1235
-	data8 sys_exit_group
-	data8 sys_lookup_dcookie
-	data8 sys_io_setup
-	data8 sys_io_destroy
-	data8 sys_io_getevents			// 1240
-	data8 sys_io_submit
-	data8 sys_io_cancel
-	data8 sys_epoll_create
-	data8 sys_epoll_ctl
-	data8 sys_epoll_wait			// 1245
-	data8 sys_restart_syscall
-	data8 sys_semtimedop
-	data8 sys_timer_create
-	data8 sys_timer_settime
-	data8 sys_timer_gettime			// 1250
-	data8 sys_timer_getoverrun
-	data8 sys_timer_delete
-	data8 sys_clock_settime
-	data8 sys_clock_gettime
-	data8 sys_clock_getres			// 1255
-	data8 sys_clock_nanosleep
-	data8 sys_fstatfs64
-	data8 sys_statfs64
-	data8 sys_mbind
-	data8 sys_get_mempolicy			// 1260
-	data8 sys_set_mempolicy
-	data8 sys_mq_open
-	data8 sys_mq_unlink
-	data8 sys_mq_timedsend
-	data8 sys_mq_timedreceive		// 1265
-	data8 sys_mq_notify
-	data8 sys_mq_getsetattr
-	data8 sys_ni_syscall			// reserved for kexec_load
-	data8 sys_ni_syscall			// reserved for vserver
-	data8 sys_waitid			// 1270
-	data8 sys_add_key
-	data8 sys_request_key
-	data8 sys_keyctl
-	data8 sys_ioprio_set
-	data8 sys_ioprio_get			// 1275
-	data8 sys_ni_syscall
-	data8 sys_inotify_init
-	data8 sys_inotify_add_watch
-	data8 sys_inotify_rm_watch
-
-	.org sys_call_table + 8*NR_syscalls	// guard against failures to increase NR_syscalls
-#endif
diff -r 2386288b1bf1 -r 8aa1697d57e4 xen/arch/ia64/linux-xen/entry.h
--- a/xen/arch/ia64/linux-xen/entry.h	Mon Apr 02 18:14:31 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-#include <linux/config.h>
-
-/*
- * Preserved registers that are shared between code in ivt.S and
- * entry.S.  Be careful not to step on these!
- */
-#define PRED_LEAVE_SYSCALL	1 /* TRUE iff leave from syscall */
-#define PRED_KERNEL_STACK	2 /* returning to kernel-stacks? */
-#define PRED_USER_STACK		3 /* returning to user-stacks? */
-#define PRED_SYSCALL		4 /* inside a system call? */
-#define PRED_NON_SYSCALL	5 /* complement of PRED_SYSCALL */
-
-#ifdef __ASSEMBLY__
-# define PASTE2(x,y)	x##y
-# define PASTE(x,y)	PASTE2(x,y)
-
-# define pLvSys		PASTE(p,PRED_LEAVE_SYSCALL)
-# define pKStk		PASTE(p,PRED_KERNEL_STACK)
-# define pUStk		PASTE(p,PRED_USER_STACK)
-# define pSys		PASTE(p,PRED_SYSCALL)
-# define pNonSys	PASTE(p,PRED_NON_SYSCALL)
-#endif
-
-#define PT(f)		(IA64_PT_REGS_##f##_OFFSET)
-#define SW(f)		(IA64_SWITCH_STACK_##f##_OFFSET)
-#ifdef  XEN
-#define VPD(f)      (VPD_##f##_START_OFFSET)
-#endif
-
-#define PT_REGS_SAVES(off)			\
-	.unwabi 3, 'i';				\
-	.fframe IA64_PT_REGS_SIZE+16+(off);	\
-	.spillsp rp, PT(CR_IIP)+16+(off);	\
-	.spillsp ar.pfs, PT(CR_IFS)+16+(off);	\
-	.spillsp ar.unat, PT(AR_UNAT)+16+(off);	\
-	.spillsp ar.fpsr, PT(AR_FPSR)+16+(off);	\
-	.spillsp pr, PT(PR)+16+(off);
-
-#define PT_REGS_UNWIND_INFO(off)		\
-	.prologue;				\
-	PT_REGS_SAVES(off);			\
-	.body
-
-#define SWITCH_STACK_SAVES(off)							\
-	.savesp ar.unat,SW(CALLER_UNAT)+16+(off);				\
-	.savesp ar.fpsr,SW(AR_FPSR)+16+(off);					\
-	.spillsp f2,SW(F2)+16+(off); .spillsp f3,SW(F3)+16+(off);		\
-	.spillsp f4,SW(F4)+16+(off); .spillsp f5,SW(F5)+16+(off);		\
-	.spillsp f16,SW(F16)+16+(off); .spillsp f17,SW(F17)+16+(off);		\
-	.spillsp f18,SW(F18)+16+(off); .spillsp f19,SW(F19)+16+(off);		\
-	.spillsp f20,SW(F20)+16+(off); .spillsp f21,SW(F21)+16+(off);		\
-	.spillsp f22,SW(F22)+16+(off); .spillsp f23,SW(F23)+16+(off);		\
-	.spillsp f24,SW(F24)+16+(off); .spillsp f25,SW(F25)+16+(off);		\
-	.spillsp f26,SW(F26)+16+(off); .spillsp f27,SW(F27)+16+(off);		\
-	.spillsp f28,SW(F28)+16+(off); .spillsp f29,SW(F29)+16+(off);		\
-	.spillsp f30,SW(F30)+16+(off); .spillsp f31,SW(F31)+16+(off);		\
-	.spillsp r4,SW(R4)+16+(off); .spillsp r5,SW(R5)+16+(off);		\
-	.spillsp r6,SW(R6)+16+(off); .spillsp r7,SW(R7)+16+(off);		\
-	.spillsp b0,SW(B0)+16+(off); .spillsp b1,SW(B1)+16+(off);		\
-	.spillsp b2,SW(B2)+16+(off); .spillsp b3,SW(B3)+16+(off);		\
-	.spillsp b4,SW(B4)+16+(off); .spillsp b5,SW(B5)+16+(off);		\
-	.spillsp ar.pfs,SW(AR_PFS)+16+(off); .spillsp ar.lc,SW(AR_LC)+16+(off);	\
-	.spillsp @priunat,SW(AR_UNAT)+16+(off);					\
-	.spillsp ar.rnat,SW(AR_RNAT)+16+(off);					\
-	.spillsp ar.bspstore,SW(AR_BSPSTORE)+16+(off);				\
-	.spillsp pr,SW(PR)+16+(off)
-
-#define DO_SAVE_SWITCH_STACK			\
-	movl r28=1f;				\
-	;;					\
-	.fframe IA64_SWITCH_STACK_SIZE;		\
-	adds sp=-IA64_SWITCH_STACK_SIZE,sp;	\
-	mov.ret.sptk b7=r28,1f;			\
-	SWITCH_STACK_SAVES(0);			\
-	br.cond.sptk.many save_switch_stack;	\
-1:
-
-#define DO_LOAD_SWITCH_STACK			\
-	movl r28=1f;				\
-	;;					\
-	invala;					\
-	mov.ret.sptk b7=r28,1f;			\
-	br.cond.sptk.many load_switch_stack;	\
-1:	.restore sp;				\
-	adds sp=IA64_SWITCH_STACK_SIZE,sp
diff -r 2386288b1bf1 -r 8aa1697d57e4 xen/arch/ia64/linux-xen/head.S
--- a/xen/arch/ia64/linux-xen/head.S	Mon Apr 02 18:14:31 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1298 +0,0 @@
-/*
- * Here is where the ball gets rolling as far as the kernel is concerned.
- * When control is transferred to _start, the bootload has already
- * loaded us to the correct address.  All that's left to do here is
- * to set up the kernel's global pointer and jump to the kernel
- * entry point.
- *
- * Copyright (C) 1998-2001, 2003, 2005 Hewlett-Packard Co
- *	David Mosberger-Tang <davidm@hpl.hp.com>
- *	Stephane Eranian <eranian@hpl.hp.com>
- * Copyright (C) 1999 VA Linux Systems
- * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
- * Copyright (C) 1999 Intel Corp.
- * Copyright (C) 1999 Asit Mallick <Asit.K.Mallick@intel.com>
- * Copyright (C) 1999 Don Dugger <Don.Dugger@intel.com>
- * Copyright (C) 2002 Fenghua Yu <fenghua.yu@intel.com>
- *   -Optimize __ia64_save_fpu() and __ia64_load_fpu() for Itanium 2.
- * Copyright (C) 2004 Ashok Raj <ashok.raj@intel.com>
- *   Support for CPU Hotplug
- */
-
-#include <linux/config.h>
-
-#include <asm/asmmacro.h>
-#include <asm/fpu.h>
-#include <asm/kregs.h>
-#include <asm/mmu_context.h>
-#include <asm/offsets.h>
-#include <asm/pal.h>
-#include <asm/pgtable.h>
-#include <asm/processor.h>
-#include <asm/ptrace.h>
-#include <asm/system.h>
-#include <asm/mca_asm.h>
-
-#ifdef CONFIG_HOTPLUG_CPU
-#define SAL_PSR_BITS_TO_SET				\
-	(IA64_PSR_AC | IA64_PSR_BN | IA64_PSR_MFH | IA64_PSR_MFL)
-
-#define SAVE_FROM_REG(src, ptr, dest)	\
-	mov dest=src;;						\
-	st8 [ptr]=dest,0x08
-
-#define RESTORE_REG(reg, ptr, _tmp)		\
-	ld8 _tmp=[ptr],0x08;;				\
-	mov reg=_tmp
-
-#define SAVE_BREAK_REGS(ptr, _idx, _breg, _dest)\
-	mov ar.lc=IA64_NUM_DBG_REGS-1;; 			\
-	mov _idx=0;; 								\
-1: 												\
-	SAVE_FROM_REG(_breg[_idx], ptr, _dest);;	\
-	add _idx=1,_idx;;							\
-	br.cloop.sptk.many 1b
-
-#define RESTORE_BREAK_REGS(ptr, _idx, _breg, _tmp, _lbl)\
-	mov ar.lc=IA64_NUM_DBG_REGS-1;;			\
-	mov _idx=0;;							\
-_lbl:  RESTORE_REG(_breg[_idx], ptr, _tmp);;	\
-	add _idx=1, _idx;;						\
-	br.cloop.sptk.many _lbl
-
-#define SAVE_ONE_RR(num, _reg, _tmp) \
-	movl _tmp=(num<<61);;	\
-	mov _reg=rr[_tmp]
-
-#define SAVE_REGION_REGS(_tmp, _r0, _r1, _r2, _r3, _r4, _r5, _r6, _r7) \
-	SAVE_ONE_RR(0,_r0, _tmp);; \
-	SAVE_ONE_RR(1,_r1, _tmp);; \
-	SAVE_ONE_RR(2,_r2, _tmp);; \
-	SAVE_ONE_RR(3,_r3, _tmp);; \
-	SAVE_ONE_RR(4,_r4, _tmp);; \
-	SAVE_ONE_RR(5,_r5, _tmp);; \
-	SAVE_ONE_RR(6,_r6, _tmp);; \
-	SAVE_ONE_RR(7,_r7, _tmp);;
-
-#define STORE_REGION_REGS(ptr, _r0, _r1, _r2, _r3, _r4, _r5, _r6, _r7) \
-	st8 [ptr]=_r0, 8;; \
-	st8 [ptr]=_r1, 8;; \
-	st8 [ptr]=_r2, 8;; \
-	st8 [ptr]=_r3, 8;; \
-	st8 [ptr]=_r4, 8;; \
-	st8 [ptr]=_r5, 8;; \
-	st8 [ptr]=_r6, 8;; \
-	st8 [ptr]=_r7, 8;;
-
-#define RESTORE_REGION_REGS(ptr, _idx1, _idx2, _tmp) \
-	mov		ar.lc=0x08-1;;						\
-	movl	_idx1=0x00;;						\
-RestRR:											\
-	dep.z	_idx2=_idx1,61,3;;					\
-	ld8		_tmp=[ptr],8;;						\
-	mov		rr[_idx2]=_tmp;;					\
-	srlz.d;;									\
-	add		_idx1=1,_idx1;;						\
-	br.cloop.sptk.few	RestRR
-
-#define SET_AREA_FOR_BOOTING_CPU(reg1, reg2) \
-	movl reg1=sal_state_for_booting_cpu;;	\
-	ld8 reg2=[reg1];;
-
-/*
- * Adjust region registers saved before starting to save
- * break regs and rest of the states that need to be preserved.
- */
-#define SAL_TO_OS_BOOT_HANDOFF_STATE_SAVE(_reg1,_reg2,_pred)  \
-	SAVE_FROM_REG(b0,_reg1,_reg2);;						\
-	SAVE_FROM_REG(b1,_reg1,_reg2);;						\
-	SAVE_FROM_REG(b2,_reg1,_reg2);;						\
-	SAVE_FROM_REG(b3,_reg1,_reg2);;						\
-	SAVE_FROM_REG(b4,_reg1,_reg2);;						\
-	SAVE_FROM_REG(b5,_reg1,_reg2);;						\
-	st8 [_reg1]=r1,0x08;;								\
-	st8 [_reg1]=r12,0x08;;								\
-	st8 [_reg1]=r13,0x08;;								\
-	SAVE_FROM_REG(ar.fpsr,_reg1,_reg2);;				\
-	SAVE_FROM_REG(ar.pfs,_reg1,_reg2);;					\
-	SAVE_FROM_REG(ar.rnat,_reg1,_reg2);;				\
-	SAVE_FROM_REG(ar.unat,_reg1,_reg2);;				\
-	SAVE_FROM_REG(ar.bspstore,_reg1,_reg2);;			\
-	SAVE_FROM_REG(cr.dcr,_reg1,_reg2);;					\
-	SAVE_FROM_REG(cr.iva,_reg1,_reg2);;					\
-	SAVE_FROM_REG(cr.pta,_reg1,_reg2);;					\
-	SAVE_FROM_REG(cr.itv,_reg1,_reg2);;					\
-	SAVE_FROM_REG(cr.pmv,_reg1,_reg2);;					\
-	SAVE_FROM_REG(cr.cmcv,_reg1,_reg2);;				\
-	SAVE_FROM_REG(cr.lrr0,_reg1,_reg2);;				\
-	SAVE_FROM_REG(cr.lrr1,_reg1,_reg2);;				\
-	st8 [_reg1]=r4,0x08;;								\
-	st8 [_reg1]=r5,0x08;;								\
-	st8 [_reg1]=r6,0x08;;								\
-	st8 [_reg1]=r7,0x08;;								\
-	st8 [_reg1]=_pred,0x08;;							\
-	SAVE_FROM_REG(ar.lc, _reg1, _reg2);;				\
-	stf.spill.nta [_reg1]=f2,16;;						\
-	stf.spill.nta [_reg1]=f3,16;;						\
-	stf.spill.nta [_reg1]=f4,16;;						\
-	stf.spill.nta [_reg1]=f5,16;;						\
-	stf.spill.nta [_reg1]=f16,16;;						\
-	stf.spill.nta [_reg1]=f17,16;;						\
-	stf.spill.nta [_reg1]=f18,16;;						\
-	stf.spill.nta [_reg1]=f19,16;;						\
-	stf.spill.nta [_reg1]=f20,16;;						\
-	stf.spill.nta [_reg1]=f21,16;;						\
-	stf.spill.nta [_reg1]=f22,16;;						\
-	stf.spill.nta [_reg1]=f23,16;;						\
-	stf.spill.nta [_reg1]=f24,16;;						\
-	stf.spill.nta [_reg1]=f25,16;;						\
-	stf.spill.nta [_reg1]=f26,16;;						\
-	stf.spill.nta [_reg1]=f27,16;;						\
-	stf.spill.nta [_reg1]=f28,16;;						\
-	stf.spill.nta [_reg1]=f29,16;;						\
-	stf.spill.nta [_reg1]=f30,16;;						\
-	stf.spill.nta [_reg1]=f31,16;;
-
-#else
-#define SET_AREA_FOR_BOOTING_CPU(a1, a2)
-#define SAL_TO_OS_BOOT_HANDOFF_STATE_SAVE(a1,a2, a3)
-#define SAVE_REGION_REGS(_tmp, _r0, _r1, _r2, _r3, _r4, _r5, _r6, _r7)
-#define STORE_REGION_REGS(ptr, _r0, _r1, _r2, _r3, _r4, _r5, _r6, _r7)
-#endif
-
-#ifdef XEN
-#define SET_ONE_RR(num, pgsize, _tmp1, _tmp2, vhpt) \
-	movl _tmp1=(num << 61);;	\
-	movl _tmp2=((ia64_rid(IA64_REGION_ID_KERNEL, (num<<61)) << 8) | (pgsize << 2) | vhpt);; \
-	mov rr[_tmp1]=_tmp2
-#else
-#define SET_ONE_RR(num, pgsize, _tmp1, _tmp2, vhpt) \
-	movl _tmp1=(num << 61);;	\
-	mov _tmp2=((ia64_rid(IA64_REGION_ID_KERNEL, (num<<61)) << 8) | (pgsize << 2) | vhpt);; \
-	mov rr[_tmp1]=_tmp2
-#endif
-
-	.section __special_page_section,"ax"
-
-	.global empty_zero_page
-empty_zero_page:
-	.skip PAGE_SIZE
-
-#ifndef XEN
-	.global swapper_pg_dir
-swapper_pg_dir:
-	.skip PAGE_SIZE
-#endif
-
-#if defined(XEN) && defined(CONFIG_VIRTUAL_FRAME_TABLE)
-	.global frametable_pg_dir
-frametable_pg_dir:
-	.skip PAGE_SIZE
-#endif
-
-	.rodata
-halt_msg:
-	stringz "Halting kernel\n"
-
-	.text
-
-	.global start_ap
-
-	/*
-	 * Start the kernel.  When the bootloader passes control to _start(), r28
-	 * points to the address of the boot parameter area.  Execution reaches
-	 * here in physical mode.
-	 */
-GLOBAL_ENTRY(_start)
-start_ap:
-	.prologue
-	.save rp, r0		// terminate unwind chain with a NULL rp
-	.body
-
-	rsm psr.i | psr.ic
-	;;
-	srlz.i
-	;;
-	/*
-	 * Save the region registers, predicate before they get clobbered
-	 */
-	SAVE_REGION_REGS(r2, r8,r9,r10,r11,r12,r13,r14,r15);
-	mov r25=pr;;
-
-	/*
-	 * Initialize kernel region registers:
-	 *	rr[0]: VHPT enabled, page size = PAGE_SHIFT
-	 *	rr[1]: VHPT enabled, page size = PAGE_SHIFT
-	 *	rr[2]: VHPT enabled, page size = PAGE_SHIFT
-	 *	rr[3]: VHPT enabled, page size = PAGE_SHIFT
-	 *	rr[4]: VHPT enabled, page size = PAGE_SHIFT
-	 *	rr[5]: VHPT enabled, page size = PAGE_SHIFT
-	 *	rr[6]: VHPT disabled, page size = IA64_GRANULE_SHIFT
-	 *	rr[7]: VHPT disabled, page size = IA64_GRANULE_SHIFT
-	 * We initialize all of them to prevent inadvertently assuming
-	 * something about the state of address translation early in boot.
-	 */
-	SET_ONE_RR(0, PAGE_SHIFT, r2, r16, 1);;
-	SET_ONE_RR(1, PAGE_SHIFT, r2, r16, 1);;
-	SET_ONE_RR(2, PAGE_SHIFT, r2, r16, 1);;
-	SET_ONE_RR(3, PAGE_SHIFT, r2, r16, 1);;
-	SET_ONE_RR(4, PAGE_SHIFT, r2, r16, 1);;
-	SET_ONE_RR(5, PAGE_SHIFT, r2, r16, 1);;
-	SET_ONE_RR(6, IA64_GRANULE_SHIFT, r2, r16, 0);;
-	SET_ONE_RR(7, IA64_GRANULE_SHIFT, r2, r16, 0);;
-	/*
-	 * Now pin mappings into the TLB for kernel text and data
-	 */
-	mov r18=KERNEL_TR_PAGE_SHIFT<<2
-	movl r17=KERNEL_START
-	;;
-	mov cr.itir=r18
-	mov cr.ifa=r17
-	mov r16=IA64_TR_KERNEL
-	mov r3=ip
-	movl r18=PAGE_KERNEL
-	;;
-	dep r2=0,r3,0,KERNEL_TR_PAGE_SHIFT
-	;;
-	or r18=r2,r18
-	;;
-	srlz.i
-	;;
-	itr.i itr[r16]=r18
-	;;
-	itr.d dtr[r16]=r18
-	;;
-	srlz.i
-
-	/*
-	 * Switch into virtual mode:
-	 */
-#ifdef XEN
-		movl r16=(IA64_PSR_IT|IA64_PSR_IC|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFH|IA64_PSR_BN \
-		  |IA64_PSR_DI|IA64_PSR_AC)
-#else
-	movl r16=(IA64_PSR_IT|IA64_PSR_IC|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFH|IA64_PSR_BN \
-		  |IA64_PSR_DI)
-#endif
-	;;
-	mov cr.ipsr=r16
-	movl r17=1f
-	;;
-	mov cr.iip=r17
-	mov cr.ifs=r0
-	;;
-	rfi
-	;;
-1:	// now we are in virtual mode
-
-	SET_AREA_FOR_BOOTING_CPU(r2, r16);
-
-	STORE_REGION_REGS(r16, r8,r9,r10,r11,r12,r13,r14,r15);
-	SAL_TO_OS_BOOT_HANDOFF_STATE_SAVE(r16,r17,r25)
-	;;
-
-	// set IVT entry point---can't access I/O ports without it
-	movl r3=ia64_ivt
-	;;
-	mov cr.iva=r3
-	movl r2=FPSR_DEFAULT
-	;;
-	srlz.i
-	movl gp=__gp
-	;;
-	mov ar.fpsr=r2
-	;;
-
-#define isAP	p2	// are we an Application Processor?
-#define isBP	p3	// are we the Bootstrap Processor?
-
-#ifdef XEN
-# define init_task	init_task_mem
-#endif
-
-#ifdef CONFIG_SMP
-	/*
-	 * Find the init_task for the currently booting CPU.  At poweron, and in
-	 * UP mode, task_for_booting_cpu is NULL.
-	 */
-	movl r3=task_for_booting_cpu
- 	;;
-	ld8 r3=[r3]
-	movl r2=init_task
-	;;
-	cmp.eq isBP,isAP=r3,r0
-	;;
-(isAP)	mov r2=r3
-#else
-	movl r2=init_task
-	cmp.eq isBP,isAP=r0,r0
-#endif
-	;;
-	tpa r3=r2		// r3 == phys addr of task struct
-	mov r16=-1
-#ifndef XEN
-(isBP)	br.cond.dpnt .load_current // BP stack is on region 5 --- no need to map it
-#endif
-
-	// load mapping for stack (virtaddr in r2, physaddr in r3)
-	rsm psr.ic
-	movl r17=PAGE_KERNEL
-	;;
-	srlz.d
-	dep r18=0,r3,0,12
-	;;
-	or r18=r17,r18
-#ifdef XEN
-	dep r2=-1,r3,60,4       // IMVA of task 
-#else
-	dep r2=-1,r3,61,3	// IMVA of task
-#endif
-	;;
-	mov r17=rr[r2]
-	shr.u r16=r3,IA64_GRANULE_SHIFT
-	;;
-	dep r17=0,r17,8,24
-	;;
-	mov cr.itir=r17
-	mov cr.ifa=r2
-
-	mov r19=IA64_TR_CURRENT_STACK
-	;;
-	itr.d dtr[r19]=r18
-	;;
-	ssm psr.ic
-	srlz.d
-  	;;
-	
-.load_current:
-	// load the "current" pointer (r13) and ar.k6 with the current task
-	mov IA64_KR(CURRENT)=r2		// virtual address
-	mov IA64_KR(CURRENT_STACK)=r16
-	mov r13=r2
-	/*
-	 * Reserve space at the top of the stack for "struct pt_regs".  Kernel
-	 * threads don't store interesting values in that structure, but the space
-	 * still needs to be there because time-critical stuff such as the context
-	 * switching can be implemented more efficiently (for example, __switch_to()
-	 * always sets the psr.dfh bit of the task it is switching to).
-	 */
-
-	addl r12=IA64_STK_OFFSET-IA64_PT_REGS_SIZE-16,r2
-	addl r2=IA64_RBS_OFFSET,r2	// initialize the RSE
-	mov ar.rsc=0		// place RSE in enforced lazy mode
-	;;
-	loadrs			// clear the dirty partition
-#ifdef XEN
-(isAP)	br.few 2f
-	movl r19=__phys_per_cpu_start
-	mov r18=PERCPU_PAGE_SIZE
-#ifndef CONFIG_SMP
-	add r19=r19,r18
-	;;
-#else
-	movl r20=__cpu0_per_cpu
-	;;
-	shr.u r18=r18,3
-1:
-	ld8 r21=[r19],8 ;;
-	st8[r20]=r21,8
-	adds r18=-1,r18
-	;;
-	cmp4.lt p7,p6=0,r18
-(p7)	br.cond.dptk.few 1b
-	;;
-#endif
-	movl r18=__per_cpu_offset
-	movl r19=__cpu0_per_cpu
-	movl r20=__per_cpu_start
-	;;
-	sub r20=r19,r20
-	;;
-	st8 [r18]=r20
-2:
-#endif
-	;;
-	mov ar.bspstore=r2	// establish the new RSE stack
-	;;
-	mov ar.rsc=0x3		// place RSE in eager mode
-
-#ifdef XEN
-(isBP)	dep r28=-1,r28,60,4	// make address virtual
-#else
-(isBP)	dep r28=-1,r28,61,3	// make address virtual
-#endif
-(isBP)	movl r2=ia64_boot_param
-	;;
-(isBP)	st8 [r2]=r28		// save the address of the boot param area passed by the bootloader
-
-#ifdef CONFIG_SMP
-(isAP)	br.call.sptk.many rp=start_secondary
-.ret0:
-(isAP)	br.cond.sptk self
-#endif
-
-	// This is executed by the bootstrap processor (bsp) only:
-
-#ifdef CONFIG_IA64_FW_EMU
-	// initialize PAL & SAL emulator:
-	br.call.sptk.many rp=sys_fw_init
-.ret1:
-#endif
-	br.call.sptk.many rp=start_kernel
-.ret2:	addl r3=@ltoff(halt_msg),gp
-	;;
-	alloc r2=ar.pfs,8,0,2,0
-	;;
-	ld8 out0=[r3]
-	br.call.sptk.many b0=console_print
-
-self:	hint @pause
-#ifdef XEN
-	;;
-	br.sptk.many self		// endless loop
-	;;
-#else
-	br.sptk.many self		// endless loop
-#endif
-END(_start)
-
-GLOBAL_ENTRY(ia64_save_debug_regs)
-	alloc r16=ar.pfs,1,0,0,0
-	mov r20=ar.lc			// preserve ar.lc
-	mov ar.lc=IA64_NUM_DBG_REGS-1
-	mov r18=0
-	add r19=IA64_NUM_DBG_REGS*8,in0
-	;;
-1:	mov r16=dbr[r18]
-#ifdef CONFIG_ITANIUM
-	;;
-	srlz.d
-#endif
-	mov r17=ibr[r18]
-	add r18=1,r18
-	;;
-	st8.nta [in0]=r16,8
-	st8.nta [r19]=r17,8
-	br.cloop.sptk.many 1b
-	;;
-	mov ar.lc=r20			// restore ar.lc
-	br.ret.sptk.many rp
-END(ia64_save_debug_regs)
-
-GLOBAL_ENTRY(ia64_load_debug_regs)
-	alloc r16=ar.pfs,1,0,0,0
-	lfetch.nta [in0]
-	mov r20=ar.lc			// preserve ar.lc
-	add r19=IA64_NUM_DBG_REGS*8,in0
-	mov ar.lc=IA64_NUM_DBG_REGS-1
-	mov r18=-1
-	;;
-1:	ld8.nta r16=[in0],8
-	ld8.nta r17=[r19],8
-	add r18=1,r18
-	;;
-	mov dbr[r18]=r16
-#ifdef CONFIG_ITANIUM
-	;;
-	srlz.d				// Errata 132 (NoFix status)
-#endif
-	mov ibr[r18]=r17
-	br.cloop.sptk.many 1b
-	;;
-	mov ar.lc=r20			// restore ar.lc
-	br.ret.sptk.many rp
-END(ia64_load_debug_regs)
-
-GLOBAL_ENTRY(__ia64_save_fpu)
-	alloc r2=ar.pfs,1,4,0,0
-	adds loc0=96*16-16,in0
-	adds loc1=96*16-16-128,in0
-	;;
-	stf.spill.nta [loc0]=f127,-256
-	stf.spill.nta [loc1]=f119,-256
-	;;
-	stf.spill.nta [loc0]=f111,-256
-	stf.spill.nta [loc1]=f103,-256
-	;;
-	stf.spill.nta [loc0]=f95,-256
-	stf.spill.nta [loc1]=f87,-256
-	;;
-	stf.spill.nta [loc0]=f79,-256
-	stf.spill.nta [loc1]=f71,-256
-	;;
-	stf.spill.nta [loc0]=f63,-256
-	stf.spill.nta [loc1]=f55,-256
-	adds loc2=96*16-32,in0
-	;;
-	stf.spill.nta [loc0]=f47,-256
-	stf.spill.nta [loc1]=f39,-256
-	adds loc3=96*16-32-128,in0
-	;;
-	stf.spill.nta [loc2]=f126,-256
-	stf.spill.nta [loc3]=f118,-256
-	;;
-	stf.spill.nta [loc2]=f110,-256
-	stf.spill.nta [loc3]=f102,-256
-	;;
-	stf.spill.nta [loc2]=f94,-256
-	stf.spill.nta [loc3]=f86,-256
-	;;
-	stf.spill.nta [loc2]=f78,-256
-	stf.spill.nta [loc3]=f70,-256
-	;;
-	stf.spill.nta [loc2]=f62,-256
-	stf.spill.nta [loc3]=f54,-256
-	adds loc0=96*16-48,in0
-	;;
-	stf.spill.nta [loc2]=f46,-256
-	stf.spill.nta [loc3]=f38,-256
-	adds loc1=96*16-48-128,in0
-	;;
-	stf.spill.nta [loc0]=f125,-256
-	stf.spill.nta [loc1]=f117,-256
-	;;
-	stf.spill.nta [loc0]=f109,-256
-	stf.spill.nta [loc1]=f101,-256
-	;;
-	stf.spill.nta [loc0]=f93,-256
-	stf.spill.nta [loc1]=f85,-256
-	;;
-	stf.spill.nta [loc0]=f77,-256
-	stf.spill.nta [loc1]=f69,-256
-	;;
-	stf.spill.nta [loc0]=f61,-256
-	stf.spill.nta [loc1]=f53,-256
-	adds loc2=96*16-64,in0
-	;;
-	stf.spill.nta [loc0]=f45,-256
-	stf.spill.nta [loc1]=f37,-256
-	adds loc3=96*16-64-128,in0
-	;;
-	stf.spill.nta [loc2]=f124,-256
-	stf.spill.nta [loc3]=f116,-256
-	;;
-	stf.spill.nta [loc2]=f108,-256
-	stf.spill.nta [loc3]=f100,-256
-	;;
-	stf.spill.nta [loc2]=f92,-256
-	stf.spill.nta [loc3]=f84,-256
-	;;
-	stf.spill.nta [loc2]=f76,-256
-	stf.spill.nta [loc3]=f68,-256
-	;;
-	stf.spill.nta [loc2]=f60,-256
-	stf.spill.nta [loc3]=f52,-256
-	adds loc0=96*16-80,in0
-	;;
-	stf.spill.nta [loc2]=f44,-256
-	stf.spill.nta [loc3]=f36,-256
-	adds loc1=96*16-80-128,in0
-	;;
-	stf.spill.nta [loc0]=f123,-256
-	stf.spill.nta [loc1]=f115,-256
-	;;
-	stf.spill.nta [loc0]=f107,-256
-	stf.spill.nta [loc1]=f99,-256
-	;;
-	stf.spill.nta [loc0]=f91,-256
-	stf.spill.nta [loc1]=f83,-256
-	;;
-	stf.spill.nta [loc0]=f75,-256
-	stf.spill.nta [loc1]=f67,-256
-	;;
-	stf.spill.nta [loc0]=f59,-256
-	stf.spill.nta [loc1]=f51,-256
-	adds loc2=96*16-96,in0
-	;;
-	stf.spill.nta [loc0]=f43,-256
-	stf.spill.nta [loc1]=f35,-256
-	adds loc3=96*16-96-128,in0
-	;;
-	stf.spill.nta [loc2]=f122,-256
-	stf.spill.nta [loc3]=f114,-256
-	;;
-	stf.spill.nta [loc2]=f106,-256
-	stf.spill.nta [loc3]=f98,-256
-	;;
-	stf.spill.nta [loc2]=f90,-256
-	stf.spill.nta [loc3]=f82,-256
-	;;
-	stf.spill.nta [loc2]=f74,-256
-	stf.spill.nta [loc3]=f66,-256
-	;;
-	stf.spill.nta [loc2]=f58,-256
-	stf.spill.nta [loc3]=f50,-256
-	adds loc0=96*16-112,in0
-	;;
-	stf.spill.nta [loc2]=f42,-256
-	stf.spill.nta [loc3]=f34,-256
-	adds loc1=96*16-112-128,in0
-	;;
-	stf.spill.nta [loc0]=f121,-256
-	stf.spill.nta [loc1]=f113,-256
-	;;
-	stf.spill.nta [loc0]=f105,-256
-	stf.spill.nta [loc1]=f97,-256
-	;;
-	stf.spill.nta [loc0]=f89,-256
-	stf.spill.nta [loc1]=f81,-256
-	;;
-	stf.spill.nta [loc0]=f73,-256
-	stf.spill.nta [loc1]=f65,-256
-	;;
-	stf.spill.nta [loc0]=f57,-256
-	stf.spill.nta [loc1]=f49,-256
-	adds loc2=96*16-128,in0
-	;;
-	stf.spill.nta [loc0]=f41,-256
-	stf.spill.nta [loc1]=f33,-256
-	adds loc3=96*16-128-128,in0
-	;;
-	stf.spill.nta [loc2]=f120,-256
-	stf.spill.nta [loc3]=f112,-256
-	;;
-	stf.spill.nta [loc2]=f104,-256
-	stf.spill.nta [loc3]=f96,-256
-	;;
-	stf.spill.nta [loc2]=f88,-256
-	stf.spill.nta [loc3]=f80,-256
-	;;
-	stf.spill.nta [loc2]=f72,-256
-	stf.spill.nta [loc3]=f64,-256
-	;;
-	stf.spill.nta [loc2]=f56,-256
-	stf.spill.nta [loc3]=f48,-256
-	;;
-	stf.spill.nta [loc2]=f40
-	stf.spill.nta [loc3]=f32
-	br.ret.sptk.many rp
-END(__ia64_save_fpu)
-
-GLOBAL_ENTRY(__ia64_load_fpu)
-	alloc r2=ar.pfs,1,2,0,0
-	adds r3=128,in0
-	adds r14=256,in0
-	adds r15=384,in0
-	mov loc0=512
-	mov loc1=-1024+16
-	;;
-	ldf.fill.nta f32=[in0],loc0
-	ldf.fill.nta f40=[ r3],loc0
-	ldf.fill.nta f48=[r14],loc0
-	ldf.fill.nta f56=[r15],loc0
-	;;
-	ldf.fill.nta f64=[in0],loc0
-	ldf.fill.nta f72=[ r3],loc0
-	ldf.fill.nta f80=[r14],loc0
-	ldf.fill.nta f88=[r15],loc0
-	;;
-	ldf.fill.nta f96=[in0],loc1
-	ldf.fill.nta f104=[ r3],loc1
-	ldf.fill.nta f112=[r14],loc1
-	ldf.fill.nta f120=[r15],loc1
-	;;
-	ldf.fill.nta f33=[in0],loc0
-	ldf.fill.nta f41=[ r3],loc0
-	ldf.fill.nta f49=[r14],loc0
-	ldf.fill.nta f57=[r15],loc0
-	;;
-	ldf.fill.nta f65=[in0],loc0
-	ldf.fill.nta f73=[ r3],loc0
-	ldf.fill.nta f81=[r14],loc0
-	ldf.fill.nta f89=[r15],loc0
-	;;
-	ldf.fill.nta f97=[in0],loc1
-	ldf.fill.nta f105=[ r3],loc1
-	ldf.fill.nta f113=[r14],loc1
-	ldf.fill.nta f121=[r15],loc1
-	;;
-	ldf.fill.nta f34=[in0],loc0
-	ldf.fill.nta f42=[ r3],loc0
-	ldf.fill.nta f50=[r14],loc0
-	ldf.fill.nta f58=[r15],loc0
-	;;
-	ldf.fill.nta f66=[in0],loc0
-	ldf.fill.nta f74=[ r3],loc0
-	ldf.fill.nta f82=[r14],loc0
-	ldf.fill.nta f90=[r15],loc0
-	;;
-	ldf.fill.nta f98=[in0],loc1
-	ldf.fill.nta f106=[ r3],loc1
-	ldf.fill.nta f114=[r14],loc1
-	ldf.fill.nta f122=[r15],loc1
-	;;
-	ldf.fill.nta f35=[in0],loc0
-	ldf.fill.nta f43=[ r3],loc0
-	ldf.fill.nta f51=[r14],loc0
-	ldf.fill.nta f59=[r15],loc0
-	;;
-	ldf.fill.nta f67=[in0],loc0
-	ldf.fill.nta f75=[ r3],loc0
-	ldf.fill.nta f83=[r14],loc0
-	ldf.fill.nta f91=[r15],loc0
-	;;
-	ldf.fill.nta f99=[in0],loc1
-	ldf.fill.nta f107=[ r3],loc1
-	ldf.fill.nta f115=[r14],loc1
-	ldf.fill.nta f123=[r15],loc1
-	;;
-	ldf.fill.nta f36=[in0],loc0
-	ldf.fill.nta f44=[ r3],loc0
-	ldf.fill.nta f52=[r14],loc0
-	ldf.fill.nta f60=[r15],loc0
-	;;
-	ldf.fill.nta f68=[in0],loc0
-	ldf.fill.nta f76=[ r3],loc0
-	ldf.fill.nta f84=[r14],loc0
-	ldf.fill.nta f92=[r15],loc0
-	;;
-	ldf.fill.nta f100=[in0],loc1
-	ldf.fill.nta f108=[ r3],loc1
-	ldf.fill.nta f116=[r14],loc1
-	ldf.fill.nta f124=[r15],loc1
-	;;
-	ldf.fill.nta f37=[in0],loc0
-	ldf.fill.nta f45=[ r3],loc0
-	ldf.fill.nta f53=[r14],loc0
-	ldf.fill.nta f61=[r15],loc0
-	;;
-	ldf.fill.nta f69=[in0],loc0
-	ldf.fill.nta f77=[ r3],loc0
-	ldf.fill.nta f85=[r14],loc0
-	ldf.fill.nta f93=[r15],loc0
-	;;
-	ldf.fill.nta f101=[in0],loc1
-	ldf.fill.nta f109=[ r3],loc1
-	ldf.fill.nta f117=[r14],loc1
-	ldf.fill.nta f125=[r15],loc1
-	;;
-	ldf.fill.nta f38 =[in0],loc0
-	ldf.fill.nta f46 =[ r3],loc0
-	ldf.fill.nta f54 =[r14],loc0
-	ldf.fill.nta f62 =[r15],loc0
-	;;
-	ldf.fill.nta f70 =[in0],loc0
-	ldf.fill.nta f78 =[ r3],loc0
-	ldf.fill.nta f86 =[r14],loc0
-	ldf.fill.nta f94 =[r15],loc0
-	;;
-	ldf.fill.nta f102=[in0],loc1
-	ldf.fill.nta f110=[ r3],loc1
-	ldf.fill.nta f118=[r14],loc1
-	ldf.fill.nta f126=[r15],loc1
-	;;
-	ldf.fill.nta f39 =[in0],loc0
-	ldf.fill.nta f47 =[ r3],loc0
-	ldf.fill.nta f55 =[r14],loc0
-	ldf.fill.nta f63 =[r15],loc0
-	;;
-	ldf.fill.nta f71 =[in0],loc0
-	ldf.fill.nta f79 =[ r3],loc0
-	ldf.fill.nta f87 =[r14],loc0
-	ldf.fill.nta f95 =[r15],loc0
-	;;
-	ldf.fill.nta f103=[in0]
-	ldf.fill.nta f111=[ r3]
-	ldf.fill.nta f119=[r14]
-	ldf.fill.nta f127=[r15]
-	br.ret.sptk.many rp
-END(__ia64_load_fpu)
-
-GLOBAL_ENTRY(__ia64_init_fpu)
-	stf.spill [sp]=f0		// M3
-	mov	 f32=f0			// F
-	nop.b	 0
-
-	ldfps	 f33,f34=[sp]		// M0
-	ldfps	 f35,f36=[sp]		// M1
-	mov      f37=f0			// F
-	;;
-
-	setf.s	 f38=r0			// M2
-	setf.s	 f39=r0			// M3
-	mov      f40=f0			// F
-
-	ldfps	 f41,f42=[sp]		// M0
-	ldfps	 f43,f44=[sp]		// M1
-	mov      f45=f0			// F
-
-	setf.s	 f46=r0			// M2
-	setf.s	 f47=r0			// M3
-	mov      f48=f0			// F
-
-	ldfps	 f49,f50=[sp]		// M0
-	ldfps	 f51,f52=[sp]		// M1
-	mov      f53=f0			// F
-
-	setf.s	 f54=r0			// M2
-	setf.s	 f55=r0			// M3
-	mov      f56=f0			// F
-
-	ldfps	 f57,f58=[sp]		// M0
-	ldfps	 f59,f60=[sp]		// M1
-	mov      f61=f0			// F
-
-	setf.s	 f62=r0			// M2
-	setf.s	 f63=r0			// M3
-	mov      f64=f0			// F
-
-	ldfps	 f65,f66=[sp]		// M0
-	ldfps	 f67,f68=[sp]		// M1
-	mov      f69=f0			// F
-
-	setf.s	 f70=r0			// M2
-	setf.s	 f71=r0			// M3
-	mov      f72=f0			// F
-
-	ldfps	 f73,f74=[sp]		// M0
-	ldfps	 f75,f76=[sp]		// M1
-	mov      f77=f0			// F
-
-	setf.s	 f78=r0			// M2
-	setf.s	 f79=r0			// M3
-	mov      f80=f0			// F
-
-	ldfps	 f81,f82=[sp]		// M0
-	ldfps	 f83,f84=[sp]		// M1
-	mov      f85=f0			// F
-
-	setf.s	 f86=r0			// M2
-	setf.s	 f87=r0			// M3
-	mov      f88=f0			// F
-
-	/*
-	 * When the instructions are cached, it would be faster to initialize
-	 * the remaining registers with simply mov instructions (F-unit).
-	 * This gets the time down to ~29 cycles.  However, this would use up
-	 * 33 bundles, whereas continuing with the above pattern yields
-	 * 10 bundles and ~30 cycles.
-	 */
-
-	ldfps	 f89,f90=[sp]		// M0
-	ldfps	 f91,f92=[sp]		// M1
-	mov      f93=f0			// F
-
-	setf.s	 f94=r0			// M2
-	setf.s	 f95=r0			// M3
-	mov      f96=f0			// F
-
-	ldfps	 f97,f98=[sp]		// M0
-	ldfps	 f99,f100=[sp]		// M1
-	mov      f101=f0		// F
-
-	setf.s	 f102=r0		// M2
-	setf.s	 f103=r0		// M3
-	mov      f104=f0		// F
-
-	ldfps	 f105,f106=[sp]		// M0
-	ldfps	 f107,f108=[sp]		// M1
-	mov      f109=f0		// F
-
-	setf.s	 f110=r0		// M2
-	setf.s	 f111=r0		// M3
-	mov      f112=f0		// F
-
-	ldfps	 f113,f114=[sp]		// M0
-	ldfps	 f115,f116=[sp]		// M1
-	mov      f117=f0		// F
-
-	setf.s	 f118=r0		// M2
-	setf.s	 f119=r0		// M3
-	mov      f120=f0		// F
-
-	ldfps	 f121,f122=[sp]		// M0
-	ldfps	 f123,f124=[sp]		// M1
-	mov      f125=f0		// F
-
-	setf.s	 f126=r0		// M2
-	setf.s	 f127=r0		// M3
-	br.ret.sptk.many rp		// F
-END(__ia64_init_fpu)
-
-/*
- * Switch execution mode from virtual to physical
- *
- * Inputs:
- *	r16 = new psr to establish
- * Output:
- *	r19 = old virtual address of ar.bsp
- *	r20 = old virtual address of sp
- *
- * Note: RSE must already be in enforced lazy mode
- */
-GLOBAL_ENTRY(ia64_switch_mode_phys)
- {
-	alloc r2=ar.pfs,0,0,0,0
-	rsm psr.i | psr.ic		// disable interrupts and interrupt collection
-	mov r15=ip
- }
-	;;
- {
-	flushrs				// must be first insn in group
-	srlz.i
- }
-	;;
-	mov cr.ipsr=r16			// set new PSR
-	add r3=1f-ia64_switch_mode_phys,r15
-
-	mov r19=ar.bsp
-	mov r20=sp
-	mov r14=rp			// get return address into a general register
-	;;
-
-	// going to physical mode, use tpa to translate virt->phys
-	tpa r17=r19
-	tpa r3=r3
-	tpa sp=sp
-	tpa r14=r14
-	;;
-
-	mov r18=ar.rnat			// save ar.rnat
-	mov ar.bspstore=r17		// this steps on ar.rnat
-	mov cr.iip=r3
-	mov cr.ifs=r0
-	;;
-	mov ar.rnat=r18			// restore ar.rnat
-	rfi				// must be last insn in group
-	;;
-1:	mov rp=r14
-	br.ret.sptk.many rp
-END(ia64_switch_mode_phys)
-
-/*
- * Switch execution mode from physical to virtual
- *
- * Inputs:
- *	r16 = new psr to establish
- *	r19 = new bspstore to establish
- *	r20 = new sp to establish
- *
- * Note: RSE must already be in enforced lazy mode
- */
-GLOBAL_ENTRY(ia64_switch_mode_virt)
- {
-	alloc r2=ar.pfs,0,0,0,0
-	rsm psr.i | psr.ic		// disable interrupts and interrupt collection
-	mov r15=ip
- }
-	;;
- {
-	flushrs				// must be first insn in group
-	srlz.i
- }
-	;;
-	mov cr.ipsr=r16			// set new PSR
-	add r3=1f-ia64_switch_mode_virt,r15
-
-	mov r14=rp			// get return address into a general register
-	;;
-
-	// going to virtual
-	//   - for code addresses, set upper bits of addr to KERNEL_START
-	//   - for stack addresses, copy from input argument
-	movl r18=KERNEL_START
-	dep r3=0,r3,KERNEL_TR_PAGE_SHIFT,64-KERNEL_TR_PAGE_SHIFT
-	dep r14=0,r14,KERNEL_TR_PAGE_SHIFT,64-KERNEL_TR_PAGE_SHIFT
-	mov sp=r20
-	;;
-	or r3=r3,r18
-	or r14=r14,r18
-	;;
-
-	mov r18=ar.rnat			// save ar.rnat
-	mov ar.bspstore=r19		// this steps on ar.rnat
-	mov cr.iip=r3
-	mov cr.ifs=r0
-	;;
-	mov ar.rnat=r18			// restore ar.rnat
-	rfi				// must be last insn in group
-	;;
-1:	mov rp=r14
-	br.ret.sptk.many rp
-END(ia64_switch_mode_virt)
-
-GLOBAL_ENTRY(ia64_delay_loop)
-	.prologue
-{	nop 0			// work around GAS unwind info generation bug...
-	.save ar.lc,r2
-	mov r2=ar.lc
-	.body
-	;;
-	mov ar.lc=r32
-}
-	;;
-	// force loop to be 32-byte aligned (GAS bug means we cannot use .align
-	// inside function body without corrupting unwind info).
-{	nop 0 }
-1:	br.cloop.sptk.few 1b
-	;;
-	mov ar.lc=r2
-	br.ret.sptk.many rp
-END(ia64_delay_loop)
-
-#ifndef XEN
-/*
- * Return a CPU-local timestamp in nano-seconds.  This timestamp is
- * NOT synchronized across CPUs its return value must never be
- * compared against the values returned on another CPU.  The usage in
- * kernel/sched.c ensures that.
- *
- * The return-value of sched_clock() is NOT supposed to wrap-around.
- * If it did, it would cause some scheduling hiccups (at the worst).
- * Fortunately, with a 64-bit cycle-counter ticking at 100GHz, even
- * that would happen only once every 5+ years.
- *
- * The code below basically calculates:
- *
- *   (ia64_get_itc() * local_cpu_data->nsec_per_cyc) >> IA64_NSEC_PER_CYC_SHIFT
- *
- * except that the multiplication and the shift are done with 128-bit
- * intermediate precision so that we can produce a full 64-bit result.
- */
-GLOBAL_ENTRY(sched_clock)
-#ifdef XEN
-	movl r8=THIS_CPU(cpu_info) + IA64_CPUINFO_NSEC_PER_CYC_OFFSET
-#else
-	addl r8=THIS_CPU(cpu_info) + IA64_CPUINFO_NSEC_PER_CYC_OFFSET,r0
-#endif
-	mov.m r9=ar.itc		// fetch cycle-counter				(35 cyc)
-	;;
-	ldf8 f8=[r8]
-	;;
-	setf.sig f9=r9		// certain to stall, so issue it _after_ ldf8...
-	;;
-	xmpy.lu f10=f9,f8	// calculate low 64 bits of 128-bit product	(4 cyc)
-	xmpy.hu f11=f9,f8	// calculate high 64 bits of 128-bit product
-	;;
-	getf.sig r8=f10		//						(5 cyc)
-	getf.sig r9=f11
-	;;
-	shrp r8=r9,r8,IA64_NSEC_PER_CYC_SHIFT
-	br.ret.sptk.many rp
-END(sched_clock)
-
-GLOBAL_ENTRY(start_kernel_thread)
-	.prologue
-	.save rp, r0				// this is the end of the call-chain
-	.body
-	alloc r2 = ar.pfs, 0, 0, 2, 0
-	mov out0 = r9
-	mov out1 = r11;;
-	br.call.sptk.many rp = kernel_thread_helper;;
-	mov out0 = r8
-	br.call.sptk.many rp = sys_exit;;
-1:	br.sptk.few 1b				// not reached
-END(start_kernel_thread)
-#endif /* XEN */
-
-#ifdef CONFIG_IA64_BRL_EMU
-
-/*
- *  Assembly routines used by brl_emu.c to set preserved register state.
- */
-
-#define SET_REG(reg)				\
- GLOBAL_ENTRY(ia64_set_##reg);			\
-	alloc r16=ar.pfs,1,0,0,0;		\
-	mov reg=r32;				\
-	;;					\
-	br.ret.sptk.many rp;			\
- END(ia64_set_##reg)
-
-SET_REG(b1);
-SET_REG(b2);
-SET_REG(b3);
-SET_REG(b4);
-SET_REG(b5);
-
-#endif /* CONFIG_IA64_BRL_EMU */
-
-#ifdef CONFIG_SMP
-	/*
-	 * This routine handles spinlock contention.  It uses a non-standard calling
-	 * convention to avoid converting leaf routines into interior routines.  Because
-	 * of this special convention, there are several restrictions:
-	 *
-	 * - do not use gp relative variables, this code is called from the kernel
-	 *   and from modules, r1 is undefined.
-	 * - do not use stacked registers, the caller owns them.
-	 * - do not use the scratch stack space, the caller owns it.
-	 * - do not use any registers other than the ones listed below
-	 *
-	 * Inputs:
-	 *   ar.pfs - saved CFM of caller
-	 *   ar.ccv - 0 (and available for use)
-	 *   r27    - flags from spin_lock_irqsave or 0.  Must be preserved.
-	 *   r28    - available for use.
-	 *   r29    - available for use.
-	 *   r30    - available for use.
-	 *   r31    - address of lock, available for use.
-	 *   b6     - return address
-	 *   p14    - available for use.
-	 *   p15    - used to track flag status.
-	 *
-	 * If you patch this code to use more registers, do not forget to update
-	 * the clobber lists for spin_lock() in include/asm-ia64/spinlock.h.
-	 */
-
-#if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 3)
-
-GLOBAL_ENTRY(ia64_spinlock_contention_pre3_4)
-	.prologue
-	.save ar.pfs, r0	// this code effectively has a zero frame size
-	.save rp, r28
-	.body
-	nop 0
-	tbit.nz p15,p0=r27,IA64_PSR_I_BIT
-	.restore sp		// pop existing prologue after next insn
-	mov b6 = r28
-	.prologue
-	.save ar.pfs, r0
-	.altrp b6
-	.body
-	;;
-(p15)	ssm psr.i		// reenable interrupts if they were on
-				// DavidM says that srlz.d is slow and is not required in this case
-.wait:
-	// exponential backoff, kdb, lockmeter etc. go in here
-	hint @pause
-	ld4 r30=[r31]		// don't use ld4.bias; if it's contended, we won't write the word
-	nop 0
-	;;
-	cmp4.ne p14,p0=r30,r0
-(p14)	br.cond.sptk.few .wait
-(p15)	rsm psr.i		// disable interrupts if we reenabled them
-	br.cond.sptk.few b6	// lock is now free, try to acquire
-	.global ia64_spinlock_contention_pre3_4_end	// for kernprof
-ia64_spinlock_contention_pre3_4_end:
-END(ia64_spinlock_contention_pre3_4)
-
-#else
-
-GLOBAL_ENTRY(ia64_spinlock_contention)
-	.prologue
-	.altrp b6
-	.body
-	tbit.nz p15,p0=r27,IA64_PSR_I_BIT
-	;;
-.wait:
-(p15)	ssm psr.i		// reenable interrupts if they were on
-				// DavidM says that srlz.d is slow and is not required in this case
-.wait2:
-	// exponential backoff, kdb, lockmeter etc. go in here
-	hint @pause
-	ld4 r30=[r31]		// don't use ld4.bias; if it's contended, we won't write the word
-	;;
-	cmp4.ne p14,p0=r30,r0
-	mov r30 = 1
-(p14)	br.cond.sptk.few .wait2
-(p15)	rsm psr.i		// disable interrupts if we reenabled them
-	;;
-	cmpxchg4.acq r30=[r31], r30, ar.ccv
-	;;
-	cmp4.ne p14,p0=r0,r30
-(p14)	br.cond.sptk.few .wait
-
-	br.ret.sptk.many b6	// lock is now taken
-END(ia64_spinlock_contention)
-
-#endif
-
-#ifdef CONFIG_HOTPLUG_CPU
-GLOBAL_ENTRY(ia64_jump_to_sal)
-	alloc r16=ar.pfs,1,0,0,0;;
-	rsm psr.i  | psr.ic
-{
-	flushrs
-	srlz.i
-}
-	tpa r25=in0
-	movl r18=tlb_purge_done;;
-	DATA_VA_TO_PA(r18);;
-	mov b1=r18 	// Return location
-	movl r18=ia64_do_tlb_purge;;
-	DATA_VA_TO_PA(r18);;
-	mov b2=r18 	// doing tlb_flush work
-	mov ar.rsc=0  // Put RSE  in enforced lazy, LE mode
-	movl r17=1f;;
-	DATA_VA_TO_PA(r17);;
-	mov cr.iip=r17
-	movl r16=SAL_PSR_BITS_TO_SET;;
-	mov cr.ipsr=r16
-	mov cr.ifs=r0;;
-	rfi;;
-1:
-	/*
-	 * Invalidate all TLB data/inst
-	 */
-	br.sptk.many b2;; // jump to tlb purge code
-
-tlb_purge_done:
-	RESTORE_REGION_REGS(r25, r17,r18,r19);;
-	RESTORE_REG(b0, r25, r17);;
-	RESTORE_REG(b1, r25, r17);;
-	RESTORE_REG(b2, r25, r17);;
-	RESTORE_REG(b3, r25, r17);;
-	RESTORE_REG(b4, r25, r17);;
-	RESTORE_REG(b5, r25, r17);;
-	ld8 r1=[r25],0x08;;
-	ld8 r12=[r25],0x08;;
-	ld8 r13=[r25],0x08;;
-	RESTORE_REG(ar.fpsr, r25, r17);;
-	RESTORE_REG(ar.pfs, r25, r17);;
-	RESTORE_REG(ar.rnat, r25, r17);;
-	RESTORE_REG(ar.unat, r25, r17);;
-	RESTORE_REG(ar.bspstore, r25, r17);;
-	RESTORE_REG(cr.dcr, r25, r17);;
-	RESTORE_REG(cr.iva, r25, r17);;
-	RESTORE_REG(cr.pta, r25, r17);;
-#ifdef XEN
-	dv_serialize_instruction
-#endif
-	RESTORE_REG(cr.itv, r25, r17);;
-	RESTORE_REG(cr.pmv, r25, r17);;
-	RESTORE_REG(cr.cmcv, r25, r17);;
-	RESTORE_REG(cr.lrr0, r25, r17);;
-	RESTORE_REG(cr.lrr1, r25, r17);;
-	ld8 r4=[r25],0x08;;
-	ld8 r5=[r25],0x08;;
-	ld8 r6=[r25],0x08;;
-	ld8 r7=[r25],0x08;;
-	ld8 r17=[r25],0x08;;
-	mov pr=r17,-1;;
-	RESTORE_REG(ar.lc, r25, r17);;
-	/*
-	 * Now Restore floating point regs
-	 */
-	ldf.fill.nta f2=[r25],16;;
-	ldf.fill.nta f3=[r25],16;;
-	ldf.fill.nta f4=[r25],16;;
-	ldf.fill.nta f5=[r25],16;;
-	ldf.fill.nta f16=[r25],16;;
-	ldf.fill.nta f17=[r25],16;;
-	ldf.fill.nta f18=[r25],16;;
-	ldf.fill.nta f19=[r25],16;;
-	ldf.fill.nta f20=[r25],16;;
-	ldf.fill.nta f21=[r25],16;;
-	ldf.fill.nta f22=[r25],16;;
-	ldf.fill.nta f23=[r25],16;;
-	ldf.fill.nta f24=[r25],16;;
-	ldf.fill.nta f25=[r25],16;;
-	ldf.fill.nta f26=[r25],16;;
-	ldf.fill.nta f27=[r25],16;;
-	ldf.fill.nta f28=[r25],16;;
-	ldf.fill.nta f29=[r25],16;;
-	ldf.fill.nta f30=[r25],16;;
-	ldf.fill.nta f31=[r25],16;;
-
-	/*
-	 * Now that we have done all the register restores
-	 * we are now ready for the big DIVE to SAL Land
-	 */
-	ssm psr.ic;;
-	srlz.d;;
-	br.ret.sptk.many b0;;
-END(ia64_jump_to_sal)
-#endif /* CONFIG_HOTPLUG_CPU */
-
-#endif /* CONFIG_SMP */
diff -r 2386288b1bf1 -r 8aa1697d57e4 xen/arch/ia64/linux-xen/hpsim_ssc.h
--- a/xen/arch/ia64/linux-xen/hpsim_ssc.h	Mon Apr 02 18:14:31 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/*
- * Platform dependent support for HP simulator.
- *
- * Copyright (C) 1998, 1999 Hewlett-Packard Co
- * Copyright (C) 1998, 1999 David Mosberger-Tang <davidm@hpl.hp.com>
- * Copyright (C) 1999 Vijay Chander <vijay@engr.sgi.com>
- */
-#ifndef _IA64_PLATFORM_HPSIM_SSC_H
-#define _IA64_PLATFORM_HPSIM_SSC_H
-
-/* Simulator system calls: */
-
-#define SSC_CONSOLE_INIT		20
-#define SSC_GETCHAR			21
-#define SSC_PUTCHAR			31
-#define SSC_CONNECT_INTERRUPT		58
-#define SSC_GENERATE_INTERRUPT		59
-#define SSC_SET_PERIODIC_INTERRUPT	60
-#define SSC_GET_RTC			65
-#define SSC_EXIT			66
-#define SSC_LOAD_SYMBOLS		69
-#define SSC_GET_TOD			74
-#define SSC_CTL_TRACE			76
-
-#define SSC_NETDEV_PROBE		100
-#define SSC_NETDEV_SEND			101
-#define SSC_NETDEV_RECV			102
-#define SSC_NETDEV_ATTACH		103
-#define SSC_NETDEV_DETACH		104
-
-/*
- * Simulator system call.
- */
-extern long ia64_ssc (long arg0, long arg1, long arg2, long arg3, int nr);
-
-#ifdef XEN
-/* Note: These are declared in linux/arch/ia64/hp/sim/simscsi.c but belong
- * in linux/include/asm-ia64/hpsim_ssc.h, hence their addition here */
-#define SSC_OPEN			50
-#define SSC_CLOSE			51
-#define SSC_READ			52
-#define SSC_WRITE			53
-#define SSC_GET_COMPLETION		54
-#define SSC_WAIT_COMPLETION		55
-
-#define SSC_WRITE_ACCESS		2
-#define SSC_READ_ACCESS			1
-
-struct ssc_disk_req {
-	unsigned long addr;
-	unsigned long len;
-};
-#endif
-
-#endif /* _IA64_PLATFORM_HPSIM_SSC_H */
diff -r 2386288b1bf1 -r 8aa1697d57e4 xen/arch/ia64/linux-xen/iosapic.c
--- a/xen/arch/ia64/linux-xen/iosapic.c	Mon Apr 02 18:14:31 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1288 +0,0 @@
-/*
- * I/O SAPIC support.
- *
- * Copyright (C) 1999 Intel Corp.
- * Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com>
- * Copyright (C) 2000-2002 J.I. Lee <jung-ik.lee@intel.com>
- * Copyright (C) 1999-2000, 2002-2003 Hewlett-Packard Co.
- *	David Mosberger-Tang <davidm@hpl.hp.com>
- * Copyright (C) 1999 VA Linux Systems
- * Copyright (C) 1999,2000 Walt Drummond <drummond@valinux.com>
- *
- * 00/04/19	D. Mosberger	Rewritten to mirror more closely the x86 I/O APIC code.
- *				In particular, we now have separate handlers for edge
- *				and level triggered interrupts.
- * 00/10/27	Asit Mallick, Goutham Rao <goutham.rao@intel.com> IRQ vector allocation
- *				PCI to vector mapping, shared PCI interrupts.
- * 00/10/27	D. Mosberger	Document things a bit more to make them more understandable.
- *				Clean up much of the old IOSAPIC cruft.
- * 01/07/27	J.I. Lee	PCI irq routing, Platform/Legacy interrupts and fixes for
- *				ACPI S5(SoftOff) support.
- * 02/01/23	J.I. Lee	iosapic pgm fixes for PCI irq routing from _PRT
- * 02/01/07     E. Focht        <efocht@ess.nec.de> Redirectable interrupt vectors in
- *                              iosapic_set_affinity(), initializations for
- *                              /proc/irq/#/smp_affinity
- * 02/04/02	P. Diefenbaugh	Cleaned up ACPI PCI IRQ routing.
- * 02/04/18	J.I. Lee	bug fix in iosapic_init_pci_irq
- * 02/04/30	J.I. Lee	bug fix in find_iosapic to fix ACPI PCI IRQ to IOSAPIC mapping
- *				error
- * 02/07/29	T. Kochi	Allocate interrupt vectors dynamically
- * 02/08/04	T. Kochi	Cleaned up terminology (irq, global system interrupt, vector, etc.)
- * 02/09/20	D. Mosberger	Simplified by taking advantage of ACPI's pci_irq code.
- * 03/02/19	B. Helgaas	Make pcat_compat system-wide, not per-IOSAPIC.
- *				Remove iosapic_address & gsi_base from external interfaces.
- *				Rationalize __init/__devinit attributes.
- * 04/12/04 Ashok Raj	<ashok.raj@intel.com> Intel Corporation 2004
- *				Updated to work with irq migration necessary for CPU Hotplug
- */
-/*
- * Here is what the interrupt logic between a PCI device and the kernel looks like:
- *
- * (1) A PCI device raises one of the four interrupt pins (INTA, INTB, INTC, INTD).  The
- *     device is uniquely identified by its bus--, and slot-number (the function
- *     number does not matter here because all functions share the same interrupt
- *     lines).
- *
- * (2) The motherboard routes the interrupt line to a pin on a IOSAPIC controller.
- *     Multiple interrupt lines may have to share the same IOSAPIC pin (if they're level
- *     triggered and use the same polarity).  Each interrupt line has a unique Global
- *     System Interrupt (GSI) number which can be calculated as the sum of the controller's
- *     base GSI number and the IOSAPIC pin number to which the line connects.
- *
- * (3) The IOSAPIC uses an internal routing table entries (RTEs) to map the IOSAPIC pin
- *     into the IA-64 interrupt vector.  This interrupt vector is then sent to the CPU.
- *
- * (4) The kernel recognizes an interrupt as an IRQ.  The IRQ interface is used as
- *     architecture-independent interrupt handling mechanism in Linux.  As an
- *     IRQ is a number, we have to have IA-64 interrupt vector number <-> IRQ number
- *     mapping.  On smaller systems, we use one-to-one mapping between IA-64 vector and
- *     IRQ.  A platform can implement platform_irq_to_vector(irq) and
- *     platform_local_vector_to_irq(vector) APIs to differentiate the mapping.
- *     Please see also include/asm-ia64/hw_irq.h for those APIs.
- *
- * To sum up, there are three levels of mappings involved:
- *
- *	PCI pin -> global system interrupt (GSI) -> IA-64 vector <-> IRQ
- *
- * Note: The term "IRQ" is loosely used everywhere in Linux kernel to describe interrupts.
- * Now we use "IRQ" only for Linux IRQ's.  ISA IRQ (isa_irq) is the only exception in this
- * source code.
- */
-#include <linux/config.h>
-
-#include <linux/acpi.h>
-#include <linux/init.h>
-#include <linux/irq.h>
-#include <linux/kernel.h>
-#include <linux/list.h>
-#include <linux/pci.h>
-#ifdef XEN
-#include <xen/errno.h>
-#endif
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/string.h>
-#include <linux/bootmem.h>
-
-#include <asm/delay.h>
-#include <asm/hw_irq.h>
-#include <asm/io.h>
-#include <asm/iosapic.h>
-#include <asm/machvec.h>
-#include <asm/processor.h>
-#include <asm/ptrace.h>
-#include <asm/system.h>
-
-#ifdef XEN
-static inline int iosapic_irq_to_vector (int irq)
-{
-	return irq;
-}
-
-#undef irq_to_vector
-#define irq_to_vector(irq)      iosapic_irq_to_vector(irq)
-#define AUTO_ASSIGN	AUTO_ASSIGN_IRQ
-#endif
-
-#undef DEBUG_INTERRUPT_ROUTING
-
-#ifdef DEBUG_INTERRUPT_ROUTING
-#define DBG(fmt...)	printk(fmt)
-#else
-#define DBG(fmt...)
-#endif
-
-#define NR_PREALLOCATE_RTE_ENTRIES	(PAGE_SIZE / sizeof(struct iosapic_rte_info))
-#define RTE_PREALLOCATED	(1)
-
-static DEFINE_SPINLOCK(iosapic_lock);
-
-/* These tables map IA-64 vectors to the IOSAPIC pin that generates this vector. */
-
-struct iosapic_rte_info {
-	struct list_head rte_list;	/* node in list of RTEs sharing the same vector */
-	char __iomem	*addr;		/* base address of IOSAPIC */
-	unsigned int	gsi_base;	/* first GSI assigned to this IOSAPIC */
-	char		rte_index;	/* IOSAPIC RTE index */
-	int		refcnt;		/* reference counter */
-	unsigned int	flags;		/* flags */
-} ____cacheline_aligned;
-
-static struct iosapic_intr_info {
-	struct list_head rtes;		/* RTEs using this vector (empty => not an IOSAPIC interrupt) */
-	int		count;		/* # of RTEs that shares this vector */
-	u32		low32;		/* current value of low word of Redirection table entry */
-	unsigned int	dest;		/* destination CPU physical ID */
-	unsigned char	dmode	: 3;	/* delivery mode (see iosapic.h) */
-	unsigned char 	polarity: 1;	/* interrupt polarity (see iosapic.h) */
-	unsigned char	trigger	: 1;	/* trigger mode (see iosapic.h) */
-} iosapic_intr_info[IA64_NUM_VECTORS];
-
-#ifndef XEN
-static struct iosapic {
-	char __iomem	*addr;		/* base address of IOSAPIC */
-	unsigned int 	gsi_base;	/* first GSI assigned to this IOSAPIC */
-	unsigned short 	num_rte;	/* number of RTE in this IOSAPIC */
-	int		rtes_inuse;	/* # of RTEs in use on this IOSAPIC */
-#ifdef CONFIG_NUMA
-	unsigned short	node;		/* numa node association via pxm */
-#endif
-} iosapic_lists[NR_IOSAPICS];
-#else
-struct iosapic iosapic_lists[NR_IOSAPICS];
-#endif
-
-static unsigned char pcat_compat __devinitdata;	/* 8259 compatibility flag */
-
-static int iosapic_kmalloc_ok;
-static LIST_HEAD(free_rte_list);
-
-/*
- * Find an IOSAPIC associated with a GSI
- */
-static inline int
-find_iosapic (unsigned int gsi)
-{
-	int i;
-
-	for (i = 0; i < NR_IOSAPICS; i++) {
-		if ((unsigned) (gsi - iosapic_lists[i].gsi_base) < iosapic_lists[i].num_rte)
-			return i;
-	}
-
-	return -1;
-}
-
-static inline int
-_gsi_to_vector (unsigned int gsi)
-{
-	struct iosapic_intr_info *info;
-	struct iosapic_rte_info *rte;
-
-	for (info = iosapic_intr_info; info < iosapic_intr_info + IA64_NUM_VECTORS; ++info)
-		list_for_each_entry(rte, &info->rtes, rte_list)
-			if (rte->gsi_base + rte->rte_index == gsi)
-				return info - iosapic_intr_info;
-	return -1;
-}
-
-/*
- * Translate GSI number to the corresponding IA-64 interrupt vector.  If no
- * entry exists, return -1.
- */
-inline int
-gsi_to_vector (unsigned int gsi)
-{
-	return _gsi_to_vector(gsi);
-}
-
-int
-gsi_to_irq (unsigned int gsi)
-{
-	unsigned long flags;
-	int irq;
-	/*
-	 * XXX fix me: this assumes an identity mapping vetween IA-64 vector and Linux irq
-	 * numbers...
-	 */
-	spin_lock_irqsave(&iosapic_lock, flags);
-	{
-		irq = _gsi_to_vector(gsi);
-	}
-	spin_unlock_irqrestore(&iosapic_lock, flags);
-
-	return irq;
-}
-
-static struct iosapic_rte_info *gsi_vector_to_rte(unsigned int gsi, unsigned int vec)
-{
-	struct iosapic_rte_info *rte;
-
-	list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, rte_list)
-		if (rte->gsi_base + rte->rte_index == gsi)
-			return rte;
-	return NULL;
-}
-
-static void
-set_rte (unsigned int gsi, unsigned int vector, unsigned int dest, int mask)
-{
-	unsigned long pol, trigger, dmode;
-	u32 low32, high32;
-	char __iomem *addr;
-	int rte_index;
-	char redir;
-	struct iosapic_rte_info *rte;
-
-	DBG(KERN_DEBUG"IOSAPIC: routing vector %d to 0x%x\n", vector, dest);
-
-	rte = gsi_vector_to_rte(gsi, vector);
-	if (!rte)
-		return;		/* not an IOSAPIC interrupt */
-
-	rte_index = rte->rte_index;
-	addr	= rte->addr;
-	pol     = iosapic_intr_info[vector].polarity;
-	trigger = iosapic_intr_info[vector].trigger;
-	dmode   = iosapic_intr_info[vector].dmode;
-
-	redir = (dmode == IOSAPIC_LOWEST_PRIORITY) ? 1 : 0;
-
-#ifdef CONFIG_SMP
-	{
-		unsigned int irq;
-
-		for (irq = 0; irq < NR_IRQS; ++irq)
-			if (irq_to_vector(irq) == vector) {
-				set_irq_affinity_info(irq, (int)(dest & 0xffff), redir);
-				break;
-			}
-	}
-#endif
-
-	low32 = ((pol << IOSAPIC_POLARITY_SHIFT) |
-		 (trigger << IOSAPIC_TRIGGER_SHIFT) |
-		 (dmode << IOSAPIC_DELIVERY_SHIFT) |
-		 ((mask ? 1 : 0) << IOSAPIC_MASK_SHIFT) |
-		 vector);
-
-	/* dest contains both id and eid */
-	high32 = (dest << IOSAPIC_DEST_SHIFT);
-
-	iosapic_write(addr, IOSAPIC_RTE_HIGH(rte_index), high32);
-	iosapic_write(addr, IOSAPIC_RTE_LOW(rte_index), low32);
-	iosapic_intr_info[vector].low32 = low32;
-	iosapic_intr_info[vector].dest = dest;
-}
-
-void
-kexec_disable_iosapic(void)
-{
-        struct iosapic_intr_info *info;
-        struct iosapic_rte_info *rte;
-        u8 vec = 0;
-        for (info = iosapic_intr_info; info <
-                        iosapic_intr_info + IA64_NUM_VECTORS; ++info, ++vec) {
-                list_for_each_entry(rte, &info->rtes,
-                                rte_list) {
-                        iosapic_write(rte->addr,
-                                        IOSAPIC_RTE_LOW(rte->rte_index),
-                                        IOSAPIC_MASK|vec);
-                        iosapic_eoi(rte->addr, vec);
-                }
-        }
-}
-
-static void
-mask_irq (struct irq_desc *desc)
-{
-	unsigned long flags;
-	char __iomem *addr;
-	u32 low32;
-	int rte_index;
-	ia64_vector vec = irq_to_vector(desc->irq);
-	struct iosapic_rte_info *rte;
-
-	if (list_empty(&iosapic_intr_info[vec].rtes))
-		return;			/* not an IOSAPIC interrupt! */
-
-	spin_lock_irqsave(&iosapic_lock, flags);
-	{
-		/* set only the mask bit */
-		low32 = iosapic_intr_info[vec].low32 |= IOSAPIC_MASK;
-		list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, rte_list) {
-			addr = rte->addr;
-			rte_index = rte->rte_index;
-			iosapic_write(addr, IOSAPIC_RTE_LOW(rte_index), low32);
-		}
-	}
-	spin_unlock_irqrestore(&iosapic_lock, flags);
-}
-
-static void
-unmask_irq (struct irq_desc *desc)
-{
-	unsigned long flags;
-	char __iomem *addr;
-	u32 low32;
-	int rte_index;
-	ia64_vector vec = irq_to_vector(desc->irq);
-	struct iosapic_rte_info *rte;
-
-	if (list_empty(&iosapic_intr_info[vec].rtes))
-		return;			/* not an IOSAPIC interrupt! */
-
-	spin_lock_irqsave(&iosapic_lock, flags);
-	{
-		low32 = iosapic_intr_info[vec].low32 &= ~IOSAPIC_MASK;
-		list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, rte_list) {
-			addr = rte->addr;
-			rte_index = rte->rte_index;
-			iosapic_write(addr, IOSAPIC_RTE_LOW(rte_index), low32);
-		}
-	}
-	spin_unlock_irqrestore(&iosapic_lock, flags);
-}
-
-
-static void
-iosapic_set_affinity (struct irq_desc *desc, const cpumask_t *mask)
-{
-#ifdef CONFIG_SMP
-	unsigned long flags;
-	u32 high32, low32;
-	int dest, rte_index;
-	char __iomem *addr;
-	int redir = (desc->irq & IA64_IRQ_REDIRECTED) ? 1 : 0;
-	unsigned int irq = desc->irq & ~IA64_IRQ_REDIRECTED;
-	ia64_vector vec;
-	struct iosapic_rte_info *rte;
-
-	vec = irq_to_vector(irq);
-
-	if (cpumask_empty(mask))
-		return;
-
-	dest = cpu_physical_id(cpumask_first(mask));
-
-	if (list_empty(&iosapic_intr_info[vec].rtes))
-		return;			/* not an IOSAPIC interrupt */
-
-	set_irq_affinity_info(irq, dest, redir);
-
-	/* dest contains both id and eid */
-	high32 = dest << IOSAPIC_DEST_SHIFT;
-
-	spin_lock_irqsave(&iosapic_lock, flags);
-	{
-		low32 = iosapic_intr_info[vec].low32 & ~(7 << IOSAPIC_DELIVERY_SHIFT);
-
-		if (redir)
-		        /* change delivery mode to lowest priority */
-			low32 |= (IOSAPIC_LOWEST_PRIORITY << IOSAPIC_DELIVERY_SHIFT);
-		else
-		        /* change delivery mode to fixed */
-			low32 |= (IOSAPIC_FIXED << IOSAPIC_DELIVERY_SHIFT);
-
-		iosapic_intr_info[vec].low32 = low32;
-		iosapic_intr_info[vec].dest = dest;
-		list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, rte_list) {
-			addr = rte->addr;
-			rte_index = rte->rte_index;
-			iosapic_write(addr, IOSAPIC_RTE_HIGH(rte_index), high32);
-			iosapic_write(addr, IOSAPIC_RTE_LOW(rte_index), low32);
-		}
-	}
-	spin_unlock_irqrestore(&iosapic_lock, flags);
-#endif
-}
-
-/*
- * Handlers for level-triggered interrupts.
- */
-
-static unsigned int
-iosapic_startup_level_irq (struct irq_desc *desc)
-{
-	unmask_irq(desc);
-	return 0;
-}
-
-static void
-iosapic_end_level_irq (struct irq_desc *desc)
-{
-	ia64_vector vec = irq_to_vector(desc->irq);
-	struct iosapic_rte_info *rte;
-
-	move_irq(desc->irq);
-	list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, rte_list)
-		iosapic_eoi(rte->addr, vec);
-}
-
-#define iosapic_shutdown_level_irq	mask_irq
-#define iosapic_enable_level_irq	unmask_irq
-#define iosapic_disable_level_irq	mask_irq
-#define iosapic_ack_level_irq		irq_actor_none
-
-static hw_irq_controller irq_type_iosapic_level = {
-	.typename =	"IO-SAPIC-level",
-	.startup =	iosapic_startup_level_irq,
-	.shutdown =	iosapic_shutdown_level_irq,
-	.enable =	iosapic_enable_level_irq,
-	.disable =	iosapic_disable_level_irq,
-	.ack =		iosapic_ack_level_irq,
-	.end =		iosapic_end_level_irq,
-	.set_affinity =	iosapic_set_affinity
-};
-
-/*
- * Handlers for edge-triggered interrupts.
- */
-
-static unsigned int
-iosapic_startup_edge_irq (struct irq_desc *desc)
-{
-	unmask_irq(desc);
-	/*
-	 * IOSAPIC simply drops interrupts pended while the
-	 * corresponding pin was masked, so we can't know if an
-	 * interrupt is pending already.  Let's hope not...
-	 */
-	return 0;
-}
-
-static void
-iosapic_ack_edge_irq (struct irq_desc *desc)
-{
-	move_irq(idesc->irq);
-	/*
-	 * Once we have recorded IRQ_PENDING already, we can mask the
-	 * interrupt for real. This prevents IRQ storms from unhandled
-	 * devices.
-	 */
-	if ((desc->status & (IRQ_PENDING|IRQ_DISABLED)) == (IRQ_PENDING|IRQ_DISABLED))
-		mask_irq(desc);
-}
-
-#define iosapic_enable_edge_irq		unmask_irq
-#define iosapic_disable_edge_irq	irq_disable_none
-#define iosapic_end_edge_irq		irq_actor_none
-
-static hw_irq_controller irq_type_iosapic_edge = {
-	.typename =	"IO-SAPIC-edge",
-	.startup =	iosapic_startup_edge_irq,
-	.shutdown =	iosapic_disable_edge_irq,
-	.enable =	iosapic_enable_edge_irq,
-	.disable =	iosapic_disable_edge_irq,
-	.ack =		iosapic_ack_edge_irq,
-	.end =		iosapic_end_edge_irq,
-	.set_affinity =	iosapic_set_affinity
-};
-
-unsigned int
-iosapic_version (char __iomem *addr)
-{
-	/*
-	 * IOSAPIC Version Register return 32 bit structure like:
-	 * {
-	 *	unsigned int version   : 8;
-	 *	unsigned int reserved1 : 8;
-	 *	unsigned int max_redir : 8;
-	 *	unsigned int reserved2 : 8;
-	 * }
-	 */
-	return iosapic_read(addr, IOSAPIC_VERSION);
-}
-
-static int iosapic_find_sharable_vector (unsigned long trigger, unsigned long pol)
-{
-	int i, vector = -1, min_count = -1;
-	struct iosapic_intr_info *info;
-
-	/*
-	 * shared vectors for edge-triggered interrupts are not
-	 * supported yet
-	 */
-	if (trigger == IOSAPIC_EDGE)
-		return -1;
-
-	for (i = IA64_FIRST_DEVICE_VECTOR; i <= IA64_LAST_DEVICE_VECTOR; i++) {
-		info = &iosapic_intr_info[i];
-		if (info->trigger == trigger && info->polarity == pol &&
-		    (info->dmode == IOSAPIC_FIXED || info->dmode == IOSAPIC_LOWEST_PRIORITY)) {
-			if (min_count == -1 || info->count < min_count) {
-				vector = i;
-				min_count = info->count;
-			}
-		}
-	}
-
-	return vector;
-}
-
-/*
- * if the given vector is already owned by other,
- *  assign a new vector for the other and make the vector available
- */
-static void __init
-iosapic_reassign_vector (int vector)
-{
-	int new_vector;
-
-	if (!list_empty(&iosapic_intr_info[vector].rtes)) {
-		new_vector = assign_irq_vector(AUTO_ASSIGN);
-		if (new_vector < 0)
-			panic("%s: out of interrupt vectors!\n", __FUNCTION__);
-		printk(KERN_INFO "Reassigning vector %d to %d\n", vector, new_vector);
-		memcpy(&iosapic_intr_info[new_vector], &iosapic_intr_info[vector],
-		       sizeof(struct iosapic_intr_info));
-		INIT_LIST_HEAD(&iosapic_intr_info[new_vector].rtes);
-		list_move(iosapic_intr_info[vector].rtes.next, &iosapic_intr_info[new_vector].rtes);
-		memset(&iosapic_intr_info[vector], 0, sizeof(struct iosapic_intr_info));
-		iosapic_intr_info[vector].low32 = IOSAPIC_MASK;
-		INIT_LIST_HEAD(&iosapic_intr_info[vector].rtes);
-	}
-}
-
-static struct iosapic_rte_info *iosapic_alloc_rte (void)
-{
-	int i;
-	struct iosapic_rte_info *rte;
-	int preallocated = 0;
-
-	if (!iosapic_kmalloc_ok && list_empty(&free_rte_list)) {
-#ifdef XEN
-		rte = xmalloc_bytes(sizeof(struct iosapic_rte_info) * NR_PREALLOCATE_RTE_ENTRIES);
-#else
-		rte = alloc_bootmem(sizeof(struct iosapic_rte_info) * NR_PREALLOCATE_RTE_ENTRIES);
-#endif
-		if (!rte)
-			return NULL;
-		for (i = 0; i < NR_PREALLOCATE_RTE_ENTRIES; i++, rte++)
-			list_add(&rte->rte_list, &free_rte_list);
-	}
-
-	if (!list_empty(&free_rte_list)) {
-		rte = list_entry(free_rte_list.next, struct iosapic_rte_info, rte_list);
-		list_del(&rte->rte_list);
-		preallocated++;
-	} else {
-		rte = kmalloc(sizeof(struct iosapic_rte_info), GFP_ATOMIC);
-		if (!rte)
-			return NULL;
-	}
-
-	memset(rte, 0, sizeof(struct iosapic_rte_info));
-	if (preallocated)
-		rte->flags |= RTE_PREALLOCATED;
-
-	return rte;
-}
-
-static void iosapic_free_rte (struct iosapic_rte_info *rte)
-{
-	if (rte->flags & RTE_PREALLOCATED)
-		list_add_tail(&rte->rte_list, &free_rte_list);
-	else
-		kfree(rte);
-}
-
-static inline int vector_is_shared (int vector)
-{
-	return (iosapic_intr_info[vector].count > 1);
-}
-
-static int
-register_intr (unsigned int gsi, int vector, unsigned char delivery,
-	       unsigned long polarity, unsigned long trigger)
-{
-	irq_desc_t *idesc;
-	hw_irq_controller *irq_type;
-	int rte_index;
-	int index;
-	unsigned long gsi_base;
-	void __iomem *iosapic_address;
-	struct iosapic_rte_info *rte;
-
-	index = find_iosapic(gsi);
-	if (index < 0) {
-		printk(KERN_WARNING "%s: No IOSAPIC for GSI %u\n", __FUNCTION__, gsi);
-		return -ENODEV;
-	}
-
-	iosapic_address = iosapic_lists[index].addr;
-	gsi_base = iosapic_lists[index].gsi_base;
-
-	rte = gsi_vector_to_rte(gsi, vector);
-	if (!rte) {
-		rte = iosapic_alloc_rte();
-		if (!rte) {
-			printk(KERN_WARNING "%s: cannot allocate memory\n", __FUNCTION__);
-			return -ENOMEM;
-		}
-
-		rte_index = gsi - gsi_base;
-		rte->rte_index	= rte_index;
-		rte->addr	= iosapic_address;
-		rte->gsi_base	= gsi_base;
-		rte->refcnt++;
-		list_add_tail(&rte->rte_list, &iosapic_intr_info[vector].rtes);
-		iosapic_intr_info[vector].count++;
-		iosapic_lists[index].rtes_inuse++;
-	}
-	else if (vector_is_shared(vector)) {
-		struct iosapic_intr_info *info = &iosapic_intr_info[vector];
-		if (info->trigger != trigger || info->polarity != polarity) {
-			printk (KERN_WARNING "%s: cannot override the interrupt\n", __FUNCTION__);
-			return -EINVAL;
-		}
-	}
-
-	iosapic_intr_info[vector].polarity = polarity;
-	iosapic_intr_info[vector].dmode    = delivery;
-	iosapic_intr_info[vector].trigger  = trigger;
-
-	if (trigger == IOSAPIC_EDGE)
-		irq_type = &irq_type_iosapic_edge;
-	else
-		irq_type = &irq_type_iosapic_level;
-
-	idesc = irq_descp(vector);
-	if (idesc->handler != irq_type) {
-		if (idesc->handler != &no_irq_type)
-			printk(KERN_WARNING "%s: changing vector %d from %s to %s\n",
-			       __FUNCTION__, vector, idesc->handler->typename, irq_type->typename);
-		idesc->handler = irq_type;
-	}
-	return 0;
-}
-
-static unsigned int
-get_target_cpu (unsigned int gsi, int vector)
-{
-#ifdef CONFIG_SMP
-	static int cpu = -1;
-
-	/*
-	 * In case of vector shared by multiple RTEs, all RTEs that
-	 * share the vector need to use the same destination CPU.
-	 */
-	if (!list_empty(&iosapic_intr_info[vector].rtes))
-		return iosapic_intr_info[vector].dest;
-
-	/*
-	 * If the platform supports redirection via XTP, let it
-	 * distribute interrupts.
-	 */
-	if (smp_int_redirect & SMP_IRQ_REDIRECTION)
-		return cpu_physical_id(smp_processor_id());
-
-	/*
-	 * Some interrupts (ACPI SCI, for instance) are registered
-	 * before the BSP is marked as online.
-	 */
-	if (!cpu_online(smp_processor_id()))
-		return cpu_physical_id(smp_processor_id());
-
-#ifdef CONFIG_NUMA
-	{
-		int num_cpus, cpu_index, iosapic_index, numa_cpu, i = 0;
-		cpumask_t cpu_mask;
-
-		iosapic_index = find_iosapic(gsi);
-		if (iosapic_index < 0 ||
-		    iosapic_lists[iosapic_index].node == MAX_NUMNODES)
-			goto skip_numa_setup;
-
-		cpu_mask = node_to_cpumask(iosapic_lists[iosapic_index].node);
-
-		for_each_cpu(numa_cpu, &cpu_mask) {
-			if (!cpu_online(numa_cpu))
-				cpumask_clear_cpu(numa_cpu, &cpu_mask);
-		}
-
-		num_cpus = cpumask_weight(&cpu_mask);
-
-		if (!num_cpus)
-			goto skip_numa_setup;
-
-		/* Use vector assigment to distribute across cpus in node */
-		cpu_index = vector % num_cpus;
-
-		for (numa_cpu = cpumask_first(&cpu_mask) ; i < cpu_index ; i++)
-			numa_cpu = cpumask_next(numa_cpu, &cpu_mask);
-
-		if (numa_cpu != NR_CPUS)
-			return cpu_physical_id(numa_cpu);
-	}
-skip_numa_setup:
-#endif
-	/*
-	 * Otherwise, round-robin interrupt vectors across all the
-	 * processors.  (It'd be nice if we could be smarter in the
-	 * case of NUMA.)
-	 */
-	do {
-		if (++cpu >= NR_CPUS)
-			cpu = 0;
-	} while (!cpu_online(cpu));
-
-	return cpu_physical_id(cpu);
-#else
-	return cpu_physical_id(smp_processor_id());
-#endif
-}
-
-/*
- * ACPI can describe IOSAPIC interrupts via static tables and namespace
- * methods.  This provides an interface to register those interrupts and
- * program the IOSAPIC RTE.
- */
-int
-iosapic_register_intr (unsigned int gsi,
-		       unsigned long polarity, unsigned long trigger)
-{
-	int vector, mask = 1, err;
-	unsigned int dest;
-	unsigned long flags;
-	struct iosapic_rte_info *rte;
-	u32 low32;
-again:
-	/*
-	 * If this GSI has already been registered (i.e., it's a
-	 * shared interrupt, or we lost a race to register it),
-	 * don't touch the RTE.
-	 */
-	spin_lock_irqsave(&iosapic_lock, flags);
-	{
-		vector = gsi_to_vector(gsi);
-		if (vector > 0) {
-			rte = gsi_vector_to_rte(gsi, vector);
-			rte->refcnt++;
-			spin_unlock_irqrestore(&iosapic_lock, flags);
-			return vector;
-		}
-	}
-	spin_unlock_irqrestore(&iosapic_lock, flags);
-
-	/* If vector is running out, we try to find a sharable vector */
-	vector = assign_irq_vector(AUTO_ASSIGN);
-	if (vector < 0) {
-		vector = iosapic_find_sharable_vector(trigger, polarity);
-  		if (vector < 0)
-			return -ENOSPC;
-	}
-
-	spin_lock_irqsave(&irq_descp(vector)->lock, flags);
-	spin_lock(&iosapic_lock);
-	{
-		if (gsi_to_vector(gsi) > 0) {
-			if (list_empty(&iosapic_intr_info[vector].rtes))
-				free_irq_vector(vector);
-			spin_unlock(&iosapic_lock);
-			spin_unlock_irqrestore(&irq_descp(vector)->lock, flags);
-			goto again;
-		}
-
-		dest = get_target_cpu(gsi, vector);
-		err = register_intr(gsi, vector, IOSAPIC_LOWEST_PRIORITY,
-			      polarity, trigger);
-		if (err < 0) {
-			spin_unlock(&iosapic_lock);
-			spin_unlock_irqrestore(&irq_descp(vector)->lock, flags);
-			return err;
-		}
-
-		/*
-		 * If the vector is shared and already unmasked for
-		 * other interrupt sources, don't mask it.
-		 */
-		low32 = iosapic_intr_info[vector].low32;
-		if (vector_is_shared(vector) && !(low32 & IOSAPIC_MASK))
-			mask = 0;
-		set_rte(gsi, vector, dest, mask);
-	}
-	spin_unlock(&iosapic_lock);
-	spin_unlock_irqrestore(&irq_descp(vector)->lock, flags);
-
-	printk(KERN_INFO "GSI %u (%s, %s) -> CPU %d (0x%04x) vector %d\n",
-	       gsi, (trigger == IOSAPIC_EDGE ? "edge" : "level"),
-	       (polarity == IOSAPIC_POL_HIGH ? "high" : "low"),
-	       cpu_logical_id(dest), dest, vector);
-
-	return vector;
-}
-
-void
-iosapic_unregister_intr (unsigned int gsi)
-{
-	unsigned long flags;
-	int irq, vector, index;
-	irq_desc_t *idesc;
-	u32 low32;
-	unsigned long trigger, polarity;
-	unsigned int dest;
-	struct iosapic_rte_info *rte;
-
-	/*
-	 * If the irq associated with the gsi is not found,
-	 * iosapic_unregister_intr() is unbalanced. We need to check
-	 * this again after getting locks.
-	 */
-	irq = gsi_to_irq(gsi);
-	if (irq < 0) {
-		printk(KERN_ERR "iosapic_unregister_intr(%u) unbalanced\n", gsi);
-		WARN_ON(1);
-		return;
-	}
-	vector = irq_to_vector(irq);
-
-	idesc = irq_descp(irq);
-	spin_lock_irqsave(&idesc->lock, flags);
-	spin_lock(&iosapic_lock);
-	{
-		if ((rte = gsi_vector_to_rte(gsi, vector)) == NULL) {
-			printk(KERN_ERR "iosapic_unregister_intr(%u) unbalanced\n", gsi);
-			WARN_ON(1);
-			goto out;
-		}
-
-		if (--rte->refcnt > 0)
-			goto out;
-
-		/* Mask the interrupt */
-		low32 = iosapic_intr_info[vector].low32 | IOSAPIC_MASK;
-		iosapic_write(rte->addr, IOSAPIC_RTE_LOW(rte->rte_index), low32);
-
-		/* Remove the rte entry from the list */
-		list_del(&rte->rte_list);
-		iosapic_intr_info[vector].count--;
-		iosapic_free_rte(rte);
-		index = find_iosapic(gsi);
-		iosapic_lists[index].rtes_inuse--;
-		WARN_ON(iosapic_lists[index].rtes_inuse < 0);
-
-		trigger	 = iosapic_intr_info[vector].trigger;
-		polarity = iosapic_intr_info[vector].polarity;
-		dest     = iosapic_intr_info[vector].dest;
-		printk(KERN_INFO "GSI %u (%s, %s) -> CPU %d (0x%04x) vector %d unregistered\n",
-		       gsi, (trigger == IOSAPIC_EDGE ? "edge" : "level"),
-		       (polarity == IOSAPIC_POL_HIGH ? "high" : "low"),
-		       cpu_logical_id(dest), dest, vector);
-
-		if (list_empty(&iosapic_intr_info[vector].rtes)) {
-			/* Sanity check */
-			BUG_ON(iosapic_intr_info[vector].count);
-
-			/* Clear the interrupt controller descriptor */
-			idesc->handler = &no_irq_type;
-
-			/* Clear the interrupt information */
-			memset(&iosapic_intr_info[vector], 0, sizeof(struct iosapic_intr_info));
-			iosapic_intr_info[vector].low32 |= IOSAPIC_MASK;
-			INIT_LIST_HEAD(&iosapic_intr_info[vector].rtes);
-
-			if (idesc->action) {
-				printk(KERN_ERR "interrupt handlers still exist on IRQ %u\n", irq);
-				WARN_ON(1);
-			}
-
-			/* Free the interrupt vector */
-			free_irq_vector(vector);
-		}
-	}
- out:
-	spin_unlock(&iosapic_lock);
-	spin_unlock_irqrestore(&idesc->lock, flags);
-}
-
-/*
- * ACPI calls this when it finds an entry for a platform interrupt.
- * Note that the irq_base and IOSAPIC address must be set in iosapic_init().
- */
-int __init
-iosapic_register_platform_intr (u32 int_type, unsigned int gsi,
-				int iosapic_vector, u16 eid, u16 id,
-				unsigned long polarity, unsigned long trigger)
-{
-	static const char * const name[] = {"unknown", "PMI", "INIT", "CPEI"};
-	unsigned char delivery;
-	int vector, mask = 0;
-	unsigned int dest = ((id << 8) | eid) & 0xffff;
-
-	switch (int_type) {
-	      case ACPI_INTERRUPT_PMI:
-		vector = iosapic_vector;
-		/*
-		 * since PMI vector is alloc'd by FW(ACPI) not by kernel,
-		 * we need to make sure the vector is available
-		 */
-		iosapic_reassign_vector(vector);
-		delivery = IOSAPIC_PMI;
-		break;
-	      case ACPI_INTERRUPT_INIT:
-		vector = assign_irq_vector(AUTO_ASSIGN);
-		if (vector < 0)
-			panic("%s: out of interrupt vectors!\n", __FUNCTION__);
-		delivery = IOSAPIC_INIT;
-		break;
-	      case ACPI_INTERRUPT_CPEI:
-		vector = IA64_CPE_VECTOR;
-		delivery = IOSAPIC_LOWEST_PRIORITY;
-		mask = 1;
-		break;
-	      default:
-		printk(KERN_ERR "iosapic_register_platform_irq(): invalid int type 0x%x\n", int_type);
-		return -1;
-	}
-
-	register_intr(gsi, vector, delivery, polarity, trigger);
-
-	printk(KERN_INFO "PLATFORM int %s (0x%x): GSI %u (%s, %s) -> CPU %d (0x%04x) vector %d\n",
-	       int_type < ARRAY_SIZE(name) ? name[int_type] : "unknown",
-	       int_type, gsi, (trigger == IOSAPIC_EDGE ? "edge" : "level"),
-	       (polarity == IOSAPIC_POL_HIGH ? "high" : "low"),
-	       cpu_logical_id(dest), dest, vector);
-
-	set_rte(gsi, vector, dest, mask);
-	return vector;
-}
-
-
-/*
- * ACPI calls this when it finds an entry for a legacy ISA IRQ override.
- * Note that the gsi_base and IOSAPIC address must be set in iosapic_init().
- */
-void __init
-iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi,
-			  unsigned long polarity,
-			  unsigned long trigger)
-{
-	int vector;
-	unsigned int dest = cpu_physical_id(smp_processor_id());
-
-	vector = isa_irq_to_vector(isa_irq);
-
-	register_intr(gsi, vector, IOSAPIC_LOWEST_PRIORITY, polarity, trigger);
-
-	DBG("ISA: IRQ %u -> GSI %u (%s,%s) -> CPU %d (0x%04x) vector %d\n",
-	    isa_irq, gsi, trigger == IOSAPIC_EDGE ? "edge" : "level",
-	    polarity == IOSAPIC_POL_HIGH ? "high" : "low",
-	    cpu_logical_id(dest), dest, vector);
-
-	set_rte(gsi, vector, dest, 1);
-}
-
-void __init
-iosapic_system_init (int system_pcat_compat)
-{
-	int vector;
-
-	for (vector = 0; vector < IA64_NUM_VECTORS; ++vector) {
-		iosapic_intr_info[vector].low32 = IOSAPIC_MASK;
-		INIT_LIST_HEAD(&iosapic_intr_info[vector].rtes);	/* mark as unused */
-	}
-
-	pcat_compat = system_pcat_compat;
-	if (pcat_compat) {
-		/*
-		 * Disable the compatibility mode interrupts (8259 style), needs IN/OUT support
-		 * enabled.
-		 */
-		printk(KERN_INFO "%s: Disabling PC-AT compatible 8259 interrupts\n", __FUNCTION__);
-		outb(0xff, 0xA1);
-		outb(0xff, 0x21);
-	}
-}
-
-static inline int
-iosapic_alloc (void)
-{
-	int index;
-
-	for (index = 0; index < NR_IOSAPICS; index++)
-		if (!iosapic_lists[index].addr)
-			return index;
-
-	printk(KERN_WARNING "%s: failed to allocate iosapic\n", __FUNCTION__);
-	return -1;
-}
-
-static inline void
-iosapic_free (int index)
-{
-	memset(&iosapic_lists[index], 0, sizeof(iosapic_lists[0]));
-}
-
-static inline int
-iosapic_check_gsi_range (unsigned int gsi_base, unsigned int ver)
-{
-	int index;
-	unsigned int gsi_end, base, end;
-
-	/* check gsi range */
-	gsi_end = gsi_base + ((ver >> 16) & 0xff);
-	for (index = 0; index < NR_IOSAPICS; index++) {
-		if (!iosapic_lists[index].addr)
-			continue;
-
-		base = iosapic_lists[index].gsi_base;
-		end  = base + iosapic_lists[index].num_rte - 1;
-
-		if (gsi_base < base && gsi_end < base)
-			continue;/* OK */
-
-		if (gsi_base > end && gsi_end > end)
-			continue; /* OK */
-
-		return -EBUSY;
-	}
-	return 0;
-}
-
-int __devinit
-#ifndef XEN
-iosapic_init (unsigned long phys_addr, unsigned int gsi_base)
-#else	
-iosapic_init (unsigned long phys_addr, unsigned int gsi_base, unsigned int id)
-#endif
-{
-	int num_rte, err, index;
-	unsigned int isa_irq, ver;
-	char __iomem *addr;
-	unsigned long flags;
-
-	spin_lock_irqsave(&iosapic_lock, flags);
-	{
-		addr = ioremap(phys_addr, 0);
-		ver = iosapic_version(addr);
-
-		if ((err = iosapic_check_gsi_range(gsi_base, ver))) {
-			iounmap(addr);
-			spin_unlock_irqrestore(&iosapic_lock, flags);
-			return err;
-		}
-
-		/*
-		 * The MAX_REDIR register holds the highest input pin
-		 * number (starting from 0).
-		 * We add 1 so that we can use it for number of pins (= RTEs)
-		 */
-		num_rte = ((ver >> 16) & 0xff) + 1;
-
-		index = iosapic_alloc();
-		iosapic_lists[index].addr = addr;
-		iosapic_lists[index].gsi_base = gsi_base;
-		iosapic_lists[index].num_rte = num_rte;
-#ifdef XEN
-		iosapic_lists[index].id = id;
-#endif
-#ifdef CONFIG_NUMA
-		iosapic_lists[index].node = MAX_NUMNODES;
-#endif
-	}
-	spin_unlock_irqrestore(&iosapic_lock, flags);
-
-	if ((gsi_base == 0) && pcat_compat) {
-		/*
-		 * Map the legacy ISA devices into the IOSAPIC data.  Some of these may
-		 * get reprogrammed later on with data from the ACPI Interrupt Source
-		 * Override table.
-		 */
-		for (isa_irq = 0; isa_irq < 16; ++isa_irq)
-			iosapic_override_isa_irq(isa_irq, isa_irq, IOSAPIC_POL_HIGH, IOSAPIC_EDGE);
-	}
-	return 0;
-}
-
-#ifdef CONFIG_HOTPLUG
-int
-iosapic_remove (unsigned int gsi_base)
-{
-	int index, err = 0;
-	unsigned long flags;
-
-	spin_lock_irqsave(&iosapic_lock, flags);
-	{
-		index = find_iosapic(gsi_base);
-		if (index < 0) {
-			printk(KERN_WARNING "%s: No IOSAPIC for GSI base %u\n",
-			       __FUNCTION__, gsi_base);
-			goto out;
-		}
-
-		if (iosapic_lists[index].rtes_inuse) {
-			err = -EBUSY;
-			printk(KERN_WARNING "%s: IOSAPIC for GSI base %u is busy\n",
-			       __FUNCTION__, gsi_base);
-			goto out;
-		}
-
-		iounmap(iosapic_lists[index].addr);
-		iosapic_free(index);
-	}
- out:
-	spin_unlock_irqrestore(&iosapic_lock, flags);
-	return err;
-}
-#endif /* CONFIG_HOTPLUG */
-
-#ifdef CONFIG_NUMA
-void __devinit
-map_iosapic_to_node(unsigned int gsi_base, int node)
-{
-	int index;
-
-	index = find_iosapic(gsi_base);
-	if (index < 0) {
-		printk(KERN_WARNING "%s: No IOSAPIC for GSI %u\n",
-		       __FUNCTION__, gsi_base);
-		return;
-	}
-	iosapic_lists[index].node = node;
-	return;
-}
-#endif
-
-#ifndef XEN
-static int __init iosapic_enable_kmalloc (void)
-{
-	iosapic_kmalloc_ok = 1;
-	return 0;
-}
-core_initcall (iosapic_enable_kmalloc);
-#endif
-
-#ifdef XEN
-/* nop for now */
-void set_irq_affinity_info(unsigned int irq, int hwid, int redir) {}
-
-static int iosapic_physbase_to_id(unsigned long physbase)
-{
-	int i;
-	unsigned long addr = physbase | __IA64_UNCACHED_OFFSET;
-
-	for (i = 0; i < NR_IOSAPICS; i++) {
-	    if ((unsigned long)(iosapic_lists[i].addr) == addr)
-		return i;
-	}
-
-	return -1;
-}
-
-int iosapic_guest_read(unsigned long physbase, unsigned int reg, u32 *pval)
-{
-	int id;
-	unsigned long flags;
-
-	if ((id = (iosapic_physbase_to_id(physbase))) < 0)
-	    return id;
-
-	spin_lock_irqsave(&iosapic_lock, flags);
-	*pval = iosapic_read(iosapic_lists[id].addr, reg);
-	spin_unlock_irqrestore(&iosapic_lock, flags);
-
-	return 0;
-}
-
-int iosapic_guest_write(unsigned long physbase, unsigned int reg, u32 val)
-{
-	unsigned int id, gsi, vec, xen_vec, dest, high32;
-	char rte_index;
-	struct iosapic *ios;
-	struct iosapic_intr_info *info;
-	struct rte_entry rte;
-	unsigned long flags;
-
-	if ((id = (iosapic_physbase_to_id(physbase))) < 0)
-	    return -EINVAL;
-	ios = &iosapic_lists[id];
-
-	/* Only handle first half of RTE update */
-	if ((reg < 0x10) || (reg & 1))
-	    return 0;
-
-	rte.val = val;
-	rte_index = IOSAPIC_RTEINDEX(reg);
-	vec = rte.lo.vector;
-#if 0
-	/* Take PMI/NMI/INIT/EXTINT handled by xen */ 
-	if (rte.delivery_mode > IOSAPIC_LOWEST_PRIORITY) {
-	    printk("Attempt to write IOSAPIC dest mode owned by xen!\n");
-	    printk("IOSAPIC/PIN = (%d/%d), lo = 0x%x\n",
-		id, rte_index, val);
-	    return -EINVAL;
-	}
-#endif
-
-	/* Sanity check. Vector should be allocated before this update */
-	if ((rte_index > ios->num_rte) ||
-	    ((vec > IA64_FIRST_DEVICE_VECTOR) &&
-	     (vec < IA64_LAST_DEVICE_VECTOR) &&
-	     (!test_bit(vec - IA64_FIRST_DEVICE_VECTOR, ia64_vector_mask))))
-	    return -EINVAL;
-
-	gsi = ios->gsi_base + rte_index;
-	xen_vec = gsi_to_vector(gsi);
-	if (xen_vec >= 0 && test_bit(xen_vec, ia64_xen_vector)) {
-		printk("WARN: GSI %d in use by Xen.\n", gsi);
-		return -EINVAL;
-	}
-	info = &iosapic_intr_info[vec];
-	spin_lock_irqsave(&irq_descp(vec)->lock, flags);
-	spin_lock(&iosapic_lock);
-	if (!gsi_vector_to_rte(gsi, vec)) {
-	    register_intr(gsi, vec, IOSAPIC_LOWEST_PRIORITY,
-		rte.lo.polarity, rte.lo.trigger);
-	} else if (vector_is_shared(vec)) {
-	    if ((info->trigger != rte.lo.trigger) ||
-		(info->polarity != rte.lo.polarity)) {
-		printk("WARN: can't override shared interrupt vec\n");
-	        printk("IOSAPIC/PIN = (%d/%d), ori = 0x%x, new = 0x%x\n",
-			id, rte_index, info->low32, rte.val);
-		spin_unlock(&iosapic_lock);
-		spin_unlock_irqrestore(&irq_descp(vec)->lock, flags);
-		return -EINVAL;
-	    }
-
-	    /* If the vector is shared and already unmasked for other
-	     * interrupt sources, don't mask it.
-	     *
-	     * Same check may also apply to single gsi pin, which may
-	     * be shared by devices belonging to different domain. But
-	     * let's see how to act later on demand.
-	     */
-	    if (!(info->low32 & IOSAPIC_MASK))
-		rte.lo.mask = 0;
-	}
-
-	/* time to update physical RTE */
-	dest = cpu_physical_id(smp_processor_id());
-	high32 = (dest << IOSAPIC_DEST_SHIFT);
-	iosapic_write(iosapic_lists[id].addr, reg + 1, high32);
-	iosapic_write(iosapic_lists[id].addr, reg, rte.val);
-	info->low32 = rte.val;
-	info->dest = dest;
-	spin_unlock(&iosapic_lock);
-	spin_unlock_irqrestore(&irq_descp(vec)->lock, flags);
-	return 0;
-}
-
-/* for vtd interrupt remapping. xen/drivers/vtd/intremap.c */
-int iosapic_get_nr_iosapics(void)
-{
-	int index;
-
-	for (index = NR_IOSAPICS - 1; index >= 0; index--) {
-		if (iosapic_lists[index].addr)
-			break;
-	}
-
-	return index + 1;
-}
-
-int iosapic_get_nr_pins(int index)
-{
-	return iosapic_lists[index].num_rte;
-}
-#endif /* XEN */
diff -r 2386288b1bf1 -r 8aa1697d57e4 xen/arch/ia64/linux-xen/irq_ia64.c
--- a/xen/arch/ia64/linux-xen/irq_ia64.c	Mon Apr 02 18:14:31 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,350 +0,0 @@
-/*
- * linux/arch/ia64/kernel/irq.c
- *
- * Copyright (C) 1998-2001 Hewlett-Packard Co
- *	Stephane Eranian <eranian@hpl.hp.com>
- *	David Mosberger-Tang <davidm@hpl.hp.com>
- *
- *  6/10/99: Updated to bring in sync with x86 version to facilitate
- *	     support for SMP and different interrupt controllers.
- *
- * 09/15/00 Goutham Rao <goutham.rao@intel.com> Implemented pci_irq_to_vector
- *                      PCI to vector allocation routine.
- * 04/14/2004 Ashok Raj <ashok.raj@intel.com>
- *						Added CPU Hotplug handling for IPF.
- */
-
-#include <linux/config.h>
-#include <linux/module.h>
-
-#include <linux/jiffies.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/kernel_stat.h>
-#include <linux/slab.h>
-#include <linux/ptrace.h>
-#include <linux/random.h>	/* for rand_initialize_irq() */
-#include <linux/signal.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/threads.h>
-#include <linux/bitops.h>
-
-#include <asm/delay.h>
-#include <asm/intrinsics.h>
-#include <asm/io.h>
-#include <asm/hw_irq.h>
-#include <asm/machvec.h>
-#include <asm/pgtable.h>
-#include <asm/system.h>
-
-#ifdef XEN
-#include <xen/perfc.h>
-#endif
-
-#ifdef CONFIG_PERFMON
-# include <asm/perfmon.h>
-#endif
-
-#define IRQ_DEBUG	0
-
-/* default base addr of IPI table */
-void __iomem *ipi_base_addr = ((void __iomem *)
-			       (__IA64_UNCACHED_OFFSET | IA64_IPI_DEFAULT_BASE_ADDR));
-
-/*
- * Legacy IRQ to IA-64 vector translation table.
- */
-__u8 isa_irq_to_vector_map[16] = {
-	/* 8259 IRQ translation, first 16 entries */
-	0x2f, 0x20, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29,
-	0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21
-};
-EXPORT_SYMBOL(isa_irq_to_vector_map);
-
-#ifdef XEN
-unsigned long ia64_vector_mask[BITS_TO_LONGS(IA64_NUM_DEVICE_VECTORS)];
-#else
-static unsigned long ia64_vector_mask[BITS_TO_LONGS(IA64_NUM_DEVICE_VECTORS)];
-#endif
-
-int
-assign_irq_vector (int irq)
-{
-	int pos, vector;
- again:
-	pos = find_first_zero_bit(ia64_vector_mask, IA64_NUM_DEVICE_VECTORS);
-	vector = IA64_FIRST_DEVICE_VECTOR + pos;
-	if (vector > IA64_LAST_DEVICE_VECTOR)
-		return -ENOSPC;
-	if (test_and_set_bit(pos, ia64_vector_mask))
-		goto again;
-	return vector;
-}
-
-void
-free_irq_vector (int vector)
-{
-	int pos;
-
-	if (vector < IA64_FIRST_DEVICE_VECTOR || vector > IA64_LAST_DEVICE_VECTOR)
-		return;
-
-	pos = vector - IA64_FIRST_DEVICE_VECTOR;
-	if (!test_and_clear_bit(pos, ia64_vector_mask))
-		printk(KERN_WARNING "%s: double free!\n", __FUNCTION__);
-}
-
-#ifdef CONFIG_SMP
-#	define IS_RESCHEDULE(vec)	(vec == IA64_IPI_RESCHEDULE)
-#else
-#	define IS_RESCHEDULE(vec)	(0)
-#endif
-/*
- * That's where the IVT branches when we get an external
- * interrupt. This branches to the correct hardware IRQ handler via
- * function ptr.
- */
-void
-ia64_handle_irq (ia64_vector vector, struct pt_regs *regs)
-{
-	unsigned long saved_tpr;
-
-#ifdef XEN
-	perfc_incr(irqs);
-#endif
-#if IRQ_DEBUG
-#ifdef XEN
-	xen_debug_irq(vector, regs);
-#endif
-	{
-		unsigned long bsp, sp;
-
-		/*
-		 * Note: if the interrupt happened while executing in
-		 * the context switch routine (ia64_switch_to), we may
-		 * get a spurious stack overflow here.  This is
-		 * because the register and the memory stack are not
-		 * switched atomically.
-		 */
-		bsp = ia64_getreg(_IA64_REG_AR_BSP);
-		sp = ia64_getreg(_IA64_REG_SP);
-
-		if ((sp - bsp) < 1024) {
-			static unsigned char count;
-			static long last_time;
-
-			if (jiffies - last_time > 5*HZ)
-				count = 0;
-			if (++count < 5) {
-				last_time = jiffies;
-				printk("ia64_handle_irq: DANGER: less than "
-				       "1KB of free stack space!!\n"
-				       "(bsp=0x%lx, sp=%lx)\n", bsp, sp);
-			}
-		}
-	}
-#endif /* IRQ_DEBUG */
-
-	/*
-	 * Always set TPR to limit maximum interrupt nesting depth to
-	 * 16 (without this, it would be ~240, which could easily lead
-	 * to kernel stack overflows).
-	 */
-	irq_enter();
-	saved_tpr = ia64_getreg(_IA64_REG_CR_TPR);
-	ia64_srlz_d();
-	while (vector != IA64_SPURIOUS_INT_VECTOR) {
-		if (!IS_RESCHEDULE(vector)) {
-			ia64_setreg(_IA64_REG_CR_TPR, vector);
-			ia64_srlz_d();
-
-			__do_IRQ(local_vector_to_irq(vector), regs);
-
-			/*
-			 * Disable interrupts and send EOI:
-			 */
-			local_irq_disable();
-			ia64_setreg(_IA64_REG_CR_TPR, saved_tpr);
-		}
-		ia64_eoi();
-		vector = ia64_get_ivr();
-	}
-	/*
-	 * This must be done *after* the ia64_eoi().  For example, the keyboard softirq
-	 * handler needs to be able to wait for further keyboard interrupts, which can't
-	 * come through until ia64_eoi() has been done.
-	 */
-	irq_exit();
-}
-
-#ifndef XEN
-#ifdef CONFIG_HOTPLUG_CPU
-/*
- * This function emulates a interrupt processing when a cpu is about to be
- * brought down.
- */
-void ia64_process_pending_intr(void)
-{
-	ia64_vector vector;
-	unsigned long saved_tpr;
-	extern unsigned int vectors_in_migration[NR_IRQS];
-
-	vector = ia64_get_ivr();
-
-	 irq_enter();
-	 saved_tpr = ia64_getreg(_IA64_REG_CR_TPR);
-	 ia64_srlz_d();
-
-	 /*
-	  * Perform normal interrupt style processing
-	  */
-	while (vector != IA64_SPURIOUS_INT_VECTOR) {
-		if (!IS_RESCHEDULE(vector)) {
-			ia64_setreg(_IA64_REG_CR_TPR, vector);
-			ia64_srlz_d();
-
-			/*
-			 * Now try calling normal ia64_handle_irq as it would have got called
-			 * from a real intr handler. Try passing null for pt_regs, hopefully
-			 * it will work. I hope it works!.
-			 * Probably could shared code.
-			 */
-			vectors_in_migration[local_vector_to_irq(vector)]=0;
-			__do_IRQ(local_vector_to_irq(vector), NULL);
-
-			/*
-			 * Disable interrupts and send EOI
-			 */
-			local_irq_disable();
-			ia64_setreg(_IA64_REG_CR_TPR, saved_tpr);
-		}
-		ia64_eoi();
-		vector = ia64_get_ivr();
-	}
-	irq_exit();
-}
-#endif
-#endif
-
-
-#ifdef CONFIG_SMP
-extern irqreturn_t handle_IPI (int irq, void *dev_id, struct pt_regs *regs);
-
-static struct irqaction __read_mostly ipi_irqaction = {
-	.handler =	handle_IPI,
-#ifndef XEN
-	.flags =	SA_INTERRUPT,
-#endif
-	.name =		"IPI"
-};
-#endif
-
-static hw_irq_controller irq_type_ia64_lsapic = {
-	.typename =	"LSAPIC",
-	.startup =	irq_startup_none,
-	.shutdown =	irq_shutdown_none,
-	.enable =	irq_enable_none,
-	.disable =	irq_disable_none,
-	.ack =		irq_actor_none,
-	.end =		irq_actor_none
-};
-
-void
-register_percpu_irq (ia64_vector vec, struct irqaction *action)
-{
-	irq_desc_t *desc;
-#ifndef XEN
-	unsigned int irq;
-
-	for (irq = 0; irq < NR_IRQS; ++irq)
-		if (irq_to_vector(irq) == vec) {
-			desc = irq_descp(irq);
-			desc->status |= IRQ_PER_CPU;
-			desc->handler = &irq_type_ia64_lsapic;
-			if (action)
-				setup_irq(irq, action);
-		}
-#else
-	desc = irq_descp(vec);
-	desc->status |= IRQ_PER_CPU;
-	desc->handler = &irq_type_ia64_lsapic;
-	if (action)
-		setup_vector(vec, action);
-#endif
-}
-
-#ifdef XEN
-int __init request_irq_vector(unsigned int vector,
-		void (*handler)(int, void *, struct cpu_user_regs *),
-		unsigned long irqflags, const char * devname, void *dev_id)
-{
-	struct irqaction * action;
-	int retval;
-
-	/*
-	 * Sanity-check: shared interrupts must pass in a real dev-ID,
-	 * otherwise we'll have trouble later trying to figure out
-	 * which interrupt is which (messes up the interrupt freeing logic etc).
-	 *                          */
-	if (vector >= NR_VECTORS)
-		return -EINVAL;
-	if (!handler)
-		return -EINVAL;
-
-	action = xmalloc(struct irqaction);
-	if (!action)
-		return -ENOMEM;
-
-	action->handler = handler;
-	action->name = devname;
-	action->dev_id = dev_id;
-
-	retval = setup_vector(vector, action);
-	if (retval)
-		xfree(action);
-
-	return retval;
-}
-#endif
-
-void __init
-init_IRQ (void)
-{
-#ifdef XEN
-	BUG_ON(init_irq_data());
-#endif
-	register_percpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL);
-#ifdef CONFIG_SMP
-	register_percpu_irq(IA64_IPI_VECTOR, &ipi_irqaction);
-#endif
-#ifdef CONFIG_PERFMON
-	pfm_init_percpu();
-#endif
-	platform_irq_init();
-}
-
-void
-ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect)
-{
-	void __iomem *ipi_addr;
-	unsigned long ipi_data;
-	unsigned long phys_cpu_id;
-
-#ifdef CONFIG_SMP
-	phys_cpu_id = cpu_physical_id(cpu);
-#else
-	phys_cpu_id = (ia64_getreg(_IA64_REG_CR_LID) >> 16) & 0xffff;
-#endif
-
-	/*
-	 * cpu number is in 8bit ID and 8bit EID
-	 */
-
-	ipi_data = (delivery_mode << 8) | (vector & 0xff);
-	ipi_addr = ipi_base_addr + ((phys_cpu_id << 4) | ((redirect & 1) << 3));
-
-	writeq(ipi_data, ipi_addr);
-}
diff -r 2386288b1bf1 -r 8aa1697d57e4 xen/arch/ia64/linux-xen/mca.c
--- a/xen/arch/ia64/linux-xen/mca.c	Mon Apr 02 18:14:31 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1963 +0,0 @@
-/*
- * File:	mca.c
- * Purpose:	Generic MCA handling layer
- *
- * Updated for latest kernel
- * Copyright (C) 2003 Hewlett-Packard Co
- *	David Mosberger-Tang <davidm@hpl.hp.com>
- *
- * Copyright (C) 2002 Dell Inc.
- * Copyright (C) Matt Domsch (Matt_Domsch@dell.com)
- *
- * Copyright (C) 2002 Intel
- * Copyright (C) Jenna Hall (jenna.s.hall@intel.com)
- *
- * Copyright (C) 2001 Intel
- * Copyright (C) Fred Lewis (frederick.v.lewis@intel.com)
- *
- * Copyright (C) 2000 Intel
- * Copyright (C) Chuck Fleckenstein (cfleck@co.intel.com)
- *
- * Copyright (C) 1999, 2004 Silicon Graphics, Inc.
- * Copyright (C) Vijay Chander(vijay@engr.sgi.com)
- *
- * 03/04/15 D. Mosberger Added INIT backtrace support.
- * 02/03/25 M. Domsch	GUID cleanups
- *
- * 02/01/04 J. Hall	Aligned MCA stack to 16 bytes, added platform vs. CPU
- *			error flag, set SAL default return values, changed
- *			error record structure to linked list, added init call
- *			to sal_get_state_info_size().
- *
- * 01/01/03 F. Lewis    Added setup of CMCI and CPEI IRQs, logging of corrected
- *                      platform errors, completed code for logging of
- *                      corrected & uncorrected machine check errors, and
- *                      updated for conformance with Nov. 2000 revision of the
- *                      SAL 3.0 spec.
- * 00/03/29 C. Fleckenstein  Fixed PAL/SAL update issues, began MCA bug fixes, logging issues,
- *                           added min save state dump, added INIT handler.
- *
- * 2003-12-08 Keith Owens <kaos@sgi.com>
- *            smp_call_function() must not be called from interrupt context (can
- *            deadlock on tasklist_lock).  Use keventd to call smp_call_function().
- *
- * 2004-02-01 Keith Owens <kaos@sgi.com>
- *            Avoid deadlock when using printk() for MCA and INIT records.
- *            Delete all record printing code, moved to salinfo_decode in user space.
- *            Mark variables and functions static where possible.
- *            Delete dead variables and functions.
- *            Reorder to remove the need for forward declarations and to consolidate
- *            related code.
- */
-#include <linux/config.h>
-#include <linux/types.h>
-#include <linux/init.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/kallsyms.h>
-#include <linux/smp_lock.h>
-#include <linux/bootmem.h>
-#include <linux/acpi.h>
-#include <linux/timer.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/smp.h>
-#include <linux/workqueue.h>
-
-#include <asm/delay.h>
-#include <asm/machvec.h>
-#include <asm/meminit.h>
-#include <asm/page.h>
-#include <asm/ptrace.h>
-#include <asm/system.h>
-#include <asm/sal.h>
-#include <asm/mca.h>
-
-#include <asm/irq.h>
-#include <asm/hw_irq.h>
-
-#ifdef XEN
-#include <xen/symbols.h>
-#include <xen/mm.h>
-#include <xen/console.h>
-#include <xen/event.h>
-#include <xen/softirq.h>
-#include <asm/xenmca.h>
-#include <linux/shutdown.h>
-#endif
-
-#if defined(IA64_MCA_DEBUG_INFO)
-# define IA64_MCA_DEBUG(fmt...)	printk(fmt)
-#else
-# define IA64_MCA_DEBUG(fmt...)
-#endif
-
-/* Used by mca_asm.S */
-#ifndef XEN
-ia64_mca_sal_to_os_state_t	ia64_sal_to_os_handoff_state;
-#else
-ia64_mca_sal_to_os_state_t	ia64_sal_to_os_handoff_state[NR_CPUS];
-DEFINE_PER_CPU(u64, ia64_sal_to_os_handoff_state_addr); 
-#endif
-ia64_mca_os_to_sal_state_t	ia64_os_to_sal_handoff_state;
-u64				ia64_mca_serialize;
-DEFINE_PER_CPU(u64, ia64_mca_data); /* == __per_cpu_mca[smp_processor_id()] */
-DEFINE_PER_CPU(u64, ia64_mca_per_cpu_pte); /* PTE to map per-CPU area */
-DEFINE_PER_CPU(u64, ia64_mca_pal_pte);	    /* PTE to map PAL code */
-DEFINE_PER_CPU(u64, ia64_mca_pal_base);    /* vaddr PAL code granule */
-
-unsigned long __per_cpu_mca[NR_CPUS];
-
-/* In mca_asm.S */
-extern void			ia64_monarch_init_handler (void);
-extern void			ia64_slave_init_handler (void);
-
-static ia64_mc_info_t		ia64_mc_info;
-
-#ifdef XEN
-#define jiffies			NOW()
-#undef HZ
-#define HZ			1000000000UL
-#endif
-
-#define MAX_CPE_POLL_INTERVAL (15*60*HZ) /* 15 minutes */
-#define MIN_CPE_POLL_INTERVAL (2*60*HZ)  /* 2 minutes */
-#define CMC_POLL_INTERVAL     (1*60*HZ)  /* 1 minute */
-#define CPE_HISTORY_LENGTH    5
-#define CMC_HISTORY_LENGTH    5
-
-#ifndef XEN 
-static struct timer_list cpe_poll_timer;
-static struct timer_list cmc_poll_timer;
-#else
-#define mod_timer(timer, expires)	set_timer(timer, expires)
-static struct timer cpe_poll_timer;
-static struct timer cmc_poll_timer;
-#endif
-/*
- * This variable tells whether we are currently in polling mode.
- * Start with this in the wrong state so we won't play w/ timers
- * before the system is ready.
- */
-static int cmc_polling_enabled = 1;
-
-/*
- * Clearing this variable prevents CPE polling from getting activated
- * in mca_late_init.  Use it if your system doesn't provide a CPEI,
- * but encounters problems retrieving CPE logs.  This should only be
- * necessary for debugging.
- */
-static int cpe_poll_enabled = 1;
-
-extern void salinfo_log_wakeup(int type, u8 *buffer, u64 size, int irqsafe);
-
-static int mca_init;
-
-/*
- * IA64_MCA log support
- */
-#define IA64_MAX_LOGS		2	/* Double-buffering for nested MCAs */
-#define IA64_MAX_LOG_TYPES      4   /* MCA, INIT, CMC, CPE */
-
-typedef struct ia64_state_log_s
-{
-	spinlock_t	isl_lock;
-	int		isl_index;
-	unsigned long	isl_count;
-	ia64_err_rec_t  *isl_log[IA64_MAX_LOGS]; /* need space to store header + error log */
-} ia64_state_log_t;
-
-static ia64_state_log_t ia64_state_log[IA64_MAX_LOG_TYPES];
-
-#ifndef XEN
-#define IA64_LOG_ALLOCATE(it, size) \
-	{ia64_state_log[it].isl_log[IA64_LOG_CURR_INDEX(it)] = \
-		(ia64_err_rec_t *)alloc_bootmem(size); \
-	ia64_state_log[it].isl_log[IA64_LOG_NEXT_INDEX(it)] = \
-		(ia64_err_rec_t *)alloc_bootmem(size);}
-#else
-#define IA64_LOG_ALLOCATE(it, size) \
-	do { \
-		unsigned int pageorder; \
-		struct page_info *page;	\
-		pageorder = get_order_from_bytes(size); \
-		page = alloc_domheap_pages(NULL, pageorder, 0); \
-		ia64_state_log[it].isl_log[IA64_LOG_CURR_INDEX(it)] = \
-			page? (ia64_err_rec_t *)page_to_virt(page): NULL;  \
-		page = alloc_domheap_pages(NULL, pageorder, 0); \
-		ia64_state_log[it].isl_log[IA64_LOG_NEXT_INDEX(it)] = \
-			page? (ia64_err_rec_t *)page_to_virt(page): NULL; \
-	} while(0)
-#endif
-
-#define IA64_LOG_LOCK_INIT(it) spin_lock_init(&ia64_state_log[it].isl_lock)
-#define IA64_LOG_LOCK(it)      spin_lock_irqsave(&ia64_state_log[it].isl_lock, s)
-#define IA64_LOG_UNLOCK(it)    spin_unlock_irqrestore(&ia64_state_log[it].isl_lock,s)
-#define IA64_LOG_NEXT_INDEX(it)    ia64_state_log[it].isl_index
-#define IA64_LOG_CURR_INDEX(it)    1 - ia64_state_log[it].isl_index
-#define IA64_LOG_INDEX_INC(it) \
-    {ia64_state_log[it].isl_index = 1 - ia64_state_log[it].isl_index; \
-    ia64_state_log[it].isl_count++;}
-#define IA64_LOG_INDEX_DEC(it) \
-    ia64_state_log[it].isl_index = 1 - ia64_state_log[it].isl_index
-#define IA64_LOG_NEXT_BUFFER(it)   (void *)((ia64_state_log[it].isl_log[IA64_LOG_NEXT_INDEX(it)]))
-#define IA64_LOG_CURR_BUFFER(it)   (void *)((ia64_state_log[it].isl_log[IA64_LOG_CURR_INDEX(it)]))
-#define IA64_LOG_COUNT(it)         ia64_state_log[it].isl_count
-
-#ifdef XEN
-sal_queue_entry_t sal_entry[NR_CPUS][IA64_MAX_LOG_TYPES];
-struct list_head *sal_queue, sal_log_queues[IA64_MAX_LOG_TYPES];
-sal_log_record_header_t *sal_record;
-DEFINE_SPINLOCK(sal_queue_lock);
-#endif
-
-/*
- * ia64_log_init
- *	Reset the OS ia64 log buffer
- * Inputs   :   info_type   (SAL_INFO_TYPE_{MCA,INIT,CMC,CPE})
- * Outputs	:	None
- */
-static void
-ia64_log_init(int sal_info_type)
-{
-	u64	max_size = 0;
-
-	IA64_LOG_NEXT_INDEX(sal_info_type) = 0;
-	IA64_LOG_LOCK_INIT(sal_info_type);
-
-	// SAL will tell us the maximum size of any error record of this type
-	max_size = ia64_sal_get_state_info_size(sal_info_type);
-	if (!max_size)
-		/* alloc_bootmem() doesn't like zero-sized allocations! */
-		return;
-
-	// set up OS data structures to hold error info
-	IA64_LOG_ALLOCATE(sal_info_type, max_size);
-	memset(IA64_LOG_CURR_BUFFER(sal_info_type), 0, max_size);
-	memset(IA64_LOG_NEXT_BUFFER(sal_info_type), 0, max_size);
-
-#ifdef XEN
-	if (sal_record == NULL) {
-		unsigned int pageorder;
-		struct page_info *page;
-		pageorder  = get_order_from_bytes(max_size);
-		page = alloc_domheap_pages(NULL, pageorder, 0);
-		BUG_ON(page == NULL);
-		sal_record = (sal_log_record_header_t *)page_to_virt(page);
-		BUG_ON(sal_record == NULL);
-	}
-#endif
-}
-
-#ifndef XEN
-/*
- * ia64_log_get
- *
- *	Get the current MCA log from SAL and copy it into the OS log buffer.
- *
- *  Inputs  :   info_type   (SAL_INFO_TYPE_{MCA,INIT,CMC,CPE})
- *              irq_safe    whether you can use printk at this point
- *  Outputs :   size        (total record length)
- *              *buffer     (ptr to error record)
- *
- */
-static u64
-ia64_log_get(int sal_info_type, u8 **buffer, int irq_safe)
-{
-	sal_log_record_header_t     *log_buffer;
-	u64                         total_len = 0;
-	int                         s;
-
-	IA64_LOG_LOCK(sal_info_type);
-
-	/* Get the process state information */
-	log_buffer = IA64_LOG_NEXT_BUFFER(sal_info_type);
-
-	total_len = ia64_sal_get_state_info(sal_info_type, (u64 *)log_buffer);
-
-	if (total_len) {
-		IA64_LOG_INDEX_INC(sal_info_type);
-		IA64_LOG_UNLOCK(sal_info_type);
-		if (irq_safe) {
-			IA64_MCA_DEBUG("%s: SAL error record type %d retrieved. "
-				       "Record length = %ld\n", __FUNCTION__, sal_info_type, total_len);
-		}
-		*buffer = (u8 *) log_buffer;
-		return total_len;
-	} else {
-		IA64_LOG_UNLOCK(sal_info_type);
-		return 0;
-	}
-}
-
-/*
- *  ia64_mca_log_sal_error_record
- *
- *  This function retrieves a specified error record type from SAL
- *  and wakes up any processes waiting for error records.
- *
- *  Inputs  :   sal_info_type   (Type of error record MCA/CMC/CPE/INIT)
- */
-static void
-ia64_mca_log_sal_error_record(int sal_info_type)
-{
-	u8 *buffer;
-	sal_log_record_header_t *rh;
-	u64 size;
-	int irq_safe = sal_info_type != SAL_INFO_TYPE_MCA && sal_info_type != SAL_INFO_TYPE_INIT;
-#ifdef IA64_MCA_DEBUG_INFO
-	static const char * const rec_name[] = { "MCA", "INIT", "CMC", "CPE" };
-#endif
-
-	size = ia64_log_get(sal_info_type, &buffer, irq_safe);
-	if (!size)
-		return;
-
-	salinfo_log_wakeup(sal_info_type, buffer, size, irq_safe);
-
-	if (irq_safe)
-		IA64_MCA_DEBUG("CPU %d: SAL log contains %s error record\n",
-			smp_processor_id(),
-			sal_info_type < ARRAY_SIZE(rec_name) ? rec_name[sal_info_type] : "UNKNOWN");
-
-	/* Clear logs from corrected errors in case there's no user-level logger */
-	rh = (sal_log_record_header_t *)buffer;
-	if (rh->severity == sal_log_severity_corrected)
-		ia64_sal_clear_state_info(sal_info_type);
-}
-#else /* !XEN */
-/*
- * ia64_log_queue
- *
- *	Get the current MCA log from SAL and copy it into the OS log buffer.
- *
- *  Inputs  :   info_type   (SAL_INFO_TYPE_{MCA,INIT,CMC,CPE})
- *  Outputs :   size        (total record length)
- *              *buffer     (ptr to error record)
- *
- */
-static u64
-ia64_log_queue(int sal_info_type, int virq)
-{
-	sal_log_record_header_t     *log_buffer;
-	u64                         total_len = 0;
-	int                         s;
-	sal_queue_entry_t	    *e;
-	unsigned long		    flags;
-
-	IA64_LOG_LOCK(sal_info_type);
-
-	/* Get the process state information */
-	log_buffer = IA64_LOG_NEXT_BUFFER(sal_info_type);
-
-	total_len = ia64_sal_get_state_info(sal_info_type, (u64 *)log_buffer);
-
-	if (total_len) {
-		int queue_type;
-		int cpuid = smp_processor_id();
-
-		spin_lock_irqsave(&sal_queue_lock, flags);
-
-		if (sal_info_type == SAL_INFO_TYPE_MCA && virq == VIRQ_MCA_CMC)
-			queue_type = SAL_INFO_TYPE_CMC;
-		else
-			queue_type = sal_info_type;
-
-		/* Skip if sal_entry is already listed in sal_queue */
-		list_for_each_entry(e, &sal_queue[queue_type], list) {
-			if (e == &sal_entry[cpuid][queue_type])
-				goto found;
-		}
-		e = &sal_entry[cpuid][queue_type];
-		memset(e, 0, sizeof(sal_queue_entry_t));
-		e->cpuid = cpuid;
-		e->sal_info_type = sal_info_type;
-		e->vector = IA64_CMC_VECTOR;
-		e->virq = virq;
-		e->length = total_len;
-
-		list_add_tail(&e->list, &sal_queue[queue_type]);
-
-	found:
-		spin_unlock_irqrestore(&sal_queue_lock, flags);
-
-		IA64_LOG_INDEX_INC(sal_info_type);
-		IA64_LOG_UNLOCK(sal_info_type);
-		if (sal_info_type != SAL_INFO_TYPE_MCA &&
-		    sal_info_type != SAL_INFO_TYPE_INIT) {
-			IA64_MCA_DEBUG("%s: SAL error record type %d retrieved. "
-				       "Record length = %ld\n", __FUNCTION__,
-			               sal_info_type, total_len);
-		}
-		return total_len;
-	} else {
-		IA64_LOG_UNLOCK(sal_info_type);
-		return 0;
-	}
-}
-#endif /* !XEN */
-
-/*
- * platform dependent error handling
- */
-#ifndef PLATFORM_MCA_HANDLERS
-
-#ifdef CONFIG_ACPI
-
-#ifdef XEN
-/**
- *	Copy from linux/kernel/irq/manage.c
- *
- *	disable_irq_nosync - disable an irq without waiting
- *	@irq: Interrupt to disable
- *
- *	Disable the selected interrupt line.  Disables and Enables are
- *	nested.
- *	Unlike disable_irq(), this function does not ensure existing
- *	instances of the IRQ handler have completed before returning.
- *
- *	This function may be called from IRQ context.
- */
-void disable_irq_nosync(unsigned int irq)
-{
-	irq_desc_t *desc = irq_desc + irq;
-	unsigned long flags;
-
-	if (irq >= NR_IRQS)
-		return;
-
-	spin_lock_irqsave(&desc->lock, flags);
-	if (!desc->arch.depth++) {
-		desc->status |= IRQ_DISABLED;
-		desc->handler->disable(desc);
-	}
-	spin_unlock_irqrestore(&desc->lock, flags);
-}
-
-/**
- *	Copy from linux/kernel/irq/manage.c
- *
- *	enable_irq - enable handling of an irq
- *	@irq: Interrupt to enable
- *
- *	Undoes the effect of one call to disable_irq().  If this
- *	matches the last disable, processing of interrupts on this
- *	IRQ line is re-enabled.
- *
- *	This function may be called from IRQ context.
- */
-void enable_irq(unsigned int irq)
-{
-	irq_desc_t *desc = irq_desc + irq;
-	unsigned long flags;
-
-	if (irq >= NR_IRQS)
-		return;
-
-	spin_lock_irqsave(&desc->lock, flags);
-	switch (desc->arch.depth) {
-	case 0:
-		WARN_ON(1);
-		break;
-	case 1: {
-		unsigned int status = desc->status & ~IRQ_DISABLED;
-
-		desc->status = status;
-		if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) {
-			desc->status = status | IRQ_REPLAY;
-			hw_resend_irq(desc->handler,irq);
-		}
-		desc->handler->enable(desc);
-		/* fall-through */
-	}
-	default:
-		desc->arch.depth--;
-	}
-	spin_unlock_irqrestore(&desc->lock, flags);
-}
-#endif	/* XEN */
-
-int cpe_vector = -1;
-
-static irqreturn_t
-ia64_mca_cpe_int_handler (int cpe_irq, void *arg, struct pt_regs *ptregs)
-{
-	static unsigned long	cpe_history[CPE_HISTORY_LENGTH];
-	static int		index;
-	static DEFINE_SPINLOCK(cpe_history_lock);
-
-	IA64_MCA_DEBUG("%s: received interrupt vector = %#x on CPU %d\n",
-		       __FUNCTION__, cpe_irq, smp_processor_id());
-
-	/* SAL spec states this should run w/ interrupts enabled */
-	local_irq_enable();
-
-#ifndef XEN
-	/* Get the CPE error record and log it */
-	ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CPE);
-#else
-	ia64_log_queue(SAL_INFO_TYPE_CPE, VIRQ_MCA_CPE);
-	/* CPE error does not inform to dom0 but the following codes are 
-	   reserved for future implementation */
-/* 	send_guest_vcpu_virq(dom0->vcpu[0], VIRQ_MCA_CPE); */
-#endif
-
-	spin_lock(&cpe_history_lock);
-	if (!cpe_poll_enabled && cpe_vector >= 0) {
-
-		int i, count = 1; /* we know 1 happened now */
-		unsigned long now = jiffies;
-
-		for (i = 0; i < CPE_HISTORY_LENGTH; i++) {
-			if (now - cpe_history[i] <= HZ)
-				count++;
-		}
-
-		IA64_MCA_DEBUG(KERN_INFO "CPE threshold %d/%d\n", count, CPE_HISTORY_LENGTH);
-		if (count >= CPE_HISTORY_LENGTH) {
-
-			cpe_poll_enabled = 1;
-			spin_unlock(&cpe_history_lock);
-			disable_irq_nosync(local_vector_to_irq(IA64_CPE_VECTOR));
-
-			/*
-			 * Corrected errors will still be corrected, but
-			 * make sure there's a log somewhere that indicates
-			 * something is generating more than we can handle.
-			 */
-			printk(KERN_WARNING "WARNING: Switching to polling CPE handler; error records may be lost\n");
-
-			mod_timer(&cpe_poll_timer, jiffies + MIN_CPE_POLL_INTERVAL);
-
-			/* lock already released, get out now */
-			return IRQ_HANDLED;
-		} else {
-			cpe_history[index++] = now;
-			if (index == CPE_HISTORY_LENGTH)
-				index = 0;
-		}
-	}
-	spin_unlock(&cpe_history_lock);
-	return IRQ_HANDLED;
-}
-
-#endif /* CONFIG_ACPI */
-
-static void
-show_min_state (pal_min_state_area_t *minstate)
-{
-	u64 iip = minstate->pmsa_iip + ((struct ia64_psr *)(&minstate->pmsa_ipsr))->ri;
-	u64 xip = minstate->pmsa_xip + ((struct ia64_psr *)(&minstate->pmsa_xpsr))->ri;
-
-	printk("NaT bits\t%016lx\n", minstate->pmsa_nat_bits);
-	printk("pr\t\t%016lx\n", minstate->pmsa_pr);
-	printk("b0\t\t%016lx ", minstate->pmsa_br0); print_symbol("%s\n", minstate->pmsa_br0);
-	printk("ar.rsc\t\t%016lx\n", minstate->pmsa_rsc);
-	printk("cr.iip\t\t%016lx ", iip); print_symbol("%s\n", iip);
-	printk("cr.ipsr\t\t%016lx\n", minstate->pmsa_ipsr);
-	printk("cr.ifs\t\t%016lx\n", minstate->pmsa_ifs);
-	printk("xip\t\t%016lx ", xip); print_symbol("%s\n", xip);
-	printk("xpsr\t\t%016lx\n", minstate->pmsa_xpsr);
-	printk("xfs\t\t%016lx\n", minstate->pmsa_xfs);
-	printk("b1\t\t%016lx ", minstate->pmsa_br1);
-	print_symbol("%s\n", minstate->pmsa_br1);
-
-	printk("\nstatic registers r0-r15:\n");
-	printk(" r0- 3 %016lx %016lx %016lx %016lx\n",
-	       0UL, minstate->pmsa_gr[0], minstate->pmsa_gr[1], minstate->pmsa_gr[2]);
-	printk(" r4- 7 %016lx %016lx %016lx %016lx\n",
-	       minstate->pmsa_gr[3], minstate->pmsa_gr[4],
-	       minstate->pmsa_gr[5], minstate->pmsa_gr[6]);
-	printk(" r8-11 %016lx %016lx %016lx %016lx\n",
-	       minstate->pmsa_gr[7], minstate->pmsa_gr[8],
-	       minstate->pmsa_gr[9], minstate->pmsa_gr[10]);
-	printk("r12-15 %016lx %016lx %016lx %016lx\n",
-	       minstate->pmsa_gr[11], minstate->pmsa_gr[12],
-	       minstate->pmsa_gr[13], minstate->pmsa_gr[14]);
-
-	printk("\nbank 0:\n");
-	printk("r16-19 %016lx %016lx %016lx %016lx\n",
-	       minstate->pmsa_bank0_gr[0], minstate->pmsa_bank0_gr[1],
-	       minstate->pmsa_bank0_gr[2], minstate->pmsa_bank0_gr[3]);
-	printk("r20-23 %016lx %016lx %016lx %016lx\n",
-	       minstate->pmsa_bank0_gr[4], minstate->pmsa_bank0_gr[5],
-	       minstate->pmsa_bank0_gr[6], minstate->pmsa_bank0_gr[7]);
-	printk("r24-27 %016lx %016lx %016lx %016lx\n",
-	       minstate->pmsa_bank0_gr[8], minstate->pmsa_bank0_gr[9],
-	       minstate->pmsa_bank0_gr[10], minstate->pmsa_bank0_gr[11]);
-	printk("r28-31 %016lx %016lx %016lx %016lx\n",
-	       minstate->pmsa_bank0_gr[12], minstate->pmsa_bank0_gr[13],
-	       minstate->pmsa_bank0_gr[14], minstate->pmsa_bank0_gr[15]);
-
-	printk("\nbank 1:\n");
-	printk("r16-19 %016lx %016lx %016lx %016lx\n",
-	       minstate->pmsa_bank1_gr[0], minstate->pmsa_bank1_gr[1],
-	       minstate->pmsa_bank1_gr[2], minstate->pmsa_bank1_gr[3]);
-	printk("r20-23 %016lx %016lx %016lx %016lx\n",
-	       minstate->pmsa_bank1_gr[4], minstate->pmsa_bank1_gr[5],
-	       minstate->pmsa_bank1_gr[6], minstate->pmsa_bank1_gr[7]);
-	printk("r24-27 %016lx %016lx %016lx %016lx\n",
-	       minstate->pmsa_bank1_gr[8], minstate->pmsa_bank1_gr[9],
-	       minstate->pmsa_bank1_gr[10], minstate->pmsa_bank1_gr[11]);
-	printk("r28-31 %016lx %016lx %016lx %016lx\n",
-	       minstate->pmsa_bank1_gr[12], minstate->pmsa_bank1_gr[13],
-	       minstate->pmsa_bank1_gr[14], minstate->pmsa_bank1_gr[15]);
-}
-
-static void
-fetch_min_state (pal_min_state_area_t *ms, struct pt_regs *pt, struct switch_stack *sw)
-{
-	u64 *dst_banked, *src_banked, bit, shift, nat_bits;
-	int i;
-
-	/*
-	 * First, update the pt-regs and switch-stack structures with the contents stored
-	 * in the min-state area:
-	 */
-	if (((struct ia64_psr *) &ms->pmsa_ipsr)->ic == 0) {
-		pt->cr_ipsr = ms->pmsa_xpsr;
-		pt->cr_iip = ms->pmsa_xip;
-		pt->cr_ifs = ms->pmsa_xfs;
-	} else {
-		pt->cr_ipsr = ms->pmsa_ipsr;
-		pt->cr_iip = ms->pmsa_iip;
-		pt->cr_ifs = ms->pmsa_ifs;
-	}
-	pt->ar_rsc = ms->pmsa_rsc;
-	pt->pr = ms->pmsa_pr;
-	pt->r1 = ms->pmsa_gr[0];
-	pt->r2 = ms->pmsa_gr[1];
-	pt->r3 = ms->pmsa_gr[2];
-	sw->r4 = ms->pmsa_gr[3];
-	sw->r5 = ms->pmsa_gr[4];
-	sw->r6 = ms->pmsa_gr[5];
-	sw->r7 = ms->pmsa_gr[6];
-	pt->r8 = ms->pmsa_gr[7];
-	pt->r9 = ms->pmsa_gr[8];
-	pt->r10 = ms->pmsa_gr[9];
-	pt->r11 = ms->pmsa_gr[10];
-	pt->r12 = ms->pmsa_gr[11];
-	pt->r13 = ms->pmsa_gr[12];
-	pt->r14 = ms->pmsa_gr[13];
-	pt->r15 = ms->pmsa_gr[14];
-	dst_banked = &pt->r16;		/* r16-r31 are contiguous in struct pt_regs */
-	src_banked = ms->pmsa_bank1_gr;
-	for (i = 0; i < 16; ++i)
-		dst_banked[i] = src_banked[i];
-	pt->b0 = ms->pmsa_br0;
-	sw->b1 = ms->pmsa_br1;
-
-	/* construct the NaT bits for the pt-regs structure: */
-#	define PUT_NAT_BIT(dst, addr)					\
-	do {								\
-		bit = nat_bits & 1; nat_bits >>= 1;			\
-		shift = ((unsigned long) addr >> 3) & 0x3f;		\
-		dst = ((dst) & ~(1UL << shift)) | (bit << shift);	\
-	} while (0)
-
-	/* Rotate the saved NaT bits such that bit 0 corresponds to pmsa_gr[0]: */
-	shift = ((unsigned long) &ms->pmsa_gr[0] >> 3) & 0x3f;
-	nat_bits = (ms->pmsa_nat_bits >> shift) | (ms->pmsa_nat_bits << (64 - shift));
-
-	PUT_NAT_BIT(sw->caller_unat, &pt->r1);
-	PUT_NAT_BIT(sw->caller_unat, &pt->r2);
-	PUT_NAT_BIT(sw->caller_unat, &pt->r3);
-	PUT_NAT_BIT(sw->ar_unat, &sw->r4);
-	PUT_NAT_BIT(sw->ar_unat, &sw->r5);
-	PUT_NAT_BIT(sw->ar_unat, &sw->r6);
-	PUT_NAT_BIT(sw->ar_unat, &sw->r7);
-	PUT_NAT_BIT(sw->caller_unat, &pt->r8);	PUT_NAT_BIT(sw->caller_unat, &pt->r9);
-	PUT_NAT_BIT(sw->caller_unat, &pt->r10);	PUT_NAT_BIT(sw->caller_unat, &pt->r11);
-	PUT_NAT_BIT(sw->caller_unat, &pt->r12);	PUT_NAT_BIT(sw->caller_unat, &pt->r13);
-	PUT_NAT_BIT(sw->caller_unat, &pt->r14);	PUT_NAT_BIT(sw->caller_unat, &pt->r15);
-	nat_bits >>= 16;	/* skip over bank0 NaT bits */
-	PUT_NAT_BIT(sw->caller_unat, &pt->r16);	PUT_NAT_BIT(sw->caller_unat, &pt->r17);
-	PUT_NAT_BIT(sw->caller_unat, &pt->r18);	PUT_NAT_BIT(sw->caller_unat, &pt->r19);
-	PUT_NAT_BIT(sw->caller_unat, &pt->r20);	PUT_NAT_BIT(sw->caller_unat, &pt->r21);
-	PUT_NAT_BIT(sw->caller_unat, &pt->r22);	PUT_NAT_BIT(sw->caller_unat, &pt->r23);
-	PUT_NAT_BIT(sw->caller_unat, &pt->r24);	PUT_NAT_BIT(sw->caller_unat, &pt->r25);
-	PUT_NAT_BIT(sw->caller_unat, &pt->r26);	PUT_NAT_BIT(sw->caller_unat, &pt->r27);
-	PUT_NAT_BIT(sw->caller_unat, &pt->r28);	PUT_NAT_BIT(sw->caller_unat, &pt->r29);
-	PUT_NAT_BIT(sw->caller_unat, &pt->r30);	PUT_NAT_BIT(sw->caller_unat, &pt->r31);
-}
-
-#ifdef XEN
-static spinlock_t init_dump_lock = SPIN_LOCK_UNLOCKED;
-static spinlock_t show_stack_lock = SPIN_LOCK_UNLOCKED;
-static atomic_t num_stopped_cpus = ATOMIC_INIT(0);
-extern void show_stack (struct task_struct *, unsigned long *);
-
-#define CPU_FLUSH_RETRY_MAX 5
-static void
-init_cache_flush (void)
-{
-	unsigned long flags;
-	int i;
-	s64 rval = 0;
-	u64 vector, progress = 0;
-
-	for (i = 0; i < CPU_FLUSH_RETRY_MAX; i++) {
-		local_irq_save(flags);
-		rval = ia64_pal_cache_flush(PAL_CACHE_TYPE_INSTRUCTION_DATA,
-		                            0, &progress, &vector);
-		local_irq_restore(flags);
-		if (rval == 0){
-			printk("\nPAL cache flush success\n");
-			return;
-		}
-	}
-	printk("\nPAL cache flush failed. status=%ld\n",rval);
-}
-
-static void inline
-save_ksp (struct unw_frame_info *info)
-{
-	current->arch._thread.ksp = (__u64)(info->sw) - 16;
-	wmb();
-	init_cache_flush();
-}	
-
-static void
-freeze_cpu_osinit (struct unw_frame_info *info, void *arg)
-{
-	save_ksp(info);
-	atomic_inc(&num_stopped_cpus);
-	printk("%s: CPU%d init handler done\n",
-	       __FUNCTION__, smp_processor_id());
-	for (;;)
-		local_irq_disable();
-}
-
-/* FIXME */
-static void
-try_crashdump(struct unw_frame_info *info, void *arg)
-{ 
-	save_ksp(info);
-	printk("\nINIT dump complete.  Please reboot now.\n");
-	for (;;)
-		local_irq_disable();
-}
-#endif /* XEN */
-
-static void
-init_handler_platform (pal_min_state_area_t *ms,
-		       struct pt_regs *pt, struct switch_stack *sw)
-{
-	struct unw_frame_info info;
-
-	/* if a kernel debugger is available call it here else just dump the registers */
-
-	/*
-	 * Wait for a bit.  On some machines (e.g., HP's zx2000 and zx6000, INIT can be
-	 * generated via the BMC's command-line interface, but since the console is on the
-	 * same serial line, the user will need some time to switch out of the BMC before
-	 * the dump begins.
-	 */
-	printk("Delaying for 5 seconds...\n");
-	udelay(5*1000000);
-#ifdef XEN
-	fetch_min_state(ms, pt, sw);
-	spin_lock(&show_stack_lock);
-#endif
-	show_min_state(ms);
-
-#ifdef XEN
-	printk("Backtrace of current vcpu (vcpu_id %d of domid %d)\n",
-	       current->vcpu_id, current->domain->domain_id);
-#else
-	printk("Backtrace of current task (pid %d, %s)\n", current->pid, current->comm);
-	fetch_min_state(ms, pt, sw);
-#endif
-	unw_init_from_interruption(&info, current, pt, sw);
-	ia64_do_show_stack(&info, NULL);
-#ifdef XEN
-	spin_unlock(&show_stack_lock);
-
-	if (spin_trylock(&init_dump_lock)) {
-		struct domain *d;
-		struct vcpu *v;
-#ifdef CONFIG_SMP
-		int other_cpus = num_online_cpus() - 1;
-		int wait = 1000 * other_cpus;
-
-		while ((atomic_read(&num_stopped_cpus) != other_cpus) && wait--)
-			udelay(1000);
-		if (other_cpus && wait < 0)
-			printk("timeout %d\n", atomic_read(&num_stopped_cpus));
-#endif
-		if (opt_noreboot) {
-			/* this route is for dump routine */
-			unw_init_running(try_crashdump, pt);
-		} else {
-			rcu_read_lock(&domlist_read_lock);
-			for_each_domain(d) {
-				for_each_vcpu(d, v) {
-					printk("Backtrace of current vcpu "
-					       "(vcpu_id %d of domid %d)\n",
-					       v->vcpu_id, d->domain_id);
-					show_stack(v, NULL);
-				}
-			}
-			rcu_read_unlock(&domlist_read_lock);
-		}
-	}
-	unw_init_running(freeze_cpu_osinit, NULL);
-#else /* XEN */
-#ifdef CONFIG_SMP
-	/* read_trylock() would be handy... */
-	if (!tasklist_lock.write_lock)
-		read_lock(&tasklist_lock);
-#endif
-	{
-		struct task_struct *g, *t;
-		do_each_thread (g, t) {
-			if (t == current)
-				continue;
-
-			printk("\nBacktrace of pid %d (%s)\n", t->pid, t->comm);
-			show_stack(t, NULL);
-		} while_each_thread (g, t);
-	}
-#ifdef CONFIG_SMP
-	if (!tasklist_lock.write_lock)
-		read_unlock(&tasklist_lock);
-#endif
-
-	printk("\nINIT dump complete.  Please reboot now.\n");
-#endif /* XEN */
-	while (1);			/* hang city if no debugger */
-}
-
-#ifdef CONFIG_ACPI
-/*
- * ia64_mca_register_cpev
- *
- *  Register the corrected platform error vector with SAL.
- *
- *  Inputs
- *      cpev        Corrected Platform Error Vector number
- *
- *  Outputs
- *      None
- */
-static void
-ia64_mca_register_cpev (int cpev)
-{
-	/* Register the CPE interrupt vector with SAL */
-	struct ia64_sal_retval isrv;
-
-	isrv = ia64_sal_mc_set_params(SAL_MC_PARAM_CPE_INT, SAL_MC_PARAM_MECHANISM_INT, cpev, 0, 0);
-	if (isrv.status) {
-		printk(KERN_ERR "Failed to register Corrected Platform "
-		       "Error interrupt vector with SAL (status %ld)\n", isrv.status);
-		return;
-	}
-
-	IA64_MCA_DEBUG("%s: corrected platform error "
-		       "vector %#x registered\n", __FUNCTION__, cpev);
-}
-#endif /* CONFIG_ACPI */
-
-#endif /* PLATFORM_MCA_HANDLERS */
-
-/*
- * ia64_mca_cmc_vector_setup
- *
- *  Setup the corrected machine check vector register in the processor.
- *  (The interrupt is masked on boot. ia64_mca_late_init unmask this.)
- *  This function is invoked on a per-processor basis.
- *
- * Inputs
- *      None
- *
- * Outputs
- *	None
- */
-void
-ia64_mca_cmc_vector_setup (void)
-{
-	cmcv_reg_t	cmcv;
-
-	cmcv.cmcv_regval	= 0;
-	cmcv.cmcv_mask		= 1;        /* Mask/disable interrupt at first */
-	cmcv.cmcv_vector	= IA64_CMC_VECTOR;
-	ia64_setreg(_IA64_REG_CR_CMCV, cmcv.cmcv_regval);
-
-	IA64_MCA_DEBUG("%s: CPU %d corrected "
-		       "machine check vector %#x registered.\n",
-		       __FUNCTION__, smp_processor_id(), IA64_CMC_VECTOR);
-
-	IA64_MCA_DEBUG("%s: CPU %d CMCV = %#016lx\n",
-		       __FUNCTION__, smp_processor_id(), ia64_getreg(_IA64_REG_CR_CMCV));
-}
-
-/*
- * ia64_mca_cmc_vector_disable
- *
- *  Mask the corrected machine check vector register in the processor.
- *  This function is invoked on a per-processor basis.
- *
- * Inputs
- *      dummy(unused)
- *
- * Outputs
- *	None
- */
-static void
-ia64_mca_cmc_vector_disable (void *dummy)
-{
-	cmcv_reg_t	cmcv;
-
-	cmcv.cmcv_regval = ia64_getreg(_IA64_REG_CR_CMCV);
-
-	cmcv.cmcv_mask = 1; /* Mask/disable interrupt */
-	ia64_setreg(_IA64_REG_CR_CMCV, cmcv.cmcv_regval);
-
-	IA64_MCA_DEBUG("%s: CPU %d corrected "
-		       "machine check vector %#x disabled.\n",
-		       __FUNCTION__, smp_processor_id(), cmcv.cmcv_vector);
-}
-
-/*
- * ia64_mca_cmc_vector_enable
- *
- *  Unmask the corrected machine check vector register in the processor.
- *  This function is invoked on a per-processor basis.
- *
- * Inputs
- *      dummy(unused)
- *
- * Outputs
- *	None
- */
-static void
-ia64_mca_cmc_vector_enable (void *dummy)
-{
-	cmcv_reg_t	cmcv;
-
-	cmcv.cmcv_regval = ia64_getreg(_IA64_REG_CR_CMCV);
-
-	cmcv.cmcv_mask = 0; /* Unmask/enable interrupt */
-	ia64_setreg(_IA64_REG_CR_CMCV, cmcv.cmcv_regval);
-
-	IA64_MCA_DEBUG("%s: CPU %d corrected "
-		       "machine check vector %#x enabled.\n",
-		       __FUNCTION__, smp_processor_id(), cmcv.cmcv_vector);
-}
-
-#ifndef XEN
-/*
- * ia64_mca_cmc_vector_disable_keventd
- *
- * Called via keventd (smp_call_function() is not safe in interrupt context) to
- * disable the cmc interrupt vector.
- */
-static void
-ia64_mca_cmc_vector_disable_keventd(void *unused)
-{
-	on_each_cpu(ia64_mca_cmc_vector_disable, NULL, 0);
-}
-
-/*
- * ia64_mca_cmc_vector_enable_keventd
- *
- * Called via keventd (smp_call_function() is not safe in interrupt context) to
- * enable the cmc interrupt vector.
- */
-static void
-ia64_mca_cmc_vector_enable_keventd(void *unused)
-{
-	on_each_cpu(ia64_mca_cmc_vector_enable, NULL, 0);
-}
-#endif /* !XEN	*/
-
-/*
- * ia64_mca_wakeup_ipi_wait
- *
- *	Wait for the inter-cpu interrupt to be sent by the
- *	monarch processor once it is done with handling the
- *	MCA.
- *
- *  Inputs  :   None
- *  Outputs :   None
- */
-static void
-ia64_mca_wakeup_ipi_wait(void)
-{
-	int	irr_num = (IA64_MCA_WAKEUP_VECTOR >> 6);
-	int	irr_bit = (IA64_MCA_WAKEUP_VECTOR & 0x3f);
-	u64	irr = 0;
-
-	do {
-		switch(irr_num) {
-		      case 0:
-			irr = ia64_getreg(_IA64_REG_CR_IRR0);
-			break;
-		      case 1:
-			irr = ia64_getreg(_IA64_REG_CR_IRR1);
-			break;
-		      case 2:
-			irr = ia64_getreg(_IA64_REG_CR_IRR2);
-			break;
-		      case 3:
-			irr = ia64_getreg(_IA64_REG_CR_IRR3);
-			break;
-		}
-		cpu_relax();
-	} while (!(irr & (1UL << irr_bit))) ;
-}
-
-/*
- * ia64_mca_wakeup
- *
- *	Send an inter-cpu interrupt to wake-up a particular cpu
- *	and mark that cpu to be out of rendez.
- *
- *  Inputs  :   cpuid
- *  Outputs :   None
- */
-static void
-ia64_mca_wakeup(int cpu)
-{
-	platform_send_ipi(cpu, IA64_MCA_WAKEUP_VECTOR, IA64_IPI_DM_INT, 0);
-	ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_NOTDONE;
-
-}
-
-/*
- * ia64_mca_wakeup_all
- *
- *	Wakeup all the cpus which have rendez'ed previously.
- *
- *  Inputs  :   None
- *  Outputs :   None
- */
-static void
-ia64_mca_wakeup_all(void)
-{
-	int cpu;
-
-	/* Clear the Rendez checkin flag for all cpus */
-	for(cpu = 0; cpu < NR_CPUS; cpu++) {
-		if (!cpu_online(cpu))
-			continue;
-		if (ia64_mc_info.imi_rendez_checkin[cpu] == IA64_MCA_RENDEZ_CHECKIN_DONE)
-			ia64_mca_wakeup(cpu);
-	}
-
-}
-
-/*
- * ia64_mca_rendez_interrupt_handler
- *
- *	This is handler used to put slave processors into spinloop
- *	while the monarch processor does the mca handling and later
- *	wake each slave up once the monarch is done.
- *
- *  Inputs  :   None
- *  Outputs :   None
- */
-static irqreturn_t
-ia64_mca_rendez_int_handler(int rendez_irq, void *arg, struct pt_regs *ptregs)
-{
-	unsigned long flags;
-	int cpu = smp_processor_id();
-
-	/* Mask all interrupts */
-	local_irq_save(flags);
-
-	ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_DONE;
-	/* Register with the SAL monarch that the slave has
-	 * reached SAL
-	 */
-	ia64_sal_mc_rendez();
-
-	/* Wait for the wakeup IPI from the monarch
-	 * This waiting is done by polling on the wakeup-interrupt
-	 * vector bit in the processor's IRRs
-	 */
-	ia64_mca_wakeup_ipi_wait();
-
-	/* Enable all interrupts */
-	local_irq_restore(flags);
-	return IRQ_HANDLED;
-}
-
-/*
- * ia64_mca_wakeup_int_handler
- *
- *	The interrupt handler for processing the inter-cpu interrupt to the
- *	slave cpu which was spinning in the rendez loop.
- *	Since this spinning is done by turning off the interrupts and
- *	polling on the wakeup-interrupt bit in the IRR, there is
- *	nothing useful to be done in the handler.
- *
- *  Inputs  :   wakeup_irq  (Wakeup-interrupt bit)
- *	arg		(Interrupt handler specific argument)
- *	ptregs		(Exception frame at the time of the interrupt)
- *  Outputs :   None
- *
- */
-static irqreturn_t
-ia64_mca_wakeup_int_handler(int wakeup_irq, void *arg, struct pt_regs *ptregs)
-{
-	return IRQ_HANDLED;
-}
-
-/*
- * ia64_return_to_sal_check
- *
- *	This is function called before going back from the OS_MCA handler
- *	to the OS_MCA dispatch code which finally takes the control back
- *	to the SAL.
- *	The main purpose of this routine is to setup the OS_MCA to SAL
- *	return state which can be used by the OS_MCA dispatch code
- *	just before going back to SAL.
- *
- *  Inputs  :   None
- *  Outputs :   None
- */
-
-static void
-ia64_return_to_sal_check(int recover)
-{
-#ifdef XEN
-	int cpu = smp_processor_id();
-#endif
-
-	/* Copy over some relevant stuff from the sal_to_os_mca_handoff
-	 * so that it can be used at the time of os_mca_to_sal_handoff
-	 */
-#ifdef XEN
-	ia64_os_to_sal_handoff_state.imots_sal_gp =
-		ia64_sal_to_os_handoff_state[cpu].imsto_sal_gp;
-
-	ia64_os_to_sal_handoff_state.imots_sal_check_ra =
-		ia64_sal_to_os_handoff_state[cpu].imsto_sal_check_ra;
-#else
-	ia64_os_to_sal_handoff_state.imots_sal_gp =
-		ia64_sal_to_os_handoff_state.imsto_sal_gp;
-
-	ia64_os_to_sal_handoff_state.imots_sal_check_ra =
-		ia64_sal_to_os_handoff_state.imsto_sal_check_ra;
-#endif
-
-	if (recover)
-		ia64_os_to_sal_handoff_state.imots_os_status = IA64_MCA_CORRECTED;
-	else
-		ia64_os_to_sal_handoff_state.imots_os_status = IA64_MCA_COLD_BOOT;
-
-	/* Default = tell SAL to return to same context */
-	ia64_os_to_sal_handoff_state.imots_context = IA64_MCA_SAME_CONTEXT;
-
-#ifdef XEN
-	ia64_os_to_sal_handoff_state.imots_new_min_state =
-		(u64 *)ia64_sal_to_os_handoff_state[cpu].pal_min_state;
-#else
-	ia64_os_to_sal_handoff_state.imots_new_min_state =
-		(u64 *)ia64_sal_to_os_handoff_state.pal_min_state;
-#endif
-
-}
-
-/* Function pointer for extra MCA recovery */
-int (*ia64_mca_ucmc_extension)
-	(void*,ia64_mca_sal_to_os_state_t*,ia64_mca_os_to_sal_state_t*)
-	= NULL;
-
-int
-ia64_reg_MCA_extension(void *fn)
-{
-	if (ia64_mca_ucmc_extension)
-		return 1;
-
-	ia64_mca_ucmc_extension = fn;
-	return 0;
-}
-
-void
-ia64_unreg_MCA_extension(void)
-{
-	if (ia64_mca_ucmc_extension)
-		ia64_mca_ucmc_extension = NULL;
-}
-
-EXPORT_SYMBOL(ia64_reg_MCA_extension);
-EXPORT_SYMBOL(ia64_unreg_MCA_extension);
-
-/*
- * ia64_mca_ucmc_handler
- *
- *	This is uncorrectable machine check handler called from OS_MCA
- *	dispatch code which is in turn called from SAL_CHECK().
- *	This is the place where the core of OS MCA handling is done.
- *	Right now the logs are extracted and displayed in a well-defined
- *	format. This handler code is supposed to be run only on the
- *	monarch processor. Once the monarch is done with MCA handling
- *	further MCA logging is enabled by clearing logs.
- *	Monarch also has the duty of sending wakeup-IPIs to pull the
- *	slave processors out of rendezvous spinloop.
- *
- *  Inputs  :   None
- *  Outputs :   None
- */
-void
-ia64_mca_ucmc_handler(void)
-{
-#ifdef XEN
-	int cpu = smp_processor_id();
-	pal_processor_state_info_t *psp = (pal_processor_state_info_t *)
-		&ia64_sal_to_os_handoff_state[cpu].proc_state_param;
-#else
-	pal_processor_state_info_t *psp = (pal_processor_state_info_t *)
-		&ia64_sal_to_os_handoff_state.proc_state_param;
-#endif
-	int recover; 
-
-#ifndef XEN
-	/* Get the MCA error record and log it */
-	ia64_mca_log_sal_error_record(SAL_INFO_TYPE_MCA);
-#else
-	ia64_log_queue(SAL_INFO_TYPE_MCA, VIRQ_MCA_CMC);
-	send_guest_vcpu_virq(dom0->vcpu[0], VIRQ_MCA_CMC);
-#endif
-
-	/* TLB error is only exist in this SAL error record */
-	recover = (psp->tc && !(psp->cc || psp->bc || psp->rc || psp->uc))
-	/* other error recovery */
-#ifndef XEN
-	   || (ia64_mca_ucmc_extension 
-		&& ia64_mca_ucmc_extension(
-			IA64_LOG_CURR_BUFFER(SAL_INFO_TYPE_MCA),
-			&ia64_sal_to_os_handoff_state,
-			&ia64_os_to_sal_handoff_state)); 
-#else
-	;
-#endif
-
-#ifndef XEN
-	if (recover) {
-		sal_log_record_header_t *rh = IA64_LOG_CURR_BUFFER(SAL_INFO_TYPE_MCA);
-		rh->severity = sal_log_severity_corrected;
-		ia64_sal_clear_state_info(SAL_INFO_TYPE_MCA);
-	}
-#endif
-	/*
-	 *  Wakeup all the processors which are spinning in the rendezvous
-	 *  loop.
-	 */
-	ia64_mca_wakeup_all();
-
-	/* Return to SAL */
-	ia64_return_to_sal_check(recover);
-}
-
-#ifndef XEN
-static DECLARE_WORK(cmc_disable_work, ia64_mca_cmc_vector_disable_keventd, NULL);
-static DECLARE_WORK(cmc_enable_work, ia64_mca_cmc_vector_enable_keventd, NULL);
-#endif
-
-/*
- * ia64_mca_cmc_int_handler
- *
- *  This is corrected machine check interrupt handler.
- *	Right now the logs are extracted and displayed in a well-defined
- *	format.
- *
- * Inputs
- *      interrupt number
- *      client data arg ptr
- *      saved registers ptr
- *
- * Outputs
- *	None
- */
-static irqreturn_t
-ia64_mca_cmc_int_handler(int cmc_irq, void *arg, struct pt_regs *ptregs)
-{
-	static unsigned long	cmc_history[CMC_HISTORY_LENGTH];
-	static int		index;
-	static DEFINE_SPINLOCK(cmc_history_lock);
-
-	IA64_MCA_DEBUG("%s: received interrupt vector = %#x on CPU %d\n",
-		       __FUNCTION__, cmc_irq, smp_processor_id());
-
-	/* SAL spec states this should run w/ interrupts enabled */
-	local_irq_enable();
-
-#ifndef XEN	
-	/* Get the CMC error record and log it */
-	ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CMC);
-#else
-	ia64_log_queue(SAL_INFO_TYPE_CMC, VIRQ_MCA_CMC);
-	send_guest_vcpu_virq(dom0->vcpu[0], VIRQ_MCA_CMC);
-#endif
-
-	spin_lock(&cmc_history_lock);
-	if (!cmc_polling_enabled) {
-		int i, count = 1; /* we know 1 happened now */
-		unsigned long now = jiffies;
-
-		for (i = 0; i < CMC_HISTORY_LENGTH; i++) {
-			if (now - cmc_history[i] <= HZ)
-				count++;
-		}
-
-		IA64_MCA_DEBUG(KERN_INFO "CMC threshold %d/%d\n", count, CMC_HISTORY_LENGTH);
-		if (count >= CMC_HISTORY_LENGTH) {
-
-			cmc_polling_enabled = 1;
-			spin_unlock(&cmc_history_lock);
-#ifndef XEN	/* XXX FIXME */
-			schedule_work(&cmc_disable_work);
-#else
-			cpumask_raise_softirq(&cpu_online_map,
-			                      CMC_DISABLE_SOFTIRQ);
-#endif
-
-			/*
-			 * Corrected errors will still be corrected, but
-			 * make sure there's a log somewhere that indicates
-			 * something is generating more than we can handle.
-			 */
-			printk(KERN_WARNING "WARNING: Switching to polling CMC handler; error records may be lost\n");
-
-			mod_timer(&cmc_poll_timer, jiffies + CMC_POLL_INTERVAL);
-
-			/* lock already released, get out now */
-			return IRQ_HANDLED;
-		} else {
-			cmc_history[index++] = now;
-			if (index == CMC_HISTORY_LENGTH)
-				index = 0;
-		}
-	}
-	spin_unlock(&cmc_history_lock);
-	return IRQ_HANDLED;
-}
-
-/*
- *  ia64_mca_cmc_int_caller
- *
- * 	Triggered by sw interrupt from CMC polling routine.  Calls
- * 	real interrupt handler and either triggers a sw interrupt
- * 	on the next cpu or does cleanup at the end.
- *
- * Inputs
- *	interrupt number
- *	client data arg ptr
- *	saved registers ptr
- * Outputs
- * 	handled
- */
-static irqreturn_t
-ia64_mca_cmc_int_caller(int cmc_irq, void *arg, struct pt_regs *ptregs)
-{
-	static int start_count = -1;
-	unsigned int cpuid;
-
-	cpuid = smp_processor_id();
-
-	/* If first cpu, update count */
-	if (start_count == -1)
-		start_count = IA64_LOG_COUNT(SAL_INFO_TYPE_CMC);
-
-#ifndef XEN
-	ia64_mca_cmc_int_handler(cmc_irq, arg, ptregs);
-#else
-	IA64_MCA_DEBUG("%s: received polling vector = %#x on CPU %d\n",
-	               __FUNCTION__, cmc_irq, smp_processor_id());
-	ia64_log_queue(SAL_INFO_TYPE_CMC, VIRQ_MCA_CMC);
-#endif
-
-	for (++cpuid ; cpuid < NR_CPUS && !cpu_online(cpuid) ; cpuid++);
-
-	if (cpuid < NR_CPUS) {
-		platform_send_ipi(cpuid, IA64_CMCP_VECTOR, IA64_IPI_DM_INT, 0);
-	} else {
-		/* If no log record, switch out of polling mode */
-		if (start_count == IA64_LOG_COUNT(SAL_INFO_TYPE_CMC)) {
-
-			printk(KERN_WARNING "Returning to interrupt driven CMC handler\n");
-#ifndef XEN	/* XXX FIXME */
-			schedule_work(&cmc_enable_work);
-#else
-			cpumask_raise_softirq(&cpu_online_map,
-			                      CMC_ENABLE_SOFTIRQ);
-#endif
-			cmc_polling_enabled = 0;
-
-		} else {
-
-			mod_timer(&cmc_poll_timer, jiffies + CMC_POLL_INTERVAL);
-		}
-
-		start_count = -1;
-	}
-	return IRQ_HANDLED;
-}
-
-/*
- *  ia64_mca_cmc_poll
- *
- *	Poll for Corrected Machine Checks (CMCs)
- *
- * Inputs   :   dummy(unused)
- * Outputs  :   None
- *
- */
-static void
-#ifndef XEN
-ia64_mca_cmc_poll (unsigned long dummy)
-#else
-ia64_mca_cmc_poll (void *dummy)
-#endif
-{
-	/* Trigger a CMC interrupt cascade  */
-	platform_send_ipi(cpumask_first(&cpu_online_map), IA64_CMCP_VECTOR, IA64_IPI_DM_INT, 0);
-}
-
-/*
- *  ia64_mca_cpe_int_caller
- *
- * 	Triggered by sw interrupt from CPE polling routine.  Calls
- * 	real interrupt handler and either triggers a sw interrupt
- * 	on the next cpu or does cleanup at the end.
- *
- * Inputs
- *	interrupt number
- *	client data arg ptr
- *	saved registers ptr
- * Outputs
- * 	handled
- */
-#ifdef CONFIG_ACPI
-
-static irqreturn_t
-ia64_mca_cpe_int_caller(int cpe_irq, void *arg, struct pt_regs *ptregs)
-{
-	static int start_count = -1;
-#ifdef XEN
-	static unsigned long poll_time = MIN_CPE_POLL_INTERVAL;
-#else
-	static int poll_time = MIN_CPE_POLL_INTERVAL;
-#endif
-	unsigned int cpuid;
-
-	cpuid = smp_processor_id();
-
-	/* If first cpu, update count */
-	if (start_count == -1)
-		start_count = IA64_LOG_COUNT(SAL_INFO_TYPE_CPE);
-
-#ifndef XEN
-	ia64_mca_cpe_int_handler(cpe_irq, arg, ptregs);
-#else
-	IA64_MCA_DEBUG("%s: received polling vector = %#x on CPU %d\n",
-	               __FUNCTION__, cpe_irq, smp_processor_id());
-	ia64_log_queue(SAL_INFO_TYPE_CPE, VIRQ_MCA_CPE);
-#endif
-
-	for (++cpuid ; cpuid < NR_CPUS && !cpu_online(cpuid) ; cpuid++);
-
-	if (cpuid < NR_CPUS) {
-		platform_send_ipi(cpuid, IA64_CPEP_VECTOR, IA64_IPI_DM_INT, 0);
-	} else {
-		/*
-		 * If a log was recorded, increase our polling frequency,
-		 * otherwise, backoff or return to interrupt mode.
-		 */
-		if (start_count != IA64_LOG_COUNT(SAL_INFO_TYPE_CPE)) {
-			poll_time = max(MIN_CPE_POLL_INTERVAL, poll_time / 2);
-		} else if (cpe_vector < 0) {
-			poll_time = min(MAX_CPE_POLL_INTERVAL, poll_time * 2);
-		} else {
-			poll_time = MIN_CPE_POLL_INTERVAL;
-
-			printk(KERN_WARNING "Returning to interrupt driven CPE handler\n");
-			enable_irq(local_vector_to_irq(IA64_CPE_VECTOR));
-			cpe_poll_enabled = 0;
-		}
-
-		if (cpe_poll_enabled)
-			mod_timer(&cpe_poll_timer, jiffies + poll_time);
-		start_count = -1;
-	}
-	return IRQ_HANDLED;
-}
-
-/*
- *  ia64_mca_cpe_poll
- *
- *	Poll for Corrected Platform Errors (CPEs), trigger interrupt
- *	on first cpu, from there it will trickle through all the cpus.
- *
- * Inputs   :   dummy(unused)
- * Outputs  :   None
- *
- */
-static void
-#ifndef XEN
-ia64_mca_cpe_poll (unsigned long dummy)
-#else
-ia64_mca_cpe_poll (void *dummy)
-#endif
-{
-	/* Trigger a CPE interrupt cascade  */
-	platform_send_ipi(cpumask_first(&cpu_online_map), IA64_CPEP_VECTOR, IA64_IPI_DM_INT, 0);
-}
-
-#endif /* CONFIG_ACPI */
-
-/*
- * C portion of the OS INIT handler
- *
- * Called from ia64_monarch_init_handler
- *
- * Inputs: pointer to pt_regs where processor info was saved.
- *
- * Returns:
- *   0 if SAL must warm boot the System
- *   1 if SAL must return to interrupted context using PAL_MC_RESUME
- *
- */
-void
-ia64_init_handler (struct pt_regs *pt, struct switch_stack *sw)
-{
-	pal_min_state_area_t *ms;
-

_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xen.org
http://lists.xensource.com/xen-changelog

From xen-users-bounces@lists.xen.org Sun Apr 08 10:47:07 2012
Return-path: <xen-users-bounces@lists.xen.org>
Envelope-to: archives@lists.xen.org
Delivery-date: Sun, 08 Apr 2012 10:47:07 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-users-bounces@lists.xen.org>)
	id 1SGpci-0000dH-U5; Sun, 08 Apr 2012 10:45:32 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <john@ideacode.com>) id 1SGpcg-0000dC-Ml
	for xen-users@lists.xen.org; Sun, 08 Apr 2012 10:45:31 +0000
Received: from [85.158.138.51:52909] by server-11.bemta-3.messagelabs.com id
	7A/E3-28543-94C618F4; Sun, 08 Apr 2012 10:45:29 +0000
X-Env-Sender: john@ideacode.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1333881925!21207579!1
X-Originating-IP: [72.15.203.164]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Version: 6.5.7; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20380 invoked from network); 8 Apr 2012 10:45:25 -0000
Received: from macready.ideacode.com (HELO macready.ideacode.com)
	(72.15.203.164) by server-3.tower-174.messagelabs.com with SMTP;
	8 Apr 2012 10:45:25 -0000
Received: by macready.ideacode.com (Postfix, from userid 5006)
	id 673E97D5A8F; Sun,  8 Apr 2012 06:45:24 -0400 (EDT)
X-Spam-Checker-Version: SpamAssassin 3.2.1 (2007-05-02) on
	macready.ideacode.com
X-Spam-Level: 
X-Spam-Status: No, score=-1.0 required=3.0 tests=AWL,BAYES_00,
	DYN_RDNS_AND_INLINE_IMAGE,RCVD_IN_PBL,RCVD_IN_SORBS_DUL,RDNS_DYNAMIC
	autolearn=no version=3.2.1
Received: from [192.168.1.20] (cpe-066-057-045-125.nc.res.rr.com
	[66.57.45.125])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	by macready.ideacode.com (Postfix) with ESMTP id E805C7D5A6C
	for <xen-users@lists.xen.org>; Sun,  8 Apr 2012 06:45:21 -0400 (EDT)
Message-ID: <4F816C41.6030204@ideacode.com>
Date: Sun, 08 Apr 2012 06:45:21 -0400
From: "John F. Acree" <john@ideacode.com>
Organization: ideacode, Inc.
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:11.0) Gecko/20120327 Thunderbird/11.0.1
MIME-Version: 1.0
To: xen-users@lists.xen.org
References: <4F76EF72.4060206@ideacode.com>
	<CAOzFzEj9HP2a+NpNue=tsoNTYq95Kx-ogGZTS4BrL43xLfyjkA@mail.gmail.com>
In-Reply-To: <CAOzFzEj9HP2a+NpNue=tsoNTYq95Kx-ogGZTS4BrL43xLfyjkA@mail.gmail.com>
Subject: Re: [Xen-users] XCP 1.5 beta and Gentoo
X-BeenThere: xen-users@lists.xen.org
X-Mailman-Version: 2.1.13
Precedence: list
Reply-To: john@ideacode.com
List-Id: Xen user discussion <xen-users.lists.xen.org>
List-Unsubscribe: <http://lists.xen.org/cgi-bin/mailman/options/xen-users>,
	<mailto:xen-users-request@lists.xen.org?subject=unsubscribe>
List-Post: <mailto:xen-users@lists.xen.org>
List-Help: <mailto:xen-users-request@lists.xen.org?subject=help>
List-Subscribe: <http://lists.xen.org/cgi-bin/mailman/listinfo/xen-users>,
	<mailto:xen-users-request@lists.xen.org?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============7302649333309196518=="
Sender: xen-users-bounces@lists.xen.org
Errors-To: xen-users-bounces@lists.xen.org

This is a cryptographically signed message in MIME format.

--===============7302649333309196518==
Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha1; boundary="------------ms040604050502020608010406"

This is a cryptographically signed message in MIME format.

--------------ms040604050502020608010406
Content-Type: multipart/mixed;
 boundary="------------050808000206030902070706"

This is a multi-part message in MIME format.
--------------050808000206030902070706
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: quoted-printable

Hi,

I am attaching screenshots of the boot process.
Here is the xe vm-param-list output for the vm(kinda long):
uuid ( RO)                          : 30bae3dd-1c3c-840c-2e3f-8163b434615=
8
                     name-label ( RW): Test Virtual Machine
               name-description ( RW):
                   user-version ( RW): 1
                  is-a-template ( RW): false
                  is-a-snapshot ( RO): false
                    snapshot-of ( RO): <not in database>
                      snapshots ( RO):
                  snapshot-time ( RO): 19700101T00:00:00Z
                  snapshot-info ( RO):
                         parent ( RO): <not in database>
                       children ( RO):
              is-control-domain ( RO): false
                    power-state ( RO): running
                  memory-actual ( RO): 268402688
                  memory-target ( RO): 268435456
                memory-overhead ( RO): 5242880
              memory-static-max ( RW): 268435456
             memory-dynamic-max ( RW): 268435456
             memory-dynamic-min ( RW): 268435456
              memory-static-min ( RW): 134217728
               suspend-VDI-uuid ( RW): <not in database>
                suspend-SR-uuid ( RW): <not in database>
                   VCPUs-params (MRW):
                      VCPUs-max ( RW): 1
               VCPUs-at-startup ( RW): 1
         actions-after-shutdown ( RW): Destroy
           actions-after-reboot ( RW): Restart
            actions-after-crash ( RW): Restart
                  console-uuids (SRO): 7549b9f2-2025-49a6-2958-b89e1b0ec7=
2e
                       platform (MRW): timeoffset: 0; nx: false; acpi:=20
true; apic: true; pae: true; viridian: true
             allowed-operations (SRO): changing_dynamic_range;=20
changing_VCPUs_live; hard_reboot; hard_shutdown; clean_reboot;=20
clean_shutdown; pause; snapshot
             current-operations (SRO):
             blocked-operations (MRW):
            allowed-VBD-devices (SRO): 1; 2
            allowed-VIF-devices (SRO): 1; 2; 3
                 possible-hosts ( RO):
                HVM-boot-policy ( RW): BIOS order
                HVM-boot-params (MRW): order: dc
          HVM-shadow-multiplier ( RW): 1.000
                      PV-kernel ( RW):
                     PV-ramdisk ( RW):
                        PV-args ( RW):
                 PV-legacy-args ( RW):
                  PV-bootloader ( RW):
             PV-bootloader-args ( RW):
            last-boot-CPU-flags ( RO): features:=20
179ae3bf-bfebfbff-00000001-28100800; vendor: GenuineIntel
               last-boot-record ( RO): '('struct' ('uuid'=20
'30bae3dd-1c3c-840c-2e3f-8163b4346158') ('allowed_operations' ('array')) =

('current_operations' ('struct'=20
('OpaqueRef:ee7002ce-607e-6a35-2837-b83a0aa838d5' 'start')))=20
('power_state' 'Halted') ('name_label' 'Test Virtual Machine')=20
('name_description' '') ('user_version' '1') ('is_a_template' ('boolean' =

'0')) ('suspend_VDI' 'OpaqueRef:NULL') ('resident_on' 'OpaqueRef:NULL')=20
('affinity' 'OpaqueRef:8f00b1af-6189-3092-e793-1f5c39a1e90c')=20
('memory_overhead' '5242880') ('memory_target' '268435456')=20
('memory_static_max' '268435456') ('memory_dynamic_max' '268435456')=20
('memory_dynamic_min' '268435456') ('memory_static_min' '134217728')=20
('VCPUs_params' ('struct')) ('VCPUs_max' '1') ('VCPUs_at_startup' '1')=20
('actions_after_shutdown' 'destroy') ('actions_after_reboot' 'restart')=20
('actions_after_crash' 'restart') ('consoles' ('array')) ('VIFs'=20
('array' 'OpaqueRef:cab3403c-ecee-3c41-2ebd-191e12360b93')) ('VBDs'=20
('array' 'OpaqueRef:5ce00c29-ce8c-5d59-4a99-66c46839714e'=20
'OpaqueRef:4c8668d0-97fb-feec-f9fa-a50b4dffeb44')) ('crash_dumps'=20
('array')) ('VTPMs' ('array')) ('PV_bootloader' '') ('PV_kernel' '')=20
('PV_ramdisk' '') ('PV_args' '') ('PV_bootloader_args' '')=20
('PV_legacy_args' '') ('HVM_boot_policy' 'BIOS order')=20
('HVM_boot_params' ('struct' ('order' 'dc'))) ('HVM_shadow_multiplier'=20
('double' '1')) ('platform' ('struct' ('timeoffset' '0') ('nx' 'false')=20
('acpi' 'true') ('apic' 'true') ('pae' 'true') ('viridian' 'true')))=20
('PCI_bus' '') ('other_config' ('struct' ('last_shutdown_time'=20
'20120331T12:47:58Z') ('last_shutdown_action' 'Destroy')=20
('last_shutdown_initiator' 'external') ('last_shutdown_reason' 'halted') =

('mac_seed' '7aeb3116-63f7-c961-35e6-406a3e1ce839') ('install-methods'=20
'cdrom'))) ('domid' '-1') ('domarch' 'hvm') ('last_boot_CPU_flags'=20
('struct' ('features' '179ae3bf-bfebfbff-00000001-28100800') ('vendor'=20
'GenuineIntel'))) ('is_control_domain' ('boolean' '0')) ('metrics'=20
'OpaqueRef:5d850bf7-448c-a51d-7062-b71e03ea6068') ('guest_metrics'=20
'OpaqueRef:NULL') ('last_booted_record' '') ('recommendations'=20
'<restrictions><restriction field=3D\"memory-static-max\"=20
max=3D\"137438953472\" /><restriction field=3D\"vcpus-max\" max=3D\"16\" =

/><restriction property=3D\"number-of-vbds\" max=3D\"7\" /><restriction=20
property=3D\"number-of-vifs\" max=3D\"7\" /></restrictions>')=20
('xenstore_data' ('struct')) ('ha_always_run' ('boolean' '0'))=20
('ha_restart_priority' '') ('is_a_snapshot' ('boolean' '0'))=20
('snapshot_of' 'OpaqueRef:NULL') ('snapshots' ('array'))=20
('snapshot_time' ('dateTime.iso8601' '19700101T00:00:00Z'))=20
('transportable_snapshot_id' '') ('blobs' ('struct')) ('tags' ('array')) =

('blocked_operations' ('struct')) ('snapshot_info' ('struct'))=20
('snapshot_metadata' '') ('parent' 'OpaqueRef:NULL') ('children'=20
('array')) ('bios_strings' ('struct')) ('protection_policy'=20
'OpaqueRef:NULL') ('is_snapshot_from_vmpp' ('boolean' '0')) ('appliance' =

'OpaqueRef:NULL') ('start_delay' '0') ('shutdown_delay' '0') ('order'=20
'0') ('VGPUs' ('array')) ('attached_PCIs' ('array')) ('suspend_SR'=20
'OpaqueRef:NULL') ('version' '0'))'
                    resident-on ( RO): cdfffa23-9126-4b5c-9f63-d3a56eb33e=
2f
                       affinity ( RW): cdfffa23-9126-4b5c-9f63-d3a56eb33e=
2f
                   other-config (MRW): last_shutdown_time:=20
20120331T12:47:58Z; last_shutdown_action: Destroy;=20
last_shutdown_initiator: external; last_shutdown_reason: halted;=20
mac_seed: 7aeb3116-63f7-c961-35e6-406a3e1ce839; install-methods: cdrom
                         dom-id ( RO): 2
                recommendations ( RO): <restrictions><restriction=20
field=3D"memory-static-max" max=3D"137438953472" /><restriction=20
field=3D"vcpus-max" max=3D"16" /><restriction property=3D"number-of-vbds"=
=20
max=3D"7" /><restriction property=3D"number-of-vifs" max=3D"7" /></restri=
ctions>
                  xenstore-data (MRW):
     ha-always-run ( RW) [DEPRECATED]: false
            ha-restart-priority ( RW):
                          blobs ( RO):
                     start-time ( RO): 20120408T10:26:40Z
                   install-time ( RO): 20120331T11:29:29Z
                   VCPUs-number ( RO): 1
              VCPUs-utilisation (MRO): 0: 0.003
                     os-version (MRO): <not in database>
             PV-drivers-version (MRO): <not in database>
          PV-drivers-up-to-date ( RO): <not in database>
                         memory (MRO): <not in database>
                          disks (MRO): <not in database>
                       networks (MRO): <not in database>
                          other (MRO): <not in database>
                           live ( RO): <not in database>
     guest-metrics-last-updated ( RO): <not in database>
                    cooperative ( RO): true
              protection-policy ( RW): <not in database>
          is-snapshot-from-vmpp ( RO): false
                           tags (SRW):
                      appliance ( RW): <not in database>
                    start-delay ( RW): 0
                 shutdown-delay ( RW): 0
                          order ( RW): 0
                        version ( RO): 0
I have no idea where xcp keeps config files, so the vm-param-list is as=20
close as I could find so far.  And /var/log/messages has some output, I=20
did not see anything helpful there though.

Thanks,
John

> Hi,
>
> I don't know too much about XCP (or anything beyond the Xen.org stuff
> anyways) the following information could help alot:
>
> If booting in HVM mode (you are talking about CDROMs so I guess so)
> then a screenshot of the VNC session or just a consise summary of the
> output (for instance "Not bootable device found ". etc)
> Output of any relevant logs in /var/log/xen/ specifically the xl
> domain and qemu dm logs.
> Domain config file (or settings.. not sure what XCP does here)
>
> That should be enough to get us started.
>
> Joseph.
>
> On 31 March 2012 22:50, John F. Acree<john@ideacode.com>  wrote:
>> Hi Everyone,
>>
>> I am new to Xen, researching whether we can use it for internal develo=
pment
>> systems and server virtualization to replace our current solution.
>>
>> Gentoo is the guest linux os that we use and I have been having some t=
rouble
>> getting a new Gentoo guest installed.
>>
>> Everything works fine with XCP 1.1, I really like it.  so I thought I =
would
>> try the 1.5 beta.  Here is the trouble I run into.  Oh, I am using xen=
center
>> to create the virtual machines.
>>
>> * Create a new virtual machine, select the other install media templat=
e.
>> * Select the gentoo-install-minimum-amd64 iso from iso repository.
>> * Leave everything else defaults
>> * Add 1 drive, 8gb.
>> * Uncheck the startup virtual machine checkbox on the last step of the=

>> wizard.(This is important due to some timing in the gentoo iso boot pr=
ocess,
>> it tries to boot from disk if no user input received in 15 seconds and=
 it
>> would take longer then that for the console to refresh so I could inte=
rvene)
>> * Go to the console
>> * Click start this virtual machine
>> * When prompted, specify the gentoo kernel.
>>
>> These steps work great with XCP 1.1, the OS detects it is running in a=
 xenU
>> environment, xvda is present.  But when I try to repeat these steps wi=
th XCP
>> 1.5beta, the cd can not be found and the boot process stops before it =
really
>> gets started.
>>
>> My solution was to install XCP 1.1, install the virtual machine, get i=
t
>> running with xvda, hvc0, etc.  Then use the XCP 1.5 beta disk to upgra=
de the
>> server.  It worked, but I am hoping there is something I can adjust so=
 I can
>> setup another server and use 1.5 beta from the start.  Another option =
is
>> using a different linux os to get the boot started, and then going thr=
ough
>> the Gentoo install process.  Again, an option I would like to avoid if=

>> possible.
>>
>> Let me know if I am asking in the wrong place or if I overlooked some
>> information in the archives.  And if there is any more information I c=
ould
>> provide that would be helpful.
>>
>> Other then this issue, everything has been working nice.  I expect the=
re is
>> still quite a learning curve to working with Xen.
>>
>> Thanks,
>> John
>> --
>> John F. Acree
>> ideacode, Inc.
>> www.ideacode.com / (main) +1 919 341 5170 / (fax) +1 919 521 4100
>>
>> CELEBRATING 10 YEARS OF GREAT SOFTWARE!
>>
>> _______________________________________________
>> Xen-users mailing list
>> Xen-users@lists.xen.org
>> http://lists.xen.org/xen-users
>
>
>


--=20
John F. Acree
ideacode, Inc.
www.ideacode.com / (main) +1 919 341 5170 / (fax) +1 919 521 4100

CELEBRATING 10 YEARS OF GREAT SOFTWARE!

--------------050808000206030902070706
Content-Type: image/png;
 name="Image2.png"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="Image2.png"

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
T9K/BxnGhsGDVyxfvs9j94xa+9o9J52fqbSrLvvBnosvHXc8WbV03aY3zuVf2PLxn5y4+s//
J7Dx9Xsuni23CUntW9fveUfcBsl575Z5828h479/w9Rcj85A4P7rLyYLVvufr/df/6uDv3AI
+VWzS5eYE2bOdL6cOoNc88qrr77yqydnXHkCXXDQSV848uK771+4kOqImVRpLFqZZq8TTqi+
Dbl70YwrbdaCB828csbF19z76kzoFVAHxl839+Sj3R+P//b6y9895rYZ4x5f9F8/abkBvNb9
/qrL7xLW/qkX/WzGpOiFDs8tuoBbTmaQRRfcPfq6731m1HPsy2lj7rprGV2972nXOSYVN5F9
T6Prnhl9nbS08BTov5df8IzYOCQ7liaZSpYtG+PJPyTN59xiOHs53ytpiiTV3xeRm50C3OWv
nn+3qLIF6ptkx7h86o0M3RU/dfElynNE2XtYbz/pMDa9Y2/aZne+qtnaV/b/yqX7XXbF4G8O
+9mft/3P+i9efXVbZ2fHZz7T89prxDDs9nZt8OAD77zziClT/onqo7+/ePjzj2Qs7NpVj74z
9pNdyhdK17hjVryyNGrjSVVSm8Y2GP/9Gy/4/pcveOLGU47n3782mhlUvi/3nXTKE5cdPZZw
19INs55gH7plLHKXPPF6fG660OtRUN0QdIMTF5EnLx7ruCCk+0H1dVTNzLsLz/R+JxO6TOZX
MfK4i4666RWxy92LjvwCud7vHLmGXDlzXJVqxmUU3w7etbEFTt0sr76y8sgvnHTQ6r89eeTB
4ugeNO4QsvKVV2veK1HKYw8+8sm/rQ49JQJOqMqC5MccDAS0MJLtuun2Rdd//Gr2uZzq8Hce
O+fq5Npl/HVXfuXCvZtdecZziy6/iwoExnWnvXWz8KeELhTQp+7NhK7yP3DfvGvtZLb9RVPf
vGvJc96Uv0aeWebZeNIMuh177gvfUVR2b741+mvenGLSDNbrmSnX8TQvInfTFJ9b4uZBU6wU
IKhd3N1cpRJRNn99PenHt2FY8RpFlRmnVf9Ru1H60Ig+q3sTWbOG2MQ2yFtb33p387vv/X0V
mf+7KRdcQBVQ5+c/329Z5bff7v/gg+07dpRff71n9eqhd9/94QkT9iHkI48t2eWDGsd8fO9P
KzbtN5L5jxTPUS3svt/6JUd94x5XBr13ywOrjznUcS2xLB54fDVVNt8c++gP5x91yfyjbiPn
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
88Vbvnrx3Vv+5IefHFq3/6pDDy1+/PrZnwqt467oW/n19c+4bYdeWnqfbLhMnNQioDZJtbWK
d03fRfcO1QTmHDn6fFjo0vGBezcfObJ50Vs5THkQ0iJUAtA274gUJ55c5Cmw5AhxEyoB6kmV
SP+pwPTKEDJ7+oXOydEj8jhLSRJZZDVorNzcpVJXl0ZVWi68ek60tAzK0kTS1YlV0zqXkOD0
BR2jQ4zuEeoWkDw2+S7TDsISI0y7CQp8wfSji2dzFtPOfMdKqg8v2LR3PdnsXJ298YmoJzfd
t3TH9czJ58jVS8Pu0yr97PWON9TRQjaRf8HipUeY35HeCnpX7tikzvt/Yu+OOVcvVJT1Xlqh
duxVPQn67PeEc8RN2ZZZe591b8dJMg2R/Hz/iaKm7sT3l16/g6buc98/ERrmExtlMa+tX8re
4E4waYOBo4nJJRe/bdq03gsu+KPzzzvv7LPOmsS+c+ymv5MnT4p+yJ2VK6fpei/ya2xyDGPP
XXftEUvVUQfumnXuTa8PKQjtIkM+MyVJOs7elWtni5bWSwX9ji1qm+tl73X3iXbz/S075EXi
Nmh2deniBU4r3+Jvr3Ou/vqO+8j1S/3Xe2fNefa4uMbkhe9txyst4vDE990QTuynL66zMm/f
PCNccfTEfZuP8ETzAI8/24TwYsaKKgei25q9lyyNcuWXllTY3jfblZYB6R6UpTH70Fqsmte5
cGSvN3tpRP/g9b9e/JP3CEHNxrj00ksPHTp05swZtl8AV1w6O7s2btxw6623Ske33Xbb5s2b
X3jhhcQFDXyc+MHyz5O/f2DFBOvIYyV76tSp69evp5Ut79iCzGjHPY9UcfejH+9etXLlq6+d
qq+7EPLGc8/ZtfvBD/+3q6P9fuKLb9s68xdOQ6Ct4kMPX8XO2NFXndGTpd/97ZcWMId/w/SW
ObfeOvurDzuP1JzNufUXsjW5Tp1HZRDcNVEcKu3QEw/31of61vz2S0TecfwV8YlMjhO060z1
WB4HD5SHdf4TNc3+RD96RdSDGkmya9eulStXnjp1Sl/ubUk7dS66uAaLb9asWV/+8pdvueUW
aVg5cODA/Pnzy+LdYmyMbTEtTC8dHR2hBhxMW8iAqR//2pUf+9AXep++7b15R6V1/PK2D331
rd95GhNfJh6F0ksSUausMewutrsiBakjJ//0i0//qXQy9eP/9PTH+ZlzpARNHT79Ref84x93
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
w+dp1kFDGY0AAAAASUVORK5CYII=
--------------050808000206030902070706
Content-Type: image/png;
 name="Image3.png"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="Image3.png"

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
0mSZrljyt7pIhGz73IxzpbY+39PW13SZjBk+7TVDmm38AIBx8H7RTu9NEWU2m02+ZeJMt6NS
f2ftRwP5ntXtpY3FhLK0QpXmpw+K/YtbWlzotfFrxlmlE2e1EFnhit7cmeToI9S393jaXSe1
QTY+L6qfjZQCULdbY5DVlerUx23dnrJDyOrb/QPEGbYz7bCzz69qpRTxmO6veH8s1WsZ7WnX
+0WX7b2/Dk/ebiKvLWa6gt1rpCkyztpvG/fReSwruXZ/dSHqSmnWy/QVvHF/zY2NdVSP01Vv
79EI9TWKv6/rRLPimu8Q6l/R2V8zEnV7dqmmZibdV8Yzt3amHRRlLvX5JRskpo5Hf/8ez4sV
7enM9f2iVJRp+7Roz3anr992++3f/m3TNdK+9a1v3b9//9NPP80L/Imf+Inr16/b2qebt6mj
HKSr+DfibHXs+m29v1H7qCMs9eS9nSntUDxlxWfaB8OMSx60viPEbxpqNcJibH1F2KWcPKRJ
yukr0ZEFM3470w7jmGF9xdGriazsJU62v+lxezHD9nTm935Ru09jSOM/XwZtNx3Fcbr5jGMW
j14oKj0raqn/XbUYrfPdvtpH3e09ud7rOzeKevWVWS5J945kZxHtTDsssr4zCUNh5u05t/eL
UjvM9vxO2G7b7DaK4he3T7Ya8GqzEjefaW4vyZ8DwC7o5YLPO9fn/9yZ6gm+a+1MO+xmfYdG
ey6DjYlWPt9CnN2dJrZMlumOw8bztEitT4TsF02377his/T45mHa2sX9+/rn/ky6W6oVHLmd
aQfq21c5k7fzzNtzblq/GxbbdlYfR7SX9unG0TbLTYleXovvSKt+2KG53egmKsUA+dryG2/G
0h+B7tQNBij9SLazaeGK9lHXt3b/2l8xPV/VVm2xfYT6djm/3dtBUb5mnNWXQp3ngn59q1HJ
TlOLoS+Kcto9XyxtZ9qhGo/6uMt4frU77/r7t6jXAtqzds9J3i904ml3vmrfrPXfZ8dpt9Vq
ZXpH2je/+c3333//7MmTJMPNsl7n537+55Ms1+JM1zoL+TcTumm8DFqnfSPENpMmsv24M2nn
ycMb4kA8v8aPufEfrhPGhtYmb94Wme79zI/+639Nxy24blLIL/3SLyVZ7hLuSJuzya8VTEL2
mVG7K2Gc66fLtWpjfac67nzamXbYzfoOXS/a0/Z45nD0dpJsONxskhTZibP/HFcMYCDTHVbx
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
--------------050808000206030902070706--

--------------ms040604050502020608010406
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"
Content-Description: S/MIME Cryptographic Signature

MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIDkTCC
A40wggL2oAMCAQICCQCcXq6+dpxIEjANBgkqhkiG9w0BAQUFADCBjDELMAkGA1UEBhMCVVMx
FzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQHEwtDaGFwZWwgSGlsbDEXMBUGA1UE
ChMOaWRlYWNvZGUsIEluYy4xEzARBgNVBAMTCkpvaG4gQWNyZWUxIDAeBgkqhkiG9w0BCQEW
EWpvaG5AaWRlYWNvZGUuY29tMB4XDTEwMDYxMjExMTkxMVoXDTEzMDUxMjExMTkxMVowgYwx
CzAJBgNVBAYTAlVTMRcwFQYDVQQIEw5Ob3J0aCBDYXJvbGluYTEUMBIGA1UEBxMLQ2hhcGVs
IEhpbGwxFzAVBgNVBAoTDmlkZWFjb2RlLCBJbmMuMRMwEQYDVQQDEwpKb2huIEFjcmVlMSAw
HgYJKoZIhvcNAQkBFhFqb2huQGlkZWFjb2RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
gYkCgYEArUDRe1OAoOtssXo+ajY6Cx+dKrlerPzc2PtkzVItSpriBGPPAkT42K/WaXqLlSLa
/3XzQqu5yvCvZVR+8X+TAMRKmTwrm0bEGsobAdsrwLEuS93X73DyRU/7TQwhJCWrrbmcM/Wo
SovXbbsV7cZQ6UD553qcp3M/eqUSz2V+GUkCAwEAAaOB9DCB8TAdBgNVHQ4EFgQUPqZFG7Md
CpJvMK9RCbIgdhG2pMswgcEGA1UdIwSBuTCBtoAUPqZFG7MdCpJvMK9RCbIgdhG2pMuhgZKk
gY8wgYwxCzAJBgNVBAYTAlVTMRcwFQYDVQQIEw5Ob3J0aCBDYXJvbGluYTEUMBIGA1UEBxML
Q2hhcGVsIEhpbGwxFzAVBgNVBAoTDmlkZWFjb2RlLCBJbmMuMRMwEQYDVQQDEwpKb2huIEFj
cmVlMSAwHgYJKoZIhvcNAQkBFhFqb2huQGlkZWFjb2RlLmNvbYIJAJxerr52nEgSMAwGA1Ud
EwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAjTfJNJBcfstpvZETuR9Ekggw0Q4yCmTWrCP+
5nwQVO+G1OKVtySra9fFCwt77qsKpzAQAb77fSb5d2c68lH6PgTN4ID1zVN9iYCK4H1CXdno
6WlcqPVpB4i7LEtMjQvkWMzHf994pEM+gs28oU5kMR87K8RNCgiDN2F3ioH/aN4xggNhMIID
XQIBATCBmjCBjDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYD
VQQHEwtDaGFwZWwgSGlsbDEXMBUGA1UEChMOaWRlYWNvZGUsIEluYy4xEzARBgNVBAMTCkpv
aG4gQWNyZWUxIDAeBgkqhkiG9w0BCQEWEWpvaG5AaWRlYWNvZGUuY29tAgkAnF6uvnacSBIw
CQYFKw4DAhoFAKCCAhwwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUx
DxcNMTIwNDA4MTA0NTIxWjAjBgkqhkiG9w0BCQQxFgQUtSknComf/TVfgatyR0yCE90oca8w
XwYJKoZIhvcNAQkPMVIwUDALBglghkgBZQMEAQIwCgYIKoZIhvcNAwcwDgYIKoZIhvcNAwIC
AgCAMA0GCCqGSIb3DQMCAgFAMAcGBSsOAwIHMA0GCCqGSIb3DQMCAgEoMIGrBgkrBgEEAYI3
EAQxgZ0wgZowgYwxCzAJBgNVBAYTAlVTMRcwFQYDVQQIEw5Ob3J0aCBDYXJvbGluYTEUMBIG
A1UEBxMLQ2hhcGVsIEhpbGwxFzAVBgNVBAoTDmlkZWFjb2RlLCBJbmMuMRMwEQYDVQQDEwpK
b2huIEFjcmVlMSAwHgYJKoZIhvcNAQkBFhFqb2huQGlkZWFjb2RlLmNvbQIJAJxerr52nEgS
MIGtBgsqhkiG9w0BCRACCzGBnaCBmjCBjDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRo
IENhcm9saW5hMRQwEgYDVQQHEwtDaGFwZWwgSGlsbDEXMBUGA1UEChMOaWRlYWNvZGUsIElu
Yy4xEzARBgNVBAMTCkpvaG4gQWNyZWUxIDAeBgkqhkiG9w0BCQEWEWpvaG5AaWRlYWNvZGUu
Y29tAgkAnF6uvnacSBIwDQYJKoZIhvcNAQEBBQAEgYBDclC3/Z26qkFrkDwrUOzME3ABap/w
tQw+VQWD+QFiOuwZ2A/85neoruU4+npfFqpuvaV9HLaP3xDz9lXj6NpWQIA04uqJW43yU6Fq
V3LozBHwerjLgCa+xXR67CydVdA3vi5PLyK4QR5HgE7pEzINxiCBxQLQxw3YhRx5i0wmhwAA
AAAAAA==
--------------ms040604050502020608010406--


--===============7302649333309196518==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-users mailing list
Xen-users@lists.xen.org
http://lists.xen.org/xen-users
--===============7302649333309196518==--


From xen-users-bounces@lists.xen.org Tue Apr 10 17:54:01 2012
Return-path: <xen-users-bounces@lists.xen.org>
Envelope-to: archives@lists.xen.org
Delivery-date: Tue, 10 Apr 2012 17:54:01 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-users-bounces@lists.xen.org>)
	id 1SHfFU-0002gI-87; Tue, 10 Apr 2012 17:53:00 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <steven.eychenne@gmail.com>) id 1SHfFS-0002gD-BP
	for xen-users@lists.xen.org; Tue, 10 Apr 2012 17:52:59 +0000
Received: from [193.109.254.147:30616] by server-11.bemta-14.messagelabs.com
	id FC/8B-05858-973748F4; Tue, 10 Apr 2012 17:52:57 +0000
X-Env-Sender: steven.eychenne@gmail.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1334080370!3979597!1
X-Originating-IP: [209.85.216.43]
X-SpamReason: No, hits=0.8 required=7.0 tests=BODY_RANDOM_LONG,
	RCVD_BY_IP,UPPERCASE_25_50
X-StarScan-Version: 6.5.7; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17131 invoked from network); 10 Apr 2012 17:52:51 -0000
Received: from mail-qa0-f43.google.com (HELO mail-qa0-f43.google.com)
	(209.85.216.43)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Apr 2012 17:52:51 -0000
Received: by qadb15 with SMTP id b15so3113737qad.16
	for <xen-users@lists.xen.org>; Tue, 10 Apr 2012 10:52:50 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=mime-version:sender:in-reply-to:references:from:date
	:x-google-sender-auth:message-id:subject:to:content-type;
	bh=yjxfGU4kzgzAlib9WtSG819dzh79geYuf+umREv8PH0=;
	b=nrNuB18NQYSVWga/I6cBg1lZmi7v2GmLBoRSnK06TufaqoILL+fbwkjpOSso8ZekJH
	ZyobA4nO7FVg7TGnmKa1LDj5Qm0SB2Z3kgTuWe3VwbSHOUDt2kGiJrzMaaO9hWH8g+Bk
	L8OGqBWzfSA22DjKaECZPjvBwT+M1yXblM1ftDZ4rENJT1R7O6QskOvLffNmTuuTyvJ7
	L9jW5JeiX64Od6GCC+VwOtRpZoa+tUgXP8vfWMPzJ1FW8DnlSEfJoLklRRBb7pat6tFW
	d08TGYX60EzPUpIpL24H2LLLciM+bjjfkCl8Q/ba6RroFHD321X8WZy/hscLc46siyXx
	TPKg==
Received: by 10.224.53.6 with SMTP id k6mr15757432qag.25.1334080369896; Tue,
	10 Apr 2012 10:52:49 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.229.217.78 with HTTP; Tue, 10 Apr 2012 10:52:28 -0700 (PDT)
In-Reply-To: <CAN2WCR00J1XWDfiOENGOjXLWtphk8BKXmJAQzFRg=-28a_hk2w@mail.gmail.com>
References: <CAN2WCR00J1XWDfiOENGOjXLWtphk8BKXmJAQzFRg=-28a_hk2w@mail.gmail.com>
From: Steven EYCHENNE <steven.eychenne@telecom-paristech.fr>
Date: Tue, 10 Apr 2012 19:52:28 +0200
X-Google-Sender-Auth: cXClUUWZ9jTpBUUDQl620kMGyt4
Message-ID: <CAN2WCR2gFhojeV4m2Jd2OW1AtVULzMTQCA3ATLg1HktOEQEveg@mail.gmail.com>
To: xen-users@lists.xen.org
Content-Type: multipart/mixed; boundary=20cf3074d9a88caca204bd56ca3c
Subject: [Xen-users] VT-d BIOS problem with DMAR/ACPI tables | Sabertooth X58
X-BeenThere: xen-users@lists.xen.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen user discussion <xen-users.lists.xen.org>
List-Unsubscribe: <http://lists.xen.org/cgi-bin/mailman/options/xen-users>,
	<mailto:xen-users-request@lists.xen.org?subject=unsubscribe>
List-Post: <mailto:xen-users@lists.xen.org>
List-Help: <mailto:xen-users-request@lists.xen.org?subject=help>
List-Subscribe: <http://lists.xen.org/cgi-bin/mailman/listinfo/xen-users>,
	<mailto:xen-users-request@lists.xen.org?subject=subscribe>
Sender: xen-users-bounces@lists.xen.org
Errors-To: xen-users-bounces@lists.xen.org

--20cf3074d9a88caca204bd56ca3c
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hi,

I'm not able to activate VT-d on my PC due to a buggy BIOS. Xen fails
to parse ACPI DMAR table. There is a problem with RMRR address range.


My configuration is :
- Debian Weezy
- Xen version 4.1.2 (Debian 4.1.2-2)
- Sabertooth X58 with last bios (1304)
- i7 - 960


I have the following message :

(XEN) [VT-D]dmar.c:704: Host address width 39
(XEN) [VT-D]dmar.c:719: found ACPI_DMAR_DRHD:
(XEN) [VT-D]dmar.c:413: =A0 dmaru->address =3D fbfff000
(XEN) [VT-D]iommu.c:1122: drhd->address =3D fbfff000 iommu->reg =3D ffff82c=
3fff57000
(XEN) [VT-D]iommu.c:1124: cap =3D c9008010e60262 ecap =3D f0207a
(XEN) [VT-D]dmar.c:341: =A0 endpoint: 0:1b.0
(XEN) [VT-D]dmar.c:719: found ACPI_DMAR_DRHD:
(XEN) [VT-D]dmar.c:413: =A0 dmaru->address =3D fbffe000
(XEN) [VT-D]iommu.c:1122: drhd->address =3D fbffe000 iommu->reg =3D ffff82c=
3fff56000
(XEN) [VT-D]iommu.c:1124: cap =3D c90780106f0462 ecap =3D f020fe
(XEN) [VT-D]dmar.c:356: =A0 IOAPIC: f0:1f.7
(XEN) [VT-D]dmar.c:356: =A0 IOAPIC: 0:13.0
(XEN) [VT-D]dmar.c:427: =A0 flags: INCLUDE_ALL
(XEN) [VT-D]dmar.c:724: found ACPI_DMAR_RMRR:
(XEN) [VT-D]dmar.c:341: =A0 endpoint: 0:1d.0
(XEN) [VT-D]dmar.c:341: =A0 endpoint: 0:1d.1
(XEN) [VT-D]dmar.c:341: =A0 endpoint: 0:1d.2
(XEN) [VT-D]dmar.c:341: =A0 endpoint: 0:1d.7
(XEN) [VT-D]dmar.c:341: =A0 endpoint: 0:1a.0
(XEN) [VT-D]dmar.c:341: =A0 endpoint: 0:1a.1
(XEN) [VT-D]dmar.c:341: =A0 endpoint: 0:1a.2
(XEN) [VT-D]dmar.c:341: =A0 endpoint: 0:1a.7
(XEN) [VT-D]dmar.c:595: =A0 RMRR region: base_addr ec000 end_address effff
(XEN) [VT-D]dmar.c:724: found ACPI_DMAR_RMRR:
(XEN) [VT-D]dmar.c:528: =A0 RMRR address range not in reserved memory
base =3D bf7da000 end =3D bf7d9fff; iommu_inclusive_mapping=3D1 parameter
may be needed.
(XEN) [VT-D]dmar.c:341: =A0 endpoint: 0:1d.0
(XEN) [VT-D]dmar.c:341: =A0 endpoint: 0:1d.1
(XEN) [VT-D]dmar.c:341: =A0 endpoint: 0:1d.2
(XEN) [VT-D]dmar.c:341: =A0 endpoint: 0:1d.7
(XEN) [VT-D]dmar.c:341: =A0 endpoint: 0:1a.0
(XEN) [VT-D]dmar.c:341: =A0 endpoint: 0:1a.1
(XEN) [VT-D]dmar.c:341: =A0 endpoint: 0:1a.2
(XEN) [VT-D]dmar.c:341: =A0 endpoint: 0:1a.7
(XEN) [VT-D]dmar.c:585: =A0 The RMRR (bf7da000, bf7d9fff) is incorrect!
(XEN) Failed to parse ACPI DMAR. =A0Disabling VT-d.


"If Xen complains about broken BIOS, let the motherboard/system vendor
know about it."

I opened a case on Asus Support website. Their first response was to
give me the documentation page of the motherboard about VT-d and to
declare that Linux is not supported.

I confirmed that I activated the VT-d option in the BIOS and I
declared that I can make any test on any platform. I had a response a
few days ago that the case was transmit to Asus Headquarters. (ASUS
CASEID=3DRTM2012040201379-727) Let's see what happened.


"Intel developers also want to know about broken IOMMU/VT-d BIOS
implementations, see this email:
http://lists.xensource.com/archives/html/xen-devel/2010-01/msg00841.html,
so let them know all the details about your hardware and software if
you have broken BIOS."

How ?


Do you have any suggestion ?


Thanks in advance.


I have joined the output of :
- acpidump -b -o acpidump-b.txt
- lspci
- lspci -vvvknn
- xm dmesg
- xm info
- the extraction of the DMAR table


Regards,
Steven

--20cf3074d9a88caca204bd56ca3c
Content-Type: text/plain; name="acpidump-b.txt"
Content-Disposition: attachment; filename="acpidump-b.txt"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h0tzjyqj1

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARFNEVGnEAAAB20ExNjgyAEExNjgy
MDAxAQAAAElOVEwTAQYgEEcSX1BSX1uDC1AwMDEBEAgAAAYGUDAwMUNQVTFbgwtQMDAyAgAAAAAA
BlAwMDJDUFUyW4MLUDAwMwMAAAAAAAZQMDAzQ1BVM1uDC1AwMDQEAAAAAAAGUDAwNENQVTRbgwtQ
MDA1BQAAAAAABlAwMDVDUFU1W4MLUDAwNgYAAAAAAAZQMDA2Q1BVNluDC1AwMDcHAAAAAAAGUDAw
N0NQVTdbgwtQMDA4CAAAAAAABlAwMDhDUFU4W4MLUDAwOQkAAAAAAAZQMDA5Q1BVOVuDC1AwMTAN
CgAAAAAAW4MLUDAxMQsAAAAAAFuDC1AwMTIMAAAAAABbgwtQMDEzDQAAAAAAW4MLUDAxNA4AAAAA
AFuDC1AwMTUPAAAAAABbgwtQMDE2EAAAAAAACERQODANCoAIRFA5MA0KkAhXS1RQAAhTUElPDQou
CElPSFcLkAIISU9TQgAISU9TTA0KEAhJT0hCC5ACCElPSEwNChAIU01JUA0KsghQTUJTCwAICFBN
TE4NCoAIR1BCUwsABQhHUExODQqACFNNQkwACFBNMzALMAgIU1VTVw0K/whUUEJBDAAA1P4IVFBC
TAAIQVBJQwEIR0VCUwsABghHRUxODQoICFBDSUIMAAAA4AhQQ0lMDAAAABAIU01CUwsAEAhDUFVD
DQoQW4BCSU9TAAxkgHm/DQr/W4FGDQpCSU9TAVNTMV8BU1MyXwFTUzNfAVNTNF8BAARJT1NUEFRP
UE0gUk9NUyBNRzFCIE1HMUwgTUcyQiBNRzJMIAAIRE1BWAhIUFRBIENQQjAgQ1BCMSBDUEIyIENQ
QjMgQVNTQghBT1RCCEFBWEIgU01JRghEVFNFCERUUzEIRFRTMghNUEVOCFRQTUYITUczQiBNRzNM
IE1IMUIgTUgxTCBPU1RQCBQPUlJJTwRwDVJSSU8AWzEUD1JETUEDcA1yRE1BAFsxCFBJQ00AFB9f
UElDAaAJaHANCqpEQkc4oQhwDQqsREJHOHBoUElDTQhPU1ZS/xRDDQpPU0ZMAKANkpNPU1ZS/6RP
U1ZSCF9UXzAAcE9TWVNfVF8woA6TX1RfMAFwDQoDT1NWUqFKBqAOk19UXzANChBwAU9TVlKhSAWg
D5NfVF8wDQoRcA0KAk9TVlKhRQSgD5NfVF8wDQoScA0KBE9TVlKhMqAOk19UXzANChNwAE9TVlKh
IaAOk19UXzANChRwAE9TVlKhEKAOk19UXzANChVwAE9TVlKkT1NWUhROBE1DVEgCoAiVh2iHaaQA
codoAWAIQlVGMBECYAhCVUYxEQJgcGhCVUYwcGlCVUYxohpgdmCgFZKTg4hCVUYwYACDiEJVRjFg
AKQApAEIUFJXUBIEAgAAFEsHR1BSVwJwaIhQUldQAABweVNTMV8BAGB9YHlTUzJfDQoCAGB9YHlT
UzNfDQoDAGB9YHlTUzRfDQoEAGCgEXt5AWkAYABwaYhQUldQAQChKXpgAWCgGJGTT1NGTAGTT1NG
TA0KAoFgiFBSV1ABAKENCoJgiFBSV1ABAKRQUldQCFdBS1ASBAIAAFuAREVCMAFEUDgwAVuBC0RF
QjABREJHOAhbgERFQjEBRFA5MA0KAluBC0RFQjECREJHORAURBRPU1lTAHANChBgoEEMWxJfT1NJ
YaAXX09TSQ1XaW5kb3dzIDIwMDAAcA0KEmCgF19PU0kNV2luZG93cyAyMDAxAHANChNgoBtfT1NJ
DVdpbmRvd3MgMjAwMSBTUDEAcA0KE2CgG19PU0kNV2luZG93cyAyMDAxIFNQMgBwDQoTYKAZX09T
SQ1XaW5kb3dzIDIwMDEuMQBwDQoUYKAdX09TSQ1XaW5kb3dzIDIwMDEuMSBTUDEAcA0KFGCgF19P
U0kNV2luZG93cyAyMDA2AHANChVgoUQHoCNNQ1RIX09TXw1NaWNyb3NvZnQgV2luZG93cyBOVABw
DQoSYKFNBKA2TUNUSF9PU18NTWljcm9zb2Z0IFdpbmRvd3NNRTogTWlsbGVubml1bSBFZGl0aW9u
AHANChFgoBNNQ1RIX09TXw1MaW51eABwAWCkYBCE5gVfU0JfCFBSMDASRjtCEgsEC///AExOS0EA
EgsEC///AUxOS0IAEgwEC///DQoCTE5LQwASDAQL//8NCgNMTktEABINBAz//wQAAExOS0EAEg0E
DP//BAABTE5LQgASDgQM//8EAA0KAkxOS0MAEg4EDP//BAANCgNMTktEABINBAz//wUAAExOS0EA
Eg0EDP//BQABTE5LQgASDgQM//8FAA0KAkxOS0MAEg4EDP//BQANCgNMTktEABINBAz//wYAAExO
S0EAEg0EDP//BgABTE5LQgASDgQM//8GAA0KAkxOS0MAEg4EDP//BgANCgNMTktEABINBAz//wgA
AExOS0EAEg0EDP//CAABTE5LQgASDgQM//8IAA0KAkxOS0MAEg4EDP//CAANCgNMTktEABINBAz/
/wkAAExOS0EAEg0EDP//CQABTE5LQgASDgQM//8JAA0KAkxOS0MAEg4EDP//CQANCgNMTktEABIN
BAz//w0KAABMTktBABINBAz//w0KAAFMTktCABIOBAz//w0KAA0KAkxOS0MAEg4EDP//DQoADQoD
TE5LRAASDQQM//8NAABMTktBABINBAz//xYAAExOS0EAEg0EDP//FgABTE5LQgASDgQM//8WAA0K
AkxOS0MAEg4EDP//FgANCgNMTktEABIOBAz//x8ADQoCTE5LQwASDQQM//8dAABMTktIABINBAz/
/x0AAUxOS0QAEg4EDP//HQANCgJMTktDABIOBAz//x0ADQoDTE5LQQASDQQM//8aAABMTktBABIN
BAz//xoAAUxOS0YAEg4EDP//GgANCgNMTktEABIOBAz//xoADQoCTE5LQwASDQQM//8bAABMTktH
ABINBAz//xwAAExOS0IAEg0EDP//HAABTE5LQQASDgQM//8cAA0KAkxOS0MAEg4EDP//HAANCgNM
TktEABINBAz//wEAAExOS0EAEg0EDP//AQABTE5LQgASDgQM//8BAA0KAkxOS0MAEg4EDP//AQAN
CgNMTktEABINBAz//wIAAExOS0EAEg0EDP//AgABTE5LQgASDgQM//8CAA0KAkxOS0MAEg4EDP//
AgANCgNMTktEABINBAz//wMAAExOS0EAEg0EDP//AwABTE5LQgASDgQM//8DAA0KAkxOS0MAEg4E
DP//AwANCgNMTktEABINBAz//wcAAExOS0EAEg0EDP//BwABTE5LQgASDgQM//8HAA0KAkxOS0MA
Eg4EDP//BwANCgNMTktEABINBAz//xkAAExOS0UAEg0EDP//HwAATE5LQwASDQQM//8fAAFMTktF
AAhBUjAwEkYyQRIJBAv//wAADQovEgkEC///AQANCi4SDQoEC///DQoCAA0KLhINCgQL//8NCgMA
DQotEgsEDP//BAAAAA0KGRILBAz//wQAAQANCiMSDAQM//8EAA0KAgANCiQSDAQM//8EAA0KAwAN
CiISCwQM//8FAAAADQoaEgsEDP//BQABAA0KGRIMBAz//wUADQoCAA0KGxIMBAz//wUADQoDAA0K
HRILBAz//wYAAAANChsSCwQM//8GAAEADQomEgwEDP//BgANCgIADQolEgwEDP//BgANCgMADQon
EgsEDP//CAAAAA0KHxILBAz//wgAAQANCicSDAQM//8IAA0KAgANCiYSDAQM//8IAA0KAwANCiUS
CwQM//8JAAAADQogEgsEDP//CQABAA0KKhIMBAz//wkADQoCAA0KLxIMBAz//wkADQoDAA0KKRIL
BAz//w0KAAAADQohEgsEDP//DQoAAQANCh8SDAQM//8NCgANCgIADQouEgwEDP//DQoADQoDAA0K
LRILBAz//xYAAAANCisSCwQM//8WAAEADQosEgwEDP//FgANCgIADQotEgwEDP//FgANCgMADQou
EgwEDP//HwANCgIADQoSEgsEDP//HQAAAA0KFxILBAz//x0AAQANChMSDAQM//8dAA0KAgANChIS
DAQM//8dAA0KAwANChASCwQM//8aAAAADQoQEgsEDP//GgABAA0KFRIMBAz//xoADQoDAA0KExIM
BAz//xoADQoCAA0KEhILBAz//xsAAAANChYSCwQM//8cAAAADQoREgsEDP//HAABAA0KEBIMBAz/
/xwADQoCAA0KEhIMBAz//xwADQoDAA0KExILBAz//wEAAAANChwSCwQM//8BAAEADQooEgwEDP//
AQANCgIADQopEgwEDP//AQANCgMADQovEgsEDP//AgAAAA0KHRILBAz//wIAAQANCikSDAQM//8C
AA0KAgANCigSDAQM//8CAA0KAwANCioSCwQM//8DAAAADQoYEgsEDP//AwABAA0KIhIMBAz//wMA
DQoCAA0KIxIMBAz//wMADQoDAA0KJBILBAz//wcAAAANCh4SCwQM//8HAAEADQolEgwEDP//BwAN
CgIADQonEgwEDP//BwANCgMADQomEgsEDP//GQAAAA0KFBILBAz//x8AAAANChISCwQM//8fAAEA
DQoUCFBSMTESNAQSCwQL//8ATE5LQQASCwQL//8BTE5LQgASDAQL//8NCgJMTktDABIMBAv//w0K
A0xOS0QACEFSMTESLAQSCQQL//8AAA0KHBIJBAv//wEADQooEg0KBAv//w0KAgANCikSDQoEC///
DQoDAA0KLwhQUjEyEjQEEgsEC///AExOS0EAEgsEC///AUxOS0IAEgwEC///DQoCTE5LQwASDAQL
//8NCgNMTktEAAhBUjEyEiwEEgkEC///AAANCh0SCQQL//8BAA0KKRINCgQL//8NCgIADQooEg0K
BAv//w0KAwANCioIUFIxMxI0BBILBAv//wBMTktBABILBAv//wFMTktCABIMBAv//w0KAkxOS0MA
EgwEC///DQoDTE5LRAAIQVIxMxIsBBIJBAv//wAADQoYEgkEC///AQANCiISDQoEC///DQoCAA0K
IxINCgQL//8NCgMADQokCFBSMTQSNAQSCwQL//8ATE5LQQASCwQL//8BTE5LQgASDAQL//8NCgJM
TktDABIMBAv//w0KA0xOS0QACEFSMTQSLAQSCQQL//8AAA0KGRIJBAv//wEADQojEg0KBAv//w0K
AgANCiQSDQoEC///DQoDAA0KIghQUjE1EjQEEgsEC///AExOS0EAEgsEC///AUxOS0IAEgwEC///
DQoCTE5LQwASDAQL//8NCgNMTktEAAhBUjE1EiwEEgkEC///AAANChoSCQQL//8BAA0KGRINCgQL
//8NCgIADQobEg0KBAv//w0KAwANCh0IUFIxNhI0BBILBAv//wBMTktBABILBAv//wFMTktCABIM
BAv//w0KAkxOS0MAEgwEC///DQoDTE5LRAAIQVIxNhIsBBIJBAv//wAADQobEgkEC///AQANCiYS
DQoEC///DQoCAA0KJRINCgQL//8NCgMADQonCFBSMTcSNAQSCwQL//8ATE5LQQASCwQL//8BTE5L
QgASDAQL//8NCgJMTktDABIMBAv//w0KA0xOS0QACEFSMTcSLAQSCQQL//8AAA0KHhIJBAv//wEA
DQolEg0KBAv//w0KAgANCicSDQoEC///DQoDAA0KJghQUjE4EjQEEgsEC///AExOS0EAEgsEC///
AUxOS0IAEgwEC///DQoCTE5LQwASDAQL//8NCgNMTktEAAhBUjE4EiwEEgkEC///AAANCh8SCQQL
//8BAA0KJxINCgQL//8NCgIADQomEg0KBAv//w0KAwANCiUIUFIxORI0BBILBAv//wBMTktBABIL
BAv//wFMTktCABIMBAv//w0KAkxOS0MAEgwEC///DQoDTE5LRAAIQVIxORIsBBIJBAv//wAADQog
EgkEC///AQANCioSDQoEC///DQoCAA0KLxINCgQL//8NCgMADQopCFBSMUESNAQSCwQL//8ATE5L
QQASCwQL//8BTE5LQgASDAQL//8NCgJMTktDABIMBAv//w0KA0xOS0QACEFSMUESLAQSCQQL//8A
AA0KIRIJBAv//wEADQofEg0KBAv//w0KAgANCi4SDQoEC///DQoDAA0KLQhQUjA0EjQEEgsEC///
AExOS0EAEgsEC///AUxOS0IAEgwEC///DQoCTE5LQwASDAQL//8NCgNMTktEAAhBUjA0EiwEEgkE
C///AAANChASCQQL//8BAA0KERINCgQL//8NCgIADQoSEg0KBAv//w0KAwANChMIUFIwNRI0BBIL
BAv//wBMTktCABILBAv//wFMTktDABIMBAv//w0KAkxOS0QAEgwEC///DQoDTE5LQQAIQVIwNRIs
BBIJBAv//wAADQoREgkEC///AQANChISDQoEC///DQoCAA0KExINCgQL//8NCgMADQoQCFBSMDYS
NAQSCwQL//8ATE5LQwASCwQL//8BTE5LRAASDAQL//8NCgJMTktBABIMBAv//w0KA0xOS0IACEFS
MDYSLAQSCQQL//8AAA0KEhIJBAv//wEADQoTEg0KBAv//w0KAgANChASDQoEC///DQoDAA0KEQhQ
UjA3EjQEEgsEC///AExOS0QAEgsEC///AUxOS0EAEgwEC///DQoCTE5LQgASDAQL//8NCgNMTktD
AAhBUjA3EiwEEgkEC///AAANChMSCQQL//8BAA0KEBINCgQL//8NCgIADQoREg0KBAv//w0KAwAN
ChIIUFIwOBI0BBILBAv//wBMTktBABILBAv//wFMTktCABIMBAv//w0KAkxOS0MAEgwEC///DQoD
TE5LRAAIQVIwOBIsBBIJBAv//wAADQoQEgkEC///AQANChESDQoEC///DQoCAA0KEhINCgQL//8N
CgMADQoTCFBSMDkSNAQSCwQL//8ATE5LQgASCwQL//8BTE5LQwASDAQL//8NCgJMTktEABIMBAv/
/w0KA0xOS0EACEFSMDkSLAQSCQQL//8AAA0KERIJBAv//wEADQoSEg0KBAv//w0KAgANChMSDQoE
C///DQoDAA0KEAhQUjAxEkEFBhILBAv//wBMTktBABILBAv//wFMTktCABIMBAv//w0KAkxOS0MA
EgwEC///DQoDTE5LRAASDQQM//8BAABMTktEABINBAz//wIAAExOS0MACEFSMDESRQQGEgkEC///
AAANChASCQQL//8BAA0KERINCgQL//8NCgIADQoSEg0KBAv//w0KAwANChMSCwQM//8BAAAADQoT
EgsEDP//AgAAAA0KEghQUlNBEQkNCgYj2NwYeQAGUFJTQVBSU0IGUFJTQVBSU0MGUFJTQVBSU0QG
UFJTQVBSU0UGUFJTQVBSU0YGUFJTQVBSU0cGUFJTQVBSU0hbgozMBFBDSTAIX0hJRAxB0A0KCAhf
Q0lEDEHQDQoDCF9BRFIAFAleQk4wMACkABQLX0JCTgCkQk4wMAhfVUlEABQWX1BSVACgDQpQSUNN
pEFSMDCkUFIwMFuCSwZJT0hfCF9ISUQMQdAMAQhfVUlEDQoNCghfQ1JTEU4EDQpKhgkAAQAA8PsA
ABAAhgkAAQAAAPwAAAABhgkAAQAAAP0AAAABhgkAAQAAAP4AAMAAhgkAAQCgyP4AEAAAhgkAAQAA
0f4AEAAAeQAUBk5QVFMBFAZOV0FLAVuCNk5QRTQIX0FEUgwAAAQAFA9fUFJXAKRHUFJXDQoJDQoE
FBZfUFJUAKANClBJQ02kQVIxNKRQUjE0W4I2TlBFNQhfQURSDAAABQAUD19QUlcApEdQUlcNCgkN
CgQUFl9QUlQAoA0KUElDTaRBUjE1pFBSMTVbgjZOUEU2CF9BRFIMAAAGABQPX1BSVwCkR1BSVw0K
CQ0KBBQWX1BSVACgDQpQSUNNpEFSMTakUFIxNluCNk5QRTgIX0FEUgwAAAgAFA9fUFJXAKRHUFJX
DQoJDQoEFBZfUFJUAKANClBJQ02kQVIxOKRQUjE4W4I2TlBFOQhfQURSDAAACQAUD19QUlcApEdQ
UlcNCgkNCgQUFl9QUlQAoA0KUElDTaRBUjE5pFBSMTlbgjZOUEVBCF9BRFIMAAANCgAUD19QUlcA
pEdQUlcNCgkNCgQUFl9QUlQAoA0KUElDTaRBUjFBpFBSMUFbgjZQMFAxCF9BRFIMAAAeABQPX1BS
VwCkR1BSVw0KCw0KBBQWX1BSVACgDQpQSUNNpEFSMDGkUFIwMVuCh+EBU0JSRwhfQURSDAAAHwBb
gkgLSUVMSwhfSElEDUFXWTAwMDEAW4BSWEEwAg0KoA0KIFuBMVJYQTABAAlQQkxWAQBGBwABUEJN
UwEAAVBNQ1MBRUNOUwEAA0VDVDEQRUxFTgEABxQ7XC5fR1BFX0wwQQCGXC8EX1NCX1BDSTBTQlJH
SUVMSw0KgXABXC8FX1NCX1BDSTBTQlJHSUVMS1BNQ1MUE19TVEEAoAhFTEVOpA0KD6EDpAAUBlNN
T0QBFA5HUEJTAKR/UEJMVgEAFBhTUFRTAXABUFMxU3ABUFMxRXABU0xQUxQyU1dBSwFwAFNMUFNw
AFBTMUWgCZCTaAFSVENToRWgDQqQk2gNCgNCUlRDoQiGUFdSQg0KAluAQVBNUAFTTUlQDQoCW4EQ
QVBNUAFBUE1DCEFQTVMIW4EPQVBNUAEACAABQlJUQwFbgFBNUzABUE1CUw0KBFuBHVBNUzABAA0K
UlRDUwEABFdBS1MBAAhQV0JUAQAHW4BTTUlFAVBNMzANCghbgRZTTUlFAQAEUFMxRQEAH1BTMVMB
ABsQDFxfU0JfCFNMUFMAW4IrUElDXwhfSElEC0HQCF9DUlMRGA0KFUcBIAAgAAACRwGgAKAAAAIi
BAB5AFuCTgRETUFECF9ISUQMQdACAAhfQ1JTETgNCjUqEARHAQAAAAAAEEcBgQCBAAADRwGHAIcA
AAFHAYkAiQAAA0cBjwCPAAABRwHAAMAAACB5AFuCJVRNUl8IX0hJRAxB0AEACF9DUlMREA0KDUcB
QABAAAAEIgEAeQBbgiVSVEMwCF9ISUQMQdALAAhfQ1JTERANCg1HAXAAcAAAAiIAAXkAW4IiU1BL
UghfSElEDEHQCAAIX0NSUxENCg0KRwFhAGEAAAF5AFuCJUNPUFIIX0hJRAxB0AwECF9DUlMREA0K
DUcB8ADwAAAQIgAgeQBbgkASU0lPUghfSElEDEHQDAIUC19VSUQApFNQSU8IQ1JTXxEdDQoaRwEA
AAAAAABHAQAAAAAAAEcBAAAAAAAAeQAUQA5fQ1JTAKBNBJCSk1NQSU8L8AOUU1BJTw0K8ItDUlNf
DQoCR1AxMItDUlNfDQoER1AxMYxDUlNfDQoHR1BMMXBTUElPR1AxMHBTUElPR1AxMXANCgJHUEwx
oEIESU9TQotDUlNfDQoNCkdQMjCLQ1JTXw0KDEdQMjGMQ1JTXw0KD0dQTDJwSU9TQkdQMjBwSU9T
QkdQMjFwSU9TTEdQTDKgQgRJT0hCi0NSU18NChJHUDMwi0NSU18NChRHUDMxjENSU18NChdHUEwz
cElPSEJHUDMwcElPSEJHUDMxcElPSExHUEwzpENSU18IRENBVBIsFg0KAg0KAwEADQr/DQr/DQr/
DQr/DQr/DQr/DQr/DQr/DQr/DQr/DQr/DQr/DQoGDQoJDQr/DQr/DQr/DQr/FBpFTkZHAXANCodJ
TkRYcA0Kh0lORFhwaExETl8UDUVYRkcAcA0KqklORFgUHUxQVE0BRU5GR0NHTERoe09QVDANCgJg
RVhGR6RgFC9VSElEAaAik2gBRU5GR0NHTERoe09QVDENCjhgRVhGR6AIYKQMQdAFEKQMQdAFARQy
U0lPSwFFTkZHDQoNCnsNCv9PUFQzT1BUM3toAWB9T1BUMmBPUFQycHtoAQBBQ1RSRVhGRwhLQkZH
AQhNU0ZHAQhVMUZHAQhVMkZHAVuAS0JSVwENCmANCgVbgRJLQlJXAUtQNjAIABhLUDY0CFuAS0I2
NAENCmQBW4EPS0I2NAEAAUtSRFkBAAYUTQxTSU9TAXANU0lPUwBbMXtDUkUwDQofQ1JFMKA1k2gB
U0lPS/9FTkZHDQoNCqAQS0JGR31PUFQ2DQoQT1BUNqAQTVNGR31PUFQ2DQogT1BUNkVYRkegSweR
k2gNCgOTaA0KBKA2V0tUUFNJT0v/RU5GRw0KDQqgEEtCRkd9T1BUNg0KEE9QVDagEE1TRkd9T1BU
Ng0KIE9QVDZFWEZHoThFTkZHDQoNCqAQS0JGR31DUkUwDQpBQ1JFMKAbTVNGR31DUkUwDQoiQ1JF
MH1DUkU2DQqAQ1JFNkVYRkcUSwRTSU9XAXANU0lPVwBbMVNJT0sARU5GRw0KDQp7T1BUNg0Kz09Q
VDZ7T1BUMg0K/k9QVDJ7Q1JFMA0KHUNSRTB7Q1JFNg0Kf0NSRTZFWEZHFDxTSU9IAHANU0lPSABb
MUVORkcNCg0KoBB7T1BUMw0KEACGUFMySw0KAqAQe09QVDMNCiAAhlBTMk0NCgJTSU9LAFuASU9J
RAFTUElPDQoCW4EQSU9JRAFJTkRYCERBVEEIW4ZHC0lORFhEQVRBAQA4TEROXwgAQA1GRENQAQAC
TFBUUAFVUkFQAVVSQlABAEoEQ1IyQwgAGEFDVFIIAEgXSU9BSAhJT0FMCElPSDIISU9MMggAQAZJ
TlRSCAAYRE1DSAgASDVDUkUwCENSRTEIQ1JFMghDUkUzCENSRTQIQ1JFNQhDUkU2CENSRTcIQ1JF
OAhDUkU5CAAwT1BUMAhPUFQxCE9QVDIIT1BUMwhPUFQ0CAAIT1BUNggUD0NHTEQBpIOIRENBVGgA
FE4ERFNUQQFFTkZHQ0dMRGhwQUNUUmBFWEZHoAeTYA0K/6QAe2ABYH1JT1NUeWBoAElPU1SgBWCk
DQoPoRSgDnt5AWgASU9TVACkDQoNoQOkABRPBERDTlQCRU5GR0NHTERoeUlPQUgNCghhfUlPQUxh
YaAckJVETUNIDQoEkpN7RE1DSA0KA2EAUkRNQWhpdWFwaUFDVFJSUklPaGlhDQoIRVhGRwhDUlMx
ERMNChBHAQAAAAABACIAACoAAHkAi0NSUzENCglJUlFNjENSUzENCgxETUFNi0NSUzENCgJJTzEx
i0NSUzENCgRJTzEyjENSUzENCgdMRU4xCENSUzIRGw0KGEcBAAAAAAEARwEAAAAAAQAiQAAqBAB5
AItDUlMyDQoRSVJRRYxDUlMyDQoURE1BRYtDUlMyDQoCSU8yMYtDUlMyDQoESU8yMoxDUlMyDQoH
TEVOMotDUlMyDQoNCklPMzGLQ1JTMg0KDElPMzKMQ1JTMg0KD0xFTjMURghEQ1JTAkVORkdDR0xE
aHlJT0FIDQoISU8xMX1JT0FMSU8xMUlPMTFwSU8xMUlPMTJ0gklPMTEAAWB5AWBMRU4xoA9JTlRS
eQFJTlRSSVJRTaEHcABJUlFNoBKRlERNQ0gNCgOTaQBwAERNQU2hEHtETUNIDQoDYXkBYURNQU1F
WEZHpENSUzEUQw0KRFNSUwKLaA0KCUlSUU2MaA0KDERNQU2LaA0KAklPMTFFTkZHQ0dMRGl5SU9B
SA0KCGF9SU9BTGFhUlJJT2kAYQ0KCFJSSU9pAUlPMTENCgh7SU8xMQ0K/0lPQUx6SU8xMQ0KCElP
QUigEklSUU2CSVJRTWB0YAFJTlRSoQdwAElOVFKgEkRNQU2CRE1BTWB0YAFETUNIoQhwDQoERE1D
SEVYRkdEQ05UaQFbgkImUk1TQwhfSElEDEHQDAIIX1VJRA0KEAhDUlNfEUIMDQq+RwEQABAAABBH
ASIAIgAAHkcBRABEAAANCkcBUABQAAAQRwFiAGIAAAJHAWUAZQAAC0cBcgByAAAORwGAAIAAAAFH
AYQAhAAAA0cBiACIAAABRwGMAIwAAANHAZAAkAAAEEcBogCiAAAeRwHgAOAAABBHAdAE0AQAAkcB
AAAAAAAARwEAAAAAAABHAQAAAAAAAEcBAAAAAAAAhgkAAQDA0f4AQAAAhgkAAQAAAAAAAAAAhgkA
AQAAAAAAAAAAeQAUQhhfQ1JTAItDUlNfDQp6R1AwMItDUlNfDQp8R1AwMYxDUlNfDQp/R1AwTHBQ
TUJTR1AwMHBQTUJTR1AwMXBQTUxOR1AwTKBCBFNNQlOLQ1JTXw0KgkdQMTCLQ1JTXw0KhEdQMTGM
Q1JTXw0Kh0dQMUxwU01CU0dQMTBwU01CU0dQMTFwU01CTEdQMUygQgRHUEJTi0NSU18NCopHUDIw
i0NSU18NCoxHUDIxjENSU18NCo9HUDJMcEdQQlNHUDIwcEdQQlNHUDIxcEdQTE5HUDJMoEIER0VC
U4tDUlNfDQqSR1AzMItDUlNfDQqUR1AzMYxDUlNfDQqXR1AzTHBHRUJTR1AzMHBHRUJTR1AzMXBH
RUxOR1AzTIpDUlNfDQqsVE1MMYpDUlNfDQqoVE1CMYpDUlNfDQq4VE1MMopDUlNfDQq0VE1CMnAM
AADS/lRNQjF0VFBCQQwAANL+VE1MMaASVFBNRnJUUEJBVFBCTFRNQjKhC3JUUEJBAFRNQjJ0DAAA
2f5UTUIyVE1MMqRDUlNfEEYQXABbgFJBTVcADACgfb8MAAABAFuBFVJBTVcBUEFSMCBQQVIxIFBB
UjIgW4BJT0IyAQ0Ksg0KAluBEElPQjIBU01JQwhTTUlTCBQMSVNNSQlwaFNNSUMUF0dOVlMJcGhQ
QVIwSVNNSQ0KcKRQQVIxFBhTTlZTDQpwaFBBUjBwaVBBUjFJU01JDQpxFB5TTVNSC3BoUEFSMHBp
UEFSMXBqUEFSMklTTUkNCnkUF0dNQVgJcGhQQVIwSVNNSQ0KeqRQQVIxFBdHTURYCXBoUEFSMElT
TUkNCnukUEFSMRQXR0NBWAlwaFBBUjBJU01JDQp8pFBBUjEUF0dDRFgJcGhQQVIwSVNNSQ0KfaRQ
QVIxEEJfXC8DX1NCX1BDSTBTQlJHW4JPXUFTT0MIX0hJRA1BVEswMTEwAAhfVUlEDBABAQEITVZJ
RA0KPhQJX1NUQQCkDQoPFA5fSU5JAENVUElVTVZUFE8bQ1VQSQBwR05WUwuggmFwYYhHM0MyDQoE
AHANCilgdGBhiEczQzINCgYAdEdOVlMLoIJhiEczQzINCgMAe0dNQVgLmAENCv9loEEMkX2VZUdO
VlMLoIJ9e3pHTURYC6ABDQoGAAEAe0dNRFgLmQEBAAAAk3t6R01BWA0Kzg0KHAABAACgKJN7ekdN
QVgNCs4NChwAAQAAcAwAAABAiEczQzINCgIAcACIRzNEUw0KBgChQAZ6R01BWA0KNQ0KEIhHM0RT
DQoGAKAskZVlR05WUwuggpCTZUdOVlMLoIKTR05WUwveFgFwDAAAAECIRzNDMg0KAgChH3tHTUFY
C60BDQr/YnRig4hHM0MyDQoEAIhHM0MyDQoDAKEwe0dNQVgLrQENCv9idGKDiEczQzINCgQAiEcz
QzINCgMAekdNQVgNCjUNChCIRzNEUw0KBgBwUkJMSw0K0gANCiFDTEtSjENMS1INCh1DQjI5cIOI
RzNUQntDQjI5DQoPAABkoByTZA0KBnALECeIRzNDMA0KBABwDQqXiEczQzANCgYAoT+gHZNkDQoE
cAsgTohHM0MwDQoEAHALLQGIRzNDMA0KBgChH6Adk2QNCgNwCyBOiEczQzANCgQAcAstAYhHM0Mw
DQoGABROB1VNVlQARU5GRw0KCaA5e09QVDENCgQAcAxI6AH+iEczQzENCgQAdA0Kek1WSURgoAiV
YA0KN3AAYKEGdGANCjdgcGCIRzNDMQ0KAwChEHQNCnpNVklEiEczQzENCgMAcA0KQYhHM0MzDQoG
AKAWk3tPUFQxDQoIAABwDQp/iEczRDINCgYARVhGRwhNQklGEiMIDQoDDVA2VC1EZWx1eGUADAMC
AQMMAAEAAgwAAADgDQoCAAAIQVNCRhELDQoIAAAAAAAAAACKQVNCRgBBU0IwikFTQkYNCgRBU0Ix
FEkNCkdHUlAJCF9UXzAAcGhfVF8woAyTX1RfMACkR1JQMKFICKANk19UXzANCgOkR1JQM6FHB6AN
k19UXzANCgSkR1JQNKFGBqANk19UXzANCgWkR1JQNaFFBaANk19UXzANCgakR1JQNqFEBKANk19U
XzANCgmkR1JQOaEzoA2TX1RfMA0KC6RHUlBCoSOgDZNfVF8wDQoOpEdSUEWhE6ANk19UXzANCg+k
R1JQRqEDpAAURg5HSVRNCYpoAFBSTTCMaA0KA0dQSURwAUFTQjAIX1RfMABwR1BJRF9UXzCgD5Nf
VF8wAEdJVDBQUk0woUUNCqAQk19UXzANCgNHSVQzUFJNMKFBCaAQk19UXzANCgRHSVQ0UFJNMKFN
B6AQk19UXzANCgVHSVQ1UFJNMKFJBqAQk19UXzANCgZHSVQ2UFJNMKFFBaAQk19UXzANCglHSVQ5
UFJNMKFBBKAQk19UXzANCgtHSVRCUFJNMKEtoBCTX1RfMA0KDkdJVEVQUk0woRqgEJNfVF8wDQoP
R0lURlBSTTChB3AAQVNCMKRBU0JGFE4TU0lUTQmKaABQUk0wimgNCgRQUk0ximgNCghQUk0yjGgN
CgNHUElEcAFBU0IwCF9UXzAAcEdQSURfVF8woBeTX1RfMABTSVQwUFJNMFBSTTFQUk0yoUUOoBiT
X1RfMA0KA1NJVDNQUk0wUFJNMVBSTTKhSQygGJNfVF8wDQoEU0lUNFBSTTBQUk0xUFJNMqFNDQqg
GJNfVF8wDQoFU0lUNVBSTTBQUk0xUFJNMqFBCaAYk19UXzANCgZTSVQ2UFJNMFBSTTFQUk0yoUUH
oBiTX1RfMA0KCVNJVDlQUk0wUFJNMVBSTTKhSQWgGJNfVF8wDQoLU0lUQlBSTTBQUk0xUFJNMqE9
oBiTX1RfMA0KDlNJVEVQUk0wUFJNMVBSTTKhIqAYk19UXzANCg9TSVRGUFJNMFBSTTFQUk0yoQdw
AEFTQjCkQVNCRhQgT1AyVgJwg4hpDQoEAGBwg4hpDQoFAGF3aGFhcmBhYKRgFCFWMk9QAnCDiGkN
CgQAYHCDiGkNCgUAYXRoYGB4YGFhYKRgW4JMCUhQRVQIX0hJRAxB0AEDCENSU18REQ0KDoYJAAAA
AND+AAQAAHkAW4BeTFBDUgAMBPTR/g0KBFuBFExQQ1IASFBUUwIABUhQVEUBABgUJF9TVEEAoBCT
T1NGTACgCEhQVEWkDQoPoQ0KoAhIUFRFpA0KC6QAFCpfQ1JTAIpDUlNfDQoESFBUX3dIUFRTCwAQ
YHJgDAAA0P5IUFRfpENSU19bgFJYODACAA0K/1uBE1JYODABAEBATFBDRBBMUENFEAhEQlBUEk4E
BBIaCAv4Awv4AgsgAgsoAgs4AgvoAgs4AwvoAxIaCAv4Awv4AgsgAgsoAgs4AgvoAgs4AwvoAxIL
Awt4Awt4Agu8AxIIAgvwAwtwAwhERExUEiEEEgYCAAv4/xIHAg0KBAuP/xIHAg0KCAv//BIHAg0K
DAv/7xRLCVJSSU8EoEwFkJKUaA0KA5KVaABwiYOIREJQVGgAAWoAAABgoD+Sk2D/cIOIg4hERExU
aAAAAGFwg4iDiERETFRoAAEAYnlgYWB7TFBDRGJMUENEfUxQQ0RgTFBDRFdYODJoaaAjk2gNCgig
DZNqCwACV1g4Mg0KCGihD6ANk2oLCAJXWDgyDQoJaKASkJKUaA0KDZKVaA0KDQpXWDgyaGkUJldY
ODICeQFoYKAMaX1MUENFYExQQ0WhDoBgYHtMUENFYExQQ0UUBlJETUEDW4JBC0ZXSF8IX0hJRAwl
1AgACENSU18RHQ0KGoYJAAAAAAAAAAAAAIYJAAAAAAAAAAAAAHkAikNSU18NCgRCUzAwikNSU18N
CghCTDAwikNSU18NChBCUzEwikNSU18NChRCTDEwFEEFX0NSUwBwDAAAgP9ggkZIRDBhdmGgDQph
d2EMAAAIAGFyYGFicGJCUzAwckJTMDAMAABAAEJTMTB0AEJTMTBCTDAwcEJMMDBCTDEwpENSU19b
gkoJRldIRQhfSElEDEHQDAIIX1VJRA0KAwhDUlNfERENCg6GCQAAAAAAAAAAAAB5ABRLBl9DUlMA
ikNSU18NCgRCUzAwikNSU18NCghCTDAwoBmTXl4uRldIX0JTMDAAXl4uRldIX19DUlNyXl4uRldI
X0JTMDBeXi5GV0hfQkwwMEJTMDB0Xl4uRldIX0JTMTBCUzAwQkwwMKRDUlNfW4BGSFIwAg0K2A0K
AluBEkZIUjABRkhEMQQABEZIRDAIEEQVXF9TQl9bgksUVE1BRAhfSElEDCRkAAEIX0NJRAxB0AwC
CElWRVIMAAAAEAhUTVBWEgYEAQEAAAhWTFRWEggEDQoJDQoRAAAIUlBNVhIHBAENCiEAAAhSVEZM
DQr/CE5VTEwSAgAUTgRUU0REAKAUk1JURkwNCv9wR05WUwvoFlJURkygKlJURkxyXl4vBFBDSTBT
QlJHU0lPUkhXVDELrA0KiFRNUFYNCgIApFRNUFahBqROVUxMFEsEVlNERACgFJNSVEZMDQr/cEdO
VlML6BZSVEZMoCdSVEZMcF5eLwRQQ0kwU0JSR1NJT1JIV1YwiFZMVFYNCgIApFZMVFahBqROVUxM
FEsERlNERACgFJNSVEZMDQr/cEdOVlML6BZSVEZMoCdSVEZMcF5eLwRQQ0kwU0JSR1NJT1JIV0Yx
iFJQTVYNCgIApFJQTVahBqROVUxMFAlTRFNQAKQNCg0KW4JDBl5QQ0lFCF9ISUQMQdAMAghfVUlE
DQoRCENSU18REQ0KDoYJAAAAAADgAAAAEHkAFDNfQ1JTAIpDUlNfDQoEQkFTMYpDUlNfDQoITEVO
MXBQQ0lCQkFTMXBQQ0lMTEVOMaRDUlNfECdcX0dQRRQgX0wxQQCGXC8EX1NCX1BDSTBTQlJHQVNP
QwFbIgvoAxBEBEFTT0MIVkVTTAAUK1NQTFYJe2gL//9WRVNMcFZFU0xQQVIwSVNNSQ0KiHB7UEFS
MAv//wBgpGAUC0dQTFYIpFZFU0xbgk4ST01TQwhfSElEDEHQDAIIX1VJRAAIQ1JTXxEdDQoahgkA
AAAAAAAAAAAAhgkAAAAAAAAAAAAAeQAIQ1JTMRElDQoiS2AAAUtkAAGGCQAAAAAAAAAAAACGCQAA
AAAAAAAAAAB5ABRJDF9DUlMAoEYNCkFQSUOKQ1JTXw0KCE1MMDGKQ1JTXw0KBE1CMDGKQ1JTXw0K
FE1MMDKKQ1JTXw0KEE1CMDJwDAAAwP5NQjAxcAsAEE1MMDFwDAAA4P5NQjAycAsAEE1MMDKKQ1JT
MQ0KEE1MMDOKQ1JTMQ0KDE1CMDOKQ1JTMQ0KHE1MMDSKQ1JTMQ0KGE1CMDRwDAAAwP5NQjAzcAsA
EE1MMDNwDAAA4P5NQjA0cAsAEE1MMDR5DQoFDQoNCmCgDXtJT1NUYACkQ1JTX6EGpENSUzFbgkMU
Xl5STUVNCF9ISUQMQdAMAQhfVUlEAQhDUlNfEUIEDQo+hgkAAQAAAAAAAA0KAIYJAAAAAAAAAAAA
AIYJAAAAAA4AAAACAIYJAAEAABAAAAAAAIYJAAAAAAAAAAAAAHkAFEIOX0NSUwCKQ1JTXw0KEEJB
UzGKQ1JTXw0KFExFTjGKQ1JTXw0KHEJBUzKKQ1JTXw0KIExFTjKKQ1JTXw0KLExFTjOKQ1JTXw0K
NEJBUzSKQ1JTXw0KOExFTjSgBU9TRkyhQQagKE1HMUKgIpRNRzFCDAAADABwDAAADABCQVMxdE1H
MUJCQVMxTEVOMaEVcAwAAAwAQkFTMXAMAAACAExFTjGgH3JNRzFCTUcxTGBwYEJBUzJ0DAAAEABC
QVMyTEVOMnRNRzJCDAAAEABMRU4zcE1IMUJCQVM0dABCQVM0TEVONKRDUlNfW4JAC1VBUjEIX1VJ
RAEIX0hJRAxB0AUBFAxfU1RBAKREU1RBABQMX0RJUwBEQ05UAAAUDV9DUlMApERDUlMAABQMX1NS
UwFEU1JTaAAUC19QUlMApENNUFIIQ01QUhFDBQ0KTzEARwH4A/gDAQgiEAAqAAAwRwH4A/gDAQgi
+BwqAAAwRwH4AvgCAQgi+BwqAAAwRwHoA+gDAQgi+BwqAAAwRwHoAugCAQgi+BwqAAA4eQAUFC5V
QVIxX1BSVwCkR1BSVw0KCA0KBFuCQgVQUzJLCF9ISUQMQdADAwhfQ0lEDEHQAwsUGV9TVEEAeQEN
Cg0KYKALe0lPU1RgAKQNCg+kAAhfQ1JTERgNChVHAWAAYAAAAUcBZABkAAABIgIAeQAUFC5QUzJL
X1BSVwCkR1BSVw0KHQ0KBFuCSQdQUzJNCF9ISUQMQdAPAwhfQ0lEDEHQDxMUGV9TVEEAeQENCgxg
oAt7SU9TVGAApA0KD6QACE0yUjARCA0KBSIAEHkACE0yUjEREA0KDUtgAAFLZAABIgAQeQAUIF9D
UlMAeQENCg0KYKANe0lPU1RgAKRNMlIwoQakTTJSMRQULlBTMk1fUFJXAKRHUFJXDQodDQoEEE8Q
Xl5QQ0kwCFNMSUMRQg0KDQqeOTg3MTM0NTEyNzgxR2VudWluZSBOVklESUEgQ2VydGlmaWVkIFNM
SSBSZWFkeSBNb3RoZXJib2FyZCBmb3IgQVNVUyBYNTggUDZYNThELUUgICBiZWVmLUNvcHlyaWdo
dCAyMDA4IE5WSURJQSBDb3Jwb3JhdGlvbiBBbGwgUmlnaHRzIFJlc2VydmVkLTc2NTI4OTg5MTAy
MyhSKQBbgk0FV01JMQhfSElEDXBucDBjMTQACF9VSUQNTVhNMgAIX1dERxEXDQoUPFzL9q6cvU61
d5MeoyoswE1YAQIUIFdNTVgDimoARlVOQ6AQk0ZVTkMMU0xJQaRTTElDpABbgkEHVVNCMAhfQURS
DAAAHQBbgEJBUjACDQrEAVuBDUJBUjABVVNCVwIABhQeX1MzRACgEpGTT1NGTAGTT1NGTA0KAqQN
CgKhBKQNCgMUGF9QU1cBoAlocA0KA1VTQlehB3AAVVNCVxQPX1BSVwCkR1BSVw0KAw0KBFuCQQdV
U0IxCF9BRFIMAQAdAFuAQkFSMAINCsQBW4ENQkFSMAFVU0JXAgAGFB5fUzNEAKASkZNPU0ZMAZNP
U0ZMDQoCpA0KAqEEpA0KAxQYX1BTVwGgCWhwDQoDVVNCV6EHcABVU0JXFA9fUFJXAKRHUFJXDQoE
DQoEW4JBB1VTQjIIX0FEUgwCAB0AW4BCQVIwAg0KxAFbgQ1CQVIwAVVTQlcCAAYUHl9TM0QAoBKR
k09TRkwBk09TRkwNCgKkDQoCoQSkDQoDFBhfUFNXAaAJaHANCgNVU0JXoQdwAFVTQlcUD19QUlcA
pEdQUlcNCgwNCgRbgkEHVVNCNQhfQURSDAMAHQBbgEJBUjACDQrEAVuBDUJBUjABVVNCVwIABhQe
X1MzRACgEpGTT1NGTAGTT1NGTA0KAqQNCgKhBKQNCgMUGF9QU1cBoAlocA0KA1VTQlehB3AAVVNC
VxQPX1BSVwCkR1BSVw0KIA0KBFuCH0VVU0IIX0FEUgwHAB0AFA9fUFJXAKRHUFJXDQoNCgRbgkEH
VVNCMwhfQURSDAAAGgBbgEJBUjACDQrEAVuBDUJBUjABVVNCVwIABhQeX1MzRACgEpGTT1NGTAGT
T1NGTA0KAqQNCgKhBKQNCgMUGF9QU1cBoAlocA0KA1VTQlehB3AAVVNCVxQPX1BSVwCkR1BSVw0K
Dg0KBFuCQQdVU0I0CF9BRFIMAQAaAFuAQkFSMAINCsQBW4ENQkFSMAFVU0JXAgAGFB5fUzNEAKAS
kZNPU0ZMAZNPU0ZMDQoCpA0KAqEEpA0KAxQYX1BTVwGgCWhwDQoDVVNCV6EHcABVU0JXFA9fUFJX
AKRHUFJXDQoFDQoEW4JBB1VTQjYIX0FEUgwCABoAW4BCQVIwAg0KxAFbgQ1CQVIwAVVTQlcCAAYU
Hl9TM0QAoBKRk09TRkwBk09TRkwNCgKkDQoCoQSkDQoDFBhfUFNXAaAJaHANCgNVU0JXoQdwAFVT
QlcUD19QUlcApEdQUlcNCiANCgRbgh9VU0JFCF9BRFIMBwAaABQPX1BSVwCkR1BSVw0KDQoEW4I2
UDBQNAhfQURSDAAAHAAUD19QUlcApEdQUlcNCgkNCgQUFl9QUlQAoA0KUElDTaRBUjA0pFBSMDRb
gjZQMFA1CF9BRFIMAQAcABQPX1BSVwCkR1BSVw0KCQ0KBBQWX1BSVACgDQpQSUNNpEFSMDWkUFIw
NVuCNlAwUDYIX0FEUgwCABwAFA9fUFJXAKRHUFJXDQoJDQoEFBZfUFJUAKANClBJQ02kQVIwNqRQ
UjA2W4I2UDBQNwhfQURSDAMAHAAUD19QUlcApEdQUlcNCgkNCgQUFl9QUlQAoA0KUElDTaRBUjA3
pFBSMDdbgkXZUDBQOAhfQURSDAQAHAAUD19QUlcApEdQUlcNCgkNCgQUFl9QUlQAoA0KUElDTaRB
UjA4pFBSMDhbgkRrSk1CMAhfQURSAFuAQ0Y0MAINCkANCgRbgUIFQ0Y0MAFDSEUwAU1VTFQBAAFD
QUIwAUNIRTEBAANBSEVOAQADUFJUMAFBSE0wAVBSVDEBQUhNMQFDRjQyBlNXQVABUEFUQQEABldU
RU4BAAEIUElPVBIPBQtYAguGAQtKAQ0KtA0KeAhVRE1BEhAHDQp4DQpQDQo8DQooDQoeDQoUDQoP
CE1ETUESCQML4AENCpYNCngISURFQhEDDQoUiklERUIAR1RNMIpJREVCDQoER1RNMYpJREVCDQoI
R1RNMopJREVCDQoMR1RNM4pJREVCDQoQR1RNNAhQSU8wDQoECERNQTANCgYITURBMA0KAghQSU8x
DQoECERNQTENCgYITURBMQ0KAghQSU8yDQoECERNQTINCgYITURBMg0KAghQSU8zDQoECERNQTMN
CgYITURBMw0KAghGTEdQDQofCEZMR1MNCh9bgkQrSURFMAhfQURSABRFDF9HVE0AcIOIUElPVFBJ
TzAAYHCDiFBJT1RQSU8xAGJwDQoaZKAxkEZMR1ABoBiSTVVMVKARkENBQjBTV0FQcA0KAkRNQTBw
g4hVRE1BRE1BMABhfWQBZKEOcIOITURNQU1EQTAAYaAskEZMR1ANCgSgEZBDQUIwU1dBUHANCgJE
TUExcIOIVURNQURNQTEAY31kDQoEZKEOcIOITURNQU1EQTEAY3BgR1RNMHBhR1RNMXBiR1RNMnBj
R1RNM3BkR1RNNKRJREVCFEwMX1NUTQNwaElERUJwR1RNMGBwR1RNMWFwR1RNMmJwR1RNM2NwR1RN
NGRwZEZMR1CgGZCSk2D/kpNgAHCJUElPVAFgAAAAUElPMKAykJKTYf+Sk2EAoBaQRkxHUAFwiVVE
TUEBYQAAAERNQTChEHCJTURNQQFhAAAATURBMKAZkJKTYv+Sk2IAcIlQSU9UAWIAAABQSU8xoDOQ
kpNj/5KTYwCgF5BGTEdQDQoEcIlVRE1BAWMAAABETUExoRBwiU1ETUEBYwAAAE1EQTFbgkgIRFJW
MAhfQURSABRLB19HVEYAcBENCg0KBwMAAAAAoO9gcBENCg0KBwMAAAAAoO9hjGABUElPTYxhAURN
QU1wUElPMFBJT019UElPTQ0KCFBJT02gG5BGTEdQAXBETUEwRE1BTX1ETUFNDQpARE1BTaEVcE1E
QTBETUFNfURNQU0NCiBETUFNc2BhYqRiW4JJCERSVjEIX0FEUgEUTAdfR1RGAHARDQoNCgcDAAAA
ALDvYHARDQoNCgcDAAAAALDvYYxgAVBJT02MYQFETUFNcFBJTzFQSU9NfVBJT00NCghQSU9NoByQ
RkxHUA0KBHBETUExRE1BTX1ETUFNDQpARE1BTaEVcE1EQTFETUFNfURNQU0NCiBETUFNc2BhYqRi
W4JGK0lERTEIX0FEUgEURwxfR1RNAHCDiFBJT1RQSU8yAGBwg4hQSU9UUElPMwBicA0KGmSgMpBG
TEdTAaAZkk1VTFSgEpBDQUIwklNXQVBwDQoCRE1BMnCDiFVETUFETUEyAGF9ZAFkoQ5wg4hNRE1B
TURBMgBhoC2QRkxHUw0KBKASkENBQjCSU1dBUHANCgJETUEzcIOIVURNQURNQTMAY31kDQoEZKEO
cIOITURNQU1EQTMAY3BgR1RNMHBhR1RNMXBiR1RNMnBjR1RNM3BkR1RNNKRJREVCFEwMX1NUTQNw
aElERUJwR1RNMGBwR1RNMWFwR1RNMmJwR1RNM2NwR1RNNGRwZEZMR1OgGZCSk2D/kpNgAHCJUElP
VAFgAAAAUElPMqAykJKTYf+Sk2EAoBaQRkxHUwFwiVVETUEBYQAAAERNQTKhEHCJTURNQQFhAAAA
TURBMqAZkJKTYv+Sk2IAcIlQSU9UAWIAAABQSU8zoDOQkpNj/5KTYwCgF5BGTEdTDQoEcIlVRE1B
AWMAAABETUEzoRBwiU1ETUEBYwAAAE1EQTNbgkgIRFJWMAhfQURSABRLB19HVEYAcBENCg0KBwMA
AAAAoO9gcBENCg0KBwMAAAAAoO9hjGABUElPTYxhAURNQU1wUElPMlBJT019UElPTQ0KCFBJT02g
G5BGTEdTAXBETUEyRE1BTX1ETUFNDQpARE1BTaEVcE1EQTJETUFNfURNQU0NCiBETUFNc2BhYqRi
W4JJCERSVjEIX0FEUgEUTAdfR1RGAHARDQoNCgcDAAAAALDvYHARDQoNCgcDAAAAALDvYYxgAVBJ
T02MYQFETUFNcFBJTzNQSU9NfVBJT00NCghQSU9NoByQRkxHUw0KBHBETUEzRE1BTX1ETUFNDQpA
RE1BTaEVcE1EQTNETUFNfURNQU0NCiBETUFNc2BhYqRiW4JGakpNQjEIX0FEUgFbgENGNDACDQpA
DQoEW4FCBUNGNDABQ0hFMAFNVUxUAQABQ0FCMAFDSEUxAQADQUhFTgEAA1BSVDABQUhNMAFQUlQx
AUFITTEBQ0Y0MgZTV0FQAVBBVEEBAAZXVEVOAQABCFBJT1QSDwULWAILhgELSgENCrQNCngIVURN
QRIQBw0KeA0KUA0KPA0KKA0KHg0KFA0KDwhNRE1BEgkDC+ABDQqWDQp4CElERUIRAw0KFIpJREVC
AEdUTTCKSURFQg0KBEdUTTGKSURFQg0KCEdUTTKKSURFQg0KDEdUTTOKSURFQg0KEEdUTTQIUElP
MA0KBAhETUEwDQoGCE1EQTANCgIIUElPMQ0KBAhETUExDQoGCE1EQTENCgIIUElPMg0KBAhETUEy
DQoGCE1EQTINCgIIUElPMw0KBAhETUEzDQoGCE1EQTMNCgIIRkxHUA0KHwhGTEdTDQofW4JNKklE
RTAIX0FEUgAUTgtfR1RNAHCDiFBJT1RQSU8wAGBwg4hQSU9UUElPMQBicA0KGmSgKpBGTEdQAaAR
kENBQjBTV0FQcA0KAkRNQTBwg4hVRE1BRE1BMABhfWQBZKEOcIOITURNQU1EQTAAYaAskEZMR1AN
CgSgEZBDQUIwU1dBUHANCgJETUExcIOIVURNQURNQTEAY31kDQoEZKEOcIOITURNQU1EQTEAY3Bg
R1RNMHBhR1RNMXBiR1RNMnBjR1RNM3BkR1RNNKRJREVCFEwMX1NUTQNwaElERUJwR1RNMGBwR1RN
MWFwR1RNMmJwR1RNM2NwR1RNNGRwZEZMR1CgGZCSk2D/kpNgAHCJUElPVAFgAAAAUElPMKAykJKT
Yf+Sk2EAoBaQRkxHUAFwiVVETUEBYQAAAERNQTChEHCJTURNQQFhAAAATURBMKAZkJKTYv+Sk2IA
cIlQSU9UAWIAAABQSU8xoDOQkpNj/5KTYwCgF5BGTEdQDQoEcIlVRE1BAWMAAABETUExoRBwiU1E
TUEBYwAAAE1EQTFbgkgIRFJWMAhfQURSABRLB19HVEYAcBENCg0KBwMAAAAAoO9gcBENCg0KBwMA
AAAAoO9hjGABUElPTYxhAURNQU1wUElPMFBJT019UElPTQ0KCFBJT02gG5BGTEdQAXBETUEwRE1B
TX1ETUFNDQpARE1BTaEVcE1EQTBETUFNfURNQU0NCiBETUFNc2BhYqRiW4JJCERSVjEIX0FEUgEU
TAdfR1RGAHARDQoNCgcDAAAAALDvYHARDQoNCgcDAAAAALDvYYxgAVBJT02MYQFETUFNcFBJTzFQ
SU9NfVBJT00NCghQSU9NoByQRkxHUA0KBHBETUExRE1BTX1ETUFNDQpARE1BTaEVcE1EQTFETUFN
fURNQU0NCiBETUFNc2BhYqRiW4JPKklERTEIX0FEUgEUQAxfR1RNAHCDiFBJT1RQSU8yAGBwg4hQ
SU9UUElPMwBicA0KGmSgK5BGTEdTAaASkENBQjCSU1dBUHANCgJETUEycIOIVURNQURNQTIAYX1k
AWShDnCDiE1ETUFNREEyAGGgLZBGTEdTDQoEoBKQQ0FCMJJTV0FQcA0KAkRNQTNwg4hVRE1BRE1B
MwBjfWQNCgRkoQ5wg4hNRE1BTURBMwBjcGBHVE0wcGFHVE0xcGJHVE0ycGNHVE0zcGRHVE00pElE
RUIUTAxfU1RNA3BoSURFQnBHVE0wYHBHVE0xYXBHVE0yYnBHVE0zY3BHVE00ZHBkRkxHU6AZkJKT
YP+Sk2AAcIlQSU9UAWAAAABQSU8yoDKQkpNh/5KTYQCgFpBGTEdTAXCJVURNQQFhAAAARE1BMqEQ
cIlNRE1BAWEAAABNREEyoBmQkpNi/5KTYgBwiVBJT1QBYgAAAFBJTzOgM5CSk2P/kpNjAKAXkEZM
R1MNCgRwiVVETUEBYwAAAERNQTOhEHCJTURNQQFjAAAATURBM1uCSAhEUlYwCF9BRFIAFEsHX0dU
RgBwEQ0KDQoHAwAAAACg72BwEQ0KDQoHAwAAAACg72GMYAFQSU9NjGEBRE1BTXBQSU8yUElPTX1Q
SU9NDQoIUElPTaAbkEZMR1MBcERNQTJETUFNfURNQU0NCkBETUFNoRVwTURBMkRNQU19RE1BTQ0K
IERNQU1zYGFipGJbgkkIRFJWMQhfQURSARRMB19HVEYAcBENCg0KBwMAAAAAsO9gcBENCg0KBwMA
AAAAsO9hjGABUElPTYxhAURNQU1wUElPM1BJT019UElPTQ0KCFBJT02gHJBGTEdTDQoEcERNQTNE
TUFNfURNQU0NCkBETUFNoRVwTURBM0RNQU19RE1BTQ0KIERNQU1zYGFipGJbgjZQMFA5CF9BRFIM
BQAcABQPX1BSVwCkR1BSVw0KCQ0KBBQWX1BSVACgDQpQSUNNpEFSMDmkUFIwOVuCNk5QRTEIX0FE
UgwAAAEAFA9fUFJXAKRHUFJXDQoJDQoEFBZfUFJUAKANClBJQ02kQVIxMaRQUjExW4I2TlBFMghf
QURSDAAAAgAUD19QUlcApEdQUlcNCgkNCgQUFl9QUlQAoA0KUElDTaRBUjEypFBSMTJbgjZOUEUz
CF9BRFIMAAADABQPX1BSVwCkR1BSVw0KCQ0KBBQWX1BSVACgDQpQSUNNpEFSMTOkUFIxM1uCNk5Q
RTcIX0FEUgwAAAcAFA9fUFJXAKRHUFJXDQoJDQoEFBZfUFJUAKANClBJQ02kQVIxN6RQUjE3W4If
R0JFXwhfQURSDAAAGQAUD19QUlcApEdQUlcNCg0KBFuCQMtTQVRBCF9BRFIMAgAfAAheTkFUQRIH
AQwCAB8ACFxGWlRGEQ0KDQoHAAAAAAAA9QhSRUdGARQSX1JFRwKgC5NoDQoCcGlSRUdGCFRJTTAS
SAUIEgsEDQp4DQq0DQrwC4QDEgkEDQojDQohDQoQABIJBA0KCw0KCQ0KBAASDgYNCngNCloNCjwN
CigNCh4NChQSDQoGAAENCgIBDQoCARIIBgAAAAEBARIJBA0KBA0KAw0KAgASBwQNCgIBAAAIVE1E
MBEDDQoUilRNRDAAUElPMIpUTUQwDQoERE1BMIpUTUQwDQoIUElPMYpUTUQwDQoMRE1BMYpUTUQw
DQoQQ0hORluAQ0ZHMgINCkANCiBbgUgNCkNGRzIDUE1QVARQU1BUBFBNUkkGAAJTTVBUBFNTUFQE
U01SSQYAAlBTUkkEU1NSSQQAGFBNM0UBUFMzRQFTTTNFAVNTM0UBAAxQTVVUAgACUFNVVAIAAlNN
VVQCAAJTU1VUAgACAEAEUE02RQFQUzZFAVNNNkUBU1M2RQFQTUNSAVBTQ1IBU01DUgFTU0NSAQAE
UE1BRQFQU0FFAVNNQUUBU1NBRQEIR01QVAAIR01VRQAIR01VVAAIR01DUgAIR1NQVAAIR1NVRQAI
R1NVVAAIR1NDUgBbgk8iQ0hOMAhfQURSABRJB19HVE0AeVBTQ1IBYX1QTUNSYWB5UE1BRQ0KAmN5
UE02RQFkfWNkY31QTTNFY2F5UE1QVA0KBGN9YWNheVBTQUUNCgJjeVBTNkUBZH1jZGN9UFMzRWNi
eVBTUFQNCgRjfWJjYqRHVE1fUE1SSWFQTVVUUFNSSWJQU1VUYBROFl9TVE0DcGhbMXBoVE1EMHlQ
TUFFDQoCY3lQTTZFAWR9Y2RjfVBNM0VjYHlQTVBUDQoEY31gY2B5UFNBRQ0KAmN5UFM2RQFkfWNk
Y31QUzNFY2F5UFNQVA0KBGN9YWNhcFBNUklHTVBUcGBHTVVFcFBNVVRHTVVUcFBNQ1JHTUNScFBT
UklHU1BUcGFHU1VFcFBTVVRHU1VUcFBTQ1JHU0NSU1RNX3BHTVBUUE1SSXBHTVVFYHBHTVVUUE1V
VHBHTUNSUE1DUnBHU1VFYXBHU1VUUFNVVHBHU0NSUFNDUqALe2ABAHABUE0zRaEHcABQTTNFoAx7
YA0KAgBwAVBNNkWhB3AAUE02RaAMe2ANCgQAcAFQTUFFoQdwAFBNQUWgC3thAQBwAVBTM0WhB3AA
UFMzRaAMe2ENCgIAcAFQUzZFoQdwAFBTNkWgDHthDQoEAHABUFNBRaEHcABQU0FFcEdURl8AaUFU
QTBwR1RGXwFqQVRBMVuCG0RSVjAIX0FEUgAUD19HVEYApFJBVEFBVEEwW4IbRFJWMQhfQURSARQP
X0dURgCkUkFUQUFUQTFbgk8iQ0hOMQhfQURSARRJB19HVE0AeVNTQ1IBYX1TTUNSYWB5U01BRQ0K
AmN5U002RQFkfWNkY31TTTNFY2F5U01QVA0KBGN9YWNheVNTQUUNCgJjeVNTNkUBZH1jZGN9U1Mz
RWNieVNTUFQNCgRjfWJjYqRHVE1fU01SSWFTTVVUU1NSSWJTU1VUYBROFl9TVE0DcGhbMXBoVE1E
MHlTTUFFDQoCY3lTTTZFAWR9Y2RjfVNNM0VjYHlTTVBUDQoEY31gY2B5U1NBRQ0KAmN5U1M2RQFk
fWNkY31TUzNFY2F5U1NQVA0KBGN9YWNhcFNNUklHTVBUcGBHTVVFcFNNVVRHTVVUcFNNQ1JHTUNS
cFNTUklHU1BUcGFHU1VFcFNTVVRHU1VUcFNTQ1JHU0NSU1RNX3BHTVBUU01SSXBHTVVFYHBHTVVU
U01VVHBHTUNSU01DUnBHU1VFYXBHU1VUU1NVVHBHU0NSU1NDUqALe2ABAHABU00zRaEHcABTTTNF
oAx7YA0KAgBwAVNNNkWhB3AAU002RaAMe2ANCgQAcAFTTUFFoQdwAFNNQUWgC3thAQBwAVNTM0Wh
B3AAU1MzRaAMe2ENCgIAcAFTUzZFoQdwAFNTNkWgDHthDQoEAHABU1NBRaEHcABTU0FFcEdURl8A
aUFUQTJwR1RGXwFqQVRBM1uCG0RSVjAIX0FEUgAUD19HVEYApFJBVEFBVEEyW4IbRFJWMQhfQURS
ARQPX0dURgCkUkFUQUFUQTMURRNHVE1fD3D/UElPMHD/UElPMXD/RE1BMHD/RE1BMXANChBDSE5G
oAVSRUdGoQakVE1EMKARe2kNCiAAfUNITkYNCgJDSE5GcImDiFRJTTABAAFoAAAAZnCDiIOIVElN
MAAAZgBncGdETUEwcGdQSU8woBF7bA0KIAB9Q0hORg0KCENITkZwiYOIVElNMA0KAgABawAAAGZw
g4iDiFRJTTAAAGYAZ3BnRE1BMXBnUElPMaA9e2kNCgcAcGploAt7aQ0KAgByZQ0KAmWgC3tpDQoE
AHJlDQoEZXCDiIOIVElNMA0KAwBlAERNQTB9Q0hORgFDSE5GoD57bA0KBwBwbWWgC3tsDQoCAHJl
DQoCZaALe2wNCgQAcmUNCgRlcIOIg4hUSU0wDQoDAGUARE1BMX1DSE5GDQoEQ0hORnBUTUQwWzGk
VE1EMBREIVNUTV8IoEwgUkVHRnAAR01VRXAAR01VVHAAR1NVRXAAR1NVVKBAB3tDSE5GAQBwiYOI
VElNMA0KAwACRE1BMAAAAGCgCZRgDQoFcA0KBWBwg4iDiFRJTTANCgQAYABHTVVUfUdNVUUBR01V
RaAQlGANCgJ9R01VRQ0KAkdNVUWgG5RgDQoEe0dNVUUNCv1HTVVFfUdNVUUNCgRHTVVFoTWgM32T
UElPMP+TUElPMAAAoCN7lURNQTD/lERNQTAAAHBETUEwUElPMH1HTVVFDQqAR01VRaBBB3tDSE5G
DQoEAHCJg4hUSU0wDQoDAAJETUExAAAAYKAJlGANCgVwDQoFYHCDiIOIVElNMA0KBABgAEdTVVR9
R1NVRQFHU1VFoBCUYA0KAn1HU1VFDQoCR1NVRaAblGANCgR7R1NVRQ0K/UdTVUV9R1NVRQ0KBEdT
VUWhNaAzfZNQSU8x/5NQSU8xAACgI3uVRE1BMf+URE1BMQAAcERNQTFQSU8xfUdTVUUNCoBHU1VF
oBR7Q0hORg0KAgB9R01VRQ0KIEdNVUWgFHtDSE5GDQoIAH1HU1VFDQogR1NVRXuJg4hUSU0wAAAE
UElPMAAAAA0KB2Bwg4iDiFRJTTABAGAAYXBhR01QVKAQlWANCgN9R01VRQ0KUEdNVUV7iYOIVElN
MAAABFBJTzEAAAANCgdgcIOIg4hUSU0wDQoCAGAAYXBhR1NQVKAQlWANCgN9R1NVRQ0KUEdTVUUI
QVQwMRENCg0KBwMAAAAAAO8IQVQwMhENCg0KBwAAAAAAAJAIQVQwMxENCg0KBwAAAAAAAMYIQVQw
NBENCg0KBwAAAAAAAJEIQVRBMBEDDQodCEFUQTERAw0KHQhBVEEyEQMNCh0IQVRBMxEDDQodCEFU
QUIRAw0KHYxBVEFCAENNREMUTAVHVEZCC3dDTURDDQo4YHJgDQoIYVsTQVRBQmENCjhDTURYd0NN
REMNCgdgjEFUQUJyYA0KAgBBMDAxjEFUQUJyYA0KBgBBMDA1cGhDTURYcGlBMDAxcGpBMDA1dUNN
REMUQiNHVEZfDQpwaVsxcABDTURDCElENDkLAAwISUQ1OQAISUQ1Mw0KBAhJRDYzCwAPCElEODgL
AA8ISVJEWQEIUElPVAAIRE1BVACgTQWTh2kLAAKLaQ0KYklXNDlwSVc0OUlENDmLaQ0KaklXNTNw
SVc1M0lENTOLaQ0KfklXNjNwSVc2M0lENjOLaQ0KdklXNTlwSVc1OUlENTmLaQ0KsElXODhwSVc4
OElEODhwDQqgZ6BIBWhwDQqwZ3tDSE5GDQoISVJEWaASe0NITkYNChAAcFBJTzFQSU9UoQ0KcFBJ
TzBQSU9UoCd7Q0hORg0KBACgEntDSE5GDQoQAHBETUExRE1BVKENCnBETUEwRE1BVKEne0NITkYN
CgJJUkRZcFBJTzBQSU9UoBF7Q0hORgEAcERNQTBETUFUoEUEkJB7SUQ1Mw0KBAB7SUQ4OAsA/wBE
TUFUcImDiFRJTTANCgMAAkRNQVQAAABhoAmUYQ0KBXANCgVhR1RGQkFUMDF9DQpAYQBnoUIEoD+Q
e0lENjMLAP8AUElPVHuJg4hUSU0wAAAEUElPVAAAAA0KA2B9DQogg4iDiFRJTTANCgcAYABhR1RG
QkFUMDFhZ6A1SVJEWXuJg4hUSU0wAAAEUElPVAAAAA0KB2B9DQoIg4iDiFRJTTANCgYAYABhR1RG
QkFUMDFhZ6EWoBR7SUQ0OQsABABHVEZCQVQwMQFnoCSQe0lENTkLAAEAe0lENTkNCv8AR1RGQkFU
MDN7SUQ1OQ0K/wBncEFUQUJbMaRBVEFCFDFSQVRBAYxoAENNRE53Q01ETg0KOGBbE2gNCghgUkVU
QnBSRVRCWzGkc1JFVEJGWlRGAFuCQclTQVQxCF9BRFIMBQAfAAhSRUdGARQSX1JFRwKgC5NoDQoC
cGlSRUdGCFRJTTASSAUIEgsEDQp4DQq0DQrwC4QDEgkEDQojDQohDQoQABIJBA0KCw0KCQ0KBAAS
DgYNCngNCloNCjwNCigNCh4NChQSDQoGAAENCgIBDQoCARIIBgAAAAEBARIJBA0KBA0KAw0KAgAS
BwQNCgIBAAAIVE1EMBEDDQoUilRNRDAAUElPMIpUTUQwDQoERE1BMIpUTUQwDQoIUElPMYpUTUQw
DQoMRE1BMYpUTUQwDQoQQ0hORluAQ0ZHMgINCkANCiBbgUgNCkNGRzIDUE1QVARQU1BUBFBNUkkG
AAJTTVBUBFNTUFQEU01SSQYAAlBTUkkEU1NSSQQAGFBNM0UBUFMzRQFTTTNFAVNTM0UBAAxQTVVU
AgACUFNVVAIAAlNNVVQCAAJTU1VUAgACAEAEUE02RQFQUzZFAVNNNkUBU1M2RQFQTUNSAVBTQ1IB
U01DUgFTU0NSAQAEUE1BRQFQU0FFAVNNQUUBU1NBRQEIR01QVAAIR01VRQAIR01VVAAIR01DUgAI
R1NQVAAIR1NVRQAIR1NVVAAIR1NDUgBbgk8iQ0hOMAhfQURSABRJB19HVE0AeVBTQ1IBYX1QTUNS
YWB5UE1BRQ0KAmN5UE02RQFkfWNkY31QTTNFY2F5UE1QVA0KBGN9YWNheVBTQUUNCgJjeVBTNkUB
ZH1jZGN9UFMzRWNieVBTUFQNCgRjfWJjYqRHVE1fUE1SSWFQTVVUUFNSSWJQU1VUYBROFl9TVE0D
cGhbMXBoVE1EMHlQTUFFDQoCY3lQTTZFAWR9Y2RjfVBNM0VjYHlQTVBUDQoEY31gY2B5UFNBRQ0K
AmN5UFM2RQFkfWNkY31QUzNFY2F5UFNQVA0KBGN9YWNhcFBNUklHTVBUcGBHTVVFcFBNVVRHTVVU
cFBNQ1JHTUNScFBTUklHU1BUcGFHU1VFcFBTVVRHU1VUcFBTQ1JHU0NSU1RNX3BHTVBUUE1SSXBH
TVVFYHBHTVVUUE1VVHBHTUNSUE1DUnBHU1VFYXBHU1VUUFNVVHBHU0NSUFNDUqALe2ABAHABUE0z
RaEHcABQTTNFoAx7YA0KAgBwAVBNNkWhB3AAUE02RaAMe2ANCgQAcAFQTUFFoQdwAFBNQUWgC3th
AQBwAVBTM0WhB3AAUFMzRaAMe2ENCgIAcAFQUzZFoQdwAFBTNkWgDHthDQoEAHABUFNBRaEHcABQ
U0FFcEdURl8AaUFUQTBwR1RGXwFqQVRBMVuCG0RSVjAIX0FEUgAUD19HVEYApFJBVEFBVEEwW4Ib
RFJWMQhfQURSARQPX0dURgCkUkFUQUFUQTFbgk8iQ0hOMQhfQURSARRJB19HVE0AeVNTQ1IBYX1T
TUNSYWB5U01BRQ0KAmN5U002RQFkfWNkY31TTTNFY2F5U01QVA0KBGN9YWNheVNTQUUNCgJjeVNT
NkUBZH1jZGN9U1MzRWNieVNTUFQNCgRjfWJjYqRHVE1fU01SSWFTTVVUU1NSSWJTU1VUYBROFl9T
VE0DcGhbMXBoVE1EMHlTTUFFDQoCY3lTTTZFAWR9Y2RjfVNNM0VjYHlTTVBUDQoEY31gY2B5U1NB
RQ0KAmN5U1M2RQFkfWNkY31TUzNFY2F5U1NQVA0KBGN9YWNhcFNNUklHTVBUcGBHTVVFcFNNVVRH
TVVUcFNNQ1JHTUNScFNTUklHU1BUcGFHU1VFcFNTVVRHU1VUcFNTQ1JHU0NSU1RNX3BHTVBUU01S
SXBHTVVFYHBHTVVUU01VVHBHTUNSU01DUnBHU1VFYXBHU1VUU1NVVHBHU0NSU1NDUqALe2ABAHAB
U00zRaEHcABTTTNFoAx7YA0KAgBwAVNNNkWhB3AAU002RaAMe2ANCgQAcAFTTUFFoQdwAFNNQUWg
C3thAQBwAVNTM0WhB3AAU1MzRaAMe2ENCgIAcAFTUzZFoQdwAFNTNkWgDHthDQoEAHABU1NBRaEH
cABTU0FFcEdURl8AaUFUQTJwR1RGXwFqQVRBM1uCG0RSVjAIX0FEUgAUD19HVEYApFJBVEFBVEEy
W4IbRFJWMQhfQURSARQPX0dURgCkUkFUQUFUQTMURRNHVE1fD3D/UElPMHD/UElPMXD/RE1BMHD/
RE1BMXANChBDSE5GoAVSRUdGoQakVE1EMKARe2kNCiAAfUNITkYNCgJDSE5GcImDiFRJTTABAAFo
AAAAZnCDiIOIVElNMAAAZgBncGdETUEwcGdQSU8woBF7bA0KIAB9Q0hORg0KCENITkZwiYOIVElN
MA0KAgABawAAAGZwg4iDiFRJTTAAAGYAZ3BnRE1BMXBnUElPMaA9e2kNCgcAcGploAt7aQ0KAgBy
ZQ0KAmWgC3tpDQoEAHJlDQoEZXCDiIOIVElNMA0KAwBlAERNQTB9Q0hORgFDSE5GoD57bA0KBwBw
bWWgC3tsDQoCAHJlDQoCZaALe2wNCgQAcmUNCgRlcIOIg4hUSU0wDQoDAGUARE1BMX1DSE5GDQoE
Q0hORnBUTUQwWzGkVE1EMBREIVNUTV8IoEwgUkVHRnAAR01VRXAAR01VVHAAR1NVRXAAR1NVVKBA
B3tDSE5GAQBwiYOIVElNMA0KAwACRE1BMAAAAGCgCZRgDQoFcA0KBWBwg4iDiFRJTTANCgQAYABH
TVVUfUdNVUUBR01VRaAQlGANCgJ9R01VRQ0KAkdNVUWgG5RgDQoEe0dNVUUNCv1HTVVFfUdNVUUN
CgRHTVVFoTWgM32TUElPMP+TUElPMAAAoCN7lURNQTD/lERNQTAAAHBETUEwUElPMH1HTVVFDQqA
R01VRaBBB3tDSE5GDQoEAHCJg4hUSU0wDQoDAAJETUExAAAAYKAJlGANCgVwDQoFYHCDiIOIVElN
MA0KBABgAEdTVVR9R1NVRQFHU1VFoBCUYA0KAn1HU1VFDQoCR1NVRaAblGANCgR7R1NVRQ0K/UdT
VUV9R1NVRQ0KBEdTVUWhNaAzfZNQSU8x/5NQSU8xAACgI3uVRE1BMf+URE1BMQAAcERNQTFQSU8x
fUdTVUUNCoBHU1VFoBR7Q0hORg0KAgB9R01VRQ0KIEdNVUWgFHtDSE5GDQoIAH1HU1VFDQogR1NV
RXuJg4hUSU0wAAAEUElPMAAAAA0KB2Bwg4iDiFRJTTABAGAAYXBhR01QVKAQlWANCgN9R01VRQ0K
UEdNVUV7iYOIVElNMAAABFBJTzEAAAANCgdgcIOIg4hUSU0wDQoCAGAAYXBhR1NQVKAQlWANCgN9
R1NVRQ0KUEdTVUUIQVQwMRENCg0KBwMAAAAAAO8IQVQwMhENCg0KBwAAAAAAAJAIQVQwMxENCg0K
BwAAAAAAAMYIQVQwNBENCg0KBwAAAAAAAJEIQVRBMBEDDQodCEFUQTERAw0KHQhBVEEyEQMNCh0I
QVRBMxEDDQodCEFUQUIRAw0KHYxBVEFCAENNREMUTAVHVEZCC3dDTURDDQo4YHJgDQoIYVsTQVRB
QmENCjhDTURYd0NNREMNCgdgjEFUQUJyYA0KAgBBMDAxjEFUQUJyYA0KBgBBMDA1cGhDTURYcGlB
MDAxcGpBMDA1dUNNREMUQiNHVEZfDQpwaVsxcABDTURDCElENDkLAAwISUQ1OQAISUQ1Mw0KBAhJ
RDYzCwAPCElEODgLAA8ISVJEWQEIUElPVAAIRE1BVACgTQWTh2kLAAKLaQ0KYklXNDlwSVc0OUlE
NDmLaQ0KaklXNTNwSVc1M0lENTOLaQ0KfklXNjNwSVc2M0lENjOLaQ0KdklXNTlwSVc1OUlENTmL
aQ0KsElXODhwSVc4OElEODhwDQqgZ6BIBWhwDQqwZ3tDSE5GDQoISVJEWaASe0NITkYNChAAcFBJ
TzFQSU9UoQ0KcFBJTzBQSU9UoCd7Q0hORg0KBACgEntDSE5GDQoQAHBETUExRE1BVKENCnBETUEw
RE1BVKEne0NITkYNCgJJUkRZcFBJTzBQSU9UoBF7Q0hORgEAcERNQTBETUFUoEUEkJB7SUQ1Mw0K
BAB7SUQ4OAsA/wBETUFUcImDiFRJTTANCgMAAkRNQVQAAABhoAmUYQ0KBXANCgVhR1RGQkFUMDF9
DQpAYQBnoUIEoD+Qe0lENjMLAP8AUElPVHuJg4hUSU0wAAAEUElPVAAAAA0KA2B9DQogg4iDiFRJ
TTANCgcAYABhR1RGQkFUMDFhZ6A1SVJEWXuJg4hUSU0wAAAEUElPVAAAAA0KB2B9DQoIg4iDiFRJ
TTANCgYAYABhR1RGQkFUMDFhZ6EWoBR7SUQ0OQsABABHVEZCQVQwMQFnoCSQe0lENTkLAAEAe0lE
NTkNCv8AR1RGQkFUMDN7SUQ1OQ0K/wBncEFUQUJbMaRBVEFCFDFSQVRBAYxoAENNRE53Q01ETg0K
OGBbE2gNCghgUkVUQnBSRVRCWzGkc1JFVEJGWlRGABBHLVxfR1BFFEQTX0wwOQCGXC8DX1NCX1BD
STBOUEU0DQoChlwvA19TQl9QQ0kwTlBFNQ0KAoZcLwNfU0JfUENJME5QRTYNCgKGXC8DX1NCX1BD
STBOUEU4DQoChlwvA19TQl9QQ0kwTlBFOQ0KAoZcLwNfU0JfUENJME5QRUENCgKGXC8DX1NCX1BD
STBQMFA0DQoChlwvA19TQl9QQ0kwUDBQNQ0KAoZcLwNfU0JfUENJMFAwUDYNCgKGXC8DX1NCX1BD
STBQMFA3DQoChlwvA19TQl9QQ0kwUDBQOA0KAoZcLwNfU0JfUENJMFAwUDkNCgKGXC8DX1NCX1BD
STBOUEUxDQoChlwvA19TQl9QQ0kwTlBFMg0KAoZcLwNfU0JfUENJME5QRTMNCgKGXC8DX1NCX1BD
STBOUEU3DQoChlwuX1NCX1BXUkINCgIUJV9MMEIAhlwvA19TQl9QQ0kwUDBQMQ0KAoZcLl9TQl9Q
V1JCDQoCFBlfTDA4AFwvBF9TQl9QQ0kwU0JSR1NJT0gUGV9MMUQAXC8EX1NCX1BDSTBTQlJHU0lP
SBQlX0wwMwCGXC8DX1NCX1BDSTBVU0IwDQoChlwuX1NCX1BXUkINCgIUJV9MMDQAhlwvA19TQl9Q
Q0kwVVNCMQ0KAoZcLl9TQl9QV1JCDQoCFCVfTDBDAIZcLwNfU0JfUENJMFVTQjINCgKGXC5fU0Jf
UFdSQg0KAhQ3X0wyMACGXC8DX1NCX1BDSTBVU0I1DQoChlwvA19TQl9QQ0kwVVNCNg0KAoZcLl9T
Ql9QV1JCDQoCFEoEX0wwRACGXC8DX1NCX1BDSTBFVVNCDQoChlwvA19TQl9QQ0kwVVNCRQ0KAoZc
LwNfU0JfUENJMEdCRV8NCgKGXC5fU0JfUFdSQg0KAhQlX0wwRQCGXC8DX1NCX1BDSTBVU0IzDQoC
hlwuX1NCX1BXUkINCgIUJV9MMDUAhlwvA19TQl9QQ0kwVVNCNA0KAoZcLl9TQl9QV1JCDQoCW4Id
UFdSQghfSElEDEHQDAwIX1VJRA0KqghfU1RBDQoLEEUVLwRfU0JfUENJMFNCUkdBU09DCEcwVDMS
IAcMBQAHAA1OZXcgQ1BVIEluc3RhbGxlZAABAAABDQoCCEcwVDgSIQcMCAAGAA1JdGVtIGNhcGFi
aWxpdHkADAAAAEAAAAAACEcwVDkSHgcMCQAGAA1JdGVtIGNvbnRyb2wADAAAAEAAAAAACEdSUDAS
DgNHMFQzRzBUOEcwVDkUQQdHSVQwAQhfVF8wAHB7aAv//wBfVF8woBSTX1RfMA0KBXBHTlZTCzsX
QVNCMaFDBKAWk19UXzANCghwAGB9YA0KBGBwYEFTQjGhKaAfk19UXzANCglwAGCgDUdOVlML6BZ9
YA0KBGBwYEFTQjGhB3AAQVNCMBRJBFNJVDADoDh7agv//wAIX1RfMABwe2gL//8AX1RfMKAXk19U
XzANCgVTTlZTCzsXaXANCgNBU0IwoQdwAEFTQjChCHANCgNBU0IwEIQXAi8EX1NCX1BDSTBTQlJH
QVNPQwhHM1UwEikJDAAAhgMNVW5jb3JlIENsb2NrIFJhdGlvAAAADQoMAQ0KHwENQXV0bwAIRzNR
MBI7CQwBAAgDDVFQSSBGcmVxdWVuY3kAAAANCgQNQXV0bwANNC44MDBHVAANNS44NjZHVAANNi40
MDBHVAAIRzNDMBIhBwwRAAEDDUJDTEsgRnJlcXVlbmN5AAANCiELECcNCmQNCpcIRzNDMRIhBwwS
AAIDDUNQVSBWb2x0YWdlAAANCjAMCEwB/gtxAg0KiQhHM0MyEhkHDBMABgMNQ1BVIFJhdGlvAAAA
DQoGAQ0KHAhHM0MzEicHDBUAAgMNUVBJL0RSQU0gQ29yZSBWb2x0AAAADMDUAf4LcQINCkEIRzND
NBIZBwwWAAIDDUNQVSBQTEwAAAALCAcNChQNCiQIRzNEMRJDBQsMMQAIAw1EUkFNIEZyZXF1ZW5j
eQAAAA0KBg1BdXRvAA04MDAgTUh6AA0xMDY2IE1IegANMTMzMyBNSHoADTE2MDAgTUh6AA0xODY2
IE1IegAIRzNEMhIiBwwyAAgDDURSQU0gQnVzIFZvbHRhZ2UAAAALsAQNCg0KDQpRCEczRDQSGwcM
NAAMAw1DSEEgREFUQQAADQoVC4sBDQoFDQowCEczRDUSGwcMNQAMAw1DSEEgQ1RSTAAADQoVC4sB
DQoFDQowCEczRDYSGwcMNgAMAw1DSEIgREFUQQAADQoVC4sBDQoFDQowCEczRDcSGwcMNwAMAw1D
SEIgQ1RSTAAADQoVC4sBDQoFDQowCEczRDgSGwcMOAAMAw1DSEMgREFUQQAADQoVC4sBDQoFDQow
CEczRDkSGwcMOQAMAw1DSEMgQ1RSTAAADQoVC4sBDQoFDQowCEczUzASFQcMsQACAw1JQ0gAAAAL
TAQNCmQNCgQIRzNTMRIaBwyzAAIDDUlDSCBQQ0lFAAAAC9wFDQpkDQoECEczTjASFQcMsgACAw1J
T0gAAAALTAQNChQNCh8IRzNOMRIaBwy0AAIDDUlPSCBQQ0lFAAAAC9wFDQoUDQpACEczRFMSHwcM
8AAGAw1EZXZpY2UgU2VsZWN0AAwAAABAAAAAAAhHUlAzEkcEEUczQzBHM0MxRzNDMkczQzNHM0M0
RzNEMkczRDRHM0Q1RzNENkczRDdHM0Q4RzNEOUczUzBHM1MxRzNOMEczTjFHM0RTCEdPRFMACElU
QUQNCjcIRFZNUwAIVEJSVBELDQoIAAAAAAAAAAAIVEJNSxELDQoIAAAAAAAAAAAIQ1ZJTwAIQ0hS
RhEJDQoG////////FEo2R0lUMwEIX1RfMABwe2gL//8AX1RfMKATk19UXzAAcEdOVlMLIFRBU0Ix
oU0zoBOTX1RfMAFwR05WUwsBNEFTQjGhRjKgTA6TX1RfMA0KEXBSQkxLDQrSAA0KIUNMS1KMQ0xL
UgBDQjAwjENMS1INCgtDQkJNjENMS1INCgxDQkJOjENMS1INCh1DQjI5e0NCQk0NCj9gcENCQk5h
fXlhDQoDYnl6Q0JCTQ0KBmIBYmF3C5gFYWR4ZA0KZGVjeGNgZWNwg4hHM1RCe0NCMjkNCg8AAGR4
Y2RlY6ANCpKVZQ0KAnJjAWOgG5ODiEczVEJ7Q0IyOQ0KDwAADQoGdGMNCmRBU0IxoTugG5ODiEcz
VEJ7Q0IyOQ0KDwAADQoEdGMNCshBU0IxoR2gG5ODiEczVEJ7Q0IyOQ0KDwAADQoDdGMNCshBU0Ix
oUYjoBGTX1RfMA0KEnBHQ1ZWQVNCMaFBIqBMDZNfVF8wDQoToEkEkX17ekdNRFgLoAENCgYAAQB7
R01EWAuZAQEAAJN7ekdNQVgNCs4NChwAAQAAcEdOVlMLoIJhdHt6R01BWA0Kzg0KCAANCv8AYUFT
QjGhSAigRQiSk0dPRFMNCv+gLZNHTlZTC6CCe0dNQVgLmQENCv8AdHtHTUFYC5kBDQr/AIOIRzND
Mg0KBABBU0IxoUwEoBGVR09EUw0KBHBHTUFYC60BYaEVcEdNRFgLrQFhdEdPRFMNCgRHT0RTeUdP
RFMNCgNlemFlYHR7YA0K/wCDiEczQzINCgQAYHBgQVNCMaFBFKARk19UXzANChVwR1ZDVkFTQjGh
TBKgEZNfVF8wDQoWcEdDUFZBU0IxoUcRoBSTX1RfMA0KMXBHTlZTCwU0QVNCMaFPD6ARk19UXzAN
CjJwR0RSVkFTQjGhSg6gEpNfVF8wDQo0cEdEQ1YAQVNCMaFEDaASk19UXzANCjVwR0RRVgBBU0Ix
oU4LoBKTX1RfMA0KNnBHRENWAUFTQjGhSA0KoBKTX1RfMA0KN3BHRFFWAUFTQjGhQgmgE5NfVF8w
DQo4cEdEQ1YNCgJBU0IxoUsHoBOTX1RfMA0KOXBHRFFWDQoCQVNCMaFEBqARk19UXzANCrFwR1ND
VkFTQjGhTwSgEZNfVF8wDQqzcEdTUFZBU0IxoTqgEZNfVF8wDQqycEdOQ1ZBU0IxoSagEZNfVF8w
DQq0cEdOUFZBU0IxoRKgCJNfVF8wDQrwoQdwAEFTQjAUQ1VTSVQzAwhfVF8wAHB7aAv//wBfVF8w
oCyTX1RfMACgJJKTR05WUwsgVGmgDXtqAQBTTlZTCyBUaX1BU0IwDQoCQVNCMKFNUKAsk19UXzAB
oCSSk0dOVlMLATRpoA17agEAU05WUwsBNGl9QVNCMA0KAkFTQjChTU2gRRKTX1RfMA0KEXBSQkxL
DQrSAA0KIUNMS1KMQ0xLUgBDQjAwjENMS1IBQ0IwMYtDTEtSDQoLQ0JNToxDTEtSDQodQ0IyOXdp
DQoDYKAxk4OIRzNUQntDQjI5DQoPAAANCgaMTU42QmBNNjAwi01ONkJ1YE02VkxwTTZWTENCTU6h
SAagMZODiEczVEJ7Q0IyOQ0KDwAADQoEjE1ONEJgTTQwMItNTjRCdWBNNFZMcE00VkxDQk1OoTOg
MZODiEczVEJ7Q0IyOQ0KDwAADQoDjE1OM0JgTTMwMItNTjNCdWBNM1ZMcE0zVkxDQk1OoDV7ag0K
AwBwe0NCMDANCt8AQ0IwMHB9Q0IwMQ0KEABDQjAxV0JMSw0K0gANChNDTEtSU05WUws7FwGgDXtq
AQBTTlZTCwCnaaFEO6Aik19UXzANChKgC3tqDQoDAFNDVlZpoA17agEAU05WUwtgg2mhTjigRRWT
X1RfMA0KE6BFFHtqDQoDAKAjkXtHTURYC5kBAQCTe3pHTUFYDQrODQocAAEAAHALmZlEQkc4oUkR
oC+Sk0dPRFMNCv9wR05WUwuggmByYGlgcGCIVEJSVEdPRFMAcA0K/4hUQk1LR09EUwChRg6KVEJS
VABUUkFYilRCUlQNCgRUUkRYilRCTUsAVFJNQYpUQk1LDQoEVFJNRHBHTUFYC60BYXBHTURYC60B
Yn17YYBUUk1BAABUUkFYYX17YoBUUk1EAABUUkRYYlNNU1ILrQFhYnAAYKIZlWANCghwAIhUQlJU
YABwAIhUQk1LYAB1YKBDBpKUR05WUwuggntHTUFYC5kBDQr/AHBHTURYC6ABY3tjDL////9jU01T
UgugAUdNQVgLoAFjckdOVlMLoIIBYnBHTUFYC5kBY317YwwA////AGJiU01TUguZAWJHTURYC5kB
oAV7agEAoUUjoCKTX1RfMA0KFaALe2oNCgMAU1ZDVmmgDXtqAQBTTlZTC2hzaaFPIKAik19UXzAN
ChagC3tqDQoDAFNDUFZpoA17agEAU05WUwuIc2mhSR6gTgSTX1RfMA0KMaBEBJKTR05WUwsFNGmg
N3tqAQBTTlZTCwU0aaAeaaAbkpNyeXZpDQoCAAFgR05WUwsgVFNOVlMLIFRgfUFTQjANCgJBU0Iw
oUcZoCKTX1RfMA0KMqALe2oNCgMAU0RSVmmgDXtqAQBTTlZTC3hzaaFBF6Ack19UXzANCjRTRENW
AGmgDXtqAQBTTlZTC5BzaaFBFaAck19UXzANCjVTRFFWAGmgDXtqAQBTTlZTC5hzaaFBE6Ack19U
XzANCjZTRENWAWmgDXtqAQBTTlZTC6BzaaFBEaAck19UXzANCjdTRFFWAWmgDXtqAQBTTlZTC6hz
aaFBD6Adk19UXzANCjhTRENWDQoCaaANe2oBAFNOVlMLsHNpoUANoB2TX1RfMA0KOVNEUVYNCgJp
oA17agEAU05WUwu4c2mhTw0KoCKTX1RfMA0KsaALe2oNCgMAU1NDVmmgDXtqAQBTTlZTC3BzaaFJ
CKAik19UXzANCrOgC3tqDQoDAFNTUFZpoA17agEAU05WUwuAc2mhQwagIpNfVF8wDQqyoAt7ag0K
AwBTTkNWaaANe2oBAFNOVlMLcHNpoT2gIpNfVF8wDQq0oAt7ag0KAwBTTlBWaaANe2oBAFNOVlML
gHNpoRigDpNfVF8wDQrwcGlHT0RToQdwAEFTQjAUQAlHU0dQAXhoDQoNCmBhCF9UXzAAcGFfVF8w
oBiTX1RfMA0KA0VORkcNCgl7ekNSRTRgAAFgoUcFoBiTX1RfMA0KBEVORkcNCgl7ek9QVDBgAAFg
oTugGJNfVF8wDQoIRU5GRw0KB3t6Q1JFNGAAAWChIKAYk19UXzANCglFTkZHDQoHe3pDUkU4YAAB
YKEFcA0K/2BFWEZHpGAUSA1TU0dQAnhoDQoNCmBheQFgYAhfVF8wAHBhX1RfMKA3k19UXzANCgRF
TkZHDQoJoByTaQB7T1BUMIBgAE9QVDB7T1BUMYBgAE9QVDGhC31PUFQwYE9QVDChSgegN5NfVF8w
DQoIRU5GRw0KB6Ack2kAe0NSRTSAYABDUkU0e0NSRTWAYABDUkU1oQt9Q1JFNGBDUkU0oT+gN5Nf
VF8wDQoJRU5GRw0KB6Ack2kAe0NSRTiAYABDUkU4e0NSRTmAYABDUkU5oQt9Q1JFOGBDUkU4oQVw
DQr/YEVYRkdEWTQwW4BETFlQAQ0K4QFbgQtETFlQAURFTFkIFBZEWTQwAHANCoBgogtgcA0K/0RF
TFl2YBRLDQpHQ1ZWAHAARFZNU6AXRFZNU3BSQllUeUlUQUQBAA0KAmJwYmChFXBSQllUeUlUQUQB
AA0KA2B0DQp6YGBFTkZHDQoJoA+Te09QVDEBAAByYA0KEGCgEHtPUFQxDQoEAHBSRFZJYGBwUkJZ
VHlJVEFEAQAAYqA0k3tiDQoCAACgIXtPUFQxDQoEAHQNCnpNVklEYKAIlWANCjdwAGChBnRgDQo3
YKEJdA0Kek1WSURgRVhGR6RgFEUTU0NWVgFFTkZHDQoJcABEVk1TcFJCWVR5SVRBRAEAAGCgLXtg
DQoEAH1gDQoIYFdCWVR5SVRBRAEAAGBbIgF7YA0K92BXQllUeUlUQUQBAABgoBp7T1BUMQ0KBABw
aENWSU9wR0RWSXJoDQpAAGhwaGagDQqUaA0KeXRoDQoQaKEcRU5GRw0KCXtPUFQwDQr+T1BUMH1P
UFQxAU9QVDFwDQp6YHRgaGCgCZVgDQoCcA0KAmCgMURWTVNyTVZJRAFjdGNgYldCWVR5SVRBRAEA
DQoCYnBSQllUeUlUQUQBAABifWANChpgoSZXQllUeUlUQUQBAA0KAmBwUkJZVHlJVEFEAQAAYH17
YA0K7wANCg0KYFdCWVR5SVRBRAEAAGCgIZRmDQp5RU5GRw0KCXtPUFQwDQr+T1BUMHtPUFQxDQr+
T1BUMUVYRkekARQkR0RWSQGgCJVoDQokcABgoRJ3aA0KDQpgdGALYAFgeGANCg1hYKRgFA5SRFZJ
AXBDVklPYKRgFDNHVkNWAHANCkJlRU5GRw0KCKALkpNPUFQwAHAAYKEIdGVPUFQxYHBUVkNWAGBg
RVhGR6RgFEwIU1ZDVgFwVFZDVgFoaHBoZnANCkJgcA0KQGWgDQqUaA0KQHRoDQoQaKAIlWBocA0K
QGhFTkZHDQoIfUFDVFINCgJBQ1RScABPUFQwdGBoYaALlGENCgJwYU9QVDGhCHANCgJPUFQxRU5G
Rw0KD3AAQ1JFMEVORkcNCg0KfUNSRTkNCghDUkU5e0NSMkMNCvxDUjJDRVhGR6QBFE0IVFZDVgKg
SASTaAGgCZRpDQpAcA0KQGmgOJKVaQ0KJKALkpRpDQovcmkNCgJpoSWgC5KUaQ0KP3JpDQoEaaEX
oBWSlGkNClByaQ0KBmmgCZRpDQpQcA0KUGmhOqAukpVpDQokoAuSlGkNCjF0aQ0KAmmhG6ALkpRp
DQpDdGkNCgRpoQ2gC5KUaQ0KUHRpDQoGaaAJlGkNCkBwDQpAaaRpFBJHQ1BWAHBSQllUDQo8DQoz
YKRgFC1TQ1BWAVdCWVQNCjwNCjBoV0JZVA0KPA0KMQFXQllUDQo8DQoyAVdCWVQNCjwNCkANCgik
ARQSR05DVgBwUkJZVA0KPA0KA2CkYBQqU05DVgFXQllUDQo8AGhXQllUDQo8AQFXQllUDQo8DQoC
AVdCWVQNCjwNCkABpAEUEkdOUFYAcFJCWVQNCjwNCiNgpGAULVNOUFYBV0JZVA0KPA0KIGhXQllU
DQo8DQohAVdCWVQNCjwNCiIBV0JZVA0KPA0KQA0KBKQBFC9HU0NWAEVORkcNCgd7Q1JFNAFgRU5G
Rw0KCXtPUFQwDQoCYXQNCgN9YGEAYEVYRkekYBRDB1NTQ1YBdA0KA2hgRU5GRw0KB3tgAWN9Q1JF
NGBDUkU0e0NSRTR9Yw0K/gBDUkU0e0NSRTV9Yw0K/gBDUkU1RU5GRw0KCXtgDQoCYH1PUFQwYE9Q
VDB7T1BUMH1gDQr9AE9QVDB7T1BUMX1gDQr9AE9QVDFFWEZHpAEUJEdTUFYARU5GRw0KB3tDUkU0
DQpgYHpgDQoFYHQNCgNgYEVYRkekYBRHBFNTUFYBRU5GRw0KB3QNCgNoYHl7YA0KAwANCgVgfUNS
RTRgQ1JFNHtDUkU0fWANCp8AQ1JFNHtDUkU1fWANCp8AQ1JFNUVYRkekARRPDQpTRFJWAXhoDQoC
YGGgJJNgAUVORkcNCgl7Q1JFNA0Kf0NSRTR7Q1JFNQ0Kf0NSRTVFWEZHoRZFTkZHDQoJfUNSRTQN
CoBDUkU0RVhGR6A1lGANCg9TU0dQDQpXAVdCWVQNCjwNChB0aA0KD2hXQllUDQo8DQoRAVdCWVQN
CjwNChIBV0JZVA0KPA0KQA0KAqEtV0JZVA0KPA0KEGhXQllUDQo8DQoRAVdCWVQNCjwNChIBV0JZ
VA0KPA0KQA0KAlNTR1ANClcApAEUQwVHRFJWAKAqk0dTR1ANClcBclJCWVQNCjwNChANCg9gd2AN
CgJgoA2TR1NHUA0KJQByYAFgpGChIHBSQllUDQo8DQoQYHdgDQoCYKANk0dTR1ANCiUAcmABYKRg
FEUGR0RDVgEIX1RfMABwe2gNCv8AX1RfMKASk19UXzAAe1JCWVQNCmQBDQoPYKEwoBOTX1RfMAF7
UkJZVA0KZA0KAw0KD2ChGqAUk19UXzANCgJ7UkJZVA0KYA0KAw0KD2ChA6QAcEdWQ1RoAGCkYBRF
BkdEUVYBCF9UXzAAcHtoDQr/AF9UXzCgE5NfVF8wAHtSQllUDQpkDQoCDQoPYKEvoBKTX1RfMAF7
UkJZVA0KYAENCg9goRqgFJNfVF8wDQoCe1JCWVQNCmANCgINCg9goQOkAHBHVkNUaAFgpGAURAdT
RENWAlNWQ1RoAGlyR0RSVgFgcEdEUklpYGkIX1RfMABwe2gNCv8AX1RfMKAPk19UXzAAV0JZVA0K
ZAFpoTSgFZNfVF8wAX1pDQqAaVdCWVQNCmQNCgNpoRygFpNfVF8wDQoCfWkNCoBpV0JZVA0KYA0K
A2mhA6QApAEUSgZTRFFWAlNWQ1RoAWlyR0RSVgFgcEdEUklpYGkIX1RfMABwe2gNCv8AX1RfMKAQ
k19UXzAAV0JZVA0KZA0KAmmhKaAPk19UXzABV0JZVA0KYAFpoRegEZNfVF8wDQoCV0JZVA0KYA0K
AmmhA6QApAEUTAdHRFJJAnJ3aQ0KZGYL4C5meA0KaQ0KBWBloAiTaABwDQpAZKFIBXRoAWigCJNo
ZXANCkBkoUgEoCaUaGV4Zg0KyGBkd2R0aGUAZHhkDQp9YGSgCZRkDQoQcA0KEGRyZA0KQGShHnhm
DQrIYGR3ZHRlaABkeGQNChlgZKAJlGQNCj9wDQo/ZKRkFBlTVkNUA3Jpd2gNCgIAYHBqiENIUkZg
AKQBFE0PR1ZDVAJyaXdoDQoCAGBwg4hDSFJGYABioEsMk2INCv8IX1RfMABwe2gNCv8AX1RfMKA4
k19UXzAAoA2TaQBwR05WUwuQc2GhDQpwR05WUwuYc2GgCJNhAHANChVhoQV0YQFhcGGIQ0hSRmAA
oUsHoDiTX1RfMAGgDZNpAHBHTlZTC6BzYaENCnBHTlZTC6hzYaAIk2EAcA0KFWGhBXRhAWFwYYhD
SFJGYAChP6A5k19UXzANCgKgDZNpAHBHTlZTC7BzYaENCnBHTlZTC7hzYaAIk2EAcA0KFWGhBXRh
AWFwYYhDSFJGYAChA6QAoQtwg4hDSFJGYABhcIOIQ0hSRmAAYaRhCENMS1IRIw0KIAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEczVEIREw0KEAIDBQkEBg0KEggMFCQQGChICFBDRUYR
Rg0KDQqi2+sWwtjVHPzWx1nlG/qTsdnrz46Y5tGkWv5NgFCfGftZ/dbgWPdQppbmF/MX9VbsF/kX
+1f91N2U31ThFOPU5JTmVOiPr9TrTqZT48+0i4VT6FT20dLQx9HVS4sU/1Hak/VT902qTavS7k/I
ENcPy0/M0vaR6tL5kN84KDpkMod8q/YF9gVkBzzGPMY8xv4G9iW2JnYrOqY85n4mjLoQ+oy8CE1O
NkIRTRwLyAEGKtwG4rMGI7sGpccG36gGLPIGH6wGZc8GI8YGIsIGKvIGo8sGHrAGYskGI9EGKv0G
KfkGo9YG5uoGHrsGI9wGG6sGqP8Go+EG2qgGlYkGI+cG4NQGZPEGo+wGFY8GU4IGI/IGGa8GYu8G
F6MGHMgGGrsG4/0G2r0GntwG16kGHt8G2sIGYPEGlZ8GYfwGHucG4f8G4PkGHNwGXeUGF7cGWtAG
HvIGlaoGm9wGU5wGU50G2+AGFbAGHv0GmtwGV8QGHfkGHPIGEIsGnf0GGdwG1sIGFbsG2ugGWuoG
3P0Gl9EGm/cGVLgGV9UGFs0GWeoGFcYGmvYGD48GE7YGE7cGlcsGUq8GltcGl+IGmfcGFdEGGfoG
WPEGmPIG0awGldYGD5oGVM4G2PgG1+8GFdwGlucG0bMGj58G1/UGleEGVu0GV/kGE88GE9AGFvIG
E9IGE9MGE9QGlvYGlewGle0Gj6oGEcIGVvwGFfIGUtAG1v8GlOkGD7AGlfcGUckGUL4GS4MG1fsG
Ff0GFPIG0toGS4YGktwG0+kG0+oG0+sGD7sGzaIGDrAGlPwGkdcGEuUGlP8GEucGjJoG0ugGzagG
0uoGkd4A//8ITU40QhFPOAuKAwSf2ARUjATQcASSfwRThwRPawTUjwQSggQSggRSgwSUkgSShATR
fQTShQSOaAQQeATUlgRSiASTkARQegSRggSTkgSTkgRRhASTlAQUnQRPdgSTlgRQfwTUnwSUoAQR
iQSQgQSTmgROcgQUpAROcwTOcwSSlQTRjQSUpwTTnwQSmAQSmARSmQQUqwSSmgRPgQTSmwQQiwTT
pQQZ2wQZ3ARc9wTY1AQVuwRb8QRZ4ARa6gTRmQTWxwSX0QTa7QQRnARUuATb+QSa8QSRngRX1wSb
/QQOhATRoAQa9wQPjwSW0gRRowQTtwQVywQY6QSRpQQSsAQa/wRSsQQRqAQY7gRNgQTTvQRRqgRW
3QRPlwQZ/QTY8wQV1gSUzAQX7ASW4gRQpQTY+ATY+QRTxgQV3ATX8QRTyASU0wSOlARTygTX9QRN
iwTV4QSV4gQX+QSRuAQSxATSxARSxQQW8gTV5wQQsQQT0wRRvQSU3wSW9gRW9wTV7ASV7QQU4wQN
lAQRwgST2QTW/AQV8gSRxATU5wTW/wSNlwTRxgQPsARU6wTV9wRRyQRV+QRT4gRLgwSRywRU8AQV
/QTV/QQRzgTS2gQQwwQS3ARR0ARS3QRNoATT6gTR0gTLiAQPuwQU+gQR1QQOsAQU/ASPvQSR1wRQ
ywTU/gSU/wST8wSKgASMmgQLjgROtQTNqARPwwQT+ASR3gST+QQT+gQPxgTQ0wQT/ATQ1ATOugQT
/gSLkwQS8gSS8gRS8wTS8wSS9AQS9QSNsQRMpAQOwARPzgSR6gRQ3QSLmATLmAQNtQSQ3wQNtgQN
tgQNtgQNtwQNtwQNuAQNuAQNuQQNuQQNugQNugQNuwQNuwQNuwQNvAQNvAQNvQQNvQQNvgQNvgQN
vwQNvwQNwAQNwAQNwAQNwQQNwQQNwgQNwgQNwwQNwwQNxAQNxAQNxQQNxQQNxQQNxgQNxgQNxwQN
xwQNyAQNyAQNyQQNyQQNygQNygQNygQNywQNywQNzAQNzAQNzQQNzQQNzgQNzgQNzwQNzwQNzwQN
0AQN0AQN0QQN0QQN0gQN0gQN0wQN0wQN1AQN1AQN1AQN1QQN1QQN1gQN1gQN1wQN1wQN2AQN2AQN
2AQN2QQN2QQN2gQN2gQN2wQN2wQN3AQN3AQN3QQN3QQN3QQN3gQN3gQN3wQN3wQN4AQN4AQN4QQN
4QQN4gQN4gQN4gD//whNTjNCEU84C4oDA2OvA2O4A+KzA23vAyO7A6rhA6XHA+O9A9+oA2vrAyzy
A6vtAx+sA2PDA2XPA6rsAyPGA+3/AyLCA+PIAyryAxeFA6PLA12pAx6wA6r3A2LJA2C+AyPRA+r7
Ayr9AyjyAyn5A2HJA6PWA1WBA+bqA2PZAx67Ayf0AyPcA6j8AxurA+PeA6j/A2f6A6PhA+ToA9qo
A2PkA5WJA5aQAyPnAyX1A+DUA+PpA2TxAyHeA6PsA57LAxWPA2PvA1OCA9OCAyPyA9WRAx7RA+P0
A6HnA6T9A6P3AyDjA2P5A2P6A9adA1WXAyP9A5q8AyDpA+P/AyHyA6DrA9epAxvIAx7fAxzRA9rC
A57hA2DxA53bA5WfA6H7A2H8A5ewAx7nA1WiA+H/AxarA+D5AxGFAxzcA57sA13lAx/2Axe3A9Wn
A1rQA1/5Ax7yA9/6A5WqA5/8A5vcAx/+A1OcA13vA1OdA9OdA9vgA9nQAxWwAxvjAx79A9zsA5rc
A9WyA1fEA134Ax35A0+BAxzyA1GTAxCLA9a/A539A1W4AxncAxfLA9bCA5z4AxW7A5SyA9roA8+G
A1rqAxz9A9z9A1v1A5fRA1jbA5v3A5jcA1S4A1rwA1fVA1XDAxbNA0+MA1nqA1fYAxXGAxbQA5r2
AxKrAw+PA9XIAxO2A5O2AxO3A5O3A5XLA8+RA1KvAxr+A5bXA1XOA5fiA1XPA5n3A1baAxXRA5fl
Axn6A9jwA1jxAxjyA5jyAxfpA9GsA5j0A5XWAw2FAw+aA9fsA1TOA1XZA9j4A9bkA9fvAxTRAxXc
Axj8A5bnA9CoA9GzA46UA4+fA9K/A9f1A1f2A5XhA9LBA1btA0+iA1f5A1XkAxPPA5PPAxPQA5PQ
AxbyA5PRAxPSA5PSAxPTA9XpAxPUA8+nA5b2A1LKA5XsA82SA5XtAxLMA4+qA1XvAxHCAxC3A1b8
Axb9AxXyAxTnA1LQA1b/A9b/A9X0A5TpAxTqAw+wA82YA5X3A1TsA1HJA0yOA1C+A1X6A0uDA1Tv
A9X7A1LYAxX9A1HNAxTyA5X+A9LaA9X/A0uGAw2fA5LcA0+4A9PpA1PqA9PqA1PrA9PrA1PsAw+7
A9LgA82iAwuKAw6wA9LiA5T8AxT9A5HXAw2lAxLlAxT/A5T/A8uMAxLnA9DNA4yaA5HbA9LoA461
A82oA0/DA9LqA1LrA5HeAP//EE8rLwRfU0JfUENJMFNCUkdBU09DCEc0VDASIAQMEAAHBA1DUFUg
US1GQU4gQ29udHJvbAAMAAAAgAAIRzRUMRJBBAgMEQAIBA1DUFUgUS1GQU4gUHJvZmlsZQAMAQAQ
AAANCgMNT3B0aW1hbAANU2lsZW50AA1QZXJmb3JtYW5jZQAIRzRUMhIqBwwXAAMEDUNQVSBULUNv
bnRyb2wgcmVmZXJlbmNlAAwAAABAAAABDQpkCEc0MjASJAQMcAAHBA1DaGFzc2lzIFEtRkFOIENv
bnRyb2wADAAAAIAACEc0MjESRQQIDHEACAQNQ2hhc3NpcyBRLUZBTiBQcm9maWxlAAwBAHEAAA0K
Aw1PcHRpbWFsAA1TaWxlbnQADVBlcmZvcm1hbmNlAAhHUlA0EhYFRzRUMEc0VDFHNFQyRzQyMEc0
MjEUSwlHSVQ0AQhfVF8wAHB7aAv//wBfVF8woBSTX1RfMA0KEHBHTlZTC9MWQVNCMaFNBqAUk19U
XzANChFwR05WUwskJkFTQjGhRQWgHJNfVF8wDQoXcEdOVlMLKEdgcnlgAQANCihBU0IxoTWgFJNf
VF8wDQpwcEdOVlML1hZBU0IxoR6gFJNfVF8wDQpxcEdOVlMLJiZBU0IxoQdwAEFTQjAUQA5TSVQ0
AwhfVF8wAHB7aAv//wBfVF8woC2TX1RfMA0KEKAkkpNHTlZTC9MWaaANe2oBAFNOVlML0xZpfUFT
QjANCgJBU0IwoUkJoC2TX1RfMA0KEaAkkpNHTlZTCyQmaaANe2oBAFNOVlMLJCZpfUFTQjANCgJB
U0IwoUgGoC2TX1RfMA0KcKAkkpNHTlZTC9YWaaANe2oBAFNOVlML1hZpfUFTQjANCgJBU0IwoTeg
LZNfVF8wDQpxoCSSk0dOVlMLJiZpoA17agEAU05WUwsmJml9QVNCMA0KAkFTQjChB3AAQVNCMBBB
DQovBF9TQl9QQ0kwU0JSR0FTT0MIRzVUMBIeBwwAAAgFDUFJIFByb2ZpbGUAAAANCgINQXV0bwAA
CEdSUDUSBgFHNVQwFC1HSVQ1AQhfVF8wAHB7aAv//wBfVF8woA2TX1RfMABwAUFTQjGhB3AAQVNC
MBQuU0lUNQMIX1RfMABwe2gL//8AX1RfMKAOk19UXzAAcA0KA0FTQjChB3AAQVNCMBBLOi8EX1NC
X1BDSTBTQlJHQVNPQwhHNjExEiQHDBEAAgYNVmNvcmUgVm9sdGFnZQAMAAAAIAALIAMLIAMNCgII
RzY2MxIkBwxjAAIGDSszLjNWIFZvbHRhZ2UADAAAACAAC5oLC5QCDQoCCEc2NjISIgcMYgACBg0r
NVYgVm9sdGFnZQAMAAAAIAALlBEL6AMNCgIIRzY2MRIjBwxhAAIGDSsxMlYgVm9sdGFnZQAMAAAA
IAAL2CcLEA4NCgIIRzYxMhImBwwSAAMGDUNQVSBUZW1wZXJhdHVyZQAMAAAAIAALWAILXgENCgII
RzYxNBIlBwwUAAMGDU1CIFRlbXBlcmF0dXJlAAwAAAAgAAvCAQssAQ0KAghHNjE1EiUHDBUAAwYN
TkIgVGVtcGVyYXR1cmUADAAAACAAC1gCC14BDQoCCEc2MTMSJAcMEwAEBg1DUFUgRmFuIFNwZWVk
AAwAAAAgAAtYAgvIGQ0KAghHNjczEikHDHMABAYNQ2hhc3NpczEgRmFuIFNwZWVkAAwAAAAgAAtY
AgvIGQ0KAghHNjgzEikHDIMABAYNQ2hhc3NpczIgRmFuIFNwZWVkAAwAAAAgAAtYAgvIGQ0KAghH
NjkzEiMHDJMABAYNTkIgRmFuIFNwZWVkAAwAAAAgAAtYAgvIGQ0KAghHNkMzEiQHDMMABAYNUG93
ZXIgRmFuIFNwZWVkAAwAAAAgAAALIBwNCgIIR1JQNhIyDEc2MTFHNjYzRzY2Mkc2NjFHNjEyRzYx
NEc2MTVHNjEzRzY3M0c2ODNHNjkzRzZDMxRFFUdJVDYBCF9UXzAAcHtoC///AF9UXzCgEpNfVF8w
DQoRcFJWTFQAQVNCMaFJEqASk19UXzANCmNwUlZMVAFBU0IxoUMRoBOTX1RfMA0KYnBSVkxUDQoC
QVNCMaFMD6ATk19UXzANCmFwUlZMVA0KA0FTQjGhRQ6gGJNfVF8wDQoScF5eLlNJT1JIV1QxQVNC
MaFJDKAYk19UXzANChRwXl4uU0lPUkhXVDBBU0IxoU0NCqAYk19UXzANChVwXl4uU0lPUkhXVDJB
U0IxoUEJoBiTX1RfMA0KE3BeXi5TSU9SSFdGMUFTQjGhRQegGJNfVF8wDQpzcF5eLlNJT1JIV0Yw
QVNCMaFJBaAYk19UXzANCoNwXl4uU0lPUkhXRjNBU0IxoT2gGJNfVF8wDQqTcF5eLlNJT1JIV0Y0
QVNCMaEioBiTX1RfMA0Kw3BeXi5TSU9SSFdGMkFTQjGhB3AAQVNCMBQGU0lUNgMQRBQvBF9TQl9Q
Q0kwU0JSR0FTT0MIRzlUMBJNBAwMAAAICQ1BSSBPdmVyY2xvY2tpbmcAAAENCgcNTWFudWFsAA1B
dXRvAA1TdGFuZGFyZAAADU4uTy5TLgAADUNQVSBMZXZlbCBVcAAIR1JQORIGAUc5VDAUQwVHSVQ5
AQhfVF8wAHB7aAv//wBfVF8woDKTX1RfMACgHpNHTlZTCw0KVwCgE5NHTlZTC7M1DQoGU05WUwuz
NQFwR05WUwuzNUFTQjGhB3AAQVNCMBRMB1NJVDkDCF9UXzAAcHtoC///AF9UXzCgSwWTX1RfMACg
QgWSk0dOVlMLszVpoDp7agEAoBiTaQ0KBqASk0dOVlMLwzUAcABBU0IwpACgE5NHTlZTC7M1DQoG
U05WUwvDNQBTTlZTC7M1aX1BU0IwDQoCQVNCMKEHcABBU0IwEEZCLwRfU0JfUENJMFNCUkdBU09D
CEdCVDASIgcMAQAGCw1TeXN0ZW0gUGVyZm9ybWFuY2UAAAANCgMBDQoECEdCVDESKAcMAgAGCw1T
eXN0ZW0gUGVyZm9ybWFuY2UgQ29udHJvbAAAAAAAAAhHQlQyEhkHDAMABgsNU3lzdGVtIEdVSQAN
CgQAAAAACEdCVDMSHgcMBgAFCw1BSSBHZWFyIHB1c2ggdXAAAAEAAQ0KHwhHQlQ0Eh8HDAcABQsN
QUkgR2VhciBwb3AgZG93bgAAAQABDQozCEdCVDUSGgcMEAAGCw1MZXZlbCBTd2l0Y2gAAAAAAAAI
R0JUNxIhBwwhAAYLDUFJIEdlYXIgTkIgdm9sdGFnZQAAAAABDQoCCEdCVDgSJwcMIgAGCw1BSSBH
ZWFyIGxvYWQgbGluZSBzZWxlY3QAAAAAAQ0KAghHQlQ5EiIHDCMABgsNQUkgR2VhciBDUFUgdm9s
dGFnZQAAAAABDQoCCEdSUEISJglHQlQwR0JUMUdCVDJHQlQzR0JUNEdCVDVHQlQ3R0JUOEdCVDkU
RQ9HSVRCAQhfVF8wAHB7aAv//wBfVF8woBqTX1RfMAFwe4OIR0JUMA0KAgAL//8AQVNCMaFBDKAW
k19UXzANCgJwg4hHQlQxDQoCAEFTQjGhRw0KoBaTX1RfMA0KA3CDiEdCVDINCgIAQVNCMaFNCKAS
k19UXzANCgZwR0RFRgBBU0IxoUcHoBOTX1RfMA0KB3BHREVGDQoFQVNCMaFABqATk19UXzANCiBw
R0RFRg0KA0FTQjGhSQSgEpNfVF8wDQohcEdERUYBQVNCMaEzoBOTX1RfMA0KInBHREVGDQoEQVNC
MaEdoBOTX1RfMA0KI3BHREVGDQoCQVNCMaEHcABBU0IwFEUZU0lUQgMIX1RfMABwe2gL//8AX1Rf
MKBECJNfVF8wAQhfVF8xAHB7agv//wBfVF8xoD2TX1RfMQCgGJNHTlZTC7M1AHBDT01TaUFTQjBB
U0IwoRxwe4OIR0JUMA0KAgAL//8AYKANCpNgAHBgUEFSMKEsoCKTX1RfMQF7aQv//2BwYIhHQlQw
DQoCAFNJQ0xgcGBQQVIwoQdwAEFTQjChRw+gKpNfVF8wDQoCcHtpDQr/AGCgEpNTVENHYAFwYIhH
QlQxDQoCAKEHcABBU0IwoUkMoCKTX1RfMA0KBnJpg4hHQlQzDQoEAGBBR1BVYIOIR0JUMw0KBQCh
Qw0KoCKTX1RfMA0KB3Jpg4hHQlQ0DQoEAGBBR1BEYIOIR0JUNA0KBQChTQegFJNfVF8wDQoQcHtp
DQr/AGBBR0xTYKFFBqAUk19UXzANCiBwe2kNCv8AYEFHRFZgoU0EoBSTX1RfMA0KIXB7aQ0K/wBg
QUdOVmChNaAUk19UXzANCiJwe2kNCv8AYEFHTElgoR6gFJNfVF8wDQojcHtpDQr/AGBBR0NWYKEH
cABBU0IwEEYNCl9HUEUUTwlfTDE3AIZcLwRfU0JfUENJMFNCUkdBU09DDQoFoEoGk1wvBV9TQl9Q
Q0kwU0JSR0FTT0NBSUdDAVwvBV9TQl9QQ0kwU0JSR0FTT0NHSVRFDAEABg5cLwVfU0JfUENJMFNC
UkdBU09DU0lDTH0LEIBcLwVfU0JfUENJMFNCUkdBU09DQVNCMQBcLwVfU0JfUENJMFNCUkdBU09D
UkNBU1uAR1BTMAFHUEJTDQpAW4EkR1BTMAEAQAZHUDAwAQAUUFdUSAEAShRHUDMyAQAPTkJQUwEQ
TecvBF9TQl9QQ0kwU0JSR0FTT0MIR0VUMRIXBwwBAAYODU9DIFN0YXR1cwAAAAAAAAhHRVQyEhgH
DBEADQoODUlDUFUgVmFsdWUAAAAAAAAIR0VUMxIYBwwSAAIODVZDUFUgVmFsdWUAAAAAAAAIR0VU
NBIYBwwTAAsODVBDUFUgVmFsdWUAAAAAAAAIR0VUNRIbBwwUAA0KDg1PQyBUaHJlc2hvbGQxAAAA
AAAACEdFVDYSGwcMFQANCg4NT0MgVGhyZXNob2xkMgAAAAAAAAhHRVQ3EhsHDBYADQoODU9DIFRo
cmVzaG9sZDMAAAAAAAAIR1JQRRIeB0dFVDFHRVQyR0VUM0dFVDRHRVQ1R0VUNkdFVDcIQURQMxIY
Cw0KQA0K9Q0K8Q0Kiw0Klg0K7g0K7w0K8A0K3Q0K3w0KAwhPQ1NUEQcNCgQAAQIDFEsSR0lURQEI
X1RfMABwe2gL//8AX1RfMKAnk19UXzABcIOIT0NTVFJCWVSDiEFEUDMAAIOIQURQMwEAAEFTQjGh
Sg6gIpNfVF8wDQoRcFJCWVSDiEFEUDMAAIOIQURQMw0KAgBBU0IxoUQMoCKTX1RfMA0KEnBSV1JE
g4hBRFAzAACDiEFEUDMNCgMAQVNCMaFOCaAik19UXzANChNwUldSRIOIQURQMwAAg4hBRFAzDQoE
AEFTQjGhSAegIpNfVF8wDQoUcFJCWVSDiEFEUDMAAIOIQURQMw0KBQBBU0IxoUIFoCKTX1RfMA0K
FXBSQllUg4hBRFAzAACDiEFEUDMNCgYAQVNCMaEsoCKTX1RfMA0KFnBSQllUg4hBRFAzAACDiEFE
UDMNCgcAQVNCMaEHcABBU0IwFEIIU0lURQMIX1RfMABwe2gL//8AX1RfMKAek19UXzANChRXQllU
g4hBRFAzAACDiEFEUDMNCgUAaaFKBKAek19UXzANChVXQllUg4hBRFAzAACDiEFEUDMNCgYAaaEo
oB6TX1RfMA0KFldCWVSDiEFEUDMAAIOIQURQMw0KBwBpoQdwAEFTQjAIT01OQhEFDQoCAAAIQ0RU
QhETDQoQAgMFCQQGDQoSCAwUJBAYKEgIRlNCTBINARINCgQNClMNCoUNClMNCoUIT01TVBELDQoI
AQABAQAAAgMIREZTQhELDQoIAAANCg0KAwABAQhPTFRCERcNChQAAAAAAAAAAAAAAAAAAAAAAAAA
AAhMRExFEh4EEgUDAAAAEgUDAAAAEgcDDQoQDQoUABIHAw0KEA0KFAAIQ1VWUhIdBBIFAwAAABIF
AwAAABIGAwANCj4AEgcDDQo+DQo/AAhDTEtCEScNCiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAACMQ0xLQgBDQjAwjENMS0IBQ0IwMYxDTEtCDQoLQ0IxMYxDTEtCDQoMQ0IxMoxD
TEtCDQoUQ0IyMIxDTEtCDQoWQ0IyMoxDTEtCDQoXQ0IyM4xDTEtCDQoYQ0IyNIxDTEtCDQoZQ0Iy
NYxDTEtCDQodQ0IyOQhGU0JUAAhBSUdDAAhQSUNMAQhMVklDAAhDRElWABRFE1NUQ0cBCF9UXzAA
cHtoDQr/AF9UXzCgTgiTX1RfMABwUkJMSw0K0gANChpDTEtCoEoGkpNHTlZTC7M1AHB9Q0IwMA0K
IABDQjAwcH1DQjAxDQoQAENCMDFwe0NCMjANCvsAQ0IyMHB7Q0IyMg0K9wBDQjIycIOIg4hGU0JM
RlNCVAANCgIAQ0IxMXCDiIOIRlNCTEZTQlQADQoDAENCMTJXQkxLDQrSAA0KGkNMS0KhTAigRQiT
X1RfMAFwUkJMSw0K0gANCiFDTEtCoD99e5ODiE9NTkIAAACTg4hPTU5CAQAAAJKTg4hPTU5CAABD
QjExAHBDQjExiE9NTkIAAHBDQjEyiE9NTkIBAHCDiENEVEJ7Q0IyOQ0KDwAAQ0RJVnAARlNCVKAU
k0dOVlMLszUAU1ZPVAAAQ0IxMqEDpACkARRODQpDT01TAghfVF8wAHB7aAv//wBfVF8woA+TX1Rf
MAsAgKR7aQ0K+2mhTwegG5NfVF8wCwBAoBGTg4hPTVNUAAABpHtpDQr7aaFABqAZk19UXzAAoBGT
g4hPTVNUAQABpHtpDQr7aaFDBKAak19UXzABoBKTg4hPTVNUDQoCAAGke2kNCvtpoSWgG5NfVF8w
DQoCoBKTg4hPTVNUDQoDAAGke2kNCvtpoQekfWkNCgRppH1pDQoEaRRADkdERUYBCF9UXzAAcHto
DQr/AF9UXzCgM5NfVF8wAKAVk0dOVlMLszUAdw0KBEdOVlMLszVgoQZ3DQoEAWCkg4hERlNCckxW
SUNgAAChRAmgEZNfVF8wAaRHVk9UAUxWSUOhTwegE5NfVF8wDQoCpEdWT1QNCgJMVklDoUgGoBOT
X1RfMA0KA6RHVk9UDQoDTFZJQ6FBBaATk19UXzANCgSkR1ZPVA0KBExWSUOhOqA0k19UXzANCgWg
FZNHTlZTC7M1AHcNCgRHTlZTC7M1YKEGdw0KBAFgpIOIREZTQnJMVklDYAAAoQOkABRHDENBTU4B
oDaTR05WUwuzNQB7g4hPTU5CAAANCj9gcIOIT01OQgEAYX15YQ0KA2J5eoOIT01OQgAADQoGYgFi
YaFDBHuDiIOIRlNCTEZTQlQAAAANCj9gcIOIg4hGU0JMRlNCVAABAGF9eWENCgNieXqDiIOIRlNC
TEZTQlQAAAANCgZiAWJhcEdOVlMLAKdidwuYBWFkeGQNCmRlY3hjYGVjcENESVZkd2hkZ3d3Z2Bg
DQpkYHhgC5gFZWB6YA0KA2CgCJRgDQr/pA0K/6EDpGAUJEFHUFUCoBuUaABwQ0FNTkNBRlMBaGlg
U1ZPVABMVklDYKQBFCFBR1BEAqAYlGgAU1ZPVABMVklDQ0FNTkNBRlMAaGmkARQOQUdMUwFwaExW
SUOkARQTQUdEVgFTVk9UDQoDTFZJQ2ikARQSQUdOVgFTVk9UAUxWSUNopAEUE0FHTEkBU1ZPVA0K
BExWSUNopAEUE0FHQ1YBU1ZPVA0KAkxWSUNopAEUGVNWT1QDcmh3aQ0KBQBgcGqIT0xUQmAApAEU
GkdWT1QCcmh3aQ0KBQBgcIOIT0xUQmAAYaRhFE0FQ0FGUwMIX1RfMABwe2gNCv8AX1RfMKAgk19U
XzAAd2lqYHQNCmRgYHdHTlZTCwCnYGB4YA0KZGVgoSKgIJNfVF8wAXdpamByYA0KZGB3R05WUwsA
p2BgeGANCmRlYKRgFEsQU0lDTAGgTAh7aAsAgABwAUFJR0MIX1RfMABwe2gNCv8AX1RfMKALk19U
XzAASVRBVKFBBqATk19UXzANChBTUElDAHAAUElDTKFKBKATk19UXzANChFTUElDAXABUElDTKEz
oBWTX1RfMA0KElNQSUMNCgJwDQoCUElDTKEboBWTX1RfMA0KE1NQSUMNCgNwDQoDUElDTKEDpACh
RAdwAEFJR0OgEntoCwBAAFNQSUMAcABQSUNMoUgFCF9UXzEAcHtoDQr/AF9UXzGgEpNfVF8xAFNQ
SUMBcAFQSUNMoTKgFJNfVF8xAVNQSUMNCgJwDQoCUElDTKEboBWTX1RfMQ0KAlNQSUMNCgNwDQoD
UElDTKEDpACkARROEFNQSUMBoEQIkpRoUElDTHBHVk9UAWhOQlBTV0JZVIOIQURQMwAAg4hBRFAz
DQoIAIOIg4hDVVZSaABHVk9UDQoCaABXQllUg4hBRFAzAACDiEFEUDMNCgkAg4iDiExETEVoAEdW
T1QNCgRoAKAMkpVoDQoCcABQV1RIoQdwAVBXVEigDJNBSUdDAFNGU0JooU0HoAyTQUlHQwBTRlNC
aKAMkpVoDQoCcABQV1RIoQdwAVBXVEhXQllUg4hBRFAzAACDiEFEUDMNCgkAg4iDiExETEVoAEdW
T1QNCgRoAFdCWVSDiEFEUDMAAIOIQURQMw0KCACDiIOIQ1VWUmgAR1ZPVA0KAmgAcEdWT1QBaE5C
UFNSQ0FTCFBTTFYSIAQSBQMAAAASBgMAAA0K/xIHAwANCv8NCv8SCAMNCv8NCv8NCv8UQhdTRlNC
AXBSQkxLDQrSAA0KGkNMS0Jwe0NCMDANCt8AQ0IwMHB9Q0IwMQ0KEABDQjAxcHtDQjIwDQr7AENC
MjBwe0NCMjINCvcAQ0IyMnBDQjExYXBDQjEyYqBABZNHTlZTC7M1AKApk4OIT01TVHJoDQoEAAAA
cIOIT01OQgAAQ0IxMXCDiE9NTkIBAENCMTKhF3BHVk9UAIOIT01TVHJoDQoEAABDQjEycABloUUF
oC6TaAFwg4iDiEZTQkxGU0JUAA0KAgBDQjExcIOIg4hGU0JMRlNCVAANCgMAQ0IxMqEgcIOIg4hG
U0JMRlNCVAAAAENCMTFwR1ZPVABoQ0IxMnAAZVdCTEsNCtIADQoaQ0xLQldCWVSDiEFEUDMAAIOI
QURQMw0KBQCDiIOIUFNMVmUAAABXQllUg4hBRFAzAACDiEFEUDMNCgYAg4iDiFBTTFZlAAEAV0JZ
VIOIQURQMwAAg4hBRFAzDQoHAIOIg4hQU0xWZQANCgIAWyIL6AMURhhJVEFUAHBSQkxLDQrSAA0K
GkNMS0KgRAeTR05WUwuzNQBwe0NCMDANCt8AQ0IwMHB7Q0IwMQ0K7wBDQjAxcH1DQjIwDQoEAENC
MjBwfUNCMjINCggAQ0IyMnCDiE9NTkIBAENCMTJwg4hPTU5CAQBDQjI0cEdWT1QADQoDQ0IyM3BH
Vk9UAA0KA0NCMjVwAGChRQhwe0NCMDANCt8AQ0IwMHB7Q0IwMQ0K7wBDQjAxcH1DQjIwDQoEAENC
MjBwfUNCMjINCggAQ0IyMnCDiIOIRlNCTEZTQlQAAABDQjExcIOIg4hGU0JMRlNCVAABAENCMjRw
R1ZPVAANCgJDQjIzcEdWT1QADQoDQ0IyNXRHVk9UAAABQ0IxMnABYFdCWVSDiEFEUDMAAIOIQURQ
Mw0KBQCDiIOIUFNMVmAAAABXQllUg4hBRFAzAACDiEFEUDMNCgYAg4iDiFBTTFZgAAEAV0JZVIOI
QURQMwAAg4hBRFAzDQoHAIOIg4hQU0xWYAANCgIAWyIL6ANXQkxLDQrSAA0KGkNMS0IUG1JDQVMA
U0JZVIOIQURQMwAAg4hBRFAzDQoNCgAQQkwvBF9TQl9QQ0kwU0JSR0FTT0MIR0YwMRI/CAwAAAgP
DUNQVSBMZXZlbCBVcAAAAA0KAw1PcmlnaW5hbAANaTctOTQwLTIuOTNHAA1pNy05NjUtMy4yMEcA
CEdGMDISQgQIDAAACA8NQ1BVIExldmVsIFVwAAAADQoDDU9yaWdpbmFsAA1pNy05NjUtMy4yMEcA
DWk3LWNyYXp5LTMuNjBHAAhHRjAzEkQECAwAAAgPDUNQVSBMZXZlbCBVcAAAAA0KAw1PcmlnaW5h
bAANaTctY3JhenktMy42MEcADWk3LWNyYXp5LTQuMDBHAAhHRjA0EkIECAwAAAgPDUNQVSBMZXZl
bCBVcAAAAA0KAw1PcmlnaW5hbAANaTctOTc1LTMuMzNHAA1pNy1jcmF6eS0zLjcwRwAIR0YwNRJE
BAgMAAAIDw1DUFUgTGV2ZWwgVXAAAAANCgMNT3JpZ2luYWwADWk3LWNyYXp5LTMuNzVHAA1pNy1j
cmF6eS00LjIwRwAIR0YwNhJEBAgMAAAIDw1DUFUgTGV2ZWwgVXAAAAANCgMNT3JpZ2luYWwADWk3
LWNyYXp5LTMuNDZHAA1pNy1jcmF6eS00LjAwRwAIR0YwNxJEBAgMAAAIDw1DUFUgTGV2ZWwgVXAA
AAANCgMNT3JpZ2luYWwADWk3LWNyYXp5LTMuNDZHAA1pNy1jcmF6eS00LjAwRwAIR0YwOBJEBAgM
AAAIDw1DUFUgTGV2ZWwgVXAAAAANCgMNT3JpZ2luYWwADWk3LWNyYXp5LTQuMDBHAA1pNy1jcmF6
eS00LjIwRwAIR0YwORI/CAwAAAgPDUNQVSBMZXZlbCBVcAAAAA0KAw1PcmlnaW5hbAANaTctOTUw
LTMuMDZHAA1pNy05NjUtMy4yMEcACEdGMTASRAQIDAAACA8NQ1BVIExldmVsIFVwAAAADQoDDU9y
aWdpbmFsAA1pNy1jcmF6eS0zLjYwRwANaTctY3JhenktMy44NUcACEdGMTESQwQIDAAACA8NQ1BV
IExldmVsIFVwAAAADQoDDU9yaWdpbmFsAA1pNy05ODBYLTMuMzNHAA1pNy1jcmF6eS0zLjYwRwAU
RQ9HUlBGAHBHTlZTCw0KV2AIX1RfMABwYF9UXzCgD5NfVF8wAaQSBgFHRjAxoUQMoBCTX1RfMA0K
AqQSBgFHRjAyoUALoBCTX1RfMA0KA6QSBgFHRjAzoUwJoBCTX1RfMA0KBKQSBgFHRjA0oUgIoBCT
X1RfMA0KBaQSBgFHRjA1oUQHoBCTX1RfMA0KBqQSBgFHRjA2oUAGoBCTX1RfMA0KB6QSBgFHRjA3
oUwEoBCTX1RfMA0KCKQSBgFHRjA4oTigEJNfVF8wDQoJpBIGAUdGMDmhJaAQk19UXzANCg0KpBIG
AUdGMTChEqAQk19UXzANCgukEgYBR0YxMaQSAgAUM0dJVEYBCF9UXzAAcHtoC///AF9UXzCgE5Nf
VF8wAHBHTlZTC8M1QVNCMaEHcABBU0IwFEQGU0lURgMIX1RfMABwe2gL//8AX1RfMKBLBJNfVF8w
AHAAQVNCMKAPk2oAfUFTQjANCgNBU0IwoCx7agEAcGlQQVIwSVNNSQ0KrHB7UEFSMAv//wBgoA+T
YAF9QVNCMA0KA0FTQjBbgC8EX1NCX1BDSTBTQlJHUElYMAINCmANCgxbgT9cLwRfU0JfUENJMFNC
UkdQSVgwAVBJUkEIUElSQghQSVJDCFBJUkQIACBQSVJFCFBJUkYIUElSRwhQSVJICBBORV9TQl8I
QlVGQREJDQoGIwCAGHkAi0JVRkEBSVJBMFuCRQhMTktBCF9ISUQMQdAMDwhfVUlEARQZX1NUQQB7
UElSQQ0KgGCgBWCkDQoJoQSkDQoLFAtfUFJTAKRQUlNBFBFfRElTAH1QSVJBDQqAUElSQRQaX0NS
UwB7UElSQQ0KD2B5AWBJUkEwpEJVRkEUG19TUlMBi2gBSVJBX4JJUkFfYHZgcGBQSVJBW4JGCExO
S0IIX0hJRAxB0AwPCF9VSUQNCgIUGV9TVEEAe1BJUkINCoBgoAVgpA0KCaEEpA0KCxQLX1BSUwCk
UFJTQhQRX0RJUwB9UElSQg0KgFBJUkIUGl9DUlMAe1BJUkINCg9geQFgSVJBMKRCVUZBFBtfU1JT
AYtoAUlSQV+CSVJBX2B2YHBgUElSQluCRghMTktDCF9ISUQMQdAMDwhfVUlEDQoDFBlfU1RBAHtQ
SVJDDQqAYKAFYKQNCgmhBKQNCgsUC19QUlMApFBSU0MUEV9ESVMAfVBJUkMNCoBQSVJDFBpfQ1JT
AHtQSVJDDQoPYHkBYElSQTCkQlVGQRQbX1NSUwGLaAFJUkFfgklSQV9gdmBwYFBJUkNbgkYITE5L
RAhfSElEDEHQDA8IX1VJRA0KBBQZX1NUQQB7UElSRA0KgGCgBWCkDQoJoQSkDQoLFAtfUFJTAKRQ
UlNEFBFfRElTAH1QSVJEDQqAUElSRBQaX0NSUwB7UElSRA0KD2B5AWBJUkEwpEJVRkEUG19TUlMB
i2gBSVJBX4JJUkFfYHZgcGBQSVJEW4JGCExOS0UIX0hJRAxB0AwPCF9VSUQNCgUUGV9TVEEAe1BJ
UkUNCoBgoAVgpA0KCaEEpA0KCxQLX1BSUwCkUFJTRRQRX0RJUwB9UElSRQ0KgFBJUkUUGl9DUlMA
e1BJUkUNCg9geQFgSVJBMKRCVUZBFBtfU1JTAYtoAUlSQV+CSVJBX2B2YHBgUElSRVuCRghMTktG
CF9ISUQMQdAMDwhfVUlEDQoGFBlfU1RBAHtQSVJGDQqAYKAFYKQNCgmhBKQNCgsUC19QUlMApFBS
U0YUEV9ESVMAfVBJUkYNCoBQSVJGFBpfQ1JTAHtQSVJGDQoPYHkBYElSQTCkQlVGQRQbX1NSUwGL
aAFJUkFfgklSQV9gdmBwYFBJUkZbgkYITE5LRwhfSElEDEHQDA8IX1VJRA0KBxQZX1NUQQB7UElS
Rw0KgGCgBWCkDQoJoQSkDQoLFAtfUFJTAKRQUlNHFBFfRElTAH1QSVJHDQqAUElSRxQaX0NSUwB7
UElSRw0KD2B5AWBJUkEwpEJVRkEUG19TUlMBi2gBSVJBX4JJUkFfYHZgcGBQSVJHW4JGCExOS0gI
X0hJRAxB0AwPCF9VSUQNCggUGV9TVEEAe1BJUkgNCoBgoAVgpA0KCaEEpA0KCxQLX1BSUwCkUFJT
SBQRX0RJUwB9UElSSA0KgFBJUkgUGl9DUlMAe1BJUkgNCg9geQFgSVJBMKRCVUZBFBtfU1JTAYto
AUlSQV+CSVJBX2B2YHBgUElSSBBJJV9TQl8IWENQRAAIWE5QVAEIWENBUA0KAghYRENQDQoECFhE
Q1QNCggIWERTVA0KDQoIWExDUA0KDAhYTENUDQoQCFhMU1QNChIIWFNDUA0KFAhYU0NUDQoYCFhT
U1QNChoIWFJDVA0KHFsBTVVURQAUNlJCUEUBWyNNVVRF6ANyaFBDSUJgW4BQQ0ZHAGABW4ELUENG
RwFYQ0ZHCFsnTVVURaRYQ0ZHFD9SV1BFAVsjTVVURegDe2gM/v///2hyaFBDSUJgW4BQQ0ZHAGAN
CgJbgQtQQ0ZHAlhDRkcQWydNVVRFpFhDRkcUP1JEUEUBWyNNVVRF6AN7aAz8////aHJoUENJQmBb
gFBDRkcAYA0KBFuBC1BDRkcDWENGRyBbJ01VVEWkWENGRxQ3V0JQRQJbI01VVEX/D3JoUENJQmBb
gFBDRkcAYAFbgQtQQ0ZHAVhDRkcIcGlYQ0ZHWydNVVRFFEEEV1dQRQJbI01VVEXoA3toDP7///9o
cmhQQ0lCYFuAUENGRwBgDQoCW4ELUENGRwJYQ0ZHEHBpWENGR1snTVVURRRBBFdEUEUCWyNNVVRF
6AN7aAz8////aHJoUENJQmBbgFBDRkcAYA0KBFuBC1BDRkcDWENGRyBwaVhDRkdbJ01VVEUUSQRS
V0RQA1sjTVVURegDe2gM/P///2hyaFBDSUJgW4BQQ0ZHAGANCgRbgQtQQ0ZHA1hDRkcge1hDRkdq
YX1haVhDRkdbJ01VVEUUNVJQTUUBcmgNCoRgcFJEUEVgYaAGk2H/pAChG6AXkGEMAAABAFdEUEVg
e2EMAAABAACkAaQAW4BTTVJHAVNNQlMNChBbgS5TTVJHAUhTVFMIU1NUUwhIU1RDCEhDTUQISEFE
UghIRFQwCEhEVDEIQkxLRAhbgQ1TTVJHAQAoSERUVxAUSg0KU0NNRAxwDQoFYKJFCXZgcAv//2Gi
E5BIU1RTdmFwDQr+SFNUU1shDQoNCnBIU1RDYnBoSEFEUnBpSENNRHBqSERUV3BrSFNUQ3AL//9h
oi12YaAMe0hTVFMNCgwAcAFhoBiTe0hTVFMNCgMADQoCcA0KQEhTVFOkSERUV1shDQoNCnANCkJI
U1RDcAv//2GiFHZhoAx7SFNUUw0KEABwAWFbIQ0KDQpwAEhTVENwDQpASFNUU6T/FA9TQllUAlND
TURoaQANCkQUD1dCWVQDU0NNRGhpag0KSBQPV1dSRANTQ01EaGlqDQpMFBhSU0JUAn1oAWike1ND
TURoaQANCkQNCv8AFBhSQllUAn1oAWike1NDTURoaQANCkgNCv8AFBRSV1JEAn1oAWikU0NNRGhp
AA0KTBRHBFJCTEsDfWgBYFNDTURgaWoNClRwSFNUQ2BwSERUMGByYAFnCFJCVUYRAmdwAGGiEmBw
QkxLRIhSQlVGYQB2YHVhpFJCVUYUL1dCTEsEcEhTVENgcABgohGSlGBqcIOIa2AAQkxLRHVge2gN
Cv5gU0NNRGBpag0KVBBKri8EX1NCX1BDSTBTQlJHU0lPUghTTkNUAAhFMUJLABQPSFdWMACkd1ZD
T1INCggAFA9IV1YxAKR3VjEyVg0KCAAUD0hXVjMApHdWMzNWDQoIABQPSFdWNACkd1Y1MFYNCggA
FCJIV1QwAHBNQlRFYaAOe2ENCoAAfWEMAP///2F3YQ0KDQphpGEUSQ1IV1QxAEVORkcNCgygJ5KT
Q1JFMUUxQkugEJNFMUJLAHBDUkUxRTFCS6ENCnBFMUJLQ1JFMUVYRkegTgaVU05DVA0KAnABQlNF
THBUU1IxY3AAQlNFTHJNQlRFAWF/YQ0KgGF/Yw0KgGOgQQSUYWNFTkZHDQoMoCyQQ1JFMA0K8HRh
Y2N6YwFjcmMNCgNjckNSRTFjQ1JFMXBDUkUxRTFCS1siDQoydVNOQ1RFWEZHcAFCU0VMcFRTUjFh
oA57YQ0KgAB9YQwA////YXdhDQoNCmFwVFNSMmJ3Yg0KBWJyYWJhpGEUOEhXVDIAcA0KAkJTRUxw
VFNSMWGgDnthDQqAAH1hDAD///9hd2ENCg0KYXBUU1IyYndiDQoFYnJhYmGkYVuAREJHRQENCoAN
CgRbgQtEQkdFAkRCR0cWFEwbSFdGMABwRkFOMWBwAEJTRUx7RkQyMQ0KIGF6YQ0KBWF3YQ0KBGF7
RkRSMQ0KMGJ6Yg0KBGJyYWJhoEkGkZRhDQoFlWENCgKgCZRgDQrwcA0KAmGhEaAJlWANCh5wDQoF
YaEFcA0KA2F4YQ0KBGJjeWMNCgVjcEZEMjFke2QNCt9kfWNkRkQyMXBGRFIxZHtkDQrPZHliDQoE
Yn1kAWR9ZGJGRFIxWyINCjJwRkFOMWCiRA6RkJRgDQrwlWENCgWQlWANCh6UYQ0KAqBLBpCUYA0K
8JVhDQoFcmEBYXhhDQoEYmNwAEJTRUx5Yw0KBWNwRkQyMWR7ZA0K32R9Y2RGRDIxcEZEUjFke2QN
Cs9keWINCgRifWQBZH1kYkZEUjFbIg0KMnBGQU4xYFsiDQoycEZBTjFgWyINCjJwRkFOMWChQgZ0
YQFheGENCgRiY3AAQlNFTHljDQoFY3BGRDIxZHtkDQrfZH1jZEZEMjFwRkRSMWR7ZA0Kz2R5Yg0K
BGJ9ZAFkfWRiRkRSMVsiDQoycEZBTjFgWyINCjJwRkFOMWBbIg0KMnBGQU4xYKAMkJNgDQr/k2EN
CgWkAKANkJNgAJNhDQoCpAv//3ABYqIJYXdiDQoCYnZhd2BiYHgMcJkUAGBhYKRgFE4cSFdGMQBw
AEJTRUxwRkFOMmB7RkQyMQ0KQGF6YQ0KBmF3YQ0KBGF7RkRSMQ0KwGJ6Yg0KBmJyYWJhoE8GkZRh
DQoFlWENCgKgCZRgDQrwcA0KAmGhEaAJlWANCh5wDQoFYaEFcA0KA2F4YQ0KBGJjeWMNCgZjcEZE
MjFke2QNCr9kfWNkRkQyMXBGRFIxZHtkDQo/ZHliDQoGYn1kAWR9ZGJGRFIxWyINCjJwAEJTRUxw
RkFOMmCiQA+RkJRgDQrwlWENCgWQlWANCh6UYQ0KAqBBB5CVYA0KHpRhDQoCdGEBYXhhDQoEYmNw
AEJTRUx5Yw0KBmNwRkQyMWR7ZA0Kv2R9Y2RGRDIxcEZEUjFke2QNCj9keWINCgZifWQBZH1kYkZE
UjFbIg0KMnAAQlNFTHBGQU4yYFsiDQoycEZBTjJgWyINCjJwRkFOMmChSAZyYQFheGENCgRiY3AA
QlNFTHljDQoGY3BGRDIxZHtkDQq/ZH1jZEZEMjFwRkRSMWR7ZA0KP2R5Yg0KBmJ9ZAFkfWRiRkRS
MVsiDQoycABCU0VMcEZBTjJgWyINCjJwRkFOMmBbIg0KMnBGQU4yYKAMkJNgDQr/k2ENCgWkAKAN
kJNgAJNhDQoCpAv//3ABYqIJYXdiDQoCYnZhd2BiYHgMcJkUAGBhYKRgFEgcSFdGMgBwRkFOM2Bw
AEJTRUx7RkQyMQ0KgGF6YQ0KB2F3YQ0KBGF4RkQxMw0KQGJjcmFjYaBIBpGUYQ0KBZVhDQoCoAmU
YA0K8HANCgJhoRGgCZVgDQoecA0KBWGhBXANCgNheGENCgRiY3ljDQoHY3BGRDIxZHtkDQp/ZH1j
ZEZEMjFwRkQxM2N7Yw0KP2N3Yg0KQGJyY2JicGJGRDEzWyINCjJwRkFOM2CiRQ+RkJRgDQrwlWEN
CgWQlWANCh6UYQ0KAqBNB5CUYA0K8JVhDQoFoAmTYA0K/3ANCgVhoQVyYQFheGENCgRiY3AAQlNF
THljDQoHY3BGRDIxZHtkDQp/ZH1jZEZEMjFwRkQxM2N7Yw0KP2N3Yg0KQGJyY2JicGJGRDEzoA0K
kpNgDQr/WyINCjJwRkFOM2BbIg0KMnBGQU4zYFsiDQoycEZBTjNgoUEGdGEBYXhhDQoEYmNwAEJT
RUx5Yw0KB2NwRkQyMWR7ZA0Kf2R9Y2RGRDIxcEZEMTNje2MNCj9jd2INCkBicmNiYnBiRkQxM1si
DQoycEZBTjNgWyINCjJwRkFOM2BbIg0KMnBGQU4zYKAMkJNgDQr/k2ENCgWkAKANkJNgAJNhDQoC
pAv//3ABYqIJYXdiDQoCYnZhd2BiYHgMcJkUAGBhYKRgFEUbSFdGNABwDQoFQlNFTHBGQU40YHAA
QlNFTHtGTkQ0DQqAYXphDQoHYXdhDQoEYXtGTkQ0DQoMYnpiDQoCYnJhYmGgTgWRlGENCgWVYQ0K
AqAJlGANCvBwDQoCYaERoAmVYA0KHnANCgVhoQVwDQoDYXhhDQoEYmN5Yw0KB2N5Yg0KAmJwRk5E
NGR7ZA0Kc2R9Y2JjfWNkRk5ENFsiDQoycA0KBUJTRUxwRkFONGCiQQ6RkJRgDQrwlWENCgWQlWAN
Ch6UYQ0KAqBNBpCUYA0K8JVhDQoFcmEBYXhhDQoEYmNwAEJTRUx5Yw0KB2N5Yg0KAmJwRk5ENGR7
ZA0Kc2R9Y2JjfWNkRk5ENKANCpKTYA0K/1siDQoycA0KBUJTRUxwRkFONGBbIg0KMnBGQU40YFsi
DQoycEZBTjRgcABCU0VMoU0FdGEBYXhhDQoEYmNwAEJTRUx5Yw0KB2N5Yg0KAmJwRk5ENGR7ZA0K
c2R9Y2JjfWNkRk5ENFsiDQoycA0KBUJTRUxwRkFONGBbIg0KMnBGQU40YFsiDQoycEZBTjRgcABC
U0VMoAyQk2ANCv+TYQ0KBaQAoA2Qk2AAk2ENCgKkC///cAFioglhd2INCgJidmF3YGJgeAxwmRQA
YGFgpGAIRk5EVBIRCAENCgINCgQNCggNChANCiANCkANCoAUTRNIV0YzAHAAQlNFTHBDRk4zYHtG
RDE1DQqAYXphDQoFYXtGTkQ0DQoDYn1hYmGgRAaRlGENCgWVYQ0KAqAJlGANCvBwDQoCYaERoAmV
YA0KHnANCgVhoQVwDQoDYXlhDQoFYntiDQqAYntGRDE1DQp/Y31iY2NwY0ZEMTV7YQ0KA2J7Rk5E
NA0K/GN9YmNjcGNGTkQ0WyINCjJwQ0ZOM2CiRweRkJRgDQrwlWENCgWQlWANCh6UYQ0KAqAMkJRg
DQrwlWENCgV1YaEDdmF5YQ0KBWJ7Yg0KgGJ7RkQxNQ0Kf2N9YmNjcGNGRDE1e2ENCgNie0ZORDQN
CvxjfWJjY3BjRk5ENFsiDQoycENGTjNgWyINCjJwQ0ZOM2BbIg0KMnBDRk4zYKAMkJNgDQr/k2EN
CgWkAKANkJNgAJNhDQoCpAv//3CDiEZORFRhAGJ3YGJgeAxwmRQAYGFgpGBbgEhXUkUBSU9IVw0K
DQpbgRJIV1JFAQAoSElEWAhIREFUCFuGSQtISURYSERBVAEAIENITk0BQ0ZOTQFDSE5TAkNGTlMC
AAJTWVNUCFRSR1QIAAhTU0ROCENTRE4IU1NVUAhDU1VQCABADQpWQ09SCFYxMlYIAAhWMzNWCFY1
MFYIABBNQlRFCEZBTjEIRkFOMghGQU4zCABADQpDRk4zCAA4RkRSMQgAGEZEMTMIRkQxNQgACEJT
RUwEAAQACFRTUjEIAAdUU1IyAQAIRkFONAgAKEZORDQIABhGRDIxCBBEVC8EX1NCX1BDSTBTQlJH
QVNPQwhDT1JWEh0FDAAAAgYNVmNvcmUgVm9sdGFnZQALIAMLQAYBCFYzVlYSHQUMAQACBg0gKzMu
MyBWb2x0YWdlAAuaCwsuDgEIVjVWVhIbBQwCAAIGDSArNSBWb2x0YWdlAAuUEQt8FQEIVlYxMhIc
BQwDAAIGDSArMTIgVm9sdGFnZQAL2CcL6DUBCFZQQVISIwQSBQMAAQASBwMNCiINCiIAEgkDC+gD
C/MBABIIAwvcBQ0K+QAIVkJVRhIUBQ0KBENPUlZWM1ZWVjVWVlZWMTIUTQRWR0VUAaAQk2gApF5e
LlNJT1JIV1YwoBCTaAGkXl4uU0lPUkhXVjOgEZNoDQoCpF5eLlNJT1JIV1Y0oBGTaA0KA6ReXi5T
SU9SSFdWMQhDUFVUEiMFDAAAAwYNQ1BVIFRlbXBlcmF0dXJlAAtYAgvuAgwBAAEACE1CVFASIgUM
AQADBg1NQiBUZW1wZXJhdHVyZQALwgEL7gIMAQABAAhNQ0hUEiMFDAIAAwYNTUNIIFRlbXBlcmF0
dXJlAAtYAgu2AwwBAAEACFRCVUYSEAQNCgNDUFVUTUJUUE1DSFQUKFRHRVQBoBCTaACkXl4uU0lP
UkhXVDGgEJNoAaReXi5TSU9SSFdUMAhDUFVGEiEFDAAABAYNQ1BVIEZBTiBTcGVlZAALWAILIBwM
AQABAAhDSEYxEiYFDAEABAYNQ0hBU1NJUzEgRkFOIFNwZWVkAAtYAgsgHAwBAAEACENIRjISJgUM
AgAEBg1DSEFTU0lTMiBGQU4gU3BlZWQAC1gCCyAcDAEAAQAIQ0hGMxImBQwDAAQGDUNIQVNTSVMz
IEZBTiBTcGVlZAALWAILIBwMAQABAAhQV1JGEiEFDAQABAYNUE9XRVIgRkFOIFNwZWVkAAALIBwM
AQABAAhGQlVGEhgGDQoFQ1BVRkNIRjFDSEYyQ0hGM1BXUkYUTwVGR0VUAaAQk2gApF5eLlNJT1JI
V0YxoBCTaAGkXl4uU0lPUkhXRjCgEZNoDQoCpF5eLlNJT1JIV0YzoBGTaA0KA6ReXi5TSU9SSFdG
MqARk2gNCgSkXl4uU0lPUkhXRjQUC1ZTSUYApFZCVUYUQQVSVkxUAXtoC///YHBWR0VUYGFwg4iD
iFZQQVJgAAAAYnCDiIOIVlBBUmAAAQBjcIOIg4hWUEFSYAANCgIAZHdhcmJjAGV4ZWMAZXJlZGWk
ZRRBB1NWTFQBe4OIaAAAC///YHCDiFZCVUYAAGGgB5KVYGGkAHVgcIOIaAEAiIOIVkJVRmAAAQBw
g4hoDQoCAIiDiFZCVUZgAA0KAgBwg4hoDQoDAIiDiFZCVUZgAA0KAwBwg4hoDQoEAIiDiFZCVUZg
AA0KBACkARQLVFNJRgCkVEJVRhQVUlRNUAF7aAv//2BwVEdFVGBhpGEUQwdTVE1QAXB7g4hoAAAL
//8AYHCDiFRCVUYAAGGgB5KVYGGkAHVgcIOIaAEAiIOIVEJVRmAAAQBwg4hoDQoCAIiDiFRCVUZg
AA0KAgBwg4hoDQoDAIiDiFRCVUZgAA0KAwBwg4hoDQoEAIiDiFRCVUZgAA0KBACkARQLRlNJRgCk
RkJVRhQVUkZBTgF7aAv//2BwRkdFVGBhpGEURAhTRkFOAXuDiGgAAAv//2Bwg4hGQlVGAABhoAeS
lWBhpAB1YHCDiGgBAIiDiEZCVUZgAAEAcIOIaA0KAgCIg4hGQlVGYAANCgIAcIOIaA0KAwCIg4hG
QlVGYAANCgMAcIOIaA0KBACIg4hGQlVGYAANCgQAcIOIaA0KBQCIg4hGQlVGYAANCgUApAEQRRlf
U0JfEE4YUENJMAhDUlNfEUYNCg0KoogNAAIMAAAAAAD/AAAAAAFHAfgM+AwBCIgNAAEMAwAAAAD3
DAAA+AyIDQABDAMAAAAN//8AAADzhxcAAAwDAAAAAAAADQoA//8LAAAAAAAAAAIAhxcAAAwDAAAA
AAAADAD//w0AAAAAAAAAAgCHFwAADAMAAAAAAAAAAAAAAAAAAAAAAAAAAIcXAAAMAwAAAAAAAAAA
AAAAAAAAAAAAAAAAeQCKQ1JTXw0KXE1JTjWKQ1JTXw0KYE1BWDWKQ1JTXw0KaExFTjWKQ1JTXw0K
dk1JTjaKQ1JTXw0Kek1BWDaKQ1JTXw0KgkxFTjaKQ1JTXw0KkE1JTjeKQ1JTXw0KlE1BWDeKQ1JT
Xw0KnExFTjcUSAdfQ1JTAHBNRzFMYKAfYHBNRzFCTUlONXBNRzFMTEVONXJNSU41dmBNQVg1cE1H
MkJNSU42cE1HMkxMRU42cE1HMkxgck1JTjZ2YE1BWDZwTUczQk1JTjdwTUczTExFTjdwTUczTGBy
TUlON3ZgTUFYN6RDUlNfCFdPVEIACFdTU0IACFdBWEIAFEAHX1BUUwFwaERCRzhQVFNfaHAAiFdB
S1AAAHAAiFdBS1ABAKASkJNoDQoEk09TRkwNCgJbIgu4C3BBU1NCV1NTQnBBT1RCV09UQnBBQVhC
V0FYQnBoQVNTQnBPU0ZMQU9UQnBPU1lTT1NUUHAAQUFYQhRNBl9XQUsBeWgNCgREQkc4V0FLX2ig
BUlPV0uhDoZcLl9TQl9QV1JCDQoCoCBBU1NCcFdTU0JBU1NCcFdPVEJBT1RCcFdBWEJBQVhCoBKD
iFdBS1AAAHAAiFdBS1ABAKENCnBoiFdBS1ABAKRXQUtQW4BJT1JLAQ0KswFbgQtJT1JLAUlPV0sI
CF9TMF8SBgQAAAAAoBFTUzFfCF9TMV8SBgQBAAAAoBJTUzNfCF9TM18SBwQNCgUAAACgElNTNF8I
X1M0XxIHBA0KBgAAAAhfUzVfEgcEDQoHAAAAFEIEUFRTXwGgOmhcLwRfU0JfUENJMFNCUkdTSU9T
aFwvBF9TQl9QQ0kwU0JSR1NQVFNoXC8DX1NCX1BDSTBOUFRTaBQ+V0FLXwFcLwRfU0JfUENJMFNC
UkdTSU9XaFwvBF9TQl9QQ0kwU0JSR1NXQUtoXC8DX1NCX1BDSTBOV0FLaEZBQ1NAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGQUNQhAAA
AAH+MDgwMjExRkFDUDE0MzYCCBEgTVNGVJcAAACNxAAAJAAAAAEACQCyAAAA4R4A4gAIAAAAAAAA
BAgAAAAAAABQCAAACAgAACAIAAAAAAAABAIBBBAAAONlAOkDAAQQAAEADQAyAwAApQAAAAEIAAD5
DAAAAAAAAAYAAABBUElD2AAAAAHgMDgwMjExQVBJQzE0MzYCCBEgTVNGVJcAAAAAAOD+AQAAAAAI
AQABAAAAAAgCAgEAAAAACAMEAQAAAAAIBAYBAAAAAAgFAQEAAAAACAYDAQAAAAAIBwUBAAAAAAgI
BwEAAAAACAmIAAAAAAAIDQqJAAAAAAAIC4oAAAAAAAgMiwAAAAAACA2MAAAAAAAIDo0AAAAAAAgP
jgAAAAAACBCPAAAAAAEMCAAAAMD+AAAAAAEMCQAAoMj+GAAAAAINCgAAAgAAAAAAAg0KAAkJAAAA
DQBNQ0ZHPAAAAAFxMDgwMjExT0VNTUNGRyACCBEgTVNGVJcAAAAAAAAAAAAAAAAAAOAAAAAAAAAA
/wAAAABPRU1CcgAAAAEjMDgwMjExT0VNQjE0MzYCCBEgTVNGVJcAAAANAQAAAADAAADg/wAADQAA
AAEAAAAAwAAAACAAi0D9DgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAA2Q4AANn+
AAAAAABIUEVUOAAAAAGHMDgwMjExT0VNSFBFVCACCBEgTVNGVJcAAAABo4aAAAgAAAAA0P4AAAAA
AO43AFhNQVJAAQAAAS9BTUkAAABPRU1ETUFSAAEAAABNU0ZUlwAAACYBAAAAAAAAAAAAAAAAGAAA
AAAAAPD/+wAAAAABCAAAAAAbAAAAIAABAAAAAOD/+wAAAAADCAAACPAfBwMIAAAJABMAAQBYAAAA
AAAAwA4AAAAAAP//DgAAAAAAAQgAAAAAHQABCAAAAAAdAQEIAAAAAB0CAQgAAAAAHQcBCAAAAAAa
AAEIAAAAABoBAQgAAAAAGgIBCAAAAAAaBwEAWAAAAAAAAKB9vwAAAAD/n32/AAAAAAEIAAAAAB0A
AQgAAAAAHQEBCAAAAAAdAgEIAAAAAB0HAQgAAAAAGgABCAAAAAAaAQEIAAAAABoCAQgAAAAAGgcC
ACgAAAAAAAIIAAAAAAEAAggAAAAAAgACCAAAAAADAAIIAAAAAAcAQVNQVDQAAAAGczA4MDIxMVBl
cmZUdW5lAggRIE1TRlSXAAAAAIJ5vwAAAAAAAAAAAAAAAE9TRlKwAAAAAU4wODAyMTFPRU1PU0ZS
IAIIESBNU0ZUlwAAAAEAAAAsAAAAPRNvtF8jNEafA7HAHFR4WwAAAACQAAAAcAAAAAAAAABQAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOAGEAbQBlAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAE0AYQBuAHUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU1NEVGMDAAABVURwZ1BtbUNw
dVBtAAAAEgAAAElOVEwTAQYgEEIOXAAIU1NEVBIWAw1DUFUwSVNUIAAM8IR5vwxMJAAACENTRFQS
FgMNQ1BVMENTVCAADAAAAIAMAAAAgAhUU0RUEhYDDUNQVTBUU1QgAAwAAACADAAAAIAIQ0ZHRAwC
AAAACE5DUFUMCAAAAAhOUENQDAEAAAAIUERDMAwAAACACFRCTDANCgAIQ1RCMA0KAAhUVEIwDQoA
CFBTVEUNCgAIVFNURQ0KAFuAUE1SRwELAAgNClBbgTFQTVJHAQBIIERFVjQBREVWNQFERVY2AURF
VjcBU1RTNAFTVFM1AVNUUzYBU1RTNwEQSyVcLl9QUl9QMDAxCEhJMF8NCgAISEMwXw0KAAhIVDBf
DQoAFEgGX1BEQwGKaA0KAFJFVlOKaA0KBFNJWkVwh2hgcHRgDQoIAGFbE2gNCkB3YQ0KCABURU1Q
CFNUUzARBw0KBAAAAABzU1RTMFRFTVBiX09TQxETDQoQFqZ3QAwpvkeevdhwWHE5U1JFVlNTSVpF
YhRAHV9PU0MEimsNCgBTVFMwimsNCgRDQVAwimgNCgBJSUQwimgNCgRJSUQximgNCghJSUQyimgN
CgxJSUQzCFVJRDAREw0KEBamd0AMKb5Hnr3YcFhxOVOKVUlEMA0KAEVJRDCKVUlEMA0KBEVJRDGK
VUlEMA0KCEVJRDKKVUlEMA0KDEVJRDOgNpKQkJNJSUQwRUlEMJNJSUQxRUlEMZCTSUlEMkVJRDKT
SUlEM0VJRDNwDQoGiFNUUzANCgAApGugE5KTaQ0KAXANCg0KiFNUUzANCgAApGt9e1BEQzAM////
fwBDQVAwUERDMKBOBJCQk3tQREMwDQoJAA0KCZNUQkwwAJN7Q0ZHRA0KAgANCgJ9VEJMMA0KAVRC
TDBbgEdWMDAAg4hTU0RUDQoBAIOIU1NEVA0KAgBbIEdWMDBISTBfoE4EkJCTe1BEQzANChgADQoY
k0NUQjAAk3tDRkdEDQogAA0KIH1DVEIwDQoBQ1RCMFuAQ1QwMACDiENTRFQNCgEAg4hDU0RUDQoC
AFsgQ1QwMEhDMF+gRAWQkJN7UERDMA0KBAANCgSTVFRCMACTe0NGR0QMAABAAAAMAABAAH1UVEIw
DQoBVFRCMFuAVFQwMACDiFRTRFQNCgEAg4hUU0RUDQoCAFsgVFQwMEhUMF+ka1JTRFRIAAAAAZYw
ODAyMTFSU0RUMTQzNgIIESBNU0ZUlwAAAFHFAAApxgAAZcYAANfGAAAPxwAAT8gAAIPIAAAzyQAA
lswAAA==
--20cf3074d9a88caca204bd56ca3c
Content-Type: text/plain; charset=US-ASCII; name="lspci.txt"
Content-Disposition: attachment; filename="lspci.txt"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h0tzk1vi2

MDA6MDAuMCBIb3N0IGJyaWRnZTogSW50ZWwgQ29ycG9yYXRpb24gNTUyMC81NTAwL1g1OCBJL08g
SHViIHRvIEVTSSBQb3J0IChyZXYgMTMpDQowMDowMS4wIFBDSSBicmlkZ2U6IEludGVsIENvcnBv
cmF0aW9uIDU1MjAvNTUwMC9YNTggSS9PIEh1YiBQQ0kgRXhwcmVzcyBSb290IFBvcnQgMSAocmV2
IDEzKQ0KMDA6MDIuMCBQQ0kgYnJpZGdlOiBJbnRlbCBDb3Jwb3JhdGlvbiA1NTIwLzU1MDAvWDU4
IEkvTyBIdWIgUENJIEV4cHJlc3MgUm9vdCBQb3J0IDIgKHJldiAxMykNCjAwOjAzLjAgUENJIGJy
aWRnZTogSW50ZWwgQ29ycG9yYXRpb24gNTUyMC81NTAwL1g1OCBJL08gSHViIFBDSSBFeHByZXNz
IFJvb3QgUG9ydCAzIChyZXYgMTMpDQowMDowNy4wIFBDSSBicmlkZ2U6IEludGVsIENvcnBvcmF0
aW9uIDU1MjAvNTUwMC9YNTggSS9PIEh1YiBQQ0kgRXhwcmVzcyBSb290IFBvcnQgNyAocmV2IDEz
KQ0KMDA6MTQuMCBQSUM6IEludGVsIENvcnBvcmF0aW9uIDU1MjAvNTUwMC9YNTggSS9PIEh1YiBT
eXN0ZW0gTWFuYWdlbWVudCBSZWdpc3RlcnMgKHJldiAxMykNCjAwOjE0LjEgUElDOiBJbnRlbCBD
b3Jwb3JhdGlvbiA1NTIwLzU1MDAvWDU4IEkvTyBIdWIgR1BJTyBhbmQgU2NyYXRjaCBQYWQgUmVn
aXN0ZXJzIChyZXYgMTMpDQowMDoxNC4yIFBJQzogSW50ZWwgQ29ycG9yYXRpb24gNTUyMC81NTAw
L1g1OCBJL08gSHViIENvbnRyb2wgU3RhdHVzIGFuZCBSQVMgUmVnaXN0ZXJzIChyZXYgMTMpDQow
MDoxNC4zIFBJQzogSW50ZWwgQ29ycG9yYXRpb24gNTUyMC81NTAwL1g1OCBJL08gSHViIFRocm90
dGxlIFJlZ2lzdGVycyAocmV2IDEzKQ0KMDA6MWEuMCBVU0IgY29udHJvbGxlcjogSW50ZWwgQ29y
cG9yYXRpb24gODI4MDFKSSAoSUNIMTAgRmFtaWx5KSBVU0IgVUhDSSBDb250cm9sbGVyICM0DQow
MDoxYS4xIFVTQiBjb250cm9sbGVyOiBJbnRlbCBDb3Jwb3JhdGlvbiA4MjgwMUpJIChJQ0gxMCBG
YW1pbHkpIFVTQiBVSENJIENvbnRyb2xsZXIgIzUNCjAwOjFhLjIgVVNCIGNvbnRyb2xsZXI6IElu
dGVsIENvcnBvcmF0aW9uIDgyODAxSkkgKElDSDEwIEZhbWlseSkgVVNCIFVIQ0kgQ29udHJvbGxl
ciAjNg0KMDA6MWEuNyBVU0IgY29udHJvbGxlcjogSW50ZWwgQ29ycG9yYXRpb24gODI4MDFKSSAo
SUNIMTAgRmFtaWx5KSBVU0IyIEVIQ0kgQ29udHJvbGxlciAjMg0KMDA6MWIuMCBBdWRpbyBkZXZp
Y2U6IEludGVsIENvcnBvcmF0aW9uIDgyODAxSkkgKElDSDEwIEZhbWlseSkgSEQgQXVkaW8gQ29u
dHJvbGxlcg0KMDA6MWMuMCBQQ0kgYnJpZGdlOiBJbnRlbCBDb3Jwb3JhdGlvbiA4MjgwMUpJIChJ
Q0gxMCBGYW1pbHkpIFBDSSBFeHByZXNzIFJvb3QgUG9ydCAxDQowMDoxYy40IFBDSSBicmlkZ2U6
IEludGVsIENvcnBvcmF0aW9uIDgyODAxSkkgKElDSDEwIEZhbWlseSkgUENJIEV4cHJlc3MgUm9v
dCBQb3J0IDUNCjAwOjFkLjAgVVNCIGNvbnRyb2xsZXI6IEludGVsIENvcnBvcmF0aW9uIDgyODAx
SkkgKElDSDEwIEZhbWlseSkgVVNCIFVIQ0kgQ29udHJvbGxlciAjMQ0KMDA6MWQuMSBVU0IgY29u
dHJvbGxlcjogSW50ZWwgQ29ycG9yYXRpb24gODI4MDFKSSAoSUNIMTAgRmFtaWx5KSBVU0IgVUhD
SSBDb250cm9sbGVyICMyDQowMDoxZC4yIFVTQiBjb250cm9sbGVyOiBJbnRlbCBDb3Jwb3JhdGlv
biA4MjgwMUpJIChJQ0gxMCBGYW1pbHkpIFVTQiBVSENJIENvbnRyb2xsZXIgIzMNCjAwOjFkLjcg
VVNCIGNvbnRyb2xsZXI6IEludGVsIENvcnBvcmF0aW9uIDgyODAxSkkgKElDSDEwIEZhbWlseSkg
VVNCMiBFSENJIENvbnRyb2xsZXIgIzENCjAwOjFlLjAgUENJIGJyaWRnZTogSW50ZWwgQ29ycG9y
YXRpb24gODI4MDEgUENJIEJyaWRnZSAocmV2IDkwKQ0KMDA6MWYuMCBJU0EgYnJpZGdlOiBJbnRl
bCBDb3Jwb3JhdGlvbiA4MjgwMUpJUiAoSUNIMTBSKSBMUEMgSW50ZXJmYWNlIENvbnRyb2xsZXIN
CjAwOjFmLjIgSURFIGludGVyZmFjZTogSW50ZWwgQ29ycG9yYXRpb24gODI4MDFKSSAoSUNIMTAg
RmFtaWx5KSA0IHBvcnQgU0FUQSBJREUgQ29udHJvbGxlciAjMQ0KMDA6MWYuMyBTTUJ1czogSW50
ZWwgQ29ycG9yYXRpb24gODI4MDFKSSAoSUNIMTAgRmFtaWx5KSBTTUJ1cyBDb250cm9sbGVyDQow
MDoxZi41IElERSBpbnRlcmZhY2U6IEludGVsIENvcnBvcmF0aW9uIDgyODAxSkkgKElDSDEwIEZh
bWlseSkgMiBwb3J0IFNBVEEgSURFIENvbnRyb2xsZXIgIzINCjAxOjAwLjAgSURFIGludGVyZmFj
ZTogTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwIEx0ZC4gRGV2aWNlIDkxYTMgKHJldiAxMSkNCjAy
OjAwLjAgVVNCIGNvbnRyb2xsZXI6IE5FQyBDb3Jwb3JhdGlvbiB1UEQ3MjAyMDAgVVNCIDMuMCBI
b3N0IENvbnRyb2xsZXIgKHJldiAwMykNCjAzOjAwLjAgVkdBIGNvbXBhdGlibGUgY29udHJvbGxl
cjogblZpZGlhIENvcnBvcmF0aW9uIEdGMTA2IFtHZUZvcmNlIEdUUyA0NTBdIChyZXYgYTEpDQow
MzowMC4xIEF1ZGlvIGRldmljZTogblZpZGlhIENvcnBvcmF0aW9uIEdGMTA2IEhpZ2ggRGVmaW5p
dGlvbiBBdWRpbyBDb250cm9sbGVyIChyZXYgYTEpDQowNDowMC4wIFZHQSBjb21wYXRpYmxlIGNv
bnRyb2xsZXI6IG5WaWRpYSBDb3Jwb3JhdGlvbiBHNzEgW0dlRm9yY2UgNzkwMCBHVFhdIChyZXYg
YTEpDQowNTowMC4wIFNBVEEgY29udHJvbGxlcjogSk1pY3JvbiBUZWNobm9sb2d5IENvcnAuIEpN
QjM2MiBBSENJIENvbnRyb2xsZXIgKHJldiAxMCkNCjA3OjAxLjAgRXRoZXJuZXQgY29udHJvbGxl
cjogUmVhbHRlayBTZW1pY29uZHVjdG9yIENvLiwgTHRkLiBSVEwtODExMFNDLzgxNjlTQyBHaWdh
Yml0IEV0aGVybmV0IChyZXYgMTApDQowNzowMi4wIEZpcmVXaXJlIChJRUVFIDEzOTQpOiBWSUEg
VGVjaG5vbG9naWVzLCBJbmMuIFZUNjMwNi83LzggW0ZpcmUgSUkoTSldIElFRUUgMTM5NCBPSENJ
IENvbnRyb2xsZXIgKHJldiBjMCkNCmZmOjAwLjAgSG9zdCBicmlkZ2U6IEludGVsIENvcnBvcmF0
aW9uIFhlb24gNTUwMC9Db3JlIGk3IFF1aWNrUGF0aCBBcmNoaXRlY3R1cmUgR2VuZXJpYyBOb24t
Q29yZSBSZWdpc3RlcnMgKHJldiAwNSkNCmZmOjAwLjEgSG9zdCBicmlkZ2U6IEludGVsIENvcnBv
cmF0aW9uIFhlb24gNTUwMC9Db3JlIGk3IFF1aWNrUGF0aCBBcmNoaXRlY3R1cmUgU3lzdGVtIEFk
ZHJlc3MgRGVjb2RlciAocmV2IDA1KQ0KZmY6MDIuMCBIb3N0IGJyaWRnZTogSW50ZWwgQ29ycG9y
YXRpb24gWGVvbiA1NTAwL0NvcmUgaTcgUVBJIExpbmsgMCAocmV2IDA1KQ0KZmY6MDIuMSBIb3N0
IGJyaWRnZTogSW50ZWwgQ29ycG9yYXRpb24gWGVvbiA1NTAwL0NvcmUgaTcgUVBJIFBoeXNpY2Fs
IDAgKHJldiAwNSkNCmZmOjAzLjAgSG9zdCBicmlkZ2U6IEludGVsIENvcnBvcmF0aW9uIFhlb24g
NTUwMC9Db3JlIGk3IEludGVncmF0ZWQgTWVtb3J5IENvbnRyb2xsZXIgKHJldiAwNSkNCmZmOjAz
LjEgSG9zdCBicmlkZ2U6IEludGVsIENvcnBvcmF0aW9uIFhlb24gNTUwMC9Db3JlIGk3IEludGVn
cmF0ZWQgTWVtb3J5IENvbnRyb2xsZXIgVGFyZ2V0IEFkZHJlc3MgRGVjb2RlciAocmV2IDA1KQ0K
ZmY6MDMuNCBIb3N0IGJyaWRnZTogSW50ZWwgQ29ycG9yYXRpb24gWGVvbiA1NTAwL0NvcmUgaTcg
SW50ZWdyYXRlZCBNZW1vcnkgQ29udHJvbGxlciBUZXN0IFJlZ2lzdGVycyAocmV2IDA1KQ0KZmY6
MDQuMCBIb3N0IGJyaWRnZTogSW50ZWwgQ29ycG9yYXRpb24gWGVvbiA1NTAwL0NvcmUgaTcgSW50
ZWdyYXRlZCBNZW1vcnkgQ29udHJvbGxlciBDaGFubmVsIDAgQ29udHJvbCBSZWdpc3RlcnMgKHJl
diAwNSkNCmZmOjA0LjEgSG9zdCBicmlkZ2U6IEludGVsIENvcnBvcmF0aW9uIFhlb24gNTUwMC9D
b3JlIGk3IEludGVncmF0ZWQgTWVtb3J5IENvbnRyb2xsZXIgQ2hhbm5lbCAwIEFkZHJlc3MgUmVn
aXN0ZXJzIChyZXYgMDUpDQpmZjowNC4yIEhvc3QgYnJpZGdlOiBJbnRlbCBDb3Jwb3JhdGlvbiBY
ZW9uIDU1MDAvQ29yZSBpNyBJbnRlZ3JhdGVkIE1lbW9yeSBDb250cm9sbGVyIENoYW5uZWwgMCBS
YW5rIFJlZ2lzdGVycyAocmV2IDA1KQ0KZmY6MDQuMyBIb3N0IGJyaWRnZTogSW50ZWwgQ29ycG9y
YXRpb24gWGVvbiA1NTAwL0NvcmUgaTcgSW50ZWdyYXRlZCBNZW1vcnkgQ29udHJvbGxlciBDaGFu
bmVsIDAgVGhlcm1hbCBDb250cm9sIFJlZ2lzdGVycyAocmV2IDA1KQ0KZmY6MDUuMCBIb3N0IGJy
aWRnZTogSW50ZWwgQ29ycG9yYXRpb24gWGVvbiA1NTAwL0NvcmUgaTcgSW50ZWdyYXRlZCBNZW1v
cnkgQ29udHJvbGxlciBDaGFubmVsIDEgQ29udHJvbCBSZWdpc3RlcnMgKHJldiAwNSkNCmZmOjA1
LjEgSG9zdCBicmlkZ2U6IEludGVsIENvcnBvcmF0aW9uIFhlb24gNTUwMC9Db3JlIGk3IEludGVn
cmF0ZWQgTWVtb3J5IENvbnRyb2xsZXIgQ2hhbm5lbCAxIEFkZHJlc3MgUmVnaXN0ZXJzIChyZXYg
MDUpDQpmZjowNS4yIEhvc3QgYnJpZGdlOiBJbnRlbCBDb3Jwb3JhdGlvbiBYZW9uIDU1MDAvQ29y
ZSBpNyBJbnRlZ3JhdGVkIE1lbW9yeSBDb250cm9sbGVyIENoYW5uZWwgMSBSYW5rIFJlZ2lzdGVy
cyAocmV2IDA1KQ0KZmY6MDUuMyBIb3N0IGJyaWRnZTogSW50ZWwgQ29ycG9yYXRpb24gWGVvbiA1
NTAwL0NvcmUgaTcgSW50ZWdyYXRlZCBNZW1vcnkgQ29udHJvbGxlciBDaGFubmVsIDEgVGhlcm1h
bCBDb250cm9sIFJlZ2lzdGVycyAocmV2IDA1KQ0KZmY6MDYuMCBIb3N0IGJyaWRnZTogSW50ZWwg
Q29ycG9yYXRpb24gWGVvbiA1NTAwL0NvcmUgaTcgSW50ZWdyYXRlZCBNZW1vcnkgQ29udHJvbGxl
ciBDaGFubmVsIDIgQ29udHJvbCBSZWdpc3RlcnMgKHJldiAwNSkNCmZmOjA2LjEgSG9zdCBicmlk
Z2U6IEludGVsIENvcnBvcmF0aW9uIFhlb24gNTUwMC9Db3JlIGk3IEludGVncmF0ZWQgTWVtb3J5
IENvbnRyb2xsZXIgQ2hhbm5lbCAyIEFkZHJlc3MgUmVnaXN0ZXJzIChyZXYgMDUpDQpmZjowNi4y
IEhvc3QgYnJpZGdlOiBJbnRlbCBDb3Jwb3JhdGlvbiBYZW9uIDU1MDAvQ29yZSBpNyBJbnRlZ3Jh
dGVkIE1lbW9yeSBDb250cm9sbGVyIENoYW5uZWwgMiBSYW5rIFJlZ2lzdGVycyAocmV2IDA1KQ0K
ZmY6MDYuMyBIb3N0IGJyaWRnZTogSW50ZWwgQ29ycG9yYXRpb24gWGVvbiA1NTAwL0NvcmUgaTcg
SW50ZWdyYXRlZCBNZW1vcnkgQ29udHJvbGxlciBDaGFubmVsIDIgVGhlcm1hbCBDb250cm9sIFJl
Z2lzdGVycyAocmV2IDA1KQ0K
--20cf3074d9a88caca204bd56ca3c
Content-Type: text/plain; charset=US-ASCII; name="lspci-vvvknn.txt"
Content-Disposition: attachment; filename="lspci-vvvknn.txt"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h0tzk6v43

MDA6MDAuMCBIb3N0IGJyaWRnZSBbMDYwMF06IEludGVsIENvcnBvcmF0aW9uIDU1MjAvNTUwMC9Y
NTggSS9PIEh1YiB0byBFU0kgUG9ydCBbODA4NjozNDA1XSAocmV2IDEzKQ0KCVN1YnN5c3RlbTog
QVNVU1RlSyBDb21wdXRlciBJbmMuIERldmljZSBbMTA0Mzo4MzZiXQ0KCUNvbnRyb2w6IEkvTy0g
TWVtLSBCdXNNYXN0ZXItIFNwZWNDeWNsZS0gTWVtV0lOVi0gVkdBU25vb3AtIFBhckVyci0gU3Rl
cHBpbmctIFNFUlItIEZhc3RCMkItIERpc0lOVHgtDQoJU3RhdHVzOiBDYXArIDY2TUh6LSBVREYt
IEZhc3RCMkItIFBhckVyci0gREVWU0VMPWZhc3QgPlRBYm9ydC0gPFRBYm9ydC0gPE1BYm9ydC0g
PlNFUlItIDxQRVJSLSBJTlR4LQ0KCUNhcGFiaWxpdGllczogWzYwXSBNU0k6IEVuYWJsZS0gQ291
bnQ9MS8yIE1hc2thYmxlKyA2NGJpdC0NCgkJQWRkcmVzczogMDAwMDAwMDAgIERhdGE6IDAwMDAN
CgkJTWFza2luZzogMDAwMDAwMDAgIFBlbmRpbmc6IDAwMDAwMDAwDQoJQ2FwYWJpbGl0aWVzOiBb
OTBdIEV4cHJlc3MgKHYyKSBSb290IFBvcnQgKFNsb3QtKSwgTVNJIDAwDQoJCURldkNhcDoJTWF4
UGF5bG9hZCAxMjggYnl0ZXMsIFBoYW50RnVuYyAwLCBMYXRlbmN5IEwwcyA8NjRucywgTDEgPDF1
cw0KCQkJRXh0VGFnKyBSQkUrIEZMUmVzZXQtDQoJCURldkN0bDoJUmVwb3J0IGVycm9yczogQ29y
cmVjdGFibGUtIE5vbi1GYXRhbC0gRmF0YWwtIFVuc3VwcG9ydGVkLQ0KCQkJUmx4ZE9yZC0gRXh0
VGFnLSBQaGFudEZ1bmMtIEF1eFB3ci0gTm9Tbm9vcC0NCgkJCU1heFBheWxvYWQgMTI4IGJ5dGVz
LCBNYXhSZWFkUmVxIDEyOCBieXRlcw0KCQlEZXZTdGE6CUNvcnJFcnItIFVuY29yckVyci0gRmF0
YWxFcnItIFVuc3VwcFJlcS0gQXV4UHdyLSBUcmFuc1BlbmQtDQoJCUxua0NhcDoJUG9ydCAjMCwg
U3BlZWQgMi41R1QvcywgV2lkdGggeDQsIEFTUE0gTDBzIEwxLCBMYXRlbmN5IEwwIDw1MTJucywg
TDEgPDY0dXMNCgkJCUNsb2NrUE0tIFN1cnByaXNlKyBMTEFjdFJlcCsgQndOb3QrDQoJCUxua0N0
bDoJQVNQTSBEaXNhYmxlZDsgUkNCIDY0IGJ5dGVzIERpc2FibGVkLSBSZXRyYWluLSBDb21tQ2xr
LQ0KCQkJRXh0U3luY2gtIENsb2NrUE0tIEF1dFdpZERpcy0gQldJbnQtIEF1dEJXSW50LQ0KCQlM
bmtTdGE6CVNwZWVkIDIuNUdUL3MsIFdpZHRoIHg0LCBUckVyci0gVHJhaW4tIFNsb3RDbGsrIERM
QWN0aXZlKyBCV01nbXQtIEFCV01nbXQtDQoJCVJvb3RDdGw6IEVyckNvcnJlY3RhYmxlLSBFcnJO
b24tRmF0YWwtIEVyckZhdGFsLSBQTUVJbnRFbmEtIENSU1Zpc2libGUtDQoJCVJvb3RDYXA6IENS
U1Zpc2libGUtDQoJCVJvb3RTdGE6IFBNRSBSZXFJRCAwMDAwLCBQTUVTdGF0dXMtIFBNRVBlbmRp
bmctDQoJCURldkNhcDI6IENvbXBsZXRpb24gVGltZW91dDogUmFuZ2UgQkNELCBUaW1lb3V0RGlz
KyBBUklGd2QrDQoJCURldkN0bDI6IENvbXBsZXRpb24gVGltZW91dDogMjYwbXMgdG8gOTAwbXMs
IFRpbWVvdXREaXMtIEFSSUZ3ZC0NCgkJTG5rQ3RsMjogVGFyZ2V0IExpbmsgU3BlZWQ6IDIuNUdU
L3MsIEVudGVyQ29tcGxpYW5jZS0gU3BlZWREaXMtLCBTZWxlY3RhYmxlIERlLWVtcGhhc2lzOiAt
NmRCDQoJCQkgVHJhbnNtaXQgTWFyZ2luOiBOb3JtYWwgT3BlcmF0aW5nIFJhbmdlLCBFbnRlck1v
ZGlmaWVkQ29tcGxpYW5jZS0gQ29tcGxpYW5jZVNPUy0NCgkJCSBDb21wbGlhbmNlIERlLWVtcGhh
c2lzOiAtNmRCDQoJCUxua1N0YTI6IEN1cnJlbnQgRGUtZW1waGFzaXMgTGV2ZWw6IC02ZEINCglD
YXBhYmlsaXRpZXM6IFtlMF0gUG93ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDMNCgkJRmxhZ3M6IFBN
RUNsay0gRFNJLSBEMS0gRDItIEF1eEN1cnJlbnQ9MG1BIFBNRShEMCssRDEtLEQyLSxEM2hvdCss
RDNjb2xkKykNCgkJU3RhdHVzOiBEMCBOb1NvZnRSc3QrIFBNRS1FbmFibGUtIERTZWw9MCBEU2Nh
bGU9MCBQTUUtDQoJQ2FwYWJpbGl0aWVzOiBbMTAwIHYxXSBBZHZhbmNlZCBFcnJvciBSZXBvcnRp
bmcNCgkJVUVTdGE6CURMUC0gU0RFUy0gVExQLSBGQ1AtIENtcGx0VE8tIENtcGx0QWJydC0gVW54
Q21wbHQtIFJ4T0YtIE1hbGZUTFAtIEVDUkMtIFVuc3VwUmVxLSBBQ1NWaW9sLQ0KCQlVRU1zazoJ
RExQLSBTREVTLSBUTFAtIEZDUC0gQ21wbHRUTy0gQ21wbHRBYnJ0LSBVbnhDbXBsdC0gUnhPRi0g
TWFsZlRMUC0gRUNSQy0gVW5zdXBSZXEtIEFDU1Zpb2wtDQoJCVVFU3ZydDoJRExQKyBTREVTKyBU
TFAtIEZDUCsgQ21wbHRUTy0gQ21wbHRBYnJ0LSBVbnhDbXBsdC0gUnhPRisgTWFsZlRMUCsgRUNS
Qy0gVW5zdXBSZXEtIEFDU1Zpb2wtDQoJCUNFU3RhOglSeEVyci0gQmFkVExQLSBCYWRETExQLSBS
b2xsb3Zlci0gVGltZW91dC0gTm9uRmF0YWxFcnItDQoJCUNFTXNrOglSeEVyci0gQmFkVExQLSBC
YWRETExQLSBSb2xsb3Zlci0gVGltZW91dC0gTm9uRmF0YWxFcnIrDQoJCUFFUkNhcDoJRmlyc3Qg
RXJyb3IgUG9pbnRlcjogMDAsIEdlbkNhcC0gQ0dlbkVuLSBDaGtDYXAtIENoa0VuLQ0KCUNhcGFi
aWxpdGllczogWzE1MCB2MV0gQWNjZXNzIENvbnRyb2wgU2VydmljZXMNCgkJQUNTQ2FwOglTcmNW
YWxpZCsgVHJhbnNCbGsrIFJlcVJlZGlyKyBDbXBsdFJlZGlyKyBVcHN0cmVhbUZ3ZCsgRWdyZXNz
Q3RybC0gRGlyZWN0VHJhbnMtDQoJCUFDU0N0bDoJU3JjVmFsaWQrIFRyYW5zQmxrLSBSZXFSZWRp
cisgQ21wbHRSZWRpcisgVXBzdHJlYW1Gd2QrIEVncmVzc0N0cmwtIERpcmVjdFRyYW5zLQ0KCUNh
cGFiaWxpdGllczogWzE2MCB2MF0gVmVuZG9yIFNwZWNpZmljIEluZm9ybWF0aW9uOiBJRD0wMDAy
IFJldj0wIExlbj0wMGMgPD8+DQoNCjAwOjAxLjAgUENJIGJyaWRnZSBbMDYwNF06IEludGVsIENv
cnBvcmF0aW9uIDU1MjAvNTUwMC9YNTggSS9PIEh1YiBQQ0kgRXhwcmVzcyBSb290IFBvcnQgMSBb
ODA4NjozNDA4XSAocmV2IDEzKSAocHJvZy1pZiAwMCBbTm9ybWFsIGRlY29kZV0pDQoJQ29udHJv
bDogSS9PKyBNZW0rIEJ1c01hc3RlcisgU3BlY0N5Y2xlLSBNZW1XSU5WLSBWR0FTbm9vcC0gUGFy
RXJyLSBTdGVwcGluZy0gU0VSUisgRmFzdEIyQi0gRGlzSU5UeC0NCglTdGF0dXM6IENhcCsgNjZN
SHotIFVERi0gRmFzdEIyQi0gUGFyRXJyLSBERVZTRUw9ZmFzdCA+VEFib3J0LSA8VEFib3J0LSA8
TUFib3J0LSA+U0VSUi0gPFBFUlItIElOVHgtDQoJTGF0ZW5jeTogMCwgQ2FjaGUgTGluZSBTaXpl
OiAyNTYgYnl0ZXMNCglCdXM6IHByaW1hcnk9MDAsIHNlY29uZGFyeT0wMSwgc3Vib3JkaW5hdGU9
MDEsIHNlYy1sYXRlbmN5PTANCglJL08gYmVoaW5kIGJyaWRnZTogMDAwMGEwMDAtMDAwMGFmZmYN
CglNZW1vcnkgYmVoaW5kIGJyaWRnZTogZjVlMDAwMDAtZjVlZmZmZmYNCglQcmVmZXRjaGFibGUg
bWVtb3J5IGJlaGluZCBicmlkZ2U6IDAwMDAwMDAwZmZmMDAwMDAtMDAwMDAwMDAwMDBmZmZmZg0K
CVNlY29uZGFyeSBzdGF0dXM6IDY2TUh6LSBGYXN0QjJCLSBQYXJFcnItIERFVlNFTD1mYXN0ID5U
QWJvcnQtIDxUQWJvcnQtIDxNQWJvcnQtIDxTRVJSLSA8UEVSUi0NCglCcmlkZ2VDdGw6IFBhcml0
eS0gU0VSUisgTm9JU0EtIFZHQS0gTUFib3J0LSA+UmVzZXQtIEZhc3RCMkItDQoJCVByaURpc2NU
bXItIFNlY0Rpc2NUbXItIERpc2NUbXJTdGF0LSBEaXNjVG1yU0VSUkVuLQ0KCUNhcGFiaWxpdGll
czogWzQwXSBTdWJzeXN0ZW06IEFTVVNUZUsgQ29tcHV0ZXIgSW5jLiBEZXZpY2UgWzEwNDM6ODM2
Yl0NCglDYXBhYmlsaXRpZXM6IFs2MF0gTVNJOiBFbmFibGUtIENvdW50PTEvMiBNYXNrYWJsZSsg
NjRiaXQtDQoJCUFkZHJlc3M6IDAwMDAwMDAwICBEYXRhOiAwMDAwDQoJCU1hc2tpbmc6IDAwMDAw
MDAwICBQZW5kaW5nOiAwMDAwMDAwMA0KCUNhcGFiaWxpdGllczogWzkwXSBFeHByZXNzICh2Mikg
Um9vdCBQb3J0IChTbG90KyksIE1TSSAwMA0KCQlEZXZDYXA6CU1heFBheWxvYWQgMjU2IGJ5dGVz
LCBQaGFudEZ1bmMgMCwgTGF0ZW5jeSBMMHMgPDY0bnMsIEwxIDwxdXMNCgkJCUV4dFRhZysgUkJF
KyBGTFJlc2V0LQ0KCQlEZXZDdGw6CVJlcG9ydCBlcnJvcnM6IENvcnJlY3RhYmxlLSBOb24tRmF0
YWwtIEZhdGFsLSBVbnN1cHBvcnRlZC0NCgkJCVJseGRPcmQtIEV4dFRhZy0gUGhhbnRGdW5jLSBB
dXhQd3ItIE5vU25vb3AtDQoJCQlNYXhQYXlsb2FkIDEyOCBieXRlcywgTWF4UmVhZFJlcSAxMjgg
Ynl0ZXMNCgkJRGV2U3RhOglDb3JyRXJyLSBVbmNvcnJFcnItIEZhdGFsRXJyLSBVbnN1cHBSZXEt
IEF1eFB3ci0gVHJhbnNQZW5kLQ0KCQlMbmtDYXA6CVBvcnQgIzAsIFNwZWVkIDVHVC9zLCBXaWR0
aCB4MiwgQVNQTSBMMHMgTDEsIExhdGVuY3kgTDAgPDUxMm5zLCBMMSA8NjR1cw0KCQkJQ2xvY2tQ
TS0gU3VycHJpc2UrIExMQWN0UmVwKyBCd05vdCsNCgkJTG5rQ3RsOglBU1BNIERpc2FibGVkOyBS
Q0IgNjQgYnl0ZXMgRGlzYWJsZWQtIFJldHJhaW4tIENvbW1DbGsrDQoJCQlFeHRTeW5jaC0gQ2xv
Y2tQTS0gQXV0V2lkRGlzLSBCV0ludC0gQXV0QldJbnQtDQoJCUxua1N0YToJU3BlZWQgNUdUL3Ms
IFdpZHRoIHgxLCBUckVyci0gVHJhaW4tIFNsb3RDbGsrIERMQWN0aXZlKyBCV01nbXQrIEFCV01n
bXQtDQoJCVNsdENhcDoJQXR0bkJ0bi0gUHdyQ3RybC0gTVJMLSBBdHRuSW5kLSBQd3JJbmQtIEhv
dFBsdWctIFN1cnByaXNlLQ0KCQkJU2xvdCAjMCwgUG93ZXJMaW1pdCAwLjAwMFc7IEludGVybG9j
ay0gTm9Db21wbC0NCgkJU2x0Q3RsOglFbmFibGU6IEF0dG5CdG4tIFB3ckZsdC0gTVJMLSBQcmVz
RGV0LSBDbWRDcGx0LSBIUElycS0gTGlua0NoZy0NCgkJCUNvbnRyb2w6IEF0dG5JbmQgT2ZmLCBQ
d3JJbmQgT2ZmLCBQb3dlci0gSW50ZXJsb2NrLQ0KCQlTbHRTdGE6CVN0YXR1czogQXR0bkJ0bi0g
UG93ZXJGbHQtIE1STC0gQ21kQ3BsdC0gUHJlc0RldCsgSW50ZXJsb2NrLQ0KCQkJQ2hhbmdlZDog
TVJMLSBQcmVzRGV0KyBMaW5rU3RhdGUrDQoJCVJvb3RDdGw6IEVyckNvcnJlY3RhYmxlLSBFcnJO
b24tRmF0YWwtIEVyckZhdGFsLSBQTUVJbnRFbmEtIENSU1Zpc2libGUtDQoJCVJvb3RDYXA6IENS
U1Zpc2libGUtDQoJCVJvb3RTdGE6IFBNRSBSZXFJRCAwMDAwLCBQTUVTdGF0dXMtIFBNRVBlbmRp
bmctDQoJCURldkNhcDI6IENvbXBsZXRpb24gVGltZW91dDogUmFuZ2UgQkNELCBUaW1lb3V0RGlz
KyBBUklGd2QrDQoJCURldkN0bDI6IENvbXBsZXRpb24gVGltZW91dDogMjYwbXMgdG8gOTAwbXMs
IFRpbWVvdXREaXMtIEFSSUZ3ZC0NCgkJTG5rQ3RsMjogVGFyZ2V0IExpbmsgU3BlZWQ6IDVHVC9z
LCBFbnRlckNvbXBsaWFuY2UtIFNwZWVkRGlzLSwgU2VsZWN0YWJsZSBEZS1lbXBoYXNpczogLTZk
Qg0KCQkJIFRyYW5zbWl0IE1hcmdpbjogTm9ybWFsIE9wZXJhdGluZyBSYW5nZSwgRW50ZXJNb2Rp
ZmllZENvbXBsaWFuY2UtIENvbXBsaWFuY2VTT1MtDQoJCQkgQ29tcGxpYW5jZSBEZS1lbXBoYXNp
czogLTZkQg0KCQlMbmtTdGEyOiBDdXJyZW50IERlLWVtcGhhc2lzIExldmVsOiAtNmRCDQoJQ2Fw
YWJpbGl0aWVzOiBbZTBdIFBvd2VyIE1hbmFnZW1lbnQgdmVyc2lvbiAzDQoJCUZsYWdzOiBQTUVD
bGstIERTSS0gRDEtIEQyLSBBdXhDdXJyZW50PTBtQSBQTUUoRDArLEQxLSxEMi0sRDNob3QrLEQz
Y29sZCspDQoJCVN0YXR1czogRDAgTm9Tb2Z0UnN0KyBQTUUtRW5hYmxlLSBEU2VsPTAgRFNjYWxl
PTAgUE1FLQ0KCUNhcGFiaWxpdGllczogWzEwMCB2MV0gQWR2YW5jZWQgRXJyb3IgUmVwb3J0aW5n
DQoJCVVFU3RhOglETFAtIFNERVMtIFRMUC0gRkNQLSBDbXBsdFRPLSBDbXBsdEFicnQtIFVueENt
cGx0LSBSeE9GLSBNYWxmVExQLSBFQ1JDLSBVbnN1cFJlcS0gQUNTVmlvbC0NCgkJVUVNc2s6CURM
UC0gU0RFUy0gVExQLSBGQ1AtIENtcGx0VE8tIENtcGx0QWJydC0gVW54Q21wbHQtIFJ4T0YtIE1h
bGZUTFAtIEVDUkMtIFVuc3VwUmVxLSBBQ1NWaW9sLQ0KCQlVRVN2cnQ6CURMUCsgU0RFUysgVExQ
LSBGQ1ArIENtcGx0VE8tIENtcGx0QWJydC0gVW54Q21wbHQtIFJ4T0YrIE1hbGZUTFArIEVDUkMt
IFVuc3VwUmVxLSBBQ1NWaW9sLQ0KCQlDRVN0YToJUnhFcnItIEJhZFRMUC0gQmFkRExMUC0gUm9s
bG92ZXItIFRpbWVvdXQtIE5vbkZhdGFsRXJyLQ0KCQlDRU1zazoJUnhFcnItIEJhZFRMUC0gQmFk
RExMUC0gUm9sbG92ZXItIFRpbWVvdXQtIE5vbkZhdGFsRXJyKw0KCQlBRVJDYXA6CUZpcnN0IEVy
cm9yIFBvaW50ZXI6IDAwLCBHZW5DYXAtIENHZW5Fbi0gQ2hrQ2FwLSBDaGtFbi0NCglDYXBhYmls
aXRpZXM6IFsxNTAgdjFdIEFjY2VzcyBDb250cm9sIFNlcnZpY2VzDQoJCUFDU0NhcDoJU3JjVmFs
aWQrIFRyYW5zQmxrKyBSZXFSZWRpcisgQ21wbHRSZWRpcisgVXBzdHJlYW1Gd2QrIEVncmVzc0N0
cmwtIERpcmVjdFRyYW5zLQ0KCQlBQ1NDdGw6CVNyY1ZhbGlkKyBUcmFuc0Jsay0gUmVxUmVkaXIr
IENtcGx0UmVkaXIrIFVwc3RyZWFtRndkKyBFZ3Jlc3NDdHJsLSBEaXJlY3RUcmFucy0NCglDYXBh
YmlsaXRpZXM6IFsxNjAgdjBdIFZlbmRvciBTcGVjaWZpYyBJbmZvcm1hdGlvbjogSUQ9MDAwMiBS
ZXY9MCBMZW49MDBjIDw/Pg0KCUtlcm5lbCBkcml2ZXIgaW4gdXNlOiBwY2llcG9ydA0KDQowMDow
Mi4wIFBDSSBicmlkZ2UgWzA2MDRdOiBJbnRlbCBDb3Jwb3JhdGlvbiA1NTIwLzU1MDAvWDU4IEkv
TyBIdWIgUENJIEV4cHJlc3MgUm9vdCBQb3J0IDIgWzgwODY6MzQwOV0gKHJldiAxMykgKHByb2ct
aWYgMDAgW05vcm1hbCBkZWNvZGVdKQ0KCUNvbnRyb2w6IEkvTy0gTWVtKyBCdXNNYXN0ZXIrIFNw
ZWNDeWNsZS0gTWVtV0lOVi0gVkdBU25vb3AtIFBhckVyci0gU3RlcHBpbmctIFNFUlIrIEZhc3RC
MkItIERpc0lOVHgtDQoJU3RhdHVzOiBDYXArIDY2TUh6LSBVREYtIEZhc3RCMkItIFBhckVyci0g
REVWU0VMPWZhc3QgPlRBYm9ydC0gPFRBYm9ydC0gPE1BYm9ydC0gPlNFUlItIDxQRVJSLSBJTlR4
LQ0KCUxhdGVuY3k6IDAsIENhY2hlIExpbmUgU2l6ZTogMjU2IGJ5dGVzDQoJQnVzOiBwcmltYXJ5
PTAwLCBzZWNvbmRhcnk9MDIsIHN1Ym9yZGluYXRlPTAyLCBzZWMtbGF0ZW5jeT0wDQoJSS9PIGJl
aGluZCBicmlkZ2U6IDAwMDBmMDAwLTAwMDAwZmZmDQoJTWVtb3J5IGJlaGluZCBicmlkZ2U6IGY1
ZjAwMDAwLWY1ZmZmZmZmDQoJUHJlZmV0Y2hhYmxlIG1lbW9yeSBiZWhpbmQgYnJpZGdlOiAwMDAw
MDAwMGZmZjAwMDAwLTAwMDAwMDAwMDAwZmZmZmYNCglTZWNvbmRhcnkgc3RhdHVzOiA2Nk1Iei0g
RmFzdEIyQi0gUGFyRXJyLSBERVZTRUw9ZmFzdCA+VEFib3J0LSA8VEFib3J0LSA8TUFib3J0KyA8
U0VSUi0gPFBFUlItDQoJQnJpZGdlQ3RsOiBQYXJpdHktIFNFUlIrIE5vSVNBLSBWR0EtIE1BYm9y
dC0gPlJlc2V0LSBGYXN0QjJCLQ0KCQlQcmlEaXNjVG1yLSBTZWNEaXNjVG1yLSBEaXNjVG1yU3Rh
dC0gRGlzY1RtclNFUlJFbi0NCglDYXBhYmlsaXRpZXM6IFs0MF0gU3Vic3lzdGVtOiBBU1VTVGVL
IENvbXB1dGVyIEluYy4gRGV2aWNlIFsxMDQzOjgzNmJdDQoJQ2FwYWJpbGl0aWVzOiBbNjBdIE1T
STogRW5hYmxlLSBDb3VudD0xLzIgTWFza2FibGUrIDY0Yml0LQ0KCQlBZGRyZXNzOiAwMDAwMDAw
MCAgRGF0YTogMDAwMA0KCQlNYXNraW5nOiAwMDAwMDAwMCAgUGVuZGluZzogMDAwMDAwMDANCglD
YXBhYmlsaXRpZXM6IFs5MF0gRXhwcmVzcyAodjIpIFJvb3QgUG9ydCAoU2xvdCspLCBNU0kgMDAN
CgkJRGV2Q2FwOglNYXhQYXlsb2FkIDI1NiBieXRlcywgUGhhbnRGdW5jIDAsIExhdGVuY3kgTDBz
IDw2NG5zLCBMMSA8MXVzDQoJCQlFeHRUYWcrIFJCRSsgRkxSZXNldC0NCgkJRGV2Q3RsOglSZXBv
cnQgZXJyb3JzOiBDb3JyZWN0YWJsZS0gTm9uLUZhdGFsLSBGYXRhbC0gVW5zdXBwb3J0ZWQtDQoJ
CQlSbHhkT3JkLSBFeHRUYWctIFBoYW50RnVuYy0gQXV4UHdyLSBOb1Nub29wLQ0KCQkJTWF4UGF5
bG9hZCAxMjggYnl0ZXMsIE1heFJlYWRSZXEgMTI4IGJ5dGVzDQoJCURldlN0YToJQ29yckVyci0g
VW5jb3JyRXJyLSBGYXRhbEVyci0gVW5zdXBwUmVxLSBBdXhQd3ItIFRyYW5zUGVuZC0NCgkJTG5r
Q2FwOglQb3J0ICMwLCBTcGVlZCA1R1QvcywgV2lkdGggeDIsIEFTUE0gTDBzIEwxLCBMYXRlbmN5
IEwwIDw1MTJucywgTDEgPDY0dXMNCgkJCUNsb2NrUE0tIFN1cnByaXNlKyBMTEFjdFJlcCsgQndO
b3QrDQoJCUxua0N0bDoJQVNQTSBEaXNhYmxlZDsgUkNCIDY0IGJ5dGVzIERpc2FibGVkLSBSZXRy
YWluLSBDb21tQ2xrKw0KCQkJRXh0U3luY2gtIENsb2NrUE0tIEF1dFdpZERpcy0gQldJbnQtIEF1
dEJXSW50LQ0KCQlMbmtTdGE6CVNwZWVkIDVHVC9zLCBXaWR0aCB4MSwgVHJFcnItIFRyYWluLSBT
bG90Q2xrKyBETEFjdGl2ZSsgQldNZ210KyBBQldNZ210LQ0KCQlTbHRDYXA6CUF0dG5CdG4tIFB3
ckN0cmwtIE1STC0gQXR0bkluZC0gUHdySW5kLSBIb3RQbHVnLSBTdXJwcmlzZS0NCgkJCVNsb3Qg
IzAsIFBvd2VyTGltaXQgMC4wMDBXOyBJbnRlcmxvY2stIE5vQ29tcGwtDQoJCVNsdEN0bDoJRW5h
YmxlOiBBdHRuQnRuLSBQd3JGbHQtIE1STC0gUHJlc0RldC0gQ21kQ3BsdC0gSFBJcnEtIExpbmtD
aGctDQoJCQlDb250cm9sOiBBdHRuSW5kIE9mZiwgUHdySW5kIE9mZiwgUG93ZXItIEludGVybG9j
ay0NCgkJU2x0U3RhOglTdGF0dXM6IEF0dG5CdG4tIFBvd2VyRmx0LSBNUkwtIENtZENwbHQtIFBy
ZXNEZXQrIEludGVybG9jay0NCgkJCUNoYW5nZWQ6IE1STC0gUHJlc0RldCsgTGlua1N0YXRlKw0K
CQlSb290Q3RsOiBFcnJDb3JyZWN0YWJsZS0gRXJyTm9uLUZhdGFsLSBFcnJGYXRhbC0gUE1FSW50
RW5hLSBDUlNWaXNpYmxlLQ0KCQlSb290Q2FwOiBDUlNWaXNpYmxlLQ0KCQlSb290U3RhOiBQTUUg
UmVxSUQgMDAwMCwgUE1FU3RhdHVzLSBQTUVQZW5kaW5nLQ0KCQlEZXZDYXAyOiBDb21wbGV0aW9u
IFRpbWVvdXQ6IFJhbmdlIEJDRCwgVGltZW91dERpcysgQVJJRndkKw0KCQlEZXZDdGwyOiBDb21w
bGV0aW9uIFRpbWVvdXQ6IDI2MG1zIHRvIDkwMG1zLCBUaW1lb3V0RGlzLSBBUklGd2QtDQoJCUxu
a0N0bDI6IFRhcmdldCBMaW5rIFNwZWVkOiA1R1QvcywgRW50ZXJDb21wbGlhbmNlLSBTcGVlZERp
cy0sIFNlbGVjdGFibGUgRGUtZW1waGFzaXM6IC02ZEINCgkJCSBUcmFuc21pdCBNYXJnaW46IE5v
cm1hbCBPcGVyYXRpbmcgUmFuZ2UsIEVudGVyTW9kaWZpZWRDb21wbGlhbmNlLSBDb21wbGlhbmNl
U09TLQ0KCQkJIENvbXBsaWFuY2UgRGUtZW1waGFzaXM6IC02ZEINCgkJTG5rU3RhMjogQ3VycmVu
dCBEZS1lbXBoYXNpcyBMZXZlbDogLTZkQg0KCUNhcGFiaWxpdGllczogW2UwXSBQb3dlciBNYW5h
Z2VtZW50IHZlcnNpb24gMw0KCQlGbGFnczogUE1FQ2xrLSBEU0ktIEQxLSBEMi0gQXV4Q3VycmVu
dD0wbUEgUE1FKEQwKyxEMS0sRDItLEQzaG90KyxEM2NvbGQrKQ0KCQlTdGF0dXM6IEQwIE5vU29m
dFJzdCsgUE1FLUVuYWJsZS0gRFNlbD0wIERTY2FsZT0wIFBNRS0NCglDYXBhYmlsaXRpZXM6IFsx
MDAgdjFdIEFkdmFuY2VkIEVycm9yIFJlcG9ydGluZw0KCQlVRVN0YToJRExQLSBTREVTLSBUTFAt
IEZDUC0gQ21wbHRUTy0gQ21wbHRBYnJ0LSBVbnhDbXBsdC0gUnhPRi0gTWFsZlRMUC0gRUNSQy0g
VW5zdXBSZXEtIEFDU1Zpb2wtDQoJCVVFTXNrOglETFAtIFNERVMtIFRMUC0gRkNQLSBDbXBsdFRP
LSBDbXBsdEFicnQtIFVueENtcGx0LSBSeE9GLSBNYWxmVExQLSBFQ1JDLSBVbnN1cFJlcS0gQUNT
VmlvbC0NCgkJVUVTdnJ0OglETFArIFNERVMrIFRMUC0gRkNQKyBDbXBsdFRPLSBDbXBsdEFicnQt
IFVueENtcGx0LSBSeE9GKyBNYWxmVExQKyBFQ1JDLSBVbnN1cFJlcS0gQUNTVmlvbC0NCgkJQ0VT
dGE6CVJ4RXJyLSBCYWRUTFAtIEJhZERMTFAtIFJvbGxvdmVyLSBUaW1lb3V0LSBOb25GYXRhbEVy
ci0NCgkJQ0VNc2s6CVJ4RXJyLSBCYWRUTFAtIEJhZERMTFAtIFJvbGxvdmVyLSBUaW1lb3V0LSBO
b25GYXRhbEVycisNCgkJQUVSQ2FwOglGaXJzdCBFcnJvciBQb2ludGVyOiAwMCwgR2VuQ2FwLSBD
R2VuRW4tIENoa0NhcC0gQ2hrRW4tDQoJQ2FwYWJpbGl0aWVzOiBbMTUwIHYxXSBBY2Nlc3MgQ29u
dHJvbCBTZXJ2aWNlcw0KCQlBQ1NDYXA6CVNyY1ZhbGlkKyBUcmFuc0JsaysgUmVxUmVkaXIrIENt
cGx0UmVkaXIrIFVwc3RyZWFtRndkKyBFZ3Jlc3NDdHJsLSBEaXJlY3RUcmFucy0NCgkJQUNTQ3Rs
OglTcmNWYWxpZCsgVHJhbnNCbGstIFJlcVJlZGlyKyBDbXBsdFJlZGlyKyBVcHN0cmVhbUZ3ZCsg
RWdyZXNzQ3RybC0gRGlyZWN0VHJhbnMtDQoJS2VybmVsIGRyaXZlciBpbiB1c2U6IHBjaWVwb3J0
DQoNCjAwOjAzLjAgUENJIGJyaWRnZSBbMDYwNF06IEludGVsIENvcnBvcmF0aW9uIDU1MjAvNTUw
MC9YNTggSS9PIEh1YiBQQ0kgRXhwcmVzcyBSb290IFBvcnQgMyBbODA4NjozNDBhXSAocmV2IDEz
KSAocHJvZy1pZiAwMCBbTm9ybWFsIGRlY29kZV0pDQoJQ29udHJvbDogSS9PKyBNZW0rIEJ1c01h
c3RlcisgU3BlY0N5Y2xlLSBNZW1XSU5WLSBWR0FTbm9vcC0gUGFyRXJyLSBTdGVwcGluZy0gU0VS
UisgRmFzdEIyQi0gRGlzSU5UeC0NCglTdGF0dXM6IENhcCsgNjZNSHotIFVERi0gRmFzdEIyQi0g
UGFyRXJyLSBERVZTRUw9ZmFzdCA+VEFib3J0LSA8VEFib3J0LSA8TUFib3J0LSA+U0VSUi0gPFBF
UlItIElOVHgtDQoJTGF0ZW5jeTogMCwgQ2FjaGUgTGluZSBTaXplOiAyNTYgYnl0ZXMNCglCdXM6
IHByaW1hcnk9MDAsIHNlY29uZGFyeT0wMywgc3Vib3JkaW5hdGU9MDMsIHNlYy1sYXRlbmN5PTAN
CglJL08gYmVoaW5kIGJyaWRnZTogMDAwMGIwMDAtMDAwMGJmZmYNCglNZW1vcnkgYmVoaW5kIGJy
aWRnZTogZjYwMDAwMDAtZjhmZmZmZmYNCglQcmVmZXRjaGFibGUgbWVtb3J5IGJlaGluZCBicmlk
Z2U6IDAwMDAwMDAwYzQwMDAwMDAtMDAwMDAwMDBjZmZmZmZmZg0KCVNlY29uZGFyeSBzdGF0dXM6
IDY2TUh6LSBGYXN0QjJCLSBQYXJFcnItIERFVlNFTD1mYXN0ID5UQWJvcnQtIDxUQWJvcnQtIDxN
QWJvcnQtIDxTRVJSLSA8UEVSUi0NCglCcmlkZ2VDdGw6IFBhcml0eS0gU0VSUisgTm9JU0EtIFZH
QSsgTUFib3J0LSA+UmVzZXQtIEZhc3RCMkItDQoJCVByaURpc2NUbXItIFNlY0Rpc2NUbXItIERp
c2NUbXJTdGF0LSBEaXNjVG1yU0VSUkVuLQ0KCUNhcGFiaWxpdGllczogWzQwXSBTdWJzeXN0ZW06
IEFTVVNUZUsgQ29tcHV0ZXIgSW5jLiBEZXZpY2UgWzEwNDM6ODM2Yl0NCglDYXBhYmlsaXRpZXM6
IFs2MF0gTVNJOiBFbmFibGUtIENvdW50PTEvMiBNYXNrYWJsZSsgNjRiaXQtDQoJCUFkZHJlc3M6
IDAwMDAwMDAwICBEYXRhOiAwMDAwDQoJCU1hc2tpbmc6IDAwMDAwMDAwICBQZW5kaW5nOiAwMDAw
MDAwMA0KCUNhcGFiaWxpdGllczogWzkwXSBFeHByZXNzICh2MikgUm9vdCBQb3J0IChTbG90Kyks
IE1TSSAwMA0KCQlEZXZDYXA6CU1heFBheWxvYWQgMjU2IGJ5dGVzLCBQaGFudEZ1bmMgMCwgTGF0
ZW5jeSBMMHMgPDY0bnMsIEwxIDwxdXMNCgkJCUV4dFRhZysgUkJFKyBGTFJlc2V0LQ0KCQlEZXZD
dGw6CVJlcG9ydCBlcnJvcnM6IENvcnJlY3RhYmxlLSBOb24tRmF0YWwtIEZhdGFsLSBVbnN1cHBv
cnRlZC0NCgkJCVJseGRPcmQtIEV4dFRhZy0gUGhhbnRGdW5jLSBBdXhQd3ItIE5vU25vb3AtDQoJ
CQlNYXhQYXlsb2FkIDEyOCBieXRlcywgTWF4UmVhZFJlcSAxMjggYnl0ZXMNCgkJRGV2U3RhOglD
b3JyRXJyLSBVbmNvcnJFcnItIEZhdGFsRXJyLSBVbnN1cHBSZXEtIEF1eFB3ci0gVHJhbnNQZW5k
LQ0KCQlMbmtDYXA6CVBvcnQgIzAsIFNwZWVkIDVHVC9zLCBXaWR0aCB4MTYsIEFTUE0gTDBzIEwx
LCBMYXRlbmN5IEwwIDw1MTJucywgTDEgPDY0dXMNCgkJCUNsb2NrUE0tIFN1cnByaXNlKyBMTEFj
dFJlcCsgQndOb3QrDQoJCUxua0N0bDoJQVNQTSBEaXNhYmxlZDsgUkNCIDY0IGJ5dGVzIERpc2Fi
bGVkLSBSZXRyYWluLSBDb21tQ2xrKw0KCQkJRXh0U3luY2gtIENsb2NrUE0tIEF1dFdpZERpcy0g
QldJbnQtIEF1dEJXSW50LQ0KCQlMbmtTdGE6CVNwZWVkIDIuNUdUL3MsIFdpZHRoIHgxNiwgVHJF
cnItIFRyYWluLSBTbG90Q2xrKyBETEFjdGl2ZSsgQldNZ210KyBBQldNZ210LQ0KCQlTbHRDYXA6
CUF0dG5CdG4tIFB3ckN0cmwtIE1STC0gQXR0bkluZC0gUHdySW5kLSBIb3RQbHVnLSBTdXJwcmlz
ZS0NCgkJCVNsb3QgIzIsIFBvd2VyTGltaXQgNzUuMDAwVzsgSW50ZXJsb2NrLSBOb0NvbXBsLQ0K
CQlTbHRDdGw6CUVuYWJsZTogQXR0bkJ0bi0gUHdyRmx0LSBNUkwtIFByZXNEZXQtIENtZENwbHQt
IEhQSXJxLSBMaW5rQ2hnLQ0KCQkJQ29udHJvbDogQXR0bkluZCBPZmYsIFB3ckluZCBPZmYsIFBv
d2VyLSBJbnRlcmxvY2stDQoJCVNsdFN0YToJU3RhdHVzOiBBdHRuQnRuLSBQb3dlckZsdC0gTVJM
LSBDbWRDcGx0LSBQcmVzRGV0KyBJbnRlcmxvY2stDQoJCQlDaGFuZ2VkOiBNUkwtIFByZXNEZXQr
IExpbmtTdGF0ZSsNCgkJUm9vdEN0bDogRXJyQ29ycmVjdGFibGUtIEVyck5vbi1GYXRhbC0gRXJy
RmF0YWwtIFBNRUludEVuYS0gQ1JTVmlzaWJsZS0NCgkJUm9vdENhcDogQ1JTVmlzaWJsZS0NCgkJ
Um9vdFN0YTogUE1FIFJlcUlEIDAwMDAsIFBNRVN0YXR1cy0gUE1FUGVuZGluZy0NCgkJRGV2Q2Fw
MjogQ29tcGxldGlvbiBUaW1lb3V0OiBSYW5nZSBCQ0QsIFRpbWVvdXREaXMrIEFSSUZ3ZCsNCgkJ
RGV2Q3RsMjogQ29tcGxldGlvbiBUaW1lb3V0OiAyNjBtcyB0byA5MDBtcywgVGltZW91dERpcy0g
QVJJRndkLQ0KCQlMbmtDdGwyOiBUYXJnZXQgTGluayBTcGVlZDogNUdUL3MsIEVudGVyQ29tcGxp
YW5jZS0gU3BlZWREaXMtLCBTZWxlY3RhYmxlIERlLWVtcGhhc2lzOiAtNmRCDQoJCQkgVHJhbnNt
aXQgTWFyZ2luOiBOb3JtYWwgT3BlcmF0aW5nIFJhbmdlLCBFbnRlck1vZGlmaWVkQ29tcGxpYW5j
ZS0gQ29tcGxpYW5jZVNPUy0NCgkJCSBDb21wbGlhbmNlIERlLWVtcGhhc2lzOiAtNmRCDQoJCUxu
a1N0YTI6IEN1cnJlbnQgRGUtZW1waGFzaXMgTGV2ZWw6IC02ZEINCglDYXBhYmlsaXRpZXM6IFtl
MF0gUG93ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDMNCgkJRmxhZ3M6IFBNRUNsay0gRFNJLSBEMS0g
RDItIEF1eEN1cnJlbnQ9MG1BIFBNRShEMCssRDEtLEQyLSxEM2hvdCssRDNjb2xkKykNCgkJU3Rh
dHVzOiBEMCBOb1NvZnRSc3QrIFBNRS1FbmFibGUtIERTZWw9MCBEU2NhbGU9MCBQTUUtDQoJQ2Fw
YWJpbGl0aWVzOiBbMTAwIHYxXSBBZHZhbmNlZCBFcnJvciBSZXBvcnRpbmcNCgkJVUVTdGE6CURM
UC0gU0RFUy0gVExQLSBGQ1AtIENtcGx0VE8tIENtcGx0QWJydC0gVW54Q21wbHQtIFJ4T0YtIE1h
bGZUTFAtIEVDUkMtIFVuc3VwUmVxLSBBQ1NWaW9sLQ0KCQlVRU1zazoJRExQLSBTREVTLSBUTFAt
IEZDUC0gQ21wbHRUTy0gQ21wbHRBYnJ0LSBVbnhDbXBsdC0gUnhPRi0gTWFsZlRMUC0gRUNSQy0g
VW5zdXBSZXEtIEFDU1Zpb2wtDQoJCVVFU3ZydDoJRExQKyBTREVTKyBUTFAtIEZDUCsgQ21wbHRU
Ty0gQ21wbHRBYnJ0LSBVbnhDbXBsdC0gUnhPRisgTWFsZlRMUCsgRUNSQy0gVW5zdXBSZXEtIEFD
U1Zpb2wtDQoJCUNFU3RhOglSeEVyci0gQmFkVExQLSBCYWRETExQLSBSb2xsb3Zlci0gVGltZW91
dC0gTm9uRmF0YWxFcnItDQoJCUNFTXNrOglSeEVyci0gQmFkVExQLSBCYWRETExQLSBSb2xsb3Zl
ci0gVGltZW91dC0gTm9uRmF0YWxFcnIrDQoJCUFFUkNhcDoJRmlyc3QgRXJyb3IgUG9pbnRlcjog
MDAsIEdlbkNhcC0gQ0dlbkVuLSBDaGtDYXAtIENoa0VuLQ0KCUNhcGFiaWxpdGllczogWzE1MCB2
MV0gQWNjZXNzIENvbnRyb2wgU2VydmljZXMNCgkJQUNTQ2FwOglTcmNWYWxpZCsgVHJhbnNCbGsr
IFJlcVJlZGlyKyBDbXBsdFJlZGlyKyBVcHN0cmVhbUZ3ZCsgRWdyZXNzQ3RybC0gRGlyZWN0VHJh
bnMtDQoJCUFDU0N0bDoJU3JjVmFsaWQrIFRyYW5zQmxrLSBSZXFSZWRpcisgQ21wbHRSZWRpcisg
VXBzdHJlYW1Gd2QrIEVncmVzc0N0cmwtIERpcmVjdFRyYW5zLQ0KCUNhcGFiaWxpdGllczogWzE2
MCB2MF0gVmVuZG9yIFNwZWNpZmljIEluZm9ybWF0aW9uOiBJRD0wMDAyIFJldj0wIExlbj0wMGMg
PD8+DQoJS2VybmVsIGRyaXZlciBpbiB1c2U6IHBjaWVwb3J0DQoNCjAwOjA3LjAgUENJIGJyaWRn
ZSBbMDYwNF06IEludGVsIENvcnBvcmF0aW9uIDU1MjAvNTUwMC9YNTggSS9PIEh1YiBQQ0kgRXhw
cmVzcyBSb290IFBvcnQgNyBbODA4NjozNDBlXSAocmV2IDEzKSAocHJvZy1pZiAwMCBbTm9ybWFs
IGRlY29kZV0pDQoJQ29udHJvbDogSS9PKyBNZW0rIEJ1c01hc3RlcisgU3BlY0N5Y2xlLSBNZW1X
SU5WLSBWR0FTbm9vcC0gUGFyRXJyLSBTdGVwcGluZy0gU0VSUisgRmFzdEIyQi0gRGlzSU5UeC0N
CglTdGF0dXM6IENhcCsgNjZNSHotIFVERi0gRmFzdEIyQi0gUGFyRXJyLSBERVZTRUw9ZmFzdCA+
VEFib3J0LSA8VEFib3J0LSA8TUFib3J0LSA+U0VSUi0gPFBFUlItIElOVHgtDQoJTGF0ZW5jeTog
MCwgQ2FjaGUgTGluZSBTaXplOiAyNTYgYnl0ZXMNCglCdXM6IHByaW1hcnk9MDAsIHNlY29uZGFy
eT0wNCwgc3Vib3JkaW5hdGU9MDQsIHNlYy1sYXRlbmN5PTANCglJL08gYmVoaW5kIGJyaWRnZTog
MDAwMGMwMDAtMDAwMGNmZmYNCglNZW1vcnkgYmVoaW5kIGJyaWRnZTogZjkwMDAwMDAtZmJjZmZm
ZmYNCglQcmVmZXRjaGFibGUgbWVtb3J5IGJlaGluZCBicmlkZ2U6IDAwMDAwMDAwZDAwMDAwMDAt
MDAwMDAwMDBkZmZmZmZmZg0KCVNlY29uZGFyeSBzdGF0dXM6IDY2TUh6LSBGYXN0QjJCLSBQYXJF
cnItIERFVlNFTD1mYXN0ID5UQWJvcnQtIDxUQWJvcnQtIDxNQWJvcnQtIDxTRVJSLSA8UEVSUi0N
CglCcmlkZ2VDdGw6IFBhcml0eS0gU0VSUisgTm9JU0EtIFZHQS0gTUFib3J0LSA+UmVzZXQtIEZh
c3RCMkItDQoJCVByaURpc2NUbXItIFNlY0Rpc2NUbXItIERpc2NUbXJTdGF0LSBEaXNjVG1yU0VS
UkVuLQ0KCUNhcGFiaWxpdGllczogWzQwXSBTdWJzeXN0ZW06IEFTVVNUZUsgQ29tcHV0ZXIgSW5j
LiBEZXZpY2UgWzEwNDM6ODM2Yl0NCglDYXBhYmlsaXRpZXM6IFs2MF0gTVNJOiBFbmFibGUtIENv
dW50PTEvMiBNYXNrYWJsZSsgNjRiaXQtDQoJCUFkZHJlc3M6IDAwMDAwMDAwICBEYXRhOiAwMDAw
DQoJCU1hc2tpbmc6IDAwMDAwMDAwICBQZW5kaW5nOiAwMDAwMDAwMA0KCUNhcGFiaWxpdGllczog
WzkwXSBFeHByZXNzICh2MikgUm9vdCBQb3J0IChTbG90KyksIE1TSSAwMA0KCQlEZXZDYXA6CU1h
eFBheWxvYWQgMjU2IGJ5dGVzLCBQaGFudEZ1bmMgMCwgTGF0ZW5jeSBMMHMgPDY0bnMsIEwxIDwx
dXMNCgkJCUV4dFRhZysgUkJFKyBGTFJlc2V0LQ0KCQlEZXZDdGw6CVJlcG9ydCBlcnJvcnM6IENv
cnJlY3RhYmxlLSBOb24tRmF0YWwtIEZhdGFsLSBVbnN1cHBvcnRlZC0NCgkJCVJseGRPcmQtIEV4
dFRhZy0gUGhhbnRGdW5jLSBBdXhQd3ItIE5vU25vb3AtDQoJCQlNYXhQYXlsb2FkIDEyOCBieXRl
cywgTWF4UmVhZFJlcSAxMjggYnl0ZXMNCgkJRGV2U3RhOglDb3JyRXJyLSBVbmNvcnJFcnItIEZh
dGFsRXJyLSBVbnN1cHBSZXEtIEF1eFB3ci0gVHJhbnNQZW5kLQ0KCQlMbmtDYXA6CVBvcnQgIzAs
IFNwZWVkIDVHVC9zLCBXaWR0aCB4MTYsIEFTUE0gTDBzIEwxLCBMYXRlbmN5IEwwIDw1MTJucywg
TDEgPDY0dXMNCgkJCUNsb2NrUE0tIFN1cnByaXNlKyBMTEFjdFJlcCsgQndOb3QrDQoJCUxua0N0
bDoJQVNQTSBEaXNhYmxlZDsgUkNCIDY0IGJ5dGVzIERpc2FibGVkLSBSZXRyYWluLSBDb21tQ2xr
LQ0KCQkJRXh0U3luY2gtIENsb2NrUE0tIEF1dFdpZERpcy0gQldJbnQtIEF1dEJXSW50LQ0KCQlM
bmtTdGE6CVNwZWVkIDIuNUdUL3MsIFdpZHRoIHgxNiwgVHJFcnItIFRyYWluLSBTbG90Q2xrKyBE
TEFjdGl2ZSsgQldNZ210LSBBQldNZ210LQ0KCQlTbHRDYXA6CUF0dG5CdG4tIFB3ckN0cmwtIE1S
TC0gQXR0bkluZC0gUHdySW5kLSBIb3RQbHVnLSBTdXJwcmlzZS0NCgkJCVNsb3QgIzUsIFBvd2Vy
TGltaXQgNzUuMDAwVzsgSW50ZXJsb2NrLSBOb0NvbXBsLQ0KCQlTbHRDdGw6CUVuYWJsZTogQXR0
bkJ0bi0gUHdyRmx0LSBNUkwtIFByZXNEZXQtIENtZENwbHQtIEhQSXJxLSBMaW5rQ2hnLQ0KCQkJ
Q29udHJvbDogQXR0bkluZCBPZmYsIFB3ckluZCBPZmYsIFBvd2VyLSBJbnRlcmxvY2stDQoJCVNs
dFN0YToJU3RhdHVzOiBBdHRuQnRuLSBQb3dlckZsdC0gTVJMLSBDbWRDcGx0LSBQcmVzRGV0KyBJ
bnRlcmxvY2stDQoJCQlDaGFuZ2VkOiBNUkwtIFByZXNEZXQrIExpbmtTdGF0ZSsNCgkJUm9vdEN0
bDogRXJyQ29ycmVjdGFibGUtIEVyck5vbi1GYXRhbC0gRXJyRmF0YWwtIFBNRUludEVuYS0gQ1JT
VmlzaWJsZS0NCgkJUm9vdENhcDogQ1JTVmlzaWJsZS0NCgkJUm9vdFN0YTogUE1FIFJlcUlEIDAw
MDAsIFBNRVN0YXR1cy0gUE1FUGVuZGluZy0NCgkJRGV2Q2FwMjogQ29tcGxldGlvbiBUaW1lb3V0
OiBSYW5nZSBCQ0QsIFRpbWVvdXREaXMrIEFSSUZ3ZCsNCgkJRGV2Q3RsMjogQ29tcGxldGlvbiBU
aW1lb3V0OiAyNjBtcyB0byA5MDBtcywgVGltZW91dERpcy0gQVJJRndkLQ0KCQlMbmtDdGwyOiBU
YXJnZXQgTGluayBTcGVlZDogNUdUL3MsIEVudGVyQ29tcGxpYW5jZS0gU3BlZWREaXMtLCBTZWxl
Y3RhYmxlIERlLWVtcGhhc2lzOiAtNmRCDQoJCQkgVHJhbnNtaXQgTWFyZ2luOiBOb3JtYWwgT3Bl
cmF0aW5nIFJhbmdlLCBFbnRlck1vZGlmaWVkQ29tcGxpYW5jZS0gQ29tcGxpYW5jZVNPUy0NCgkJ
CSBDb21wbGlhbmNlIERlLWVtcGhhc2lzOiAtNmRCDQoJCUxua1N0YTI6IEN1cnJlbnQgRGUtZW1w
aGFzaXMgTGV2ZWw6IC02ZEINCglDYXBhYmlsaXRpZXM6IFtlMF0gUG93ZXIgTWFuYWdlbWVudCB2
ZXJzaW9uIDMNCgkJRmxhZ3M6IFBNRUNsay0gRFNJLSBEMS0gRDItIEF1eEN1cnJlbnQ9MG1BIFBN
RShEMCssRDEtLEQyLSxEM2hvdCssRDNjb2xkKykNCgkJU3RhdHVzOiBEMCBOb1NvZnRSc3QrIFBN
RS1FbmFibGUtIERTZWw9MCBEU2NhbGU9MCBQTUUtDQoJQ2FwYWJpbGl0aWVzOiBbMTAwIHYxXSBB
ZHZhbmNlZCBFcnJvciBSZXBvcnRpbmcNCgkJVUVTdGE6CURMUC0gU0RFUy0gVExQLSBGQ1AtIENt
cGx0VE8tIENtcGx0QWJydC0gVW54Q21wbHQtIFJ4T0YtIE1hbGZUTFAtIEVDUkMtIFVuc3VwUmVx
LSBBQ1NWaW9sLQ0KCQlVRU1zazoJRExQLSBTREVTLSBUTFAtIEZDUC0gQ21wbHRUTy0gQ21wbHRB
YnJ0LSBVbnhDbXBsdC0gUnhPRi0gTWFsZlRMUC0gRUNSQy0gVW5zdXBSZXEtIEFDU1Zpb2wtDQoJ
CVVFU3ZydDoJRExQKyBTREVTKyBUTFAtIEZDUCsgQ21wbHRUTy0gQ21wbHRBYnJ0LSBVbnhDbXBs
dC0gUnhPRisgTWFsZlRMUCsgRUNSQy0gVW5zdXBSZXEtIEFDU1Zpb2wtDQoJCUNFU3RhOglSeEVy
ci0gQmFkVExQLSBCYWRETExQLSBSb2xsb3Zlci0gVGltZW91dC0gTm9uRmF0YWxFcnItDQoJCUNF
TXNrOglSeEVyci0gQmFkVExQLSBCYWRETExQLSBSb2xsb3Zlci0gVGltZW91dC0gTm9uRmF0YWxF
cnIrDQoJCUFFUkNhcDoJRmlyc3QgRXJyb3IgUG9pbnRlcjogMDAsIEdlbkNhcC0gQ0dlbkVuLSBD
aGtDYXAtIENoa0VuLQ0KCUNhcGFiaWxpdGllczogWzE1MCB2MV0gQWNjZXNzIENvbnRyb2wgU2Vy
dmljZXMNCgkJQUNTQ2FwOglTcmNWYWxpZCsgVHJhbnNCbGsrIFJlcVJlZGlyKyBDbXBsdFJlZGly
KyBVcHN0cmVhbUZ3ZCsgRWdyZXNzQ3RybC0gRGlyZWN0VHJhbnMtDQoJCUFDU0N0bDoJU3JjVmFs
aWQrIFRyYW5zQmxrLSBSZXFSZWRpcisgQ21wbHRSZWRpcisgVXBzdHJlYW1Gd2QrIEVncmVzc0N0
cmwtIERpcmVjdFRyYW5zLQ0KCUNhcGFiaWxpdGllczogWzE2MCB2MF0gVmVuZG9yIFNwZWNpZmlj
IEluZm9ybWF0aW9uOiBJRD0wMDAyIFJldj0wIExlbj0wMGMgPD8+DQoJS2VybmVsIGRyaXZlciBp
biB1c2U6IHBjaWVwb3J0DQoNCjAwOjE0LjAgUElDIFswODAwXTogSW50ZWwgQ29ycG9yYXRpb24g
NTUyMC81NTAwL1g1OCBJL08gSHViIFN5c3RlbSBNYW5hZ2VtZW50IFJlZ2lzdGVycyBbODA4Njoz
NDJlXSAocmV2IDEzKSAocHJvZy1pZiAwMCBbODI1OV0pDQoJQ29udHJvbDogSS9PLSBNZW0tIEJ1
c01hc3Rlci0gU3BlY0N5Y2xlLSBNZW1XSU5WLSBWR0FTbm9vcC0gUGFyRXJyLSBTdGVwcGluZy0g
U0VSUi0gRmFzdEIyQi0gRGlzSU5UeC0NCglTdGF0dXM6IENhcCsgNjZNSHotIFVERi0gRmFzdEIy
Qi0gUGFyRXJyLSBERVZTRUw9ZmFzdCA+VEFib3J0LSA8VEFib3J0LSA8TUFib3J0LSA+U0VSUi0g
PFBFUlItIElOVHgtDQoJQ2FwYWJpbGl0aWVzOiBbNDBdIEV4cHJlc3MgKHYyKSBSb290IENvbXBs
ZXggSW50ZWdyYXRlZCBFbmRwb2ludCwgTVNJIDAwDQoJCURldkNhcDoJTWF4UGF5bG9hZCAxMjgg
Ynl0ZXMsIFBoYW50RnVuYyAwLCBMYXRlbmN5IEwwcyA8NjRucywgTDEgPDF1cw0KCQkJRXh0VGFn
LSBSQkUrIEZMUmVzZXQtDQoJCURldkN0bDoJUmVwb3J0IGVycm9yczogQ29ycmVjdGFibGUtIE5v
bi1GYXRhbC0gRmF0YWwtIFVuc3VwcG9ydGVkLQ0KCQkJUmx4ZE9yZC0gRXh0VGFnLSBQaGFudEZ1
bmMtIEF1eFB3ci0gTm9Tbm9vcC0NCgkJCU1heFBheWxvYWQgMTI4IGJ5dGVzLCBNYXhSZWFkUmVx
IDEyOCBieXRlcw0KCQlEZXZTdGE6CUNvcnJFcnItIFVuY29yckVyci0gRmF0YWxFcnItIFVuc3Vw
cFJlcS0gQXV4UHdyLSBUcmFuc1BlbmQtDQoJCUxua0NhcDoJUG9ydCAjMCwgU3BlZWQgdW5rbm93
biwgV2lkdGggeDAsIEFTUE0gTDBzLCBMYXRlbmN5IEwwIHVubGltaXRlZCwgTDEgdW5saW1pdGVk
DQoJCQlDbG9ja1BNLSBTdXJwcmlzZSsgTExBY3RSZXArIEJ3Tm90Kw0KCQlMbmtDdGw6CUFTUE0g
RGlzYWJsZWQ7IERpc2FibGVkLSBSZXRyYWluLSBDb21tQ2xrLQ0KCQkJRXh0U3luY2gtIENsb2Nr
UE0tIEF1dFdpZERpcy0gQldJbnQtIEF1dEJXSW50LQ0KCQlMbmtTdGE6CVNwZWVkIHVua25vd24s
IFdpZHRoIHgwLCBUckVyci0gVHJhaW4tIFNsb3RDbGsrIERMQWN0aXZlLSBCV01nbXQtIEFCV01n
bXQtDQoJCURldkNhcDI6IENvbXBsZXRpb24gVGltZW91dDogTm90IFN1cHBvcnRlZCwgVGltZW91
dERpcy0NCgkJRGV2Q3RsMjogQ29tcGxldGlvbiBUaW1lb3V0OiA1MHVzIHRvIDUwbXMsIFRpbWVv
dXREaXMtDQoJCUxua0N0bDI6IFRhcmdldCBMaW5rIFNwZWVkOiAyLjVHVC9zLCBFbnRlckNvbXBs
aWFuY2UtIFNwZWVkRGlzLSwgU2VsZWN0YWJsZSBEZS1lbXBoYXNpczogLTZkQg0KCQkJIFRyYW5z
bWl0IE1hcmdpbjogTm9ybWFsIE9wZXJhdGluZyBSYW5nZSwgRW50ZXJNb2RpZmllZENvbXBsaWFu
Y2UtIENvbXBsaWFuY2VTT1MtDQoJCQkgQ29tcGxpYW5jZSBEZS1lbXBoYXNpczogLTZkQg0KCQlM
bmtTdGEyOiBDdXJyZW50IERlLWVtcGhhc2lzIExldmVsOiAtNmRCDQoJS2VybmVsIGRyaXZlciBp
biB1c2U6IGk3Y29yZV9lZGFjDQoNCjAwOjE0LjEgUElDIFswODAwXTogSW50ZWwgQ29ycG9yYXRp
b24gNTUyMC81NTAwL1g1OCBJL08gSHViIEdQSU8gYW5kIFNjcmF0Y2ggUGFkIFJlZ2lzdGVycyBb
ODA4NjozNDIyXSAocmV2IDEzKSAocHJvZy1pZiAwMCBbODI1OV0pDQoJQ29udHJvbDogSS9PLSBN
ZW0tIEJ1c01hc3Rlci0gU3BlY0N5Y2xlLSBNZW1XSU5WLSBWR0FTbm9vcC0gUGFyRXJyLSBTdGVw
cGluZy0gU0VSUi0gRmFzdEIyQi0gRGlzSU5UeC0NCglTdGF0dXM6IENhcCsgNjZNSHotIFVERi0g
RmFzdEIyQi0gUGFyRXJyLSBERVZTRUw9ZmFzdCA+VEFib3J0LSA8VEFib3J0LSA8TUFib3J0LSA+
U0VSUi0gPFBFUlItIElOVHgtDQoJQ2FwYWJpbGl0aWVzOiBbNDBdIEV4cHJlc3MgKHYyKSBSb290
IENvbXBsZXggSW50ZWdyYXRlZCBFbmRwb2ludCwgTVNJIDAwDQoJCURldkNhcDoJTWF4UGF5bG9h
ZCAxMjggYnl0ZXMsIFBoYW50RnVuYyAwLCBMYXRlbmN5IEwwcyA8NjRucywgTDEgPDF1cw0KCQkJ
RXh0VGFnLSBSQkUrIEZMUmVzZXQtDQoJCURldkN0bDoJUmVwb3J0IGVycm9yczogQ29ycmVjdGFi
bGUtIE5vbi1GYXRhbC0gRmF0YWwtIFVuc3VwcG9ydGVkLQ0KCQkJUmx4ZE9yZC0gRXh0VGFnLSBQ
aGFudEZ1bmMtIEF1eFB3ci0gTm9Tbm9vcC0NCgkJCU1heFBheWxvYWQgMTI4IGJ5dGVzLCBNYXhS
ZWFkUmVxIDEyOCBieXRlcw0KCQlEZXZTdGE6CUNvcnJFcnItIFVuY29yckVyci0gRmF0YWxFcnIt
IFVuc3VwcFJlcS0gQXV4UHdyLSBUcmFuc1BlbmQtDQoJCUxua0NhcDoJUG9ydCAjMCwgU3BlZWQg
dW5rbm93biwgV2lkdGggeDAsIEFTUE0gTDBzLCBMYXRlbmN5IEwwIHVubGltaXRlZCwgTDEgdW5s
aW1pdGVkDQoJCQlDbG9ja1BNLSBTdXJwcmlzZSsgTExBY3RSZXArIEJ3Tm90Kw0KCQlMbmtDdGw6
CUFTUE0gRGlzYWJsZWQ7IERpc2FibGVkLSBSZXRyYWluLSBDb21tQ2xrLQ0KCQkJRXh0U3luY2gt
IENsb2NrUE0tIEF1dFdpZERpcy0gQldJbnQtIEF1dEJXSW50LQ0KCQlMbmtTdGE6CVNwZWVkIHVu
a25vd24sIFdpZHRoIHgwLCBUckVyci0gVHJhaW4tIFNsb3RDbGsrIERMQWN0aXZlLSBCV01nbXQt
IEFCV01nbXQtDQoJCURldkNhcDI6IENvbXBsZXRpb24gVGltZW91dDogTm90IFN1cHBvcnRlZCwg
VGltZW91dERpcy0NCgkJRGV2Q3RsMjogQ29tcGxldGlvbiBUaW1lb3V0OiA1MHVzIHRvIDUwbXMs
IFRpbWVvdXREaXMtDQoJCUxua0N0bDI6IFRhcmdldCBMaW5rIFNwZWVkOiAyLjVHVC9zLCBFbnRl
ckNvbXBsaWFuY2UtIFNwZWVkRGlzLSwgU2VsZWN0YWJsZSBEZS1lbXBoYXNpczogLTZkQg0KCQkJ
IFRyYW5zbWl0IE1hcmdpbjogTm9ybWFsIE9wZXJhdGluZyBSYW5nZSwgRW50ZXJNb2RpZmllZENv
bXBsaWFuY2UtIENvbXBsaWFuY2VTT1MtDQoJCQkgQ29tcGxpYW5jZSBEZS1lbXBoYXNpczogLTZk
Qg0KCQlMbmtTdGEyOiBDdXJyZW50IERlLWVtcGhhc2lzIExldmVsOiAtNmRCDQoNCjAwOjE0LjIg
UElDIFswODAwXTogSW50ZWwgQ29ycG9yYXRpb24gNTUyMC81NTAwL1g1OCBJL08gSHViIENvbnRy
b2wgU3RhdHVzIGFuZCBSQVMgUmVnaXN0ZXJzIFs4MDg2OjM0MjNdIChyZXYgMTMpIChwcm9nLWlm
IDAwIFs4MjU5XSkNCglDb250cm9sOiBJL08tIE1lbS0gQnVzTWFzdGVyLSBTcGVjQ3ljbGUtIE1l
bVdJTlYtIFZHQVNub29wLSBQYXJFcnItIFN0ZXBwaW5nLSBTRVJSLSBGYXN0QjJCLSBEaXNJTlR4
LQ0KCVN0YXR1czogQ2FwKyA2Nk1Iei0gVURGLSBGYXN0QjJCLSBQYXJFcnItIERFVlNFTD1mYXN0
ID5UQWJvcnQtIDxUQWJvcnQtIDxNQWJvcnQtID5TRVJSLSA8UEVSUi0gSU5UeC0NCglDYXBhYmls
aXRpZXM6IFs0MF0gRXhwcmVzcyAodjIpIFJvb3QgQ29tcGxleCBJbnRlZ3JhdGVkIEVuZHBvaW50
LCBNU0kgMDANCgkJRGV2Q2FwOglNYXhQYXlsb2FkIDEyOCBieXRlcywgUGhhbnRGdW5jIDAsIExh
dGVuY3kgTDBzIDw2NG5zLCBMMSA8MXVzDQoJCQlFeHRUYWctIFJCRSsgRkxSZXNldC0NCgkJRGV2
Q3RsOglSZXBvcnQgZXJyb3JzOiBDb3JyZWN0YWJsZS0gTm9uLUZhdGFsLSBGYXRhbC0gVW5zdXBw
b3J0ZWQtDQoJCQlSbHhkT3JkLSBFeHRUYWctIFBoYW50RnVuYy0gQXV4UHdyLSBOb1Nub29wLQ0K
CQkJTWF4UGF5bG9hZCAxMjggYnl0ZXMsIE1heFJlYWRSZXEgMTI4IGJ5dGVzDQoJCURldlN0YToJ
Q29yckVyci0gVW5jb3JyRXJyLSBGYXRhbEVyci0gVW5zdXBwUmVxLSBBdXhQd3ItIFRyYW5zUGVu
ZC0NCgkJTG5rQ2FwOglQb3J0ICMwLCBTcGVlZCB1bmtub3duLCBXaWR0aCB4MCwgQVNQTSBMMHMs
IExhdGVuY3kgTDAgdW5saW1pdGVkLCBMMSB1bmxpbWl0ZWQNCgkJCUNsb2NrUE0tIFN1cnByaXNl
KyBMTEFjdFJlcCsgQndOb3QrDQoJCUxua0N0bDoJQVNQTSBEaXNhYmxlZDsgRGlzYWJsZWQtIFJl
dHJhaW4tIENvbW1DbGstDQoJCQlFeHRTeW5jaC0gQ2xvY2tQTS0gQXV0V2lkRGlzLSBCV0ludC0g
QXV0QldJbnQtDQoJCUxua1N0YToJU3BlZWQgdW5rbm93biwgV2lkdGggeDAsIFRyRXJyLSBUcmFp
bi0gU2xvdENsaysgRExBY3RpdmUtIEJXTWdtdC0gQUJXTWdtdC0NCgkJRGV2Q2FwMjogQ29tcGxl
dGlvbiBUaW1lb3V0OiBOb3QgU3VwcG9ydGVkLCBUaW1lb3V0RGlzLQ0KCQlEZXZDdGwyOiBDb21w
bGV0aW9uIFRpbWVvdXQ6IDUwdXMgdG8gNTBtcywgVGltZW91dERpcy0NCgkJTG5rQ3RsMjogVGFy
Z2V0IExpbmsgU3BlZWQ6IDIuNUdUL3MsIEVudGVyQ29tcGxpYW5jZS0gU3BlZWREaXMtLCBTZWxl
Y3RhYmxlIERlLWVtcGhhc2lzOiAtNmRCDQoJCQkgVHJhbnNtaXQgTWFyZ2luOiBOb3JtYWwgT3Bl
cmF0aW5nIFJhbmdlLCBFbnRlck1vZGlmaWVkQ29tcGxpYW5jZS0gQ29tcGxpYW5jZVNPUy0NCgkJ
CSBDb21wbGlhbmNlIERlLWVtcGhhc2lzOiAtNmRCDQoJCUxua1N0YTI6IEN1cnJlbnQgRGUtZW1w
aGFzaXMgTGV2ZWw6IC02ZEINCg0KMDA6MTQuMyBQSUMgWzA4MDBdOiBJbnRlbCBDb3Jwb3JhdGlv
biA1NTIwLzU1MDAvWDU4IEkvTyBIdWIgVGhyb3R0bGUgUmVnaXN0ZXJzIFs4MDg2OjM0MzhdIChy
ZXYgMTMpIChwcm9nLWlmIDAwIFs4MjU5XSkNCglDb250cm9sOiBJL08tIE1lbS0gQnVzTWFzdGVy
LSBTcGVjQ3ljbGUtIE1lbVdJTlYtIFZHQVNub29wLSBQYXJFcnItIFN0ZXBwaW5nLSBTRVJSLSBG
YXN0QjJCLSBEaXNJTlR4LQ0KCVN0YXR1czogQ2FwLSA2Nk1Iei0gVURGLSBGYXN0QjJCLSBQYXJF
cnItIERFVlNFTD1mYXN0ID5UQWJvcnQtIDxUQWJvcnQtIDxNQWJvcnQtID5TRVJSLSA8UEVSUi0g
SU5UeC0NCg0KMDA6MWEuMCBVU0IgY29udHJvbGxlciBbMGMwM106IEludGVsIENvcnBvcmF0aW9u
IDgyODAxSkkgKElDSDEwIEZhbWlseSkgVVNCIFVIQ0kgQ29udHJvbGxlciAjNCBbODA4NjozYTM3
XSAocHJvZy1pZiAwMCBbVUhDSV0pDQoJU3Vic3lzdGVtOiBBU1VTVGVLIENvbXB1dGVyIEluYy4g
RGV2aWNlIFsxMDQzOjgyZDRdDQoJQ29udHJvbDogSS9PKyBNZW0tIEJ1c01hc3RlcisgU3BlY0N5
Y2xlLSBNZW1XSU5WLSBWR0FTbm9vcC0gUGFyRXJyLSBTdGVwcGluZy0gU0VSUi0gRmFzdEIyQi0g
RGlzSU5UeC0NCglTdGF0dXM6IENhcCsgNjZNSHotIFVERi0gRmFzdEIyQisgUGFyRXJyLSBERVZT
RUw9bWVkaXVtID5UQWJvcnQtIDxUQWJvcnQtIDxNQWJvcnQtID5TRVJSLSA8UEVSUi0gSU5UeC0N
CglMYXRlbmN5OiAwDQoJSW50ZXJydXB0OiBwaW4gQSByb3V0ZWQgdG8gSVJRIDE2DQoJUmVnaW9u
IDQ6IEkvTyBwb3J0cyBhdCA5ODAwIFtzaXplPTMyXQ0KCUNhcGFiaWxpdGllczogWzUwXSBQQ0kg
QWR2YW5jZWQgRmVhdHVyZXMNCgkJQUZDYXA6IFRQKyBGTFIrDQoJCUFGQ3RybDogRkxSLQ0KCQlB
RlN0YXR1czogVFAtDQoJS2VybmVsIGRyaXZlciBpbiB1c2U6IHVoY2lfaGNkDQoNCjAwOjFhLjEg
VVNCIGNvbnRyb2xsZXIgWzBjMDNdOiBJbnRlbCBDb3Jwb3JhdGlvbiA4MjgwMUpJIChJQ0gxMCBG
YW1pbHkpIFVTQiBVSENJIENvbnRyb2xsZXIgIzUgWzgwODY6M2EzOF0gKHByb2ctaWYgMDAgW1VI
Q0ldKQ0KCVN1YnN5c3RlbTogQVNVU1RlSyBDb21wdXRlciBJbmMuIERldmljZSBbMTA0Mzo4MmQ0
XQ0KCUNvbnRyb2w6IEkvTysgTWVtLSBCdXNNYXN0ZXIrIFNwZWNDeWNsZS0gTWVtV0lOVi0gVkdB
U25vb3AtIFBhckVyci0gU3RlcHBpbmctIFNFUlItIEZhc3RCMkItIERpc0lOVHgtDQoJU3RhdHVz
OiBDYXArIDY2TUh6LSBVREYtIEZhc3RCMkIrIFBhckVyci0gREVWU0VMPW1lZGl1bSA+VEFib3J0
LSA8VEFib3J0LSA8TUFib3J0LSA+U0VSUi0gPFBFUlItIElOVHgtDQoJTGF0ZW5jeTogMA0KCUlu
dGVycnVwdDogcGluIEIgcm91dGVkIHRvIElSUSAyMQ0KCVJlZ2lvbiA0OiBJL08gcG9ydHMgYXQg
OTg4MCBbc2l6ZT0zMl0NCglDYXBhYmlsaXRpZXM6IFs1MF0gUENJIEFkdmFuY2VkIEZlYXR1cmVz
DQoJCUFGQ2FwOiBUUCsgRkxSKw0KCQlBRkN0cmw6IEZMUi0NCgkJQUZTdGF0dXM6IFRQLQ0KCUtl
cm5lbCBkcml2ZXIgaW4gdXNlOiB1aGNpX2hjZA0KDQowMDoxYS4yIFVTQiBjb250cm9sbGVyIFsw
YzAzXTogSW50ZWwgQ29ycG9yYXRpb24gODI4MDFKSSAoSUNIMTAgRmFtaWx5KSBVU0IgVUhDSSBD
b250cm9sbGVyICM2IFs4MDg2OjNhMzldIChwcm9nLWlmIDAwIFtVSENJXSkNCglTdWJzeXN0ZW06
IEFTVVNUZUsgQ29tcHV0ZXIgSW5jLiBEZXZpY2UgWzEwNDM6ODJkNF0NCglDb250cm9sOiBJL08r
IE1lbS0gQnVzTWFzdGVyKyBTcGVjQ3ljbGUtIE1lbVdJTlYtIFZHQVNub29wLSBQYXJFcnItIFN0
ZXBwaW5nLSBTRVJSLSBGYXN0QjJCLSBEaXNJTlR4LQ0KCVN0YXR1czogQ2FwKyA2Nk1Iei0gVURG
LSBGYXN0QjJCKyBQYXJFcnItIERFVlNFTD1tZWRpdW0gPlRBYm9ydC0gPFRBYm9ydC0gPE1BYm9y
dC0gPlNFUlItIDxQRVJSLSBJTlR4LQ0KCUxhdGVuY3k6IDANCglJbnRlcnJ1cHQ6IHBpbiBEIHJv
dXRlZCB0byBJUlEgMTkNCglSZWdpb24gNDogSS9PIHBvcnRzIGF0IDljMDAgW3NpemU9MzJdDQoJ
Q2FwYWJpbGl0aWVzOiBbNTBdIFBDSSBBZHZhbmNlZCBGZWF0dXJlcw0KCQlBRkNhcDogVFArIEZM
UisNCgkJQUZDdHJsOiBGTFItDQoJCUFGU3RhdHVzOiBUUC0NCglLZXJuZWwgZHJpdmVyIGluIHVz
ZTogdWhjaV9oY2QNCg0KMDA6MWEuNyBVU0IgY29udHJvbGxlciBbMGMwM106IEludGVsIENvcnBv
cmF0aW9uIDgyODAxSkkgKElDSDEwIEZhbWlseSkgVVNCMiBFSENJIENvbnRyb2xsZXIgIzIgWzgw
ODY6M2EzY10gKHByb2ctaWYgMjAgW0VIQ0ldKQ0KCVN1YnN5c3RlbTogQVNVU1RlSyBDb21wdXRl
ciBJbmMuIERldmljZSBbMTA0Mzo4MmQ0XQ0KCUNvbnRyb2w6IEkvTy0gTWVtKyBCdXNNYXN0ZXIr
IFNwZWNDeWNsZS0gTWVtV0lOVi0gVkdBU25vb3AtIFBhckVyci0gU3RlcHBpbmctIFNFUlIrIEZh
c3RCMkItIERpc0lOVHgtDQoJU3RhdHVzOiBDYXArIDY2TUh6LSBVREYtIEZhc3RCMkIrIFBhckVy
ci0gREVWU0VMPW1lZGl1bSA+VEFib3J0LSA8VEFib3J0LSA8TUFib3J0LSA+U0VSUi0gPFBFUlIt
IElOVHgtDQoJTGF0ZW5jeTogMA0KCUludGVycnVwdDogcGluIEMgcm91dGVkIHRvIElSUSAxOA0K
CVJlZ2lvbiAwOiBNZW1vcnkgYXQgZjVkZmYwMDAgKDMyLWJpdCwgbm9uLXByZWZldGNoYWJsZSkg
W3NpemU9MUtdDQoJQ2FwYWJpbGl0aWVzOiBbNTBdIFBvd2VyIE1hbmFnZW1lbnQgdmVyc2lvbiAy
DQoJCUZsYWdzOiBQTUVDbGstIERTSS0gRDEtIEQyLSBBdXhDdXJyZW50PTM3NW1BIFBNRShEMCss
RDEtLEQyLSxEM2hvdCssRDNjb2xkKykNCgkJU3RhdHVzOiBEMCBOb1NvZnRSc3QtIFBNRS1FbmFi
bGUtIERTZWw9MCBEU2NhbGU9MCBQTUUtDQoJQ2FwYWJpbGl0aWVzOiBbNThdIERlYnVnIHBvcnQ6
IEJBUj0xIG9mZnNldD0wMGEwDQoJQ2FwYWJpbGl0aWVzOiBbOThdIFBDSSBBZHZhbmNlZCBGZWF0
dXJlcw0KCQlBRkNhcDogVFArIEZMUisNCgkJQUZDdHJsOiBGTFItDQoJCUFGU3RhdHVzOiBUUC0N
CglLZXJuZWwgZHJpdmVyIGluIHVzZTogZWhjaV9oY2QNCg0KMDA6MWIuMCBBdWRpbyBkZXZpY2Ug
WzA0MDNdOiBJbnRlbCBDb3Jwb3JhdGlvbiA4MjgwMUpJIChJQ0gxMCBGYW1pbHkpIEhEIEF1ZGlv
IENvbnRyb2xsZXIgWzgwODY6M2EzZV0NCglTdWJzeXN0ZW06IEFTVVNUZUsgQ29tcHV0ZXIgSW5j
LiBEZXZpY2UgWzEwNDM6ODQzNl0NCglDb250cm9sOiBJL08tIE1lbSsgQnVzTWFzdGVyKyBTcGVj
Q3ljbGUtIE1lbVdJTlYtIFZHQVNub29wLSBQYXJFcnItIFN0ZXBwaW5nLSBTRVJSKyBGYXN0QjJC
LSBEaXNJTlR4Kw0KCVN0YXR1czogQ2FwKyA2Nk1Iei0gVURGLSBGYXN0QjJCLSBQYXJFcnItIERF
VlNFTD1mYXN0ID5UQWJvcnQtIDxUQWJvcnQtIDxNQWJvcnQtID5TRVJSLSA8UEVSUi0gSU5UeC0N
CglMYXRlbmN5OiAwLCBDYWNoZSBMaW5lIFNpemU6IDI1NiBieXRlcw0KCUludGVycnVwdDogcGlu
IEEgcm91dGVkIHRvIElSUSAzNDkNCglSZWdpb24gMDogTWVtb3J5IGF0IGY1ZGY4MDAwICg2NC1i
aXQsIG5vbi1wcmVmZXRjaGFibGUpIFtzaXplPTE2S10NCglDYXBhYmlsaXRpZXM6IFs1MF0gUG93
ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDINCgkJRmxhZ3M6IFBNRUNsay0gRFNJLSBEMS0gRDItIEF1
eEN1cnJlbnQ9NTVtQSBQTUUoRDArLEQxLSxEMi0sRDNob3QrLEQzY29sZCspDQoJCVN0YXR1czog
RDAgTm9Tb2Z0UnN0LSBQTUUtRW5hYmxlLSBEU2VsPTAgRFNjYWxlPTAgUE1FLQ0KCUNhcGFiaWxp
dGllczogWzYwXSBNU0k6IEVuYWJsZSsgQ291bnQ9MS8xIE1hc2thYmxlLSA2NGJpdCsNCgkJQWRk
cmVzczogMDAwMDAwMDBmZWUyMDAwYyAgRGF0YTogNDFhMQ0KCUNhcGFiaWxpdGllczogWzcwXSBF
eHByZXNzICh2MSkgUm9vdCBDb21wbGV4IEludGVncmF0ZWQgRW5kcG9pbnQsIE1TSSAwMA0KCQlE
ZXZDYXA6CU1heFBheWxvYWQgMTI4IGJ5dGVzLCBQaGFudEZ1bmMgMCwgTGF0ZW5jeSBMMHMgPDY0
bnMsIEwxIDwxdXMNCgkJCUV4dFRhZy0gUkJFLSBGTFJlc2V0Kw0KCQlEZXZDdGw6CVJlcG9ydCBl
cnJvcnM6IENvcnJlY3RhYmxlLSBOb24tRmF0YWwtIEZhdGFsLSBVbnN1cHBvcnRlZC0NCgkJCVJs
eGRPcmQtIEV4dFRhZy0gUGhhbnRGdW5jLSBBdXhQd3ItIE5vU25vb3ArDQoJCQlNYXhQYXlsb2Fk
IDEyOCBieXRlcywgTWF4UmVhZFJlcSAxMjggYnl0ZXMNCgkJRGV2U3RhOglDb3JyRXJyLSBVbmNv
cnJFcnItIEZhdGFsRXJyLSBVbnN1cHBSZXEtIEF1eFB3cisgVHJhbnNQZW5kLQ0KCQlMbmtDYXA6
CVBvcnQgIzAsIFNwZWVkIHVua25vd24sIFdpZHRoIHgwLCBBU1BNIHVua25vd24sIExhdGVuY3kg
TDAgPDY0bnMsIEwxIDwxdXMNCgkJCUNsb2NrUE0tIFN1cnByaXNlLSBMTEFjdFJlcC0gQndOb3Qt
DQoJCUxua0N0bDoJQVNQTSBEaXNhYmxlZDsgRGlzYWJsZWQtIFJldHJhaW4tIENvbW1DbGstDQoJ
CQlFeHRTeW5jaC0gQ2xvY2tQTS0gQXV0V2lkRGlzLSBCV0ludC0gQXV0QldJbnQtDQoJCUxua1N0
YToJU3BlZWQgdW5rbm93biwgV2lkdGggeDAsIFRyRXJyLSBUcmFpbi0gU2xvdENsay0gRExBY3Rp
dmUtIEJXTWdtdC0gQUJXTWdtdC0NCglDYXBhYmlsaXRpZXM6IFsxMDAgdjFdIFZpcnR1YWwgQ2hh
bm5lbA0KCQlDYXBzOglMUEVWQz0wIFJlZkNsaz0xMDBucyBQQVRFbnRyeUJpdHM9MQ0KCQlBcmI6
CUZpeGVkLSBXUlIzMi0gV1JSNjQtIFdSUjEyOC0NCgkJQ3RybDoJQXJiU2VsZWN0PUZpeGVkDQoJ
CVN0YXR1czoJSW5Qcm9ncmVzcy0NCgkJVkMwOglDYXBzOglQQVRPZmZzZXQ9MDAgTWF4VGltZVNs
b3RzPTEgUmVqU25vb3BUcmFucy0NCgkJCUFyYjoJRml4ZWQtIFdSUjMyLSBXUlI2NC0gV1JSMTI4
LSBUV1JSMTI4LSBXUlIyNTYtDQoJCQlDdHJsOglFbmFibGUrIElEPTAgQXJiU2VsZWN0PUZpeGVk
IFRDL1ZDPTAxDQoJCQlTdGF0dXM6CU5lZ29QZW5kaW5nLSBJblByb2dyZXNzLQ0KCQlWQzE6CUNh
cHM6CVBBVE9mZnNldD0wMCBNYXhUaW1lU2xvdHM9MSBSZWpTbm9vcFRyYW5zLQ0KCQkJQXJiOglG
aXhlZC0gV1JSMzItIFdSUjY0LSBXUlIxMjgtIFRXUlIxMjgtIFdSUjI1Ni0NCgkJCUN0cmw6CUVu
YWJsZSsgSUQ9MSBBcmJTZWxlY3Q9Rml4ZWQgVEMvVkM9ODANCgkJCVN0YXR1czoJTmVnb1BlbmRp
bmctIEluUHJvZ3Jlc3MtDQoJQ2FwYWJpbGl0aWVzOiBbMTMwIHYxXSBSb290IENvbXBsZXggTGlu
aw0KCQlEZXNjOglQb3J0TnVtYmVyPTBmIENvbXBvbmVudElEPTAwIEVsdFR5cGU9Q29uZmlnDQoJ
CUxpbmswOglEZXNjOglUYXJnZXRQb3J0PTAwIFRhcmdldENvbXBvbmVudD0wMCBBc3NvY1JDUkIt
IExpbmtUeXBlPU1lbU1hcHBlZCBMaW5rVmFsaWQrDQoJCQlBZGRyOgkwMDAwMDAwMGZlZDFjMDAw
DQoJS2VybmVsIGRyaXZlciBpbiB1c2U6IHNuZF9oZGFfaW50ZWwNCg0KMDA6MWMuMCBQQ0kgYnJp
ZGdlIFswNjA0XTogSW50ZWwgQ29ycG9yYXRpb24gODI4MDFKSSAoSUNIMTAgRmFtaWx5KSBQQ0kg
RXhwcmVzcyBSb290IFBvcnQgMSBbODA4NjozYTQwXSAocHJvZy1pZiAwMCBbTm9ybWFsIGRlY29k
ZV0pDQoJQ29udHJvbDogSS9PKyBNZW0rIEJ1c01hc3RlcisgU3BlY0N5Y2xlLSBNZW1XSU5WLSBW
R0FTbm9vcC0gUGFyRXJyLSBTdGVwcGluZy0gU0VSUisgRmFzdEIyQi0gRGlzSU5UeCsNCglTdGF0
dXM6IENhcCsgNjZNSHotIFVERi0gRmFzdEIyQi0gUGFyRXJyLSBERVZTRUw9ZmFzdCA+VEFib3J0
LSA8VEFib3J0LSA8TUFib3J0LSA+U0VSUi0gPFBFUlItIElOVHgtDQoJTGF0ZW5jeTogMCwgQ2Fj
aGUgTGluZSBTaXplOiAyNTYgYnl0ZXMNCglCdXM6IHByaW1hcnk9MDAsIHNlY29uZGFyeT0wNiwg
c3Vib3JkaW5hdGU9MDYsIHNlYy1sYXRlbmN5PTANCglJL08gYmVoaW5kIGJyaWRnZTogMDAwMDIw
MDAtMDAwMDJmZmYNCglNZW1vcnkgYmVoaW5kIGJyaWRnZTogYzAzMDAwMDAtYzA2ZmZmZmYNCglQ
cmVmZXRjaGFibGUgbWVtb3J5IGJlaGluZCBicmlkZ2U6IDAwMDAwMDAwZjRmMDAwMDAtMDAwMDAw
MDBmNGZmZmZmZg0KCVNlY29uZGFyeSBzdGF0dXM6IDY2TUh6LSBGYXN0QjJCLSBQYXJFcnItIERF
VlNFTD1mYXN0ID5UQWJvcnQtIDxUQWJvcnQtIDxNQWJvcnQtIDxTRVJSLSA8UEVSUi0NCglCcmlk
Z2VDdGw6IFBhcml0eS0gU0VSUisgTm9JU0EtIFZHQS0gTUFib3J0LSA+UmVzZXQtIEZhc3RCMkIt
DQoJCVByaURpc2NUbXItIFNlY0Rpc2NUbXItIERpc2NUbXJTdGF0LSBEaXNjVG1yU0VSUkVuLQ0K
CUNhcGFiaWxpdGllczogWzQwXSBFeHByZXNzICh2MSkgUm9vdCBQb3J0IChTbG90KyksIE1TSSAw
MA0KCQlEZXZDYXA6CU1heFBheWxvYWQgMTI4IGJ5dGVzLCBQaGFudEZ1bmMgMCwgTGF0ZW5jeSBM
MHMgPDY0bnMsIEwxIDwxdXMNCgkJCUV4dFRhZy0gUkJFKyBGTFJlc2V0LQ0KCQlEZXZDdGw6CVJl
cG9ydCBlcnJvcnM6IENvcnJlY3RhYmxlLSBOb24tRmF0YWwtIEZhdGFsLSBVbnN1cHBvcnRlZC0N
CgkJCVJseGRPcmQtIEV4dFRhZy0gUGhhbnRGdW5jLSBBdXhQd3ItIE5vU25vb3AtDQoJCQlNYXhQ
YXlsb2FkIDEyOCBieXRlcywgTWF4UmVhZFJlcSAxMjggYnl0ZXMNCgkJRGV2U3RhOglDb3JyRXJy
LSBVbmNvcnJFcnItIEZhdGFsRXJyLSBVbnN1cHBSZXEtIEF1eFB3cisgVHJhbnNQZW5kLQ0KCQlM
bmtDYXA6CVBvcnQgIzEsIFNwZWVkIDIuNUdUL3MsIFdpZHRoIHg0LCBBU1BNIEwwcyBMMSwgTGF0
ZW5jeSBMMCA8MjU2bnMsIEwxIDw0dXMNCgkJCUNsb2NrUE0tIFN1cnByaXNlLSBMTEFjdFJlcCsg
QndOb3QtDQoJCUxua0N0bDoJQVNQTSBEaXNhYmxlZDsgUkNCIDY0IGJ5dGVzIERpc2FibGVkLSBS
ZXRyYWluLSBDb21tQ2xrKw0KCQkJRXh0U3luY2gtIENsb2NrUE0tIEF1dFdpZERpcy0gQldJbnQt
IEF1dEJXSW50LQ0KCQlMbmtTdGE6CVNwZWVkIDIuNUdUL3MsIFdpZHRoIHgwLCBUckVyci0gVHJh
aW4tIFNsb3RDbGsrIERMQWN0aXZlLSBCV01nbXQtIEFCV01nbXQtDQoJCVNsdENhcDoJQXR0bkJ0
bi0gUHdyQ3RybC0gTVJMLSBBdHRuSW5kLSBQd3JJbmQtIEhvdFBsdWcrIFN1cnByaXNlKw0KCQkJ
U2xvdCAjMCwgUG93ZXJMaW1pdCAxMC4wMDBXOyBJbnRlcmxvY2stIE5vQ29tcGwtDQoJCVNsdEN0
bDoJRW5hYmxlOiBBdHRuQnRuLSBQd3JGbHQtIE1STC0gUHJlc0RldC0gQ21kQ3BsdC0gSFBJcnEt
IExpbmtDaGctDQoJCQlDb250cm9sOiBBdHRuSW5kIFVua25vd24sIFB3ckluZCBVbmtub3duLCBQ
b3dlci0gSW50ZXJsb2NrLQ0KCQlTbHRTdGE6CVN0YXR1czogQXR0bkJ0bi0gUG93ZXJGbHQtIE1S
TC0gQ21kQ3BsdC0gUHJlc0RldC0gSW50ZXJsb2NrLQ0KCQkJQ2hhbmdlZDogTVJMLSBQcmVzRGV0
LSBMaW5rU3RhdGUtDQoJCVJvb3RDdGw6IEVyckNvcnJlY3RhYmxlLSBFcnJOb24tRmF0YWwtIEVy
ckZhdGFsLSBQTUVJbnRFbmEtIENSU1Zpc2libGUtDQoJCVJvb3RDYXA6IENSU1Zpc2libGUtDQoJ
CVJvb3RTdGE6IFBNRSBSZXFJRCAwMDAwLCBQTUVTdGF0dXMtIFBNRVBlbmRpbmctDQoJQ2FwYWJp
bGl0aWVzOiBbODBdIE1TSTogRW5hYmxlKyBDb3VudD0xLzEgTWFza2FibGUtIDY0Yml0LQ0KCQlB
ZGRyZXNzOiBmZWVmZjAwYyAgRGF0YTogNDFhOA0KCUNhcGFiaWxpdGllczogWzkwXSBTdWJzeXN0
ZW06IEFTVVNUZUsgQ29tcHV0ZXIgSW5jLiBEZXZpY2UgWzEwNDM6ODQzNl0NCglDYXBhYmlsaXRp
ZXM6IFthMF0gUG93ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDINCgkJRmxhZ3M6IFBNRUNsay0gRFNJ
LSBEMS0gRDItIEF1eEN1cnJlbnQ9MG1BIFBNRShEMCssRDEtLEQyLSxEM2hvdCssRDNjb2xkKykN
CgkJU3RhdHVzOiBEMCBOb1NvZnRSc3QtIFBNRS1FbmFibGUtIERTZWw9MCBEU2NhbGU9MCBQTUUt
DQoJQ2FwYWJpbGl0aWVzOiBbMTAwIHYxXSBWaXJ0dWFsIENoYW5uZWwNCgkJQ2FwczoJTFBFVkM9
MCBSZWZDbGs9MTAwbnMgUEFURW50cnlCaXRzPTENCgkJQXJiOglGaXhlZCsgV1JSMzItIFdSUjY0
LSBXUlIxMjgtDQoJCUN0cmw6CUFyYlNlbGVjdD1GaXhlZA0KCQlTdGF0dXM6CUluUHJvZ3Jlc3Mt
DQoJCVZDMDoJQ2FwczoJUEFUT2Zmc2V0PTAwIE1heFRpbWVTbG90cz0xIFJlalNub29wVHJhbnMt
DQoJCQlBcmI6CUZpeGVkKyBXUlIzMi0gV1JSNjQtIFdSUjEyOC0gVFdSUjEyOC0gV1JSMjU2LQ0K
CQkJQ3RybDoJRW5hYmxlKyBJRD0wIEFyYlNlbGVjdD1GaXhlZCBUQy9WQz0wMQ0KCQkJU3RhdHVz
OglOZWdvUGVuZGluZy0gSW5Qcm9ncmVzcy0NCglDYXBhYmlsaXRpZXM6IFsxODAgdjFdIFJvb3Qg
Q29tcGxleCBMaW5rDQoJCURlc2M6CVBvcnROdW1iZXI9MDEgQ29tcG9uZW50SUQ9MDAgRWx0VHlw
ZT1Db25maWcNCgkJTGluazA6CURlc2M6CVRhcmdldFBvcnQ9MDAgVGFyZ2V0Q29tcG9uZW50PTAw
IEFzc29jUkNSQi0gTGlua1R5cGU9TWVtTWFwcGVkIExpbmtWYWxpZCsNCgkJCUFkZHI6CTAwMDAw
MDAwZmVkMWMwMDANCglLZXJuZWwgZHJpdmVyIGluIHVzZTogcGNpZXBvcnQNCg0KMDA6MWMuNCBQ
Q0kgYnJpZGdlIFswNjA0XTogSW50ZWwgQ29ycG9yYXRpb24gODI4MDFKSSAoSUNIMTAgRmFtaWx5
KSBQQ0kgRXhwcmVzcyBSb290IFBvcnQgNSBbODA4NjozYTQ4XSAocHJvZy1pZiAwMCBbTm9ybWFs
IGRlY29kZV0pDQoJQ29udHJvbDogSS9PKyBNZW0rIEJ1c01hc3RlcisgU3BlY0N5Y2xlLSBNZW1X
SU5WLSBWR0FTbm9vcC0gUGFyRXJyLSBTdGVwcGluZy0gU0VSUisgRmFzdEIyQi0gRGlzSU5UeCsN
CglTdGF0dXM6IENhcCsgNjZNSHotIFVERi0gRmFzdEIyQi0gUGFyRXJyLSBERVZTRUw9ZmFzdCA+
VEFib3J0LSA8VEFib3J0LSA8TUFib3J0LSA+U0VSUi0gPFBFUlItIElOVHgtDQoJTGF0ZW5jeTog
MCwgQ2FjaGUgTGluZSBTaXplOiAyNTYgYnl0ZXMNCglCdXM6IHByaW1hcnk9MDAsIHNlY29uZGFy
eT0wNSwgc3Vib3JkaW5hdGU9MDUsIHNlYy1sYXRlbmN5PTANCglJL08gYmVoaW5kIGJyaWRnZTog
MDAwMGQwMDAtMDAwMGRmZmYNCglNZW1vcnkgYmVoaW5kIGJyaWRnZTogZmJkMDAwMDAtZmJkZmZm
ZmYNCglQcmVmZXRjaGFibGUgbWVtb3J5IGJlaGluZCBicmlkZ2U6IDAwMDAwMDAwYzAwMDAwMDAt
MDAwMDAwMDBjMDJmZmZmZg0KCVNlY29uZGFyeSBzdGF0dXM6IDY2TUh6LSBGYXN0QjJCLSBQYXJF
cnItIERFVlNFTD1mYXN0ID5UQWJvcnQtIDxUQWJvcnQtIDxNQWJvcnQtIDxTRVJSLSA8UEVSUi0N
CglCcmlkZ2VDdGw6IFBhcml0eS0gU0VSUisgTm9JU0EtIFZHQS0gTUFib3J0LSA+UmVzZXQtIEZh
c3RCMkItDQoJCVByaURpc2NUbXItIFNlY0Rpc2NUbXItIERpc2NUbXJTdGF0LSBEaXNjVG1yU0VS
UkVuLQ0KCUNhcGFiaWxpdGllczogWzQwXSBFeHByZXNzICh2MSkgUm9vdCBQb3J0IChTbG90Kyks
IE1TSSAwMA0KCQlEZXZDYXA6CU1heFBheWxvYWQgMTI4IGJ5dGVzLCBQaGFudEZ1bmMgMCwgTGF0
ZW5jeSBMMHMgPDY0bnMsIEwxIDwxdXMNCgkJCUV4dFRhZy0gUkJFKyBGTFJlc2V0LQ0KCQlEZXZD
dGw6CVJlcG9ydCBlcnJvcnM6IENvcnJlY3RhYmxlLSBOb24tRmF0YWwtIEZhdGFsLSBVbnN1cHBv
cnRlZC0NCgkJCVJseGRPcmQtIEV4dFRhZy0gUGhhbnRGdW5jLSBBdXhQd3ItIE5vU25vb3AtDQoJ
CQlNYXhQYXlsb2FkIDEyOCBieXRlcywgTWF4UmVhZFJlcSAxMjggYnl0ZXMNCgkJRGV2U3RhOglD
b3JyRXJyLSBVbmNvcnJFcnItIEZhdGFsRXJyLSBVbnN1cHBSZXEtIEF1eFB3cisgVHJhbnNQZW5k
LQ0KCQlMbmtDYXA6CVBvcnQgIzUsIFNwZWVkIDIuNUdUL3MsIFdpZHRoIHgxLCBBU1BNIEwwcyBM
MSwgTGF0ZW5jeSBMMCA8MjU2bnMsIEwxIDw0dXMNCgkJCUNsb2NrUE0tIFN1cnByaXNlLSBMTEFj
dFJlcCsgQndOb3QtDQoJCUxua0N0bDoJQVNQTSBEaXNhYmxlZDsgUkNCIDY0IGJ5dGVzIERpc2Fi
bGVkLSBSZXRyYWluLSBDb21tQ2xrKw0KCQkJRXh0U3luY2gtIENsb2NrUE0tIEF1dFdpZERpcy0g
QldJbnQtIEF1dEJXSW50LQ0KCQlMbmtTdGE6CVNwZWVkIDIuNUdUL3MsIFdpZHRoIHgxLCBUckVy
ci0gVHJhaW4tIFNsb3RDbGsrIERMQWN0aXZlKyBCV01nbXQtIEFCV01nbXQtDQoJCVNsdENhcDoJ
QXR0bkJ0bi0gUHdyQ3RybC0gTVJMLSBBdHRuSW5kLSBQd3JJbmQtIEhvdFBsdWcrIFN1cnByaXNl
Kw0KCQkJU2xvdCAjMCwgUG93ZXJMaW1pdCAxMC4wMDBXOyBJbnRlcmxvY2stIE5vQ29tcGwtDQoJ
CVNsdEN0bDoJRW5hYmxlOiBBdHRuQnRuLSBQd3JGbHQtIE1STC0gUHJlc0RldC0gQ21kQ3BsdC0g
SFBJcnEtIExpbmtDaGctDQoJCQlDb250cm9sOiBBdHRuSW5kIFVua25vd24sIFB3ckluZCBVbmtu
b3duLCBQb3dlci0gSW50ZXJsb2NrLQ0KCQlTbHRTdGE6CVN0YXR1czogQXR0bkJ0bi0gUG93ZXJG
bHQtIE1STC0gQ21kQ3BsdC0gUHJlc0RldCsgSW50ZXJsb2NrLQ0KCQkJQ2hhbmdlZDogTVJMLSBQ
cmVzRGV0KyBMaW5rU3RhdGUrDQoJCVJvb3RDdGw6IEVyckNvcnJlY3RhYmxlLSBFcnJOb24tRmF0
YWwtIEVyckZhdGFsLSBQTUVJbnRFbmEtIENSU1Zpc2libGUtDQoJCVJvb3RDYXA6IENSU1Zpc2li
bGUtDQoJCVJvb3RTdGE6IFBNRSBSZXFJRCAwMDAwLCBQTUVTdGF0dXMtIFBNRVBlbmRpbmctDQoJ
Q2FwYWJpbGl0aWVzOiBbODBdIE1TSTogRW5hYmxlKyBDb3VudD0xLzEgTWFza2FibGUtIDY0Yml0
LQ0KCQlBZGRyZXNzOiBmZWVmZjAwYyAgRGF0YTogNDFiMA0KCUNhcGFiaWxpdGllczogWzkwXSBT
dWJzeXN0ZW06IEFTVVNUZUsgQ29tcHV0ZXIgSW5jLiBEZXZpY2UgWzEwNDM6ODQzNl0NCglDYXBh
YmlsaXRpZXM6IFthMF0gUG93ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDINCgkJRmxhZ3M6IFBNRUNs
ay0gRFNJLSBEMS0gRDItIEF1eEN1cnJlbnQ9MG1BIFBNRShEMCssRDEtLEQyLSxEM2hvdCssRDNj
b2xkKykNCgkJU3RhdHVzOiBEMCBOb1NvZnRSc3QtIFBNRS1FbmFibGUtIERTZWw9MCBEU2NhbGU9
MCBQTUUtDQoJQ2FwYWJpbGl0aWVzOiBbMTAwIHYxXSBWaXJ0dWFsIENoYW5uZWwNCgkJQ2FwczoJ
TFBFVkM9MCBSZWZDbGs9MTAwbnMgUEFURW50cnlCaXRzPTENCgkJQXJiOglGaXhlZCsgV1JSMzIt
IFdSUjY0LSBXUlIxMjgtDQoJCUN0cmw6CUFyYlNlbGVjdD1GaXhlZA0KCQlTdGF0dXM6CUluUHJv
Z3Jlc3MtDQoJCVZDMDoJQ2FwczoJUEFUT2Zmc2V0PTAwIE1heFRpbWVTbG90cz0xIFJlalNub29w
VHJhbnMtDQoJCQlBcmI6CUZpeGVkKyBXUlIzMi0gV1JSNjQtIFdSUjEyOC0gVFdSUjEyOC0gV1JS
MjU2LQ0KCQkJQ3RybDoJRW5hYmxlKyBJRD0wIEFyYlNlbGVjdD1GaXhlZCBUQy9WQz0wMQ0KCQkJ
U3RhdHVzOglOZWdvUGVuZGluZy0gSW5Qcm9ncmVzcy0NCglDYXBhYmlsaXRpZXM6IFsxODAgdjFd
IFJvb3QgQ29tcGxleCBMaW5rDQoJCURlc2M6CVBvcnROdW1iZXI9MDUgQ29tcG9uZW50SUQ9MDAg
RWx0VHlwZT1Db25maWcNCgkJTGluazA6CURlc2M6CVRhcmdldFBvcnQ9MDAgVGFyZ2V0Q29tcG9u
ZW50PTAwIEFzc29jUkNSQi0gTGlua1R5cGU9TWVtTWFwcGVkIExpbmtWYWxpZCsNCgkJCUFkZHI6
CTAwMDAwMDAwZmVkMWMwMDANCglLZXJuZWwgZHJpdmVyIGluIHVzZTogcGNpZXBvcnQNCg0KMDA6
MWQuMCBVU0IgY29udHJvbGxlciBbMGMwM106IEludGVsIENvcnBvcmF0aW9uIDgyODAxSkkgKElD
SDEwIEZhbWlseSkgVVNCIFVIQ0kgQ29udHJvbGxlciAjMSBbODA4NjozYTM0XSAocHJvZy1pZiAw
MCBbVUhDSV0pDQoJU3Vic3lzdGVtOiBBU1VTVGVLIENvbXB1dGVyIEluYy4gRGV2aWNlIFsxMDQz
OjgyZDRdDQoJQ29udHJvbDogSS9PKyBNZW0tIEJ1c01hc3RlcisgU3BlY0N5Y2xlLSBNZW1XSU5W
LSBWR0FTbm9vcC0gUGFyRXJyLSBTdGVwcGluZy0gU0VSUi0gRmFzdEIyQi0gRGlzSU5UeC0NCglT
dGF0dXM6IENhcCsgNjZNSHotIFVERi0gRmFzdEIyQisgUGFyRXJyLSBERVZTRUw9bWVkaXVtID5U
QWJvcnQtIDxUQWJvcnQtIDxNQWJvcnQtID5TRVJSLSA8UEVSUi0gSU5UeC0NCglMYXRlbmN5OiAw
DQoJSW50ZXJydXB0OiBwaW4gQSByb3V0ZWQgdG8gSVJRIDIzDQoJUmVnaW9uIDQ6IEkvTyBwb3J0
cyBhdCA5MDgwIFtzaXplPTMyXQ0KCUNhcGFiaWxpdGllczogWzUwXSBQQ0kgQWR2YW5jZWQgRmVh
dHVyZXMNCgkJQUZDYXA6IFRQKyBGTFIrDQoJCUFGQ3RybDogRkxSLQ0KCQlBRlN0YXR1czogVFAt
DQoJS2VybmVsIGRyaXZlciBpbiB1c2U6IHVoY2lfaGNkDQoNCjAwOjFkLjEgVVNCIGNvbnRyb2xs
ZXIgWzBjMDNdOiBJbnRlbCBDb3Jwb3JhdGlvbiA4MjgwMUpJIChJQ0gxMCBGYW1pbHkpIFVTQiBV
SENJIENvbnRyb2xsZXIgIzIgWzgwODY6M2EzNV0gKHByb2ctaWYgMDAgW1VIQ0ldKQ0KCVN1YnN5
c3RlbTogQVNVU1RlSyBDb21wdXRlciBJbmMuIERldmljZSBbMTA0Mzo4MmQ0XQ0KCUNvbnRyb2w6
IEkvTysgTWVtLSBCdXNNYXN0ZXIrIFNwZWNDeWNsZS0gTWVtV0lOVi0gVkdBU25vb3AtIFBhckVy
ci0gU3RlcHBpbmctIFNFUlItIEZhc3RCMkItIERpc0lOVHgtDQoJU3RhdHVzOiBDYXArIDY2TUh6
LSBVREYtIEZhc3RCMkIrIFBhckVyci0gREVWU0VMPW1lZGl1bSA+VEFib3J0LSA8VEFib3J0LSA8
TUFib3J0LSA+U0VSUi0gPFBFUlItIElOVHgtDQoJTGF0ZW5jeTogMA0KCUludGVycnVwdDogcGlu
IEIgcm91dGVkIHRvIElSUSAxOQ0KCVJlZ2lvbiA0OiBJL08gcG9ydHMgYXQgOTQwMCBbc2l6ZT0z
Ml0NCglDYXBhYmlsaXRpZXM6IFs1MF0gUENJIEFkdmFuY2VkIEZlYXR1cmVzDQoJCUFGQ2FwOiBU
UCsgRkxSKw0KCQlBRkN0cmw6IEZMUi0NCgkJQUZTdGF0dXM6IFRQLQ0KCUtlcm5lbCBkcml2ZXIg
aW4gdXNlOiB1aGNpX2hjZA0KDQowMDoxZC4yIFVTQiBjb250cm9sbGVyIFswYzAzXTogSW50ZWwg
Q29ycG9yYXRpb24gODI4MDFKSSAoSUNIMTAgRmFtaWx5KSBVU0IgVUhDSSBDb250cm9sbGVyICMz
IFs4MDg2OjNhMzZdIChwcm9nLWlmIDAwIFtVSENJXSkNCglTdWJzeXN0ZW06IEFTVVNUZUsgQ29t
cHV0ZXIgSW5jLiBEZXZpY2UgWzEwNDM6ODJkNF0NCglDb250cm9sOiBJL08rIE1lbS0gQnVzTWFz
dGVyKyBTcGVjQ3ljbGUtIE1lbVdJTlYtIFZHQVNub29wLSBQYXJFcnItIFN0ZXBwaW5nLSBTRVJS
LSBGYXN0QjJCLSBEaXNJTlR4LQ0KCVN0YXR1czogQ2FwKyA2Nk1Iei0gVURGLSBGYXN0QjJCKyBQ
YXJFcnItIERFVlNFTD1tZWRpdW0gPlRBYm9ydC0gPFRBYm9ydC0gPE1BYm9ydC0gPlNFUlItIDxQ
RVJSLSBJTlR4LQ0KCUxhdGVuY3k6IDANCglJbnRlcnJ1cHQ6IHBpbiBDIHJvdXRlZCB0byBJUlEg
MTgNCglSZWdpb24gNDogSS9PIHBvcnRzIGF0IDk0ODAgW3NpemU9MzJdDQoJQ2FwYWJpbGl0aWVz
OiBbNTBdIFBDSSBBZHZhbmNlZCBGZWF0dXJlcw0KCQlBRkNhcDogVFArIEZMUisNCgkJQUZDdHJs
OiBGTFItDQoJCUFGU3RhdHVzOiBUUC0NCglLZXJuZWwgZHJpdmVyIGluIHVzZTogdWhjaV9oY2QN
Cg0KMDA6MWQuNyBVU0IgY29udHJvbGxlciBbMGMwM106IEludGVsIENvcnBvcmF0aW9uIDgyODAx
SkkgKElDSDEwIEZhbWlseSkgVVNCMiBFSENJIENvbnRyb2xsZXIgIzEgWzgwODY6M2EzYV0gKHBy
b2ctaWYgMjAgW0VIQ0ldKQ0KCVN1YnN5c3RlbTogQVNVU1RlSyBDb21wdXRlciBJbmMuIERldmlj
ZSBbMTA0Mzo4MmQ0XQ0KCUNvbnRyb2w6IEkvTy0gTWVtKyBCdXNNYXN0ZXIrIFNwZWNDeWNsZS0g
TWVtV0lOVi0gVkdBU25vb3AtIFBhckVyci0gU3RlcHBpbmctIFNFUlIrIEZhc3RCMkItIERpc0lO
VHgtDQoJU3RhdHVzOiBDYXArIDY2TUh6LSBVREYtIEZhc3RCMkIrIFBhckVyci0gREVWU0VMPW1l
ZGl1bSA+VEFib3J0LSA8VEFib3J0LSA8TUFib3J0LSA+U0VSUi0gPFBFUlItIElOVHgtDQoJTGF0
ZW5jeTogMA0KCUludGVycnVwdDogcGluIEEgcm91dGVkIHRvIElSUSAyMw0KCVJlZ2lvbiAwOiBN
ZW1vcnkgYXQgZjVkZmUwMDAgKDMyLWJpdCwgbm9uLXByZWZldGNoYWJsZSkgW3NpemU9MUtdDQoJ
Q2FwYWJpbGl0aWVzOiBbNTBdIFBvd2VyIE1hbmFnZW1lbnQgdmVyc2lvbiAyDQoJCUZsYWdzOiBQ
TUVDbGstIERTSS0gRDEtIEQyLSBBdXhDdXJyZW50PTM3NW1BIFBNRShEMCssRDEtLEQyLSxEM2hv
dCssRDNjb2xkKykNCgkJU3RhdHVzOiBEMCBOb1NvZnRSc3QtIFBNRS1FbmFibGUtIERTZWw9MCBE
U2NhbGU9MCBQTUUtDQoJQ2FwYWJpbGl0aWVzOiBbNThdIERlYnVnIHBvcnQ6IEJBUj0xIG9mZnNl
dD0wMGEwDQoJQ2FwYWJpbGl0aWVzOiBbOThdIFBDSSBBZHZhbmNlZCBGZWF0dXJlcw0KCQlBRkNh
cDogVFArIEZMUisNCgkJQUZDdHJsOiBGTFItDQoJCUFGU3RhdHVzOiBUUC0NCglLZXJuZWwgZHJp
dmVyIGluIHVzZTogZWhjaV9oY2QNCg0KMDA6MWUuMCBQQ0kgYnJpZGdlIFswNjA0XTogSW50ZWwg
Q29ycG9yYXRpb24gODI4MDEgUENJIEJyaWRnZSBbODA4NjoyNDRlXSAocmV2IDkwKSAocHJvZy1p
ZiAwMSBbU3VidHJhY3RpdmUgZGVjb2RlXSkNCglDb250cm9sOiBJL08rIE1lbSsgQnVzTWFzdGVy
KyBTcGVjQ3ljbGUtIE1lbVdJTlYtIFZHQVNub29wLSBQYXJFcnItIFN0ZXBwaW5nLSBTRVJSKyBG
YXN0QjJCLSBEaXNJTlR4LQ0KCVN0YXR1czogQ2FwKyA2Nk1Iei0gVURGLSBGYXN0QjJCLSBQYXJF
cnItIERFVlNFTD1mYXN0ID5UQWJvcnQtIDxUQWJvcnQtIDxNQWJvcnQtID5TRVJSLSA8UEVSUi0g
SU5UeC0NCglMYXRlbmN5OiAwDQoJQnVzOiBwcmltYXJ5PTAwLCBzZWNvbmRhcnk9MDcsIHN1Ym9y
ZGluYXRlPTA3LCBzZWMtbGF0ZW5jeT0zMg0KCUkvTyBiZWhpbmQgYnJpZGdlOiAwMDAwZTAwMC0w
MDAwZWZmZg0KCU1lbW9yeSBiZWhpbmQgYnJpZGdlOiBmYmUwMDAwMC1mYmVmZmZmZg0KCVByZWZl
dGNoYWJsZSBtZW1vcnkgYmVoaW5kIGJyaWRnZTogMDAwMDAwMDBmZmYwMDAwMC0wMDAwMDAwMDAw
MGZmZmZmDQoJU2Vjb25kYXJ5IHN0YXR1czogNjZNSHotIEZhc3RCMkIrIFBhckVyci0gREVWU0VM
PW1lZGl1bSA+VEFib3J0LSA8VEFib3J0LSA8TUFib3J0KyA8U0VSUi0gPFBFUlItDQoJQnJpZGdl
Q3RsOiBQYXJpdHktIFNFUlIrIE5vSVNBLSBWR0EtIE1BYm9ydC0gPlJlc2V0LSBGYXN0QjJCLQ0K
CQlQcmlEaXNjVG1yLSBTZWNEaXNjVG1yLSBEaXNjVG1yU3RhdC0gRGlzY1RtclNFUlJFbi0NCglD
YXBhYmlsaXRpZXM6IFs1MF0gU3Vic3lzdGVtOiBBU1VTVGVLIENvbXB1dGVyIEluYy4gRGV2aWNl
IFsxMDQzOjgyZDRdDQoNCjAwOjFmLjAgSVNBIGJyaWRnZSBbMDYwMV06IEludGVsIENvcnBvcmF0
aW9uIDgyODAxSklSIChJQ0gxMFIpIExQQyBJbnRlcmZhY2UgQ29udHJvbGxlciBbODA4NjozYTE2
XQ0KCVN1YnN5c3RlbTogQVNVU1RlSyBDb21wdXRlciBJbmMuIERldmljZSBbMTA0Mzo4MmQ0XQ0K
CUNvbnRyb2w6IEkvTysgTWVtKyBCdXNNYXN0ZXIrIFNwZWNDeWNsZS0gTWVtV0lOVi0gVkdBU25v
b3AtIFBhckVyci0gU3RlcHBpbmctIFNFUlItIEZhc3RCMkItIERpc0lOVHgtDQoJU3RhdHVzOiBD
YXArIDY2TUh6LSBVREYtIEZhc3RCMkItIFBhckVyci0gREVWU0VMPW1lZGl1bSA+VEFib3J0LSA8
VEFib3J0LSA8TUFib3J0LSA+U0VSUi0gPFBFUlItIElOVHgtDQoJTGF0ZW5jeTogMA0KCUNhcGFi
aWxpdGllczogW2UwXSBWZW5kb3IgU3BlY2lmaWMgSW5mb3JtYXRpb246IExlbj0wYyA8Pz4NCg0K
MDA6MWYuMiBJREUgaW50ZXJmYWNlIFswMTAxXTogSW50ZWwgQ29ycG9yYXRpb24gODI4MDFKSSAo
SUNIMTAgRmFtaWx5KSA0IHBvcnQgU0FUQSBJREUgQ29udHJvbGxlciAjMSBbODA4NjozYTIwXSAo
cHJvZy1pZiA4ZiBbTWFzdGVyIFNlY1AgU2VjTyBQcmlQIFByaU9dKQ0KCVN1YnN5c3RlbTogQVNV
U1RlSyBDb21wdXRlciBJbmMuIERldmljZSBbMTA0Mzo4MmQ0XQ0KCUNvbnRyb2w6IEkvTysgTWVt
KyBCdXNNYXN0ZXIrIFNwZWNDeWNsZS0gTWVtV0lOVi0gVkdBU25vb3AtIFBhckVyci0gU3RlcHBp
bmctIFNFUlItIEZhc3RCMkItIERpc0lOVHgtDQoJU3RhdHVzOiBDYXArIDY2TUh6KyBVREYtIEZh
c3RCMkIrIFBhckVyci0gREVWU0VMPW1lZGl1bSA+VEFib3J0LSA8VEFib3J0LSA8TUFib3J0LSA+
U0VSUi0gPFBFUlItIElOVHgtDQoJTGF0ZW5jeTogMA0KCUludGVycnVwdDogcGluIEIgcm91dGVk
IHRvIElSUSAyMA0KCVJlZ2lvbiAwOiBJL08gcG9ydHMgYXQgODAwMCBbc2l6ZT04XQ0KCVJlZ2lv
biAxOiBJL08gcG9ydHMgYXQgN2MwMCBbc2l6ZT00XQ0KCVJlZ2lvbiAyOiBJL08gcG9ydHMgYXQg
Nzg4MCBbc2l6ZT04XQ0KCVJlZ2lvbiAzOiBJL08gcG9ydHMgYXQgNzgwMCBbc2l6ZT00XQ0KCVJl
Z2lvbiA0OiBJL08gcG9ydHMgYXQgNzQ4MCBbc2l6ZT0xNl0NCglSZWdpb24gNTogSS9PIHBvcnRz
IGF0IDc0MDAgW3NpemU9MTZdDQoJQ2FwYWJpbGl0aWVzOiBbNzBdIFBvd2VyIE1hbmFnZW1lbnQg
dmVyc2lvbiAzDQoJCUZsYWdzOiBQTUVDbGstIERTSS0gRDEtIEQyLSBBdXhDdXJyZW50PTBtQSBQ
TUUoRDAtLEQxLSxEMi0sRDNob3QtLEQzY29sZC0pDQoJCVN0YXR1czogRDAgTm9Tb2Z0UnN0KyBQ
TUUtRW5hYmxlLSBEU2VsPTAgRFNjYWxlPTAgUE1FLQ0KCUNhcGFiaWxpdGllczogW2IwXSBQQ0kg
QWR2YW5jZWQgRmVhdHVyZXMNCgkJQUZDYXA6IFRQKyBGTFIrDQoJCUFGQ3RybDogRkxSLQ0KCQlB
RlN0YXR1czogVFAtDQoJS2VybmVsIGRyaXZlciBpbiB1c2U6IGF0YV9waWl4DQoNCjAwOjFmLjMg
U01CdXMgWzBjMDVdOiBJbnRlbCBDb3Jwb3JhdGlvbiA4MjgwMUpJIChJQ0gxMCBGYW1pbHkpIFNN
QnVzIENvbnRyb2xsZXIgWzgwODY6M2EzMF0NCglTdWJzeXN0ZW06IEFTVVNUZUsgQ29tcHV0ZXIg
SW5jLiBEZXZpY2UgWzEwNDM6ODJkNF0NCglDb250cm9sOiBJL08rIE1lbSsgQnVzTWFzdGVyLSBT
cGVjQ3ljbGUtIE1lbVdJTlYtIFZHQVNub29wLSBQYXJFcnItIFN0ZXBwaW5nLSBTRVJSKyBGYXN0
QjJCLSBEaXNJTlR4LQ0KCVN0YXR1czogQ2FwLSA2Nk1Iei0gVURGLSBGYXN0QjJCKyBQYXJFcnIt
IERFVlNFTD1tZWRpdW0gPlRBYm9ydC0gPFRBYm9ydC0gPE1BYm9ydC0gPlNFUlItIDxQRVJSLSBJ
TlR4LQ0KCUludGVycnVwdDogcGluIEMgcm91dGVkIHRvIElSUSAxOA0KCVJlZ2lvbiAwOiBNZW1v
cnkgYXQgZjVkZmQwMDAgKDY0LWJpdCwgbm9uLXByZWZldGNoYWJsZSkgW3NpemU9MjU2XQ0KCVJl
Z2lvbiA0OiBJL08gcG9ydHMgYXQgMTAwMCBbc2l6ZT0zMl0NCg0KMDA6MWYuNSBJREUgaW50ZXJm
YWNlIFswMTAxXTogSW50ZWwgQ29ycG9yYXRpb24gODI4MDFKSSAoSUNIMTAgRmFtaWx5KSAyIHBv
cnQgU0FUQSBJREUgQ29udHJvbGxlciAjMiBbODA4NjozYTI2XSAocHJvZy1pZiA4NSBbTWFzdGVy
IFNlY08gUHJpT10pDQoJU3Vic3lzdGVtOiBBU1VTVGVLIENvbXB1dGVyIEluYy4gRGV2aWNlIFsx
MDQzOjgyZDRdDQoJQ29udHJvbDogSS9PKyBNZW0rIEJ1c01hc3RlcisgU3BlY0N5Y2xlLSBNZW1X
SU5WLSBWR0FTbm9vcC0gUGFyRXJyLSBTdGVwcGluZy0gU0VSUi0gRmFzdEIyQi0gRGlzSU5UeC0N
CglTdGF0dXM6IENhcCsgNjZNSHorIFVERi0gRmFzdEIyQisgUGFyRXJyLSBERVZTRUw9bWVkaXVt
ID5UQWJvcnQtIDxUQWJvcnQtIDxNQWJvcnQtID5TRVJSLSA8UEVSUi0gSU5UeC0NCglMYXRlbmN5
OiAwDQoJSW50ZXJydXB0OiBwaW4gQiByb3V0ZWQgdG8gSVJRIDIwDQoJUmVnaW9uIDA6IEkvTyBw
b3J0cyBhdCA5MDAwIFtzaXplPThdDQoJUmVnaW9uIDE6IEkvTyBwb3J0cyBhdCA4YzAwIFtzaXpl
PTRdDQoJUmVnaW9uIDI6IEkvTyBwb3J0cyBhdCA4ODgwIFtzaXplPThdDQoJUmVnaW9uIDM6IEkv
TyBwb3J0cyBhdCA4ODAwIFtzaXplPTRdDQoJUmVnaW9uIDQ6IEkvTyBwb3J0cyBhdCA4NDgwIFtz
aXplPTE2XQ0KCVJlZ2lvbiA1OiBJL08gcG9ydHMgYXQgODQwMCBbc2l6ZT0xNl0NCglDYXBhYmls
aXRpZXM6IFs3MF0gUG93ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDMNCgkJRmxhZ3M6IFBNRUNsay0g
RFNJLSBEMS0gRDItIEF1eEN1cnJlbnQ9MG1BIFBNRShEMC0sRDEtLEQyLSxEM2hvdC0sRDNjb2xk
LSkNCgkJU3RhdHVzOiBEMCBOb1NvZnRSc3QrIFBNRS1FbmFibGUtIERTZWw9MCBEU2NhbGU9MCBQ
TUUtDQoJQ2FwYWJpbGl0aWVzOiBbYjBdIFBDSSBBZHZhbmNlZCBGZWF0dXJlcw0KCQlBRkNhcDog
VFArIEZMUisNCgkJQUZDdHJsOiBGTFItDQoJCUFGU3RhdHVzOiBUUC0NCglLZXJuZWwgZHJpdmVy
IGluIHVzZTogYXRhX3BpaXgNCg0KMDE6MDAuMCBJREUgaW50ZXJmYWNlIFswMTAxXTogTWFydmVs
bCBUZWNobm9sb2d5IEdyb3VwIEx0ZC4gRGV2aWNlIFsxYjRiOjkxYTNdIChyZXYgMTEpIChwcm9n
LWlmIDhmIFtNYXN0ZXIgU2VjUCBTZWNPIFByaVAgUHJpT10pDQoJU3Vic3lzdGVtOiBBU1VTVGVL
IENvbXB1dGVyIEluYy4gRGV2aWNlIFsxMDQzOjg0MzhdDQoJQ29udHJvbDogSS9PKyBNZW0rIEJ1
c01hc3RlcisgU3BlY0N5Y2xlLSBNZW1XSU5WLSBWR0FTbm9vcC0gUGFyRXJyLSBTdGVwcGluZy0g
U0VSUisgRmFzdEIyQi0gRGlzSU5UeCsNCglTdGF0dXM6IENhcCsgNjZNSHotIFVERi0gRmFzdEIy
Qi0gUGFyRXJyLSBERVZTRUw9ZmFzdCA+VEFib3J0LSA8VEFib3J0LSA8TUFib3J0LSA+U0VSUi0g
PFBFUlItIElOVHgtDQoJTGF0ZW5jeTogMCwgQ2FjaGUgTGluZSBTaXplOiAyNTYgYnl0ZXMNCglJ
bnRlcnJ1cHQ6IHBpbiBBIHJvdXRlZCB0byBJUlEgMzQ4DQoJUmVnaW9uIDA6IEkvTyBwb3J0cyBh
dCBhYzAwIFtzaXplPThdDQoJUmVnaW9uIDE6IEkvTyBwb3J0cyBhdCBhODgwIFtzaXplPTRdDQoJ
UmVnaW9uIDI6IEkvTyBwb3J0cyBhdCBhODAwIFtzaXplPThdDQoJUmVnaW9uIDM6IEkvTyBwb3J0
cyBhdCBhNDgwIFtzaXplPTRdDQoJUmVnaW9uIDQ6IEkvTyBwb3J0cyBhdCBhNDAwIFtzaXplPTE2
XQ0KCVJlZ2lvbiA1OiBNZW1vcnkgYXQgZjVlZmY4MDAgKDMyLWJpdCwgbm9uLXByZWZldGNoYWJs
ZSkgW3NpemU9MktdDQoJRXhwYW5zaW9uIFJPTSBhdCBmNWVlMDAwMCBbZGlzYWJsZWRdIFtzaXpl
PTY0S10NCglDYXBhYmlsaXRpZXM6IFs0MF0gUG93ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDMNCgkJ
RmxhZ3M6IFBNRUNsay0gRFNJLSBEMS0gRDItIEF1eEN1cnJlbnQ9MG1BIFBNRShEMC0sRDEtLEQy
LSxEM2hvdCssRDNjb2xkLSkNCgkJU3RhdHVzOiBEMCBOb1NvZnRSc3QtIFBNRS1FbmFibGUtIERT
ZWw9MCBEU2NhbGU9MCBQTUUtDQoJQ2FwYWJpbGl0aWVzOiBbNTBdIE1TSTogRW5hYmxlKyBDb3Vu
dD0xLzEgTWFza2FibGUtIDY0Yml0LQ0KCQlBZGRyZXNzOiBmZWUwMTAwYyAgRGF0YTogNDE2MQ0K
CUNhcGFiaWxpdGllczogWzcwXSBFeHByZXNzICh2MikgTGVnYWN5IEVuZHBvaW50LCBNU0kgMDAN
CgkJRGV2Q2FwOglNYXhQYXlsb2FkIDUxMiBieXRlcywgUGhhbnRGdW5jIDAsIExhdGVuY3kgTDBz
IDwxdXMsIEwxIDw4dXMNCgkJCUV4dFRhZy0gQXR0bkJ0bi0gQXR0bkluZC0gUHdySW5kLSBSQkUr
IEZMUmVzZXQtDQoJCURldkN0bDoJUmVwb3J0IGVycm9yczogQ29ycmVjdGFibGUtIE5vbi1GYXRh
bC0gRmF0YWwtIFVuc3VwcG9ydGVkLQ0KCQkJUmx4ZE9yZCsgRXh0VGFnLSBQaGFudEZ1bmMtIEF1
eFB3ci0gTm9Tbm9vcC0NCgkJCU1heFBheWxvYWQgMTI4IGJ5dGVzLCBNYXhSZWFkUmVxIDUxMiBi
eXRlcw0KCQlEZXZTdGE6CUNvcnJFcnIrIFVuY29yckVyci0gRmF0YWxFcnItIFVuc3VwcFJlcSsg
QXV4UHdyLSBUcmFuc1BlbmQtDQoJCUxua0NhcDoJUG9ydCAjMCwgU3BlZWQgNUdUL3MsIFdpZHRo
IHgxLCBBU1BNIEwwcyBMMSwgTGF0ZW5jeSBMMCA8NTEybnMsIEwxIDw2NHVzDQoJCQlDbG9ja1BN
LSBTdXJwcmlzZS0gTExBY3RSZXAtIEJ3Tm90LQ0KCQlMbmtDdGw6CUFTUE0gRGlzYWJsZWQ7IFJD
QiA2NCBieXRlcyBEaXNhYmxlZC0gUmV0cmFpbi0gQ29tbUNsaysNCgkJCUV4dFN5bmNoLSBDbG9j
a1BNLSBBdXRXaWREaXMtIEJXSW50LSBBdXRCV0ludC0NCgkJTG5rU3RhOglTcGVlZCA1R1Qvcywg
V2lkdGggeDEsIFRyRXJyLSBUcmFpbi0gU2xvdENsaysgRExBY3RpdmUtIEJXTWdtdC0gQUJXTWdt
dC0NCgkJRGV2Q2FwMjogQ29tcGxldGlvbiBUaW1lb3V0OiBOb3QgU3VwcG9ydGVkLCBUaW1lb3V0
RGlzKw0KCQlEZXZDdGwyOiBDb21wbGV0aW9uIFRpbWVvdXQ6IDUwdXMgdG8gNTBtcywgVGltZW91
dERpcy0NCgkJTG5rQ3RsMjogVGFyZ2V0IExpbmsgU3BlZWQ6IDVHVC9zLCBFbnRlckNvbXBsaWFu
Y2UtIFNwZWVkRGlzLSwgU2VsZWN0YWJsZSBEZS1lbXBoYXNpczogLTZkQg0KCQkJIFRyYW5zbWl0
IE1hcmdpbjogTm9ybWFsIE9wZXJhdGluZyBSYW5nZSwgRW50ZXJNb2RpZmllZENvbXBsaWFuY2Ut
IENvbXBsaWFuY2VTT1MtDQoJCQkgQ29tcGxpYW5jZSBEZS1lbXBoYXNpczogLTZkQg0KCQlMbmtT
dGEyOiBDdXJyZW50IERlLWVtcGhhc2lzIExldmVsOiAtNmRCDQoJQ2FwYWJpbGl0aWVzOiBbMTAw
IHYxXSBBZHZhbmNlZCBFcnJvciBSZXBvcnRpbmcNCgkJVUVTdGE6CURMUC0gU0RFUy0gVExQLSBG
Q1AtIENtcGx0VE8tIENtcGx0QWJydC0gVW54Q21wbHQtIFJ4T0YtIE1hbGZUTFAtIEVDUkMtIFVu
c3VwUmVxLSBBQ1NWaW9sLQ0KCQlVRU1zazoJRExQLSBTREVTLSBUTFAtIEZDUC0gQ21wbHRUTy0g
Q21wbHRBYnJ0LSBVbnhDbXBsdC0gUnhPRi0gTWFsZlRMUC0gRUNSQy0gVW5zdXBSZXEtIEFDU1Zp
b2wtDQoJCVVFU3ZydDoJRExQKyBTREVTKyBUTFAtIEZDUCsgQ21wbHRUTy0gQ21wbHRBYnJ0LSBV
bnhDbXBsdC0gUnhPRisgTWFsZlRMUCsgRUNSQy0gVW5zdXBSZXEtIEFDU1Zpb2wtDQoJCUNFU3Rh
OglSeEVyci0gQmFkVExQLSBCYWRETExQLSBSb2xsb3Zlci0gVGltZW91dC0gTm9uRmF0YWxFcnIr
DQoJCUNFTXNrOglSeEVyci0gQmFkVExQLSBCYWRETExQLSBSb2xsb3Zlci0gVGltZW91dC0gTm9u
RmF0YWxFcnIrDQoJCUFFUkNhcDoJRmlyc3QgRXJyb3IgUG9pbnRlcjogMDAsIEdlbkNhcC0gQ0dl
bkVuLSBDaGtDYXAtIENoa0VuLQ0KCUtlcm5lbCBkcml2ZXIgaW4gdXNlOiBhaGNpDQoNCjAyOjAw
LjAgVVNCIGNvbnRyb2xsZXIgWzBjMDNdOiBORUMgQ29ycG9yYXRpb24gdVBENzIwMjAwIFVTQiAz
LjAgSG9zdCBDb250cm9sbGVyIFsxMDMzOjAxOTRdIChyZXYgMDMpIChwcm9nLWlmIDMwIFtYSENJ
XSkNCglTdWJzeXN0ZW06IEFTVVNUZUsgQ29tcHV0ZXIgSW5jLiBQOFA2NyBEZWx1eGUgTW90aGVy
Ym9hcmQgWzEwNDM6ODQxM10NCglDb250cm9sOiBJL08tIE1lbSsgQnVzTWFzdGVyKyBTcGVjQ3lj
bGUtIE1lbVdJTlYtIFZHQVNub29wLSBQYXJFcnItIFN0ZXBwaW5nLSBTRVJSKyBGYXN0QjJCLSBE
aXNJTlR4Kw0KCVN0YXR1czogQ2FwKyA2Nk1Iei0gVURGLSBGYXN0QjJCLSBQYXJFcnItIERFVlNF
TD1mYXN0ID5UQWJvcnQtIDxUQWJvcnQtIDxNQWJvcnQtID5TRVJSLSA8UEVSUi0gSU5UeC0NCglM
YXRlbmN5OiAwLCBDYWNoZSBMaW5lIFNpemU6IDI1NiBieXRlcw0KCUludGVycnVwdDogcGluIEEg
cm91dGVkIHRvIElSUSAyOQ0KCVJlZ2lvbiAwOiBNZW1vcnkgYXQgZjVmZmUwMDAgKDY0LWJpdCwg
bm9uLXByZWZldGNoYWJsZSkgW3NpemU9OEtdDQoJQ2FwYWJpbGl0aWVzOiBbNTBdIFBvd2VyIE1h
bmFnZW1lbnQgdmVyc2lvbiAzDQoJCUZsYWdzOiBQTUVDbGstIERTSS0gRDEtIEQyLSBBdXhDdXJy
ZW50PTM3NW1BIFBNRShEMCssRDEtLEQyLSxEM2hvdCssRDNjb2xkKykNCgkJU3RhdHVzOiBEMCBO
b1NvZnRSc3QrIFBNRS1FbmFibGUtIERTZWw9MCBEU2NhbGU9MCBQTUUtDQoJQ2FwYWJpbGl0aWVz
OiBbNzBdIE1TSTogRW5hYmxlLSBDb3VudD0xLzggTWFza2FibGUtIDY0Yml0Kw0KCQlBZGRyZXNz
OiAwMDAwMDAwMDAwMDAwMDAwICBEYXRhOiAwMDAwDQoJQ2FwYWJpbGl0aWVzOiBbOTBdIE1TSS1Y
OiBFbmFibGUrIENvdW50PTggTWFza2VkLQ0KCQlWZWN0b3IgdGFibGU6IEJBUj0wIG9mZnNldD0w
MDAwMTAwMA0KCQlQQkE6IEJBUj0wIG9mZnNldD0wMDAwMTA4MA0KCUNhcGFiaWxpdGllczogW2Ew
XSBFeHByZXNzICh2MikgRW5kcG9pbnQsIE1TSSAwMA0KCQlEZXZDYXA6CU1heFBheWxvYWQgMTI4
IGJ5dGVzLCBQaGFudEZ1bmMgMCwgTGF0ZW5jeSBMMHMgdW5saW1pdGVkLCBMMSB1bmxpbWl0ZWQN
CgkJCUV4dFRhZy0gQXR0bkJ0bi0gQXR0bkluZC0gUHdySW5kLSBSQkUrIEZMUmVzZXQtDQoJCURl
dkN0bDoJUmVwb3J0IGVycm9yczogQ29ycmVjdGFibGUtIE5vbi1GYXRhbC0gRmF0YWwtIFVuc3Vw
cG9ydGVkLQ0KCQkJUmx4ZE9yZC0gRXh0VGFnLSBQaGFudEZ1bmMtIEF1eFB3ci0gTm9Tbm9vcCsN
CgkJCU1heFBheWxvYWQgMTI4IGJ5dGVzLCBNYXhSZWFkUmVxIDUxMiBieXRlcw0KCQlEZXZTdGE6
CUNvcnJFcnIrIFVuY29yckVyci0gRmF0YWxFcnItIFVuc3VwcFJlcSsgQXV4UHdyKyBUcmFuc1Bl
bmQtDQoJCUxua0NhcDoJUG9ydCAjMCwgU3BlZWQgNUdUL3MsIFdpZHRoIHgxLCBBU1BNIEwwcyBM
MSwgTGF0ZW5jeSBMMCA8NHVzLCBMMSB1bmxpbWl0ZWQNCgkJCUNsb2NrUE0rIFN1cnByaXNlLSBM
TEFjdFJlcC0gQndOb3QtDQoJCUxua0N0bDoJQVNQTSBEaXNhYmxlZDsgUkNCIDY0IGJ5dGVzIERp
c2FibGVkLSBSZXRyYWluLSBDb21tQ2xrKw0KCQkJRXh0U3luY2gtIENsb2NrUE0rIEF1dFdpZERp
cy0gQldJbnQtIEF1dEJXSW50LQ0KCQlMbmtTdGE6CVNwZWVkIDVHVC9zLCBXaWR0aCB4MSwgVHJF
cnItIFRyYWluLSBTbG90Q2xrKyBETEFjdGl2ZS0gQldNZ210LSBBQldNZ210LQ0KCQlEZXZDYXAy
OiBDb21wbGV0aW9uIFRpbWVvdXQ6IE5vdCBTdXBwb3J0ZWQsIFRpbWVvdXREaXMrDQoJCURldkN0
bDI6IENvbXBsZXRpb24gVGltZW91dDogNTB1cyB0byA1MG1zLCBUaW1lb3V0RGlzLQ0KCQlMbmtD
dGwyOiBUYXJnZXQgTGluayBTcGVlZDogNUdUL3MsIEVudGVyQ29tcGxpYW5jZS0gU3BlZWREaXMt
LCBTZWxlY3RhYmxlIERlLWVtcGhhc2lzOiAtNmRCDQoJCQkgVHJhbnNtaXQgTWFyZ2luOiBOb3Jt
YWwgT3BlcmF0aW5nIFJhbmdlLCBFbnRlck1vZGlmaWVkQ29tcGxpYW5jZS0gQ29tcGxpYW5jZVNP
Uy0NCgkJCSBDb21wbGlhbmNlIERlLWVtcGhhc2lzOiAtNmRCDQoJCUxua1N0YTI6IEN1cnJlbnQg
RGUtZW1waGFzaXMgTGV2ZWw6IC02ZEINCglDYXBhYmlsaXRpZXM6IFsxMDAgdjFdIEFkdmFuY2Vk
IEVycm9yIFJlcG9ydGluZw0KCQlVRVN0YToJRExQLSBTREVTLSBUTFAtIEZDUC0gQ21wbHRUTy0g
Q21wbHRBYnJ0LSBVbnhDbXBsdC0gUnhPRi0gTWFsZlRMUC0gRUNSQy0gVW5zdXBSZXEtIEFDU1Zp
b2wtDQoJCVVFTXNrOglETFAtIFNERVMtIFRMUC0gRkNQLSBDbXBsdFRPLSBDbXBsdEFicnQtIFVu
eENtcGx0LSBSeE9GLSBNYWxmVExQLSBFQ1JDLSBVbnN1cFJlcS0gQUNTVmlvbC0NCgkJVUVTdnJ0
OglETFArIFNERVMrIFRMUC0gRkNQKyBDbXBsdFRPLSBDbXBsdEFicnQtIFVueENtcGx0LSBSeE9G
KyBNYWxmVExQKyBFQ1JDLSBVbnN1cFJlcS0gQUNTVmlvbC0NCgkJQ0VTdGE6CVJ4RXJyLSBCYWRU
TFAtIEJhZERMTFAtIFJvbGxvdmVyLSBUaW1lb3V0LSBOb25GYXRhbEVycisNCgkJQ0VNc2s6CVJ4
RXJyLSBCYWRUTFAtIEJhZERMTFAtIFJvbGxvdmVyLSBUaW1lb3V0LSBOb25GYXRhbEVycisNCgkJ
QUVSQ2FwOglGaXJzdCBFcnJvciBQb2ludGVyOiAwMCwgR2VuQ2FwLSBDR2VuRW4tIENoa0NhcC0g
Q2hrRW4tDQoJQ2FwYWJpbGl0aWVzOiBbMTQwIHYxXSBEZXZpY2UgU2VyaWFsIE51bWJlciBmZi1m
Zi1mZi1mZi1mZi1mZi1mZi1mZg0KCUNhcGFiaWxpdGllczogWzE1MCB2MV0gTGF0ZW5jeSBUb2xl
cmFuY2UgUmVwb3J0aW5nDQoJCU1heCBzbm9vcCBsYXRlbmN5OiAwbnMNCgkJTWF4IG5vIHNub29w
IGxhdGVuY3k6IDBucw0KCUtlcm5lbCBkcml2ZXIgaW4gdXNlOiB4aGNpX2hjZA0KDQowMzowMC4w
IFZHQSBjb21wYXRpYmxlIGNvbnRyb2xsZXIgWzAzMDBdOiBuVmlkaWEgQ29ycG9yYXRpb24gR0Yx
MDYgW0dlRm9yY2UgR1RTIDQ1MF0gWzEwZGU6MGRjNF0gKHJldiBhMSkgKHByb2ctaWYgMDAgW1ZH
QSBjb250cm9sbGVyXSkNCglTdWJzeXN0ZW06IEFTVVNUZUsgQ29tcHV0ZXIgSW5jLiBEZXZpY2Ug
WzEwNDM6ODM3YV0NCglDb250cm9sOiBJL08rIE1lbSsgQnVzTWFzdGVyKyBTcGVjQ3ljbGUtIE1l
bVdJTlYtIFZHQVNub29wLSBQYXJFcnItIFN0ZXBwaW5nLSBTRVJSKyBGYXN0QjJCLSBEaXNJTlR4
LQ0KCVN0YXR1czogQ2FwKyA2Nk1Iei0gVURGLSBGYXN0QjJCLSBQYXJFcnItIERFVlNFTD1mYXN0
ID5UQWJvcnQtIDxUQWJvcnQtIDxNQWJvcnQtID5TRVJSLSA8UEVSUi0gSU5UeC0NCglMYXRlbmN5
OiAwLCBDYWNoZSBMaW5lIFNpemU6IDI1NiBieXRlcw0KCUludGVycnVwdDogcGluIEEgcm91dGVk
IHRvIElSUSAyNA0KCVJlZ2lvbiAwOiBNZW1vcnkgYXQgZjYwMDAwMDAgKDMyLWJpdCwgbm9uLXBy
ZWZldGNoYWJsZSkgW3NpemU9MzJNXQ0KCVJlZ2lvbiAxOiBNZW1vcnkgYXQgYzgwMDAwMDAgKDY0
LWJpdCwgcHJlZmV0Y2hhYmxlKSBbc2l6ZT0xMjhNXQ0KCVJlZ2lvbiAzOiBNZW1vcnkgYXQgYzQw
MDAwMDAgKDY0LWJpdCwgcHJlZmV0Y2hhYmxlKSBbc2l6ZT02NE1dDQoJUmVnaW9uIDU6IEkvTyBw
b3J0cyBhdCBiYzAwIFtzaXplPTEyOF0NCglFeHBhbnNpb24gUk9NIGF0IGY4ZjAwMDAwIFtkaXNh
YmxlZF0gW3NpemU9NTEyS10NCglDYXBhYmlsaXRpZXM6IFs2MF0gUG93ZXIgTWFuYWdlbWVudCB2
ZXJzaW9uIDMNCgkJRmxhZ3M6IFBNRUNsay0gRFNJLSBEMS0gRDItIEF1eEN1cnJlbnQ9MG1BIFBN
RShEMC0sRDEtLEQyLSxEM2hvdC0sRDNjb2xkLSkNCgkJU3RhdHVzOiBEMCBOb1NvZnRSc3QrIFBN
RS1FbmFibGUtIERTZWw9MCBEU2NhbGU9MCBQTUUtDQoJQ2FwYWJpbGl0aWVzOiBbNjhdIE1TSTog
RW5hYmxlLSBDb3VudD0xLzEgTWFza2FibGUtIDY0Yml0Kw0KCQlBZGRyZXNzOiAwMDAwMDAwMDAw
MDAwMDAwICBEYXRhOiAwMDAwDQoJQ2FwYWJpbGl0aWVzOiBbNzhdIEV4cHJlc3MgKHYxKSBFbmRw
b2ludCwgTVNJIDAwDQoJCURldkNhcDoJTWF4UGF5bG9hZCAxMjggYnl0ZXMsIFBoYW50RnVuYyAw
LCBMYXRlbmN5IEwwcyA8NHVzLCBMMSA8NjR1cw0KCQkJRXh0VGFnKyBBdHRuQnRuLSBBdHRuSW5k
LSBQd3JJbmQtIFJCRSsgRkxSZXNldC0NCgkJRGV2Q3RsOglSZXBvcnQgZXJyb3JzOiBDb3JyZWN0
YWJsZS0gTm9uLUZhdGFsLSBGYXRhbC0gVW5zdXBwb3J0ZWQtDQoJCQlSbHhkT3JkKyBFeHRUYWct
IFBoYW50RnVuYy0gQXV4UHdyLSBOb1Nub29wKw0KCQkJTWF4UGF5bG9hZCAxMjggYnl0ZXMsIE1h
eFJlYWRSZXEgNTEyIGJ5dGVzDQoJCURldlN0YToJQ29yckVyci0gVW5jb3JyRXJyLSBGYXRhbEVy
ci0gVW5zdXBwUmVxLSBBdXhQd3ItIFRyYW5zUGVuZC0NCgkJTG5rQ2FwOglQb3J0ICMwLCBTcGVl
ZCAyLjVHVC9zLCBXaWR0aCB4MTYsIEFTUE0gTDBzIEwxLCBMYXRlbmN5IEwwIDwyNTZucywgTDEg
PDR1cw0KCQkJQ2xvY2tQTSsgU3VycHJpc2UtIExMQWN0UmVwLSBCd05vdC0NCgkJTG5rQ3RsOglB
U1BNIERpc2FibGVkOyBSQ0IgNjQgYnl0ZXMgRGlzYWJsZWQtIFJldHJhaW4tIENvbW1DbGsrDQoJ
CQlFeHRTeW5jaC0gQ2xvY2tQTS0gQXV0V2lkRGlzLSBCV0ludC0gQXV0QldJbnQtDQoJCUxua1N0
YToJU3BlZWQgMi41R1QvcywgV2lkdGggeDE2LCBUckVyci0gVHJhaW4tIFNsb3RDbGsrIERMQWN0
aXZlLSBCV01nbXQtIEFCV01nbXQtDQoJQ2FwYWJpbGl0aWVzOiBbYjRdIFZlbmRvciBTcGVjaWZp
YyBJbmZvcm1hdGlvbjogTGVuPTE0IDw/Pg0KCUNhcGFiaWxpdGllczogWzEwMCB2MV0gVmlydHVh
bCBDaGFubmVsDQoJCUNhcHM6CUxQRVZDPTAgUmVmQ2xrPTEwMG5zIFBBVEVudHJ5Qml0cz0xDQoJ
CUFyYjoJRml4ZWQtIFdSUjMyLSBXUlI2NC0gV1JSMTI4LQ0KCQlDdHJsOglBcmJTZWxlY3Q9Rml4
ZWQNCgkJU3RhdHVzOglJblByb2dyZXNzLQ0KCQlWQzA6CUNhcHM6CVBBVE9mZnNldD0wMCBNYXhU
aW1lU2xvdHM9MSBSZWpTbm9vcFRyYW5zLQ0KCQkJQXJiOglGaXhlZC0gV1JSMzItIFdSUjY0LSBX
UlIxMjgtIFRXUlIxMjgtIFdSUjI1Ni0NCgkJCUN0cmw6CUVuYWJsZSsgSUQ9MCBBcmJTZWxlY3Q9
Rml4ZWQgVEMvVkM9ZmYNCgkJCVN0YXR1czoJTmVnb1BlbmRpbmctIEluUHJvZ3Jlc3MtDQoJQ2Fw
YWJpbGl0aWVzOiBbMTI4IHYxXSBQb3dlciBCdWRnZXRpbmcgPD8+DQoJQ2FwYWJpbGl0aWVzOiBb
NjAwIHYxXSBWZW5kb3IgU3BlY2lmaWMgSW5mb3JtYXRpb246IElEPTAwMDEgUmV2PTEgTGVuPTAy
NCA8Pz4NCglLZXJuZWwgZHJpdmVyIGluIHVzZTogbm91dmVhdQ0KDQowMzowMC4xIEF1ZGlvIGRl
dmljZSBbMDQwM106IG5WaWRpYSBDb3Jwb3JhdGlvbiBHRjEwNiBIaWdoIERlZmluaXRpb24gQXVk
aW8gQ29udHJvbGxlciBbMTBkZTowYmU5XSAocmV2IGExKQ0KCVN1YnN5c3RlbTogQVNVU1RlSyBD
b21wdXRlciBJbmMuIERldmljZSBbMTA0Mzo4MzdhXQ0KCUNvbnRyb2w6IEkvTy0gTWVtKyBCdXNN
YXN0ZXIrIFNwZWNDeWNsZS0gTWVtV0lOVi0gVkdBU25vb3AtIFBhckVyci0gU3RlcHBpbmctIFNF
UlIrIEZhc3RCMkItIERpc0lOVHgtDQoJU3RhdHVzOiBDYXArIDY2TUh6LSBVREYtIEZhc3RCMkIt
IFBhckVyci0gREVWU0VMPWZhc3QgPlRBYm9ydC0gPFRBYm9ydC0gPE1BYm9ydC0gPlNFUlItIDxQ
RVJSLSBJTlR4LQ0KCUxhdGVuY3k6IDAsIENhY2hlIExpbmUgU2l6ZTogMjU2IGJ5dGVzDQoJSW50
ZXJydXB0OiBwaW4gQiByb3V0ZWQgdG8gSVJRIDM0DQoJUmVnaW9uIDA6IE1lbW9yeSBhdCBmOGZm
YzAwMCAoMzItYml0LCBub24tcHJlZmV0Y2hhYmxlKSBbc2l6ZT0xNktdDQoJQ2FwYWJpbGl0aWVz
OiBbNjBdIFBvd2VyIE1hbmFnZW1lbnQgdmVyc2lvbiAzDQoJCUZsYWdzOiBQTUVDbGstIERTSS0g
RDEtIEQyLSBBdXhDdXJyZW50PTBtQSBQTUUoRDAtLEQxLSxEMi0sRDNob3QtLEQzY29sZC0pDQoJ
CVN0YXR1czogRDAgTm9Tb2Z0UnN0KyBQTUUtRW5hYmxlLSBEU2VsPTAgRFNjYWxlPTAgUE1FLQ0K
CUNhcGFiaWxpdGllczogWzY4XSBNU0k6IEVuYWJsZS0gQ291bnQ9MS8xIE1hc2thYmxlLSA2NGJp
dCsNCgkJQWRkcmVzczogMDAwMDAwMDAwMDAwMDAwMCAgRGF0YTogMDAwMA0KCUNhcGFiaWxpdGll
czogWzc4XSBFeHByZXNzICh2MSkgRW5kcG9pbnQsIE1TSSAwMA0KCQlEZXZDYXA6CU1heFBheWxv
YWQgMTI4IGJ5dGVzLCBQaGFudEZ1bmMgMCwgTGF0ZW5jeSBMMHMgPDR1cywgTDEgPDY0dXMNCgkJ
CUV4dFRhZysgQXR0bkJ0bi0gQXR0bkluZC0gUHdySW5kLSBSQkUrIEZMUmVzZXQtDQoJCURldkN0
bDoJUmVwb3J0IGVycm9yczogQ29ycmVjdGFibGUtIE5vbi1GYXRhbC0gRmF0YWwtIFVuc3VwcG9y
dGVkLQ0KCQkJUmx4ZE9yZCsgRXh0VGFnLSBQaGFudEZ1bmMtIEF1eFB3ci0gTm9Tbm9vcCsNCgkJ
CU1heFBheWxvYWQgMTI4IGJ5dGVzLCBNYXhSZWFkUmVxIDUxMiBieXRlcw0KCQlEZXZTdGE6CUNv
cnJFcnItIFVuY29yckVyci0gRmF0YWxFcnItIFVuc3VwcFJlcS0gQXV4UHdyLSBUcmFuc1BlbmQt
DQoJCUxua0NhcDoJUG9ydCAjMCwgU3BlZWQgMi41R1QvcywgV2lkdGggeDE2LCBBU1BNIEwwcyBM
MSwgTGF0ZW5jeSBMMCA8MjU2bnMsIEwxIDw0dXMNCgkJCUNsb2NrUE0rIFN1cnByaXNlLSBMTEFj
dFJlcC0gQndOb3QtDQoJCUxua0N0bDoJQVNQTSBMMHMgTDEgRW5hYmxlZDsgUkNCIDEyOCBieXRl
cyBEaXNhYmxlZC0gUmV0cmFpbi0gQ29tbUNsaysNCgkJCUV4dFN5bmNoLSBDbG9ja1BNLSBBdXRX
aWREaXMtIEJXSW50LSBBdXRCV0ludC0NCgkJTG5rU3RhOglTcGVlZCAyLjVHVC9zLCBXaWR0aCB4
MTYsIFRyRXJyLSBUcmFpbi0gU2xvdENsaysgRExBY3RpdmUtIEJXTWdtdC0gQUJXTWdtdC0NCglL
ZXJuZWwgZHJpdmVyIGluIHVzZTogc25kX2hkYV9pbnRlbA0KDQowNDowMC4wIFZHQSBjb21wYXRp
YmxlIGNvbnRyb2xsZXIgWzAzMDBdOiBuVmlkaWEgQ29ycG9yYXRpb24gRzcxIFtHZUZvcmNlIDc5
MDAgR1RYXSBbMTBkZTowMjkwXSAocmV2IGExKSAocHJvZy1pZiAwMCBbVkdBIGNvbnRyb2xsZXJd
KQ0KCVN1YnN5c3RlbTogblZpZGlhIENvcnBvcmF0aW9uIERldmljZSBbMTBkZTowMzQzXQ0KCUNv
bnRyb2w6IEkvTysgTWVtKyBCdXNNYXN0ZXIrIFNwZWNDeWNsZS0gTWVtV0lOVi0gVkdBU25vb3At
IFBhckVyci0gU3RlcHBpbmctIFNFUlItIEZhc3RCMkItIERpc0lOVHgtDQoJU3RhdHVzOiBDYXAr
IDY2TUh6LSBVREYtIEZhc3RCMkItIFBhckVyci0gREVWU0VMPWZhc3QgPlRBYm9ydC0gPFRBYm9y
dC0gPE1BYm9ydC0gPlNFUlItIDxQRVJSLSBJTlR4LQ0KCUxhdGVuY3k6IDAsIENhY2hlIExpbmUg
U2l6ZTogMjU2IGJ5dGVzDQoJSW50ZXJydXB0OiBwaW4gQSByb3V0ZWQgdG8gSVJRIDMwDQoJUmVn
aW9uIDA6IE1lbW9yeSBhdCBmYTAwMDAwMCAoMzItYml0LCBub24tcHJlZmV0Y2hhYmxlKSBbc2l6
ZT0xNk1dDQoJUmVnaW9uIDE6IE1lbW9yeSBhdCBkMDAwMDAwMCAoNjQtYml0LCBwcmVmZXRjaGFi
bGUpIFtzaXplPTI1Nk1dDQoJUmVnaW9uIDM6IE1lbW9yeSBhdCBmOTAwMDAwMCAoNjQtYml0LCBu
b24tcHJlZmV0Y2hhYmxlKSBbc2l6ZT0xNk1dDQoJUmVnaW9uIDU6IEkvTyBwb3J0cyBhdCBjYzAw
IFtzaXplPTEyOF0NCglFeHBhbnNpb24gUk9NIGF0IGZiY2UwMDAwIFtkaXNhYmxlZF0gW3NpemU9
MTI4S10NCglDYXBhYmlsaXRpZXM6IFs2MF0gUG93ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDINCgkJ
RmxhZ3M6IFBNRUNsay0gRFNJLSBEMS0gRDItIEF1eEN1cnJlbnQ9MG1BIFBNRShEMC0sRDEtLEQy
LSxEM2hvdC0sRDNjb2xkLSkNCgkJU3RhdHVzOiBEMCBOb1NvZnRSc3QtIFBNRS1FbmFibGUtIERT
ZWw9MCBEU2NhbGU9MCBQTUUtDQoJQ2FwYWJpbGl0aWVzOiBbNjhdIE1TSTogRW5hYmxlLSBDb3Vu
dD0xLzEgTWFza2FibGUtIDY0Yml0Kw0KCQlBZGRyZXNzOiAwMDAwMDAwMDAwMDAwMDAwICBEYXRh
OiAwMDAwDQoJQ2FwYWJpbGl0aWVzOiBbNzhdIEV4cHJlc3MgKHYxKSBFbmRwb2ludCwgTVNJIDAw
DQoJCURldkNhcDoJTWF4UGF5bG9hZCAxMjggYnl0ZXMsIFBoYW50RnVuYyAwLCBMYXRlbmN5IEww
cyA8MXVzLCBMMSA8NHVzDQoJCQlFeHRUYWctIEF0dG5CdG4tIEF0dG5JbmQtIFB3ckluZC0gUkJF
LSBGTFJlc2V0LQ0KCQlEZXZDdGw6CVJlcG9ydCBlcnJvcnM6IENvcnJlY3RhYmxlLSBOb24tRmF0
YWwtIEZhdGFsLSBVbnN1cHBvcnRlZC0NCgkJCVJseGRPcmQrIEV4dFRhZy0gUGhhbnRGdW5jLSBB
dXhQd3ItIE5vU25vb3ArDQoJCQlNYXhQYXlsb2FkIDEyOCBieXRlcywgTWF4UmVhZFJlcSA1MTIg
Ynl0ZXMNCgkJRGV2U3RhOglDb3JyRXJyLSBVbmNvcnJFcnIrIEZhdGFsRXJyLSBVbnN1cHBSZXEr
IEF1eFB3ci0gVHJhbnNQZW5kLQ0KCQlMbmtDYXA6CVBvcnQgIzAsIFNwZWVkIDIuNUdUL3MsIFdp
ZHRoIHgxNiwgQVNQTSBMMHMgTDEsIExhdGVuY3kgTDAgPDF1cywgTDEgPDR1cw0KCQkJQ2xvY2tQ
TS0gU3VycHJpc2UtIExMQWN0UmVwLSBCd05vdC0NCgkJTG5rQ3RsOglBU1BNIERpc2FibGVkOyBS
Q0IgMTI4IGJ5dGVzIERpc2FibGVkLSBSZXRyYWluLSBDb21tQ2xrLQ0KCQkJRXh0U3luY2gtIENs
b2NrUE0tIEF1dFdpZERpcy0gQldJbnQtIEF1dEJXSW50LQ0KCQlMbmtTdGE6CVNwZWVkIDIuNUdU
L3MsIFdpZHRoIHgxNiwgVHJFcnItIFRyYWluLSBTbG90Q2xrKyBETEFjdGl2ZS0gQldNZ210LSBB
QldNZ210LQ0KCUNhcGFiaWxpdGllczogWzEwMCB2MV0gVmlydHVhbCBDaGFubmVsDQoJCUNhcHM6
CUxQRVZDPTAgUmVmQ2xrPTEwMG5zIFBBVEVudHJ5Qml0cz0xDQoJCUFyYjoJRml4ZWQtIFdSUjMy
LSBXUlI2NC0gV1JSMTI4LQ0KCQlDdHJsOglBcmJTZWxlY3Q9Rml4ZWQNCgkJU3RhdHVzOglJblBy
b2dyZXNzLQ0KCQlWQzA6CUNhcHM6CVBBVE9mZnNldD0wMCBNYXhUaW1lU2xvdHM9MSBSZWpTbm9v
cFRyYW5zLQ0KCQkJQXJiOglGaXhlZC0gV1JSMzItIFdSUjY0LSBXUlIxMjgtIFRXUlIxMjgtIFdS
UjI1Ni0NCgkJCUN0cmw6CUVuYWJsZSsgSUQ9MCBBcmJTZWxlY3Q9Rml4ZWQgVEMvVkM9ZmYNCgkJ
CVN0YXR1czoJTmVnb1BlbmRpbmctIEluUHJvZ3Jlc3MtDQoJQ2FwYWJpbGl0aWVzOiBbMTI4IHYx
XSBQb3dlciBCdWRnZXRpbmcgPD8+DQoJS2VybmVsIGRyaXZlciBpbiB1c2U6IG5vdXZlYXUNCg0K
MDU6MDAuMCBTQVRBIGNvbnRyb2xsZXIgWzAxMDZdOiBKTWljcm9uIFRlY2hub2xvZ3kgQ29ycC4g
Sk1CMzYyIEFIQ0kgQ29udHJvbGxlciBbMTk3YjoyMzYyXSAocmV2IDEwKSAocHJvZy1pZiAwMSBb
QUhDSSAxLjBdKQ0KCVN1YnN5c3RlbTogQVNVU1RlSyBDb21wdXRlciBJbmMuIFA4UDY3IERlbHV4
ZSBNb3RoZXJib2FyZCBbMTA0Mzo4NDYwXQ0KCUNvbnRyb2w6IEkvTysgTWVtKyBCdXNNYXN0ZXIr
IFNwZWNDeWNsZS0gTWVtV0lOVi0gVkdBU25vb3AtIFBhckVyci0gU3RlcHBpbmctIFNFUlIrIEZh
c3RCMkItIERpc0lOVHgtDQoJU3RhdHVzOiBDYXArIDY2TUh6LSBVREYtIEZhc3RCMkItIFBhckVy
ci0gREVWU0VMPWZhc3QgPlRBYm9ydC0gPFRBYm9ydC0gPE1BYm9ydC0gPlNFUlItIDxQRVJSLSBJ
TlR4LQ0KCUxhdGVuY3k6IDAsIENhY2hlIExpbmUgU2l6ZTogMjU2IGJ5dGVzDQoJSW50ZXJydXB0
OiBwaW4gQSByb3V0ZWQgdG8gSVJRIDE2DQoJUmVnaW9uIDA6IEkvTyBwb3J0cyBhdCBkYzAwIFtz
aXplPThdDQoJUmVnaW9uIDE6IEkvTyBwb3J0cyBhdCBkODgwIFtzaXplPTRdDQoJUmVnaW9uIDI6
IEkvTyBwb3J0cyBhdCBkODAwIFtzaXplPThdDQoJUmVnaW9uIDM6IEkvTyBwb3J0cyBhdCBkNDgw
IFtzaXplPTRdDQoJUmVnaW9uIDQ6IEkvTyBwb3J0cyBhdCBkNDAwIFtzaXplPTE2XQ0KCVJlZ2lv
biA1OiBNZW1vcnkgYXQgZmJkZmZjMDAgKDMyLWJpdCwgbm9uLXByZWZldGNoYWJsZSkgW3NpemU9
NTEyXQ0KCVt2aXJ0dWFsXSBFeHBhbnNpb24gUk9NIGF0IGMwMDAwMDAwIFtkaXNhYmxlZF0gW3Np
emU9NjRLXQ0KCUNhcGFiaWxpdGllczogWzhjXSBQb3dlciBNYW5hZ2VtZW50IHZlcnNpb24gMw0K
CQlGbGFnczogUE1FQ2xrLSBEU0ktIEQxLSBEMi0gQXV4Q3VycmVudD0wbUEgUE1FKEQwLSxEMS0s
RDItLEQzaG90KyxEM2NvbGQtKQ0KCQlTdGF0dXM6IEQwIE5vU29mdFJzdC0gUE1FLUVuYWJsZS0g
RFNlbD0wIERTY2FsZT0wIFBNRS0NCglDYXBhYmlsaXRpZXM6IFs1MF0gRXhwcmVzcyAodjEpIExl
Z2FjeSBFbmRwb2ludCwgTVNJIDAwDQoJCURldkNhcDoJTWF4UGF5bG9hZCAxMjggYnl0ZXMsIFBo
YW50RnVuYyAwLCBMYXRlbmN5IEwwcyA8NjRucywgTDEgPDF1cw0KCQkJRXh0VGFnLSBBdHRuQnRu
LSBBdHRuSW5kLSBQd3JJbmQtIFJCRSsgRkxSZXNldC0NCgkJRGV2Q3RsOglSZXBvcnQgZXJyb3Jz
OiBDb3JyZWN0YWJsZS0gTm9uLUZhdGFsLSBGYXRhbC0gVW5zdXBwb3J0ZWQtDQoJCQlSbHhkT3Jk
LSBFeHRUYWctIFBoYW50RnVuYy0gQXV4UHdyLSBOb1Nub29wLQ0KCQkJTWF4UGF5bG9hZCAxMjgg
Ynl0ZXMsIE1heFJlYWRSZXEgNTEyIGJ5dGVzDQoJCURldlN0YToJQ29yckVyci0gVW5jb3JyRXJy
KyBGYXRhbEVyci0gVW5zdXBwUmVxKyBBdXhQd3ItIFRyYW5zUGVuZC0NCgkJTG5rQ2FwOglQb3J0
ICMwLCBTcGVlZCAyLjVHVC9zLCBXaWR0aCB4MSwgQVNQTSBMMHMgTDEsIExhdGVuY3kgTDAgPDF1
cywgTDEgPDE2dXMNCgkJCUNsb2NrUE0tIFN1cnByaXNlLSBMTEFjdFJlcC0gQndOb3QtDQoJCUxu
a0N0bDoJQVNQTSBEaXNhYmxlZDsgUkNCIDY0IGJ5dGVzIERpc2FibGVkLSBSZXRyYWluLSBDb21t
Q2xrKw0KCQkJRXh0U3luY2gtIENsb2NrUE0tIEF1dFdpZERpcy0gQldJbnQtIEF1dEJXSW50LQ0K
CQlMbmtTdGE6CVNwZWVkIDIuNUdUL3MsIFdpZHRoIHgxLCBUckVyci0gVHJhaW4tIFNsb3RDbGsr
IERMQWN0aXZlLSBCV01nbXQtIEFCV01nbXQtDQoJS2VybmVsIGRyaXZlciBpbiB1c2U6IGFoY2kN
Cg0KMDc6MDEuMCBFdGhlcm5ldCBjb250cm9sbGVyIFswMjAwXTogUmVhbHRlayBTZW1pY29uZHVj
dG9yIENvLiwgTHRkLiBSVEwtODExMFNDLzgxNjlTQyBHaWdhYml0IEV0aGVybmV0IFsxMGVjOjgx
NjddIChyZXYgMTApDQoJU3Vic3lzdGVtOiBBU1VTVGVLIENvbXB1dGVyIEluYy4gRGV2aWNlIFsx
MDQzOjgyMGRdDQoJQ29udHJvbDogSS9PKyBNZW0rIEJ1c01hc3RlcisgU3BlY0N5Y2xlLSBNZW1X
SU5WKyBWR0FTbm9vcC0gUGFyRXJyLSBTdGVwcGluZy0gU0VSUisgRmFzdEIyQi0gRGlzSU5UeC0N
CglTdGF0dXM6IENhcCsgNjZNSHorIFVERi0gRmFzdEIyQisgUGFyRXJyLSBERVZTRUw9bWVkaXVt
ID5UQWJvcnQtIDxUQWJvcnQtIDxNQWJvcnQtID5TRVJSLSA8UEVSUi0gSU5UeC0NCglMYXRlbmN5
OiA2NCAoODAwMG5zIG1pbiwgMTYwMDBucyBtYXgpLCBDYWNoZSBMaW5lIFNpemU6IDMyIGJ5dGVz
DQoJSW50ZXJydXB0OiBwaW4gQSByb3V0ZWQgdG8gSVJRIDE5DQoJUmVnaW9uIDA6IEkvTyBwb3J0
cyBhdCBlODAwIFtzaXplPTI1Nl0NCglSZWdpb24gMTogTWVtb3J5IGF0IGZiZWZmYzAwICgzMi1i
aXQsIG5vbi1wcmVmZXRjaGFibGUpIFtzaXplPTI1Nl0NCglFeHBhbnNpb24gUk9NIGF0IGZiZWMw
MDAwIFtkaXNhYmxlZF0gW3NpemU9MTI4S10NCglDYXBhYmlsaXRpZXM6IFtkY10gUG93ZXIgTWFu
YWdlbWVudCB2ZXJzaW9uIDINCgkJRmxhZ3M6IFBNRUNsay0gRFNJLSBEMSsgRDIrIEF1eEN1cnJl
bnQ9Mzc1bUEgUE1FKEQwLSxEMSssRDIrLEQzaG90KyxEM2NvbGQrKQ0KCQlTdGF0dXM6IEQwIE5v
U29mdFJzdC0gUE1FLUVuYWJsZS0gRFNlbD0wIERTY2FsZT0wIFBNRS0NCglDYXBhYmlsaXRpZXM6
IFs2MF0gVml0YWwgUHJvZHVjdCBEYXRhDQoJCVVua25vd24gc21hbGwgcmVzb3VyY2UgdHlwZSAw
NSwgd2lsbCBub3QgZGVjb2RlIG1vcmUuDQoJS2VybmVsIGRyaXZlciBpbiB1c2U6IHI4MTY5DQoN
CjA3OjAyLjAgRmlyZVdpcmUgKElFRUUgMTM5NCkgWzBjMDBdOiBWSUEgVGVjaG5vbG9naWVzLCBJ
bmMuIFZUNjMwNi83LzggW0ZpcmUgSUkoTSldIElFRUUgMTM5NCBPSENJIENvbnRyb2xsZXIgWzEx
MDY6MzA0NF0gKHJldiBjMCkgKHByb2ctaWYgMTAgW09IQ0ldKQ0KCVN1YnN5c3RlbTogQVNVU1Rl
SyBDb21wdXRlciBJbmMuIE00QSBzZXJpZXMgbW90aGVyYm9hcmQgWzEwNDM6ODFmZV0NCglDb250
cm9sOiBJL08rIE1lbSsgQnVzTWFzdGVyKyBTcGVjQ3ljbGUtIE1lbVdJTlYrIFZHQVNub29wLSBQ
YXJFcnItIFN0ZXBwaW5nLSBTRVJSKyBGYXN0QjJCLSBEaXNJTlR4LQ0KCVN0YXR1czogQ2FwKyA2
Nk1Iei0gVURGLSBGYXN0QjJCLSBQYXJFcnItIERFVlNFTD1tZWRpdW0gPlRBYm9ydC0gPFRBYm9y
dC0gPE1BYm9ydC0gPlNFUlItIDxQRVJSLSBJTlR4LQ0KCUxhdGVuY3k6IDY0ICg4MDAwbnMgbWF4
KSwgQ2FjaGUgTGluZSBTaXplOiAyNTYgYnl0ZXMNCglJbnRlcnJ1cHQ6IHBpbiBBIHJvdXRlZCB0
byBJUlEgMTgNCglSZWdpb24gMDogTWVtb3J5IGF0IGZiZWZlMDAwICgzMi1iaXQsIG5vbi1wcmVm
ZXRjaGFibGUpIFtzaXplPTJLXQ0KCVJlZ2lvbiAxOiBJL08gcG9ydHMgYXQgZWMwMCBbc2l6ZT0x
MjhdDQoJQ2FwYWJpbGl0aWVzOiBbNTBdIFBvd2VyIE1hbmFnZW1lbnQgdmVyc2lvbiAyDQoJCUZs
YWdzOiBQTUVDbGstIERTSS0gRDEtIEQyKyBBdXhDdXJyZW50PTBtQSBQTUUoRDAtLEQxLSxEMiss
RDNob3QrLEQzY29sZCspDQoJCVN0YXR1czogRDAgTm9Tb2Z0UnN0LSBQTUUtRW5hYmxlLSBEU2Vs
PTAgRFNjYWxlPTAgUE1FLQ0KCUtlcm5lbCBkcml2ZXIgaW4gdXNlOiBmaXJld2lyZV9vaGNpDQoN
CmZmOjAwLjAgSG9zdCBicmlkZ2UgWzA2MDBdOiBJbnRlbCBDb3Jwb3JhdGlvbiBYZW9uIDU1MDAv
Q29yZSBpNyBRdWlja1BhdGggQXJjaGl0ZWN0dXJlIEdlbmVyaWMgTm9uLUNvcmUgUmVnaXN0ZXJz
IFs4MDg2OjJjNDFdIChyZXYgMDUpDQoJU3Vic3lzdGVtOiBJbnRlbCBDb3Jwb3JhdGlvbiBEZXZp
Y2UgWzgwODY6ODA4Nl0NCglDb250cm9sOiBJL08tIE1lbSsgQnVzTWFzdGVyKyBTcGVjQ3ljbGUt
IE1lbVdJTlYtIFZHQVNub29wLSBQYXJFcnItIFN0ZXBwaW5nLSBTRVJSLSBGYXN0QjJCLSBEaXNJ
TlR4LQ0KCVN0YXR1czogQ2FwLSA2Nk1Iei0gVURGLSBGYXN0QjJCLSBQYXJFcnItIERFVlNFTD1m
YXN0ID5UQWJvcnQtIDxUQWJvcnQtIDxNQWJvcnQtID5TRVJSLSA8UEVSUi0gSU5UeC0NCglMYXRl
bmN5OiAwDQoNCmZmOjAwLjEgSG9zdCBicmlkZ2UgWzA2MDBdOiBJbnRlbCBDb3Jwb3JhdGlvbiBY
ZW9uIDU1MDAvQ29yZSBpNyBRdWlja1BhdGggQXJjaGl0ZWN0dXJlIFN5c3RlbSBBZGRyZXNzIERl
Y29kZXIgWzgwODY6MmMwMV0gKHJldiAwNSkNCglTdWJzeXN0ZW06IEludGVsIENvcnBvcmF0aW9u
IERldmljZSBbODA4Njo4MDg2XQ0KCUNvbnRyb2w6IEkvTy0gTWVtKyBCdXNNYXN0ZXIrIFNwZWND
eWNsZS0gTWVtV0lOVi0gVkdBU25vb3AtIFBhckVyci0gU3RlcHBpbmctIFNFUlItIEZhc3RCMkIt
IERpc0lOVHgtDQoJU3RhdHVzOiBDYXAtIDY2TUh6LSBVREYtIEZhc3RCMkItIFBhckVyci0gREVW
U0VMPWZhc3QgPlRBYm9ydC0gPFRBYm9ydC0gPE1BYm9ydC0gPlNFUlItIDxQRVJSLSBJTlR4LQ0K
CUxhdGVuY3k6IDANCg0KZmY6MDIuMCBIb3N0IGJyaWRnZSBbMDYwMF06IEludGVsIENvcnBvcmF0
aW9uIFhlb24gNTUwMC9Db3JlIGk3IFFQSSBMaW5rIDAgWzgwODY6MmMxMF0gKHJldiAwNSkNCglT
dWJzeXN0ZW06IEludGVsIENvcnBvcmF0aW9uIERldmljZSBbODA4Njo4MDg2XQ0KCUNvbnRyb2w6
IEkvTy0gTWVtKyBCdXNNYXN0ZXIrIFNwZWNDeWNsZS0gTWVtV0lOVi0gVkdBU25vb3AtIFBhckVy
ci0gU3RlcHBpbmctIFNFUlItIEZhc3RCMkItIERpc0lOVHgtDQoJU3RhdHVzOiBDYXAtIDY2TUh6
LSBVREYtIEZhc3RCMkItIFBhckVyci0gREVWU0VMPWZhc3QgPlRBYm9ydC0gPFRBYm9ydC0gPE1B
Ym9ydC0gPlNFUlItIDxQRVJSLSBJTlR4LQ0KCUxhdGVuY3k6IDANCg0KZmY6MDIuMSBIb3N0IGJy
aWRnZSBbMDYwMF06IEludGVsIENvcnBvcmF0aW9uIFhlb24gNTUwMC9Db3JlIGk3IFFQSSBQaHlz
aWNhbCAwIFs4MDg2OjJjMTFdIChyZXYgMDUpDQoJU3Vic3lzdGVtOiBJbnRlbCBDb3Jwb3JhdGlv
biBEZXZpY2UgWzgwODY6ODA4Nl0NCglDb250cm9sOiBJL08tIE1lbSsgQnVzTWFzdGVyKyBTcGVj
Q3ljbGUtIE1lbVdJTlYtIFZHQVNub29wLSBQYXJFcnItIFN0ZXBwaW5nLSBTRVJSLSBGYXN0QjJC
LSBEaXNJTlR4LQ0KCVN0YXR1czogQ2FwLSA2Nk1Iei0gVURGLSBGYXN0QjJCLSBQYXJFcnItIERF
VlNFTD1mYXN0ID5UQWJvcnQtIDxUQWJvcnQtIDxNQWJvcnQtID5TRVJSLSA8UEVSUi0gSU5UeC0N
CglMYXRlbmN5OiAwDQoNCmZmOjAzLjAgSG9zdCBicmlkZ2UgWzA2MDBdOiBJbnRlbCBDb3Jwb3Jh
dGlvbiBYZW9uIDU1MDAvQ29yZSBpNyBJbnRlZ3JhdGVkIE1lbW9yeSBDb250cm9sbGVyIFs4MDg2
OjJjMThdIChyZXYgMDUpDQoJU3Vic3lzdGVtOiBJbnRlbCBDb3Jwb3JhdGlvbiBEZXZpY2UgWzgw
ODY6ODA4Nl0NCglDb250cm9sOiBJL08tIE1lbSsgQnVzTWFzdGVyKyBTcGVjQ3ljbGUtIE1lbVdJ
TlYtIFZHQVNub29wLSBQYXJFcnItIFN0ZXBwaW5nLSBTRVJSLSBGYXN0QjJCLSBEaXNJTlR4LQ0K
CVN0YXR1czogQ2FwLSA2Nk1Iei0gVURGLSBGYXN0QjJCLSBQYXJFcnItIERFVlNFTD1mYXN0ID5U
QWJvcnQtIDxUQWJvcnQtIDxNQWJvcnQtID5TRVJSLSA8UEVSUi0gSU5UeC0NCglMYXRlbmN5OiAw
DQoNCmZmOjAzLjEgSG9zdCBicmlkZ2UgWzA2MDBdOiBJbnRlbCBDb3Jwb3JhdGlvbiBYZW9uIDU1
MDAvQ29yZSBpNyBJbnRlZ3JhdGVkIE1lbW9yeSBDb250cm9sbGVyIFRhcmdldCBBZGRyZXNzIERl
Y29kZXIgWzgwODY6MmMxOV0gKHJldiAwNSkNCglTdWJzeXN0ZW06IEludGVsIENvcnBvcmF0aW9u
IERldmljZSBbODA4Njo4MDg2XQ0KCUNvbnRyb2w6IEkvTy0gTWVtKyBCdXNNYXN0ZXIrIFNwZWND
eWNsZS0gTWVtV0lOVi0gVkdBU25vb3AtIFBhckVyci0gU3RlcHBpbmctIFNFUlItIEZhc3RCMkIt
IERpc0lOVHgtDQoJU3RhdHVzOiBDYXAtIDY2TUh6LSBVREYtIEZhc3RCMkItIFBhckVyci0gREVW
U0VMPWZhc3QgPlRBYm9ydC0gPFRBYm9ydC0gPE1BYm9ydC0gPlNFUlItIDxQRVJSLSBJTlR4LQ0K
CUxhdGVuY3k6IDANCg0KZmY6MDMuNCBIb3N0IGJyaWRnZSBbMDYwMF06IEludGVsIENvcnBvcmF0
aW9uIFhlb24gNTUwMC9Db3JlIGk3IEludGVncmF0ZWQgTWVtb3J5IENvbnRyb2xsZXIgVGVzdCBS
ZWdpc3RlcnMgWzgwODY6MmMxY10gKHJldiAwNSkNCglTdWJzeXN0ZW06IEludGVsIENvcnBvcmF0
aW9uIERldmljZSBbODA4Njo4MDg2XQ0KCUNvbnRyb2w6IEkvTy0gTWVtKyBCdXNNYXN0ZXIrIFNw
ZWNDeWNsZS0gTWVtV0lOVi0gVkdBU25vb3AtIFBhckVyci0gU3RlcHBpbmctIFNFUlItIEZhc3RC
MkItIERpc0lOVHgtDQoJU3RhdHVzOiBDYXAtIDY2TUh6LSBVREYtIEZhc3RCMkItIFBhckVyci0g
REVWU0VMPWZhc3QgPlRBYm9ydC0gPFRBYm9ydC0gPE1BYm9ydC0gPlNFUlItIDxQRVJSLSBJTlR4
LQ0KCUxhdGVuY3k6IDANCg0KZmY6MDQuMCBIb3N0IGJyaWRnZSBbMDYwMF06IEludGVsIENvcnBv
cmF0aW9uIFhlb24gNTUwMC9Db3JlIGk3IEludGVncmF0ZWQgTWVtb3J5IENvbnRyb2xsZXIgQ2hh
bm5lbCAwIENvbnRyb2wgUmVnaXN0ZXJzIFs4MDg2OjJjMjBdIChyZXYgMDUpDQoJU3Vic3lzdGVt
OiBJbnRlbCBDb3Jwb3JhdGlvbiBEZXZpY2UgWzgwODY6ODA4Nl0NCglDb250cm9sOiBJL08tIE1l
bSsgQnVzTWFzdGVyKyBTcGVjQ3ljbGUtIE1lbVdJTlYtIFZHQVNub29wLSBQYXJFcnItIFN0ZXBw
aW5nLSBTRVJSLSBGYXN0QjJCLSBEaXNJTlR4LQ0KCVN0YXR1czogQ2FwLSA2Nk1Iei0gVURGLSBG
YXN0QjJCLSBQYXJFcnItIERFVlNFTD1mYXN0ID5UQWJvcnQtIDxUQWJvcnQtIDxNQWJvcnQtID5T
RVJSLSA8UEVSUi0gSU5UeC0NCglMYXRlbmN5OiAwDQoNCmZmOjA0LjEgSG9zdCBicmlkZ2UgWzA2
MDBdOiBJbnRlbCBDb3Jwb3JhdGlvbiBYZW9uIDU1MDAvQ29yZSBpNyBJbnRlZ3JhdGVkIE1lbW9y
eSBDb250cm9sbGVyIENoYW5uZWwgMCBBZGRyZXNzIFJlZ2lzdGVycyBbODA4NjoyYzIxXSAocmV2
IDA1KQ0KCVN1YnN5c3RlbTogSW50ZWwgQ29ycG9yYXRpb24gRGV2aWNlIFs4MDg2OjgwODZdDQoJ
Q29udHJvbDogSS9PLSBNZW0rIEJ1c01hc3RlcisgU3BlY0N5Y2xlLSBNZW1XSU5WLSBWR0FTbm9v
cC0gUGFyRXJyLSBTdGVwcGluZy0gU0VSUi0gRmFzdEIyQi0gRGlzSU5UeC0NCglTdGF0dXM6IENh
cC0gNjZNSHotIFVERi0gRmFzdEIyQi0gUGFyRXJyLSBERVZTRUw9ZmFzdCA+VEFib3J0LSA8VEFi
b3J0LSA8TUFib3J0LSA+U0VSUi0gPFBFUlItIElOVHgtDQoJTGF0ZW5jeTogMA0KDQpmZjowNC4y
IEhvc3QgYnJpZGdlIFswNjAwXTogSW50ZWwgQ29ycG9yYXRpb24gWGVvbiA1NTAwL0NvcmUgaTcg
SW50ZWdyYXRlZCBNZW1vcnkgQ29udHJvbGxlciBDaGFubmVsIDAgUmFuayBSZWdpc3RlcnMgWzgw
ODY6MmMyMl0gKHJldiAwNSkNCglTdWJzeXN0ZW06IEludGVsIENvcnBvcmF0aW9uIERldmljZSBb
ODA4Njo4MDg2XQ0KCUNvbnRyb2w6IEkvTy0gTWVtKyBCdXNNYXN0ZXIrIFNwZWNDeWNsZS0gTWVt
V0lOVi0gVkdBU25vb3AtIFBhckVyci0gU3RlcHBpbmctIFNFUlItIEZhc3RCMkItIERpc0lOVHgt
DQoJU3RhdHVzOiBDYXAtIDY2TUh6LSBVREYtIEZhc3RCMkItIFBhckVyci0gREVWU0VMPWZhc3Qg
PlRBYm9ydC0gPFRBYm9ydC0gPE1BYm9ydC0gPlNFUlItIDxQRVJSLSBJTlR4LQ0KCUxhdGVuY3k6
IDANCg0KZmY6MDQuMyBIb3N0IGJyaWRnZSBbMDYwMF06IEludGVsIENvcnBvcmF0aW9uIFhlb24g
NTUwMC9Db3JlIGk3IEludGVncmF0ZWQgTWVtb3J5IENvbnRyb2xsZXIgQ2hhbm5lbCAwIFRoZXJt
YWwgQ29udHJvbCBSZWdpc3RlcnMgWzgwODY6MmMyM10gKHJldiAwNSkNCglTdWJzeXN0ZW06IElu
dGVsIENvcnBvcmF0aW9uIERldmljZSBbODA4Njo4MDg2XQ0KCUNvbnRyb2w6IEkvTy0gTWVtKyBC
dXNNYXN0ZXIrIFNwZWNDeWNsZS0gTWVtV0lOVi0gVkdBU25vb3AtIFBhckVyci0gU3RlcHBpbmct
IFNFUlItIEZhc3RCMkItIERpc0lOVHgtDQoJU3RhdHVzOiBDYXAtIDY2TUh6LSBVREYtIEZhc3RC
MkItIFBhckVyci0gREVWU0VMPWZhc3QgPlRBYm9ydC0gPFRBYm9ydC0gPE1BYm9ydC0gPlNFUlIt
IDxQRVJSLSBJTlR4LQ0KCUxhdGVuY3k6IDANCg0KZmY6MDUuMCBIb3N0IGJyaWRnZSBbMDYwMF06
IEludGVsIENvcnBvcmF0aW9uIFhlb24gNTUwMC9Db3JlIGk3IEludGVncmF0ZWQgTWVtb3J5IENv
bnRyb2xsZXIgQ2hhbm5lbCAxIENvbnRyb2wgUmVnaXN0ZXJzIFs4MDg2OjJjMjhdIChyZXYgMDUp
DQoJU3Vic3lzdGVtOiBJbnRlbCBDb3Jwb3JhdGlvbiBEZXZpY2UgWzgwODY6ODA4Nl0NCglDb250
cm9sOiBJL08tIE1lbSsgQnVzTWFzdGVyKyBTcGVjQ3ljbGUtIE1lbVdJTlYtIFZHQVNub29wLSBQ
YXJFcnItIFN0ZXBwaW5nLSBTRVJSLSBGYXN0QjJCLSBEaXNJTlR4LQ0KCVN0YXR1czogQ2FwLSA2
Nk1Iei0gVURGLSBGYXN0QjJCLSBQYXJFcnItIERFVlNFTD1mYXN0ID5UQWJvcnQtIDxUQWJvcnQt
IDxNQWJvcnQtID5TRVJSLSA8UEVSUi0gSU5UeC0NCglMYXRlbmN5OiAwDQoNCmZmOjA1LjEgSG9z
dCBicmlkZ2UgWzA2MDBdOiBJbnRlbCBDb3Jwb3JhdGlvbiBYZW9uIDU1MDAvQ29yZSBpNyBJbnRl
Z3JhdGVkIE1lbW9yeSBDb250cm9sbGVyIENoYW5uZWwgMSBBZGRyZXNzIFJlZ2lzdGVycyBbODA4
NjoyYzI5XSAocmV2IDA1KQ0KCVN1YnN5c3RlbTogSW50ZWwgQ29ycG9yYXRpb24gRGV2aWNlIFs4
MDg2OjgwODZdDQoJQ29udHJvbDogSS9PLSBNZW0rIEJ1c01hc3RlcisgU3BlY0N5Y2xlLSBNZW1X
SU5WLSBWR0FTbm9vcC0gUGFyRXJyLSBTdGVwcGluZy0gU0VSUi0gRmFzdEIyQi0gRGlzSU5UeC0N
CglTdGF0dXM6IENhcC0gNjZNSHotIFVERi0gRmFzdEIyQi0gUGFyRXJyLSBERVZTRUw9ZmFzdCA+
VEFib3J0LSA8VEFib3J0LSA8TUFib3J0LSA+U0VSUi0gPFBFUlItIElOVHgtDQoJTGF0ZW5jeTog
MA0KDQpmZjowNS4yIEhvc3QgYnJpZGdlIFswNjAwXTogSW50ZWwgQ29ycG9yYXRpb24gWGVvbiA1
NTAwL0NvcmUgaTcgSW50ZWdyYXRlZCBNZW1vcnkgQ29udHJvbGxlciBDaGFubmVsIDEgUmFuayBS
ZWdpc3RlcnMgWzgwODY6MmMyYV0gKHJldiAwNSkNCglTdWJzeXN0ZW06IEludGVsIENvcnBvcmF0
aW9uIERldmljZSBbODA4Njo4MDg2XQ0KCUNvbnRyb2w6IEkvTy0gTWVtKyBCdXNNYXN0ZXIrIFNw
ZWNDeWNsZS0gTWVtV0lOVi0gVkdBU25vb3AtIFBhckVyci0gU3RlcHBpbmctIFNFUlItIEZhc3RC
MkItIERpc0lOVHgtDQoJU3RhdHVzOiBDYXAtIDY2TUh6LSBVREYtIEZhc3RCMkItIFBhckVyci0g
REVWU0VMPWZhc3QgPlRBYm9ydC0gPFRBYm9ydC0gPE1BYm9ydC0gPlNFUlItIDxQRVJSLSBJTlR4
LQ0KCUxhdGVuY3k6IDANCg0KZmY6MDUuMyBIb3N0IGJyaWRnZSBbMDYwMF06IEludGVsIENvcnBv
cmF0aW9uIFhlb24gNTUwMC9Db3JlIGk3IEludGVncmF0ZWQgTWVtb3J5IENvbnRyb2xsZXIgQ2hh
bm5lbCAxIFRoZXJtYWwgQ29udHJvbCBSZWdpc3RlcnMgWzgwODY6MmMyYl0gKHJldiAwNSkNCglT
dWJzeXN0ZW06IEludGVsIENvcnBvcmF0aW9uIERldmljZSBbODA4Njo4MDg2XQ0KCUNvbnRyb2w6
IEkvTy0gTWVtKyBCdXNNYXN0ZXIrIFNwZWNDeWNsZS0gTWVtV0lOVi0gVkdBU25vb3AtIFBhckVy
ci0gU3RlcHBpbmctIFNFUlItIEZhc3RCMkItIERpc0lOVHgtDQoJU3RhdHVzOiBDYXAtIDY2TUh6
LSBVREYtIEZhc3RCMkItIFBhckVyci0gREVWU0VMPWZhc3QgPlRBYm9ydC0gPFRBYm9ydC0gPE1B
Ym9ydC0gPlNFUlItIDxQRVJSLSBJTlR4LQ0KCUxhdGVuY3k6IDANCg0KZmY6MDYuMCBIb3N0IGJy
aWRnZSBbMDYwMF06IEludGVsIENvcnBvcmF0aW9uIFhlb24gNTUwMC9Db3JlIGk3IEludGVncmF0
ZWQgTWVtb3J5IENvbnRyb2xsZXIgQ2hhbm5lbCAyIENvbnRyb2wgUmVnaXN0ZXJzIFs4MDg2OjJj
MzBdIChyZXYgMDUpDQoJU3Vic3lzdGVtOiBJbnRlbCBDb3Jwb3JhdGlvbiBEZXZpY2UgWzgwODY6
ODA4Nl0NCglDb250cm9sOiBJL08tIE1lbSsgQnVzTWFzdGVyKyBTcGVjQ3ljbGUtIE1lbVdJTlYt
IFZHQVNub29wLSBQYXJFcnItIFN0ZXBwaW5nLSBTRVJSLSBGYXN0QjJCLSBEaXNJTlR4LQ0KCVN0
YXR1czogQ2FwLSA2Nk1Iei0gVURGLSBGYXN0QjJCLSBQYXJFcnItIERFVlNFTD1mYXN0ID5UQWJv
cnQtIDxUQWJvcnQtIDxNQWJvcnQtID5TRVJSLSA8UEVSUi0gSU5UeC0NCglMYXRlbmN5OiAwDQoN
CmZmOjA2LjEgSG9zdCBicmlkZ2UgWzA2MDBdOiBJbnRlbCBDb3Jwb3JhdGlvbiBYZW9uIDU1MDAv
Q29yZSBpNyBJbnRlZ3JhdGVkIE1lbW9yeSBDb250cm9sbGVyIENoYW5uZWwgMiBBZGRyZXNzIFJl
Z2lzdGVycyBbODA4NjoyYzMxXSAocmV2IDA1KQ0KCVN1YnN5c3RlbTogSW50ZWwgQ29ycG9yYXRp
b24gRGV2aWNlIFs4MDg2OjgwODZdDQoJQ29udHJvbDogSS9PLSBNZW0rIEJ1c01hc3RlcisgU3Bl
Y0N5Y2xlLSBNZW1XSU5WLSBWR0FTbm9vcC0gUGFyRXJyLSBTdGVwcGluZy0gU0VSUi0gRmFzdEIy
Qi0gRGlzSU5UeC0NCglTdGF0dXM6IENhcC0gNjZNSHotIFVERi0gRmFzdEIyQi0gUGFyRXJyLSBE
RVZTRUw9ZmFzdCA+VEFib3J0LSA8VEFib3J0LSA8TUFib3J0LSA+U0VSUi0gPFBFUlItIElOVHgt
DQoJTGF0ZW5jeTogMA0KDQpmZjowNi4yIEhvc3QgYnJpZGdlIFswNjAwXTogSW50ZWwgQ29ycG9y
YXRpb24gWGVvbiA1NTAwL0NvcmUgaTcgSW50ZWdyYXRlZCBNZW1vcnkgQ29udHJvbGxlciBDaGFu
bmVsIDIgUmFuayBSZWdpc3RlcnMgWzgwODY6MmMzMl0gKHJldiAwNSkNCglTdWJzeXN0ZW06IElu
dGVsIENvcnBvcmF0aW9uIERldmljZSBbODA4Njo4MDg2XQ0KCUNvbnRyb2w6IEkvTy0gTWVtKyBC
dXNNYXN0ZXIrIFNwZWNDeWNsZS0gTWVtV0lOVi0gVkdBU25vb3AtIFBhckVyci0gU3RlcHBpbmct
IFNFUlItIEZhc3RCMkItIERpc0lOVHgtDQoJU3RhdHVzOiBDYXAtIDY2TUh6LSBVREYtIEZhc3RC
MkItIFBhckVyci0gREVWU0VMPWZhc3QgPlRBYm9ydC0gPFRBYm9ydC0gPE1BYm9ydC0gPlNFUlIt
IDxQRVJSLSBJTlR4LQ0KCUxhdGVuY3k6IDANCg0KZmY6MDYuMyBIb3N0IGJyaWRnZSBbMDYwMF06
IEludGVsIENvcnBvcmF0aW9uIFhlb24gNTUwMC9Db3JlIGk3IEludGVncmF0ZWQgTWVtb3J5IENv
bnRyb2xsZXIgQ2hhbm5lbCAyIFRoZXJtYWwgQ29udHJvbCBSZWdpc3RlcnMgWzgwODY6MmMzM10g
KHJldiAwNSkNCglTdWJzeXN0ZW06IEludGVsIENvcnBvcmF0aW9uIERldmljZSBbODA4Njo4MDg2
XQ0KCUNvbnRyb2w6IEkvTy0gTWVtKyBCdXNNYXN0ZXIrIFNwZWNDeWNsZS0gTWVtV0lOVi0gVkdB
U25vb3AtIFBhckVyci0gU3RlcHBpbmctIFNFUlItIEZhc3RCMkItIERpc0lOVHgtDQoJU3RhdHVz
OiBDYXAtIDY2TUh6LSBVREYtIEZhc3RCMkItIFBhckVyci0gREVWU0VMPWZhc3QgPlRBYm9ydC0g
PFRBYm9ydC0gPE1BYm9ydC0gPlNFUlItIDxQRVJSLSBJTlR4LQ0KCUxhdGVuY3k6IDANCg0K
--20cf3074d9a88caca204bd56ca3c
Content-Type: text/plain; charset=US-ASCII; name="xm-dmesg.txt"
Content-Disposition: attachment; filename="xm-dmesg.txt"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h0tzka2g4

KFhFTikgWGVuIHZlcnNpb24gNC4xLjIgKERlYmlhbiA0LjEuMi0yKSAod2FsZGlAZGViaWFuLm9y
ZykgKGdjYyB2ZXJzaW9uIDQuNi4yIChEZWJpYW4gNC42LjItNikgKSBTYXQgRGVjIDEwIDE5OjU4
OjIxIFVUQyAyMDExDQooWEVOKSBCb290bG9hZGVyOiBHUlVCIDEuOTktMTcNCihYRU4pIENvbW1h
bmQgbGluZTogcGxhY2Vob2xkZXIgaW9tbXVfaW5jbHVzaXZlX21hcHBpbmc9MSBpb21tdT12ZXJi
b3NlIGlvbW11PXdvcmthcm91bmRfYmlvc19idWcNCihYRU4pIFZpZGVvIGluZm9ybWF0aW9uOg0K
KFhFTikgIFZHQSBpcyB0ZXh0IG1vZGUgODB4MjUsIGZvbnQgOHgxNg0KKFhFTikgIFZCRS9EREMg
bWV0aG9kczogVjI7IEVESUQgdHJhbnNmZXIgdGltZTogMSBzZWNvbmRzDQooWEVOKSBEaXNjIGlu
Zm9ybWF0aW9uOg0KKFhFTikgIEZvdW5kIDggTUJSIHNpZ25hdHVyZXMNCihYRU4pICBGb3VuZCA2
IEVERCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzDQooWEVOKSBYZW4tZTgyMCBSQU0gbWFwOg0KKFhF
TikgIDAwMDAwMDAwMDAwMDAwMDAgLSAwMDAwMDAwMDAwMDllNDAwICh1c2FibGUpDQooWEVOKSAg
MDAwMDAwMDAwMDA5ZTQwMCAtIDAwMDAwMDAwMDAwYTAwMDAgKHJlc2VydmVkKQ0KKFhFTikgIDAw
MDAwMDAwMDAwZTJjMDAgLSAwMDAwMDAwMDAwMTAwMDAwIChyZXNlcnZlZCkNCihYRU4pICAwMDAw
MDAwMDAwMTAwMDAwIC0gMDAwMDAwMDBiZjc4MDAwMCAodXNhYmxlKQ0KKFhFTikgIDAwMDAwMDAw
YmY3ODAwMDAgLSAwMDAwMDAwMGJmNzk4MDAwIChBQ1BJIGRhdGEpDQooWEVOKSAgMDAwMDAwMDBi
Zjc5ODAwMCAtIDAwMDAwMDAwYmY3ZGEwMDAgKEFDUEkgTlZTKQ0KKFhFTikgIDAwMDAwMDAwYmY3
ZGEwMDAgLSAwMDAwMDAwMGMwMDAwMDAwIChyZXNlcnZlZCkNCihYRU4pICAwMDAwMDAwMGZlZTAw
MDAwIC0gMDAwMDAwMDBmZWUwMTAwMCAocmVzZXJ2ZWQpDQooWEVOKSAgMDAwMDAwMDBmZmUwMDAw
MCAtIDAwMDAwMDAxMDAwMDAwMDAgKHJlc2VydmVkKQ0KKFhFTikgIDAwMDAwMDAxMDAwMDAwMDAg
LSAwMDAwMDAwNDQwMDAwMDAwICh1c2FibGUpDQooWEVOKSBBQ1BJOiBSU0RQIDAwMEZCOTQwLCAw
MDE0IChyMCBBQ1BJQU0pDQooWEVOKSBBQ1BJOiBSU0RUIEJGNzgwMDAwLCAwMDQ4IChyMSAwODAy
MTEgUlNEVDE0MzYgMjAxMTA4MDIgTVNGVCAgICAgICA5NykNCihYRU4pIEFDUEk6IEZBQ1AgQkY3
ODAyMDAsIDAwODQgKHIxIDA4MDIxMSBGQUNQMTQzNiAyMDExMDgwMiBNU0ZUICAgICAgIDk3KQ0K
KFhFTikgQUNQSTogRFNEVCBCRjc4MDRCMCwgQzQ2OSAocjEgIEExNjgyIEExNjgyMDAxICAgICAg
ICAxIElOVEwgMjAwNjAxMTMpDQooWEVOKSBBQ1BJOiBGQUNTIEJGNzk4MDAwLCAwMDQwDQooWEVO
KSBBQ1BJOiBBUElDIEJGNzgwMzkwLCAwMEQ4IChyMSAwODAyMTEgQVBJQzE0MzYgMjAxMTA4MDIg
TVNGVCAgICAgICA5NykNCihYRU4pIEFDUEk6IE1DRkcgQkY3ODA0NzAsIDAwM0MgKHIxIDA4MDIx
MSBPRU1NQ0ZHICAyMDExMDgwMiBNU0ZUICAgICAgIDk3KQ0KKFhFTikgQUNQSTogT0VNQiBCRjc5
ODA0MCwgMDA3MiAocjEgMDgwMjExIE9FTUIxNDM2IDIwMTEwODAyIE1TRlQgICAgICAgOTcpDQoo
WEVOKSBBQ1BJOiBIUEVUIEJGNzhGNEIwLCAwMDM4IChyMSAwODAyMTEgT0VNSFBFVCAgMjAxMTA4
MDIgTVNGVCAgICAgICA5NykNCihYRU4pIEFDUEk6IERNQVIgQkY3OTgwQzAsIDAxNDAgKHIxICAg
IEFNSSAgT0VNRE1BUiAgICAgICAgMSBNU0ZUICAgICAgIDk3KQ0KKFhFTikgQUNQSTogQVNQVCBC
Rjc5ODRCMCwgMDAzNCAocjYgMDgwMjExIFBlcmZUdW5lIDIwMTEwODAyIE1TRlQgICAgICAgOTcp
DQooWEVOKSBBQ1BJOiBPU0ZSIEJGNzhGNEYwLCAwMEIwIChyMSAwODAyMTEgT0VNT1NGUiAgMjAx
MTA4MDIgTVNGVCAgICAgICA5NykNCihYRU4pIEFDUEk6IFNTRFQgQkY3OUE5NDAsIDAzNjMgKHIx
IERwZ1BtbSAgICBDcHVQbSAgICAgICAxMiBJTlRMIDIwMDYwMTEzKQ0KKFhFTikgU3lzdGVtIFJB
TTogMTYzNzVNQiAoMTY3NjgxMjBrQikNCihYRU4pIERvbWFpbiBoZWFwIGluaXRpYWxpc2VkDQoo
WEVOKSBQcm9jZXNzb3IgIzAgNzoxMCBBUElDIHZlcnNpb24gMjENCihYRU4pIFByb2Nlc3NvciAj
MiA3OjEwIEFQSUMgdmVyc2lvbiAyMQ0KKFhFTikgUHJvY2Vzc29yICM0IDc6MTAgQVBJQyB2ZXJz
aW9uIDIxDQooWEVOKSBQcm9jZXNzb3IgIzYgNzoxMCBBUElDIHZlcnNpb24gMjENCihYRU4pIFBy
b2Nlc3NvciAjMSA3OjEwIEFQSUMgdmVyc2lvbiAyMQ0KKFhFTikgUHJvY2Vzc29yICMzIDc6MTAg
QVBJQyB2ZXJzaW9uIDIxDQooWEVOKSBQcm9jZXNzb3IgIzUgNzoxMCBBUElDIHZlcnNpb24gMjEN
CihYRU4pIFByb2Nlc3NvciAjNyA3OjEwIEFQSUMgdmVyc2lvbiAyMQ0KKFhFTikgSU9BUElDWzBd
OiBhcGljX2lkIDgsIHZlcnNpb24gMzIsIGFkZHJlc3MgMHhmZWMwMDAwMCwgR1NJIDAtMjMNCihY
RU4pIElPQVBJQ1sxXTogYXBpY19pZCA5LCB2ZXJzaW9uIDMyLCBhZGRyZXNzIDB4ZmVjOGEwMDAs
IEdTSSAyNC00Nw0KKFhFTikgRW5hYmxpbmcgQVBJQyBtb2RlOiAgRmxhdC4gIFVzaW5nIDIgSS9P
IEFQSUNzDQooWEVOKSBbVlQtRF1kbWFyLmM6NzA0OiBIb3N0IGFkZHJlc3Mgd2lkdGggMzkNCihY
RU4pIFtWVC1EXWRtYXIuYzo3MTk6IGZvdW5kIEFDUElfRE1BUl9EUkhEOg0KKFhFTikgW1ZULURd
ZG1hci5jOjQxMzogICBkbWFydS0+YWRkcmVzcyA9IGZiZmZmMDAwDQooWEVOKSBbVlQtRF1pb21t
dS5jOjExMjI6IGRyaGQtPmFkZHJlc3MgPSBmYmZmZjAwMCBpb21tdS0+cmVnID0gZmZmZjgyYzNm
ZmY1NzAwMA0KKFhFTikgW1ZULURdaW9tbXUuYzoxMTI0OiBjYXAgPSBjOTAwODAxMGU2MDI2MiBl
Y2FwID0gZjAyMDdhDQooWEVOKSBbVlQtRF1kbWFyLmM6MzQxOiAgIGVuZHBvaW50OiAwOjFiLjAN
CihYRU4pIFtWVC1EXWRtYXIuYzo3MTk6IGZvdW5kIEFDUElfRE1BUl9EUkhEOg0KKFhFTikgW1ZU
LURdZG1hci5jOjQxMzogICBkbWFydS0+YWRkcmVzcyA9IGZiZmZlMDAwDQooWEVOKSBbVlQtRF1p
b21tdS5jOjExMjI6IGRyaGQtPmFkZHJlc3MgPSBmYmZmZTAwMCBpb21tdS0+cmVnID0gZmZmZjgy
YzNmZmY1NjAwMA0KKFhFTikgW1ZULURdaW9tbXUuYzoxMTI0OiBjYXAgPSBjOTA3ODAxMDZmMDQ2
MiBlY2FwID0gZjAyMGZlDQooWEVOKSBbVlQtRF1kbWFyLmM6MzU2OiAgIElPQVBJQzogZjA6MWYu
Nw0KKFhFTikgW1ZULURdZG1hci5jOjM1NjogICBJT0FQSUM6IDA6MTMuMA0KKFhFTikgW1ZULURd
ZG1hci5jOjQyNzogICBmbGFnczogSU5DTFVERV9BTEwNCihYRU4pIFtWVC1EXWRtYXIuYzo3MjQ6
IGZvdW5kIEFDUElfRE1BUl9STVJSOg0KKFhFTikgW1ZULURdZG1hci5jOjM0MTogICBlbmRwb2lu
dDogMDoxZC4wDQooWEVOKSBbVlQtRF1kbWFyLmM6MzQxOiAgIGVuZHBvaW50OiAwOjFkLjENCihY
RU4pIFtWVC1EXWRtYXIuYzozNDE6ICAgZW5kcG9pbnQ6IDA6MWQuMg0KKFhFTikgW1ZULURdZG1h
ci5jOjM0MTogICBlbmRwb2ludDogMDoxZC43DQooWEVOKSBbVlQtRF1kbWFyLmM6MzQxOiAgIGVu
ZHBvaW50OiAwOjFhLjANCihYRU4pIFtWVC1EXWRtYXIuYzozNDE6ICAgZW5kcG9pbnQ6IDA6MWEu
MQ0KKFhFTikgW1ZULURdZG1hci5jOjM0MTogICBlbmRwb2ludDogMDoxYS4yDQooWEVOKSBbVlQt
RF1kbWFyLmM6MzQxOiAgIGVuZHBvaW50OiAwOjFhLjcNCihYRU4pIFtWVC1EXWRtYXIuYzo1OTU6
ICAgUk1SUiByZWdpb246IGJhc2VfYWRkciBlYzAwMCBlbmRfYWRkcmVzcyBlZmZmZg0KKFhFTikg
W1ZULURdZG1hci5jOjcyNDogZm91bmQgQUNQSV9ETUFSX1JNUlI6DQooWEVOKSBbVlQtRF1kbWFy
LmM6NTI4OiAgIFJNUlIgYWRkcmVzcyByYW5nZSBub3QgaW4gcmVzZXJ2ZWQgbWVtb3J5IGJhc2Ug
PSBiZjdkYTAwMCBlbmQgPSBiZjdkOWZmZjsgaW9tbXVfaW5jbHVzaXZlX21hcHBpbmc9MSBwYXJh
bWV0ZXIgbWF5IGJlIG5lZWRlZC4NCihYRU4pIFtWVC1EXWRtYXIuYzozNDE6ICAgZW5kcG9pbnQ6
IDA6MWQuMA0KKFhFTikgW1ZULURdZG1hci5jOjM0MTogICBlbmRwb2ludDogMDoxZC4xDQooWEVO
KSBbVlQtRF1kbWFyLmM6MzQxOiAgIGVuZHBvaW50OiAwOjFkLjINCihYRU4pIFtWVC1EXWRtYXIu
YzozNDE6ICAgZW5kcG9pbnQ6IDA6MWQuNw0KKFhFTikgW1ZULURdZG1hci5jOjM0MTogICBlbmRw
b2ludDogMDoxYS4wDQooWEVOKSBbVlQtRF1kbWFyLmM6MzQxOiAgIGVuZHBvaW50OiAwOjFhLjEN
CihYRU4pIFtWVC1EXWRtYXIuYzozNDE6ICAgZW5kcG9pbnQ6IDA6MWEuMg0KKFhFTikgW1ZULURd
ZG1hci5jOjM0MTogICBlbmRwb2ludDogMDoxYS43DQooWEVOKSBbVlQtRF1kbWFyLmM6NTg1OiAg
IFRoZSBSTVJSIChiZjdkYTAwMCwgYmY3ZDlmZmYpIGlzIGluY29ycmVjdCENCihYRU4pIEZhaWxl
ZCB0byBwYXJzZSBBQ1BJIERNQVIuICBEaXNhYmxpbmcgVlQtZC4NCihYRU4pIFRhYmxlIGlzIG5v
dCBmb3VuZCENCihYRU4pIFVzaW5nIHNjaGVkdWxlcjogU01QIENyZWRpdCBTY2hlZHVsZXIgKGNy
ZWRpdCkNCihYRU4pIERldGVjdGVkIDMyMDcuMzM2IE1IeiBwcm9jZXNzb3IuDQooWEVOKSBJbml0
aW5nIG1lbW9yeSBzaGFyaW5nLg0KKFhFTikgSS9PIHZpcnR1YWxpc2F0aW9uIGRpc2FibGVkDQoo
WEVOKSBFTkFCTElORyBJTy1BUElDIElSUXMNCihYRU4pICAtPiBVc2luZyBuZXcgQUNLIG1ldGhv
ZA0KKFhFTikgUGxhdGZvcm0gdGltZXIgaXMgMTQuMzE4TUh6IEhQRVQNCihYRU4pIEFsbG9jYXRl
ZCBjb25zb2xlIHJpbmcgb2YgMTYgS2lCLg0KKFhFTikgVk1YOiBTdXBwb3J0ZWQgYWR2YW5jZWQg
ZmVhdHVyZXM6DQooWEVOKSAgLSBBUElDIE1NSU8gYWNjZXNzIHZpcnR1YWxpc2F0aW9uDQooWEVO
KSAgLSBBUElDIFRQUiBzaGFkb3cNCihYRU4pICAtIEV4dGVuZGVkIFBhZ2UgVGFibGVzIChFUFQp
DQooWEVOKSAgLSBWaXJ0dWFsLVByb2Nlc3NvciBJZGVudGlmaWVycyAoVlBJRCkNCihYRU4pICAt
IFZpcnR1YWwgTk1JDQooWEVOKSAgLSBNU1IgZGlyZWN0LWFjY2VzcyBiaXRtYXANCihYRU4pIEVQ
VCBzdXBwb3J0cyAyTUIgc3VwZXIgcGFnZS4NCihYRU4pIEhWTTogQVNJRHMgZW5hYmxlZC4NCihY
RU4pIEhWTTogVk1YIGVuYWJsZWQNCihYRU4pIEhWTTogSGFyZHdhcmUgQXNzaXN0ZWQgUGFnaW5n
IGRldGVjdGVkLg0KKFhFTikgQnJvdWdodCB1cCA4IENQVXMNCihYRU4pICoqKiBMT0FESU5HIERP
TUFJTiAwICoqKg0KKFhFTikgIFhlbiAga2VybmVsOiA2NC1iaXQsIGxzYiwgY29tcGF0MzINCihY
RU4pICBEb20wIGtlcm5lbDogNjQtYml0LCBQQUUsIGxzYiwgcGFkZHIgMHgxMDAwMDAwIC0+IDB4
MTkzYTAwMA0KKFhFTikgUEhZU0lDQUwgTUVNT1JZIEFSUkFOR0VNRU5UOg0KKFhFTikgIERvbTAg
YWxsb2MuOiAgIDAwMDAwMDA0MmMwMDAwMDAtPjAwMDAwMDA0MzAwMDAwMDAgKDQwODgzOTAgcGFn
ZXMgdG8gYmUgYWxsb2NhdGVkKQ0KKFhFTikgIEluaXQuIHJhbWRpc2s6IDAwMDAwMDA0M2UwYzkw
MDAtPjAwMDAwMDA0M2ZmZmY0MDANCihYRU4pIFZJUlRVQUwgTUVNT1JZIEFSUkFOR0VNRU5UOg0K
KFhFTikgIExvYWRlZCBrZXJuZWw6IGZmZmZmZmZmODEwMDAwMDAtPmZmZmZmZmZmODE5M2EwMDAN
CihYRU4pICBJbml0LiByYW1kaXNrOiBmZmZmZmZmZjgxOTNhMDAwLT5mZmZmZmZmZjgzODcwNDAw
DQooWEVOKSAgUGh5cy1NYWNoIG1hcDogZmZmZmZmZmY4Mzg3MTAwMC0+ZmZmZmZmZmY4NTdkMWJl
OA0KKFhFTikgIFN0YXJ0IGluZm86ICAgIGZmZmZmZmZmODU3ZDIwMDAtPmZmZmZmZmZmODU3ZDI0
YjQNCihYRU4pICBQYWdlIHRhYmxlczogICBmZmZmZmZmZjg1N2QzMDAwLT5mZmZmZmZmZjg1ODA0
MDAwDQooWEVOKSAgQm9vdCBzdGFjazogICAgZmZmZmZmZmY4NTgwNDAwMC0+ZmZmZmZmZmY4NTgw
NTAwMA0KKFhFTikgIFRPVEFMOiAgICAgICAgIGZmZmZmZmZmODAwMDAwMDAtPmZmZmZmZmZmODVj
MDAwMDANCihYRU4pICBFTlRSWSBBRERSRVNTOiBmZmZmZmZmZjgxNmE5MjAwDQooWEVOKSBEb20w
IGhhcyBtYXhpbXVtIDggVkNQVXMNCihYRU4pIFNjcnViYmluZyBGcmVlIFJBTTogLmRvbmUuDQoo
WEVOKSBYZW4gdHJhY2UgYnVmZmVyczogZGlzYWJsZWQNCihYRU4pIFN0ZC4gTG9nbGV2ZWw6IEVy
cm9ycyBhbmQgd2FybmluZ3MNCihYRU4pIEd1ZXN0IExvZ2xldmVsOiBOb3RoaW5nIChSYXRlLWxp
bWl0ZWQ6IEVycm9ycyBhbmQgd2FybmluZ3MpDQooWEVOKSBYZW4gaXMgcmVsaW5xdWlzaGluZyBW
R0EgY29uc29sZS4NCihYRU4pICoqKiBTZXJpYWwgaW5wdXQgLT4gRE9NMCAodHlwZSAnQ1RSTC1h
JyB0aHJlZSB0aW1lcyB0byBzd2l0Y2ggaW5wdXQgdG8gWGVuKQ0KKFhFTikgRnJlZWQgMjE2a0Ig
aW5pdCBtZW1vcnkuDQooWEVOKSBwaHlzZGV2LmM6MTU1OiBkb20wOiB3cm9uZyBtYXBfcGlycSB0
eXBlIDMNCg==
--20cf3074d9a88caca204bd56ca3c
Content-Type: text/plain; charset=US-ASCII; name="xm-info.txt"
Content-Disposition: attachment; filename="xm-info.txt"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h0tzkedo5

aG9zdCAgICAgICAgICAgICAgICAgICA6IGczM2sNCnJlbGVhc2UgICAgICAgICAgICAgICAgOiAz
LjIuMC0xLWFtZDY0DQp2ZXJzaW9uICAgICAgICAgICAgICAgIDogIzEgU01QIEZyaSBGZWIgMTcg
MDU6MTc6MzYgVVRDIDIwMTINCm1hY2hpbmUgICAgICAgICAgICAgICAgOiB4ODZfNjQNCm5yX2Nw
dXMgICAgICAgICAgICAgICAgOiA4DQpucl9ub2RlcyAgICAgICAgICAgICAgIDogMQ0KY29yZXNf
cGVyX3NvY2tldCAgICAgICA6IDQNCnRocmVhZHNfcGVyX2NvcmUgICAgICAgOiAyDQpjcHVfbWh6
ICAgICAgICAgICAgICAgIDogMzIwNw0KaHdfY2FwcyAgICAgICAgICAgICAgICA6IGJmZWJmYmZm
OjI4MTAwODAwOjAwMDAwMDAwOjAwMDAzYjQwOjAwOThlM2JkOjAwMDAwMDAwOjAwMDAwMDAxOjAw
MDAwMDAwDQp2aXJ0X2NhcHMgICAgICAgICAgICAgIDogaHZtDQp0b3RhbF9tZW1vcnkgICAgICAg
ICAgIDogMTYzNzUNCmZyZWVfbWVtb3J5ICAgICAgICAgICAgOiAxMTYxDQpmcmVlX2NwdXMgICAg
ICAgICAgICAgIDogMA0KeGVuX21ham9yICAgICAgICAgICAgICA6IDQNCnhlbl9taW5vciAgICAg
ICAgICAgICAgOiAxDQp4ZW5fZXh0cmEgICAgICAgICAgICAgIDogLjINCnhlbl9jYXBzICAgICAg
ICAgICAgICAgOiB4ZW4tMy4wLXg4Nl82NCB4ZW4tMy4wLXg4Nl8zMnAgaHZtLTMuMC14ODZfMzIg
aHZtLTMuMC14ODZfMzJwIGh2bS0zLjAteDg2XzY0IA0KeGVuX3NjaGVkdWxlciAgICAgICAgICA6
IGNyZWRpdA0KeGVuX3BhZ2VzaXplICAgICAgICAgICA6IDQwOTYNCnBsYXRmb3JtX3BhcmFtcyAg
ICAgICAgOiB2aXJ0X3N0YXJ0PTB4ZmZmZjgwMDAwMDAwMDAwMA0KeGVuX2NoYW5nZXNldCAgICAg
ICAgICA6IHVuYXZhaWxhYmxlDQp4ZW5fY29tbWFuZGxpbmUgICAgICAgIDogcGxhY2Vob2xkZXIg
aW9tbXVfaW5jbHVzaXZlX21hcHBpbmc9MSBpb21tdT12ZXJib3NlIGlvbW11PXdvcmthcm91bmRf
Ymlvc19idWcNCmNjX2NvbXBpbGVyICAgICAgICAgICAgOiBnY2MgdmVyc2lvbiA0LjYuMiAoRGVi
aWFuIDQuNi4yLTYpIA0KY2NfY29tcGlsZV9ieSAgICAgICAgICA6IHdhbGRpDQpjY19jb21waWxl
X2RvbWFpbiAgICAgIDogZGViaWFuLm9yZw0KY2NfY29tcGlsZV9kYXRlICAgICAgICA6IFNhdCBE
ZWMgMTAgMTk6NTg6MjEgVVRDIDIwMTENCnhlbmRfY29uZmlnX2Zvcm1hdCAgICAgOiA0DQo=
--20cf3074d9a88caca204bd56ca3c
Content-Type: application/octet-stream; name="XMAR.dat"
Content-Disposition: attachment; filename="XMAR.dat"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h0u21i7o6

WE1BUkABAAABL0FNSQAAAE9FTURNQVIAAQAAAE1TRlSXAAAAJgEAAAAAAAAAAAAAAAAYAAAAAAAA
8P/7AAAAAAEIAAAAABsAAAAgAAEAAAAA4P/7AAAAAAMIAAAI8B8HAwgAAAkAEwABAFgAAAAAAADA
DgAAAAAA//8OAAAAAAABCAAAAAAdAAEIAAAAAB0BAQgAAAAAHQIBCAAAAAAdBwEIAAAAABoAAQgA
AAAAGgEBCAAAAAAaAgEIAAAAABoHAQBYAAAAAAAAoH2/AAAAAP+ffb8AAAAAAQgAAAAAHQABCAAA
AAAdAQEIAAAAAB0CAQgAAAAAHQcBCAAAAAAaAAEIAAAAABoBAQgAAAAAGgIBCAAAAAAaBwIAKAAA
AAAAAggAAAAAAQACCAAAAAACAAIIAAAAAAMAAggAAAAABwA=
--20cf3074d9a88caca204bd56ca3c
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-users mailing list
Xen-users@lists.xen.org
http://lists.xen.org/xen-users
--20cf3074d9a88caca204bd56ca3c--


From xen-devel-bounces@lists.xen.org Wed Apr 11 19:52:51 2012
Return-path: <xen-devel-bounces@lists.xen.org>
Envelope-to: archives@lists.xen.org
Delivery-date: Wed, 11 Apr 2012 19:52:51 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xen.org>)
	id 1SI3aQ-0007MV-8x; Wed, 11 Apr 2012 19:52:14 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <atarutin@orionsbelt.net>) id 1SI3aM-0007MN-KP
	for xen-devel@lists.xen.org; Wed, 11 Apr 2012 19:52:11 +0000
Received: from [85.158.143.35:40680] by server-3.bemta-4.messagelabs.com id
	1F/B2-05853-9E0E58F4; Wed, 11 Apr 2012 19:52:09 +0000
X-Env-Sender: atarutin@orionsbelt.net
X-Msg-Ref: server-13.tower-21.messagelabs.com!1334173919!14099362!1
X-Originating-IP: [209.85.212.45]
X-SpamReason: No, hits=1.7 required=7.0 tests=BODY_RANDOM_LONG,
	HTML_20_30,HTML_MESSAGE,RCVD_BY_IP
X-StarScan-Version: 6.5.7; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10693 invoked from network); 11 Apr 2012 19:52:00 -0000
Received: from mail-vb0-f45.google.com (HELO mail-vb0-f45.google.com)
	(209.85.212.45)
	by server-13.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Apr 2012 19:52:00 -0000
Received: by vbbfs19 with SMTP id fs19so1153605vbb.32
	for <xen-devel@lists.xen.org>; Wed, 11 Apr 2012 12:51:59 -0700 (PDT)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=google.com; s=20120113;
	h=mime-version:x-originating-ip:from:date:message-id:subject:to
	:content-type:x-gm-message-state;
	bh=+zzlpDBP9c4CbcIxexmlwbfUNMfvdjAQp0028P+OydA=;
	b=MM1hH5pf3OlIs0bvaG5v6aaCeonjMrqbTwMSAyV/KfPm4XMzVRpPRrASWEVeSwoW5d
	vflfyTyj9BCd2MbKmCkMUd95PfFjKB6eV6mTH1jH0qsRaUHbl/aclOwAUT3KGsQTMkxf
	ogfldClqH3z7TUxxRic2D6wlT9gBfE47csEyLFtOAwvcbzUE7d5PXf449ol7VhP1Br3f
	XtEh0XLuK3D/6hKAd2hUK4jSMyj9BSkNVFtGy6acb7puGf1BCNCtswERDYfooB8U3YPJ
	O3K771WiLayIa6pvPfpt+1/xsDfwAI4UZZ1tjgGzYTNhAcQ1eEW+g3y9afhmLtLZ6plm
	fGwg==
Received: by 10.220.35.73 with SMTP id o9mr9064032vcd.74.1334173919355; Wed,
	11 Apr 2012 12:51:59 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.220.108.66 with HTTP; Wed, 11 Apr 2012 12:51:39 -0700 (PDT)
X-Originating-IP: [173.220.219.178]
From: Aleksandr Tarutin <atarutin@orionsbelt.net>
Date: Wed, 11 Apr 2012 15:51:39 -0400
Message-ID: <CAO9X3SiEk1RE+Zi=w3yWutvRpGGUpcyaLptVB0Um-dtK0oKzdg@mail.gmail.com>
To: xen-devel@lists.xen.org
Content-Type: multipart/mixed; boundary=485b393aaadf88221704bd6c92bc
X-Gm-Message-State: ALoCoQl+tceWkxUrnzdA5bzfHrzLsvSqNtFhgfh7ZGcW5Ub+IeRBhPEeZ322bE5j7TvbvUU3VlFV
Subject: [Xen-devel] PCI Passthrough of SAS controller not working
X-BeenThere: xen-devel@lists.xen.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xen.org>
List-Unsubscribe: <http://lists.xen.org/cgi-bin/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xen.org?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xen.org>
List-Help: <mailto:xen-devel-request@lists.xen.org?subject=help>
List-Subscribe: <http://lists.xen.org/cgi-bin/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xen.org?subject=subscribe>
Sender: xen-devel-bounces@lists.xen.org
Errors-To: xen-devel-bounces@lists.xen.org

--485b393aaadf88221704bd6c92bc
Content-Type: multipart/alternative; boundary=485b393aaadf88220c04bd6c92ba

--485b393aaadf88220c04bd6c92ba
Content-Type: text/plain; charset=ISO-8859-1

Hello.

I tried to setup PCI Passthrough of a SAS controller into a PVHVM domU. The
device was present in the domU but its modules wouldn't load.

The first related thing was the following message in the guest BIOS just
before grub starts:
MPT BIOS Fault 09h encountered at adapter PCI(00h,05h,00h).

I'm attaching the xm dmesg and dmesg from both the host and a guest as well
as lspci -v.

-- 
AT.

--485b393aaadf88220c04bd6c92ba
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hello.<div><br></div><div>I tried to setup PCI Passthrough of a SAS control=
ler into a PVHVM domU. The device was present in the domU but its modules w=
ouldn&#39;t load.</div><div><br></div><div>The first related thing was the =
following message in the guest BIOS just before grub starts:</div>

<div><div>MPT BIOS Fault 09h encountered at adapter=A0PCI(00h,05h,00h).</di=
v><div><br></div><div>I&#39;m attaching the xm dmesg and dmesg from both th=
e host and a guest as well as lspci -v.</div><div><br></div>-- <br><div>
AT.</div>
<br>
</div>

--485b393aaadf88220c04bd6c92ba--
--485b393aaadf88221704bd6c92bc
Content-Type: text/plain; charset=US-ASCII; name="dom0_dmesg.txt"
Content-Disposition: attachment; filename="dom0_dmesg.txt"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h0wso6940

WyAgICAwLjAwMDAwMF0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgY3B1c2V0ClsgICAgMC4w
MDAwMDBdIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIGNwdQpbICAgIDAuMDAwMDAwXSBMaW51
eCB2ZXJzaW9uIDMuMi4wLTIwLWdlbmVyaWMgKGJ1aWxkZEBhbGxzcGljZSkgKGdjYyB2ZXJzaW9u
IDQuNi4zIChVYnVudHUvTGluYXJvIDQuNi4zLTF1YnVudHUzKSApICMzMy1VYnVudHUgU01QIFR1
ZSBNYXIgMjcgMTY6NDI6MjYgVVRDIDIwMTIgKFVidW50dSAzLjIuMC0yMC4zMy1nZW5lcmljIDMu
Mi4xMikKWyAgICAwLjAwMDAwMF0gQ29tbWFuZCBsaW5lOiBwbGFjZWhvbGRlciByb290PS9kZXYv
bWFwcGVyL1ZTeXN0ZW0wMS1sdlhlbjAyIHJvIGVhcmx5cHJpbnRrPXhlbiBpbml0Y2FsbF9kZWJ1
ZyBkZWJ1ZyBsb2dsZXZlbD0xMCBtc2k9MQpbICAgIDAuMDAwMDAwXSBLRVJORUwgc3VwcG9ydGVk
IGNwdXM6ClsgICAgMC4wMDAwMDBdICAgSW50ZWwgR2VudWluZUludGVsClsgICAgMC4wMDAwMDBd
ICAgQU1EIEF1dGhlbnRpY0FNRApbICAgIDAuMDAwMDAwXSAgIENlbnRhdXIgQ2VudGF1ckhhdWxz
ClsgICAgMC4wMDAwMDBdIEZyZWVpbmcgIDhkLTEwMCBwZm4gcmFuZ2U6IDExNSBwYWdlcyBmcmVl
ZApbICAgIDAuMDAwMDAwXSAxLTEgbWFwcGluZyBvbiA4ZC0+MTAwClsgICAgMC4wMDAwMDBdIDEt
MSBtYXBwaW5nIG9uIGJlN2E1LT5iZjRhZApbICAgIDAuMDAwMDAwXSAxLTEgbWFwcGluZyBvbiBi
ZjRhZi0+YmY1NzYKWyAgICAwLjAwMDAwMF0gMS0xIG1hcHBpbmcgb24gYmY4MDAtPjEwMDAwMApb
ICAgIDAuMDAwMDAwXSBSZWxlYXNlZCAxMTUgcGFnZXMgb2YgdW51c2VkIG1lbW9yeQpbICAgIDAu
MDAwMDAwXSBTZXQgMjY3ODQyIHBhZ2UocykgdG8gMS0xIG1hcHBpbmcKWyAgICAwLjAwMDAwMF0g
QklPUy1wcm92aWRlZCBwaHlzaWNhbCBSQU0gbWFwOgpbICAgIDAuMDAwMDAwXSAgWGVuOiAwMDAw
MDAwMDAwMDAwMDAwIC0gMDAwMDAwMDAwMDA4ZDAwMCAodXNhYmxlKQpbICAgIDAuMDAwMDAwXSAg
WGVuOiAwMDAwMDAwMDAwMDhkMDAwIC0gMDAwMDAwMDAwMDEwMDAwMCAocmVzZXJ2ZWQpClsgICAg
MC4wMDAwMDBdICBYZW46IDAwMDAwMDAwMDAxMDAwMDAgLSAwMDAwMDAwMGJlN2E1MDAwICh1c2Fi
bGUpClsgICAgMC4wMDAwMDBdICBYZW46IDAwMDAwMDAwYmU3YTUwMDAgLSAwMDAwMDAwMGJlN2Yx
MDAwIChBQ1BJIE5WUykKWyAgICAwLjAwMDAwMF0gIFhlbjogMDAwMDAwMDBiZTdmMTAwMCAtIDAw
MDAwMDAwYmU3ZjkwMDAgKEFDUEkgZGF0YSkKWyAgICAwLjAwMDAwMF0gIFhlbjogMDAwMDAwMDBi
ZTdmOTAwMCAtIDAwMDAwMDAwYmY0NzcwMDAgKHJlc2VydmVkKQpbICAgIDAuMDAwMDAwXSAgWGVu
OiAwMDAwMDAwMGJmNDc3MDAwIC0gMDAwMDAwMDBiZjQ3ODAwMCAoQUNQSSBOVlMpClsgICAgMC4w
MDAwMDBdICBYZW46IDAwMDAwMDAwYmY0NzgwMDAgLSAwMDAwMDAwMGJmNDg5MDAwIChyZXNlcnZl
ZCkKWyAgICAwLjAwMDAwMF0gIFhlbjogMDAwMDAwMDBiZjQ4OTAwMCAtIDAwMDAwMDAwYmY0OGMw
MDAgKEFDUEkgTlZTKQpbICAgIDAuMDAwMDAwXSAgWGVuOiAwMDAwMDAwMGJmNDhjMDAwIC0gMDAw
MDAwMDBiZjRhZDAwMCAocmVzZXJ2ZWQpClsgICAgMC4wMDAwMDBdICBYZW46IDAwMDAwMDAwYmY0
YWQwMDAgLSAwMDAwMDAwMGJmNGFmMDAwICh1c2FibGUpClsgICAgMC4wMDAwMDBdICBYZW46IDAw
MDAwMDAwYmY0YWYwMDAgLSAwMDAwMDAwMGJmNTAzMDAwIChyZXNlcnZlZCkKWyAgICAwLjAwMDAw
MF0gIFhlbjogMDAwMDAwMDBiZjUwMzAwMCAtIDAwMDAwMDAwYmY1MGQwMDAgKEFDUEkgTlZTKQpb
ICAgIDAuMDAwMDAwXSAgWGVuOiAwMDAwMDAwMGJmNTBkMDAwIC0gMDAwMDAwMDBiZjUzMzAwMCAo
cmVzZXJ2ZWQpClsgICAgMC4wMDAwMDBdICBYZW46IDAwMDAwMDAwYmY1MzMwMDAgLSAwMDAwMDAw
MGJmNTc2MDAwIChBQ1BJIE5WUykKWyAgICAwLjAwMDAwMF0gIFhlbjogMDAwMDAwMDBiZjU3NjAw
MCAtIDAwMDAwMDAwYmY4MDAwMDAgKHVzYWJsZSkKWyAgICAwLjAwMDAwMF0gIFhlbjogMDAwMDAw
MDBmZWMwMDAwMCAtIDAwMDAwMDAwZmVjMDEwMDAgKHJlc2VydmVkKQpbICAgIDAuMDAwMDAwXSAg
WGVuOiAwMDAwMDAwMGZlZDFjMDAwIC0gMDAwMDAwMDBmZWQ0MDAwMCAocmVzZXJ2ZWQpClsgICAg
MC4wMDAwMDBdICBYZW46IDAwMDAwMDAwZmVlMDAwMDAgLSAwMDAwMDAwMGZlZTAxMDAwIChyZXNl
cnZlZCkKWyAgICAwLjAwMDAwMF0gIFhlbjogMDAwMDAwMDBmZjAwMDAwMCAtIDAwMDAwMDAxMDAw
MDAwMDAgKHJlc2VydmVkKQpbICAgIDAuMDAwMDAwXSAgWGVuOiAwMDAwMDAwMTAwMDAwMDAwIC0g
MDAwMDAwMDMwMTVjZjAwMCAodXNhYmxlKQpbICAgIDAuMDAwMDAwXSAgWGVuOiAwMDAwMDAwMzAx
NWNmMDAwIC0gMDAwMDAwMDQ0MDAwMDAwMCAodW51c2FibGUpClsgICAgMC4wMDAwMDBdIGJvb3Rj
b25zb2xlIFt4ZW5ib290MF0gZW5hYmxlZApbICAgIDAuMDAwMDAwXSBOWCAoRXhlY3V0ZSBEaXNh
YmxlKSBwcm90ZWN0aW9uOiBhY3RpdmUKWyAgICAwLjAwMDAwMF0gRE1JIDIuNyBwcmVzZW50Lgpb
ICAgIDAuMDAwMDAwXSBETUk6IFN1cGVybWljcm8gWDlTQ0wvWDlTQ00vWDlTQ0wvWDlTQ00sIEJJ
T1MgMS4xYSAwOS8yOC8yMDExClsgICAgMC4wMDAwMDBdIGU4MjAgdXBkYXRlIHJhbmdlOiAwMDAw
MDAwMDAwMDAwMDAwIC0gMDAwMDAwMDAwMDAxMDAwMCAodXNhYmxlKSA9PT4gKHJlc2VydmVkKQpb
ICAgIDAuMDAwMDAwXSBlODIwIHJlbW92ZSByYW5nZTogMDAwMDAwMDAwMDBhMDAwMCAtIDAwMDAw
MDAwMDAxMDAwMDAgKHVzYWJsZSkKWyAgICAwLjAwMDAwMF0gTm8gQUdQIGJyaWRnZSBmb3VuZApb
ICAgIDAuMDAwMDAwXSBsYXN0X3BmbiA9IDB4MzAxNWNmIG1heF9hcmNoX3BmbiA9IDB4NDAwMDAw
MDAwClsgICAgMC4wMDAwMDBdIHgyYXBpYyBlbmFibGVkIGJ5IEJJT1MsIHN3aXRjaGluZyB0byB4
MmFwaWMgb3BzClsgICAgMC4wMDAwMDBdIGxhc3RfcGZuID0gMHhiZjgwMCBtYXhfYXJjaF9wZm4g
PSAweDQwMDAwMDAwMApbICAgIDAuMDAwMDAwXSBmb3VuZCBTTVAgTVAtdGFibGUgYXQgW2ZmZmY4
ODAwMDAwZmNlMDBdIGZjZTAwClsgICAgMC4wMDAwMDBdIGluaXRpYWwgbWVtb3J5IG1hcHBlZCA6
IDAgLSAwNDg2NDAwMApbICAgIDAuMDAwMDAwXSBCYXNlIG1lbW9yeSB0cmFtcG9saW5lIGF0IFtm
ZmZmODgwMDAwMDg4MDAwXSA4ODAwMCBzaXplIDIwNDgwClsgICAgMC4wMDAwMDBdIGluaXRfbWVt
b3J5X21hcHBpbmc6IDAwMDAwMDAwMDAwMDAwMDAtMDAwMDAwMDBiZjgwMDAwMApbICAgIDAuMDAw
MDAwXSAgMDAwMDAwMDAwMCAtIDAwYmY4MDAwMDAgcGFnZSA0awpbICAgIDAuMDAwMDAwXSBrZXJu
ZWwgZGlyZWN0IG1hcHBpbmcgdGFibGVzIHVwIHRvIGJmODAwMDAwIEAgYTAwMDAwLTEwMDAwMDAK
WyAgICAwLjAwMDAwMF0geGVuOiBzZXR0aW5nIFJXIHRoZSByYW5nZSBmZDQwMDAgLSAxMDAwMDAw
ClsgICAgMC4wMDAwMDBdIGluaXRfbWVtb3J5X21hcHBpbmc6IDAwMDAwMDAxMDAwMDAwMDAtMDAw
MDAwMDMwMTVjZjAwMApbICAgIDAuMDAwMDAwXSAgMDEwMDAwMDAwMCAtIDAzMDE1Y2YwMDAgcGFn
ZSA0awpbICAgIDAuMDAwMDAwXSBrZXJuZWwgZGlyZWN0IG1hcHBpbmcgdGFibGVzIHVwIHRvIDMw
MTVjZjAwMCBAIDNlN2U3MDAwLTQwMDAwMDAwClsgICAgMC4wMDAwMDBdIHhlbjogc2V0dGluZyBS
VyB0aGUgcmFuZ2UgM2Y3ZmIwMDAgLSA0MDAwMDAwMApbICAgIDAuMDAwMDAwXSBSQU1ESVNLOiAw
MjA2MDAwMCAtIDA0ODY0MDAwClsgICAgMC4wMDAwMDBdIEFDUEk6IFJTRFAgMDAwMDAwMDAwMDBm
MDQ1MCAwMDAyNCAodjAyIFNVUEVSTSkKWyAgICAwLjAwMDAwMF0gQUNQSTogWFNEVCAwMDAwMDAw
MGJlN2YxMDgwIDAwMDdDICh2MDEgU1VQRVJNIFNNQ0ktLU1CIDAwMDAwMDAxIEFNSSAgMDAwMTAw
MTMpClsgICAgMC4wMDAwMDBdIEFDUEk6IEZBQ1AgMDAwMDAwMDBiZTdmN2Y0OCAwMDBGNCAodjA0
IFNVUEVSTSBTTUNJLS1NQiAwMDAwMDAwMSBBTUkgIDAwMDEwMDEzKQpbICAgIDAuMDAwMDAwXSBB
Q1BJOiBEU0RUIDAwMDAwMDAwYmU3ZjExODggMDZEQzAgKHYwMiBTVVBFUk0gU01DSS0tTUIgMDAw
MDAwMDAgSU5UTCAyMDA1MTExNykKWyAgICAwLjAwMDAwMF0gQUNQSTogRkFDUyAwMDAwMDAwMGJm
NTBhZjgwIDAwMDQwClsgICAgMC4wMDAwMDBdIEFDUEk6IEFQSUMgMDAwMDAwMDBiZTdmODA0MCAw
MDA5MiAodjAzIFNVUEVSTSBTTUNJLS1NQiAwMDAwMDAwMSBBTUkgIDAwMDEwMDEzKQpbICAgIDAu
MDAwMDAwXSBBQ1BJOiBTU0RUIDAwMDAwMDAwYmU3ZjgwZDggMDAxRDYgKHYwMSBBTUlDUFUgICAg
IFBST0MgMDAwMDAwMDEgTVNGVCAwMzAwMDAwMSkKWyAgICAwLjAwMDAwMF0gQUNQSTogTUNGRyAw
MDAwMDAwMGJlN2Y4MmIwIDAwMDNDICh2MDEgU1VQRVJNIFNNQ0ktLU1CIDAwMDAwMDAxIE1TRlQg
MDAwMDAwOTcpClsgICAgMC4wMDAwMDBdIEFDUEk6IEhQRVQgMDAwMDAwMDBiZTdmODJmMCAwMDAz
OCAodjAxIFNVUEVSTSBTTUNJLS1NQiAwMDAwMDAwMSBBTUkuIDAwMDAwMDA0KQpbICAgIDAuMDAw
MDAwXSBBQ1BJOiBTUE1JIDAwMDAwMDAwYmU3ZjgzMjggMDAwNDAgKHYwNSBBIE0gSSAgIE9FTVNQ
TUkgMDAwMDAwMDAgQU1JLiAwMDAwMDAwMCkKWyAgICAwLjAwMDAwMF0gQUNQSTogWE1BUiAwMDAw
MDAwMGJlN2Y4MzY4IDAwMEIwICh2MDEgQUxBU0tBICAgIEEgTSBJIDAwMDAwMDAxIElOVEwgMDAw
MDAwMDEpClsgICAgMC4wMDAwMDBdIEFDUEk6IEVJTkogMDAwMDAwMDBiZTdmODQxOCAwMDEzMCAo
djAxICAgIEFNSSBBTUkgRUlOSiAwMDAwMDAwMCAgICAgIDAwMDAwMDAwKQpbICAgIDAuMDAwMDAw
XSBBQ1BJOiBFUlNUIDAwMDAwMDAwYmU3Zjg1NDggMDAyMTAgKHYwMSAgQU1JRVIgQU1JIEVSU1Qg
MDAwMDAwMDAgICAgICAwMDAwMDAwMCkKWyAgICAwLjAwMDAwMF0gQUNQSTogSEVTVCAwMDAwMDAw
MGJlN2Y4NzU4IDAwMEE4ICh2MDEgICAgQU1JIEFNSSBIRVNUIDAwMDAwMDAwICAgICAgMDAwMDAw
MDApClsgICAgMC4wMDAwMDBdIEFDUEk6IEJFUlQgMDAwMDAwMDBiZTdmODgwMCAwMDAzMCAodjAx
ICAgIEFNSSBBTUkgQkVSVCAwMDAwMDAwMCAgICAgIDAwMDAwMDAwKQpbICAgIDAuMDAwMDAwXSBB
Q1BJOiBMb2NhbCBBUElDIGFkZHJlc3MgMHhmZWUwMDAwMApbICAgIDAuMDAwMDAwXSBTZXR0aW5n
IEFQSUMgcm91dGluZyB0byBjbHVzdGVyIHgyYXBpYy4KWyAgICAwLjAwMDAwMF0gTm8gTlVNQSBj
b25maWd1cmF0aW9uIGZvdW5kClsgICAgMC4wMDAwMDBdIEZha2luZyBhIG5vZGUgYXQgMDAwMDAw
MDAwMDAwMDAwMC0wMDAwMDAwMzAxNWNmMDAwClsgICAgMC4wMDAwMDBdIEluaXRtZW0gc2V0dXAg
bm9kZSAwIDAwMDAwMDAwMDAwMDAwMDAtMDAwMDAwMDMwMTVjZjAwMApbICAgIDAuMDAwMDAwXSAg
IE5PREVfREFUQSBbMDAwMDAwMDAzZmZmYjAwMCAtIDAwMDAwMDAwM2ZmZmZmZmZdClsgICAgMC4w
MDAwMDBdIFpvbmUgUEZOIHJhbmdlczoKWyAgICAwLjAwMDAwMF0gICBETUEgICAgICAweDAwMDAw
MDEwIC0+IDB4MDAwMDEwMDAKWyAgICAwLjAwMDAwMF0gICBETUEzMiAgICAweDAwMDAxMDAwIC0+
IDB4MDAxMDAwMDAKWyAgICAwLjAwMDAwMF0gICBOb3JtYWwgICAweDAwMTAwMDAwIC0+IDB4MDAz
MDE1Y2YKWyAgICAwLjAwMDAwMF0gTW92YWJsZSB6b25lIHN0YXJ0IFBGTiBmb3IgZWFjaCBub2Rl
ClsgICAgMC4wMDAwMDBdIGVhcmx5X25vZGVfbWFwWzVdIGFjdGl2ZSBQRk4gcmFuZ2VzClsgICAg
MC4wMDAwMDBdICAgICAwOiAweDAwMDAwMDEwIC0+IDB4MDAwMDAwOGQKWyAgICAwLjAwMDAwMF0g
ICAgIDA6IDB4MDAwMDAxMDAgLT4gMHgwMDBiZTdhNQpbICAgIDAuMDAwMDAwXSAgICAgMDogMHgw
MDBiZjRhZCAtPiAweDAwMGJmNGFmClsgICAgMC4wMDAwMDBdICAgICAwOiAweDAwMGJmNTc2IC0+
IDB4MDAwYmY4MDAKWyAgICAwLjAwMDAwMF0gICAgIDA6IDB4MDAxMDAwMDAgLT4gMHgwMDMwMTVj
ZgpbICAgIDAuMDAwMDAwXSBPbiBub2RlIDAgdG90YWxwYWdlczogMjg4MzQ1MwpbICAgIDAuMDAw
MDAwXSAgIERNQSB6b25lOiA2NCBwYWdlcyB1c2VkIGZvciBtZW1tYXAKWyAgICAwLjAwMDAwMF0g
ICBETUEgem9uZTogMTQ5NyBwYWdlcyByZXNlcnZlZApbICAgIDAuMDAwMDAwXSAgIERNQSB6b25l
OiAyNDA0IHBhZ2VzLCBMSUZPIGJhdGNoOjAKWyAgICAwLjAwMDAwMF0gICBETUEzMiB6b25lOiAx
NjMyMCBwYWdlcyB1c2VkIGZvciBtZW1tYXAKWyAgICAwLjAwMDAwMF0gICBETUEzMiB6b25lOiA3
NjA0MzMgcGFnZXMsIExJRk8gYmF0Y2g6MzEKWyAgICAwLjAwMDAwMF0gICBOb3JtYWwgem9uZTog
MzI4NTYgcGFnZXMgdXNlZCBmb3IgbWVtbWFwClsgICAgMC4wMDAwMDBdICAgTm9ybWFsIHpvbmU6
IDIwNjk4NzkgcGFnZXMsIExJRk8gYmF0Y2g6MzEKWyAgICAwLjAwMDAwMF0gQUNQSTogUE0tVGlt
ZXIgSU8gUG9ydDogMHg0MDgKWyAgICAwLjAwMDAwMF0gQUNQSTogTG9jYWwgQVBJQyBhZGRyZXNz
IDB4ZmVlMDAwMDAKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwMV0gbGFw
aWNfaWRbMHgwMF0gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRb
MHgwMl0gbGFwaWNfaWRbMHgwMl0gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMg
KGFjcGlfaWRbMHgwM10gbGFwaWNfaWRbMHgwNF0gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQ
STogTEFQSUMgKGFjcGlfaWRbMHgwNF0gbGFwaWNfaWRbMHgwNl0gZW5hYmxlZCkKWyAgICAwLjAw
MDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwNV0gbGFwaWNfaWRbMHgwMV0gZW5hYmxlZCkK
WyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwNl0gbGFwaWNfaWRbMHgwM10g
ZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwN10gbGFwaWNf
aWRbMHgwNV0gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgw
OF0gbGFwaWNfaWRbMHgwN10gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUNfTk1J
IChhY3BpX2lkWzB4ZmZdIGhpZ2ggZWRnZSBsaW50WzB4MV0pClsgICAgMC4wMDAwMDBdIEFDUEk6
IElPQVBJQyAoaWRbMHgwMF0gYWRkcmVzc1sweGZlYzAwMDAwXSBnc2lfYmFzZVswXSkKWyAgICAw
LjAwMDAwMF0gSU9BUElDWzBdOiBhcGljX2lkIDAsIHZlcnNpb24gMjU1LCBhZGRyZXNzIDB4ZmVj
MDAwMDAsIEdTSSAwLTI1NQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBJTlRfU1JDX09WUiAoYnVzIDAg
YnVzX2lycSAwIGdsb2JhbF9pcnEgMiBkZmwgZGZsKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBJTlRf
U1JDX09WUiAoYnVzIDAgYnVzX2lycSA5IGdsb2JhbF9pcnEgOSBoaWdoIGxldmVsKQpbICAgIDAu
MDAwMDAwXSBBQ1BJOiBJUlEwIHVzZWQgYnkgb3ZlcnJpZGUuClsgICAgMC4wMDAwMDBdIEFDUEk6
IElSUTIgdXNlZCBieSBvdmVycmlkZS4KWyAgICAwLjAwMDAwMF0gQUNQSTogSVJROSB1c2VkIGJ5
IG92ZXJyaWRlLgpbICAgIDAuMDAwMDAwXSBVc2luZyBBQ1BJIChNQURUKSBmb3IgU01QIGNvbmZp
Z3VyYXRpb24gaW5mb3JtYXRpb24KWyAgICAwLjAwMDAwMF0gQUNQSTogSFBFVCBpZDogMHg4MDg2
YTcwMSBiYXNlOiAweGZlZDAwMDAwClsgICAgMC4wMDAwMDBdIFNNUDogQWxsb3dpbmcgOCBDUFVz
LCAwIGhvdHBsdWcgQ1BVcwpbICAgIDAuMDAwMDAwXSBucl9pcnFzX2dzaTogMjcyClsgICAgMC4w
MDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAwMDAwOGQwMDAgLSAw
MDAwMDAwMDAwMTAwMDAwClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1v
cnk6IDAwMDAwMDAwYmU3YTUwMDAgLSAwMDAwMDAwMGJlN2YxMDAwClsgICAgMC4wMDAwMDBdIFBN
OiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAwYmU3ZjEwMDAgLSAwMDAwMDAwMGJl
N2Y5MDAwClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAw
MDAwYmU3ZjkwMDAgLSAwMDAwMDAwMGJmNDc3MDAwClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3Rl
cmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAwYmY0NzcwMDAgLSAwMDAwMDAwMGJmNDc4MDAwClsg
ICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAwYmY0Nzgw
MDAgLSAwMDAwMDAwMGJmNDg5MDAwClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2
ZSBtZW1vcnk6IDAwMDAwMDAwYmY0ODkwMDAgLSAwMDAwMDAwMGJmNDhjMDAwClsgICAgMC4wMDAw
MDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAwYmY0OGMwMDAgLSAwMDAw
MDAwMGJmNGFkMDAwClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6
IDAwMDAwMDAwYmY0YWYwMDAgLSAwMDAwMDAwMGJmNTAzMDAwClsgICAgMC4wMDAwMDBdIFBNOiBS
ZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAwYmY1MDMwMDAgLSAwMDAwMDAwMGJmNTBk
MDAwClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAw
YmY1MGQwMDAgLSAwMDAwMDAwMGJmNTMzMDAwClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVk
IG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAwYmY1MzMwMDAgLSAwMDAwMDAwMGJmNTc2MDAwClsgICAg
MC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAwYmY4MDAwMDAg
LSAwMDAwMDAwMGZlYzAwMDAwClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBt
ZW1vcnk6IDAwMDAwMDAwZmVjMDAwMDAgLSAwMDAwMDAwMGZlYzAxMDAwClsgICAgMC4wMDAwMDBd
IFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAwZmVjMDEwMDAgLSAwMDAwMDAw
MGZlZDFjMDAwClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAw
MDAwMDAwZmVkMWMwMDAgLSAwMDAwMDAwMGZlZDQwMDAwClsgICAgMC4wMDAwMDBdIFBNOiBSZWdp
c3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAwZmVkNDAwMDAgLSAwMDAwMDAwMGZlZTAwMDAw
ClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAwZmVl
MDAwMDAgLSAwMDAwMDAwMGZlZTAxMDAwClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5v
c2F2ZSBtZW1vcnk6IDAwMDAwMDAwZmVlMDEwMDAgLSAwMDAwMDAwMGZmMDAwMDAwClsgICAgMC4w
MDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAwZmYwMDAwMDAgLSAw
MDAwMDAwMTAwMDAwMDAwClsgICAgMC4wMDAwMDBdIEFsbG9jYXRpbmcgUENJIHJlc291cmNlcyBz
dGFydGluZyBhdCBiZjgwMDAwMCAoZ2FwOiBiZjgwMDAwMDozZjQwMDAwMCkKWyAgICAwLjAwMDAw
MF0gQm9vdGluZyBwYXJhdmlydHVhbGl6ZWQga2VybmVsIG9uIFhlbgpbICAgIDAuMDAwMDAwXSBY
ZW4gdmVyc2lvbjogNC4xLjMtcmMxLXByZSAocHJlc2VydmUtQUQpClsgICAgMC4wMDAwMDBdIHNl
dHVwX3BlcmNwdTogTlJfQ1BVUzoyNTYgbnJfY3B1bWFza19iaXRzOjI1NiBucl9jcHVfaWRzOjgg
bnJfbm9kZV9pZHM6MQpbICAgIDAuMDAwMDAwXSBQRVJDUFU6IEVtYmVkZGVkIDI4IHBhZ2VzL2Nw
dSBAZmZmZjg4MDAzZmVjYTAwMCBzODMwNzIgcjgxOTIgZDIzNDI0IHUxMTQ2ODgKWyAgICAwLjAw
MDAwMF0gcGNwdS1hbGxvYzogczgzMDcyIHI4MTkyIGQyMzQyNCB1MTE0Njg4IGFsbG9jPTI4KjQw
OTYKWyAgICAwLjAwMDAwMF0gcGNwdS1hbGxvYzogWzBdIDAgWzBdIDEgWzBdIDIgWzBdIDMgWzBd
IDQgWzBdIDUgWzBdIDYgWzBdIDcgClsgICAgMy40MTEzOTFdIEJ1aWx0IDEgem9uZWxpc3RzIGlu
IFpvbmUgb3JkZXIsIG1vYmlsaXR5IGdyb3VwaW5nIG9uLiAgVG90YWwgcGFnZXM6IDI4MzI3MTYK
WyAgICAzLjQxMTM5NF0gUG9saWN5IHpvbmU6IE5vcm1hbApbICAgIDMuNDExMzk2XSBLZXJuZWwg
Y29tbWFuZCBsaW5lOiBwbGFjZWhvbGRlciByb290PS9kZXYvbWFwcGVyL1ZTeXN0ZW0wMS1sdlhl
bjAyIHJvIGVhcmx5cHJpbnRrPXhlbiBpbml0Y2FsbF9kZWJ1ZyBkZWJ1ZyBsb2dsZXZlbD0xMCBt
c2k9MQpbICAgIDMuNDExODA2XSBQSUQgaGFzaCB0YWJsZSBlbnRyaWVzOiA0MDk2IChvcmRlcjog
MywgMzI3NjggYnl0ZXMpClsgICAgMy40MzEzMzJdIFBsYWNpbmcgNjRNQiBzb2Z0d2FyZSBJTyBU
TEIgYmV0d2VlbiBmZmZmODgwMDJmMDAwMDAwIC0gZmZmZjg4MDAzMzAwMDAwMApbICAgIDMuNDMx
MzM2XSBzb2Z0d2FyZSBJTyBUTEIgYXQgcGh5cyAweDJmMDAwMDAwIC0gMHgzMzAwMDAwMApbICAg
IDMuNDMzNTE4XSBNZW1vcnk6IDcxNjkyNGsvMTI2MDUyNDRrIGF2YWlsYWJsZSAoNjU2NWsga2Vy
bmVsIGNvZGUsIDEwNzE0MzJrIGFic2VudCwgMTA4MTY4ODhrIHJlc2VydmVkLCA2NjM5ayBkYXRh
LCA5MjBrIGluaXQpClsgICAgMy40MzM1ODVdIFNMVUI6IEdlbnNsYWJzPTE1LCBIV2FsaWduPTY0
LCBPcmRlcj0wLTMsIE1pbk9iamVjdHM9MCwgQ1BVcz04LCBOb2Rlcz0xClsgICAgMy40MzM2MDdd
IEhpZXJhcmNoaWNhbCBSQ1UgaW1wbGVtZW50YXRpb24uClsgICAgMy40MzM2MDldIAlSQ1UgZHlu
dGljay1pZGxlIGdyYWNlLXBlcmlvZCBhY2NlbGVyYXRpb24gaXMgZW5hYmxlZC4KWyAgICAzLjQz
MzYxNl0gTlJfSVJRUzoxNjY0MCBucl9pcnFzOjIwNDggMTYKWyAgICAzLjQzMzY3Ml0geGVuOiBz
Y2kgb3ZlcnJpZGU6IGdsb2JhbF9pcnE9OSB0cmlnZ2VyPTAgcG9sYXJpdHk9MApbICAgIDMuNDMz
Njc1XSB4ZW46IHJlZ2lzdGVyaW5nIGdzaSA5IHRyaWdnZXJpbmcgMCBwb2xhcml0eSAwClsgICAg
My40MzM2ODNdIHhlbjogLS0+IHBpcnE9OSAtPiBpcnE9OSAoZ3NpPTkpClsgICAgMy40MzM3MTVd
IHhlbjogYWNwaSBzY2kgOQpbICAgIDMuNDMzNzE4XSB4ZW46IC0tPiBwaXJxPTEgLT4gaXJxPTEg
KGdzaT0xKQpbICAgIDMuNDMzNzIxXSB4ZW46IC0tPiBwaXJxPTIgLT4gaXJxPTIgKGdzaT0yKQpb
ICAgIDMuNDMzNzI0XSB4ZW46IC0tPiBwaXJxPTMgLT4gaXJxPTMgKGdzaT0zKQpbICAgIDMuNDMz
NzI3XSB4ZW46IC0tPiBwaXJxPTQgLT4gaXJxPTQgKGdzaT00KQpbICAgIDMuNDMzNzMwXSB4ZW46
IC0tPiBwaXJxPTUgLT4gaXJxPTUgKGdzaT01KQpbICAgIDMuNDMzNzMzXSB4ZW46IC0tPiBwaXJx
PTYgLT4gaXJxPTYgKGdzaT02KQpbICAgIDMuNDMzNzM2XSB4ZW46IC0tPiBwaXJxPTcgLT4gaXJx
PTcgKGdzaT03KQpbICAgIDMuNDMzNzM4XSB4ZW46IC0tPiBwaXJxPTggLT4gaXJxPTggKGdzaT04
KQpbICAgIDMuNDMzNzQwXSB4ZW5fbWFwX3BpcnFfZ3NpOiByZXR1cm5pbmcgaXJxIDkgZm9yIGdz
aSA5ClsgICAgMy40MzM3NDJdIHhlbjogLS0+IHBpcnE9OSAtPiBpcnE9OSAoZ3NpPTkpClsgICAg
My40MzM3NDVdIHhlbjogLS0+IHBpcnE9MTAgLT4gaXJxPTEwIChnc2k9MTApClsgICAgMy40MzM3
NDhdIHhlbjogLS0+IHBpcnE9MTEgLT4gaXJxPTExIChnc2k9MTEpClsgICAgMy40MzM3NTFdIHhl
bjogLS0+IHBpcnE9MTIgLT4gaXJxPTEyIChnc2k9MTIpClsgICAgMy40MzM3NTRdIHhlbjogLS0+
IHBpcnE9MTMgLT4gaXJxPTEzIChnc2k9MTMpClsgICAgMy40MzM3NTddIHhlbjogLS0+IHBpcnE9
MTQgLT4gaXJxPTE0IChnc2k9MTQpClsgICAgMy40MzM3NjBdIHhlbjogLS0+IHBpcnE9MTUgLT4g
aXJxPTE1IChnc2k9MTUpClsgICAgMy40MzY2MzRdIENvbnNvbGU6IGNvbG91ciBWR0ErIDgweDI1
ClsgICAgMy40MzY2MzddIGNvbnNvbGUgW3R0eTBdIGVuYWJsZWQsIGJvb3Rjb25zb2xlIGRpc2Fi
bGVkClsgICAgMy40NDcyMDBdIGFsbG9jYXRlZCA5MzMyMzI2NCBieXRlcyBvZiBwYWdlX2Nncm91
cApbICAgIDMuNDQ3Mjg4XSBwbGVhc2UgdHJ5ICdjZ3JvdXBfZGlzYWJsZT1tZW1vcnknIG9wdGlv
biBpZiB5b3UgZG9uJ3Qgd2FudCBtZW1vcnkgY2dyb3VwcwpbICAgIDMuNDQ3NDA4XSBYZW46IHVz
aW5nIHZjcHVvcCB0aW1lciBpbnRlcmZhY2UKWyAgICAzLjQ0NzQ4N10gaW5zdGFsbGluZyBYZW4g
dGltZXIgZm9yIENQVSAwClsgICAgMy40NDc1OTFdIERldGVjdGVkIDMxOTIuODM4IE1IeiBwcm9j
ZXNzb3IuClsgICAgMy40NDc2NzRdIENhbGlicmF0aW5nIGRlbGF5IGxvb3AgKHNraXBwZWQpLCB2
YWx1ZSBjYWxjdWxhdGVkIHVzaW5nIHRpbWVyIGZyZXF1ZW5jeS4uIDYzODUuNjcgQm9nb01JUFMg
KGxwaj0xMjc3MTM1MikKWyAgICAzLjQ0NzgzOV0gcGlkX21heDogZGVmYXVsdDogMzI3NjggbWlu
aW11bTogMzAxClsgICAgMy40NDc5NDNdIFNlY3VyaXR5IEZyYW1ld29yayBpbml0aWFsaXplZApb
ICAgIDMuNDQ4MDI4XSBBcHBBcm1vcjogQXBwQXJtb3IgaW5pdGlhbGl6ZWQKWyAgICAzLjQ0ODEw
NF0gWWFtYTogYmVjb21pbmcgbWluZGZ1bC4KWyAgICAzLjQ1MjQ4M10gRGVudHJ5IGNhY2hlIGhh
c2ggdGFibGUgZW50cmllczogMjA5NzE1MiAob3JkZXI6IDEyLCAxNjc3NzIxNiBieXRlcykKWyAg
ICAzLjQ1Njc3MF0gSW5vZGUtY2FjaGUgaGFzaCB0YWJsZSBlbnRyaWVzOiAxMDQ4NTc2IChvcmRl
cjogMTEsIDgzODg2MDggYnl0ZXMpClsgICAgMy40NTc5MTNdIE1vdW50LWNhY2hlIGhhc2ggdGFi
bGUgZW50cmllczogMjU2ClsgICAgMy40NTgxMjddIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lz
IGNwdWFjY3QKWyAgICAzLjQ1ODIxMl0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgbWVtb3J5
ClsgICAgMy40NTgyOTddIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIGRldmljZXMKWyAgICAz
LjQ1ODM3OV0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgZnJlZXplcgpbICAgIDMuNDU4NDYx
XSBJbml0aWFsaXppbmcgY2dyb3VwIHN1YnN5cyBibGtpbwpbICAgIDMuNDU4NTQ2XSBJbml0aWFs
aXppbmcgY2dyb3VwIHN1YnN5cyBwZXJmX2V2ZW50ClsgICAgMy40NTg2NzldIEVORVJHWV9QRVJG
X0JJQVM6IFNldCB0byAnbm9ybWFsJywgd2FzICdwZXJmb3JtYW5jZScKWyAgICAzLjQ1ODY4MF0g
RU5FUkdZX1BFUkZfQklBUzogVmlldyBhbmQgdXBkYXRlIHdpdGggeDg2X2VuZXJneV9wZXJmX3Bv
bGljeSg4KQpbICAgIDMuNDU4ODgzXSBDUFU6IFBoeXNpY2FsIFByb2Nlc3NvciBJRDogMApbICAg
IDMuNDU4OTc4XSBDUFU6IFByb2Nlc3NvciBDb3JlIElEOiAwClsgICAgMy40NjA5OTNdIEFDUEk6
IENvcmUgcmV2aXNpb24gMjAxMTA2MjMKWyAgICAzLjY5MTE5Nl0gZnRyYWNlOiBhbGxvY2F0aW5n
IDI3MDQ5IGVudHJpZXMgaW4gMTA3IHBhZ2VzClsgICAgMy42OTg2MjZdIGNwdSAwIHNwaW5sb2Nr
IGV2ZW50IGlycSAyNzMKWyAgICAzLjY5ODc0OF0gY2FsbGluZyAgdHJhY2VfaW5pdF9mbGFnc19z
eXNfZXhpdCsweDAvMHgxMiBAIDEKWyAgICAzLjY5ODg1MV0gaW5pdGNhbGwgdHJhY2VfaW5pdF9m
bGFnc19zeXNfZXhpdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjY5
ODk3Nl0gY2FsbGluZyAgdHJhY2VfaW5pdF9mbGFnc19zeXNfZW50ZXIrMHgwLzB4MTIgQCAxClsg
ICAgMy42OTkwODBdIGluaXRjYWxsIHRyYWNlX2luaXRfZmxhZ3Nfc3lzX2VudGVyKzB4MC8weDEy
IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuNjk5MjA1XSBjYWxsaW5nICBpbml0X2h3
X3BlcmZfZXZlbnRzKzB4MC8weDg2IEAgMQpbICAgIDMuNjk5MzA2XSBQZXJmb3JtYW5jZSBFdmVu
dHM6IHVuc3VwcG9ydGVkIHA2IENQVSBtb2RlbCA0MiBubyBQTVUgZHJpdmVyLCBzb2Z0d2FyZSBl
dmVudHMgb25seS4KWyAgICAzLjY5OTU3OV0gaW5pdGNhbGwgaW5pdF9od19wZXJmX2V2ZW50cysw
eDAvMHg4NiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjY5OTY4M10gY2FsbGluZyAg
cmVnaXN0ZXJfdHJpZ2dlcl9hbGxfY3B1X2JhY2t0cmFjZSsweDAvMHgxZiBAIDEKWyAgICAzLjY5
OTc4OV0gaW5pdGNhbGwgcmVnaXN0ZXJfdHJpZ2dlcl9hbGxfY3B1X2JhY2t0cmFjZSsweDAvMHgx
ZiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjY5OTkxNV0gY2FsbGluZyAgbnVtYWNo
aXBfc3lzdGVtX2luaXQrMHgwLzB4YTggQCAxClsgICAgMy43MDAwMTldIGluaXRjYWxsIG51bWFj
aGlwX3N5c3RlbV9pbml0KzB4MC8weGE4IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMu
NzAwMTIyXSBjYWxsaW5nICBtaWdyYXRpb25faW5pdCsweDAvMHg2YyBAIDEKWyAgICAzLjcwMDIy
M10gaW5pdGNhbGwgbWlncmF0aW9uX2luaXQrMHgwLzB4NmMgcmV0dXJuZWQgMCBhZnRlciAwIHVz
ZWNzClsgICAgMy43MDAzMjddIGNhbGxpbmcgIHNwYXduX2tzb2Z0aXJxZCsweDAvMHg1MyBAIDEK
WyAgICAzLjcwMDQ0M10gaW5pdGNhbGwgc3Bhd25fa3NvZnRpcnFkKzB4MC8weDUzIHJldHVybmVk
IDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuNzAwNTQ3XSBjYWxsaW5nICBpbml0X3dvcmtxdWV1ZXMr
MHgwLzB4MmQ0IEAgMQpbICAgIDMuNzAwNjg5XSBpbml0Y2FsbCBpbml0X3dvcmtxdWV1ZXMrMHgw
LzB4MmQ0IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuNzAwNzk1XSBjYWxsaW5nICBj
cHVfc3RvcF9pbml0KzB4MC8weGFkIEAgMQpbICAgIDMuNzAwOTA3XSBpbml0Y2FsbCBjcHVfc3Rv
cF9pbml0KzB4MC8weGFkIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuNzAxMDExXSBj
YWxsaW5nICByY3Vfc2NoZWR1bGVyX3JlYWxseV9zdGFydGVkKzB4MC8weDEyIEAgMQpbICAgIDMu
NzAxMTE0XSBpbml0Y2FsbCByY3Vfc2NoZWR1bGVyX3JlYWxseV9zdGFydGVkKzB4MC8weDEyIHJl
dHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuNzAxMjQzXSBjYWxsaW5nICByZWxheV9pbml0
KzB4MC8weDE0IEAgMQpbICAgIDMuNzAxMzQ0XSBpbml0Y2FsbCByZWxheV9pbml0KzB4MC8weDE0
IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuNzAxNDQ5XSBjYWxsaW5nICB0cmFjZXJf
YWxsb2NfYnVmZmVycysweDAvMHgxY2QgQCAxClsgICAgMy43MDE1NjZdIGluaXRjYWxsIHRyYWNl
cl9hbGxvY19idWZmZXJzKzB4MC8weDFjZCByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAz
LjcwMTY3Ml0gY2FsbGluZyAgaW5pdF90cmFjZV9wcmludGsrMHgwLzB4MTIgQCAxClsgICAgMy43
MDE3NzFdIGluaXRjYWxsIGluaXRfdHJhY2VfcHJpbnRrKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0
ZXIgMCB1c2VjcwpbICAgIDMuNzAxODc3XSBjYWxsaW5nICBqdW1wX2xhYmVsX2luaXRfbW9kdWxl
KzB4MC8weDEyIEAgMQpbICAgIDMuNzAxOTc5XSBpbml0Y2FsbCBqdW1wX2xhYmVsX2luaXRfbW9k
dWxlKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuNzAyMDg1XSBOTUkg
d2F0Y2hkb2cgZGlzYWJsZWQgKGNwdTApOiBoYXJkd2FyZSBldmVudHMgbm90IGVuYWJsZWQKWyAg
ICAzLjcwMjI0OF0gaW5zdGFsbGluZyBYZW4gdGltZXIgZm9yIENQVSAxClsgICAgMy43MDIzNTRd
IGNwdSAxIHNwaW5sb2NrIGV2ZW50IGlycSAyNzkKWyAgICAzLjcwMjU1NF0gTk1JIHdhdGNoZG9n
IGRpc2FibGVkIChjcHUxKTogaGFyZHdhcmUgZXZlbnRzIG5vdCBlbmFibGVkClsgICAgMy43MDI2
NzldIEJyb3VnaHQgdXAgMiBDUFVzClsgICAgMy43MDI5NjBdIGRldnRtcGZzOiBpbml0aWFsaXpl
ZApbICAgIDMuNzAzODExXSBjYWxsaW5nICBpcGNfbnNfaW5pdCsweDAvMHgxNCBAIDEKWyAgICAz
LjcwMzkxM10gaW5pdGNhbGwgaXBjX25zX2luaXQrMHgwLzB4MTQgcmV0dXJuZWQgMCBhZnRlciAw
IHVzZWNzClsgICAgMy43MDQwMTddIGNhbGxpbmcgIGluaXRfbW1hcF9taW5fYWRkcisweDAvMHgx
NiBAIDEKWyAgICAzLjcwNDExOV0gaW5pdGNhbGwgaW5pdF9tbWFwX21pbl9hZGRyKzB4MC8weDE2
IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuNzA0MjIyXSBjYWxsaW5nICBldm1fZGlz
cGxheV9jb25maWcrMHgwLzB4MmYgQCAxClsgICAgMy43MDQzMjNdIEVWTTogc2VjdXJpdHkuc2Vs
aW51eApbICAgIDMuNzA0NDIwXSBFVk06IHNlY3VyaXR5LlNNQUNLNjQKWyAgICAzLjcwNDUxOF0g
RVZNOiBzZWN1cml0eS5jYXBhYmlsaXR5ClsgICAgMy43MDQ2MTldIGluaXRjYWxsIGV2bV9kaXNw
bGF5X2NvbmZpZysweDAvMHgyZiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcwNDcy
NF0gY2FsbGluZyAgaW5pdF9jcHVmcmVxX3RyYW5zaXRpb25fbm90aWZpZXJfbGlzdCsweDAvMHgx
YiBAIDEKWyAgICAzLjcwNDgzMF0gaW5pdGNhbGwgaW5pdF9jcHVmcmVxX3RyYW5zaXRpb25fbm90
aWZpZXJfbGlzdCsweDAvMHgxYiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcwNDk1
N10gY2FsbGluZyAgbmV0X25zX2luaXQrMHgwLzB4ZTggQCAxClsgICAgMy43MDUwOTFdIGluaXRj
YWxsIG5ldF9uc19pbml0KzB4MC8weGU4IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMu
NzA1MjAwXSBjYWxsaW5nICBlODIwX21hcmtfbnZzX21lbW9yeSsweDAvMHgzZCBAIDEKWyAgICAz
LjcwNTMwMV0gUE06IFJlZ2lzdGVyaW5nIEFDUEkgTlZTIHJlZ2lvbiBhdCBiZTdhNTAwMCAoMzEx
Mjk2IGJ5dGVzKQpbICAgIDMuNzA1NDA5XSBQTTogUmVnaXN0ZXJpbmcgQUNQSSBOVlMgcmVnaW9u
IGF0IGJmNDc3MDAwICg0MDk2IGJ5dGVzKQpbICAgIDMuNzA1NTEzXSBQTTogUmVnaXN0ZXJpbmcg
QUNQSSBOVlMgcmVnaW9uIGF0IGJmNDg5MDAwICgxMjI4OCBieXRlcykKWyAgICAzLjcwNTYxN10g
UE06IFJlZ2lzdGVyaW5nIEFDUEkgTlZTIHJlZ2lvbiBhdCBiZjUwMzAwMCAoNDA5NjAgYnl0ZXMp
ClsgICAgMy43MDU3MThdIFBNOiBSZWdpc3RlcmluZyBBQ1BJIE5WUyByZWdpb24gYXQgYmY1MzMw
MDAgKDI3NDQzMiBieXRlcykKWyAgICAzLjcwNTgyN10gaW5pdGNhbGwgZTgyMF9tYXJrX252c19t
ZW1vcnkrMHgwLzB4M2QgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy43MDU5MzFdIGNh
bGxpbmcgIGNwdWZyZXFfdHNjKzB4MC8weDMwIEAgMQpbICAgIDMuNzA2MDMyXSBpbml0Y2FsbCBj
cHVmcmVxX3RzYysweDAvMHgzMCByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcwNjEz
NV0gY2FsbGluZyAgcGNpX3JlYm9vdF9pbml0KzB4MC8weDE0IEAgMQpbICAgIDMuNzA2MjM4XSBp
bml0Y2FsbCBwY2lfcmVib290X2luaXQrMHgwLzB4MTQgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNz
ClsgICAgMy43MDYzNDNdIGNhbGxpbmcgIGluaXRfbGFwaWNfc3lzZnMrMHgwLzB4MjAgQCAxClsg
ICAgMy43MDY0NDNdIGluaXRjYWxsIGluaXRfbGFwaWNfc3lzZnMrMHgwLzB4MjAgcmV0dXJuZWQg
MCBhZnRlciAwIHVzZWNzClsgICAgMy43MDY1NDldIGNhbGxpbmcgIGluaXRfc21wX2ZsdXNoKzB4
MC8weDNhIEAgMQpbICAgIDMuNzA2NjQ5XSBpbml0Y2FsbCBpbml0X3NtcF9mbHVzaCsweDAvMHgz
YSByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcwNjc1Nl0gY2FsbGluZyAgY3B1X2hv
dHBsdWdfcG1fc3luY19pbml0KzB4MC8weDIwIEAgMQpbICAgIDMuNzA2ODU4XSBpbml0Y2FsbCBj
cHVfaG90cGx1Z19wbV9zeW5jX2luaXQrMHgwLzB4MjAgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNz
ClsgICAgMy43MDY5ODNdIGNhbGxpbmcgIGFsbG9jX2Zyb3plbl9jcHVzKzB4MC8weDEwIEAgMQpb
ICAgIDMuNzA3MDg2XSBpbml0Y2FsbCBhbGxvY19mcm96ZW5fY3B1cysweDAvMHgxMCByZXR1cm5l
ZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcwNzE5Ml0gY2FsbGluZyAgc3lzY3RsX2luaXQrMHgw
LzB4MzIgQCAxClsgICAgMy43MDczMzFdIGluaXRjYWxsIHN5c2N0bF9pbml0KzB4MC8weDMyIHJl
dHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuNzA3NDMzXSBjYWxsaW5nICBrc3lzZnNfaW5p
dCsweDAvMHg5MSBAIDEKWyAgICAzLjcwNzUzOV0gaW5pdGNhbGwga3N5c2ZzX2luaXQrMHgwLzB4
OTEgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy43MDc2NDNdIGNhbGxpbmcgIGluaXRf
amlmZmllc19jbG9ja3NvdXJjZSsweDAvMHgxMiBAIDEKWyAgICAzLjcwNzc0N10gaW5pdGNhbGwg
aW5pdF9qaWZmaWVzX2Nsb2Nrc291cmNlKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vj
cwpbICAgIDMuNzA3ODcyXSBjYWxsaW5nICBwbV9pbml0KzB4MC8weDZhIEAgMQpbICAgIDMuNzA3
OTc3XSBpbml0Y2FsbCBwbV9pbml0KzB4MC8weDZhIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcwpb
ICAgIDMuNzA4MDc4XSBjYWxsaW5nICBwbV9kaXNrX2luaXQrMHgwLzB4MTkgQCAxClsgICAgMy43
MDgxODFdIGluaXRjYWxsIHBtX2Rpc2tfaW5pdCsweDAvMHgxOSByZXR1cm5lZCAwIGFmdGVyIDAg
dXNlY3MKWyAgICAzLjcwODI4M10gY2FsbGluZyAgc3dzdXNwX2hlYWRlcl9pbml0KzB4MC8weDQw
IEAgMQpbICAgIDMuNzA4Mzg3XSBpbml0Y2FsbCBzd3N1c3BfaGVhZGVyX2luaXQrMHgwLzB4NDAg
cmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy43MDg0OTNdIGNhbGxpbmcgIGluaXRfZnRy
YWNlX3N5c2NhbGxzKzB4MC8weDg3IEAgMQpbICAgIDMuNzA5MDE1XSBpbml0Y2FsbCBpbml0X2Z0
cmFjZV9zeXNjYWxscysweDAvMHg4NyByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcw
OTExOV0gY2FsbGluZyAgaW5pdF96ZXJvX3BmbisweDAvMHgxZiBAIDEKWyAgICAzLjcwOTIyMV0g
aW5pdGNhbGwgaW5pdF96ZXJvX3BmbisweDAvMHgxZiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MK
WyAgICAzLjcwOTMyNV0gY2FsbGluZyAgbWVtb3J5X2ZhaWx1cmVfaW5pdCsweDAvMHhhMSBAIDEK
WyAgICAzLjcwOTQyNl0gaW5pdGNhbGwgbWVtb3J5X2ZhaWx1cmVfaW5pdCsweDAvMHhhMSByZXR1
cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcwOTUzMV0gY2FsbGluZyAgZnNub3RpZnlfaW5p
dCsweDAvMHgyNiBAIDEKWyAgICAzLjcwOTYzM10gaW5pdGNhbGwgZnNub3RpZnlfaW5pdCsweDAv
MHgyNiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcwOTczN10gY2FsbGluZyAgZmls
ZWxvY2tfaW5pdCsweDAvMHgyYSBAIDEKWyAgICAzLjcwOTgzOV0gaW5pdGNhbGwgZmlsZWxvY2tf
aW5pdCsweDAvMHgyYSByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcwOTk0MV0gY2Fs
bGluZyAgaW5pdF9zY3JpcHRfYmluZm10KzB4MC8weDE0IEAgMQpbICAgIDMuNzEwMDQzXSBpbml0
Y2FsbCBpbml0X3NjcmlwdF9iaW5mbXQrMHgwLzB4MTQgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNz
ClsgICAgMy43MTAxNDRdIGNhbGxpbmcgIGluaXRfZWxmX2JpbmZtdCsweDAvMHgxNCBAIDEKWyAg
ICAzLjcxMDI0N10gaW5pdGNhbGwgaW5pdF9lbGZfYmluZm10KzB4MC8weDE0IHJldHVybmVkIDAg
YWZ0ZXIgMCB1c2VjcwpbICAgIDMuNzEwMzUyXSBjYWxsaW5nICBpbml0X2NvbXBhdF9lbGZfYmlu
Zm10KzB4MC8weDE0IEAgMQpbICAgIDMuNzEwNDU1XSBpbml0Y2FsbCBpbml0X2NvbXBhdF9lbGZf
YmluZm10KzB4MC8weDE0IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuNzEwNTYyXSBj
YWxsaW5nICBkZWJ1Z2ZzX2luaXQrMHgwLzB4NTcgQCAxClsgICAgMy43MTA2NjVdIGluaXRjYWxs
IGRlYnVnZnNfaW5pdCsweDAvMHg1NyByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcx
MDc3MF0gY2FsbGluZyAgc2VjdXJpdHlmc19pbml0KzB4MC8weDRlIEAgMQpbICAgIDMuNzEwODcw
XSBpbml0Y2FsbCBzZWN1cml0eWZzX2luaXQrMHgwLzB4NGUgcmV0dXJuZWQgMCBhZnRlciAwIHVz
ZWNzClsgICAgMy43MTA5NzRdIGNhbGxpbmcgIHJhbmRvbTMyX2luaXQrMHgwLzB4ZDYgQCAxClsg
ICAgMy43MTEwNzNdIGluaXRjYWxsIHJhbmRvbTMyX2luaXQrMHgwLzB4ZDYgcmV0dXJuZWQgMCBh
ZnRlciAwIHVzZWNzClsgICAgMy43MTExNzldIGNhbGxpbmcgIHNmaV9zeXNmc19pbml0KzB4MC8w
eGRhIEAgMQpbICAgIDMuNzExMjgzXSBpbml0Y2FsbCBzZmlfc3lzZnNfaW5pdCsweDAvMHhkYSBy
ZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcxMTM4N10gY2FsbGluZyAgdmlydGlvX2lu
aXQrMHgwLzB4MzAgQCAxClsgICAgMy43MTE1MDBdIGluaXRjYWxsIHZpcnRpb19pbml0KzB4MC8w
eDMwIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuNzExNjA2XSBjYWxsaW5nICBfX2du
dHRhYl9pbml0KzB4MC8weDIxIEAgMQpbICAgIDMuNzExNzE1XSBHcmFudCB0YWJsZSBpbml0aWFs
aXplZApbICAgIDMuNzExODEyXSBpbml0Y2FsbCBfX2dudHRhYl9pbml0KzB4MC8weDIxIHJldHVy
bmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuNzExOTE3XSBjYWxsaW5nICByZWd1bGF0b3JfaW5p
dCsweDAvMHhhNiBAIDEKWyAgICAzLjcxMjA1M10gcHJpbnRfY29uc3RyYWludHM6IGR1bW15OiAK
WyAgICAzLjcxMjE1OV0gaW5pdGNhbGwgcmVndWxhdG9yX2luaXQrMHgwLzB4YTYgcmV0dXJuZWQg
MCBhZnRlciAwIHVzZWNzClsgICAgMy43MTIyNjVdIGNhbGxpbmcgIGVhcmx5X3Jlc3VtZV9pbml0
KzB4MC8weDIwIEAgMQpbICAgIDMuNzEyNDI3XSBSVEMgdGltZTogMTg6Mjk6MjMsIGRhdGU6IDA0
LzExLzEyClsgICAgMy43MTI1MjddIGluaXRjYWxsIGVhcmx5X3Jlc3VtZV9pbml0KzB4MC8weDIw
IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuNzEyNjMzXSBjYWxsaW5nICBjcHVmcmVx
X2NvcmVfaW5pdCsweDAvMHhhOSBAIDEKWyAgICAzLjcxMjczNV0gaW5pdGNhbGwgY3B1ZnJlcV9j
b3JlX2luaXQrMHgwLzB4YTkgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy43MTI4NDFd
IGNhbGxpbmcgIGNwdWlkbGVfaW5pdCsweDAvMHgzZCBAIDEKWyAgICAzLjcxMjk0Ml0gaW5pdGNh
bGwgY3B1aWRsZV9pbml0KzB4MC8weDNkIHJldHVybmVkIC0xOSBhZnRlciAwIHVzZWNzClsgICAg
My43MTMwNDVdIGNhbGxpbmcgIHNvY2tfaW5pdCsweDAvMHg4MCBAIDEKWyAgICAzLjcxMzE2Ml0g
aW5pdGNhbGwgc29ja19pbml0KzB4MC8weDgwIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAg
IDMuNzEzMjY2XSBjYWxsaW5nICBuZXRfaW51c2VfaW5pdCsweDAvMHgyNiBAIDEKWyAgICAzLjcx
MzM2OV0gaW5pdGNhbGwgbmV0X2ludXNlX2luaXQrMHgwLzB4MjYgcmV0dXJuZWQgMCBhZnRlciAw
IHVzZWNzClsgICAgMy43MTM0NzRdIGNhbGxpbmcgIG5ldHBvbGxfaW5pdCsweDAvMHgzMSBAIDEK
WyAgICAzLjcxMzU3NV0gaW5pdGNhbGwgbmV0cG9sbF9pbml0KzB4MC8weDMxIHJldHVybmVkIDAg
YWZ0ZXIgMCB1c2VjcwpbICAgIDMuNzEzNjgwXSBjYWxsaW5nICBuZXRsaW5rX3Byb3RvX2luaXQr
MHgwLzB4MjUgQCAxClsgICAgMy43MTM3ODRdIE5FVDogUmVnaXN0ZXJlZCBwcm90b2NvbCBmYW1p
bHkgMTYKWyAgICAzLjcxMzg5MF0gaW5pdGNhbGwgbmV0bGlua19wcm90b19pbml0KzB4MC8weDI1
IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuNzEzOTk2XSBjYWxsaW5nICBwb3B1bGF0
ZV9yb290ZnNfZWFybHkrMHgwLzB4M2IgQCAxClsgICAgMy43MTQxMDFdIGluaXRjYWxsIHBvcHVs
YXRlX3Jvb3Rmc19lYXJseSsweDAvMHgzYiByZXR1cm5lZCAxIGFmdGVyIDAgdXNlY3MKWyAgICAz
LjcxNDIwN10gaW5pdGNhbGwgcG9wdWxhdGVfcm9vdGZzX2Vhcmx5KzB4MC8weDNiIHJldHVybmVk
IHdpdGggZXJyb3IgY29kZSAxIApbICAgIDMuNzE0MzMyXSBjYWxsaW5nICBiZGlfY2xhc3NfaW5p
dCsweDAvMHg0OSBAIDEKWyAgICAzLjcxNDQzN10gaW5pdGNhbGwgYmRpX2NsYXNzX2luaXQrMHgw
LzB4NDkgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy43MTQ1NDJdIGNhbGxpbmcgIGtv
YmplY3RfdWV2ZW50X2luaXQrMHgwLzB4MjEgQCAxClsgICAgMy43MTQ2NTldIGluaXRjYWxsIGtv
YmplY3RfdWV2ZW50X2luaXQrMHgwLzB4MjEgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAg
My43MTQ2NjZdIGNhbGxpbmcgIDFfYXN5bmNfcG9wdWxhdGVfcm9vdGZzKzB4MC8weDM2IEAgNQpb
ICAgIDMuNzE0Njk1XSBUcnlpbmcgdG8gdW5wYWNrIHJvb3RmcyBpbWFnZSBhcyBpbml0cmFtZnMu
Li4KWyAgICAzLjcxNDk2N10gY2FsbGluZyAgZ3Bpb2xpYl9zeXNmc19pbml0KzB4MC8weDkyIEAg
MQpbICAgIDMuNzE1MDc0XSBpbml0Y2FsbCBncGlvbGliX3N5c2ZzX2luaXQrMHgwLzB4OTIgcmV0
dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy43MTUxNzldIGNhbGxpbmcgIHBjaWJ1c19jbGFz
c19pbml0KzB4MC8weDE5IEAgMQpbICAgIDMuNzE1MjgzXSBpbml0Y2FsbCBwY2lidXNfY2xhc3Nf
aW5pdCsweDAvMHgxOSByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcxNTM4NV0gY2Fs
bGluZyAgcGNpX2RyaXZlcl9pbml0KzB4MC8weDEyIEAgMQpbICAgIDMuNzE1NDkxXSBpbml0Y2Fs
bCBwY2lfZHJpdmVyX2luaXQrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAg
My43MTU1OTNdIGNhbGxpbmcgIHJpb19idXNfaW5pdCsweDAvMHgzMCBAIDEKWyAgICAzLjcxNTcx
MV0gaW5pdGNhbGwgcmlvX2J1c19pbml0KzB4MC8weDMwIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vj
cwpbICAgIDMuNzE1ODE1XSBjYWxsaW5nICBiYWNrbGlnaHRfY2xhc3NfaW5pdCsweDAvMHg1ZCBA
IDEKWyAgICAzLjcxNTkyMF0gaW5pdGNhbGwgYmFja2xpZ2h0X2NsYXNzX2luaXQrMHgwLzB4NWQg
cmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy43MTYwMjZdIGNhbGxpbmcgIHhlbmJ1c19p
bml0KzB4MC8weDE5MSBAIDEKWyAgICAzLjcxNjE4NF0gaW5pdGNhbGwgeGVuYnVzX2luaXQrMHgw
LzB4MTkxIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuNzE2Mjg4XSBjYWxsaW5nICB0
dHlfY2xhc3NfaW5pdCsweDAvMHgzNCBAIDEKWyAgICAzLjcxNjM5NV0gaW5pdGNhbGwgdHR5X2Ns
YXNzX2luaXQrMHgwLzB4MzQgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy43MTY1MDBd
IGNhbGxpbmcgIHZ0Y29uc29sZV9jbGFzc19pbml0KzB4MC8weGUyIEAgMQpbICAgIDMuNzE2NjE4
XSBpbml0Y2FsbCB2dGNvbnNvbGVfY2xhc3NfaW5pdCsweDAvMHhlMiByZXR1cm5lZCAwIGFmdGVy
IDAgdXNlY3MKWyAgICAzLjcxNjcyMV0gY2FsbGluZyAgd2FrZXVwX3NvdXJjZXNfZGVidWdmc19p
bml0KzB4MC8weDJiIEAgMQpbICAgIDMuNzE2ODI2XSBpbml0Y2FsbCB3YWtldXBfc291cmNlc19k
ZWJ1Z2ZzX2luaXQrMHgwLzB4MmIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy43MTY5
NTJdIGNhbGxpbmcgIHJlZ2lzdGVyX25vZGVfdHlwZSsweDAvMHgyYSBAIDEKWyAgICAzLjcxNzA1
OV0gaW5pdGNhbGwgcmVnaXN0ZXJfbm9kZV90eXBlKzB4MC8weDJhIHJldHVybmVkIDAgYWZ0ZXIg
MCB1c2VjcwpbICAgIDMuNzE3MTY1XSBjYWxsaW5nICByZWdtYXBfaW5pdGNhbGwrMHgwLzB4ZCBA
IDEKWyAgICAzLjcxNzI2OF0gaW5pdGNhbGwgcmVnbWFwX2luaXRjYWxsKzB4MC8weGQgcmV0dXJu
ZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy43MTczNzNdIGNhbGxpbmcgIHNwaV9pbml0KzB4MC8w
eDk1IEAgMQpbICAgIDMuNzE3NDgyXSBpbml0Y2FsbCBzcGlfaW5pdCsweDAvMHg5NSByZXR1cm5l
ZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcxNzU4N10gY2FsbGluZyAgaTJjX2luaXQrMHgwLzB4
NmYgQCAxClsgICAgMy43MTc3MDFdIGluaXRjYWxsIGkyY19pbml0KzB4MC8weDZmIHJldHVybmVk
IDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuNzE3ODA2XSBjYWxsaW5nICBhbWRfcG9zdGNvcmVfaW5p
dCsweDAvMHg4MSBAIDEKWyAgICAzLjcxOTYxMl0gaW5pdGNhbGwgYW1kX3Bvc3Rjb3JlX2luaXQr
MHgwLzB4ODEgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy43MTk3MjFdIGNhbGxpbmcg
IGFyY2hfa2RlYnVnZnNfaW5pdCsweDAvMHgyNCBAIDEKWyAgICAzLjcxOTgyOV0gaW5pdGNhbGwg
YXJjaF9rZGVidWdmc19pbml0KzB4MC8weDI0IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAg
IDMuNzE5OTM2XSBjYWxsaW5nICBjb25maWd1cmVfdHJhbXBvbGluZXMrMHgwLzB4MjYgQCAxClsg
ICAgMy43MjAwNDddIGluaXRjYWxsIGNvbmZpZ3VyZV90cmFtcG9saW5lcysweDAvMHgyNiByZXR1
cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcyMDE1NV0gY2FsbGluZyAgbXRycl9pZl9pbml0
KzB4MC8weDY0IEAgMQpbICAgIDMuNzIwMjU3XSBpbml0Y2FsbCBtdHJyX2lmX2luaXQrMHgwLzB4
NjQgcmV0dXJuZWQgLTE5IGFmdGVyIDAgdXNlY3MKWyAgICAzLjcyMDM2Ml0gY2FsbGluZyAgZmZo
X2NzdGF0ZV9pbml0KzB4MC8weDJhIEAgMQpbICAgIDMuNzIwNDY1XSBpbml0Y2FsbCBmZmhfY3N0
YXRlX2luaXQrMHgwLzB4MmEgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy43MjA1NzFd
IGNhbGxpbmcgIGFjdGl2YXRlX2p1bXBfbGFiZWxzKzB4MC8weDMyIEAgMQpbICAgIDMuNzIwNjc1
XSBpbml0Y2FsbCBhY3RpdmF0ZV9qdW1wX2xhYmVscysweDAvMHgzMiByZXR1cm5lZCAwIGFmdGVy
IDAgdXNlY3MKWyAgICAzLjcyMDc4Ml0gY2FsbGluZyAgYWNwaV9wY2lfaW5pdCsweDAvMHg1YyBA
IDEKWyAgICAzLjcyMDg4M10gQUNQSTogYnVzIHR5cGUgcGNpIHJlZ2lzdGVyZWQKWyAgICAzLjcy
MDk4NF0gaW5pdGNhbGwgYWNwaV9wY2lfaW5pdCsweDAvMHg1YyByZXR1cm5lZCAwIGFmdGVyIDAg
dXNlY3MKWyAgICAzLjcyMTA5MV0gY2FsbGluZyAgZG1hX2J1c19pbml0KzB4MC8weDE5IEAgMQpb
ICAgIDMuNzIxMjAyXSBpbml0Y2FsbCBkbWFfYnVzX2luaXQrMHgwLzB4MTkgcmV0dXJuZWQgMCBh
ZnRlciAwIHVzZWNzClsgICAgMy43MjEzMTBdIGNhbGxpbmcgIGRtYV9jaGFubmVsX3RhYmxlX2lu
aXQrMHgwLzB4MTE4IEAgMQpbICAgIDMuNzIxNDI2XSBpbml0Y2FsbCBkbWFfY2hhbm5lbF90YWJs
ZV9pbml0KzB4MC8weDExOCByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcyMTU1Ml0g
Y2FsbGluZyAgc2V0dXBfdmNwdV9ob3RwbHVnX2V2ZW50KzB4MC8weDIyIEAgMQpbICAgIDMuNzIx
NjU1XSBpbml0Y2FsbCBzZXR1cF92Y3B1X2hvdHBsdWdfZXZlbnQrMHgwLzB4MjIgcmV0dXJuZWQg
MCBhZnRlciAwIHVzZWNzClsgICAgMy43MjE3NzddIGNhbGxpbmcgIHJlZ2lzdGVyX3hlbl9wY2lf
bm90aWZpZXIrMHgwLzB4MzEgQCAxClsgICAgMy43MjE4ODBdIGluaXRjYWxsIHJlZ2lzdGVyX3hl
bl9wY2lfbm90aWZpZXIrMHgwLzB4MzEgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy43
MjIwMDhdIGNhbGxpbmcgIGRtaV9pZF9pbml0KzB4MC8weGNhIEAgMQpbICAgIDMuNzIyMTU3XSBp
bml0Y2FsbCBkbWlfaWRfaW5pdCsweDAvMHhjYSByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAg
ICAzLjcyMjI2NF0gY2FsbGluZyAgcGNpX2FyY2hfaW5pdCsweDAvMHg2NiBAIDEKWyAgICAzLjcy
MjM5N10gUENJOiBNTUNPTkZJRyBmb3IgZG9tYWluIDAwMDAgW2J1cyAwMC1mZl0gYXQgW21lbSAw
eGUwMDAwMDAwLTB4ZWZmZmZmZmZdIChiYXNlIDB4ZTAwMDAwMDApClsgICAgMy43MjI1MjZdIFBD
STogbm90IHVzaW5nIE1NQ09ORklHClsgICAgMy43MjI2MjZdIFBDSTogVXNpbmcgY29uZmlndXJh
dGlvbiB0eXBlIDEgZm9yIGJhc2UgYWNjZXNzClsgICAgMy43MjI3MjldIGluaXRjYWxsIHBjaV9h
cmNoX2luaXQrMHgwLzB4NjYgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy43MjI4MzRd
IGNhbGxpbmcgIHRvcG9sb2d5X2luaXQrMHgwLzB4OTYgQCAxClsgICAgMy43MjMwNzRdIGluaXRj
YWxsIHRvcG9sb2d5X2luaXQrMHgwLzB4OTYgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAg
My43MjMxNzldIGNhbGxpbmcgIG10cnJfaW5pdF9maW5pYWxpemUrMHgwLzB4MzYgQCAxClsgICAg
My43MjMyODBdIGluaXRjYWxsIG10cnJfaW5pdF9maW5pYWxpemUrMHgwLzB4MzYgcmV0dXJuZWQg
MCBhZnRlciAwIHVzZWNzClsgICAgMy43MjMzODVdIGNhbGxpbmcgIGluaXRfdmRzbysweDAvMHg3
ZSBAIDEKWyAgICAzLjcyMzQ4N10gaW5pdGNhbGwgaW5pdF92ZHNvKzB4MC8weDdlIHJldHVybmVk
IDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuNzIzNTkxXSBjYWxsaW5nICBzeXNlbnRlcl9zZXR1cCsw
eDAvMHhhYiBAIDEKWyAgICAzLjcyMzY5NF0gaW5pdGNhbGwgc3lzZW50ZXJfc2V0dXArMHgwLzB4
YWIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy43MjM4MDBdIGNhbGxpbmcgIHBhcmFt
X3N5c2ZzX2luaXQrMHgwLzB4NGIgQCAxClsgICAgMy43MjQ0MThdIGluaXRjYWxsIHBhcmFtX3N5
c2ZzX2luaXQrMHgwLzB4NGIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy43MjQ1MjVd
IGNhbGxpbmcgIHBtX3N5c3JxX2luaXQrMHgwLzB4MjAgQCAxClsgICAgMy43MjQ2MjZdIGluaXRj
YWxsIHBtX3N5c3JxX2luaXQrMHgwLzB4MjAgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAg
My43MjQ3MjhdIGNhbGxpbmcgIGRlZmF1bHRfYmRpX2luaXQrMHgwLzB4YTUgQCAxClsgICAgMy43
MjQ5MThdIGluaXRjYWxsIGRlZmF1bHRfYmRpX2luaXQrMHgwLzB4YTUgcmV0dXJuZWQgMCBhZnRl
ciAwIHVzZWNzClsgICAgMy43MjUwMjRdIGNhbGxpbmcgIGluaXRfYmlvKzB4MC8weDExYSBAIDEK
WyAgICAzLjcyNTE1NF0gYmlvOiBjcmVhdGUgc2xhYiA8YmlvLTA+IGF0IDAKWyAgICAzLjcyNTI1
OF0gaW5pdGNhbGwgaW5pdF9iaW8rMHgwLzB4MTFhIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcwpb
ICAgIDMuNzI1MzYzXSBjYWxsaW5nICBmc25vdGlmeV9ub3RpZmljYXRpb25faW5pdCsweDAvMHg4
YiBAIDEKWyAgICAzLjcyNTQ3MV0gaW5pdGNhbGwgZnNub3RpZnlfbm90aWZpY2F0aW9uX2luaXQr
MHgwLzB4OGIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy43MjU1OThdIGNhbGxpbmcg
IGNyeXB0b21ncl9pbml0KzB4MC8weDEyIEAgMQpbICAgIDMuNzI1Njk5XSBpbml0Y2FsbCBjcnlw
dG9tZ3JfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcyNTgw
M10gY2FsbGluZyAgYmxrX3NldHRpbmdzX2luaXQrMHgwLzB4MmEgQCAxClsgICAgMy43MjU5MDVd
IGluaXRjYWxsIGJsa19zZXR0aW5nc19pbml0KzB4MC8weDJhIHJldHVybmVkIDAgYWZ0ZXIgMCB1
c2VjcwpbICAgIDMuNzI2MDEwXSBjYWxsaW5nICBibGtfaW9jX2luaXQrMHgwLzB4MmEgQCAxClsg
ICAgMy43MjYxMTFdIGluaXRjYWxsIGJsa19pb2NfaW5pdCsweDAvMHgyYSByZXR1cm5lZCAwIGFm
dGVyIDAgdXNlY3MKWyAgICAzLjcyNjIxOV0gY2FsbGluZyAgYmxrX3NvZnRpcnFfaW5pdCsweDAv
MHg2ZCBAIDEKWyAgICAzLjcyNjMyM10gaW5pdGNhbGwgYmxrX3NvZnRpcnFfaW5pdCsweDAvMHg2
ZCByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcyNjQyOF0gY2FsbGluZyAgYmxrX2lv
cG9sbF9zZXR1cCsweDAvMHg2ZCBAIDEKWyAgICAzLjcyNjUzMF0gaW5pdGNhbGwgYmxrX2lvcG9s
bF9zZXR1cCsweDAvMHg2ZCByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcyNjYzNl0g
Y2FsbGluZyAgZ2VuaGRfZGV2aWNlX2luaXQrMHgwLzB4NzggQCAxClsgICAgMy43MjY4MDldIGlu
aXRjYWxsIGdlbmhkX2RldmljZV9pbml0KzB4MC8weDc4IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vj
cwpbICAgIDMuNzI2OTE0XSBjYWxsaW5nICBibGtfZGV2X2ludGVncml0eV9pbml0KzB4MC8weDJh
IEAgMQpbICAgIDMuNzI3MDE0XSBpbml0Y2FsbCBibGtfZGV2X2ludGVncml0eV9pbml0KzB4MC8w
eDJhIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuNzI3MTE4XSBjYWxsaW5nICBncGlv
bGliX2RlYnVnZnNfaW5pdCsweDAvMHgyNCBAIDEKWyAgICAzLjcyNzIyM10gaW5pdGNhbGwgZ3Bp
b2xpYl9kZWJ1Z2ZzX2luaXQrMHgwLzB4MjQgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAg
My43MjczMjddIGNhbGxpbmcgIHN0bXBlX2dwaW9faW5pdCsweDAvMHgxMiBAIDEKWyAgICAzLjcy
NzQzN10gaW5pdGNhbGwgc3RtcGVfZ3Bpb19pbml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIg
MCB1c2VjcwpbICAgIDMuNzI3NTQxXSBjYWxsaW5nICBzeDE1MHhfaW5pdCsweDAvMHgxNCBAIDEK
WyAgICAzLjcyNzY0N10gaW5pdGNhbGwgc3gxNTB4X2luaXQrMHgwLzB4MTQgcmV0dXJuZWQgMCBh
ZnRlciAwIHVzZWNzClsgICAgMy43Mjc3NTBdIGNhbGxpbmcgIHRjMzU4OXhfZ3Bpb19pbml0KzB4
MC8weDEyIEAgMQpbICAgIDMuNzI3ODU0XSBpbml0Y2FsbCB0YzM1ODl4X2dwaW9faW5pdCsweDAv
MHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcyNzk2MV0gY2FsbGluZyAgcGNp
X3Nsb3RfaW5pdCsweDAvMHg1MCBAIDEKWyAgICAzLjcyODA2M10gaW5pdGNhbGwgcGNpX3Nsb3Rf
aW5pdCsweDAvMHg1MCByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcyODE2OV0gY2Fs
bGluZyAgZmJtZW1faW5pdCsweDAvMHg5OCBAIDEKWyAgICAzLjcyODI3N10gaW5pdGNhbGwgZmJt
ZW1faW5pdCsweDAvMHg5OCByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjcyODM3OV0g
Y2FsbGluZyAgYWNwaV9pbml0KzB4MC8weGI5IEAgMQpbICAgIDMuNzI4NDg4XSBBQ1BJOiBBZGRl
ZCBfT1NJKE1vZHVsZSBEZXZpY2UpClsgICAgMy43Mjg1ODhdIEFDUEk6IEFkZGVkIF9PU0koUHJv
Y2Vzc29yIERldmljZSkKWyAgICAzLjcyODY5MV0gQUNQSTogQWRkZWQgX09TSSgzLjAgX1NDUCBF
eHRlbnNpb25zKQpbICAgIDMuNzI4NzkyXSBBQ1BJOiBBZGRlZCBfT1NJKFByb2Nlc3NvciBBZ2dy
ZWdhdG9yIERldmljZSkKWyAgICAzLjczMDk0MF0gQUNQSTogRUM6IExvb2sgdXAgRUMgaW4gRFNE
VApbICAgIDMuNzMyOTgxXSBBQ1BJOiBFeGVjdXRlZCAxIGJsb2NrcyBvZiBtb2R1bGUtbGV2ZWwg
ZXhlY3V0YWJsZSBBTUwgY29kZQpbICAgIDMuNzM2NDg0XSBBQ1BJOiBTU0RUIDAwMDAwMDAwYmY1
MDQwMTggMDA4NkMgKHYwMSAgICBBTUkgICAgICBJU1QgMDAwMDAwMDEgTVNGVCAwMzAwMDAwMSkK
WyAgICAzLjczNzMxOV0gQUNQSTogRHluYW1pYyBPRU0gVGFibGUgTG9hZDoKWyAgICAzLjczNzU2
NF0gQUNQSTogU1NEVCAgICAgICAgICAgKG51bGwpIDAwODZDICh2MDEgICAgQU1JICAgICAgSVNU
IDAwMDAwMDAxIE1TRlQgMDMwMDAwMDEpClsgICAgMy43Mzc5MjFdIEFDUEk6IFNTRFQgMDAwMDAw
MDBiZjUwNWUxOCAwMDFBNCAodjAxICAgIEFNSSAgICAgIENTVCAwMDAwMDAwMSBNU0ZUIDAzMDAw
MDAxKQpbICAgIDMuNzM4Njg5XSBBQ1BJOiBEeW5hbWljIE9FTSBUYWJsZSBMb2FkOgpbICAgIDMu
NzM4OTM5XSBBQ1BJOiBTU0RUICAgICAgICAgICAobnVsbCkgMDAxQTQgKHYwMSAgICBBTUkgICAg
ICBDU1QgMDAwMDAwMDEgTVNGVCAwMzAwMDAwMSkKWyAgICAzLjczOTQ1Ml0gQUNQSTogSW50ZXJw
cmV0ZXIgZW5hYmxlZApbICAgIDMuNzM5NTUyXSBBQ1BJOiAoc3VwcG9ydHMgUzAgUzEgUzQgUzUp
ClsgICAgMy43Mzk5NTNdIEFDUEk6IFVzaW5nIElPQVBJQyBmb3IgaW50ZXJydXB0IHJvdXRpbmcK
WyAgICAzLjc0MDA5Ml0gUENJOiBNTUNPTkZJRyBmb3IgZG9tYWluIDAwMDAgW2J1cyAwMC1mZl0g
YXQgW21lbSAweGUwMDAwMDAwLTB4ZWZmZmZmZmZdIChiYXNlIDB4ZTAwMDAwMDApClsgICAgMy43
NDAzMTJdIFBDSTogTU1DT05GSUcgYXQgW21lbSAweGUwMDAwMDAwLTB4ZWZmZmZmZmZdIHJlc2Vy
dmVkIGluIEFDUEkgbW90aGVyYm9hcmQgcmVzb3VyY2VzClsgICAgMy43NDcyNjVdIEZyZWVpbmcg
aW5pdHJkIG1lbW9yeTogNDA5NzZrIGZyZWVkClsgICAgMy43NTM3ODhdIGluaXRjYWxsIDFfYXN5
bmNfcG9wdWxhdGVfcm9vdGZzKzB4MC8weDM2IHJldHVybmVkIDAgYWZ0ZXIgMzkwNjQgdXNlY3MK
WyAgICAzLjgxNjEzNV0gW0Zpcm13YXJlIEJ1Z106IEFDUEk6IEJJT1MgX09TSShMaW51eCkgcXVl
cnkgaWdub3JlZApbICAgIDMuODIxNTI0XSBpbml0Y2FsbCBhY3BpX2luaXQrMHgwLzB4YjkgcmV0
dXJuZWQgMCBhZnRlciA4OTg0OSB1c2VjcwpbICAgIDMuODIxNjMwXSBjYWxsaW5nICBkb2NrX2lu
aXQrMHgwLzB4YTUgQCAxClsgICAgMy44MjE4ODBdIEFDUEk6IE5vIGRvY2sgZGV2aWNlcyBmb3Vu
ZC4KWyAgICAzLjgyMTk4MV0gaW5pdGNhbGwgZG9ja19pbml0KzB4MC8weGE1IHJldHVybmVkIDAg
YWZ0ZXIgMCB1c2VjcwpbICAgIDMuODIyMDg1XSBjYWxsaW5nICBhY3BpX3BjaV9yb290X2luaXQr
MHgwLzB4MmQgQCAxClsgICAgMy44MjIyMjFdIEhFU1Q6IFRhYmxlIHBhcnNpbmcgaGFzIGJlZW4g
aW5pdGlhbGl6ZWQuClsgICAgMy44MjIzMjRdIFBDSTogVXNpbmcgaG9zdCBicmlkZ2Ugd2luZG93
cyBmcm9tIEFDUEk7IGlmIG5lY2Vzc2FyeSwgdXNlICJwY2k9bm9jcnMiIGFuZCByZXBvcnQgYSBi
dWcKWyAgICAzLjgyMjcyNV0gQUNQSTogUENJIFJvb3QgQnJpZGdlIFtQQ0kwXSAoZG9tYWluIDAw
MDAgW2J1cyAwMC1mZl0pClsgICAgMy44MjMxMDNdIHBjaV9yb290IFBOUDBBMDg6MDA6IGhvc3Qg
YnJpZGdlIHdpbmRvdyBbaW8gIDB4MDAwMC0weDAzYWZdClsgICAgMy44MjMyMDhdIHBjaV9yb290
IFBOUDBBMDg6MDA6IGhvc3QgYnJpZGdlIHdpbmRvdyBbaW8gIDB4MDNlMC0weDBjZjddClsgICAg
My44MjMzMTBdIHBjaV9yb290IFBOUDBBMDg6MDA6IGhvc3QgYnJpZGdlIHdpbmRvdyBbaW8gIDB4
MDNiMC0weDAzZGZdClsgICAgMy44MjM0MTZdIHBjaV9yb290IFBOUDBBMDg6MDA6IGhvc3QgYnJp
ZGdlIHdpbmRvdyBbaW8gIDB4MGQwMC0weGZmZmZdClsgICAgMy44MjM1MjJdIHBjaV9yb290IFBO
UDBBMDg6MDA6IGhvc3QgYnJpZGdlIHdpbmRvdyBbbWVtIDB4MDAwYTAwMDAtMHgwMDBiZmZmZl0K
WyAgICAzLjgyMzY0N10gcGNpX3Jvb3QgUE5QMEEwODowMDogaG9zdCBicmlkZ2Ugd2luZG93IFtt
ZW0gMHgwMDBjMDAwMC0weDAwMGRmZmZmXQpbICAgIDMuODIzNzcxXSBwY2lfcm9vdCBQTlAwQTA4
OjAwOiBob3N0IGJyaWRnZSB3aW5kb3cgW21lbSAweGYwMDAwMDAwLTB4ZmJmZmZmZmZdClsgICAg
My44MjM5MTFdIHBjaSAwMDAwOjAwOjAwLjA6IFs4MDg2OjAxMDhdIHR5cGUgMCBjbGFzcyAweDAw
MDYwMApbICAgIDMuODI0MDk5XSBwY2kgMDAwMDowMDowMS4wOiBbODA4NjowMTAxXSB0eXBlIDEg
Y2xhc3MgMHgwMDA2MDQKWyAgICAzLjgyNDI4M10gcGNpIDAwMDA6MDA6MDEuMDogUE1FIyBzdXBw
b3J0ZWQgZnJvbSBEMCBEM2hvdCBEM2NvbGQKWyAgICAzLjgyNDM5MF0gcGNpIDAwMDA6MDA6MDEu
MDogUE1FIyBkaXNhYmxlZApbICAgIDMuODI0Njc5XSBwY2kgMDAwMDowMDoxOS4wOiBbODA4Njox
NTAyXSB0eXBlIDAgY2xhc3MgMHgwMDAyMDAKWyAgICAzLjgyNDg1Nl0gcGNpIDAwMDA6MDA6MTku
MDogcmVnIDEwOiBbbWVtIDB4ZmJiMDAwMDAtMHhmYmIxZmZmZl0KWyAgICAzLjgyNDk4OV0gcGNp
IDAwMDA6MDA6MTkuMDogcmVnIDE0OiBbbWVtIDB4ZmJiMjQwMDAtMHhmYmIyNGZmZl0KWyAgICAz
LjgyNTEyNV0gcGNpIDAwMDA6MDA6MTkuMDogcmVnIDE4OiBbaW8gIDB4ZjAyMC0weGYwM2ZdClsg
ICAgMy44MjU1MTBdIHBjaSAwMDAwOjAwOjE5LjA6IFBNRSMgc3VwcG9ydGVkIGZyb20gRDAgRDNo
b3QgRDNjb2xkClsgICAgMy44MjU2MTldIHBjaSAwMDAwOjAwOjE5LjA6IFBNRSMgZGlzYWJsZWQK
WyAgICAzLjgyNTgwM10gcGNpIDAwMDA6MDA6MWEuMDogWzgwODY6MWMyZF0gdHlwZSAwIGNsYXNz
IDB4MDAwYzAzClsgICAgMy44MjU5ODBdIHBjaSAwMDAwOjAwOjFhLjA6IHJlZyAxMDogW21lbSAw
eGZiYjIzMDAwLTB4ZmJiMjMzZmZdClsgICAgMy44MjY0MzZdIHBjaSAwMDAwOjAwOjFhLjA6IFBN
RSMgc3VwcG9ydGVkIGZyb20gRDAgRDNob3QgRDNjb2xkClsgICAgMy44MjY1NDldIHBjaSAwMDAw
OjAwOjFhLjA6IFBNRSMgZGlzYWJsZWQKWyAgICAzLjgyNjczM10gcGNpIDAwMDA6MDA6MWMuMDog
WzgwODY6MWMxMF0gdHlwZSAxIGNsYXNzIDB4MDAwNjA0ClsgICAgMy44MjcyMzldIHBjaSAwMDAw
OjAwOjFjLjA6IFBNRSMgc3VwcG9ydGVkIGZyb20gRDAgRDNob3QgRDNjb2xkClsgICAgMy44Mjcz
NTVdIHBjaSAwMDAwOjAwOjFjLjA6IFBNRSMgZGlzYWJsZWQKWyAgICAzLjgyNzU3NV0gcGNpIDAw
MDA6MDA6MWMuNDogWzgwODY6MWMxOF0gdHlwZSAxIGNsYXNzIDB4MDAwNjA0ClsgICAgMy44Mjgw
NzBdIHBjaSAwMDAwOjAwOjFjLjQ6IFBNRSMgc3VwcG9ydGVkIGZyb20gRDAgRDNob3QgRDNjb2xk
ClsgICAgMy44MjgxODZdIHBjaSAwMDAwOjAwOjFjLjQ6IFBNRSMgZGlzYWJsZWQKWyAgICAzLjgy
ODQwMl0gcGNpIDAwMDA6MDA6MWQuMDogWzgwODY6MWMyNl0gdHlwZSAwIGNsYXNzIDB4MDAwYzAz
ClsgICAgMy44Mjg1ODFdIHBjaSAwMDAwOjAwOjFkLjA6IHJlZyAxMDogW21lbSAweGZiYjIyMDAw
LTB4ZmJiMjIzZmZdClsgICAgMy44MjkwMzldIHBjaSAwMDAwOjAwOjFkLjA6IFBNRSMgc3VwcG9y
dGVkIGZyb20gRDAgRDNob3QgRDNjb2xkClsgICAgMy44MjkxNTFdIHBjaSAwMDAwOjAwOjFkLjA6
IFBNRSMgZGlzYWJsZWQKWyAgICAzLjgyOTMxM10gcGNpIDAwMDA6MDA6MWUuMDogWzgwODY6MjQ0
ZV0gdHlwZSAxIGNsYXNzIDB4MDAwNjA0ClsgICAgMy44Mjk2OTJdIHBjaSAwMDAwOjAwOjFmLjA6
IFs4MDg2OjFjNTRdIHR5cGUgMCBjbGFzcyAweDAwMDYwMQpbICAgIDMuODMwMjcwXSBwY2kgMDAw
MDowMDoxZi4yOiBbODA4NjoyODIyXSB0eXBlIDAgY2xhc3MgMHgwMDAxMDQKWyAgICAzLjgzMDQ1
M10gcGNpIDAwMDA6MDA6MWYuMjogcmVnIDEwOiBbaW8gIDB4ZjA3MC0weGYwNzddClsgICAgMy44
MzA1ODRdIHBjaSAwMDAwOjAwOjFmLjI6IHJlZyAxNDogW2lvICAweGYwNjAtMHhmMDYzXQpbICAg
IDMuODMwNzE0XSBwY2kgMDAwMDowMDoxZi4yOiByZWcgMTg6IFtpbyAgMHhmMDUwLTB4ZjA1N10K
WyAgICAzLjgzMDg0Nl0gcGNpIDAwMDA6MDA6MWYuMjogcmVnIDFjOiBbaW8gIDB4ZjA0MC0weGYw
NDNdClsgICAgMy44MzA5NzVdIHBjaSAwMDAwOjAwOjFmLjI6IHJlZyAyMDogW2lvICAweGYwMDAt
MHhmMDFmXQpbICAgIDMuODMxMTA3XSBwY2kgMDAwMDowMDoxZi4yOiByZWcgMjQ6IFttZW0gMHhm
YmIyMTAwMC0weGZiYjIxN2ZmXQpbICAgIDMuODMxNDIxXSBwY2kgMDAwMDowMDoxZi4yOiBQTUUj
IHN1cHBvcnRlZCBmcm9tIEQzaG90ClsgICAgMy44MzE1MzFdIHBjaSAwMDAwOjAwOjFmLjI6IFBN
RSMgZGlzYWJsZWQKWyAgICAzLjgzMTY5M10gcGNpIDAwMDA6MDA6MWYuMzogWzgwODY6MWMyMl0g
dHlwZSAwIGNsYXNzIDB4MDAwYzA1ClsgICAgMy44MzE4NTVdIHBjaSAwMDAwOjAwOjFmLjM6IHJl
ZyAxMDogW21lbSAweGZiYjIwMDAwLTB4ZmJiMjAwZmYgNjRiaXRdClsgICAgMy44MzIwNTFdIHBj
aSAwMDAwOjAwOjFmLjM6IHJlZyAyMDogW2lvICAweDExODAtMHgxMTlmXQpbICAgIDMuODMyMzI5
XSBwY2kgMDAwMDowMTowMC4wOiBbMTAwMDowMDcyXSB0eXBlIDAgY2xhc3MgMHgwMDAxMDcKWyAg
ICAzLjgzMjQ0M10gcGNpIDAwMDA6MDE6MDAuMDogcmVnIDEwOiBbaW8gIDB4ZTAwMC0weGUwZmZd
ClsgICAgMy44MzI1NTldIHBjaSAwMDAwOjAxOjAwLjA6IHJlZyAxNDogW21lbSAweGZiYWMwMDAw
LTB4ZmJhYzNmZmYgNjRiaXRdClsgICAgMy44MzI2NzldIHBjaSAwMDAwOjAxOjAwLjA6IHJlZyAx
YzogW21lbSAweGZmYTgwMDAwLTB4ZmZhYmZmZmYgNjRiaXRdClsgICAgMy44MzI4MDJdIHBjaSAw
MDAwOjAxOjAwLjA6IHJlZyAzMDogW21lbSAweGZiYTAwMDAwLTB4ZmJhN2ZmZmYgcHJlZl0KWyAg
ICAzLjgzMjk3MV0gcGNpIDAwMDA6MDE6MDAuMDogc3VwcG9ydHMgRDEgRDIKWyAgICAzLjg0MTc4
N10gcGNpIDAwMDA6MDA6MDEuMDogUENJIGJyaWRnZSB0byBbYnVzIDAxLTAxXQpbICAgIDMuODQx
OTE0XSBwY2kgMDAwMDowMDowMS4wOiAgIGJyaWRnZSB3aW5kb3cgW2lvICAweGUwMDAtMHhlZmZm
XQpbICAgIDMuODQyMDIwXSBwY2kgMDAwMDowMDowMS4wOiAgIGJyaWRnZSB3aW5kb3cgW21lbSAw
eGZiYTAwMDAwLTB4ZmJhZmZmZmZdClsgICAgMy44NDIzNDZdIHBjaSAwMDAwOjAwOjFjLjA6IFBD
SSBicmlkZ2UgdG8gW2J1cyAwMi0wMl0KWyAgICAzLjg0MjgzOV0gcGNpIDAwMDA6MDM6MDAuMDog
WzgwODY6MTBkM10gdHlwZSAwIGNsYXNzIDB4MDAwMjAwClsgICAgMy44NDI5OTVdIHBjaSAwMDAw
OjAzOjAwLjA6IHJlZyAxMDogW21lbSAweGZiOTAwMDAwLTB4ZmI5MWZmZmZdClsgICAgMy44NDMx
NzFdIHBjaSAwMDAwOjAzOjAwLjA6IHJlZyAxODogW2lvICAweGQwMDAtMHhkMDFmXQpbICAgIDMu
ODQzMzA5XSBwY2kgMDAwMDowMzowMC4wOiByZWcgMWM6IFttZW0gMHhmYjkyMDAwMC0weGZiOTIz
ZmZmXQpbICAgIDMuODQzNzU4XSBwY2kgMDAwMDowMzowMC4wOiBQTUUjIHN1cHBvcnRlZCBmcm9t
IEQwIEQzaG90IEQzY29sZApbICAgIDMuODQzODcwXSBwY2kgMDAwMDowMzowMC4wOiBQTUUjIGRp
c2FibGVkClsgICAgMy44NTQwMjFdIHBjaSAwMDAwOjAwOjFjLjQ6IFBDSSBicmlkZ2UgdG8gW2J1
cyAwMy0wM10KWyAgICAzLjg1NDEzMF0gcGNpIDAwMDA6MDA6MWMuNDogICBicmlkZ2Ugd2luZG93
IFtpbyAgMHhkMDAwLTB4ZGZmZl0KWyAgICAzLjg1NDI0MF0gcGNpIDAwMDA6MDA6MWMuNDogICBi
cmlkZ2Ugd2luZG93IFttZW0gMHhmYjkwMDAwMC0weGZiOWZmZmZmXQpbICAgIDMuODU0NDg5XSBw
Y2kgMDAwMDowNDowMy4wOiBbMTAyYjowNTMyXSB0eXBlIDAgY2xhc3MgMHgwMDAzMDAKWyAgICAz
Ljg1NDY1MF0gcGNpIDAwMDA6MDQ6MDMuMDogcmVnIDEwOiBbbWVtIDB4ZmEwMDAwMDAtMHhmYWZm
ZmZmZiBwcmVmXQpbICAgIDMuODU0NzgyXSBwY2kgMDAwMDowNDowMy4wOiByZWcgMTQ6IFttZW0g
MHhmYjgwMDAwMC0weGZiODAzZmZmXQpbICAgIDMuODU0OTEwXSBwY2kgMDAwMDowNDowMy4wOiBy
ZWcgMTg6IFttZW0gMHhmYjAwMDAwMC0weGZiN2ZmZmZmXQpbICAgIDMuODU1Mzc1XSBwY2kgMDAw
MDowMDoxZS4wOiBQQ0kgYnJpZGdlIHRvIFtidXMgMDQtMDRdIChzdWJ0cmFjdGl2ZSBkZWNvZGUp
ClsgICAgMy44NTU0OTNdIHBjaSAwMDAwOjAwOjFlLjA6ICAgYnJpZGdlIHdpbmRvdyBbbWVtIDB4
ZmIwMDAwMDAtMHhmYjhmZmZmZl0KWyAgICAzLjg1NTYxM10gcGNpIDAwMDA6MDA6MWUuMDogICBi
cmlkZ2Ugd2luZG93IFttZW0gMHhmYTAwMDAwMC0weGZhZmZmZmZmIDY0Yml0IHByZWZdClsgICAg
My44NTU3MzddIHBjaSAwMDAwOjAwOjFlLjA6ICAgYnJpZGdlIHdpbmRvdyBbaW8gIDB4MDAwMC0w
eDAzYWZdIChzdWJ0cmFjdGl2ZSBkZWNvZGUpClsgICAgMy44NTU4NjBdIHBjaSAwMDAwOjAwOjFl
LjA6ICAgYnJpZGdlIHdpbmRvdyBbaW8gIDB4MDNlMC0weDBjZjddIChzdWJ0cmFjdGl2ZSBkZWNv
ZGUpClsgICAgMy44NTU5ODJdIHBjaSAwMDAwOjAwOjFlLjA6ICAgYnJpZGdlIHdpbmRvdyBbaW8g
IDB4MDNiMC0weDAzZGZdIChzdWJ0cmFjdGl2ZSBkZWNvZGUpClsgICAgMy44NTYxMDZdIHBjaSAw
MDAwOjAwOjFlLjA6ICAgYnJpZGdlIHdpbmRvdyBbaW8gIDB4MGQwMC0weGZmZmZdIChzdWJ0cmFj
dGl2ZSBkZWNvZGUpClsgICAgMy44NTYyMjhdIHBjaSAwMDAwOjAwOjFlLjA6ICAgYnJpZGdlIHdp
bmRvdyBbbWVtIDB4MDAwYTAwMDAtMHgwMDBiZmZmZl0gKHN1YnRyYWN0aXZlIGRlY29kZSkKWyAg
ICAzLjg1NjM1NF0gcGNpIDAwMDA6MDA6MWUuMDogICBicmlkZ2Ugd2luZG93IFttZW0gMHgwMDBj
MDAwMC0weDAwMGRmZmZmXSAoc3VidHJhY3RpdmUgZGVjb2RlKQpbICAgIDMuODU2NDgxXSBwY2kg
MDAwMDowMDoxZS4wOiAgIGJyaWRnZSB3aW5kb3cgW21lbSAweGYwMDAwMDAwLTB4ZmJmZmZmZmZd
IChzdWJ0cmFjdGl2ZSBkZWNvZGUpClsgICAgMy44NTY2NzVdIEFDUEk6IFBDSSBJbnRlcnJ1cHQg
Um91dGluZyBUYWJsZSBbXF9TQl8uUENJMC5fUFJUXQpbICAgIDMuODU2ODM2XSBBQ1BJOiBQQ0kg
SW50ZXJydXB0IFJvdXRpbmcgVGFibGUgW1xfU0JfLlBDSTAuQlIyMC5fUFJUXQpbICAgIDMuODU2
OTcwXSBBQ1BJOiBQQ0kgSW50ZXJydXB0IFJvdXRpbmcgVGFibGUgW1xfU0JfLlBDSTAuUEVYMC5f
UFJUXQpbICAgIDMuODU3MDkyXSBBQ1BJOiBQQ0kgSW50ZXJydXB0IFJvdXRpbmcgVGFibGUgW1xf
U0JfLlBDSTAuUEVYNC5fUFJUXQpbICAgIDMuODU3MjE5XSBBQ1BJOiBQQ0kgSW50ZXJydXB0IFJv
dXRpbmcgVGFibGUgW1xfU0JfLlBDSTAuUDBQMS5fUFJUXQpbICAgIDMuODU3NDMyXSAgcGNpMDAw
MDowMDogUmVxdWVzdGluZyBBQ1BJIF9PU0MgY29udHJvbCAoMHgxZCkKWyAgICAzLjg1Nzc1OV0g
IHBjaTAwMDA6MDA6IEFDUEkgX09TQyBjb250cm9sICgweDFjKSBncmFudGVkClsgICAgMy44NjA1
NjhdIGluaXRjYWxsIGFjcGlfcGNpX3Jvb3RfaW5pdCsweDAvMHgyZCByZXR1cm5lZCAwIGFmdGVy
IDM5MDY0IHVzZWNzClsgICAgMy44NjA2NzJdIGNhbGxpbmcgIGFjcGlfcGNpX2xpbmtfaW5pdCsw
eDAvMHgzZSBAIDEKWyAgICAzLjg2MDgxMF0gQUNQSTogUENJIEludGVycnVwdCBMaW5rIFtMTktB
XSAoSVJRcyAzIDQgNSA2IDcgMTAgKjExIDEyIDE0IDE1KQpbICAgIDMuODYxODE1XSBBQ1BJOiBQ
Q0kgSW50ZXJydXB0IExpbmsgW0xOS0JdIChJUlFzIDMgNCAqNSA2IDcgMTAgMTEgMTIgMTQgMTUp
ClsgICAgMy44NjI4MjhdIEFDUEk6IFBDSSBJbnRlcnJ1cHQgTGluayBbTE5LQ10gKElSUXMgMyA0
IDUgNiAxMCAqMTEgMTIgMTQgMTUpClsgICAgMy44NjM3NjRdIEFDUEk6IFBDSSBJbnRlcnJ1cHQg
TGluayBbTE5LRF0gKElSUXMgMyA0IDUgNiAxMCAqMTEgMTIgMTQgMTUpClsgICAgMy44NjQ3MDNd
IEFDUEk6IFBDSSBJbnRlcnJ1cHQgTGluayBbTE5LRV0gKElSUXMgMyA0IDUgNiAqNyAxMCAxMSAx
MiAxNCAxNSkKWyAgICAzLjg2NTcyM10gQUNQSTogUENJIEludGVycnVwdCBMaW5rIFtMTktGXSAo
SVJRcyAzIDQgNSA2IDcgMTAgMTEgMTIgMTQgMTUpICowClsgICAgMy44NjY4NDNdIEFDUEk6IFBD
SSBJbnRlcnJ1cHQgTGluayBbTE5LR10gKElSUXMgMyA0IDUgNiA3IDEwIDExIDEyIDE0IDE1KSAq
MApbICAgIDMuODY3OTU2XSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExpbmsgW0xOS0hdIChJUlFzIDMg
NCAqNSA2IDcgMTAgMTEgMTIgMTQgMTUpClsgICAgMy44Njg5NTVdIGluaXRjYWxsIGFjcGlfcGNp
X2xpbmtfaW5pdCsweDAvMHgzZSByZXR1cm5lZCAwIGFmdGVyIDc4MTIgdXNlY3MKWyAgICAzLjg2
OTA1OV0gY2FsbGluZyAgcG5wX2luaXQrMHgwLzB4MTIgQCAxClsgICAgMy44NjkxNjZdIGluaXRj
YWxsIHBucF9pbml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuODY5
MjcxXSBjYWxsaW5nICB4ZW5fc2V0dXBfc2h1dGRvd25fZXZlbnQrMHgwLzB4MzAgQCAxClsgICAg
My44NjkzNzVdIGluaXRjYWxsIHhlbl9zZXR1cF9zaHV0ZG93bl9ldmVudCsweDAvMHgzMCByZXR1
cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjg2OTQ5OV0gY2FsbGluZyAgYmFsbG9vbl9pbml0
KzB4MC8weDE5IEAgMQpbICAgIDMuODY5NjAxXSB4ZW4vYmFsbG9vbjogSW5pdGlhbGlzaW5nIGJh
bGxvb24gZHJpdmVyLgpbICAgIDMuODkxMjEwXSBpbml0Y2FsbCBiYWxsb29uX2luaXQrMHgwLzB4
MTkgcmV0dXJuZWQgMCBhZnRlciAxOTUzMiB1c2VjcwpbICAgIDMuODkxMzE5XSBjYWxsaW5nICB4
ZW5idXNfcHJvYmVfYmFja2VuZF9pbml0KzB4MC8weDJhIEAgMQpbICAgIDMuODkxNDQzXSBpbml0
Y2FsbCB4ZW5idXNfcHJvYmVfYmFja2VuZF9pbml0KzB4MC8weDJhIHJldHVybmVkIDAgYWZ0ZXIg
MCB1c2VjcwpbICAgIDMuODkxNTY3XSBjYWxsaW5nICB4ZW5idXNfcHJvYmVfZnJvbnRlbmRfaW5p
dCsweDAvMHgyYiBAIDEKWyAgICAzLjg5MTY3Nl0gaW5pdGNhbGwgeGVuYnVzX3Byb2JlX2Zyb250
ZW5kX2luaXQrMHgwLzB4MmIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy44OTE4MDFd
IGNhbGxpbmcgIGJhbGxvb25faW5pdCsweDAvMHg0MSBAIDEKWyAgICAzLjg5MTkwMV0geGVuLWJh
bGxvb246IEluaXRpYWxpc2luZyBiYWxsb29uIGRyaXZlci4KWyAgICAzLjg5MjAyMl0gaW5pdGNh
bGwgYmFsbG9vbl9pbml0KzB4MC8weDQxIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMu
ODkyMTI3XSBjYWxsaW5nICB4ZW5fc2VsZmJhbGxvb25faW5pdCsweDAvMHg4MyBAIDEKWyAgICAz
Ljg5MjIzNF0geGVuL2JhbGxvb246IFhlbiBzZWxmYmFsbG9vbmluZyBkcml2ZXIgZGlzYWJsZWQg
Zm9yIGRvbWFpbjAuClsgICAgMy44OTIzMzddIGluaXRjYWxsIHhlbl9zZWxmYmFsbG9vbl9pbml0
KzB4MC8weDgzIHJldHVybmVkIC0xOSBhZnRlciAwIHVzZWNzClsgICAgMy44OTI0NDJdIGNhbGxp
bmcgIHBtODYwN19yZWd1bGF0b3JfaW5pdCsweDAvMHgxMiBAIDEKWyAgICAzLjg5MjU1MV0gaW5p
dGNhbGwgcG04NjA3X3JlZ3VsYXRvcl9pbml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1
c2VjcwpbICAgIDMuODkyNjU2XSBjYWxsaW5nICBhYjg1MDBfcmVndWxhdG9yX2luaXQrMHgwLzB4
MmUgQCAxClsgICAgMy44OTI3NjFdIGluaXRjYWxsIGFiODUwMF9yZWd1bGF0b3JfaW5pdCsweDAv
MHgyZSByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjg5Mjg2N10gY2FsbGluZyAgbWlz
Y19pbml0KzB4MC8weGI2IEAgMQpbICAgIDMuODkyOTc0XSBpbml0Y2FsbCBtaXNjX2luaXQrMHgw
LzB4YjYgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy44OTMwNzhdIGNhbGxpbmcgIHZn
YV9hcmJfZGV2aWNlX2luaXQrMHgwLzB4ZjEgQCAxClsgICAgMy44OTMyNTldIHZnYWFyYjogZGV2
aWNlIGFkZGVkOiBQQ0k6MDAwMDowNDowMy4wLGRlY29kZXM9aW8rbWVtLG93bnM9aW8rbWVtLGxv
Y2tzPW5vbmUKWyAgICAzLjg5MzM4NV0gdmdhYXJiOiBsb2FkZWQKWyAgICAzLjg5MzQ4MV0gdmdh
YXJiOiBicmlkZ2UgY29udHJvbCBwb3NzaWJsZSAwMDAwOjA0OjAzLjAKWyAgICAzLjg5MzU4NF0g
aW5pdGNhbGwgdmdhX2FyYl9kZXZpY2VfaW5pdCsweDAvMHhmMSByZXR1cm5lZCAwIGFmdGVyIDAg
dXNlY3MKWyAgICAzLjg5MzY5MV0gY2FsbGluZyAgY25faW5pdCsweDAvMHg5ZSBAIDEKWyAgICAz
Ljg5Mzc5NV0gaW5pdGNhbGwgY25faW5pdCsweDAvMHg5ZSByZXR1cm5lZCAwIGFmdGVyIDAgdXNl
Y3MKWyAgICAzLjg5Mzg5OV0gY2FsbGluZyAgcG04NjB4X2kyY19pbml0KzB4MC8weDMwIEAgMQpb
ICAgIDMuODk0MDA2XSBpbml0Y2FsbCBwbTg2MHhfaTJjX2luaXQrMHgwLzB4MzAgcmV0dXJuZWQg
MCBhZnRlciAwIHVzZWNzClsgICAgMy44OTQxMTBdIGNhbGxpbmcgIHN0bXBlX2luaXQrMHgwLzB4
MTQgQCAxClsgICAgMy44OTQyMTRdIGluaXRjYWxsIHN0bXBlX2luaXQrMHgwLzB4MTQgcmV0dXJu
ZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy44OTQzMTddIGNhbGxpbmcgIHRjMzU4OXhfaW5pdCsw
eDAvMHgxNCBAIDEKWyAgICAzLjg5NDQyMF0gaW5pdGNhbGwgdGMzNTg5eF9pbml0KzB4MC8weDE0
IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuODk0NTIzXSBjYWxsaW5nICB3bTgzMXhf
aTJjX2luaXQrMHgwLzB4MzAgQCAxClsgICAgMy44OTQ2MjZdIGluaXRjYWxsIHdtODMxeF9pMmNf
aW5pdCsweDAvMHgzMCByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjg5NDczMV0gY2Fs
bGluZyAgd204MzF4X3NwaV9pbml0KzB4MC8weDI4IEAgMQpbICAgIDMuODk0ODM1XSBpbml0Y2Fs
bCB3bTgzMXhfc3BpX2luaXQrMHgwLzB4MjggcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAg
My44OTQ5NDBdIGNhbGxpbmcgIHdtODM1MF9pMmNfaW5pdCsweDAvMHgxNCBAIDEKWyAgICAzLjg5
NTA0Nl0gaW5pdGNhbGwgd204MzUwX2kyY19pbml0KzB4MC8weDE0IHJldHVybmVkIDAgYWZ0ZXIg
MCB1c2VjcwpbICAgIDMuODk1MTUwXSBjYWxsaW5nICB0cHM2NTkxMF9pMmNfaW5pdCsweDAvMHgx
NCBAIDEKWyAgICAzLjg5NTI1N10gaW5pdGNhbGwgdHBzNjU5MTBfaTJjX2luaXQrMHgwLzB4MTQg
cmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy44OTUzNjJdIGNhbGxpbmcgIHRwczY1OTEy
X2kyY19pbml0KzB4MC8weDMwIEAgMQpbICAgIDMuODk1NDY2XSBpbml0Y2FsbCB0cHM2NTkxMl9p
MmNfaW5pdCsweDAvMHgzMCByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjg5NTU3MV0g
Y2FsbGluZyAgdHBzNjU5MTJfc3BpX2luaXQrMHgwLzB4MjggQCAxClsgICAgMy44OTU2ODBdIGlu
aXRjYWxsIHRwczY1OTEyX3NwaV9pbml0KzB4MC8weDI4IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vj
cwpbICAgIDMuODk1Nzg0XSBjYWxsaW5nICBkYTkwM3hfaW5pdCsweDAvMHgxNCBAIDEKWyAgICAz
Ljg5NTg4N10gaW5pdGNhbGwgZGE5MDN4X2luaXQrMHgwLzB4MTQgcmV0dXJuZWQgMCBhZnRlciAw
IHVzZWNzClsgICAgMy44OTU5OTFdIGNhbGxpbmcgIG1heDg5MjVfaTJjX2luaXQrMHgwLzB4MzAg
QCAxClsgICAgMy44OTYwOTNdIGluaXRjYWxsIG1heDg5MjVfaTJjX2luaXQrMHgwLzB4MzAgcmV0
dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy44OTYxOThdIGNhbGxpbmcgIG1heDg5OTdfaTJj
X2luaXQrMHgwLzB4MTQgQCAxClsgICAgMy44OTYzMDJdIGluaXRjYWxsIG1heDg5OTdfaTJjX2lu
aXQrMHgwLzB4MTQgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy44OTY0MDZdIGNhbGxp
bmcgIG1heDg5OThfaTJjX2luaXQrMHgwLzB4MTQgQCAxClsgICAgMy44OTY1MTBdIGluaXRjYWxs
IG1heDg5OThfaTJjX2luaXQrMHgwLzB4MTQgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAg
My44OTY2MTNdIGNhbGxpbmcgIGFiMzEwMF9pMmNfaW5pdCsweDAvMHgxNCBAIDEKWyAgICAzLjg5
NjcxOF0gaW5pdGNhbGwgYWIzMTAwX2kyY19pbml0KzB4MC8weDE0IHJldHVybmVkIDAgYWZ0ZXIg
MCB1c2VjcwpbICAgIDMuODk2ODIzXSBjYWxsaW5nICBhYjg1MDBfc3lzY3RybF9pbml0KzB4MC8w
eDEyIEAgMQpbICAgIDMuODk2OTMyXSBpbml0Y2FsbCBhYjg1MDBfc3lzY3RybF9pbml0KzB4MC8w
eDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuODk3MDM2XSBjYWxsaW5nICBhYjg1
MDBfZGVidWdfaW5pdCsweDAvMHgxMiBAIDEKWyAgICAzLjg5NzE0Ml0gaW5pdGNhbGwgYWI4NTAw
X2RlYnVnX2luaXQrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy44OTcy
NDddIGNhbGxpbmcgIHRwczY1ODZ4X2luaXQrMHgwLzB4MTQgQCAxClsgICAgMy44OTczNTJdIGlu
aXRjYWxsIHRwczY1ODZ4X2luaXQrMHgwLzB4MTQgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsg
ICAgMy44OTc0NTNdIGNhbGxpbmcgIGFhdDI4NzBfaW5pdCsweDAvMHgxNCBAIDEKWyAgICAzLjg5
NzU1N10gaTJjLWNvcmU6IGRyaXZlciBbYWF0Mjg3MF0gdXNpbmcgbGVnYWN5IHN1c3BlbmQgbWV0
aG9kClsgICAgMy44OTc2NjBdIGkyYy1jb3JlOiBkcml2ZXIgW2FhdDI4NzBdIHVzaW5nIGxlZ2Fj
eSByZXN1bWUgbWV0aG9kClsgICAgMy44OTc3NjVdIGluaXRjYWxsIGFhdDI4NzBfaW5pdCsweDAv
MHgxNCByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjg5Nzg2OF0gY2FsbGluZyAgaW5p
dF9zY3NpKzB4MC8weDhlIEAgMQpbICAgIDMuODk4MDEyXSBTQ1NJIHN1YnN5c3RlbSBpbml0aWFs
aXplZApbICAgIDMuODk4MTEyXSBpbml0Y2FsbCBpbml0X3Njc2krMHgwLzB4OGUgcmV0dXJuZWQg
MCBhZnRlciAwIHVzZWNzClsgICAgMy44OTgyMTNdIGNhbGxpbmcgIGF0YV9pbml0KzB4MC8weDVj
IEAgMQpbICAgIDMuODk4MzY3XSBsaWJhdGEgdmVyc2lvbiAzLjAwIGxvYWRlZC4KWyAgICAzLjg5
ODQ2OF0gaW5pdGNhbGwgYXRhX2luaXQrMHgwLzB4NWMgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNz
ClsgICAgMy44OTg1NzFdIGNhbGxpbmcgIHBoeV9pbml0KzB4MC8weDJlIEAgMQpbICAgIDMuODk4
Njg4XSBpbml0Y2FsbCBwaHlfaW5pdCsweDAvMHgyZSByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MK
WyAgICAzLjg5ODc5M10gY2FsbGluZyAgdXNiX2luaXQrMHgwLzB4MTVjIEAgMQpbICAgIDMuODk4
OTExXSB1c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBpbnRlcmZhY2UgZHJpdmVyIHVzYmZzClsgICAg
My44OTkwMTldIHVzYmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgaHViClsg
ICAgMy44OTkxNTRdIHVzYmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGRldmljZSBkcml2ZXIgdXNiClsg
ICAgMy44OTkyNTddIGluaXRjYWxsIHVzYl9pbml0KzB4MC8weDE1YyByZXR1cm5lZCAwIGFmdGVy
IDAgdXNlY3MKWyAgICAzLjg5OTM2MV0gY2FsbGluZyAgc2VyaW9faW5pdCsweDAvMHgyZSBAIDEK
WyAgICAzLjg5OTQ2NV0gaW5pdGNhbGwgc2VyaW9faW5pdCsweDAvMHgyZSByZXR1cm5lZCAwIGFm
dGVyIDAgdXNlY3MKWyAgICAzLjg5OTU3MF0gY2FsbGluZyAgaW5wdXRfaW5pdCsweDAvMHgzYyBA
IDEKWyAgICAzLjg5OTY3Nl0gaW5pdGNhbGwgaW5wdXRfaW5pdCsweDAvMHgzYyByZXR1cm5lZCAw
IGFmdGVyIDAgdXNlY3MKWyAgICAzLjg5OTc4M10gY2FsbGluZyAgcnRjX2luaXQrMHgwLzB4NmEg
QCAxClsgICAgMy44OTk4ODZdIGluaXRjYWxsIHJ0Y19pbml0KzB4MC8weDZhIHJldHVybmVkIDAg
YWZ0ZXIgMCB1c2VjcwpbICAgIDMuODk5OTg4XSBjYWxsaW5nICBwb3dlcl9zdXBwbHlfY2xhc3Nf
aW5pdCsweDAvMHg0MCBAIDEKWyAgICAzLjkwMDA5NF0gaW5pdGNhbGwgcG93ZXJfc3VwcGx5X2Ns
YXNzX2luaXQrMHgwLzB4NDAgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy45MDAyMThd
IGNhbGxpbmcgIGh3bW9uX2luaXQrMHgwLzB4NDcgQCAxClsgICAgMy45MDAzMjFdIGluaXRjYWxs
IGh3bW9uX2luaXQrMHgwLzB4NDcgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy45MDA0
MjNdIGNhbGxpbmcgIG1kX2luaXQrMHgwLzB4MTQwIEAgMQpbICAgIDMuOTAwNTU2XSBpbml0Y2Fs
bCBtZF9pbml0KzB4MC8weDE0MCByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjkwMDY2
MF0gY2FsbGluZyAgbW1jX2luaXQrMHgwLzB4NzEgQCAxClsgICAgMy45MDA3NzVdIGluaXRjYWxs
IG1tY19pbml0KzB4MC8weDcxIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuOTAwODc5
XSBjYWxsaW5nICBsZWRzX2luaXQrMHgwLzB4NDQgQCAxClsgICAgMy45MDA5ODNdIGluaXRjYWxs
IGxlZHNfaW5pdCsweDAvMHg0NCByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjkwMTA4
Nl0gY2FsbGluZyAgZGV2ZnJlcV9pbml0KzB4MC8weDUxIEAgMQpbICAgIDMuOTAxMTkxXSBpbml0
Y2FsbCBkZXZmcmVxX2luaXQrMHgwLzB4NTEgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAg
My45MDEyOTZdIGNhbGxpbmcgIHBjaV9zdWJzeXNfaW5pdCsweDAvMHg0YSBAIDEKWyAgICAzLjkw
MTM5Nl0gUENJOiBVc2luZyBBQ1BJIGZvciBJUlEgcm91dGluZwpbICAgIDMuOTMzOTk5XSBQQ0k6
IHBjaV9jYWNoZV9saW5lX3NpemUgc2V0IHRvIDY0IGJ5dGVzClsgICAgMy45MzQxNTldIHBjaSAw
MDAwOjAxOjAwLjA6IG5vIGNvbXBhdGlibGUgYnJpZGdlIHdpbmRvdyBmb3IgW21lbSAweGZmYTgw
MDAwLTB4ZmZhYmZmZmYgNjRiaXRdClsgICAgMy45MzQ0MjBdIHJlc2VydmUgUkFNIGJ1ZmZlcjog
MDAwMDAwMDAwMDA4ZDAwMCAtIDAwMDAwMDAwMDAwOGZmZmYgClsgICAgMy45MzQ1MDNdIHJlc2Vy
dmUgUkFNIGJ1ZmZlcjogMDAwMDAwMDBiZTdhNTAwMCAtIDAwMDAwMDAwYmZmZmZmZmYgClsgICAg
My45MzQ2NzldIHJlc2VydmUgUkFNIGJ1ZmZlcjogMDAwMDAwMDBiZjRhZjAwMCAtIDAwMDAwMDAw
YmZmZmZmZmYgClsgICAgMy45MzQ4NTBdIHJlc2VydmUgUkFNIGJ1ZmZlcjogMDAwMDAwMDBiZjgw
MDAwMCAtIDAwMDAwMDAwYmZmZmZmZmYgClsgICAgMy45MzUwMjBdIHJlc2VydmUgUkFNIGJ1ZmZl
cjogMDAwMDAwMDMwMTVjZjAwMCAtIDAwMDAwMDAzMDNmZmZmZmYgClsgICAgMy45MzUxOTVdIGlu
aXRjYWxsIHBjaV9zdWJzeXNfaW5pdCsweDAvMHg0YSByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MK
WyAgICAzLjkzNTM4NF0gY2FsbGluZyAgcHJvdG9faW5pdCsweDAvMHgxMiBAIDEKWyAgICAzLjkz
NTQ4Ml0gaW5pdGNhbGwgcHJvdG9faW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNl
Y3MKWyAgICAzLjkzNTU4NF0gY2FsbGluZyAgbmV0X2Rldl9pbml0KzB4MC8weDIzNyBAIDEKWyAg
ICAzLjkzNTc0Nl0gaW5pdGNhbGwgbmV0X2Rldl9pbml0KzB4MC8weDIzNyByZXR1cm5lZCAwIGFm
dGVyIDM5MDYgdXNlY3MKWyAgICAzLjkzNTg0OV0gY2FsbGluZyAgbmVpZ2hfaW5pdCsweDAvMHg4
MCBAIDEKWyAgICAzLjkzNTk0N10gaW5pdGNhbGwgbmVpZ2hfaW5pdCsweDAvMHg4MCByZXR1cm5l
ZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjkzNjA0OV0gY2FsbGluZyAgZmliX3J1bGVzX2luaXQr
MHgwLzB4YWMgQCAxClsgICAgMy45MzYxNDhdIGluaXRjYWxsIGZpYl9ydWxlc19pbml0KzB4MC8w
eGFjIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuOTM2MjQ2XSBjYWxsaW5nICBwa3Rz
Y2hlZF9pbml0KzB4MC8weGZjIEAgMQpbICAgIDMuOTM2MzQ2XSBpbml0Y2FsbCBwa3RzY2hlZF9p
bml0KzB4MC8weGZjIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuOTM2NDQ3XSBjYWxs
aW5nICB0Y19maWx0ZXJfaW5pdCsweDAvMHg1NSBAIDEKWyAgICAzLjkzNjU0Nl0gaW5pdGNhbGwg
dGNfZmlsdGVyX2luaXQrMHgwLzB4NTUgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy45
MzY2NDhdIGNhbGxpbmcgIHRjX2FjdGlvbl9pbml0KzB4MC8weDU1IEAgMQpbICAgIDMuOTM2NzQ5
XSBpbml0Y2FsbCB0Y19hY3Rpb25faW5pdCsweDAvMHg1NSByZXR1cm5lZCAwIGFmdGVyIDAgdXNl
Y3MKWyAgICAzLjkzNjg1MF0gY2FsbGluZyAgZ2VubF9pbml0KzB4MC8weDkxIEAgMQpbICAgIDMu
OTM2OTU5XSBpbml0Y2FsbCBnZW5sX2luaXQrMHgwLzB4OTEgcmV0dXJuZWQgMCBhZnRlciAwIHVz
ZWNzClsgICAgMy45MzcwNjFdIGNhbGxpbmcgIGNpcHNvX3Y0X2luaXQrMHgwLzB4NWUgQCAxClsg
ICAgMy45MzcxNjJdIGluaXRjYWxsIGNpcHNvX3Y0X2luaXQrMHgwLzB4NWUgcmV0dXJuZWQgMCBh
ZnRlciAwIHVzZWNzClsgICAgMy45MzcyNjVdIGNhbGxpbmcgIHdpcmVsZXNzX25sZXZlbnRfaW5p
dCsweDAvMHgxMiBAIDEKWyAgICAzLjkzNzM2MV0gaW5pdGNhbGwgd2lyZWxlc3NfbmxldmVudF9p
bml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuOTM5MTg2XSBjYWxs
aW5nICBuZXRsYmxfaW5pdCsweDAvMHg4MSBAIDEKWyAgICAzLjkzOTI4Nl0gTmV0TGFiZWw6IElu
aXRpYWxpemluZwpbICAgIDMuOTM5Mzg2XSBOZXRMYWJlbDogIGRvbWFpbiBoYXNoIHNpemUgPSAx
MjgKWyAgICAzLjkzOTQ4M10gTmV0TGFiZWw6ICBwcm90b2NvbHMgPSBVTkxBQkVMRUQgQ0lQU092
NApbICAgIDMuOTM5NTkwXSBOZXRMYWJlbDogIHVubGFiZWxlZCB0cmFmZmljIGFsbG93ZWQgYnkg
ZGVmYXVsdApbICAgIDMuOTM5NjkyXSBpbml0Y2FsbCBuZXRsYmxfaW5pdCsweDAvMHg4MSByZXR1
cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjkzOTc5Nl0gY2FsbGluZyAgcmZraWxsX2luaXQr
MHgwLzB4OTUgQCAxClsgICAgMy45Mzk5MzNdIGluaXRjYWxsIHJma2lsbF9pbml0KzB4MC8weDk1
IHJldHVybmVkIDAgYWZ0ZXIgMzkwNiB1c2VjcwpbICAgIDMuOTQwMDM4XSBjYWxsaW5nICBzeXNj
dGxfaW5pdCsweDAvMHg0OCBAIDEKWyAgICAzLjk0MDEzN10gaW5pdGNhbGwgc3lzY3RsX2luaXQr
MHgwLzB4NDggcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy45NDAyNDBdIGNhbGxpbmcg
IGFiODUwMF9ncGFkY19pbml0KzB4MC8weDEyIEAgMQpbICAgIDMuOTQwMzUxXSBpbml0Y2FsbCBh
Yjg1MDBfZ3BhZGNfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAz
Ljk0MDQ1OF0gY2FsbGluZyAgaHBldF9sYXRlX2luaXQrMHgwLzB4NGEgQCAxClsgICAgMy45NDA1
NTldIGluaXRjYWxsIGhwZXRfbGF0ZV9pbml0KzB4MC8weDRhIHJldHVybmVkIC0xOSBhZnRlciAw
IHVzZWNzClsgICAgMy45NDA2NjNdIGNhbGxpbmcgIGluaXRfYW1kX25icysweDAvMHgzZCBAIDEK
WyAgICAzLjk0MDc3MF0gaW5pdGNhbGwgaW5pdF9hbWRfbmJzKzB4MC8weDNkIHJldHVybmVkIDAg
YWZ0ZXIgMCB1c2VjcwpbICAgIDMuOTQwODc1XSBjYWxsaW5nICBjbG9ja3NvdXJjZV9kb25lX2Jv
b3RpbmcrMHgwLzB4NWEgQCAxClsgICAgMy45NDA5NzldIFN3aXRjaGluZyB0byBjbG9ja3NvdXJj
ZSB4ZW4KWyAgICAzLjk0MTA5MF0gaW5pdGNhbGwgY2xvY2tzb3VyY2VfZG9uZV9ib290aW5nKzB4
MC8weDVhIHJldHVybmVkIDAgYWZ0ZXIgMiB1c2VjcwpbICAgIDMuOTQxMjE1XSBjYWxsaW5nICBm
dHJhY2VfaW5pdF9kZWJ1Z2ZzKzB4MC8weGQzIEAgMQpbICAgIDMuOTQxMzMwXSBpbml0Y2FsbCBm
dHJhY2VfaW5pdF9kZWJ1Z2ZzKzB4MC8weGQzIHJldHVybmVkIDAgYWZ0ZXIgMTIgdXNlY3MKWyAg
ICAzLjk0MTQzNV0gY2FsbGluZyAgcmJfaW5pdF9kZWJ1Z2ZzKzB4MC8weDJmIEAgMQpbICAgIDMu
OTQxNTM5XSBpbml0Y2FsbCByYl9pbml0X2RlYnVnZnMrMHgwLzB4MmYgcmV0dXJuZWQgMCBhZnRl
ciAwIHVzZWNzClsgICAgMy45NDE2NDRdIGNhbGxpbmcgIHRyYWNlcl9pbml0X2RlYnVnZnMrMHgw
LzB4MmZjIEAgMQpbICAgIDMuOTQxNzk0XSBpbml0Y2FsbCB0cmFjZXJfaW5pdF9kZWJ1Z2ZzKzB4
MC8weDJmYyByZXR1cm5lZCAwIGFmdGVyIDQ2IHVzZWNzClsgICAgMy45NDE5MDBdIGNhbGxpbmcg
IGluaXRfdHJhY2VfcHJpbnRrX2Z1bmN0aW9uX2V4cG9ydCsweDAvMHgyZiBAIDEKWyAgICAzLjk0
MjAwNl0gaW5pdGNhbGwgaW5pdF90cmFjZV9wcmludGtfZnVuY3Rpb25fZXhwb3J0KzB4MC8weDJm
IHJldHVybmVkIDAgYWZ0ZXIgMSB1c2VjcwpbICAgIDMuOTQyMTI3XSBjYWxsaW5nICBldmVudF90
cmFjZV9pbml0KzB4MC8weDFiNSBAIDEKWyAgICAzLjk0NzEyMl0gaW5pdGNhbGwgZXZlbnRfdHJh
Y2VfaW5pdCsweDAvMHgxYjUgcmV0dXJuZWQgMCBhZnRlciA0Nzc2IHVzZWNzClsgICAgMy45NDcy
MjldIGNhbGxpbmcgIGluaXRfa3Byb2JlX3RyYWNlKzB4MC8weDk0IEAgMQpbICAgIDMuOTQ3MzM1
XSBpbml0Y2FsbCBpbml0X2twcm9iZV90cmFjZSsweDAvMHg5NCByZXR1cm5lZCAwIGFmdGVyIDMg
dXNlY3MKWyAgICAzLjk0NzQ0MV0gY2FsbGluZyAgaW5pdF9waXBlX2ZzKzB4MC8weDRiIEAgMQpb
ICAgIDMuOTQ3NTQ5XSBpbml0Y2FsbCBpbml0X3BpcGVfZnMrMHgwLzB4NGIgcmV0dXJuZWQgMCBh
ZnRlciA4IHVzZWNzClsgICAgMy45NDc2NTRdIGNhbGxpbmcgIGV2ZW50cG9sbF9pbml0KzB4MC8w
eGRhIEAgMQpbICAgIDMuOTQ3NzU2XSBpbml0Y2FsbCBldmVudHBvbGxfaW5pdCsweDAvMHhkYSBy
ZXR1cm5lZCAwIGFmdGVyIDEgdXNlY3MKWyAgICAzLjk0Nzg1OF0gY2FsbGluZyAgYW5vbl9pbm9k
ZV9pbml0KzB4MC8weDdkIEAgMQpbICAgIDMuOTQ3OTY1XSBpbml0Y2FsbCBhbm9uX2lub2RlX2lu
aXQrMHgwLzB4N2QgcmV0dXJuZWQgMCBhZnRlciA0IHVzZWNzClsgICAgMy45NDgwNzBdIGNhbGxp
bmcgIHRvbW95b19pbml0ZXJmYWNlX2luaXQrMHgwLzB4MjcgQCAxClsgICAgMy45NDgxNjldIGlu
aXRjYWxsIHRvbW95b19pbml0ZXJmYWNlX2luaXQrMHgwLzB4MjcgcmV0dXJuZWQgMCBhZnRlciAw
IHVzZWNzClsgICAgMy45NDgyNzVdIGNhbGxpbmcgIGFhX2NyZWF0ZV9hYWZzKzB4MC8weDkyIEAg
MQpbICAgIDMuOTQ4NDAzXSBBcHBBcm1vcjogQXBwQXJtb3IgRmlsZXN5c3RlbSBFbmFibGVkClsg
ICAgMy45NDg1MDRdIGluaXRjYWxsIGFhX2NyZWF0ZV9hYWZzKzB4MC8weDkyIHJldHVybmVkIDAg
YWZ0ZXIgMTI0IHVzZWNzClsgICAgMy45NDg2MDddIGNhbGxpbmcgIGJsa19zY3NpX2lvY3RsX2lu
aXQrMHgwLzB4ZCBAIDEKWyAgICAzLjk0ODcwN10gaW5pdGNhbGwgYmxrX3Njc2lfaW9jdGxfaW5p
dCsweDAvMHhkIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuOTQ4ODEwXSBjYWxsaW5n
ICBhY3BpX2V2ZW50X2luaXQrMHgwLzB4N2QgQCAxClsgICAgMy45NDg5MTddIGluaXRjYWxsIGFj
cGlfZXZlbnRfaW5pdCsweDAvMHg3ZCByZXR1cm5lZCAwIGFmdGVyIDUgdXNlY3MKWyAgICAzLjk0
OTAyMl0gY2FsbGluZyAgcG5wX3N5c3RlbV9pbml0KzB4MC8weDEyIEAgMQpbICAgIDMuOTQ5MTM5
XSBpbml0Y2FsbCBwbnBfc3lzdGVtX2luaXQrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAxMyB1
c2VjcwpbICAgIDMuOTQ5MjQ0XSBjYWxsaW5nICBwbnBhY3BpX2luaXQrMHgwLzB4OGMgQCAxClsg
ICAgMy45NDkzNDVdIHBucDogUG5QIEFDUEkgaW5pdApbICAgIDMuOTQ5NDUzXSBBQ1BJOiBidXMg
dHlwZSBwbnAgcmVnaXN0ZXJlZApbICAgIDMuOTQ5NzIwXSBwbnAgMDA6MDA6IFtidXMgMDAtZmZd
ClsgICAgMy45NDk4MTldIHBucCAwMDowMDogW2lvICAweDBjZjgtMHgwY2ZmXQpbICAgIDMuOTQ5
OTIwXSBwbnAgMDA6MDA6IFtpbyAgMHgwMDAwLTB4MDNhZiB3aW5kb3ddClsgICAgMy45NTAwMjFd
IHBucCAwMDowMDogW2lvICAweDAzZTAtMHgwY2Y3IHdpbmRvd10KWyAgICAzLjk1MDEyMl0gcG5w
IDAwOjAwOiBbaW8gIDB4MDNiMC0weDAzZGYgd2luZG93XQpbICAgIDMuOTUwMjI0XSBwbnAgMDA6
MDA6IFtpbyAgMHgwZDAwLTB4ZmZmZiB3aW5kb3ddClsgICAgMy45NTAzMjZdIHBucCAwMDowMDog
W21lbSAweDAwMGEwMDAwLTB4MDAwYmZmZmYgd2luZG93XQpbICAgIDMuOTUwNDI4XSBwbnAgMDA6
MDA6IFttZW0gMHgwMDBjMDAwMC0weDAwMGRmZmZmIHdpbmRvd10KWyAgICAzLjk1MDUyOV0gcG5w
IDAwOjAwOiBbbWVtIDB4ZjAwMDAwMDAtMHhmYmZmZmZmZiB3aW5kb3ddClsgICAgMy45NTA2MzFd
IHBucCAwMDowMDogW21lbSAweDAwMDAwMDAwIHdpbmRvd10KWyAgICAzLjk1MDc4OF0gcG5wIDAw
OjAwOiBQbHVnIGFuZCBQbGF5IEFDUEkgZGV2aWNlLCBJRHMgUE5QMGEwOCBQTlAwYTAzIChhY3Rp
dmUpClsgICAgMy45NTA5ODFdIHBucCAwMDowMTogW21lbSAweGZlZDEwMDAwLTB4ZmVkMTlmZmZd
ClsgICAgMy45NTEwODFdIHBucCAwMDowMTogW21lbSAweGUwMDAwMDAwLTB4ZWZmZmZmZmZdClsg
ICAgMy45NTExODJdIHBucCAwMDowMTogW21lbSAweGZlZDkwMDAwLTB4ZmVkOTNmZmZdClsgICAg
My45NTEyODRdIHBucCAwMDowMTogW21lbSAweGZlZDIwMDAwLTB4ZmVkM2ZmZmZdClsgICAgMy45
NTEzODVdIHBucCAwMDowMTogW21lbSAweGZlZTAwMDAwLTB4ZmVlMGZmZmZdClsgICAgMy45NTE1
MTVdIHN5c3RlbSAwMDowMTogW21lbSAweGZlZDEwMDAwLTB4ZmVkMTlmZmZdIGhhcyBiZWVuIHJl
c2VydmVkClsgICAgMy45NTE2MTldIHN5c3RlbSAwMDowMTogW21lbSAweGUwMDAwMDAwLTB4ZWZm
ZmZmZmZdIGhhcyBiZWVuIHJlc2VydmVkClsgICAgMy45NTE3MjJdIHN5c3RlbSAwMDowMTogW21l
bSAweGZlZDkwMDAwLTB4ZmVkOTNmZmZdIGhhcyBiZWVuIHJlc2VydmVkClsgICAgMy45NTE4MjZd
IHN5c3RlbSAwMDowMTogW21lbSAweGZlZDIwMDAwLTB4ZmVkM2ZmZmZdIGhhcyBiZWVuIHJlc2Vy
dmVkClsgICAgMy45NTE5MzFdIHN5c3RlbSAwMDowMTogW21lbSAweGZlZTAwMDAwLTB4ZmVlMGZm
ZmZdIGNvdWxkIG5vdCBiZSByZXNlcnZlZApbICAgIDMuOTUyMDM3XSBzeXN0ZW0gMDA6MDE6IFBs
dWcgYW5kIFBsYXkgQUNQSSBkZXZpY2UsIElEcyBQTlAwYzAxIChhY3RpdmUpClsgICAgMy45NTIx
NTNdIHBucCAwMDowMjogW2RtYSA0XQpbICAgIDMuOTUyMjUxXSBwbnAgMDA6MDI6IFtpbyAgMHgw
MDAwLTB4MDAwZl0KWyAgICAzLjk1MjM1MF0gcG5wIDAwOjAyOiBbaW8gIDB4MDA4MS0weDAwODNd
ClsgICAgMy45NTI0NTFdIHBucCAwMDowMjogW2lvICAweDAwODddClsgICAgMy45NTI1NDldIHBu
cCAwMDowMjogW2lvICAweDAwODktMHgwMDhiXQpbICAgIDMuOTUyNjQ4XSBwbnAgMDA6MDI6IFtp
byAgMHgwMDhmXQpbICAgIDMuOTUyNzQ2XSBwbnAgMDA6MDI6IFtpbyAgMHgwMGMwLTB4MDBkZl0K
WyAgICAzLjk1Mjg2NF0gcG5wIDAwOjAyOiBQbHVnIGFuZCBQbGF5IEFDUEkgZGV2aWNlLCBJRHMg
UE5QMDIwMCAoYWN0aXZlKQpbICAgIDMuOTUyOTc4XSBwbnAgMDA6MDM6IFtpbyAgMHgwMDcwLTB4
MDA3MV0KWyAgICAzLjk1MzA3OF0geGVuOiByZWdpc3RlcmluZyBnc2kgOCB0cmlnZ2VyaW5nIDEg
cG9sYXJpdHkgMApbICAgIDMuOTUzMTg4XSB4ZW5fbWFwX3BpcnFfZ3NpOiByZXR1cm5pbmcgaXJx
IDggZm9yIGdzaSA4ClsgICAgMy45NTMyOTFdIHhlbjogLS0+IHBpcnE9OCAtPiBpcnE9OCAoZ3Np
PTgpClsgICAgMy45NTM0MTldIHBucCAwMDowMzogW2lycSA4XQpbICAgIDMuOTUzNTM0XSBwbnAg
MDA6MDM6IFBsdWcgYW5kIFBsYXkgQUNQSSBkZXZpY2UsIElEcyBQTlAwYjAwIChhY3RpdmUpClsg
ICAgMy45NTM2NDRdIHBucCAwMDowNDogW2lvICAweDAwNjFdClsgICAgMy45NTM3NTddIHBucCAw
MDowNDogUGx1ZyBhbmQgUGxheSBBQ1BJIGRldmljZSwgSURzIFBOUDA4MDAgKGFjdGl2ZSkKWyAg
ICAzLjk1Mzg3OV0gcG5wIDAwOjA1OiBbaW8gIDB4MDAxMC0weDAwMWZdClsgICAgMy45NTM5Nzhd
IHBucCAwMDowNTogW2lvICAweDAwMjItMHgwMDNmXQpbICAgIDMuOTU0MDc3XSBwbnAgMDA6MDU6
IFtpbyAgMHgwMDQ0LTB4MDA1Zl0KWyAgICAzLjk1NDE3N10gcG5wIDAwOjA1OiBbaW8gIDB4MDA2
Mi0weDAwNjNdClsgICAgMy45NTQyNzhdIHBucCAwMDowNTogW2lvICAweDAwNjUtMHgwMDZmXQpb
ICAgIDMuOTU0Mzc2XSBwbnAgMDA6MDU6IFtpbyAgMHgwMDcyLTB4MDA3Zl0KWyAgICAzLjk1NDQ3
NF0gcG5wIDAwOjA1OiBbaW8gIDB4MDA4MF0KWyAgICAzLjk1NDU3Ml0gcG5wIDAwOjA1OiBbaW8g
IDB4MDA4NC0weDAwODZdClsgICAgMy45NTQ2NzJdIHBucCAwMDowNTogW2lvICAweDAwODhdClsg
ICAgMy45NTQ3NjhdIHBucCAwMDowNTogW2lvICAweDAwOGMtMHgwMDhlXQpbICAgIDMuOTU0ODY4
XSBwbnAgMDA6MDU6IFtpbyAgMHgwMDkwLTB4MDA5Zl0KWyAgICAzLjk1NDk2OV0gcG5wIDAwOjA1
OiBbaW8gIDB4MDBhMi0weDAwYmZdClsgICAgMy45NTUwNjhdIHBucCAwMDowNTogW2lvICAweDAw
ZTAtMHgwMGVmXQpbICAgIDMuOTU1MTY4XSBwbnAgMDA6MDU6IFtpbyAgMHgwNGQwLTB4MDRkMV0K
WyAgICAzLjk1NTI5N10gc3lzdGVtIDAwOjA1OiBbaW8gIDB4MDRkMC0weDA0ZDFdIGhhcyBiZWVu
IHJlc2VydmVkClsgICAgMy45NTU0MDBdIHN5c3RlbSAwMDowNTogUGx1ZyBhbmQgUGxheSBBQ1BJ
IGRldmljZSwgSURzIFBOUDBjMDIgKGFjdGl2ZSkKWyAgICAzLjk1NTUxMF0gcG5wIDAwOjA2OiBb
aW8gIDB4MDBmMC0weDAwZmZdClsgICAgMy45NTU2MTBdIHhlbjogcmVnaXN0ZXJpbmcgZ3NpIDEz
IHRyaWdnZXJpbmcgMSBwb2xhcml0eSAwClsgICAgMy45NTU3MTJdIHhlbl9tYXBfcGlycV9nc2k6
IHJldHVybmluZyBpcnEgMTMgZm9yIGdzaSAxMwpbICAgIDMuOTU1ODEzXSB4ZW46IC0tPiBwaXJx
PTEzIC0+IGlycT0xMyAoZ3NpPTEzKQpbICAgIDMuOTU1OTQyXSBwbnAgMDA6MDY6IFtpcnEgMTNd
ClsgICAgMy45NTYwNTddIHBucCAwMDowNjogUGx1ZyBhbmQgUGxheSBBQ1BJIGRldmljZSwgSURz
IFBOUDBjMDQgKGFjdGl2ZSkKWyAgICAzLjk1NjI0OV0gcG5wIDAwOjA3OiBbaW8gIDB4MDAwMC0w
eGZmZmZmZmZmZmZmZmZmZmYgZGlzYWJsZWRdClsgICAgMy45NTYzNTNdIHBucCAwMDowNzogW2lv
ICAweDBhMDAtMHgwYTFmXQpbICAgIDMuOTU2NDUxXSBwbnAgMDA6MDc6IFtpbyAgMHgwYTMwLTB4
MGEzZl0KWyAgICAzLjk1NjU1Ml0gcG5wIDAwOjA3OiBbaW8gIDB4MDAwMC0weGZmZmZmZmZmZmZm
ZmZmZmYgZGlzYWJsZWRdClsgICAgMy45NTY2ODNdIHN5c3RlbSAwMDowNzogW2lvICAweDBhMDAt
MHgwYTFmXSBoYXMgYmVlbiByZXNlcnZlZApbICAgIDMuOTU2Nzg2XSBzeXN0ZW0gMDA6MDc6IFtp
byAgMHgwYTMwLTB4MGEzZl0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAzLjk1Njg5MF0gc3lzdGVt
IDAwOjA3OiBQbHVnIGFuZCBQbGF5IEFDUEkgZGV2aWNlLCBJRHMgUE5QMGMwMiAoYWN0aXZlKQpb
ICAgIDMuOTU3MDEwXSBwbnAgMDA6MDg6IFtpbyAgMHgwMDYwXQpbICAgIDMuOTU3MTExXSBwbnAg
MDA6MDg6IFtpbyAgMHgwMDY0XQpbICAgIDMuOTU3MjA5XSB4ZW46IHJlZ2lzdGVyaW5nIGdzaSAx
IHRyaWdnZXJpbmcgMSBwb2xhcml0eSAwClsgICAgMy45NTczMTRdIHhlbl9tYXBfcGlycV9nc2k6
IHJldHVybmluZyBpcnEgMSBmb3IgZ3NpIDEKWyAgICAzLjk1NzQxNl0geGVuOiAtLT4gcGlycT0x
IC0+IGlycT0xIChnc2k9MSkKWyAgICAzLjk1NzU0NF0gcG5wIDAwOjA4OiBbaXJxIDFdClsgICAg
My45NTc2NjRdIHBucCAwMDowODogUGx1ZyBhbmQgUGxheSBBQ1BJIGRldmljZSwgSURzIFBOUDAz
MDMgUE5QMDMwYiAoYWN0aXZlKQpbICAgIDMuOTU3ODEzXSB4ZW46IHJlZ2lzdGVyaW5nIGdzaSAx
MiB0cmlnZ2VyaW5nIDEgcG9sYXJpdHkgMApbICAgIDMuOTU3OTE1XSB4ZW5fbWFwX3BpcnFfZ3Np
OiByZXR1cm5pbmcgaXJxIDEyIGZvciBnc2kgMTIKWyAgICAzLjk1ODAxN10geGVuOiAtLT4gcGly
cT0xMiAtPiBpcnE9MTIgKGdzaT0xMikKWyAgICAzLjk1ODE0M10gcG5wIDAwOjA5OiBbaXJxIDEy
XQpbICAgIDMuOTU4MjY1XSBwbnAgMDA6MDk6IFBsdWcgYW5kIFBsYXkgQUNQSSBkZXZpY2UsIElE
cyBQTlAwZjAzIFBOUDBmMTMgKGFjdGl2ZSkKWyAgICAzLjk1ODY3Nl0gcG5wIDAwOjBhOiBbaW8g
IDB4MDNmOC0weDAzZmZdClsgICAgMy45NTg3NzVdIHhlbjogcmVnaXN0ZXJpbmcgZ3NpIDQgdHJp
Z2dlcmluZyAxIHBvbGFyaXR5IDAKWyAgICAzLjk1ODg3N10geGVuX21hcF9waXJxX2dzaTogcmV0
dXJuaW5nIGlycSA0IGZvciBnc2kgNApbICAgIDMuOTU4OTc4XSB4ZW46IC0tPiBwaXJxPTQgLT4g
aXJxPTQgKGdzaT00KQpbICAgIDMuOTU5MTA2XSBwbnAgMDA6MGE6IFtpcnEgNF0KWyAgICAzLjk1
OTIwNF0gcG5wIDAwOjBhOiBbZG1hIDAgZGlzYWJsZWRdClsgICAgMy45NTkzNTFdIHBucCAwMDow
YTogUGx1ZyBhbmQgUGxheSBBQ1BJIGRldmljZSwgSURzIFBOUDA1MDEgKGFjdGl2ZSkKWyAgICAz
Ljk1OTczNl0gcG5wIDAwOjBiOiBbaW8gIDB4MDJmOC0weDAyZmZdClsgICAgMy45NTk4MzZdIHhl
bjogcmVnaXN0ZXJpbmcgZ3NpIDMgdHJpZ2dlcmluZyAxIHBvbGFyaXR5IDAKWyAgICAzLjk1OTkz
OV0geGVuX21hcF9waXJxX2dzaTogcmV0dXJuaW5nIGlycSAzIGZvciBnc2kgMwpbICAgIDMuOTYw
MDM5XSB4ZW46IC0tPiBwaXJxPTMgLT4gaXJxPTMgKGdzaT0zKQpbICAgIDMuOTYwMTY2XSBwbnAg
MDA6MGI6IFtpcnEgM10KWyAgICAzLjk2MDI2M10gcG5wIDAwOjBiOiBbZG1hIDAgZGlzYWJsZWRd
ClsgICAgMy45NjA0MDVdIHBucCAwMDowYjogUGx1ZyBhbmQgUGxheSBBQ1BJIGRldmljZSwgSURz
IFBOUDA1MDEgKGFjdGl2ZSkKWyAgICAzLjk2MDYwMl0gcG5wIDAwOjBjOiBbaW8gIDB4MDAwMC0w
eGZmZmZmZmZmZmZmZmZmZmYgZGlzYWJsZWRdClsgICAgMy45NjA3MDZdIHBucCAwMDowYzogW2lv
ICAweDBiMDAtMHgwYjdmXQpbICAgIDMuOTYwODA2XSBwbnAgMDA6MGM6IFtpbyAgMHgwMDAwLTB4
ZmZmZmZmZmZmZmZmZmZmZiBkaXNhYmxlZF0KWyAgICAzLjk2MDkwOF0gcG5wIDAwOjBjOiBbaW8g
IDB4MDAwMC0weGZmZmZmZmZmZmZmZmZmZmYgZGlzYWJsZWRdClsgICAgMy45NjEwMTFdIHBucCAw
MDowYzogW2lvICAweDAwMDAtMHhmZmZmZmZmZmZmZmZmZmZmIGRpc2FibGVkXQpbICAgIDMuOTYx
MTQ4XSBzeXN0ZW0gMDA6MGM6IFtpbyAgMHgwYjAwLTB4MGI3Zl0gaGFzIGJlZW4gcmVzZXJ2ZWQK
WyAgICAzLjk2MTI1M10gc3lzdGVtIDAwOjBjOiBQbHVnIGFuZCBQbGF5IEFDUEkgZGV2aWNlLCBJ
RHMgUE5QMGMwMiAoYWN0aXZlKQpbICAgIDMuOTYxNTg5XSBwbnAgMDA6MGQ6IFtpbyAgMHgwM2U4
LTB4MDNlZl0KWyAgICAzLjk2MTY5MF0geGVuOiByZWdpc3RlcmluZyBnc2kgMTAgdHJpZ2dlcmlu
ZyAxIHBvbGFyaXR5IDAKWyAgICAzLjk2MTc5M10geGVuX21hcF9waXJxX2dzaTogcmV0dXJuaW5n
IGlycSAxMCBmb3IgZ3NpIDEwClsgICAgMy45NjE4OTRdIHhlbjogLS0+IHBpcnE9MTAgLT4gaXJx
PTEwIChnc2k9MTApClsgICAgMy45NjIwMjJdIHBucCAwMDowZDogW2lycSAxMF0KWyAgICAzLjk2
MjEyMV0gcG5wIDAwOjBkOiBbZG1hIDAgZGlzYWJsZWRdClsgICAgMy45NjIyNTldIHBucCAwMDow
ZDogUGx1ZyBhbmQgUGxheSBBQ1BJIGRldmljZSwgSURzIFBOUDA1MDEgKGFjdGl2ZSkKWyAgICAz
Ljk2MjU3MV0gcG5wIDAwOjBlOiBbaW8gIDB4MDQwMC0weDA0NTNdClsgICAgMy45NjI2NzJdIHBu
cCAwMDowZTogW2lvICAweDA0NTgtMHgwNDdmXQpbICAgIDMuOTYyNzczXSBwbnAgMDA6MGU6IFtp
byAgMHgxMTgwLTB4MTE5Zl0KWyAgICAzLjk2Mjg3M10gcG5wIDAwOjBlOiBbaW8gIDB4MDUwMC0w
eDA1N2ZdClsgICAgMy45NjI5NzFdIHBucCAwMDowZTogW21lbSAweGZlZDFjMDAwLTB4ZmVkMWZm
ZmZdClsgICAgMy45NjMwNzJdIHBucCAwMDowZTogW21lbSAweGZlYzAwMDAwLTB4ZmVjZmZmZmZd
ClsgICAgMy45NjMxNzJdIHBucCAwMDowZTogW21lbSAweGZlZDA4MDAwLTB4ZmVkMDhmZmZdClsg
ICAgMy45NjMyNzJdIHBucCAwMDowZTogW21lbSAweGZmMDAwMDAwLTB4ZmZmZmZmZmZdClsgICAg
My45NjM0MDVdIHN5c3RlbSAwMDowZTogW2lvICAweDA0MDAtMHgwNDUzXSBoYXMgYmVlbiByZXNl
cnZlZApbICAgIDMuOTYzNTEwXSBzeXN0ZW0gMDA6MGU6IFtpbyAgMHgwNDU4LTB4MDQ3Zl0gaGFz
IGJlZW4gcmVzZXJ2ZWQKWyAgICAzLjk2MzYxNV0gc3lzdGVtIDAwOjBlOiBbaW8gIDB4MTE4MC0w
eDExOWZdIGhhcyBiZWVuIHJlc2VydmVkClsgICAgMy45NjM3MThdIHN5c3RlbSAwMDowZTogW2lv
ICAweDA1MDAtMHgwNTdmXSBoYXMgYmVlbiByZXNlcnZlZApbICAgIDMuOTYzODE3XSBzeXN0ZW0g
MDA6MGU6IFttZW0gMHhmZWQxYzAwMC0weGZlZDFmZmZmXSBoYXMgYmVlbiByZXNlcnZlZApbICAg
IDMuOTYzOTIyXSBzeXN0ZW0gMDA6MGU6IFttZW0gMHhmZWMwMDAwMC0weGZlY2ZmZmZmXSBjb3Vs
ZCBub3QgYmUgcmVzZXJ2ZWQKWyAgICAzLjk2NDAyOF0gc3lzdGVtIDAwOjBlOiBbbWVtIDB4ZmVk
MDgwMDAtMHhmZWQwOGZmZl0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAzLjk2NDEzM10gc3lzdGVt
IDAwOjBlOiBbbWVtIDB4ZmYwMDAwMDAtMHhmZmZmZmZmZl0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAg
ICAzLjk2NDIzNV0gc3lzdGVtIDAwOjBlOiBQbHVnIGFuZCBQbGF5IEFDUEkgZGV2aWNlLCBJRHMg
UE5QMGMwMSAoYWN0aXZlKQpbICAgIDMuOTY2MDcyXSBwbnAgMDA6MGY6IFtpbyAgMHgwNDU0LTB4
MDQ1N10KWyAgICAzLjk2NjIwMF0gc3lzdGVtIDAwOjBmOiBbaW8gIDB4MDQ1NC0weDA0NTddIGhh
cyBiZWVuIHJlc2VydmVkClsgICAgMy45NjYzMDRdIHN5c3RlbSAwMDowZjogUGx1ZyBhbmQgUGxh
eSBBQ1BJIGRldmljZSwgSURzIElOVDNmMGQgUE5QMGMwMiAoYWN0aXZlKQpbICAgIDMuOTY2NTU1
XSBwbnAgMDA6MTA6IFttZW0gMHhmZWQwMDAwMC0weGZlZDAwM2ZmXQpbICAgIDMuOTY2NjkyXSBw
bnAgMDA6MTA6IFBsdWcgYW5kIFBsYXkgQUNQSSBkZXZpY2UsIElEcyBQTlAwMTAzIChhY3RpdmUp
ClsgICAgMy45NjY5NjVdIHBucDogUG5QIEFDUEk6IGZvdW5kIDE3IGRldmljZXMKWyAgICAzLjk2
NzA2NV0gQUNQSTogQUNQSSBidXMgdHlwZSBwbnAgdW5yZWdpc3RlcmVkClsgICAgMy45NjcxNjhd
IGluaXRjYWxsIHBucGFjcGlfaW5pdCsweDAvMHg4YyByZXR1cm5lZCAwIGFmdGVyIDE3NDAzIHVz
ZWNzClsgICAgMy45NjcyNzJdIGNhbGxpbmcgIGNocl9kZXZfaW5pdCsweDAvMHgxYiBAIDEKWyAg
ICAzLjk2OTM3NV0gaW5pdGNhbGwgY2hyX2Rldl9pbml0KzB4MC8weDFiIHJldHVybmVkIDAgYWZ0
ZXIgMTk1NiB1c2VjcwpbICAgIDMuOTY5NDgxXSBjYWxsaW5nICBmaXJtd2FyZV9jbGFzc19pbml0
KzB4MC8weDE5IEAgMQpbICAgIDMuOTY5NTg1XSBpbml0Y2FsbCBmaXJtd2FyZV9jbGFzc19pbml0
KzB4MC8weDE5IHJldHVybmVkIDAgYWZ0ZXIgMyB1c2VjcwpbICAgIDMuOTY5NjkxXSBjYWxsaW5n
ICB0aGVybWFsX2luaXQrMHgwLzB4NzIgQCAxClsgICAgMy45Njk3OTZdIGluaXRjYWxsIHRoZXJt
YWxfaW5pdCsweDAvMHg3MiByZXR1cm5lZCAwIGFmdGVyIDUgdXNlY3MKWyAgICAzLjk2OTg5OV0g
Y2FsbGluZyAgY3B1ZnJlcV9nb3ZfcGVyZm9ybWFuY2VfaW5pdCsweDAvMHgxMiBAIDEKWyAgICAz
Ljk3MDAwM10gaW5pdGNhbGwgY3B1ZnJlcV9nb3ZfcGVyZm9ybWFuY2VfaW5pdCsweDAvMHgxMiBy
ZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjk3MDEyOV0gY2FsbGluZyAgaW5pdF9hY3Bp
X3BtX2Nsb2Nrc291cmNlKzB4MC8weGQ5IEAgMQpbICAgIDMuOTczNDg2XSBQTS1UaW1lciBmYWls
ZWQgY29uc2lzdGVuY3kgY2hlY2sgICgweDB4ZmZmZmZmKSAtIGFib3J0aW5nLgpbICAgIDMuOTcz
NTkxXSBpbml0Y2FsbCBpbml0X2FjcGlfcG1fY2xvY2tzb3VyY2UrMHgwLzB4ZDkgcmV0dXJuZWQg
LTE5IGFmdGVyIDMyNzggdXNlY3MKWyAgICAzLjk3MzcxMl0gY2FsbGluZyAgcGNpYmlvc19hc3Np
Z25fcmVzb3VyY2VzKzB4MC8weDc2IEAgMQpbICAgIDMuOTczODIxXSBQQ0k6IG1heCBidXMgZGVw
dGg6IDEgcGNpX3RyeV9udW06IDIKWyAgICAzLjk3NDAzMF0gcGNpIDAwMDA6MDE6MDAuMDogQkFS
IDM6IGFzc2lnbmVkIFttZW0gMHhmYmE4MDAwMC0weGZiYWJmZmZmIDY0Yml0XQpbICAgIDMuOTc0
MTU4XSBwY2kgMDAwMDowMTowMC4wOiBCQVIgMzogc2V0IHRvIFttZW0gMHhmYmE4MDAwMC0weGZi
YWJmZmZmIDY0Yml0XSAoUENJIGFkZHJlc3MgWzB4ZmJhODAwMDAtMHhmYmFiZmZmZl0pClsgICAg
My45NzQyODddIHBjaSAwMDAwOjAwOjAxLjA6IFBDSSBicmlkZ2UgdG8gW2J1cyAwMS0wMV0KWyAg
ICAzLjk3NDM5MF0gcGNpIDAwMDA6MDA6MDEuMDogICBicmlkZ2Ugd2luZG93IFtpbyAgMHhlMDAw
LTB4ZWZmZl0KWyAgICAzLjk3NDQ5N10gcGNpIDAwMDA6MDA6MDEuMDogICBicmlkZ2Ugd2luZG93
IFttZW0gMHhmYmEwMDAwMC0weGZiYWZmZmZmXQpbICAgIDMuOTc0NjA4XSBwY2kgMDAwMDowMDox
Yy4wOiBQQ0kgYnJpZGdlIHRvIFtidXMgMDItMDJdClsgICAgMy45NzQ3NTddIHBjaSAwMDAwOjAw
OjFjLjQ6IFBDSSBicmlkZ2UgdG8gW2J1cyAwMy0wM10KWyAgICAzLjk3NDg2NV0gcGNpIDAwMDA6
MDA6MWMuNDogICBicmlkZ2Ugd2luZG93IFtpbyAgMHhkMDAwLTB4ZGZmZl0KWyAgICAzLjk3NDk4
M10gcGNpIDAwMDA6MDA6MWMuNDogICBicmlkZ2Ugd2luZG93IFttZW0gMHhmYjkwMDAwMC0weGZi
OWZmZmZmXQpbICAgIDMuOTc1MTIzXSBwY2kgMDAwMDowMDoxZS4wOiBQQ0kgYnJpZGdlIHRvIFti
dXMgMDQtMDRdClsgICAgMy45NzUyMzhdIHBjaSAwMDAwOjAwOjFlLjA6ICAgYnJpZGdlIHdpbmRv
dyBbbWVtIDB4ZmIwMDAwMDAtMHhmYjhmZmZmZl0KWyAgICAzLjk3NTM1MF0gcGNpIDAwMDA6MDA6
MWUuMDogICBicmlkZ2Ugd2luZG93IFttZW0gMHhmYTAwMDAwMC0weGZhZmZmZmZmIDY0Yml0IHBy
ZWZdClsgICAgMy45NzU0OTZdIHhlbjogcmVnaXN0ZXJpbmcgZ3NpIDE2IHRyaWdnZXJpbmcgMCBw
b2xhcml0eSAxClsgICAgMy45NzU2MDRdIHhlbjogLS0+IHBpcnE9MTYgLT4gaXJxPTE2IChnc2k9
MTYpClsgICAgMy45NzU3MzFdIHBjaSAwMDAwOjAwOjAxLjA6IFBDSSBJTlQgQSAtPiBHU0kgMTYg
KGxldmVsLCBsb3cpIC0+IElSUSAxNgpbICAgIDMuOTc1ODM5XSBwY2kgMDAwMDowMDowMS4wOiBz
ZXR0aW5nIGxhdGVuY3kgdGltZXIgdG8gNjQKWyAgICAzLjk3NTk1NV0geGVuOiByZWdpc3Rlcmlu
ZyBnc2kgMTcgdHJpZ2dlcmluZyAwIHBvbGFyaXR5IDEKWyAgICAzLjk3NjA1N10geGVuOiAtLT4g
cGlycT0xNyAtPiBpcnE9MTcgKGdzaT0xNykKWyAgICAzLjk3NjE4Ml0gcGNpIDAwMDA6MDA6MWMu
MDogUENJIElOVCBBIC0+IEdTSSAxNyAobGV2ZWwsIGxvdykgLT4gSVJRIDE3ClsgICAgMy45NzYy
OTddIHBjaSAwMDAwOjAwOjFjLjA6IHNldHRpbmcgbGF0ZW5jeSB0aW1lciB0byA2NApbICAgIDMu
OTc2NDE5XSB4ZW46IHJlZ2lzdGVyaW5nIGdzaSAxNyB0cmlnZ2VyaW5nIDAgcG9sYXJpdHkgMQpb
ICAgIDMuOTc2NTIwXSB4ZW5fbWFwX3BpcnFfZ3NpOiByZXR1cm5pbmcgaXJxIDE3IGZvciBnc2kg
MTcKWyAgICAzLjk3NjYxOV0geGVuOiAtLT4gcGlycT0xNyAtPiBpcnE9MTcgKGdzaT0xNykKWyAg
ICAzLjk3NjcxOV0gQWxyZWFkeSBzZXR1cCB0aGUgR1NJIDoxNwpbICAgIDMuOTc2ODE2XSBwY2kg
MDAwMDowMDoxYy40OiBQQ0kgSU5UIEEgLT4gR1NJIDE3IChsZXZlbCwgbG93KSAtPiBJUlEgMTcK
WyAgICAzLjk3NjkzMl0gcGNpIDAwMDA6MDA6MWMuNDogc2V0dGluZyBsYXRlbmN5IHRpbWVyIHRv
IDY0ClsgICAgMy45NzcwNTJdIHBjaSAwMDAwOjAwOjFlLjA6IHNldHRpbmcgbGF0ZW5jeSB0aW1l
ciB0byA2NApbICAgIDMuOTc3MTU5XSBwY2lfYnVzIDAwMDA6MDA6IHJlc291cmNlIDQgW2lvICAw
eDAwMDAtMHgwM2FmXQpbICAgIDMuOTc3MjYwXSBwY2lfYnVzIDAwMDA6MDA6IHJlc291cmNlIDUg
W2lvICAweDAzZTAtMHgwY2Y3XQpbICAgIDMuOTc3MzYzXSBwY2lfYnVzIDAwMDA6MDA6IHJlc291
cmNlIDYgW2lvICAweDAzYjAtMHgwM2RmXQpbICAgIDMuOTc3NDY1XSBwY2lfYnVzIDAwMDA6MDA6
IHJlc291cmNlIDcgW2lvICAweDBkMDAtMHhmZmZmXQpbICAgIDMuOTc3NTY3XSBwY2lfYnVzIDAw
MDA6MDA6IHJlc291cmNlIDggW21lbSAweDAwMGEwMDAwLTB4MDAwYmZmZmZdClsgICAgMy45Nzc2
NzFdIHBjaV9idXMgMDAwMDowMDogcmVzb3VyY2UgOSBbbWVtIDB4MDAwYzAwMDAtMHgwMDBkZmZm
Zl0KWyAgICAzLjk3Nzc3NV0gcGNpX2J1cyAwMDAwOjAwOiByZXNvdXJjZSAxMCBbbWVtIDB4ZjAw
MDAwMDAtMHhmYmZmZmZmZl0KWyAgICAzLjk3Nzg3N10gcGNpX2J1cyAwMDAwOjAxOiByZXNvdXJj
ZSAwIFtpbyAgMHhlMDAwLTB4ZWZmZl0KWyAgICAzLjk3Nzk4MV0gcGNpX2J1cyAwMDAwOjAxOiBy
ZXNvdXJjZSAxIFttZW0gMHhmYmEwMDAwMC0weGZiYWZmZmZmXQpbICAgIDMuOTc4MDgzXSBwY2lf
YnVzIDAwMDA6MDM6IHJlc291cmNlIDAgW2lvICAweGQwMDAtMHhkZmZmXQpbICAgIDMuOTc4MTg2
XSBwY2lfYnVzIDAwMDA6MDM6IHJlc291cmNlIDEgW21lbSAweGZiOTAwMDAwLTB4ZmI5ZmZmZmZd
ClsgICAgMy45NzgyODldIHBjaV9idXMgMDAwMDowNDogcmVzb3VyY2UgMSBbbWVtIDB4ZmIwMDAw
MDAtMHhmYjhmZmZmZl0KWyAgICAzLjk3ODM5NF0gcGNpX2J1cyAwMDAwOjA0OiByZXNvdXJjZSAy
IFttZW0gMHhmYTAwMDAwMC0weGZhZmZmZmZmIDY0Yml0IHByZWZdClsgICAgMy45Nzg1MThdIHBj
aV9idXMgMDAwMDowNDogcmVzb3VyY2UgNCBbaW8gIDB4MDAwMC0weDAzYWZdClsgICAgMy45Nzg2
MThdIHBjaV9idXMgMDAwMDowNDogcmVzb3VyY2UgNSBbaW8gIDB4MDNlMC0weDBjZjddClsgICAg
My45Nzg3MjBdIHBjaV9idXMgMDAwMDowNDogcmVzb3VyY2UgNiBbaW8gIDB4MDNiMC0weDAzZGZd
ClsgICAgMy45Nzg4MjFdIHBjaV9idXMgMDAwMDowNDogcmVzb3VyY2UgNyBbaW8gIDB4MGQwMC0w
eGZmZmZdClsgICAgMy45Nzg5MjRdIHBjaV9idXMgMDAwMDowNDogcmVzb3VyY2UgOCBbbWVtIDB4
MDAwYTAwMDAtMHgwMDBiZmZmZl0KWyAgICAzLjk3OTAyOF0gcGNpX2J1cyAwMDAwOjA0OiByZXNv
dXJjZSA5IFttZW0gMHgwMDBjMDAwMC0weDAwMGRmZmZmXQpbICAgIDMuOTc5MTMxXSBwY2lfYnVz
IDAwMDA6MDQ6IHJlc291cmNlIDEwIFttZW0gMHhmMDAwMDAwMC0weGZiZmZmZmZmXQpbICAgIDMu
OTc5MjM0XSBpbml0Y2FsbCBwY2liaW9zX2Fzc2lnbl9yZXNvdXJjZXMrMHgwLzB4NzYgcmV0dXJu
ZWQgMCBhZnRlciA1MjkxIHVzZWNzClsgICAgMy45NzkzNTddIGNhbGxpbmcgIHN5c2N0bF9jb3Jl
X2luaXQrMHgwLzB4MzggQCAxClsgICAgMy45Nzk0NjhdIGluaXRjYWxsIHN5c2N0bF9jb3JlX2lu
aXQrMHgwLzB4MzggcmV0dXJuZWQgMCBhZnRlciA4IHVzZWNzClsgICAgMy45Nzk1NzNdIGNhbGxp
bmcgIGluZXRfaW5pdCsweDAvMHgyN2QgQCAxClsgICAgMy45Nzk2ODVdIE5FVDogUmVnaXN0ZXJl
ZCBwcm90b2NvbCBmYW1pbHkgMgpbICAgIDMuOTgwODgxXSBJUCByb3V0ZSBjYWNoZSBoYXNoIHRh
YmxlIGVudHJpZXM6IDUyNDI4OCAob3JkZXI6IDEwLCA0MTk0MzA0IGJ5dGVzKQpbICAgIDMuOTgz
MzgzXSBUQ1AgZXN0YWJsaXNoZWQgaGFzaCB0YWJsZSBlbnRyaWVzOiA1MjQyODggKG9yZGVyOiAx
MSwgODM4ODYwOCBieXRlcykKWyAgICAzLjk4NDY3N10gVENQIGJpbmQgaGFzaCB0YWJsZSBlbnRy
aWVzOiA2NTUzNiAob3JkZXI6IDgsIDEwNDg1NzYgYnl0ZXMpClsgICAgMy45ODQ4OTddIFRDUDog
SGFzaCB0YWJsZXMgY29uZmlndXJlZCAoZXN0YWJsaXNoZWQgNTI0Mjg4IGJpbmQgNjU1MzYpClsg
ICAgMy45ODUwMDVdIFRDUCByZW5vIHJlZ2lzdGVyZWQKWyAgICAzLjk4NTE4N10gVURQIGhhc2gg
dGFibGUgZW50cmllczogODE5MiAob3JkZXI6IDYsIDI2MjE0NCBieXRlcykKWyAgICAzLjk4NTQw
MF0gVURQLUxpdGUgaGFzaCB0YWJsZSBlbnRyaWVzOiA4MTkyIChvcmRlcjogNiwgMjYyMTQ0IGJ5
dGVzKQpbICAgIDMuOTg1NTkzXSBpbml0Y2FsbCBpbmV0X2luaXQrMHgwLzB4MjdkIHJldHVybmVk
IDAgYWZ0ZXIgNTc3NSB1c2VjcwpbICAgIDMuOTg1NzAwXSBjYWxsaW5nICBhZl91bml4X2luaXQr
MHgwLzB4NTIgQCAxClsgICAgMy45ODU4MDFdIE5FVDogUmVnaXN0ZXJlZCBwcm90b2NvbCBmYW1p
bHkgMQpbICAgIDMuOTg1OTA0XSBpbml0Y2FsbCBhZl91bml4X2luaXQrMHgwLzB4NTIgcmV0dXJu
ZWQgMCBhZnRlciAxMDAgdXNlY3MKWyAgICAzLjk4NjAwOV0gY2FsbGluZyAgcGNpX2FwcGx5X2Zp
bmFsX3F1aXJrcysweDAvMHgxMDUgQCAxClsgICAgMy45ODYxNDNdIHhlbjogcmVnaXN0ZXJpbmcg
Z3NpIDE2IHRyaWdnZXJpbmcgMCBwb2xhcml0eSAxClsgICAgMy45ODYyNDldIHhlbl9tYXBfcGly
cV9nc2k6IHJldHVybmluZyBpcnEgMTYgZm9yIGdzaSAxNgpbICAgIDMuOTg2MzUyXSB4ZW46IC0t
PiBwaXJxPTE2IC0+IGlycT0xNiAoZ3NpPTE2KQpbICAgIDMuOTg2NDU0XSBBbHJlYWR5IHNldHVw
IHRoZSBHU0kgOjE2ClsgICAgMy45ODY1NTVdIHBjaSAwMDAwOjAwOjFhLjA6IFBDSSBJTlQgQSAt
PiBHU0kgMTYgKGxldmVsLCBsb3cpIC0+IElSUSAxNgpbICAgIDMuOTg2NzA0XSBwY2kgMDAwMDow
MDoxYS4wOiBQQ0kgSU5UIEEgZGlzYWJsZWQKWyAgICAzLjk4NjgzNl0geGVuOiByZWdpc3Rlcmlu
ZyBnc2kgMjMgdHJpZ2dlcmluZyAwIHBvbGFyaXR5IDEKWyAgICAzLjk4Njk0M10geGVuOiAtLT4g
cGlycT0yMyAtPiBpcnE9MjMgKGdzaT0yMykKWyAgICAzLjk4NzA3M10gcGNpIDAwMDA6MDA6MWQu
MDogUENJIElOVCBBIC0+IEdTSSAyMyAobGV2ZWwsIGxvdykgLT4gSVJRIDIzClsgICAgMy45ODcy
MzJdIHBjaSAwMDAwOjAwOjFkLjA6IFBDSSBJTlQgQSBkaXNhYmxlZApbICAgIDMuOTg3NDM5XSBw
Y2kgMDAwMDowNDowMy4wOiBCb290IHZpZGVvIGRldmljZQpbICAgIDMuOTg3NTQwXSBQQ0k6IENM
UyA2NCBieXRlcywgZGVmYXVsdCA2NApbICAgIDMuOTg3NjM4XSBpbml0Y2FsbCBwY2lfYXBwbHlf
ZmluYWxfcXVpcmtzKzB4MC8weDEwNSByZXR1cm5lZCAwIGFmdGVyIDE0ODkgdXNlY3MKWyAgICAz
Ljk4Nzc2M10gY2FsbGluZyAgcG9wdWxhdGVfcm9vdGZzKzB4MC8weDI0IEAgMQpbICAgIDMuOTg3
ODYyXSBpbml0Y2FsbCBwb3B1bGF0ZV9yb290ZnMrMHgwLzB4MjQgcmV0dXJuZWQgMjc0Nzg3NTI2
IGFmdGVyIDAgdXNlY3MKWyAgICAzLjk4Nzk4M10gaW5pdGNhbGwgcG9wdWxhdGVfcm9vdGZzKzB4
MC8weDI0IHJldHVybmVkIHdpdGggZXJyb3IgY29kZSAyNzQ3ODc1MjYgClsgICAgMy45ODgxMDZd
IGNhbGxpbmcgIHBjaV9pb21tdV9pbml0KzB4MC8weDNlIEAgMQpbICAgIDMuOTg4MjA2XSBpbml0
Y2FsbCBwY2lfaW9tbXVfaW5pdCsweDAvMHgzZSByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAg
ICAzLjk4ODMwOF0gY2FsbGluZyAgY2FsZ2FyeV9maXh1cF90Y2Vfc3BhY2VzKzB4MC8weDJiIEAg
MQpbICAgIDMuOTg4NDA4XSBpbml0Y2FsbCBjYWxnYXJ5X2ZpeHVwX3RjZV9zcGFjZXMrMHgwLzB4
MmIgcmV0dXJuZWQgLTE5IGFmdGVyIDAgdXNlY3MKWyAgICAzLjk4ODUzMl0gY2FsbGluZyAgaXJf
ZGV2X3Njb3BlX2luaXQrMHgwLzB4MTYgQCAxClsgICAgMy45ODg2MjldIGluaXRjYWxsIGlyX2Rl
dl9zY29wZV9pbml0KzB4MC8weDE2IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuOTg4
NzMxXSBjYWxsaW5nICBpODI1OUFfaW5pdF9vcHMrMHgwLzB4MjEgQCAxClsgICAgMy45ODg4MzFd
IGluaXRjYWxsIGk4MjU5QV9pbml0X29wcysweDAvMHgyMSByZXR1cm5lZCAwIGFmdGVyIDAgdXNl
Y3MKWyAgICAzLjk4ODkzNF0gY2FsbGluZyAgdnN5c2NhbGxfaW5pdCsweDAvMHgyNyBAIDEKWyAg
ICAzLjk4OTAzOV0gaW5pdGNhbGwgdnN5c2NhbGxfaW5pdCsweDAvMHgyNyByZXR1cm5lZCAwIGFm
dGVyIDYgdXNlY3MKWyAgICAzLjk4OTE0Ml0gY2FsbGluZyAgc2JmX2luaXQrMHgwLzB4MTYgQCAx
ClsgICAgMy45ODkyNDJdIGluaXRjYWxsIHNiZl9pbml0KzB4MC8weDE2IHJldHVybmVkIDAgYWZ0
ZXIgMCB1c2VjcwpbICAgIDMuOTg5MzQ0XSBjYWxsaW5nICBpbml0X3RzY19jbG9ja3NvdXJjZSsw
eDAvMHg1ZiBAIDEKWyAgICAzLjk4OTQ1M10gaW5pdGNhbGwgaW5pdF90c2NfY2xvY2tzb3VyY2Ur
MHgwLzB4NWYgcmV0dXJuZWQgMCBhZnRlciA1IHVzZWNzClsgICAgMy45ODk1NTRdIGNhbGxpbmcg
IGFkZF9ydGNfY21vcysweDAvMHg5NiBAIDEKWyAgICAzLjk4OTY1N10gaW5pdGNhbGwgYWRkX3J0
Y19jbW9zKzB4MC8weDk2IHJldHVybmVkIDAgYWZ0ZXIgMSB1c2VjcwpbICAgIDMuOTg5NzU3XSBj
YWxsaW5nICBpODIzN0FfaW5pdF9vcHMrMHgwLzB4MTQgQCAxClsgICAgMy45ODk4NzZdIGluaXRj
YWxsIGk4MjM3QV9pbml0X29wcysweDAvMHgxNCByZXR1cm5lZCAwIGFmdGVyIDE4IHVzZWNzClsg
ICAgMy45ODk5ODJdIGNhbGxpbmcgIGNhY2hlX3N5c2ZzX2luaXQrMHgwLzB4NTkgQCAxClsgICAg
My45OTAxNTZdIGluaXRjYWxsIGNhY2hlX3N5c2ZzX2luaXQrMHgwLzB4NTkgcmV0dXJuZWQgMCBh
ZnRlciA3MyB1c2VjcwpbICAgIDMuOTkwMjU4XSBjYWxsaW5nICBtY2hlY2tfaW5pdF9kZXZpY2Ur
MHgwLzB4MjQgQCAxClsgICAgMy45OTAzNThdIGluaXRjYWxsIG1jaGVja19pbml0X2RldmljZSsw
eDAvMHgyNCByZXR1cm5lZCAtNSBhZnRlciAwIHVzZWNzClsgICAgMy45OTA0NTddIGluaXRjYWxs
IG1jaGVja19pbml0X2RldmljZSsweDAvMHgyNCByZXR1cm5lZCB3aXRoIGVycm9yIGNvZGUgLTUg
ClsgICAgMy45OTA1NjBdIGNhbGxpbmcgIHRocmVzaG9sZF9pbml0X2RldmljZSsweDAvMHg1NiBA
IDEKWyAgICAzLjk5MDY2MV0gaW5pdGNhbGwgdGhyZXNob2xkX2luaXRfZGV2aWNlKzB4MC8weDU2
IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuOTkwNzY2XSBjYWxsaW5nICB0aGVybWFs
X3Rocm90dGxlX2luaXRfZGV2aWNlKzB4MC8weDljIEAgMQpbICAgIDMuOTkwODYzXSBpbml0Y2Fs
bCB0aGVybWFsX3Rocm90dGxlX2luaXRfZGV2aWNlKzB4MC8weDljIHJldHVybmVkIDAgYWZ0ZXIg
MCB1c2VjcwpbICAgIDMuOTkwOTg5XSBjYWxsaW5nICBhbWRfaWJzX2luaXQrMHgwLzB4MTdmIEAg
MQpbICAgIDMuOTkxMDkwXSBpbml0Y2FsbCBhbWRfaWJzX2luaXQrMHgwLzB4MTdmIHJldHVybmVk
IC0xOSBhZnRlciAwIHVzZWNzClsgICAgMy45OTExOTJdIGNhbGxpbmcgIGlvYXBpY19pbml0X29w
cysweDAvMHgxNCBAIDEKWyAgICAzLjk5MTI5MF0gaW5pdGNhbGwgaW9hcGljX2luaXRfb3BzKzB4
MC8weDE0IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuOTkxMzk0XSBjYWxsaW5nICBh
ZGRfcGNzcGtyKzB4MC8weDVlIEAgMQpbICAgIDMuOTkxNTE1XSBpbml0Y2FsbCBhZGRfcGNzcGty
KzB4MC8weDVlIHJldHVybmVkIDAgYWZ0ZXIgMTkgdXNlY3MKWyAgICAzLjk5MTYxOV0gY2FsbGlu
ZyAgc3RhcnRfcGVyaW9kaWNfY2hlY2tfZm9yX2NvcnJ1cHRpb24rMHgwLzB4NTAgQCAxClsgICAg
My45OTE3MjJdIGluaXRjYWxsIHN0YXJ0X3BlcmlvZGljX2NoZWNrX2Zvcl9jb3JydXB0aW9uKzB4
MC8weDUwIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMuOTkxODQ2XSBjYWxsaW5nICBh
dWRpdF9jbGFzc2VzX2luaXQrMHgwLzB4YWYgQCAxClsgICAgMy45OTE5NTBdIGluaXRjYWxsIGF1
ZGl0X2NsYXNzZXNfaW5pdCsweDAvMHhhZiByZXR1cm5lZCAwIGFmdGVyIDEgdXNlY3MKWyAgICAz
Ljk5MjA1NV0gY2FsbGluZyAgY3JjMzJjX2ludGVsX21vZF9pbml0KzB4MC8weDI2IEAgMQpbICAg
IDMuOTkyMjAwXSBpbml0Y2FsbCBjcmMzMmNfaW50ZWxfbW9kX2luaXQrMHgwLzB4MjYgcmV0dXJu
ZWQgMCBhZnRlciA0MSB1c2VjcwpbICAgIDMuOTkyMzA3XSBjYWxsaW5nICBpYTMyX2JpbmZtdF9p
bml0KzB4MC8weDE0IEAgMQpbICAgIDMuOTkyNDExXSBpbml0Y2FsbCBpYTMyX2JpbmZtdF9pbml0
KzB4MC8weDE0IHJldHVybmVkIDAgYWZ0ZXIgMiB1c2VjcwpbICAgIDMuOTkyNTE1XSBjYWxsaW5n
ICBpbml0X3NjaGVkX2RlYnVnX3Byb2NmcysweDAvMHgyYyBAIDEKWyAgICAzLjk5MjYyMV0gaW5p
dGNhbGwgaW5pdF9zY2hlZF9kZWJ1Z19wcm9jZnMrMHgwLzB4MmMgcmV0dXJuZWQgMCBhZnRlciAy
IHVzZWNzClsgICAgMy45OTI3NDZdIGNhbGxpbmcgIHByb2Nfc2NoZWRzdGF0X2luaXQrMHgwLzB4
MjIgQCAxClsgICAgMy45OTI4NDldIGluaXRjYWxsIHByb2Nfc2NoZWRzdGF0X2luaXQrMHgwLzB4
MjIgcmV0dXJuZWQgMCBhZnRlciAxIHVzZWNzClsgICAgMy45OTI5NTVdIGNhbGxpbmcgIHByb2Nf
ZXhlY2RvbWFpbnNfaW5pdCsweDAvMHgyMiBAIDEKWyAgICAzLjk5MzA1N10gaW5pdGNhbGwgcHJv
Y19leGVjZG9tYWluc19pbml0KzB4MC8weDIyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAg
IDMuOTkzMTY2XSBjYWxsaW5nICBpb3Jlc291cmNlc19pbml0KzB4MC8weDNjIEAgMQpbICAgIDMu
OTkzMjY4XSBpbml0Y2FsbCBpb3Jlc291cmNlc19pbml0KzB4MC8weDNjIHJldHVybmVkIDAgYWZ0
ZXIgMSB1c2VjcwpbICAgIDMuOTkzMzc0XSBjYWxsaW5nICB1aWRfY2FjaGVfaW5pdCsweDAvMHg5
NSBAIDEKWyAgICAzLjk5MzQ4Ml0gaW5pdGNhbGwgdWlkX2NhY2hlX2luaXQrMHgwLzB4OTUgcmV0
dXJuZWQgMCBhZnRlciA2IHVzZWNzClsgICAgMy45OTM1ODZdIGNhbGxpbmcgIGluaXRfcG9zaXhf
dGltZXJzKzB4MC8weDIwMyBAIDEKWyAgICAzLjk5MzY4OV0gaW5pdGNhbGwgaW5pdF9wb3NpeF90
aW1lcnMrMHgwLzB4MjAzIHJldHVybmVkIDAgYWZ0ZXIgMSB1c2VjcwpbICAgIDMuOTkzNzk1XSBj
YWxsaW5nICBpbml0X3Bvc2l4X2NwdV90aW1lcnMrMHgwLzB4YzIgQCAxClsgICAgMy45OTM4OTld
IGluaXRjYWxsIGluaXRfcG9zaXhfY3B1X3RpbWVycysweDAvMHhjMiByZXR1cm5lZCAwIGFmdGVy
IDAgdXNlY3MKWyAgICAzLjk5NDAwNl0gY2FsbGluZyAgY3JlYXRlX3Byb2NfcHJvZmlsZSsweDAv
MHg5MCBAIDEKWyAgICAzLjk5NDEwOF0gaW5pdGNhbGwgY3JlYXRlX3Byb2NfcHJvZmlsZSsweDAv
MHg5MCByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICAzLjk5NDIxMV0gY2FsbGluZyAgdGlt
ZWtlZXBpbmdfaW5pdF9vcHMrMHgwLzB4MTQgQCAxClsgICAgMy45OTQzMTJdIGluaXRjYWxsIHRp
bWVrZWVwaW5nX2luaXRfb3BzKzB4MC8weDE0IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAg
IDMuOTk0NDE1XSBjYWxsaW5nICBpbml0X2Nsb2Nrc291cmNlX3N5c2ZzKzB4MC8weDUwIEAgMQpb
ICAgIDMuOTk0NTI3XSBpbml0Y2FsbCBpbml0X2Nsb2Nrc291cmNlX3N5c2ZzKzB4MC8weDUwIHJl
dHVybmVkIDAgYWZ0ZXIgOSB1c2VjcwpbICAgIDMuOTk0NjMzXSBjYWxsaW5nICBpbml0X3RpbWVy
X2xpc3RfcHJvY2ZzKzB4MC8weDJjIEAgMQpbICAgIDMuOTk2NDMyXSBpbml0Y2FsbCBpbml0X3Rp
bWVyX2xpc3RfcHJvY2ZzKzB4MC8weDJjIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDMu
OTk2NTM3XSBjYWxsaW5nICBhbGFybXRpbWVyX2luaXQrMHgwLzB4MTcwIEAgMQpbICAgIDMuOTk2
NjY0XSBpbml0Y2FsbCBhbGFybXRpbWVyX2luaXQrMHgwLzB4MTcwIHJldHVybmVkIDAgYWZ0ZXIg
MjMgdXNlY3MKWyAgICAzLjk5Njc2OF0gY2FsbGluZyAgaW5pdF90c3RhdHNfcHJvY2ZzKzB4MC8w
eDJjIEAgMQpbICAgIDMuOTk2ODcwXSBpbml0Y2FsbCBpbml0X3RzdGF0c19wcm9jZnMrMHgwLzB4
MmMgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy45OTY5NzZdIGNhbGxpbmcgIGZ1dGV4
X2luaXQrMHgwLzB4NWYgQCAxClsgICAgMy45OTcwODFdIGluaXRjYWxsIGZ1dGV4X2luaXQrMHgw
LzB4NWYgcmV0dXJuZWQgMCBhZnRlciAzIHVzZWNzClsgICAgMy45OTcxODVdIGNhbGxpbmcgIHBy
b2NfZG1hX2luaXQrMHgwLzB4MjIgQCAxClsgICAgMy45OTcyODVdIGluaXRjYWxsIHByb2NfZG1h
X2luaXQrMHgwLzB4MjIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgMy45OTczOTBdIGNh
bGxpbmcgIHByb2NfbW9kdWxlc19pbml0KzB4MC8weDIyIEAgMQpbICAgIDMuOTk3NDkyXSBpbml0
Y2FsbCBwcm9jX21vZHVsZXNfaW5pdCsweDAvMHgyMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MK
WyAgICAzLjk5NzU5OF0gY2FsbGluZyAga2FsbHN5bXNfaW5pdCsweDAvMHgyNSBAIDEKWyAgICAz
Ljk5NzcwMF0gaW5pdGNhbGwga2FsbHN5bXNfaW5pdCsweDAvMHgyNSByZXR1cm5lZCAwIGFmdGVy
IDAgdXNlY3MKWyAgICAzLjk5NzgwNV0gY2FsbGluZyAgc25hcHNob3RfZGV2aWNlX2luaXQrMHgw
LzB4MTIgQCAxClsgICAgMy45OTc5NDhdIGluaXRjYWxsIHNuYXBzaG90X2RldmljZV9pbml0KzB4
MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgNDEgdXNlY3MKWyAgICAzLjk5ODA1Ml0gY2FsbGluZyAg
Y3Jhc2hfc2F2ZV92bWNvcmVpbmZvX2luaXQrMHgwLzB4NDdjIEAgMQpbICAgIDMuOTk4MTcxXSBp
bml0Y2FsbCBjcmFzaF9zYXZlX3ZtY29yZWluZm9faW5pdCsweDAvMHg0N2MgcmV0dXJuZWQgMCBh
ZnRlciAxMyB1c2VjcwpbICAgIDMuOTk4Mjk0XSBjYWxsaW5nICBjcmFzaF9ub3Rlc19tZW1vcnlf
aW5pdCsweDAvMHgzNyBAIDEKWyAgICAzLjk5ODM5OF0gaW5pdGNhbGwgY3Jhc2hfbm90ZXNfbWVt
b3J5X2luaXQrMHgwLzB4MzcgcmV0dXJuZWQgMCBhZnRlciAxIHVzZWNzClsgICAgMy45OTg1MjJd
IGNhbGxpbmcgIHVzZXJfbmFtZXNwYWNlc19pbml0KzB4MC8weDJkIEAgMQpbICAgIDMuOTk4NjI3
XSBpbml0Y2FsbCB1c2VyX25hbWVzcGFjZXNfaW5pdCsweDAvMHgyZCByZXR1cm5lZCAwIGFmdGVy
IDMgdXNlY3MKWyAgICAzLjk5ODczM10gY2FsbGluZyAgcGlkX25hbWVzcGFjZXNfaW5pdCsweDAv
MHgyZCBAIDEKWyAgICAzLjk5ODgzN10gaW5pdGNhbGwgcGlkX25hbWVzcGFjZXNfaW5pdCsweDAv
MHgyZCByZXR1cm5lZCAwIGFmdGVyIDIgdXNlY3MKWyAgICAzLjk5ODk0Ml0gY2FsbGluZyAgYXVk
aXRfaW5pdCsweDAvMHgxNiBAIDEKWyAgICAzLjk5OTA0Ml0gYXVkaXQ6IGluaXRpYWxpemluZyBu
ZXRsaW5rIHNvY2tldCAoZGlzYWJsZWQpClsgICAgMy45OTkxNTBdIHR5cGU9MjAwMCBhdWRpdCgx
MzM0MTY4OTYzLjczMToxKTogaW5pdGlhbGl6ZWQKWyAgICAzLjk5OTI1M10gaW5pdGNhbGwgYXVk
aXRfaW5pdCsweDAvMHgxNiByZXR1cm5lZCAwIGFmdGVyIDIwNSB1c2VjcwpbICAgIDMuOTk5MzU2
XSBjYWxsaW5nICBhdWRpdF93YXRjaF9pbml0KzB4MC8weDNhIEAgMQpbICAgIDMuOTk5NDU3XSBp
bml0Y2FsbCBhdWRpdF93YXRjaF9pbml0KzB4MC8weDNhIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vj
cwpbICAgIDMuOTk5NTYzXSBjYWxsaW5nICBhdWRpdF90cmVlX2luaXQrMHgwLzB4NTggQCAxClsg
ICAgMy45OTk2NjJdIGluaXRjYWxsIGF1ZGl0X3RyZWVfaW5pdCsweDAvMHg1OCByZXR1cm5lZCAw
IGFmdGVyIDAgdXNlY3MKWyAgICAzLjk5OTc2N10gY2FsbGluZyAgaW5pdF9rcHJvYmVzKzB4MC8w
eDE4MyBAIDEKWyAgICA0LjAxNTgwM10gaW5pdGNhbGwgaW5pdF9rcHJvYmVzKzB4MC8weDE4MyBy
ZXR1cm5lZCAwIGFmdGVyIDE1NTYxIHVzZWNzClsgICAgNC4wMTU5MDddIGNhbGxpbmcgIGh1bmdf
dGFza19pbml0KzB4MC8weDUzIEAgMQpbICAgIDQuMDE2MDM1XSBpbml0Y2FsbCBodW5nX3Rhc2tf
aW5pdCsweDAvMHg1MyByZXR1cm5lZCAwIGFmdGVyIDI1IHVzZWNzClsgICAgNC4wMTYxNDBdIGNh
bGxpbmcgIGlycV9nY19pbml0X29wcysweDAvMHgxNCBAIDEKWyAgICA0LjAxNjI0Ml0gaW5pdGNh
bGwgaXJxX2djX2luaXRfb3BzKzB4MC8weDE0IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAg
IDQuMDE2MzQ3XSBjYWxsaW5nICBpcnFfcG1faW5pdF9vcHMrMHgwLzB4MTQgQCAxClsgICAgNC4w
MTY0NDldIGluaXRjYWxsIGlycV9wbV9pbml0X29wcysweDAvMHgxNCByZXR1cm5lZCAwIGFmdGVy
IDAgdXNlY3MKWyAgICA0LjAxNjU1NF0gY2FsbGluZyAgdXRzbmFtZV9zeXNjdGxfaW5pdCsweDAv
MHgxNCBAIDEKWyAgICA0LjAxNjY2M10gaW5pdGNhbGwgdXRzbmFtZV9zeXNjdGxfaW5pdCsweDAv
MHgxNCByZXR1cm5lZCAwIGFmdGVyIDkgdXNlY3MKWyAgICA0LjAxNjc2Nl0gY2FsbGluZyAgaW5p
dF90cmFjZXBvaW50cysweDAvMHgyMCBAIDEKWyAgICA0LjAxNjg2Nl0gaW5pdGNhbGwgaW5pdF90
cmFjZXBvaW50cysweDAvMHgyMCByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICA0LjAxNjk2
OV0gY2FsbGluZyAgaW5pdF9sc3RhdHNfcHJvY2ZzKzB4MC8weDI1IEAgMQpbICAgIDQuMDE3MDcz
XSBpbml0Y2FsbCBpbml0X2xzdGF0c19wcm9jZnMrMHgwLzB4MjUgcmV0dXJuZWQgMCBhZnRlciAx
IHVzZWNzClsgICAgNC4wMTcxNzhdIGNhbGxpbmcgIGZ0cmFjZV9tb2RfY21kX2luaXQrMHgwLzB4
MTIgQCAxClsgICAgNC4wMTcyODBdIGluaXRjYWxsIGZ0cmFjZV9tb2RfY21kX2luaXQrMHgwLzB4
MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4wMTczODZdIGNhbGxpbmcgIGluaXRf
ZXZlbnRzKzB4MC8weDYwIEAgMQpbICAgIDQuMDE3NDkyXSBpbml0Y2FsbCBpbml0X2V2ZW50cysw
eDAvMHg2MCByZXR1cm5lZCAwIGFmdGVyIDMgdXNlY3MKWyAgICA0LjAxNzU5N10gY2FsbGluZyAg
aW5pdF9mdW5jdGlvbl90cmFjZSsweDAvMHgzZSBAIDEKWyAgICA0LjAxNzcwMF0gaW5pdGNhbGwg
aW5pdF9mdW5jdGlvbl90cmFjZSsweDAvMHgzZSByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAg
ICA0LjAxNzgwNV0gY2FsbGluZyAgaW5pdF93YWtldXBfdHJhY2VyKzB4MC8weDIyIEAgMQpbICAg
IDQuMDE3OTA4XSBpbml0Y2FsbCBpbml0X3dha2V1cF90cmFjZXIrMHgwLzB4MjIgcmV0dXJuZWQg
MCBhZnRlciAwIHVzZWNzClsgICAgNC4wMTgwMTJdIGNhbGxpbmcgIHN0YWNrX3RyYWNlX2luaXQr
MHgwLzB4NjggQCAxClsgICAgNC4wMTgxMTldIGluaXRjYWxsIHN0YWNrX3RyYWNlX2luaXQrMHgw
LzB4NjggcmV0dXJuZWQgMCBhZnRlciA0IHVzZWNzClsgICAgNC4wMTgyMjVdIGNhbGxpbmcgIGlu
aXRfbW1pb190cmFjZSsweDAvMHgxMiBAIDEKWyAgICA0LjAxODMyOF0gaW5pdGNhbGwgaW5pdF9t
bWlvX3RyYWNlKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMDE4NDM0
XSBjYWxsaW5nICBpbml0X2dyYXBoX3RyYWNlKzB4MC8weDY1IEAgMQpbICAgIDQuMDE4NTM3XSBp
bml0Y2FsbCBpbml0X2dyYXBoX3RyYWNlKzB4MC8weDY1IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vj
cwpbICAgIDQuMDE4NjQwXSBjYWxsaW5nICBpbml0X2Jsa190cmFjZXIrMHgwLzB4NWMgQCAxClsg
ICAgNC4wMTg3NDJdIGluaXRjYWxsIGluaXRfYmxrX3RyYWNlcisweDAvMHg1YyByZXR1cm5lZCAw
IGFmdGVyIDAgdXNlY3MKWyAgICA0LjAxODg0OF0gY2FsbGluZyAgcGVyZl9ldmVudF9zeXNmc19p
bml0KzB4MC8weDkzIEAgMQpbICAgIDQuMDE4OTkyXSBpbml0Y2FsbCBwZXJmX2V2ZW50X3N5c2Zz
X2luaXQrMHgwLzB4OTMgcmV0dXJuZWQgMCBhZnRlciAzOSB1c2VjcwpbICAgIDQuMDE5MDk5XSBj
YWxsaW5nICBpbml0X3Blcl96b25lX3dtYXJrX21pbisweDAvMHg4OCBAIDEKWyAgICA0LjAyMDQw
Nl0gaW5pdGNhbGwgaW5pdF9wZXJfem9uZV93bWFya19taW4rMHgwLzB4ODggcmV0dXJuZWQgMCBh
ZnRlciAxMTY5IHVzZWNzClsgICAgNC4wMjA1MzddIGNhbGxpbmcgIGtzd2FwZF9pbml0KzB4MC8w
eDc1IEAgMQpbICAgIDQuMDIwNzAzXSBpbml0Y2FsbCBrc3dhcGRfaW5pdCsweDAvMHg3NSByZXR1
cm5lZCAwIGFmdGVyIDYzIHVzZWNzClsgICAgNC4wMjA4MDldIGNhbGxpbmcgIGV4dGZyYWdfZGVi
dWdfaW5pdCsweDAvMHg3NyBAIDEKWyAgICA0LjAyMDkyMV0gaW5pdGNhbGwgZXh0ZnJhZ19kZWJ1
Z19pbml0KzB4MC8weDc3IHJldHVybmVkIDAgYWZ0ZXIgOCB1c2VjcwpbICAgIDQuMDIxMDI2XSBj
YWxsaW5nICBzZXR1cF92bXN0YXQrMHgwLzB4YzcgQCAxClsgICAgNC4wMjExMzddIGluaXRjYWxs
IHNldHVwX3Ztc3RhdCsweDAvMHhjNyByZXR1cm5lZCAwIGFmdGVyIDggdXNlY3MKWyAgICA0LjAy
MTI0Ml0gY2FsbGluZyAgbW1fc3lzZnNfaW5pdCsweDAvMHgyOSBAIDEKWyAgICA0LjAyMTM0N10g
aW5pdGNhbGwgbW1fc3lzZnNfaW5pdCsweDAvMHgyOSByZXR1cm5lZCAwIGFmdGVyIDQgdXNlY3MK
WyAgICA0LjAyMTQ1MV0gY2FsbGluZyAgcHJvY192bWFsbG9jX2luaXQrMHgwLzB4MjUgQCAxClsg
ICAgNC4wMjE1NTBdIGluaXRjYWxsIHByb2Nfdm1hbGxvY19pbml0KzB4MC8weDI1IHJldHVybmVk
IDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMDIxNjU1XSBjYWxsaW5nICBwcm9jc3dhcHNfaW5pdCsw
eDAvMHgyMiBAIDEKWyAgICA0LjAyMTc1N10gaW5pdGNhbGwgcHJvY3N3YXBzX2luaXQrMHgwLzB4
MjIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4wMjE4NjFdIGNhbGxpbmcgIGh1Z2V0
bGJfaW5pdCsweDAvMHgzMmQgQCAxClsgICAgNC4wMjE5NjNdIEh1Z2VUTEIgcmVnaXN0ZXJlZCAy
IE1CIHBhZ2Ugc2l6ZSwgcHJlLWFsbG9jYXRlZCAwIHBhZ2VzClsgICAgNC4wMjIwNzVdIGluaXRj
YWxsIGh1Z2V0bGJfaW5pdCsweDAvMHgzMmQgcmV0dXJuZWQgMCBhZnRlciAxMTAgdXNlY3MKWyAg
ICA0LjAyMjE4MF0gY2FsbGluZyAga3NtX2luaXQrMHgwLzB4ZDAgQCAxClsgICAgNC4wMjIzMjFd
IGluaXRjYWxsIGtzbV9pbml0KzB4MC8weGQwIHJldHVybmVkIDAgYWZ0ZXIgNDAgdXNlY3MKWyAg
ICA0LjAyMjQyNl0gY2FsbGluZyAgc2xhYl9wcm9jX2luaXQrMHgwLzB4MjUgQCAxClsgICAgNC4w
MjI1MjldIGluaXRjYWxsIHNsYWJfcHJvY19pbml0KzB4MC8weDI1IHJldHVybmVkIDAgYWZ0ZXIg
MiB1c2VjcwpbICAgIDQuMDIyNjMzXSBjYWxsaW5nICBzbGFiX3N5c2ZzX2luaXQrMHgwLzB4MTA5
IEAgMQpbICAgIDQuMDIzNjY3XSBpbml0Y2FsbCBzbGFiX3N5c2ZzX2luaXQrMHgwLzB4MTA5IHJl
dHVybmVkIDAgYWZ0ZXIgOTEwIHVzZWNzClsgICAgNC4wMjM3NzNdIGNhbGxpbmcgIGh1Z2VwYWdl
X2luaXQrMHgwLzB4MTQxIEAgMQpbICAgIDQuMDIzODc0XSBpbml0Y2FsbCBodWdlcGFnZV9pbml0
KzB4MC8weDE0MSByZXR1cm5lZCAtMjIgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMDIzOTc5XSBpbml0
Y2FsbCBodWdlcGFnZV9pbml0KzB4MC8weDE0MSByZXR1cm5lZCB3aXRoIGVycm9yIGNvZGUgLTIy
IApbICAgIDQuMDI0MDg1XSBjYWxsaW5nICBpbml0X2NsZWFuY2FjaGUrMHgwLzB4MWIgQCAxClsg
ICAgNC4wMjQxODddIGluaXRjYWxsIGluaXRfY2xlYW5jYWNoZSsweDAvMHgxYiByZXR1cm5lZCAw
IGFmdGVyIDEgdXNlY3MKWyAgICA0LjAyNDI5Ml0gY2FsbGluZyAgZmNudGxfaW5pdCsweDAvMHgy
YSBAIDEKWyAgICA0LjAyNDM5NV0gaW5pdGNhbGwgZmNudGxfaW5pdCsweDAvMHgyYSByZXR1cm5l
ZCAwIGFmdGVyIDEgdXNlY3MKWyAgICA0LjAyNDQ5OF0gY2FsbGluZyAgcHJvY19maWxlc3lzdGVt
c19pbml0KzB4MC8weDIyIEAgMQpbICAgIDQuMDI0NjAzXSBpbml0Y2FsbCBwcm9jX2ZpbGVzeXN0
ZW1zX2luaXQrMHgwLzB4MjIgcmV0dXJuZWQgMCBhZnRlciAxIHVzZWNzClsgICAgNC4wMjQ3MTBd
IGNhbGxpbmcgIGRpb19pbml0KzB4MC8weDJkIEAgMQpbICAgIDQuMDI0ODI5XSBpbml0Y2FsbCBk
aW9faW5pdCsweDAvMHgyZCByZXR1cm5lZCAwIGFmdGVyIDE3IHVzZWNzClsgICAgNC4wMjQ5MzFd
IGNhbGxpbmcgIGZzbm90aWZ5X21hcmtfaW5pdCsweDAvMHg0MCBAIDEKWyAgICA0LjAyNTA1OV0g
aW5pdGNhbGwgZnNub3RpZnlfbWFya19pbml0KzB4MC8weDQwIHJldHVybmVkIDAgYWZ0ZXIgMjUg
dXNlY3MKWyAgICA0LjAyNTE2OF0gY2FsbGluZyAgZG5vdGlmeV9pbml0KzB4MC8weDdiIEAgMQpb
ICAgIDQuMDI1MzAxXSBpbml0Y2FsbCBkbm90aWZ5X2luaXQrMHgwLzB4N2IgcmV0dXJuZWQgMCBh
ZnRlciAzMCB1c2VjcwpbICAgIDQuMDI1NDA1XSBjYWxsaW5nICBpbm90aWZ5X3VzZXJfc2V0dXAr
MHgwLzB4NzAgQCAxClsgICAgNC4wMjU1MTBdIGluaXRjYWxsIGlub3RpZnlfdXNlcl9zZXR1cCsw
eDAvMHg3MCByZXR1cm5lZCAwIGFmdGVyIDIgdXNlY3MKWyAgICA0LjAyNTYxNV0gY2FsbGluZyAg
ZmFub3RpZnlfdXNlcl9zZXR1cCsweDAvMHg1MiBAIDEKWyAgICA0LjAyNTcxOV0gaW5pdGNhbGwg
ZmFub3RpZnlfdXNlcl9zZXR1cCsweDAvMHg1MiByZXR1cm5lZCAwIGFmdGVyIDIgdXNlY3MKWyAg
ICA0LjAyNTgyNF0gY2FsbGluZyAgYWlvX3NldHVwKzB4MC8weDc4IEAgMQpbICAgIDQuMDI1OTMw
XSBpbml0Y2FsbCBhaW9fc2V0dXArMHgwLzB4NzggcmV0dXJuZWQgMCBhZnRlciA2IHVzZWNzClsg
ICAgNC4wMjYwMzJdIGNhbGxpbmcgIHByb2NfbG9ja3NfaW5pdCsweDAvMHgyMiBAIDEKWyAgICA0
LjAyNjEzNV0gaW5pdGNhbGwgcHJvY19sb2Nrc19pbml0KzB4MC8weDIyIHJldHVybmVkIDAgYWZ0
ZXIgMSB1c2VjcwpbICAgIDQuMDI2MjM5XSBjYWxsaW5nICBpbml0X3N5czMyX2lvY3RsKzB4MC8w
eDI4IEAgMQpbICAgIDQuMDI2Mzk2XSBpbml0Y2FsbCBpbml0X3N5czMyX2lvY3RsKzB4MC8weDI4
IHJldHVybmVkIDAgYWZ0ZXIgNTMgdXNlY3MKWyAgICA0LjAyNjUwMV0gY2FsbGluZyAgaW5pdF9t
YmNhY2hlKzB4MC8weDE0IEAgMQpbICAgIDQuMDI2NjAyXSBpbml0Y2FsbCBpbml0X21iY2FjaGUr
MHgwLzB4MTQgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4wMjY3MDZdIGNhbGxpbmcg
IGRxdW90X2luaXQrMHgwLzB4MTFhIEAgMQpbICAgIDQuMDI2ODA2XSBWRlM6IERpc2sgcXVvdGFz
IGRxdW90XzYuNS4yClsgICAgNC4wMjY5NDZdIERxdW90LWNhY2hlIGhhc2ggdGFibGUgZW50cmll
czogNTEyIChvcmRlciAwLCA0MDk2IGJ5dGVzKQpbICAgIDQuMDI3MDUxXSBpbml0Y2FsbCBkcXVv
dF9pbml0KzB4MC8weDExYSByZXR1cm5lZCAwIGFmdGVyIDIzOCB1c2VjcwpbICAgIDQuMDI3MTU1
XSBjYWxsaW5nICBxdW90YV9pbml0KzB4MC8weDI2IEAgMQpbICAgIDQuMDI3MjU5XSBpbml0Y2Fs
bCBxdW90YV9pbml0KzB4MC8weDI2IHJldHVybmVkIDAgYWZ0ZXIgMiB1c2VjcwpbICAgIDQuMDI3
MzYwXSBjYWxsaW5nICBwcm9jX2NtZGxpbmVfaW5pdCsweDAvMHgyMiBAIDEKWyAgICA0LjAyNzQ2
Ml0gaW5pdGNhbGwgcHJvY19jbWRsaW5lX2luaXQrMHgwLzB4MjIgcmV0dXJuZWQgMCBhZnRlciAx
IHVzZWNzClsgICAgNC4wMjc1NjZdIGNhbGxpbmcgIHByb2NfY29uc29sZXNfaW5pdCsweDAvMHgy
MiBAIDEKWyAgICA0LjAyNzY2NV0gaW5pdGNhbGwgcHJvY19jb25zb2xlc19pbml0KzB4MC8weDIy
IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMDI3NzcxXSBjYWxsaW5nICBwcm9jX2Nw
dWluZm9faW5pdCsweDAvMHgyMiBAIDEKWyAgICA0LjAyNzg3NF0gaW5pdGNhbGwgcHJvY19jcHVp
bmZvX2luaXQrMHgwLzB4MjIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4wMjc5Nzld
IGNhbGxpbmcgIHByb2NfZGV2aWNlc19pbml0KzB4MC8weDIyIEAgMQpbICAgIDQuMDI4MDgxXSBp
bml0Y2FsbCBwcm9jX2RldmljZXNfaW5pdCsweDAvMHgyMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNl
Y3MKWyAgICA0LjAyODE4NV0gY2FsbGluZyAgcHJvY19pbnRlcnJ1cHRzX2luaXQrMHgwLzB4MjIg
QCAxClsgICAgNC4wMjgyODhdIGluaXRjYWxsIHByb2NfaW50ZXJydXB0c19pbml0KzB4MC8weDIy
IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMDI4MzkyXSBjYWxsaW5nICBwcm9jX2xv
YWRhdmdfaW5pdCsweDAvMHgyMiBAIDEKWyAgICA0LjAyODQ5M10gaW5pdGNhbGwgcHJvY19sb2Fk
YXZnX2luaXQrMHgwLzB4MjIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4wMjg1OThd
IGNhbGxpbmcgIHByb2NfbWVtaW5mb19pbml0KzB4MC8weDIyIEAgMQpbICAgIDQuMDI4NzAyXSBp
bml0Y2FsbCBwcm9jX21lbWluZm9faW5pdCsweDAvMHgyMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNl
Y3MKWyAgICA0LjAyODgwN10gY2FsbGluZyAgcHJvY19zdGF0X2luaXQrMHgwLzB4MjIgQCAxClsg
ICAgNC4wMjg5MDhdIGluaXRjYWxsIHByb2Nfc3RhdF9pbml0KzB4MC8weDIyIHJldHVybmVkIDAg
YWZ0ZXIgMCB1c2VjcwpbICAgIDQuMDI5MDEyXSBjYWxsaW5nICBwcm9jX3VwdGltZV9pbml0KzB4
MC8weDIyIEAgMQpbICAgIDQuMDI5MTE1XSBpbml0Y2FsbCBwcm9jX3VwdGltZV9pbml0KzB4MC8w
eDIyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMDI5MjIxXSBjYWxsaW5nICBwcm9j
X3ZlcnNpb25faW5pdCsweDAvMHgyMiBAIDEKWyAgICA0LjAyOTMyOV0gaW5pdGNhbGwgcHJvY192
ZXJzaW9uX2luaXQrMHgwLzB4MjIgcmV0dXJuZWQgMCBhZnRlciA1IHVzZWNzClsgICAgNC4wMjk0
MzJdIGNhbGxpbmcgIHByb2Nfc29mdGlycXNfaW5pdCsweDAvMHgyMiBAIDEKWyAgICA0LjAyOTUz
Nl0gaW5pdGNhbGwgcHJvY19zb2Z0aXJxc19pbml0KzB4MC8weDIyIHJldHVybmVkIDAgYWZ0ZXIg
MCB1c2VjcwpbICAgIDQuMDI5NjM5XSBjYWxsaW5nICBwcm9jX2tjb3JlX2luaXQrMHgwLzB4YjUg
QCAxClsgICAgNC4wMjk3NDJdIGluaXRjYWxsIHByb2Nfa2NvcmVfaW5pdCsweDAvMHhiNSByZXR1
cm5lZCAwIGFmdGVyIDQgdXNlY3MKWyAgICA0LjAyOTg0NV0gY2FsbGluZyAgdm1jb3JlX2luaXQr
MHgwLzB4NzAgQCAxClsgICAgNC4wMjk5NDRdIGluaXRjYWxsIHZtY29yZV9pbml0KzB4MC8weDcw
IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMDMwMDQ4XSBjYWxsaW5nICBwcm9jX2tt
c2dfaW5pdCsweDAvMHgyNSBAIDEKWyAgICA0LjAzMDE0N10gaW5pdGNhbGwgcHJvY19rbXNnX2lu
aXQrMHgwLzB4MjUgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4wMzAyNTBdIGNhbGxp
bmcgIHByb2NfcGFnZV9pbml0KzB4MC8weDQyIEAgMQpbICAgIDQuMDMwMzUzXSBpbml0Y2FsbCBw
cm9jX3BhZ2VfaW5pdCsweDAvMHg0MiByZXR1cm5lZCAwIGFmdGVyIDEgdXNlY3MKWyAgICA0LjAz
MDQ1OV0gY2FsbGluZyAgcHJvY192ZXJzaW9uX3NpZ25hdHVyZV9pbml0KzB4MC8weDIyIEAgMQpb
ICAgIDQuMDMwNTYzXSBpbml0Y2FsbCBwcm9jX3ZlcnNpb25fc2lnbmF0dXJlX2luaXQrMHgwLzB4
MjIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4wMzA2ODhdIGNhbGxpbmcgIGluaXRf
ZGV2cHRzX2ZzKzB4MC8weDRhIEAgMQpbICAgIDQuMDMwODAxXSBpbml0Y2FsbCBpbml0X2RldnB0
c19mcysweDAvMHg0YSByZXR1cm5lZCAwIGFmdGVyIDEwIHVzZWNzClsgICAgNC4wMzA5MDVdIGNh
bGxpbmcgIGluaXRfZXh0M19mcysweDAvMHg3NiBAIDEKWyAgICA0LjAzMTA0MF0gaW5pdGNhbGwg
aW5pdF9leHQzX2ZzKzB4MC8weDc2IHJldHVybmVkIDAgYWZ0ZXIgMzMgdXNlY3MKWyAgICA0LjAz
MTE0NV0gY2FsbGluZyAgZXh0NF9pbml0X2ZzKzB4MC8weDVjIEAgMQpbICAgIDQuMDMxMzM0XSBp
bml0Y2FsbCBleHQ0X2luaXRfZnMrMHgwLzB4NWMgcmV0dXJuZWQgMCBhZnRlciA4NCB1c2Vjcwpb
ICAgIDQuMDMxNDM5XSBjYWxsaW5nICBqb3VybmFsX2luaXQrMHgwLzB4MWUgQCAxClsgICAgNC4w
MzE1ODldIGluaXRjYWxsIGpvdXJuYWxfaW5pdCsweDAvMHgxZSByZXR1cm5lZCAwIGFmdGVyIDQ3
IHVzZWNzClsgICAgNC4wMzE2OTNdIGNhbGxpbmcgIGpvdXJuYWxfaW5pdCsweDAvMHgzNCBAIDEK
WyAgICA0LjAzMTgwMF0gaW5pdGNhbGwgam91cm5hbF9pbml0KzB4MC8weDM0IHJldHVybmVkIDAg
YWZ0ZXIgNSB1c2VjcwpbICAgIDQuMDMxOTA0XSBjYWxsaW5nICBpbml0X3JhbWZzX2ZzKzB4MC8w
eDEyIEAgMQpbICAgIDQuMDMyMDAzXSBpbml0Y2FsbCBpbml0X3JhbWZzX2ZzKzB4MC8weDEyIHJl
dHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMDMyMTA5XSBjYWxsaW5nICBpbml0X2h1Z2V0
bGJmc19mcysweDAvMHg5NSBAIDEKWyAgICA0LjAzMjI0Ml0gaW5pdGNhbGwgaW5pdF9odWdldGxi
ZnNfZnMrMHgwLzB4OTUgcmV0dXJuZWQgMCBhZnRlciAzMCB1c2VjcwpbICAgIDQuMDMyMzQ2XSBj
YWxsaW5nICBlY3J5cHRmc19pbml0KzB4MC8weDFlNiBAIDEKWyAgICA0LjAzMjU2OV0gaW5pdGNh
bGwgZWNyeXB0ZnNfaW5pdCsweDAvMHgxZTYgcmV0dXJuZWQgMCBhZnRlciAxMTggdXNlY3MKWyAg
ICA0LjAzMjY3NV0gY2FsbGluZyAgZnVzZV9pbml0KzB4MC8weDFiMCBAIDEKWyAgICA0LjAzMjc3
NV0gZnVzZSBpbml0IChBUEkgdmVyc2lvbiA3LjE3KQpbICAgIDQuMDMyOTQwXSBpbml0Y2FsbCBm
dXNlX2luaXQrMHgwLzB4MWIwIHJldHVybmVkIDAgYWZ0ZXIgMTU5IHVzZWNzClsgICAgNC4wMzMw
NDVdIGNhbGxpbmcgIGluaXRfcHN0b3JlX2ZzKzB4MC8weDEyIEAgMQpbICAgIDQuMDMzMTQ3XSBp
bml0Y2FsbCBpbml0X3BzdG9yZV9mcysweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MK
WyAgICA0LjAzMzI1MV0gY2FsbGluZyAgaXBjX2luaXQrMHgwLzB4MmYgQCAxClsgICAgNC4wMzMz
NTNdIG1zZ21uaSBoYXMgYmVlbiBzZXQgdG8gMTQ4MApbICAgIDQuMDMzNDUzXSBpbml0Y2FsbCBp
cGNfaW5pdCsweDAvMHgyZiByZXR1cm5lZCAwIGFmdGVyIDk5IHVzZWNzClsgICAgNC4wMzM1NTVd
IGNhbGxpbmcgIGlwY19zeXNjdGxfaW5pdCsweDAvMHgxNCBAIDEKWyAgICA0LjAzNTM2OV0gaW5p
dGNhbGwgaXBjX3N5c2N0bF9pbml0KzB4MC8weDE0IHJldHVybmVkIDAgYWZ0ZXIgMTUgdXNlY3MK
WyAgICA0LjAzNTQ3NF0gY2FsbGluZyAgaW5pdF9tcXVldWVfZnMrMHgwLzB4OWYgQCAxClsgICAg
NC4wMzU2MTddIGluaXRjYWxsIGluaXRfbXF1ZXVlX2ZzKzB4MC8weDlmIHJldHVybmVkIDAgYWZ0
ZXIgMzkgdXNlY3MKWyAgICA0LjAzNTcyM10gY2FsbGluZyAga2V5X3Byb2NfaW5pdCsweDAvMHgz
MyBAIDEKWyAgICA0LjAzNTgyN10gaW5pdGNhbGwga2V5X3Byb2NfaW5pdCsweDAvMHgzMyByZXR1
cm5lZCAwIGFmdGVyIDEgdXNlY3MKWyAgICA0LjAzNTkzMl0gY2FsbGluZyAgc2VsaW51eF9uZl9p
cF9pbml0KzB4MC8weDY5IEAgMQpbICAgIDQuMDM2MDM1XSBpbml0Y2FsbCBzZWxpbnV4X25mX2lw
X2luaXQrMHgwLzB4NjkgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4wMzYxMzldIGNh
bGxpbmcgIGluaXRfc2VsX2ZzKzB4MC8weDliIEAgMQpbICAgIDQuMDM2MjQwXSBpbml0Y2FsbCBp
bml0X3NlbF9mcysweDAvMHg5YiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICA0LjAzNjM0
Ml0gY2FsbGluZyAgc2VsbmxfaW5pdCsweDAvMHg0ZCBAIDEKWyAgICA0LjAzNjQ0OF0gaW5pdGNh
bGwgc2VsbmxfaW5pdCsweDAvMHg0ZCByZXR1cm5lZCAwIGFmdGVyIDMgdXNlY3MKWyAgICA0LjAz
NjU1MV0gY2FsbGluZyAgc2VsX25ldGlmX2luaXQrMHgwLzB4NzMgQCAxClsgICAgNC4wMzY2NTNd
IGluaXRjYWxsIHNlbF9uZXRpZl9pbml0KzB4MC8weDczIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vj
cwpbICAgIDQuMDM2NzU4XSBjYWxsaW5nICBzZWxfbmV0bm9kZV9pbml0KzB4MC8weDc0IEAgMQpb
ICAgIDQuMDM2ODU5XSBpbml0Y2FsbCBzZWxfbmV0bm9kZV9pbml0KzB4MC8weDc0IHJldHVybmVk
IDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMDM2OTY1XSBjYWxsaW5nICBzZWxfbmV0cG9ydF9pbml0
KzB4MC8weDc0IEAgMQpbICAgIDQuMDM3MDY3XSBpbml0Y2FsbCBzZWxfbmV0cG9ydF9pbml0KzB4
MC8weDc0IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMDM3MTczXSBjYWxsaW5nICBh
dXJ1bGVfaW5pdCsweDAvMHgzNyBAIDEKWyAgICA0LjAzNzI3Ml0gaW5pdGNhbGwgYXVydWxlX2lu
aXQrMHgwLzB4MzcgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4wMzczNzZdIGNhbGxp
bmcgIGluaXRfc21rX2ZzKzB4MC8weDIxIEAgMQpbICAgIDQuMDM3NDc2XSBpbml0Y2FsbCBpbml0
X3Nta19mcysweDAvMHgyMSByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICA0LjAzNzU3OV0g
Y2FsbGluZyAgY3J5cHRvX3dxX2luaXQrMHgwLzB4MzEgQCAxClsgICAgNC4wMzc3MDddIGluaXRj
YWxsIGNyeXB0b193cV9pbml0KzB4MC8weDMxIHJldHVybmVkIDAgYWZ0ZXIgMjQgdXNlY3MKWyAg
ICA0LjAzNzgxMF0gY2FsbGluZyAgY3J5cHRvX2FsZ2FwaV9pbml0KzB4MC8weGQgQCAxClsgICAg
NC4wMzc5MTVdIGluaXRjYWxsIGNyeXB0b19hbGdhcGlfaW5pdCsweDAvMHhkIHJldHVybmVkIDAg
YWZ0ZXIgMSB1c2VjcwpbICAgIDQuMDM4MDIwXSBjYWxsaW5nICBza2NpcGhlcl9tb2R1bGVfaW5p
dCsweDAvMHgzNSBAIDEKWyAgICA0LjAzODEyMV0gaW5pdGNhbGwgc2tjaXBoZXJfbW9kdWxlX2lu
aXQrMHgwLzB4MzUgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4wMzgyMjhdIGNhbGxp
bmcgIGNoYWluaXZfbW9kdWxlX2luaXQrMHgwLzB4MTIgQCAxClsgICAgNC4wMzgzMjldIGluaXRj
YWxsIGNoYWluaXZfbW9kdWxlX2luaXQrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNz
ClsgICAgNC4wMzg0MzZdIGNhbGxpbmcgIGVzZXFpdl9tb2R1bGVfaW5pdCsweDAvMHgxMiBAIDEK
WyAgICA0LjAzODUzOV0gaW5pdGNhbGwgZXNlcWl2X21vZHVsZV9pbml0KzB4MC8weDEyIHJldHVy
bmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMDM4NjQ0XSBjYWxsaW5nICBobWFjX21vZHVsZV9p
bml0KzB4MC8weDEyIEAgMQpbICAgIDQuMDM4NzQ2XSBpbml0Y2FsbCBobWFjX21vZHVsZV9pbml0
KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMDM4ODUxXSBjYWxsaW5n
ICBtZDVfbW9kX2luaXQrMHgwLzB4MTIgQCAxClsgICAgNC4wMzg5ODJdIGluaXRjYWxsIG1kNV9t
b2RfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDI5IHVzZWNzClsgICAgNC4wMzkwODZd
IGNhbGxpbmcgIHNoYTFfZ2VuZXJpY19tb2RfaW5pdCsweDAvMHgxMiBAIDEKWyAgICA0LjAzOTIx
OV0gaW5pdGNhbGwgc2hhMV9nZW5lcmljX21vZF9pbml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0
ZXIgMzEgdXNlY3MKWyAgICA0LjAzOTMyNV0gY2FsbGluZyAgc2hhMjU2X2dlbmVyaWNfbW9kX2lu
aXQrMHgwLzB4M2MgQCAxClsgICAgNC4wMzk0ODRdIGluaXRjYWxsIHNoYTI1Nl9nZW5lcmljX21v
ZF9pbml0KzB4MC8weDNjIHJldHVybmVkIDAgYWZ0ZXIgNTQgdXNlY3MKWyAgICA0LjAzOTYwN10g
Y2FsbGluZyAgY3J5cHRvX2VjYl9tb2R1bGVfaW5pdCsweDAvMHgxMiBAIDEKWyAgICA0LjAzOTcw
N10gaW5pdGNhbGwgY3J5cHRvX2VjYl9tb2R1bGVfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFm
dGVyIDAgdXNlY3MKWyAgICA0LjAzOTgxM10gY2FsbGluZyAgY3J5cHRvX2NiY19tb2R1bGVfaW5p
dCsweDAvMHgxMiBAIDEKWyAgICA0LjAzOTkxNF0gaW5pdGNhbGwgY3J5cHRvX2NiY19tb2R1bGVf
aW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICA0LjA0MDAyMF0gY2Fs
bGluZyAgYWVzX2luaXQrMHgwLzB4MTIgQCAxClsgICAgNC4wNDAxNTRdIGluaXRjYWxsIGFlc19p
bml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMzIgdXNlY3MKWyAgICA0LjA0MDI1OF0gY2Fs
bGluZyAgY3JjMzJjX21vZF9pbml0KzB4MC8weDEyIEAgMQpbICAgIDQuMDQwMzkzXSBpbml0Y2Fs
bCBjcmMzMmNfbW9kX2luaXQrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAzMSB1c2VjcwpbICAg
IDQuMDQwNDk5XSBjYWxsaW5nICBrcm5nX21vZF9pbml0KzB4MC8weDEyIEAgMQpbICAgIDQuMDQw
NjM0XSBpbml0Y2FsbCBrcm5nX21vZF9pbml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMzIg
dXNlY3MKWyAgICA0LjA0MDc0MF0gY2FsbGluZyAgcHJvY19nZW5oZF9pbml0KzB4MC8weDNjIEAg
MQpbICAgIDQuMDQwODQxXSBpbml0Y2FsbCBwcm9jX2dlbmhkX2luaXQrMHgwLzB4M2MgcmV0dXJu
ZWQgMCBhZnRlciAyIHVzZWNzClsgICAgNC4wNDA5NDNdIGNhbGxpbmcgIGJzZ19pbml0KzB4MC8w
eDEyZSBAIDEKWyAgICA0LjA0MTA2N10gQmxvY2sgbGF5ZXIgU0NTSSBnZW5lcmljIChic2cpIGRy
aXZlciB2ZXJzaW9uIDAuNCBsb2FkZWQgKG1ham9yIDI1MykKWyAgICA0LjA0MTE5Ml0gaW5pdGNh
bGwgYnNnX2luaXQrMHgwLzB4MTJlIHJldHVybmVkIDAgYWZ0ZXIgMTQ1IHVzZWNzClsgICAgNC4w
NDEyOTddIGNhbGxpbmcgIGluaXRfY2dyb3VwX2Jsa2lvKzB4MC8weDEyIEAgMQpbICAgIDQuMDQx
Mzk5XSBpbml0Y2FsbCBpbml0X2Nncm91cF9ibGtpbysweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVy
IDAgdXNlY3MKWyAgICA0LjA0MTUwMV0gY2FsbGluZyAgdGhyb3RsX2luaXQrMHgwLzB4NDQgQCAx
ClsgICAgNC4wNDE2MjldIGluaXRjYWxsIHRocm90bF9pbml0KzB4MC8weDQ0IHJldHVybmVkIDAg
YWZ0ZXIgMjQgdXNlY3MKWyAgICA0LjA0MTczM10gY2FsbGluZyAgbm9vcF9pbml0KzB4MC8weDE0
IEAgMQpbICAgIDQuMDQxODM1XSBpbyBzY2hlZHVsZXIgbm9vcCByZWdpc3RlcmVkClsgICAgNC4w
NDE5MzVdIGluaXRjYWxsIG5vb3BfaW5pdCsweDAvMHgxNCByZXR1cm5lZCAwIGFmdGVyIDk3IHVz
ZWNzClsgICAgNC4wNDIwMzddIGNhbGxpbmcgIGRlYWRsaW5lX2luaXQrMHgwLzB4MTQgQCAxClsg
ICAgNC4wNDIxMzddIGlvIHNjaGVkdWxlciBkZWFkbGluZSByZWdpc3RlcmVkClsgICAgNC4wNDIy
MzhdIGluaXRjYWxsIGRlYWRsaW5lX2luaXQrMHgwLzB4MTQgcmV0dXJuZWQgMCBhZnRlciA5NyB1
c2VjcwpbICAgIDQuMDQyMzQzXSBjYWxsaW5nICBjZnFfaW5pdCsweDAvMHhiMyBAIDEKWyAgICA0
LjA0MjQ2NF0gaW8gc2NoZWR1bGVyIGNmcSByZWdpc3RlcmVkIChkZWZhdWx0KQpbICAgIDQuMDQy
NTYyXSBpbml0Y2FsbCBjZnFfaW5pdCsweDAvMHhiMyByZXR1cm5lZCAwIGFmdGVyIDExNiB1c2Vj
cwpbICAgIDQuMDQyNjY0XSBjYWxsaW5nICBwZXJjcHVfY291bnRlcl9zdGFydHVwKzB4MC8weDE5
IEAgMQpbICAgIDQuMDQyNzY3XSBpbml0Y2FsbCBwZXJjcHVfY291bnRlcl9zdGFydHVwKzB4MC8w
eDE5IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMDQyODcyXSBjYWxsaW5nICBsbndf
Z3Bpb19pbml0KzB4MC8weDQ1IEAgMQpbICAgIDQuMDQyOTkyXSBpbml0Y2FsbCBsbndfZ3Bpb19p
bml0KzB4MC8weDQ1IHJldHVybmVkIDAgYWZ0ZXIgMTggdXNlY3MKWyAgICA0LjA0MzA5Nl0gY2Fs
bGluZyAgdGltYmdwaW9faW5pdCsweDAvMHgxMiBAIDEKWyAgICA0LjA0MzIwMl0gaW5pdGNhbGwg
dGltYmdwaW9faW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDUgdXNlY3MKWyAgICA0LjA0
MzMwNl0gY2FsbGluZyAgdWNiMTQwMF9ncGlvX2luaXQrMHgwLzB4MTIgQCAxClsgICAgNC4wNDM0
MTBdIGluaXRjYWxsIHVjYjE0MDBfZ3Bpb19pbml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIg
MyB1c2VjcwpbICAgIDQuMDQzNTE0XSBjYWxsaW5nICBwY2lfcHJvY19pbml0KzB4MC8weDY5IEAg
MQpbICAgIDQuMDQzNjM5XSBpbml0Y2FsbCBwY2lfcHJvY19pbml0KzB4MC8weDY5IHJldHVybmVk
IDAgYWZ0ZXIgMjQgdXNlY3MKWyAgICA0LjA0Mzc0NF0gY2FsbGluZyAgcGNpZV9wb3J0ZHJ2X2lu
aXQrMHgwLzB4NzcgQCAxClsgICAgNC4wNDM4NjldIHBjaWVwb3J0IDAwMDA6MDA6MDEuMDogc2V0
dGluZyBsYXRlbmN5IHRpbWVyIHRvIDY0ClsgICAgNC4wNDQxNDRdIHBjaWVwb3J0IDAwMDA6MDA6
MWMuMDogc2V0dGluZyBsYXRlbmN5IHRpbWVyIHRvIDY0ClsgICAgNC4wNDQ3MTVdIHBjaWVwb3J0
IDAwMDA6MDA6MWMuNDogc2V0dGluZyBsYXRlbmN5IHRpbWVyIHRvIDY0ClsgICAgNC4wNDUyNjld
IGluaXRjYWxsIHBjaWVfcG9ydGRydl9pbml0KzB4MC8weDc3IHJldHVybmVkIDAgYWZ0ZXIgMTM5
MCB1c2VjcwpbICAgIDQuMDQ1MzY5XSBjYWxsaW5nICBhZXJfc2VydmljZV9pbml0KzB4MC8weDMx
IEAgMQpbICAgIDQuMDQ1NDczXSBpbml0Y2FsbCBhZXJfc2VydmljZV9pbml0KzB4MC8weDMxIHJl
dHVybmVkIDAgYWZ0ZXIgNCB1c2VjcwpbICAgIDQuMDQ1NTc4XSBjYWxsaW5nICBwY2llX3BtZV9z
ZXJ2aWNlX2luaXQrMHgwLzB4MTIgQCAxClsgICAgNC4wNDU3MDhdIHBjaWVwb3J0IDAwMDA6MDA6
MDEuMDogU2lnbmFsaW5nIFBNRSB0aHJvdWdoIFBDSWUgUE1FIGludGVycnVwdApbICAgIDQuMDQ1
ODEyXSBwY2kgMDAwMDowMTowMC4wOiBTaWduYWxpbmcgUE1FIHRocm91Z2ggUENJZSBQTUUgaW50
ZXJydXB0ClsgICAgNC4wNDU5MTddIHBjaWVfcG1lIDAwMDA6MDA6MDEuMDpwY2llMDE6IHNlcnZp
Y2UgZHJpdmVyIHBjaWVfcG1lIGxvYWRlZApbICAgIDQuMDQ2MDc4XSBwY2llcG9ydCAwMDAwOjAw
OjFjLjA6IFNpZ25hbGluZyBQTUUgdGhyb3VnaCBQQ0llIFBNRSBpbnRlcnJ1cHQKWyAgICA0LjA0
NjE5M10gcGNpZV9wbWUgMDAwMDowMDoxYy4wOnBjaWUwMTogc2VydmljZSBkcml2ZXIgcGNpZV9w
bWUgbG9hZGVkClsgICAgNC4wNDYzNTldIHBjaWVwb3J0IDAwMDA6MDA6MWMuNDogU2lnbmFsaW5n
IFBNRSB0aHJvdWdoIFBDSWUgUE1FIGludGVycnVwdApbICAgIDQuMDQ2NDY1XSBwY2kgMDAwMDow
MzowMC4wOiBTaWduYWxpbmcgUE1FIHRocm91Z2ggUENJZSBQTUUgaW50ZXJydXB0ClsgICAgNC4w
NDY1ODBdIHBjaWVfcG1lIDAwMDA6MDA6MWMuNDpwY2llMDE6IHNlcnZpY2UgZHJpdmVyIHBjaWVf
cG1lIGxvYWRlZApbICAgIDQuMDQ2Njg2XSBpbml0Y2FsbCBwY2llX3BtZV9zZXJ2aWNlX2luaXQr
MHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciA5ODEgdXNlY3MKWyAgICA0LjA0NjgwOV0gY2FsbGlu
ZyAgaW9hcGljX2luaXQrMHgwLzB4MWIgQCAxClsgICAgNC4wNDY5MTVdIGluaXRjYWxsIGlvYXBp
Y19pbml0KzB4MC8weDFiIHJldHVybmVkIDAgYWZ0ZXIgNiB1c2VjcwpbICAgIDQuMDQ3MDIwXSBj
YWxsaW5nICBwY2lfaG90cGx1Z19pbml0KzB4MC8weDRiIEAgMQpbICAgIDQuMDQ3MTIxXSBwY2lf
aG90cGx1ZzogUENJIEhvdCBQbHVnIFBDSSBDb3JlIHZlcnNpb246IDAuNQpbICAgIDQuMDQ3MjI0
XSBpbml0Y2FsbCBwY2lfaG90cGx1Z19pbml0KzB4MC8weDRiIHJldHVybmVkIDAgYWZ0ZXIgOTkg
dXNlY3MKWyAgICA0LjA0NzMyOV0gY2FsbGluZyAgcGNpZWRfaW5pdCsweDAvMHhmMCBAIDEKWyAg
ICA0LjA0NzQ0NF0gcGNpZWhwOiBQQ0kgRXhwcmVzcyBIb3QgUGx1ZyBDb250cm9sbGVyIERyaXZl
ciB2ZXJzaW9uOiAwLjQKWyAgICA0LjA0NzU0OF0gaW5pdGNhbGwgcGNpZWRfaW5pdCsweDAvMHhm
MCByZXR1cm5lZCAwIGFmdGVyIDExNCB1c2VjcwpbICAgIDQuMDQ3NjUyXSBjYWxsaW5nICB0c2k3
MjFfaW5pdCsweDAvMHgxYiBAIDEKWyAgICA0LjA0Nzc1OV0gaW5pdGNhbGwgdHNpNzIxX2luaXQr
MHgwLzB4MWIgcmV0dXJuZWQgMCBhZnRlciA1IHVzZWNzClsgICAgNC4wNDc4NjRdIGNhbGxpbmcg
IGZiX2NvbnNvbGVfaW5pdCsweDAvMHgxMWUgQCAxClsgICAgNC4wNDc5NzddIGluaXRjYWxsIGZi
X2NvbnNvbGVfaW5pdCsweDAvMHgxMWUgcmV0dXJuZWQgMCBhZnRlciAxMyB1c2VjcwpbICAgIDQu
MDQ4MDg0XSBjYWxsaW5nICBpbXN0dGZiX2luaXQrMHgwLzB4NGQgQCAxClsgICAgNC4wNDgxOTBd
IGluaXRjYWxsIGltc3R0ZmJfaW5pdCsweDAvMHg0ZCByZXR1cm5lZCAwIGFmdGVyIDYgdXNlY3MK
WyAgICA0LjA0ODI5NV0gY2FsbGluZyAgYXNpbGlhbnRmYl9pbml0KzB4MC8weDM0IEAgMQpbICAg
IDQuMDQ4Mzk5XSBpbml0Y2FsbCBhc2lsaWFudGZiX2luaXQrMHgwLzB4MzQgcmV0dXJuZWQgMCBh
ZnRlciA1IHVzZWNzClsgICAgNC4wNDg1MDRdIGNhbGxpbmcgIGVmaWZiX2luaXQrMHgwLzB4OTIg
QCAxClsgICAgNC4wNDg2MDddIGluaXRjYWxsIGVmaWZiX2luaXQrMHgwLzB4OTIgcmV0dXJuZWQg
LTE5IGFmdGVyIDIgdXNlY3MKWyAgICA0LjA0ODcwOV0gY2FsbGluZyAgaW50ZWxfaWRsZV9pbml0
KzB4MC8weDZlIEAgMQpbICAgIDQuMDQ4ODA5XSBpbml0Y2FsbCBpbnRlbF9pZGxlX2luaXQrMHgw
LzB4NmUgcmV0dXJuZWQgLTE5IGFmdGVyIDAgdXNlY3MKWyAgICA0LjA0ODkxNF0gY2FsbGluZyAg
YWNwaV9yZXNlcnZlX3Jlc291cmNlcysweDAvMHhlYiBAIDEKWyAgICA0LjA0OTAxOV0gaW5pdGNh
bGwgYWNwaV9yZXNlcnZlX3Jlc291cmNlcysweDAvMHhlYiByZXR1cm5lZCAwIGFmdGVyIDIgdXNl
Y3MKWyAgICA0LjA0OTEyNl0gY2FsbGluZyAgaXJxcm91dGVyX2luaXRfb3BzKzB4MC8weDI2IEAg
MQpbICAgIDQuMDQ5MjI4XSBpbml0Y2FsbCBpcnFyb3V0ZXJfaW5pdF9vcHMrMHgwLzB4MjYgcmV0
dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4wNDkzMzFdIGNhbGxpbmcgIGFjcGlfYWNfaW5p
dCsweDAvMHg1MCBAIDEKWyAgICA0LjA0OTQ1Nl0gaW5pdGNhbGwgYWNwaV9hY19pbml0KzB4MC8w
eDUwIHJldHVybmVkIDAgYWZ0ZXIgMjQgdXNlY3MKWyAgICA0LjA0OTU2MF0gY2FsbGluZyAgYWNw
aV9idXR0b25faW5pdCsweDAvMHgxMiBAIDEKWyAgICA0LjA0OTY5NV0gaW5wdXQ6IFBvd2VyIEJ1
dHRvbiBhcyAvZGV2aWNlcy9MTlhTWVNUTTowMC9kZXZpY2U6MDAvUE5QMEMwQzowMC9pbnB1dC9p
bnB1dDAKWyAgICA0LjA0OTgyM10gQUNQSTogUG93ZXIgQnV0dG9uIFtQV1JCXQpbICAgIDQuMDQ5
OTQ4XSBpbnB1dDogUG93ZXIgQnV0dG9uIGFzIC9kZXZpY2VzL0xOWFNZU1RNOjAwL0xOWFBXUkJO
OjAwL2lucHV0L2lucHV0MQpbICAgIDQuMDUwMDcxXSBBQ1BJOiBQb3dlciBCdXR0b24gW1BXUkZd
ClsgICAgNC4wNTAxOTJdIGluaXRjYWxsIGFjcGlfYnV0dG9uX2luaXQrMHgwLzB4MTIgcmV0dXJu
ZWQgMCBhZnRlciA1MTkgdXNlY3MKWyAgICA0LjA1MDI5OF0gY2FsbGluZyAgYWNwaV9mYW5faW5p
dCsweDAvMHgxOCBAIDEKWyAgICA0LjA1MDQxMV0gaW5pdGNhbGwgYWNwaV9mYW5faW5pdCsweDAv
MHgxOCByZXR1cm5lZCAwIGFmdGVyIDExIHVzZWNzClsgICAgNC4wNTA1MTZdIGNhbGxpbmcgIGFj
cGlfcHJvY2Vzc29yX2luaXQrMHgwLzB4ODEgQCAxClsgICAgNC4wNTA4OTVdIGluaXRjYWxsIGFj
cGlfcHJvY2Vzc29yX2luaXQrMHgwLzB4ODEgcmV0dXJuZWQgMCBhZnRlciAyNjcgdXNlY3MKWyAg
ICA0LjA1MDk5OV0gY2FsbGluZyAgYWNwaV9jb250YWluZXJfaW5pdCsweDAvMHg0YSBAIDEKWyAg
ICA0LjA1MjI2N10gaW5pdGNhbGwgYWNwaV9jb250YWluZXJfaW5pdCsweDAvMHg0YSByZXR1cm5l
ZCAwIGFmdGVyIDExMzUgdXNlY3MKWyAgICA0LjA1MjM3M10gY2FsbGluZyAgYWNwaV90aGVybWFs
X2luaXQrMHgwLzB4NDIgQCAxClsgICAgNC4wNTI0ODZdIGluaXRjYWxsIGFjcGlfdGhlcm1hbF9p
bml0KzB4MC8weDQyIHJldHVybmVkIDAgYWZ0ZXIgMTEgdXNlY3MKWyAgICA0LjA1MjU5Ml0gY2Fs
bGluZyAgYWNwaV9iYXR0ZXJ5X2luaXQrMHgwLzB4NDggQCAxClsgICAgNC4wNTI3MDldIGluaXRj
YWxsIGFjcGlfYmF0dGVyeV9pbml0KzB4MC8weDQ4IHJldHVybmVkIDAgYWZ0ZXIgMTIgdXNlY3MK
WyAgICA0LjA1MjgxNF0gY2FsbGluZyAgYWNwaV9oZWRfaW5pdCsweDAvMHgyNiBAIDEKWyAgICA0
LjA1MjkyM10gaW5pdGNhbGwgYWNwaV9oZWRfaW5pdCsweDAvMHgyNiByZXR1cm5lZCAwIGFmdGVy
IDEwIHVzZWNzClsgICAgNC4wNTMwMzJdIGNhbGxpbmcgIGVyc3RfaW5pdCsweDAvMHgyYTUgQCAx
ClsgICAgNC4wNTMxNzJdIEFQRUk6IENhbiBub3QgcmVxdWVzdCBpb21lbSByZWdpb24gPDAwMDAw
MDAwYmY0ODkwM2UtMDAwMDAwMDBiZjQ4OTAzZj4gZm9yIEdBUnMuClsgICAgNC4wNTMyOTddIGlu
aXRjYWxsIGVyc3RfaW5pdCsweDAvMHgyYTUgcmV0dXJuZWQgLTIyIGFmdGVyIDE2NCB1c2Vjcwpb
ICAgIDQuMDUzNDAxXSBpbml0Y2FsbCBlcnN0X2luaXQrMHgwLzB4MmE1IHJldHVybmVkIHdpdGgg
ZXJyb3IgY29kZSAtMjIgClsgICAgNC4wNTM1MDVdIGNhbGxpbmcgIGdoZXNfaW5pdCsweDAvMHgx
NzEgQCAxClsgICAgNC4wNTM2NjRdIFtGaXJtd2FyZSBXYXJuXTogR0hFUzogUG9sbCBpbnRlcnZh
bCBpcyAwIGZvciBnZW5lcmljIGhhcmR3YXJlIGVycm9yIHNvdXJjZTogMSwgZGlzYWJsZWQuClsg
ICAgNC4wNTM4NDFdIEdIRVM6IEFQRUkgZmlybXdhcmUgZmlyc3QgbW9kZSBpcyBlbmFibGVkIGJ5
IFdIRUEgX09TQy4KWyAgICA0LjA1Mzk0Nl0gaW5pdGNhbGwgZ2hlc19pbml0KzB4MC8weDE3MSBy
ZXR1cm5lZCAwIGFmdGVyIDMzMiB1c2VjcwpbICAgIDQuMDU0MDQ4XSBjYWxsaW5nICB2aXJ0aW9f
cGNpX2luaXQrMHgwLzB4MWIgQCAxClsgICAgNC4wNTQxNThdIGluaXRjYWxsIHZpcnRpb19wY2lf
aW5pdCsweDAvMHgxYiByZXR1cm5lZCAwIGFmdGVyIDggdXNlY3MKWyAgICA0LjA1NDI2M10gY2Fs
bGluZyAgeGVuYnVzX3Byb2JlX2luaXRjYWxsKzB4MC8weDM5IEAgMQpbICAgIDQuMDU0MzY3XSBp
bml0Y2FsbCB4ZW5idXNfcHJvYmVfaW5pdGNhbGwrMHgwLzB4MzkgcmV0dXJuZWQgMCBhZnRlciAw
IHVzZWNzClsgICAgNC4wNTQ0NzNdIGNhbGxpbmcgIGh5cGVydmlzb3Jfc3Vic3lzX2luaXQrMHgw
LzB4MjUgQCAxClsgICAgNC4wNTQ1NzVdIGluaXRjYWxsIGh5cGVydmlzb3Jfc3Vic3lzX2luaXQr
MHgwLzB4MjUgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4wNTQ2ODJdIGNhbGxpbmcg
IGh5cGVyX3N5c2ZzX2luaXQrMHgwLzB4MTkgQCAxClsgICAgNC4wNTQ3OTFdIGluaXRjYWxsIGh5
cGVyX3N5c2ZzX2luaXQrMHgwLzB4MTkgcmV0dXJuZWQgMCBhZnRlciA3IHVzZWNzClsgICAgNC4w
NTQ4OTddIGNhbGxpbmcgIHBsYXRmb3JtX3BjaV9tb2R1bGVfaW5pdCsweDAvMHgyOSBAIDEKWyAg
ICA0LjA1NTAwMF0gaW5pdGNhbGwgcGxhdGZvcm1fcGNpX21vZHVsZV9pbml0KzB4MC8weDI5IHJl
dHVybmVkIC0xOSBhZnRlciAwIHVzZWNzClsgICAgNC4wNTUxMjZdIGNhbGxpbmcgIHhlbl90bWVt
X2luaXQrMHgwLzB4NWMgQCAxClsgICAgNC4wNTUyMjddIGluaXRjYWxsIHhlbl90bWVtX2luaXQr
MHgwLzB4NWMgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4wNTUzMjhdIGNhbGxpbmcg
IHB0eV9pbml0KzB4MC8weDEyIEAgMQpbICAgIDQuMDU1NDY5XSBpbml0Y2FsbCBwdHlfaW5pdCsw
eDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDM5IHVzZWNzClsgICAgNC4wNTU1NzRdIGNhbGxpbmcg
IHN5c3JxX2luaXQrMHgwLzB4NzggQCAxClsgICAgNC4wNTU2NzZdIGluaXRjYWxsIHN5c3JxX2lu
aXQrMHgwLzB4NzggcmV0dXJuZWQgMCBhZnRlciAyIHVzZWNzClsgICAgNC4wNTU3ODJdIGNhbGxp
bmcgIHhlbl9odmNfaW5pdCsweDAvMHgxM2UgQCAxClsgICAgNC4wNTYxMDRdIGluaXRjYWxsIHhl
bl9odmNfaW5pdCsweDAvMHgxM2UgcmV0dXJuZWQgMCBhZnRlciAyMTcgdXNlY3MKWyAgICA0LjA1
NjIxMF0gY2FsbGluZyAgc2VyaWFsODI1MF9pbml0KzB4MC8weDY1IEAgMQpbICAgIDQuMDU2MzEw
XSBTZXJpYWw6IDgyNTAvMTY1NTAgZHJpdmVyLCAzMiBwb3J0cywgSVJRIHNoYXJpbmcgZW5hYmxl
ZApbICAgIDQuMDc3NTY3XSBzZXJpYWw4MjUwOiB0dHlTMCBhdCBJL08gMHgzZjggKGlycSA9IDQp
IGlzIGEgMTY1NTBBClsgICAgNC4xMTQzMjRdIHNlcmlhbDgyNTA6IHR0eVMxIGF0IEkvTyAweDJm
OCAoaXJxID0gMykgaXMgYSAxNjU1MEEKWyAgICA0LjE0MjM1Ml0gc2VyaWFsODI1MDogdHR5UzIg
YXQgSS9PIDB4M2U4IChpcnEgPSA0KSBpcyBhIDE2NTUwQQpbICAgIDQuMTQ0MzA4XSBpbml0Y2Fs
bCBzZXJpYWw4MjUwX2luaXQrMHgwLzB4NjUgcmV0dXJuZWQgMCBhZnRlciA4NTkzNCB1c2Vjcwpb
ICAgIDQuMTQ0NDE0XSBjYWxsaW5nICBzZXJpYWw4MjUwX3BucF9pbml0KzB4MC8weDEyIEAgMQpb
ICAgIDQuMTY1NzIzXSAwMDowYTogdHR5UzAgYXQgSS9PIDB4M2Y4IChpcnEgPSA0KSBpcyBhIDE2
NTUwQQpbICAgIDQuMjAyMzY5XSAwMDowYjogdHR5UzEgYXQgSS9PIDB4MmY4IChpcnEgPSAzKSBp
cyBhIDE2NTUwQQpbICAgIDQuMjM0MzY0XSAwMDowZDogdHR5UzIgYXQgSS9PIDB4M2U4IChpcnEg
PSAxMCkgaXMgYSAxNjU1MEEKWyAgICA0LjI0OTE2OF0gaW5pdGNhbGwgc2VyaWFsODI1MF9wbnBf
aW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDEwMjE5NyB1c2VjcwpbICAgIDQuMjQ5MzE1
XSBjYWxsaW5nICBzZXJpYWw4MjUwX3BjaV9pbml0KzB4MC8weDFiIEAgMQpbICAgIDQuMjQ5NDMz
XSBpbml0Y2FsbCBzZXJpYWw4MjUwX3BjaV9pbml0KzB4MC8weDFiIHJldHVybmVkIDAgYWZ0ZXIg
MTUgdXNlY3MKWyAgICA0LjI0OTU0MV0gY2FsbGluZyAgaW5pdF9rZ2Rib2MrMHgwLzB4MTYgQCAx
ClsgICAgNC4yNDk2NDBdIGluaXRjYWxsIGluaXRfa2dkYm9jKzB4MC8weDE2IHJldHVybmVkIDAg
YWZ0ZXIgMSB1c2VjcwpbICAgIDQuMjQ5NzQ0XSBjYWxsaW5nICByYW5kX2luaXRpYWxpemUrMHgw
LzB4NDAgQCAxClsgICAgNC4yNDk4NTVdIGluaXRjYWxsIHJhbmRfaW5pdGlhbGl6ZSsweDAvMHg0
MCByZXR1cm5lZCAwIGFmdGVyIDkgdXNlY3MKWyAgICA0LjI0OTk1OF0gY2FsbGluZyAgdHR5cHJp
bnRrX2luaXQrMHgwLzB4MTUzIEAgMQpbICAgIDQuMjUwMDg4XSBpbml0Y2FsbCB0dHlwcmludGtf
aW5pdCsweDAvMHgxNTMgcmV0dXJuZWQgMCBhZnRlciAyNyB1c2VjcwpbICAgIDQuMjUwMTkyXSBj
YWxsaW5nICBocGV0X2luaXQrMHgwLzB4NjcgQCAxClsgICAgNC4yNTAzNjldIGhwZXRfYWNwaV9h
ZGQ6IG5vIGFkZHJlc3Mgb3IgaXJxcyBpbiBfQ1JTClsgICAgNC4yNTA0NzldIGluaXRjYWxsIGhw
ZXRfaW5pdCsweDAvMHg2NyByZXR1cm5lZCAwIGFmdGVyIDE4MiB1c2VjcwpbICAgIDQuMjUwNTgy
XSBjYWxsaW5nICBhZ3BfaW5pdCsweDAvMHgyNiBAIDEKWyAgICA0LjI1MDY4Ml0gTGludXggYWdw
Z2FydCBpbnRlcmZhY2UgdjAuMTAzClsgICAgNC4yNTA3ODNdIGluaXRjYWxsIGFncF9pbml0KzB4
MC8weDI2IHJldHVybmVkIDAgYWZ0ZXIgOTggdXNlY3MKWyAgICA0LjI1MDg4N10gY2FsbGluZyAg
YWdwX2FtZDY0X21vZF9pbml0KzB4MC8weDIyIEAgMQpbICAgIDQuMjUxMDAwXSBpbml0Y2FsbCBh
Z3BfYW1kNjRfbW9kX2luaXQrMHgwLzB4MjIgcmV0dXJuZWQgLTE5IGFmdGVyIDEzIHVzZWNzClsg
ICAgNC4yNTExMDVdIGNhbGxpbmcgIGFncF9pbnRlbF9pbml0KzB4MC8weDI5IEAgMQpbICAgIDQu
MjUxMjcxXSBpbml0Y2FsbCBhZ3BfaW50ZWxfaW5pdCsweDAvMHgyOSByZXR1cm5lZCAwIGFmdGVy
IDYzIHVzZWNzClsgICAgNC4yNTEzNzVdIGNhbGxpbmcgIGFncF92aWFfaW5pdCsweDAvMHgyOSBA
IDEKWyAgICA0LjI1MTQ4MV0gaW5pdGNhbGwgYWdwX3ZpYV9pbml0KzB4MC8weDI5IHJldHVybmVk
IDAgYWZ0ZXIgNiB1c2VjcwpbICAgIDQuMjUxNTg0XSBjYWxsaW5nICBjbl9wcm9jX2luaXQrMHgw
LzB4M2EgQCAxClsgICAgNC4yNTE2ODZdIGluaXRjYWxsIGNuX3Byb2NfaW5pdCsweDAvMHgzYSBy
ZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICA0LjI1MTc5MF0gY2FsbGluZyAgdG9wb2xvZ3lf
c3lzZnNfaW5pdCsweDAvMHg2NyBAIDEKWyAgICA0LjI1MTkwMV0gaW5pdGNhbGwgdG9wb2xvZ3lf
c3lzZnNfaW5pdCsweDAvMHg2NyByZXR1cm5lZCAwIGFmdGVyIDcgdXNlY3MKWyAgICA0LjI1MjAw
NV0gY2FsbGluZyAgYnJkX2luaXQrMHgwLzB4MWQwIEAgMQpbICAgIDQuMjUzMDc2XSBicmQ6IG1v
ZHVsZSBsb2FkZWQKWyAgICA0LjI1MzE3NV0gaW5pdGNhbGwgYnJkX2luaXQrMHgwLzB4MWQwIHJl
dHVybmVkIDAgYWZ0ZXIgMTA0NSB1c2VjcwpbICAgIDQuMjUzMjgyXSBjYWxsaW5nICBsb29wX2lu
aXQrMHgwLzB4MTJmIEAgMQpbICAgIDQuMjUzOTEwXSBsb29wOiBtb2R1bGUgbG9hZGVkClsgICAg
NC4yNTQwMTFdIGluaXRjYWxsIGxvb3BfaW5pdCsweDAvMHgxMmYgcmV0dXJuZWQgMCBhZnRlciA2
MTMgdXNlY3MKWyAgICA0LjI1NDExNV0gY2FsbGluZyAgaW5pdCsweDAvMHg3YyBAIDEKWyAgICA0
LjI1NDI2MF0gaW5pdGNhbGwgaW5pdCsweDAvMHg3YyByZXR1cm5lZCAwIGFmdGVyIDQ1IHVzZWNz
ClsgICAgNC4yNTQzNjVdIGNhbGxpbmcgIHhsYmxrX2luaXQrMHgwLzB4OTMgQCAxClsgICAgNC4y
NTQ0NzBdIGluaXRjYWxsIHhsYmxrX2luaXQrMHgwLzB4OTMgcmV0dXJuZWQgMCBhZnRlciA0IHVz
ZWNzClsgICAgNC4yNTQ1NzJdIGNhbGxpbmcgIGh0Y3BsZF9jb3JlX2luaXQrMHgwLzB4MmIgQCAx
ClsgICAgNC4yNTQ2ODZdIGluaXRjYWxsIGh0Y3BsZF9jb3JlX2luaXQrMHgwLzB4MmIgcmV0dXJu
ZWQgLTE5IGFmdGVyIDEzIHVzZWNzClsgICAgNC4yNTQ3OTFdIGNhbGxpbmcgIHdtODk5NF9pMmNf
aW5pdCsweDAvMHgzMCBAIDEKWyAgICA0LjI1NDg5N10gaW5pdGNhbGwgd204OTk0X2kyY19pbml0
KzB4MC8weDMwIHJldHVybmVkIDAgYWZ0ZXIgMyB1c2VjcwpbICAgIDQuMjU1MDAyXSBjYWxsaW5n
ICBhZHA1NTIwX2luaXQrMHgwLzB4MTQgQCAxClsgICAgNC4yNTUxMDldIGluaXRjYWxsIGFkcDU1
MjBfaW5pdCsweDAvMHgxNCByZXR1cm5lZCAwIGFmdGVyIDQgdXNlY3MKWyAgICA0LjI1NTIxM10g
Y2FsbGluZyAgc3BpX3RyYW5zcG9ydF9pbml0KzB4MC8weDdjIEAgMQpbICAgIDQuMjU1MzIwXSBp
bml0Y2FsbCBzcGlfdHJhbnNwb3J0X2luaXQrMHgwLzB4N2MgcmV0dXJuZWQgMCBhZnRlciA2IHVz
ZWNzClsgICAgNC4yNTU0MjVdIGNhbGxpbmcgIHNjc2lfZGhfaW5pdCsweDAvMHg1MyBAIDEKWyAg
ICA0LjI1NTUyNl0gaW5pdGNhbGwgc2NzaV9kaF9pbml0KzB4MC8weDUzIHJldHVybmVkIDAgYWZ0
ZXIgMCB1c2VjcwpbICAgIDQuMjU1NjMxXSBjYWxsaW5nICBzeW0yX2luaXQrMHgwLzB4NTUgQCAx
ClsgICAgNC4yNTU3MzhdIGluaXRjYWxsIHN5bTJfaW5pdCsweDAvMHg1NSByZXR1cm5lZCAwIGFm
dGVyIDggdXNlY3MKWyAgICA0LjI1NTg0Ml0gY2FsbGluZyAgaW5pdF9zZCsweDAvMHgxMzEgQCAx
ClsgICAgNC4yNTU5NTNdIGluaXRjYWxsIGluaXRfc2QrMHgwLzB4MTMxIHJldHVybmVkIDAgYWZ0
ZXIgMTAgdXNlY3MKWyAgICA0LjI1NjA1N10gY2FsbGluZyAgaW5pdF9zcisweDAvMHg0NiBAIDEK
WyAgICA0LjI1NjE2MV0gaW5pdGNhbGwgaW5pdF9zcisweDAvMHg0NiByZXR1cm5lZCAwIGFmdGVy
IDMgdXNlY3MKWyAgICA0LjI1NjI2NF0gY2FsbGluZyAgaW5pdF9zZysweDAvMHg2MyBAIDEKWyAg
ICA0LjI1NjM3M10gaW5pdGNhbGwgaW5pdF9zZysweDAvMHg2MyByZXR1cm5lZCAwIGFmdGVyIDkg
dXNlY3MKWyAgICA0LjI1NjQ3NV0gY2FsbGluZyAgYWhjaV9pbml0KzB4MC8weDFiIEAgMQpbICAg
IDQuMjU2NTgyXSBhaGNpIDAwMDA6MDA6MWYuMjogdmVyc2lvbiAzLjAKWyAgICA0LjI1NjY5N10g
eGVuOiByZWdpc3RlcmluZyBnc2kgMTkgdHJpZ2dlcmluZyAwIHBvbGFyaXR5IDEKWyAgICA0LjI1
NjgwNV0geGVuOiAtLT4gcGlycT0xOSAtPiBpcnE9MTkgKGdzaT0xOSkKWyAgICA0LjI1NjkzNF0g
YWhjaSAwMDAwOjAwOjFmLjI6IFBDSSBJTlQgQiAtPiBHU0kgMTkgKGxldmVsLCBsb3cpIC0+IElS
USAxOQpbICAgIDQuMjU3MTg1XSBhaGNpIDAwMDA6MDA6MWYuMjogY29udHJvbGxlciBjYW4ndCBk
byBTTlRGLCB0dXJuaW5nIG9mZiBDQVBfU05URgpbICAgIDQuMjczMTk0XSBhaGNpIDAwMDA6MDA6
MWYuMjogQUhDSSAwMDAxLjAzMDAgMzIgc2xvdHMgNiBwb3J0cyA2IEdicHMgMHgzZiBpbXBsIFJB
SUQgbW9kZQpbICAgIDQuMjczMzM5XSBhaGNpIDAwMDA6MDA6MWYuMjogZmxhZ3M6IDY0Yml0IG5j
cSBwbSBsZWQgY2xvIHBpbyBzbHVtIHBhcnQgZW1zIGFwc3QgClsgICAgNC4yNzM0NzNdIGFoY2kg
MDAwMDowMDoxZi4yOiBzZXR0aW5nIGxhdGVuY3kgdGltZXIgdG8gNjQKWyAgICA0LjMxMzUzOF0g
c2NzaTAgOiBhaGNpClsgICAgNC4zMTM3MDRdIHNjc2kxIDogYWhjaQpbICAgIDQuMzEzODYwXSBz
Y3NpMiA6IGFoY2kKWyAgICA0LjMxNDAxN10gc2NzaTMgOiBhaGNpClsgICAgNC4zMTQxNzBdIHNj
c2k0IDogYWhjaQpbICAgIDQuMzE0MzI1XSBzY3NpNSA6IGFoY2kKWyAgICA0LjMxNDU1MF0gYXRh
MTogU0FUQSBtYXggVURNQS8xMzMgYWJhciBtMjA0OEAweGZiYjIxMDAwIHBvcnQgMHhmYmIyMTEw
MCBpcnEgMjg5ClsgICAgNC4zMTQ2NzhdIGF0YTI6IFNBVEEgbWF4IFVETUEvMTMzIGFiYXIgbTIw
NDhAMHhmYmIyMTAwMCBwb3J0IDB4ZmJiMjExODAgaXJxIDI4OQpbICAgIDQuMzE0ODA1XSBhdGEz
OiBTQVRBIG1heCBVRE1BLzEzMyBhYmFyIG0yMDQ4QDB4ZmJiMjEwMDAgcG9ydCAweGZiYjIxMjAw
IGlycSAyODkKWyAgICA0LjMxNDkzMl0gYXRhNDogU0FUQSBtYXggVURNQS8xMzMgYWJhciBtMjA0
OEAweGZiYjIxMDAwIHBvcnQgMHhmYmIyMTI4MCBpcnEgMjg5ClsgICAgNC4zMTUwNTldIGF0YTU6
IFNBVEEgbWF4IFVETUEvMTMzIGFiYXIgbTIwNDhAMHhmYmIyMTAwMCBwb3J0IDB4ZmJiMjEzMDAg
aXJxIDI4OQpbICAgIDQuMzE1MTg4XSBhdGE2OiBTQVRBIG1heCBVRE1BLzEzMyBhYmFyIG0yMDQ4
QDB4ZmJiMjEwMDAgcG9ydCAweGZiYjIxMzgwIGlycSAyODkKWyAgICA0LjMxNTMyNF0gY2FsbGlu
ZyAgMl9hc3luY19wb3J0X3Byb2JlKzB4MC8weDcwIEAgNQpbICAgIDQuMzE1MzI5XSBpbml0Y2Fs
bCBhaGNpX2luaXQrMHgwLzB4MWIgcmV0dXJuZWQgMCBhZnRlciA1NzM3NiB1c2VjcwpbICAgIDQu
MzE1MzMxXSBjYWxsaW5nICBhZG1hX2F0YV9pbml0KzB4MC8weDFiIEAgMQpbICAgIDQuMzE1MzQy
XSBpbml0Y2FsbCBhZG1hX2F0YV9pbml0KzB4MC8weDFiIHJldHVybmVkIDAgYWZ0ZXIgOCB1c2Vj
cwpbICAgIDQuMzE1MzQ0XSBjYWxsaW5nICBwaWl4X2luaXQrMHgwLzB4MjkgQCAxClsgICAgNC4z
MTUzNTRdIGluaXRjYWxsIHBpaXhfaW5pdCsweDAvMHgyOSByZXR1cm5lZCAwIGFmdGVyIDggdXNl
Y3MKWyAgICA0LjMxNTM1Nl0gY2FsbGluZyAgc2lzX2luaXQrMHgwLzB4MWIgQCAxClsgICAgNC4z
MTUzNjVdIGluaXRjYWxsIHNpc19pbml0KzB4MC8weDFiIHJldHVybmVkIDAgYWZ0ZXIgNiB1c2Vj
cwpbICAgIDQuMzE1MzY2XSBjYWxsaW5nICBwYWNwaV9pbml0KzB4MC8weDFiIEAgMQpbICAgIDQu
MzE1Mzc2XSBpbml0Y2FsbCBwYWNwaV9pbml0KzB4MC8weDFiIHJldHVybmVkIDAgYWZ0ZXIgNyB1
c2VjcwpbICAgIDQuMzE1Mzc4XSBjYWxsaW5nICBhdGFfZ2VuZXJpY19pbml0KzB4MC8weDFiIEAg
MQpbICAgIDQuMzE1Mzg4XSBpbml0Y2FsbCBhdGFfZ2VuZXJpY19pbml0KzB4MC8weDFiIHJldHVy
bmVkIDAgYWZ0ZXIgNyB1c2VjcwpbICAgIDQuMzE1MzkwXSBjYWxsaW5nICBuZXRfb2xkZGV2c19p
bml0KzB4MC8weDFjIEAgMQpbICAgIDQuMzE1Mzk0XSBpbml0Y2FsbCBuZXRfb2xkZGV2c19pbml0
KzB4MC8weDFjIHJldHVybmVkIDAgYWZ0ZXIgMiB1c2VjcwpbICAgIDQuMzE1Mzk2XSBjYWxsaW5n
ICBtYXJ2ZWxsX2luaXQrMHgwLzB4NjQgQCAxClsgICAgNC4zMTU0MjddIGluaXRjYWxsIG1hcnZl
bGxfaW5pdCsweDAvMHg2NCByZXR1cm5lZCAwIGFmdGVyIDI4IHVzZWNzClsgICAgNC4zMTU0Mjld
IGNhbGxpbmcgIGRhdmljb21faW5pdCsweDAvMHg1ZSBAIDEKWyAgICA0LjMxNTQ0MV0gaW5pdGNh
bGwgZGF2aWNvbV9pbml0KzB4MC8weDVlIHJldHVybmVkIDAgYWZ0ZXIgMTAgdXNlY3MKWyAgICA0
LjMxNTQ0M10gY2FsbGluZyAgY2ljYWRhX2luaXQrMHgwLzB4M2MgQCAxClsgICAgNC4zMTU0NTNd
IGluaXRjYWxsIGNpY2FkYV9pbml0KzB4MC8weDNjIHJldHVybmVkIDAgYWZ0ZXIgNyB1c2Vjcwpb
ICAgIDQuMzE1NDU0XSBjYWxsaW5nICBseHRfaW5pdCsweDAvMHg1ZSBAIDEKWyAgICA0LjMxNTQ2
NV0gaW5pdGNhbGwgbHh0X2luaXQrMHgwLzB4NWUgcmV0dXJuZWQgMCBhZnRlciA4IHVzZWNzClsg
ICAgNC4zMTU0NjddIGNhbGxpbmcgIHFzNjYxMl9pbml0KzB4MC8weDEyIEAgMQpbICAgIDQuMzE1
NDcyXSBpbml0Y2FsbCBxczY2MTJfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDIgdXNl
Y3MKWyAgICA0LjMxNTQ3M10gY2FsbGluZyAgc21zY19pbml0KzB4MC8weGE2IEAgMQpbICAgIDQu
MzE1NDkzXSBpbml0Y2FsbCBzbXNjX2luaXQrMHgwLzB4YTYgcmV0dXJuZWQgMCBhZnRlciAxNyB1
c2VjcwpbICAgIDQuMzE1NDk1XSBjYWxsaW5nICB2c2M4Mnh4X2luaXQrMHgwLzB4M2MgQCAxClsg
ICAgNC4zMTU1MDNdIGluaXRjYWxsIHZzYzgyeHhfaW5pdCsweDAvMHgzYyByZXR1cm5lZCAwIGFm
dGVyIDYgdXNlY3MKWyAgICA0LjMxNTUwNV0gY2FsbGluZyAgYnJvYWRjb21faW5pdCsweDAvMHgx
OGUgQCAxClsgICAgNC4zMTU1NDZdIGluaXRjYWxsIGJyb2FkY29tX2luaXQrMHgwLzB4MThlIHJl
dHVybmVkIDAgYWZ0ZXIgMzggdXNlY3MKWyAgICA0LjMxNTU0OF0gY2FsbGluZyAgaWNwbHVzX2lu
aXQrMHgwLzB4M2YgQCAxClsgICAgNC4zMTU1NjFdIGluaXRjYWxsIGljcGx1c19pbml0KzB4MC8w
eDNmIHJldHVybmVkIDAgYWZ0ZXIgMTEgdXNlY3MKWyAgICA0LjMxNTU2M10gY2FsbGluZyAgcmVh
bHRla19pbml0KzB4MC8weDEyIEAgMQpbICAgIDQuMzE1NTcwXSBpbml0Y2FsbCByZWFsdGVrX2lu
aXQrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciA0IHVzZWNzClsgICAgNC4zMTU1NzJdIGNhbGxp
bmcgIGV0MTAxMWNfaW5pdCsweDAvMHgxMiBAIDEKWyAgICA0LjMxNTU3N10gaW5pdGNhbGwgZXQx
MDExY19pbml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMyB1c2VjcwpbICAgIDQuMzE1NTc5
XSBjYWxsaW5nICBmaXhlZF9tZGlvX2J1c19pbml0KzB4MC8weDEyNyBAIDEKWyAgICA0LjMxNTYw
Ml0gRml4ZWQgTURJTyBCdXM6IHByb2JlZApbICAgIDQuMzE1NjA0XSBpbml0Y2FsbCBmaXhlZF9t
ZGlvX2J1c19pbml0KzB4MC8weDEyNyByZXR1cm5lZCAwIGFmdGVyIDIyIHVzZWNzClsgICAgNC4z
MTU2MDZdIGNhbGxpbmcgIG5zX2luaXQrMHgwLzB4MTIgQCAxClsgICAgNC4zMTU2MTJdIGluaXRj
YWxsIG5zX2luaXQrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAzIHVzZWNzClsgICAgNC4zMTU2
MTNdIGNhbGxpbmcgIHN0ZTEwWHBfaW5pdCsweDAvMHgyMiBAIDEKWyAgICA0LjMxNTYyNV0gaW5p
dGNhbGwgc3RlMTBYcF9pbml0KzB4MC8weDIyIHJldHVybmVkIDAgYWZ0ZXIgOSB1c2VjcwpbICAg
IDQuMzE1NjI3XSBjYWxsaW5nICB0dW5faW5pdCsweDAvMHg5MCBAIDEKWyAgICA0LjMxNTYyOF0g
dHVuOiBVbml2ZXJzYWwgVFVOL1RBUCBkZXZpY2UgZHJpdmVyLCAxLjYKWyAgICA0LjMxNTYyOV0g
dHVuOiAoQykgMTk5OS0yMDA0IE1heCBLcmFzbnlhbnNreSA8bWF4a0BxdWFsY29tbS5jb20+Clsg
ICAgNC4zMTU2NThdIGluaXRjYWxsIHR1bl9pbml0KzB4MC8weDkwIHJldHVybmVkIDAgYWZ0ZXIg
MjggdXNlY3MKWyAgICA0LjMxNTY2MF0gY2FsbGluZyAgaW5pdCsweDAvMHgxMiBAIDEKWyAgICA0
LjMxNTY2NV0gaW5pdGNhbGwgaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDMgdXNlY3MK
WyAgICA0LjMxNTY2N10gY2FsbGluZyAgcHBwX2luaXQrMHgwLzB4ZTEgQCAxClsgICAgNC4zMTU2
NjhdIFBQUCBnZW5lcmljIGRyaXZlciB2ZXJzaW9uIDIuNC4yClsgICAgNC4zMTU2OTVdIGluaXRj
YWxsIHBwcF9pbml0KzB4MC8weGUxIHJldHVybmVkIDAgYWZ0ZXIgMjUgdXNlY3MKWyAgICA0LjMx
NTY5N10gY2FsbGluZyAgbmV0aWZfaW5pdCsweDAvMHg2NiBAIDEKWyAgICA0LjMxNTY5OV0gaW5p
dGNhbGwgbmV0aWZfaW5pdCsweDAvMHg2NiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICA0
LjMxNTcwMV0gY2FsbGluZyAgY2Ryb21faW5pdCsweDAvMHgxNiBAIDEKWyAgICA0LjMxNTcxM10g
aW5pdGNhbGwgY2Ryb21faW5pdCsweDAvMHgxNiByZXR1cm5lZCAwIGFmdGVyIDkgdXNlY3MKWyAg
ICA0LjMxNTcxNV0gY2FsbGluZyAgbW9uX2luaXQrMHgwLzB4MTAwIEAgMQpbICAgIDQuMzE1NzQx
XSBpbml0Y2FsbCBtb25faW5pdCsweDAvMHgxMDAgcmV0dXJuZWQgMCBhZnRlciAyMyB1c2Vjcwpb
ICAgIDQuMzE1NzQ0XSBjYWxsaW5nICBlaGNpX2hjZF9pbml0KzB4MC8weDFkIEAgMQpbICAgIDQu
MzE1NzQ1XSBlaGNpX2hjZDogVVNCIDIuMCAnRW5oYW5jZWQnIEhvc3QgQ29udHJvbGxlciAoRUhD
SSkgRHJpdmVyClsgICAgNC4zMTU3NjFdIHhlbjogcmVnaXN0ZXJpbmcgZ3NpIDE2IHRyaWdnZXJp
bmcgMCBwb2xhcml0eSAxClsgICAgNC4zMTU3NjNdIHhlbl9tYXBfcGlycV9nc2k6IHJldHVybmlu
ZyBpcnEgMTYgZm9yIGdzaSAxNgpbICAgIDQuMzE1NzY0XSB4ZW46IC0tPiBwaXJxPTE2IC0+IGly
cT0xNiAoZ3NpPTE2KQpbICAgIDQuMzE1NzY1XSBBbHJlYWR5IHNldHVwIHRoZSBHU0kgOjE2Clsg
ICAgNC4zMTU3NjddIGVoY2lfaGNkIDAwMDA6MDA6MWEuMDogUENJIElOVCBBIC0+IEdTSSAxNiAo
bGV2ZWwsIGxvdykgLT4gSVJRIDE2ClsgICAgNC4zMTU3ODddIGVoY2lfaGNkIDAwMDA6MDA6MWEu
MDogc2V0dGluZyBsYXRlbmN5IHRpbWVyIHRvIDY0ClsgICAgNC4zMTU3OTJdIGVoY2lfaGNkIDAw
MDA6MDA6MWEuMDogRUhDSSBIb3N0IENvbnRyb2xsZXIKWyAgICA0LjMxNTgyMV0gZWhjaV9oY2Qg
MDAwMDowMDoxYS4wOiBuZXcgVVNCIGJ1cyByZWdpc3RlcmVkLCBhc3NpZ25lZCBidXMgbnVtYmVy
IDEKWyAgICA0LjMxNTg3OF0gZWhjaV9oY2QgMDAwMDowMDoxYS4wOiBkZWJ1ZyBwb3J0IDIKWyAg
ICA0LjMxOTc4OF0gZWhjaV9oY2QgMDAwMDowMDoxYS4wOiBjYWNoZSBsaW5lIHNpemUgb2YgNjQg
aXMgbm90IHN1cHBvcnRlZApbICAgIDQuMzE5ODYxXSBlaGNpX2hjZCAwMDAwOjAwOjFhLjA6IGly
cSAxNiwgaW8gbWVtIDB4ZmJiMjMwMDAKWyAgICA0LjMyMDIwNF0gY2FsbGluZyAgM19hc3luY19w
b3J0X3Byb2JlKzB4MC8weDcwIEAgMTYKWyAgICA0LjMyMDMwM10gY2FsbGluZyAgNF9hc3luY19w
b3J0X3Byb2JlKzB4MC8weDcwIEAgNDkKWyAgICA0LjMyMDM4OV0gY2FsbGluZyAgNV9hc3luY19w
b3J0X3Byb2JlKzB4MC8weDcwIEAgNTAKWyAgICA0LjMyMDQ4OF0gY2FsbGluZyAgNl9hc3luY19w
b3J0X3Byb2JlKzB4MC8weDcwIEAgNTEKWyAgICA0LjMyMDU4NF0gY2FsbGluZyAgN19hc3luY19w
b3J0X3Byb2JlKzB4MC8weDcwIEAgNTIKWyAgICA0LjMzMzE0NV0gZWhjaV9oY2QgMDAwMDowMDox
YS4wOiBVU0IgMi4wIHN0YXJ0ZWQsIEVIQ0kgMS4wMApbICAgIDQuMzMzMzgwXSBodWIgMS0wOjEu
MDogVVNCIGh1YiBmb3VuZApbICAgIDQuMzMzNDgyXSBodWIgMS0wOjEuMDogMiBwb3J0cyBkZXRl
Y3RlZApbICAgIDQuMzMzNjQyXSB4ZW46IHJlZ2lzdGVyaW5nIGdzaSAyMyB0cmlnZ2VyaW5nIDAg
cG9sYXJpdHkgMQpbICAgIDQuMzMzNzQ1XSB4ZW5fbWFwX3BpcnFfZ3NpOiByZXR1cm5pbmcgaXJx
IDIzIGZvciBnc2kgMjMKWyAgICA0LjMzMzg0OF0geGVuOiAtLT4gcGlycT0yMyAtPiBpcnE9MjMg
KGdzaT0yMykKWyAgICA0LjMzMzk0N10gQWxyZWFkeSBzZXR1cCB0aGUgR1NJIDoyMwpbICAgIDQu
MzM0MDQ3XSBlaGNpX2hjZCAwMDAwOjAwOjFkLjA6IFBDSSBJTlQgQSAtPiBHU0kgMjMgKGxldmVs
LCBsb3cpIC0+IElSUSAyMwpbICAgIDQuMzM0MTc0XSBlaGNpX2hjZCAwMDAwOjAwOjFkLjA6IHNl
dHRpbmcgbGF0ZW5jeSB0aW1lciB0byA2NApbICAgIDQuMzM0MjgwXSBlaGNpX2hjZCAwMDAwOjAw
OjFkLjA6IEVIQ0kgSG9zdCBDb250cm9sbGVyClsgICAgNC4zMzQ0MThdIGVoY2lfaGNkIDAwMDA6
MDA6MWQuMDogbmV3IFVTQiBidXMgcmVnaXN0ZXJlZCwgYXNzaWduZWQgYnVzIG51bWJlciAyClsg
ICAgNC4zMzQ1OTVdIGVoY2lfaGNkIDAwMDA6MDA6MWQuMDogZGVidWcgcG9ydCAyClsgICAgNC4z
Mzg1ODZdIGVoY2lfaGNkIDAwMDA6MDA6MWQuMDogY2FjaGUgbGluZSBzaXplIG9mIDY0IGlzIG5v
dCBzdXBwb3J0ZWQKWyAgICA0LjMzODc1MV0gZWhjaV9oY2QgMDAwMDowMDoxZC4wOiBpcnEgMjMs
IGlvIG1lbSAweGZiYjIyMDAwClsgICAgNC4zNTMxNDhdIGVoY2lfaGNkIDAwMDA6MDA6MWQuMDog
VVNCIDIuMCBzdGFydGVkLCBFSENJIDEuMDAKWyAgICA0LjM1MzM2MV0gaHViIDItMDoxLjA6IFVT
QiBodWIgZm91bmQKWyAgICA0LjM1MzQ2MV0gaHViIDItMDoxLjA6IDIgcG9ydHMgZGV0ZWN0ZWQK
WyAgICA0LjM1NTMxNF0gaW5pdGNhbGwgZWhjaV9oY2RfaW5pdCsweDAvMHgxZCByZXR1cm5lZCAw
IGFmdGVyIDM4NjQwIHVzZWNzClsgICAgNC4zNTU0MjBdIGNhbGxpbmcgIG9oY2lfaGNkX21vZF9p
bml0KzB4MC8weDU0IEAgMQpbICAgIDQuMzU1NTIxXSBvaGNpX2hjZDogVVNCIDEuMSAnT3Blbicg
SG9zdCBDb250cm9sbGVyIChPSENJKSBEcml2ZXIKWyAgICA0LjM1NTYzM10gaW5pdGNhbGwgb2hj
aV9oY2RfbW9kX2luaXQrMHgwLzB4NTQgcmV0dXJuZWQgMCBhZnRlciAxMDggdXNlY3MKWyAgICA0
LjM1NTczOV0gY2FsbGluZyAgdWhjaV9oY2RfaW5pdCsweDAvMHgxZCBAIDEKWyAgICA0LjM1NTgz
OV0gdWhjaV9oY2Q6IFVTQiBVbml2ZXJzYWwgSG9zdCBDb250cm9sbGVyIEludGVyZmFjZSBkcml2
ZXIKWyAgICA0LjM1NTk1M10gaW5pdGNhbGwgdWhjaV9oY2RfaW5pdCsweDAvMHgxZCByZXR1cm5l
ZCAwIGFmdGVyIDExMCB1c2VjcwpbICAgIDQuMzU2MDU4XSBjYWxsaW5nICB4aGNpX2hjZF9pbml0
KzB4MC8weDI5IEAgMQpbICAgIDQuMzU2MTY4XSBpbml0Y2FsbCB4aGNpX2hjZF9pbml0KzB4MC8w
eDI5IHJldHVybmVkIDAgYWZ0ZXIgOCB1c2VjcwpbICAgIDQuMzU2MjcyXSBjYWxsaW5nICB1c2Jf
dXN1YWxfaW5pdCsweDAvMHgzYiBAIDEKWyAgICA0LjM1NjM4NF0gdXNiY29yZTogcmVnaXN0ZXJl
ZCBuZXcgaW50ZXJmYWNlIGRyaXZlciBsaWJ1c3VhbApbICAgIDQuMzU2NDg3XSBpbml0Y2FsbCB1
c2JfdXN1YWxfaW5pdCsweDAvMHgzYiByZXR1cm5lZCAwIGFmdGVyIDEwOSB1c2VjcwpbICAgIDQu
MzU2NTkzXSBjYWxsaW5nICBpODA0Ml9pbml0KzB4MC8weDgwIEAgMQpbICAgIDQuMzU2NzE2XSBp
ODA0MjogUE5QOiBQUy8yIENvbnRyb2xsZXIgW1BOUDAzMDM6UFMySyxQTlAwZjAzOlBTMk1dIGF0
IDB4NjAsMHg2NCBpcnEgMSwxMgpbICAgIDQuMzYwMTI3XSBzZXJpbzogaTgwNDIgS0JEIHBvcnQg
YXQgMHg2MCwweDY0IGlycSAxClsgICAgNC4zNjAyMjldIHNlcmlvOiBpODA0MiBBVVggcG9ydCBh
dCAweDYwLDB4NjQgaXJxIDEyClsgICAgNC4zNjAzNzFdIGluaXRjYWxsIGk4MDQyX2luaXQrMHgw
LzB4ODAgcmV0dXJuZWQgMCBhZnRlciAzNTkyIHVzZWNzClsgICAgNC4zNjA0NzddIGNhbGxpbmcg
IG1vdXNlZGV2X2luaXQrMHgwLzB4OGEgQCAxClsgICAgNC4zNjA2MzRdIG1vdXNlZGV2OiBQUy8y
IG1vdXNlIGRldmljZSBjb21tb24gZm9yIGFsbCBtaWNlClsgICAgNC4zNjA3MzldIGluaXRjYWxs
IG1vdXNlZGV2X2luaXQrMHgwLzB4OGEgcmV0dXJuZWQgMCBhZnRlciAxNjAgdXNlY3MKWyAgICA0
LjM2MDg0NF0gY2FsbGluZyAgZXZkZXZfaW5pdCsweDAvMHgxMiBAIDEKWyAgICA0LjM2MDk5OF0g
aW5pdGNhbGwgZXZkZXZfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDUwIHVzZWNzClsg
ICAgNC4zNjExMDBdIGNhbGxpbmcgIGF0a2JkX2luaXQrMHgwLzB4MjcgQCAxClsgICAgNC4zNjEy
MTZdIGluaXRjYWxsIGF0a2JkX2luaXQrMHgwLzB4MjcgcmV0dXJuZWQgMCBhZnRlciAxNCB1c2Vj
cwpbICAgIDQuMzYxMzE5XSBjYWxsaW5nICB1aW5wdXRfaW5pdCsweDAvMHgxMiBAIDEKWyAgICA0
LjM2MTQ2NV0gaW5pdGNhbGwgdWlucHV0X2luaXQrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciA0
MiB1c2VjcwpbICAgIDQuMzYxNTcwXSBjYWxsaW5nICBjbW9zX2luaXQrMHgwLzB4NmEgQCAxClsg
ICAgNC4zNjE3MDVdIHJ0Y19jbW9zIDAwOjAzOiBSVEMgY2FuIHdha2UgZnJvbSBTNApbICAgIDQu
MzYyMDA5XSBydGNfY21vcyAwMDowMzogcnRjIGNvcmU6IHJlZ2lzdGVyZWQgcnRjX2Ntb3MgYXMg
cnRjMApbICAgIDQuMzYyMjA5XSBydGMwOiBhbGFybXMgdXAgdG8gb25lIG1vbnRoLCB5M2ssIDEx
NCBieXRlcyBudnJhbQpbICAgIDQuMzYyMzE4XSBpbml0Y2FsbCBjbW9zX2luaXQrMHgwLzB4NmEg
cmV0dXJuZWQgMCBhZnRlciA2MzIgdXNlY3MKWyAgICA0LjM2MjQyMV0gY2FsbGluZyAgZG1faW5p
dCsweDAvMHg0NSBAIDEKWyAgICA0LjM2MjU2Nl0gZGV2aWNlLW1hcHBlcjogdWV2ZW50OiB2ZXJz
aW9uIDEuMC4zClsgICAgNC4zNjI3MTRdIGRldmljZS1tYXBwZXI6IGlvY3RsOiA0LjIyLjAtaW9j
dGwgKDIwMTEtMTAtMTkpIGluaXRpYWxpc2VkOiBkbS1kZXZlbEByZWRoYXQuY29tClsgICAgNC4z
NjI4NDFdIGluaXRjYWxsIGRtX2luaXQrMHgwLzB4NDUgcmV0dXJuZWQgMCBhZnRlciAzMTIgdXNl
Y3MKWyAgICA0LjM2Mjk0NV0gY2FsbGluZyAgY3B1ZnJlcV9zdGF0c19pbml0KzB4MC8weDljIEAg
MQpbICAgIDQuMzYzMDQ2XSBpbml0Y2FsbCBjcHVmcmVxX3N0YXRzX2luaXQrMHgwLzB4OWMgcmV0
dXJuZWQgMCBhZnRlciAxIHVzZWNzClsgICAgNC4zNjMxNTNdIGNhbGxpbmcgIGNwdWZyZXFfZ292
X3Bvd2Vyc2F2ZV9pbml0KzB4MC8weDEyIEAgMQpbICAgIDQuMzYzMjU3XSBpbml0Y2FsbCBjcHVm
cmVxX2dvdl9wb3dlcnNhdmVfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MK
WyAgICA0LjM2MzM4Ml0gY2FsbGluZyAgY3B1ZnJlcV9nb3ZfdXNlcnNwYWNlX2luaXQrMHgwLzB4
MTIgQCAxClsgICAgNC4zNjM0ODRdIGluaXRjYWxsIGNwdWZyZXFfZ292X3VzZXJzcGFjZV9pbml0
KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMzYzNjA5XSBjYWxsaW5n
ICBjcHVmcmVxX2dvdl9kYnNfaW5pdCsweDAvMHg1ZSBAIDEKWyAgICA0LjM2MzcxMl0gaW5pdGNh
bGwgY3B1ZnJlcV9nb3ZfZGJzX2luaXQrMHgwLzB4NWUgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNz
ClsgICAgNC4zNjM4MTddIGNhbGxpbmcgIGNwdWZyZXFfZ292X2Ric19pbml0KzB4MC8weDEyIEAg
MQpbICAgIDQuMzYzOTIwXSBpbml0Y2FsbCBjcHVmcmVxX2dvdl9kYnNfaW5pdCsweDAvMHgxMiBy
ZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICA0LjM2NDAyNl0gY2FsbGluZyAgaW5pdF9sYWRk
ZXIrMHgwLzB4MTIgQCAxClsgICAgNC4zNjQxMjhdIGluaXRjYWxsIGluaXRfbGFkZGVyKzB4MC8w
eDEyIHJldHVybmVkIC0xOSBhZnRlciAwIHVzZWNzClsgICAgNC4zNjQyMzJdIGNhbGxpbmcgIGlu
aXRfbWVudSsweDAvMHgxMiBAIDEKWyAgICA0LjM2NDMzNF0gaW5pdGNhbGwgaW5pdF9tZW51KzB4
MC8weDEyIHJldHVybmVkIC0xOSBhZnRlciAwIHVzZWNzClsgICAgNC4zNjQ0MzZdIGNhbGxpbmcg
IGVmaXZhcnNfaW5pdCsweDAvMHhmNCBAIDEKWyAgICA0LjM2NDUzNl0gRUZJIFZhcmlhYmxlcyBG
YWNpbGl0eSB2MC4wOCAyMDA0LU1heS0xNwpbICAgIDQuMzY0NjM5XSBpbml0Y2FsbCBlZml2YXJz
X2luaXQrMHgwLzB4ZjQgcmV0dXJuZWQgMCBhZnRlciAxMDAgdXNlY3MKWyAgICA0LjM2NDc0NF0g
Y2FsbGluZyAgc3RhZ2luZ19pbml0KzB4MC8weDggQCAxClsgICAgNC4zNjQ4NDVdIGluaXRjYWxs
IHN0YWdpbmdfaW5pdCsweDAvMHg4IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMzY0
OTUxXSBjYWxsaW5nICBmbG93X2NhY2hlX2luaXRfZ2xvYmFsKzB4MC8weDJkIEAgMQpbICAgIDQu
MzY1MDc2XSBpbml0Y2FsbCBmbG93X2NhY2hlX2luaXRfZ2xvYmFsKzB4MC8weDJkIHJldHVybmVk
IDAgYWZ0ZXIgMjMgdXNlY3MKWyAgICA0LjM2NTIwMF0gY2FsbGluZyAgbGxjX2luaXQrMHgwLzB4
MjAgQCAxClsgICAgNC4zNjUzMDBdIGluaXRjYWxsIGxsY19pbml0KzB4MC8weDIwIHJldHVybmVk
IDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMzY1NDAzXSBjYWxsaW5nICBzbmFwX2luaXQrMHgwLzB4
MzkgQCAxClsgICAgNC4zNjU1MDRdIGluaXRjYWxsIHNuYXBfaW5pdCsweDAvMHgzOSByZXR1cm5l
ZCAwIGFmdGVyIDAgdXNlY3MKWyAgICA0LjM2NTYwNV0gY2FsbGluZyAgcmlmX2luaXQrMHgwLzB4
ODQgQCAxClsgICAgNC4zNjU3MTFdIGluaXRjYWxsIHJpZl9pbml0KzB4MC8weDg0IHJldHVybmVk
IDAgYWZ0ZXIgNSB1c2VjcwpbICAgIDQuMzY1ODE1XSBjYWxsaW5nICBibGFja2hvbGVfbW9kdWxl
X2luaXQrMHgwLzB4MTIgQCAxClsgICAgNC4zNjU5MTddIGluaXRjYWxsIGJsYWNraG9sZV9tb2R1
bGVfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICA0LjM2NjAyM10g
Y2FsbGluZyAgc3lzY3RsX2lwdjRfaW5pdCsweDAvMHg4NCBAIDEKWyAgICA0LjM2NjI0N10gaW5p
dGNhbGwgc3lzY3RsX2lwdjRfaW5pdCsweDAvMHg4NCByZXR1cm5lZCAwIGFmdGVyIDExOCB1c2Vj
cwpbICAgIDQuMzY2MzUyXSBjYWxsaW5nICBpbml0X3N5bmNvb2tpZXMrMHgwLzB4MTkgQCAxClsg
ICAgNC4zNjY0NjZdIGluaXRjYWxsIGluaXRfc3luY29va2llcysweDAvMHgxOSByZXR1cm5lZCAw
IGFmdGVyIDExIHVzZWNzClsgICAgNC4zNjY1NzNdIGNhbGxpbmcgIGlwdjRfbmV0ZmlsdGVyX2lu
aXQrMHgwLzB4MjAgQCAxClsgICAgNC4zNjY2NzVdIGluaXRjYWxsIGlwdjRfbmV0ZmlsdGVyX2lu
aXQrMHgwLzB4MjAgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4zNjY3ODBdIGNhbGxp
bmcgIGN1YmljdGNwX3JlZ2lzdGVyKzB4MC8weDZhIEAgMQpbICAgIDQuMzY2ODgyXSBUQ1AgY3Vi
aWMgcmVnaXN0ZXJlZApbICAgIDQuMzY2OTgxXSBpbml0Y2FsbCBjdWJpY3RjcF9yZWdpc3Rlcisw
eDAvMHg2YSByZXR1cm5lZCAwIGFmdGVyIDk2IHVzZWNzClsgICAgNC4zNjcwODZdIGNhbGxpbmcg
IGluZXQ2X2luaXQrMHgwLzB4NTcgQCAxClsgICAgNC4zNjcyNTldIE5FVDogUmVnaXN0ZXJlZCBw
cm90b2NvbCBmYW1pbHkgMTAKWyAgICA0LjM2NzcxN10gaW5pdGNhbGwgaW5ldDZfaW5pdCsweDAv
MHg1NyByZXR1cm5lZCAwIGFmdGVyIDUxOCB1c2VjcwpbICAgIDQuMzY3ODIyXSBjYWxsaW5nICBw
YWNrZXRfaW5pdCsweDAvMHg0NiBAIDEKWyAgICA0LjM2NzkyMV0gTkVUOiBSZWdpc3RlcmVkIHBy
b3RvY29sIGZhbWlseSAxNwpbICAgIDQuMzY4MDIzXSBpbml0Y2FsbCBwYWNrZXRfaW5pdCsweDAv
MHg0NiByZXR1cm5lZCAwIGFmdGVyIDk5IHVzZWNzClsgICAgNC4zNjgxMjddIGNhbGxpbmcgIGRz
YV9pbml0X21vZHVsZSsweDAvMHgxNCBAIDEKWyAgICA0LjM2ODIyOV0gaW5pdGNhbGwgZHNhX2lu
aXRfbW9kdWxlKzB4MC8weDE0IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMzY4MzMx
XSBjYWxsaW5nICBlZHNhX2luaXRfbW9kdWxlKzB4MC8weDE0IEAgMQpbICAgIDQuMzY4NDMyXSBp
bml0Y2FsbCBlZHNhX2luaXRfbW9kdWxlKzB4MC8weDE0IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vj
cwpbICAgIDQuMzY4NTM1XSBjYWxsaW5nICB0cmFpbGVyX2luaXRfbW9kdWxlKzB4MC8weDE0IEAg
MQpbICAgIDQuMzY4NjM2XSBpbml0Y2FsbCB0cmFpbGVyX2luaXRfbW9kdWxlKzB4MC8weDE0IHJl
dHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMzY4NzQxXSBjYWxsaW5nICBtdjg4ZTYwNjBf
aW5pdCsweDAvMHgxNCBAIDEKWyAgICA0LjM2ODg0M10gaW5pdGNhbGwgbXY4OGU2MDYwX2luaXQr
MHgwLzB4MTQgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4zNjg5NDZdIGNhbGxpbmcg
IG12ODhlNjEyM182MV82NV9pbml0KzB4MC8weDE0IEAgMQpbICAgIDQuMzY5MDQ4XSBpbml0Y2Fs
bCBtdjg4ZTYxMjNfNjFfNjVfaW5pdCsweDAvMHgxNCByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MK
WyAgICA0LjM2OTE1NF0gY2FsbGluZyAgbXY4OGU2MTMxX2luaXQrMHgwLzB4MTQgQCAxClsgICAg
NC4zNjkyNTVdIGluaXRjYWxsIG12ODhlNjEzMV9pbml0KzB4MC8weDE0IHJldHVybmVkIDAgYWZ0
ZXIgMCB1c2VjcwpbICAgIDQuMzY5MzU5XSBjYWxsaW5nICBkc2FfaW5pdF9tb2R1bGUrMHgwLzB4
MTIgQCAxClsgICAgNC4zNjk0NzVdIGluaXRjYWxsIGRzYV9pbml0X21vZHVsZSsweDAvMHgxMiBy
ZXR1cm5lZCAwIGFmdGVyIDEzIHVzZWNzClsgICAgNC4zNjk1NzldIGNhbGxpbmcgIGRjYm5sX2lu
aXQrMHgwLzB4NGQgQCAxClsgICAgNC4zNjk2ODBdIGluaXRjYWxsIGRjYm5sX2luaXQrMHgwLzB4
NGQgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4zNjk3ODRdIGNhbGxpbmcgIGluaXRf
ZG5zX3Jlc29sdmVyKzB4MC8weGZlIEAgMQpbICAgIDQuMzY5ODg0XSBSZWdpc3RlcmluZyB0aGUg
ZG5zX3Jlc29sdmVyIGtleSB0eXBlClsgICAgNC4zNjk5OTFdIGluaXRjYWxsIGluaXRfZG5zX3Jl
c29sdmVyKzB4MC8weGZlIHJldHVybmVkIDAgYWZ0ZXIgMTAzIHVzZWNzClsgICAgNC4zNzAwOTdd
IGNhbGxpbmcgIHJpb19pbml0X21wb3J0cysweDAvMHg1YyBAIDEKWyAgICA0LjM3MDIwMF0gaW5p
dGNhbGwgcmlvX2luaXRfbXBvcnRzKzB4MC8weDVjIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcwpb
ICAgIDQuMzcwMzA2XSBjYWxsaW5nICB0Ym9vdF9sYXRlX2luaXQrMHgwLzB4YzIgQCAxClsgICAg
NC4zNzA0MDhdIGluaXRjYWxsIHRib290X2xhdGVfaW5pdCsweDAvMHhjMiByZXR1cm5lZCAwIGFm
dGVyIDAgdXNlY3MKWyAgICA0LjM3MDUxM10gY2FsbGluZyAgbWNoZWNrX2RlYnVnZnNfaW5pdCsw
eDAvMHgzYiBAIDEKWyAgICA0LjM3MDYyMF0gaW5pdGNhbGwgbWNoZWNrX2RlYnVnZnNfaW5pdCsw
eDAvMHgzYiByZXR1cm5lZCAwIGFmdGVyIDMgdXNlY3MKWyAgICA0LjM3MDcyNV0gY2FsbGluZyAg
c2V2ZXJpdGllc19kZWJ1Z2ZzX2luaXQrMHgwLzB4M2IgQCAxClsgICAgNC4zNzA4MzJdIGluaXRj
YWxsIHNldmVyaXRpZXNfZGVidWdmc19pbml0KzB4MC8weDNiIHJldHVybmVkIDAgYWZ0ZXIgMyB1
c2VjcwpbICAgIDQuMzcwOTU1XSBjYWxsaW5nICBocGV0X2luc2VydF9yZXNvdXJjZSsweDAvMHgy
MyBAIDEKWyAgICA0LjM3MTA1OF0gaW5pdGNhbGwgaHBldF9pbnNlcnRfcmVzb3VyY2UrMHgwLzB4
MjMgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4zNzExNjRdIGNhbGxpbmcgIHVwZGF0
ZV9tcF90YWJsZSsweDAvMHgxNiBAIDEKWyAgICA0LjM3MTI2NV0gaW5pdGNhbGwgdXBkYXRlX21w
X3RhYmxlKzB4MC8weDE2IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMzcxMzcwXSBj
YWxsaW5nICBsYXBpY19pbnNlcnRfcmVzb3VyY2UrMHgwLzB4M2YgQCAxClsgICAgNC4zNzE0NzJd
IGluaXRjYWxsIGxhcGljX2luc2VydF9yZXNvdXJjZSsweDAvMHgzZiByZXR1cm5lZCAtMSBhZnRl
ciAwIHVzZWNzClsgICAgNC4zNzE1NzhdIGluaXRjYWxsIGxhcGljX2luc2VydF9yZXNvdXJjZSsw
eDAvMHgzZiByZXR1cm5lZCB3aXRoIGVycm9yIGNvZGUgLTEgClsgICAgNC4zNzE3MDFdIGNhbGxp
bmcgIGlvX2FwaWNfYnVnX2ZpbmFsaXplKzB4MC8weDFiIEAgMQpbICAgIDQuMzcxODAyXSBpbml0
Y2FsbCBpb19hcGljX2J1Z19maW5hbGl6ZSsweDAvMHgxYiByZXR1cm5lZCAwIGFmdGVyIDAgdXNl
Y3MKWyAgICA0LjM3MTkwN10gY2FsbGluZyAgcHJpbnRfSUNzKzB4MC8weDk0IEAgMQpbICAgIDQu
MzcyMDA5XSBpbml0Y2FsbCBwcmludF9JQ3MrMHgwLzB4OTQgcmV0dXJuZWQgMCBhZnRlciAwIHVz
ZWNzClsgICAgNC4zNzIxMTRdIGNhbGxpbmcgIGNoZWNrX2Vhcmx5X2lvcmVtYXBfbGVhaysweDAv
MHg1MCBAIDEKWyAgICA0LjM3MjIxN10gaW5pdGNhbGwgY2hlY2tfZWFybHlfaW9yZW1hcF9sZWFr
KzB4MC8weDUwIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2VjcwpbICAgIDQuMzcyMzQxXSBjYWxsaW5n
ICBwYXRfbWVtdHlwZV9saXN0X2luaXQrMHgwLzB4MzIgQCAxClsgICAgNC4zNzI0NDZdIGluaXRj
YWxsIHBhdF9tZW10eXBlX2xpc3RfaW5pdCsweDAvMHgzMiByZXR1cm5lZCAwIGFmdGVyIDEgdXNl
Y3MKWyAgICA0LjM3MjU1Ml0gY2FsbGluZyAgc2NoZWRfaW5pdF9kZWJ1ZysweDAvMHgyNCBAIDEK
WyAgICA0LjM3MjY1NF0gaW5pdGNhbGwgc2NoZWRfaW5pdF9kZWJ1ZysweDAvMHgyNCByZXR1cm5l
ZCAwIGFmdGVyIDAgdXNlY3MKWyAgICA0LjM3Mjc2MF0gY2FsbGluZyAgaW5pdF9vb3BzX2lkKzB4
MC8weDQwIEAgMQpbICAgIDQuMzcyODYwXSBpbml0Y2FsbCBpbml0X29vcHNfaWQrMHgwLzB4NDAg
cmV0dXJuZWQgMCBhZnRlciAxIHVzZWNzClsgICAgNC4zNzI5NjVdIGNhbGxpbmcgIHByaW50a19s
YXRlX2luaXQrMHgwLzB4NTYgQCAxClsgICAgNC4zNzMwNjldIGluaXRjYWxsIHByaW50a19sYXRl
X2luaXQrMHgwLzB4NTYgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4zNzMxNzVdIGNh
bGxpbmcgIHBtX2RlYnVnZnNfaW5pdCsweDAvMHgyNCBAIDEKWyAgICA0LjM3MzI3OF0gaW5pdGNh
bGwgcG1fZGVidWdmc19pbml0KzB4MC8weDI0IHJldHVybmVkIDAgYWZ0ZXIgMSB1c2VjcwpbICAg
IDQuMzczMzgyXSBjYWxsaW5nICBwbV9xb3NfcG93ZXJfaW5pdCsweDAvMHhkYyBAIDEKWyAgICA0
LjM3MzU4MF0gaW5pdGNhbGwgcG1fcW9zX3Bvd2VyX2luaXQrMHgwLzB4ZGMgcmV0dXJuZWQgMCBh
ZnRlciA5NCB1c2VjcwpbICAgIDQuMzczNjg1XSBjYWxsaW5nICB0ZXN0X3N1c3BlbmQrMHgwLzB4
YTEgQCAxClsgICAgNC4zNzM3ODZdIGluaXRjYWxsIHRlc3Rfc3VzcGVuZCsweDAvMHhhMSByZXR1
cm5lZCAwIGFmdGVyIDAgdXNlY3MKWyAgICA0LjM3Mzg5MF0gY2FsbGluZyAgc29mdHdhcmVfcmVz
dW1lKzB4MC8weDMwIEAgMQpbICAgIDQuMzczOTkxXSBQTTogSGliZXJuYXRpb24gaW1hZ2Ugbm90
IHByZXNlbnQgb3IgY291bGQgbm90IGJlIGxvYWRlZC4KWyAgICA0LjM3NDA5Nl0gaW5pdGNhbGwg
c29mdHdhcmVfcmVzdW1lKzB4MC8weDMwIHJldHVybmVkIC0yIGFmdGVyIDEwMSB1c2VjcwpbICAg
IDQuMzc0MjAxXSBpbml0Y2FsbCBzb2Z0d2FyZV9yZXN1bWUrMHgwLzB4MzAgcmV0dXJuZWQgd2l0
aCBlcnJvciBjb2RlIC0yIApbICAgIDQuMzc0MzA4XSBjYWxsaW5nICBkZWJ1Z2ZzX2twcm9iZV9p
bml0KzB4MC8weGEwIEAgMQpbICAgIDQuMzc0NDE0XSBpbml0Y2FsbCBkZWJ1Z2ZzX2twcm9iZV9p
bml0KzB4MC8weGEwIHJldHVybmVkIDAgYWZ0ZXIgMyB1c2VjcwpbICAgIDQuMzc0NTIxXSBjYWxs
aW5nICB0YXNrc3RhdHNfaW5pdCsweDAvMHg5NSBAIDEKWyAgICA0LjM3NDYyNV0gcmVnaXN0ZXJl
ZCB0YXNrc3RhdHMgdmVyc2lvbiAxClsgICAgNC4zNzQ3MjhdIGluaXRjYWxsIHRhc2tzdGF0c19p
bml0KzB4MC8weDk1IHJldHVybmVkIDAgYWZ0ZXIgMTAxIHVzZWNzClsgICAgNC4zNzQ4MzRdIGNh
bGxpbmcgIGNsZWFyX2Jvb3RfdHJhY2VyKzB4MC8weDJkIEAgMQpbICAgIDQuMzc0OTM2XSBpbml0
Y2FsbCBjbGVhcl9ib290X3RyYWNlcisweDAvMHgyZCByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MK
WyAgICA0LjM3NTA0MV0gY2FsbGluZyAga2RiX2Z0cmFjZV9yZWdpc3RlcisweDAvMHgyZiBAIDEK
WyAgICA0LjM3NTE0Nl0gaW5pdGNhbGwga2RiX2Z0cmFjZV9yZWdpc3RlcisweDAvMHgyZiByZXR1
cm5lZCAwIGFmdGVyIDEgdXNlY3MKWyAgICA0LjM3NTI1Ml0gY2FsbGluZyAgbWF4X3N3YXBmaWxl
c19jaGVjaysweDAvMHg4IEAgMQpbICAgIDQuMzc1MzU0XSBpbml0Y2FsbCBtYXhfc3dhcGZpbGVz
X2NoZWNrKzB4MC8weDggcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4zNzU0NjBdIGNh
bGxpbmcgIHNldF9yZWNvbW1lbmRlZF9taW5fZnJlZV9rYnl0ZXMrMHgwLzB4YTAgQCAxClsgICAg
NC4zNzU1NjNdIGluaXRjYWxsIHNldF9yZWNvbW1lbmRlZF9taW5fZnJlZV9rYnl0ZXMrMHgwLzB4
YTAgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4zNzU2ODhdIGNhbGxpbmcgIGluaXRf
dHJ1c3RlZCsweDAvMHhiYiBAIDEKWyAgICA0LjM3NTc5MV0gYXN5bmNfd2FpdGluZyBAIDEKWyAg
ICA0LjM3NTg4OF0gYXN5bmNfY29udGludWluZyBAIDEgYWZ0ZXIgMCB1c2VjClsgICAgNC4zNzcz
MjldIGFzeW5jX3dhaXRpbmcgQCAxClsgICAgNC4zNzc0MzBdIGFzeW5jX2NvbnRpbnVpbmcgQCAx
IGFmdGVyIDAgdXNlYwpbICAgIDQuMzc4NzQ0XSBpbml0Y2FsbCBpbml0X3RydXN0ZWQrMHgwLzB4
YmIgcmV0dXJuZWQgMCBhZnRlciAyODgxIHVzZWNzClsgICAgNC4zNzg4NDldIGNhbGxpbmcgIGlu
aXRfZW5jcnlwdGVkKzB4MC8weDExZiBAIDEKWyAgICA0LjM3ODk1MV0gYXN5bmNfd2FpdGluZyBA
IDEKWyAgICA0LjM3OTA0OV0gYXN5bmNfY29udGludWluZyBAIDEgYWZ0ZXIgMCB1c2VjClsgICAg
NC4zODAzMjhdIGFzeW5jX3dhaXRpbmcgQCAxClsgICAgNC4zODA0MjldIGFzeW5jX2NvbnRpbnVp
bmcgQCAxIGFmdGVyIDAgdXNlYwpbICAgIDQuMzgxNzUwXSBhc3luY193YWl0aW5nIEAgMQpbICAg
IDQuMzgxODQ5XSBhc3luY19jb250aW51aW5nIEAgMSBhZnRlciAwIHVzZWMKWyAgICA0LjM4MzEw
NF0gYXN5bmNfd2FpdGluZyBAIDEKWyAgICA0LjM4MzIwM10gYXN5bmNfY29udGludWluZyBAIDEg
YWZ0ZXIgMCB1c2VjClsgICAgNC4zODQ1MzVdIGluaXRjYWxsIGluaXRfZW5jcnlwdGVkKzB4MC8w
eDExZiByZXR1cm5lZCAwIGFmdGVyIDU0NTEgdXNlY3MKWyAgICA0LjM4NDY0Ml0gY2FsbGluZyAg
aW5pdF9ldm0rMHgwLzB4MjUgQCAxClsgICAgNC4zODQ3NDhdIGluaXRjYWxsIGluaXRfZXZtKzB4
MC8weDI1IHJldHVybmVkIDAgYWZ0ZXIgMyB1c2VjcwpbICAgIDQuMzg0ODUyXSBjYWxsaW5nICBy
YW5kb20zMl9yZXNlZWQrMHgwLzB4YTIgQCAxClsgICAgNC4zODQ5NTVdIGluaXRjYWxsIHJhbmRv
bTMyX3Jlc2VlZCsweDAvMHhhMiByZXR1cm5lZCAwIGFmdGVyIDQgdXNlY3MKWyAgICA0LjM4NTA2
MF0gY2FsbGluZyAgcGNpX3Jlc291cmNlX2FsaWdubWVudF9zeXNmc19pbml0KzB4MC8weDE5IEAg
MQpbICAgIDQuMzg2ODYzXSBpbml0Y2FsbCBwY2lfcmVzb3VyY2VfYWxpZ25tZW50X3N5c2ZzX2lu
aXQrMHgwLzB4MTkgcmV0dXJuZWQgMCBhZnRlciAxIHVzZWNzClsgICAgNC4zODY5ODldIGNhbGxp
bmcgIHBjaV9zeXNmc19pbml0KzB4MC8weDUxIEAgMQpbICAgIDQuMzg3NjUzXSBpbml0Y2FsbCBw
Y2lfc3lzZnNfaW5pdCsweDAvMHg1MSByZXR1cm5lZCAwIGFmdGVyIDU0OCB1c2VjcwpbICAgIDQu
Mzg3NzU1XSBjYWxsaW5nICBib290X3dhaXRfZm9yX2RldmljZXMrMHgwLzB4MzAgQCAxClsgICAg
NC4zODc4NThdIGluaXRjYWxsIGJvb3Rfd2FpdF9mb3JfZGV2aWNlcysweDAvMHgzMCByZXR1cm5l
ZCAwIGFmdGVyIDAgdXNlY3MKWyAgICA0LjM4Nzk2M10gY2FsbGluZyAgcmVndWxhdG9yX2luaXRf
Y29tcGxldGUrMHgwLzB4MTM5IEAgMQpbICAgIDQuMzg4MDY3XSBpbml0Y2FsbCByZWd1bGF0b3Jf
aW5pdF9jb21wbGV0ZSsweDAvMHgxMzkgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4z
ODgxOTJdIGNhbGxpbmcgIHJhbmRvbV9pbnRfc2VjcmV0X2luaXQrMHgwLzB4MTkgQCAxClsgICAg
NC4zODgzMDFdIGluaXRjYWxsIHJhbmRvbV9pbnRfc2VjcmV0X2luaXQrMHgwLzB4MTkgcmV0dXJu
ZWQgMCBhZnRlciA2IHVzZWNzClsgICAgNC4zODg0MDZdIGNhbGxpbmcgIGxhdGVfcmVzdW1lX2lu
aXQrMHgwLzB4MWIwIEAgMQpbICAgIDQuMzg4NTA1XSAgIE1hZ2ljIG51bWJlcjogODo2NDg6NDkz
ClsgICAgNC4zODg2MjVdIGluaXRjYWxsIGxhdGVfcmVzdW1lX2luaXQrMHgwLzB4MWIwIHJldHVy
bmVkIDAgYWZ0ZXIgMTE2IHVzZWNzClsgICAgNC4zODg3MjhdIGNhbGxpbmcgIHNjc2lfY29tcGxl
dGVfYXN5bmNfc2NhbnMrMHgwLzB4MTYwIEAgMQpbICAgIDQuMzg4ODI3XSBpbml0Y2FsbCBzY3Np
X2NvbXBsZXRlX2FzeW5jX3NjYW5zKzB4MC8weDE2MCByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MK
WyAgICA0LjM4ODk0OV0gY2FsbGluZyAgcnRjX2hjdG9zeXMrMHgwLzB4MTBmIEAgMQpbICAgIDQu
Mzg5MTEyXSBydGNfY21vcyAwMDowMzogc2V0dGluZyBzeXN0ZW0gY2xvY2sgdG8gMjAxMi0wNC0x
MSAxODoyOToyNCBVVEMgKDEzMzQxNjg5NjQpClsgICAgNC4zODkyMzddIGluaXRjYWxsIHJ0Y19o
Y3Rvc3lzKzB4MC8weDEwZiByZXR1cm5lZCAwIGFmdGVyIDE4NiB1c2VjcwpbICAgIDQuMzg5MzQw
XSBjYWxsaW5nICBwb3dlcm5vd2s4X2luaXQrMHgwLzB4MWJmIEAgMQpbICAgIDQuMzg5NDQ3XSBp
bml0Y2FsbCBwb3dlcm5vd2s4X2luaXQrMHgwLzB4MWJmIHJldHVybmVkIC0xOSBhZnRlciA1IHVz
ZWNzClsgICAgNC4zODk1NDddIGNhbGxpbmcgIGFjcGlfY3B1ZnJlcV9pbml0KzB4MC8weDE2IEAg
MQpbICAgIDQuMzg5ODE4XSBpbml0Y2FsbCBhY3BpX2NwdWZyZXFfaW5pdCsweDAvMHgxNiByZXR1
cm5lZCAwIGFmdGVyIDE2NiB1c2VjcwpbICAgIDQuMzg5OTIyXSBjYWxsaW5nICBjZW50cmlub19p
bml0KzB4MC8weDJlIEAgMQpbICAgIDQuMzkwMDE5XSBpbml0Y2FsbCBjZW50cmlub19pbml0KzB4
MC8weDJlIHJldHVybmVkIC0xNiBhZnRlciAwIHVzZWNzClsgICAgNC4zOTAxMjJdIGluaXRjYWxs
IGNlbnRyaW5vX2luaXQrMHgwLzB4MmUgcmV0dXJuZWQgd2l0aCBlcnJvciBjb2RlIC0xNiAKWyAg
ICA0LjM5MDIyN10gY2FsbGluZyAgZWRkX2luaXQrMHgwLzB4MWEzIEAgMQpbICAgIDQuMzkwMzI0
XSBCSU9TIEVERCBmYWNpbGl0eSB2MC4xNiAyMDA0LUp1bi0yNSwgMCBkZXZpY2VzIGZvdW5kClsg
ICAgNC4zOTA0MjddIEVERCBpbmZvcm1hdGlvbiBub3QgYXZhaWxhYmxlLgpbICAgIDQuMzkwNTIy
XSBpbml0Y2FsbCBlZGRfaW5pdCsweDAvMHgxYTMgcmV0dXJuZWQgLTE5IGFmdGVyIDE5MiB1c2Vj
cwpbICAgIDQuMzkwNjI2XSBjYWxsaW5nICBtZW1tYXBfaW5pdCsweDAvMHgzNSBAIDEKWyAgICA0
LjM5MDc1OV0gaW5pdGNhbGwgbWVtbWFwX2luaXQrMHgwLzB4MzUgcmV0dXJuZWQgMCBhZnRlciAz
NSB1c2VjcwpbICAgIDQuMzkwODYyXSBjYWxsaW5nICBkZXZmcmVxX3N0YXJ0X3BvbGxpbmcrMHgw
LzB4OTAgQCAxClsgICAgNC4zOTA5OTBdIGluaXRjYWxsIGRldmZyZXFfc3RhcnRfcG9sbGluZysw
eDAvMHg5MCByZXR1cm5lZCAwIGFmdGVyIDIzIHVzZWNzClsgICAgNC4zOTEwOThdIGNhbGxpbmcg
IHBjaV9tbWNmZ19sYXRlX2luc2VydF9yZXNvdXJjZXMrMHgwLzB4NTkgQCAxClsgICAgNC4zOTEy
MDJdIGluaXRjYWxsIHBjaV9tbWNmZ19sYXRlX2luc2VydF9yZXNvdXJjZXMrMHgwLzB4NTkgcmV0
dXJuZWQgMCBhZnRlciAwIHVzZWNzClsgICAgNC4zOTEzMjZdIGNhbGxpbmcgIG5ldF9zZWNyZXRf
aW5pdCsweDAvMHgxOSBAIDEKWyAgICA0LjM5MTQzM10gaW5pdGNhbGwgbmV0X3NlY3JldF9pbml0
KzB4MC8weDE5IHJldHVybmVkIDAgYWZ0ZXIgNiB1c2VjcwpbICAgIDQuMzkxNTM1XSBjYWxsaW5n
ICB0Y3BfY29uZ2VzdGlvbl9kZWZhdWx0KzB4MC8weDEyIEAgMQpbICAgIDQuMzkxNjM4XSBpbml0
Y2FsbCB0Y3BfY29uZ2VzdGlvbl9kZWZhdWx0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1
c2VjcwpbICAgIDQuMzkxNzQxXSBjYWxsaW5nICBpbml0aWFsaXplX2hhc2hybmQrMHgwLzB4MTkg
QCAxClsgICAgNC4zOTE4NDNdIGluaXRjYWxsIGluaXRpYWxpemVfaGFzaHJuZCsweDAvMHgxOSBy
ZXR1cm5lZCAwIGFmdGVyIDEgdXNlY3MKWyAgICA0LjM5MTk2Nl0gYXN5bmNfd2FpdGluZyBAIDEK
WyAgICA0LjM5MjA2M10gYXN5bmNfY29udGludWluZyBAIDEgYWZ0ZXIgMCB1c2VjClsgICAgNC4z
OTIxNjddIGFzeW5jX3dhaXRpbmcgQCAxClsgICAgNC42MzcxNjddIGF0YTY6IFNBVEEgbGluayB1
cCAxLjUgR2JwcyAoU1N0YXR1cyAxMTMgU0NvbnRyb2wgMzAwKQpbICAgIDQuNjM3MzE0XSBhdGE0
OiBTQVRBIGxpbmsgdXAgMy4wIEdicHMgKFNTdGF0dXMgMTIzIFNDb250cm9sIDMwMCkKWyAgICA0
LjYzNzgwN10gYXRhNi4wMDogQVRBUEk6IFRTU1Rjb3JwIENERFZEVyBTSC1TMjIzRiwgU0IwMCwg
bWF4IFVETUEvMTAwClsgICAgNC42Mzg2MzJdIGF0YTYuMDA6IGNvbmZpZ3VyZWQgZm9yIFVETUEv
MTAwClsgICAgNC42MzkwMjRdIGFzeW5jX3dhaXRpbmcgQCA1MgpbICAgIDQuNjM5MTE3XSBhdGE0
LjAwOiBBVEEtODogU1QzMTAwMDM0MEFTLCBTRDFBLCBtYXggVURNQS8xMzMKWyAgICA0LjYzOTEx
OF0gYXRhNC4wMDogMTk1MzUyNTE2OCBzZWN0b3JzLCBtdWx0aSAxNjogTEJBNDggTkNRIChkZXB0
aCAzMS8zMikKWyAgICA0LjY0MTE1NF0gYXRhMzogU0FUQSBsaW5rIHVwIDMuMCBHYnBzIChTU3Rh
dHVzIDEyMyBTQ29udHJvbCAzMDApClsgICAgNC42NDEzMDJdIGF0YTQuMDA6IGNvbmZpZ3VyZWQg
Zm9yIFVETUEvMTMzClsgICAgNC42NDE0MDldIGFzeW5jX3dhaXRpbmcgQCA1MApbICAgIDQuNjQy
MzIyXSBhdGEzLjAwOiBBVEEtODogU1QzMTAwMDUyOEFTLCBDQzM3LCBtYXggVURNQS8xMzMKWyAg
ICA0LjY0MjQ1Ml0gYXRhMy4wMDogMTk1MzUyNTE2OCBzZWN0b3JzLCBtdWx0aSAxNjogTEJBNDgg
TkNRIChkZXB0aCAzMS8zMikKWyAgICA0LjY0Mzc0NF0gYXRhMy4wMDogY29uZmlndXJlZCBmb3Ig
VURNQS8xMzMKWyAgICA0LjY0Mzg3OV0gYXN5bmNfd2FpdGluZyBAIDQ5ClsgICAgNC42NDUxNTVd
IHVzYiAxLTE6IG5ldyBoaWdoLXNwZWVkIFVTQiBkZXZpY2UgbnVtYmVyIDIgdXNpbmcgZWhjaV9o
Y2QKWyAgICA0LjY0NTE2Ml0gYXRhMjogU0FUQSBsaW5rIHVwIDMuMCBHYnBzIChTU3RhdHVzIDEy
MyBTQ29udHJvbCAzMDApClsgICAgNC42NDY2MjRdIGF0YTIuMDA6IEFUQS04OiBTVDM1MDAzMjBB
UywgU0QxQSwgbWF4IFVETUEvMTMzClsgICAgNC42NDY3MzZdIGF0YTIuMDA6IDk3Njc3MzE2OCBz
ZWN0b3JzLCBtdWx0aSAxNjogTEJBNDggTkNRIChkZXB0aCAzMS8zMikKWyAgICA0LjY0ODY0MV0g
YXRhMi4wMDogY29uZmlndXJlZCBmb3IgVURNQS8xMzMKWyAgICA0LjY0ODc1OV0gYXN5bmNfd2Fp
dGluZyBAIDE2ClsgICAgNC42NDkxNTNdIGF0YTE6IFNBVEEgbGluayB1cCAzLjAgR2JwcyAoU1N0
YXR1cyAxMjMgU0NvbnRyb2wgMzAwKQpbICAgIDQuNjUwMzQ0XSBhdGExLjAwOiBBVEEtODogU1Qz
NTAwNDE4QVMsIENDNDYsIG1heCBVRE1BLzEzMwpbICAgIDQuNjUwNDU4XSBhdGExLjAwOiA5NzY3
NzMxNjggc2VjdG9ycywgbXVsdGkgMTY6IExCQTQ4IE5DUSAoZGVwdGggMzEvMzIpClsgICAgNC42
NTE3ODZdIGF0YTEuMDA6IGNvbmZpZ3VyZWQgZm9yIFVETUEvMTMzClsgICAgNC42NTE5MDRdIGFz
eW5jX3dhaXRpbmcgQCA1ClsgICAgNC42NTE5ODddIGFzeW5jX2NvbnRpbnVpbmcgQCA1IGFmdGVy
IDAgdXNlYwpbICAgIDQuNjUyMTUxXSBzY3NpIDA6MDowOjA6IERpcmVjdC1BY2Nlc3MgICAgIEFU
QSAgICAgIFNUMzUwMDQxOEFTICAgICAgQ0M0NiBQUTogMCBBTlNJOiA1ClsgICAgNC42NTIzMjBd
IGNhbGxpbmcgIDhfc2RfcHJvYmVfYXN5bmMrMHgwLzB4MWQwIEAgNTMKWyAgICA0LjY1MjM0OV0g
c2QgMDowOjA6MDogQXR0YWNoZWQgc2NzaSBnZW5lcmljIHNnMCB0eXBlIDAKWyAgICA0LjY1MjM4
NF0gaW5pdGNhbGwgMl9hc3luY19wb3J0X3Byb2JlKzB4MC8weDcwIHJldHVybmVkIDAgYWZ0ZXIg
MzI0NDE3IHVzZWNzClsgICAgNC42NTIzOTJdIGFzeW5jX2NvbnRpbnVpbmcgQCAxNiBhZnRlciAz
NDY4IHVzZWMKWyAgICA0LjY1MjQzOF0gc2NzaSAxOjA6MDowOiBEaXJlY3QtQWNjZXNzICAgICBB
VEEgICAgICBTVDM1MDAzMjBBUyAgICAgIFNEMUEgUFE6IDAgQU5TSTogNQpbICAgIDQuNjUyNTEz
XSBzZCAxOjA6MDowOiBBdHRhY2hlZCBzY3NpIGdlbmVyaWMgc2cxIHR5cGUgMApbICAgIDQuNjUy
NTM4XSBpbml0Y2FsbCAzX2FzeW5jX3BvcnRfcHJvYmUrMHgwLzB4NzAgcmV0dXJuZWQgMCBhZnRl
ciAzMjQ0NzYgdXNlY3MKWyAgICA0LjY1MjU0Ml0gY2FsbGluZyAgOV9zZF9wcm9iZV9hc3luYysw
eDAvMHgxZDAgQCAxNgpbICAgIDQuNjUyNTUwXSBhc3luY19jb250aW51aW5nIEAgNDkgYWZ0ZXIg
ODM3MCB1c2VjClsgICAgNC42NTI1OTldIHNkIDE6MDowOjA6IFtzZGJdIDk3Njc3MzE2OCA1MTIt
Ynl0ZSBsb2dpY2FsIGJsb2NrczogKDUwMCBHQi80NjUgR2lCKQpbICAgIDQuNjUyNjEwXSBzY3Np
IDI6MDowOjA6IERpcmVjdC1BY2Nlc3MgICAgIEFUQSAgICAgIFNUMzEwMDA1MjhBUyAgICAgQ0Mz
NyBQUTogMCBBTlNJOiA1ClsgICAgNC42NTI2ODNdIHNkIDI6MDowOjA6IEF0dGFjaGVkIHNjc2kg
Z2VuZXJpYyBzZzIgdHlwZSAwClsgICAgNC42NTI3MDhdIGluaXRjYWxsIDRfYXN5bmNfcG9ydF9w
cm9iZSsweDAvMHg3MCByZXR1cm5lZCAwIGFmdGVyIDMyNDU0NSB1c2VjcwpbICAgIDQuNjUyNzEx
XSBjYWxsaW5nICAxMF9zZF9wcm9iZV9hc3luYysweDAvMHgxZDAgQCA0OQpbICAgIDQuNjUyNzQ4
XSBzZCAyOjA6MDowOiBbc2RjXSAxOTUzNTI1MTY4IDUxMi1ieXRlIGxvZ2ljYWwgYmxvY2tzOiAo
MS4wMCBUQi85MzEgR2lCKQpbICAgIDQuNjUyNzkxXSBzZCAxOjA6MDowOiBbc2RiXSBXcml0ZSBQ
cm90ZWN0IGlzIG9mZgpbICAgIDQuNjUyNzkzXSBzZCAxOjA6MDowOiBbc2RiXSBNb2RlIFNlbnNl
OiAwMCAzYSAwMCAwMApbICAgIDQuNjUyODI2XSBzZCAxOjA6MDowOiBbc2RiXSBXcml0ZSBjYWNo
ZTogZW5hYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgZG9lc24ndCBzdXBwb3J0IERQTyBvciBG
VUEKWyAgICA0LjY1Mjg1NF0gc2QgMjowOjA6MDogW3NkY10gV3JpdGUgUHJvdGVjdCBpcyBvZmYK
WyAgICA0LjY1Mjg1Nl0gc2QgMjowOjA6MDogW3NkY10gTW9kZSBTZW5zZTogMDAgM2EgMDAgMDAK
WyAgICA0LjY1MjkxM10gc2QgMjowOjA6MDogW3NkY10gV3JpdGUgY2FjaGU6IGVuYWJsZWQsIHJl
YWQgY2FjaGU6IGVuYWJsZWQsIGRvZXNuJ3Qgc3VwcG9ydCBEUE8gb3IgRlVBClsgICAgNC42NTQy
ODNdIGFzeW5jX2NvbnRpbnVpbmcgQCA1MCBhZnRlciAxMjQ3NiB1c2VjClsgICAgNC42NTQzMDBd
IHNkIDA6MDowOjA6IFtzZGFdIDk3Njc3MzE2OCA1MTItYnl0ZSBsb2dpY2FsIGJsb2NrczogKDUw
MCBHQi80NjUgR2lCKQpbICAgIDQuNjU0MzQ0XSBzZCAwOjA6MDowOiBbc2RhXSBXcml0ZSBQcm90
ZWN0IGlzIG9mZgpbICAgIDQuNjU0MzQ2XSBzZCAwOjA6MDowOiBbc2RhXSBNb2RlIFNlbnNlOiAw
MCAzYSAwMCAwMApbICAgIDQuNjU0MzY1XSBzZCAwOjA6MDowOiBbc2RhXSBXcml0ZSBjYWNoZTog
ZW5hYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgZG9lc24ndCBzdXBwb3J0IERQTyBvciBGVUEK
WyAgICA0LjY1NDc5OV0gc2NzaSAzOjA6MDowOiBEaXJlY3QtQWNjZXNzICAgICBBVEEgICAgICBT
VDMxMDAwMzQwQVMgICAgIFNEMUEgUFE6IDAgQU5TSTogNQpbICAgIDQuNjU0OTYxXSBjYWxsaW5n
ICAxMV9zZF9wcm9iZV9hc3luYysweDAvMHgxZDAgQCA1ClsgICAgNC42NTUwOTBdIHNkIDM6MDow
OjA6IFtzZGRdIDE5NTM1MjUxNjggNTEyLWJ5dGUgbG9naWNhbCBibG9ja3M6ICgxLjAwIFRCLzkz
MSBHaUIpClsgICAgNC42NTUwOThdIHNkIDM6MDowOjA6IEF0dGFjaGVkIHNjc2kgZ2VuZXJpYyBz
ZzMgdHlwZSAwClsgICAgNC42NTUzMTBdIGluaXRjYWxsIDVfYXN5bmNfcG9ydF9wcm9iZSsweDAv
MHg3MCByZXR1cm5lZCAwIGFmdGVyIDMyNzAwMiB1c2VjcwpbICAgIDQuNjU1MzM0XSBzZCAzOjA6
MDowOiBbc2RkXSBXcml0ZSBQcm90ZWN0IGlzIG9mZgpbICAgIDQuNjU1MzM1XSBzZCAzOjA6MDow
OiBbc2RkXSBNb2RlIFNlbnNlOiAwMCAzYSAwMCAwMApbICAgIDQuNjU1MzU0XSBzZCAzOjA6MDow
OiBbc2RkXSBXcml0ZSBjYWNoZTogZW5hYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgZG9lc24n
dCBzdXBwb3J0IERQTyBvciBGVUEKWyAgICA0LjY1ODI2OV0gIHNkYTogc2RhMQpbICAgIDQuNjU4
NTQ2XSBzZCAwOjA6MDowOiBbc2RhXSBBdHRhY2hlZCBTQ1NJIGRpc2sKWyAgICA0LjY1ODY0MV0g
aW5pdGNhbGwgOF9zZF9wcm9iZV9hc3luYysweDAvMHgxZDAgcmV0dXJuZWQgMCBhZnRlciA0Mjcy
IHVzZWNzClsgICAgNC42NjIwMzFdICBzZGM6IHNkYzEKWyAgICA0LjY2MjM0Nl0gc2QgMjowOjA6
MDogW3NkY10gQXR0YWNoZWQgU0NTSSBkaXNrClsgICAgNC42NjI0NDBdIGluaXRjYWxsIDEwX3Nk
X3Byb2JlX2FzeW5jKzB4MC8weDFkMCByZXR1cm5lZCAwIGFmdGVyIDk0OTggdXNlY3MKWyAgICA0
LjY2NTE2NV0gIHNkYjogc2RiMQpbICAgIDQuNjY1NDc0XSBzZCAxOjA6MDowOiBbc2RiXSBBdHRh
Y2hlZCBTQ1NJIGRpc2sKWyAgICA0LjY2NTU2Nl0gaW5pdGNhbGwgOV9zZF9wcm9iZV9hc3luYysw
eDAvMHgxZDAgcmV0dXJuZWQgMCBhZnRlciAxMjcxNiB1c2VjcwpbICAgIDQuNjc0OTI3XSAgc2Rk
OiBzZGQxClsgICAgNC42NzUyNDRdIHNkIDM6MDowOjA6IFtzZGRdIEF0dGFjaGVkIFNDU0kgZGlz
awpbICAgIDQuNjc1MzM3XSBpbml0Y2FsbCAxMV9zZF9wcm9iZV9hc3luYysweDAvMHgxZDAgcmV0
dXJuZWQgMCBhZnRlciAxOTgwOSB1c2VjcwpbICAgIDQuNzc3ODQzXSBodWIgMS0xOjEuMDogVVNC
IGh1YiBmb3VuZApbICAgIDQuNzc4MDU2XSBodWIgMS0xOjEuMDogNiBwb3J0cyBkZXRlY3RlZApb
ICAgIDQuODg5MTU3XSB1c2IgMi0xOiBuZXcgaGlnaC1zcGVlZCBVU0IgZGV2aWNlIG51bWJlciAy
IHVzaW5nIGVoY2lfaGNkClsgICAgNS4wMjE4MzJdIGh1YiAyLTE6MS4wOiBVU0IgaHViIGZvdW5k
ClsgICAgNS4wMjIwNDZdIGh1YiAyLTE6MS4wOiA2IHBvcnRzIGRldGVjdGVkClsgICAgNS4wODUx
NTRdIGF0YTU6IFNBVEEgbGluayB1cCAzLjAgR2JwcyAoU1N0YXR1cyAxMjMgU0NvbnRyb2wgMzAw
KQpbICAgIDUuMDkzMjk1XSB1c2IgMS0xLjI6IG5ldyBmdWxsLXNwZWVkIFVTQiBkZXZpY2UgbnVt
YmVyIDMgdXNpbmcgZWhjaV9oY2QKWyAgICA1LjEwNTQyMl0gYXRhNS4wMDogSFBBIGRldGVjdGVk
OiBjdXJyZW50IDk3Njc3MTA1NSwgbmF0aXZlIDk3Njc3MzE2OApbICAgIDUuMTA1NjQ2XSBhdGE1
LjAwOiBBVEEtODogV0RDIFdENTAwMEFBS1MtMjJZR0EwLCAxMi4wMUMwMiwgbWF4IFVETUEvMTMz
ClsgICAgNS4xMDU3NTldIGF0YTUuMDA6IDk3Njc3MTA1NSBzZWN0b3JzLCBtdWx0aSAxNjogTEJB
NDggTkNRIChkZXB0aCAzMS8zMiksIEFBClsgICAgNS4xMDY4MjhdIGF0YTUuMDA6IGNvbmZpZ3Vy
ZWQgZm9yIFVETUEvMTMzClsgICAgNS4xMDY5NDZdIGFzeW5jX3dhaXRpbmcgQCA1MQpbICAgIDUu
MTA3MDI2XSBhc3luY19jb250aW51aW5nIEAgNTEgYWZ0ZXIgMCB1c2VjClsgICAgNS4xMDcxNjNd
IHNjc2kgNDowOjA6MDogRGlyZWN0LUFjY2VzcyAgICAgQVRBICAgICAgV0RDIFdENTAwMEFBS1Mt
MiAxMi4wIFBROiAwIEFOU0k6IDUKWyAgICA1LjEwNzMyNl0gY2FsbGluZyAgMTJfc2RfcHJvYmVf
YXN5bmMrMHgwLzB4MWQwIEAgNQpbICAgIDUuMTA3MzU0XSBzZCA0OjA6MDowOiBBdHRhY2hlZCBz
Y3NpIGdlbmVyaWMgc2c0IHR5cGUgMApbICAgIDUuMTA3Mzc4XSBpbml0Y2FsbCA2X2FzeW5jX3Bv
cnRfcHJvYmUrMHgwLzB4NzAgcmV0dXJuZWQgMCBhZnRlciA3NjgzODAgdXNlY3MKWyAgICA1LjEw
NzM4NF0gYXN5bmNfY29udGludWluZyBAIDUyIGFmdGVyIDQ1NzA3NyB1c2VjClsgICAgNS4xMDc3
MjFdIHNkIDQ6MDowOjA6IFtzZGVdIDk3Njc3MTA1NSA1MTItYnl0ZSBsb2dpY2FsIGJsb2Nrczog
KDUwMCBHQi80NjUgR2lCKQpbICAgIDUuMTA3OTAzXSBzY3NpIDU6MDowOjA6IENELVJPTSAgICAg
ICAgICAgIFRTU1Rjb3JwIENERFZEVyBTSC1TMjIzRiAgU0IwMCBQUTogMCBBTlNJOiA1ClsgICAg
NS4xMDc5MTRdIHNkIDQ6MDowOjA6IFtzZGVdIFdyaXRlIFByb3RlY3QgaXMgb2ZmClsgICAgNS4x
MDc5MTVdIHNkIDQ6MDowOjA6IFtzZGVdIE1vZGUgU2Vuc2U6IDAwIDNhIDAwIDAwClsgICAgNS4x
MDc5MzZdIHNkIDQ6MDowOjA6IFtzZGVdIFdyaXRlIGNhY2hlOiBlbmFibGVkLCByZWFkIGNhY2hl
OiBlbmFibGVkLCBkb2Vzbid0IHN1cHBvcnQgRFBPIG9yIEZVQQpbICAgIDUuMTEwNDg1XSBzcjA6
IHNjc2kzLW1tYyBkcml2ZTogNDh4LzQ4eCB3cml0ZXIgZHZkLXJhbSBjZC9ydyB4YS9mb3JtMiBj
ZGRhIHRyYXkKWyAgICA1LjExMDYxN10gY2Ryb206IFVuaWZvcm0gQ0QtUk9NIGRyaXZlciBSZXZp
c2lvbjogMy4yMApbICAgIDUuMTEwNzc2XSBzciA1OjA6MDowOiBBdHRhY2hlZCBzY3NpIENELVJP
TSBzcjAKWyAgICA1LjExMDkwNF0gc3IgNTowOjA6MDogQXR0YWNoZWQgc2NzaSBnZW5lcmljIHNn
NSB0eXBlIDUKWyAgICA1LjExMTAyNF0gaW5pdGNhbGwgN19hc3luY19wb3J0X3Byb2JlKzB4MC8w
eDcwIHJldHVybmVkIDAgYWZ0ZXIgNzcxODQ4IHVzZWNzClsgICAgNS4xMTExNDNdIGFzeW5jX2Nv
bnRpbnVpbmcgQCAxIGFmdGVyIDcwMjAzMSB1c2VjClsgICAgNS4xMTEyMzBdIGFzeW5jX3dhaXRp
bmcgQCAxClsgICAgNS4xMTg3MjddICBzZGU6IHNkZTEKWyAgICA1LjExOTAwMF0gc2QgNDowOjA6
MDogW3NkZV0gQXR0YWNoZWQgU0NTSSBkaXNrClsgICAgNS4xMTkwODddIGluaXRjYWxsIDEyX3Nk
X3Byb2JlX2FzeW5jKzB4MC8weDFkMCByZXR1cm5lZCAwIGFmdGVyIDExMTMzIHVzZWNzClsgICAg
NS4xMTkxNzldIGFzeW5jX2NvbnRpbnVpbmcgQCAxIGFmdGVyIDc2ODMgdXNlYwpbICAgIDUuMTE5
NTEyXSBGcmVlaW5nIHVudXNlZCBrZXJuZWwgbWVtb3J5OiA5MjBrIGZyZWVkClsgICAgNS4xMTk2
ODZdIFdyaXRlIHByb3RlY3RpbmcgdGhlIGtlcm5lbCByZWFkLW9ubHkgZGF0YTogMTIyODhrClsg
ICAgNS4xMjU0NTRdIEZyZWVpbmcgdW51c2VkIGtlcm5lbCBtZW1vcnk6IDE2MDhrIGZyZWVkClsg
ICAgNS4xMjYwMzRdIEZyZWVpbmcgdW51c2VkIGtlcm5lbCBtZW1vcnk6IDEyMDBrIGZyZWVkClsg
ICAgNS4xNTQ5OTddIHVkZXZkWzk4XTogc3RhcnRpbmcgdmVyc2lvbiAxNzUKWyAgICA1LjE4MjYw
MV0gY2FsbGluZyAgeGVuX3BjaWJrX2luaXQrMHgwLzB4NTAgW3hlbl9wY2liYWNrXSBAIDE0Nwpb
ICAgIDUuMTgyNzI5XSBwY2liYWNrIDAwMDA6MDE6MDAuMDogc2VpemluZyBkZXZpY2UKWyAgICA1
LjE4Mjg4NV0geGVuOiByZWdpc3RlcmluZyBnc2kgMTYgdHJpZ2dlcmluZyAwIHBvbGFyaXR5IDEK
WyAgICA1LjE4Mjk4Ml0geGVuX21hcF9waXJxX2dzaTogcmV0dXJuaW5nIGlycSAxNiBmb3IgZ3Np
IDE2ClsgICAgNS4xODMwODhdIHhlbjogLS0+IHBpcnE9MTYgLT4gaXJxPTE2IChnc2k9MTYpClsg
ICAgNS4xODMxODRdIEFscmVhZHkgc2V0dXAgdGhlIEdTSSA6MTYKWyAgICA1LjE4MzI3M10gcGNp
YmFjayAwMDAwOjAxOjAwLjA6IFBDSSBJTlQgQSAtPiBHU0kgMTYgKGxldmVsLCBsb3cpIC0+IElS
USAxNgpbICAgIDUuMTgzMzc4XSBwY2liYWNrIDAwMDA6MDE6MDAuMDogUENJIElOVCBBIGRpc2Fi
bGVkClsgICAgNS4xODcwNDZdIHhlbi1wY2liYWNrOiBiYWNrZW5kIGlzIHBhc3N0aHJvdWdoClsg
ICAgNS4xODcxNTFdIGluaXRjYWxsIHhlbl9wY2lia19pbml0KzB4MC8weDUwIFt4ZW5fcGNpYmFj
a10gcmV0dXJuZWQgMCBhZnRlciA0MzQ1IHVzZWNzClsgICAgNS4xOTQyMTNdIGNhbGxpbmcgIGxp
bmVhcl9pbml0KzB4MC8weDEwMDAgW2xpbmVhcl0gQCAxNjUKWyAgICA1LjE5NDMwMF0gbWQ6IGxp
bmVhciBwZXJzb25hbGl0eSByZWdpc3RlcmVkIGZvciBsZXZlbCAtMQpbICAgIDUuMTk0Mzg0XSBp
bml0Y2FsbCBsaW5lYXJfaW5pdCsweDAvMHgxMDAwIFtsaW5lYXJdIHJldHVybmVkIDAgYWZ0ZXIg
ODEgdXNlY3MKWyAgICA1LjE5OTU3MV0gY2FsbGluZyAgbXVsdGlwYXRoX2luaXQrMHgwLzB4MTAw
MCBbbXVsdGlwYXRoXSBAIDE2OQpbICAgIDUuMTk5NjU5XSBtZDogbXVsdGlwYXRoIHBlcnNvbmFs
aXR5IHJlZ2lzdGVyZWQgZm9yIGxldmVsIC00ClsgICAgNS4xOTk3NDldIGluaXRjYWxsIG11bHRp
cGF0aF9pbml0KzB4MC8weDEwMDAgW211bHRpcGF0aF0gcmV0dXJuZWQgMCBhZnRlciA4NiB1c2Vj
cwpbICAgIDUuMjAzMjg1XSBjYWxsaW5nICByYWlkMF9pbml0KzB4MC8weDEwMDAgW3JhaWQwXSBA
IDE3MQpbICAgIDUuMjAzMzcyXSBtZDogcmFpZDAgcGVyc29uYWxpdHkgcmVnaXN0ZXJlZCBmb3Ig
bGV2ZWwgMApbICAgIDUuMjAzNDYyXSBpbml0Y2FsbCByYWlkMF9pbml0KzB4MC8weDEwMDAgW3Jh
aWQwXSByZXR1cm5lZCAwIGFmdGVyIDg3IHVzZWNzClsgICAgNS4yMDk0MjFdIGNhbGxpbmcgIHJh
aWRfaW5pdCsweDAvMHgxMDAwIFtyYWlkMV0gQCAxNzkKWyAgICA1LjIwOTUxMV0gbWQ6IHJhaWQx
IHBlcnNvbmFsaXR5IHJlZ2lzdGVyZWQgZm9yIGxldmVsIDEKWyAgICA1LjIwOTU5OF0gaW5pdGNh
bGwgcmFpZF9pbml0KzB4MC8weDEwMDAgW3JhaWQxXSByZXR1cm5lZCAwIGFmdGVyIDgzIHVzZWNz
ClsgICAgNS4yMTg0MTNdIGNhbGxpbmcgIGFzeW5jX3R4X2luaXQrMHgwLzB4MTAwMCBbYXN5bmNf
dHhdIEAgMTg2ClsgICAgNS4yMTg1MTldIGFzeW5jX3R4OiBhcGkgaW5pdGlhbGl6ZWQgKGFzeW5j
KQpbICAgIDUuMjE4NjEyXSBpbml0Y2FsbCBhc3luY190eF9pbml0KzB4MC8weDEwMDAgW2FzeW5j
X3R4XSByZXR1cm5lZCAwIGFmdGVyIDg5IHVzZWNzClsgICAgNS4yMTkwMzFdIGNhbGxpbmcgIGlu
aXRfbW9kdWxlKzB4MC8weDEwMDAgW3JhaWQ2X3BxXSBAIDE4NgpbICAgIDUuMjU3MjkyXSB1c2Ig
MS0xLjY6IG5ldyBsb3ctc3BlZWQgVVNCIGRldmljZSBudW1iZXIgNCB1c2luZyBlaGNpX2hjZApb
ICAgIDUuMjY4NzU5XSBjYWxsaW5nICBlMTAwMF9pbml0X21vZHVsZSsweDAvMHgxMDAwIFtlMTAw
MGVdIEAgMTgxClsgICAgNS4yNjg4NDBdIGUxMDAwZTogSW50ZWwoUikgUFJPLzEwMDAgTmV0d29y
ayBEcml2ZXIgLSAxLjUuMS1rClsgICAgNS4yNjg5MjFdIGUxMDAwZTogQ29weXJpZ2h0KGMpIDE5
OTkgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLgpbICAgIDUuMjY5MDMwXSB4ZW46IHJlZ2lzdGVy
aW5nIGdzaSAyMCB0cmlnZ2VyaW5nIDAgcG9sYXJpdHkgMQpbICAgIDUuMjY5MTE3XSB4ZW46IC0t
PiBwaXJxPTIwIC0+IGlycT0yMCAoZ3NpPTIwKQpbICAgIDUuMjY5MjIzXSBlMTAwMGUgMDAwMDow
MDoxOS4wOiBQQ0kgSU5UIEEgLT4gR1NJIDIwIChsZXZlbCwgbG93KSAtPiBJUlEgMjAKWyAgICA1
LjI4NTE0MF0gcmFpZDY6IGludDY0eDEgICAzMDcwIE1CL3MKWyAgICA1LjMxMzI0Nl0gZTEwMDBl
IDAwMDA6MDA6MTkuMDogc2V0dGluZyBsYXRlbmN5IHRpbWVyIHRvIDY0ClsgICAgNS4zNTMxMzdd
IHJhaWQ2OiBpbnQ2NHgyICAgMzc3NSBNQi9zClsgICAgNS4zODI2NzJdIGNhbGxpbmcgIGhpZF9p
bml0KzB4MC8weDYzIFtoaWRdIEAgMjMzClsgICAgNS4zODI3NTddIGluaXRjYWxsIGhpZF9pbml0
KzB4MC8weDYzIFtoaWRdIHJldHVybmVkIDAgYWZ0ZXIgMTcgdXNlY3MKWyAgICA1LjM4MzIzOV0g
Y2FsbGluZyAgaGlkX2luaXQrMHgwLzB4MTAwMCBbdXNiaGlkXSBAIDIzMwpbICAgIDUuMzg1NjMw
XSBtZGFkbTogc2VuZGluZyBpb2N0bCA4MDBjMDkxMCB0byBhIHBhcnRpdGlvbiEKWyAgICA1LjM4
NTY5MV0gbWRhZG06IHNlbmRpbmcgaW9jdGwgODAwYzA5MTAgdG8gYSBwYXJ0aXRpb24hClsgICAg
NS4zODU4MTldIG1kYWRtOiBzZW5kaW5nIGlvY3RsIDEyNjEgdG8gYSBwYXJ0aXRpb24hClsgICAg
NS4zODU4NzhdIG1kYWRtOiBzZW5kaW5nIGlvY3RsIDEyNjEgdG8gYSBwYXJ0aXRpb24hClsgICAg
NS4zODYyNjddIG1kYWRtOiBzZW5kaW5nIGlvY3RsIDEyNjEgdG8gYSBwYXJ0aXRpb24hClsgICAg
NS4zODYzMjhdIG1kYWRtOiBzZW5kaW5nIGlvY3RsIDEyNjEgdG8gYSBwYXJ0aXRpb24hClsgICAg
NS4zODY2MjVdIG1kYWRtOiBzZW5kaW5nIGlvY3RsIDEyNjEgdG8gYSBwYXJ0aXRpb24hClsgICAg
NS4zODY2ODddIG1kYWRtOiBzZW5kaW5nIGlvY3RsIDEyNjEgdG8gYSBwYXJ0aXRpb24hClsgICAg
NS4zODc1MDZdIG1kYWRtOiBzZW5kaW5nIGlvY3RsIDEyNjEgdG8gYSBwYXJ0aXRpb24hClsgICAg
NS4zODc1NjddIG1kYWRtOiBzZW5kaW5nIGlvY3RsIDEyNjEgdG8gYSBwYXJ0aXRpb24hClsgICAg
NS4zODc3NzRdIGlucHV0OiBXaW5ib25kIEVsZWN0cm9uaWNzIENvcnAgSGVybW9uIFVTQiBoaWRt
b3VzZSBEZXZpY2UgYXMgL2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjFhLjAvdXNiMS8xLTEv
MS0xLjIvMS0xLjI6MS4wL2lucHV0L2lucHV0MgpbICAgIDUuMzg4MDUxXSBnZW5lcmljLXVzYiAw
MDAzOjA1NTc6MjIyMS4wMDAxOiBpbnB1dCxoaWRyYXcwOiBVU0IgSElEIHYxLjAwIE1vdXNlIFtX
aW5ib25kIEVsZWN0cm9uaWNzIENvcnAgSGVybW9uIFVTQiBoaWRtb3VzZSBEZXZpY2VdIG9uIHVz
Yi0wMDAwOjAwOjFhLjAtMS4yL2lucHV0MApbICAgIDUuMzg5MzQxXSBpbnB1dDogV2luYm9uZCBF
bGVjdHJvbmljcyBDb3JwIEhlcm1vbiBVU0IgaGlkbW91c2UgRGV2aWNlIGFzIC9kZXZpY2VzL3Bj
aTAwMDA6MDAvMDAwMDowMDoxYS4wL3VzYjEvMS0xLzEtMS4yLzEtMS4yOjEuMS9pbnB1dC9pbnB1
dDMKWyAgICA1LjM4OTU4MV0gZ2VuZXJpYy11c2IgMDAwMzowNTU3OjIyMjEuMDAwMjogaW5wdXQs
aGlkcmF3MTogVVNCIEhJRCB2MS4wMCBLZXlib2FyZCBbV2luYm9uZCBFbGVjdHJvbmljcyBDb3Jw
IEhlcm1vbiBVU0IgaGlkbW91c2UgRGV2aWNlXSBvbiB1c2ItMDAwMDowMDoxYS4wLTEuMi9pbnB1
dDEKWyAgICA1LjM4OTgzM10gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZl
ciB1c2JoaWQKWyAgICA1LjM4OTg5NV0gdXNiaGlkOiBVU0IgSElEIGNvcmUgZHJpdmVyClsgICAg
NS4zODk5NTNdIGluaXRjYWxsIGhpZF9pbml0KzB4MC8weDEwMDAgW3VzYmhpZF0gcmV0dXJuZWQg
MCBhZnRlciA2NDg0IHVzZWNzClsgICAgNS4zOTg4OThdIG1kOiBiaW5kPHNkYjE+ClsgICAgNS40
MjExMzRdIHJhaWQ2OiBpbnQ2NHg0ICAgMzI2NSBNQi9zClsgICAgNS40NjA5NjldIG1kOiBiaW5k
PHNkYzE+ClsgICAgNS40NjUyNjRdIG1kOiBiaW5kPHNkZDE+ClsgICAgNS40NjcwNThdIGJpbzog
Y3JlYXRlIHNsYWIgPGJpby0xPiBhdCAxClsgICAgNS40NjcxNjNdIG1kL3JhaWQxOm1kMDogYWN0
aXZlIHdpdGggMiBvdXQgb2YgMiBtaXJyb3JzClsgICAgNS40NjcyNDJdIG1kMDogZGV0ZWN0ZWQg
Y2FwYWNpdHkgY2hhbmdlIGZyb20gMCB0byAxMDAwMjAyMTc0NDY0ClsgICAgNS40ODMwMDBdICBt
ZDA6IHVua25vd24gcGFydGl0aW9uIHRhYmxlClsgICAgNS40ODkxMzJdIHJhaWQ2OiBpbnQ2NHg4
ICAgMjU5OSBNQi9zClsgICAgNS41MDEyNDddIG1kOiBiaW5kPHNkYTE+ClsgICAgNS41MDMzNTBd
IG1kL3JhaWQxOm1kMTogYWN0aXZlIHdpdGggMiBvdXQgb2YgMiBtaXJyb3JzClsgICAgNS41MDM0
MzNdIG1kMTogZGV0ZWN0ZWQgY2FwYWNpdHkgY2hhbmdlIGZyb20gMCB0byA1MDAxMDU2MjU2MDAK
WyAgICA1LjUyMjE1N10gIG1kMTogdW5rbm93biBwYXJ0aXRpb24gdGFibGUKWyAgICA1LjU1NzEy
OF0gcmFpZDY6IHNzZTJ4MSAgICA4MDgxIE1CL3MKWyAgICA1LjYyMDE3Ml0gZTEwMDBlIDAwMDA6
MDA6MTkuMDogZXRoMDogKFBDSSBFeHByZXNzOjIuNUdUL3M6V2lkdGggeDEpIDAwOjI1OjkwOjU3
OjlkOjVmClsgICAgNS42MjAyNjRdIGUxMDAwZSAwMDAwOjAwOjE5LjA6IGV0aDA6IEludGVsKFIp
IFBSTy8xMDAwIE5ldHdvcmsgQ29ubmVjdGlvbgpbICAgIDUuNjIwMzc5XSBlMTAwMGUgMDAwMDow
MDoxOS4wOiBldGgwOiBNQUM6IDEwLCBQSFk6IDExLCBQQkEgTm86IEZGRkZGRi0wRkYKWyAgICA1
LjYyMDQ1N10gZTEwMDBlIDAwMDA6MDM6MDAuMDogRGlzYWJsaW5nIEFTUE0gTDBzIApbICAgIDUu
NjIwNjEzXSB4ZW46IHJlZ2lzdGVyaW5nIGdzaSAxNiB0cmlnZ2VyaW5nIDAgcG9sYXJpdHkgMQpb
ICAgIDUuNjIwNjc2XSB4ZW5fbWFwX3BpcnFfZ3NpOiByZXR1cm5pbmcgaXJxIDE2IGZvciBnc2kg
MTYKWyAgICA1LjYyMDczNV0geGVuOiAtLT4gcGlycT0xNiAtPiBpcnE9MTYgKGdzaT0xNikKWyAg
ICA1LjYyMDc5M10gQWxyZWFkeSBzZXR1cCB0aGUgR1NJIDoxNgpbICAgIDUuNjIwODQ4XSBlMTAw
MGUgMDAwMDowMzowMC4wOiBQQ0kgSU5UIEEgLT4gR1NJIDE2IChsZXZlbCwgbG93KSAtPiBJUlEg
MTYKWyAgICA1LjYyMDkzM10gZTEwMDBlIDAwMDA6MDM6MDAuMDogc2V0dGluZyBsYXRlbmN5IHRp
bWVyIHRvIDY0ClsgICAgNS42MjUxMzJdIHJhaWQ2OiBzc2UyeDIgICAgOTk1MiBNQi9zClsgICAg
NS42OTMxMzJdIHJhaWQ2OiBzc2UyeDQgICAxMTM4NyBNQi9zClsgICAgNS42OTMyNTldIHJhaWQ2
OiB1c2luZyBhbGdvcml0aG0gc3NlMng0ICgxMTM4NyBNQi9zKQpbICAgIDUuNjkzMzE5XSBpbml0
Y2FsbCBpbml0X21vZHVsZSsweDAvMHgxMDAwIFtyYWlkNl9wcV0gcmV0dXJuZWQgMCBhZnRlciA0
NjMwODggdXNlY3MKWyAgICA1LjY5Mzg2N10gY2FsbGluZyAgY2FsaWJyYXRlX3hvcl9ibG9ja3Mr
MHgwLzB4MTAwMCBbeG9yXSBAIDE4NgpbICAgIDUuNjkzOTI4XSB4b3I6IGF1dG9tYXRpY2FsbHkg
dXNpbmcgYmVzdCBjaGVja3N1bW1pbmcgZnVuY3Rpb246IGdlbmVyaWNfc3NlClsgICAgNS43MTMx
MzFdICAgIGdlbmVyaWNfc3NlOiAgMzYyNS4wMDAgTUIvc2VjClsgICAgNS43MTMxOTZdIHhvcjog
dXNpbmcgZnVuY3Rpb246IGdlbmVyaWNfc3NlICgzNjI1LjAwMCBNQi9zZWMpClsgICAgNS43MTMy
NjJdIGluaXRjYWxsIGNhbGlicmF0ZV94b3JfYmxvY2tzKzB4MC8weDEwMDAgW3hvcl0gcmV0dXJu
ZWQgMCBhZnRlciAxODg4MCB1c2VjcwpbICAgIDUuNzE1MDk4XSBjYWxsaW5nICBhc3luY19wcV9p
bml0KzB4MC8weDEwMDAgW2FzeW5jX3BxXSBAIDE4NgpbICAgIDUuNzE1MTcyXSBpbml0Y2FsbCBh
c3luY19wcV9pbml0KzB4MC8weDEwMDAgW2FzeW5jX3BxXSByZXR1cm5lZCAwIGFmdGVyIDAgdXNl
Y3MKWyAgICA1LjcxNTc1NF0gY2FsbGluZyAgcmFpZDVfaW5pdCsweDAvMHgxMDAwIFtyYWlkNDU2
XSBAIDE4NgpbICAgIDUuNzE1ODI0XSBtZDogcmFpZDYgcGVyc29uYWxpdHkgcmVnaXN0ZXJlZCBm
b3IgbGV2ZWwgNgpbICAgIDUuNzE1ODg4XSBtZDogcmFpZDUgcGVyc29uYWxpdHkgcmVnaXN0ZXJl
ZCBmb3IgbGV2ZWwgNQpbICAgIDUuNzE1OTU5XSBtZDogcmFpZDQgcGVyc29uYWxpdHkgcmVnaXN0
ZXJlZCBmb3IgbGV2ZWwgNApbICAgIDUuNzE2MDI2XSBpbml0Y2FsbCByYWlkNV9pbml0KzB4MC8w
eDEwMDAgW3JhaWQ0NTZdIHJldHVybmVkIDAgYWZ0ZXIgMTk2IHVzZWNzClsgICAgNS43Mjg2OTFd
IGUxMDAwZSAwMDAwOjAzOjAwLjA6IGV0aDE6IChQQ0kgRXhwcmVzczoyLjVHVC9zOldpZHRoIHgx
KSAwMDoyNTo5MDo1Nzo5ZDo1ZQpbICAgIDUuNzI4NzczXSBlMTAwMGUgMDAwMDowMzowMC4wOiBl
dGgxOiBJbnRlbChSKSBQUk8vMTAwMCBOZXR3b3JrIENvbm5lY3Rpb24KWyAgICA1LjcyODkyOF0g
ZTEwMDBlIDAwMDA6MDM6MDAuMDogZXRoMTogTUFDOiAzLCBQSFk6IDgsIFBCQSBObzogRkZGRkZG
LTBGRgpbICAgIDUuNzI5MDA5XSBpbml0Y2FsbCBlMTAwMF9pbml0X21vZHVsZSsweDAvMHgxMDAw
IFtlMTAwMGVdIHJldHVybmVkIDAgYWZ0ZXIgNDQ5Mzc4IHVzZWNzClsgICAgNS43MzMyMTVdIGNh
bGxpbmcgIHJhaWRfaW5pdCsweDAvMHgxMDAwIFtyYWlkMTBdIEAgMjcwClsgICAgNS43MzMyODRd
IG1kOiByYWlkMTAgcGVyc29uYWxpdHkgcmVnaXN0ZXJlZCBmb3IgbGV2ZWwgMTAKWyAgICA1Ljcz
MzM1NF0gaW5pdGNhbGwgcmFpZF9pbml0KzB4MC8weDEwMDAgW3JhaWQxMF0gcmV0dXJuZWQgMCBh
ZnRlciA2NyB1c2VjcwpbICAgIDYuNjI2MDE2XSBnZW5lcmljLXVzYiAwMDAzOjA1MUQ6MDAwMi4w
MDAzOiBoaWRkZXYwLGhpZHJhdzI6IFVTQiBISUQgdjEuMTAgRGV2aWNlIFtBbWVyaWNhbiBQb3dl
ciBDb252ZXJzaW9uIEJhY2stVVBTIEVTIDc1MCBGVzo4NDEuSTIgLkQgVVNCIEZXOkkyIF0gb24g
dXNiLTAwMDA6MDA6MWEuMC0xLjYvaW5wdXQwClsgICAgNi42OTczMDldIHVzYiAyLTEuMTogbmV3
IGZ1bGwtc3BlZWQgVVNCIGRldmljZSBudW1iZXIgMyB1c2luZyBlaGNpX2hjZApbICAgIDYuNzk4
MjM0XSBpbnB1dDogTWljcm9zb2Z0IE1pY3Jvc29mdFx4ZmZmZmZmYzJceGZmZmZmZmFlXHhmZmZm
ZmZhZSBOYW5vIFRyYW5zY2VpdmVyIHYyLjAgYXMgL2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAw
OjFkLjAvdXNiMi8yLTEvMi0xLjEvMi0xLjE6MS4wL2lucHV0L2lucHV0NApbICAgIDYuNzk4NDI5
XSBnZW5lcmljLXVzYiAwMDAzOjA0NUU6MDc0NS4wMDA0OiBpbnB1dCxoaWRyYXczOiBVU0IgSElE
IHYxLjExIEtleWJvYXJkIFtNaWNyb3NvZnQgTWljcm9zb2Z0XHhmZmZmZmZjMlx4ZmZmZmZmYWVc
eGZmZmZmZmFlIE5hbm8gVHJhbnNjZWl2ZXIgdjIuMF0gb24gdXNiLTAwMDA6MDA6MWQuMC0xLjEv
aW5wdXQwClsgICAgNi44MDM5ODNdIGlucHV0OiBNaWNyb3NvZnQgTWljcm9zb2Z0XHhmZmZmZmZj
Mlx4ZmZmZmZmYWVceGZmZmZmZmFlIE5hbm8gVHJhbnNjZWl2ZXIgdjIuMCBhcyAvZGV2aWNlcy9w
Y2kwMDAwOjAwLzAwMDA6MDA6MWQuMC91c2IyLzItMS8yLTEuMS8yLTEuMToxLjEvaW5wdXQvaW5w
dXQ1ClsgICAgNi44MDQyNjVdIGdlbmVyaWMtdXNiIDAwMDM6MDQ1RTowNzQ1LjAwMDU6IGlucHV0
LGhpZHJhdzQ6IFVTQiBISUQgdjEuMTEgTW91c2UgW01pY3Jvc29mdCBNaWNyb3NvZnRceGZmZmZm
ZmMyXHhmZmZmZmZhZVx4ZmZmZmZmYWUgTmFubyBUcmFuc2NlaXZlciB2Mi4wXSBvbiB1c2ItMDAw
MDowMDoxZC4wLTEuMS9pbnB1dDEKWyAgICA2LjgxOTc0M10gaW5wdXQ6IE1pY3Jvc29mdCBNaWNy
b3NvZnRceGZmZmZmZmMyXHhmZmZmZmZhZVx4ZmZmZmZmYWUgTmFubyBUcmFuc2NlaXZlciB2Mi4w
IGFzIC9kZXZpY2VzL3BjaTAwMDA6MDAvMDAwMDowMDoxZC4wL3VzYjIvMi0xLzItMS4xLzItMS4x
OjEuMi9pbnB1dC9pbnB1dDYKWyAgICA2LjgyMDAwM10gZ2VuZXJpYy11c2IgMDAwMzowNDVFOjA3
NDUuMDAwNjogaW5wdXQsaGlkZGV2MCxoaWRyYXc1OiBVU0IgSElEIHYxLjExIERldmljZSBbTWlj
cm9zb2Z0IE1pY3Jvc29mdFx4ZmZmZmZmYzJceGZmZmZmZmFlXHhmZmZmZmZhZSBOYW5vIFRyYW5z
Y2VpdmVyIHYyLjBdIG9uIHVzYi0wMDAwOjAwOjFkLjAtMS4xL2lucHV0MgpbICAgIDYuODg5MzA3
XSB1c2IgMi0xLjM6IG5ldyBsb3ctc3BlZWQgVVNCIGRldmljZSBudW1iZXIgNCB1c2luZyBlaGNp
X2hjZApbICAgIDYuOTkyMjEzXSBpbnB1dDogTG9naXRlY2ggVVNCIFJlY2VpdmVyIGFzIC9kZXZp
Y2VzL3BjaTAwMDA6MDAvMDAwMDowMDoxZC4wL3VzYjIvMi0xLzItMS4zLzItMS4zOjEuMC9pbnB1
dC9pbnB1dDcKWyAgICA2Ljk5MjQzOV0gZ2VuZXJpYy11c2IgMDAwMzowNDZEOkM1MDguMDAwNzog
aW5wdXQsaGlkcmF3NjogVVNCIEhJRCB2MS4xMCBNb3VzZSBbTG9naXRlY2ggVVNCIFJlY2VpdmVy
XSBvbiB1c2ItMDAwMDowMDoxZC4wLTEuMy9pbnB1dDAKWyAgICA3LjA2MTMwMl0gdXNiIDItMS40
OiBuZXcgbG93LXNwZWVkIFVTQiBkZXZpY2UgbnVtYmVyIDUgdXNpbmcgZWhjaV9oY2QKWyAgICA3
LjE3MjY3NF0gaW5wdXQ6IEhJRCAwNGQ5OjEyMDMgYXMgL2RldmljZXMvcGNpMDAwMDowMC8wMDAw
OjAwOjFkLjAvdXNiMi8yLTEvMi0xLjQvMi0xLjQ6MS4wL2lucHV0L2lucHV0OApbICAgIDcuMTcy
ODY5XSBnZW5lcmljLXVzYiAwMDAzOjA0RDk6MTIwMy4wMDA4OiBpbnB1dCxoaWRyYXc3OiBVU0Ig
SElEIHYxLjExIEtleWJvYXJkIFtISUQgMDRkOToxMjAzXSBvbiB1c2ItMDAwMDowMDoxZC4wLTEu
NC9pbnB1dDAKWyAgICA3LjE4ODEwM10gaW5wdXQ6IEhJRCAwNGQ5OjEyMDMgYXMgL2RldmljZXMv
cGNpMDAwMDowMC8wMDAwOjAwOjFkLjAvdXNiMi8yLTEvMi0xLjQvMi0xLjQ6MS4xL2lucHV0L2lu
cHV0OQpbICAgIDcuMTg4MzA5XSBnZW5lcmljLXVzYiAwMDAzOjA0RDk6MTIwMy4wMDA5OiBpbnB1
dCxoaWRyYXc4OiBVU0IgSElEIHYxLjExIERldmljZSBbSElEIDA0ZDk6MTIwM10gb24gdXNiLTAw
MDA6MDA6MWQuMC0xLjQvaW5wdXQxClsgICAgNy4yNTcyNzBdIHVzYiAyLTEuNTogbmV3IGhpZ2gt
c3BlZWQgVVNCIGRldmljZSBudW1iZXIgNiB1c2luZyBlaGNpX2hjZApbICAgIDcuNTQwNzYwXSBj
YWxsaW5nICB1c2Jfc3Rvcl9pbml0KzB4MC8weDEwMDAgW3VzYl9zdG9yYWdlXSBAIDQ2MwpbICAg
IDcuNTQwODQ4XSBJbml0aWFsaXppbmcgVVNCIE1hc3MgU3RvcmFnZSBkcml2ZXIuLi4KWyAgICA3
LjU0MTAwNV0gc2NzaTYgOiB1c2Itc3RvcmFnZSAyLTEuNToxLjAKWyAgICA3LjU0MTE0NF0gdXNi
Y29yZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciB1c2Itc3RvcmFnZQpbICAgIDcu
NTQxMjI2XSBVU0IgTWFzcyBTdG9yYWdlIHN1cHBvcnQgcmVnaXN0ZXJlZC4KWyAgICA3LjU0MTMx
MF0gaW5pdGNhbGwgdXNiX3N0b3JfaW5pdCsweDAvMHgxMDAwIFt1c2Jfc3RvcmFnZV0gcmV0dXJu
ZWQgMCBhZnRlciA0NDggdXNlY3MKWyAgICA3LjU0MTQ1NF0gY2FsbGluZyAgdWFzX2luaXQrMHgw
LzB4MzAgW3Vhc10gQCA0NjQKWyAgICA3LjU0MTY5NV0gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcg
aW50ZXJmYWNlIGRyaXZlciB1YXMKWyAgICA3LjU0MTc4MV0gaW5pdGNhbGwgdWFzX2luaXQrMHgw
LzB4MzAgW3Vhc10gcmV0dXJuZWQgMCBhZnRlciAyMzQgdXNlY3MKWyAgICA4LjA0NjA3OV0gRVhU
NC1mcyAoZG0tMjcpOiBtb3VudGVkIGZpbGVzeXN0ZW0gd2l0aCBvcmRlcmVkIGRhdGEgbW9kZS4g
T3B0czogKG51bGwpClsgICAgOC44OTgzMjBdIHNjc2kgNjowOjA6MDogRGlyZWN0LUFjY2VzcyAg
ICAgR2VuZXJpYyAgQ29tcGFjdCBGbGFzaCAgICAwLjAwIFBROiAwIEFOU0k6IDIKWyAgICA4Ljg5
ODg5N10gc2NzaSA2OjA6MDoxOiBEaXJlY3QtQWNjZXNzICAgICBHZW5lcmljICBTTS94RC1QaWN0
dXJlICAgIDAuMDAgUFE6IDAgQU5TSTogMgpbICAgIDguODk5NDI2XSBzY3NpIDY6MDowOjI6IERp
cmVjdC1BY2Nlc3MgICAgIEdlbmVyaWMgIFNEWEMvTU1DICAgICAgICAgMC4wMCBQUTogMCBBTlNJ
OiAyClsgICAgOC45MDAwNDNdIHNjc2kgNjowOjA6MzogRGlyZWN0LUFjY2VzcyAgICAgR2VuZXJp
YyAgTVMvTVMtUHJvL0hHICAgICAwLjAwIFBROiAwIEFOU0k6IDIKWyAgICA4LjkwMDY3NV0gc2Nz
aSA2OjA6MDo0OiBEaXJlY3QtQWNjZXNzICAgICBHZW5lcmljICBTRC9NTUMvTVMvTVNQUk8gIDAu
MDAgUFE6IDAgQU5TSTogMgpbICAgIDguOTAxMjY0XSBzZCA2OjA6MDowOiBBdHRhY2hlZCBzY3Np
IGdlbmVyaWMgc2c2IHR5cGUgMApbICAgIDguOTAxNzczXSBzZCA2OjA6MDowOiBbc2RmXSA3ODEz
MTIwIDUxMi1ieXRlIGxvZ2ljYWwgYmxvY2tzOiAoNC4wMCBHQi8zLjcyIEdpQikKWyAgICA4Ljkw
MjI3Ml0gc2QgNjowOjA6MDogW3NkZl0gV3JpdGUgUHJvdGVjdCBpcyBvZmYKWyAgICA4LjkwMjI3
NF0gc2QgNjowOjA6MDogW3NkZl0gTW9kZSBTZW5zZTogMDMgMDAgMDAgMDAKWyAgICA4LjkwMjc3
Nl0gc2QgNjowOjA6MDogW3NkZl0gTm8gQ2FjaGluZyBtb2RlIHBhZ2UgcHJlc2VudApbICAgIDgu
OTAyNzc3XSBzZCA2OjA6MDowOiBbc2RmXSBBc3N1bWluZyBkcml2ZSBjYWNoZTogd3JpdGUgdGhy
b3VnaApbICAgIDguOTAzMzAwXSBzZCA2OjA6MDoxOiBBdHRhY2hlZCBzY3NpIGdlbmVyaWMgc2c3
IHR5cGUgMApbICAgIDguOTAzNDc2XSBzZCA2OjA6MDoyOiBBdHRhY2hlZCBzY3NpIGdlbmVyaWMg
c2c4IHR5cGUgMApbICAgIDguOTAzNjU1XSBzZCA2OjA6MDozOiBBdHRhY2hlZCBzY3NpIGdlbmVy
aWMgc2c5IHR5cGUgMApbICAgIDguOTAzODMwXSBzZCA2OjA6MDo0OiBBdHRhY2hlZCBzY3NpIGdl
bmVyaWMgc2cxMCB0eXBlIDAKWyAgICA4LjkwOTAzNF0gc2QgNjowOjA6MTogW3NkZ10gQXR0YWNo
ZWQgU0NTSSByZW1vdmFibGUgZGlzawpbICAgIDguOTEwMDMyXSBzZCA2OjA6MDoyOiBbc2RoXSBB
dHRhY2hlZCBTQ1NJIHJlbW92YWJsZSBkaXNrClsgICAgOC45MTA2NjBdIHNkIDY6MDowOjM6IFtz
ZGldIEF0dGFjaGVkIFNDU0kgcmVtb3ZhYmxlIGRpc2sKWyAgICA4LjkxMjU2NF0gc2QgNjowOjA6
NDogW3Nkal0gQXR0YWNoZWQgU0NTSSByZW1vdmFibGUgZGlzawpbICAgIDguOTEzMDM5XSBzZCA2
OjA6MDowOiBbc2RmXSBObyBDYWNoaW5nIG1vZGUgcGFnZSBwcmVzZW50ClsgICAgOC45MTMxMzBd
IHNkIDY6MDowOjA6IFtzZGZdIEFzc3VtaW5nIGRyaXZlIGNhY2hlOiB3cml0ZSB0aHJvdWdoClsg
ICAgOC45MTM5MjZdICBzZGY6IHNkZjEKWyAgICA4LjkxNTkxOF0gc2QgNjowOjA6MDogW3NkZl0g
Tm8gQ2FjaGluZyBtb2RlIHBhZ2UgcHJlc2VudApbICAgIDguOTE2MDExXSBzZCA2OjA6MDowOiBb
c2RmXSBBc3N1bWluZyBkcml2ZSBjYWNoZTogd3JpdGUgdGhyb3VnaApbICAgIDguOTE2MDg2XSBz
ZCA2OjA6MDowOiBbc2RmXSBBdHRhY2hlZCBTQ1NJIHJlbW92YWJsZSBkaXNrClsgICAxMS43OTM2
NzRdIEFERFJDT05GKE5FVERFVl9VUCk6IGV0aDA6IGxpbmsgaXMgbm90IHJlYWR5ClsgICAxMS43
OTM2ODJdIEFERFJDT05GKE5FVERFVl9VUCk6IGV0aDE6IGxpbmsgaXMgbm90IHJlYWR5ClsgICAx
MS44MDE2OTFdIHVkZXZkWzcxNV06IHN0YXJ0aW5nIHZlcnNpb24gMTc1ClsgICAxMS44MzE1NTdd
IGNhbGxpbmcgIHBhcnBvcnRfZGVmYXVsdF9wcm9jX3JlZ2lzdGVyKzB4MC8weDEwMDAgW3BhcnBv
cnRdIEAgNzI3ClsgICAxMS44MzE1NzRdIGluaXRjYWxsIHBhcnBvcnRfZGVmYXVsdF9wcm9jX3Jl
Z2lzdGVyKzB4MC8weDEwMDAgW3BhcnBvcnRdIHJldHVybmVkIDAgYWZ0ZXIgMTEgdXNlY3MKWyAg
IDExLjgzMTgwMF0gY2FsbGluZyAgbHBfaW5pdF9tb2R1bGUrMHgwLzB4ZTU3IFtscF0gQCA3MjcK
WyAgIDExLjgzODk0MF0gQWRkaW5nIDgzODg2MDRrIHN3YXAgb24gL2Rldi9tYXBwZXIvVlN5c3Rl
bTAxLWx2U3dhcDhHQi4gIFByaW9yaXR5Oi0xIGV4dGVudHM6MSBhY3Jvc3M6ODM4ODYwNGsgClsg
ICAxMS44NTQ3NzRdIGxwOiBkcml2ZXIgbG9hZGVkIGJ1dCBubyBkZXZpY2VzIGZvdW5kClsgICAx
MS44NTQ3ODBdIGluaXRjYWxsIGxwX2luaXRfbW9kdWxlKzB4MC8weGU1NyBbbHBdIHJldHVybmVk
IDAgYWZ0ZXIgMjI0MzYgdXNlY3MKWyAgIDExLjg1ODE5MF0gY2FsbGluZyAgZXZ0Y2huX2luaXQr
MHgwLzB4MTAwMCBbeGVuX2V2dGNobl0gQCA3NDYKWyAgIDExLjg1ODI1NV0gRXZlbnQtY2hhbm5l
bCBkZXZpY2UgaW5zdGFsbGVkLgpbICAgMTEuODU4MjU5XSBpbml0Y2FsbCBldnRjaG5faW5pdCsw
eDAvMHgxMDAwIFt4ZW5fZXZ0Y2huXSByZXR1cm5lZCAwIGFmdGVyIDYzIHVzZWNzClsgICAxMS44
NTk5ODZdIGNhbGxpbmcgIGdudGRldl9pbml0KzB4MC8weDEwMDAgW3hlbl9nbnRkZXZdIEAgNzQ3
ClsgICAxMS44NjAwMjldIGluaXRjYWxsIGdudGRldl9pbml0KzB4MC8weDEwMDAgW3hlbl9nbnRk
ZXZdIHJldHVybmVkIDAgYWZ0ZXIgMzggdXNlY3MKWyAgIDExLjg2MTg1OV0gY2FsbGluZyAgbmV0
YmFja19pbml0KzB4MC8weDEwMDAgW3hlbl9uZXRiYWNrXSBAIDc0OApbICAgMTEuODY5MTYwXSBp
bml0Y2FsbCBuZXRiYWNrX2luaXQrMHgwLzB4MTAwMCBbeGVuX25ldGJhY2tdIHJldHVybmVkIDAg
YWZ0ZXIgNzEyNCB1c2VjcwpbICAgMTEuODcxMDQyXSBjYWxsaW5nICB4ZW5fYmxraWZfaW5pdCsw
eDAvMHgyM2UgW3hlbl9ibGtiYWNrXSBAIDc1OQpbICAgMTEuODcxMzk3XSBpbml0Y2FsbCB4ZW5f
YmxraWZfaW5pdCsweDAvMHgyM2UgW3hlbl9ibGtiYWNrXSByZXR1cm5lZCAwIGFmdGVyIDM0MiB1
c2VjcwpbICAgMTEuODc0NzI5XSBjYWxsaW5nICB4ZW5mc19pbml0KzB4MC8weDEwMDAgW3hlbmZz
XSBAIDc2MgpbICAgMTEuODc0NzM1XSBpbml0Y2FsbCB4ZW5mc19pbml0KzB4MC8weDEwMDAgW3hl
bmZzXSByZXR1cm5lZCAwIGFmdGVyIDIgdXNlY3MKWyAgIDExLjg4OTg5MV0gY2FsbGluZyAgbWFj
X2hpZF9pbml0KzB4MC8weDEwMDAgW21hY19oaWRdIEAgNzUzClsgICAxMS44ODk5MTFdIGluaXRj
YWxsIG1hY19oaWRfaW5pdCsweDAvMHgxMDAwIFttYWNfaGlkXSByZXR1cm5lZCAwIGFmdGVyIDE0
IHVzZWNzClsgICAxMS44OTg3NDBdIGNhbGxpbmcgIGpveWRldl9pbml0KzB4MC8weDEwMDAgW2pv
eWRldl0gQCA3NzUKWyAgIDExLjg5OTc4N10gaW5pdGNhbGwgam95ZGV2X2luaXQrMHgwLzB4MTAw
MCBbam95ZGV2XSByZXR1cm5lZCAwIGFmdGVyIDEwMTcgdXNlY3MKWyAgIDExLjk3ODMyOF0gdHlw
ZT0xNDAwIGF1ZGl0KDEzMzQxNjg5NzIuMDg3OjIpOiBhcHBhcm1vcj0iU1RBVFVTIiBvcGVyYXRp
b249InByb2ZpbGVfbG9hZCIgbmFtZT0iL3NiaW4vZGhjbGllbnQiIHBpZD04MjAgY29tbT0iYXBw
YXJtb3JfcGFyc2VyIgpbICAgMTEuOTc4NTgyXSB0eXBlPTE0MDAgYXVkaXQoMTMzNDE2ODk3Mi4w
ODc6Myk6IGFwcGFybW9yPSJTVEFUVVMiIG9wZXJhdGlvbj0icHJvZmlsZV9sb2FkIiBuYW1lPSIv
dXNyL2xpYi9OZXR3b3JrTWFuYWdlci9ubS1kaGNwLWNsaWVudC5hY3Rpb24iIHBpZD04MjAgY29t
bT0iYXBwYXJtb3JfcGFyc2VyIgpbICAgMTEuOTc4NzI0XSB0eXBlPTE0MDAgYXVkaXQoMTMzNDE2
ODk3Mi4wODc6NCk6IGFwcGFybW9yPSJTVEFUVVMiIG9wZXJhdGlvbj0icHJvZmlsZV9sb2FkIiBu
YW1lPSIvdXNyL2xpYi9jb25ubWFuL3NjcmlwdHMvZGhjbGllbnQtc2NyaXB0IiBwaWQ9ODIwIGNv
bW09ImFwcGFybW9yX3BhcnNlciIKWyAgIDEyLjA0ODg5OF0gY2FsbGluZyAgc2VyaW9fcmF3X2lu
aXQrMHgwLzB4MTAwMCBbc2VyaW9fcmF3XSBAIDg3OApbICAgMTIuMDQ5NDM1XSBpbml0Y2FsbCBz
ZXJpb19yYXdfaW5pdCsweDAvMHgxMDAwIFtzZXJpb19yYXddIHJldHVybmVkIDAgYWZ0ZXIgNTE4
IHVzZWNzClsgICAxMi4wNjk2MjNdIGNhbGxpbmcgIHBzbW91c2VfaW5pdCsweDAvMHg3ZSBbcHNt
b3VzZV0gQCA4NzkKWyAgIDEyLjA3MTc1NF0gaW5pdGNhbGwgcHNtb3VzZV9pbml0KzB4MC8weDdl
IFtwc21vdXNlXSByZXR1cm5lZCAwIGFmdGVyIDIwNzQgdXNlY3MKWyAgIDEyLjE3NjYxNV0gY2Fs
bGluZyAgYnJfaW5pdCsweDAvMHhiZCBbYnJpZGdlXSBAIDk3MApbICAgMTIuMTc2NjU0XSBCcmlk
Z2UgZmlyZXdhbGxpbmcgcmVnaXN0ZXJlZApbICAgMTIuMjA2MjMyXSBBRERSQ09ORihORVRERVZf
VVApOiBldGgwOiBsaW5rIGlzIG5vdCByZWFkeQpbICAgMTIuMjA2NTYwXSBpbml0Y2FsbCBicl9p
bml0KzB4MC8weGJkIFticmlkZ2VdIHJldHVybmVkIDAgYWZ0ZXIgMjkyMzQgdXNlY3MKWyAgIDEy
LjI1MDc3NF0gZGV2aWNlIGV0aDEgZW50ZXJlZCBwcm9taXNjdW91cyBtb2RlClsgICAxMi4zODYz
MjFdIHNjc2lfdmVyaWZ5X2Jsa19pb2N0bDogMTAyIGNhbGxiYWNrcyBzdXBwcmVzc2VkClsgICAx
Mi4zODYzMjVdIG1kYWRtOiBzZW5kaW5nIGlvY3RsIDEyNjEgdG8gYSBwYXJ0aXRpb24hClsgICAx
Mi4zODYzMjldIG1kYWRtOiBzZW5kaW5nIGlvY3RsIDEyNjEgdG8gYSBwYXJ0aXRpb24hClsgICAx
Mi4zOTYzOTFdIEFERFJDT05GKE5FVERFVl9VUCk6IGV0aDE6IGxpbmsgaXMgbm90IHJlYWR5Clsg
ICAxMi4zOTgzOTBdIG1kYWRtOiBzZW5kaW5nIGlvY3RsIDEyNjEgdG8gYSBwYXJ0aXRpb24hClsg
ICAxMi4zOTgzOTNdIG1kYWRtOiBzZW5kaW5nIGlvY3RsIDEyNjEgdG8gYSBwYXJ0aXRpb24hClsg
ICAxMi40MjQwNDZdIEFERFJDT05GKE5FVERFVl9VUCk6IGJyMDogbGluayBpcyBub3QgcmVhZHkK
WyAgIDE0LjczNzI5NF0gY2FsbGluZyAgdmVzYWZiX2luaXQrMHgwLzB4ODRhIFt2ZXNhZmJdIEAg
MTMzOApbICAgMTQuNzM3MzUzXSBpbml0Y2FsbCB2ZXNhZmJfaW5pdCsweDAvMHg4NGEgW3Zlc2Fm
Yl0gcmV0dXJuZWQgLTE5IGFmdGVyIDUzIHVzZWNzClsgICAxNC43NTM4NDhdIGluaXQ6IHVkZXYt
ZmFsbGJhY2stZ3JhcGhpY3MgbWFpbiBwcm9jZXNzICgxMzM3KSB0ZXJtaW5hdGVkIHdpdGggc3Rh
dHVzIDEKWyAgIDE1LjA5NjU2OF0gRVhUNC1mcyAoZG0tMjcpOiByZS1tb3VudGVkLiBPcHRzOiBl
cnJvcnM9cmVtb3VudC1ybwpbICAgMTUuMTg5NTQ4XSBram91cm5hbGQgc3RhcnRpbmcuICBDb21t
aXQgaW50ZXJ2YWwgNSBzZWNvbmRzClsgICAxNS4yMTUzNjFdIEVYVDMtZnMgKHNkZjEpOiB1c2lu
ZyBpbnRlcm5hbCBqb3VybmFsClsgICAxNS4yMTUzNjhdIEVYVDMtZnMgKHNkZjEpOiBtb3VudGVk
IGZpbGVzeXN0ZW0gd2l0aCBvcmRlcmVkIGRhdGEgbW9kZQpbICAgMTUuMjY0OTA5XSBpbml0OiBm
bHVzaC1lYXJseS1qb2ItbG9nIG1haW4gcHJvY2VzcyAoMTM4MSkgdGVybWluYXRlZCB3aXRoIHN0
YXR1cyAxClsgICAxNS4yNzI3ODBdIGluaXQ6IGZhaWxzYWZlIG1haW4gcHJvY2VzcyAoMTM3OCkg
a2lsbGVkIGJ5IFRFUk0gc2lnbmFsClsgICAxNS4zNDY5NTRdIHR5cGU9MTQwMCBhdWRpdCgxMzM0
MTY4OTc1LjQ1NTo1KTogYXBwYXJtb3I9IlNUQVRVUyIgb3BlcmF0aW9uPSJwcm9maWxlX2xvYWQi
IG5hbWU9Ii91c3Ivc2Jpbi9uYW1lZCIgcGlkPTE0NDEgY29tbT0iYXBwYXJtb3JfcGFyc2VyIgpb
ICAgMTUuMzQ5ODc1XSB0eXBlPTE0MDAgYXVkaXQoMTMzNDE2ODk3NS40NTk6Nik6IGFwcGFybW9y
PSJTVEFUVVMiIG9wZXJhdGlvbj0icHJvZmlsZV9yZXBsYWNlIiBuYW1lPSIvc2Jpbi9kaGNsaWVu
dCIgcGlkPTE0NDAgY29tbT0iYXBwYXJtb3JfcGFyc2VyIgpbICAgMTUuMzUwMTU0XSB0eXBlPTE0
MDAgYXVkaXQoMTMzNDE2ODk3NS40NTk6Nyk6IGFwcGFybW9yPSJTVEFUVVMiIG9wZXJhdGlvbj0i
cHJvZmlsZV9yZXBsYWNlIiBuYW1lPSIvdXNyL2xpYi9OZXR3b3JrTWFuYWdlci9ubS1kaGNwLWNs
aWVudC5hY3Rpb24iIHBpZD0xNDQwIGNvbW09ImFwcGFybW9yX3BhcnNlciIKWyAgIDE1LjM1MDMw
MF0gdHlwZT0xNDAwIGF1ZGl0KDEzMzQxNjg5NzUuNDU5OjgpOiBhcHBhcm1vcj0iU1RBVFVTIiBv
cGVyYXRpb249InByb2ZpbGVfcmVwbGFjZSIgbmFtZT0iL3Vzci9saWIvY29ubm1hbi9zY3JpcHRz
L2RoY2xpZW50LXNjcmlwdCIgcGlkPTE0NDAgY29tbT0iYXBwYXJtb3JfcGFyc2VyIgpbICAgMTUu
MzUzMTc4XSB0eXBlPTE0MDAgYXVkaXQoMTMzNDE2ODk3NS40NjM6OSk6IGFwcGFybW9yPSJTVEFU
VVMiIG9wZXJhdGlvbj0icHJvZmlsZV9sb2FkIiBuYW1lPSIvdXNyL3NiaW4vdGNwZHVtcCIgcGlk
PTE0NDMgY29tbT0iYXBwYXJtb3JfcGFyc2VyIgpbICAgMTUuNzk5MDY3XSBlMTAwMGU6IGV0aDAg
TklDIExpbmsgaXMgVXAgMTAwMCBNYnBzIEZ1bGwgRHVwbGV4LCBGbG93IENvbnRyb2w6IFJ4L1R4
ClsgICAxNS43OTk4OTddIEFERFJDT05GKE5FVERFVl9DSEFOR0UpOiBldGgwOiBsaW5rIGJlY29t
ZXMgcmVhZHkKWyAgIDE1LjgxMDI0MV0gZTEwMDBlOiBldGgxIE5JQyBMaW5rIGlzIFVwIDEwMDAg
TWJwcyBGdWxsIER1cGxleCwgRmxvdyBDb250cm9sOiBSeC9UeApbICAgMTUuODExMTYzXSBBRERS
Q09ORihORVRERVZfQ0hBTkdFKTogZXRoMTogbGluayBiZWNvbWVzIHJlYWR5ClsgICAxNS44MTEy
ODZdIGJyMDogdG9wb2xvZ3kgY2hhbmdlIGRldGVjdGVkLCBwcm9wYWdhdGluZwpbICAgMTUuODEx
Mjg5XSBicjA6IHBvcnQgMShldGgxKSBlbnRlcmluZyBmb3J3YXJkaW5nIHN0YXRlClsgICAxNS44
MTEyOTNdIGJyMDogcG9ydCAxKGV0aDEpIGVudGVyaW5nIGZvcndhcmRpbmcgc3RhdGUKWyAgIDE1
LjgxMjA3Nl0gQUREUkNPTkYoTkVUREVWX0NIQU5HRSk6IGJyMDogbGluayBiZWNvbWVzIHJlYWR5
ClsgICAxNi4wMzk3OTFdIFhFTkJVUzogVW5hYmxlIHRvIHJlYWQgY3B1IHN0YXRlClsgICAxNi4w
Mzk5OTNdIFhFTkJVUzogVW5hYmxlIHRvIHJlYWQgY3B1IHN0YXRlClsgICAxOC4zMzc4NjldIGlu
aXQ6IHBseW1vdXRoLXVwc3RhcnQtYnJpZGdlIG1haW4gcHJvY2VzcyAoMTQxMykga2lsbGVkIGJ5
IFRFUk0gc2lnbmFsClsgICAyNi4wNjUxMjddIGJyMDogbm8gSVB2NiByb3V0ZXJzIHByZXNlbnQK
WyAgIDI2LjY0MTEyOV0gZXRoMDogbm8gSVB2NiByb3V0ZXJzIHByZXNlbnQKWyAgMzIyLjkzMjIx
Ml0gZGV2aWNlIHZpZjEuMCBlbnRlcmVkIHByb21pc2N1b3VzIG1vZGUKWyAgMzIyLjkzNTA0Ml0g
QUREUkNPTkYoTkVUREVWX1VQKTogdmlmMS4wOiBsaW5rIGlzIG5vdCByZWFkeQpbICAzMjIuOTkx
NTU0XSBjYWxsaW5nICB4dF9pbml0KzB4MC8weDEwMDAgW3hfdGFibGVzXSBAIDI5MDUKWyAgMzIy
Ljk5MTU2MF0gaW5pdGNhbGwgeHRfaW5pdCsweDAvMHgxMDAwIFt4X3RhYmxlc10gcmV0dXJuZWQg
MCBhZnRlciAxIHVzZWNzClsgIDMyMy4wMDA2ODJdIGNhbGxpbmcgIGlwX3RhYmxlc19pbml0KzB4
MC8weDEwMDAgW2lwX3RhYmxlc10gQCAyOTA1ClsgIDMyMy4wMDA2OTFdIGlwX3RhYmxlczogKEMp
IDIwMDAtMjAwNiBOZXRmaWx0ZXIgQ29yZSBUZWFtClsgIDMyMy4wMDA2OTRdIGluaXRjYWxsIGlw
X3RhYmxlc19pbml0KzB4MC8weDEwMDAgW2lwX3RhYmxlc10gcmV0dXJuZWQgMCBhZnRlciA4IHVz
ZWNzClsgIDMyMy4wMDI5ODNdIGNhbGxpbmcgIGlwdGFibGVfZmlsdGVyX2luaXQrMHgwLzB4MTAw
MCBbaXB0YWJsZV9maWx0ZXJdIEAgMjkyOApbICAzMjMuMDAyOTkzXSBpbml0Y2FsbCBpcHRhYmxl
X2ZpbHRlcl9pbml0KzB4MC8weDEwMDAgW2lwdGFibGVfZmlsdGVyXSByZXR1cm5lZCAwIGFmdGVy
IDUgdXNlY3MKWyAgMzIzLjAzMzc5NV0gY2FsbGluZyAgcGh5c2Rldl9tdF9pbml0KzB4MC8weDEw
MDAgW3h0X3BoeXNkZXZdIEAgMjkzNQpbICAzMjMuMDMzNzk5XSBpbml0Y2FsbCBwaHlzZGV2X210
X2luaXQrMHgwLzB4MTAwMCBbeHRfcGh5c2Rldl0gcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzClsg
IDMyNC4wMDc3NTFdIGRldmljZSB0YXAxLjAgZW50ZXJlZCBwcm9taXNjdW91cyBtb2RlClsgIDMy
NC4wMDc3NzddIGJyMDogdG9wb2xvZ3kgY2hhbmdlIGRldGVjdGVkLCBwcm9wYWdhdGluZwpbICAz
MjQuMDA3NzgwXSBicjA6IHBvcnQgMyh0YXAxLjApIGVudGVyaW5nIGZvcndhcmRpbmcgc3RhdGUK
WyAgMzI0LjAwNzc4M10gYnIwOiBwb3J0IDModGFwMS4wKSBlbnRlcmluZyBmb3J3YXJkaW5nIHN0
YXRlClsgIDMyNC4wNTYwNzRdIGJyMDogcG9ydCAzKHRhcDEuMCkgZW50ZXJpbmcgZm9yd2FyZGlu
ZyBzdGF0ZQpbICAzMjQuMDYyNDE2XSBicjA6IHRvcG9sb2d5IGNoYW5nZSBkZXRlY3RlZCwgcHJv
cGFnYXRpbmcKWyAgMzI0LjA2MjQyMF0gYnIwOiBwb3J0IDModGFwMS4wKSBlbnRlcmluZyBmb3J3
YXJkaW5nIHN0YXRlClsgIDMyNC4wNjI0MjNdIGJyMDogcG9ydCAzKHRhcDEuMCkgZW50ZXJpbmcg
Zm9yd2FyZGluZyBzdGF0ZQpbICAzMzQuODE3MTMyXSB0YXAxLjA6IG5vIElQdjYgcm91dGVycyBw
cmVzZW50ClsgIDg3Mi4xMTgyODFdIHFlbXUtZG06IHNlbmRpbmcgaW9jdGwgMTI2MSB0byBhIHBh
cnRpdGlvbiEKWyAgODcyLjEyMTUzNF0gYnIwOiBwb3J0IDModGFwMS4wKSBlbnRlcmluZyBmb3J3
YXJkaW5nIHN0YXRlClsgIDg3Mi4xMjYyOTRdIGJyMDogcG9ydCAzKHRhcDEuMCkgZW50ZXJpbmcg
ZGlzYWJsZWQgc3RhdGUKWyAgODcyLjEyNjMzOF0gYnIwOiBwb3J0IDModGFwMS4wKSBlbnRlcmlu
ZyBkaXNhYmxlZCBzdGF0ZQpbICA4NzMuNzUzNTEzXSB4ZW4tYmxrYmFjazpyaW5nLXJlZiA4LCBl
dmVudC1jaGFubmVsIDUsIHByb3RvY29sIDEgKHg4Nl82NC1hYmkpClsgIDkwOC42NDc1MjddIEFE
RFJDT05GKE5FVERFVl9DSEFOR0UpOiB2aWYxLjA6IGxpbmsgYmVjb21lcyByZWFkeQpbICA5MDgu
NjQ3NTU1XSBicjA6IHRvcG9sb2d5IGNoYW5nZSBkZXRlY3RlZCwgcHJvcGFnYXRpbmcKWyAgOTA4
LjY0NzU1OF0gYnIwOiBwb3J0IDIodmlmMS4wKSBlbnRlcmluZyBmb3J3YXJkaW5nIHN0YXRlClsg
IDkwOC42NDc1NjFdIGJyMDogcG9ydCAyKHZpZjEuMCkgZW50ZXJpbmcgZm9yd2FyZGluZyBzdGF0
ZQpbICA5MTkuMDczMTI4XSB2aWYxLjA6IG5vIElQdjYgcm91dGVycyBwcmVzZW50Cg==
--485b393aaadf88221704bd6c92bc
Content-Type: text/plain; charset=US-ASCII; name="dom0_lspci.txt"
Content-Disposition: attachment; filename="dom0_lspci.txt"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h0wso6ey1

MDA6MDAuMCBIb3N0IGJyaWRnZTogSW50ZWwgQ29ycG9yYXRpb24gWGVvbiBFMy0xMjAwIFByb2Nl
c3NvciBGYW1pbHkgRFJBTSBDb250cm9sbGVyIChyZXYgMDkpCglTdWJzeXN0ZW06IFN1cGVyIE1p
Y3JvIENvbXB1dGVyIEluYyBEZXZpY2UgMDYyNAoJRmxhZ3M6IGJ1cyBtYXN0ZXIsIGZhc3QgZGV2
c2VsLCBsYXRlbmN5IDAKCUNhcGFiaWxpdGllczogW2UwXSBWZW5kb3IgU3BlY2lmaWMgSW5mb3Jt
YXRpb246IExlbj0wYyA8Pz4KCjAwOjAxLjAgUENJIGJyaWRnZTogSW50ZWwgQ29ycG9yYXRpb24g
WGVvbiBFMy0xMjAwLzJuZCBHZW5lcmF0aW9uIENvcmUgUHJvY2Vzc29yIEZhbWlseSBQQ0kgRXhw
cmVzcyBSb290IFBvcnQgKHJldiAwOSkgKHByb2ctaWYgMDAgW05vcm1hbCBkZWNvZGVdKQoJRmxh
Z3M6IGJ1cyBtYXN0ZXIsIGZhc3QgZGV2c2VsLCBsYXRlbmN5IDAKCUJ1czogcHJpbWFyeT0wMCwg
c2Vjb25kYXJ5PTAxLCBzdWJvcmRpbmF0ZT0wMSwgc2VjLWxhdGVuY3k9MAoJSS9PIGJlaGluZCBi
cmlkZ2U6IDAwMDBlMDAwLTAwMDBlZmZmCglNZW1vcnkgYmVoaW5kIGJyaWRnZTogZmJhMDAwMDAt
ZmJhZmZmZmYKCUNhcGFiaWxpdGllczogWzg4XSBTdWJzeXN0ZW06IFN1cGVyIE1pY3JvIENvbXB1
dGVyIEluYyBEZXZpY2UgMDYyNAoJQ2FwYWJpbGl0aWVzOiBbODBdIFBvd2VyIE1hbmFnZW1lbnQg
dmVyc2lvbiAzCglDYXBhYmlsaXRpZXM6IFs5MF0gTVNJOiBFbmFibGUrIENvdW50PTEvMSBNYXNr
YWJsZS0gNjRiaXQtCglDYXBhYmlsaXRpZXM6IFthMF0gRXhwcmVzcyBSb290IFBvcnQgKFNsb3Qr
KSwgTVNJIDAwCglDYXBhYmlsaXRpZXM6IFsxMDBdIFZpcnR1YWwgQ2hhbm5lbAoJQ2FwYWJpbGl0
aWVzOiBbMTQwXSBSb290IENvbXBsZXggTGluawoJS2VybmVsIGRyaXZlciBpbiB1c2U6IHBjaWVw
b3J0CglLZXJuZWwgbW9kdWxlczogc2hwY2hwCgowMDoxOS4wIEV0aGVybmV0IGNvbnRyb2xsZXI6
IEludGVsIENvcnBvcmF0aW9uIDgyNTc5TE0gR2lnYWJpdCBOZXR3b3JrIENvbm5lY3Rpb24gKHJl
diAwNSkKCVN1YnN5c3RlbTogU3VwZXIgTWljcm8gQ29tcHV0ZXIgSW5jIERldmljZSAxNTAyCglG
bGFnczogYnVzIG1hc3RlciwgZmFzdCBkZXZzZWwsIGxhdGVuY3kgMCwgSVJRIDI5MAoJTWVtb3J5
IGF0IGZiYjAwMDAwICgzMi1iaXQsIG5vbi1wcmVmZXRjaGFibGUpIFtzaXplPTEyOEtdCglNZW1v
cnkgYXQgZmJiMjQwMDAgKDMyLWJpdCwgbm9uLXByZWZldGNoYWJsZSkgW3NpemU9NEtdCglJL08g
cG9ydHMgYXQgZjAyMCBbc2l6ZT0zMl0KCUNhcGFiaWxpdGllczogW2M4XSBQb3dlciBNYW5hZ2Vt
ZW50IHZlcnNpb24gMgoJQ2FwYWJpbGl0aWVzOiBbZDBdIE1TSTogRW5hYmxlKyBDb3VudD0xLzEg
TWFza2FibGUtIDY0Yml0KwoJQ2FwYWJpbGl0aWVzOiBbZTBdIFBDSSBBZHZhbmNlZCBGZWF0dXJl
cwoJS2VybmVsIGRyaXZlciBpbiB1c2U6IGUxMDAwZQoJS2VybmVsIG1vZHVsZXM6IGUxMDAwZQoK
MDA6MWEuMCBVU0IgY29udHJvbGxlcjogSW50ZWwgQ29ycG9yYXRpb24gNiBTZXJpZXMvQzIwMCBT
ZXJpZXMgQ2hpcHNldCBGYW1pbHkgVVNCIEVuaGFuY2VkIEhvc3QgQ29udHJvbGxlciAjMiAocmV2
IDA1KSAocHJvZy1pZiAyMCBbRUhDSV0pCglTdWJzeXN0ZW06IFN1cGVyIE1pY3JvIENvbXB1dGVy
IEluYyBEZXZpY2UgMDYyNAoJRmxhZ3M6IGJ1cyBtYXN0ZXIsIG1lZGl1bSBkZXZzZWwsIGxhdGVu
Y3kgMCwgSVJRIDE2CglNZW1vcnkgYXQgZmJiMjMwMDAgKDMyLWJpdCwgbm9uLXByZWZldGNoYWJs
ZSkgW3NpemU9MUtdCglDYXBhYmlsaXRpZXM6IFs1MF0gUG93ZXIgTWFuYWdlbWVudCB2ZXJzaW9u
IDIKCUNhcGFiaWxpdGllczogWzU4XSBEZWJ1ZyBwb3J0OiBCQVI9MSBvZmZzZXQ9MDBhMAoJQ2Fw
YWJpbGl0aWVzOiBbOThdIFBDSSBBZHZhbmNlZCBGZWF0dXJlcwoJS2VybmVsIGRyaXZlciBpbiB1
c2U6IGVoY2lfaGNkCgowMDoxYy4wIFBDSSBicmlkZ2U6IEludGVsIENvcnBvcmF0aW9uIDYgU2Vy
aWVzL0MyMDAgU2VyaWVzIENoaXBzZXQgRmFtaWx5IFBDSSBFeHByZXNzIFJvb3QgUG9ydCAxIChy
ZXYgYjUpIChwcm9nLWlmIDAwIFtOb3JtYWwgZGVjb2RlXSkKCUZsYWdzOiBidXMgbWFzdGVyLCBm
YXN0IGRldnNlbCwgbGF0ZW5jeSAwCglCdXM6IHByaW1hcnk9MDAsIHNlY29uZGFyeT0wMiwgc3Vi
b3JkaW5hdGU9MDIsIHNlYy1sYXRlbmN5PTAKCUNhcGFiaWxpdGllczogWzQwXSBFeHByZXNzIFJv
b3QgUG9ydCAoU2xvdCspLCBNU0kgMDAKCUNhcGFiaWxpdGllczogWzgwXSBNU0k6IEVuYWJsZSsg
Q291bnQ9MS8xIE1hc2thYmxlLSA2NGJpdC0KCUNhcGFiaWxpdGllczogWzkwXSBTdWJzeXN0ZW06
IFN1cGVyIE1pY3JvIENvbXB1dGVyIEluYyBEZXZpY2UgMDYyNAoJQ2FwYWJpbGl0aWVzOiBbYTBd
IFBvd2VyIE1hbmFnZW1lbnQgdmVyc2lvbiAyCglLZXJuZWwgZHJpdmVyIGluIHVzZTogcGNpZXBv
cnQKCUtlcm5lbCBtb2R1bGVzOiBzaHBjaHAKCjAwOjFjLjQgUENJIGJyaWRnZTogSW50ZWwgQ29y
cG9yYXRpb24gNiBTZXJpZXMvQzIwMCBTZXJpZXMgQ2hpcHNldCBGYW1pbHkgUENJIEV4cHJlc3Mg
Um9vdCBQb3J0IDUgKHJldiBiNSkgKHByb2ctaWYgMDAgW05vcm1hbCBkZWNvZGVdKQoJRmxhZ3M6
IGJ1cyBtYXN0ZXIsIGZhc3QgZGV2c2VsLCBsYXRlbmN5IDAKCUJ1czogcHJpbWFyeT0wMCwgc2Vj
b25kYXJ5PTAzLCBzdWJvcmRpbmF0ZT0wMywgc2VjLWxhdGVuY3k9MAoJSS9PIGJlaGluZCBicmlk
Z2U6IDAwMDBkMDAwLTAwMDBkZmZmCglNZW1vcnkgYmVoaW5kIGJyaWRnZTogZmI5MDAwMDAtZmI5
ZmZmZmYKCUNhcGFiaWxpdGllczogWzQwXSBFeHByZXNzIFJvb3QgUG9ydCAoU2xvdCspLCBNU0kg
MDAKCUNhcGFiaWxpdGllczogWzgwXSBNU0k6IEVuYWJsZSsgQ291bnQ9MS8xIE1hc2thYmxlLSA2
NGJpdC0KCUNhcGFiaWxpdGllczogWzkwXSBTdWJzeXN0ZW06IFN1cGVyIE1pY3JvIENvbXB1dGVy
IEluYyBEZXZpY2UgMDYyNAoJQ2FwYWJpbGl0aWVzOiBbYTBdIFBvd2VyIE1hbmFnZW1lbnQgdmVy
c2lvbiAyCglLZXJuZWwgZHJpdmVyIGluIHVzZTogcGNpZXBvcnQKCUtlcm5lbCBtb2R1bGVzOiBz
aHBjaHAKCjAwOjFkLjAgVVNCIGNvbnRyb2xsZXI6IEludGVsIENvcnBvcmF0aW9uIDYgU2VyaWVz
L0MyMDAgU2VyaWVzIENoaXBzZXQgRmFtaWx5IFVTQiBFbmhhbmNlZCBIb3N0IENvbnRyb2xsZXIg
IzEgKHJldiAwNSkgKHByb2ctaWYgMjAgW0VIQ0ldKQoJU3Vic3lzdGVtOiBTdXBlciBNaWNybyBD
b21wdXRlciBJbmMgRGV2aWNlIDA2MjQKCUZsYWdzOiBidXMgbWFzdGVyLCBtZWRpdW0gZGV2c2Vs
LCBsYXRlbmN5IDAsIElSUSAyMwoJTWVtb3J5IGF0IGZiYjIyMDAwICgzMi1iaXQsIG5vbi1wcmVm
ZXRjaGFibGUpIFtzaXplPTFLXQoJQ2FwYWJpbGl0aWVzOiBbNTBdIFBvd2VyIE1hbmFnZW1lbnQg
dmVyc2lvbiAyCglDYXBhYmlsaXRpZXM6IFs1OF0gRGVidWcgcG9ydDogQkFSPTEgb2Zmc2V0PTAw
YTAKCUNhcGFiaWxpdGllczogWzk4XSBQQ0kgQWR2YW5jZWQgRmVhdHVyZXMKCUtlcm5lbCBkcml2
ZXIgaW4gdXNlOiBlaGNpX2hjZAoKMDA6MWUuMCBQQ0kgYnJpZGdlOiBJbnRlbCBDb3Jwb3JhdGlv
biA4MjgwMSBQQ0kgQnJpZGdlIChyZXYgYTUpIChwcm9nLWlmIDAxIFtTdWJ0cmFjdGl2ZSBkZWNv
ZGVdKQoJRmxhZ3M6IGJ1cyBtYXN0ZXIsIGZhc3QgZGV2c2VsLCBsYXRlbmN5IDAKCUJ1czogcHJp
bWFyeT0wMCwgc2Vjb25kYXJ5PTA0LCBzdWJvcmRpbmF0ZT0wNCwgc2VjLWxhdGVuY3k9NjQKCU1l
bW9yeSBiZWhpbmQgYnJpZGdlOiBmYjAwMDAwMC1mYjhmZmZmZgoJUHJlZmV0Y2hhYmxlIG1lbW9y
eSBiZWhpbmQgYnJpZGdlOiAwMDAwMDAwMGZhMDAwMDAwLTAwMDAwMDAwZmFmZmZmZmYKCUNhcGFi
aWxpdGllczogWzUwXSBTdWJzeXN0ZW06IFN1cGVyIE1pY3JvIENvbXB1dGVyIEluYyBEZXZpY2Ug
MDYyNAoKMDA6MWYuMCBJU0EgYnJpZGdlOiBJbnRlbCBDb3Jwb3JhdGlvbiBDMjA0IENoaXBzZXQg
RmFtaWx5IExQQyBDb250cm9sbGVyIChyZXYgMDUpCglTdWJzeXN0ZW06IFN1cGVyIE1pY3JvIENv
bXB1dGVyIEluYyBEZXZpY2UgMDYyNAoJRmxhZ3M6IGJ1cyBtYXN0ZXIsIG1lZGl1bSBkZXZzZWws
IGxhdGVuY3kgMAoJQ2FwYWJpbGl0aWVzOiBbZTBdIFZlbmRvciBTcGVjaWZpYyBJbmZvcm1hdGlv
bjogTGVuPTBjIDw/PgoJS2VybmVsIG1vZHVsZXM6IGlUQ09fd2R0CgowMDoxZi4yIFJBSUQgYnVz
IGNvbnRyb2xsZXI6IEludGVsIENvcnBvcmF0aW9uIDgyODAxIFNBVEEgQ29udHJvbGxlciBbUkFJ
RCBtb2RlXSAocmV2IDA1KQoJU3Vic3lzdGVtOiBTdXBlciBNaWNybyBDb21wdXRlciBJbmMgRGV2
aWNlIDA2MjQKCUZsYWdzOiBidXMgbWFzdGVyLCA2Nk1IeiwgbWVkaXVtIGRldnNlbCwgbGF0ZW5j
eSAwLCBJUlEgMjg5CglJL08gcG9ydHMgYXQgZjA3MCBbc2l6ZT04XQoJSS9PIHBvcnRzIGF0IGYw
NjAgW3NpemU9NF0KCUkvTyBwb3J0cyBhdCBmMDUwIFtzaXplPThdCglJL08gcG9ydHMgYXQgZjA0
MCBbc2l6ZT00XQoJSS9PIHBvcnRzIGF0IGYwMDAgW3NpemU9MzJdCglNZW1vcnkgYXQgZmJiMjEw
MDAgKDMyLWJpdCwgbm9uLXByZWZldGNoYWJsZSkgW3NpemU9MktdCglDYXBhYmlsaXRpZXM6IFs4
MF0gTVNJOiBFbmFibGUrIENvdW50PTEvMSBNYXNrYWJsZS0gNjRiaXQtCglDYXBhYmlsaXRpZXM6
IFs3MF0gUG93ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDMKCUNhcGFiaWxpdGllczogW2E4XSBTQVRB
IEhCQSB2MS4wCglDYXBhYmlsaXRpZXM6IFtiMF0gUENJIEFkdmFuY2VkIEZlYXR1cmVzCglLZXJu
ZWwgZHJpdmVyIGluIHVzZTogYWhjaQoKMDA6MWYuMyBTTUJ1czogSW50ZWwgQ29ycG9yYXRpb24g
NiBTZXJpZXMvQzIwMCBTZXJpZXMgQ2hpcHNldCBGYW1pbHkgU01CdXMgQ29udHJvbGxlciAocmV2
IDA1KQoJU3Vic3lzdGVtOiBTdXBlciBNaWNybyBDb21wdXRlciBJbmMgRGV2aWNlIDA2MjQKCUZs
YWdzOiBtZWRpdW0gZGV2c2VsLCBJUlEgMTEKCU1lbW9yeSBhdCBmYmIyMDAwMCAoNjQtYml0LCBu
b24tcHJlZmV0Y2hhYmxlKSBbc2l6ZT0yNTZdCglJL08gcG9ydHMgYXQgMTE4MCBbc2l6ZT0zMl0K
CUtlcm5lbCBtb2R1bGVzOiBpMmMtaTgwMQoKMDE6MDAuMCBTZXJpYWwgQXR0YWNoZWQgU0NTSSBj
b250cm9sbGVyOiBMU0kgTG9naWMgLyBTeW1iaW9zIExvZ2ljIFNBUzIwMDggUENJLUV4cHJlc3Mg
RnVzaW9uLU1QVCBTQVMtMiBbRmFsY29uXSAocmV2IDAzKQoJU3Vic3lzdGVtOiBMU0kgTG9naWMg
LyBTeW1iaW9zIExvZ2ljIERldmljZSAzMDIwCglGbGFnczogZmFzdCBkZXZzZWwsIElSUSAxNgoJ
SS9PIHBvcnRzIGF0IGUwMDAgW3NpemU9MjU2XQoJTWVtb3J5IGF0IGZiYWMwMDAwICg2NC1iaXQs
IG5vbi1wcmVmZXRjaGFibGUpIFtzaXplPTE2S10KCU1lbW9yeSBhdCBmYmE4MDAwMCAoNjQtYml0
LCBub24tcHJlZmV0Y2hhYmxlKSBbc2l6ZT0yNTZLXQoJRXhwYW5zaW9uIFJPTSBhdCBmYmEwMDAw
MCBbZGlzYWJsZWRdIFtzaXplPTUxMktdCglDYXBhYmlsaXRpZXM6IFs1MF0gUG93ZXIgTWFuYWdl
bWVudCB2ZXJzaW9uIDMKCUNhcGFiaWxpdGllczogWzY4XSBFeHByZXNzIEVuZHBvaW50LCBNU0kg
MDAKCUNhcGFiaWxpdGllczogW2QwXSBWaXRhbCBQcm9kdWN0IERhdGEKCUNhcGFiaWxpdGllczog
W2E4XSBNU0k6IEVuYWJsZS0gQ291bnQ9MS8xIE1hc2thYmxlLSA2NGJpdCsKCUNhcGFiaWxpdGll
czogW2MwXSBNU0ktWDogRW5hYmxlLSBDb3VudD0xNSBNYXNrZWQtCglDYXBhYmlsaXRpZXM6IFsx
MDBdIEFkdmFuY2VkIEVycm9yIFJlcG9ydGluZwoJQ2FwYWJpbGl0aWVzOiBbMTM4XSBQb3dlciBC
dWRnZXRpbmcgPD8+CglLZXJuZWwgZHJpdmVyIGluIHVzZTogcGNpYmFjawoJS2VybmVsIG1vZHVs
ZXM6IG1wdDJzYXMKCjAzOjAwLjAgRXRoZXJuZXQgY29udHJvbGxlcjogSW50ZWwgQ29ycG9yYXRp
b24gODI1NzRMIEdpZ2FiaXQgTmV0d29yayBDb25uZWN0aW9uCglTdWJzeXN0ZW06IFN1cGVyIE1p
Y3JvIENvbXB1dGVyIEluYyBEZXZpY2UgMDAwMAoJRmxhZ3M6IGJ1cyBtYXN0ZXIsIGZhc3QgZGV2
c2VsLCBsYXRlbmN5IDAsIElSUSAxNgoJTWVtb3J5IGF0IGZiOTAwMDAwICgzMi1iaXQsIG5vbi1w
cmVmZXRjaGFibGUpIFtzaXplPTEyOEtdCglJL08gcG9ydHMgYXQgZDAwMCBbc2l6ZT0zMl0KCU1l
bW9yeSBhdCBmYjkyMDAwMCAoMzItYml0LCBub24tcHJlZmV0Y2hhYmxlKSBbc2l6ZT0xNktdCglD
YXBhYmlsaXRpZXM6IFtjOF0gUG93ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDIKCUNhcGFiaWxpdGll
czogW2QwXSBNU0k6IEVuYWJsZS0gQ291bnQ9MS8xIE1hc2thYmxlLSA2NGJpdCsKCUNhcGFiaWxp
dGllczogW2UwXSBFeHByZXNzIEVuZHBvaW50LCBNU0kgMDAKCUNhcGFiaWxpdGllczogW2EwXSBN
U0ktWDogRW5hYmxlKyBDb3VudD01IE1hc2tlZC0KCUNhcGFiaWxpdGllczogWzEwMF0gQWR2YW5j
ZWQgRXJyb3IgUmVwb3J0aW5nCglDYXBhYmlsaXRpZXM6IFsxNDBdIERldmljZSBTZXJpYWwgTnVt
YmVyIDAwLTI1LTkwLWZmLWZmLTU3LTlkLTVlCglLZXJuZWwgZHJpdmVyIGluIHVzZTogZTEwMDBl
CglLZXJuZWwgbW9kdWxlczogZTEwMDBlCgowNDowMy4wIFZHQSBjb21wYXRpYmxlIGNvbnRyb2xs
ZXI6IE1hdHJveCBHcmFwaGljcywgSW5jLiBNR0EgRzIwMGVXIFdQQ000NTAgKHJldiAwYSkgKHBy
b2ctaWYgMDAgW1ZHQSBjb250cm9sbGVyXSkKCVN1YnN5c3RlbTogU3VwZXIgTWljcm8gQ29tcHV0
ZXIgSW5jIERldmljZSAwNjI0CglGbGFnczogYnVzIG1hc3RlciwgbWVkaXVtIGRldnNlbCwgbGF0
ZW5jeSA2NCwgSVJRIDUKCU1lbW9yeSBhdCBmYTAwMDAwMCAoMzItYml0LCBwcmVmZXRjaGFibGUp
IFtzaXplPTE2TV0KCU1lbW9yeSBhdCBmYjgwMDAwMCAoMzItYml0LCBub24tcHJlZmV0Y2hhYmxl
KSBbc2l6ZT0xNktdCglNZW1vcnkgYXQgZmIwMDAwMDAgKDMyLWJpdCwgbm9uLXByZWZldGNoYWJs
ZSkgW3NpemU9OE1dCglFeHBhbnNpb24gUk9NIGF0IDx1bmFzc2lnbmVkPiBbZGlzYWJsZWRdCglD
YXBhYmlsaXRpZXM6IFtkY10gUG93ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDEKCg==
--485b393aaadf88221704bd6c92bc
Content-Type: text/plain; charset=US-ASCII; name="pvhvm_dmesg.txt"
Content-Disposition: attachment; filename="pvhvm_dmesg.txt"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h0wso6gl2

SW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgY3B1c2V0CkluaXRpYWxpemluZyBjZ3JvdXAgc3Vi
c3lzIGNwdQpMaW51eCB2ZXJzaW9uIDIuNi4zMi0yMjAuNy4xLmVsNi54ODZfNjQgKG1vY2tidWls
ZEBjNmIxOG4zLmJzeXMuZGV2LmNlbnRvcy5vcmcpIChnY2MgdmVyc2lvbiA0LjQuNiAyMDExMDcz
MSAoUmVkIEhhdCA0LjQuNi0zKSAoR0NDKSApICMxIFNNUCBXZWQgTWFyIDcgMDA6NTI6MDIgR01U
IDIwMTIKQ29tbWFuZCBsaW5lOiBybyByb290PVVVSUQ9ZjNiZTA0MTEtOTA3ZS00OGFlLWI4Njct
ZjIzMjU0Mjg5MDZiIHJkX05PX0xVS1MgcmRfTk9fTFZNIExBTkc9ZW5fVVMuVVRGLTggcmRfTk9f
TUQgU1lTRk9OVD1sYXRhcmN5cmhlYi1zdW4xNiByaGdiIGNyYXNoa2VybmVsPWF1dG8gIEtFWUJP
QVJEVFlQRT1wYyBLRVlUQUJMRT11cyByZF9OT19ETQpLRVJORUwgc3VwcG9ydGVkIGNwdXM6CiAg
SW50ZWwgR2VudWluZUludGVsCiAgQU1EIEF1dGhlbnRpY0FNRAogIENlbnRhdXIgQ2VudGF1ckhh
dWxzCkJJT1MtcHJvdmlkZWQgcGh5c2ljYWwgUkFNIG1hcDoKIEJJT1MtZTgyMDogMDAwMDAwMDAw
MDAwMDAwMCAtIDAwMDAwMDAwMDAwOWUwMDAgKHVzYWJsZSkKIEJJT1MtZTgyMDogMDAwMDAwMDAw
MDA5ZTAwMCAtIDAwMDAwMDAwMDAwYTAwMDAgKHJlc2VydmVkKQogQklPUy1lODIwOiAwMDAwMDAw
MDAwMGUwMDAwIC0gMDAwMDAwMDAwMDEwMDAwMCAocmVzZXJ2ZWQpCiBCSU9TLWU4MjA6IDAwMDAw
MDAwMDAxMDAwMDAgLSAwMDAwMDAwMDgwMDAwMDAwICh1c2FibGUpCiBCSU9TLWU4MjA6IDAwMDAw
MDAwZmMwMDAwMDAgLSAwMDAwMDAwMTAwMDAwMDAwIChyZXNlcnZlZCkKRE1JIDIuNCBwcmVzZW50
LgpTTUJJT1MgdmVyc2lvbiAyLjQgQCAweEZCQjgwCkRNSTogWGVuIEhWTSBkb21VLCBCSU9TIDQu
MS4zLXJjMS1wcmUgMDMvMDgvMjAxMgplODIwIHVwZGF0ZSByYW5nZTogMDAwMDAwMDAwMDAwMDAw
MCAtIDAwMDAwMDAwMDAwMDEwMDAgKHVzYWJsZSkgPT0+IChyZXNlcnZlZCkKZTgyMCByZW1vdmUg
cmFuZ2U6IDAwMDAwMDAwMDAwYTAwMDAgLSAwMDAwMDAwMDAwMTAwMDAwICh1c2FibGUpCmxhc3Rf
cGZuID0gMHg4MDAwMCBtYXhfYXJjaF9wZm4gPSAweDQwMDAwMDAwMApNVFJSIGRlZmF1bHQgdHlw
ZTogd3JpdGUtYmFjawpNVFJSIGZpeGVkIHJhbmdlcyBlbmFibGVkOgogIDAwMDAwLTlGRkZGIHdy
aXRlLWJhY2sKICBBMDAwMC1CRkZGRiB3cml0ZS1jb21iaW5pbmcKICBDMDAwMC1GRkZGRiB3cml0
ZS1iYWNrCk1UUlIgdmFyaWFibGUgcmFuZ2VzIGVuYWJsZWQ6CiAgMCBiYXNlIDBGMDAwMDAwMCBt
YXNrIEZGODAwMDAwMCB1bmNhY2hhYmxlCiAgMSBiYXNlIDBGODAwMDAwMCBtYXNrIEZGQzAwMDAw
MCB1bmNhY2hhYmxlCiAgMiBkaXNhYmxlZAogIDMgZGlzYWJsZWQKICA0IGRpc2FibGVkCiAgNSBk
aXNhYmxlZAogIDYgZGlzYWJsZWQKICA3IGRpc2FibGVkCng4NiBQQVQgZW5hYmxlZDogY3B1IDAs
IG9sZCAweDcwNDA2MDAwNzA0MDYsIG5ldyAweDcwMTA2MDAwNzAxMDYKaW5pdGlhbCBtZW1vcnkg
bWFwcGVkIDogMCAtIDIwMDAwMDAwCmluaXRfbWVtb3J5X21hcHBpbmc6IDAwMDAwMDAwMDAwMDAw
MDAtMDAwMDAwMDA4MDAwMDAwMAogMDAwMDAwMDAwMCAtIDAwODAwMDAwMDAgcGFnZSAyTQprZXJu
ZWwgZGlyZWN0IG1hcHBpbmcgdGFibGVzIHVwIHRvIDgwMDAwMDAwIEAgODAwMC1iMDAwClJBTURJ
U0s6IDM3MTFjMDAwIC0gMzdmZWY5ODAKQUNQSTogUlNEUCAwMDAwMDAwMDAwMGVhMDIwIDAwMDI0
ICh2MDIgICAgWGVuKQpBQ1BJOiBYU0RUIDAwMDAwMDAwZmMwMTM0YjAgMDAwMzQgKHYwMSAgICBY
ZW4gICAgICBIVk0gMDAwMDAwMDAgSFZNTCAwMDAwMDAwMCkKQUNQSTogRkFDUCAwMDAwMDAwMGZj
MDEzMmQwIDAwMEY0ICh2MDQgICAgWGVuICAgICAgSFZNIDAwMDAwMDAwIEhWTUwgMDAwMDAwMDAp
CkFDUEk6IERTRFQgMDAwMDAwMDBmYzAwMzQ0MCAwRkUwNSAodjAyICAgIFhlbiAgICAgIEhWTSAw
MDAwMDAwMCBJTlRMIDIwMTAwNTI4KQpBQ1BJOiBGQUNTIDAwMDAwMDAwZmMwMDM0MDAgMDAwNDAK
QUNQSTogQVBJQyAwMDAwMDAwMGZjMDEzM2QwIDAwMEQ4ICh2MDIgICAgWGVuICAgICAgSFZNIDAw
MDAwMDAwIEhWTUwgMDAwMDAwMDApCkFDUEk6IExvY2FsIEFQSUMgYWRkcmVzcyAweGZlZTAwMDAw
Ck5vIE5VTUEgY29uZmlndXJhdGlvbiBmb3VuZApGYWtpbmcgYSBub2RlIGF0IDAwMDAwMDAwMDAw
MDAwMDAtMDAwMDAwMDA4MDAwMDAwMApCb290bWVtIHNldHVwIG5vZGUgMCAwMDAwMDAwMDAwMDAw
MDAwLTAwMDAwMDAwODAwMDAwMDAKICBOT0RFX0RBVEEgWzAwMDAwMDAwMDAwMDkwMDAgLSAwMDAw
MDAwMDAwMDNjZmZmXQogIGJvb3RtYXAgWzAwMDAwMDAwMDAwM2QwMDAgLSAgMDAwMDAwMDAwMDA0
Y2ZmZl0gcGFnZXMgMTAKKDcgZWFybHkgcmVzZXJ2YXRpb25zKSA9PT4gYm9vdG1lbSBbMDAwMDAw
MDAwMCAtIDAwODAwMDAwMDBdCiAgIzAgWzAwMDAwMDAwMDAgLSAwMDAwMDAxMDAwXSAgIEJJT1Mg
ZGF0YSBwYWdlID09PiBbMDAwMDAwMDAwMCAtIDAwMDAwMDEwMDBdCiAgIzEgWzAwMDAwMDYwMDAg
LSAwMDAwMDA4MDAwXSAgICAgICBUUkFNUE9MSU5FID09PiBbMDAwMDAwNjAwMCAtIDAwMDAwMDgw
MDBdCiAgIzIgWzAwMDEwMDAwMDAgLSAwMDAyMDBjODI0XSAgICBURVhUIERBVEEgQlNTID09PiBb
MDAwMTAwMDAwMCAtIDAwMDIwMGM4MjRdCiAgIzMgWzAwMzcxMWMwMDAgLSAwMDM3ZmVmOTgwXSAg
ICAgICAgICBSQU1ESVNLID09PiBbMDAzNzExYzAwMCAtIDAwMzdmZWY5ODBdCiAgIzQgWzAwMDAw
OWUwMDAgLSAwMDAwMTAwMDAwXSAgICBCSU9TIHJlc2VydmVkID09PiBbMDAwMDA5ZTAwMCAtIDAw
MDAxMDAwMDBdCiAgIzUgWzAwMDIwMGQwMDAgLSAwMDAyMDBkMGQ4XSAgICAgICAgICAgICAgQlJL
ID09PiBbMDAwMjAwZDAwMCAtIDAwMDIwMGQwZDhdCiAgIzYgWzAwMDAwMDgwMDAgLSAwMDAwMDA5
MDAwXSAgICAgICAgICBQR1RBQkxFID09PiBbMDAwMDAwODAwMCAtIDAwMDAwMDkwMDBdCmZvdW5k
IFNNUCBNUC10YWJsZSBhdCBbZmZmZjg4MDAwMDBmYmM5MF0gZmJjOTAKIFtmZmZmZWEwMDAwMDAw
MDAwLWZmZmZlYTAwMDFiZmZmZmZdIFBNRCAtPiBbZmZmZjg4MDAwMjYwMDAwMC1mZmZmODgwMDA0
MWZmZmZmXSBvbiBub2RlIDAKWm9uZSBQRk4gcmFuZ2VzOgogIERNQSAgICAgIDB4MDAwMDAwMDEg
LT4gMHgwMDAwMTAwMAogIERNQTMyICAgIDB4MDAwMDEwMDAgLT4gMHgwMDEwMDAwMAogIE5vcm1h
bCAgIDB4MDAxMDAwMDAgLT4gMHgwMDEwMDAwMApNb3ZhYmxlIHpvbmUgc3RhcnQgUEZOIGZvciBl
YWNoIG5vZGUKZWFybHlfbm9kZV9tYXBbMl0gYWN0aXZlIFBGTiByYW5nZXMKICAgIDA6IDB4MDAw
MDAwMDEgLT4gMHgwMDAwMDA5ZQogICAgMDogMHgwMDAwMDEwMCAtPiAweDAwMDgwMDAwCk9uIG5v
ZGUgMCB0b3RhbHBhZ2VzOiA1MjQxODkKICBETUEgem9uZTogNTYgcGFnZXMgdXNlZCBmb3IgbWVt
bWFwCiAgRE1BIHpvbmU6IDEwMiBwYWdlcyByZXNlcnZlZAogIERNQSB6b25lOiAzODM5IHBhZ2Vz
LCBMSUZPIGJhdGNoOjAKICBETUEzMiB6b25lOiA3MTEyIHBhZ2VzIHVzZWQgZm9yIG1lbW1hcAog
IERNQTMyIHpvbmU6IDUxMzA4MCBwYWdlcywgTElGTyBiYXRjaDozMQpBQ1BJOiBQTS1UaW1lciBJ
TyBQb3J0OiAweGIwMDgKQUNQSTogTG9jYWwgQVBJQyBhZGRyZXNzIDB4ZmVlMDAwMDAKQUNQSTog
TEFQSUMgKGFjcGlfaWRbMHgwMF0gbGFwaWNfaWRbMHgwMF0gZW5hYmxlZCkKQUNQSTogTEFQSUMg
KGFjcGlfaWRbMHgwMV0gbGFwaWNfaWRbMHgwMl0gZW5hYmxlZCkKQUNQSTogTEFQSUMgKGFjcGlf
aWRbMHgwMl0gbGFwaWNfaWRbMHgwNF0gZGlzYWJsZWQpCkFDUEk6IExBUElDIChhY3BpX2lkWzB4
MDNdIGxhcGljX2lkWzB4MDZdIGRpc2FibGVkKQpBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDA0XSBs
YXBpY19pZFsweDA4XSBkaXNhYmxlZCkKQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwNV0gbGFwaWNf
aWRbMHgwYV0gZGlzYWJsZWQpCkFDUEk6IExBUElDIChhY3BpX2lkWzB4MDZdIGxhcGljX2lkWzB4
MGNdIGRpc2FibGVkKQpBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDA3XSBsYXBpY19pZFsweDBlXSBk
aXNhYmxlZCkKQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwOF0gbGFwaWNfaWRbMHgxMF0gZGlzYWJs
ZWQpCkFDUEk6IExBUElDIChhY3BpX2lkWzB4MDldIGxhcGljX2lkWzB4MTJdIGRpc2FibGVkKQpB
Q1BJOiBMQVBJQyAoYWNwaV9pZFsweDBhXSBsYXBpY19pZFsweDE0XSBkaXNhYmxlZCkKQUNQSTog
TEFQSUMgKGFjcGlfaWRbMHgwYl0gbGFwaWNfaWRbMHgxNl0gZGlzYWJsZWQpCkFDUEk6IExBUElD
IChhY3BpX2lkWzB4MGNdIGxhcGljX2lkWzB4MThdIGRpc2FibGVkKQpBQ1BJOiBMQVBJQyAoYWNw
aV9pZFsweDBkXSBsYXBpY19pZFsweDFhXSBkaXNhYmxlZCkKQUNQSTogTEFQSUMgKGFjcGlfaWRb
MHgwZV0gbGFwaWNfaWRbMHgxY10gZGlzYWJsZWQpCkFDUEk6IElPQVBJQyAoaWRbMHgwMV0gYWRk
cmVzc1sweGZlYzAwMDAwXSBnc2lfYmFzZVswXSkKSU9BUElDWzBdOiBhcGljX2lkIDEsIHZlcnNp
b24gMTcsIGFkZHJlc3MgMHhmZWMwMDAwMCwgR1NJIDAtNDcKQUNQSTogSU5UX1NSQ19PVlIgKGJ1
cyAwIGJ1c19pcnEgMCBnbG9iYWxfaXJxIDIgZGZsIGRmbCkKQUNQSTogSU5UX1NSQ19PVlIgKGJ1
cyAwIGJ1c19pcnEgNSBnbG9iYWxfaXJxIDUgbG93IGxldmVsKQpBQ1BJOiBJTlRfU1JDX09WUiAo
YnVzIDAgYnVzX2lycSAxMCBnbG9iYWxfaXJxIDEwIGxvdyBsZXZlbCkKQUNQSTogSU5UX1NSQ19P
VlIgKGJ1cyAwIGJ1c19pcnEgMTEgZ2xvYmFsX2lycSAxMSBsb3cgbGV2ZWwpCkFDUEk6IElSUTAg
dXNlZCBieSBvdmVycmlkZS4KQUNQSTogSVJRMiB1c2VkIGJ5IG92ZXJyaWRlLgpBQ1BJOiBJUlE1
IHVzZWQgYnkgb3ZlcnJpZGUuCkFDUEk6IElSUTkgdXNlZCBieSBvdmVycmlkZS4KQUNQSTogSVJR
MTAgdXNlZCBieSBvdmVycmlkZS4KQUNQSTogSVJRMTEgdXNlZCBieSBvdmVycmlkZS4KVXNpbmcg
QUNQSSAoTUFEVCkgZm9yIFNNUCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uClNNUDogQWxsb3dp
bmcgMTUgQ1BVcywgMTMgaG90cGx1ZyBDUFVzCm5yX2lycXNfZ3NpOiA0OApYZW4gdmVyc2lvbiA0
LjEuClhlbiBQbGF0Zm9ybSBQQ0k6IEkvTyBwcm90b2NvbCB2ZXJzaW9uIDEKTmV0ZnJvbnQgYW5k
IHRoZSBYZW4gcGxhdGZvcm0gUENJIGRyaXZlciBoYXZlIGJlZW4gY29tcGlsZWQgZm9yIHRoaXMg
a2VybmVsOiB1bnBsdWcgZW11bGF0ZWQgTklDcy4KQmxrZnJvbnQgYW5kIHRoZSBYZW4gcGxhdGZv
cm0gUENJIGRyaXZlciBoYXZlIGJlZW4gY29tcGlsZWQgZm9yIHRoaXMga2VybmVsOiB1bnBsdWcg
ZW11bGF0ZWQgZGlza3MuCllvdSBtaWdodCBoYXZlIHRvIGNoYW5nZSB0aGUgcm9vdCBkZXZpY2UK
ZnJvbSAvZGV2L2hkW2EtZF0gdG8gL2Rldi94dmRbYS1kXQppbiB5b3VyIHJvb3Q9IGtlcm5lbCBj
b21tYW5kIGxpbmUgb3B0aW9uClBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAw
MDAwOWUwMDAgLSAwMDAwMDAwMDAwMGEwMDAwClBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6
IDAwMDAwMDAwMDAwYTAwMDAgLSAwMDAwMDAwMDAwMGUwMDAwClBNOiBSZWdpc3RlcmVkIG5vc2F2
ZSBtZW1vcnk6IDAwMDAwMDAwMDAwZTAwMDAgLSAwMDAwMDAwMDAwMTAwMDAwCkFsbG9jYXRpbmcg
UENJIHJlc291cmNlcyBzdGFydGluZyBhdCA4MDAwMDAwMCAoZ2FwOiA4MDAwMDAwMDo3YzAwMDAw
MCkKQm9vdGluZyBwYXJhdmlydHVhbGl6ZWQga2VybmVsIG9uIFhlbgpOUl9DUFVTOjQwOTYgbnJf
Y3B1bWFza19iaXRzOjE1IG5yX2NwdV9pZHM6MTUgbnJfbm9kZV9pZHM6MQpQRVJDUFU6IEVtYmVk
ZGVkIDMwIHBhZ2VzL2NwdSBAZmZmZjg4MDAwMjIwMDAwMCBzOTI2MzIgcjgxOTIgZDIyMDU2IHUx
MzEwNzIKcGNwdS1hbGxvYzogczkyNjMyIHI4MTkyIGQyMjA1NiB1MTMxMDcyIGFsbG9jPTEqMjA5
NzE1MgpwY3B1LWFsbG9jOiBbMF0gMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcgMDggMDkgMTAgMTEg
MTIgMTMgMTQgLS0gCkJ1aWx0IDEgem9uZWxpc3RzIGluIE5vZGUgb3JkZXIsIG1vYmlsaXR5IGdy
b3VwaW5nIG9uLiAgVG90YWwgcGFnZXM6IDUxNjkxOQpQb2xpY3kgem9uZTogRE1BMzIKS2VybmVs
IGNvbW1hbmQgbGluZTogcm8gcm9vdD1VVUlEPWYzYmUwNDExLTkwN2UtNDhhZS1iODY3LWYyMzI1
NDI4OTA2YiByZF9OT19MVUtTIHJkX05PX0xWTSBMQU5HPWVuX1VTLlVURi04IHJkX05PX01EIFNZ
U0ZPTlQ9bGF0YXJjeXJoZWItc3VuMTYgcmhnYiAgIEtFWUJPQVJEVFlQRT1wYyBLRVlUQUJMRT11
cyByZF9OT19ETQpQSUQgaGFzaCB0YWJsZSBlbnRyaWVzOiA0MDk2IChvcmRlcjogMywgMzI3Njgg
Ynl0ZXMpCkNoZWNraW5nIGFwZXJ0dXJlLi4uCk5vIEFHUCBicmlkZ2UgZm91bmQKTWVtb3J5OiAy
MDM0MTUyay8yMDk3MTUyayBhdmFpbGFibGUgKDUwODRrIGtlcm5lbCBjb2RlLCAzOTZrIGFic2Vu
dCwgNjI2MDRrIHJlc2VydmVkLCA3MjI5ayBkYXRhLCAxMjQ0ayBpbml0KQpIaWVyYXJjaGljYWwg
UkNVIGltcGxlbWVudGF0aW9uLgpOUl9JUlFTOjMzMDI0IG5yX2lycXM6OTM2ClhlbiBIVk0gY2Fs
bGJhY2sgdmVjdG9yIGZvciBldmVudCBkZWxpdmVyeSBpcyBlbmFibGVkCkNvbnNvbGU6IGNvbG91
ciBWR0ErIDgweDI1CmNvbnNvbGUgW3R0eTBdIGVuYWJsZWQKYWxsb2NhdGVkIDE2Nzc3MjE2IGJ5
dGVzIG9mIHBhZ2VfY2dyb3VwCnBsZWFzZSB0cnkgJ2Nncm91cF9kaXNhYmxlPW1lbW9yeScgb3B0
aW9uIGlmIHlvdSBkb24ndCB3YW50IG1lbW9yeSBjZ3JvdXBzCkZhc3QgVFNDIGNhbGlicmF0aW9u
IHVzaW5nIFBJVApEZXRlY3RlZCAzMTkzLjA1OSBNSHogcHJvY2Vzc29yLgpDYWxpYnJhdGluZyBk
ZWxheSBsb29wIChza2lwcGVkKSwgdmFsdWUgY2FsY3VsYXRlZCB1c2luZyB0aW1lciBmcmVxdWVu
Y3kuLiA2Mzg2LjExIEJvZ29NSVBTIChscGo9MzE5MzA1OSkKcGlkX21heDogZGVmYXVsdDogMzI3
NjggbWluaW11bTogMzAxClNlY3VyaXR5IEZyYW1ld29yayBpbml0aWFsaXplZApTRUxpbnV4OiAg
SW5pdGlhbGl6aW5nLgpTRUxpbnV4OiAgU3RhcnRpbmcgaW4gcGVybWlzc2l2ZSBtb2RlCkRlbnRy
eSBjYWNoZSBoYXNoIHRhYmxlIGVudHJpZXM6IDI2MjE0NCAob3JkZXI6IDksIDIwOTcxNTIgYnl0
ZXMpCklub2RlLWNhY2hlIGhhc2ggdGFibGUgZW50cmllczogMTMxMDcyIChvcmRlcjogOCwgMTA0
ODU3NiBieXRlcykKTW91bnQtY2FjaGUgaGFzaCB0YWJsZSBlbnRyaWVzOiAyNTYKSW5pdGlhbGl6
aW5nIGNncm91cCBzdWJzeXMgbnMKSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgY3B1YWNjdApJ
bml0aWFsaXppbmcgY2dyb3VwIHN1YnN5cyBtZW1vcnkKSW5pdGlhbGl6aW5nIGNncm91cCBzdWJz
eXMgZGV2aWNlcwpJbml0aWFsaXppbmcgY2dyb3VwIHN1YnN5cyBmcmVlemVyCkluaXRpYWxpemlu
ZyBjZ3JvdXAgc3Vic3lzIG5ldF9jbHMKSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgYmxraW8K
SW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgcGVyZl9ldmVudApDUFU6IENQVSBmZWF0dXJlIHJk
dHNjcCBkaXNhYmxlZCBvbiB4ZW4gZ3Vlc3QKQ1BVOiBDUFUgZmVhdHVyZSBjb25zdGFudF90c2Mg
ZGlzYWJsZWQgb24geGVuIGd1ZXN0CkNQVTogVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHNpYmxpbmdz
IDMyCm1jZTogQ1BVIHN1cHBvcnRzIDkgTUNFIGJhbmtzCmFsdGVybmF0aXZlczogc3dpdGNoaW5n
IHRvIHVuZmFpciBzcGlubG9jawpBQ1BJOiBDb3JlIHJldmlzaW9uIDIwMDkwOTAzCmZ0cmFjZTog
Y29udmVydGluZyBtY291bnQgY2FsbHMgdG8gMGYgMWYgNDQgMDAgMDAKZnRyYWNlOiBhbGxvY2F0
aW5nIDIwNzgyIGVudHJpZXMgaW4gODIgcGFnZXMKeDJhcGljIG5vdCBlbmFibGVkLCBJUlEgcmVt
YXBwaW5nIGluaXQgZmFpbGVkClNldHRpbmcgQVBJQyByb3V0aW5nIHRvIHBoeXNpY2FsIGZsYXQK
Li5USU1FUjogdmVjdG9yPTB4MzAgYXBpYzE9MCBwaW4xPTIgYXBpYzI9MCBwaW4yPTAKQ1BVMDog
SW50ZWwoUikgWGVvbihSKSBDUFUgRTMxMjMwIEAgMy4yMEdIeiBzdGVwcGluZyAwNwpQZXJmb3Jt
YW5jZSBFdmVudHM6IHVuc3VwcG9ydGVkIHA2IENQVSBtb2RlbCA0MiBubyBQTVUgZHJpdmVyLCBz
b2Z0d2FyZSBldmVudHMgb25seS4KTk1JIHdhdGNoZG9nIGRpc2FibGVkIChjcHUwKTogaGFyZHdh
cmUgZXZlbnRzIG5vdCBlbmFibGVkCkJvb3RpbmcgTm9kZSAgIDAsIFByb2Nlc3NvcnMgICMxCkNQ
VTogQ1BVIGZlYXR1cmUgcmR0c2NwIGRpc2FibGVkIG9uIHhlbiBndWVzdApDUFU6IENQVSBmZWF0
dXJlIGNvbnN0YW50X3RzYyBkaXNhYmxlZCBvbiB4ZW4gZ3Vlc3QKQ1BVOiBVbnN1cHBvcnRlZCBu
dW1iZXIgb2Ygc2libGluZ3MgMzIKQnJvdWdodCB1cCAyIENQVXMKVG90YWwgb2YgMiBwcm9jZXNz
b3JzIGFjdGl2YXRlZCAoMTI3NzAuNzkgQm9nb01JUFMpLgpzaXplb2Yodm1hKT0yMDAgYnl0ZXMK
c2l6ZW9mKHBhZ2UpPTU2IGJ5dGVzCnNpemVvZihpbm9kZSk9NTkyIGJ5dGVzCnNpemVvZihkZW50
cnkpPTE5MiBieXRlcwpzaXplb2YoZXh0M2lub2RlKT04MDAgYnl0ZXMKc2l6ZW9mKGJ1ZmZlcl9o
ZWFkKT0xMDQgYnl0ZXMKc2l6ZW9mKHNrYnVmZik9MjMyIGJ5dGVzCnNpemVvZih0YXNrX3N0cnVj
dCk9MjYxNiBieXRlcwpkZXZ0bXBmczogaW5pdGlhbGl6ZWQKcmVndWxhdG9yOiBjb3JlIHZlcnNp
b24gMC41Ck5FVDogUmVnaXN0ZXJlZCBwcm90b2NvbCBmYW1pbHkgMTYKICBhbGxvYyBpcnFfZGVz
YyBmb3IgMTYgb24gbm9kZSAwCiAgYWxsb2Mga3N0YXRfaXJxcyBvbiBub2RlIDAKQUNQSTogYnVz
IHR5cGUgcGNpIHJlZ2lzdGVyZWQKUENJOiBVc2luZyBjb25maWd1cmF0aW9uIHR5cGUgMSBmb3Ig
YmFzZSBhY2Nlc3MKYmlvOiBjcmVhdGUgc2xhYiA8YmlvLTA+IGF0IDAKQUNQSTogRUM6IExvb2sg
dXAgRUMgaW4gRFNEVApBQ1BJOiBJbnRlcnByZXRlciBlbmFibGVkCkFDUEk6IChzdXBwb3J0cyBT
MCBTMyBTNCBTNSkKQUNQSTogVXNpbmcgSU9BUElDIGZvciBpbnRlcnJ1cHQgcm91dGluZwpBQ1BJ
OiBObyBkb2NrIGRldmljZXMgZm91bmQuCkhFU1Q6IFRhYmxlIG5vdCBmb3VuZC4KQUNQSTogUENJ
IFJvb3QgQnJpZGdlIFtQQ0kwXSAoMDAwMDowMCkKcGNpIDAwMDA6MDA6MDEuMTogcmVnIDIwIGlv
IHBvcnQ6IFsweGMyNjAtMHhjMjZmXQpwY2kgMDAwMDowMDowMS4yOiByZWcgMjAgaW8gcG9ydDog
WzB4YzI0MC0weGMyNWZdCiogRm91bmQgUE0tVGltZXIgQnVnIG9uIHRoZSBjaGlwc2V0LiBEdWUg
dG8gd29ya2Fyb3VuZHMgZm9yIGEgYnVnLAoqIHRoaXMgY2xvY2sgc291cmNlIGlzIHNsb3cuIENv
bnNpZGVyIHRyeWluZyBvdGhlciBjbG9jayBzb3VyY2VzCnBjaSAwMDAwOjAwOjAxLjM6IHF1aXJr
OiByZWdpb24gYjAwMC1iMDNmIGNsYWltZWQgYnkgUElJWDQgQUNQSQpwY2kgMDAwMDowMDowMi4w
OiByZWcgMTAgMzJiaXQgbW1pbyBwcmVmOiBbMHhmMDAwMDAwMC0weGYxZmZmZmZmXQpwY2kgMDAw
MDowMDowMi4wOiByZWcgMTQgMzJiaXQgbW1pbzogWzB4ZjMwZTQwMDAtMHhmMzBlNGZmZl0KcGNp
IDAwMDA6MDA6MDMuMDogcmVnIDEwIGlvIHBvcnQ6IFsweGMwMDAtMHhjMGZmXQpwY2kgMDAwMDow
MDowMy4wOiByZWcgMTQgMzJiaXQgbW1pbyBwcmVmOiBbMHhmMjAwMDAwMC0weGYyZmZmZmZmXQpw
Y2kgMDAwMDowMDowNS4wOiByZWcgMTAgaW8gcG9ydDogWzB4YzEwMC0weGMxZmZdCnBjaSAwMDAw
OjAwOjA1LjA6IHJlZyAxNCA2NGJpdCBtbWlvOiBbMHhmMzBlMDAwMC0weGYzMGUzZmZmXQpwY2kg
MDAwMDowMDowNS4wOiByZWcgMWMgNjRiaXQgbW1pbzogWzB4ZjMwODAwMDAtMHhmMzBiZmZmZl0K
cGNpIDAwMDA6MDA6MDUuMDogcmVnIDMwIDMyYml0IG1taW8gcHJlZjogWzB4ZjMwMDAwMDAtMHhm
MzA3ZmZmZl0KcGNpIDAwMDA6MDA6MDUuMDogc3VwcG9ydHMgRDEgRDIKQUNQSTogUENJIEludGVy
cnVwdCBSb3V0aW5nIFRhYmxlIFtcX1NCXy5QQ0kwLl9QUlRdCkFDUEk6IFBDSSBJbnRlcnJ1cHQg
TGluayBbTE5LQV0gKElSUXMgKjUgMTAgMTEpCkFDUEk6IFBDSSBJbnRlcnJ1cHQgTGluayBbTE5L
Ql0gKElSUXMgNSAqMTAgMTEpCkFDUEk6IFBDSSBJbnRlcnJ1cHQgTGluayBbTE5LQ10gKElSUXMg
NSAxMCAqMTEpCkFDUEk6IFBDSSBJbnRlcnJ1cHQgTGluayBbTE5LRF0gKElSUXMgKjUgMTAgMTEp
CnZnYWFyYjogZGV2aWNlIGFkZGVkOiBQQ0k6MDAwMDowMDowMi4wLGRlY29kZXM9aW8rbWVtLG93
bnM9aW8rbWVtLGxvY2tzPW5vbmUKdmdhYXJiOiBsb2FkZWQKdmdhYXJiOiBicmlkZ2UgY29udHJv
bCBwb3NzaWJsZSAwMDAwOjAwOjAyLjAKU0NTSSBzdWJzeXN0ZW0gaW5pdGlhbGl6ZWQKbGliYXRh
IHZlcnNpb24gMy4wMCBsb2FkZWQuCnVzYmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGludGVyZmFjZSBk
cml2ZXIgdXNiZnMKdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciBodWIK
dXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgZGV2aWNlIGRyaXZlciB1c2IKUENJOiBVc2luZyBBQ1BJ
IGZvciBJUlEgcm91dGluZwpQQ0k6IG9sZCBjb2RlIHdvdWxkIGhhdmUgc2V0IGNhY2hlbGluZSBz
aXplIHRvIDMyIGJ5dGVzLCBidXQgY2xmbHVzaF9zaXplID0gNjQKUENJOiBwY2lfY2FjaGVfbGlu
ZV9zaXplIHNldCB0byA2NCBieXRlcwpOZXRMYWJlbDogSW5pdGlhbGl6aW5nCk5ldExhYmVsOiAg
ZG9tYWluIGhhc2ggc2l6ZSA9IDEyOApOZXRMYWJlbDogIHByb3RvY29scyA9IFVOTEFCRUxFRCBD
SVBTT3Y0Ck5ldExhYmVsOiAgdW5sYWJlbGVkIHRyYWZmaWMgYWxsb3dlZCBieSBkZWZhdWx0ClN3
aXRjaGluZyB0byBjbG9ja3NvdXJjZSBqaWZmaWVzCnBucDogUG5QIEFDUEkgaW5pdApBQ1BJOiBi
dXMgdHlwZSBwbnAgcmVnaXN0ZXJlZApwbnA6IFBuUCBBQ1BJOiBmb3VuZCAxMiBkZXZpY2VzCkFD
UEk6IEFDUEkgYnVzIHR5cGUgcG5wIHVucmVnaXN0ZXJlZApzeXN0ZW0gMDA6MDA6IGlvbWVtIHJh
bmdlIDB4MC0weDlmZmZmIGNvdWxkIG5vdCBiZSByZXNlcnZlZApzeXN0ZW0gMDA6MDI6IGlvcG9y
dCByYW5nZSAweDEwYzAtMHgxMTQxIGhhcyBiZWVuIHJlc2VydmVkCnN5c3RlbSAwMDowMjogaW9w
b3J0IHJhbmdlIDB4YjA0NC0weGIwNDcgaGFzIGJlZW4gcmVzZXJ2ZWQKc3lzdGVtIDAwOjAzOiBp
b3BvcnQgcmFuZ2UgMHg4YTAtMHg4YTMgaGFzIGJlZW4gcmVzZXJ2ZWQKc3lzdGVtIDAwOjAzOiBp
b3BvcnQgcmFuZ2UgMHhjYzAtMHhjY2YgaGFzIGJlZW4gcmVzZXJ2ZWQKc3lzdGVtIDAwOjAzOiBp
b3BvcnQgcmFuZ2UgMHg0ZDAtMHg0ZDEgaGFzIGJlZW4gcmVzZXJ2ZWQKU3dpdGNoaW5nIHRvIGNs
b2Nrc291cmNlIGFjcGlfcG0KcGNpX2J1cyAwMDAwOjAwOiByZXNvdXJjZSAwIGlvOiAgWzB4MDAt
MHhmZmZmXQpwY2lfYnVzIDAwMDA6MDA6IHJlc291cmNlIDEgbWVtOiBbMHgwMDAwMDAtMHhmZmZm
ZmZmZmZmZmZmZmZmXQpORVQ6IFJlZ2lzdGVyZWQgcHJvdG9jb2wgZmFtaWx5IDIKSVAgcm91dGUg
Y2FjaGUgaGFzaCB0YWJsZSBlbnRyaWVzOiA2NTUzNiAob3JkZXI6IDcsIDUyNDI4OCBieXRlcykK
VENQIGVzdGFibGlzaGVkIGhhc2ggdGFibGUgZW50cmllczogMjYyMTQ0IChvcmRlcjogMTAsIDQx
OTQzMDQgYnl0ZXMpClRDUCBiaW5kIGhhc2ggdGFibGUgZW50cmllczogNjU1MzYgKG9yZGVyOiA4
LCAxMDQ4NTc2IGJ5dGVzKQpUQ1A6IEhhc2ggdGFibGVzIGNvbmZpZ3VyZWQgKGVzdGFibGlzaGVk
IDI2MjE0NCBiaW5kIDY1NTM2KQpUQ1AgcmVubyByZWdpc3RlcmVkCk5FVDogUmVnaXN0ZXJlZCBw
cm90b2NvbCBmYW1pbHkgMQpwY2kgMDAwMDowMDowMC4wOiBMaW1pdGluZyBkaXJlY3QgUENJL1BD
SSB0cmFuc2ZlcnMKcGNpIDAwMDA6MDA6MDEuMDogUElJWDM6IEVuYWJsaW5nIFBhc3NpdmUgUmVs
ZWFzZQpwY2kgMDAwMDowMDowMS4wOiBBY3RpdmF0aW5nIElTQSBETUEgaGFuZyB3b3JrYXJvdW5k
cwpwY2kgMDAwMDowMDowMi4wOiBCb290IHZpZGVvIGRldmljZQpUcnlpbmcgdG8gdW5wYWNrIHJv
b3RmcyBpbWFnZSBhcyBpbml0cmFtZnMuLi4KRnJlZWluZyBpbml0cmQgbWVtb3J5OiAxNTE4Mmsg
ZnJlZWQKYXVkaXQ6IGluaXRpYWxpemluZyBuZXRsaW5rIHNvY2tldCAoZGlzYWJsZWQpCnR5cGU9
MjAwMCBhdWRpdCgxMzM0MTY5ODMwLjcwMzoxKTogaW5pdGlhbGl6ZWQKSHVnZVRMQiByZWdpc3Rl
cmVkIDIgTUIgcGFnZSBzaXplLCBwcmUtYWxsb2NhdGVkIDAgcGFnZXMKVkZTOiBEaXNrIHF1b3Rh
cyBkcXVvdF82LjUuMgpEcXVvdC1jYWNoZSBoYXNoIHRhYmxlIGVudHJpZXM6IDUxMiAob3JkZXIg
MCwgNDA5NiBieXRlcykKbXNnbW5pIGhhcyBiZWVuIHNldCB0byA0MDAyClNFTGludXg6ICBSZWdp
c3RlcmluZyBuZXRmaWx0ZXIgaG9va3MKYWxnOiBObyB0ZXN0IGZvciBzdGRybmcgKGtybmcpCmtz
aWduOiBJbnN0YWxsaW5nIHB1YmxpYyBrZXkgZGF0YQpMb2FkaW5nIGtleXJpbmcKLSBBZGRlZCBw
dWJsaWMga2V5IDhBRDIyRUNFNDQxQjcxODAKLSBVc2VyIElEOiBDZW50T1MgKEtlcm5lbCBNb2R1
bGUgR1BHIGtleSkKQmxvY2sgbGF5ZXIgU0NTSSBnZW5lcmljIChic2cpIGRyaXZlciB2ZXJzaW9u
IDAuNCBsb2FkZWQgKG1ham9yIDI1MikKaW8gc2NoZWR1bGVyIG5vb3AgcmVnaXN0ZXJlZAppbyBz
Y2hlZHVsZXIgYW50aWNpcGF0b3J5IHJlZ2lzdGVyZWQKaW8gc2NoZWR1bGVyIGRlYWRsaW5lIHJl
Z2lzdGVyZWQKaW8gc2NoZWR1bGVyIGNmcSByZWdpc3RlcmVkIChkZWZhdWx0KQpwY2lfaG90cGx1
ZzogUENJIEhvdCBQbHVnIFBDSSBDb3JlIHZlcnNpb246IDAuNQpwY2llaHA6IFBDSSBFeHByZXNz
IEhvdCBQbHVnIENvbnRyb2xsZXIgRHJpdmVyIHZlcnNpb246IDAuNAphY3BpcGhwOiBBQ1BJIEhv
dCBQbHVnIFBDSSBDb250cm9sbGVyIERyaXZlciB2ZXJzaW9uOiAwLjUKYWNwaXBocDogU2xvdCBb
MF0gcmVnaXN0ZXJlZAphY3BpcGhwOiBTbG90IFsxXSByZWdpc3RlcmVkCmFjcGlwaHA6IFNsb3Qg
WzJdIHJlZ2lzdGVyZWQKYWNwaXBocDogU2xvdCBbM10gcmVnaXN0ZXJlZAphY3BpcGhwOiBTbG90
IFs0XSByZWdpc3RlcmVkCmFjcGlwaHA6IFNsb3QgWzVdIHJlZ2lzdGVyZWQKYWNwaXBocDogU2xv
dCBbNl0gcmVnaXN0ZXJlZAphY3BpcGhwOiBTbG90IFs3XSByZWdpc3RlcmVkCmFjcGlwaHA6IFNs
b3QgWzhdIHJlZ2lzdGVyZWQKYWNwaXBocDogU2xvdCBbOV0gcmVnaXN0ZXJlZAphY3BpcGhwOiBT
bG90IFsxMF0gcmVnaXN0ZXJlZAphY3BpcGhwOiBTbG90IFsxMV0gcmVnaXN0ZXJlZAphY3BpcGhw
OiBTbG90IFsxMl0gcmVnaXN0ZXJlZAphY3BpcGhwOiBTbG90IFsxM10gcmVnaXN0ZXJlZAphY3Bp
cGhwOiBTbG90IFsxNF0gcmVnaXN0ZXJlZAphY3BpcGhwOiBTbG90IFsxNV0gcmVnaXN0ZXJlZAph
Y3BpcGhwOiBTbG90IFsxNl0gcmVnaXN0ZXJlZAphY3BpcGhwOiBTbG90IFsxN10gcmVnaXN0ZXJl
ZAphY3BpcGhwOiBTbG90IFsxOF0gcmVnaXN0ZXJlZAphY3BpcGhwOiBTbG90IFsxOV0gcmVnaXN0
ZXJlZAphY3BpcGhwOiBTbG90IFsyMF0gcmVnaXN0ZXJlZAphY3BpcGhwOiBTbG90IFsyMV0gcmVn
aXN0ZXJlZAphY3BpcGhwOiBTbG90IFsyMl0gcmVnaXN0ZXJlZAphY3BpcGhwOiBTbG90IFsyM10g
cmVnaXN0ZXJlZAphY3BpcGhwOiBTbG90IFsyNF0gcmVnaXN0ZXJlZAphY3BpcGhwOiBTbG90IFsy
NV0gcmVnaXN0ZXJlZAphY3BpcGhwOiBTbG90IFsyNl0gcmVnaXN0ZXJlZAphY3BpcGhwOiBTbG90
IFsyN10gcmVnaXN0ZXJlZAphY3BpcGhwOiBTbG90IFsyOF0gcmVnaXN0ZXJlZAphY3BpcGhwOiBT
bG90IFsyOV0gcmVnaXN0ZXJlZAphY3BpcGhwOiBTbG90IFszMF0gcmVnaXN0ZXJlZAphY3BpcGhw
OiBTbG90IFszMV0gcmVnaXN0ZXJlZAppbnB1dDogUG93ZXIgQnV0dG9uIGFzIC9kZXZpY2VzL0xO
WFNZU1RNOjAwL0xOWFBXUkJOOjAwL2lucHV0L2lucHV0MApBQ1BJOiBQb3dlciBCdXR0b24gW1BX
UkZdCmlucHV0OiBTbGVlcCBCdXR0b24gYXMgL2RldmljZXMvTE5YU1lTVE06MDAvTE5YU0xQQk46
MDAvaW5wdXQvaW5wdXQxCkFDUEk6IFNsZWVwIEJ1dHRvbiBbU0xQRl0KQUNQSTogYWNwaV9pZGxl
IHJlZ2lzdGVyZWQgd2l0aCBjcHVpZGxlCnByb2Nlc3NvciBMTlhDUFU6MDA6IHJlZ2lzdGVyZWQg
YXMgY29vbGluZ19kZXZpY2UwCnByb2Nlc3NvciBMTlhDUFU6MDE6IHJlZ2lzdGVyZWQgYXMgY29v
bGluZ19kZXZpY2UxCkVSU1Q6IFRhYmxlIGlzIG5vdCBmb3VuZCEKR0hFUzogSEVTVCBpcyBub3Qg
ZW5hYmxlZCEKICBhbGxvYyBpcnFfZGVzYyBmb3IgMjggb24gbm9kZSAtMQogIGFsbG9jIGtzdGF0
X2lycXMgb24gbm9kZSAtMQp4ZW4tcGxhdGZvcm0tcGNpIDAwMDA6MDA6MDMuMDogUENJIElOVCBB
IC0+IEdTSSAyOCAobGV2ZWwsIGxvdykgLT4gSVJRIDI4CkdyYW50IHRhYmxlIGluaXRpYWxpemVk
Ck5vbi12b2xhdGlsZSBtZW1vcnkgZHJpdmVyIHYxLjMKTGludXggYWdwZ2FydCBpbnRlcmZhY2Ug
djAuMTAzCmNyYXNoIG1lbW9yeSBkcml2ZXI6IHZlcnNpb24gMS4xClNlcmlhbDogODI1MC8xNjU1
MCBkcml2ZXIsIDQgcG9ydHMsIElSUSBzaGFyaW5nIGVuYWJsZWQKc2VyaWFsODI1MDogdHR5UzAg
YXQgSS9PIDB4M2Y4IChpcnEgPSA0KSBpcyBhIDE2NTUwQQowMDowYTogdHR5UzAgYXQgSS9PIDB4
M2Y4IChpcnEgPSA0KSBpcyBhIDE2NTUwQQpicmQ6IG1vZHVsZSBsb2FkZWQKbG9vcDogbW9kdWxl
IGxvYWRlZAppbnB1dDogTWFjaW50b3NoIG1vdXNlIGJ1dHRvbiBlbXVsYXRpb24gYXMgL2Rldmlj
ZXMvdmlydHVhbC9pbnB1dC9pbnB1dDIKRml4ZWQgTURJTyBCdXM6IHByb2JlZAplaGNpX2hjZDog
VVNCIDIuMCAnRW5oYW5jZWQnIEhvc3QgQ29udHJvbGxlciAoRUhDSSkgRHJpdmVyCm9oY2lfaGNk
OiBVU0IgMS4xICdPcGVuJyBIb3N0IENvbnRyb2xsZXIgKE9IQ0kpIERyaXZlcgp1aGNpX2hjZDog
VVNCIFVuaXZlcnNhbCBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlIGRyaXZlcgogIGFsbG9jIGly
cV9kZXNjIGZvciAyMyBvbiBub2RlIC0xCiAgYWxsb2Mga3N0YXRfaXJxcyBvbiBub2RlIC0xCnVo
Y2lfaGNkIDAwMDA6MDA6MDEuMjogUENJIElOVCBEIC0+IEdTSSAyMyAobGV2ZWwsIGxvdykgLT4g
SVJRIDIzCnVoY2lfaGNkIDAwMDA6MDA6MDEuMjogc2V0dGluZyBsYXRlbmN5IHRpbWVyIHRvIDY0
CnVoY2lfaGNkIDAwMDA6MDA6MDEuMjogVUhDSSBIb3N0IENvbnRyb2xsZXIKdWhjaV9oY2QgMDAw
MDowMDowMS4yOiBuZXcgVVNCIGJ1cyByZWdpc3RlcmVkLCBhc3NpZ25lZCBidXMgbnVtYmVyIDEK
dWhjaV9oY2QgMDAwMDowMDowMS4yOiBpcnEgMjMsIGlvIGJhc2UgMHgwMDAwYzI0MAp1c2IgdXNi
MTogTmV3IFVTQiBkZXZpY2UgZm91bmQsIGlkVmVuZG9yPTFkNmIsIGlkUHJvZHVjdD0wMDAxCnVz
YiB1c2IxOiBOZXcgVVNCIGRldmljZSBzdHJpbmdzOiBNZnI9MywgUHJvZHVjdD0yLCBTZXJpYWxO
dW1iZXI9MQp1c2IgdXNiMTogUHJvZHVjdDogVUhDSSBIb3N0IENvbnRyb2xsZXIKdXNiIHVzYjE6
IE1hbnVmYWN0dXJlcjogTGludXggMi42LjMyLTIyMC43LjEuZWw2Lng4Nl82NCB1aGNpX2hjZAp1
c2IgdXNiMTogU2VyaWFsTnVtYmVyOiAwMDAwOjAwOjAxLjIKdXNiIHVzYjE6IGNvbmZpZ3VyYXRp
b24gIzEgY2hvc2VuIGZyb20gMSBjaG9pY2UKaHViIDEtMDoxLjA6IFVTQiBodWIgZm91bmQKaHVi
IDEtMDoxLjA6IDIgcG9ydHMgZGV0ZWN0ZWQKUE5QOiBQUy8yIENvbnRyb2xsZXIgW1BOUDAzMDM6
UFMySyxQTlAwZjEzOlBTMk1dIGF0IDB4NjAsMHg2NCBpcnEgMSwxMgpzZXJpbzogaTgwNDIgS0JE
IHBvcnQgYXQgMHg2MCwweDY0IGlycSAxCnNlcmlvOiBpODA0MiBBVVggcG9ydCBhdCAweDYwLDB4
NjQgaXJxIDEyCm1pY2U6IFBTLzIgbW91c2UgZGV2aWNlIGNvbW1vbiBmb3IgYWxsIG1pY2UKcnRj
X2Ntb3MgMDA6MDU6IHJ0YyBjb3JlOiByZWdpc3RlcmVkIHJ0Y19jbW9zIGFzIHJ0YzAKcnRjMDog
YWxhcm1zIHVwIHRvIG9uZSBkYXksIDExNCBieXRlcyBudnJhbQpjcHVpZGxlOiB1c2luZyBnb3Zl
cm5vciBsYWRkZXIKY3B1aWRsZTogdXNpbmcgZ292ZXJub3IgbWVudQppbnB1dDogQVQgVHJhbnNs
YXRlZCBTZXQgMiBrZXlib2FyZCBhcyAvZGV2aWNlcy9wbGF0Zm9ybS9pODA0Mi9zZXJpbzAvaW5w
dXQvaW5wdXQzCnVzYmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgaGlkZGV2
CnVzYmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgdXNiaGlkCnVzYmhpZDog
djIuNjpVU0IgSElEIGNvcmUgZHJpdmVyClRDUCBjdWJpYyByZWdpc3RlcmVkCkluaXRpYWxpemlu
ZyBYRlJNIG5ldGxpbmsgc29ja2V0Ck5FVDogUmVnaXN0ZXJlZCBwcm90b2NvbCBmYW1pbHkgMTcK
cmVnaXN0ZXJlZCB0YXNrc3RhdHMgdmVyc2lvbiAxClhFTkJVUzogRGV2aWNlIHdpdGggbm8gZHJp
dmVyOiBkZXZpY2UvdmZiLzAKWEVOQlVTOiBEZXZpY2Ugd2l0aCBubyBkcml2ZXI6IGRldmljZS92
YmQvNzY4ClhFTkJVUzogRGV2aWNlIHdpdGggbm8gZHJpdmVyOiBkZXZpY2UvdmJkLzU2MzIKWEVO
QlVTOiBEZXZpY2Ugd2l0aCBubyBkcml2ZXI6IGRldmljZS92aWYvMApYRU5CVVM6IERldmljZSB3
aXRoIG5vIGRyaXZlcjogZGV2aWNlL3BjaS8wClhFTkJVUzogRGV2aWNlIHdpdGggbm8gZHJpdmVy
OiBkZXZpY2UvY29uc29sZS8wCnJ0Y19jbW9zIDAwOjA1OiBzZXR0aW5nIHN5c3RlbSBjbG9jayB0
byAyMDEyLTA0LTExIDE4OjQzOjUxIFVUQyAoMTMzNDE2OTgzMSkKSW5pdGFsaXppbmcgbmV0d29y
ayBkcm9wIG1vbml0b3Igc2VydmljZQpGcmVlaW5nIHVudXNlZCBrZXJuZWwgbWVtb3J5OiAxMjQ0
ayBmcmVlZApXcml0ZSBwcm90ZWN0aW5nIHRoZSBrZXJuZWwgcmVhZC1vbmx5IGRhdGE6IDEwMjQw
awpGcmVlaW5nIHVudXNlZCBrZXJuZWwgbWVtb3J5OiAxMDQwayBmcmVlZApGcmVlaW5nIHVudXNl
ZCBrZXJuZWwgbWVtb3J5OiAxNzU2ayBmcmVlZApkcmFjdXQ6IGRyYWN1dC0wMDQtMjU2LmVsNl8y
LjEKZHJhY3V0OiByZF9OT19MVUtTOiByZW1vdmluZyBjcnlwdG9sdWtzIGFjdGl2YXRpb24KZHJh
Y3V0OiByZF9OT19MVk06IHJlbW92aW5nIExWTSBhY3RpdmF0aW9uCmRldmljZS1tYXBwZXI6IHVl
dmVudDogdmVyc2lvbiAxLjAuMwpkZXZpY2UtbWFwcGVyOiBpb2N0bDogNC4yMi42LWlvY3RsICgy
MDExLTEwLTE5KSBpbml0aWFsaXNlZDogZG0tZGV2ZWxAcmVkaGF0LmNvbQp1ZGV2OiBzdGFydGlu
ZyB2ZXJzaW9uIDE0NwpkcmFjdXQ6IFN0YXJ0aW5nIHBseW1vdXRoIGRhZW1vbgpkcmFjdXQ6IHJk
X05PX0RNOiByZW1vdmluZyBETSBSQUlEIGFjdGl2YXRpb24KZHJhY3V0OiByZF9OT19NRDogcmVt
b3ZpbmcgTUQgUkFJRCBhY3RpdmF0aW9uCnhsYmxrX2luaXQ6IHJlZ2lzdGVyX2Jsa2RldiBtYWpv
cjogMjAyIAogIGFsbG9jIGlycV9kZXNjIGZvciAxNyBvbiBub2RlIDAKICBhbGxvYyBrc3RhdF9p
cnFzIG9uIG5vZGUgMAp2YmQgdmJkLTU2MzI6IDE5IHhlbmJ1c19kZXZfcHJvYmUgb24gZGV2aWNl
L3ZiZC81NjMyCmJsa2Zyb250OiB4dmRhOiBiYXJyaWVycyBkaXNhYmxlZAogeHZkYTogeHZkYTEg
eHZkYTIKdXNiIDEtMjogbmV3IGZ1bGwgc3BlZWQgVVNCIGRldmljZSB1c2luZyB1aGNpX2hjZCBh
bmQgYWRkcmVzcyAyCm1wdDJzYXMgdmVyc2lvbiAwOS4xMDEuMDAuMDAgbG9hZGVkCnNjc2kwIDog
RnVzaW9uIE1QVCBTQVMgSG9zdAogIGFsbG9jIGlycV9kZXNjIGZvciAzNiBvbiBub2RlIC0xCiAg
YWxsb2Mga3N0YXRfaXJxcyBvbiBub2RlIC0xCm1wdDJzYXMgMDAwMDowMDowNS4wOiBQQ0kgSU5U
IEEgLT4gR1NJIDM2IChsZXZlbCwgbG93KSAtPiBJUlEgMzYKbXB0MnNhcyAwMDAwOjAwOjA1LjA6
IHNldHRpbmcgbGF0ZW5jeSB0aW1lciB0byA2NAptcHQyc2FzMDogMzIgQklUIFBDSSBCVVMgRE1B
IEFERFJFU1NJTkcgU1VQUE9SVEVELCB0b3RhbCBtZW0gKDIwNTMzNzYga0IpCiAgYWxsb2MgaXJx
X2Rlc2MgZm9yIDQ4IG9uIG5vZGUgLTEKICBhbGxvYyBrc3RhdF9pcnFzIG9uIG5vZGUgLTEKbXB0
MnNhcyAwMDAwOjAwOjA1LjA6IGlycSA0OCBmb3IgTVNJL01TSS1YCm1wdDJzYXMwOiBQQ0ktTVNJ
LVggZW5hYmxlZDogSVJRIDQ4Cm1wdDJzYXMwOiBpb21lbSgweDAwMDAwMDAwZjMwZTAwMDApLCBt
YXBwZWQoMHhmZmZmYzkwMDAwOWU4MDAwKSwgc2l6ZSgxNjM4NCkKbXB0MnNhczA6IGlvcG9ydCgw
eDAwMDAwMDAwMDAwMGMxMDApLCBzaXplKDI1NikKaW5wdXQ6IEltRXhQUy8yIEdlbmVyaWMgRXhw
bG9yZXIgTW91c2UgYXMgL2RldmljZXMvcGxhdGZvcm0vaTgwNDIvc2VyaW8xL2lucHV0L2lucHV0
NAptcHQyc2FzMDogQWxsb2NhdGVkIHBoeXNpY2FsIG1lbW9yeTogc2l6ZSgyNjg4IGtCKQptcHQy
c2FzMDogQ3VycmVudCBDb250cm9sbGVyIFF1ZXVlIERlcHRoKDE3NTQpLCBNYXggQ29udHJvbGxl
ciBRdWV1ZSBEZXB0aCgyMDE1KQptcHQyc2FzMDogU2NhdHRlciBHYXRoZXIgRWxlbWVudHMgcGVy
IElPKDEyOCkKUmVmaW5lZCBUU0MgY2xvY2tzb3VyY2UgY2FsaWJyYXRpb246IDMxOTIuNzUwIE1I
ei4KU3dpdGNoaW5nIHRvIGNsb2Nrc291cmNlIHRzYwp1c2IgMS0yOiBOZXcgVVNCIGRldmljZSBm
b3VuZCwgaWRWZW5kb3I9MDYyNywgaWRQcm9kdWN0PTAwMDEKdXNiIDEtMjogTmV3IFVTQiBkZXZp
Y2Ugc3RyaW5nczogTWZyPTMsIFByb2R1Y3Q9MiwgU2VyaWFsTnVtYmVyPTEKdXNiIDEtMjogUHJv
ZHVjdDogUUVNVSBVU0IgVGFibGV0CnVzYiAxLTI6IE1hbnVmYWN0dXJlcjogUUVNVSAwLjEwLjIK
dXNiIDEtMjogU2VyaWFsTnVtYmVyOiAxCnVzYiAxLTI6IGNvbmZpZ3VyYXRpb24gIzEgY2hvc2Vu
IGZyb20gMSBjaG9pY2UKaW5wdXQ6IFFFTVUgMC4xMC4yIFFFTVUgVVNCIFRhYmxldCBhcyAvZGV2
aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MDEuMi91c2IxLzEtMi8xLTI6MS4wL2lucHV0L2lucHV0
NQpnZW5lcmljLXVzYiAwMDAzOjA2Mjc6MDAwMS4wMDAxOiBpbnB1dCxoaWRyYXcwOiBVU0IgSElE
IHYwLjAxIFBvaW50ZXIgW1FFTVUgMC4xMC4yIFFFTVUgVVNCIFRhYmxldF0gb24gdXNiLTAwMDA6
MDA6MDEuMi0yL2lucHV0MAptcHQyc2FzMDogX2Jhc2VfZXZlbnRfbm90aWZpY2F0aW9uOiB0aW1l
b3V0Cm1mOgoJMDcwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMGYy
ZjdmZmYgZmZmZmZmZmMgZmZmZmZmZmYgCglmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAKbXB0
MnNhczA6IHNlbmRpbmcgZGlhZyByZXNldCAhIQptcHQyc2FzMDogZGlhZyByZXNldDogU1VDQ0VT
UwptcHQyc2FzIDAwMDA6MDA6MDUuMDogUENJIElOVCBBIGRpc2FibGVkCm1wdDJzYXMwOiBmYWls
dXJlIGF0IGRyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfc2NzaWguYzo3NjI4L19zY3NpaF9w
cm9iZSgpIQphdGFfcGlpeCAwMDAwOjAwOjAxLjE6IHZlcnNpb24gMi4xMwphdGFfcGlpeCAwMDAw
OjAwOjAxLjE6IHNldHRpbmcgbGF0ZW5jeSB0aW1lciB0byA2NApzY3NpMSA6IGF0YV9waWl4CnNj
c2kyIDogYXRhX3BpaXgKYXRhMTogUEFUQSBtYXggTVdETUEyIGNtZCAweDFmMCBjdGwgMHgzZjYg
Ym1kbWEgMHhjMjYwIGlycSAxNAphdGEyOiBQQVRBIG1heCBNV0RNQTIgY21kIDB4MTcwIGN0bCAw
eDM3NiBibWRtYSAweGMyNjggaXJxIDE1CmF0YTIuMDE6IE5PREVWIGFmdGVyIHBvbGxpbmcgZGV0
ZWN0aW9uCmF0YTIuMDA6IEFUQVBJOiBRRU1VIERWRC1ST00sIDAuMTAuMiwgbWF4IFVETUEvMTAw
CmF0YTIuMDA6IGNvbmZpZ3VyZWQgZm9yIE1XRE1BMgpzY3NpIDI6MDowOjA6IENELVJPTSAgICAg
ICAgICAgIFFFTVUgICAgIFFFTVUgRFZELVJPTSAgICAgMC4xMCBQUTogMCBBTlNJOiA1CnNyMDog
c2NzaTMtbW1jIGRyaXZlOiA0eC80eCB4YS9mb3JtMiB0cmF5ClVuaWZvcm0gQ0QtUk9NIGRyaXZl
ciBSZXZpc2lvbjogMy4yMApzciAyOjA6MDowOiBBdHRhY2hlZCBzY3NpIENELVJPTSBzcjAKRVhU
NC1mcyAoeHZkYTEpOiBtb3VudGVkIGZpbGVzeXN0ZW0gd2l0aCBvcmRlcmVkIGRhdGEgbW9kZS4g
T3B0czogCmRyYWN1dDogTW91bnRlZCByb290IGZpbGVzeXN0ZW0gL2Rldi94dmRhMQpkcmFjdXQ6
IExvYWRpbmcgU0VMaW51eCBwb2xpY3kKdHlwZT0xNDA0IGF1ZGl0KDEzMzQxNjk4NjMuNzQxOjIp
OiBlbmZvcmNpbmc9MSBvbGRfZW5mb3JjaW5nPTAgYXVpZD00Mjk0OTY3Mjk1IHNlcz00Mjk0OTY3
Mjk1ClNFTGludXg6IDIwNDggYXZ0YWIgaGFzaCBzbG90cywgMjI2MDA1IHJ1bGVzLgpTRUxpbnV4
OiAyMDQ4IGF2dGFiIGhhc2ggc2xvdHMsIDIyNjAwNSBydWxlcy4KU0VMaW51eDogIDkgdXNlcnMs
IDEyIHJvbGVzLCAzNTc4IHR5cGVzLCAxNzkgYm9vbHMsIDEgc2VucywgMTAyNCBjYXRzClNFTGlu
dXg6ICA4MSBjbGFzc2VzLCAyMjYwMDUgcnVsZXMKU0VMaW51eDogIENvbXBsZXRpbmcgaW5pdGlh
bGl6YXRpb24uClNFTGludXg6ICBTZXR0aW5nIHVwIGV4aXN0aW5nIHN1cGVyYmxvY2tzLgpTRUxp
bnV4OiBpbml0aWFsaXplZCAoZGV2IHh2ZGExLCB0eXBlIGV4dDQpLCB1c2VzIHhhdHRyClNFTGlu
dXg6IGluaXRpYWxpemVkIChkZXYgdG1wZnMsIHR5cGUgdG1wZnMpLCB1c2VzIHRyYW5zaXRpb24g
U0lEcwpTRUxpbnV4OiBpbml0aWFsaXplZCAoZGV2IHVzYmZzLCB0eXBlIHVzYmZzKSwgdXNlcyBn
ZW5mc19jb250ZXh0cwpTRUxpbnV4OiBpbml0aWFsaXplZCAoZGV2IHNlbGludXhmcywgdHlwZSBz
ZWxpbnV4ZnMpLCB1c2VzIGdlbmZzX2NvbnRleHRzClNFTGludXg6IGluaXRpYWxpemVkIChkZXYg
bXF1ZXVlLCB0eXBlIG1xdWV1ZSksIHVzZXMgdHJhbnNpdGlvbiBTSURzClNFTGludXg6IGluaXRp
YWxpemVkIChkZXYgaHVnZXRsYmZzLCB0eXBlIGh1Z2V0bGJmcyksIHVzZXMgdHJhbnNpdGlvbiBT
SURzClNFTGludXg6IGluaXRpYWxpemVkIChkZXYgZGV2cHRzLCB0eXBlIGRldnB0cyksIHVzZXMg
dHJhbnNpdGlvbiBTSURzClNFTGludXg6IGluaXRpYWxpemVkIChkZXYgaW5vdGlmeWZzLCB0eXBl
IGlub3RpZnlmcyksIHVzZXMgZ2VuZnNfY29udGV4dHMKU0VMaW51eDogaW5pdGlhbGl6ZWQgKGRl
diBhbm9uX2lub2RlZnMsIHR5cGUgYW5vbl9pbm9kZWZzKSwgdXNlcyBnZW5mc19jb250ZXh0cwpT
RUxpbnV4OiBpbml0aWFsaXplZCAoZGV2IHBpcGVmcywgdHlwZSBwaXBlZnMpLCB1c2VzIHRhc2sg
U0lEcwpTRUxpbnV4OiBpbml0aWFsaXplZCAoZGV2IGRlYnVnZnMsIHR5cGUgZGVidWdmcyksIHVz
ZXMgZ2VuZnNfY29udGV4dHMKU0VMaW51eDogaW5pdGlhbGl6ZWQgKGRldiBzb2NrZnMsIHR5cGUg
c29ja2ZzKSwgdXNlcyB0YXNrIFNJRHMKU0VMaW51eDogaW5pdGlhbGl6ZWQgKGRldiBkZXZ0bXBm
cywgdHlwZSBkZXZ0bXBmcyksIHVzZXMgdHJhbnNpdGlvbiBTSURzClNFTGludXg6IGluaXRpYWxp
emVkIChkZXYgdG1wZnMsIHR5cGUgdG1wZnMpLCB1c2VzIHRyYW5zaXRpb24gU0lEcwpTRUxpbnV4
OiBpbml0aWFsaXplZCAoZGV2IHByb2MsIHR5cGUgcHJvYyksIHVzZXMgZ2VuZnNfY29udGV4dHMK
U0VMaW51eDogaW5pdGlhbGl6ZWQgKGRldiBiZGV2LCB0eXBlIGJkZXYpLCB1c2VzIGdlbmZzX2Nv
bnRleHRzClNFTGludXg6IGluaXRpYWxpemVkIChkZXYgcm9vdGZzLCB0eXBlIHJvb3RmcyksIHVz
ZXMgZ2VuZnNfY29udGV4dHMKU0VMaW51eDogaW5pdGlhbGl6ZWQgKGRldiBzeXNmcywgdHlwZSBz
eXNmcyksIHVzZXMgZ2VuZnNfY29udGV4dHMKdHlwZT0xNDAzIGF1ZGl0KDEzMzQxNjk4NjQuMDcz
OjMpOiBwb2xpY3kgbG9hZGVkIGF1aWQ9NDI5NDk2NzI5NSBzZXM9NDI5NDk2NzI5NQpkcmFjdXQ6
IApkcmFjdXQ6IFN3aXRjaGluZyByb290CnJlYWRhaGVhZDogc3RhcnRpbmcKdWRldjogc3RhcnRp
bmcgdmVyc2lvbiAxNDcKc3IgMjowOjA6MDogQXR0YWNoZWQgc2NzaSBnZW5lcmljIHNnMCB0eXBl
IDUKcGlpeDRfc21idXMgMDAwMDowMDowMS4zOiBTTUJ1cyBiYXNlIGFkZHJlc3MgdW5pbml0aWFs
aXplZCAtIHVwZ3JhZGUgQklPUyBvciB1c2UgZm9yY2VfYWRkcj0weGFkZHIKSW5pdGlhbGlzaW5n
IFhlbiB2aXJ0dWFsIGV0aGVybmV0IGRyaXZlci4KICBhbGxvYyBpcnFfZGVzYyBmb3IgMTggb24g
bm9kZSAwCiAgYWxsb2Mga3N0YXRfaXJxcyBvbiBub2RlIDAKbWljcm9jb2RlOiBDUFUwIHNpZz0w
eDIwNmE3LCBwZj0weDIsIHJldmlzaW9uPTB4MWIKcGxhdGZvcm0gbWljcm9jb2RlOiBmaXJtd2Fy
ZTogcmVxdWVzdGluZyBpbnRlbC11Y29kZS8wNi0yYS0wNwptaWNyb2NvZGU6IENQVTEgc2lnPTB4
MjA2YTcsIHBmPTB4MiwgcmV2aXNpb249MHgxYgpwbGF0Zm9ybSBtaWNyb2NvZGU6IGZpcm13YXJl
OiByZXF1ZXN0aW5nIGludGVsLXVjb2RlLzA2LTJhLTA3Ck1pY3JvY29kZSBVcGRhdGUgRHJpdmVy
OiB2Mi4wMCA8dGlncmFuQGFpdmF6aWFuLmZzbmV0LmNvLnVrPiwgUGV0ZXIgT3J1YmEKcGFycG9y
dF9wYyAwMDowYjogcmVwb3J0ZWQgYnkgUGx1ZyBhbmQgUGxheSBBQ1BJCnBhcnBvcnQwOiBQQy1z
dHlsZSBhdCAweDM3OCwgaXJxIDcgW1BDU1BQLFRSSVNUQVRFXQpwcGRldjogdXNlci1zcGFjZSBw
YXJhbGxlbCBwb3J0IGRyaXZlcgpBZGRpbmcgMTA0NzU0NGsgc3dhcCBvbiAvZGV2L3h2ZGEyLiAg
UHJpb3JpdHk6LTEgZXh0ZW50czoxIGFjcm9zczoxMDQ3NTQ0ayBTUwpTRUxpbnV4OiBpbml0aWFs
aXplZCAoZGV2IGJpbmZtdF9taXNjLCB0eXBlIGJpbmZtdF9taXNjKSwgdXNlcyBnZW5mc19jb250
ZXh0cwpORVQ6IFJlZ2lzdGVyZWQgcHJvdG9jb2wgZmFtaWx5IDEwCmxvOiBEaXNhYmxlZCBQcml2
YWN5IEV4dGVuc2lvbnMKaXA2X3RhYmxlczogKEMpIDIwMDAtMjAwNiBOZXRmaWx0ZXIgQ29yZSBU
ZWFtCm5mX2Nvbm50cmFjayB2ZXJzaW9uIDAuNS4wICgxNjM4NCBidWNrZXRzLCA2NTUzNiBtYXgp
CmlwX3RhYmxlczogKEMpIDIwMDAtMjAwNiBOZXRmaWx0ZXIgQ29yZSBUZWFtClJQQzogUmVnaXN0
ZXJlZCB1ZHAgdHJhbnNwb3J0IG1vZHVsZS4KUlBDOiBSZWdpc3RlcmVkIHRjcCB0cmFuc3BvcnQg
bW9kdWxlLgpSUEM6IFJlZ2lzdGVyZWQgdGNwIE5GU3Y0LjEgYmFja2NoYW5uZWwgdHJhbnNwb3J0
IG1vZHVsZS4KU0VMaW51eDogaW5pdGlhbGl6ZWQgKGRldiBycGNfcGlwZWZzLCB0eXBlIHJwY19w
aXBlZnMpLCB1c2VzIGdlbmZzX2NvbnRleHRzClNFTGludXg6IGluaXRpYWxpemVkIChkZXYgYXV0
b2ZzLCB0eXBlIGF1dG9mcyksIHVzZXMgZ2VuZnNfY29udGV4dHMKU0VMaW51eDogaW5pdGlhbGl6
ZWQgKGRldiBhdXRvZnMsIHR5cGUgYXV0b2ZzKSwgdXNlcyBnZW5mc19jb250ZXh0cwpTRUxpbnV4
OiBpbml0aWFsaXplZCAoZGV2IGF1dG9mcywgdHlwZSBhdXRvZnMpLCB1c2VzIGdlbmZzX2NvbnRl
eHRzCmV0aDA6IG5vIElQdjYgcm91dGVycyBwcmVzZW50Cg==
--485b393aaadf88221704bd6c92bc
Content-Type: text/plain; charset=US-ASCII; name="pvhvm_lspci.txt"
Content-Disposition: attachment; filename="pvhvm_lspci.txt"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h0wso6hb3

MDA6MDAuMCBIb3N0IGJyaWRnZTogSW50ZWwgQ29ycG9yYXRpb24gNDQwRlggLSA4MjQ0MUZYIFBN
QyBbTmF0b21hXSAocmV2IDAyKQoJU3Vic3lzdGVtOiBSZWQgSGF0LCBJbmMgUWVtdSB2aXJ0dWFs
IG1hY2hpbmUKCVBoeXNpY2FsIFNsb3Q6IDAKCUZsYWdzOiBidXMgbWFzdGVyLCBmYXN0IGRldnNl
bCwgbGF0ZW5jeSAwCgowMDowMS4wIElTQSBicmlkZ2U6IEludGVsIENvcnBvcmF0aW9uIDgyMzcx
U0IgUElJWDMgSVNBIFtOYXRvbWEvVHJpdG9uIElJXQoJU3Vic3lzdGVtOiBSZWQgSGF0LCBJbmMg
UWVtdSB2aXJ0dWFsIG1hY2hpbmUKCUZsYWdzOiBidXMgbWFzdGVyLCBtZWRpdW0gZGV2c2VsLCBs
YXRlbmN5IDAKCjAwOjAxLjEgSURFIGludGVyZmFjZTogSW50ZWwgQ29ycG9yYXRpb24gODIzNzFT
QiBQSUlYMyBJREUgW05hdG9tYS9Ucml0b24gSUldIChwcm9nLWlmIDgwIFtNYXN0ZXJdKQoJU3Vi
c3lzdGVtOiBYZW5Tb3VyY2UsIEluYy4gRGV2aWNlIDAwMDEKCUZsYWdzOiBidXMgbWFzdGVyLCBt
ZWRpdW0gZGV2c2VsLCBsYXRlbmN5IDY0CglbdmlydHVhbF0gTWVtb3J5IGF0IDAwMDAwMWYwICgz
Mi1iaXQsIG5vbi1wcmVmZXRjaGFibGUpIFtzaXplPThdCglbdmlydHVhbF0gTWVtb3J5IGF0IDAw
MDAwM2YwICh0eXBlIDMsIG5vbi1wcmVmZXRjaGFibGUpIFtzaXplPTFdCglbdmlydHVhbF0gTWVt
b3J5IGF0IDAwMDAwMTcwICgzMi1iaXQsIG5vbi1wcmVmZXRjaGFibGUpIFtzaXplPThdCglbdmly
dHVhbF0gTWVtb3J5IGF0IDAwMDAwMzcwICh0eXBlIDMsIG5vbi1wcmVmZXRjaGFibGUpIFtzaXpl
PTFdCglJL08gcG9ydHMgYXQgYzI2MCBbc2l6ZT0xNl0KCUtlcm5lbCBkcml2ZXIgaW4gdXNlOiBh
dGFfcGlpeAoJS2VybmVsIG1vZHVsZXM6IGF0YV9nZW5lcmljLCBwYXRhX2FjcGksIGF0YV9waWl4
CgowMDowMS4yIFVTQiBjb250cm9sbGVyOiBJbnRlbCBDb3Jwb3JhdGlvbiA4MjM3MVNCIFBJSVgz
IFVTQiBbTmF0b21hL1RyaXRvbiBJSV0gKHJldiAwMSkgKHByb2ctaWYgMDAgW1VIQ0ldKQoJU3Vi
c3lzdGVtOiBSZWQgSGF0LCBJbmMgUWVtdSB2aXJ0dWFsIG1hY2hpbmUKCUZsYWdzOiBidXMgbWFz
dGVyLCBmYXN0IGRldnNlbCwgbGF0ZW5jeSA2NCwgSVJRIDIzCglJL08gcG9ydHMgYXQgYzI0MCBb
c2l6ZT0zMl0KCUtlcm5lbCBkcml2ZXIgaW4gdXNlOiB1aGNpX2hjZAoKMDA6MDEuMyBCcmlkZ2U6
IEludGVsIENvcnBvcmF0aW9uIDgyMzcxQUIvRUIvTUIgUElJWDQgQUNQSSAocmV2IDAxKQoJU3Vi
c3lzdGVtOiBSZWQgSGF0LCBJbmMgUWVtdSB2aXJ0dWFsIG1hY2hpbmUKCVBoeXNpY2FsIFNsb3Q6
IDEKCUZsYWdzOiBidXMgbWFzdGVyLCBmYXN0IGRldnNlbCwgbGF0ZW5jeSAwLCBJUlEgOQoJS2Vy
bmVsIG1vZHVsZXM6IGkyYy1waWl4NAoKMDA6MDIuMCBWR0EgY29tcGF0aWJsZSBjb250cm9sbGVy
OiBDaXJydXMgTG9naWMgR0QgNTQ0NiAocHJvZy1pZiAwMCBbVkdBIGNvbnRyb2xsZXJdKQoJU3Vi
c3lzdGVtOiBYZW5Tb3VyY2UsIEluYy4gRGV2aWNlIDAwMDEKCVBoeXNpY2FsIFNsb3Q6IDIKCUZs
YWdzOiBidXMgbWFzdGVyLCBmYXN0IGRldnNlbCwgbGF0ZW5jeSAwCglNZW1vcnkgYXQgZjAwMDAw
MDAgKDMyLWJpdCwgcHJlZmV0Y2hhYmxlKSBbc2l6ZT0zMk1dCglNZW1vcnkgYXQgZjMwZTQwMDAg
KDMyLWJpdCwgbm9uLXByZWZldGNoYWJsZSkgW3NpemU9NEtdCglFeHBhbnNpb24gUk9NIGF0IDx1
bmFzc2lnbmVkPiBbZGlzYWJsZWRdCglLZXJuZWwgbW9kdWxlczogY2lycnVzZmIKCjAwOjAzLjAg
VW5hc3NpZ25lZCBjbGFzcyBbZmY4MF06IFhlblNvdXJjZSwgSW5jLiBYZW4gUGxhdGZvcm0gRGV2
aWNlIChyZXYgMDEpCglTdWJzeXN0ZW06IFhlblNvdXJjZSwgSW5jLiBYZW4gUGxhdGZvcm0gRGV2
aWNlCglQaHlzaWNhbCBTbG90OiAzCglGbGFnczogYnVzIG1hc3RlciwgZmFzdCBkZXZzZWwsIGxh
dGVuY3kgMCwgSVJRIDI4CglJL08gcG9ydHMgYXQgYzAwMCBbc2l6ZT0yNTZdCglNZW1vcnkgYXQg
ZjIwMDAwMDAgKDMyLWJpdCwgcHJlZmV0Y2hhYmxlKSBbc2l6ZT0xNk1dCglLZXJuZWwgZHJpdmVy
IGluIHVzZTogeGVuLXBsYXRmb3JtLXBjaQoKMDA6MDUuMCBTZXJpYWwgQXR0YWNoZWQgU0NTSSBj
b250cm9sbGVyOiBMU0kgTG9naWMgLyBTeW1iaW9zIExvZ2ljIFNBUzIwMDggUENJLUV4cHJlc3Mg
RnVzaW9uLU1QVCBTQVMtMiBbRmFsY29uXSAocmV2IDAzKQoJU3Vic3lzdGVtOiBMU0kgTG9naWMg
LyBTeW1iaW9zIExvZ2ljIERldmljZSAzMDIwCglQaHlzaWNhbCBTbG90OiA1CglGbGFnczogZmFz
dCBkZXZzZWwsIElSUSAzNgoJSS9PIHBvcnRzIGF0IGMxMDAgW3NpemU9MjU2XQoJTWVtb3J5IGF0
IGYzMGUwMDAwICg2NC1iaXQsIG5vbi1wcmVmZXRjaGFibGUpIFtzaXplPTE2S10KCU1lbW9yeSBh
dCBmMzA4MDAwMCAoNjQtYml0LCBub24tcHJlZmV0Y2hhYmxlKSBbc2l6ZT0yNTZLXQoJRXhwYW5z
aW9uIFJPTSBhdCBmMzAwMDAwMCBbZGlzYWJsZWRdIFtzaXplPTUxMktdCglDYXBhYmlsaXRpZXM6
IFs1MF0gUG93ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDMKCUNhcGFiaWxpdGllczogWzY4XSBFeHBy
ZXNzIEVuZHBvaW50LCBNU0kgMDAKCUNhcGFiaWxpdGllczogW2QwXSBWaXRhbCBQcm9kdWN0IERh
dGEKCUNhcGFiaWxpdGllczogW2E4XSBNU0k6IEVuYWJsZS0gQ291bnQ9MS8xIE1hc2thYmxlLSA2
NGJpdCsKCUNhcGFiaWxpdGllczogW2MwXSBNU0ktWDogRW5hYmxlLSBDb3VudD0xNSBNYXNrZWQt
CglLZXJuZWwgbW9kdWxlczogbXB0MnNhcwoK
--485b393aaadf88221704bd6c92bc
Content-Type: text/plain; charset=US-ASCII; name="xm_dmesg.txt"
Content-Disposition: attachment; filename="xm_dmesg.txt"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h0wso6hx4

IF9fICBfXyAgICAgICAgICAgIF8gIF8gICAgXyAgIF9fX19fICAgICAgICAgICAgIF8gICAgICAg
ICAgICAgICAgICAgCiBcIFwvIC9fX18gXyBfXyAgIHwgfHwgfCAgLyB8IHxfX18gLyAgICBfIF9f
IF9fXy8gfCAgIF8gX18gIF8gX18gX19fIAogIFwgIC8vIF8gXCAnXyBcICB8IHx8IHxfIHwgfCAg
IHxfIFwgX198ICdfXy8gX198IHxfX3wgJ18gXHwgJ19fLyBfIFwKICAvICBcICBfXy8gfCB8IHwg
fF9fICAgX3x8IHxfIF9fXykgfF9ffCB8IHwgKF9ffCB8X198IHxfKSB8IHwgfCAgX18vCiAvXy9c
X1xfX198X3wgfF98ICAgIHxffChfKV8oXylfX19fLyAgIHxffCAgXF9fX3xffCAgfCAuX18vfF98
ICBcX19ffAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHxffCAgICAgICAgICAgICAKKFhFTikgWGVuIHZlcnNpb24gNC4xLjMtcmMxLXByZSAoc2Fk
bUApIChnY2MgdmVyc2lvbiA0LjYuMyAoVWJ1bnR1L0xpbmFybyA0LjYuMy0xdWJ1bnR1NCkgKSBX
ZWQgQXByIDExIDAxOjU2OjQ0IEVEVCAyMDEyCihYRU4pIExhdGVzdCBDaGFuZ2VTZXQ6IFdlZCBB
cHIgMDQgMTY6MDk6MjUgMjAxMiArMDEwMCAyMzI3Njo2ZjIyNDQzMWVjYTIKKFhFTikgQm9vdGxv
YWRlcjogR1JVQiAxLjk5LTIxdWJ1bnR1MgooWEVOKSBDb21tYW5kIGxpbmU6IHBsYWNlaG9sZGVy
IGRvbTBfbWVtPTEwMjRNIGRvbTBfbWF4X3ZjcHVzPTIgbG9nbHZsPWFsbCBndWVzdF9sb2dsdmw9
YWxsIGlvbW11PTEKKFhFTikgVmlkZW8gaW5mb3JtYXRpb246CihYRU4pICBWR0EgaXMgdGV4dCBt
b2RlIDgweDI1LCBmb250IDh4MTYKKFhFTikgIFZCRS9EREMgbWV0aG9kczogVjI7IEVESUQgdHJh
bnNmZXIgdGltZTogMSBzZWNvbmRzCihYRU4pIERpc2MgaW5mb3JtYXRpb246CihYRU4pICBGb3Vu
ZCA3IE1CUiBzaWduYXR1cmVzCihYRU4pICBGb3VuZCA2IEVERCBpbmZvcm1hdGlvbiBzdHJ1Y3R1
cmVzCihYRU4pIFhlbi1lODIwIFJBTSBtYXA6CihYRU4pICAwMDAwMDAwMDAwMDAwMDAwIC0gMDAw
MDAwMDAwMDA4ZDAwMCAodXNhYmxlKQooWEVOKSAgMDAwMDAwMDAwMDA4ZDAwMCAtIDAwMDAwMDAw
MDAwYTAwMDAgKHJlc2VydmVkKQooWEVOKSAgMDAwMDAwMDAwMDBlMDAwMCAtIDAwMDAwMDAwMDAx
MDAwMDAgKHJlc2VydmVkKQooWEVOKSAgMDAwMDAwMDAwMDEwMDAwMCAtIDAwMDAwMDAwYmU3YTUw
MDAgKHVzYWJsZSkKKFhFTikgIDAwMDAwMDAwYmU3YTUwMDAgLSAwMDAwMDAwMGJlN2YxMDAwIChB
Q1BJIE5WUykKKFhFTikgIDAwMDAwMDAwYmU3ZjEwMDAgLSAwMDAwMDAwMGJlN2Y5MDAwIChBQ1BJ
IGRhdGEpCihYRU4pICAwMDAwMDAwMGJlN2Y5MDAwIC0gMDAwMDAwMDBiZjQ3NzAwMCAocmVzZXJ2
ZWQpCihYRU4pICAwMDAwMDAwMGJmNDc3MDAwIC0gMDAwMDAwMDBiZjQ3ODAwMCAoQUNQSSBOVlMp
CihYRU4pICAwMDAwMDAwMGJmNDc4MDAwIC0gMDAwMDAwMDBiZjQ4OTAwMCAocmVzZXJ2ZWQpCihY
RU4pICAwMDAwMDAwMGJmNDg5MDAwIC0gMDAwMDAwMDBiZjQ4YzAwMCAoQUNQSSBOVlMpCihYRU4p
ICAwMDAwMDAwMGJmNDhjMDAwIC0gMDAwMDAwMDBiZjRhZDAwMCAocmVzZXJ2ZWQpCihYRU4pICAw
MDAwMDAwMGJmNGFkMDAwIC0gMDAwMDAwMDBiZjRhZjAwMCAodXNhYmxlKQooWEVOKSAgMDAwMDAw
MDBiZjRhZjAwMCAtIDAwMDAwMDAwYmY1MDMwMDAgKHJlc2VydmVkKQooWEVOKSAgMDAwMDAwMDBi
ZjUwMzAwMCAtIDAwMDAwMDAwYmY1MGQwMDAgKEFDUEkgTlZTKQooWEVOKSAgMDAwMDAwMDBiZjUw
ZDAwMCAtIDAwMDAwMDAwYmY1MzMwMDAgKHJlc2VydmVkKQooWEVOKSAgMDAwMDAwMDBiZjUzMzAw
MCAtIDAwMDAwMDAwYmY1NzYwMDAgKEFDUEkgTlZTKQooWEVOKSAgMDAwMDAwMDBiZjU3NjAwMCAt
IDAwMDAwMDAwYmY4MDAwMDAgKHVzYWJsZSkKKFhFTikgIDAwMDAwMDAwZmVkMWMwMDAgLSAwMDAw
MDAwMGZlZDQwMDAwIChyZXNlcnZlZCkKKFhFTikgIDAwMDAwMDAwZmYwMDAwMDAgLSAwMDAwMDAw
MTAwMDAwMDAwIChyZXNlcnZlZCkKKFhFTikgIDAwMDAwMDAxMDAwMDAwMDAgLSAwMDAwMDAwNDQw
MDAwMDAwICh1c2FibGUpCihYRU4pIEFDUEk6IFJTRFAgMDAwRjA0NTAsIDAwMjQgKHIyIFNVUEVS
TSkKKFhFTikgQUNQSTogWFNEVCBCRTdGMTA4MCwgMDA3QyAocjEgU1VQRVJNIFNNQ0ktLU1CICAg
ICAgICAxIEFNSSAgICAgMTAwMTMpCihYRU4pIEFDUEk6IEZBQ1AgQkU3RjdGNDgsIDAwRjQgKHI0
IFNVUEVSTSBTTUNJLS1NQiAgICAgICAgMSBBTUkgICAgIDEwMDEzKQooWEVOKSBBQ1BJOiBEU0RU
IEJFN0YxMTg4LCA2REMwIChyMiBTVVBFUk0gU01DSS0tTUIgICAgICAgIDAgSU5UTCAyMDA1MTEx
NykKKFhFTikgQUNQSTogRkFDUyBCRjUwQUY4MCwgMDA0MAooWEVOKSBBQ1BJOiBBUElDIEJFN0Y4
MDQwLCAwMDkyIChyMyBTVVBFUk0gU01DSS0tTUIgICAgICAgIDEgQU1JICAgICAxMDAxMykKKFhF
TikgQUNQSTogU1NEVCBCRTdGODBEOCwgMDFENiAocjEgQU1JQ1BVICAgICBQUk9DICAgICAgICAx
IE1TRlQgIDMwMDAwMDEpCihYRU4pIEFDUEk6IE1DRkcgQkU3RjgyQjAsIDAwM0MgKHIxIFNVUEVS
TSBTTUNJLS1NQiAgICAgICAgMSBNU0ZUICAgICAgIDk3KQooWEVOKSBBQ1BJOiBIUEVUIEJFN0Y4
MkYwLCAwMDM4IChyMSBTVVBFUk0gU01DSS0tTUIgICAgICAgIDEgQU1JLiAgICAgICAgNCkKKFhF
TikgQUNQSTogU1BNSSBCRTdGODMyOCwgMDA0MCAocjUgQSBNIEkgICBPRU1TUE1JICAgICAgICAw
IEFNSS4gICAgICAgIDApCihYRU4pIEFDUEk6IERNQVIgQkU3RjgzNjgsIDAwQjAgKHIxIEFMQVNL
QSAgICBBIE0gSSAgICAgICAgMSBJTlRMICAgICAgICAxKQooWEVOKSBBQ1BJOiBFSU5KIEJFN0Y4
NDE4LCAwMTMwIChyMSAgICBBTUkgQU1JIEVJTkogICAgICAgIDAgICAgICAgICAgICAgMCkKKFhF
TikgQUNQSTogRVJTVCBCRTdGODU0OCwgMDIxMCAocjEgIEFNSUVSIEFNSSBFUlNUICAgICAgICAw
ICAgICAgICAgICAgIDApCihYRU4pIEFDUEk6IEhFU1QgQkU3Rjg3NTgsIDAwQTggKHIxICAgIEFN
SSBBTUkgSEVTVCAgICAgICAgMCAgICAgICAgICAgICAwKQooWEVOKSBBQ1BJOiBCRVJUIEJFN0Y4
ODAwLCAwMDMwIChyMSAgICBBTUkgQU1JIEJFUlQgICAgICAgIDAgICAgICAgICAgICAgMCkKKFhF
TikgU3lzdGVtIFJBTTogMTYzNjFNQiAoMTY3NTQ0MjRrQikKKFhFTikgTm8gTlVNQSBjb25maWd1
cmF0aW9uIGZvdW5kCihYRU4pIEZha2luZyBhIG5vZGUgYXQgMDAwMDAwMDAwMDAwMDAwMC0wMDAw
MDAwNDQwMDAwMDAwCihYRU4pIERvbWFpbiBoZWFwIGluaXRpYWxpc2VkCihYRU4pIGZvdW5kIFNN
UCBNUC10YWJsZSBhdCAwMDBmY2UwMAooWEVOKSBETUkgMi43IHByZXNlbnQuCihYRU4pIFVzaW5n
IEFQSUMgZHJpdmVyIGRlZmF1bHQKKFhFTikgQUNQSTogUE0tVGltZXIgSU8gUG9ydDogMHg0MDgK
KFhFTikgQUNQSTogQUNQSSBTTEVFUCBJTkZPOiBwbTF4X2NudFs0MDQsMF0sIHBtMXhfZXZ0WzQw
MCwwXQooWEVOKSBBQ1BJOiAzMi82NFggRkFDUyBhZGRyZXNzIG1pc21hdGNoIGluIEZBRFQgLSBi
ZjUwYWY4MC8wMDAwMDAwMDAwMDAwMDAwLCB1c2luZyAzMgooWEVOKSBBQ1BJOiAgICAgICAgICAg
ICAgICAgIHdha2V1cF92ZWNbYmY1MGFmOGNdLCB2ZWNfc2l6ZVsyMF0KKFhFTikgQUNQSTogTG9j
YWwgQVBJQyBhZGRyZXNzIDB4ZmVlMDAwMDAKKFhFTikgQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgw
MV0gbGFwaWNfaWRbMHgwMF0gZW5hYmxlZCkKKFhFTikgUHJvY2Vzc29yICMwIDY6MTAgQVBJQyB2
ZXJzaW9uIDIxCihYRU4pIEFDUEk6IExBUElDIChhY3BpX2lkWzB4MDJdIGxhcGljX2lkWzB4MDJd
IGVuYWJsZWQpCihYRU4pIFByb2Nlc3NvciAjMiA2OjEwIEFQSUMgdmVyc2lvbiAyMQooWEVOKSBB
Q1BJOiBMQVBJQyAoYWNwaV9pZFsweDAzXSBsYXBpY19pZFsweDA0XSBlbmFibGVkKQooWEVOKSBQ
cm9jZXNzb3IgIzQgNjoxMCBBUElDIHZlcnNpb24gMjEKKFhFTikgQUNQSTogTEFQSUMgKGFjcGlf
aWRbMHgwNF0gbGFwaWNfaWRbMHgwNl0gZW5hYmxlZCkKKFhFTikgUHJvY2Vzc29yICM2IDY6MTAg
QVBJQyB2ZXJzaW9uIDIxCihYRU4pIEFDUEk6IExBUElDIChhY3BpX2lkWzB4MDVdIGxhcGljX2lk
WzB4MDFdIGVuYWJsZWQpCihYRU4pIFByb2Nlc3NvciAjMSA2OjEwIEFQSUMgdmVyc2lvbiAyMQoo
WEVOKSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDA2XSBsYXBpY19pZFsweDAzXSBlbmFibGVkKQoo
WEVOKSBQcm9jZXNzb3IgIzMgNjoxMCBBUElDIHZlcnNpb24gMjEKKFhFTikgQUNQSTogTEFQSUMg
KGFjcGlfaWRbMHgwN10gbGFwaWNfaWRbMHgwNV0gZW5hYmxlZCkKKFhFTikgUHJvY2Vzc29yICM1
IDY6MTAgQVBJQyB2ZXJzaW9uIDIxCihYRU4pIEFDUEk6IExBUElDIChhY3BpX2lkWzB4MDhdIGxh
cGljX2lkWzB4MDddIGVuYWJsZWQpCihYRU4pIFByb2Nlc3NvciAjNyA2OjEwIEFQSUMgdmVyc2lv
biAyMQooWEVOKSBBQ1BJOiBMQVBJQ19OTUkgKGFjcGlfaWRbMHhmZl0gaGlnaCBlZGdlIGxpbnRb
MHgxXSkKKFhFTikgQUNQSTogSU9BUElDIChpZFsweDAwXSBhZGRyZXNzWzB4ZmVjMDAwMDBdIGdz
aV9iYXNlWzBdKQooWEVOKSBJT0FQSUNbMF06IGFwaWNfaWQgMCwgdmVyc2lvbiAzMiwgYWRkcmVz
cyAweGZlYzAwMDAwLCBHU0kgMC0yMwooWEVOKSBBQ1BJOiBJTlRfU1JDX09WUiAoYnVzIDAgYnVz
X2lycSAwIGdsb2JhbF9pcnEgMiBkZmwgZGZsKQooWEVOKSBBQ1BJOiBJTlRfU1JDX09WUiAoYnVz
IDAgYnVzX2lycSA5IGdsb2JhbF9pcnEgOSBoaWdoIGxldmVsKQooWEVOKSBBQ1BJOiBJUlEwIHVz
ZWQgYnkgb3ZlcnJpZGUuCihYRU4pIEFDUEk6IElSUTIgdXNlZCBieSBvdmVycmlkZS4KKFhFTikg
QUNQSTogSVJROSB1c2VkIGJ5IG92ZXJyaWRlLgooWEVOKSBFbmFibGluZyBBUElDIG1vZGU6ICBG
bGF0LiAgVXNpbmcgMSBJL08gQVBJQ3MKKFhFTikgQUNQSTogSFBFVCBpZDogMHg4MDg2YTcwMSBi
YXNlOiAweGZlZDAwMDAwCihYRU4pIFBDSTogTUNGRyBjb25maWd1cmF0aW9uIDA6IGJhc2UgZTAw
MDAwMDAgc2VnbWVudCAwIGJ1c2VzIDAgLSAyNTUKKFhFTikgUENJOiBOb3QgdXNpbmcgTU1DT05G
SUcuCihYRU4pIEVSU1QgdGFibGUgaXMgaW52YWxpZAooWEVOKSBVc2luZyBBQ1BJIChNQURUKSBm
b3IgU01QIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KKFhFTikgSVJRIGxpbWl0czogMjQgR1NJ
LCAxNTI4IE1TSS9NU0ktWAooWEVOKSBTd2l0Y2hlZCB0byBBUElDIGRyaXZlciB4MmFwaWNfY2x1
c3Rlci4KKFhFTikgVXNpbmcgc2NoZWR1bGVyOiBTTVAgQ3JlZGl0IFNjaGVkdWxlciAoY3JlZGl0
KQooWEVOKSBEZXRlY3RlZCAzMTkyLjgzOCBNSHogcHJvY2Vzc29yLgooWEVOKSBJbml0aW5nIG1l
bW9yeSBzaGFyaW5nLgooWEVOKSBtY2VfaW50ZWwuYzoxMTYyOiBNQ0EgQ2FwYWJpbGl0eTogQkNB
U1QgMSBTRVIgMCBDTUNJIDEgZmlyc3RiYW5rIDAgZXh0ZW5kZWQgTUNFIE1TUiAwCihYRU4pIElu
dGVsIG1hY2hpbmUgY2hlY2sgcmVwb3J0aW5nIGVuYWJsZWQKKFhFTikgSW50ZWwgVlQtZCBTbm9v
cCBDb250cm9sIG5vdCBlbmFibGVkLgooWEVOKSBJbnRlbCBWVC1kIERvbTAgRE1BIFBhc3N0aHJv
dWdoIG5vdCBlbmFibGVkLgooWEVOKSBJbnRlbCBWVC1kIFF1ZXVlZCBJbnZhbGlkYXRpb24gZW5h
YmxlZC4KKFhFTikgSW50ZWwgVlQtZCBJbnRlcnJ1cHQgUmVtYXBwaW5nIGVuYWJsZWQuCihYRU4p
IEludGVsIFZULWQgU2hhcmVkIEVQVCB0YWJsZXMgbm90IGVuYWJsZWQuCihYRU4pIEkvTyB2aXJ0
dWFsaXNhdGlvbiBlbmFibGVkCihYRU4pICAtIERvbTAgbW9kZTogUmVsYXhlZAooWEVOKSBFbmFi
bGVkIGRpcmVjdGVkIEVPSSB3aXRoIGlvYXBpY19hY2tfb2xkIG9uIQooWEVOKSBFTkFCTElORyBJ
Ty1BUElDIElSUXMKKFhFTikgIC0+IFVzaW5nIG9sZCBBQ0sgbWV0aG9kCihYRU4pIC4uVElNRVI6
IHZlY3Rvcj0weEYwIGFwaWMxPTAgcGluMT0yIGFwaWMyPS0xIHBpbjI9LTEKKFhFTikgVFNDIGRl
YWRsaW5lIHRpbWVyIGVuYWJsZWQKKFhFTikgUGxhdGZvcm0gdGltZXIgaXMgMTQuMzE4TUh6IEhQ
RVQKKFhFTikgQWxsb2NhdGVkIGNvbnNvbGUgcmluZyBvZiA2NCBLaUIuCihYRU4pIFZNWDogU3Vw
cG9ydGVkIGFkdmFuY2VkIGZlYXR1cmVzOgooWEVOKSAgLSBBUElDIE1NSU8gYWNjZXNzIHZpcnR1
YWxpc2F0aW9uCihYRU4pICAtIEFQSUMgVFBSIHNoYWRvdwooWEVOKSAgLSBFeHRlbmRlZCBQYWdl
IFRhYmxlcyAoRVBUKQooWEVOKSAgLSBWaXJ0dWFsLVByb2Nlc3NvciBJZGVudGlmaWVycyAoVlBJ
RCkKKFhFTikgIC0gVmlydHVhbCBOTUkKKFhFTikgIC0gTVNSIGRpcmVjdC1hY2Nlc3MgYml0bWFw
CihYRU4pICAtIFVucmVzdHJpY3RlZCBHdWVzdAooWEVOKSBIVk06IEFTSURzIGVuYWJsZWQuCihY
RU4pIEhWTTogVk1YIGVuYWJsZWQKKFhFTikgSFZNOiBIYXJkd2FyZSBBc3Npc3RlZCBQYWdpbmcg
KEhBUCkgZGV0ZWN0ZWQKKFhFTikgSFZNOiBIQVAgcGFnZSBzaXplczogNGtCLCAyTUIKKFhFTikg
QnJvdWdodCB1cCA4IENQVXMKKFhFTikgQUNQSSBzbGVlcCBtb2RlczogUzMKKFhFTikgbWNoZWNr
X3BvbGw6IE1hY2hpbmUgY2hlY2sgcG9sbGluZyB0aW1lciBzdGFydGVkLgooWEVOKSAqKiogTE9B
RElORyBET01BSU4gMCAqKioKKFhFTikgIFhlbiAga2VybmVsOiA2NC1iaXQsIGxzYiwgY29tcGF0
MzIKKFhFTikgIERvbTAga2VybmVsOiA2NC1iaXQsIFBBRSwgbHNiLCBwYWRkciAweDEwMDAwMDAg
LT4gMHgyMDYwMDAwCihYRU4pIFBIWVNJQ0FMIE1FTU9SWSBBUlJBTkdFTUVOVDoKKFhFTikgIERv
bTAgYWxsb2MuOiAgIDAwMDAwMDA0MmMwMDAwMDAtPjAwMDAwMDA0MzAwMDAwMDAgKDIzNTUxNiBw
YWdlcyB0byBiZSBhbGxvY2F0ZWQpCihYRU4pICBJbml0LiByYW1kaXNrOiAwMDAwMDAwNDNkN2Zj
MDAwLT4wMDAwMDAwNDNmZmZmNjAwCihYRU4pIFZJUlRVQUwgTUVNT1JZIEFSUkFOR0VNRU5UOgoo
WEVOKSAgTG9hZGVkIGtlcm5lbDogZmZmZmZmZmY4MTAwMDAwMC0+ZmZmZmZmZmY4MjA2MDAwMAoo
WEVOKSAgSW5pdC4gcmFtZGlzazogZmZmZmZmZmY4MjA2MDAwMC0+ZmZmZmZmZmY4NDg2MzYwMAoo
WEVOKSAgUGh5cy1NYWNoIG1hcDogZmZmZmZmZmY4NDg2NDAwMC0+ZmZmZmZmZmY4NGE2NDAwMAoo
WEVOKSAgU3RhcnQgaW5mbzogICAgZmZmZmZmZmY4NGE2NDAwMC0+ZmZmZmZmZmY4NGE2NDRiNAoo
WEVOKSAgUGFnZSB0YWJsZXM6ICAgZmZmZmZmZmY4NGE2NTAwMC0+ZmZmZmZmZmY4NGE4ZTAwMAoo
WEVOKSAgQm9vdCBzdGFjazogICAgZmZmZmZmZmY4NGE4ZTAwMC0+ZmZmZmZmZmY4NGE4ZjAwMAoo
WEVOKSAgVE9UQUw6ICAgICAgICAgZmZmZmZmZmY4MDAwMDAwMC0+ZmZmZmZmZmY4NGMwMDAwMAoo
WEVOKSAgRU5UUlkgQUREUkVTUzogZmZmZmZmZmY4MWNmYzIwMAooWEVOKSBEb20wIGhhcyBtYXhp
bXVtIDIgVkNQVXMKKFhFTikgU2NydWJiaW5nIEZyZWUgUkFNOiAuLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uZG9uZS4KKFhFTikgWGVuIHRyYWNlIGJ1ZmZlcnM6IGRpc2FibGVk
CihYRU4pIFN0ZC4gTG9nbGV2ZWw6IEFsbAooWEVOKSBHdWVzdCBMb2dsZXZlbDogQWxsCihYRU4p
IFhlbiBpcyByZWxpbnF1aXNoaW5nIFZHQSBjb25zb2xlLgooWEVOKSAqKiogU2VyaWFsIGlucHV0
IC0+IERPTTAgKHR5cGUgJ0NUUkwtYScgdGhyZWUgdGltZXMgdG8gc3dpdGNoIGlucHV0IHRvIFhl
bikKKFhFTikgRnJlZWQgMjE2a0IgaW5pdCBtZW1vcnkuCihYRU4pIFBDSSBhZGQgZGV2aWNlIDAw
OjAwLjAKKFhFTikgUENJIGFkZCBkZXZpY2UgMDA6MDEuMAooWEVOKSBQQ0kgYWRkIGRldmljZSAw
MDoxOS4wCihYRU4pIFBDSSBhZGQgZGV2aWNlIDAwOjFhLjAKKFhFTikgUENJIGFkZCBkZXZpY2Ug
MDA6MWMuMAooWEVOKSBQQ0kgYWRkIGRldmljZSAwMDoxYy40CihYRU4pIFBDSSBhZGQgZGV2aWNl
IDAwOjFkLjAKKFhFTikgUENJIGFkZCBkZXZpY2UgMDA6MWUuMAooWEVOKSBQQ0kgYWRkIGRldmlj
ZSAwMDoxZi4wCihYRU4pIFBDSSBhZGQgZGV2aWNlIDAwOjFmLjIKKFhFTikgUENJIGFkZCBkZXZp
Y2UgMDA6MWYuMwooWEVOKSBQQ0kgYWRkIGRldmljZSAwMTowMC4wCihYRU4pIFBDSSBhZGQgZGV2
aWNlIDAzOjAwLjAKKFhFTikgUENJIGFkZCBkZXZpY2UgMDQ6MDMuMAooWEVOKSBwaHlzZGV2LmM6
MTY0OiBkb20wOiB3cm9uZyBtYXBfcGlycSB0eXBlIDMKKFhFTikgSFZNMTogSFZNIExvYWRlcgoo
WEVOKSBIVk0xOiBEZXRlY3RlZCBYZW4gdjQuMS4zLXJjMS1wcmUKKFhFTikgSFZNMTogQ1BVIHNw
ZWVkIGlzIDMxOTMgTUh6CihYRU4pIEhWTTE6IFhlbmJ1cyByaW5ncyBAMHhmZWZmYzAwMCwgZXZl
bnQgY2hhbm5lbCAzCihYRU4pIGlycS5jOjI2NDogRG9tMSBQQ0kgbGluayAwIGNoYW5nZWQgMCAt
PiA1CihYRU4pIEhWTTE6IFBDSS1JU0EgbGluayAwIHJvdXRlZCB0byBJUlE1CihYRU4pIGlycS5j
OjI2NDogRG9tMSBQQ0kgbGluayAxIGNoYW5nZWQgMCAtPiAxMAooWEVOKSBIVk0xOiBQQ0ktSVNB
IGxpbmsgMSByb3V0ZWQgdG8gSVJRMTAKKFhFTikgaXJxLmM6MjY0OiBEb20xIFBDSSBsaW5rIDIg
Y2hhbmdlZCAwIC0+IDExCihYRU4pIEhWTTE6IFBDSS1JU0EgbGluayAyIHJvdXRlZCB0byBJUlEx
MQooWEVOKSBpcnEuYzoyNjQ6IERvbTEgUENJIGxpbmsgMyBjaGFuZ2VkIDAgLT4gNQooWEVOKSBI
Vk0xOiBQQ0ktSVNBIGxpbmsgMyByb3V0ZWQgdG8gSVJRNQooWEVOKSBIVk0xOiBwY2kgZGV2IDAx
OjIgSU5URC0+SVJRNQooWEVOKSBIVk0xOiBwY2kgZGV2IDAxOjMgSU5UQS0+SVJRMTAKKFhFTikg
SFZNMTogcGNpIGRldiAwMzowIElOVEEtPklSUTUKKFhFTikgSFZNMTogcGNpIGRldiAwNDowIElO
VEEtPklSUTUKKFhFTikgSFZNMTogcGNpIGRldiAwNTowIElOVEEtPklSUTEwCihYRU4pIEhWTTE6
IHBjaSBkZXYgMDI6MCBiYXIgMTAgc2l6ZSAwMjAwMDAwMDogZjAwMDAwMDgKKFhFTikgSFZNMTog
cGNpIGRldiAwMzowIGJhciAxNCBzaXplIDAxMDAwMDAwOiBmMjAwMDAwOAooWEVOKSBIVk0xOiBw
Y2kgZGV2IDA1OjAgYmFyIDMwIHNpemUgMDAwODAwMDA6IGYzMDAwMDAwCihYRU4pIGRvbWN0bC5j
Ojk4NTpkMCBtZW1vcnlfbWFwOmFkZDogZ2ZuPWYzMDgwIG1mbj1mYmE4MCBucl9tZm5zPTQwCihY
RU4pIEhWTTE6IHBjaSBkZXYgMDU6MCBiYXIgMWMgc2l6ZSAwMDA0MDAwMDogZjMwODAwMDQKKFhF
TikgSFZNMTogcGNpIGRldiAwNDowIGJhciAxMCBzaXplIDAwMDIwMDAwOiBmMzBjMDAwMAooWEVO
KSBkb21jdGwuYzo5ODU6ZDAgbWVtb3J5X21hcDphZGQ6IGdmbj1mMzBlMCBtZm49ZmJhYzAgbnJf
bWZucz00CihYRU4pIGRvbWN0bC5jOjk5NTpkMCBtZW1vcnlfbWFwOnJlbW92ZTogZ2ZuPWYzMGUy
IG1mbj1mYmFjMiBucl9tZm5zPTEKKFhFTikgSFZNMTogcGNpIGRldiAwNTowIGJhciAxNCBzaXpl
IDAwMDA0MDAwOiBmMzBlMDAwNAooWEVOKSBIVk0xOiBwY2kgZGV2IDAyOjAgYmFyIDE0IHNpemUg
MDAwMDEwMDA6IGYzMGU0MDAwCihYRU4pIEhWTTE6IHBjaSBkZXYgMDM6MCBiYXIgMTAgc2l6ZSAw
MDAwMDEwMDogMDAwMGMwMDEKKFhFTikgSFZNMTogcGNpIGRldiAwNTowIGJhciAxMCBzaXplIDAw
MDAwMTAwOiAwMDAwYzEwMQooWEVOKSBkb21jdGwuYzoxMDQxOmQwIGlvcG9ydF9tYXA6YWRkIGZf
Z3BvcnQ9YzEwMCBmX21wb3J0PWUwMDAgbnA9MTAwCihYRU4pIEhWTTE6IHBjaSBkZXYgMDQ6MCBi
YXIgMTQgc2l6ZSAwMDAwMDA0MDogMDAwMGMyMDEKKFhFTikgSFZNMTogcGNpIGRldiAwMToyIGJh
ciAyMCBzaXplIDAwMDAwMDIwOiAwMDAwYzI0MQooWEVOKSBIVk0xOiBwY2kgZGV2IDAxOjEgYmFy
IDIwIHNpemUgMDAwMDAwMTA6IDAwMDBjMjYxCihYRU4pIEhWTTE6IE11bHRpcHJvY2Vzc29yIGlu
aXRpYWxpc2F0aW9uOgooWEVOKSBIVk0xOiAgLSBDUFUwIC4uLiAzNi1iaXQgcGh5cyAuLi4gZml4
ZWQgTVRSUnMgLi4uIHZhciBNVFJScyBbMi84XSAuLi4gZG9uZS4KKFhFTikgSFZNMTogIC0gQ1BV
MSAuLi4gMzYtYml0IHBoeXMgLi4uIGZpeGVkIE1UUlJzIC4uLiB2YXIgTVRSUnMgWzIvOF0gLi4u
IGRvbmUuCihYRU4pIEhWTTE6IFdyaXRpbmcgU01CSU9TIHRhYmxlcyAuLi4KKFhFTikgSFZNMTog
TG9hZGluZyBST01CSU9TIC4uLgooWEVOKSBIVk0xOiAxMjgyOCBieXRlcyBvZiBST01CSU9TIGhp
Z2gtbWVtb3J5IGV4dGVuc2lvbnM6CihYRU4pIEhWTTE6ICAgUmVsb2NhdGluZyB0byAweGZjMDAw
MDAwLTB4ZmMwMDMyMWMgLi4uIGRvbmUKKFhFTikgSFZNMTogQ3JlYXRpbmcgTVAgdGFibGVzIC4u
LgooWEVOKSBIVk0xOiBMb2FkaW5nIENpcnJ1cyBWR0FCSU9TIC4uLgooWEVOKSBIVk0xOiBMb2Fk
aW5nIFBDSSBPcHRpb24gUk9NIC4uLgooWEVOKSBIVk0xOiAgLSBNYW51ZmFjdHVyZXI6IGh0dHA6
Ly9pcHhlLm9yZwooWEVOKSBIVk0xOiAgLSBQcm9kdWN0IG5hbWU6IGlQWEUKKFhFTikgZG9tY3Rs
LmM6OTg1OmQwIG1lbW9yeV9tYXA6YWRkOiBnZm49ZjMwMDAgbWZuPWZiYTAwIG5yX21mbnM9ODAK
KFhFTikgSFZNMTogTG9hZGluZyBQQ0kgT3B0aW9uIFJPTSAuLi4KKFhFTikgSFZNMTogIC0gTWFu
dWZhY3R1cmVyOiBMU0kgQ29ycG9yYXRpb24KKFhFTikgSFZNMTogIC0gUHJvZHVjdCBuYW1lOiBM
U0kgTVBJIEJvb3QgU3VwcG9ydAooWEVOKSBkb21jdGwuYzo5OTU6ZDAgbWVtb3J5X21hcDpyZW1v
dmU6IGdmbj1mMzAwMCBtZm49ZmJhMDAgbnJfbWZucz04MAooWEVOKSBIVk0xOiBMb2FkaW5nIEFD
UEkgLi4uCihYRU4pIEhWTTE6ICAtIExvIGRhdGE6IDAwMGVhMDIwLTAwMGVhMDRmCihYRU4pIEhW
TTE6ICAtIEhpIGRhdGE6IGZjMDAzNDAwLWZjMDEzNTFmCihYRU4pIEhWTTE6IHZtODYgVFNTIGF0
IGZjMDEzODAwCihYRU4pIEhWTTE6IEJJT1MgbWFwOgooWEVOKSBIVk0xOiAgYzAwMDAtYzhmZmY6
IFZHQSBCSU9TCihYRU4pIEhWTTE6ICBjOTAwMC1kYTdmZjogRXRoZXJib290IFJPTQooWEVOKSBI
Vk0xOiAgZGE4MDAtZTY3ZmY6IFBDSSBPcHRpb24gUk9NcwooWEVOKSBIVk0xOiAgZWIwMDAtZWIx
ODE6IFNNQklPUyB0YWJsZXMKKFhFTikgSFZNMTogIGYwMDAwLWZmZmZmOiBNYWluIEJJT1MKKFhF
TikgSFZNMTogRTgyMCB0YWJsZToKKFhFTikgSFZNMTogIFswMF06IDAwMDAwMDAwOjAwMDAwMDAw
IC0gMDAwMDAwMDA6MDAwOWUwMDA6IFJBTQooWEVOKSBIVk0xOiAgWzAxXTogMDAwMDAwMDA6MDAw
OWUwMDAgLSAwMDAwMDAwMDowMDA5ZmMwMDogUkVTRVJWRUQKKFhFTikgSFZNMTogIFswMl06IDAw
MDAwMDAwOjAwMDlmYzAwIC0gMDAwMDAwMDA6MDAwYTAwMDA6IFJFU0VSVkVECihYRU4pIEhWTTE6
ICBIT0xFOiAwMDAwMDAwMDowMDBhMDAwMCAtIDAwMDAwMDAwOjAwMGUwMDAwCihYRU4pIEhWTTE6
ICBbMDNdOiAwMDAwMDAwMDowMDBlMDAwMCAtIDAwMDAwMDAwOjAwMTAwMDAwOiBSRVNFUlZFRAoo
WEVOKSBIVk0xOiAgWzA0XTogMDAwMDAwMDA6MDAxMDAwMDAgLSAwMDAwMDAwMDo4MDAwMDAwMDog
UkFNCihYRU4pIEhWTTE6ICBIT0xFOiAwMDAwMDAwMDo4MDAwMDAwMCAtIDAwMDAwMDAwOmZjMDAw
MDAwCihYRU4pIEhWTTE6ICBbMDVdOiAwMDAwMDAwMDpmYzAwMDAwMCAtIDAwMDAwMDAxOjAwMDAw
MDAwOiBSRVNFUlZFRAooWEVOKSBIVk0xOiBJbnZva2luZyBST01CSU9TIC4uLgooWEVOKSBIVk0x
OiAkUmV2aXNpb246IDEuMjIxICQgJERhdGU6IDIwMDgvMTIvMDcgMTc6MzI6MjkgJAooWEVOKSBz
dGR2Z2EuYzoxNDc6ZDEgZW50ZXJpbmcgc3RkdmdhIGFuZCBjYWNoaW5nIG1vZGVzCihYRU4pIEhW
TTE6IFZHQUJpb3MgJElkOiB2Z2FiaW9zLmMsdiAxLjY3IDIwMDgvMDEvMjcgMDk6NDQ6MTIgdnJ1
cHBlcnQgRXhwICQKKFhFTikgSFZNMTogQm9jaHMgQklPUyAtIGJ1aWxkOiAwNi8yMy85OQooWEVO
KSBIVk0xOiAkUmV2aXNpb246IDEuMjIxICQgJERhdGU6IDIwMDgvMTIvMDcgMTc6MzI6MjkgJAoo
WEVOKSBIVk0xOiBPcHRpb25zOiBhcG1iaW9zIHBjaWJpb3MgZWx0b3JpdG8gUE1NIAooWEVOKSBI
Vk0xOiAKKFhFTikgSFZNMTogYXRhMC0wOiBQQ0hTPTE2MzgzLzE2LzYzIHRyYW5zbGF0aW9uPWxi
YSBMQ0hTPTEwMjQvMjU1LzYzCihYRU4pIEhWTTE6IGF0YTAgbWFzdGVyOiBRRU1VIEhBUkRESVNL
IEFUQS03IEhhcmQtRGlzayAoMTAyNDAgTUJ5dGVzKQooWEVOKSBIVk0xOiBJREUgdGltZSBvdXQK
KFhFTikgSFZNMTogYXRhMSBtYXN0ZXI6IFFFTVUgRFZELVJPTSBBVEFQSS00IENELVJvbS9EVkQt
Um9tCihYRU4pIEhWTTE6IElERSB0aW1lIG91dAooWEVOKSBIVk0xOiAKKFhFTikgdHJhcHMuYzo0
NTE6ZDAgVW5oYW5kbGVkIG5taSBmYXVsdC90cmFwIFsjMl0gb24gVkNQVSAwIFtlYz0wMDAwXQoo
WEVOKSBIVk0xOiBQQ0kgZGV2aWNlIDEwMDA6MDA3MCBub3QgZm91bmQgYXQgaW5kZXggMAooWEVO
KSBIVk0xOiBQQ0kgZGV2aWNlIDEwMDA6MDA3MiBub3QgZm91bmQgYXQgaW5kZXggMQooWEVOKSBI
Vk0xOiBQQ0kgZGV2aWNlIDEwMDA6MDA3NCBub3QgZm91bmQgYXQgaW5kZXggMAooWEVOKSBIVk0x
OiBQQ0kgZGV2aWNlIDEwMDA6MDA3NiBub3QgZm91bmQgYXQgaW5kZXggMAooWEVOKSBIVk0xOiBQ
Q0kgZGV2aWNlIDEwMDA6MDA3NyBub3QgZm91bmQgYXQgaW5kZXggMAooWEVOKSBIVk0xOiBQQ0kg
ZGV2aWNlIDEwMDA6MDA2NCBub3QgZm91bmQgYXQgaW5kZXggMAooWEVOKSBIVk0xOiBQQ0kgZGV2
aWNlIDEwMDA6MDA2NSBub3QgZm91bmQgYXQgaW5kZXggMAooWEVOKSBIVk0xOiBQQ0kgZGV2aWNl
IDEwMDA6MDA4MCBub3QgZm91bmQgYXQgaW5kZXggMAooWEVOKSBIVk0xOiBQQ0kgZGV2aWNlIDEw
MDA6MDA4MSBub3QgZm91bmQgYXQgaW5kZXggMAooWEVOKSBIVk0xOiBQQ0kgZGV2aWNlIDEwMDA6
MDA4MiBub3QgZm91bmQgYXQgaW5kZXggMAooWEVOKSBIVk0xOiBQQ0kgZGV2aWNlIDEwMDA6MDA4
MyBub3QgZm91bmQgYXQgaW5kZXggMAooWEVOKSBIVk0xOiBQQ0kgZGV2aWNlIDEwMDA6MDA4NCBu
b3QgZm91bmQgYXQgaW5kZXggMAooWEVOKSBIVk0xOiBQQ0kgZGV2aWNlIDEwMDA6MDA4NSBub3Qg
Zm91bmQgYXQgaW5kZXggMAooWEVOKSBIVk0xOiBQQ0kgZGV2aWNlIDEwMDA6MDA4NiBub3QgZm91
bmQgYXQgaW5kZXggMAooWEVOKSBIVk0xOiBQQ0kgZGV2aWNlIDEwMDA6MDA4NyBub3QgZm91bmQg
YXQgaW5kZXggMAooWEVOKSBIVk0xOiBQQ0kgZGV2aWNlIDEwMDA6MDA2ZSBub3QgZm91bmQgYXQg
aW5kZXggMAooWEVOKSBIVk0xOiAKKFhFTikgSFZNMTogCihYRU4pIEhWTTE6IFByZXNzIEYxMiBm
b3IgYm9vdCBtZW51LgooWEVOKSBIVk0xOiAKKFhFTikgSFZNMTogQm9vdGluZyBmcm9tIEhhcmQg
RGlzay4uLgooWEVOKSBIVk0xOiBCb290aW5nIGZyb20gMDAwMDo3YzAwCihYRU4pIEhWTTE6IGlu
dDEzX2hhcmRkaXNrOiBmdW5jdGlvbiA0MSwgdW5tYXBwZWQgZGV2aWNlIGZvciBFTERMPTgxCihY
RU4pIEhWTTE6IGludDEzX2hhcmRkaXNrOiBmdW5jdGlvbiAwOCwgdW5tYXBwZWQgZGV2aWNlIGZv
ciBFTERMPTgxCihYRU4pIEhWTTE6ICoqKiBpbnQgMTVoIGZ1bmN0aW9uIEFYPTAwYzAsIEJYPTAw
MDAgbm90IHlldCBzdXBwb3J0ZWQhCihYRU4pIEhWTTE6ICoqKiBpbnQgMTVoIGZ1bmN0aW9uIEFY
PWVjMDAsIEJYPTAwMDIgbm90IHlldCBzdXBwb3J0ZWQhCihYRU4pIEhWTTE6IEtCRDogdW5zdXBw
b3J0ZWQgaW50IDE2aCBmdW5jdGlvbiAwMwooWEVOKSBIVk0xOiAqKiogaW50IDE1aCBmdW5jdGlv
biBBWD1lOTgwLCBCWD0wMDAwIG5vdCB5ZXQgc3VwcG9ydGVkIQooWEVOKSBIVk0xOiBpbnQxM19o
YXJkZGlzazogZnVuY3Rpb24gNDEsIHVubWFwcGVkIGRldmljZSBmb3IgRUxETD04MQooWEVOKSBI
Vk0xOiBpbnQxM19oYXJkZGlzazogZnVuY3Rpb24gMDIsIHVubWFwcGVkIGRldmljZSBmb3IgRUxE
TD04MQooWEVOKSBIVk0xOiBpbnQxM19oYXJkZGlzazogZnVuY3Rpb24gNDEsIHVubWFwcGVkIGRl
dmljZSBmb3IgRUxETD04MgooWEVOKSBIVk0xOiBpbnQxM19oYXJkZGlzazogZnVuY3Rpb24gMDIs
IHVubWFwcGVkIGRldmljZSBmb3IgRUxETD04MgooWEVOKSBIVk0xOiBpbnQxM19oYXJkZGlzazog
ZnVuY3Rpb24gNDEsIHVubWFwcGVkIGRldmljZSBmb3IgRUxETD04MwooWEVOKSBIVk0xOiBpbnQx
M19oYXJkZGlzazogZnVuY3Rpb24gMDIsIHVubWFwcGVkIGRldmljZSBmb3IgRUxETD04MwooWEVO
KSBIVk0xOiBpbnQxM19oYXJkZGlzazogZnVuY3Rpb24gNDEsIHVubWFwcGVkIGRldmljZSBmb3Ig
RUxETD04NAooWEVOKSBIVk0xOiBpbnQxM19oYXJkZGlzazogZnVuY3Rpb24gMDIsIHVubWFwcGVk
IGRldmljZSBmb3IgRUxETD04NAooWEVOKSBIVk0xOiBpbnQxM19oYXJkZGlzazogZnVuY3Rpb24g
NDEsIHVubWFwcGVkIGRldmljZSBmb3IgRUxETD04NQooWEVOKSBIVk0xOiBpbnQxM19oYXJkZGlz
azogZnVuY3Rpb24gMDIsIHVubWFwcGVkIGRldmljZSBmb3IgRUxETD04NQooWEVOKSBIVk0xOiBp
bnQxM19oYXJkZGlzazogZnVuY3Rpb24gNDEsIHVubWFwcGVkIGRldmljZSBmb3IgRUxETD04Ngoo
WEVOKSBIVk0xOiBpbnQxM19oYXJkZGlzazogZnVuY3Rpb24gMDIsIHVubWFwcGVkIGRldmljZSBm
b3IgRUxETD04NgooWEVOKSBIVk0xOiBpbnQxM19oYXJkZGlzazogZnVuY3Rpb24gNDEsIHVubWFw
cGVkIGRldmljZSBmb3IgRUxETD04NwooWEVOKSBIVk0xOiBpbnQxM19oYXJkZGlzazogZnVuY3Rp
b24gMDIsIHVubWFwcGVkIGRldmljZSBmb3IgRUxETD04NwooWEVOKSBIVk0xOiBpbnQxM19oYXJk
ZGlzazogZnVuY3Rpb24gNDEsIEVMREwgb3V0IG9mIHJhbmdlIDg4CihYRU4pIEhWTTE6IGludDEz
X2hhcmRkaXNrOiBmdW5jdGlvbiAwMiwgRUxETCBvdXQgb2YgcmFuZ2UgODgKKFhFTikgSFZNMTog
aW50MTNfaGFyZGRpc2s6IGZ1bmN0aW9uIDQxLCBFTERMIG91dCBvZiByYW5nZSA4OQooWEVOKSBI
Vk0xOiBpbnQxM19oYXJkZGlzazogZnVuY3Rpb24gMDIsIEVMREwgb3V0IG9mIHJhbmdlIDg5CihY
RU4pIEhWTTE6IGludDEzX2hhcmRkaXNrOiBmdW5jdGlvbiA0MSwgRUxETCBvdXQgb2YgcmFuZ2Ug
OGEKKFhFTikgSFZNMTogaW50MTNfaGFyZGRpc2s6IGZ1bmN0aW9uIDAyLCBFTERMIG91dCBvZiBy
YW5nZSA4YQooWEVOKSBIVk0xOiBpbnQxM19oYXJkZGlzazogZnVuY3Rpb24gNDEsIEVMREwgb3V0
IG9mIHJhbmdlIDhiCihYRU4pIEhWTTE6IGludDEzX2hhcmRkaXNrOiBmdW5jdGlvbiAwMiwgRUxE
TCBvdXQgb2YgcmFuZ2UgOGIKKFhFTikgSFZNMTogaW50MTNfaGFyZGRpc2s6IGZ1bmN0aW9uIDQx
LCBFTERMIG91dCBvZiByYW5nZSA4YwooWEVOKSBIVk0xOiBpbnQxM19oYXJkZGlzazogZnVuY3Rp
b24gMDIsIEVMREwgb3V0IG9mIHJhbmdlIDhjCihYRU4pIEhWTTE6IGludDEzX2hhcmRkaXNrOiBm
dW5jdGlvbiA0MSwgRUxETCBvdXQgb2YgcmFuZ2UgOGQKKFhFTikgSFZNMTogaW50MTNfaGFyZGRp
c2s6IGZ1bmN0aW9uIDAyLCBFTERMIG91dCBvZiByYW5nZSA4ZAooWEVOKSBIVk0xOiBpbnQxM19o
YXJkZGlzazogZnVuY3Rpb24gNDEsIEVMREwgb3V0IG9mIHJhbmdlIDhlCihYRU4pIEhWTTE6IGlu
dDEzX2hhcmRkaXNrOiBmdW5jdGlvbiAwMiwgRUxETCBvdXQgb2YgcmFuZ2UgOGUKKFhFTikgSFZN
MTogaW50MTNfaGFyZGRpc2s6IGZ1bmN0aW9uIDQxLCBFTERMIG91dCBvZiByYW5nZSA4ZgooWEVO
KSBIVk0xOiBpbnQxM19oYXJkZGlzazogZnVuY3Rpb24gMDIsIEVMREwgb3V0IG9mIHJhbmdlIDhm
CihYRU4pIGlycS5jOjMzMDogRG9tMSBjYWxsYmFjayB2aWEgY2hhbmdlZCB0byBEaXJlY3QgVmVj
dG9yIDB4ZTkKKFhFTikgZG9tY3RsLmM6MTA2NTpkMCBpb3BvcnRfbWFwOnJlbW92ZSBmX2dwb3J0
PWMxMDAgZl9tcG9ydD1lMDAwIG5wPTEwMAooWEVOKSBkb21jdGwuYzoxMDQxOmQwIGlvcG9ydF9t
YXA6YWRkIGZfZ3BvcnQ9YzEwMCBmX21wb3J0PWUwMDAgbnA9MTAwCihYRU4pIGlycS5jOjI2NDog
RG9tMSBQQ0kgbGluayAwIGNoYW5nZWQgNSAtPiAwCihYRU4pIGlycS5jOjI2NDogRG9tMSBQQ0kg
bGluayAxIGNoYW5nZWQgMTAgLT4gMAooWEVOKSBpcnEuYzoyNjQ6IERvbTEgUENJIGxpbmsgMiBj
aGFuZ2VkIDExIC0+IDAKKFhFTikgaXJxLmM6MjY0OiBEb20xIFBDSSBsaW5rIDMgY2hhbmdlZCA1
IC0+IDAK
--485b393aaadf88221704bd6c92bc
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

--485b393aaadf88221704bd6c92bc--


From xen-devel-bounces@lists.xen.org Sun Apr 15 18:44:13 2012
Return-path: <xen-devel-bounces@lists.xen.org>
Envelope-to: archives@lists.xen.org
Delivery-date: Sun, 15 Apr 2012 18:44:13 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xen.org>)
	id 1SJUPy-0003uG-AP; Sun, 15 Apr 2012 18:43:22 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <jean.guyader@gmail.com>) id 1SJUPw-0003uB-LJ
	for xen-devel@lists.xensource.com; Sun, 15 Apr 2012 18:43:21 +0000
Received: from [193.109.254.147:44040] by server-11.bemta-14.messagelabs.com
	id 3A/6C-05858-7C61B8F4; Sun, 15 Apr 2012 18:43:19 +0000
X-Env-Sender: jean.guyader@gmail.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1334515395!4685665!1
X-Originating-IP: [209.85.212.169]
X-SpamReason: No, hits=0.8 required=7.0 tests=BODY_RANDOM_LONG,
	ML_RADAR_SPEW_LINKS_14, ML_RADAR_SPEW_LINKS_23, RCVD_BY_IP,
	spamassassin: 
X-StarScan-Version: 6.5.7; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24458 invoked from network); 15 Apr 2012 18:43:15 -0000
Received: from mail-wi0-f169.google.com (HELO mail-wi0-f169.google.com)
	(209.85.212.169)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Apr 2012 18:43:15 -0000
Received: by wibhm17 with SMTP id hm17so6743634wib.0
	for <xen-devel@lists.xensource.com>;
	Sun, 15 Apr 2012 11:43:15 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:x-mailer;
	bh=7BuRHr87m8tOhk9EBnDijl6/YURrWsogP/aXQZ7cbP0=;
	b=hyhAmUrb7OSHnG73zPCn6Ceh9gwStA5mmpLiTFzJcOQscdkTT9cy6iqgjbDToqZvd4
	4kt/ktqfevZNbn3ZM77ncLJIxhqgFOSBHxd5iUS/HR6Y1zA9PySyzw5Ns8ErOG4Lz7PN
	hng9J6xNsoiM+TiBOiX5AsUkcgTEWS6rjNvVXeVcNFBROgf844C1LVC0QnwCYZeWrok0
	96rFVDc8OoGUAO4KTckVGFcslUOGrm522F9iIwXrxW/Vn+pQzrS3I4EvoY3d/SYqRim+
	3PNTC0ZXWak6mCDC/gwTpKY8HQAeLhqbMpFKe1JLUC4oKkF58Htus23+U0lj/lnwsl//
	wMyA==
Received: by 10.216.132.8 with SMTP id n8mr5036004wei.36.1334515395427;
	Sun, 15 Apr 2012 11:43:15 -0700 (PDT)
Received: from debian (cpc2-cmbg15-2-0-cust282.5-4.cable.virginmedia.com.
	[86.26.13.27])
	by mx.google.com with ESMTPS id l5sm14091147wia.11.2012.04.15.11.43.13
	(version=TLSv1/SSLv3 cipher=OTHER);
	Sun, 15 Apr 2012 11:43:14 -0700 (PDT)
Received: from xen by debian with local (Exim 4.77)
	(envelope-from <jean.guyader@gmail.com>)
	id 1SJUPo-0007nT-31; Sun, 15 Apr 2012 11:43:12 -0700
From: Jean Guyader <jean.guyader@gmail.com>
To: xen-devel@lists.xensource.com
Date: Sun, 15 Apr 2012 11:43:10 -0700
Message-Id: <1334515390-29941-1-git-send-email-jean.guyader@gmail.com>
X-Mailer: git-send-email 1.7.9.5
Cc: Jean Guyader <jean.guyader@gmail.com>
Subject: [Xen-devel] [PATCH] configure: Check for flex
X-BeenThere: xen-devel@lists.xen.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xen.org>
List-Unsubscribe: <http://lists.xen.org/cgi-bin/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xen.org?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xen.org>
List-Help: <mailto:xen-devel-request@lists.xen.org?subject=help>
List-Subscribe: <http://lists.xen.org/cgi-bin/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xen.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: xen-devel-bounces@lists.xen.org
Errors-To: xen-devel-bounces@lists.xen.org

libxl require the command flex to be present.
Verify in the configure script that the flex
command exsits.

Signed-off-by: Jean Guyader <jean.guyader@gmail.com>
---
 tools/configure    |  633 +++++++++++++++++++++++++++++-----------------------
 tools/configure.ac |    1 +
 2 files changed, 350 insertions(+), 284 deletions(-)

diff --git a/tools/configure b/tools/configure
index 86618f5..071adf7 100755
--- a/tools/configure
+++ b/tools/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.67 for Xen Hypervisor 4.2.
+# Generated by GNU Autoconf 2.68 for Xen Hypervisor 4.2.
 #
 # Report bugs to <xen-devel@lists.xensource.com>.
 #
@@ -91,6 +91,7 @@ fi
 IFS=" ""	$as_nl"
 
 # Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
 case $0 in #((
   *[\\/]* ) as_myself=$0 ;;
   *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -216,11 +217,18 @@ IFS=$as_save_IFS
   # We cannot yet assume a decent shell, so we have to provide a
 	# neutralization value for shells without unset; and this also
 	# works around shells that cannot unset nonexistent variables.
+	# Preserve -v and -x to the replacement shell.
 	BASH_ENV=/dev/null
 	ENV=/dev/null
 	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
 	export CONFIG_SHELL
-	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+	case $- in # ((((
+	  *v*x* | *x*v* ) as_opts=-vx ;;
+	  *v* ) as_opts=-v ;;
+	  *x* ) as_opts=-x ;;
+	  * ) as_opts= ;;
+	esac
+	exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
 fi
 
     if test x$as_have_required = xno; then :
@@ -1164,7 +1172,7 @@ Try \`$0 --help' for more information"
     $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
     expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
       $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
-    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
     ;;
 
   esac
@@ -1490,7 +1498,7 @@ test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
 Xen Hypervisor configure 4.2
-generated by GNU Autoconf 2.67
+generated by GNU Autoconf 2.68
 
 Copyright (C) 2010 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
@@ -1536,7 +1544,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_retval=1
 fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
   as_fn_set_status $ac_retval
 
 } # ac_fn_c_try_compile
@@ -1573,7 +1581,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
     ac_retval=1
 fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
   as_fn_set_status $ac_retval
 
 } # ac_fn_c_try_cpp
@@ -1586,10 +1594,10 @@ fi
 ac_fn_c_check_header_mongrel ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if eval "test \"\${$3+set}\"" = set; then :
+  if eval \${$3+:} false; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
 $as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
+if eval \${$3+:} false; then :
   $as_echo_n "(cached) " >&6
 fi
 eval ac_res=\$$3
@@ -1656,7 +1664,7 @@ $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
 esac
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
 $as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
+if eval \${$3+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   eval "$3=\$ac_header_compiler"
@@ -1665,7 +1673,7 @@ eval ac_res=\$$3
 	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
 $as_echo "$ac_res" >&6; }
 fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
 } # ac_fn_c_check_header_mongrel
 
@@ -1706,7 +1714,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
        ac_retval=$ac_status
 fi
   rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
   as_fn_set_status $ac_retval
 
 } # ac_fn_c_try_run
@@ -1720,7 +1728,7 @@ ac_fn_c_check_header_compile ()
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
 $as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
+if eval \${$3+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -1738,7 +1746,7 @@ fi
 eval ac_res=\$$3
 	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
 $as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
 } # ac_fn_c_check_header_compile
 
@@ -1783,11 +1791,65 @@ fi
   # interfere with the next link command; also delete a directory that is
   # left behind by Apple's compiler.  We do this before executing the actions.
   rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
   as_fn_set_status $ac_retval
 
 } # ac_fn_c_try_link
 
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=no"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+	 return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+	    return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
 # ac_fn_c_check_func LINENO FUNC VAR
 # ----------------------------------
 # Tests whether FUNC exists, setting the cache variable VAR accordingly
@@ -1796,7 +1858,7 @@ ac_fn_c_check_func ()
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
 $as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
+if eval \${$3+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -1851,64 +1913,10 @@ fi
 eval ac_res=\$$3
 	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
 $as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
 } # ac_fn_c_check_func
 
-# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
-# -------------------------------------------
-# Tests whether TYPE exists after having included INCLUDES, setting cache
-# variable VAR accordingly.
-ac_fn_c_check_type ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=no"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof ($2))
-	 return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof (($2)))
-	    return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  eval "$3=yes"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_type
-
 # ac_fn_c_find_intX_t LINENO BITS VAR
 # -----------------------------------
 # Finds a signed integer type with width BITS, setting cache variable VAR
@@ -1918,7 +1926,7 @@ ac_fn_c_find_intX_t ()
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5
 $as_echo_n "checking for int$2_t... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
+if eval \${$3+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   eval "$3=no"
@@ -1979,7 +1987,7 @@ fi
 eval ac_res=\$$3
 	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
 $as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
 } # ac_fn_c_find_intX_t
 
@@ -1992,7 +2000,7 @@ ac_fn_c_check_member ()
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
 $as_echo_n "checking for $2.$3... " >&6; }
-if eval "test \"\${$4+set}\"" = set; then :
+if eval \${$4+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -2036,7 +2044,7 @@ fi
 eval ac_res=\$$4
 	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
 $as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
 } # ac_fn_c_check_member
 
@@ -2049,7 +2057,7 @@ ac_fn_c_find_uintX_t ()
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5
 $as_echo_n "checking for uint$2_t... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
+if eval \${$3+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   eval "$3=no"
@@ -2089,7 +2097,7 @@ fi
 eval ac_res=\$$3
 	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
 $as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
 } # ac_fn_c_find_uintX_t
 cat >config.log <<_ACEOF
@@ -2097,7 +2105,7 @@ This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
 It was created by Xen Hypervisor $as_me 4.2, which was
-generated by GNU Autoconf 2.67.  Invocation command line was
+generated by GNU Autoconf 2.68.  Invocation command line was
 
   $ $0 $@
 
@@ -2355,7 +2363,7 @@ $as_echo "$as_me: loading site script $ac_site_file" >&6;}
       || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "failed to load site script $ac_site_file
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
   fi
 done
 
@@ -2508,7 +2516,7 @@ if test -n "$ac_tool_prefix"; then
 set dummy ${ac_tool_prefix}gcc; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -2548,7 +2556,7 @@ if test -z "$ac_cv_prog_CC"; then
 set dummy gcc; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_CC"; then
@@ -2601,7 +2609,7 @@ if test -z "$CC"; then
 set dummy ${ac_tool_prefix}cc; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -2641,7 +2649,7 @@ if test -z "$CC"; then
 set dummy cc; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -2700,7 +2708,7 @@ if test -z "$CC"; then
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -2744,7 +2752,7 @@ do
 set dummy $ac_prog; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_CC"; then
@@ -2799,7 +2807,7 @@ fi
 test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
 
 # Provide some information about the compiler.
 $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
@@ -2914,7 +2922,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error 77 "C compiler cannot create executables
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
@@ -2957,7 +2965,7 @@ else
   { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
 fi
 rm -f conftest conftest$ac_cv_exeext
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
@@ -3016,7 +3024,7 @@ $as_echo "$ac_try_echo"; } >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "cannot run C compiled programs.
 If you meant to cross compile, use \`--host'.
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
     fi
   fi
 fi
@@ -3027,7 +3035,7 @@ rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
 ac_clean_files=$ac_clean_files_save
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
 $as_echo_n "checking for suffix of object files... " >&6; }
-if test "${ac_cv_objext+set}" = set; then :
+if ${ac_cv_objext+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3068,7 +3076,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
 fi
 rm -f conftest.$ac_cv_objext conftest.$ac_ext
 fi
@@ -3078,7 +3086,7 @@ OBJEXT=$ac_cv_objext
 ac_objext=$OBJEXT
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if test "${ac_cv_c_compiler_gnu+set}" = set; then :
+if ${ac_cv_c_compiler_gnu+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3115,7 +3123,7 @@ ac_test_CFLAGS=${CFLAGS+set}
 ac_save_CFLAGS=$CFLAGS
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
 $as_echo_n "checking whether $CC accepts -g... " >&6; }
-if test "${ac_cv_prog_cc_g+set}" = set; then :
+if ${ac_cv_prog_cc_g+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_save_c_werror_flag=$ac_c_werror_flag
@@ -3193,7 +3201,7 @@ else
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if test "${ac_cv_prog_cc_c89+set}" = set; then :
+if ${ac_cv_prog_cc_c89+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_cv_prog_cc_c89=no
@@ -3301,7 +3309,7 @@ if test -n "$CPP" && test -d "$CPP"; then
   CPP=
 fi
 if test -z "$CPP"; then
-  if test "${ac_cv_prog_CPP+set}" = set; then :
+  if ${ac_cv_prog_CPP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
       # Double quotes because CPP needs to be expanded
@@ -3417,7 +3425,7 @@ else
   { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
 fi
 
 ac_ext=c
@@ -3429,7 +3437,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
 $as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if test "${ac_cv_path_GREP+set}" = set; then :
+if ${ac_cv_path_GREP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -z "$GREP"; then
@@ -3492,7 +3500,7 @@ $as_echo "$ac_cv_path_GREP" >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
 $as_echo_n "checking for egrep... " >&6; }
-if test "${ac_cv_path_EGREP+set}" = set; then :
+if ${ac_cv_path_EGREP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
@@ -3559,7 +3567,7 @@ $as_echo "$ac_cv_path_EGREP" >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
 $as_echo_n "checking for ANSI C header files... " >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then :
+if ${ac_cv_header_stdc+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3688,7 +3696,7 @@ done
 
 
   ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default"
-if test "x$ac_cv_header_minix_config_h" = x""yes; then :
+if test "x$ac_cv_header_minix_config_h" = xyes; then :
   MINIX=yes
 else
   MINIX=
@@ -3710,7 +3718,7 @@ $as_echo "#define _MINIX 1" >>confdefs.h
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5
 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; }
-if test "${ac_cv_safe_to_define___extensions__+set}" = set; then :
+if ${ac_cv_safe_to_define___extensions__+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3753,7 +3761,7 @@ $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
 $as_echo_n "checking build system type... " >&6; }
-if test "${ac_cv_build+set}" = set; then :
+if ${ac_cv_build+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_build_alias=$build_alias
@@ -3769,7 +3777,7 @@ fi
 $as_echo "$ac_cv_build" >&6; }
 case $ac_cv_build in
 *-*-*) ;;
-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5 ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
 esac
 build=$ac_cv_build
 ac_save_IFS=$IFS; IFS='-'
@@ -3787,7 +3795,7 @@ case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
 $as_echo_n "checking host system type... " >&6; }
-if test "${ac_cv_host+set}" = set; then :
+if ${ac_cv_host+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "x$host_alias" = x; then
@@ -3802,7 +3810,7 @@ fi
 $as_echo "$ac_cv_host" >&6; }
 case $ac_cv_host in
 *-*-*) ;;
-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5 ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
 esac
 host=$ac_cv_host
 ac_save_IFS=$IFS; IFS='-'
@@ -4196,7 +4204,7 @@ LDFLAGS="$PREPEND_LDFLAGS $LDFLAGS $APPEND_LDFLAGS"
 # Checks for programs.
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
 $as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if test "${ac_cv_path_SED+set}" = set; then :
+if ${ac_cv_path_SED+:} false; then :
   $as_echo_n "(cached) " >&6
 else
             ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
@@ -4273,7 +4281,7 @@ if test -n "$ac_tool_prefix"; then
 set dummy ${ac_tool_prefix}gcc; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -4313,7 +4321,7 @@ if test -z "$ac_cv_prog_CC"; then
 set dummy gcc; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_CC"; then
@@ -4366,7 +4374,7 @@ if test -z "$CC"; then
 set dummy ${ac_tool_prefix}cc; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -4406,7 +4414,7 @@ if test -z "$CC"; then
 set dummy cc; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -4465,7 +4473,7 @@ if test -z "$CC"; then
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -4509,7 +4517,7 @@ do
 set dummy $ac_prog; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_CC"; then
@@ -4564,7 +4572,7 @@ fi
 test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
 
 # Provide some information about the compiler.
 $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
@@ -4593,7 +4601,7 @@ done
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if test "${ac_cv_c_compiler_gnu+set}" = set; then :
+if ${ac_cv_c_compiler_gnu+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4630,7 +4638,7 @@ ac_test_CFLAGS=${CFLAGS+set}
 ac_save_CFLAGS=$CFLAGS
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
 $as_echo_n "checking whether $CC accepts -g... " >&6; }
-if test "${ac_cv_prog_cc_g+set}" = set; then :
+if ${ac_cv_prog_cc_g+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_save_c_werror_flag=$ac_c_werror_flag
@@ -4708,7 +4716,7 @@ else
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if test "${ac_cv_prog_cc_c89+set}" = set; then :
+if ${ac_cv_prog_cc_c89+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_cv_prog_cc_c89=no
@@ -4818,7 +4826,7 @@ fi
 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
 set x ${MAKE-make}
 ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" = set; then :
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat >conftest.make <<\_ACEOF
@@ -4862,7 +4870,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
 $as_echo_n "checking for a BSD-compatible install... " >&6; }
 if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then :
+if ${ac_cv_path_install+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -4942,7 +4950,7 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 set dummy perl; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_PERL+set}" = set; then :
+if ${ac_cv_path_PERL+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $PERL in
@@ -4989,7 +4997,7 @@ if test "x$xapi" = "xy"; then :
 set dummy curl-config; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_CURL+set}" = set; then :
+if ${ac_cv_path_CURL+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $CURL in
@@ -5034,7 +5042,7 @@ fi
 set dummy xml2-config; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_XML+set}" = set; then :
+if ${ac_cv_path_XML+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $XML in
@@ -5085,7 +5093,7 @@ if test "x$ocamltools" = "xy"; then :
 set dummy ${ac_tool_prefix}ocamlc; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAMLC+set}" = set; then :
+if ${ac_cv_prog_OCAMLC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAMLC"; then
@@ -5125,7 +5133,7 @@ if test -z "$ac_cv_prog_OCAMLC"; then
 set dummy ocamlc; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAMLC+set}" = set; then :
+if ${ac_cv_prog_ac_ct_OCAMLC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAMLC"; then
@@ -5196,7 +5204,7 @@ $as_echo "OCaml library path is $OCAMLLIB" >&6; }
 set dummy ${ac_tool_prefix}ocamlopt; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAMLOPT+set}" = set; then :
+if ${ac_cv_prog_OCAMLOPT+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAMLOPT"; then
@@ -5236,7 +5244,7 @@ if test -z "$ac_cv_prog_OCAMLOPT"; then
 set dummy ocamlopt; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAMLOPT+set}" = set; then :
+if ${ac_cv_prog_ac_ct_OCAMLOPT+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAMLOPT"; then
@@ -5306,7 +5314,7 @@ $as_echo "versions differs from ocamlc; ocamlopt discarded." >&6; }
 set dummy ${ac_tool_prefix}ocamlc.opt; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAMLCDOTOPT+set}" = set; then :
+if ${ac_cv_prog_OCAMLCDOTOPT+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAMLCDOTOPT"; then
@@ -5346,7 +5354,7 @@ if test -z "$ac_cv_prog_OCAMLCDOTOPT"; then
 set dummy ocamlc.opt; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAMLCDOTOPT+set}" = set; then :
+if ${ac_cv_prog_ac_ct_OCAMLCDOTOPT+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAMLCDOTOPT"; then
@@ -5410,7 +5418,7 @@ $as_echo "versions differs from ocamlc; ocamlc.opt discarded." >&6; }
 set dummy ${ac_tool_prefix}ocamlopt.opt; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAMLOPTDOTOPT+set}" = set; then :
+if ${ac_cv_prog_OCAMLOPTDOTOPT+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAMLOPTDOTOPT"; then
@@ -5450,7 +5458,7 @@ if test -z "$ac_cv_prog_OCAMLOPTDOTOPT"; then
 set dummy ocamlopt.opt; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAMLOPTDOTOPT+set}" = set; then :
+if ${ac_cv_prog_ac_ct_OCAMLOPTDOTOPT+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAMLOPTDOTOPT"; then
@@ -5519,7 +5527,7 @@ $as_echo "version differs from ocamlc; ocamlopt.opt discarded." >&6; }
 set dummy ${ac_tool_prefix}ocaml; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAML+set}" = set; then :
+if ${ac_cv_prog_OCAML+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAML"; then
@@ -5559,7 +5567,7 @@ if test -z "$ac_cv_prog_OCAML"; then
 set dummy ocaml; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAML+set}" = set; then :
+if ${ac_cv_prog_ac_ct_OCAML+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAML"; then
@@ -5613,7 +5621,7 @@ fi
 set dummy ${ac_tool_prefix}ocamldep; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAMLDEP+set}" = set; then :
+if ${ac_cv_prog_OCAMLDEP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAMLDEP"; then
@@ -5653,7 +5661,7 @@ if test -z "$ac_cv_prog_OCAMLDEP"; then
 set dummy ocamldep; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAMLDEP+set}" = set; then :
+if ${ac_cv_prog_ac_ct_OCAMLDEP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAMLDEP"; then
@@ -5707,7 +5715,7 @@ fi
 set dummy ${ac_tool_prefix}ocamlmktop; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAMLMKTOP+set}" = set; then :
+if ${ac_cv_prog_OCAMLMKTOP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAMLMKTOP"; then
@@ -5747,7 +5755,7 @@ if test -z "$ac_cv_prog_OCAMLMKTOP"; then
 set dummy ocamlmktop; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAMLMKTOP+set}" = set; then :
+if ${ac_cv_prog_ac_ct_OCAMLMKTOP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAMLMKTOP"; then
@@ -5801,7 +5809,7 @@ fi
 set dummy ${ac_tool_prefix}ocamlmklib; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAMLMKLIB+set}" = set; then :
+if ${ac_cv_prog_OCAMLMKLIB+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAMLMKLIB"; then
@@ -5841,7 +5849,7 @@ if test -z "$ac_cv_prog_OCAMLMKLIB"; then
 set dummy ocamlmklib; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAMLMKLIB+set}" = set; then :
+if ${ac_cv_prog_ac_ct_OCAMLMKLIB+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAMLMKLIB"; then
@@ -5895,7 +5903,7 @@ fi
 set dummy ${ac_tool_prefix}ocamldoc; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAMLDOC+set}" = set; then :
+if ${ac_cv_prog_OCAMLDOC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAMLDOC"; then
@@ -5935,7 +5943,7 @@ if test -z "$ac_cv_prog_OCAMLDOC"; then
 set dummy ocamldoc; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAMLDOC+set}" = set; then :
+if ${ac_cv_prog_ac_ct_OCAMLDOC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAMLDOC"; then
@@ -5989,7 +5997,7 @@ fi
 set dummy ${ac_tool_prefix}ocamlbuild; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OCAMLBUILD+set}" = set; then :
+if ${ac_cv_prog_OCAMLBUILD+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$OCAMLBUILD"; then
@@ -6029,7 +6037,7 @@ if test -z "$ac_cv_prog_OCAMLBUILD"; then
 set dummy ocamlbuild; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OCAMLBUILD+set}" = set; then :
+if ${ac_cv_prog_ac_ct_OCAMLBUILD+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OCAMLBUILD"; then
@@ -6092,7 +6100,7 @@ fi
 set dummy bash; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_BASH+set}" = set; then :
+if ${ac_cv_path_BASH+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $BASH in
@@ -6149,7 +6157,7 @@ fi
 set dummy $PYTHON; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_PYTHONPATH+set}" = set; then :
+if ${ac_cv_path_PYTHONPATH+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $PYTHONPATH in
@@ -6225,7 +6233,7 @@ LDFLAGS="$LDFLAGS `$PYTHON -c 'import distutils.sysconfig; \
     print distutils.sysconfig.get_config_var("LDFLAGS")'`"
 
 ac_fn_c_check_header_mongrel "$LINENO" "Python.h" "ac_cv_header_Python_h" "$ac_includes_default"
-if test "x$ac_cv_header_Python_h" = x""yes; then :
+if test "x$ac_cv_header_Python_h" = xyes; then :
 
 else
   as_fn_error $? "Unable to find Python development headers" "$LINENO" 5
@@ -6235,7 +6243,7 @@ fi
 as_ac_Lib=`$as_echo "ac_cv_lib_python$ac_python_version''_PyArg_ParseTuple" | $as_tr_sh`
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PyArg_ParseTuple in -lpython$ac_python_version" >&5
 $as_echo_n "checking for PyArg_ParseTuple in -lpython$ac_python_version... " >&6; }
-if eval "test \"\${$as_ac_Lib+set}\"" = set; then :
+if eval \${$as_ac_Lib+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -6290,7 +6298,7 @@ fi
 set dummy xgettext; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_XGETTEXT+set}" = set; then :
+if ${ac_cv_path_XGETTEXT+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $XGETTEXT in
@@ -6335,7 +6343,7 @@ fi
 set dummy as86; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_AS86+set}" = set; then :
+if ${ac_cv_path_AS86+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $AS86 in
@@ -6380,7 +6388,7 @@ fi
 set dummy ld86; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_LD86+set}" = set; then :
+if ${ac_cv_path_LD86+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $LD86 in
@@ -6425,7 +6433,7 @@ fi
 set dummy bcc; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_BCC+set}" = set; then :
+if ${ac_cv_path_BCC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $BCC in
@@ -6470,7 +6478,7 @@ fi
 set dummy iasl; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_IASL+set}" = set; then :
+if ${ac_cv_path_IASL+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $IASL in
@@ -6511,13 +6519,58 @@ if test x"${IASL}" == x"no"
 then
     as_fn_error $? "Unable to find iasl, please install iasl" "$LINENO" 5
 fi
+# Extract the first word of "flex", so it can be a program name with args.
+set dummy flex; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_FLEX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $FLEX in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_FLEX="$FLEX" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_FLEX="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_FLEX" && ac_cv_path_FLEX="no"
+  ;;
+esac
+fi
+FLEX=$ac_cv_path_FLEX
+if test -n "$FLEX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FLEX" >&5
+$as_echo "$FLEX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test x"${FLEX}" == x"no"
+then
+    as_fn_error $? "Unable to find flex, please install flex" "$LINENO" 5
+fi
 
 ac_fn_c_check_header_mongrel "$LINENO" "uuid/uuid.h" "ac_cv_header_uuid_uuid_h" "$ac_includes_default"
-if test "x$ac_cv_header_uuid_uuid_h" = x""yes; then :
+if test "x$ac_cv_header_uuid_uuid_h" = xyes; then :
 
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uuid_clear in -luuid" >&5
 $as_echo_n "checking for uuid_clear in -luuid... " >&6; }
-if test "${ac_cv_lib_uuid_uuid_clear+set}" = set; then :
+if ${ac_cv_lib_uuid_uuid_clear+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -6551,7 +6604,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_uuid_uuid_clear" >&5
 $as_echo "$ac_cv_lib_uuid_uuid_clear" >&6; }
-if test "x$ac_cv_lib_uuid_uuid_clear" = x""yes; then :
+if test "x$ac_cv_lib_uuid_uuid_clear" = xyes; then :
   libuuid="y"
 fi
 
@@ -6560,7 +6613,7 @@ fi
 
 
 ac_fn_c_check_header_mongrel "$LINENO" "uuid.h" "ac_cv_header_uuid_h" "$ac_includes_default"
-if test "x$ac_cv_header_uuid_h" = x""yes; then :
+if test "x$ac_cv_header_uuid_h" = xyes; then :
   libuuid="y"
 fi
 
@@ -6573,11 +6626,11 @@ fi
 
 
 ac_fn_c_check_header_mongrel "$LINENO" "curses.h" "ac_cv_header_curses_h" "$ac_includes_default"
-if test "x$ac_cv_header_curses_h" = x""yes; then :
+if test "x$ac_cv_header_curses_h" = xyes; then :
 
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clear in -lcurses" >&5
 $as_echo_n "checking for clear in -lcurses... " >&6; }
-if test "${ac_cv_lib_curses_clear+set}" = set; then :
+if ${ac_cv_lib_curses_clear+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -6611,7 +6664,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_clear" >&5
 $as_echo "$ac_cv_lib_curses_clear" >&6; }
-if test "x$ac_cv_lib_curses_clear" = x""yes; then :
+if test "x$ac_cv_lib_curses_clear" = xyes; then :
   curses="y"
 else
   curses="n"
@@ -6624,11 +6677,11 @@ fi
 
 
 ac_fn_c_check_header_mongrel "$LINENO" "ncurses.h" "ac_cv_header_ncurses_h" "$ac_includes_default"
-if test "x$ac_cv_header_ncurses_h" = x""yes; then :
+if test "x$ac_cv_header_ncurses_h" = xyes; then :
 
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clear in -lncurses" >&5
 $as_echo_n "checking for clear in -lncurses... " >&6; }
-if test "${ac_cv_lib_ncurses_clear+set}" = set; then :
+if ${ac_cv_lib_ncurses_clear+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -6662,7 +6715,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_clear" >&5
 $as_echo "$ac_cv_lib_ncurses_clear" >&6; }
-if test "x$ac_cv_lib_ncurses_clear" = x""yes; then :
+if test "x$ac_cv_lib_ncurses_clear" = xyes; then :
   ncurses="y"
 else
   ncurses="n"
@@ -6709,7 +6762,7 @@ if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
 set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_PKG_CONFIG+set}" = set; then :
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $PKG_CONFIG in
@@ -6752,7 +6805,7 @@ if test -z "$ac_cv_path_PKG_CONFIG"; then
 set dummy pkg-config; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then :
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   case $ac_pt_PKG_CONFIG in
@@ -6897,7 +6950,7 @@ and glib_LIBS to avoid the need to call pkg-config.
 See the pkg-config man page for more details.
 
 To get pkg-config, see <http://pkg-config.freedesktop.org/>.
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
 else
 	glib_CFLAGS=$pkg_cv_glib_CFLAGS
 	glib_LIBS=$pkg_cv_glib_LIBS
@@ -6933,11 +6986,11 @@ fi
 
 # Checks for libraries.
 ac_fn_c_check_header_mongrel "$LINENO" "bzlib.h" "ac_cv_header_bzlib_h" "$ac_includes_default"
-if test "x$ac_cv_header_bzlib_h" = x""yes; then :
+if test "x$ac_cv_header_bzlib_h" = xyes; then :
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BZ2_bzDecompressInit in -lbz2" >&5
 $as_echo_n "checking for BZ2_bzDecompressInit in -lbz2... " >&6; }
-if test "${ac_cv_lib_bz2_BZ2_bzDecompressInit+set}" = set; then :
+if ${ac_cv_lib_bz2_BZ2_bzDecompressInit+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -6971,7 +7024,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bz2_BZ2_bzDecompressInit" >&5
 $as_echo "$ac_cv_lib_bz2_BZ2_bzDecompressInit" >&6; }
-if test "x$ac_cv_lib_bz2_BZ2_bzDecompressInit" = x""yes; then :
+if test "x$ac_cv_lib_bz2_BZ2_bzDecompressInit" = xyes; then :
   zlib="$zlib -DHAVE_BZLIB -lbz2"
 fi
 
@@ -6980,11 +7033,11 @@ fi
 
 
 ac_fn_c_check_header_mongrel "$LINENO" "lzma.h" "ac_cv_header_lzma_h" "$ac_includes_default"
-if test "x$ac_cv_header_lzma_h" = x""yes; then :
+if test "x$ac_cv_header_lzma_h" = xyes; then :
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lzma_stream_decoder in -llzma" >&5
 $as_echo_n "checking for lzma_stream_decoder in -llzma... " >&6; }
-if test "${ac_cv_lib_lzma_lzma_stream_decoder+set}" = set; then :
+if ${ac_cv_lib_lzma_lzma_stream_decoder+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -7018,7 +7071,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzma_lzma_stream_decoder" >&5
 $as_echo "$ac_cv_lib_lzma_lzma_stream_decoder" >&6; }
-if test "x$ac_cv_lib_lzma_lzma_stream_decoder" = x""yes; then :
+if test "x$ac_cv_lib_lzma_lzma_stream_decoder" = xyes; then :
   zlib="$zlib -DHAVE_LZMA -llzma"
 fi
 
@@ -7027,11 +7080,11 @@ fi
 
 
 ac_fn_c_check_header_mongrel "$LINENO" "lzo/lzo1x.h" "ac_cv_header_lzo_lzo1x_h" "$ac_includes_default"
-if test "x$ac_cv_header_lzo_lzo1x_h" = x""yes; then :
+if test "x$ac_cv_header_lzo_lzo1x_h" = xyes; then :
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lzo1x_decompress in -llzo2" >&5
 $as_echo_n "checking for lzo1x_decompress in -llzo2... " >&6; }
-if test "${ac_cv_lib_lzo2_lzo1x_decompress+set}" = set; then :
+if ${ac_cv_lib_lzo2_lzo1x_decompress+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -7065,7 +7118,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzo2_lzo1x_decompress" >&5
 $as_echo "$ac_cv_lib_lzo2_lzo1x_decompress" >&6; }
-if test "x$ac_cv_lib_lzo2_lzo1x_decompress" = x""yes; then :
+if test "x$ac_cv_lib_lzo2_lzo1x_decompress" = xyes; then :
   zlib="$zlib -DHAVE_LZO1X -llzo2"
 fi
 
@@ -7076,7 +7129,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for io_setup in -laio" >&5
 $as_echo_n "checking for io_setup in -laio... " >&6; }
-if test "${ac_cv_lib_aio_io_setup+set}" = set; then :
+if ${ac_cv_lib_aio_io_setup+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -7110,7 +7163,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_aio_io_setup" >&5
 $as_echo "$ac_cv_lib_aio_io_setup" >&6; }
-if test "x$ac_cv_lib_aio_io_setup" = x""yes; then :
+if test "x$ac_cv_lib_aio_io_setup" = xyes; then :
   system_aio="y"
 else
   system_aio="n"
@@ -7119,7 +7172,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MD5 in -lcrypto" >&5
 $as_echo_n "checking for MD5 in -lcrypto... " >&6; }
-if test "${ac_cv_lib_crypto_MD5+set}" = set; then :
+if ${ac_cv_lib_crypto_MD5+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -7153,7 +7206,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_MD5" >&5
 $as_echo "$ac_cv_lib_crypto_MD5" >&6; }
-if test "x$ac_cv_lib_crypto_MD5" = x""yes; then :
+if test "x$ac_cv_lib_crypto_MD5" = xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_LIBCRYPTO 1
 _ACEOF
@@ -7166,7 +7219,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ext2fs_open2 in -lext2fs" >&5
 $as_echo_n "checking for ext2fs_open2 in -lext2fs... " >&6; }
-if test "${ac_cv_lib_ext2fs_ext2fs_open2+set}" = set; then :
+if ${ac_cv_lib_ext2fs_ext2fs_open2+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -7200,7 +7253,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ext2fs_ext2fs_open2" >&5
 $as_echo "$ac_cv_lib_ext2fs_ext2fs_open2" >&6; }
-if test "x$ac_cv_lib_ext2fs_ext2fs_open2" = x""yes; then :
+if test "x$ac_cv_lib_ext2fs_ext2fs_open2" = xyes; then :
   libext2fs="y"
 else
   libext2fs="n"
@@ -7209,7 +7262,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcry_md_hash_buffer in -lgcrypt" >&5
 $as_echo_n "checking for gcry_md_hash_buffer in -lgcrypt... " >&6; }
-if test "${ac_cv_lib_gcrypt_gcry_md_hash_buffer+set}" = set; then :
+if ${ac_cv_lib_gcrypt_gcry_md_hash_buffer+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -7243,7 +7296,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gcrypt_gcry_md_hash_buffer" >&5
 $as_echo "$ac_cv_lib_gcrypt_gcry_md_hash_buffer" >&6; }
-if test "x$ac_cv_lib_gcrypt_gcry_md_hash_buffer" = x""yes; then :
+if test "x$ac_cv_lib_gcrypt_gcry_md_hash_buffer" = xyes; then :
   libgcrypt="y"
 else
   libgcrypt="n"
@@ -7253,7 +7306,7 @@ fi
 
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread flag" >&5
 $as_echo_n "checking for pthread flag... " >&6; }
-if test "${ax_cv_pthread_flags+set}" = set; then :
+if ${ax_cv_pthread_flags+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 
@@ -7317,7 +7370,7 @@ $as_echo "$ax_cv_pthread_flags" >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5
 $as_echo_n "checking for clock_gettime in -lrt... " >&6; }
-if test "${ac_cv_lib_rt_clock_gettime+set}" = set; then :
+if ${ac_cv_lib_rt_clock_gettime+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -7351,7 +7404,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime" >&5
 $as_echo "$ac_cv_lib_rt_clock_gettime" >&6; }
-if test "x$ac_cv_lib_rt_clock_gettime" = x""yes; then :
+if test "x$ac_cv_lib_rt_clock_gettime" = xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_LIBRT 1
 _ACEOF
@@ -7362,7 +7415,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for yajl_alloc in -lyajl" >&5
 $as_echo_n "checking for yajl_alloc in -lyajl... " >&6; }
-if test "${ac_cv_lib_yajl_yajl_alloc+set}" = set; then :
+if ${ac_cv_lib_yajl_yajl_alloc+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -7396,7 +7449,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_yajl_yajl_alloc" >&5
 $as_echo "$ac_cv_lib_yajl_yajl_alloc" >&6; }
-if test "x$ac_cv_lib_yajl_yajl_alloc" = x""yes; then :
+if test "x$ac_cv_lib_yajl_yajl_alloc" = xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_LIBYAJL 1
 _ACEOF
@@ -7409,7 +7462,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for deflateCopy in -lz" >&5
 $as_echo_n "checking for deflateCopy in -lz... " >&6; }
-if test "${ac_cv_lib_z_deflateCopy+set}" = set; then :
+if ${ac_cv_lib_z_deflateCopy+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -7443,7 +7496,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_deflateCopy" >&5
 $as_echo "$ac_cv_lib_z_deflateCopy" >&6; }
-if test "x$ac_cv_lib_z_deflateCopy" = x""yes; then :
+if test "x$ac_cv_lib_z_deflateCopy" = xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_LIBZ 1
 _ACEOF
@@ -7456,7 +7509,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libiconv_open in -liconv" >&5
 $as_echo_n "checking for libiconv_open in -liconv... " >&6; }
-if test "${ac_cv_lib_iconv_libiconv_open+set}" = set; then :
+if ${ac_cv_lib_iconv_libiconv_open+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -7490,7 +7543,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_libiconv_open" >&5
 $as_echo "$ac_cv_lib_iconv_libiconv_open" >&6; }
-if test "x$ac_cv_lib_iconv_libiconv_open" = x""yes; then :
+if test "x$ac_cv_lib_iconv_libiconv_open" = xyes; then :
   libiconv="y"
 else
   libiconv="n"
@@ -7499,11 +7552,22 @@ fi
 
 
 # Checks for header files.
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
 # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
 # for constant arguments.  Useless!
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
 $as_echo_n "checking for working alloca.h... " >&6; }
-if test "${ac_cv_working_alloca_h+set}" = set; then :
+if ${ac_cv_working_alloca_h+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -7536,7 +7600,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
 $as_echo_n "checking for alloca... " >&6; }
-if test "${ac_cv_func_alloca_works+set}" = set; then :
+if ${ac_cv_func_alloca_works+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -7555,7 +7619,7 @@ else
  #pragma alloca
 #   else
 #    ifndef alloca /* predefined by HP cc +Olibcalls */
-char *alloca ();
+void *alloca (size_t);
 #    endif
 #   endif
 #  endif
@@ -7599,7 +7663,7 @@ $as_echo "#define C_ALLOCA 1" >>confdefs.h
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5
 $as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; }
-if test "${ac_cv_os_cray+set}" = set; then :
+if ${ac_cv_os_cray+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -7640,7 +7704,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
 $as_echo_n "checking stack direction for C alloca... " >&6; }
-if test "${ac_cv_c_stack_direction+set}" = set; then :
+if ${ac_cv_c_stack_direction+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" = yes; then :
@@ -7711,7 +7775,7 @@ done
 # Checks for typedefs, structures, and compiler characteristics.
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5
 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; }
-if test "${ac_cv_header_stdbool_h+set}" = set; then :
+if ${ac_cv_header_stdbool_h+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -7743,7 +7807,7 @@ else
 	char b[false == 0 ? 1 : -1];
 	char c[__bool_true_false_are_defined == 1 ? 1 : -1];
 	char d[(bool) 0.5 == true ? 1 : -1];
-	bool e = &s;
+	/* See body of main program for 'e'.  */
 	char f[(_Bool) 0.0 == false ? 1 : -1];
 	char g[true];
 	char h[sizeof (_Bool)];
@@ -7754,25 +7818,6 @@ else
 	_Bool n[m];
 	char o[sizeof n == m * sizeof n[0] ? 1 : -1];
 	char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
-#	if defined __xlc__ || defined __GNUC__
-	 /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0
-	    reported by James Lemley on 2005-10-05; see
-	    http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html
-	    This test is not quite right, since xlc is allowed to
-	    reject this program, as the initializer for xlcbug is
-	    not one of the forms that C requires support for.
-	    However, doing the test right would require a runtime
-	    test, and that would make cross-compilation harder.
-	    Let us hope that IBM fixes the xlc bug, and also adds
-	    support for this kind of constant expression.  In the
-	    meantime, this test will reject xlc, which is OK, since
-	    our stdbool.h substitute should suffice.  We also test
-	    this with GCC, where it should work, to detect more
-	    quickly whether someone messes up the test in the
-	    future.  */
-	 char digs[] = "0123456789";
-	 int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1);
-#	endif
 	/* Catch a bug in an HP-UX C compiler.  See
 	   http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
 	   http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
@@ -7784,6 +7829,7 @@ int
 main ()
 {
 
+	bool e = &s;
 	*pq |= q;
 	*pq |= ! q;
 	/* Refer to every declared value, to avoid compiler optimizations.  */
@@ -7804,7 +7850,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5
 $as_echo "$ac_cv_header_stdbool_h" >&6; }
 ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default"
-if test "x$ac_cv_type__Bool" = x""yes; then :
+if test "x$ac_cv_type__Bool" = xyes; then :
 
 cat >>confdefs.h <<_ACEOF
 #define HAVE__BOOL 1
@@ -7821,7 +7867,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5
 $as_echo_n "checking for uid_t in sys/types.h... " >&6; }
-if test "${ac_cv_type_uid_t+set}" = set; then :
+if ${ac_cv_type_uid_t+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -7851,7 +7897,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
 $as_echo_n "checking for inline... " >&6; }
-if test "${ac_cv_c_inline+set}" = set; then :
+if ${ac_cv_c_inline+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_cv_c_inline=no
@@ -7936,7 +7982,7 @@ _ACEOF
 esac
 
 ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default"
-if test "x$ac_cv_type_mode_t" = x""yes; then :
+if test "x$ac_cv_type_mode_t" = xyes; then :
 
 else
 
@@ -7947,7 +7993,7 @@ _ACEOF
 fi
 
 ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default"
-if test "x$ac_cv_type_off_t" = x""yes; then :
+if test "x$ac_cv_type_off_t" = xyes; then :
 
 else
 
@@ -7958,7 +8004,7 @@ _ACEOF
 fi
 
 ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default"
-if test "x$ac_cv_type_pid_t" = x""yes; then :
+if test "x$ac_cv_type_pid_t" = xyes; then :
 
 else
 
@@ -7970,7 +8016,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5
 $as_echo_n "checking for C/C++ restrict keyword... " >&6; }
-if test "${ac_cv_c_restrict+set}" = set; then :
+if ${ac_cv_c_restrict+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_cv_c_restrict=no
@@ -8015,7 +8061,7 @@ _ACEOF
  esac
 
 ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
-if test "x$ac_cv_type_size_t" = x""yes; then :
+if test "x$ac_cv_type_size_t" = xyes; then :
 
 else
 
@@ -8026,7 +8072,7 @@ _ACEOF
 fi
 
 ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default"
-if test "x$ac_cv_type_ssize_t" = x""yes; then :
+if test "x$ac_cv_type_ssize_t" = xyes; then :
 
 else
 
@@ -8037,7 +8083,7 @@ _ACEOF
 fi
 
 ac_fn_c_check_member "$LINENO" "struct stat" "st_blksize" "ac_cv_member_struct_stat_st_blksize" "$ac_includes_default"
-if test "x$ac_cv_member_struct_stat_st_blksize" = x""yes; then :
+if test "x$ac_cv_member_struct_stat_st_blksize" = xyes; then :
 
 cat >>confdefs.h <<_ACEOF
 #define HAVE_STRUCT_STAT_ST_BLKSIZE 1
@@ -8047,7 +8093,7 @@ _ACEOF
 fi
 
 ac_fn_c_check_member "$LINENO" "struct stat" "st_blocks" "ac_cv_member_struct_stat_st_blocks" "$ac_includes_default"
-if test "x$ac_cv_member_struct_stat_st_blocks" = x""yes; then :
+if test "x$ac_cv_member_struct_stat_st_blocks" = xyes; then :
 
 cat >>confdefs.h <<_ACEOF
 #define HAVE_STRUCT_STAT_ST_BLOCKS 1
@@ -8067,7 +8113,7 @@ fi
 
 
 ac_fn_c_check_member "$LINENO" "struct stat" "st_rdev" "ac_cv_member_struct_stat_st_rdev" "$ac_includes_default"
-if test "x$ac_cv_member_struct_stat_st_rdev" = x""yes; then :
+if test "x$ac_cv_member_struct_stat_st_rdev" = xyes; then :
 
 cat >>confdefs.h <<_ACEOF
 #define HAVE_STRUCT_STAT_ST_RDEV 1
@@ -8131,7 +8177,7 @@ _ACEOF
   esac
 
 ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
-if test "x$ac_cv_type_ptrdiff_t" = x""yes; then :
+if test "x$ac_cv_type_ptrdiff_t" = xyes; then :
 
 cat >>confdefs.h <<_ACEOF
 #define HAVE_PTRDIFF_T 1
@@ -8144,7 +8190,7 @@ fi
 # Checks for library functions.
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for error_at_line" >&5
 $as_echo_n "checking for error_at_line... " >&6; }
-if test "${ac_cv_lib_error_at_line+set}" = set; then :
+if ${ac_cv_lib_error_at_line+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -8180,7 +8226,7 @@ fi
 for ac_header in vfork.h
 do :
   ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default"
-if test "x$ac_cv_header_vfork_h" = x""yes; then :
+if test "x$ac_cv_header_vfork_h" = xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_VFORK_H 1
 _ACEOF
@@ -8204,7 +8250,7 @@ done
 if test "x$ac_cv_func_fork" = xyes; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5
 $as_echo_n "checking for working fork... " >&6; }
-if test "${ac_cv_func_fork_works+set}" = set; then :
+if ${ac_cv_func_fork_works+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" = yes; then :
@@ -8257,7 +8303,7 @@ ac_cv_func_vfork_works=$ac_cv_func_vfork
 if test "x$ac_cv_func_vfork" = xyes; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5
 $as_echo_n "checking for working vfork... " >&6; }
-if test "${ac_cv_func_vfork_works+set}" = set; then :
+if ${ac_cv_func_vfork_works+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" = yes; then :
@@ -8392,7 +8438,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5
 $as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; }
-if test "${ac_cv_sys_largefile_source+set}" = set; then :
+if ${ac_cv_sys_largefile_source+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   while :; do
@@ -8460,7 +8506,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5
 $as_echo_n "checking whether lstat correctly handles trailing slash... " >&6; }
-if test "${ac_cv_func_lstat_dereferences_slashed_symlink+set}" = set; then :
+if ${ac_cv_func_lstat_dereferences_slashed_symlink+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   rm -f conftest.sym conftest.file
@@ -8522,7 +8568,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sys/types.h defines makedev" >&5
 $as_echo_n "checking whether sys/types.h defines makedev... " >&6; }
-if test "${ac_cv_header_sys_types_h_makedev+set}" = set; then :
+if ${ac_cv_header_sys_types_h_makedev+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -8550,7 +8596,7 @@ $as_echo "$ac_cv_header_sys_types_h_makedev" >&6; }
 
 if test $ac_cv_header_sys_types_h_makedev = no; then
 ac_fn_c_check_header_mongrel "$LINENO" "sys/mkdev.h" "ac_cv_header_sys_mkdev_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_mkdev_h" = x""yes; then :
+if test "x$ac_cv_header_sys_mkdev_h" = xyes; then :
 
 $as_echo "#define MAJOR_IN_MKDEV 1" >>confdefs.h
 
@@ -8560,7 +8606,7 @@ fi
 
   if test $ac_cv_header_sys_mkdev_h = no; then
     ac_fn_c_check_header_mongrel "$LINENO" "sys/sysmacros.h" "ac_cv_header_sys_sysmacros_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_sysmacros_h" = x""yes; then :
+if test "x$ac_cv_header_sys_sysmacros_h" = xyes; then :
 
 $as_echo "#define MAJOR_IN_SYSMACROS 1" >>confdefs.h
 
@@ -8573,7 +8619,7 @@ fi
 for ac_header in stdlib.h
 do :
   ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
-if test "x$ac_cv_header_stdlib_h" = x""yes; then :
+if test "x$ac_cv_header_stdlib_h" = xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_STDLIB_H 1
 _ACEOF
@@ -8584,7 +8630,7 @@ done
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5
 $as_echo_n "checking for GNU libc compatible malloc... " >&6; }
-if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then :
+if ${ac_cv_func_malloc_0_nonnull+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" = yes; then :
@@ -8639,7 +8685,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5
 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; }
-if test "${ac_cv_header_time+set}" = set; then :
+if ${ac_cv_header_time+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -8714,7 +8760,7 @@ done
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mktime" >&5
 $as_echo_n "checking for working mktime... " >&6; }
-if test "${ac_cv_func_working_mktime+set}" = set; then :
+if ${ac_cv_func_working_mktime+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" = yes; then :
@@ -8943,7 +8989,7 @@ fi
 for ac_func in getpagesize
 do :
   ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize"
-if test "x$ac_cv_func_getpagesize" = x""yes; then :
+if test "x$ac_cv_func_getpagesize" = xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_GETPAGESIZE 1
 _ACEOF
@@ -8953,7 +8999,7 @@ done
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5
 $as_echo_n "checking for working mmap... " >&6; }
-if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then :
+if ${ac_cv_func_mmap_fixed_mapped+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" = yes; then :
@@ -9120,7 +9166,7 @@ rm -f conftest.mmap conftest.txt
 for ac_header in stdlib.h
 do :
   ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
-if test "x$ac_cv_header_stdlib_h" = x""yes; then :
+if test "x$ac_cv_header_stdlib_h" = xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_STDLIB_H 1
 _ACEOF
@@ -9131,7 +9177,7 @@ done
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible realloc" >&5
 $as_echo_n "checking for GNU libc compatible realloc... " >&6; }
-if test "${ac_cv_func_realloc_0_nonnull+set}" = set; then :
+if ${ac_cv_func_realloc_0_nonnull+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" = yes; then :
@@ -9184,13 +9230,17 @@ $as_echo "#define realloc rpl_realloc" >>confdefs.h
 fi
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strnlen" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strnlen" >&5
 $as_echo_n "checking for working strnlen... " >&6; }
-if test "${ac_cv_func_strnlen_working+set}" = set; then :
+if ${ac_cv_func_strnlen_working+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" = yes; then :
-  ac_cv_func_strnlen_working=no
+  # Guess no on AIX systems, yes otherwise.
+		case "$host_os" in
+		  aix*) ac_cv_func_strnlen_working=no;;
+		  *)    ac_cv_func_strnlen_working=yes;;
+		esac
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
@@ -9239,7 +9289,7 @@ esac
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strtod" >&5
 $as_echo_n "checking for working strtod... " >&6; }
-if test "${ac_cv_func_strtod+set}" = set; then :
+if ${ac_cv_func_strtod+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" = yes; then :
@@ -9298,14 +9348,14 @@ if test $ac_cv_func_strtod = no; then
 esac
 
 ac_fn_c_check_func "$LINENO" "pow" "ac_cv_func_pow"
-if test "x$ac_cv_func_pow" = x""yes; then :
+if test "x$ac_cv_func_pow" = xyes; then :
 
 fi
 
 if test $ac_cv_func_pow = no; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pow in -lm" >&5
 $as_echo_n "checking for pow in -lm... " >&6; }
-if test "${ac_cv_lib_m_pow+set}" = set; then :
+if ${ac_cv_lib_m_pow+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -9339,7 +9389,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_pow" >&5
 $as_echo "$ac_cv_lib_m_pow" >&6; }
-if test "x$ac_cv_lib_m_pow" = x""yes; then :
+if test "x$ac_cv_lib_m_pow" = xyes; then :
   POW_LIB=-lm
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot find library containing definition of pow" >&5
@@ -9435,10 +9485,21 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
      :end' >>confcache
 if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
   if test -w "$cache_file"; then
-    test "x$cache_file" != "x/dev/null" &&
+    if test "x$cache_file" != "x/dev/null"; then
       { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
 $as_echo "$as_me: updating cache $cache_file" >&6;}
-    cat confcache >$cache_file
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
   else
     { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
@@ -9470,7 +9531,7 @@ LTLIBOBJS=$ac_ltlibobjs
 
 
 
-: ${CONFIG_STATUS=./config.status}
+: "${CONFIG_STATUS=./config.status}"
 ac_write_fail=0
 ac_clean_files_save=$ac_clean_files
 ac_clean_files="$ac_clean_files $CONFIG_STATUS"
@@ -9571,6 +9632,7 @@ fi
 IFS=" ""	$as_nl"
 
 # Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
 case $0 in #((
   *[\\/]* ) as_myself=$0 ;;
   *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -9878,7 +9940,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # values after options handling.
 ac_log="
 This file was extended by Xen Hypervisor $as_me 4.2, which was
-generated by GNU Autoconf 2.67.  Invocation command line was
+generated by GNU Autoconf 2.68.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -9940,7 +10002,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
 Xen Hypervisor config.status 4.2
-configured by $0, generated by GNU Autoconf 2.67,
+configured by $0, generated by GNU Autoconf 2.68,
   with options \\"\$ac_cs_config\\"
 
 Copyright (C) 2010 Free Software Foundation, Inc.
@@ -10064,7 +10126,7 @@ do
     "../config/Tools.mk") CONFIG_FILES="$CONFIG_FILES ../config/Tools.mk" ;;
     "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
 
-  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;;
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
   esac
 done
 
@@ -10086,9 +10148,10 @@ fi
 # after its creation but before its name has been assigned to `$tmp'.
 $debug ||
 {
-  tmp=
+  tmp= ac_tmp=
   trap 'exit_status=$?
-  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
 ' 0
   trap 'as_fn_exit 1' 1 2 13 15
 }
@@ -10096,12 +10159,13 @@ $debug ||
 
 {
   tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
+  test -d "$tmp"
 }  ||
 {
   tmp=./conf$$-$RANDOM
   (umask 077 && mkdir "$tmp")
 } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
 
 # Set up the scripts for CONFIG_FILES section.
 # No need to generate them if there are no CONFIG_FILES.
@@ -10123,7 +10187,7 @@ else
   ac_cs_awk_cr=$ac_cr
 fi
 
-echo 'BEGIN {' >"$tmp/subs1.awk" &&
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
 _ACEOF
 
 
@@ -10151,7 +10215,7 @@ done
 rm -f conf$$subs.sh
 
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
 _ACEOF
 sed -n '
 h
@@ -10199,7 +10263,7 @@ t delim
 rm -f conf$$subs.awk
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 _ACAWK
-cat >>"\$tmp/subs1.awk" <<_ACAWK &&
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
   for (key in S) S_is_set[key] = 1
   FS = ""
 
@@ -10231,7 +10295,7 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
   sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
 else
   cat
-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
   || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
 _ACEOF
 
@@ -10265,7 +10329,7 @@ fi # test -n "$CONFIG_FILES"
 # No need to generate them if there are no CONFIG_HEADERS.
 # This happens for instance with `./config.status Makefile'.
 if test -n "$CONFIG_HEADERS"; then
-cat >"$tmp/defines.awk" <<\_ACAWK ||
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
 BEGIN {
 _ACEOF
 
@@ -10277,8 +10341,8 @@ _ACEOF
 # handling of long lines.
 ac_delim='%!_!# '
 for ac_last_try in false false :; do
-  ac_t=`sed -n "/$ac_delim/p" confdefs.h`
-  if test -z "$ac_t"; then
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
     break
   elif $ac_last_try; then
     as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
@@ -10379,7 +10443,7 @@ do
   esac
   case $ac_mode$ac_tag in
   :[FHL]*:*);;
-  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
   :[FH]-) ac_tag=-:-;;
   :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
   esac
@@ -10398,7 +10462,7 @@ do
     for ac_f
     do
       case $ac_f in
-      -) ac_f="$tmp/stdin";;
+      -) ac_f="$ac_tmp/stdin";;
       *) # Look for the file first in the build tree, then in the source tree
 	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
 	 # because $ac_f cannot contain `:'.
@@ -10407,7 +10471,7 @@ do
 	   [\\/$]*) false;;
 	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
 	   esac ||
-	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;;
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
       esac
       case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
       as_fn_append ac_file_inputs " '$ac_f'"
@@ -10433,8 +10497,8 @@ $as_echo "$as_me: creating $ac_file" >&6;}
     esac
 
     case $ac_tag in
-    *:-:* | *:-) cat >"$tmp/stdin" \
-      || as_fn_error $? "could not create $ac_file" "$LINENO" 5  ;;
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
     esac
     ;;
   esac
@@ -10564,21 +10628,22 @@ s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
 s&@INSTALL@&$ac_INSTALL&;t t
 $ac_datarootdir_hack
 "
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
-  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
 
 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
-  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
-  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
 which seems to be undefined.  Please make sure it is defined" >&5
 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
 which seems to be undefined.  Please make sure it is defined" >&2;}
 
-  rm -f "$tmp/stdin"
+  rm -f "$ac_tmp/stdin"
   case $ac_file in
-  -) cat "$tmp/out" && rm -f "$tmp/out";;
-  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
   esac \
   || as_fn_error $? "could not create $ac_file" "$LINENO" 5
  ;;
@@ -10589,20 +10654,20 @@ which seems to be undefined.  Please make sure it is defined" >&2;}
   if test x"$ac_file" != x-; then
     {
       $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
-    } >"$tmp/config.h" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
       || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
       { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
 $as_echo "$as_me: $ac_file is unchanged" >&6;}
     else
       rm -f "$ac_file"
-      mv "$tmp/config.h" "$ac_file" \
+      mv "$ac_tmp/config.h" "$ac_file" \
 	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
     fi
   else
     $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
       || as_fn_error $? "could not create -" "$LINENO" 5
   fi
  ;;
diff --git a/tools/configure.ac b/tools/configure.ac
index 250dffd..ddabfef 100644
--- a/tools/configure.ac
+++ b/tools/configure.ac
@@ -106,6 +106,7 @@ AX_PATH_PROG_OR_FAIL([AS86], [as86])
 AX_PATH_PROG_OR_FAIL([LD86], [ld86])
 AX_PATH_PROG_OR_FAIL([BCC], [bcc])
 AX_PATH_PROG_OR_FAIL([IASL], [iasl])
+AX_PATH_PROG_OR_FAIL([FLEX], [flex])
 AX_CHECK_UUID
 AX_CHECK_CURSES
 PKG_CHECK_MODULES(glib, glib-2.0)
-- 
1.7.9.5


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

From xen-devel-bounces@lists.xen.org Mon Apr 16 07:43:42 2012
Return-path: <xen-devel-bounces@lists.xen.org>
Envelope-to: archives@lists.xen.org
Delivery-date: Mon, 16 Apr 2012 07:43:42 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xen.org>)
	id 1SJgaQ-0005Y9-FQ; Mon, 16 Apr 2012 07:42:58 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <Ian.Campbell@citrix.com>) id 1SJgaO-0005Y0-Ra
	for xen-devel@lists.xensource.com; Mon, 16 Apr 2012 07:42:57 +0000
Received: from [85.158.143.99:11964] by server-3.bemta-4.messagelabs.com id
	97/F9-05853-08DCB8F4; Mon, 16 Apr 2012 07:42:56 +0000
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1334562174!14143708!1
X-Originating-IP: [62.200.22.115]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjIuMjAwLjIyLjExNSA9PiA5NDQzOQ==\n
X-StarScan-Version: 6.5.7; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19129 invoked from network); 16 Apr 2012 07:42:55 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Apr 2012 07:42:55 -0000
X-IronPort-AV: E=Sophos;i="4.75,428,1330905600"; d="scan'208";a="11946985"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Apr 2012 07:42:54 +0000
Received: from [127.0.0.1] (10.80.16.67) by smtprelay.citrix.com
	(10.30.203.162) with Microsoft SMTP Server id 8.3.213.0;
	Mon, 16 Apr 2012 08:42:53 +0100
Message-ID: <1334562173.4445.9.camel@dagon.hellion.org.uk>
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jean Guyader <jean.guyader@gmail.com>
Date: Mon, 16 Apr 2012 08:42:53 +0100
In-Reply-To: <1334515390-29941-1-git-send-email-jean.guyader@gmail.com>
References: <1334515390-29941-1-git-send-email-jean.guyader@gmail.com>
Organization: Citrix Systems, Inc.
X-Mailer: Evolution 3.2.2-1 
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, Roger
	Pau Monne <roger.pau@citrix.com>
Subject: Re: [Xen-devel] [PATCH] configure: Check for flex
X-BeenThere: xen-devel@lists.xen.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xen.org>
List-Unsubscribe: <http://lists.xen.org/cgi-bin/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xen.org?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xen.org>
List-Help: <mailto:xen-devel-request@lists.xen.org?subject=help>
List-Subscribe: <http://lists.xen.org/cgi-bin/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xen.org?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Sender: xen-devel-bounces@lists.xen.org
Errors-To: xen-devel-bounces@lists.xen.org

On Sun, 2012-04-15 at 19:43 +0100, Jean Guyader wrote:
> libxl require the command flex to be present.
> Verify in the configure script that the flex
> command exsits.

If only it were that simple :-/

We need a fairly recent version of flex (to avoid bugs WRT reentrancy of
the generated parsers) and this version is not in various stable
releases of common distros.

So we check in the generated files and are supposed to only rebuild them
when the source has changed. However there seems to be a bug somewhere
(probably something to do with VCS vs. timestamps) and sometime the
files get regenerated when they needn't be, at which point you need =

flex...

I think Roger Pau Monn=E9 posted a fix for all this last week.

> =

> Signed-off-by: Jean Guyader <jean.guyader@gmail.com>
> ---
>  tools/configure    |  633 +++++++++++++++++++++++++++++-----------------=
------
>  tools/configure.ac |    1 +
>  2 files changed, 350 insertions(+), 284 deletions(-)
> =

> diff --git a/tools/configure b/tools/configure
> index 86618f5..071adf7 100755
> --- a/tools/configure
> +++ b/tools/configure
> @@ -1,6 +1,6 @@
>  #! /bin/sh
>  # Guess values for system-dependent variables and create Makefiles.
> -# Generated by GNU Autoconf 2.67 for Xen Hypervisor 4.2.
> +# Generated by GNU Autoconf 2.68 for Xen Hypervisor 4.2.
>  #
>  # Report bugs to <xen-devel@lists.xensource.com>.
>  #
> @@ -91,6 +91,7 @@ fi
>  IFS=3D" ""       $as_nl"
> =

>  # Find who we are.  Look in the path if we contain no directory separato=
r.
> +as_myself=3D
>  case $0 in #((
>    *[\\/]* ) as_myself=3D$0 ;;
>    *) as_save_IFS=3D$IFS; IFS=3D$PATH_SEPARATOR
> @@ -216,11 +217,18 @@ IFS=3D$as_save_IFS
>    # We cannot yet assume a decent shell, so we have to provide a
>         # neutralization value for shells without unset; and this also
>         # works around shells that cannot unset nonexistent variables.
> +       # Preserve -v and -x to the replacement shell.
>         BASH_ENV=3D/dev/null
>         ENV=3D/dev/null
>         (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
>         export CONFIG_SHELL
> -       exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
> +       case $- in # ((((
> +         *v*x* | *x*v* ) as_opts=3D-vx ;;
> +         *v* ) as_opts=3D-v ;;
> +         *x* ) as_opts=3D-x ;;
> +         * ) as_opts=3D ;;
> +       esac
> +       exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
>  fi
> =

>      if test x$as_have_required =3D xno; then :
> @@ -1164,7 +1172,7 @@ Try \`$0 --help' for more information"
>      $as_echo "$as_me: WARNING: you should use --build, --host, --target"=
 >&2
>      expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
>        $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
> -    : ${build_alias=3D$ac_option} ${host_alias=3D$ac_option} ${target_al=
ias=3D$ac_option}
> +    : "${build_alias=3D$ac_option} ${host_alias=3D$ac_option} ${target_a=
lias=3D$ac_option}"
>      ;;
> =

>    esac
> @@ -1490,7 +1498,7 @@ test -n "$ac_init_help" && exit $ac_status
>  if $ac_init_version; then
>    cat <<\_ACEOF
>  Xen Hypervisor configure 4.2
> -generated by GNU Autoconf 2.67
> +generated by GNU Autoconf 2.68
> =

>  Copyright (C) 2010 Free Software Foundation, Inc.
>  This configure script is free software; the Free Software Foundation
> @@ -1536,7 +1544,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
> =

>         ac_retval=3D1
>  fi
> -  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=
=3D; unset as_lineno;}
> +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
>    as_fn_set_status $ac_retval
> =

>  } # ac_fn_c_try_compile
> @@ -1573,7 +1581,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
> =

>      ac_retval=3D1
>  fi
> -  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=
=3D; unset as_lineno;}
> +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
>    as_fn_set_status $ac_retval
> =

>  } # ac_fn_c_try_cpp
> @@ -1586,10 +1594,10 @@ fi
>  ac_fn_c_check_header_mongrel ()
>  {
>    as_lineno=3D${as_lineno-"$1"} as_lineno_stack=3Das_lineno_stack=3D$as_=
lineno_stack
> -  if eval "test \"\${$3+set}\"" =3D set; then :
> +  if eval \${$3+:} false; then :
>    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
>  $as_echo_n "checking for $2... " >&6; }
> -if eval "test \"\${$3+set}\"" =3D set; then :
> +if eval \${$3+:} false; then :
>    $as_echo_n "(cached) " >&6
>  fi
>  eval ac_res=3D\$$3
> @@ -1656,7 +1664,7 @@ $as_echo "$as_me: WARNING: $2: proceeding with the =
compiler's result" >&2;}
>  esac
>    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
>  $as_echo_n "checking for $2... " >&6; }
> -if eval "test \"\${$3+set}\"" =3D set; then :
> +if eval \${$3+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    eval "$3=3D\$ac_header_compiler"
> @@ -1665,7 +1673,7 @@ eval ac_res=3D\$$3
>                { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" =
>&5
>  $as_echo "$ac_res" >&6; }
>  fi
> -  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=
=3D; unset as_lineno;}
> +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
> =

>  } # ac_fn_c_check_header_mongrel
> =

> @@ -1706,7 +1714,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
>         ac_retval=3D$ac_status
>  fi
>    rm -rf conftest.dSYM conftest_ipa8_conftest.oo
> -  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=
=3D; unset as_lineno;}
> +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
>    as_fn_set_status $ac_retval
> =

>  } # ac_fn_c_try_run
> @@ -1720,7 +1728,7 @@ ac_fn_c_check_header_compile ()
>    as_lineno=3D${as_lineno-"$1"} as_lineno_stack=3Das_lineno_stack=3D$as_=
lineno_stack
>    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
>  $as_echo_n "checking for $2... " >&6; }
> -if eval "test \"\${$3+set}\"" =3D set; then :
> +if eval \${$3+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> @@ -1738,7 +1746,7 @@ fi
>  eval ac_res=3D\$$3
>                { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" =
>&5
>  $as_echo "$ac_res" >&6; }
> -  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=
=3D; unset as_lineno;}
> +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
> =

>  } # ac_fn_c_check_header_compile
> =

> @@ -1783,11 +1791,65 @@ fi
>    # interfere with the next link command; also delete a directory that is
>    # left behind by Apple's compiler.  We do this before executing the ac=
tions.
>    rm -rf conftest.dSYM conftest_ipa8_conftest.oo
> -  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=
=3D; unset as_lineno;}
> +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
>    as_fn_set_status $ac_retval
> =

>  } # ac_fn_c_try_link
> =

> +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
> +# -------------------------------------------
> +# Tests whether TYPE exists after having included INCLUDES, setting cache
> +# variable VAR accordingly.
> +ac_fn_c_check_type ()
> +{
> +  as_lineno=3D${as_lineno-"$1"} as_lineno_stack=3Das_lineno_stack=3D$as_=
lineno_stack
> +  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
> +$as_echo_n "checking for $2... " >&6; }
> +if eval \${$3+:} false; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  eval "$3=3Dno"
> +  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +/* end confdefs.h.  */
> +$4
> +int
> +main ()
> +{
> +if (sizeof ($2))
> +        return 0;
> +  ;
> +  return 0;
> +}
> +_ACEOF
> +if ac_fn_c_try_compile "$LINENO"; then :
> +  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +/* end confdefs.h.  */
> +$4
> +int
> +main ()
> +{
> +if (sizeof (($2)))
> +           return 0;
> +  ;
> +  return 0;
> +}
> +_ACEOF
> +if ac_fn_c_try_compile "$LINENO"; then :
> +
> +else
> +  eval "$3=3Dyes"
> +fi
> +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> +fi
> +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> +fi
> +eval ac_res=3D\$$3
> +              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" =
>&5
> +$as_echo "$ac_res" >&6; }
> +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
> +
> +} # ac_fn_c_check_type
> +
>  # ac_fn_c_check_func LINENO FUNC VAR
>  # ----------------------------------
>  # Tests whether FUNC exists, setting the cache variable VAR accordingly
> @@ -1796,7 +1858,7 @@ ac_fn_c_check_func ()
>    as_lineno=3D${as_lineno-"$1"} as_lineno_stack=3Das_lineno_stack=3D$as_=
lineno_stack
>    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
>  $as_echo_n "checking for $2... " >&6; }
> -if eval "test \"\${$3+set}\"" =3D set; then :
> +if eval \${$3+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> @@ -1851,64 +1913,10 @@ fi
>  eval ac_res=3D\$$3
>                { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" =
>&5
>  $as_echo "$ac_res" >&6; }
> -  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=
=3D; unset as_lineno;}
> +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
> =

>  } # ac_fn_c_check_func
> =

> -# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
> -# -------------------------------------------
> -# Tests whether TYPE exists after having included INCLUDES, setting cache
> -# variable VAR accordingly.
> -ac_fn_c_check_type ()
> -{
> -  as_lineno=3D${as_lineno-"$1"} as_lineno_stack=3Das_lineno_stack=3D$as_=
lineno_stack
> -  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
> -$as_echo_n "checking for $2... " >&6; }
> -if eval "test \"\${$3+set}\"" =3D set; then :
> -  $as_echo_n "(cached) " >&6
> -else
> -  eval "$3=3Dno"
> -  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> -/* end confdefs.h.  */
> -$4
> -int
> -main ()
> -{
> -if (sizeof ($2))
> -        return 0;
> -  ;
> -  return 0;
> -}
> -_ACEOF
> -if ac_fn_c_try_compile "$LINENO"; then :
> -  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> -/* end confdefs.h.  */
> -$4
> -int
> -main ()
> -{
> -if (sizeof (($2)))
> -           return 0;
> -  ;
> -  return 0;
> -}
> -_ACEOF
> -if ac_fn_c_try_compile "$LINENO"; then :
> -
> -else
> -  eval "$3=3Dyes"
> -fi
> -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> -fi
> -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> -fi
> -eval ac_res=3D\$$3
> -              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" =
>&5
> -$as_echo "$ac_res" >&6; }
> -  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=
=3D; unset as_lineno;}
> -
> -} # ac_fn_c_check_type
> -
>  # ac_fn_c_find_intX_t LINENO BITS VAR
>  # -----------------------------------
>  # Finds a signed integer type with width BITS, setting cache variable VAR
> @@ -1918,7 +1926,7 @@ ac_fn_c_find_intX_t ()
>    as_lineno=3D${as_lineno-"$1"} as_lineno_stack=3Das_lineno_stack=3D$as_=
lineno_stack
>    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5
>  $as_echo_n "checking for int$2_t... " >&6; }
> -if eval "test \"\${$3+set}\"" =3D set; then :
> +if eval \${$3+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    eval "$3=3Dno"
> @@ -1979,7 +1987,7 @@ fi
>  eval ac_res=3D\$$3
>                { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" =
>&5
>  $as_echo "$ac_res" >&6; }
> -  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=
=3D; unset as_lineno;}
> +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
> =

>  } # ac_fn_c_find_intX_t
> =

> @@ -1992,7 +2000,7 @@ ac_fn_c_check_member ()
>    as_lineno=3D${as_lineno-"$1"} as_lineno_stack=3Das_lineno_stack=3D$as_=
lineno_stack
>    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
>  $as_echo_n "checking for $2.$3... " >&6; }
> -if eval "test \"\${$4+set}\"" =3D set; then :
> +if eval \${$4+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> @@ -2036,7 +2044,7 @@ fi
>  eval ac_res=3D\$$4
>                { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" =
>&5
>  $as_echo "$ac_res" >&6; }
> -  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=
=3D; unset as_lineno;}
> +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
> =

>  } # ac_fn_c_check_member
> =

> @@ -2049,7 +2057,7 @@ ac_fn_c_find_uintX_t ()
>    as_lineno=3D${as_lineno-"$1"} as_lineno_stack=3Das_lineno_stack=3D$as_=
lineno_stack
>    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5
>  $as_echo_n "checking for uint$2_t... " >&6; }
> -if eval "test \"\${$3+set}\"" =3D set; then :
> +if eval \${$3+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    eval "$3=3Dno"
> @@ -2089,7 +2097,7 @@ fi
>  eval ac_res=3D\$$3
>                { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" =
>&5
>  $as_echo "$ac_res" >&6; }
> -  eval $as_lineno_stack; test "x$as_lineno_stack" =3D x && { as_lineno=
=3D; unset as_lineno;}
> +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
> =

>  } # ac_fn_c_find_uintX_t
>  cat >config.log <<_ACEOF
> @@ -2097,7 +2105,7 @@ This file contains any messages produced by compile=
rs while
>  running configure, to aid debugging if configure makes a mistake.
> =

>  It was created by Xen Hypervisor $as_me 4.2, which was
> -generated by GNU Autoconf 2.67.  Invocation command line was
> +generated by GNU Autoconf 2.68.  Invocation command line was
> =

>    $ $0 $@
> =

> @@ -2355,7 +2363,7 @@ $as_echo "$as_me: loading site script $ac_site_file=
" >&6;}
>        || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd'=
:" >&5
>  $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
>  as_fn_error $? "failed to load site script $ac_site_file
> -See \`config.log' for more details" "$LINENO" 5 ; }
> +See \`config.log' for more details" "$LINENO" 5; }
>    fi
>  done
> =

> @@ -2508,7 +2516,7 @@ if test -n "$ac_tool_prefix"; then
>  set dummy ${ac_tool_prefix}gcc; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_CC+set}" =3D set; then :
> +if ${ac_cv_prog_CC+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$CC"; then
> @@ -2548,7 +2556,7 @@ if test -z "$ac_cv_prog_CC"; then
>  set dummy gcc; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_ac_ct_CC+set}" =3D set; then :
> +if ${ac_cv_prog_ac_ct_CC+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$ac_ct_CC"; then
> @@ -2601,7 +2609,7 @@ if test -z "$CC"; then
>  set dummy ${ac_tool_prefix}cc; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_CC+set}" =3D set; then :
> +if ${ac_cv_prog_CC+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$CC"; then
> @@ -2641,7 +2649,7 @@ if test -z "$CC"; then
>  set dummy cc; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_CC+set}" =3D set; then :
> +if ${ac_cv_prog_CC+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$CC"; then
> @@ -2700,7 +2708,7 @@ if test -z "$CC"; then
>  set dummy $ac_tool_prefix$ac_prog; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_CC+set}" =3D set; then :
> +if ${ac_cv_prog_CC+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$CC"; then
> @@ -2744,7 +2752,7 @@ do
>  set dummy $ac_prog; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_ac_ct_CC+set}" =3D set; then :
> +if ${ac_cv_prog_ac_ct_CC+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$ac_ct_CC"; then
> @@ -2799,7 +2807,7 @@ fi
>  test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`=
$ac_pwd':" >&5
>  $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
>  as_fn_error $? "no acceptable C compiler found in \$PATH
> -See \`config.log' for more details" "$LINENO" 5 ; }
> +See \`config.log' for more details" "$LINENO" 5; }
> =

>  # Provide some information about the compiler.
>  $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" =
>&5
> @@ -2914,7 +2922,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
>  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
>  $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
>  as_fn_error 77 "C compiler cannot create executables
> -See \`config.log' for more details" "$LINENO" 5 ; }
> +See \`config.log' for more details" "$LINENO" 5; }
>  else
>    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
>  $as_echo "yes" >&6; }
> @@ -2957,7 +2965,7 @@ else
>    { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
>  $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
>  as_fn_error $? "cannot compute suffix of executables: cannot compile and=
 link
> -See \`config.log' for more details" "$LINENO" 5 ; }
> +See \`config.log' for more details" "$LINENO" 5; }
>  fi
>  rm -f conftest conftest$ac_cv_exeext
>  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
> @@ -3016,7 +3024,7 @@ $as_echo "$ac_try_echo"; } >&5
>  $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
>  as_fn_error $? "cannot run C compiled programs.
>  If you meant to cross compile, use \`--host'.
> -See \`config.log' for more details" "$LINENO" 5 ; }
> +See \`config.log' for more details" "$LINENO" 5; }
>      fi
>    fi
>  fi
> @@ -3027,7 +3035,7 @@ rm -f conftest.$ac_ext conftest$ac_cv_exeext confte=
st.out
>  ac_clean_files=3D$ac_clean_files_save
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object f=
iles" >&5
>  $as_echo_n "checking for suffix of object files... " >&6; }
> -if test "${ac_cv_objext+set}" =3D set; then :
> +if ${ac_cv_objext+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> @@ -3068,7 +3076,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
>  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
>  $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
>  as_fn_error $? "cannot compute suffix of object files: cannot compile
> -See \`config.log' for more details" "$LINENO" 5 ; }
> +See \`config.log' for more details" "$LINENO" 5; }
>  fi
>  rm -f conftest.$ac_cv_objext conftest.$ac_ext
>  fi
> @@ -3078,7 +3086,7 @@ OBJEXT=3D$ac_cv_objext
>  ac_objext=3D$OBJEXT
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using t=
he GNU C compiler" >&5
>  $as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
> -if test "${ac_cv_c_compiler_gnu+set}" =3D set; then :
> +if ${ac_cv_c_compiler_gnu+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> @@ -3115,7 +3123,7 @@ ac_test_CFLAGS=3D${CFLAGS+set}
>  ac_save_CFLAGS=3D$CFLAGS
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g=
" >&5
>  $as_echo_n "checking whether $CC accepts -g... " >&6; }
> -if test "${ac_cv_prog_cc_g+set}" =3D set; then :
> +if ${ac_cv_prog_cc_g+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_save_c_werror_flag=3D$ac_c_werror_flag
> @@ -3193,7 +3201,7 @@ else
>  fi
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to acce=
pt ISO C89" >&5
>  $as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
> -if test "${ac_cv_prog_cc_c89+set}" =3D set; then :
> +if ${ac_cv_prog_cc_c89+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_cv_prog_cc_c89=3Dno
> @@ -3301,7 +3309,7 @@ if test -n "$CPP" && test -d "$CPP"; then
>    CPP=3D
>  fi
>  if test -z "$CPP"; then
> -  if test "${ac_cv_prog_CPP+set}" =3D set; then :
> +  if ${ac_cv_prog_CPP+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>        # Double quotes because CPP needs to be expanded
> @@ -3417,7 +3425,7 @@ else
>    { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
>  $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
>  as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
> -See \`config.log' for more details" "$LINENO" 5 ; }
> +See \`config.log' for more details" "$LINENO" 5; }
>  fi
> =

>  ac_ext=3Dc
> @@ -3429,7 +3437,7 @@ ac_compiler_gnu=3D$ac_cv_c_compiler_gnu
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles =
long lines and -e" >&5
>  $as_echo_n "checking for grep that handles long lines and -e... " >&6; }
> -if test "${ac_cv_path_GREP+set}" =3D set; then :
> +if ${ac_cv_path_GREP+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -z "$GREP"; then
> @@ -3492,7 +3500,7 @@ $as_echo "$ac_cv_path_GREP" >&6; }
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
>  $as_echo_n "checking for egrep... " >&6; }
> -if test "${ac_cv_path_EGREP+set}" =3D set; then :
> +if ${ac_cv_path_EGREP+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
> @@ -3559,7 +3567,7 @@ $as_echo "$ac_cv_path_EGREP" >&6; }
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header file=
s" >&5
>  $as_echo_n "checking for ANSI C header files... " >&6; }
> -if test "${ac_cv_header_stdc+set}" =3D set; then :
> +if ${ac_cv_header_stdc+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> @@ -3688,7 +3696,7 @@ done
> =

> =

>    ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_=
minix_config_h" "$ac_includes_default"
> -if test "x$ac_cv_header_minix_config_h" =3D x""yes; then :
> +if test "x$ac_cv_header_minix_config_h" =3D xyes; then :
>    MINIX=3Dyes
>  else
>    MINIX=3D
> @@ -3710,7 +3718,7 @@ $as_echo "#define _MINIX 1" >>confdefs.h
> =

>    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe t=
o define __EXTENSIONS__" >&5
>  $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&=
6; }
> -if test "${ac_cv_safe_to_define___extensions__+set}" =3D set; then :
> +if ${ac_cv_safe_to_define___extensions__+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> @@ -3753,7 +3761,7 @@ $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&=
1 ||
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
>  $as_echo_n "checking build system type... " >&6; }
> -if test "${ac_cv_build+set}" =3D set; then :
> +if ${ac_cv_build+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_build_alias=3D$build_alias
> @@ -3769,7 +3777,7 @@ fi
>  $as_echo "$ac_cv_build" >&6; }
>  case $ac_cv_build in
>  *-*-*) ;;
> -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5 ;;
> +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
>  esac
>  build=3D$ac_cv_build
>  ac_save_IFS=3D$IFS; IFS=3D'-'
> @@ -3787,7 +3795,7 @@ case $build_os in *\ *) build_os=3D`echo "$build_os=
" | sed 's/ /-/g'`;; esac
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
>  $as_echo_n "checking host system type... " >&6; }
> -if test "${ac_cv_host+set}" =3D set; then :
> +if ${ac_cv_host+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test "x$host_alias" =3D x; then
> @@ -3802,7 +3810,7 @@ fi
>  $as_echo "$ac_cv_host" >&6; }
>  case $ac_cv_host in
>  *-*-*) ;;
> -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5 ;;
> +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
>  esac
>  host=3D$ac_cv_host
>  ac_save_IFS=3D$IFS; IFS=3D'-'
> @@ -4196,7 +4204,7 @@ LDFLAGS=3D"$PREPEND_LDFLAGS $LDFLAGS $APPEND_LDFLAG=
S"
>  # Checks for programs.
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does no=
t truncate output" >&5
>  $as_echo_n "checking for a sed that does not truncate output... " >&6; }
> -if test "${ac_cv_path_SED+set}" =3D set; then :
> +if ${ac_cv_path_SED+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>              ac_script=3Ds/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbb=
bbbbbbbbbbbbbbbbbbbbbbb/
> @@ -4273,7 +4281,7 @@ if test -n "$ac_tool_prefix"; then
>  set dummy ${ac_tool_prefix}gcc; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_CC+set}" =3D set; then :
> +if ${ac_cv_prog_CC+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$CC"; then
> @@ -4313,7 +4321,7 @@ if test -z "$ac_cv_prog_CC"; then
>  set dummy gcc; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_ac_ct_CC+set}" =3D set; then :
> +if ${ac_cv_prog_ac_ct_CC+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$ac_ct_CC"; then
> @@ -4366,7 +4374,7 @@ if test -z "$CC"; then
>  set dummy ${ac_tool_prefix}cc; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_CC+set}" =3D set; then :
> +if ${ac_cv_prog_CC+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$CC"; then
> @@ -4406,7 +4414,7 @@ if test -z "$CC"; then
>  set dummy cc; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_CC+set}" =3D set; then :
> +if ${ac_cv_prog_CC+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$CC"; then
> @@ -4465,7 +4473,7 @@ if test -z "$CC"; then
>  set dummy $ac_tool_prefix$ac_prog; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_CC+set}" =3D set; then :
> +if ${ac_cv_prog_CC+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$CC"; then
> @@ -4509,7 +4517,7 @@ do
>  set dummy $ac_prog; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_ac_ct_CC+set}" =3D set; then :
> +if ${ac_cv_prog_ac_ct_CC+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$ac_ct_CC"; then
> @@ -4564,7 +4572,7 @@ fi
>  test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`=
$ac_pwd':" >&5
>  $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
>  as_fn_error $? "no acceptable C compiler found in \$PATH
> -See \`config.log' for more details" "$LINENO" 5 ; }
> +See \`config.log' for more details" "$LINENO" 5; }
> =

>  # Provide some information about the compiler.
>  $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" =
>&5
> @@ -4593,7 +4601,7 @@ done
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using t=
he GNU C compiler" >&5
>  $as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
> -if test "${ac_cv_c_compiler_gnu+set}" =3D set; then :
> +if ${ac_cv_c_compiler_gnu+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> @@ -4630,7 +4638,7 @@ ac_test_CFLAGS=3D${CFLAGS+set}
>  ac_save_CFLAGS=3D$CFLAGS
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g=
" >&5
>  $as_echo_n "checking whether $CC accepts -g... " >&6; }
> -if test "${ac_cv_prog_cc_g+set}" =3D set; then :
> +if ${ac_cv_prog_cc_g+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_save_c_werror_flag=3D$ac_c_werror_flag
> @@ -4708,7 +4716,7 @@ else
>  fi
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to acce=
pt ISO C89" >&5
>  $as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
> -if test "${ac_cv_prog_cc_c89+set}" =3D set; then :
> +if ${ac_cv_prog_cc_c89+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_cv_prog_cc_c89=3Dno
> @@ -4818,7 +4826,7 @@ fi
>  $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
>  set x ${MAKE-make}
>  ac_make=3D`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
> -if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" =3D set; then :
> +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    cat >conftest.make <<\_ACEOF
> @@ -4862,7 +4870,7 @@ fi
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible i=
nstall" >&5
>  $as_echo_n "checking for a BSD-compatible install... " >&6; }
>  if test -z "$INSTALL"; then
> -if test "${ac_cv_path_install+set}" =3D set; then :
> +if ${ac_cv_path_install+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    as_save_IFS=3D$IFS; IFS=3D$PATH_SEPARATOR
> @@ -4942,7 +4950,7 @@ test -z "$INSTALL_DATA" && INSTALL_DATA=3D'${INSTAL=
L} -m 644'
>  set dummy perl; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_path_PERL+set}" =3D set; then :
> +if ${ac_cv_path_PERL+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    case $PERL in
> @@ -4989,7 +4997,7 @@ if test "x$xapi" =3D "xy"; then :
>  set dummy curl-config; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_path_CURL+set}" =3D set; then :
> +if ${ac_cv_path_CURL+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    case $CURL in
> @@ -5034,7 +5042,7 @@ fi
>  set dummy xml2-config; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_path_XML+set}" =3D set; then :
> +if ${ac_cv_path_XML+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    case $XML in
> @@ -5085,7 +5093,7 @@ if test "x$ocamltools" =3D "xy"; then :
>  set dummy ${ac_tool_prefix}ocamlc; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_OCAMLC+set}" =3D set; then :
> +if ${ac_cv_prog_OCAMLC+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$OCAMLC"; then
> @@ -5125,7 +5133,7 @@ if test -z "$ac_cv_prog_OCAMLC"; then
>  set dummy ocamlc; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_ac_ct_OCAMLC+set}" =3D set; then :
> +if ${ac_cv_prog_ac_ct_OCAMLC+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$ac_ct_OCAMLC"; then
> @@ -5196,7 +5204,7 @@ $as_echo "OCaml library path is $OCAMLLIB" >&6; }
>  set dummy ${ac_tool_prefix}ocamlopt; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_OCAMLOPT+set}" =3D set; then :
> +if ${ac_cv_prog_OCAMLOPT+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$OCAMLOPT"; then
> @@ -5236,7 +5244,7 @@ if test -z "$ac_cv_prog_OCAMLOPT"; then
>  set dummy ocamlopt; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_ac_ct_OCAMLOPT+set}" =3D set; then :
> +if ${ac_cv_prog_ac_ct_OCAMLOPT+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$ac_ct_OCAMLOPT"; then
> @@ -5306,7 +5314,7 @@ $as_echo "versions differs from ocamlc; ocamlopt di=
scarded." >&6; }
>  set dummy ${ac_tool_prefix}ocamlc.opt; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_OCAMLCDOTOPT+set}" =3D set; then :
> +if ${ac_cv_prog_OCAMLCDOTOPT+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$OCAMLCDOTOPT"; then
> @@ -5346,7 +5354,7 @@ if test -z "$ac_cv_prog_OCAMLCDOTOPT"; then
>  set dummy ocamlc.opt; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_ac_ct_OCAMLCDOTOPT+set}" =3D set; then :
> +if ${ac_cv_prog_ac_ct_OCAMLCDOTOPT+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$ac_ct_OCAMLCDOTOPT"; then
> @@ -5410,7 +5418,7 @@ $as_echo "versions differs from ocamlc; ocamlc.opt =
discarded." >&6; }
>  set dummy ${ac_tool_prefix}ocamlopt.opt; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_OCAMLOPTDOTOPT+set}" =3D set; then :
> +if ${ac_cv_prog_OCAMLOPTDOTOPT+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$OCAMLOPTDOTOPT"; then
> @@ -5450,7 +5458,7 @@ if test -z "$ac_cv_prog_OCAMLOPTDOTOPT"; then
>  set dummy ocamlopt.opt; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_ac_ct_OCAMLOPTDOTOPT+set}" =3D set; then :
> +if ${ac_cv_prog_ac_ct_OCAMLOPTDOTOPT+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$ac_ct_OCAMLOPTDOTOPT"; then
> @@ -5519,7 +5527,7 @@ $as_echo "version differs from ocamlc; ocamlopt.opt=
 discarded." >&6; }
>  set dummy ${ac_tool_prefix}ocaml; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_OCAML+set}" =3D set; then :
> +if ${ac_cv_prog_OCAML+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$OCAML"; then
> @@ -5559,7 +5567,7 @@ if test -z "$ac_cv_prog_OCAML"; then
>  set dummy ocaml; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_ac_ct_OCAML+set}" =3D set; then :
> +if ${ac_cv_prog_ac_ct_OCAML+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$ac_ct_OCAML"; then
> @@ -5613,7 +5621,7 @@ fi
>  set dummy ${ac_tool_prefix}ocamldep; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_OCAMLDEP+set}" =3D set; then :
> +if ${ac_cv_prog_OCAMLDEP+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$OCAMLDEP"; then
> @@ -5653,7 +5661,7 @@ if test -z "$ac_cv_prog_OCAMLDEP"; then
>  set dummy ocamldep; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_ac_ct_OCAMLDEP+set}" =3D set; then :
> +if ${ac_cv_prog_ac_ct_OCAMLDEP+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$ac_ct_OCAMLDEP"; then
> @@ -5707,7 +5715,7 @@ fi
>  set dummy ${ac_tool_prefix}ocamlmktop; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_OCAMLMKTOP+set}" =3D set; then :
> +if ${ac_cv_prog_OCAMLMKTOP+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$OCAMLMKTOP"; then
> @@ -5747,7 +5755,7 @@ if test -z "$ac_cv_prog_OCAMLMKTOP"; then
>  set dummy ocamlmktop; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_ac_ct_OCAMLMKTOP+set}" =3D set; then :
> +if ${ac_cv_prog_ac_ct_OCAMLMKTOP+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$ac_ct_OCAMLMKTOP"; then
> @@ -5801,7 +5809,7 @@ fi
>  set dummy ${ac_tool_prefix}ocamlmklib; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_OCAMLMKLIB+set}" =3D set; then :
> +if ${ac_cv_prog_OCAMLMKLIB+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$OCAMLMKLIB"; then
> @@ -5841,7 +5849,7 @@ if test -z "$ac_cv_prog_OCAMLMKLIB"; then
>  set dummy ocamlmklib; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_ac_ct_OCAMLMKLIB+set}" =3D set; then :
> +if ${ac_cv_prog_ac_ct_OCAMLMKLIB+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$ac_ct_OCAMLMKLIB"; then
> @@ -5895,7 +5903,7 @@ fi
>  set dummy ${ac_tool_prefix}ocamldoc; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_OCAMLDOC+set}" =3D set; then :
> +if ${ac_cv_prog_OCAMLDOC+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$OCAMLDOC"; then
> @@ -5935,7 +5943,7 @@ if test -z "$ac_cv_prog_OCAMLDOC"; then
>  set dummy ocamldoc; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_ac_ct_OCAMLDOC+set}" =3D set; then :
> +if ${ac_cv_prog_ac_ct_OCAMLDOC+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$ac_ct_OCAMLDOC"; then
> @@ -5989,7 +5997,7 @@ fi
>  set dummy ${ac_tool_prefix}ocamlbuild; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_OCAMLBUILD+set}" =3D set; then :
> +if ${ac_cv_prog_OCAMLBUILD+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$OCAMLBUILD"; then
> @@ -6029,7 +6037,7 @@ if test -z "$ac_cv_prog_OCAMLBUILD"; then
>  set dummy ocamlbuild; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_prog_ac_ct_OCAMLBUILD+set}" =3D set; then :
> +if ${ac_cv_prog_ac_ct_OCAMLBUILD+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test -n "$ac_ct_OCAMLBUILD"; then
> @@ -6092,7 +6100,7 @@ fi
>  set dummy bash; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_path_BASH+set}" =3D set; then :
> +if ${ac_cv_path_BASH+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    case $BASH in
> @@ -6149,7 +6157,7 @@ fi
>  set dummy $PYTHON; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_path_PYTHONPATH+set}" =3D set; then :
> +if ${ac_cv_path_PYTHONPATH+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    case $PYTHONPATH in
> @@ -6225,7 +6233,7 @@ LDFLAGS=3D"$LDFLAGS `$PYTHON -c 'import distutils.s=
ysconfig; \
>      print distutils.sysconfig.get_config_var("LDFLAGS")'`"
> =

>  ac_fn_c_check_header_mongrel "$LINENO" "Python.h" "ac_cv_header_Python_h=
" "$ac_includes_default"
> -if test "x$ac_cv_header_Python_h" =3D x""yes; then :
> +if test "x$ac_cv_header_Python_h" =3D xyes; then :
> =

>  else
>    as_fn_error $? "Unable to find Python development headers" "$LINENO" 5
> @@ -6235,7 +6243,7 @@ fi
>  as_ac_Lib=3D`$as_echo "ac_cv_lib_python$ac_python_version''_PyArg_ParseT=
uple" | $as_tr_sh`
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PyArg_ParseTuple i=
n -lpython$ac_python_version" >&5
>  $as_echo_n "checking for PyArg_ParseTuple in -lpython$ac_python_version.=
.. " >&6; }
> -if eval "test \"\${$as_ac_Lib+set}\"" =3D set; then :
> +if eval \${$as_ac_Lib+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_check_lib_save_LIBS=3D$LIBS
> @@ -6290,7 +6298,7 @@ fi
>  set dummy xgettext; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_path_XGETTEXT+set}" =3D set; then :
> +if ${ac_cv_path_XGETTEXT+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    case $XGETTEXT in
> @@ -6335,7 +6343,7 @@ fi
>  set dummy as86; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_path_AS86+set}" =3D set; then :
> +if ${ac_cv_path_AS86+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    case $AS86 in
> @@ -6380,7 +6388,7 @@ fi
>  set dummy ld86; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_path_LD86+set}" =3D set; then :
> +if ${ac_cv_path_LD86+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    case $LD86 in
> @@ -6425,7 +6433,7 @@ fi
>  set dummy bcc; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_path_BCC+set}" =3D set; then :
> +if ${ac_cv_path_BCC+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    case $BCC in
> @@ -6470,7 +6478,7 @@ fi
>  set dummy iasl; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_path_IASL+set}" =3D set; then :
> +if ${ac_cv_path_IASL+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    case $IASL in
> @@ -6511,13 +6519,58 @@ if test x"${IASL}" =3D=3D x"no"
>  then
>      as_fn_error $? "Unable to find iasl, please install iasl" "$LINENO" 5
>  fi
> +# Extract the first word of "flex", so it can be a program name with arg=
s.
> +set dummy flex; ac_word=3D$2
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
> +$as_echo_n "checking for $ac_word... " >&6; }
> +if ${ac_cv_path_FLEX+:} false; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  case $FLEX in
> +  [\\/]* | ?:[\\/]*)
> +  ac_cv_path_FLEX=3D"$FLEX" # Let the user override the test with a path.
> +  ;;
> +  *)
> +  as_save_IFS=3D$IFS; IFS=3D$PATH_SEPARATOR
> +for as_dir in $PATH
> +do
> +  IFS=3D$as_save_IFS
> +  test -z "$as_dir" && as_dir=3D.
> +    for ac_exec_ext in '' $ac_executable_extensions; do
> +  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac=
_word$ac_exec_ext"; }; then
> +    ac_cv_path_FLEX=3D"$as_dir/$ac_word$ac_exec_ext"
> +    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exe=
c_ext" >&5
> +    break 2
> +  fi
> +done
> +  done
> +IFS=3D$as_save_IFS
> +
> +  test -z "$ac_cv_path_FLEX" && ac_cv_path_FLEX=3D"no"
> +  ;;
> +esac
> +fi
> +FLEX=3D$ac_cv_path_FLEX
> +if test -n "$FLEX"; then
> +  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FLEX" >&5
> +$as_echo "$FLEX" >&6; }
> +else
> +  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> +$as_echo "no" >&6; }
> +fi
> +
> +
> +if test x"${FLEX}" =3D=3D x"no"
> +then
> +    as_fn_error $? "Unable to find flex, please install flex" "$LINENO" 5
> +fi
> =

>  ac_fn_c_check_header_mongrel "$LINENO" "uuid/uuid.h" "ac_cv_header_uuid_=
uuid_h" "$ac_includes_default"
> -if test "x$ac_cv_header_uuid_uuid_h" =3D x""yes; then :
> +if test "x$ac_cv_header_uuid_uuid_h" =3D xyes; then :
> =

>      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uuid_clear in =
-luuid" >&5
>  $as_echo_n "checking for uuid_clear in -luuid... " >&6; }
> -if test "${ac_cv_lib_uuid_uuid_clear+set}" =3D set; then :
> +if ${ac_cv_lib_uuid_uuid_clear+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_check_lib_save_LIBS=3D$LIBS
> @@ -6551,7 +6604,7 @@ LIBS=3D$ac_check_lib_save_LIBS
>  fi
>  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_uuid_uuid_cl=
ear" >&5
>  $as_echo "$ac_cv_lib_uuid_uuid_clear" >&6; }
> -if test "x$ac_cv_lib_uuid_uuid_clear" =3D x""yes; then :
> +if test "x$ac_cv_lib_uuid_uuid_clear" =3D xyes; then :
>    libuuid=3D"y"
>  fi
> =

> @@ -6560,7 +6613,7 @@ fi
> =

> =

>  ac_fn_c_check_header_mongrel "$LINENO" "uuid.h" "ac_cv_header_uuid_h" "$=
ac_includes_default"
> -if test "x$ac_cv_header_uuid_h" =3D x""yes; then :
> +if test "x$ac_cv_header_uuid_h" =3D xyes; then :
>    libuuid=3D"y"
>  fi
> =

> @@ -6573,11 +6626,11 @@ fi
> =

> =

>  ac_fn_c_check_header_mongrel "$LINENO" "curses.h" "ac_cv_header_curses_h=
" "$ac_includes_default"
> -if test "x$ac_cv_header_curses_h" =3D x""yes; then :
> +if test "x$ac_cv_header_curses_h" =3D xyes; then :
> =

>      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clear in -lcur=
ses" >&5
>  $as_echo_n "checking for clear in -lcurses... " >&6; }
> -if test "${ac_cv_lib_curses_clear+set}" =3D set; then :
> +if ${ac_cv_lib_curses_clear+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_check_lib_save_LIBS=3D$LIBS
> @@ -6611,7 +6664,7 @@ LIBS=3D$ac_check_lib_save_LIBS
>  fi
>  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_clear=
" >&5
>  $as_echo "$ac_cv_lib_curses_clear" >&6; }
> -if test "x$ac_cv_lib_curses_clear" =3D x""yes; then :
> +if test "x$ac_cv_lib_curses_clear" =3D xyes; then :
>    curses=3D"y"
>  else
>    curses=3D"n"
> @@ -6624,11 +6677,11 @@ fi
> =

> =

>  ac_fn_c_check_header_mongrel "$LINENO" "ncurses.h" "ac_cv_header_ncurses=
_h" "$ac_includes_default"
> -if test "x$ac_cv_header_ncurses_h" =3D x""yes; then :
> +if test "x$ac_cv_header_ncurses_h" =3D xyes; then :
> =

>      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clear in -lncu=
rses" >&5
>  $as_echo_n "checking for clear in -lncurses... " >&6; }
> -if test "${ac_cv_lib_ncurses_clear+set}" =3D set; then :
> +if ${ac_cv_lib_ncurses_clear+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_check_lib_save_LIBS=3D$LIBS
> @@ -6662,7 +6715,7 @@ LIBS=3D$ac_check_lib_save_LIBS
>  fi
>  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_clea=
r" >&5
>  $as_echo "$ac_cv_lib_ncurses_clear" >&6; }
> -if test "x$ac_cv_lib_ncurses_clear" =3D x""yes; then :
> +if test "x$ac_cv_lib_ncurses_clear" =3D xyes; then :
>    ncurses=3D"y"
>  else
>    ncurses=3D"n"
> @@ -6709,7 +6762,7 @@ if test "x$ac_cv_env_PKG_CONFIG_set" !=3D "xset"; t=
hen
>  set dummy ${ac_tool_prefix}pkg-config; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_path_PKG_CONFIG+set}" =3D set; then :
> +if ${ac_cv_path_PKG_CONFIG+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    case $PKG_CONFIG in
> @@ -6752,7 +6805,7 @@ if test -z "$ac_cv_path_PKG_CONFIG"; then
>  set dummy pkg-config; ac_word=3D$2
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
>  $as_echo_n "checking for $ac_word... " >&6; }
> -if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" =3D set; then :
> +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    case $ac_pt_PKG_CONFIG in
> @@ -6897,7 +6950,7 @@ and glib_LIBS to avoid the need to call pkg-config.
>  See the pkg-config man page for more details.
> =

>  To get pkg-config, see <http://pkg-config.freedesktop.org/>.
> -See \`config.log' for more details" "$LINENO" 5 ; }
> +See \`config.log' for more details" "$LINENO" 5; }
>  else
>         glib_CFLAGS=3D$pkg_cv_glib_CFLAGS
>         glib_LIBS=3D$pkg_cv_glib_LIBS
> @@ -6933,11 +6986,11 @@ fi
> =

>  # Checks for libraries.
>  ac_fn_c_check_header_mongrel "$LINENO" "bzlib.h" "ac_cv_header_bzlib_h" =
"$ac_includes_default"
> -if test "x$ac_cv_header_bzlib_h" =3D x""yes; then :
> +if test "x$ac_cv_header_bzlib_h" =3D xyes; then :
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BZ2_bzDecompressIn=
it in -lbz2" >&5
>  $as_echo_n "checking for BZ2_bzDecompressInit in -lbz2... " >&6; }
> -if test "${ac_cv_lib_bz2_BZ2_bzDecompressInit+set}" =3D set; then :
> +if ${ac_cv_lib_bz2_BZ2_bzDecompressInit+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_check_lib_save_LIBS=3D$LIBS
> @@ -6971,7 +7024,7 @@ LIBS=3D$ac_check_lib_save_LIBS
>  fi
>  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bz2_BZ2_bzDe=
compressInit" >&5
>  $as_echo "$ac_cv_lib_bz2_BZ2_bzDecompressInit" >&6; }
> -if test "x$ac_cv_lib_bz2_BZ2_bzDecompressInit" =3D x""yes; then :
> +if test "x$ac_cv_lib_bz2_BZ2_bzDecompressInit" =3D xyes; then :
>    zlib=3D"$zlib -DHAVE_BZLIB -lbz2"
>  fi
> =

> @@ -6980,11 +7033,11 @@ fi
> =

> =

>  ac_fn_c_check_header_mongrel "$LINENO" "lzma.h" "ac_cv_header_lzma_h" "$=
ac_includes_default"
> -if test "x$ac_cv_header_lzma_h" =3D x""yes; then :
> +if test "x$ac_cv_header_lzma_h" =3D xyes; then :
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lzma_stream_decode=
r in -llzma" >&5
>  $as_echo_n "checking for lzma_stream_decoder in -llzma... " >&6; }
> -if test "${ac_cv_lib_lzma_lzma_stream_decoder+set}" =3D set; then :
> +if ${ac_cv_lib_lzma_lzma_stream_decoder+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_check_lib_save_LIBS=3D$LIBS
> @@ -7018,7 +7071,7 @@ LIBS=3D$ac_check_lib_save_LIBS
>  fi
>  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzma_lzma_st=
ream_decoder" >&5
>  $as_echo "$ac_cv_lib_lzma_lzma_stream_decoder" >&6; }
> -if test "x$ac_cv_lib_lzma_lzma_stream_decoder" =3D x""yes; then :
> +if test "x$ac_cv_lib_lzma_lzma_stream_decoder" =3D xyes; then :
>    zlib=3D"$zlib -DHAVE_LZMA -llzma"
>  fi
> =

> @@ -7027,11 +7080,11 @@ fi
> =

> =

>  ac_fn_c_check_header_mongrel "$LINENO" "lzo/lzo1x.h" "ac_cv_header_lzo_l=
zo1x_h" "$ac_includes_default"
> -if test "x$ac_cv_header_lzo_lzo1x_h" =3D x""yes; then :
> +if test "x$ac_cv_header_lzo_lzo1x_h" =3D xyes; then :
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lzo1x_decompress i=
n -llzo2" >&5
>  $as_echo_n "checking for lzo1x_decompress in -llzo2... " >&6; }
> -if test "${ac_cv_lib_lzo2_lzo1x_decompress+set}" =3D set; then :
> +if ${ac_cv_lib_lzo2_lzo1x_decompress+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_check_lib_save_LIBS=3D$LIBS
> @@ -7065,7 +7118,7 @@ LIBS=3D$ac_check_lib_save_LIBS
>  fi
>  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzo2_lzo1x_d=
ecompress" >&5
>  $as_echo "$ac_cv_lib_lzo2_lzo1x_decompress" >&6; }
> -if test "x$ac_cv_lib_lzo2_lzo1x_decompress" =3D x""yes; then :
> +if test "x$ac_cv_lib_lzo2_lzo1x_decompress" =3D xyes; then :
>    zlib=3D"$zlib -DHAVE_LZO1X -llzo2"
>  fi
> =

> @@ -7076,7 +7129,7 @@ fi
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for io_setup in -laio"=
 >&5
>  $as_echo_n "checking for io_setup in -laio... " >&6; }
> -if test "${ac_cv_lib_aio_io_setup+set}" =3D set; then :
> +if ${ac_cv_lib_aio_io_setup+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_check_lib_save_LIBS=3D$LIBS
> @@ -7110,7 +7163,7 @@ LIBS=3D$ac_check_lib_save_LIBS
>  fi
>  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_aio_io_setup=
" >&5
>  $as_echo "$ac_cv_lib_aio_io_setup" >&6; }
> -if test "x$ac_cv_lib_aio_io_setup" =3D x""yes; then :
> +if test "x$ac_cv_lib_aio_io_setup" =3D xyes; then :
>    system_aio=3D"y"
>  else
>    system_aio=3D"n"
> @@ -7119,7 +7172,7 @@ fi
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MD5 in -lcrypto" >=
&5
>  $as_echo_n "checking for MD5 in -lcrypto... " >&6; }
> -if test "${ac_cv_lib_crypto_MD5+set}" =3D set; then :
> +if ${ac_cv_lib_crypto_MD5+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_check_lib_save_LIBS=3D$LIBS
> @@ -7153,7 +7206,7 @@ LIBS=3D$ac_check_lib_save_LIBS
>  fi
>  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_MD5" =
>&5
>  $as_echo "$ac_cv_lib_crypto_MD5" >&6; }
> -if test "x$ac_cv_lib_crypto_MD5" =3D x""yes; then :
> +if test "x$ac_cv_lib_crypto_MD5" =3D xyes; then :
>    cat >>confdefs.h <<_ACEOF
>  #define HAVE_LIBCRYPTO 1
>  _ACEOF
> @@ -7166,7 +7219,7 @@ fi
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ext2fs_open2 in -l=
ext2fs" >&5
>  $as_echo_n "checking for ext2fs_open2 in -lext2fs... " >&6; }
> -if test "${ac_cv_lib_ext2fs_ext2fs_open2+set}" =3D set; then :
> +if ${ac_cv_lib_ext2fs_ext2fs_open2+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_check_lib_save_LIBS=3D$LIBS
> @@ -7200,7 +7253,7 @@ LIBS=3D$ac_check_lib_save_LIBS
>  fi
>  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ext2fs_ext2f=
s_open2" >&5
>  $as_echo "$ac_cv_lib_ext2fs_ext2fs_open2" >&6; }
> -if test "x$ac_cv_lib_ext2fs_ext2fs_open2" =3D x""yes; then :
> +if test "x$ac_cv_lib_ext2fs_ext2fs_open2" =3D xyes; then :
>    libext2fs=3D"y"
>  else
>    libext2fs=3D"n"
> @@ -7209,7 +7262,7 @@ fi
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcry_md_hash_buffe=
r in -lgcrypt" >&5
>  $as_echo_n "checking for gcry_md_hash_buffer in -lgcrypt... " >&6; }
> -if test "${ac_cv_lib_gcrypt_gcry_md_hash_buffer+set}" =3D set; then :
> +if ${ac_cv_lib_gcrypt_gcry_md_hash_buffer+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_check_lib_save_LIBS=3D$LIBS
> @@ -7243,7 +7296,7 @@ LIBS=3D$ac_check_lib_save_LIBS
>  fi
>  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gcrypt_gcry_=
md_hash_buffer" >&5
>  $as_echo "$ac_cv_lib_gcrypt_gcry_md_hash_buffer" >&6; }
> -if test "x$ac_cv_lib_gcrypt_gcry_md_hash_buffer" =3D x""yes; then :
> +if test "x$ac_cv_lib_gcrypt_gcry_md_hash_buffer" =3D xyes; then :
>    libgcrypt=3D"y"
>  else
>    libgcrypt=3D"n"
> @@ -7253,7 +7306,7 @@ fi
> =

>      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread flag" =
>&5
>  $as_echo_n "checking for pthread flag... " >&6; }
> -if test "${ax_cv_pthread_flags+set}" =3D set; then :
> +if ${ax_cv_pthread_flags+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
> =

> @@ -7317,7 +7370,7 @@ $as_echo "$ax_cv_pthread_flags" >&6; }
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -=
lrt" >&5
>  $as_echo_n "checking for clock_gettime in -lrt... " >&6; }
> -if test "${ac_cv_lib_rt_clock_gettime+set}" =3D set; then :
> +if ${ac_cv_lib_rt_clock_gettime+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_check_lib_save_LIBS=3D$LIBS
> @@ -7351,7 +7404,7 @@ LIBS=3D$ac_check_lib_save_LIBS
>  fi
>  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_get=
time" >&5
>  $as_echo "$ac_cv_lib_rt_clock_gettime" >&6; }
> -if test "x$ac_cv_lib_rt_clock_gettime" =3D x""yes; then :
> +if test "x$ac_cv_lib_rt_clock_gettime" =3D xyes; then :
>    cat >>confdefs.h <<_ACEOF
>  #define HAVE_LIBRT 1
>  _ACEOF
> @@ -7362,7 +7415,7 @@ fi
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for yajl_alloc in -lya=
jl" >&5
>  $as_echo_n "checking for yajl_alloc in -lyajl... " >&6; }
> -if test "${ac_cv_lib_yajl_yajl_alloc+set}" =3D set; then :
> +if ${ac_cv_lib_yajl_yajl_alloc+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_check_lib_save_LIBS=3D$LIBS
> @@ -7396,7 +7449,7 @@ LIBS=3D$ac_check_lib_save_LIBS
>  fi
>  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_yajl_yajl_al=
loc" >&5
>  $as_echo "$ac_cv_lib_yajl_yajl_alloc" >&6; }
> -if test "x$ac_cv_lib_yajl_yajl_alloc" =3D x""yes; then :
> +if test "x$ac_cv_lib_yajl_yajl_alloc" =3D xyes; then :
>    cat >>confdefs.h <<_ACEOF
>  #define HAVE_LIBYAJL 1
>  _ACEOF
> @@ -7409,7 +7462,7 @@ fi
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for deflateCopy in -lz=
" >&5
>  $as_echo_n "checking for deflateCopy in -lz... " >&6; }
> -if test "${ac_cv_lib_z_deflateCopy+set}" =3D set; then :
> +if ${ac_cv_lib_z_deflateCopy+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_check_lib_save_LIBS=3D$LIBS
> @@ -7443,7 +7496,7 @@ LIBS=3D$ac_check_lib_save_LIBS
>  fi
>  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_deflateCop=
y" >&5
>  $as_echo "$ac_cv_lib_z_deflateCopy" >&6; }
> -if test "x$ac_cv_lib_z_deflateCopy" =3D x""yes; then :
> +if test "x$ac_cv_lib_z_deflateCopy" =3D xyes; then :
>    cat >>confdefs.h <<_ACEOF
>  #define HAVE_LIBZ 1
>  _ACEOF
> @@ -7456,7 +7509,7 @@ fi
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libiconv_open in -=
liconv" >&5
>  $as_echo_n "checking for libiconv_open in -liconv... " >&6; }
> -if test "${ac_cv_lib_iconv_libiconv_open+set}" =3D set; then :
> +if ${ac_cv_lib_iconv_libiconv_open+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_check_lib_save_LIBS=3D$LIBS
> @@ -7490,7 +7543,7 @@ LIBS=3D$ac_check_lib_save_LIBS
>  fi
>  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_libico=
nv_open" >&5
>  $as_echo "$ac_cv_lib_iconv_libiconv_open" >&6; }
> -if test "x$ac_cv_lib_iconv_libiconv_open" =3D x""yes; then :
> +if test "x$ac_cv_lib_iconv_libiconv_open" =3D xyes; then :
>    libiconv=3D"y"
>  else
>    libiconv=3D"n"
> @@ -7499,11 +7552,22 @@ fi
> =

> =

>  # Checks for header files.
> +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_=
default"
> +if test "x$ac_cv_type_size_t" =3D xyes; then :
> +
> +else
> +
> +cat >>confdefs.h <<_ACEOF
> +#define size_t unsigned int
> +_ACEOF
> +
> +fi
> +
>  # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
>  # for constant arguments.  Useless!
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" =
>&5
>  $as_echo_n "checking for working alloca.h... " >&6; }
> -if test "${ac_cv_working_alloca_h+set}" =3D set; then :
> +if ${ac_cv_working_alloca_h+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> @@ -7536,7 +7600,7 @@ fi
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
>  $as_echo_n "checking for alloca... " >&6; }
> -if test "${ac_cv_func_alloca_works+set}" =3D set; then :
> +if ${ac_cv_func_alloca_works+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> @@ -7555,7 +7619,7 @@ else
>   #pragma alloca
>  #   else
>  #    ifndef alloca /* predefined by HP cc +Olibcalls */
> -char *alloca ();
> +void *alloca (size_t);
>  #    endif
>  #   endif
>  #  endif
> @@ -7599,7 +7663,7 @@ $as_echo "#define C_ALLOCA 1" >>confdefs.h
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' ne=
eds Cray hooks" >&5
>  $as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; }
> -if test "${ac_cv_os_cray+set}" =3D set; then :
> +if ${ac_cv_os_cray+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> @@ -7640,7 +7704,7 @@ fi
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C =
alloca" >&5
>  $as_echo_n "checking stack direction for C alloca... " >&6; }
> -if test "${ac_cv_c_stack_direction+set}" =3D set; then :
> +if ${ac_cv_c_stack_direction+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test "$cross_compiling" =3D yes; then :
> @@ -7711,7 +7775,7 @@ done
>  # Checks for typedefs, structures, and compiler characteristics.
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that con=
forms to C99" >&5
>  $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; }
> -if test "${ac_cv_header_stdbool_h+set}" =3D set; then :
> +if ${ac_cv_header_stdbool_h+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> @@ -7743,7 +7807,7 @@ else
>         char b[false =3D=3D 0 ? 1 : -1];
>         char c[__bool_true_false_are_defined =3D=3D 1 ? 1 : -1];
>         char d[(bool) 0.5 =3D=3D true ? 1 : -1];
> -       bool e =3D &s;
> +       /* See body of main program for 'e'.  */
>         char f[(_Bool) 0.0 =3D=3D false ? 1 : -1];
>         char g[true];
>         char h[sizeof (_Bool)];
> @@ -7754,25 +7818,6 @@ else
>         _Bool n[m];
>         char o[sizeof n =3D=3D m * sizeof n[0] ? 1 : -1];
>         char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
> -#      if defined __xlc__ || defined __GNUC__
> -        /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0
> -           reported by James Lemley on 2005-10-05; see
> -           http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00=
086.html
> -           This test is not quite right, since xlc is allowed to
> -           reject this program, as the initializer for xlcbug is
> -           not one of the forms that C requires support for.
> -           However, doing the test right would require a runtime
> -           test, and that would make cross-compilation harder.
> -           Let us hope that IBM fixes the xlc bug, and also adds
> -           support for this kind of constant expression.  In the
> -           meantime, this test will reject xlc, which is OK, since
> -           our stdbool.h substitute should suffice.  We also test
> -           this with GCC, where it should work, to detect more
> -           quickly whether someone messes up the test in the
> -           future.  */
> -        char digs[] =3D "0123456789";
> -        int xlcbug =3D 1 / (&(digs + 5)[-2 + (bool) 1] =3D=3D &digs[4] ?=
 1 : -1);
> -#      endif
>         /* Catch a bug in an HP-UX C compiler.  See
>            http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
>            http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg001=
61.html
> @@ -7784,6 +7829,7 @@ int
>  main ()
>  {
> =

> +       bool e =3D &s;
>         *pq |=3D q;
>         *pq |=3D ! q;
>         /* Refer to every declared value, to avoid compiler optimizations=
.  */
> @@ -7804,7 +7850,7 @@ fi
>  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h=
" >&5
>  $as_echo "$ac_cv_header_stdbool_h" >&6; }
>  ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_de=
fault"
> -if test "x$ac_cv_type__Bool" =3D x""yes; then :
> +if test "x$ac_cv_type__Bool" =3D xyes; then :
> =

>  cat >>confdefs.h <<_ACEOF
>  #define HAVE__BOOL 1
> @@ -7821,7 +7867,7 @@ fi
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types=
.h" >&5
>  $as_echo_n "checking for uid_t in sys/types.h... " >&6; }
> -if test "${ac_cv_type_uid_t+set}" =3D set; then :
> +if ${ac_cv_type_uid_t+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> @@ -7851,7 +7897,7 @@ fi
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
>  $as_echo_n "checking for inline... " >&6; }
> -if test "${ac_cv_c_inline+set}" =3D set; then :
> +if ${ac_cv_c_inline+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_cv_c_inline=3Dno
> @@ -7936,7 +7982,7 @@ _ACEOF
>  esac
> =

>  ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_=
default"
> -if test "x$ac_cv_type_mode_t" =3D x""yes; then :
> +if test "x$ac_cv_type_mode_t" =3D xyes; then :
> =

>  else
> =

> @@ -7947,7 +7993,7 @@ _ACEOF
>  fi
> =

>  ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_de=
fault"
> -if test "x$ac_cv_type_off_t" =3D x""yes; then :
> +if test "x$ac_cv_type_off_t" =3D xyes; then :
> =

>  else
> =

> @@ -7958,7 +8004,7 @@ _ACEOF
>  fi
> =

>  ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_de=
fault"
> -if test "x$ac_cv_type_pid_t" =3D x""yes; then :
> +if test "x$ac_cv_type_pid_t" =3D xyes; then :
> =

>  else
> =

> @@ -7970,7 +8016,7 @@ fi
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict key=
word" >&5
>  $as_echo_n "checking for C/C++ restrict keyword... " >&6; }
> -if test "${ac_cv_c_restrict+set}" =3D set; then :
> +if ${ac_cv_c_restrict+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_cv_c_restrict=3Dno
> @@ -8015,7 +8061,7 @@ _ACEOF
>   esac
> =

>  ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_=
default"
> -if test "x$ac_cv_type_size_t" =3D x""yes; then :
> +if test "x$ac_cv_type_size_t" =3D xyes; then :
> =

>  else
> =

> @@ -8026,7 +8072,7 @@ _ACEOF
>  fi
> =

>  ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_include=
s_default"
> -if test "x$ac_cv_type_ssize_t" =3D x""yes; then :
> +if test "x$ac_cv_type_ssize_t" =3D xyes; then :
> =

>  else
> =

> @@ -8037,7 +8083,7 @@ _ACEOF
>  fi
> =

>  ac_fn_c_check_member "$LINENO" "struct stat" "st_blksize" "ac_cv_member_=
struct_stat_st_blksize" "$ac_includes_default"
> -if test "x$ac_cv_member_struct_stat_st_blksize" =3D x""yes; then :
> +if test "x$ac_cv_member_struct_stat_st_blksize" =3D xyes; then :
> =

>  cat >>confdefs.h <<_ACEOF
>  #define HAVE_STRUCT_STAT_ST_BLKSIZE 1
> @@ -8047,7 +8093,7 @@ _ACEOF
>  fi
> =

>  ac_fn_c_check_member "$LINENO" "struct stat" "st_blocks" "ac_cv_member_s=
truct_stat_st_blocks" "$ac_includes_default"
> -if test "x$ac_cv_member_struct_stat_st_blocks" =3D x""yes; then :
> +if test "x$ac_cv_member_struct_stat_st_blocks" =3D xyes; then :
> =

>  cat >>confdefs.h <<_ACEOF
>  #define HAVE_STRUCT_STAT_ST_BLOCKS 1
> @@ -8067,7 +8113,7 @@ fi
> =

> =

>  ac_fn_c_check_member "$LINENO" "struct stat" "st_rdev" "ac_cv_member_str=
uct_stat_st_rdev" "$ac_includes_default"
> -if test "x$ac_cv_member_struct_stat_st_rdev" =3D x""yes; then :
> +if test "x$ac_cv_member_struct_stat_st_rdev" =3D xyes; then :
> =

>  cat >>confdefs.h <<_ACEOF
>  #define HAVE_STRUCT_STAT_ST_RDEV 1
> @@ -8131,7 +8177,7 @@ _ACEOF
>    esac
> =

>  ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_inc=
ludes_default"
> -if test "x$ac_cv_type_ptrdiff_t" =3D x""yes; then :
> +if test "x$ac_cv_type_ptrdiff_t" =3D xyes; then :
> =

>  cat >>confdefs.h <<_ACEOF
>  #define HAVE_PTRDIFF_T 1
> @@ -8144,7 +8190,7 @@ fi
>  # Checks for library functions.
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for error_at_line" >&5
>  $as_echo_n "checking for error_at_line... " >&6; }
> -if test "${ac_cv_lib_error_at_line+set}" =3D set; then :
> +if ${ac_cv_lib_error_at_line+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> @@ -8180,7 +8226,7 @@ fi
>  for ac_header in vfork.h
>  do :
>    ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h=
" "$ac_includes_default"
> -if test "x$ac_cv_header_vfork_h" =3D x""yes; then :
> +if test "x$ac_cv_header_vfork_h" =3D xyes; then :
>    cat >>confdefs.h <<_ACEOF
>  #define HAVE_VFORK_H 1
>  _ACEOF
> @@ -8204,7 +8250,7 @@ done
>  if test "x$ac_cv_func_fork" =3D xyes; then
>    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5
>  $as_echo_n "checking for working fork... " >&6; }
> -if test "${ac_cv_func_fork_works+set}" =3D set; then :
> +if ${ac_cv_func_fork_works+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test "$cross_compiling" =3D yes; then :
> @@ -8257,7 +8303,7 @@ ac_cv_func_vfork_works=3D$ac_cv_func_vfork
>  if test "x$ac_cv_func_vfork" =3D xyes; then
>    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >=
&5
>  $as_echo_n "checking for working vfork... " >&6; }
> -if test "${ac_cv_func_vfork_works+set}" =3D set; then :
> +if ${ac_cv_func_vfork_works+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test "$cross_compiling" =3D yes; then :
> @@ -8392,7 +8438,7 @@ fi
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE =
value needed for large files" >&5
>  $as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files.=
.. " >&6; }
> -if test "${ac_cv_sys_largefile_source+set}" =3D set; then :
> +if ${ac_cv_sys_largefile_source+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    while :; do
> @@ -8460,7 +8506,7 @@ fi
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctl=
y handles trailing slash" >&5
>  $as_echo_n "checking whether lstat correctly handles trailing slash... "=
 >&6; }
> -if test "${ac_cv_func_lstat_dereferences_slashed_symlink+set}" =3D set; =
then :
> +if ${ac_cv_func_lstat_dereferences_slashed_symlink+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    rm -f conftest.sym conftest.file
> @@ -8522,7 +8568,7 @@ fi
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sys/types.h de=
fines makedev" >&5
>  $as_echo_n "checking whether sys/types.h defines makedev... " >&6; }
> -if test "${ac_cv_header_sys_types_h_makedev+set}" =3D set; then :
> +if ${ac_cv_header_sys_types_h_makedev+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> @@ -8550,7 +8596,7 @@ $as_echo "$ac_cv_header_sys_types_h_makedev" >&6; }
> =

>  if test $ac_cv_header_sys_types_h_makedev =3D no; then
>  ac_fn_c_check_header_mongrel "$LINENO" "sys/mkdev.h" "ac_cv_header_sys_m=
kdev_h" "$ac_includes_default"
> -if test "x$ac_cv_header_sys_mkdev_h" =3D x""yes; then :
> +if test "x$ac_cv_header_sys_mkdev_h" =3D xyes; then :
> =

>  $as_echo "#define MAJOR_IN_MKDEV 1" >>confdefs.h
> =

> @@ -8560,7 +8606,7 @@ fi
> =

>    if test $ac_cv_header_sys_mkdev_h =3D no; then
>      ac_fn_c_check_header_mongrel "$LINENO" "sys/sysmacros.h" "ac_cv_head=
er_sys_sysmacros_h" "$ac_includes_default"
> -if test "x$ac_cv_header_sys_sysmacros_h" =3D x""yes; then :
> +if test "x$ac_cv_header_sys_sysmacros_h" =3D xyes; then :
> =

>  $as_echo "#define MAJOR_IN_SYSMACROS 1" >>confdefs.h
> =

> @@ -8573,7 +8619,7 @@ fi
>  for ac_header in stdlib.h
>  do :
>    ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib=
_h" "$ac_includes_default"
> -if test "x$ac_cv_header_stdlib_h" =3D x""yes; then :
> +if test "x$ac_cv_header_stdlib_h" =3D xyes; then :
>    cat >>confdefs.h <<_ACEOF
>  #define HAVE_STDLIB_H 1
>  _ACEOF
> @@ -8584,7 +8630,7 @@ done
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatibl=
e malloc" >&5
>  $as_echo_n "checking for GNU libc compatible malloc... " >&6; }
> -if test "${ac_cv_func_malloc_0_nonnull+set}" =3D set; then :
> +if ${ac_cv_func_malloc_0_nonnull+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test "$cross_compiling" =3D yes; then :
> @@ -8639,7 +8685,7 @@ fi
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys=
/time.h may both be included" >&5
>  $as_echo_n "checking whether time.h and sys/time.h may both be included.=
.. " >&6; }
> -if test "${ac_cv_header_time+set}" =3D set; then :
> +if ${ac_cv_header_time+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> @@ -8714,7 +8760,7 @@ done
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mktime" >&5
>  $as_echo_n "checking for working mktime... " >&6; }
> -if test "${ac_cv_func_working_mktime+set}" =3D set; then :
> +if ${ac_cv_func_working_mktime+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test "$cross_compiling" =3D yes; then :
> @@ -8943,7 +8989,7 @@ fi
>  for ac_func in getpagesize
>  do :
>    ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize"
> -if test "x$ac_cv_func_getpagesize" =3D x""yes; then :
> +if test "x$ac_cv_func_getpagesize" =3D xyes; then :
>    cat >>confdefs.h <<_ACEOF
>  #define HAVE_GETPAGESIZE 1
>  _ACEOF
> @@ -8953,7 +8999,7 @@ done
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5
>  $as_echo_n "checking for working mmap... " >&6; }
> -if test "${ac_cv_func_mmap_fixed_mapped+set}" =3D set; then :
> +if ${ac_cv_func_mmap_fixed_mapped+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test "$cross_compiling" =3D yes; then :
> @@ -9120,7 +9166,7 @@ rm -f conftest.mmap conftest.txt
>  for ac_header in stdlib.h
>  do :
>    ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib=
_h" "$ac_includes_default"
> -if test "x$ac_cv_header_stdlib_h" =3D x""yes; then :
> +if test "x$ac_cv_header_stdlib_h" =3D xyes; then :
>    cat >>confdefs.h <<_ACEOF
>  #define HAVE_STDLIB_H 1
>  _ACEOF
> @@ -9131,7 +9177,7 @@ done
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatibl=
e realloc" >&5
>  $as_echo_n "checking for GNU libc compatible realloc... " >&6; }
> -if test "${ac_cv_func_realloc_0_nonnull+set}" =3D set; then :
> +if ${ac_cv_func_realloc_0_nonnull+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test "$cross_compiling" =3D yes; then :
> @@ -9184,13 +9230,17 @@ $as_echo "#define realloc rpl_realloc" >>confdefs=
.h
>  fi
> =

> =

> -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strnlen" >=
&5
> + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strnlen" =
>&5
>  $as_echo_n "checking for working strnlen... " >&6; }
> -if test "${ac_cv_func_strnlen_working+set}" =3D set; then :
> +if ${ac_cv_func_strnlen_working+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test "$cross_compiling" =3D yes; then :
> -  ac_cv_func_strnlen_working=3Dno
> +  # Guess no on AIX systems, yes otherwise.
> +               case "$host_os" in
> +                 aix*) ac_cv_func_strnlen_working=3Dno;;
> +                 *)    ac_cv_func_strnlen_working=3Dyes;;
> +               esac
>  else
>    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
>  /* end confdefs.h.  */
> @@ -9239,7 +9289,7 @@ esac
> =

>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strtod" >&5
>  $as_echo_n "checking for working strtod... " >&6; }
> -if test "${ac_cv_func_strtod+set}" =3D set; then :
> +if ${ac_cv_func_strtod+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    if test "$cross_compiling" =3D yes; then :
> @@ -9298,14 +9348,14 @@ if test $ac_cv_func_strtod =3D no; then
>  esac
> =

>  ac_fn_c_check_func "$LINENO" "pow" "ac_cv_func_pow"
> -if test "x$ac_cv_func_pow" =3D x""yes; then :
> +if test "x$ac_cv_func_pow" =3D xyes; then :
> =

>  fi
> =

>  if test $ac_cv_func_pow =3D no; then
>    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pow in -lm" >&5
>  $as_echo_n "checking for pow in -lm... " >&6; }
> -if test "${ac_cv_lib_m_pow+set}" =3D set; then :
> +if ${ac_cv_lib_m_pow+:} false; then :
>    $as_echo_n "(cached) " >&6
>  else
>    ac_check_lib_save_LIBS=3D$LIBS
> @@ -9339,7 +9389,7 @@ LIBS=3D$ac_check_lib_save_LIBS
>  fi
>  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_pow" >&5
>  $as_echo "$ac_cv_lib_m_pow" >&6; }
> -if test "x$ac_cv_lib_m_pow" =3D x""yes; then :
> +if test "x$ac_cv_lib_m_pow" =3D xyes; then :
>    POW_LIB=3D-lm
>  else
>    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot find library =
containing definition of pow" >&5
> @@ -9435,10 +9485,21 @@ $as_echo "$as_me: WARNING: cache variable $ac_var=
 contains a newline" >&2;} ;;
>       :end' >>confcache
>  if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
>    if test -w "$cache_file"; then
> -    test "x$cache_file" !=3D "x/dev/null" &&
> +    if test "x$cache_file" !=3D "x/dev/null"; then
>        { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_fil=
e" >&5
>  $as_echo "$as_me: updating cache $cache_file" >&6;}
> -    cat confcache >$cache_file
> +      if test ! -f "$cache_file" || test -h "$cache_file"; then
> +       cat confcache >"$cache_file"
> +      else
> +        case $cache_file in #(
> +        */* | ?:*)
> +         mv -f confcache "$cache_file"$$ &&
> +         mv -f "$cache_file"$$ "$cache_file" ;; #(
> +        *)
> +         mv -f confcache "$cache_file" ;;
> +       esac
> +      fi
> +    fi
>    else
>      { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cac=
he $cache_file" >&5
>  $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
> @@ -9470,7 +9531,7 @@ LTLIBOBJS=3D$ac_ltlibobjs
> =

> =

> =

> -: ${CONFIG_STATUS=3D./config.status}
> +: "${CONFIG_STATUS=3D./config.status}"
>  ac_write_fail=3D0
>  ac_clean_files_save=3D$ac_clean_files
>  ac_clean_files=3D"$ac_clean_files $CONFIG_STATUS"
> @@ -9571,6 +9632,7 @@ fi
>  IFS=3D" ""       $as_nl"
> =

>  # Find who we are.  Look in the path if we contain no directory separato=
r.
> +as_myself=3D
>  case $0 in #((
>    *[\\/]* ) as_myself=3D$0 ;;
>    *) as_save_IFS=3D$IFS; IFS=3D$PATH_SEPARATOR
> @@ -9878,7 +9940,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=3D1
>  # values after options handling.
>  ac_log=3D"
>  This file was extended by Xen Hypervisor $as_me 4.2, which was
> -generated by GNU Autoconf 2.67.  Invocation command line was
> +generated by GNU Autoconf 2.68.  Invocation command line was
> =

>    CONFIG_FILES    =3D $CONFIG_FILES
>    CONFIG_HEADERS  =3D $CONFIG_HEADERS
> @@ -9940,7 +10002,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=3D1
>  ac_cs_config=3D"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\=
$]/\\\\&/g'`"
>  ac_cs_version=3D"\\
>  Xen Hypervisor config.status 4.2
> -configured by $0, generated by GNU Autoconf 2.67,
> +configured by $0, generated by GNU Autoconf 2.68,
>    with options \\"\$ac_cs_config\\"
> =

>  Copyright (C) 2010 Free Software Foundation, Inc.
> @@ -10064,7 +10126,7 @@ do
>      "../config/Tools.mk") CONFIG_FILES=3D"$CONFIG_FILES ../config/Tools.=
mk" ;;
>      "config.h") CONFIG_HEADERS=3D"$CONFIG_HEADERS config.h" ;;
> =

> -  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5=
 ;;
> +  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5=
;;
>    esac
>  done
> =

> @@ -10086,9 +10148,10 @@ fi
>  # after its creation but before its name has been assigned to `$tmp'.
>  $debug ||
>  {
> -  tmp=3D
> +  tmp=3D ac_tmp=3D
>    trap 'exit_status=3D$?
> -  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit=
_status
> +  : "${ac_tmp:=3D$tmp}"
> +  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
>  ' 0
>    trap 'as_fn_exit 1' 1 2 13 15
>  }
> @@ -10096,12 +10159,13 @@ $debug ||
> =

>  {
>    tmp=3D`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
> -  test -n "$tmp" && test -d "$tmp"
> +  test -d "$tmp"
>  }  ||
>  {
>    tmp=3D./conf$$-$RANDOM
>    (umask 077 && mkdir "$tmp")
>  } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO"=
 5
> +ac_tmp=3D$tmp
> =

>  # Set up the scripts for CONFIG_FILES section.
>  # No need to generate them if there are no CONFIG_FILES.
> @@ -10123,7 +10187,7 @@ else
>    ac_cs_awk_cr=3D$ac_cr
>  fi
> =

> -echo 'BEGIN {' >"$tmp/subs1.awk" &&
> +echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
>  _ACEOF
> =

> =

> @@ -10151,7 +10215,7 @@ done
>  rm -f conf$$subs.sh
> =

>  cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=3D1
> -cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
> +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
>  _ACEOF
>  sed -n '
>  h
> @@ -10199,7 +10263,7 @@ t delim
>  rm -f conf$$subs.awk
>  cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=3D1
>  _ACAWK
> -cat >>"\$tmp/subs1.awk" <<_ACAWK &&
> +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
>    for (key in S) S_is_set[key] =3D 1
>    FS =3D "=07"
> =

> @@ -10231,7 +10295,7 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1;=
 then
>    sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
>  else
>    cat
> -fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
> +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
>    || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
>  _ACEOF
> =

> @@ -10265,7 +10329,7 @@ fi # test -n "$CONFIG_FILES"
>  # No need to generate them if there are no CONFIG_HEADERS.
>  # This happens for instance with `./config.status Makefile'.
>  if test -n "$CONFIG_HEADERS"; then
> -cat >"$tmp/defines.awk" <<\_ACAWK ||
> +cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
>  BEGIN {
>  _ACEOF
> =

> @@ -10277,8 +10341,8 @@ _ACEOF
>  # handling of long lines.
>  ac_delim=3D'%!_!# '
>  for ac_last_try in false false :; do
> -  ac_t=3D`sed -n "/$ac_delim/p" confdefs.h`
> -  if test -z "$ac_t"; then
> +  ac_tt=3D`sed -n "/$ac_delim/p" confdefs.h`
> +  if test -z "$ac_tt"; then
>      break
>    elif $ac_last_try; then
>      as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
> @@ -10379,7 +10443,7 @@ do
>    esac
>    case $ac_mode$ac_tag in
>    :[FHL]*:*);;
> -  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;;
> +  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
>    :[FH]-) ac_tag=3D-:-;;
>    :[FH]*) ac_tag=3D$ac_tag:$ac_tag.in;;
>    esac
> @@ -10398,7 +10462,7 @@ do
>      for ac_f
>      do
>        case $ac_f in
> -      -) ac_f=3D"$tmp/stdin";;
> +      -) ac_f=3D"$ac_tmp/stdin";;
>        *) # Look for the file first in the build tree, then in the source=
 tree
>          # (if the path is not absolute).  The absolute path cannot be DO=
S-style,
>          # because $ac_f cannot contain `:'.
> @@ -10407,7 +10471,7 @@ do
>            [\\/$]*) false;;
>            *) test -f "$srcdir/$ac_f" && ac_f=3D"$srcdir/$ac_f";;
>            esac ||
> -          as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;;
> +          as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
>        esac
>        case $ac_f in *\'*) ac_f=3D`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\'=
'/g"`;; esac
>        as_fn_append ac_file_inputs " '$ac_f'"
> @@ -10433,8 +10497,8 @@ $as_echo "$as_me: creating $ac_file" >&6;}
>      esac
> =

>      case $ac_tag in
> -    *:-:* | *:-) cat >"$tmp/stdin" \
> -      || as_fn_error $? "could not create $ac_file" "$LINENO" 5  ;;
> +    *:-:* | *:-) cat >"$ac_tmp/stdin" \
> +      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
>      esac
>      ;;
>    esac
> @@ -10564,21 +10628,22 @@ s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
>  s&@INSTALL@&$ac_INSTALL&;t t
>  $ac_datarootdir_hack
>  "
> -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" =
>$tmp/out \
> -  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
> +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.aw=
k" \
> +  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
> =

>  test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
> -  { ac_out=3D`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"=
; } &&
> -  { ac_out=3D`sed -n '/^[         ]*datarootdir[  ]*:*=3D/p' "$tmp/out"`=
; test -z "$ac_out"; } &&
> +  { ac_out=3D`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_o=
ut"; } &&
> +  { ac_out=3D`sed -n '/^[         ]*datarootdir[  ]*:*=3D/p' \
> +      "$ac_tmp/out"`; test -z "$ac_out"; } &&
>    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a =
reference to the variable \`datarootdir'
>  which seems to be undefined.  Please make sure it is defined" >&5
>  $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable=
 \`datarootdir'
>  which seems to be undefined.  Please make sure it is defined" >&2;}
> =

> -  rm -f "$tmp/stdin"
> +  rm -f "$ac_tmp/stdin"
>    case $ac_file in
> -  -) cat "$tmp/out" && rm -f "$tmp/out";;
> -  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
> +  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
> +  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
>    esac \
>    || as_fn_error $? "could not create $ac_file" "$LINENO" 5
>   ;;
> @@ -10589,20 +10654,20 @@ which seems to be undefined.  Please make sure =
it is defined" >&2;}
>    if test x"$ac_file" !=3D x-; then
>      {
>        $as_echo "/* $configure_input  */" \
> -      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
> -    } >"$tmp/config.h" \
> +      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
> +    } >"$ac_tmp/config.h" \
>        || as_fn_error $? "could not create $ac_file" "$LINENO" 5
> -    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
> +    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
>        { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
>  $as_echo "$as_me: $ac_file is unchanged" >&6;}
>      else
>        rm -f "$ac_file"
> -      mv "$tmp/config.h" "$ac_file" \
> +      mv "$ac_tmp/config.h" "$ac_file" \
>         || as_fn_error $? "could not create $ac_file" "$LINENO" 5
>      fi
>    else
>      $as_echo "/* $configure_input  */" \
> -      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
> +      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
>        || as_fn_error $? "could not create -" "$LINENO" 5
>    fi
>   ;;
> diff --git a/tools/configure.ac b/tools/configure.ac
> index 250dffd..ddabfef 100644
> --- a/tools/configure.ac
> +++ b/tools/configure.ac
> @@ -106,6 +106,7 @@ AX_PATH_PROG_OR_FAIL([AS86], [as86])
>  AX_PATH_PROG_OR_FAIL([LD86], [ld86])
>  AX_PATH_PROG_OR_FAIL([BCC], [bcc])
>  AX_PATH_PROG_OR_FAIL([IASL], [iasl])
> +AX_PATH_PROG_OR_FAIL([FLEX], [flex])
>  AX_CHECK_UUID
>  AX_CHECK_CURSES
>  PKG_CHECK_MODULES(glib, glib-2.0)
> --
> 1.7.9.5
> =

> =

> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xen.org
> http://lists.xen.org/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

From xen-devel-bounces@lists.xen.org Mon Apr 16 17:18:34 2012
Return-path: <xen-devel-bounces@lists.xen.org>
Envelope-to: archives@lists.xen.org
Delivery-date: Mon, 16 Apr 2012 17:18:34 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xen.org>)
	id 1SJpZH-0003r1-1o; Mon, 16 Apr 2012 17:18:23 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>) id 1SJpZA-0003g5-1d
	for xen-devel@lists.xen.org; Mon, 16 Apr 2012 17:18:17 +0000
Received: from [85.158.139.83:5776] by server-7.bemta-5.messagelabs.com id
	9F/CC-16195-7545C8F4; Mon, 16 Apr 2012 17:18:15 +0000
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1334596693!23973070!1
X-Originating-IP: [62.200.22.115]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjIuMjAwLjIyLjExNSA9PiA5NDQ1MA==\n
X-StarScan-Version: 6.5.7; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14681 invoked from network); 16 Apr 2012 17:18:13 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Apr 2012 17:18:13 -0000
X-IronPort-AV: E=Sophos;i="4.75,430,1330905600"; d="scan'208";a="11961746"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Apr 2012 17:18:11 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.213.0; Mon, 16 Apr 2012 18:18:10 +0100
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1SJpZ4-0003kE-7N; Mon, 16 Apr 2012 17:18:10 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1SJpZ4-0002Dr-5h;
	Mon, 16 Apr 2012 18:18:10 +0100
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: <xen-devel@lists.xen.org>
Date: Mon, 16 Apr 2012 18:17:46 +0100
Message-ID: <1334596686-8479-5-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1334596686-8479-1-git-send-email-ian.jackson@eu.citrix.com>
References: <1334596686-8479-1-git-send-email-ian.jackson@eu.citrix.com>
MIME-Version: 1.0
Cc: Roger Pau Monne <roger.pau@entel.upc.edu>,
	Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [Xen-devel] =?utf-8?q?=5BPATCH_04/24=5D_autoconf=3A_trim_the_conf?=
	=?utf-8?q?igure_script=3B_use_autoheader?=
X-BeenThere: xen-devel@lists.xen.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xen.org>
List-Unsubscribe: <http://lists.xen.org/cgi-bin/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xen.org?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xen.org>
List-Help: <mailto:xen-devel-request@lists.xen.org?subject=help>
List-Subscribe: <http://lists.xen.org/cgi-bin/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xen.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: xen-devel-bounces@lists.xen.org
Errors-To: xen-devel-bounces@lists.xen.org

UmVtb3ZlIGEgbG90IG9mIHVubmVjZXNzYXJ5IHRlc3RzLiAgU3BlY2lmaWNhbGx5LCB3ZSBubyBs
b25nZXIgdGVzdApmb3Igc3RhbmRhcmQgUE9TSVggZmFjaWxpdGllcyB3aGljaCB3ZSBleHBlY3Qg
dG8gYmUgcHJvdmlkZWQKZXZlcnl3aGVyZSBhbmQgd2hpY2ggd2UgZG9uJ3QgaW4gYW55IGNhc2Ug
aGF2ZSBhbnkgYWx0ZXJuYXRpdmUgZm9yLgoKU3dpdGNoIHRvIGdlbmVyYXRpbmcgY29uZmlnLmgu
aW4gd2l0aCBhdXRvaGVhZGVyLgoKU2lnbmVkLW9mZi1ieTogSWFuIEphY2tzb24gPGlhbi5qYWNr
c29uQGV1LmNpdHJpeC5jb20+CkNjOiBSb2dlciBQYXUgTW9ubmUgPHJvZ2VyLnBhdUBlbnRlbC51
cGMuZWR1PgotLS0KIGF1dG9nZW4uc2ggICAgICAgICB8ICAgIDEgKwogdG9vbHMvY29uZmlnLmgu
aW4gIHwgICA3MyArLQogdG9vbHMvY29uZmlndXJlICAgIHwgODYwNCArKysrKysrKysrKysrKysr
Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB0b29scy9jb25maWd1cmUuYWMg
fCAgIDYxICstCiA0IGZpbGVzIGNoYW5nZWQsIDI4NzIgaW5zZXJ0aW9ucygrKSwgNTg2NyBkZWxl
dGlvbnMoLSkKCmRpZmYgLS1naXQgYS9hdXRvZ2VuLnNoIGIvYXV0b2dlbi5zaAppbmRleCBjMjg4
YjcxLi41OGE3MWNlIDEwMDc1NQotLS0gYS9hdXRvZ2VuLnNoCisrKyBiL2F1dG9nZW4uc2gKQEAg
LTEsMyArMSw0IEBACiAjIS9iaW4vc2ggLWUKIGNkIHRvb2xzCiBhdXRvY29uZgorYXV0b2hlYWRl
cgpkaWZmIC0tZ2l0IGEvdG9vbHMvY29uZmlnLmguaW4gYi90b29scy9jb25maWcuaC5pbgppbmRl
eCBmOGY5NmRjLi4xN2M4OTEzIDEwMDY0NAotLS0gYS90b29scy9jb25maWcuaC5pbgorKysgYi90
b29scy9jb25maWcuaC5pbgpAQCAtMSwxOSArMSw2NCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykg
MjAxMgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAqIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMi4xIG9ubHkuIHdpdGggdGhlIHNwZWNp
YWwKLSAqIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiBmaWxlIExJQ0VOU0UuCi0g
KgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0
aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIExlc3NlciBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KKy8qIGNvbmZpZy5oLmluLiAgR2Vu
ZXJhdGVkIGZyb20gY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLworCisvKiBEZWZpbmUg
dG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVm
IEhBVkVfSU5UVFlQRVNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNyeXB0
bycgbGlicmFyeSAoLWxjcnlwdG8pLiAqLworI3VuZGVmIEhBVkVfTElCQ1JZUFRPCisKKy8qIERl
ZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgeWFqbCcgbGlicmFyeSAoLWx5YWpsKS4gKi8KKyN1
bmRlZiBIQVZFX0xJQllBSkwKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB6JyBs
aWJyYXJ5ICgtbHopLiAqLworI3VuZGVmIEhBVkVfTElCWgorCisvKiBEZWZpbmUgdG8gMSBpZiB5
b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX01FTU9S
WV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBm
aWxlLiAqLworI3VuZGVmIEhBVkVfU1RESU5UX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhh
dmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAor
CisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUu
ICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUg
dGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVFJJTkdfSAorCisv
KiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAq
LworI3VuZGVmIEhBVkVfU1lTX1NUQVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0
aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19UWVBFU19I
CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxl
LiAqLworI3VuZGVmIEhBVkVfVU5JU1REX0gKIAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUg
dGhlIDx5YWpsL3lhamxfdmVyc2lvbi5oPiBoZWFkZXIgZmlsZS4gKi8KICN1bmRlZiBIQVZFX1lB
SkxfWUFKTF9WRVJTSU9OX0gKIAotLyogRGVmaW5lIGN1cnNlcyBoZWFkZXIgdG8gaW5jbHVkZS4g
Ki8KKy8qIERlZmluZSBjdXJzZXMgaGVhZGVyIHRvIHVzZSAqLwogI3VuZGVmIElOQ0xVREVfQ1VS
U0VTX0gKKworLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0
aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjdW5kZWYgUEFDS0FHRV9CVUdSRVBPUlQK
KworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVm
IFBBQ0tBR0VfTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBv
ZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9TVFJJTkcKKworLyogRGVmaW5lIHRv
IHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBB
Q0tBR0VfVEFSTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNr
YWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVVJMCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBv
ZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9WRVJTSU9OCisKKy8qIERlZmluZSB0
byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI3VuZGVmIFNURENf
SEVBREVSUwpkaWZmIC0tZ2l0IGEvdG9vbHMvY29uZmlndXJlIGIvdG9vbHMvY29uZmlndXJlCmlu
ZGV4IDg2NjE4ZjUuLjg3NjVmMjAgMTAwNzU1Ci0tLSBhL3Rvb2xzL2NvbmZpZ3VyZQorKysgYi90
b29scy9jb25maWd1cmUKQEAgLTU5NSwxMiArNTk1LDggQEAgYWNfaW5jbHVkZXNfZGVmYXVsdD0i
XAogIyBpbmNsdWRlIDx1bmlzdGQuaD4KICNlbmRpZiIKIAotYWNfaGVhZGVyX2xpc3Q9Ci1hY19m
dW5jX2xpc3Q9CiBhY19zdWJzdF92YXJzPSdMVExJQk9CSlMKLVBPV19MSUIKIExJQk9CSlMKLUFM
TE9DQQogbGliaWNvbnYKIFBUSFJFQURfTElCUwogUFRIUkVBRF9MREZMQUdTCkBAIC02MTYsNiAr
NjEyLDkgQEAgUEtHX0NPTkZJR19MSUJESVIKIFBLR19DT05GSUdfUEFUSAogUEtHX0NPTkZJRwog
Q1VSU0VTX0xJQlMKK0VHUkVQCitHUkVQCitDUFAKIFBZVEhPTlBBVEgKIE9DQU1MQlVJTEQKIE9D
QU1MRE9DCkBAIC02MzQsOCArNjMzLDEzIEBAIElOU1RBTExfREFUQQogSU5TVEFMTF9TQ1JJUFQK
IElOU1RBTExfUFJPR1JBTQogU0VUX01BS0UKLUxOX1MKLVNFRAorT0JKRVhUCitFWEVFWFQKK2Fj
X2N0X0NDCitDUFBGTEFHUworTERGTEFHUworQ0ZMQUdTCitDQwogSUFTTAogQkNDCiBMRDg2CkBA
IC02NjEsMjQgKzY2NSw2IEBAIHhlbmFwaQogdnRwbQogbW9uaXRvcnMKIGdpdGh0dHAKLWhvc3Rf
b3MKLWhvc3RfdmVuZG9yCi1ob3N0X2NwdQotaG9zdAotYnVpbGRfb3MKLWJ1aWxkX3ZlbmRvcgot
YnVpbGRfY3B1Ci1idWlsZAotRUdSRVAKLUdSRVAKLUNQUAotT0JKRVhUCi1FWEVFWFQKLWFjX2N0
X0NDCi1DUFBGTEFHUwotTERGTEFHUwotQ0ZMQUdTCi1DQwogdGFyZ2V0X2FsaWFzCiBob3N0X2Fs
aWFzCiBidWlsZF9hbGlhcwpAQCAtNzMzLDEyICs3MTksNiBAQCBlbmFibGVfZGVidWcKICAgICAg
IGFjX3ByZWNpb3VzX3ZhcnM9J2J1aWxkX2FsaWFzCiBob3N0X2FsaWFzCiB0YXJnZXRfYWxpYXMK
LUNDCi1DRkxBR1MKLUxERkxBR1MKLUxJQlMKLUNQUEZMQUdTCi1DUFAKIFBSRVBFTkRfSU5DTFVE
RVMKIFBSRVBFTkRfTElCCiBBUFBFTkRfSU5DTFVERVMKQEAgLTc1NSw2ICs3MzUsMTIgQEAgQVM4
NgogTEQ4NgogQkNDCiBJQVNMCitDQworQ0ZMQUdTCitMREZMQUdTCitMSUJTCitDUFBGTEFHUwor
Q1BQCiBQS0dfQ09ORklHCiBQS0dfQ09ORklHX1BBVEgKIFBLR19DT05GSUdfTElCRElSCkBAIC0x
MzU4LDEwICsxMzQ0LDYgQEAgRmluZSB0dW5pbmcgb2YgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rv
cmllczoKIF9BQ0VPRgogCiAgIGNhdCA8PFxfQUNFT0YKLQotU3lzdGVtIHR5cGVzOgotICAtLWJ1
aWxkPUJVSUxEICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtndWVzc2VkXQot
ICAtLWhvc3Q9SE9TVCAgICAgICBjcm9zcy1jb21waWxlIHRvIGJ1aWxkIHByb2dyYW1zIHRvIHJ1
biBvbiBIT1NUIFtCVUlMRF0KIF9BQ0VPRgogZmkKIApAQCAtMTM4OSwxNCArMTM3MSw2IEBAIE9w
dGlvbmFsIEZlYXR1cmVzOgogICAtLWRpc2FibGUtZGVidWcgICAgICAgICBEaXNhYmxlIGRlYnVn
IGJ1aWxkIG9mIHRvb2xzIChkZWZhdWx0IGlzIEVOQUJMRUQpCiAKIFNvbWUgaW5mbHVlbnRpYWwg
ZW52aXJvbm1lbnQgdmFyaWFibGVzOgotICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQK
LSAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncwotICBMREZMQUdTICAgICBsaW5rZXIgZmxh
Z3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKLSAgICAgICAg
ICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgotICBMSUJTICAgICAgICBsaWJy
YXJpZXMgdG8gcGFzcyB0byB0aGUgbGlua2VyLCBlLmcuIC1sPGxpYnJhcnk+Ci0gIENQUEZMQUdT
ICAgIChPYmplY3RpdmUpIEMvQysrIHByZXByb2Nlc3NvciBmbGFncywgZS5nLiAtSTxpbmNsdWRl
IGRpcj4gaWYKLSAgICAgICAgICAgICAgeW91IGhhdmUgaGVhZGVycyBpbiBhIG5vbnN0YW5kYXJk
IGRpcmVjdG9yeSA8aW5jbHVkZSBkaXI+Ci0gIENQUCAgICAgICAgIEMgcHJlcHJvY2Vzc29yCiAg
IFBSRVBFTkRfSU5DTFVERVMKICAgICAgICAgICAgICAgTGlzdCBvZiBpbmNsdWRlIGZvbGRlcnMg
dG8gcHJlcGVuZCB0byBDRkxBR1MgKHdpdGhvdXQgLUkpCiAgIFBSRVBFTkRfTElCIExpc3Qgb2Yg
bGlicmFyeSBmb2xkZXJzIHRvIHByZXBlbmQgdG8gTERGTEFHUyAod2l0aG91dCAtTCkKQEAgLTE0
MTUsNiArMTM4OSwxNCBAQCBTb21lIGluZmx1ZW50aWFsIGVudmlyb25tZW50IHZhcmlhYmxlczoK
ICAgTEQ4NiAgICAgICAgUGF0aCB0byBsZDg2IHRvb2wKICAgQkNDICAgICAgICAgUGF0aCB0byBi
Y2MgdG9vbAogICBJQVNMICAgICAgICBQYXRoIHRvIGlhc2wgdG9vbAorICBDQyAgICAgICAgICBD
IGNvbXBpbGVyIGNvbW1hbmQKKyAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncworICBMREZM
QUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFy
aWVzIGluIGEKKyAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgor
ICBMSUJTICAgICAgICBsaWJyYXJpZXMgdG8gcGFzcyB0byB0aGUgbGlua2VyLCBlLmcuIC1sPGxp
YnJhcnk+CisgIENQUEZMQUdTICAgIChPYmplY3RpdmUpIEMvQysrIHByZXByb2Nlc3NvciBmbGFn
cywgZS5nLiAtSTxpbmNsdWRlIGRpcj4gaWYKKyAgICAgICAgICAgICAgeW91IGhhdmUgaGVhZGVy
cyBpbiBhIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8aW5jbHVkZSBkaXI+CisgIENQUCAgICAgICAg
IEMgcHJlcHJvY2Vzc29yCiAgIFBLR19DT05GSUcgIHBhdGggdG8gcGtnLWNvbmZpZyB1dGlsaXR5
CiAgIFBLR19DT05GSUdfUEFUSAogICAgICAgICAgICAgICBkaXJlY3RvcmllcyB0byBhZGQgdG8g
cGtnLWNvbmZpZydzIHNlYXJjaCBwYXRoCkBAIC0xNzg3LDMxMSArMTc2OSw2IEBAIGZpCiAgIGFz
X2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAogCiB9ICMgYWNfZm5fY190cnlfbGluawotCi0jIGFj
X2ZuX2NfY2hlY2tfZnVuYyBMSU5FTk8gRlVOQyBWQVIKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotIyBUZXN0cyB3aGV0aGVyIEZVTkMgZXhpc3RzLCBzZXR0aW5nIHRoZSBj
YWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkKLWFjX2ZuX2NfY2hlY2tfZnVuYyAoKQotewot
ICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19z
dGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAk
Mi4uLiAiID4mNjsgfQotaWYgZXZhbCAidGVzdCBcIlwkeyQzK3NldH1cIiIgPSBzZXQ7IHRoZW4g
OgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAt
IDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0vKiBE
ZWZpbmUgJDIgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNs
YXJlcyAkMi4KLSAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBn
ZXR0aW1lb2ZkYXkuICAqLwotI2RlZmluZSAkMiBpbm5vY3VvdXNfJDIKLQotLyogU3lzdGVtIGhl
YWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVz
LAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJDIgKCk7IGJlbG93LgotICAgIFBy
ZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2lu
Y2UKLSAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMu
ICAqLwotCi0jaWZkZWYgX19TVERDX18KLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZWxzZQotIyBp
bmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCi0jdW5kZWYgJDIKLQotLyogT3ZlcnJpZGUgYW55
IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBi
ZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0
aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICov
Ci0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciAkMiAoKTsKLS8q
IFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGlt
cGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25z
IGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0
aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgX19zdHViXyQyIHx8
IGRlZmluZWQgX19zdHViX19fJDIKLWNob2tlIG1lCi0jZW5kaWYKLQotaW50Ci1tYWluICgpCi17
Ci1yZXR1cm4gJDIgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2Nf
dHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgZXZhbCAiJDM9eWVzIgotZWxzZQotICBldmFs
ICIkMz1ubyIKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0
IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWV2YWwgYWNf
cmVzPVwkJDMKLQkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiByZXN1bHQ6ICRhY19yZXMiID4mNQotJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQotICBldmFs
ICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19s
aW5lbm89OyB1bnNldCBhc19saW5lbm87fQotCi19ICMgYWNfZm5fY19jaGVja19mdW5jCi0KLSMg
YWNfZm5fY19jaGVja190eXBlIExJTkVOTyBUWVBFIFZBUiBJTkNMVURFUwotIyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRlc3RzIHdoZXRoZXIgVFlQRSBl
eGlzdHMgYWZ0ZXIgaGF2aW5nIGluY2x1ZGVkIElOQ0xVREVTLCBzZXR0aW5nIGNhY2hlCi0jIHZh
cmlhYmxlIFZBUiBhY2NvcmRpbmdseS4KLWFjX2ZuX2NfY2hlY2tfdHlwZSAoKQotewotICBhc19s
aW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0k
YXNfbGluZW5vX3N0YWNrCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogY2hlY2tpbmcgZm9yICQyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAi
ID4mNjsgfQotaWYgZXZhbCAidGVzdCBcIlwkeyQzK3NldH1cIiIgPSBzZXQ7IHRoZW4gOgotICAk
YXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBldmFsICIkMz1ubyIKLSAgY2F0IGNv
bmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmgu
ICAqLwotJDQKLWludAotbWFpbiAoKQotewotaWYgKHNpemVvZiAoJDIpKQotCSByZXR1cm4gMDsK
LSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJ
TkVOTyI7IHRoZW4gOgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNf
ZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNAotaW50Ci1tYWluICgpCi17Ci1pZiAoc2l6
ZW9mICgoJDIpKSkKLQkgICAgcmV0dXJuIDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YK
LWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLQotZWxzZQotICBldmFs
ICIkMz15ZXMiCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4
dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3Qu
JGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAg
ICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3Jl
cyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFj
azsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFz
X2xpbmVubzt9Ci0KLX0gIyBhY19mbl9jX2NoZWNrX3R5cGUKLQotIyBhY19mbl9jX2ZpbmRfaW50
WF90IExJTkVOTyBCSVRTIFZBUgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotIyBGaW5kcyBhIHNpZ25lZCBpbnRlZ2VyIHR5cGUgd2l0aCB3aWR0aCBCSVRTLCBzZXR0aW5n
IGNhY2hlIHZhcmlhYmxlIFZBUgotIyBhY2NvcmRpbmdseS4KLWFjX2ZuX2NfZmluZF9pbnRYX3Qg
KCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19s
aW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBpbnQkMl90IiA+JjUKLSRhc19lY2hvX24gImNo
ZWNraW5nIGZvciBpbnQkMl90Li4uICIgPiY2OyB9Ci1pZiBldmFsICJ0ZXN0IFwiXCR7JDMrc2V0
fVwiIiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0g
IGV2YWwgIiQzPW5vIgotICAgICAjIE9yZGVyIGlzIGltcG9ydGFudCAtIG5ldmVyIGNoZWNrIGEg
dHlwZSB0aGF0IGlzIHBvdGVudGlhbGx5IHNtYWxsZXIKLSAgICAgIyB0aGFuIGhhbGYgb2YgdGhl
IGV4cGVjdGVkIHRhcmdldCB3aWR0aC4KLSAgICAgZm9yIGFjX3R5cGUgaW4gaW50JDJfdCAnaW50
JyAnbG9uZyBpbnQnIFwKLQkgJ2xvbmcgbG9uZyBpbnQnICdzaG9ydCBpbnQnICdzaWduZWQgY2hh
cic7IGRvCi0gICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4
dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLQkgICAgIGVu
dW0geyBOID0gJDIgLyAyIC0gMSB9OwotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3Rf
YXJyYXkgWzEgLSAyICogISgwIDwgKCRhY190eXBlKSAoKCgoKCRhY190eXBlKSAxIDw8IE4pIDw8
IE4pIC0gMSkgKiAyICsgMSkpXTsKLXRlc3RfYXJyYXkgWzBdID0gMAotCi0gIDsKLSAgcmV0dXJu
IDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoK
LSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNv
bmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLQkgICAgICAgIGVudW0geyBOID0g
JDIgLyAyIC0gMSB9OwotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEg
LSAyICogISgoJGFjX3R5cGUpICgoKCgoJGFjX3R5cGUpIDEgPDwgTikgPDwgTikgLSAxKSAqIDIg
KyAxKQotCQkgPCAoJGFjX3R5cGUpICgoKCgoJGFjX3R5cGUpIDEgPDwgTikgPDwgTikgLSAxKSAq
IDIgKyAyKSldOwotdGVzdF9hcnJheSBbMF0gPSAwCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9B
Q0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotCi1lbHNlCi0g
IGNhc2UgJGFjX3R5cGUgaW4gIygKLSAgaW50JDJfdCkgOgotICAgIGV2YWwgIiQzPXllcyIgOzsg
IygKLSAgKikgOgotICAgIGV2YWwgIiQzPVwkYWNfdHlwZSIgOzsKLWVzYWMKLWZpCi1ybSAtZiBj
b3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZp
Ci1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRh
Y19leHQKLSAgICAgICBpZiBldmFsIHRlc3QgXCJ4XCQiJDMiXCIgPSB4Im5vIjsgdGhlbiA6Ci0K
LWVsc2UKLSAgYnJlYWsKLWZpCi0gICAgIGRvbmUKLWZpCi1ldmFsIGFjX3Jlcz1cJCQzCi0JICAg
ICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNf
cmVzIiA+JjUKLSRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KLSAgZXZhbCAkYXNfbGluZW5vX3N0
YWNrOyB0ZXN0ICJ4JGFzX2xpbmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQg
YXNfbGluZW5vO30KLQotfSAjIGFjX2ZuX2NfZmluZF9pbnRYX3QKLQotIyBhY19mbl9jX2NoZWNr
X21lbWJlciBMSU5FTk8gQUdHUiBNRU1CRVIgVkFSIElOQ0xVREVTCi0jIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVHJpZXMgdG8gZmluZCBp
ZiB0aGUgZmllbGQgTUVNQkVSIGV4aXN0cyBpbiB0eXBlIEFHR1IsIGFmdGVyIGluY2x1ZGluZwot
IyBJTkNMVURFUywgc2V0dGluZyBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkuCi1hY19m
bl9jX2NoZWNrX21lbWJlciAoKQotewotICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNf
bGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIHsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyLiQzIiA+JjUK
LSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4kMy4uLiAiID4mNjsgfQotaWYgZXZhbCAidGVz
dCBcIlwkeyQ0K3NldH1cIiIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAi
ID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0
Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNQotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgJDIg
YWNfYWdncjsKLWlmIChhY19hZ2dyLiQzKQotcmV0dXJuIDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19
Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgZXZh
bCAiJDQ9eWVzIgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4k
YWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kNQotaW50Ci1tYWluICgpCi17Ci1zdGF0
aWMgJDIgYWNfYWdncjsKLWlmIChzaXplb2YgYWNfYWdnci4kMykKLXJldHVybiAwOwotICA7Ci0g
IHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsg
dGhlbiA6Ci0gIGV2YWwgIiQ0PXllcyIKLWVsc2UKLSAgZXZhbCAiJDQ9bm8iCi1maQotcm0gLWYg
Y29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1m
aQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4k
YWNfZXh0Ci1maQotZXZhbCBhY19yZXM9XCQkNAotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFj
X3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9f
c3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9Ci0KLX0gIyBhY19m
bl9jX2NoZWNrX21lbWJlcgotCi0jIGFjX2ZuX2NfZmluZF91aW50WF90IExJTkVOTyBCSVRTIFZB
UgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRmluZHMgYW4gdW5z
aWduZWQgaW50ZWdlciB0eXBlIHdpdGggd2lkdGggQklUUywgc2V0dGluZyBjYWNoZSB2YXJpYWJs
ZSBWQVIKLSMgYWNjb3JkaW5nbHkuCi1hY19mbl9jX2ZpbmRfdWludFhfdCAoKQotewotICBhc19s
aW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0k
YXNfbGluZW5vX3N0YWNrCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogY2hlY2tpbmcgZm9yIHVpbnQkMl90IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciB1
aW50JDJfdC4uLiAiID4mNjsgfQotaWYgZXZhbCAidGVzdCBcIlwkeyQzK3NldH1cIiIgPSBzZXQ7
IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBldmFsICIkMz1u
byIKLSAgICAgIyBPcmRlciBpcyBpbXBvcnRhbnQgLSBuZXZlciBjaGVjayBhIHR5cGUgdGhhdCBp
cyBwb3RlbnRpYWxseSBzbWFsbGVyCi0gICAgICMgdGhhbiBoYWxmIG9mIHRoZSBleHBlY3RlZCB0
YXJnZXQgd2lkdGguCi0gICAgIGZvciBhY190eXBlIGluIHVpbnQkMl90ICd1bnNpZ25lZCBpbnQn
ICd1bnNpZ25lZCBsb25nIGludCcgXAotCSAndW5zaWduZWQgbG9uZyBsb25nIGludCcgJ3Vuc2ln
bmVkIHNob3J0IGludCcgJ3Vuc2lnbmVkIGNoYXInOyBkbwotICAgICAgIGNhdCBjb25mZGVmcy5o
IC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRh
Y19pbmNsdWRlc19kZWZhdWx0Ci1pbnQKLW1haW4gKCkKLXsKLXN0YXRpYyBpbnQgdGVzdF9hcnJh
eSBbMSAtIDIgKiAhKCgoJGFjX3R5cGUpIC0xID4+ICgkMiAvIDIgLSAxKSkgPj4gKCQyIC8gMiAt
IDEpID09IDMpXTsKLXRlc3RfYXJyYXkgWzBdID0gMAotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1f
QUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgY2FzZSAk
YWNfdHlwZSBpbiAjKAotICB1aW50JDJfdCkgOgotICAgIGV2YWwgIiQzPXllcyIgOzsgIygKLSAg
KikgOgotICAgIGV2YWwgIiQzPVwkYWNfdHlwZSIgOzsKLWVzYWMKLWZpCi1ybSAtZiBjb3JlIGNv
bmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgICAgICBp
ZiBldmFsIHRlc3QgXCJ4XCQiJDMiXCIgPSB4Im5vIjsgdGhlbiA6Ci0KLWVsc2UKLSAgYnJlYWsK
LWZpCi0gICAgIGRvbmUKLWZpCi1ldmFsIGFjX3Jlcz1cJCQzCi0JICAgICAgIHsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLSRhc19l
Y2hvICIkYWNfcmVzIiA+JjY7IH0KLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFz
X2xpbmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KLQot
fSAjIGFjX2ZuX2NfZmluZF91aW50WF90CiBjYXQgPmNvbmZpZy5sb2cgPDxfQUNFT0YKIFRoaXMg
ZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCiBy
dW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBt
aXN0YWtlLgpAQCAtMjM3NiwxMSArMjA1Myw2IEBAICRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5n
IGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQogICA+JGNhY2hlX2ZpbGUKIGZpCiAKLWFzX2ZuX2Fw
cGVuZCBhY19oZWFkZXJfbGlzdCAiIHN5cy90aW1lLmgiCi1hc19mbl9hcHBlbmQgYWNfaGVhZGVy
X2xpc3QgIiB1bmlzdGQuaCIKLWFzX2ZuX2FwcGVuZCBhY19mdW5jX2xpc3QgIiBhbGFybSIKLWFz
X2ZuX2FwcGVuZCBhY19oZWFkZXJfbGlzdCAiIHN0ZGxpYi5oIgotYXNfZm5fYXBwZW5kIGFjX2hl
YWRlcl9saXN0ICIgc3lzL3BhcmFtLmgiCiAjIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlh
YmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCiAjIHZhbHVlLgogYWNf
Y2FjaGVfY29ycnVwdGVkPWZhbHNlCkBAIC0yNDk4LDE2NjEgKzIxNzAsMzUgQEAgQVBQRU5EX0lO
Q0xVREVTIGFuZCBBUFBFTkRfTElCIGluc3RlYWQgd2hlbiBwb3NzaWJsZS4iID4mMjt9CiAKIGZp
CiAKLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1j
ICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1v
IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4k
YWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUK
LWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJz
dCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0g
bmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9
JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9y
ICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4m
NjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFz
X2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgot
ICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0Lgot
ZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBp
biAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBh
c19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNp
b25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYm
ICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAg
YWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2MiCi0gICAgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4
dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZT
Ci0KLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAg
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1
Ci0kYXNfZWNobyAiJENDIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1m
aQotCi0KLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KLSAgYWNfY3RfQ0M9
JENDCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEg
cHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLXsgJGFz
X2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3Jk
IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYg
dGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2Vj
aG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhl
bgotICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJy
aWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRP
UgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16
ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhl
Y3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQk
YWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQi
OyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgotICAgICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhl
Y19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZl
X0lGUwotCi1maQotZmkKLWFjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCi1pZiB0ZXN0IC1u
ICIkYWNfY3RfQ0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQotJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9
Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0
OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotICBpZiB0ZXN0ICJ4JGFjX2N0
X0NDIiA9IHg7IHRoZW4KLSAgICBDQz0iIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGls
aW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp
bmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdp
dGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNy
b3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xf
d2FybmVkPXllcyA7OwotZXNhYwotICAgIENDPSRhY19jdF9DQwotICBmaQotZWxzZQotICBDQz0i
JGFjX2N2X3Byb2dfQ0MiCi1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgICAgICAg
aWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAgICMgRXh0cmFjdCB0aGUgZmly
c3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1jYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0g
bmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1jYzsgYWNfd29yZD0k
MgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Ig
JGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2
OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNf
ZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0g
IGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1l
bHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGlu
ICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFz
X2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lv
bnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYg
JGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBh
Y19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWNjIgotICAgICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQi
ID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwot
Ci1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQot
JGFzX2VjaG8gIiRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp
bmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkK
LQotCi0gIGZpCi1maQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZp
cnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4K
LXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tp
bmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0
fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBp
ZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVz
ZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLWFzX3Nh
dmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRv
Ci0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAg
ICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAg
aWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94
ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGlmIHRlc3QgIiRh
c19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAg
IGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0gICAgICAgY29udGludWUKLSAgICAgZmkKLSAgICBhY19j
dl9wcm9nX0NDPSJjYyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0g
IGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotaWYgdGVzdCAkYWNfcHJvZ19y
ZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNv
IG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwot
ICBzaGlmdAotICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVy
ZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0
aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJz
dCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5h
bWUuCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkYXNfZGlyLyRhY193b3JkJHsxKycg
J30kQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIk
Q0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVz
dWx0OiAkQ0MiID4mNQotJGFzX2VjaG8gIiRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAi
bm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICBpZiB0ZXN0
IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gIGZvciBhY19wcm9nIGluIGNsLmV4ZQotICBk
bwotICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3By
b2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRh
Y190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19u
ICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJv
Z19DQytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1l
bHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExl
dCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElG
Uz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2
ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19l
eHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIk
YXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193
b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3By
ZWZpeCRhY19wcm9nIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAg
ZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUNDPSRhY19jdl9w
cm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQotJGFzX2VjaG8gIiRDQyIgPiY2OyB9
Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0
OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gICAgdGVzdCAtbiAiJEND
IiAmJiBicmVhawotICBkb25lCi1maQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICBhY19jdF9D
Qz0kQ0MKLSAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCi1kbwotICAjIEV4dHJhY3QgdGhlIGZpcnN0
IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJn
cy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9f
biAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3By
b2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAi
ID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2df
YWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1l
bHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGlu
ICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFz
X2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lv
bnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYg
JGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBh
Y19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfcHJvZyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUK
LSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkK
LWZpCi1hY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQwotaWYgdGVzdCAtbiAiJGFjX2N0X0ND
IjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJGFjX2N0X0NDIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQotZWxzZQotICB7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQot
JGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJy
ZWFrCi1kb25lCi0KLSAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCi0gICAgQ0M9IiIK
LSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXll
czopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVz
aW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNf
ZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0
aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBD
Qz0kYWNfY3RfQ0MKLSAgZmkKLWZpCi0KLWZpCi0KLQotdGVzdCAteiAiJENDIiAmJiB7IHsgJGFz
X2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6
IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFz
X2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICi1T
ZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNSA7IH0KLQotIyBQ
cm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgotJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVyc2lv
biIgPiY1Ci1zZXQgWCAkYWNfY29tcGlsZQotYWNfY29tcGlsZXI9JDIKLWZvciBhY19vcHRpb24g
aW4gLS12ZXJzaW9uIC12IC1WIC1xdmVyc2lvbjsgZG8KLSAgeyB7IGFjX3RyeT0iJGFjX2NvbXBp
bGVyICRhY19vcHRpb24gPiY1IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8
ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7
Ci1lc2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
ICRhY190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFs
ICIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiKSAyPmNvbmZ0ZXN0LmVycgotICBhY19zdGF0
dXM9JD8KLSAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLSAgICBzZWQgJzEwYVwKLS4u
LiByZXN0IG9mIHN0ZGVyciBvdXRwdXQgZGVsZXRlZCAuLi4KLSAgICAgICAgIDEwcScgY29uZnRl
c3QuZXJyID5jb25mdGVzdC5lcjEKLSAgICBjYXQgY29uZnRlc3QuZXIxID4mNQotICBmaQotICBy
bSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCi0gICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMg
PSAwOyB9Ci1kb25lCi0KLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19l
eHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICBy
ZXR1cm4gMDsKLX0KLV9BQ0VPRgotYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMK
LWFjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBi
Lm91dCIKLSMgVHJ5IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgLW8gZmlyc3QsIGRp
c3JlZ2FyZCBhLm91dC4KLSMgSXQgd2lsbCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBjb21waWxl
cnMsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KLSMgb2YgZXhlZXh0LgoteyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNv
bXBpbGVyIHdvcmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29t
cGlsZXIgd29ya3MuLi4gIiA+JjY7IH0KLWFjX2xpbmtfZGVmYXVsdD1gJGFzX2VjaG8gIiRhY19s
aW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCi0KLSMgVGhlIHBvc3NpYmxlIG91
dHB1dCBmaWxlczoKLWFjX2ZpbGVzPSJhLm91dCBjb25mdGVzdC5leGUgY29uZnRlc3QgYS5leGUg
YV9vdXQuZXhlIGIub3V0IGNvbmZ0ZXN0LioiCi0KLWFjX3JtZmlsZXM9Ci1mb3IgYWNfZmlsZSBp
biAkYWNfZmlsZXMKLWRvCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhj
b2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFw
IHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7Ci0gICAgKiApIGFjX3JtZmlsZXM9
IiRhY19ybWZpbGVzICRhY19maWxlIjs7Ci0gIGVzYWMKLWRvbmUKLXJtIC1mICRhY19ybWZpbGVz
Ci0KLWlmIHsgeyBhY190cnk9IiRhY19saW5rX2RlZmF1bHQiCi1jYXNlICIoKCRhY190cnkiIGlu
Ci0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190
cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hv
IjsgfSA+JjUKLSAgKGV2YWwgIiRhY19saW5rX2RlZmF1bHQiKSAyPiY1Ci0gIGFjX3N0YXR1cz0k
PwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3Rh
dHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6Ci0gICMgQXV0b2NvbmYt
Mi4xMyBjb3VsZCBzZXQgdGhlIGFjX2N2X2V4ZWV4dCB2YXJpYWJsZSB0byBgbm8nLgotIyBTbyBp
Z25vcmUgYSB2YWx1ZSBvZiBgbm8nLCBvdGhlcndpc2UgdGhpcyB3b3VsZCBsZWFkIHRvIGBFWEVF
WFQgPSBubycKLSMgaW4gYSBNYWtlZmlsZS4gIFdlIHNob3VsZCBub3Qgb3ZlcnJpZGUgYWNfY3Zf
ZXhlZXh0IGlmIGl0IHdhcyBjYWNoZWQsCi0jIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNob3J0LWNp
cmN1aXQgdGhpcyB0ZXN0IGZvciBjb21waWxlcnMgdW5rbm93biB0bwotIyBBdXRvY29uZi4KLWZv
ciBhY19maWxlIGluICRhY19maWxlcyAnJwotZG8KLSAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNv
bnRpbnVlCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50
ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYg
fCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApCi0JOzsKLSAgICBbYWJdLm91dCApCi0JIyBXZSBmb3Vu
ZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlzIG1vc3QKLQkjIGNlcnRh
aW5seSByaWdodC4KLQlicmVhazs7Ci0gICAgKi4qICkKLQlpZiB0ZXN0ICIke2FjX2N2X2V4ZWV4
dCtzZXR9IiA9IHNldCAmJiB0ZXN0ICIkYWNfY3ZfZXhlZXh0IiAhPSBubzsKLQl0aGVuIDo7IGVs
c2UKLQkgICBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AK
LQlmaQotCSMgV2Ugc2V0IGFjX2N2X2V4ZWV4dCBoZXJlIGJlY2F1c2UgdGhlIGxhdGVyIHRlc3Qg
Zm9yIGl0IGlzIG5vdAotCSMgc2FmZTogY3Jvc3MgY29tcGlsZXJzIG1heSBub3QgYWRkIHRoZSBz
dWZmaXggaWYgZ2l2ZW4gYW4gYC1vJwotCSMgYXJndW1lbnQsIHNvIHdlIG1heSBuZWVkIHRvIGtu
b3cgaXQgYXQgdGhhdCBwb2ludCBhbHJlYWR5LgotCSMgRXZlbiBpZiB0aGlzIHNlY3Rpb24gbG9v
a3MgY3J1ZnR5OiBpdCBoYXMgdGhlIGFkdmFudGFnZSBvZgotCSMgYWN0dWFsbHkgd29ya2luZy4K
LQlicmVhazs7Ci0gICAgKiApCi0JYnJlYWs7OwotICBlc2FjCi1kb25lCi10ZXN0ICIkYWNfY3Zf
ZXhlZXh0IiA9IG5vICYmIGFjX2N2X2V4ZWV4dD0KLQotZWxzZQotICBhY19maWxlPScnCi1maQot
aWYgdGVzdCAteiAiJGFjX2ZpbGUiOyB0aGVuIDoKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0k
YXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycg
Y29uZnRlc3QuJGFjX2V4dCA+JjUKLQoteyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBl
cnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciA3NyAiQyBjb21waWxlciBj
YW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRh
aWxzIiAiJExJTkVOTyIgNSA7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLWZp
Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBD
IGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZSIgPiY1Ci0kYXNfZWNob19uICJjaGVj
a2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUuLi4gIiA+JjY7IH0K
LXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfZmls
ZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2ZpbGUiID4mNjsgfQotYWNfZXhlZXh0PSRhY19jdl9leGVl
eHQKLQotcm0gLWYgLXIgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBjb25mdGVzdCRhY19jdl9leGVl
eHQgYi5vdXQKLWFjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCi17ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhl
Y3V0YWJsZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRh
Ymxlcy4uLiAiID4mNjsgfQotaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190
cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAq
KSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3Ry
eV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8K
LSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1
cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgotICAjIElmIGJvdGggYGNv
bmZ0ZXN0LmV4ZScgYW5kIGBjb25mdGVzdCcgYXJlIGBwcmVzZW50JyAod2VsbCwgb2JzZXJ2YWJs
ZSkKLSMgY2F0Y2ggYGNvbmZ0ZXN0LmV4ZScuICBGb3IgaW5zdGFuY2Ugd2l0aCBDeWd3aW4sIGBs
cyBjb25mdGVzdCcgd2lsbAotIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRl
c3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKLSMgYHJtJy4KLWZvciBhY19maWxlIGluIGNv
bmZ0ZXN0LmV4ZSBjb25mdGVzdCBjb25mdGVzdC4qOyBkbwotICB0ZXN0IC1mICIkYWNfZmlsZSIg
fHwgY29udGludWUKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYg
fCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAq
LmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKLSAgICAqLiogKSBhY19jdl9leGVleHQ9
YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKLQkgIGJyZWFrOzsKLSAgICAqICkg
YnJlYWs7OwotICBlc2FjCi1kb25lCi1lbHNlCi0gIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRh
c19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgJD8gImNhbm5v
dCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsK
LVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsgfQotZmkK
LXJtIC1mIGNvbmZ0ZXN0IGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAoteyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9leGVleHQiID4mNQotJGFzX2Vj
aG8gIiRhY19jdl9leGVleHQiID4mNjsgfQotCi1ybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci1FWEVF
WFQ9JGFjX2N2X2V4ZWV4dAotYWNfZXhlZXh0PSRFWEVFWFQKLWNhdCBjb25mZGVmcy5oIC0gPDxf
QUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRl
IDxzdGRpby5oPgotaW50Ci1tYWluICgpCi17Ci1GSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC5v
dXQiLCAidyIpOwotIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKLQotICA7
Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1hY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVz
IGNvbmZ0ZXN0Lm91dCIKLSMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0
YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCi0jIHRoZSBjb21waWxlciBpcyBicm9r
ZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyIgPiY1Ci0k
YXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gIiA+
JjY7IH0KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgotICB7IHsgYWNf
dHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwq
KSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNh
YwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNf
dHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFj
X2xpbmsiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0g
MDsgfQotICBpZiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19jdl9leGVleHQnCi0gIHsgeyBjYXNl
ICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190
cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89
IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNo
byAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0
YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAk
YWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgfTsgdGhlbgotICAgIGNy
b3NzX2NvbXBpbGluZz1ubwotICBlbHNlCi0gICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIg
PSBtYXliZTsgdGhlbgotCWNyb3NzX2NvbXBpbGluZz15ZXMKLSAgICBlbHNlCi0JeyB7ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIg
PiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19m
bl9lcnJvciAkPyAiY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1zLgotSWYgeW91IG1lYW50
IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuCi1TZWUgXGBjb25maWcubG9nJyBmb3Ig
bW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNSA7IH0KLSAgICBmaQotICBmaQotZmkKLXsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5n
IiA+JjUKLSRhc19lY2hvICIkY3Jvc3NfY29tcGlsaW5nIiA+JjY7IH0KLQotcm0gLWYgY29uZnRl
c3QuJGFjX2V4dCBjb25mdGVzdCRhY19jdl9leGVleHQgY29uZnRlc3Qub3V0Ci1hY19jbGVhbl9m
aWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcyIgPiY1Ci0kYXNf
ZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcy4uLiAiID4mNjsgfQot
aWYgdGVzdCAiJHthY19jdl9vYmpleHQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19u
ICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25m
dGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewot
Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qu
b2JqCi1pZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAg
KlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9l
Y2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9
ID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUK
LSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6Ci0gIGZvciBhY19maWxlIGluIGNvbmZ0
ZXN0Lm8gY29uZnRlc3Qub2JqIGNvbmZ0ZXN0Lio7IGRvCi0gIHRlc3QgLWYgIiRhY19maWxlIiB8
fCBjb250aW51ZTsKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYg
fCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAq
LmluZiB8ICouZFNZTSApIDs7Ci0gICAgKikgYWNfY3Zfb2JqZXh0PWBleHByICIkYWNfZmlsZSIg
OiAnLipcLlwoLipcKSdgCi0gICAgICAgYnJlYWs7OwotICBlc2FjCi1kb25lCi1lbHNlCi0gICRh
c19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBj
b25mdGVzdC4kYWNfZXh0ID4mNQotCi17IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVy
cm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0
ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQotU2VlIFxgY29uZmlnLmxv
ZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUgOyB9Ci1maQotcm0gLWYgY29uZnRlc3Qu
JGFjX2N2X29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9vYmpleHQiID4mNQotJGFzX2VjaG8g
IiRhY19jdl9vYmpleHQiID4mNjsgfQotT0JKRVhUPSRhY19jdl9vYmpleHQKLWFjX29iamV4dD0k
T0JKRVhUCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5n
IHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlciIgPiY1Ci0kYXNfZWNob19u
ICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gIiA+
JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfY19jb21waWxlcl9nbnUrc2V0fSIgPSBzZXQ7IHRoZW4g
OgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAt
IDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWlu
dAotbWFpbiAoKQotewotI2lmbmRlZiBfX0dOVUNfXwotICAgICAgIGNob2tlIG1lCi0jZW5kaWYK
LQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIk
TElORU5PIjsgdGhlbiA6Ci0gIGFjX2NvbXBpbGVyX2dudT15ZXMKLWVsc2UKLSAgYWNfY29tcGls
ZXJfZ251PW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4
dCBjb25mdGVzdC4kYWNfZXh0Ci1hY19jdl9jX2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251
Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDog
JGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfY19jb21waWxlcl9n
bnUiID4mNjsgfQotaWYgdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzOyB0aGVuCi0gIEdDQz15
ZXMKLWVsc2UKLSAgR0NDPQotZmkKLWFjX3Rlc3RfQ0ZMQUdTPSR7Q0ZMQUdTK3NldH0KLWFjX3Nh
dmVfQ0ZMQUdTPSRDRkxBR1MKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1Ci0kYXNfZWNob19uICJjaGVj
a2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2
X3Byb2dfY2NfZytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIg
PiY2Ci1lbHNlCi0gIGFjX3NhdmVfY193ZXJyb3JfZmxhZz0kYWNfY193ZXJyb3JfZmxhZwotICAg
YWNfY193ZXJyb3JfZmxhZz15ZXMKLSAgIGFjX2N2X3Byb2dfY2NfZz1ubwotICAgQ0ZMQUdTPSIt
ZyIKLSAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVu
ZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsK
LX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBh
Y19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIENGTEFHUz0iIgotICAgICAgY2F0IGNvbmZkZWZz
LmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwot
Ci1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19m
bl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0KLWVsc2UKLSAgYWNfY193ZXJyb3Jf
ZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCi0JIENGTEFHUz0iLWciCi0JIGNhdCBjb25mZGVm
cy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8K
LQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNf
Zm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9wcm9nX2NjX2c9eWVz
Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVz
dC4kYWNfZXh0Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4
dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3Qu
JGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZl
X2Nfd2Vycm9yX2ZsYWcKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfZyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3Byb2df
Y2NfZyIgPiY2OyB9Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENG
TEFHUz0kYWNfc2F2ZV9DRkxBR1MKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0
aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0g
IGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHll
czsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkK
LXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRD
QyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9y
ICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNf
Y3ZfcHJvZ19jY19jODkrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVk
KSAiID4mNgotZWxzZQotICBhY19jdl9wcm9nX2NjX2M4OT1ubwotYWNfc2F2ZV9DQz0kQ0MKLWNh
dCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVm
cy5oLiAgKi8KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1
ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0vKiBNb3N0IG9mIHRoZSBm
b2xsb3dpbmcgdGVzdHMgYXJlIHN0b2xlbiBmcm9tIFJDUyA1LjcncyBzcmMvY29uZi5zaC4gICov
Ci1zdHJ1Y3QgYnVmIHsgaW50IHg7IH07Ci1GSUxFICogKCpyY3NvcGVuKSAoc3RydWN0IGJ1ZiAq
LCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpOwotc3RhdGljIGNoYXIgKmUgKHAsIGkpCi0gICAgIGNoYXIg
KipwOwotICAgICBpbnQgaTsKLXsKLSAgcmV0dXJuIHBbaV07Ci19Ci1zdGF0aWMgY2hhciAqZiAo
Y2hhciAqICgqZykgKGNoYXIgKiosIGludCksIGNoYXIgKipwLCAuLi4pCi17Ci0gIGNoYXIgKnM7
Ci0gIHZhX2xpc3QgdjsKLSAgdmFfc3RhcnQgKHYscCk7Ci0gIHMgPSBnIChwLCB2YV9hcmcgKHYs
aW50KSk7Ci0gIHZhX2VuZCAodik7Ci0gIHJldHVybiBzOwotfQotCi0vKiBPU0YgNC4wIENvbXBh
cSBjYyBpcyBzb21lIHNvcnQgb2YgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdC4gIEl0IGhhcwotICAg
ZnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgc3R1ZmYsIGJ1dCBub3QgJ1x4SEgnIGhleCBjaGFyYWN0
ZXIgY29uc3RhbnRzLgotICAgVGhlc2UgZG9uJ3QgcHJvdm9rZSBhbiBlcnJvciB1bmZvcnR1bmF0
ZWx5LCBpbnN0ZWFkIGFyZSBzaWxlbnRseSB0cmVhdGVkCi0gICBhcyAneCcuICBUaGUgZm9sbG93
aW5nIGluZHVjZXMgYW4gZXJyb3IsIHVudGlsIC1zdGQgaXMgYWRkZWQgdG8gZ2V0Ci0gICBwcm9w
ZXIgQU5TSSBtb2RlLiAgQ3VyaW91c2x5ICdceDAwJyE9J3gnIGFsd2F5cyBjb21lcyBvdXQgdHJ1
ZSwgZm9yIGFuCi0gICBhcnJheSBzaXplIGF0IGxlYXN0LiAgSXQncyBuZWNlc3NhcnkgdG8gd3Jp
dGUgJ1x4MDAnPT0wIHRvIGdldCBzb21ldGhpbmcKLSAgIHRoYXQncyB0cnVlIG9ubHkgd2l0aCAt
c3RkLiAgKi8KLWludCBvc2Y0X2NjX2FycmF5IFsnXHgwMCcgPT0gMCA/IDEgOiAtMV07Ci0KLS8q
IElCTSBDIDYgZm9yIEFJWCBpcyBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LCBidXQgaXQgcmVwbGFj
ZXMgbWFjcm8gcGFyYW1ldGVycwotICAgaW5zaWRlIHN0cmluZ3MgYW5kIGNoYXJhY3RlciBjb25z
dGFudHMuICAqLwotI2RlZmluZSBGT08oeCkgJ3gnCi1pbnQgeGxjNl9jY19hcnJheVtGT08oYSkg
PT0gJ3gnID8gMSA6IC0xXTsKLQotaW50IHRlc3QgKGludCBpLCBkb3VibGUgeCk7Ci1zdHJ1Y3Qg
czEge2ludCAoKmYpIChpbnQgYSk7fTsKLXN0cnVjdCBzMiB7aW50ICgqZikgKGRvdWJsZSBhKTt9
OwotaW50IHBhaXJuYW1lcyAoaW50LCBjaGFyICoqLCBGSUxFICooKikoc3RydWN0IGJ1ZiAqLCBz
dHJ1Y3Qgc3RhdCAqLCBpbnQpLCBpbnQsIGludCk7Ci1pbnQgYXJnYzsKLWNoYXIgKiphcmd2Owot
aW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZiAoZSwgYXJndiwgMCkgIT0gYXJndlswXSAgfHwgIGYg
KGUsIGFyZ3YsIDEpICE9IGFyZ3ZbMV07Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWZv
ciBhY19hcmcgaW4gJycgLXFsYW5nbHZsPWV4dGM4OSAtcWxhbmdsdmw9YW5zaSAtc3RkIFwKLQkt
QWUgIi1BYSAtRF9IUFVYX1NPVVJDRSIgIi1YYyAtRF9fRVhURU5TSU9OU19fIgotZG8KLSAgQ0M9
IiRhY19zYXZlX0NDICRhY19hcmciCi0gIGlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8i
OyB0aGVuIDoKLSAgYWNfY3ZfcHJvZ19jY19jODk9JGFjX2FyZwotZmkKLXJtIC1mIGNvcmUgY29u
ZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4
OSIgIT0gInhubyIgJiYgYnJlYWsKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLUNDPSRh
Y19zYXZlX0NDCi0KLWZpCi0jIEFDX0NBQ0hFX1ZBTAotY2FzZSAieCRhY19jdl9wcm9nX2NjX2M4
OSIgaW4KLSAgeCkKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQotJGFzX2VjaG8gIm5vbmUgbmVlZGVkIiA+JjY7IH0g
OzsKLSAgeG5vKQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiB1bnN1cHBvcnRlZCIgPiY1Ci0kYXNfZWNobyAidW5zdXBwb3J0ZWQiID4mNjsgfSA7
OwotICAqKQotICAgIENDPSIkQ0MgJGFjX2N2X3Byb2dfY2NfYzg5IgotICAgIHsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19jODki
ID4mNQotJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2M4OSIgPiY2OyB9IDs7Ci1lc2FjCi1pZiB0
ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSB4bm87IHRoZW4gOgotCi1maQotCi1hY19leHQ9
YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRD
UFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRh
Y19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElC
UyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLQotYWNfZXh0
PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAk
Q1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3Qk
YWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJ
QlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoteyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBD
IHByZXByb2Nlc3NvciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBD
IHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1l
cyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVu
Ci0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotICBpZiB0ZXN0ICIke2FjX2N2
X3Byb2dfQ1BQK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+
JjYKLWVsc2UKLSAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBl
eHBhbmRlZAotICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3Bw
IiAiL2xpYi9jcHAiCi0gICAgZG8KLSAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKLWZvciBhY19j
X3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0
aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVz
aCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0
Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMg
ZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBy
dW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0
IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4K
LSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNv
bmZkZWZzLmguICAqLwotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vs
c2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQkJICAgICBTeW50YXggZXJyb3IKLV9B
Q0VPRgotaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Ci0KLWVsc2UKLSAgIyBC
cm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgotY29udGludWUKLWZpCi1ybSAtZiBjb25mdGVz
dC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIyBPSywgd29ya3Mgb24gc2Fu
ZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKLSAgIyBjYW4g
YmUgZGV0ZWN0ZWQgYW5kIGhvdy4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRl
c3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGFjX25vbmV4aXN0
ZW50Lmg+Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgotICAj
IEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgotY29udGludWUKLWVsc2UKLSAgIyBQ
YXNzZXMgYm90aCB0ZXN0cy4KLWFjX3ByZXByb2Nfb2s9OgotYnJlYWsKLWZpCi1ybSAtZiBjb25m
dGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLWRvbmUKLSMgQmVjYXVzZSBv
ZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVk
Lgotcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotaWYgJGFj
X3ByZXByb2Nfb2s7IHRoZW4gOgotICBicmVhawotZmkKLQotICAgIGRvbmUKLSAgICBhY19jdl9w
cm9nX0NQUD0kQ1BQCi0KLWZpCi0gIENQUD0kYWNfY3ZfcHJvZ19DUFAKLWVsc2UKLSAgYWNfY3Zf
cHJvZ19DUFA9JENQUAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogcmVzdWx0OiAkQ1BQIiA+JjUKLSRhc19lY2hvICIkQ1BQIiA+JjY7IH0KLWFjX3ByZXByb2Nf
b2s9ZmFsc2UKLWZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBV
c2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGli
YwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxp
bWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMg
PGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9u
IHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFy
c2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRv
IGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3Qu
JGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1
ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQkJICAg
ICBTeW50YXggZXJyb3IKLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhl
biA6Ci0KLWVsc2UKLSAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgotY29udGludWUK
LWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0KLSAg
IyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50
IGhlYWRlcnMKLSAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KLSAgY2F0IGNvbmZkZWZzLmgg
LSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lu
Y2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJ
TkVOTyI7IHRoZW4gOgotICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgotY29u
dGludWUKLWVsc2UKLSAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KLWFjX3ByZXByb2Nfb2s9OgotYnJl
YWsKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci0K
LWRvbmUKLSMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmlu
ZyBjb2RlIHdhcyBza2lwcGVkLgotcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRl
c3QuJGFjX2V4dAotaWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgotCi1lbHNlCi0gIHsgeyAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoi
ID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNf
Zm5fZXJyb3IgJD8gIkMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjawot
U2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUgOyB9Ci1maQot
Ci1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAk
Q0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBj
b25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFj
X2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0K
LQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Ig
Z3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUiID4mNQotJGFzX2VjaG9fbiAiY2hl
Y2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lLi4uICIgPiY2OyB9
Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfR1JFUCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19l
Y2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRHUkVQIjsgdGhlbgot
ICBhY19wYXRoX0dSRVBfZm91bmQ9ZmFsc2UKLSAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBw
YXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKLSAgYXNfc2F2ZV9JRlM9JElG
UzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRP
Ui91c3IveHBnNC9iaW4KLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2Rp
ciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfcHJvZyBpbiBncmVwIGdncmVwOyBkbwotICAgIGZv
ciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICAgICAg
YWNfcGF0aF9HUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgotICAgICAgeyB0ZXN0
IC1mICIkYWNfcGF0aF9HUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9HUkVQIjsgfSB8fCBj
b250aW51ZQotIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0
IGlzIGZvdW5kLgotICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfR1JFUAotY2FzZSBgIiRhY19w
YXRoX0dSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgotKkdOVSopCi0gIGFjX2N2X3BhdGhfR1JFUD0i
JGFjX3BhdGhfR1JFUCIgYWNfcGF0aF9HUkVQX2ZvdW5kPTo7OwotKikKLSAgYWNfY291bnQ9MAot
ICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKLSAgd2hpbGUgOgotICBkbwot
ICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCi0gICAg
bXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgotICAgIGNwICJjb25mdGVzdC5pbiIgImNv
bmZ0ZXN0Lm5sIgotICAgICRhc19lY2hvICdHUkVQJyA+PiAiY29uZnRlc3QubmwiCi0gICAgIiRh
Y19wYXRoX0dSRVAiIC1lICdHUkVQJCcgLWUgJy0oY2Fubm90IG1hdGNoKS0nIDwgImNvbmZ0ZXN0
Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKLSAgICBkaWZmICJjb25m
dGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCi0gICAgYXNf
Zm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCi0gICAgaWYgdGVzdCAk
YWNfY291bnQgLWd0ICR7YWNfcGF0aF9HUkVQX21heC0wfTsgdGhlbgotICAgICAgIyBCZXN0IG9u
ZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCi0gICAg
ICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiCi0gICAgICBhY19wYXRoX0dSRVBfbWF4
PSRhY19jb3VudAotICAgIGZpCi0gICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMg
bW9yZSB0aGFuIGVub3VnaAotICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhawotICBk
b25lCi0gIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVz
dC5vdXQ7OwotZXNhYwotCi0gICAgICAkYWNfcGF0aF9HUkVQX2ZvdW5kICYmIGJyZWFrIDMKLSAg
ICBkb25lCi0gIGRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotICBpZiB0ZXN0IC16ICIk
YWNfY3ZfcGF0aF9HUkVQIjsgdGhlbgotICAgIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxl
IGdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmlu
IiAiJExJTkVOTyIgNQotICBmaQotZWxzZQotICBhY19jdl9wYXRoX0dSRVA9JEdSRVAKLWZpCi0K
LWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFj
X2N2X3BhdGhfR1JFUCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3BhdGhfR1JFUCIgPiY2OyB9Ci0g
R1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IGNoZWNraW5nIGZvciBlZ3JlcCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2lu
ZyBmb3IgZWdyZXAuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9FR1JFUCtzZXR9
IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlm
IGVjaG8gYSB8ICRHUkVQIC1FICcoYXxiKScgPi9kZXYvbnVsbCAyPiYxCi0gICB0aGVuIGFjX2N2
X3BhdGhfRUdSRVA9IiRHUkVQIC1FIgotICAgZWxzZQotICAgICBpZiB0ZXN0IC16ICIkRUdSRVAi
OyB0aGVuCi0gIGFjX3BhdGhfRUdSRVBfZm91bmQ9ZmFsc2UKLSAgIyBMb29wIHRocm91Z2ggdGhl
IHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKLSAgYXNfc2F2
ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRI
X1NFUEFSQVRPUi91c3IveHBnNC9iaW4KLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAt
eiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfcHJvZyBpbiBlZ3JlcDsgZG8KLSAg
ICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAg
ICAgIGFjX3BhdGhfRUdSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCi0gICAgICB7
IHRlc3QgLWYgIiRhY19wYXRoX0VHUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9FR1JFUCI7
IH0gfHwgY29udGludWUKLSMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0VHUkVQIGFuZCBzZWxlY3Qg
aXQgaWYgaXQgaXMgZm91bmQuCi0gICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9FR1JFUAotY2Fz
ZSBgIiRhY19wYXRoX0VHUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KLSpHTlUqKQotICBhY19jdl9w
YXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIgYWNfcGF0aF9FR1JFUF9mb3VuZD06OzsKLSopCi0g
IGFjX2NvdW50PTAKLSAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCi0gIHdo
aWxlIDoKLSAgZG8KLSAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRl
c3QudG1wIgotICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKLSAgICBjcCAiY29u
ZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKLSAgICAkYXNfZWNobyAnRUdSRVAnID4+ICJjb25mdGVz
dC5ubCIKLSAgICAiJGFjX3BhdGhfRUdSRVAiICdFR1JFUCQnIDwgImNvbmZ0ZXN0Lm5sIiA+ImNv
bmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKLSAgICBkaWZmICJjb25mdGVzdC5vdXQi
ICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCi0gICAgYXNfZm5fYXJpdGgg
JGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCi0gICAgaWYgdGVzdCAkYWNfY291bnQg
LWd0ICR7YWNfcGF0aF9FR1JFUF9tYXgtMH07IHRoZW4KLSAgICAgICMgQmVzdCBvbmUgc28gZmFy
LCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQotICAgICAgYWNfY3Zf
cGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiCi0gICAgICBhY19wYXRoX0VHUkVQX21heD0kYWNf
Y291bnQKLSAgICBmaQotICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUg
dGhhbiBlbm91Z2gKLSAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKLSAgZG9uZQot
ICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0
OzsKLWVzYWMKLQotICAgICAgJGFjX3BhdGhfRUdSRVBfZm91bmQgJiYgYnJlYWsgMwotICAgIGRv
bmUKLSAgZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0gIGlmIHRlc3QgLXogIiRhY19j
dl9wYXRoX0VHUkVQIjsgdGhlbgotICAgIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIGVn
cmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIg
IiRMSU5FTk8iIDUKLSAgZmkKLWVsc2UKLSAgYWNfY3ZfcGF0aF9FR1JFUD0kRUdSRVAKLWZpCi0K
LSAgIGZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1
bHQ6ICRhY19jdl9wYXRoX0VHUkVQIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfcGF0aF9FR1JFUCIg
PiY2OyB9Ci0gRUdSRVA9IiRhY19jdl9wYXRoX0VHUkVQIgotCi0KLXsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMi
ID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMuLi4gIiA+
JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4gOgot
ICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8
X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVk
ZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0j
aW5jbHVkZSA8ZmxvYXQuaD4KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsK
LX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBh
Y19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1y
bSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19l
eHQKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0
Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotICBj
YXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRl
ZnMuaC4gICovCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19j
cHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgIm1lbWNociIgPi9kZXYvbnVs
bCAyPiYxOyB0aGVuIDoKLQotZWxzZQotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1m
IGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhl
bgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5
IHRvIEFOU0kuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQK
LS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotX0FDRU9GCi1p
ZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAiZnJl
ZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLQotZWxzZQotICBhY19jdl9oZWFkZXJfc3RkYz1u
bwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3Rk
YyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0
eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxp
bmciID0geWVzOyB0aGVuIDoKLSAgOgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9G
ID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8Y3R5
cGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpZiAoKCcgJyAmIDB4MEZGKSA9PSAweDAyMCkK
LSMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSMgZGVmaW5l
IFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNlbHNl
Ci0jIGRlZmluZSBJU0xPV0VSKGMpIFwKLQkJICAgKCgnYScgPD0gKGMpICYmIChjKSA8PSAnaScp
IFwKLQkJICAgICB8fCAoJ2onIDw9IChjKSAmJiAoYykgPD0gJ3InKSBcCi0JCSAgICAgfHwgKCdz
JyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCi0jIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMp
ID8gKChjKSB8IDB4NDApIDogKGMpKQotI2VuZGlmCi0KLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUp
ICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQKLW1haW4gKCkKLXsKLSAgaW50IGk7Ci0g
IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNM
T1dFUiAoaSkpCi0JfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpCi0gICAgICByZXR1cm4g
MjsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7
IHRoZW4gOgotCi1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29yZSAq
LmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQg
XAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAot
ZmkKLQotZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJl
c3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX3N0
ZGMiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLQotJGFz
X2VjaG8gIiNkZWZpbmUgU1REQ19IRUFERVJTIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi0jIE9u
IElSSVggNS4zLCBzeXMvdHlwZXMgYW5kIGludHR5cGVzLmggYXJlIGNvbmZsaWN0aW5nLgotZm9y
IGFjX2hlYWRlciBpbiBzeXMvdHlwZXMuaCBzeXMvc3RhdC5oIHN0ZGxpYi5oIHN0cmluZy5oIG1l
bW9yeS5oIHN0cmluZ3MuaCBcCi0JCSAgaW50dHlwZXMuaCBzdGRpbnQuaCB1bmlzdGQuaAotZG8g
OgotICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAk
YXNfdHJfc2hgCi1hY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICIkTElORU5PIiAiJGFjX2hl
YWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdAotIgotaWYgZXZhbCB0
ZXN0IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgotICBjYXQgPj5jb25m
ZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRh
c190cl9jcHBgIDEKLV9BQ0VPRgotCi1maQotCi1kb25lCi0KLQotCi0gIGFjX2ZuX2NfY2hlY2tf
aGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJtaW5peC9jb25maWcuaCIgImFjX2N2X2hlYWRlcl9t
aW5peF9jb25maWdfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9o
ZWFkZXJfbWluaXhfY29uZmlnX2giID0geCIieWVzOyB0aGVuIDoKLSAgTUlOSVg9eWVzCi1lbHNl
Ci0gIE1JTklYPQotZmkKLQotCi0gIGlmIHRlc3QgIiRNSU5JWCIgPSB5ZXM7IHRoZW4KLQotJGFz
X2VjaG8gIiNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxIiA+PmNvbmZkZWZzLmgKLQotCi0kYXNfZWNo
byAiI2RlZmluZSBfUE9TSVhfMV9TT1VSQ0UgMiIgPj5jb25mZGVmcy5oCi0KLQotJGFzX2VjaG8g
IiNkZWZpbmUgX01JTklYIDEiID4+Y29uZmRlZnMuaAotCi0gIGZpCi0KLQotICB7ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgaXQgaXMgc2Fm
ZSB0byBkZWZpbmUgX19FWFRFTlNJT05TX18iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hl
dGhlciBpdCBpcyBzYWZlIHRvIGRlZmluZSBfX0VYVEVOU0lPTlNfXy4uLiAiID4mNjsgfQotaWYg
dGVzdCAiJHthY19jdl9zYWZlX3RvX2RlZmluZV9fX2V4dGVuc2lvbnNfXytzZXR9IiA9IHNldDsg
dGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVm
cy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8K
LQotIwkgIGRlZmluZSBfX0VYVEVOU0lPTlNfXyAxCi0JICAkYWNfaW5jbHVkZXNfZGVmYXVsdAot
aW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5f
Y190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zYWZlX3RvX2RlZmluZV9f
X2V4dGVuc2lvbnNfXz15ZXMKLWVsc2UKLSAgYWNfY3Zfc2FmZV90b19kZWZpbmVfX19leHRlbnNp
b25zX189bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0
IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IHJlc3VsdDogJGFjX2N2X3NhZmVfdG9fZGVmaW5lX19fZXh0ZW5zaW9uc19fIiA+JjUK
LSRhc19lY2hvICIkYWNfY3Zfc2FmZV90b19kZWZpbmVfX19leHRlbnNpb25zX18iID4mNjsgfQot
ICB0ZXN0ICRhY19jdl9zYWZlX3RvX2RlZmluZV9fX2V4dGVuc2lvbnNfXyA9IHllcyAmJgotICAg
ICRhc19lY2hvICIjZGVmaW5lIF9fRVhURU5TSU9OU19fIDEiID4+Y29uZmRlZnMuaAotCi0gICRh
c19lY2hvICIjZGVmaW5lIF9BTExfU09VUkNFIDEiID4+Y29uZmRlZnMuaAotCi0gICRhc19lY2hv
ICIjZGVmaW5lIF9HTlVfU09VUkNFIDEiID4+Y29uZmRlZnMuaAotCi0gICRhc19lY2hvICIjZGVm
aW5lIF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUyAxIiA+PmNvbmZkZWZzLmgKLQotICAkYXNfZWNo
byAiI2RlZmluZSBfVEFOREVNX1NPVVJDRSAxIiA+PmNvbmZkZWZzLmgKLQotCi0jIE1ha2Ugc3Vy
ZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi0kU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIi
IHN1bjQgPi9kZXYvbnVsbCAyPiYxIHx8Ci0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgcnVuICRT
SEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAiJExJTkVOTyIgNQotCi17ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+
JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9Ci1p
ZiB0ZXN0ICIke2FjX2N2X2J1aWxkK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAi
KGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCi10ZXN0
ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKLSAgYWNfYnVpbGRfYWxpYXM9YCRTSEVMTCAiJGFj
X2F1eF9kaXIvY29uZmlnLmd1ZXNzImAKLXRlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgot
ICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNp
Znkgb25lIiAiJExJTkVOTyIgNQotYWNfY3ZfYnVpbGQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29u
ZmlnLnN1YiIgJGFjX2J1aWxkX2FsaWFzYCB8fAotICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRh
Y19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUK
LQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAk
YWNfY3ZfYnVpbGQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9idWlsZCIgPiY2OyB9Ci1jYXNlICRh
Y19jdl9idWlsZCBpbgotKi0qLSopIDs7Ci0qKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YWx1
ZSBvZiBjYW5vbmljYWwgYnVpbGQiICIkTElORU5PIiA1IDs7Ci1lc2FjCi1idWlsZD0kYWNfY3Zf
YnVpbGQKLWFjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKLXNldCB4ICRhY19jdl9idWlsZAotc2hp
ZnQKLWJ1aWxkX2NwdT0kMQotYnVpbGRfdmVuZG9yPSQyCi1zaGlmdDsgc2hpZnQKLSMgUmVtZW1i
ZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAotIyBl
eGNlcHQgd2l0aCBvbGQgc2hlbGxzOgotYnVpbGRfb3M9JCoKLUlGUz0kYWNfc2F2ZV9JRlMKLWNh
c2UgJGJ1aWxkX29zIGluICpcICopIGJ1aWxkX29zPWBlY2hvICIkYnVpbGRfb3MiIHwgc2VkICdz
LyAvLS9nJ2A7OyBlc2FjCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5n
IGhvc3Qgc3lzdGVtIHR5cGUuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfaG9zdCtzZXR9
IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlm
IHRlc3QgIngkaG9zdF9hbGlhcyIgPSB4OyB0aGVuCi0gIGFjX2N2X2hvc3Q9JGFjX2N2X2J1aWxk
Ci1lbHNlCi0gIGFjX2N2X2hvc3Q9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGhv
c3RfYWxpYXNgIHx8Ci0gICAgYXNfZm5fZXJyb3IgJD8gIiRTSEVMTCAkYWNfYXV4X2Rpci9jb25m
aWcuc3ViICRob3N0X2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKLWZpCi0KLWZpCi17ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hvc3QiID4m
NQotJGFzX2VjaG8gIiRhY19jdl9ob3N0IiA+JjY7IH0KLWNhc2UgJGFjX2N2X2hvc3QgaW4KLSot
Ki0qKSA7OwotKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGhv
c3QiICIkTElORU5PIiA1IDs7Ci1lc2FjCi1ob3N0PSRhY19jdl9ob3N0Ci1hY19zYXZlX0lGUz0k
SUZTOyBJRlM9Jy0nCi1zZXQgeCAkYWNfY3ZfaG9zdAotc2hpZnQKLWhvc3RfY3B1PSQxCi1ob3N0
X3ZlbmRvcj0kMgotc2hpZnQ7IHNoaWZ0Ci0jIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVy
IG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKLSMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoK
LWhvc3Rfb3M9JCoKLUlGUz0kYWNfc2F2ZV9JRlMKLWNhc2UgJGhvc3Rfb3MgaW4gKlwgKikgaG9z
dF9vcz1gZWNobyAiJGhvc3Rfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCi0KLQotCi0jIE00
IE1hY3JvIGluY2x1ZGVzCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQot
Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotIyBw
a2cubTQgLSBNYWNyb3MgdG8gbG9jYXRlIGFuZCB1dGlsaXNlIHBrZy1jb25maWcuICAgICAgICAg
ICAgLSotIEF1dG9jb25mIC0qLQotIyBzZXJpYWwgMSAocGtnLWNvbmZpZy0wLjI0KQotIwotIyBD
b3B5cmlnaHQgwqkgMjAwNCBTY290dCBKYW1lcyBSZW1uYW50IDxzY290dEBuZXRzcGxpdC5jb20+
LgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJp
YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQg
QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUg
RnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0
ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhj
ZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3Ry
aWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBj
b25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVk
ZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZv
ciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgUEtHX1BST0dfUEtHX0NPTkZJRyhbTUlO
LVZFUlNJT05dKQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFBLR19Q
Uk9HX1BLR19DT05GSUcKLQotIyBQS0dfQ0hFQ0tfRVhJU1RTKE1PRFVMRVMsIFtBQ1RJT04tSUYt
Rk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCi0jCi0jIENoZWNrIHRvIHNlZSB3aGV0aGVy
IGEgcGFydGljdWxhciBzZXQgb2YgbW9kdWxlcyBleGlzdHMuICBTaW1pbGFyCi0jIHRvIFBLR19D
SEVDS19NT0RVTEVTKCksIGJ1dCBkb2VzIG5vdCBzZXQgdmFyaWFibGVzIG9yIHByaW50IGVycm9y
cy4KLSMKLSMgUGxlYXNlIHJlbWVtYmVyIHRoYXQgbTQgZXhwYW5kcyBBQ19SRVFVSVJFKFtQS0df
UFJPR19QS0dfQ09ORklHXSkKLSMgb25seSBhdCB0aGUgZmlyc3Qgb2NjdXJlbmNlIGluIGNvbmZp
Z3VyZS5hYywgc28gaWYgdGhlIGZpcnN0IHBsYWNlCi0jIGl0J3MgY2FsbGVkIG1pZ2h0IGJlIHNr
aXBwZWQgKHN1Y2ggYXMgaWYgaXQgaXMgd2l0aGluIGFuICJpZiIsIHlvdQotIyBoYXZlIHRvIGNh
bGwgUEtHX0NIRUNLX0VYSVNUUyBtYW51YWxseQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSMgX1BLR19DT05GSUco
W1ZBUklBQkxFXSwgW0NPTU1BTkRdLCBbTU9EVUxFU10pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBfUEtHX0NPTkZJRwotCi0jIF9QS0dfU0hPUlRf
RVJST1JTX1NVUFBPUlRFRAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBfUEtH
X1NIT1JUX0VSUk9SU19TVVBQT1JURUQKLQotCi0jIFBLR19DSEVDS19NT0RVTEVTKFZBUklBQkxF
LVBSRUZJWCwgTU9EVUxFUywgW0FDVElPTi1JRi1GT1VORF0sCi0jIFtBQ1RJT04tSUYtTk9ULUZP
VU5EXSkKLSMKLSMKLSMgTm90ZSB0aGF0IGlmIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhlIGZp
cnN0IGNhbGwgdG8KLSMgUEtHX0NIRUNLX01PRFVMRVMgbWlnaHQgbm90IGhhcHBlbiwgeW91IHNo
b3VsZCBiZSBzdXJlIHRvIGluY2x1ZGUgYW4KLSMgZXhwbGljaXQgY2FsbCB0byBQS0dfUFJPR19Q
S0dfQ09ORklHIGluIHlvdXIgY29uZmlndXJlLmFjCi0jCi0jCi0jIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFBLR19DSEVD
S19NT0RVTEVTCi0KLQotCi0jIFdlIGRlZmluZSwgc2VwYXJhdGVseSwgUFRIUkVBRF9DRkxBR1Ms
IF9MREZMQUdTIGFuZCBfTElCUwotIyBldmVuIHRob3VnaCBjdXJyZW50bHkgd2UgZG9uJ3Qgc2V0
IHRoZW0gdmVyeSBzZXBhcmF0ZWx5LgotIyBUaGlzIG1lYW5zIHRoYXQgdGhlIG1ha2VmaWxlcyB3
aWxsIG5vdCBuZWVkIHRvIGNoYW5nZSBpbgotIyB0aGUgZnV0dXJlIGlmIHdlIG1ha2UgdGhlIHRl
c3QgbW9yZSBzb3BoaXN0aWNhdGVkLgotCi0KLQotIyBXZSBpbnZva2UgQVhfUFRIUkVBRF9WQVJT
IHdpdGggdGhlIG5hbWUgb2YgYW5vdGhlciBtYWNybwotIyB3aGljaCBpcyB0aGVuIGV4cGFuZGVk
IG9uY2UgZm9yIGVhY2ggdmFyaWFibGUuCi0KLQotCi0KLQotCi0KLQotIyBFbmFibGUvZGlzYWJs
ZSBvcHRpb25zCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1naXRodHRwIHdhcyBnaXZlbi4K
LWlmIHRlc3QgIiR7ZW5hYmxlX2dpdGh0dHArc2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2
YWw9JGVuYWJsZV9naXRodHRwOwotZmkKLQotCi1pZiB0ZXN0ICJ4JGVuYWJsZV9naXRodHRwIiA9
ICJ4bm8iOyB0aGVuIDoKLQotICAgIGF4X2N2X2dpdGh0dHA9Im4iCi0KLWVsaWYgdGVzdCAieCRl
bmFibGVfZ2l0aHR0cCIgPSAieHllcyI7IHRoZW4gOgotCi0gICAgYXhfY3ZfZ2l0aHR0cD0ieSIK
LQotZWxpZiB0ZXN0IC16ICRheF9jdl9naXRodHRwOyB0aGVuIDoKLQotICAgIGF4X2N2X2dpdGh0
dHA9Im4iCi0KLWZpCi1naXRodHRwPSRheF9jdl9naXRodHRwCi0KLQotCi0jIENoZWNrIHdoZXRo
ZXIgLS1lbmFibGUtbW9uaXRvcnMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbW9uaXRv
cnMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9tb25pdG9yczsKLWZp
Ci0KLQotaWYgdGVzdCAieCRlbmFibGVfbW9uaXRvcnMiID0gInhubyI7IHRoZW4gOgotCi0gICAg
YXhfY3ZfbW9uaXRvcnM9Im4iCi0KLWVsaWYgdGVzdCAieCRlbmFibGVfbW9uaXRvcnMiID0gInh5
ZXMiOyB0aGVuIDoKLQotICAgIGF4X2N2X21vbml0b3JzPSJ5IgotCi1lbGlmIHRlc3QgLXogJGF4
X2N2X21vbml0b3JzOyB0aGVuIDoKLQotICAgIGF4X2N2X21vbml0b3JzPSJ5IgotCi1maQotbW9u
aXRvcnM9JGF4X2N2X21vbml0b3JzCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdnRw
bSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV92dHBtK3NldH0iID0gc2V0OyB0aGVuIDoK
LSAgZW5hYmxldmFsPSRlbmFibGVfdnRwbTsKLWZpCi0KLQotaWYgdGVzdCAieCRlbmFibGVfdnRw
bSIgPSAieG5vIjsgdGhlbiA6Ci0KLSAgICBheF9jdl92dHBtPSJuIgotCi1lbGlmIHRlc3QgIngk
ZW5hYmxlX3Z0cG0iID0gInh5ZXMiOyB0aGVuIDoKLQotICAgIGF4X2N2X3Z0cG09InkiCi0KLWVs
aWYgdGVzdCAteiAkYXhfY3ZfdnRwbTsgdGhlbiA6Ci0KLSAgICBheF9jdl92dHBtPSJuIgotCi1m
aQotdnRwbT0kYXhfY3ZfdnRwbQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXhlbmFw
aSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV94ZW5hcGkrc2V0fSIgPSBzZXQ7IHRoZW4g
OgotICBlbmFibGV2YWw9JGVuYWJsZV94ZW5hcGk7Ci1maQotCi0KLWlmIHRlc3QgIngkZW5hYmxl
X3hlbmFwaSIgPSAieG5vIjsgdGhlbiA6Ci0KLSAgICBheF9jdl94ZW5hcGk9Im4iCi0KLWVsaWYg
dGVzdCAieCRlbmFibGVfeGVuYXBpIiA9ICJ4eWVzIjsgdGhlbiA6Ci0KLSAgICBheF9jdl94ZW5h
cGk9InkiCi0KLWVsaWYgdGVzdCAteiAkYXhfY3ZfeGVuYXBpOyB0aGVuIDoKLQotICAgIGF4X2N2
X3hlbmFwaT0ibiIKLQotZmkKLXhlbmFwaT0kYXhfY3ZfeGVuYXBpCi0KLQotCi0jIENoZWNrIHdo
ZXRoZXIgLS1lbmFibGUtcHl0aG9udG9vbHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVf
cHl0aG9udG9vbHMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9weXRo
b250b29sczsKLWZpCi0KLQotaWYgdGVzdCAieCRlbmFibGVfcHl0aG9udG9vbHMiID0gInhubyI7
IHRoZW4gOgotCi0gICAgYXhfY3ZfcHl0aG9udG9vbHM9Im4iCi0KLWVsaWYgdGVzdCAieCRlbmFi
bGVfcHl0aG9udG9vbHMiID0gInh5ZXMiOyB0aGVuIDoKLQotICAgIGF4X2N2X3B5dGhvbnRvb2xz
PSJ5IgotCi1lbGlmIHRlc3QgLXogJGF4X2N2X3B5dGhvbnRvb2xzOyB0aGVuIDoKLQotICAgIGF4
X2N2X3B5dGhvbnRvb2xzPSJ5IgotCi1maQotcHl0aG9udG9vbHM9JGF4X2N2X3B5dGhvbnRvb2xz
Ci0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtb2NhbWx0b29scyB3YXMgZ2l2ZW4uCi1p
ZiB0ZXN0ICIke2VuYWJsZV9vY2FtbHRvb2xzK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxl
dmFsPSRlbmFibGVfb2NhbWx0b29sczsKLWZpCi0KLQotaWYgdGVzdCAieCRlbmFibGVfb2NhbWx0
b29scyIgPSAieG5vIjsgdGhlbiA6Ci0KLSAgICBheF9jdl9vY2FtbHRvb2xzPSJuIgotCi1lbGlm
IHRlc3QgIngkZW5hYmxlX29jYW1sdG9vbHMiID0gInh5ZXMiOyB0aGVuIDoKLQotICAgIGF4X2N2
X29jYW1sdG9vbHM9InkiCi0KLWVsaWYgdGVzdCAteiAkYXhfY3Zfb2NhbWx0b29sczsgdGhlbiA6
Ci0KLSAgICBheF9jdl9vY2FtbHRvb2xzPSJ5IgotCi1maQotb2NhbWx0b29scz0kYXhfY3Zfb2Nh
bWx0b29scwotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1pbml0ZXJtIHdhcyBnaXZl
bi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21pbml0ZXJtK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5h
YmxldmFsPSRlbmFibGVfbWluaXRlcm07Ci1maQotCi0KLWlmIHRlc3QgIngkZW5hYmxlX21pbml0
ZXJtIiA9ICJ4bm8iOyB0aGVuIDoKKyMgTTQgTWFjcm8gaW5jbHVkZXMKIAotICAgIGF4X2N2X21p
bml0ZXJtPSJuIgogCi1lbGlmIHRlc3QgIngkZW5hYmxlX21pbml0ZXJtIiA9ICJ4eWVzIjsgdGhl
biA6CiAKLSAgICBheF9jdl9taW5pdGVybT0ieSIKIAotZWxpZiB0ZXN0IC16ICRheF9jdl9taW5p
dGVybTsgdGhlbiA6CiAKLSAgICBheF9jdl9taW5pdGVybT0ibiIKIAotZmkKLW1pbml0ZXJtPSRh
eF9jdl9taW5pdGVybQogCiAKIAotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxvbW91bnQgd2Fz
IGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbG9tb3VudCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0g
IGVuYWJsZXZhbD0kZW5hYmxlX2xvbW91bnQ7Ci1maQogCiAKLWlmIHRlc3QgIngkZW5hYmxlX2xv
bW91bnQiID0gInhubyI7IHRoZW4gOgogCi0gICAgYXhfY3ZfbG9tb3VudD0ibiIKIAotZWxpZiB0
ZXN0ICJ4JGVuYWJsZV9sb21vdW50IiA9ICJ4eWVzIjsgdGhlbiA6CiAKLSAgICBheF9jdl9sb21v
dW50PSJ5IgogCi1lbGlmIHRlc3QgLXogJGF4X2N2X2xvbW91bnQ7IHRoZW4gOgogCi0gICAgYXhf
Y3ZfbG9tb3VudD0ibiIKIAotZmkKLWxvbW91bnQ9JGF4X2N2X2xvbW91bnQKIAogCiAKLSMgQ2hl
Y2sgd2hldGhlciAtLWVuYWJsZS1kZWJ1ZyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9k
ZWJ1ZytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIGVuYWJsZXZhbD0kZW5hYmxlX2RlYnVnOwotZmkK
IAogCi1pZiB0ZXN0ICJ4JGVuYWJsZV9kZWJ1ZyIgPSAieG5vIjsgdGhlbiA6CiAKLSAgICBheF9j
dl9kZWJ1Zz0ibiIKIAotZWxpZiB0ZXN0ICJ4JGVuYWJsZV9kZWJ1ZyIgPSAieHllcyI7IHRoZW4g
OgogCi0gICAgYXhfY3ZfZGVidWc9InkiCiAKLWVsaWYgdGVzdCAteiAkYXhfY3ZfZGVidWc7IHRo
ZW4gOgogCi0gICAgYXhfY3ZfZGVidWc9InkiCiAKLWZpCi1kZWJ1Zz0kYXhfY3ZfZGVidWcKIAog
CiAKQEAgLTQxNjEsMjQgKzIyMDcsNiBAQCBkZWJ1Zz0kYXhfY3ZfZGVidWcKIAogCiAKLWZvciBj
ZmxhZyBpbiAkUFJFUEVORF9JTkNMVURFUwotZG8KLSAgICBQUkVQRU5EX0NGTEFHUys9IiAtSSRj
ZmxhZyIKLWRvbmUKLWZvciBsZGZsYWcgaW4gJFBSRVBFTkRfTElCCi1kbwotICAgIFBSRVBFTkRf
TERGTEFHUys9IiAtTCRsZGZsYWciCi1kb25lCi1mb3IgY2ZsYWcgaW4gJEFQUEVORF9JTkNMVURF
UwotZG8KLSAgICBBUFBFTkRfQ0ZMQUdTKz0iIC1JJGNmbGFnIgotZG9uZQotZm9yIGxkZmxhZyBp
biAkQVBQRU5EX0xJQgotZG8KLSAgICBBUFBFTkRfTERGTEFHUys9IiAtTCRsZGZsYWciCi1kb25l
Ci1DRkxBR1M9IiRQUkVQRU5EX0NGTEFHUyAkQ0ZMQUdTICRBUFBFTkRfQ0ZMQUdTIgotTERGTEFH
Uz0iJFBSRVBFTkRfTERGTEFHUyAkTERGTEFHUyAkQVBQRU5EX0xERkxBR1MiCiAKIAogCkBAIC00
MTkwLDkwNiArMjIxOCwzNDggQEAgTERGTEFHUz0iJFBSRVBFTkRfTERGTEFHUyAkTERGTEFHUyAk
QVBQRU5EX0xERkxBR1MiCiAKIAogCisjIHBrZy5tNCAtIE1hY3JvcyB0byBsb2NhdGUgYW5kIHV0
aWxpc2UgcGtnLWNvbmZpZy4gICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisjIHNlcmlhbCAx
IChwa2ctY29uZmlnLTAuMjQpCisjCisjIENvcHlyaWdodCDCqSAyMDA0IFNjb3R0IEphbWVzIFJl
bW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisj
CisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9n
cmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIElu
Yy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBV
U0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHBy
b2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBi
eSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1
dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KIAor
IyBQS0dfUFJPR19QS0dfQ09ORklHKFtNSU4tVkVSU0lPTl0pCisjIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KKyMgUEtHX1BST0dfUEtHX0NPTkZJRwogCisjIFBLR19DSEVDS19F
WElTVFMoTU9EVUxFUywgW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkK
KyMKKyMgQ2hlY2sgdG8gc2VlIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHNldCBvZiBtb2R1bGVzIGV4
aXN0cy4gIFNpbWlsYXIKKyMgdG8gUEtHX0NIRUNLX01PRFVMRVMoKSwgYnV0IGRvZXMgbm90IHNl
dCB2YXJpYWJsZXMgb3IgcHJpbnQgZXJyb3JzLgorIworIyBQbGVhc2UgcmVtZW1iZXIgdGhhdCBt
NCBleHBhbmRzIEFDX1JFUVVJUkUoW1BLR19QUk9HX1BLR19DT05GSUddKQorIyBvbmx5IGF0IHRo
ZSBmaXJzdCBvY2N1cmVuY2UgaW4gY29uZmlndXJlLmFjLCBzbyBpZiB0aGUgZmlyc3QgcGxhY2UK
KyMgaXQncyBjYWxsZWQgbWlnaHQgYmUgc2tpcHBlZCAoc3VjaCBhcyBpZiBpdCBpcyB3aXRoaW4g
YW4gImlmIiwgeW91CisjIGhhdmUgdG8gY2FsbCBQS0dfQ0hFQ0tfRVhJU1RTIG1hbnVhbGx5Cisj
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCiAKLSMgQ2hlY2tzIGZvciBwcm9ncmFtcy4KLXsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNh
dGUgb3V0cHV0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBhIHNlZCB0aGF0IGRvZXMg
bm90IHRydW5jYXRlIG91dHB1dC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX1NF
RCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNl
Ci0gICAgICAgICAgICBhY19zY3JpcHQ9cy9hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFh
YWFhYS9iYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIvCi0gICAgIGZvciBhY19pIGlu
IDEgMiAzIDQgNSA2IDc7IGRvCi0gICAgICAgYWNfc2NyaXB0PSIkYWNfc2NyaXB0JGFzX25sJGFj
X3NjcmlwdCIKLSAgICAgZG9uZQotICAgICBlY2hvICIkYWNfc2NyaXB0IiAyPi9kZXYvbnVsbCB8
IHNlZCA5OXEgPmNvbmZ0ZXN0LnNlZAotICAgICB7IGFjX3NjcmlwdD07IHVuc2V0IGFjX3Njcmlw
dDt9Ci0gICAgIGlmIHRlc3QgLXogIiRTRUQiOyB0aGVuCi0gIGFjX3BhdGhfU0VEX2ZvdW5kPWZh
bHNlCi0gICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBv
ZiBQUk9HTkFNRS1MSVNUCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IK
LWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAi
JGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfcHJvZyBpbiBzZWQgZ3NlZDsgZG8KLSAg
ICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAg
ICAgIGFjX3BhdGhfU0VEPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgotICAgICAgeyB0
ZXN0IC1mICIkYWNfcGF0aF9TRUQiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX1NFRCI7IH0gfHwg
Y29udGludWUKLSMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX1NFRCBhbmQgc2VsZWN0IGl0IGlmIGl0
IGlzIGZvdW5kLgotICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfU0VECi1jYXNlIGAiJGFjX3Bh
dGhfU0VEIiAtLXZlcnNpb24gMj4mMWAgaW4KLSpHTlUqKQotICBhY19jdl9wYXRoX1NFRD0iJGFj
X3BhdGhfU0VEIiBhY19wYXRoX1NFRF9mb3VuZD06OzsKLSopCi0gIGFjX2NvdW50PTAKLSAgJGFz
X2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCi0gIHdoaWxlIDoKLSAgZG8KLSAgICBj
YXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgotICAgIG12ICJj
b25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKLSAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVz
dC5ubCIKLSAgICAkYXNfZWNobyAnJyA+PiAiY29uZnRlc3QubmwiCi0gICAgIiRhY19wYXRoX1NF
RCIgLWYgY29uZnRlc3Quc2VkIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2
L251bGwgfHwgYnJlYWsKLSAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9k
ZXYvbnVsbCAyPiYxIHx8IGJyZWFrCi0gICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBh
Y19jb3VudD0kYXNfdmFsCi0gICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9TRURf
bWF4LTB9OyB0aGVuCi0gICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBs
b29raW5nIGZvciBhIGJldHRlciBvbmUKLSAgICAgIGFjX2N2X3BhdGhfU0VEPSIkYWNfcGF0aF9T
RUQiCi0gICAgICBhY19wYXRoX1NFRF9tYXg9JGFjX2NvdW50Ci0gICAgZmkKLSAgICAjIDEwKigy
XjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCi0gICAgdGVzdCAkYWNf
Y291bnQgLWd0IDEwICYmIGJyZWFrCi0gIGRvbmUKLSAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRl
c3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Ci1lc2FjCiAKLSAgICAgICRhY19wYXRo
X1NFRF9mb3VuZCAmJiBicmVhayAzCi0gICAgZG9uZQotICBkb25lCi0gIGRvbmUKLUlGUz0kYXNf
c2F2ZV9JRlMKLSAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfU0VEIjsgdGhlbgotICAgIGFzX2Zu
X2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIHNlZCBjb3VsZCBiZSBmb3VuZCBpbiBcJFBBVEgiICIk
TElORU5PIiA1Ci0gIGZpCi1lbHNlCi0gIGFjX2N2X3BhdGhfU0VEPSRTRUQKLWZpCisjIF9QS0df
Q09ORklHKFtWQVJJQUJMRV0sIFtDT01NQU5EXSwgW01PRFVMRVNdKQorIyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX1BLR19DT05GSUcKIAotZmkKLXsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0
aF9TRUQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9wYXRoX1NFRCIgPiY2OyB9Ci0gU0VEPSIkYWNf
Y3ZfcGF0aF9TRUQiCi0gIHJtIC1mIGNvbmZ0ZXN0LnNlZAorIyBfUEtHX1NIT1JUX0VSUk9SU19T
VVBQT1JURUQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX1BLR19TSE9SVF9F
UlJPUlNfU1VQUE9SVEVECiAKLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNf
Y29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1Jwot
YWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERG
TEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3Zf
Y19jb21waWxlcl9nbnUKLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBF
eHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNh
biBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZp
eH1nY2M7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAk
YWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0
OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAt
biAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJy
aWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRP
UgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16
ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhl
Y3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQk
YWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQi
OyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2MiCi0gICAg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNf
d29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1J
RlM9JGFzX3NhdmVfSUZTCiAKLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4g
IiRDQyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBy
ZXN1bHQ6ICRDQyIgPiY1Ci0kYXNfZWNobyAiJENDIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hv
ICJubyIgPiY2OyB9Ci1maQorIyBQS0dfQ0hFQ0tfTU9EVUxFUyhWQVJJQUJMRS1QUkVGSVgsIE1P
RFVMRVMsIFtBQ1RJT04tSUYtRk9VTkRdLAorIyBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCisjCisj
CisjIE5vdGUgdGhhdCBpZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoZSBmaXJzdCBjYWxsIHRv
CisjIFBLR19DSEVDS19NT0RVTEVTIG1pZ2h0IG5vdCBoYXBwZW4sIHlvdSBzaG91bGQgYmUgc3Vy
ZSB0byBpbmNsdWRlIGFuCisjIGV4cGxpY2l0IGNhbGwgdG8gUEtHX1BST0dfUEtHX0NPTkZJRyBp
biB5b3VyIGNvbmZpZ3VyZS5hYworIworIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQS0dfQ0hFQ0tfTU9EVUxFUwog
CiAKLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KLSAgYWNfY3RfQ0M9JEND
Ci0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJv
Z3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLXsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+
JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVz
dCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9f
biAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgot
ICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRl
IHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgot
Zm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIk
YXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0
YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNf
ZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9
OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgotICAgICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19l
eHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lG
UwogCi1maQotZmkKLWFjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCi1pZiB0ZXN0IC1uICIk
YWNfY3RfQ0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQotJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9Ci1l
bHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBu
byIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKKyMgV2UgZGVmaW5lLCBzZXBhcmF0ZWx5
LCBQVEhSRUFEX0NGTEFHUywgX0xERkxBR1MgYW5kIF9MSUJTCisjIGV2ZW4gdGhvdWdoIGN1cnJl
bnRseSB3ZSBkb24ndCBzZXQgdGhlbSB2ZXJ5IHNlcGFyYXRlbHkuCisjIFRoaXMgbWVhbnMgdGhh
dCB0aGUgbWFrZWZpbGVzIHdpbGwgbm90IG5lZWQgdG8gY2hhbmdlIGluCisjIHRoZSBmdXR1cmUg
aWYgd2UgbWFrZSB0aGUgdGVzdCBtb3JlIHNvcGhpc3RpY2F0ZWQuCiAKLSAgaWYgdGVzdCAieCRh
Y19jdF9DQyIgPSB4OyB0aGVuCi0gICAgQ0M9IiIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2Nv
bXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhl
ZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2lu
ZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190
b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBDQz0kYWNfY3RfQ0MKLSAgZmkKLWVsc2UKLSAg
Q0M9IiRhY19jdl9wcm9nX0NDIgotZmkKIAotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgICAg
ICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgICAjIEV4dHJhY3QgdGhl
IGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9n
cmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2M7IGFjX3dv
cmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcg
Zm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAi
ID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuIDoKLSAg
JGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhl
bgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0
LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2Rp
ciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAm
JiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRl
bnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQi
ICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0g
ICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKLSAgICAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNf
ZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9J
RlMKIAotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgot
ICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+
JjUKLSRhc19lY2hvICIkQ0MiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0K
LWZpCisjIFdlIGludm9rZSBBWF9QVEhSRUFEX1ZBUlMgd2l0aCB0aGUgbmFtZSBvZiBhbm90aGVy
IG1hY3JvCisjIHdoaWNoIGlzIHRoZW4gZXhwYW5kZWQgb25jZSBmb3IgZWFjaCB2YXJpYWJsZS4K
IAogCi0gIGZpCi1maQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZp
cnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4K
LXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tp
bmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0
fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBp
ZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVz
ZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLWFzX3Nh
dmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRv
Ci0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAg
ICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAg
aWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94
ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGlmIHRlc3QgIiRh
c19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAg
IGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0gICAgICAgY29udGludWUKLSAgICAgZmkKLSAgICBhY19j
dl9wcm9nX0NDPSJjYyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0g
IGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKIAotaWYgdGVzdCAkYWNfcHJvZ19y
ZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNv
IG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwot
ICBzaGlmdAotICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVy
ZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0
aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJz
dCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5h
bWUuCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkYXNfZGlyLyRhY193b3JkJHsxKycg
J30kQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIk
Q0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVz
dWx0OiAkQ0MiID4mNQotJGFzX2VjaG8gIiRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAi
bm8iID4mNjsgfQotZmkKIAogCi1maQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICBpZiB0ZXN0
IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gIGZvciBhY19wcm9nIGluIGNsLmV4ZQotICBk
bwotICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3By
b2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRh
Y190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19u
ICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJv
Z19DQytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1l
bHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExl
dCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElG
Uz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2
ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19l
eHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIk
YXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193
b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3By
ZWZpeCRhY19wcm9nIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAg
ZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwogCi1maQotZmkKLUNDPSRhY19jdl9w
cm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQotJGFzX2VjaG8gIiRDQyIgPiY2OyB9
Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0
OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQorCisKKyMgRW5hYmxlL2Rpc2FibGUgb3B0
aW9ucworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZ2l0aHR0cCB3YXMgZ2l2ZW4uCitpZiB0
ZXN0ICIke2VuYWJsZV9naXRodHRwK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRl
bmFibGVfZ2l0aHR0cDsKIGZpCiAKIAotICAgIHRlc3QgLW4gIiRDQyIgJiYgYnJlYWsKLSAgZG9u
ZQotZmkKLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgYWNfY3RfQ0M9JENDCi0gIGZvciBhY19w
cm9nIGluIGNsLmV4ZQotZG8KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJv
ZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFj
X3Byb2c7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAk
YWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0i
ID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYg
dGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3Rf
Q0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9
JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZT
PSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBh
Y19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRl
c3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19k
aXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9D
Qz0iJGFjX3Byb2ciCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
Zm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBm
aQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCitpZiB0ZXN0ICJ4JGVuYWJsZV9naXRo
dHRwIiA9ICJ4bm8iOyB0aGVuIDoKIAotZmkKLWZpCi1hY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19j
dF9DQwotaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKLSRhc19lY2hvICIk
YWNfY3RfQ0MiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCisgICAg
YXhfY3ZfZ2l0aHR0cD0ibiIKIAorZWxpZiB0ZXN0ICJ4JGVuYWJsZV9naXRodHRwIiA9ICJ4eWVz
IjsgdGhlbiA6CiAKLSAgdGVzdCAtbiAiJGFjX2N0X0NDIiAmJiBicmVhawotZG9uZQorICAgIGF4
X2N2X2dpdGh0dHA9InkiCisKK2VsaWYgdGVzdCAteiAkYXhfY3ZfZ2l0aHR0cDsgdGhlbiA6CisK
KyAgICBheF9jdl9naXRodHRwPSJuIgogCi0gIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhl
bgotICAgIENDPSIiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xf
d2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBs
ZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90
IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7
Ci1lc2FjCi0gICAgQ0M9JGFjX2N0X0NDCi0gIGZpCiBmaQorZ2l0aHR0cD0kYXhfY3ZfZ2l0aHR0
cAogCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1vbml0b3JzIHdhcyBnaXZlbi4KK2lm
IHRlc3QgIiR7ZW5hYmxlX21vbml0b3JzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFs
PSRlbmFibGVfbW9uaXRvcnM7CiBmaQogCiAKLXRlc3QgLXogIiRDQyIgJiYgeyB7ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1
Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9l
cnJvciAkPyAibm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAotU2VlIFxg
Y29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUgOyB9CitpZiB0ZXN0ICJ4
JGVuYWJsZV9tb25pdG9ycyIgPSAieG5vIjsgdGhlbiA6CiAKLSMgUHJvdmlkZSBzb21lIGluZm9y
bWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KLSRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQotc2V0IFggJGFj
X2NvbXBpbGUKLWFjX2NvbXBpbGVyPSQyCi1mb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAt
ViAtcXZlcnNpb247IGRvCi0gIHsgeyBhY190cnk9IiRhY19jb21waWxlciAkYWNfb3B0aW9uID4m
NSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNo
bz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190
cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIK
LSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGVyICRh
Y19vcHRpb24gPiY1IikgMj5jb25mdGVzdC5lcnIKLSAgYWNfc3RhdHVzPSQ/Ci0gIGlmIHRlc3Qg
LXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgc2VkICcxMGFcCi0uLi4gcmVzdCBvZiBzdGRlcnIg
b3V0cHV0IGRlbGV0ZWQgLi4uCi0gICAgICAgICAxMHEnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3Qu
ZXIxCi0gICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QuZXIx
IGNvbmZ0ZXN0LmVycgotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBc
JD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQotZG9uZQorICAg
IGF4X2N2X21vbml0b3JzPSJuIgogCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlciIg
PiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMg
Y29tcGlsZXIuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfY19jb21waWxlcl9nbnUrc2V0
fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBj
YXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRl
ZnMuaC4gICovCitlbGlmIHRlc3QgIngkZW5hYmxlX21vbml0b3JzIiA9ICJ4eWVzIjsgdGhlbiA6
CiAKLWludAotbWFpbiAoKQotewotI2lmbmRlZiBfX0dOVUNfXwotICAgICAgIGNob2tlIG1lCi0j
ZW5kaWYKKyAgICBheF9jdl9tb25pdG9ycz0ieSIKIAotICA7Ci0gIHJldHVybiAwOwotfQotX0FD
RU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2NvbXBp
bGVyX2dudT15ZXMKLWVsc2UKLSAgYWNfY29tcGlsZXJfZ251PW5vCi1maQotcm0gLWYgY29yZSBj
b25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1hY19jdl9j
X2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CitlbGlmIHRlc3QgLXogJGF4X2N2X21vbml0
b3JzOyB0aGVuIDoKKworICAgIGF4X2N2X21vbml0b3JzPSJ5IgogCiBmaQoteyAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2du
dSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjY7IH0KLWlmIHRlc3Qg
JGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KK21v
bml0b3JzPSRheF9jdl9tb25pdG9ycworCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXZ0
cG0gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfdnRwbStzZXR9IiA9IHNldDsgdGhlbiA6
CisgIGVuYWJsZXZhbD0kZW5hYmxlX3Z0cG07CiBmaQotYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mr
c2V0fQotYWNfc2F2ZV9DRkxBR1M9JENGTEFHUwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKLSRhc19l
Y2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KLWlmIHRl
c3QgIiR7YWNfY3ZfcHJvZ19jY19nK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAi
KGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJv
cl9mbGFnCi0gICBhY19jX3dlcnJvcl9mbGFnPXllcwotICAgYWNfY3ZfcHJvZ19jY19nPW5vCi0g
ICBDRkxBR1M9Ii1nIgotICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFj
X2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwogCi1pbnQKLW1haW4gKCkKLXsKIAotICA7Ci0g
IHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsg
dGhlbiA6Ci0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgQ0ZMQUdTPSIiCi0gICAgICBj
YXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRl
ZnMuaC4gICovCitpZiB0ZXN0ICJ4JGVuYWJsZV92dHBtIiA9ICJ4bm8iOyB0aGVuIDoKIAotaW50
Ci1tYWluICgpCi17CisgICAgYXhfY3ZfdnRwbT0ibiIKIAotICA7Ci0gIHJldHVybiAwOwotfQot
X0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CitlbGlmIHRl
c3QgIngkZW5hYmxlX3Z0cG0iID0gInh5ZXMiOyB0aGVuIDoKIAotZWxzZQotICBhY19jX3dlcnJv
cl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKLQkgQ0ZMQUdTPSItZyIKLQkgY2F0IGNvbmZk
ZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAq
LworICAgIGF4X2N2X3Z0cG09InkiCiAKLWludAotbWFpbiAoKQoteworZWxpZiB0ZXN0IC16ICRh
eF9jdl92dHBtOyB0aGVuIDoKKworICAgIGF4X2N2X3Z0cG09Im4iCiAKLSAgOwotICByZXR1cm4g
MDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgot
ICBhY19jdl9wcm9nX2NjX2c9eWVzCiBmaQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRl
c3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cit2dHBtPSRheF9jdl92dHBtCisKKworCisj
IENoZWNrIHdoZXRoZXIgLS1lbmFibGUteGVuYXBpIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5h
YmxlX3hlbmFwaStzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3hlbmFw
aTsKIGZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0
ZXN0LiRhY19leHQKKworCitpZiB0ZXN0ICJ4JGVuYWJsZV94ZW5hcGkiID0gInhubyI7IHRoZW4g
OgorCisgICAgYXhfY3ZfeGVuYXBpPSJuIgorCitlbGlmIHRlc3QgIngkZW5hYmxlX3hlbmFwaSIg
PSAieHllcyI7IHRoZW4gOgorCisgICAgYXhfY3ZfeGVuYXBpPSJ5IgorCitlbGlmIHRlc3QgLXog
JGF4X2N2X3hlbmFwaTsgdGhlbiA6CisKKyAgICBheF9jdl94ZW5hcGk9Im4iCisKIGZpCi1ybSAt
ZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQK
LSAgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZworeGVuYXBpPSRheF9j
dl94ZW5hcGkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1weXRob250b29scyB3YXMg
Z2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9weXRob250b29scytzZXR9IiA9IHNldDsgdGhlbiA6
CisgIGVuYWJsZXZhbD0kZW5hYmxlX3B5dGhvbnRvb2xzOwogZmkKLXsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19nIiA+JjUKLSRh
c19lY2hvICIkYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFH
UyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUwotZWxpZiB0ZXN0ICRhY19j
dl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAg
ICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0g
IGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAg
ICBDRkxBR1M9Ci0gIGZpCisKKworaWYgdGVzdCAieCRlbmFibGVfcHl0aG9udG9vbHMiID0gInhu
byI7IHRoZW4gOgorCisgICAgYXhfY3ZfcHl0aG9udG9vbHM9Im4iCisKK2VsaWYgdGVzdCAieCRl
bmFibGVfcHl0aG9udG9vbHMiID0gInh5ZXMiOyB0aGVuIDoKKworICAgIGF4X2N2X3B5dGhvbnRv
b2xzPSJ5IgorCitlbGlmIHRlc3QgLXogJGF4X2N2X3B5dGhvbnRvb2xzOyB0aGVuIDoKKworICAg
IGF4X2N2X3B5dGhvbnRvb2xzPSJ5IgorCiBmaQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIg
PiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4
OS4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2M4OStzZXR9IiA9IHNldDsg
dGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2N2X3Byb2df
Y2NfYzg5PW5vCi1hY19zYXZlX0NDPSRDQwotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29u
ZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGFyZy5o
PgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8
c3lzL3N0YXQuaD4KLS8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc3RvbGVuIGZy
b20gUkNTIDUuNydzIHNyYy9jb25mLnNoLiAgKi8KLXN0cnVjdCBidWYgeyBpbnQgeDsgfTsKLUZJ
TEUgKiAoKnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7Ci1zdGF0
aWMgY2hhciAqZSAocCwgaSkKLSAgICAgY2hhciAqKnA7Ci0gICAgIGludCBpOwotewotICByZXR1
cm4gcFtpXTsKLX0KLXN0YXRpYyBjaGFyICpmIChjaGFyICogKCpnKSAoY2hhciAqKiwgaW50KSwg
Y2hhciAqKnAsIC4uLikKLXsKLSAgY2hhciAqczsKLSAgdmFfbGlzdCB2OwotICB2YV9zdGFydCAo
dixwKTsKLSAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKLSAgdmFfZW5kICh2KTsKLSAgcmV0
dXJuIHM7Ci19CitweXRob250b29scz0kYXhfY3ZfcHl0aG9udG9vbHMKIAotLyogT1NGIDQuMCBD
b21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMK
LSAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hh
cmFjdGVyIGNvbnN0YW50cy4KLSAgIFRoZXNlIGRvbid0IHByb3Zva2UgYW4gZXJyb3IgdW5mb3J0
dW5hdGVseSwgaW5zdGVhZCBhcmUgc2lsZW50bHkgdHJlYXRlZAotICAgYXMgJ3gnLiAgVGhlIGZv
bGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkIGlzIGFkZGVkIHRvIGdldAotICAg
cHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0
IHRydWUsIGZvciBhbgotICAgYXJyYXkgc2l6ZSBhdCBsZWFzdC4gIEl0J3MgbmVjZXNzYXJ5IHRv
IHdyaXRlICdceDAwJz09MCB0byBnZXQgc29tZXRoaW5nCi0gICB0aGF0J3MgdHJ1ZSBvbmx5IHdp
dGggLXN0ZC4gICovCi1pbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOwog
Ci0vKiBJQk0gQyA2IGZvciBBSVggaXMgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdCwgYnV0IGl0IHJl
cGxhY2VzIG1hY3JvIHBhcmFtZXRlcnMKLSAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIg
Y29uc3RhbnRzLiAgKi8KLSNkZWZpbmUgRk9PKHgpICd4JwotaW50IHhsYzZfY2NfYXJyYXlbRk9P
KGEpID09ICd4JyA/IDEgOiAtMV07CiAKLWludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOwotc3Ry
dWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307Ci1zdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUg
YSk7fTsKLWludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYg
Kiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOwotaW50IGFyZ2M7Ci1jaGFyICoqYXJn
djsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8
ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9G
Ci1mb3IgYWNfYXJnIGluICcnIC1xbGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBc
Ci0JLUFlICItQWEgLURfSFBVWF9TT1VSQ0UiICItWGMgLURfX0VYVEVOU0lPTlNfXyIKLWRvCi0g
IENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgotICBpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElO
RU5PIjsgdGhlbiA6Ci0gIGFjX2N2X3Byb2dfY2NfYzg5PSRhY19hcmcKKyMgQ2hlY2sgd2hldGhl
ciAtLWVuYWJsZS1vY2FtbHRvb2xzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX29jYW1s
dG9vbHMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9vY2FtbHRvb2xz
OwogZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgdGVz
dCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0gInhubyIgJiYgYnJlYWsKLWRvbmUKLXJtIC1mIGNv
bmZ0ZXN0LiRhY19leHQKLUNDPSRhY19zYXZlX0NDCisKKworaWYgdGVzdCAieCRlbmFibGVfb2Nh
bWx0b29scyIgPSAieG5vIjsgdGhlbiA6CisKKyAgICBheF9jdl9vY2FtbHRvb2xzPSJuIgorCitl
bGlmIHRlc3QgIngkZW5hYmxlX29jYW1sdG9vbHMiID0gInh5ZXMiOyB0aGVuIDoKKworICAgIGF4
X2N2X29jYW1sdG9vbHM9InkiCisKK2VsaWYgdGVzdCAteiAkYXhfY3Zfb2NhbWx0b29sczsgdGhl
biA6CisKKyAgICBheF9jdl9vY2FtbHRvb2xzPSJ5IgogCiBmaQotIyBBQ19DQUNIRV9WQUwKLWNh
c2UgIngkYWNfY3ZfcHJvZ19jY19jODkiIGluCi0gIHgpCi0gICAgeyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKLSRhc19lY2hv
ICJub25lIG5lZWRlZCIgPiY2OyB9IDs7Ci0gIHhubykKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogdW5zdXBwb3J0ZWQiID4mNQotJGFzX2VjaG8g
InVuc3VwcG9ydGVkIiA+JjY7IH0gOzsKLSAgKikKLSAgICBDQz0iJENDICRhY19jdl9wcm9nX2Nj
X2M4OSIKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19jODki
ID4mNjsgfSA7OwotZXNhYwotaWYgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0geG5vOyB0
aGVuIDoKK29jYW1sdG9vbHM9JGF4X2N2X29jYW1sdG9vbHMKKworCiAKKyMgQ2hlY2sgd2hldGhl
ciAtLWVuYWJsZS1taW5pdGVybSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9taW5pdGVy
bStzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX21pbml0ZXJtOwogZmkK
IAotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMg
JENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8g
Y29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRh
Y19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQog
Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRo
ZXIgbG4gLXMgd29ya3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3
b3Jrcy4uLiAiID4mNjsgfQotTE5fUz0kYXNfbG5fcwotaWYgdGVzdCAiJExOX1MiID0gImxuIC1z
IjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8sIHVzaW5nICRMTl9TIiA+JjUK
LSRhc19lY2hvICJubywgdXNpbmcgJExOX1MiID4mNjsgfQoraWYgdGVzdCAieCRlbmFibGVfbWlu
aXRlcm0iID0gInhubyI7IHRoZW4gOgorCisgICAgYXhfY3ZfbWluaXRlcm09Im4iCisKK2VsaWYg
dGVzdCAieCRlbmFibGVfbWluaXRlcm0iID0gInh5ZXMiOyB0aGVuIDoKKworICAgIGF4X2N2X21p
bml0ZXJtPSJ5IgorCitlbGlmIHRlc3QgLXogJGF4X2N2X21pbml0ZXJtOyB0aGVuIDoKKworICAg
IGF4X2N2X21pbml0ZXJtPSJuIgorCitmaQorbWluaXRlcm09JGF4X2N2X21pbml0ZXJtCisKKwor
CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbG9tb3VudCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIk
e2VuYWJsZV9sb21vdW50K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVf
bG9tb3VudDsKIGZpCiAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
Y2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKSIgPiY1Ci0kYXNfZWNo
b19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpLi4uICIgPiY2
OyB9Ci1zZXQgeCAke01BS0UtbWFrZX0KLWFjX21ha2U9YCRhc19lY2hvICIkMiIgfCBzZWQgJ3Mv
Ky9wL2c7IHMvW15hLXpBLVowLTlfXS9fL2cnYAotaWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3By
b2dfbWFrZV8ke2FjX21ha2V9X3NldCtzZXR9XCIiID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9f
biAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC5tYWtlIDw8XF9BQ0VPRgot
U0hFTEwgPSAvYmluL3NoCi1hbGw6Ci0JQGVjaG8gJ0BAQCUlJT0kKE1BS0UpPUBAQCUlJScKLV9B
Q0VPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZyAuLi4i
LCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0
Lm1ha2UgMj4vZGV2L251bGxgIGluCi0gICpAQEAlJSU9Pyo9QEBAJSUlKikKLSAgICBldmFsIGFj
X2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OwotICAqKQotICAgIGV2YWwgYWNfY3Zf
cHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKLWVzYWMKLXJtIC1mIGNvbmZ0ZXN0Lm1ha2UK
KworaWYgdGVzdCAieCRlbmFibGVfbG9tb3VudCIgPSAieG5vIjsgdGhlbiA6CisKKyAgICBheF9j
dl9sb21vdW50PSJuIgorCitlbGlmIHRlc3QgIngkZW5hYmxlX2xvbW91bnQiID0gInh5ZXMiOyB0
aGVuIDoKKworICAgIGF4X2N2X2xvbW91bnQ9InkiCisKK2VsaWYgdGVzdCAteiAkYXhfY3ZfbG9t
b3VudDsgdGhlbiA6CisKKyAgICBheF9jdl9sb21vdW50PSJuIgorCiBmaQotaWYgZXZhbCB0ZXN0
IFwkYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0ID0geWVzOyB0aGVuCi0gIHsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2Vj
aG8gInllcyIgPiY2OyB9Ci0gIFNFVF9NQUtFPQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7
IH0KLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgorbG9tb3VudD0kYXhfY3ZfbG9tb3Vu
dAorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlYnVnIHdhcyBnaXZlbi4KK2lmIHRl
c3QgIiR7ZW5hYmxlX2RlYnVnK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFi
bGVfZGVidWc7CiBmaQogCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZl
ciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFu
b3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6
Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0
Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFt
aWdhT1MgL0MvaW5zdGFsbCwgd2hpY2ggaW5zdGFsbHMgYm9vdGJsb2NrcyBvbiBmbG9wcHkgZGlz
Y3MKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhv
dXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5k
bGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmll
cyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgT1MvMidzIHN5c3RlbSBp
bnN0YWxsLCB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpYwotIyAuL2lu
c3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2lu
c3RhbGwuc2guCi0jIFJlamVjdCBpbnN0YWxsIHByb2dyYW1zIHRoYXQgY2Fubm90IGluc3RhbGwg
bXVsdGlwbGUgZmlsZXMuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwiID4mNQotJGFzX2VjaG9fbiAi
Y2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAiID4mNjsgfQotaWYgdGVz
dCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9
IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFz
X3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgK
LWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4K
LSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFU
SCBlbGVtZW50cy4KLWNhc2UgJGFzX2Rpci8gaW4gIygoCi0gIC4vIHwgLi8vIHwgL1tjQ10vKiB8
IFwKLSAgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3Iv
YWZzd3MvYmluLyogfCBcCi0gID86W1xcL11vczJbXFwvXWluc3RhbGxbXFwvXSogfCA/OltcXC9d
T1MyW1xcL11JTlNUQUxMW1xcL10qIHwgXAotICAvdXNyL3VjYi8qICkgOzsKLSAgKikKLSAgICAj
IE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgot
ICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1
ZmYgYXMgcm9vdAotICAgICMgYnkgZGVmYXVsdC4KLSAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFs
bCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4
ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLQlpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3Byb2ck
YWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQi
OyB9OyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotCSAgICBncmVwIGRz
cG1zZyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVu
Ci0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29u
dmVudGlvbi4KLQkgICAgOgotCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotCSAg
ICBncmVwIHB3cGx1cyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAy
PiYxOyB0aGVuCi0JICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5
IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIHJtIC1yZiBjb25m
dGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgotCSAgICBlY2hvIG9uZSA+IGNvbmZ0
ZXN0Lm9uZQotCSAgICBlY2hvIHR3byA+IGNvbmZ0ZXN0LnR3bwotCSAgICBta2RpciBjb25mdGVz
dC5kaXIKLQkgICAgaWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIC1jIGNvbmZ0ZXN0
Lm9uZSBjb25mdGVzdC50d28gImBwd2RgL2NvbmZ0ZXN0LmRpciIgJiYKLQkgICAgICB0ZXN0IC1z
IGNvbmZ0ZXN0Lm9uZSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LnR3byAmJgotCSAgICAgIHRlc3QgLXMg
Y29uZnRlc3QuZGlyL2NvbmZ0ZXN0Lm9uZSAmJgotCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGly
L2NvbmZ0ZXN0LnR3bwotCSAgICB0aGVuCi0JICAgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNf
ZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgotCSAgICAgIGJyZWFrIDMKLQkgICAgZmkKLQkg
IGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICBkb25lCi0gICAgOzsKLWVzYWMKIAotICBkb25lCi1J
RlM9JGFzX3NhdmVfSUZTCitpZiB0ZXN0ICJ4JGVuYWJsZV9kZWJ1ZyIgPSAieG5vIjsgdGhlbiA6
CisKKyAgICBheF9jdl9kZWJ1Zz0ibiIKKworZWxpZiB0ZXN0ICJ4JGVuYWJsZV9kZWJ1ZyIgPSAi
eHllcyI7IHRoZW4gOgorCisgICAgYXhfY3ZfZGVidWc9InkiCisKK2VsaWYgdGVzdCAteiAkYXhf
Y3ZfZGVidWc7IHRoZW4gOgogCi1ybSAtcmYgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byBjb25m
dGVzdC5kaXIKKyAgICBheF9jdl9kZWJ1Zz0ieSIKIAogZmkKLSAgaWYgdGVzdCAiJHthY19jdl9w
YXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSRhY19jdl9wYXRoX2lu
c3RhbGwKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxs
IHNjcmlwdC4gIERvbid0IGNhY2hlIGEKLSAgICAjIHZhbHVlIGZvciBJTlNUQUxMIHdpdGhpbiBh
IHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBw
YWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92
ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCi0gICAgSU5TVEFMTD0kYWNf
aW5zdGFsbF9zaAotICBmaQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiAkSU5TVEFMTCIgPiY1Ci0kYXNfZWNobyAiJElOU1RBTEwiID4mNjsgfQor
ZGVidWc9JGF4X2N2X2RlYnVnCiAKLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlz
aGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9z
ZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFM
TF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCiAKLXRlc3QgLXogIiRJ
TlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCiAKLXRlc3QgLXog
IiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCiAKLSMg
RXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicGVybCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0g
bmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcGVybDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQot
JGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIk
e2FjX2N2X3BhdGhfUEVSTCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNo
ZWQpICIgPiY2Ci1lbHNlCi0gIGNhc2UgJFBFUkwgaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0g
IGFjX2N2X3BhdGhfUEVSTD0iJFBFUkwiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0
IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhf
U0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0g
IHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcn
ICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8k
YWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19l
eGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX1BFUkw9IiRhc19kaXIvJGFjX3dvcmQk
YWNfZXhlY19leHQiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
Zm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBm
aQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCiAKLSAgdGVzdCAteiAiJGFjX2N2X3Bh
dGhfUEVSTCIgJiYgYWNfY3ZfcGF0aF9QRVJMPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1QRVJMPSRh
Y19jdl9wYXRoX1BFUkwKLWlmIHRlc3QgLW4gIiRQRVJMIjsgdGhlbgotICB7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBFUkwiID4mNQotJGFzX2VjaG8g
IiRQRVJMIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQogCiAKLWlm
IHRlc3QgeCIke1BFUkx9IiA9PSB4Im5vIgotdGhlbgotICAgIGFzX2ZuX2Vycm9yICQ/ICJVbmFi
bGUgdG8gZmluZCBwZXJsLCBwbGVhc2UgaW5zdGFsbCBwZXJsIiAiJExJTkVOTyIgNQotZmkKLWlm
IHRlc3QgIngkeGFwaSIgPSAieHkiOyB0aGVuIDoKIAotICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qg
d29yZCBvZiAiY3VybC1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBh
cmdzLgotc2V0IGR1bW15IGN1cmwtY29uZmlnOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNf
ZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNf
Y3ZfcGF0aF9DVVJMK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkg
IiA+JjYKLWVsc2UKLSAgY2FzZSAkQ1VSTCBpbgotICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNf
Y3ZfcGF0aF9DVVJMPSIkQ1VSTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0
aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBB
UkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKK2ZvciBjZmxhZyBpbiAkUFJFUEVORF9JTkNMVURF
UwogZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9
LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBk
bwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190
ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3Zf
cGF0aF9DVVJMPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhl
Y19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKKyAgICBQUkVQRU5EX0NGTEFHUys9IiAtSSRj
ZmxhZyIKIGRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUworZm9yIGxkZmxhZyBpbiAkUFJF
UEVORF9MSUIKK2RvCisgICAgUFJFUEVORF9MREZMQUdTKz0iIC1MJGxkZmxhZyIKK2RvbmUKK2Zv
ciBjZmxhZyBpbiAkQVBQRU5EX0lOQ0xVREVTCitkbworICAgIEFQUEVORF9DRkxBR1MrPSIgLUkk
Y2ZsYWciCitkb25lCitmb3IgbGRmbGFnIGluICRBUFBFTkRfTElCCitkbworICAgIEFQUEVORF9M
REZMQUdTKz0iIC1MJGxkZmxhZyIKK2RvbmUKK0NGTEFHUz0iJFBSRVBFTkRfQ0ZMQUdTICRDRkxB
R1MgJEFQUEVORF9DRkxBR1MiCitMREZMQUdTPSIkUFJFUEVORF9MREZMQUdTICRMREZMQUdTICRB
UFBFTkRfTERGTEFHUyIKIAotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9DVVJMIiAmJiBhY19jdl9w
YXRoX0NVUkw9Im5vIgotICA7OwotZXNhYwotZmkKLUNVUkw9JGFjX2N2X3BhdGhfQ1VSTAotaWYg
dGVzdCAtbiAiJENVUkwiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogcmVzdWx0OiAkQ1VSTCIgPiY1Ci0kYXNfZWNobyAiJENVUkwiID4mNjsgfQotZWxz
ZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8i
ID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCiAKIAotaWYgdGVzdCB4IiR7Q1VSTH0iID09
IHgibm8iCi10aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5kIGN1cmwtY29u
ZmlnLCBwbGVhc2UgaW5zdGFsbCBjdXJsLWNvbmZpZyIgIiRMSU5FTk8iIDUKLWZpCi0gICAgIyBF
eHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4bWwyLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHBy
b2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeG1sMi1jb25maWc7IGFjX3dvcmQ9JDIK
LXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRh
Y193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsg
fQotaWYgdGVzdCAiJHthY19jdl9wYXRoX1hNTCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19l
Y2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhc2UgJFhNTCBpbgotICBbXFwvXSogfCA/
OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9YTUw9IiRYTUwiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRl
IHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJ
RlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3Nh
dmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNf
ZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAi
JGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNf
d29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX1hNTD0iJGFzX2Rpci8k
YWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVh
ayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKIAotICB0ZXN0IC16ICIk
YWNfY3ZfcGF0aF9YTUwiICYmIGFjX2N2X3BhdGhfWE1MPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1Y
TUw9JGFjX2N2X3BhdGhfWE1MCi1pZiB0ZXN0IC1uICIkWE1MIjsgdGhlbgotICB7ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFhNTCIgPiY1Ci0kYXNfZWNo
byAiJFhNTCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKIAogCi1p
ZiB0ZXN0IHgiJHtYTUx9IiA9PSB4Im5vIgotdGhlbgotICAgIGFzX2ZuX2Vycm9yICQ/ICJVbmFi
bGUgdG8gZmluZCB4bWwyLWNvbmZpZywgcGxlYXNlIGluc3RhbGwgeG1sMi1jb25maWciICIkTElO
RU5PIiA1Ci1maQogCi1maQotaWYgdGVzdCAieCRvY2FtbHRvb2xzIiA9ICJ4eSI7IHRoZW4gOgog
Ci0gICAgICAjIGNoZWNraW5nIGZvciBvY2FtbGMKLSAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJl
Zml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVm
aXh9b2NhbWxjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBk
dW1teSAke2FjX3Rvb2xfcHJlZml4fW9jYW1sYzsgYWNfd29yZD0kMgorCisKKworCisKKworIyBD
aGVja3MgZm9yIHByb2dyYW1zLgorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCith
Y19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUn
CithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRM
REZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19j
dl9jX2NvbXBpbGVyX2dudQoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAj
IEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Z2NjIiwgc28gaXQg
Y2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJl
Zml4fWdjYzsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9y
ICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfT0NBTUxDK3NldH0i
ID0gc2V0OyB0aGVuIDoKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhl
biA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGlmIHRlc3QgLW4gIiRP
Q0FNTEMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfT0NBTUxDPSIkT0NBTUxDIiAjIExldCB0aGUgdXNl
ciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9w
cm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgogZWxzZQogYXNf
c2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgogZm9yIGFzX2RpciBpbiAkUEFUSApA
QCAtNTA5OCw3ICsyNTY4LDcgQEAgZG8KICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4K
ICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8K
ICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVz
dF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3By
b2dfT0NBTUxDPSIke2FjX3Rvb2xfcHJlZml4fW9jYW1sYyIKKyAgICBhY19jdl9wcm9nX0NDPSIk
e2FjX3Rvb2xfcHJlZml4fWdjYyIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVh
ayAyCiAgIGZpCkBAIC01MTA4LDEwICsyNTc4LDEwIEBAIElGUz0kYXNfc2F2ZV9JRlMKIAogZmkK
IGZpCi1PQ0FNTEM9JGFjX2N2X3Byb2dfT0NBTUxDCi1pZiB0ZXN0IC1uICIkT0NBTUxDIjsgdGhl
bgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9D
QU1MQyIgPiY1Ci0kYXNfZWNobyAiJE9DQU1MQyIgPiY2OyB9CitDQz0kYWNfY3ZfcHJvZ19DQwor
aWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQogZWxzZQog
ICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4m
NQogJGFzX2VjaG8gIm5vIiA+JjY7IH0KQEAgLTUxMTksMTcgKzI1ODksMTcgQEAgZmkKIAogCiBm
aQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT0NBTUxDIjsgdGhlbgotICBhY19jdF9PQ0FNTEM9
JE9DQU1MQwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm9jYW1sYyIsIHNvIGl0IGNh
biBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgb2NhbWxjOyBhY193b3Jk
PSQyCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisg
ICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3Jh
bSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUK
ICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAi
JHthY19jdl9wcm9nX2FjX2N0X09DQU1MQytzZXR9IiA9IHNldDsgdGhlbiA6CitpZiB0ZXN0ICIk
e2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIo
Y2FjaGVkKSAiID4mNgogZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxDIjsgdGhlbgot
ICBhY19jdl9wcm9nX2FjX2N0X09DQU1MQz0iJGFjX2N0X09DQU1MQyIgIyBMZXQgdGhlIHVzZXIg
b3ZlcnJpZGUgdGhlIHRlc3QuCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNf
Y3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUg
dGVzdC4KIGVsc2UKIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKIGZvciBh
c19kaXIgaW4gJFBBVEgKQEAgLTUxMzgsNyArMjYwOCw3IEBAIGRvCiAgIHRlc3QgLXogIiRhc19k
aXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxl
X2V4dGVuc2lvbnM7IGRvCiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVj
X2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRo
ZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X09DQU1MQz0ib2NhbWxjIgorICAgIGFjX2N2X3Byb2df
YWNfY3RfQ0M9ImdjYyIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAg
IGZpCkBAIC01MTQ4LDE3ICsyNjE4LDE3IEBAIElGUz0kYXNfc2F2ZV9JRlMKIAogZmkKIGZpCi1h
Y19jdF9PQ0FNTEM9JGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxDCi1pZiB0ZXN0IC1uICIkYWNfY3Rf
T0NBTUxDIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IHJlc3VsdDogJGFjX2N0X09DQU1MQyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X09DQU1MQyIgPiY2
OyB9CithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0ND
IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJGFjX2N0X0NDIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQogZWxzZQogICB7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQog
JGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCiAKLSAgaWYgdGVzdCAieCRhY19jdF9PQ0FNTEMiID0g
eDsgdGhlbgotICAgIE9DQU1MQz0ibm8iCisgIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhl
bgorICAgIENDPSIiCiAgIGVsc2UKICAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xf
d2FybmVkIGluCiB5ZXM6KQpAQCAtNTE2Niw0MSArMjYzNiwyMyBAQCB5ZXM6KQogJGFzX2VjaG8g
IiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9z
dCB0cmlwbGV0IiA+JjI7fQogYWNfdG9vbF93YXJuZWQ9eWVzIDs7CiBlc2FjCi0gICAgT0NBTUxD
PSRhY19jdF9PQ0FNTEMKKyAgICBDQz0kYWNfY3RfQ0MKICAgZmkKIGVsc2UKLSAgT0NBTUxDPSIk
YWNfY3ZfcHJvZ19PQ0FNTEMiCisgIENDPSIkYWNfY3ZfcHJvZ19DQyIKIGZpCiAKLQotICBpZiB0
ZXN0ICIkT0NBTUxDIiAhPSAibm8iOyB0aGVuCi0gICAgIE9DQU1MVkVSU0lPTj1gJE9DQU1MQyAt
diB8IHNlZCAtbiAtZSAnc3wuKnZlcnNpb24qICpcKC4qXCkkfFwxfHAnYAotICAgICB7ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogT0NhbWwgdmVyc2lvbiBp
cyAkT0NBTUxWRVJTSU9OIiA+JjUKLSRhc19lY2hvICJPQ2FtbCB2ZXJzaW9uIGlzICRPQ0FNTFZF
UlNJT04iID4mNjsgfQotICAgICAjIElmIE9DQU1MTElCIGlzIHNldCwgdXNlIGl0Ci0gICAgIGlm
IHRlc3QgIiRPQ0FNTExJQiIgPSAiIjsgdGhlbgotICAgICAgICBPQ0FNTExJQj1gJE9DQU1MQyAt
d2hlcmUgMj4vZGV2L251bGwgfHwgJE9DQU1MQyAtdnx0YWlsIC0xfGN1dCAtZCAnICcgLWYgNGAK
LSAgICAgZWxzZQotICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IHJlc3VsdDogT0NBTUxMSUIgcHJldmlvdXNseSBzZXQ7IHByZXNlcnZpbmcgaXQuIiA+JjUK
LSRhc19lY2hvICJPQ0FNTExJQiBwcmV2aW91c2x5IHNldDsgcHJlc2VydmluZyBpdC4iID4mNjsg
fQotICAgICBmaQotICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IHJlc3VsdDogT0NhbWwgbGlicmFyeSBwYXRoIGlzICRPQ0FNTExJQiIgPiY1Ci0kYXNfZWNobyAi
T0NhbWwgbGlicmFyeSBwYXRoIGlzICRPQ0FNTExJQiIgPiY2OyB9Ci0KLQotCi0KLSAgICAgIyBj
aGVja2luZyBmb3Igb2NhbWxvcHQKLSAgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4Ijsg
dGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2Nh
bWxvcHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15
ICR7YWNfdG9vbF9wcmVmaXh9b2NhbWxvcHQ7IGFjX3dvcmQ9JDIKK2lmIHRlc3QgLXogIiRDQyI7
IHRoZW4KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAg
IyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQg
Y2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJl
Zml4fWNjOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3Ig
JGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19PQ0FNTE9QVCtzZXR9
IiA9IHNldDsgdGhlbiA6CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRo
ZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBpZiB0ZXN0IC1uICIk
T0NBTUxPUFQiOyB0aGVuCi0gIGFjX2N2X3Byb2dfT0NBTUxPUFQ9IiRPQ0FNTE9QVCIgIyBMZXQg
dGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAg
YWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KIGVs
c2UKIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKIGZvciBhc19kaXIgaW4g
JFBBVEgKQEAgLTUyMDksNyArMjY2MSw3IEBAIGRvCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFz
X2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lv
bnM7IGRvCiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYg
JGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBh
Y19jdl9wcm9nX09DQU1MT1BUPSIke2FjX3Rvb2xfcHJlZml4fW9jYW1sb3B0IgorICAgIGFjX2N2
X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1
CiAgICAgYnJlYWsgMgogICBmaQpAQCAtNTIxOSwyOSArMjY3MSwzMCBAQCBJRlM9JGFzX3NhdmVf
SUZTCiAKIGZpCiBmaQotT0NBTUxPUFQ9JGFjX2N2X3Byb2dfT0NBTUxPUFQKLWlmIHRlc3QgLW4g
IiRPQ0FNTE9QVCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiByZXN1bHQ6ICRPQ0FNTE9QVCIgPiY1Ci0kYXNfZWNobyAiJE9DQU1MT1BUIiA+JjY7IH0K
K0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8g
IiRDQyIgPiY2OyB9CiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiBubyIgPiY1CiAkYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAogCisgIGZp
CiBmaQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT0NBTUxPUFQiOyB0aGVuCi0gIGFjX2N0X09D
QU1MT1BUPSRPQ0FNTE9QVAotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm9jYW1sb3B0
Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBvY2Ft
bG9wdDsgYWNfd29yZD0kMgoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhl
IGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJn
cy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hl
Y2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNf
Y3RfT0NBTUxPUFQrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0ND
K3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UK
LSAgaWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MT1BUIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0
X09DQU1MT1BUPSIkYWNfY3RfT0NBTUxPUFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0
ZXN0LgorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBM
ZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCiBlbHNlCisgIGFjX3Byb2dfcmVqZWN0ZWQ9
bm8KIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKIGZvciBhc19kaXIgaW4g
JFBBVEgKIGRvCkBAIC01MjQ5LDcgKzI3MDIsMTEgQEAgZG8KICAgdGVzdCAteiAiJGFzX2RpciIg
JiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0
ZW5zaW9uczsgZG8KICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0
IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgot
ICAgIGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxPUFQ9Im9jYW1sb3B0IgorICAgIGlmIHRlc3QgIiRh
c19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAg
IGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisgICAgICAgY29udGludWUKKyAgICAgZmkKKyAgICBhY19j
dl9wcm9nX0NDPSJjYyIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAg
IGZpCkBAIC01MjU3LDYwICsyNzE0LDQ0IEBAIGRvbmUKICAgZG9uZQogSUZTPSRhc19zYXZlX0lG
UwogCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQg
YSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0
IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgIT0gMDsgdGhlbgor
ICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgor
ICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2ls
bCBiZSBjaG9zZW4KKyAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFt
ZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9
IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRAIgorICBmaQogZmkKIGZpCi1hY19jdF9PQ0FNTE9Q
VD0kYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTE9QVAotaWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MT1BU
IjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJGFjX2N0X09DQU1MT1BUIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfT0NBTUxPUFQiID4mNjsg
fQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFz
X2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFz
X2VjaG8gIiRDQyIgPiY2OyB9CiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiAkYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAot
ICBpZiB0ZXN0ICJ4JGFjX2N0X09DQU1MT1BUIiA9IHg7IHRoZW4KLSAgICBPQ0FNTE9QVD0ibm8i
Ci0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15
ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1
c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFz
X2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdp
dGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAg
T0NBTUxPUFQ9JGFjX2N0X09DQU1MT1BUCi0gIGZpCi1lbHNlCi0gIE9DQU1MT1BUPSIkYWNfY3Zf
cHJvZ19PQ0FNTE9QVCIKLWZpCi0KLSAgICAgT0NBTUxCRVNUPWJ5dGUKLSAgICAgaWYgdGVzdCAi
JE9DQU1MT1BUIiA9ICJubyI7IHRoZW4KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IFdBUk5JTkc6IENhbm5vdCBmaW5kIG9jYW1sb3B0OyBieXRlY29kZSBjb21waWxh
dGlvbiBvbmx5LiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBDYW5ub3QgZmluZCBv
Y2FtbG9wdDsgYnl0ZWNvZGUgY29tcGlsYXRpb24gb25seS4iID4mMjt9Ci0gICAgIGVsc2UKLQlU
TVBWRVJTSU9OPWAkT0NBTUxPUFQgLXYgfCBzZWQgLW4gLWUgJ3N8Lip2ZXJzaW9uKiAqXCguKlwp
JHxcMXxwJyBgCi0JaWYgdGVzdCAiJFRNUFZFUlNJT04iICE9ICIkT0NBTUxWRVJTSU9OIiA7IHRo
ZW4KLQkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6
IHZlcnNpb25zIGRpZmZlcnMgZnJvbSBvY2FtbGM7IG9jYW1sb3B0IGRpc2NhcmRlZC4iID4mNQot
JGFzX2VjaG8gInZlcnNpb25zIGRpZmZlcnMgZnJvbSBvY2FtbGM7IG9jYW1sb3B0IGRpc2NhcmRl
ZC4iID4mNjsgfQotCSAgICBPQ0FNTE9QVD1ubwotCWVsc2UKLQkgICAgT0NBTUxCRVNUPW9wdAot
CWZpCi0gICAgIGZpCi0KIAotCi0gICAgICMgY2hlY2tpbmcgZm9yIG9jYW1sYy5vcHQKLSAgICAg
aWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0
IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxjLm9wdCIsIHNvIGl0IGNhbiBiZSBhIHBy
b2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vY2FtbGMu
b3B0OyBhY193b3JkPSQyCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBpZiB0ZXN0IC1u
ICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGNsLmV4ZQorICBkbwor
ICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ci
LCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190
b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJj
aGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19P
Q0FNTENET1RPUFQrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0ND
K3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UK
LSAgaWYgdGVzdCAtbiAiJE9DQU1MQ0RPVE9QVCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19PQ0FNTENE
T1RPUFQ9IiRPQ0FNTENET1RPUFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0Lgor
ICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhl
IHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCiBlbHNlCiBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBB
VEhfU0VQQVJBVE9SCiBmb3IgYXNfZGlyIGluICRQQVRICkBAIC01MzE5LDcgKzI3NjAsNyBAQCBk
bwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBp
biAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwogICBpZiB7IHRlc3QgLWYgIiRhc19k
aXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQk
YWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19PQ0FNTENET1RPUFQ9IiR7YWNf
dG9vbF9wcmVmaXh9b2NhbWxjLm9wdCIKKyAgICBhY19jdl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVm
aXgkYWNfcHJvZyIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBm
b3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAgIGZp
CkBAIC01MzI5LDQzOCArMjc3MCw3MTUgQEAgSUZTPSRhc19zYXZlX0lGUwogCiBmaQogZmkKLU9D
QU1MQ0RPVE9QVD0kYWNfY3ZfcHJvZ19PQ0FNTENET1RPUFQKLWlmIHRlc3QgLW4gIiRPQ0FNTENE
T1RPUFQiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiAkT0NBTUxDRE9UT1BUIiA+JjUKLSRhc19lY2hvICIkT0NBTUxDRE9UT1BUIiA+JjY7
IH0KK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2Vj
aG8gIiRDQyIgPiY2OyB9CiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogcmVzdWx0OiBubyIgPiY1CiAkYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAogCisg
ICAgdGVzdCAtbiAiJENDIiAmJiBicmVhaworICBkb25lCiBmaQotaWYgdGVzdCAteiAiJGFjX2N2
X3Byb2dfT0NBTUxDRE9UT1BUIjsgdGhlbgotICBhY19jdF9PQ0FNTENET1RPUFQ9JE9DQU1MQ0RP
VE9QVAotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm9jYW1sYy5vcHQiLCBzbyBpdCBj
YW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG9jYW1sYy5vcHQ7IGFj
X3dvcmQ9JDIKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgIGZvciBh
Y19wcm9nIGluIGNsLmV4ZQorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNf
cHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkg
JGFjX3Byb2c7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZv
ciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X09DQU1M
Q0RPVE9QVCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3Rf
Q0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxz
ZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxDRE9UT1BUIjsgdGhlbgotICBhY19jdl9wcm9n
X2FjX2N0X09DQU1MQ0RPVE9QVD0iJGFjX2N0X09DQU1MQ0RPVE9QVCIgIyBMZXQgdGhlIHVzZXIg
b3ZlcnJpZGUgdGhlIHRlc3QuCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNf
Y3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUg
dGVzdC4KIGVsc2UKIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKIGZvciBh
c19kaXIgaW4gJFBBVEgKIGRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2Rp
ciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVf
ZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNf
ZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhl
bgotICAgIGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxDRE9UT1BUPSJvY2FtbGMub3B0IgotICAgICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dv
cmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKKyAgSUZTPSRhc19zYXZlX0lG
UworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBp
biAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19k
aXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQk
YWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ci
CisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rp
ci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBk
b25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNf
Y3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CiskYXNfZWNobyAi
JGFjX2N0X0NDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisK
KyAgdGVzdCAtbiAiJGFjX2N0X0NDIiAmJiBicmVhaworZG9uZQorCisgIGlmIHRlc3QgIngkYWNf
Y3RfQ0MiID0geDsgdGhlbgorICAgIENDPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21w
aWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQg
d2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcg
Y3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9v
bF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ0M9JGFjX2N0X0NDCisgIGZpCitmaQorCitmaQor
CisKK3Rlc3QgLXogIiRDQyIgJiYgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJv
cjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBD
IGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0
YWlscyIgIiRMSU5FTk8iIDUgOyB9CisKKyMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0
IHRoZSBjb21waWxlci4KKyRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNo
ZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQorc2V0IFggJGFjX2NvbXBpbGUKK2Fj
X2NvbXBpbGVyPSQyCitmb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247
IGRvCisgIHsgeyBhY190cnk9IiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIKK2Nhc2UgIigo
JGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7
CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJc
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIk
YWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1
IikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3Qu
ZXJyOyB0aGVuCisgICAgc2VkICcxMGFcCisuLi4gcmVzdCBvZiBzdGRlcnIgb3V0cHV0IGRlbGV0
ZWQgLi4uCisgICAgICAgICAxMHEnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0
IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVy
cgorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3Rh
dHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorZG9uZQorCitjYXQgY29uZmRlZnMu
aCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisK
K2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2FjX2NsZWFu
X2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2Zp
bGVzIGEub3V0IGEub3V0LmRTWU0gYS5leGUgYi5vdXQiCisjIFRyeSB0byBjcmVhdGUgYW4gZXhl
Y3V0YWJsZSB3aXRob3V0IC1vIGZpcnN0LCBkaXNyZWdhcmQgYS5vdXQuCisjIEl0IHdpbGwgaGVs
cCB1cyBkaWFnbm9zZSBicm9rZW4gY29tcGlsZXJzLCBhbmQgZmluZGluZyBvdXQgYW4gaW50dWl0
aW9uCisjIG9mIGV4ZWV4dC4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3JrcyIgPiY1CiskYXNfZWNob19u
ICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzLi4uICIgPiY2OyB9CithY19s
aW5rX2RlZmF1bHQ9YCRhc19lY2hvICIkYWNfbGluayIgfCBzZWQgJ3MvIC1vICpjb25mdGVzdFte
IF0qLy8nYAorCisjIFRoZSBwb3NzaWJsZSBvdXRwdXQgZmlsZXM6CithY19maWxlcz0iYS5vdXQg
Y29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGEuZXhlIGFfb3V0LmV4ZSBiLm91dCBjb25mdGVzdC4qIgor
CithY19ybWZpbGVzPQorZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzCitkbworICBjYXNlICRhY19m
aWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAq
LnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5v
YmogKSA7OworICAgICogKSBhY19ybWZpbGVzPSIkYWNfcm1maWxlcyAkYWNfZmlsZSI7OworICBl
c2FjCitkb25lCitybSAtZiAkYWNfcm1maWxlcworCitpZiB7IHsgYWNfdHJ5PSIkYWNfbGlua19k
ZWZhdWx0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3Ry
eV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFs
IGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNo
b1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGlua19k
ZWZhdWx0IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp
bmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9
IDA7IH07IHRoZW4gOgorICAjIEF1dG9jb25mLTIuMTMgY291bGQgc2V0IHRoZSBhY19jdl9leGVl
eHQgdmFyaWFibGUgdG8gYG5vJy4KKyMgU28gaWdub3JlIGEgdmFsdWUgb2YgYG5vJywgb3RoZXJ3
aXNlIHRoaXMgd291bGQgbGVhZCB0byBgRVhFRVhUID0gbm8nCisjIGluIGEgTWFrZWZpbGUuICBX
ZSBzaG91bGQgbm90IG92ZXJyaWRlIGFjX2N2X2V4ZWV4dCBpZiBpdCB3YXMgY2FjaGVkLAorIyBz
byB0aGF0IHRoZSB1c2VyIGNhbiBzaG9ydC1jaXJjdWl0IHRoaXMgdGVzdCBmb3IgY29tcGlsZXJz
IHVua25vd24gdG8KKyMgQXV0b2NvbmYuCitmb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMgJycKK2Rv
CisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQorICBjYXNlICRhY19maWxlIGluCisg
ICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAq
LmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKQorCTs7
CisgICAgW2FiXS5vdXQgKQorCSMgV2UgZm91bmQgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSwgYnV0
IGV4ZWV4dD0nJyBpcyBtb3N0CisJIyBjZXJ0YWlubHkgcmlnaHQuCisJYnJlYWs7OworICAgICou
KiApCisJaWYgdGVzdCAiJHthY19jdl9leGVleHQrc2V0fSIgPSBzZXQgJiYgdGVzdCAiJGFjX2N2
X2V4ZWV4dCIgIT0gbm87CisJdGhlbiA6OyBlbHNlCisJICAgYWNfY3ZfZXhlZXh0PWBleHByICIk
YWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCisJZmkKKwkjIFdlIHNldCBhY19jdl9leGVleHQg
aGVyZSBiZWNhdXNlIHRoZSBsYXRlciB0ZXN0IGZvciBpdCBpcyBub3QKKwkjIHNhZmU6IGNyb3Nz
IGNvbXBpbGVycyBtYXkgbm90IGFkZCB0aGUgc3VmZml4IGlmIGdpdmVuIGFuIGAtbycKKwkjIGFy
Z3VtZW50LCBzbyB3ZSBtYXkgbmVlZCB0byBrbm93IGl0IGF0IHRoYXQgcG9pbnQgYWxyZWFkeS4K
KwkjIEV2ZW4gaWYgdGhpcyBzZWN0aW9uIGxvb2tzIGNydWZ0eTogaXQgaGFzIHRoZSBhZHZhbnRh
Z2Ugb2YKKwkjIGFjdHVhbGx5IHdvcmtpbmcuCisJYnJlYWs7OworICAgICogKQorCWJyZWFrOzsK
KyAgZXNhYwogZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCit0ZXN0ICIkYWNfY3ZfZXhl
ZXh0IiA9IG5vICYmIGFjX2N2X2V4ZWV4dD0KIAotZmkKLWZpCi1hY19jdF9PQ0FNTENET1RPUFQ9
JGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxDRE9UT1BUCi1pZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxD
RE9UT1BUIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IHJlc3VsdDogJGFjX2N0X09DQU1MQ0RPVE9QVCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X09DQU1M
Q0RPVE9QVCIgPiY2OyB9CiBlbHNlCisgIGFjX2ZpbGU9JycKK2ZpCitpZiB0ZXN0IC16ICIkYWNf
ZmlsZSI7IHRoZW4gOgogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IHJlc3VsdDogbm8iID4mNQogJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCiskYXNfZWNobyAiJGFz
X21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFj
X2V4dCA+JjUKIAotICBpZiB0ZXN0ICJ4JGFjX2N0X09DQU1MQ0RPVE9QVCIgPSB4OyB0aGVuCi0g
ICAgT0NBTUxDRE9UT1BUPSJubyIKLSAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzok
YWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhv
c3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0
b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5l
ZD15ZXMgOzsKLWVzYWMKLSAgICBPQ0FNTENET1RPUFQ9JGFjX2N0X09DQU1MQ0RPVE9QVAotICBm
aQoreyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBc
YCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoi
ID4mMjt9Cithc19mbl9lcnJvciA3NyAiQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFi
bGVzCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNSA7IH0K
IGVsc2UKLSAgT0NBTUxDRE9UT1BUPSIkYWNfY3ZfcHJvZ19PQ0FNTENET1RPUFQiCisgIHsgJGFz
X2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFz
X2VjaG8gInllcyIgPiY2OyB9CiBmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUi
ID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQg
ZmlsZSBuYW1lLi4uICIgPiY2OyB9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IHJlc3VsdDogJGFjX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhY19maWxlIiA+JjY7IH0K
K2FjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0CiAKLSAgICAgaWYgdGVzdCAiJE9DQU1MQ0RPVE9QVCIg
IT0gIm5vIjsgdGhlbgotCVRNUFZFUlNJT049YCRPQ0FNTENET1RPUFQgLXYgfCBzZWQgLW4gLWUg
J3N8Lip2ZXJzaW9uKiAqXCguKlwpJHxcMXxwJyBgCi0JaWYgdGVzdCAiJFRNUFZFUlNJT04iICE9
ICIkT0NBTUxWRVJTSU9OIiA7IHRoZW4KLQkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiByZXN1bHQ6IHZlcnNpb25zIGRpZmZlcnMgZnJvbSBvY2FtbGM7IG9jYW1s
Yy5vcHQgZGlzY2FyZGVkLiIgPiY1Ci0kYXNfZWNobyAidmVyc2lvbnMgZGlmZmVycyBmcm9tIG9j
YW1sYzsgb2NhbWxjLm9wdCBkaXNjYXJkZWQuIiA+JjY7IH0KLQllbHNlCi0JICAgIE9DQU1MQz0k
T0NBTUxDRE9UT1BUCi0JZmkKLSAgICAgZmkKLQotICAgICAjIGNoZWNraW5nIGZvciBvY2FtbG9w
dC5vcHQKLSAgICAgaWYgdGVzdCAiJE9DQU1MT1BUIiAhPSAibm8iIDsgdGhlbgotCWlmIHRlc3Qg
LW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9m
ICIke2FjX3Rvb2xfcHJlZml4fW9jYW1sb3B0Lm9wdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0g
bmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vY2FtbG9wdC5vcHQ7
IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hl
Y2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29y
ZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX09DQU1MT1BURE9UT1BUK3NldH0i
ID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYg
dGVzdCAtbiAiJE9DQU1MT1BURE9UT1BUIjsgdGhlbgotICBhY19jdl9wcm9nX09DQU1MT1BURE9U
T1BUPSIkT0NBTUxPUFRET1RPUFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0Lgot
ZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBp
biAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBh
c19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNp
b25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYm
ICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAg
YWNfY3ZfcHJvZ19PQ0FNTE9QVERPVE9QVD0iJHthY190b29sX3ByZWZpeH1vY2FtbG9wdC5vcHQi
Ci0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rp
ci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQorcm0gLWYgLXIg
YS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBjb25mdGVzdCRhY19jdl9leGVleHQgYi5vdXQKK2FjX2Ns
ZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMiID4mNQor
JGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcy4uLiAiID4mNjsg
fQoraWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiog
fCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0k
YWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUK
KyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3Qg
JGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgorICAjIElmIGJvdGggYGNvbmZ0ZXN0LmV4ZScgYW5k
IGBjb25mdGVzdCcgYXJlIGBwcmVzZW50JyAod2VsbCwgb2JzZXJ2YWJsZSkKKyMgY2F0Y2ggYGNv
bmZ0ZXN0LmV4ZScuICBGb3IgaW5zdGFuY2Ugd2l0aCBDeWd3aW4sIGBscyBjb25mdGVzdCcgd2ls
bAorIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxl
IGl0IHdvbid0IHdpdGgKKyMgYHJtJy4KK2ZvciBhY19maWxlIGluIGNvbmZ0ZXN0LmV4ZSBjb25m
dGVzdCBjb25mdGVzdC4qOyBkbworICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKyAg
Y2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8
ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8
ICoubyB8ICoub2JqICkgOzsKKyAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxl
IiA6ICdbXi5dKlwoXC4uKlwpJ2AKKwkgIGJyZWFrOzsKKyAgICAqICkgYnJlYWs7OworICBlc2Fj
CiBkb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1PQ0FNTE9QVERPVE9Q
VD0kYWNfY3ZfcHJvZ19PQ0FNTE9QVERPVE9QVAotaWYgdGVzdCAtbiAiJE9DQU1MT1BURE9UT1BU
IjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJE9DQU1MT1BURE9UT1BUIiA+JjUKLSRhc19lY2hvICIkT0NBTUxPUFRET1RPUFQiID4mNjsg
fQogZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNo
byAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAi
Y2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQg
bGluaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUgOyB9
CiBmaQorcm0gLWYgY29uZnRlc3QgY29uZnRlc3QkYWNfY3ZfZXhlZXh0Cit7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2V4ZWV4dCIgPiY1Cisk
YXNfZWNobyAiJGFjX2N2X2V4ZWV4dCIgPiY2OyB9CiAKK3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQK
K0VYRUVYVD0kYWNfY3ZfZXhlZXh0CithY19leGVleHQ9JEVYRUVYVAorY2F0IGNvbmZkZWZzLmgg
LSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lu
Y2x1ZGUgPHN0ZGlvLmg+CitpbnQKK21haW4gKCkKK3sKK0ZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0
ZXN0Lm91dCIsICJ3Iik7CisgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOwog
CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5f
ZmlsZXMgY29uZnRlc3Qub3V0IgorIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBl
eGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKKyMgdGhlIGNvbXBpbGVyIGlz
IGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp
bmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIiA+
JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZy4u
LiAiID4mNjsgfQoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0geWVzOyB0aGVuCisgIHsg
eyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8
ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7
Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFs
ICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0
dXMgPSAwOyB9CisgIGlmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCcKKyAgeyB7
IGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1c
JGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlf
ZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRh
c19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAg
YWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwk
PyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuCisg
ICAgY3Jvc3NfY29tcGlsaW5nPW5vCisgIGVsc2UKKyAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGls
aW5nIiA9IG1heWJlOyB0aGVuCisJY3Jvc3NfY29tcGlsaW5nPXllcworICAgIGVsc2UKKwl7IHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3
ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30K
K2FzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCitJZiB5b3Ug
bWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KK1NlZSBcYGNvbmZpZy5sb2cn
IGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsgfQorICAgIGZpCisgIGZpCiBmaQotaWYg
dGVzdCAteiAiJGFjX2N2X3Byb2dfT0NBTUxPUFRET1RPUFQiOyB0aGVuCi0gIGFjX2N0X09DQU1M
T1BURE9UT1BUPSRPQ0FNTE9QVERPVE9QVAotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2Yg
Im9jYW1sb3B0Lm9wdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1z
ZXQgZHVtbXkgb2NhbWxvcHQub3B0OyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19u
ICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJv
Z19hY19jdF9PQ0FNTE9QVERPVE9QVCtzZXR9IiA9IHNldDsgdGhlbiA6Cit7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGNyb3NzX2NvbXBpbGluZyIgPiY1
CiskYXNfZWNobyAiJGNyb3NzX2NvbXBpbGluZyIgPiY2OyB9CisKK3JtIC1mIGNvbmZ0ZXN0LiRh
Y19leHQgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGNvbmZ0ZXN0Lm91dAorYWNfY2xlYW5fZmlsZXM9
JGFjX2NsZWFuX2ZpbGVzX3NhdmUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMiID4mNQorJGFzX2VjaG9f
biAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMuLi4gIiA+JjY7IH0KK2lmIHRl
c3QgIiR7YWNfY3Zfb2JqZXh0K3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNh
Y2hlZCkgIiA+JjYKIGVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MT1BURE9UT1BUIjsg
dGhlbgotICBhY19jdl9wcm9nX2FjX2N0X09DQU1MT1BURE9UT1BUPSIkYWNfY3RfT0NBTUxPUFRE
T1RPUFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9J
RlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAg
SUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZv
ciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7
IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRh
c19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19j
dF9PQ0FNTE9QVERPVE9QVD0ib2NhbWxvcHQub3B0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4m
NQotICAgIGJyZWFrIDIKLSAgZmkKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRl
c3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKwor
ICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9i
agoraWYgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpc
IiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNo
bz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+
JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cisg
IHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgorICBmb3IgYWNfZmlsZSBpbiBjb25mdGVz
dC5vIGNvbmZ0ZXN0Lm9iaiBjb25mdGVzdC4qOyBkbworICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwg
Y29udGludWU7CisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwg
Ki50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5p
bmYgfCAqLmRTWU0gKSA7OworICAgICopIGFjX2N2X29iamV4dD1gZXhwciAiJGFjX2ZpbGUiIDog
Jy4qXC5cKC4qXCknYAorICAgICAgIGJyZWFrOzsKKyAgZXNhYwogZG9uZQotICBkb25lCi1JRlM9
JGFzX3NhdmVfSUZTCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdh
czoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCit7IHsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+
JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2Zu
X2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3Qg
Y29tcGlsZQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUg
OyB9CiBmaQorcm0gLWYgY29uZnRlc3QuJGFjX2N2X29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBm
aQotYWNfY3RfT0NBTUxPUFRET1RPUFQ9JGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxPUFRET1RPUFQK
LWlmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTE9QVERPVE9QVCI7IHRoZW4KLSAgeyAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9PQ0FNTE9QVERPVE9Q
VCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X09DQU1MT1BURE9UT1BUIiA+JjY7IH0KK3sgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+
JjUKKyRhc19lY2hvICIkYWNfY3Zfb2JqZXh0IiA+JjY7IH0KK09CSkVYVD0kYWNfY3Zfb2JqZXh0
CithY19vYmpleHQ9JE9CSkVYVAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4m
NQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNv
bXBpbGVyLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2NfY29tcGlsZXJfZ251K3NldH0i
ID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgeyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRh
c19lY2hvICJubyIgPiY2OyB9Ci1maQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25m
dGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKLSAgaWYgdGVzdCAieCRhY19j
dF9PQ0FNTE9QVERPVE9QVCIgPSB4OyB0aGVuCi0gICAgT0NBTUxPUFRET1RPUFQ9Im5vIgotICBl
bHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikK
LXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcg
Y3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hv
ICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhv
c3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIE9DQU1M
T1BURE9UT1BUPSRhY19jdF9PQ0FNTE9QVERPVE9QVAotICBmaQoraW50CittYWluICgpCit7Cisj
aWZuZGVmIF9fR05VQ19fCisgICAgICAgY2hva2UgbWUKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJu
IDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoK
KyAgYWNfY29tcGlsZXJfZ251PXllcwogZWxzZQotICBPQ0FNTE9QVERPVE9QVD0iJGFjX2N2X3By
b2dfT0NBTUxPUFRET1RPUFQiCisgIGFjX2NvbXBpbGVyX2dudT1ubwogZmkKK3JtIC1mIGNvcmUg
Y29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorYWNfY3Zf
Y19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQogCi0JaWYgdGVzdCAiJE9DQU1MT1BURE9U
T1BUIiAhPSAibm8iOyB0aGVuCi0JICAgVE1QVkVSU0lPTj1gJE9DQU1MT1BURE9UT1BUIC12IHwg
c2VkIC1uIC1lICdzfC4qdmVyc2lvbiogKlwoLipcKSR8XDF8cCcgYAotCSAgIGlmIHRlc3QgIiRU
TVBWRVJTSU9OIiAhPSAiJE9DQU1MVkVSU0lPTiIgOyB0aGVuCi0JICAgICAgeyAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHZlcnNpb24gZGlmZmVycyBmcm9t
IG9jYW1sYzsgb2NhbWxvcHQub3B0IGRpc2NhcmRlZC4iID4mNQotJGFzX2VjaG8gInZlcnNpb24g
ZGlmZmVycyBmcm9tIG9jYW1sYzsgb2NhbWxvcHQub3B0IGRpc2NhcmRlZC4iID4mNjsgfQotCSAg
IGVsc2UKLQkgICAgICBPQ0FNTE9QVD0kT0NBTUxPUFRET1RPUFQKLQkgICBmaQotICAgICAgICBm
aQotICAgICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9jX2Nv
bXBpbGVyX2dudSIgPiY2OyB9CitpZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4K
KyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0
fQorYWNfc2F2ZV9DRkxBR1M9JENGTEFHUworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKKyRhc19lY2hv
X24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KK2lmIHRlc3Qg
IiR7YWNfY3ZfcHJvZ19jY19nK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNh
Y2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9m
bGFnCisgICBhY19jX3dlcnJvcl9mbGFnPXllcworICAgYWNfY3ZfcHJvZ19jY19nPW5vCisgICBD
RkxBR1M9Ii1nIgorICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4
dAorLyogZW5kIGNvbmZkZWZzLmguICAqLwogCitpbnQKK21haW4gKCkKK3sKIAotICBmaQorICA7
CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5P
IjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgQ0ZMQUdTPSIiCisgICAg
ICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29u
ZmRlZnMuaC4gICovCiAKK2ludAorbWFpbiAoKQorewogCisgIDsKKyAgcmV0dXJuIDA7Cit9Citf
QUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKIAotICAjIGNo
ZWNraW5nIGZvciBvY2FtbCB0b3BsZXZlbAotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgi
OyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1v
Y2FtbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkg
JHthY190b29sX3ByZWZpeH1vY2FtbDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9f
biAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3By
b2dfT0NBTUwrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4m
NgotZWxzZQotICBpZiB0ZXN0IC1uICIkT0NBTUwiOyB0aGVuCi0gIGFjX2N2X3Byb2dfT0NBTUw9
IiRPQ0FNTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCiBlbHNlCi1hc19zYXZl
X0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwot
ICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAg
Zm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlm
IHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAi
JGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX09D
QU1MPSIke2FjX3Rvb2xfcHJlZml4fW9jYW1sIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQot
ICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUworICBhY19j
X3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKKwkgQ0ZMQUdTPSItZyIKKwkgY2F0
IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZz
LmguICAqLworCitpbnQKK21haW4gKCkKK3sKIAorICA7CisgIHJldHVybiAwOworfQorX0FDRU9G
CitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2df
Y2NfZz15ZXMKIGZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0
IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1PQ0FNTD0kYWNfY3ZfcHJvZ19PQ0FNTAotaWYgdGVzdCAt
biAiJE9DQU1MIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IHJlc3VsdDogJE9DQU1MIiA+JjUKLSRhc19lY2hvICIkT0NBTUwiID4mNjsgfQotZWxzZQot
ICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4m
NQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0
LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLQotCitybSAtZiBjb3JlIGNvbmZ0ZXN0
LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGFjX2Nfd2Vycm9y
X2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwogZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9n
X09DQU1MIjsgdGhlbgotICBhY19jdF9PQ0FNTD0kT0NBTUwKLSAgIyBFeHRyYWN0IHRoZSBmaXJz
dCB3b3JkIG9mICJvY2FtbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3Mu
Ci1zZXQgZHVtbXkgb2NhbWw7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp
bmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNo
ZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2Fj
X2N0X09DQU1MK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+
JjYKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNf
Y3ZfcHJvZ19jY19nIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KK2lm
IHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSRhY19zYXZlX0NG
TEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAi
JEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFH
Uz0iLWciCisgIGZpCiBlbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTCI7IHRoZW4KLSAg
YWNfY3ZfcHJvZ19hY19jdF9PQ0FNTD0iJGFjX2N0X09DQU1MIiAjIExldCB0aGUgdXNlciBvdmVy
cmlkZSB0aGUgdGVzdC4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9
Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJ
U08gQzg5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2Vw
dCBJU08gQzg5Li4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfYzg5K3NldH0i
ID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLWFzX3Nh
dmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKKyAg
YWNfY3ZfcHJvZ19jY19jODk9bm8KK2FjX3NhdmVfQ0M9JENDCitjYXQgY29uZmRlZnMuaCAtIDw8
X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVk
ZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4K
KyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFy
ZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLworc3RydWN0IGJ1ZiB7IGlu
dCB4OyB9OworRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwg
aW50KTsKK3N0YXRpYyBjaGFyICplIChwLCBpKQorICAgICBjaGFyICoqcDsKKyAgICAgaW50IGk7
Cit7CisgIHJldHVybiBwW2ldOworfQorc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFy
ICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQoreworICBjaGFyICpzOworICB2YV9saXN0IHY7Cisg
IHZhX3N0YXJ0ICh2LHApOworICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOworICB2YV9lbmQg
KHYpOworICByZXR1cm4gczsKK30KKworLyogT1NGIDQuMCBDb21wYXEgY2MgaXMgc29tZSBzb3J0
IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMKKyAgIGZ1bmN0aW9uIHByb3RvdHlw
ZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KKyAg
IFRoZXNlIGRvbid0IHByb3Zva2UgYW4gZXJyb3IgdW5mb3J0dW5hdGVseSwgaW5zdGVhZCBhcmUg
c2lsZW50bHkgdHJlYXRlZAorICAgYXMgJ3gnLiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVy
cm9yLCB1bnRpbCAtc3RkIGlzIGFkZGVkIHRvIGdldAorICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1
cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgorICAgYXJy
YXkgc2l6ZSBhdCBsZWFzdC4gIEl0J3MgbmVjZXNzYXJ5IHRvIHdyaXRlICdceDAwJz09MCB0byBn
ZXQgc29tZXRoaW5nCisgICB0aGF0J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZC4gICovCitpbnQgb3Nm
NF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOworCisvKiBJQk0gQyA2IGZvciBBSVgg
aXMgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdCwgYnV0IGl0IHJlcGxhY2VzIG1hY3JvIHBhcmFtZXRl
cnMKKyAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KKyNkZWZp
bmUgRk9PKHgpICd4JworaW50IHhsYzZfY2NfYXJyYXlbRk9PKGEpID09ICd4JyA/IDEgOiAtMV07
CisKK2ludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOworc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50
IGEpO307CitzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKK2ludCBwYWlybmFtZXMg
KGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50
KSwgaW50LCBpbnQpOworaW50IGFyZ2M7CitjaGFyICoqYXJndjsKK2ludAorbWFpbiAoKQorewor
cmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBh
cmd2WzFdOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfYXJnIGluICcnIC1x
bGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBcCisJLUFlICItQWEgLURfSFBVWF9T
T1VSQ0UiICItWGMgLURfX0VYVEVOU0lPTlNfXyIKIGRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAg
dGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycg
JGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRh
Y193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4
ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfT0NBTUw9Im9jYW1sIgotICAg
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFj
X3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKKyAgQ0M9IiRhY19zYXZl
X0NDICRhY19hcmciCisgIGlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoK
KyAgYWNfY3ZfcHJvZ19jY19jODk9JGFjX2FyZworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJy
IGNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0gInhu
byIgJiYgYnJlYWsKIGRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUworcm0gLWYgY29uZnRl
c3QuJGFjX2V4dAorQ0M9JGFjX3NhdmVfQ0MKIAogZmkKLWZpCi1hY19jdF9PQ0FNTD0kYWNfY3Zf
cHJvZ19hY19jdF9PQ0FNTAotaWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MIjsgdGhlbgotICB7ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09DQU1M
IiA+JjUKLSRhc19lY2hvICIkYWNfY3RfT0NBTUwiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8g
Im5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19jdF9PQ0FNTCIgPSB4OyB0aGVuCi0g
ICAgT0NBTUw9Im5vIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29s
X3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlw
bGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5v
dCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7
OworIyBBQ19DQUNIRV9WQUwKK2Nhc2UgIngkYWNfY3ZfcHJvZ19jY19jODkiIGluCisgIHgpCisg
ICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vbmUg
bmVlZGVkIiA+JjUKKyRhc19lY2hvICJub25lIG5lZWRlZCIgPiY2OyB9IDs7CisgIHhubykKKyAg
ICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogdW5zdXBw
b3J0ZWQiID4mNQorJGFzX2VjaG8gInVuc3VwcG9ydGVkIiA+JjY7IH0gOzsKKyAgKikKKyAgICBD
Qz0iJENDICRhY19jdl9wcm9nX2NjX2M4OSIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKKyRhc19lY2hv
ICIkYWNfY3ZfcHJvZ19jY19jODkiID4mNjsgfSA7OwogZXNhYwotICAgIE9DQU1MPSRhY19jdF9P
Q0FNTAotICBmaQotZWxzZQotICBPQ0FNTD0iJGFjX2N2X3Byb2dfT0NBTUwiCitpZiB0ZXN0ICJ4
JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSB4bm87IHRoZW4gOgorCiBmaQogCithY19leHQ9YworYWNf
Y3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFH
UyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVl
eHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUn
CithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CiAKLSAgIyBjaGVja2luZyBm
b3Igb2NhbWxkZXAKLSAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4
dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxkZXAiLCBzbyBp
dCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9w
cmVmaXh9b2NhbWxkZXA7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNr
aW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX09DQU1M
REVQK3NldH0iID0gc2V0OyB0aGVuIDoKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKSIgPiY1
CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0Up
Li4uICIgPiY2OyB9CitzZXQgeCAke01BS0UtbWFrZX0KK2FjX21ha2U9YCRhc19lY2hvICIkMiIg
fCBzZWQgJ3MvKy9wL2c7IHMvW15hLXpBLVowLTlfXS9fL2cnYAoraWYgZXZhbCAidGVzdCBcIlwk
e2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCtzZXR9XCIiID0gc2V0OyB0aGVuIDoKICAg
JGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgaWYgdGVzdCAtbiAiJE9DQU1MREVQ
IjsgdGhlbgotICBhY19jdl9wcm9nX09DQU1MREVQPSIkT0NBTUxERVAiICMgTGV0IHRoZSB1c2Vy
IG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NF
UEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0
ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAk
YWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFj
X3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhl
Y19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19PQ0FNTERFUD0iJHthY190b29sX3ByZWZp
eH1vY2FtbGRlcCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBm
b3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZp
Ci1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKKyAgY2F0ID5jb25mdGVzdC5t
YWtlIDw8XF9BQ0VPRgorU0hFTEwgPSAvYmluL3NoCithbGw6CisJQGVjaG8gJ0BAQCUlJT0kKE1B
S0UpPUBAQCUlJScKK19BQ0VPRgorIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFd
OiBFbnRlcmluZyAuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorY2FzZSBgJHtNQUtFLW1h
a2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCisgICpAQEAlJSU9Pyo9QEBAJSUl
KikKKyAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OworICAqKQor
ICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKK2VzYWMKK3JtIC1m
IGNvbmZ0ZXN0Lm1ha2UKIGZpCi1PQ0FNTERFUD0kYWNfY3ZfcHJvZ19PQ0FNTERFUAotaWYgdGVz
dCAtbiAiJE9DQU1MREVQIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IHJlc3VsdDogJE9DQU1MREVQIiA+JjUKLSRhc19lY2hvICIkT0NBTUxERVAiID4m
NjsgfQoraWYgZXZhbCB0ZXN0IFwkYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0ID0geWVz
OyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0
OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisgIFNFVF9NQUtFPQogZWxzZQogICB7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQog
JGFzX2VjaG8gIm5vIiA+JjY7IH0KKyAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgogZmkK
IAotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT0NBTUxERVAiOyB0aGVuCi0gIGFjX2N0
X09DQU1MREVQPSRPQ0FNTERFUAotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm9jYW1s
ZGVwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBv
Y2FtbGRlcDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9y
ICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfT0NBTUxE
RVArc2V0fSIgPSBzZXQ7IHRoZW4gOgorIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBX
ZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29v
ZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZl
cnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1Mg
L3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFs
bAorIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxv
cHB5IGRpc2NzCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29y
ayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2gg
bWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hp
Y2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIE9TLzIncyBz
eXN0ZW0gaW5zdGFsbCwgd2hpY2ggaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWMK
KyMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZy
b20gLi9pbnN0YWxsLnNoLgorIyBSZWplY3QgaW5zdGFsbCBwcm9ncmFtcyB0aGF0IGNhbm5vdCBp
bnN0YWxsIG11bHRpcGxlIGZpbGVzLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKKyRhc19l
Y2hvX24gImNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gIiA+JjY7IH0K
K2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgoraWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3Rh
bGwrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxz
ZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxERVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNf
Y3RfT0NBTUxERVA9IiRhY19jdF9PQ0FNTERFUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhl
IHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGFz
X3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKIGZvciBhc19kaXIgaW4gJFBBVEgK
IGRvCiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4K
LSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8K
LSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVz
dF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3By
b2dfYWNfY3RfT0NBTUxERVA9Im9jYW1sZGVwIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQot
ICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQot
ZmkKLWFjX2N0X09DQU1MREVQPSRhY19jdl9wcm9nX2FjX2N0X09DQU1MREVQCi1pZiB0ZXN0IC1u
ICIkYWNfY3RfT0NBTUxERVAiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0NBTUxERVAiID4mNQotJGFzX2VjaG8gIiRhY19j
dF9PQ0FNTERFUCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQot
ICBpZiB0ZXN0ICJ4JGFjX2N0X09DQU1MREVQIiA9IHg7IHRoZW4KLSAgICBPQ0FNTERFUD0ibm8i
Ci0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15
ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1
c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFz
X2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdp
dGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7CisgICAgIyBBY2Nv
dW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMu
CitjYXNlICRhc19kaXIvIGluICMoKAorICAuLyB8IC4vLyB8IC9bY0NdLyogfCBcCisgIC9ldGMv
KiB8IC91c3Ivc2Jpbi8qIHwgL3Vzci9ldGMvKiB8IC9zYmluLyogfCAvdXNyL2Fmc3dzL2Jpbi8q
IHwgXAorICA/OltcXC9db3MyW1xcL11pbnN0YWxsW1xcL10qIHwgPzpbXFwvXU9TMltcXC9dSU5T
VEFMTFtcXC9dKiB8IFwKKyAgL3Vzci91Y2IvKiApIDs7CisgICopCisgICAgIyBPU0YxIGFuZCBT
Q08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KKyAgICAjIERvbid0
IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QK
KyAgICAjIGJ5IGRlZmF1bHQuCisgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBp
bnN0YWxsOyBkbworICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4
dGVuc2lvbnM7IGRvCisJaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0
IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgor
CSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKwkgICAgZ3JlcCBkc3Btc2cgIiRhc19k
aXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIEFJ
WCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisJ
ICAgIDoKKwkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKwkgICAgZ3JlcCBwd3Bs
dXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgor
CSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMt
LWRvbid0IHVzZS4KKwkgICAgOgorCSAgZWxzZQorCSAgICBybSAtcmYgY29uZnRlc3Qub25lIGNv
bmZ0ZXN0LnR3byBjb25mdGVzdC5kaXIKKwkgICAgZWNobyBvbmUgPiBjb25mdGVzdC5vbmUKKwkg
ICAgZWNobyB0d28gPiBjb25mdGVzdC50d28KKwkgICAgbWtkaXIgY29uZnRlc3QuZGlyCisJICAg
IGlmICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAtYyBjb25mdGVzdC5vbmUgY29uZnRl
c3QudHdvICJgcHdkYC9jb25mdGVzdC5kaXIiICYmCisJICAgICAgdGVzdCAtcyBjb25mdGVzdC5v
bmUgJiYgdGVzdCAtcyBjb25mdGVzdC50d28gJiYKKwkgICAgICB0ZXN0IC1zIGNvbmZ0ZXN0LmRp
ci9jb25mdGVzdC5vbmUgJiYKKwkgICAgICB0ZXN0IC1zIGNvbmZ0ZXN0LmRpci9jb25mdGVzdC50
d28KKwkgICAgdGhlbgorCSAgICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFzX2Rpci8kYWNfcHJv
ZyRhY19leGVjX2V4dCAtYyIKKwkgICAgICBicmVhayAzCisJICAgIGZpCisJICBmaQorCWZpCisg
ICAgICBkb25lCisgICAgZG9uZQorICAgIDs7CiBlc2FjCi0gICAgT0NBTUxERVA9JGFjX2N0X09D
QU1MREVQCi0gIGZpCi1lbHNlCi0gIE9DQU1MREVQPSIkYWNfY3ZfcHJvZ19PQ0FNTERFUCIKLWZp
Ci0KIAotICAjIGNoZWNraW5nIGZvciBvY2FtbG1rdG9wCi0gIGlmIHRlc3QgLW4gIiRhY190b29s
X3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xf
cHJlZml4fW9jYW1sbWt0b3AiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdz
Lgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2NhbWxta3RvcDsgYWNfd29yZD0kMgoteyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dv
cmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1p
ZiB0ZXN0ICIke2FjX2N2X3Byb2dfT0NBTUxNS1RPUCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRh
c19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRPQ0FNTE1LVE9Q
IjsgdGhlbgotICBhY19jdl9wcm9nX09DQU1MTUtUT1A9IiRPQ0FNTE1LVE9QIiAjIExldCB0aGUg
dXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFU
SF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMK
LSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4g
JycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGly
LyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFj
X2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfT0NBTUxNS1RPUD0iJHthY190b29s
X3ByZWZpeH1vY2FtbG1rdG9wIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFr
IDIKLSAgZmkKLWRvbmUKICAgZG9uZQogSUZTPSRhc19zYXZlX0lGUwogCitybSAtcmYgY29uZnRl
c3Qub25lIGNvbmZ0ZXN0LnR3byBjb25mdGVzdC5kaXIKKwogZmkKKyAgaWYgdGVzdCAiJHthY19j
dl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBJTlNUQUxMPSRhY19jdl9wYXRo
X2luc3RhbGwKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNo
ZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKKyAgICAjIHZhbHVlIGZvciBJTlNUQUxMIHdpdGhp
biBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhl
ciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJl
bW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCisgICAgSU5TVEFMTD0k
YWNfaW5zdGFsbF9zaAorICBmaQogZmkKLU9DQU1MTUtUT1A9JGFjX2N2X3Byb2dfT0NBTUxNS1RP
UAotaWYgdGVzdCAtbiAiJE9DQU1MTUtUT1AiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0NBTUxNS1RPUCIgPiY1Ci0kYXNfZWNobyAi
JE9DQU1MTUtUT1AiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCit7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJElOU1RBTEwi
ID4mNQorJGFzX2VjaG8gIiRJTlNUQUxMIiA+JjY7IH0KIAorIyBVc2UgdGVzdCAteiBiZWNhdXNl
IFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3Mg
dGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rl
c3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScK
IAotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX09DQU1MTUtUT1AiOyB0aGVuCi0gIGFjX2N0
X09DQU1MTUtUT1A9JE9DQU1MTUtUT1AKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJv
Y2FtbG1rdG9wIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBk
dW1teSBvY2FtbG1rdG9wOyBhY193b3JkPSQyCit0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYm
IElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAm
JiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisjIEV4dHJhY3QgdGhlIGZpcnN0
IHdvcmQgb2YgInBlcmwiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgor
c2V0IGR1bW15IHBlcmw7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNr
aW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0
X09DQU1MTUtUT1Arc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgdGVzdCAiJHthY19jdl9wYXRoX1BF
Ukwrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxz
ZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxNS1RPUCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19h
Y19jdF9PQ0FNTE1LVE9QPSIkYWNfY3RfT0NBTUxNS1RPUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJp
ZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9S
CisgIGNhc2UgJFBFUkwgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfUEVS
TD0iJFBFUkwiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgor
ICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCiBmb3Ig
YXNfZGlyIGluICRQQVRICiBkbwogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19k
aXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxl
X2V4dGVuc2lvbnM7IGRvCiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVj
X2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRo
ZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X09DQU1MTUtUT1A9Im9jYW1sbWt0b3AiCisgICAgYWNf
Y3ZfcGF0aF9QRVJMPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgogICAgICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNf
ZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkKQEAgLTU3NjgsNTMgKzM0ODYsNDYgQEAg
ZG9uZQogICBkb25lCiBJRlM9JGFzX3NhdmVfSUZTCiAKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhf
UEVSTCIgJiYgYWNfY3ZfcGF0aF9QRVJMPSJubyIKKyAgOzsKK2VzYWMKIGZpCi1maQotYWNfY3Rf
T0NBTUxNS1RPUD0kYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTE1LVE9QCi1pZiB0ZXN0IC1uICIkYWNf
Y3RfT0NBTUxNS1RPUCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiByZXN1bHQ6ICRhY19jdF9PQ0FNTE1LVE9QIiA+JjUKLSRhc19lY2hvICIkYWNfY3Rf
T0NBTUxNS1RPUCIgPiY2OyB9CitQRVJMPSRhY19jdl9wYXRoX1BFUkwKK2lmIHRlc3QgLW4gIiRQ
RVJMIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJl
c3VsdDogJFBFUkwiID4mNQorJGFzX2VjaG8gIiRQRVJMIiA+JjY7IH0KIGVsc2UKICAgeyAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKICRhc19l
Y2hvICJubyIgPiY2OyB9CiBmaQogCi0gIGlmIHRlc3QgIngkYWNfY3RfT0NBTUxNS1RPUCIgPSB4
OyB0aGVuCi0gICAgT0NBTUxNS1RPUD0ibm8iCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21w
aWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQg
d2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcg
Y3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9v
bF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgT0NBTUxNS1RPUD0kYWNfY3RfT0NBTUxNS1RPUAot
ICBmaQotZWxzZQotICBPQ0FNTE1LVE9QPSIkYWNfY3ZfcHJvZ19PQ0FNTE1LVE9QIgotZmkKIAor
aWYgdGVzdCB4IiR7UEVSTH0iID09IHgibm8iCit0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIlVu
YWJsZSB0byBmaW5kIHBlcmwsIHBsZWFzZSBpbnN0YWxsIHBlcmwiICIkTElORU5PIiA1CitmaQor
aWYgdGVzdCAieCR4YXBpIiA9ICJ4eSI7IHRoZW4gOgogCi0gICMgY2hlY2tpbmcgZm9yIG9jYW1s
bWtsaWIKLSAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3Qg
dGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxta2xpYiIsIHNvIGl0IGNh
biBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZp
eH1vY2FtbG1rbGliOyBhY193b3JkPSQyCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9m
ICJjdXJsLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitz
ZXQgZHVtbXkgY3VybC1jb25maWc7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24g
ImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9n
X09DQU1MTUtMSUIrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgdGVzdCAiJHthY19jdl9wYXRoX0NV
Ukwrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxz
ZQotICBpZiB0ZXN0IC1uICIkT0NBTUxNS0xJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19PQ0FNTE1L
TElCPSIkT0NBTUxNS0xJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNl
Ci1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGNhc2UgJENVUkwgaW4K
KyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfQ1VSTD0iJENVUkwiICMgTGV0IHRo
ZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19z
YXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCiBmb3IgYXNfZGlyIGluICRQQVRICiBk
bwogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAg
ICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCiAg
IGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3Rf
eCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9n
X09DQU1MTUtMSUI9IiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxta2xpYiIKKyAgICBhY19jdl9wYXRo
X0NVUkw9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCiAgICAgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4
dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQpAQCAtNTgyMiwzOSArMzUzMyw0NCBAQCBkb25lCiAg
IGRvbmUKIElGUz0kYXNfc2F2ZV9JRlMKIAorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9DVVJMIiAm
JiBhY19jdl9wYXRoX0NVUkw9Im5vIgorICA7OworZXNhYwogZmkKLWZpCi1PQ0FNTE1LTElCPSRh
Y19jdl9wcm9nX09DQU1MTUtMSUIKLWlmIHRlc3QgLW4gIiRPQ0FNTE1LTElCIjsgdGhlbgotICB7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9DQU1MTUtM
SUIiID4mNQotJGFzX2VjaG8gIiRPQ0FNTE1LTElCIiA+JjY7IH0KK0NVUkw9JGFjX2N2X3BhdGhf
Q1VSTAoraWYgdGVzdCAtbiAiJENVUkwiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1VSTCIgPiY1CiskYXNfZWNobyAiJENVUkwiID4m
NjsgfQogZWxzZQogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJl
c3VsdDogbm8iID4mNQogJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCiAKIAoraWYgdGVzdCB4IiR7
Q1VSTH0iID09IHgibm8iCit0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5k
IGN1cmwtY29uZmlnLCBwbGVhc2UgaW5zdGFsbCBjdXJsLWNvbmZpZyIgIiRMSU5FTk8iIDUKIGZp
Ci1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19PQ0FNTE1LTElCIjsgdGhlbgotICBhY19jdF9PQ0FN
TE1LTElCPSRPQ0FNTE1LTElCCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2NhbWxt
a2xpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkg
b2NhbWxta2xpYjsgYWNfd29yZD0kMgorICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAi
eG1sMi1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0
IGR1bW15IHhtbDItY29uZmlnOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJj
aGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19h
Y19jdF9PQ0FNTE1LTElCK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmIHRlc3QgIiR7YWNfY3ZfcGF0
aF9YTUwrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgog
ZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxNS0xJQiI7IHRoZW4KLSAgYWNfY3ZfcHJv
Z19hY19jdF9PQ0FNTE1LTElCPSIkYWNfY3RfT0NBTUxNS0xJQiIgIyBMZXQgdGhlIHVzZXIgb3Zl
cnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJB
VE9SCisgIGNhc2UgJFhNTCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9Y
TUw9IiRYTUwiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgor
ICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCiBmb3Ig
YXNfZGlyIGluICRQQVRICiBkbwogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19k
aXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxl
X2V4dGVuc2lvbnM7IGRvCiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVj
X2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRo
ZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X09DQU1MTUtMSUI9Im9jYW1sbWtsaWIiCisgICAgYWNf
Y3ZfcGF0aF9YTUw9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCiAgICAgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19l
eGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQpAQCAtNTg2Miw0NCArMzU3OCwzOSBAQCBk
b25lCiAgIGRvbmUKIElGUz0kYXNfc2F2ZV9JRlMKIAorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9Y
TUwiICYmIGFjX2N2X3BhdGhfWE1MPSJubyIKKyAgOzsKK2VzYWMKIGZpCi1maQotYWNfY3RfT0NB
TUxNS0xJQj0kYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTE1LTElCCi1pZiB0ZXN0IC1uICIkYWNfY3Rf
T0NBTUxNS0xJQiI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiByZXN1bHQ6ICRhY19jdF9PQ0FNTE1LTElCIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfT0NB
TUxNS0xJQiIgPiY2OyB9CitYTUw9JGFjX2N2X3BhdGhfWE1MCitpZiB0ZXN0IC1uICIkWE1MIjsg
dGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDog
JFhNTCIgPiY1CiskYXNfZWNobyAiJFhNTCIgPiY2OyB9CiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiAkYXNfZWNobyAibm8i
ID4mNjsgfQogZmkKIAotICBpZiB0ZXN0ICJ4JGFjX2N0X09DQU1MTUtMSUIiID0geDsgdGhlbgot
ICAgIE9DQU1MTUtMSUI9Im5vIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRh
Y190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9z
dCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRv
b2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVk
PXllcyA7OwotZXNhYwotICAgIE9DQU1MTUtMSUI9JGFjX2N0X09DQU1MTUtMSUIKLSAgZmkKLWVs
c2UKLSAgT0NBTUxNS0xJQj0iJGFjX2N2X3Byb2dfT0NBTUxNS0xJQiIKKworaWYgdGVzdCB4IiR7
WE1MfSIgPT0geCJubyIKK3RoZW4KKyAgICBhc19mbl9lcnJvciAkPyAiVW5hYmxlIHRvIGZpbmQg
eG1sMi1jb25maWcsIHBsZWFzZSBpbnN0YWxsIHhtbDItY29uZmlnIiAiJExJTkVOTyIgNQogZmkK
IAorZmkKK2lmIHRlc3QgIngkb2NhbWx0b29scyIgPSAieHkiOyB0aGVuIDoKIAotICAjIGNoZWNr
aW5nIGZvciBvY2FtbGRvYworICAgICAgIyBjaGVja2luZyBmb3Igb2NhbWxjCiAgIGlmIHRlc3Qg
LW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9m
ICIke2FjX3Rvb2xfcHJlZml4fW9jYW1sZG9jIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1l
IHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW9jYW1sZG9jOyBhY193b3Jk
PSQyCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1vY2Ft
bGMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7
YWNfdG9vbF9wcmVmaXh9b2NhbWxjOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19u
ICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJv
Z19PQ0FNTERPQytzZXR9IiA9IHNldDsgdGhlbiA6CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfT0NB
TUxDK3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVs
c2UKLSAgaWYgdGVzdCAtbiAiJE9DQU1MRE9DIjsgdGhlbgotICBhY19jdl9wcm9nX09DQU1MRE9D
PSIkT0NBTUxET0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBpZiB0ZXN0
IC1uICIkT0NBTUxDIjsgdGhlbgorICBhY19jdl9wcm9nX09DQU1MQz0iJE9DQU1MQyIgIyBMZXQg
dGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCiBlbHNlCiBhc19zYXZlX0lGUz0kSUZTOyBJRlM9
JFBBVEhfU0VQQVJBVE9SCiBmb3IgYXNfZGlyIGluICRQQVRICkBAIC01OTA4LDcgKzM2MTksNyBA
QCBkbwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4
dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwogICBpZiB7IHRlc3QgLWYgIiRh
c19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dv
cmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19PQ0FNTERPQz0iJHthY190
b29sX3ByZWZpeH1vY2FtbGRvYyIKKyAgICBhY19jdl9wcm9nX09DQU1MQz0iJHthY190b29sX3By
ZWZpeH1vY2FtbGMiCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
Zm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBm
aQpAQCAtNTkxOCwxMCArMzYyOSwxMCBAQCBJRlM9JGFzX3NhdmVfSUZTCiAKIGZpCiBmaQotT0NB
TUxET0M9JGFjX2N2X3Byb2dfT0NBTUxET0MKLWlmIHRlc3QgLW4gIiRPQ0FNTERPQyI7IHRoZW4K
LSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPQ0FN
TERPQyIgPiY1Ci0kYXNfZWNobyAiJE9DQU1MRE9DIiA+JjY7IH0KK09DQU1MQz0kYWNfY3ZfcHJv
Z19PQ0FNTEMKK2lmIHRlc3QgLW4gIiRPQ0FNTEMiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0NBTUxDIiA+JjUKKyRhc19lY2hvICIk
T0NBTUxDIiA+JjY7IH0KIGVsc2UKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKICRhc19lY2hvICJubyIgPiY2OyB9CkBAIC01OTI5LDE3
ICszNjQwLDE3IEBAIGZpCiAKIAogZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX09DQU1MRE9D
IjsgdGhlbgotICBhY19jdF9PQ0FNTERPQz0kT0NBTUxET0MKLSAgIyBFeHRyYWN0IHRoZSBmaXJz
dCB3b3JkIG9mICJvY2FtbGRvYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFy
Z3MuCi1zZXQgZHVtbXkgb2NhbWxkb2M7IGFjX3dvcmQ9JDIKK2lmIHRlc3QgLXogIiRhY19jdl9w
cm9nX09DQU1MQyI7IHRoZW4KKyAgYWNfY3RfT0NBTUxDPSRPQ0FNTEMKKyAgIyBFeHRyYWN0IHRo
ZSBmaXJzdCB3b3JkIG9mICJvY2FtbGMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0
aCBhcmdzLgorc2V0IGR1bW15IG9jYW1sYzsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2Vj
aG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2
X3Byb2dfYWNfY3RfT0NBTUxET0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgdGVzdCAiJHthY19j
dl9wcm9nX2FjX2N0X09DQU1MQytzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihj
YWNoZWQpICIgPiY2CiBlbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTERPQyI7IHRoZW4K
LSAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTERPQz0iJGFjX2N0X09DQU1MRE9DIiAjIExldCB0aGUg
dXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgaWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MQyI7IHRo
ZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTEM9IiRhY19jdF9PQ0FNTEMiICMgTGV0IHRoZSB1
c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgogZWxzZQogYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRI
X1NFUEFSQVRPUgogZm9yIGFzX2RpciBpbiAkUEFUSApAQCAtNTk0OCw3ICszNjU5LDcgQEAgZG8K
ICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4g
JycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KICAgaWYgeyB0ZXN0IC1mICIkYXNfZGly
LyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFj
X2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxET0M9Im9jYW1s
ZG9jIgorICAgIGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxDPSJvY2FtbGMiCiAgICAgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19l
eGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQpAQCAtNTk1OCwxNyArMzY2OSwxNyBAQCBJ
RlM9JGFzX3NhdmVfSUZTCiAKIGZpCiBmaQotYWNfY3RfT0NBTUxET0M9JGFjX2N2X3Byb2dfYWNf
Y3RfT0NBTUxET0MKLWlmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTERPQyI7IHRoZW4KLSAgeyAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9PQ0FNTERP
QyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X09DQU1MRE9DIiA+JjY7IH0KK2FjX2N0X09DQU1MQz0k
YWNfY3ZfcHJvZ19hY19jdF9PQ0FNTEMKK2lmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTEMiOyB0aGVu
CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNf
Y3RfT0NBTUxDIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfT0NBTUxDIiA+JjY7IH0KIGVsc2UKICAg
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUK
ICRhc19lY2hvICJubyIgPiY2OyB9CiBmaQogCi0gIGlmIHRlc3QgIngkYWNfY3RfT0NBTUxET0Mi
ID0geDsgdGhlbgotICAgIE9DQU1MRE9DPSJubyIKKyAgaWYgdGVzdCAieCRhY19jdF9PQ0FNTEMi
ID0geDsgdGhlbgorICAgIE9DQU1MQz0ibm8iCiAgIGVsc2UKICAgICBjYXNlICRjcm9zc19jb21w
aWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCiB5ZXM6KQpAQCAtNTk3NiwyNCArMzY4Nyw0MSBAQCB5
ZXM6KQogJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHBy
ZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQogYWNfdG9vbF93YXJuZWQ9eWVzIDs7CiBl
c2FjCi0gICAgT0NBTUxET0M9JGFjX2N0X09DQU1MRE9DCisgICAgT0NBTUxDPSRhY19jdF9PQ0FN
TEMKICAgZmkKIGVsc2UKLSAgT0NBTUxET0M9IiRhY19jdl9wcm9nX09DQU1MRE9DIgorICBPQ0FN
TEM9IiRhY19jdl9wcm9nX09DQU1MQyIKIGZpCiAKIAotICAjIGNoZWNraW5nIGZvciBvY2FtbGJ1
aWxkCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRo
ZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9jYW1sYnVpbGQiLCBzbyBpdCBjYW4g
YmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9
b2NhbWxidWlsZDsgYWNfd29yZD0kMgorICBpZiB0ZXN0ICIkT0NBTUxDIiAhPSAibm8iOyB0aGVu
CisgICAgIE9DQU1MVkVSU0lPTj1gJE9DQU1MQyAtdiB8IHNlZCAtbiAtZSAnc3wuKnZlcnNpb24q
ICpcKC4qXCkkfFwxfHAnYAorICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IHJlc3VsdDogT0NhbWwgdmVyc2lvbiBpcyAkT0NBTUxWRVJTSU9OIiA+JjUKKyRhc19l
Y2hvICJPQ2FtbCB2ZXJzaW9uIGlzICRPQ0FNTFZFUlNJT04iID4mNjsgfQorICAgICAjIElmIE9D
QU1MTElCIGlzIHNldCwgdXNlIGl0CisgICAgIGlmIHRlc3QgIiRPQ0FNTExJQiIgPSAiIjsgdGhl
bgorICAgICAgICBPQ0FNTExJQj1gJE9DQU1MQyAtd2hlcmUgMj4vZGV2L251bGwgfHwgJE9DQU1M
QyAtdnx0YWlsIC0xfGN1dCAtZCAnICcgLWYgNGAKKyAgICAgZWxzZQorICAgICAgICB7ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogT0NBTUxMSUIgcHJldmlv
dXNseSBzZXQ7IHByZXNlcnZpbmcgaXQuIiA+JjUKKyRhc19lY2hvICJPQ0FNTExJQiBwcmV2aW91
c2x5IHNldDsgcHJlc2VydmluZyBpdC4iID4mNjsgfQorICAgICBmaQorICAgICB7ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogT0NhbWwgbGlicmFyeSBwYXRo
IGlzICRPQ0FNTExJQiIgPiY1CiskYXNfZWNobyAiT0NhbWwgbGlicmFyeSBwYXRoIGlzICRPQ0FN
TExJQiIgPiY2OyB9CisKKworCisKKyAgICAgIyBjaGVja2luZyBmb3Igb2NhbWxvcHQKKyAgICAg
aWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0
IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxvcHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9n
cmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2NhbWxvcHQ7
IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hl
Y2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29y
ZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX09DQU1MQlVJTEQrc2V0fSIgPSBz
ZXQ7IHRoZW4gOgoraWYgdGVzdCAiJHthY19jdl9wcm9nX09DQU1MT1BUK3NldH0iID0gc2V0OyB0
aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgaWYgdGVzdCAtbiAi
JE9DQU1MQlVJTEQiOyB0aGVuCi0gIGFjX2N2X3Byb2dfT0NBTUxCVUlMRD0iJE9DQU1MQlVJTEQi
ICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBpZiB0ZXN0IC1uICIkT0NBTUxP
UFQiOyB0aGVuCisgIGFjX2N2X3Byb2dfT0NBTUxPUFQ9IiRPQ0FNTE9QVCIgIyBMZXQgdGhlIHVz
ZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCiBlbHNlCiBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhf
U0VQQVJBVE9SCiBmb3IgYXNfZGlyIGluICRQQVRICkBAIC02MDAyLDcgKzM3MzAsNyBAQCBkbwog
ICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAn
JyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwogICBpZiB7IHRlc3QgLWYgIiRhc19kaXIv
JGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNf
ZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19PQ0FNTEJVSUxEPSIke2FjX3Rvb2xf
cHJlZml4fW9jYW1sYnVpbGQiCisgICAgYWNfY3ZfcHJvZ19PQ0FNTE9QVD0iJHthY190b29sX3By
ZWZpeH1vY2FtbG9wdCIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAg
IGZpCkBAIC02MDEyLDEwICszNzQwLDEwIEBAIElGUz0kYXNfc2F2ZV9JRlMKIAogZmkKIGZpCi1P
Q0FNTEJVSUxEPSRhY19jdl9wcm9nX09DQU1MQlVJTEQKLWlmIHRlc3QgLW4gIiRPQ0FNTEJVSUxE
IjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJE9DQU1MQlVJTEQiID4mNQotJGFzX2VjaG8gIiRPQ0FNTEJVSUxEIiA+JjY7IH0KK09DQU1M
T1BUPSRhY19jdl9wcm9nX09DQU1MT1BUCitpZiB0ZXN0IC1uICIkT0NBTUxPUFQiOyB0aGVuCisg
IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0NBTUxP
UFQiID4mNQorJGFzX2VjaG8gIiRPQ0FNTE9QVCIgPiY2OyB9CiBlbHNlCiAgIHsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiAkYXNfZWNobyAi
bm8iID4mNjsgfQpAQCAtNjAyMywxNyArMzc1MSwxNyBAQCBmaQogCiAKIGZpCi1pZiB0ZXN0IC16
ICIkYWNfY3ZfcHJvZ19PQ0FNTEJVSUxEIjsgdGhlbgotICBhY19jdF9PQ0FNTEJVSUxEPSRPQ0FN
TEJVSUxECi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2NhbWxidWlsZCIsIHNvIGl0
IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgb2NhbWxidWlsZDsg
YWNfd29yZD0kMgoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT0NBTUxPUFQiOyB0aGVuCisgIGFj
X2N0X09DQU1MT1BUPSRPQ0FNTE9QVAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm9j
YW1sb3B0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1t
eSBvY2FtbG9wdDsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcg
Zm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfT0NB
TUxCVUlMRCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3Rf
T0NBTUxPUFQrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4m
NgogZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxCVUlMRCI7IHRoZW4KLSAgYWNfY3Zf
cHJvZ19hY19jdF9PQ0FNTEJVSUxEPSIkYWNfY3RfT0NBTUxCVUlMRCIgIyBMZXQgdGhlIHVzZXIg
b3ZlcnJpZGUgdGhlIHRlc3QuCisgIGlmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTE9QVCI7IHRoZW4K
KyAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTE9QVD0iJGFjX2N0X09DQU1MT1BUIiAjIExldCB0aGUg
dXNlciBvdmVycmlkZSB0aGUgdGVzdC4KIGVsc2UKIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFU
SF9TRVBBUkFUT1IKIGZvciBhc19kaXIgaW4gJFBBVEgKQEAgLTYwNDIsNyArMzc3MCw3IEBAIGRv
CiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGlu
ICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rp
ci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRh
Y19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X09DQU1MQlVJTEQ9Im9j
YW1sYnVpbGQiCisgICAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTE9QVD0ib2NhbWxvcHQiCiAgICAg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNf
d29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQpAQCAtNjA1MiwxNyArMzc4
MCwxNyBAQCBJRlM9JGFzX3NhdmVfSUZTCiAKIGZpCiBmaQotYWNfY3RfT0NBTUxCVUlMRD0kYWNf
Y3ZfcHJvZ19hY19jdF9PQ0FNTEJVSUxECi1pZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxCVUlMRCI7
IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6
ICRhY19jdF9PQ0FNTEJVSUxEIiA+JjUKLSRhc19lY2hvICIkYWNfY3RfT0NBTUxCVUlMRCIgPiY2
OyB9CithY19jdF9PQ0FNTE9QVD0kYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTE9QVAoraWYgdGVzdCAt
biAiJGFjX2N0X09DQU1MT1BUIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09DQU1MT1BUIiA+JjUKKyRhc19lY2hvICIkYWNf
Y3RfT0NBTUxPUFQiID4mNjsgfQogZWxzZQogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQogJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCiAK
LSAgaWYgdGVzdCAieCRhY19jdF9PQ0FNTEJVSUxEIiA9IHg7IHRoZW4KLSAgICBPQ0FNTEJVSUxE
PSJubyIKKyAgaWYgdGVzdCAieCRhY19jdF9PQ0FNTE9QVCIgPSB4OyB0aGVuCisgICAgT0NBTUxP
UFQ9Im5vIgogICBlbHNlCiAgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5l
ZCBpbgogeWVzOikKQEAgLTYwNzAsNDQgKzM3OTgsNDkgQEAgeWVzOikKICRhc19lY2hvICIkYXNf
bWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJp
cGxldCIgPiYyO30KIGFjX3Rvb2xfd2FybmVkPXllcyA7OwogZXNhYwotICAgIE9DQU1MQlVJTEQ9
JGFjX2N0X09DQU1MQlVJTEQKKyAgICBPQ0FNTE9QVD0kYWNfY3RfT0NBTUxPUFQKICAgZmkKIGVs
c2UKLSAgT0NBTUxCVUlMRD0iJGFjX2N2X3Byb2dfT0NBTUxCVUlMRCIKKyAgT0NBTUxPUFQ9IiRh
Y19jdl9wcm9nX09DQU1MT1BUIgogZmkKIAorICAgICBPQ0FNTEJFU1Q9Ynl0ZQorICAgICBpZiB0
ZXN0ICIkT0NBTUxPUFQiID0gIm5vIjsgdGhlbgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp
bmVuby0kTElORU5PfTogV0FSTklORzogQ2Fubm90IGZpbmQgb2NhbWxvcHQ7IGJ5dGVjb2RlIGNv
bXBpbGF0aW9uIG9ubHkuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IENhbm5vdCBm
aW5kIG9jYW1sb3B0OyBieXRlY29kZSBjb21waWxhdGlvbiBvbmx5LiIgPiYyO30KKyAgICAgZWxz
ZQorCVRNUFZFUlNJT049YCRPQ0FNTE9QVCAtdiB8IHNlZCAtbiAtZSAnc3wuKnZlcnNpb24qICpc
KC4qXCkkfFwxfHAnIGAKKwlpZiB0ZXN0ICIkVE1QVkVSU0lPTiIgIT0gIiRPQ0FNTFZFUlNJT04i
IDsgdGhlbgorCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJl
c3VsdDogdmVyc2lvbnMgZGlmZmVycyBmcm9tIG9jYW1sYzsgb2NhbWxvcHQgZGlzY2FyZGVkLiIg
PiY1CiskYXNfZWNobyAidmVyc2lvbnMgZGlmZmVycyBmcm9tIG9jYW1sYzsgb2NhbWxvcHQgZGlz
Y2FyZGVkLiIgPiY2OyB9CisJICAgIE9DQU1MT1BUPW5vCisJZWxzZQorCSAgICBPQ0FNTEJFU1Q9
b3B0CisJZmkKKyAgICAgZmkKIAotICAgIGlmIHRlc3QgIngkT0NBTUxDIiA9ICJ4bm8iOyB0aGVu
IDoKLQotICAgICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9vY2FtbHRvb2xzIiA9ICJ4eWVzIjsgdGhl
biA6Ci0KLSAgICAgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJPY2FtbCB0b29scyBlbmFibGVkLCBi
dXQgdW5hYmxlIHRvIGZpbmQgT2NhbWwiICIkTElORU5PIiA1Ci1maQotICAgICAgICBvY2FtbHRv
b2xzPSJuIgogCi1maQogCi1maQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJiYXNoIiwg
c28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBiYXNoOyBh
Y193b3JkPSQyCisgICAgICMgY2hlY2tpbmcgZm9yIG9jYW1sYy5vcHQKKyAgICAgaWYgdGVzdCAt
biAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2Yg
IiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxjLm9wdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFt
ZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vY2FtbGMub3B0OyBhY193
b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5n
IGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4g
IiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9CQVNIK3NldH0iID0gc2V0OyB0aGVuIDoK
K2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19PQ0FNTENET1RPUFQrc2V0fSIgPSBzZXQ7IHRoZW4gOgog
ICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBjYXNlICRCQVNIIGluCi0gIFtc
XC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX0JBU0g9IiRCQVNIIiAjIExldCB0aGUgdXNl
ciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9J
RlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBpZiB0ZXN0IC1uICIkT0NBTUxDRE9UT1BU
IjsgdGhlbgorICBhY19jdl9wcm9nX09DQU1MQ0RPVE9QVD0iJE9DQU1MQ0RPVE9QVCIgIyBMZXQg
dGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9
JFBBVEhfU0VQQVJBVE9SCiBmb3IgYXNfZGlyIGluICRQQVRICiBkbwogICBJRlM9JGFzX3NhdmVf
SUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0
IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCiAgIGlmIHsgdGVzdCAtZiAiJGFz
X2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29y
ZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX0JBU0g9IiRhc19kaXIvJGFj
X3dvcmQkYWNfZXhlY19leHQiCisgICAgYWNfY3ZfcHJvZ19PQ0FNTENET1RPUFQ9IiR7YWNfdG9v
bF9wcmVmaXh9b2NhbWxjLm9wdCIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVh
ayAyCiAgIGZpCkBAIC02MTE1LDU2ICszODQ4LDM5IEBAIGRvbmUKICAgZG9uZQogSUZTPSRhc19z
YXZlX0lGUwogCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0JBU0giICYmIGFjX2N2X3BhdGhfQkFT
SD0ibm8iCi0gIDs7Ci1lc2FjCiBmaQotQkFTSD0kYWNfY3ZfcGF0aF9CQVNICi1pZiB0ZXN0IC1u
ICIkQkFTSCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiByZXN1bHQ6ICRCQVNIIiA+JjUKLSRhc19lY2hvICIkQkFTSCIgPiY2OyB9CitmaQorT0NBTUxD
RE9UT1BUPSRhY19jdl9wcm9nX09DQU1MQ0RPVE9QVAoraWYgdGVzdCAtbiAiJE9DQU1MQ0RPVE9Q
VCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1
bHQ6ICRPQ0FNTENET1RPUFQiID4mNQorJGFzX2VjaG8gIiRPQ0FNTENET1RPUFQiID4mNjsgfQog
ZWxzZQogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDog
bm8iID4mNQogJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCiAKIAotaWYgdGVzdCB4IiR7QkFTSH0i
ID09IHgibm8iCi10aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5kIGJhc2gs
IHBsZWFzZSBpbnN0YWxsIGJhc2giICIkTElORU5PIiA1Ci1maQotaWYgdGVzdCAieCRweXRob250
b29scyIgPSAieHkiOyB0aGVuIDoKLQotICAgIGlmIGVjaG8gIiRQWVRIT04iIHwgZ3JlcCAtcSAi
Xi8iOyB0aGVuIDoKLQotICAgICAgICBQWVRIT05QQVRIPSRQWVRIT04KLSAgICAgICAgUFlUSE9O
PWBiYXNlbmFtZSAkUFlUSE9OUEFUSGAKLQotZWxpZiB0ZXN0IC16ICIkUFlUSE9OIjsgdGhlbiA6
Ci0gIFBZVEhPTj0icHl0aG9uIgotZWxzZQotICBhc19mbl9lcnJvciAkPyAiUFlUSE9OIHNwZWNp
ZmllZCwgYnV0IGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoIiAiJExJTkVOTyIgNQogZmkKLSAgICAj
IEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRQWVRIT04iLCBzbyBpdCBjYW4gYmUgYSBwcm9n
cmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRQWVRIT047IGFjX3dvcmQ9JDIKK2lmIHRl
c3QgLXogIiRhY19jdl9wcm9nX09DQU1MQ0RPVE9QVCI7IHRoZW4KKyAgYWNfY3RfT0NBTUxDRE9U
T1BUPSRPQ0FNTENET1RPUFQKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvY2FtbGMu
b3B0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBv
Y2FtbGMub3B0OyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBm
b3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9QWVRIT05QQVRI
K3NldH0iID0gc2V0OyB0aGVuIDoKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9PQ0FNTENE
T1RPUFQrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgog
ZWxzZQotICBjYXNlICRQWVRIT05QQVRIIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19j
dl9wYXRoX1BZVEhPTlBBVEg9IiRQWVRIT05QQVRIIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0
aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZT
PSRQQVRIX1NFUEFSQVRPUgorICBpZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxDRE9UT1BUIjsgdGhl
bgorICBhY19jdl9wcm9nX2FjX2N0X09DQU1MQ0RPVE9QVD0iJGFjX2N0X09DQU1MQ0RPVE9QVCIg
IyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZT
OyBJRlM9JFBBVEhfU0VQQVJBVE9SCiBmb3IgYXNfZGlyIGluICRQQVRICiBkbwogICBJRlM9JGFz
X3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4
ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCiAgIGlmIHsgdGVzdCAt
ZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8k
YWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX1BZVEhPTlBBVEg9
IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FN
TENET1RPUFQ9Im9jYW1sYy5vcHQiCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJl
YWsgMgogICBmaQpAQCAtNjE3MiwxNDAgKzM4ODgsMTcyIEBAIGRvbmUKICAgZG9uZQogSUZTPSRh
c19zYXZlX0lGUwogCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1BZVEhPTlBBVEgiICYmIGFjX2N2
X3BhdGhfUFlUSE9OUEFUSD0ibm8iCi0gIDs7Ci1lc2FjCiBmaQotUFlUSE9OUEFUSD0kYWNfY3Zf
cGF0aF9QWVRIT05QQVRICi1pZiB0ZXN0IC1uICIkUFlUSE9OUEFUSCI7IHRoZW4KLSAgeyAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQWVRIT05QQVRIIiA+
JjUKLSRhc19lY2hvICIkUFlUSE9OUEFUSCIgPiY2OyB9CitmaQorYWNfY3RfT0NBTUxDRE9UT1BU
PSRhY19jdl9wcm9nX2FjX2N0X09DQU1MQ0RPVE9QVAoraWYgdGVzdCAtbiAiJGFjX2N0X09DQU1M
Q0RPVE9QVCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiByZXN1bHQ6ICRhY19jdF9PQ0FNTENET1RPUFQiID4mNQorJGFzX2VjaG8gIiRhY19jdF9PQ0FN
TENET1RPUFQiID4mNjsgfQogZWxzZQogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IHJlc3VsdDogbm8iID4mNQogJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCiAKLQot
aWYgdGVzdCB4IiR7UFlUSE9OUEFUSH0iID09IHgibm8iCi10aGVuCi0gICAgYXNfZm5fZXJyb3Ig
JD8gIlVuYWJsZSB0byBmaW5kICRQWVRIT04sIHBsZWFzZSBpbnN0YWxsICRQWVRIT04iICIkTElO
RU5PIiA1Ci1maQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
Y2hlY2tpbmcgZm9yIHB5dGhvbiB2ZXJzaW9uID49IDIuMyAiID4mNQotJGFzX2VjaG9fbiAiY2hl
Y2tpbmcgZm9yIHB5dGhvbiB2ZXJzaW9uID49IDIuMyAuLi4gIiA+JjY7IH0KLWAkUFlUSE9OIC1j
ICdpbXBvcnQgc3lzOyBzeXMuZXhpdChldmFsKCJzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDMpIikp
J2AKLWlmIHRlc3QgIiQ/IiAhPSAiMCIKLXRoZW4KLSAgICBweXRob25fdmVyc2lvbj1gJFBZVEhP
TiAtViAyPiYxYAotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotICAgIGFzX2ZuX2Vycm9yICQ/
ICIkcHl0aG9uX3ZlcnNpb24gaXMgdG9vIG9sZCwgbWluaW11bSByZXF1aXJlZCB2ZXJzaW9uIGlz
IDIuMyIgIiRMSU5FTk8iIDUKKyAgaWYgdGVzdCAieCRhY19jdF9PQ0FNTENET1RPUFQiID0geDsg
dGhlbgorICAgIE9DQU1MQ0RPVE9QVD0ibm8iCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21w
aWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQg
d2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcg
Y3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9v
bF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgT0NBTUxDRE9UT1BUPSRhY19jdF9PQ0FNTENET1RP
UFQKKyAgZmkKIGVsc2UKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4mNjsgfQorICBPQ0FNTENET1RP
UFQ9IiRhY19jdl9wcm9nX09DQU1MQ0RPVE9QVCIKIGZpCiAKLWFjX3B5dGhvbl92ZXJzaW9uPWAk
UFlUSE9OIC1jICdpbXBvcnQgZGlzdHV0aWxzLnN5c2NvbmZpZzsgXAotICAgIHByaW50IGRpc3R1
dGlscy5zeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIlZFUlNJT04iKSdgCi1hY19wcmV2aW91c19j
cHBmbGFncz0kQ1BQRkxBR1MKLUNQUEZMQUdTPSIkQ0ZMQUdTIGAkUFlUSE9OIC1jICdpbXBvcnQg
ZGlzdHV0aWxzLnN5c2NvbmZpZzsgXAotICAgIHByaW50ICItSSIgKyBkaXN0dXRpbHMuc3lzY29u
ZmlnLmdldF9jb25maWdfdmFyKCJJTkNMVURFUFkiKSdgIgotQ1BQRkxBR1M9IiRDUFBGTEFHUyBg
JFBZVEhPTiAtYyAnaW1wb3J0IGRpc3R1dGlscy5zeXNjb25maWc7IFwKLSAgICBwcmludCBkaXN0
dXRpbHMuc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJDRkxBR1MiKSdgIgotYWNfcHJldmlvdXNf
bGRmbGFncz0kTERGTEFHUwotTERGTEFHUz0iJExERkxBR1MgYCRQWVRIT04gLWMgJ2ltcG9ydCBk
aXN0dXRpbHMuc3lzY29uZmlnOyBcCi0gICAgcHJpbnQgZGlzdHV0aWxzLnN5c2NvbmZpZy5nZXRf
Y29uZmlnX3ZhcigiTElCUyIpJ2AiCi1MREZMQUdTPSIkTERGTEFHUyBgJFBZVEhPTiAtYyAnaW1w
b3J0IGRpc3R1dGlscy5zeXNjb25maWc7IFwKLSAgICBwcmludCBkaXN0dXRpbHMuc3lzY29uZmln
LmdldF9jb25maWdfdmFyKCJTWVNMSUJTIiknYCIKLUxERkxBR1M9IiRMREZMQUdTIGAkUFlUSE9O
IC1jICdpbXBvcnQgZGlzdHV0aWxzLnN5c2NvbmZpZzsgXAotICAgIHByaW50ICItTCIgKyBkaXN0
dXRpbHMuc3lzY29uZmlnLmdldF9weXRob25fbGliKHBsYXRfc3BlY2lmaWM9MSxcCi0gICAgc3Rh
bmRhcmRfbGliPTEpICsgIi9jb25maWciJ2AiCi1MREZMQUdTPSIkTERGTEFHUyBgJFBZVEhPTiAt
YyAnaW1wb3J0IGRpc3R1dGlscy5zeXNjb25maWc7IFwKLSAgICBwcmludCBkaXN0dXRpbHMuc3lz
Y29uZmlnLmdldF9jb25maWdfdmFyKCJMSU5LRk9SU0hBUkVEIiknYCIKLUxERkxBR1M9IiRMREZM
QUdTIGAkUFlUSE9OIC1jICdpbXBvcnQgZGlzdHV0aWxzLnN5c2NvbmZpZzsgXAotICAgIHByaW50
IGRpc3R1dGlscy5zeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIkxERkxBR1MiKSdgIgorICAgICBp
ZiB0ZXN0ICIkT0NBTUxDRE9UT1BUIiAhPSAibm8iOyB0aGVuCisJVE1QVkVSU0lPTj1gJE9DQU1M
Q0RPVE9QVCAtdiB8IHNlZCAtbiAtZSAnc3wuKnZlcnNpb24qICpcKC4qXCkkfFwxfHAnIGAKKwlp
ZiB0ZXN0ICIkVE1QVkVSU0lPTiIgIT0gIiRPQ0FNTFZFUlNJT04iIDsgdGhlbgorCSAgICB7ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogdmVyc2lvbnMgZGlm
ZmVycyBmcm9tIG9jYW1sYzsgb2NhbWxjLm9wdCBkaXNjYXJkZWQuIiA+JjUKKyRhc19lY2hvICJ2
ZXJzaW9ucyBkaWZmZXJzIGZyb20gb2NhbWxjOyBvY2FtbGMub3B0IGRpc2NhcmRlZC4iID4mNjsg
fQorCWVsc2UKKwkgICAgT0NBTUxDPSRPQ0FNTENET1RPUFQKKwlmaQorICAgICBmaQogCi1hY19m
bl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiUHl0aG9uLmgiICJhY19jdl9oZWFk
ZXJfUHl0aG9uX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVh
ZGVyX1B5dGhvbl9oIiA9IHgiInllczsgdGhlbiA6CisgICAgICMgY2hlY2tpbmcgZm9yIG9jYW1s
b3B0Lm9wdAorICAgICBpZiB0ZXN0ICIkT0NBTUxPUFQiICE9ICJubyIgOyB0aGVuCisJaWYgdGVz
dCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQg
b2YgIiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxvcHQub3B0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3Jh
bSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW9jYW1sb3B0Lm9w
dDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBj
aGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193
b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfT0NBTUxPUFRET1RPUFQrc2V0
fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBp
ZiB0ZXN0IC1uICIkT0NBTUxPUFRET1RPUFQiOyB0aGVuCisgIGFjX2N2X3Byb2dfT0NBTUxPUFRE
T1RPUFQ9IiRPQ0FNTE9QVERPVE9QVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qu
CitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGly
IGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYm
IGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVu
c2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIg
JiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAg
ICBhY19jdl9wcm9nX09DQU1MT1BURE9UT1BUPSIke2FjX3Rvb2xfcHJlZml4fW9jYW1sb3B0Lm9w
dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNf
ZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisg
IGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKIAorZmkKK2ZpCitPQ0FNTE9QVERPVE9QVD0kYWNfY3Zf
cHJvZ19PQ0FNTE9QVERPVE9QVAoraWYgdGVzdCAtbiAiJE9DQU1MT1BURE9UT1BUIjsgdGhlbgor
ICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9DQU1M
T1BURE9UT1BUIiA+JjUKKyRhc19lY2hvICIkT0NBTUxPUFRET1RPUFQiID4mNjsgfQogZWxzZQot
ICBhc19mbl9lcnJvciAkPyAiVW5hYmxlIHRvIGZpbmQgUHl0aG9uIGRldmVsb3BtZW50IGhlYWRl
cnMiICIkTElORU5PIiA1CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAogCi1hc19hY19M
aWI9YCRhc19lY2hvICJhY19jdl9saWJfcHl0aG9uJGFjX3B5dGhvbl92ZXJzaW9uJydfUHlBcmdf
UGFyc2VUdXBsZSIgfCAkYXNfdHJfc2hgCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IGNoZWNraW5nIGZvciBQeUFyZ19QYXJzZVR1cGxlIGluIC1scHl0aG9uJGFjX3B5
dGhvbl92ZXJzaW9uIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBQeUFyZ19QYXJzZVR1
cGxlIGluIC1scHl0aG9uJGFjX3B5dGhvbl92ZXJzaW9uLi4uICIgPiY2OyB9Ci1pZiBldmFsICJ0
ZXN0IFwiXCR7JGFzX2FjX0xpYitzZXR9XCIiID0gc2V0OyB0aGVuIDoKK2ZpCitpZiB0ZXN0IC16
ICIkYWNfY3ZfcHJvZ19PQ0FNTE9QVERPVE9QVCI7IHRoZW4KKyAgYWNfY3RfT0NBTUxPUFRET1RP
UFQ9JE9DQU1MT1BURE9UT1BUCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2NhbWxv
cHQub3B0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1t
eSBvY2FtbG9wdC5vcHQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNr
aW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0
X09DQU1MT1BURE9UT1BUK3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hl
ZCkgIiA+JjYKIGVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxw
eXRob24kYWNfcHl0aG9uX3ZlcnNpb24gICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VP
RiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlk
ZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBj
aGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAg
YnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5
LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIFB5QXJn
X1BhcnNlVHVwbGUgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBQeUFyZ19QYXJzZVR1cGxl
ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIk
TElORU5PIjsgdGhlbiA6Ci0gIGV2YWwgIiRhc19hY19MaWI9eWVzIgorICBpZiB0ZXN0IC1uICIk
YWNfY3RfT0NBTUxPUFRET1RPUFQiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxPUFRE
T1RPUFQ9IiRhY19jdF9PQ0FNTE9QVERPVE9QVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhl
IHRlc3QuCiBlbHNlCi0gIGV2YWwgIiRhc19hY19MaWI9bm8iCithc19zYXZlX0lGUz0kSUZTOyBJ
RlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3Nh
dmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNf
ZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAi
JGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNf
d29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X09DQU1MT1BU
RE9UT1BUPSJvY2FtbG9wdC5vcHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJl
YWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKIGZpCi1ybSAtZiBj
b3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19l
eGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkK
LWV2YWwgYWNfcmVzPVwkJGFzX2FjX0xpYgotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3Jl
cyIgPiY2OyB9Ci1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0xpYiJcIiA9IHgieWVzIjsgdGhl
biA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYCRhc19lY2hvICJIQVZF
X0xJQnB5dGhvbiRhY19weXRob25fdmVyc2lvbiIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQot
ICBMSUJTPSItbHB5dGhvbiRhY19weXRob25fdmVyc2lvbiAkTElCUyIKK2FjX2N0X09DQU1MT1BU
RE9UT1BUPSRhY19jdl9wcm9nX2FjX2N0X09DQU1MT1BURE9UT1BUCitpZiB0ZXN0IC1uICIkYWNf
Y3RfT0NBTUxPUFRET1RPUFQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0NBTUxPUFRET1RPUFQiID4mNQorJGFzX2VjaG8g
IiRhY19jdF9PQ0FNTE9QVERPVE9QVCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4m
NjsgfQorZmkKIAorICBpZiB0ZXN0ICJ4JGFjX2N0X09DQU1MT1BURE9UT1BUIiA9IHg7IHRoZW4K
KyAgICBPQ0FNTE9QVERPVE9QVD0ibm8iCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxp
bmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0
aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jv
c3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93
YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgT0NBTUxPUFRET1RPUFQ9JGFjX2N0X09DQU1MT1BURE9U
T1BUCisgIGZpCiBlbHNlCi0gIGFzX2ZuX2Vycm9yICQ/ICJVbmFibGUgdG8gZmluZCBhIHN1aXRh
YmxlIHB5dGhvbiBkZXZlbG9wbWVudCBsaWJyYXJ5IiAiJExJTkVOTyIgNQorICBPQ0FNTE9QVERP
VE9QVD0iJGFjX2N2X3Byb2dfT0NBTUxPUFRET1RPUFQiCiBmaQogCi1DUFBGTEFHUz0kYWNfcHJl
dmlvdXNfY3BwZmxhZ3MKLUxETEZBR1M9JGFjX3ByZXZpb3VzX2xkZmxhZ3MKKwlpZiB0ZXN0ICIk
T0NBTUxPUFRET1RPUFQiICE9ICJubyI7IHRoZW4KKwkgICBUTVBWRVJTSU9OPWAkT0NBTUxPUFRE
T1RPUFQgLXYgfCBzZWQgLW4gLWUgJ3N8Lip2ZXJzaW9uKiAqXCguKlwpJHxcMXxwJyBgCisJICAg
aWYgdGVzdCAiJFRNUFZFUlNJT04iICE9ICIkT0NBTUxWRVJTSU9OIiA7IHRoZW4KKwkgICAgICB7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogdmVyc2lvbiBk
aWZmZXJzIGZyb20gb2NhbWxjOyBvY2FtbG9wdC5vcHQgZGlzY2FyZGVkLiIgPiY1CiskYXNfZWNo
byAidmVyc2lvbiBkaWZmZXJzIGZyb20gb2NhbWxjOyBvY2FtbG9wdC5vcHQgZGlzY2FyZGVkLiIg
PiY2OyB9CisJICAgZWxzZQorCSAgICAgIE9DQU1MT1BUPSRPQ0FNTE9QVERPVE9QVAorCSAgIGZp
CisgICAgICAgIGZpCisgICAgIGZpCiAKIAotZmkKLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBv
ZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0
IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCisgIGZpCisKKworCisgICMgY2hlY2tpbmcgZm9y
IG9jYW1sIHRvcGxldmVsCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAg
IyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9jYW1sIiwgc28g
aXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xf
cHJlZml4fW9jYW1sOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2lu
ZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9YR0VUVEVY
VCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfT0NBTUwrc2V0fSIg
PSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBjYXNl
ICRYR0VUVEVYVCBpbgotICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVY
VD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0
aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgor
ICBpZiB0ZXN0IC1uICIkT0NBTUwiOyB0aGVuCisgIGFjX2N2X3Byb2dfT0NBTUw9IiRPQ0FNTCIg
IyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZT
OyBJRlM9JFBBVEhfU0VQQVJBVE9SCiBmb3IgYXNfZGlyIGluICRQQVRICiBkbwogICBJRlM9JGFz
X3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4
ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCiAgIGlmIHsgdGVzdCAt
ZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8k
YWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX1hHRVRURVhUPSIk
YXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgIGFjX2N2X3Byb2dfT0NBTUw9IiR7YWNf
dG9vbF9wcmVmaXh9b2NhbWwiCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsg
MgogICBmaQpAQCAtNjMxMyw0NCArNDA2MSwzOSBAQCBkb25lCiAgIGRvbmUKIElGUz0kYXNfc2F2
ZV9JRlMKIAotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9Y
R0VUVEVYVD0ibm8iCi0gIDs7Ci1lc2FjCiBmaQotWEdFVFRFWFQ9JGFjX2N2X3BhdGhfWEdFVFRF
WFQKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRYR0VUVEVYVCIgPiY1Ci0kYXNfZWNobyAiJFhH
RVRURVhUIiA+JjY7IH0KK2ZpCitPQ0FNTD0kYWNfY3ZfcHJvZ19PQ0FNTAoraWYgdGVzdCAtbiAi
JE9DQU1MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IHJlc3VsdDogJE9DQU1MIiA+JjUKKyRhc19lY2hvICIkT0NBTUwiID4mNjsgfQogZWxzZQogICB7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQog
JGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCiAKIAotaWYgdGVzdCB4IiR7WEdFVFRFWFR9IiA9PSB4
Im5vIgotdGhlbgotICAgIGFzX2ZuX2Vycm9yICQ/ICJVbmFibGUgdG8gZmluZCB4Z2V0dGV4dCwg
cGxlYXNlIGluc3RhbGwgeGdldHRleHQiICIkTElORU5PIiA1CiBmaQotIyBFeHRyYWN0IHRoZSBm
aXJzdCB3b3JkIG9mICJhczg2Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJn
cy4KLXNldCBkdW1teSBhczg2OyBhY193b3JkPSQyCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19P
Q0FNTCI7IHRoZW4KKyAgYWNfY3RfT0NBTUw9JE9DQU1MCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qg
d29yZCBvZiAib2NhbWwiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgor
c2V0IGR1bW15IG9jYW1sOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVj
a2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9BUzg2
K3NldH0iID0gc2V0OyB0aGVuIDoKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9PQ0FNTCtz
ZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0g
IGNhc2UgJEFTODYgaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfQVM4Nj0i
JEFTODYiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7
OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGlmIHRl
c3QgLW4gIiRhY19jdF9PQ0FNTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTD0iJGFj
X2N0X09DQU1MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3Nh
dmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKIGZvciBhc19kaXIgaW4gJFBBVEgKIGRv
CiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAg
ICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KICAg
aWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94
ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3BhdGhf
QVM4Nj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICBhY19jdl9wcm9nX2FjX2N0
X09DQU1MPSJvY2FtbCIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAg
IGZpCkBAIC02MzU4LDQ0ICs0MTAxLDUzIEBAIGRvbmUKICAgZG9uZQogSUZTPSRhc19zYXZlX0lG
UwogCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0FTODYiICYmIGFjX2N2X3BhdGhfQVM4Nj0ibm8i
Ci0gIDs7Ci1lc2FjCiBmaQotQVM4Nj0kYWNfY3ZfcGF0aF9BUzg2Ci1pZiB0ZXN0IC1uICIkQVM4
NiI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1
bHQ6ICRBUzg2IiA+JjUKLSRhc19lY2hvICIkQVM4NiIgPiY2OyB9CitmaQorYWNfY3RfT0NBTUw9
JGFjX2N2X3Byb2dfYWNfY3RfT0NBTUwKK2lmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTCI7IHRoZW4K
KyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19j
dF9PQ0FNTCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X09DQU1MIiA+JjY7IH0KIGVsc2UKICAgeyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKICRh
c19lY2hvICJubyIgPiY2OyB9CiBmaQogCi0KLWlmIHRlc3QgeCIke0FTODZ9IiA9PSB4Im5vIgot
dGhlbgotICAgIGFzX2ZuX2Vycm9yICQ/ICJVbmFibGUgdG8gZmluZCBhczg2LCBwbGVhc2UgaW5z
dGFsbCBhczg2IiAiJExJTkVOTyIgNQorICBpZiB0ZXN0ICJ4JGFjX2N0X09DQU1MIiA9IHg7IHRo
ZW4KKyAgICBPQ0FNTD0ibm8iCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFj
X3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0
IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9v
bHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9
eWVzIDs7Citlc2FjCisgICAgT0NBTUw9JGFjX2N0X09DQU1MCisgIGZpCitlbHNlCisgIE9DQU1M
PSIkYWNfY3ZfcHJvZ19PQ0FNTCIKIGZpCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImxk
ODYiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGxk
ODY7IGFjX3dvcmQ9JDIKKworCisgICMgY2hlY2tpbmcgZm9yIG9jYW1sZGVwCisgIGlmIHRlc3Qg
LW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9m
ICIke2FjX3Rvb2xfcHJlZml4fW9jYW1sZGVwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1l
IHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW9jYW1sZGVwOyBhY193b3Jk
PSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZv
ciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+
JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9MRDg2K3NldH0iID0gc2V0OyB0aGVuIDoKK2lm
IHRlc3QgIiR7YWNfY3ZfcHJvZ19PQ0FNTERFUCtzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19l
Y2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGNhc2UgJExEODYgaW4KLSAgW1xcL10qIHwg
PzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfTEQ4Nj0iJExEODYiICMgTGV0IHRoZSB1c2VyIG92ZXJy
aWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZT
OyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGlmIHRlc3QgLW4gIiRPQ0FNTERFUCI7IHRoZW4KKyAg
YWNfY3ZfcHJvZ19PQ0FNTERFUD0iJE9DQU1MREVQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0
aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKIGZv
ciBhc19kaXIgaW4gJFBBVEgKIGRvCiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFz
X2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFi
bGVfZXh0ZW5zaW9uczsgZG8KICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4
ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsg
dGhlbgotICAgIGFjX2N2X3BhdGhfTEQ4Nj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIK
KyAgICBhY19jdl9wcm9nX09DQU1MREVQPSIke2FjX3Rvb2xfcHJlZml4fW9jYW1sZGVwIgogICAg
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFj
X3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkKQEAgLTY0MDMsNDQgKzQx
NTUsMzkgQEAgZG9uZQogICBkb25lCiBJRlM9JGFzX3NhdmVfSUZTCiAKLSAgdGVzdCAteiAiJGFj
X2N2X3BhdGhfTEQ4NiIgJiYgYWNfY3ZfcGF0aF9MRDg2PSJubyIKLSAgOzsKLWVzYWMKIGZpCi1M
RDg2PSRhY19jdl9wYXRoX0xEODYKLWlmIHRlc3QgLW4gIiRMRDg2IjsgdGhlbgotICB7ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJExEODYiID4mNQotJGFz
X2VjaG8gIiRMRDg2IiA+JjY7IH0KK2ZpCitPQ0FNTERFUD0kYWNfY3ZfcHJvZ19PQ0FNTERFUAor
aWYgdGVzdCAtbiAiJE9DQU1MREVQIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9DQU1MREVQIiA+JjUKKyRhc19lY2hvICIkT0NBTUxE
RVAiID4mNjsgfQogZWxzZQogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IHJlc3VsdDogbm8iID4mNQogJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCiAKIAotaWYgdGVz
dCB4IiR7TEQ4Nn0iID09IHgibm8iCi10aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0
byBmaW5kIGxkODYsIHBsZWFzZSBpbnN0YWxsIGxkODYiICIkTElORU5PIiA1CiBmaQotIyBFeHRy
YWN0IHRoZSBmaXJzdCB3b3JkIG9mICJiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUg
d2l0aCBhcmdzLgotc2V0IGR1bW15IGJjYzsgYWNfd29yZD0kMgoraWYgdGVzdCAteiAiJGFjX2N2
X3Byb2dfT0NBTUxERVAiOyB0aGVuCisgIGFjX2N0X09DQU1MREVQPSRPQ0FNTERFUAorICAjIEV4
dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm9jYW1sZGVwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3Jh
bSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBvY2FtbGRlcDsgYWNfd29yZD0kMgogeyAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQi
ID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0
ZXN0ICIke2FjX2N2X3BhdGhfQkNDK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmIHRlc3QgIiR7YWNf
Y3ZfcHJvZ19hY19jdF9PQ0FNTERFUCtzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24g
IihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGNhc2UgJEJDQyBpbgotICBbXFwvXSogfCA/OltcXC9d
KikKLSAgYWNfY3ZfcGF0aF9CQ0M9IiRCQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0
ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBB
VEhfU0VQQVJBVE9SCisgIGlmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTERFUCI7IHRoZW4KKyAgYWNf
Y3ZfcHJvZ19hY19jdF9PQ0FNTERFUD0iJGFjX2N0X09DQU1MREVQIiAjIExldCB0aGUgdXNlciBv
dmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBB
UkFUT1IKIGZvciBhc19kaXIgaW4gJFBBVEgKIGRvCiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVz
dCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFj
X2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193
b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNf
ZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3BhdGhfQkNDPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4
ZWNfZXh0IgorICAgIGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxERVA9Im9jYW1sZGVwIgogICAgICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dv
cmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkKQEAgLTY0NDgsNDQgKzQxOTUs
NTMgQEAgZG9uZQogICBkb25lCiBJRlM9JGFzX3NhdmVfSUZTCiAKLSAgdGVzdCAteiAiJGFjX2N2
X3BhdGhfQkNDIiAmJiBhY19jdl9wYXRoX0JDQz0ibm8iCi0gIDs7Ci1lc2FjCiBmaQotQkNDPSRh
Y19jdl9wYXRoX0JDQwotaWYgdGVzdCAtbiAiJEJDQyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCQ0MiID4mNQotJGFzX2VjaG8gIiRC
Q0MiID4mNjsgfQorZmkKK2FjX2N0X09DQU1MREVQPSRhY19jdl9wcm9nX2FjX2N0X09DQU1MREVQ
CitpZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxERVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0NBTUxERVAiID4mNQorJGFz
X2VjaG8gIiRhY19jdF9PQ0FNTERFUCIgPiY2OyB9CiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiAkYXNfZWNobyAibm8iID4m
NjsgfQogZmkKIAotCi1pZiB0ZXN0IHgiJHtCQ0N9IiA9PSB4Im5vIgotdGhlbgotICAgIGFzX2Zu
X2Vycm9yICQ/ICJVbmFibGUgdG8gZmluZCBiY2MsIHBsZWFzZSBpbnN0YWxsIGJjYyIgIiRMSU5F
Tk8iIDUKKyAgaWYgdGVzdCAieCRhY19jdF9PQ0FNTERFUCIgPSB4OyB0aGVuCisgICAgT0NBTUxE
RVA9Im5vIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5l
ZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FS
TklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+
JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVm
aXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNh
YworICAgIE9DQU1MREVQPSRhY19jdF9PQ0FNTERFUAorICBmaQorZWxzZQorICBPQ0FNTERFUD0i
JGFjX2N2X3Byb2dfT0NBTUxERVAiCiBmaQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJp
YXNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBp
YXNsOyBhY193b3JkPSQyCisKKworICAjIGNoZWNraW5nIGZvciBvY2FtbG1rdG9wCisgIGlmIHRl
c3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3Jk
IG9mICIke2FjX3Rvb2xfcHJlZml4fW9jYW1sbWt0b3AiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFt
IG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2NhbWxta3RvcDsg
YWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVj
a2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3Jk
Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfSUFTTCtzZXR9IiA9IHNldDsgdGhl
biA6CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfT0NBTUxNS1RPUCtzZXR9IiA9IHNldDsgdGhlbiA6
CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGNhc2UgJElBU0wgaW4KLSAg
W1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfSUFTTD0iJElBU0wiICMgTGV0IHRoZSB1
c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZl
X0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGlmIHRlc3QgLW4gIiRPQ0FNTE1LVE9Q
IjsgdGhlbgorICBhY19jdl9wcm9nX09DQU1MTUtUT1A9IiRPQ0FNTE1LVE9QIiAjIExldCB0aGUg
dXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFU
SF9TRVBBUkFUT1IKIGZvciBhc19kaXIgaW4gJFBBVEgKIGRvCiAgIElGUz0kYXNfc2F2ZV9JRlMK
ICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4g
JycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KICAgaWYgeyB0ZXN0IC1mICIkYXNfZGly
LyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFj
X2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3BhdGhfSUFTTD0iJGFzX2Rpci8kYWNfd29y
ZCRhY19leGVjX2V4dCIKKyAgICBhY19jdl9wcm9nX09DQU1MTUtUT1A9IiR7YWNfdG9vbF9wcmVm
aXh9b2NhbWxta3RvcCIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAg
IGZpCkBAIC02NDkzLDIzOCArNDI0OSw5MyBAQCBkb25lCiAgIGRvbmUKIElGUz0kYXNfc2F2ZV9J
RlMKIAotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9JQVNMIiAmJiBhY19jdl9wYXRoX0lBU0w9Im5v
IgotICA7OwotZXNhYwogZmkKLUlBU0w9JGFjX2N2X3BhdGhfSUFTTAotaWYgdGVzdCAtbiAiJElB
U0wiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVz
dWx0OiAkSUFTTCIgPiY1Ci0kYXNfZWNobyAiJElBU0wiID4mNjsgfQorZmkKK09DQU1MTUtUT1A9
JGFjX2N2X3Byb2dfT0NBTUxNS1RPUAoraWYgdGVzdCAtbiAiJE9DQU1MTUtUT1AiOyB0aGVuCisg
IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0NBTUxN
S1RPUCIgPiY1CiskYXNfZWNobyAiJE9DQU1MTUtUT1AiID4mNjsgfQogZWxzZQogICB7ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQogJGFzX2Vj
aG8gIm5vIiA+JjY7IH0KIGZpCiAKIAotaWYgdGVzdCB4IiR7SUFTTH0iID09IHgibm8iCi10aGVu
Ci0gICAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5kIGlhc2wsIHBsZWFzZSBpbnN0YWxs
IGlhc2wiICIkTElORU5PIiA1Ci1maQotCi1hY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIk
TElORU5PIiAidXVpZC91dWlkLmgiICJhY19jdl9oZWFkZXJfdXVpZF91dWlkX2giICIkYWNfaW5j
bHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3V1aWRfdXVpZF9oIiA9IHgi
InllczsgdGhlbiA6Ci0KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IGNoZWNraW5nIGZvciB1dWlkX2NsZWFyIGluIC1sdXVpZCIgPiY1Ci0kYXNfZWNob19uICJj
aGVja2luZyBmb3IgdXVpZF9jbGVhciBpbiAtbHV1aWQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7
YWNfY3ZfbGliX3V1aWRfdXVpZF9jbGVhcitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hv
X24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMK
LUxJQlM9Ii1sdXVpZCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVz
dC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0Mg
aW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVz
ZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFu
ZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lm
ZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgdXVpZF9jbGVhciAoKTsK
LWludAotbWFpbiAoKQotewotcmV0dXJuIHV1aWRfY2xlYXIgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7
Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNf
Y3ZfbGliX3V1aWRfdXVpZF9jbGVhcj15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX3V1aWRfdXVpZF9j
bGVhcj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQg
XAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVj
a19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiByZXN1bHQ6ICRhY19jdl9saWJfdXVpZF91dWlkX2NsZWFyIiA+JjUKLSRhc19lY2hvICIk
YWNfY3ZfbGliX3V1aWRfdXVpZF9jbGVhciIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl91
dWlkX3V1aWRfY2xlYXIiID0geCIieWVzOyB0aGVuIDoKLSAgbGlidXVpZD0ieSIKLWZpCi0KLQog
ZmkKLQotCi1hY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAidXVpZC5oIiAi
YWNfY3ZfaGVhZGVyX3V1aWRfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRh
Y19jdl9oZWFkZXJfdXVpZF9oIiA9IHgiInllczsgdGhlbiA6Ci0gIGxpYnV1aWQ9InkiCi1maQot
Ci0KLWlmIHRlc3QgIiRsaWJ1dWlkIiAhPSAieSI7IHRoZW4gOgotCi0gICAgYXNfZm5fZXJyb3Ig
JD8gImNhbm5vdCBmaW5kIGEgdmFsaWQgdXVpZCBsaWJyYXJ5IiAiJExJTkVOTyIgNQotCi1maQot
Ci0KLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJjdXJzZXMuaCIgImFj
X2N2X2hlYWRlcl9jdXJzZXNfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRh
Y19jdl9oZWFkZXJfY3Vyc2VzX2giID0geCIieWVzOyB0aGVuIDoKLQotICAgIHsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGNsZWFyIGluIC1sY3Vy
c2VzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBjbGVhciBpbiAtbGN1cnNlcy4uLiAi
ID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfY3Vyc2VzX2NsZWFyK3NldH0iID0gc2V0OyB0
aGVuIDoKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX09DQU1MTUtUT1AiOyB0aGVuCisgIGFjX2N0
X09DQU1MTUtUT1A9JE9DQU1MTUtUT1AKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJv
Y2FtbG1rdG9wIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBk
dW1teSBvY2FtbG1rdG9wOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVj
a2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19j
dF9PQ0FNTE1LVE9QK3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkg
IiA+JjYKIGVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxjdXJz
ZXMgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAot
LyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHBy
b3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0
IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMg
YXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVz
cGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGNsZWFyICgpOwotaW50Ci1tYWluICgpCi17
Ci1yZXR1cm4gY2xlYXIgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2Zu
X2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2N1cnNlc19jbGVhcj15
ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX2N1cnNlc19jbGVhcj1ubwotZmkKLXJtIC1mIGNvcmUgY29u
ZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBj
b25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfY3Vy
c2VzX2NsZWFyIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2N1cnNlc19jbGVhciIgPiY2OyB9
Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9jdXJzZXNfY2xlYXIiID0geCIieWVzOyB0aGVuIDoKLSAg
Y3Vyc2VzPSJ5IgotZWxzZQotICBjdXJzZXM9Im4iCi1maQotCi0KLWVsc2UKLSAgY3Vyc2VzPSJu
IgotZmkKLQotCi1hY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibmN1cnNl
cy5oIiAiYWNfY3ZfaGVhZGVyX25jdXJzZXNfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYg
dGVzdCAieCRhY19jdl9oZWFkZXJfbmN1cnNlc19oIiA9IHgiInllczsgdGhlbiA6Ci0KLSAgICB7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBjbGVh
ciBpbiAtbG5jdXJzZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGNsZWFyIGluIC1s
bmN1cnNlcy4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfbmN1cnNlc19jbGVhcitz
ZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgIGlmIHRl
c3QgLW4gIiRhY19jdF9PQ0FNTE1LVE9QIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X09DQU1M
TUtUT1A9IiRhY19jdF9PQ0FNTE1LVE9QIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVz
dC4KIGVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxuY3Vyc2Vz
ICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8q
IGVuZCBjb25mZGVmcy5oLiAgKi8KK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFU
T1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAt
eiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4
ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3Jk
JGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0
IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxNS1RPUD0ib2NhbWxta3RvcCIK
KyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGly
LyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRv
bmUKK0lGUz0kYXNfc2F2ZV9JRlMKIAotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90
b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBt
YXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFy
Z3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3Bs
dXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBjbGVhciAoKTsKLWludAotbWFpbiAoKQotewot
cmV0dXJuIGNsZWFyICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9j
X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9uY3Vyc2VzX2NsZWFyPXll
cwotZWxzZQotICBhY19jdl9saWJfbmN1cnNlc19jbGVhcj1ubwotZmkKLXJtIC1mIGNvcmUgY29u
ZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBj
b25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQoteyAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfbmN1
cnNlc19jbGVhciIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9uY3Vyc2VzX2NsZWFyIiA+JjY7
IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX25jdXJzZXNfY2xlYXIiID0geCIieWVzOyB0aGVuIDoK
LSAgbmN1cnNlcz0ieSIKLWVsc2UKLSAgbmN1cnNlcz0ibiIKIGZpCi0KLQorYWNfY3RfT0NBTUxN
S1RPUD0kYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTE1LVE9QCitpZiB0ZXN0IC1uICIkYWNfY3RfT0NB
TUxNS1RPUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiByZXN1bHQ6ICRhY19jdF9PQ0FNTE1LVE9QIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfT0NBTUxN
S1RPUCIgPiY2OyB9CiBlbHNlCi0gIG5jdXJzZXM9Im4iCi1maQotCi0KLWlmIHRlc3QgIiRjdXJz
ZXMiID0gIm4iICYmIHRlc3QgIiRuY3Vyc2VzIiA9ICJuIjsgdGhlbiA6Ci0KLSAgICBhc19mbl9l
cnJvciAkPyAiVW5hYmxlIHRvIGZpbmQgYSBzdWl0YWJsZSBjdXJzZXMgbGlicmFyeSIgIiRMSU5F
Tk8iIDUKLQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCi0jIFByZWZlciBuY3Vyc2VzIG92
ZXIgY3Vyc2VzIGlmIGJvdGggYXJlIHByZXNlbnQKLWlmIHRlc3QgIiRuY3Vyc2VzIiA9ICJ5Ijsg
dGhlbiA6Ci0KLSAgICBDVVJTRVNfTElCUz0iLWxuY3Vyc2VzIgotCi0kYXNfZWNobyAiI2RlZmlu
ZSBJTkNMVURFX0NVUlNFU19IIDxuY3Vyc2VzLmg+IiA+PmNvbmZkZWZzLmgKLQogCisgIGlmIHRl
c3QgIngkYWNfY3RfT0NBTUxNS1RPUCIgPSB4OyB0aGVuCisgICAgT0NBTUxNS1RPUD0ibm8iCisg
IGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6
KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2lu
ZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2Vj
aG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGgg
aG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgT0NB
TUxNS1RPUD0kYWNfY3RfT0NBTUxNS1RPUAorICBmaQogZWxzZQotCi0gICAgQ1VSU0VTX0xJQlM9
Ii1sY3Vyc2VzIgotCi0kYXNfZWNobyAiI2RlZmluZSBJTkNMVURFX0NVUlNFU19IIDxjdXJzZXMu
aD4iID4+Y29uZmRlZnMuaAotCi0KKyAgT0NBTUxNS1RPUD0iJGFjX2N2X3Byb2dfT0NBTUxNS1RP
UCIKIGZpCiAKIAotCi0KLQotCi0KLQotaWYgdGVzdCAieCRhY19jdl9lbnZfUEtHX0NPTkZJR19z
ZXQiICE9ICJ4c2V0IjsgdGhlbgotCWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4K
LSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXBrZy1jb25m
aWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7
YWNfdG9vbF9wcmVmaXh9cGtnLWNvbmZpZzsgYWNfd29yZD0kMgorICAjIGNoZWNraW5nIGZvciBv
Y2FtbG1rbGliCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRy
YWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9jYW1sbWtsaWIiLCBzbyBp
dCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9w
cmVmaXh9b2NhbWxta2xpYjsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hl
Y2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfUEtH
X0NPTkZJRytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2
Ci1lbHNlCi0gIGNhc2UgJFBLR19DT05GSUcgaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFj
X2N2X3BhdGhfUEtHX0NPTkZJRz0iJFBLR19DT05GSUciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRl
IHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJ
RlM9JFBBVEhfU0VQQVJBVE9SCitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfT0NBTUxNS0xJQitzZXR9
IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlm
IHRlc3QgLW4gIiRPQ0FNTE1LTElCIjsgdGhlbgorICBhY19jdl9wcm9nX09DQU1MTUtMSUI9IiRP
Q0FNTE1LTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3Nh
dmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKIGZvciBhc19kaXIgaW4gJFBBVEgKIGRv
CiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAg
ICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KICAg
aWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94
ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3BhdGhf
UEtHX0NPTkZJRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICBhY19jdl9wcm9n
X09DQU1MTUtMSUI9IiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxta2xpYiIKICAgICAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4
ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAgIGZpCkBAIC02NzMyLDEzICs0MzQzLDEyIEBAIGRv
bmUKICAgZG9uZQogSUZTPSRhc19zYXZlX0lGUwogCi0gIDs7Ci1lc2FjCiBmaQotUEtHX0NPTkZJ
Rz0kYWNfY3ZfcGF0aF9QS0dfQ09ORklHCi1pZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4K
LSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQS0df
Q09ORklHIiA+JjUKLSRhc19lY2hvICIkUEtHX0NPTkZJRyIgPiY2OyB9CitmaQorT0NBTUxNS0xJ
Qj0kYWNfY3ZfcHJvZ19PQ0FNTE1LTElCCitpZiB0ZXN0IC1uICIkT0NBTUxNS0xJQiI7IHRoZW4K
KyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPQ0FN
TE1LTElCIiA+JjUKKyRhc19lY2hvICIkT0NBTUxNS0xJQiIgPiY2OyB9CiBlbHNlCiAgIHsgJGFz
X2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiAkYXNf
ZWNobyAibm8iID4mNjsgfQpAQCAtNjc0NiwyOCArNDM1NiwyNiBAQCBmaQogCiAKIGZpCi1pZiB0
ZXN0IC16ICIkYWNfY3ZfcGF0aF9QS0dfQ09ORklHIjsgdGhlbgotICBhY19wdF9QS0dfQ09ORklH
PSRQS0dfQ09ORklHCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicGtnLWNvbmZpZyIs
IHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcGtnLWNv
bmZpZzsgYWNfd29yZD0kMgoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT0NBTUxNS0xJQiI7IHRo
ZW4KKyAgYWNfY3RfT0NBTUxNS0xJQj0kT0NBTUxNS0xJQgorICAjIEV4dHJhY3QgdGhlIGZpcnN0
IHdvcmQgb2YgIm9jYW1sbWtsaWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBh
cmdzLgorc2V0IGR1bW15IG9jYW1sbWtsaWI7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19l
Y2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19j
dl9wYXRoX2FjX3B0X1BLR19DT05GSUcrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgdGVzdCAiJHth
Y19jdl9wcm9nX2FjX2N0X09DQU1MTUtMSUIrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNo
b19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBjYXNlICRhY19wdF9QS0dfQ09ORklHIGluCi0g
IFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUc9IiRhY19w
dF9QS0dfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0
aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgor
ICBpZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxNS0xJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19j
dF9PQ0FNTE1LTElCPSIkYWNfY3RfT0NBTUxNS0xJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUg
dGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCiBm
b3IgYXNfZGlyIGluICRQQVRICiBkbwogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRh
c19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRh
YmxlX2V4dGVuc2lvbnM7IGRvCiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19l
eGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07
IHRoZW4KLSAgICBhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUc9IiRhc19kaXIvJGFjX3dvcmQk
YWNfZXhlY19leHQiCisgICAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTE1LTElCPSJvY2FtbG1rbGli
IgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19k
aXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkKQEAgLTY3NzUs
MjAgKzQzODMsMTkgQEAgZG9uZQogICBkb25lCiBJRlM9JGFzX3NhdmVfSUZTCiAKLSAgOzsKLWVz
YWMKIGZpCi1hY19wdF9QS0dfQ09ORklHPSRhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUcKLWlm
IHRlc3QgLW4gIiRhY19wdF9QS0dfQ09ORklHIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3B0X1BLR19DT05GSUciID4mNQotJGFz
X2VjaG8gIiRhY19wdF9QS0dfQ09ORklHIiA+JjY7IH0KK2ZpCithY19jdF9PQ0FNTE1LTElCPSRh
Y19jdl9wcm9nX2FjX2N0X09DQU1MTUtMSUIKK2lmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTE1LTElC
IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJGFjX2N0X09DQU1MTUtMSUIiID4mNQorJGFzX2VjaG8gIiRhY19jdF9PQ0FNTE1LTElCIiA+
JjY7IH0KIGVsc2UKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBy
ZXN1bHQ6IG5vIiA+JjUKICRhc19lY2hvICJubyIgPiY2OyB9CiBmaQogCi0gIGlmIHRlc3QgIngk
YWNfcHRfUEtHX0NPTkZJRyIgPSB4OyB0aGVuCi0gICAgUEtHX0NPTkZJRz0iIgorICBpZiB0ZXN0
ICJ4JGFjX2N0X09DQU1MTUtMSUIiID0geDsgdGhlbgorICAgIE9DQU1MTUtMSUI9Im5vIgogICBl
bHNlCiAgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgogeWVzOikK
QEAgLTY3OTYsNjcxICs0NDAzLDc2MiBAQCB5ZXM6KQogJGFzX2VjaG8gIiRhc19tZTogV0FSTklO
RzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7
fQogYWNfdG9vbF93YXJuZWQ9eWVzIDs7CiBlc2FjCi0gICAgUEtHX0NPTkZJRz0kYWNfcHRfUEtH
X0NPTkZJRworICAgIE9DQU1MTUtMSUI9JGFjX2N0X09DQU1MTUtMSUIKICAgZmkKIGVsc2UKLSAg
UEtHX0NPTkZJRz0iJGFjX2N2X3BhdGhfUEtHX0NPTkZJRyIKLWZpCi0KLWZpCi1pZiB0ZXN0IC1u
ICIkUEtHX0NPTkZJRyI7IHRoZW4KLQlfcGtnX21pbl92ZXJzaW9uPTAuOS4wCi0JeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBwa2ctY29uZmlnIGlzIGF0
IGxlYXN0IHZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb24iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tp
bmcgcGtnLWNvbmZpZyBpcyBhdCBsZWFzdCB2ZXJzaW9uICRfcGtnX21pbl92ZXJzaW9uLi4uICIg
PiY2OyB9Ci0JaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uICRfcGtn
X21pbl92ZXJzaW9uOyB0aGVuCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0JZWxzZQotCQl7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQot
JGFzX2VjaG8gIm5vIiA+JjY7IH0KLQkJUEtHX0NPTkZJRz0iIgotCWZpCisgIE9DQU1MTUtMSUI9
IiRhY19jdl9wcm9nX09DQU1MTUtMSUIiCiBmaQogCi1wa2dfZmFpbGVkPW5vCi17ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBnbGliIiA+JjUKLSRh
c19lY2hvX24gImNoZWNraW5nIGZvciBnbGliLi4uICIgPiY2OyB9CiAKLWlmIHRlc3QgLW4gIiRn
bGliX0NGTEFHUyI7IHRoZW4KLSAgICBwa2dfY3ZfZ2xpYl9DRkxBR1M9IiRnbGliX0NGTEFHUyIK
LSBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgotICAgIGlmIHRlc3QgLW4gIiRQS0df
Q09ORklHIiAmJiBcCi0gICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IFwkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcImdsaWItMi4wXCIiOyB9
ID4mNQotICAoJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgImdsaWItMi4wIikg
Mj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRo
ZW4KLSAgcGtnX2N2X2dsaWJfQ0ZMQUdTPWAkUEtHX0NPTkZJRyAtLWNmbGFncyAiZ2xpYi0yLjAi
IDI+L2Rldi9udWxsYAorICAjIGNoZWNraW5nIGZvciBvY2FtbGRvYworICBpZiB0ZXN0IC1uICIk
YWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHth
Y190b29sX3ByZWZpeH1vY2FtbGRvYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRo
IGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vY2FtbGRvYzsgYWNfd29yZD0kMgor
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFj
X3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9
CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfT0NBTUxET0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAk
YXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBwa2dfZmFpbGVkPXllcworICBpZiB0
ZXN0IC1uICIkT0NBTUxET0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfT0NBTUxET0M9IiRPQ0FNTERP
QyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0k
SUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9
JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFj
X2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVz
dCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rp
ci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX09DQU1MRE9D
PSIke2FjX3Rvb2xfcHJlZml4fW9jYW1sZG9jIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQor
ICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCiBmaQot
IGVsc2UKLSAgICBwa2dfZmFpbGVkPXVudHJpZWQKIGZpCi1pZiB0ZXN0IC1uICIkZ2xpYl9MSUJT
IjsgdGhlbgotICAgIHBrZ19jdl9nbGliX0xJQlM9IiRnbGliX0xJQlMiCi0gZWxpZiB0ZXN0IC1u
ICIkUEtHX0NPTkZJRyI7IHRoZW4KLSAgICBpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyIgJiYgXAot
ICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJFBLR19DT05G
SUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgXCJnbGliLTIuMFwiIjsgfSA+JjUKLSAgKCRQS0df
Q09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJnbGliLTIuMCIpIDI+JjUKLSAgYWNfc3Rh
dHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRh
Y19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCi0gIHBrZ19jdl9n
bGliX0xJQlM9YCRQS0dfQ09ORklHIC0tbGlicyAiZ2xpYi0yLjAiIDI+L2Rldi9udWxsYAorT0NB
TUxET0M9JGFjX2N2X3Byb2dfT0NBTUxET0MKK2lmIHRlc3QgLW4gIiRPQ0FNTERPQyI7IHRoZW4K
KyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPQ0FN
TERPQyIgPiY1CiskYXNfZWNobyAiJE9DQU1MRE9DIiA+JjY7IH0KIGVsc2UKLSAgcGtnX2ZhaWxl
ZD15ZXMKLWZpCi0gZWxzZQotICAgIHBrZ19mYWlsZWQ9dW50cmllZAorICB7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5v
IiA+JjY7IH0KIGZpCiAKIAorZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX09DQU1MRE9DIjsg
dGhlbgorICBhY19jdF9PQ0FNTERPQz0kT0NBTUxET0MKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3
b3JkIG9mICJvY2FtbGRvYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3Mu
CitzZXQgZHVtbXkgb2NhbWxkb2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24g
ImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9n
X2FjX2N0X09DQU1MRE9DK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hl
ZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MRE9DIjsgdGhlbgorICBh
Y19jdl9wcm9nX2FjX2N0X09DQU1MRE9DPSIkYWNfY3RfT0NBTUxET0MiICMgTGV0IHRoZSB1c2Vy
IG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NF
UEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0
ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAk
YWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFj
X3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhl
Y19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTERPQz0ib2NhbWxkb2Mi
CisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rp
ci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBk
b25lCitJRlM9JGFzX3NhdmVfSUZTCiAKLWlmIHRlc3QgJHBrZ19mYWlsZWQgPSB5ZXM7IHRoZW4K
LSAgIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8i
ID4mNQorZmkKK2ZpCithY19jdF9PQ0FNTERPQz0kYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTERPQwor
aWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MRE9DIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09DQU1MRE9DIiA+JjUKKyRhc19l
Y2hvICIkYWNfY3RfT0NBTUxET0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQogJGFzX2VjaG8gIm5vIiA+JjY7
IH0KK2ZpCiAKLWlmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAwLjIw
OyB0aGVuCi0gICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD15ZXMKKyAgaWYgdGVz
dCAieCRhY19jdF9PQ0FNTERPQyIgPSB4OyB0aGVuCisgICAgT0NBTUxET0M9Im5vIgorICBlbHNl
CisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jv
c3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIk
YXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3Qg
dHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIE9DQU1MRE9D
PSRhY19jdF9PQ0FNTERPQworICBmaQogZWxzZQotICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19z
dXBwb3J0ZWQ9bm8KKyAgT0NBTUxET0M9IiRhY19jdl9wcm9nX09DQU1MRE9DIgogZmkKLSAgICAg
ICAgaWYgdGVzdCAkX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkID0geWVzOyB0aGVuCi0JICAg
ICAgICBnbGliX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQt
ZXJyb3JzICJnbGliLTIuMCIgMj4mMWAKLSAgICAgICAgZWxzZQotCSAgICAgICAgZ2xpYl9QS0df
RVJST1JTPWAkUEtHX0NPTkZJRyAtLXByaW50LWVycm9ycyAiZ2xpYi0yLjAiIDI+JjFgCi0gICAg
ICAgIGZpCi0JIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVy
ZSBpdCBiZWxvbmdzCi0JZWNobyAiJGdsaWJfUEtHX0VSUk9SUyIgPiY1Ci0KLQlhc19mbl9lcnJv
ciAkPyAiUGFja2FnZSByZXF1aXJlbWVudHMgKGdsaWItMi4wKSB3ZXJlIG5vdCBtZXQ6Ci0KLSRn
bGliX1BLR19FUlJPUlMKLQotQ29uc2lkZXIgYWRqdXN0aW5nIHRoZSBQS0dfQ09ORklHX1BBVEgg
ZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgeW91Ci1pbnN0YWxsZWQgc29mdHdhcmUgaW4gYSBub24t
c3RhbmRhcmQgcHJlZml4LgotCi1BbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IHNldCB0aGUgZW52aXJv
bm1lbnQgdmFyaWFibGVzIGdsaWJfQ0ZMQUdTCi1hbmQgZ2xpYl9MSUJTIHRvIGF2b2lkIHRoZSBu
ZWVkIHRvIGNhbGwgcGtnLWNvbmZpZy4KLVNlZSB0aGUgcGtnLWNvbmZpZyBtYW4gcGFnZSBmb3Ig
bW9yZSBkZXRhaWxzLiIgIiRMSU5FTk8iIDUKLWVsaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHVudHJp
ZWQ7IHRoZW4KLSAgICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCXsgeyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFz
X2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3Ig
JD8gIlRoZSBwa2ctY29uZmlnIHNjcmlwdCBjb3VsZCBub3QgYmUgZm91bmQgb3IgaXMgdG9vIG9s
ZC4gIE1ha2Ugc3VyZSBpdAotaXMgaW4geW91ciBQQVRIIG9yIHNldCB0aGUgUEtHX0NPTkZJRyBl
bnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgZnVsbAotcGF0aCB0byBwa2ctY29uZmlnLgogCi1B
bHRlcm5hdGl2ZWx5LCB5b3UgbWF5IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGdsaWJf
Q0ZMQUdTCi1hbmQgZ2xpYl9MSUJTIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGNhbGwgcGtnLWNvbmZp
Zy4KLVNlZSB0aGUgcGtnLWNvbmZpZyBtYW4gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgogCi1UbyBn
ZXQgcGtnLWNvbmZpZywgc2VlIDxodHRwOi8vcGtnLWNvbmZpZy5mcmVlZGVza3RvcC5vcmcvPi4K
LVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsgfQorICAj
IGNoZWNraW5nIGZvciBvY2FtbGJ1aWxkCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7
IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9j
YW1sYnVpbGQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1
bW15ICR7YWNfdG9vbF9wcmVmaXh9b2NhbWxidWlsZDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQor
JGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIk
e2FjX2N2X3Byb2dfT0NBTUxCVUlMRCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24g
IihjYWNoZWQpICIgPiY2CiBlbHNlCi0JZ2xpYl9DRkxBR1M9JHBrZ19jdl9nbGliX0NGTEFHUwot
CWdsaWJfTElCUz0kcGtnX2N2X2dsaWJfTElCUwotICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hvICJ5ZXMiID4m
NjsgfQotCi1maQotCi0jIENoZWNrIGxpYnJhcnkgcGF0aAotaWYgdGVzdCAiXCR7ZXhlY19wcmVm
aXh9L2xpYiIgPSAiJGxpYmRpciI7IHRoZW4gOgotICBpZiB0ZXN0ICIkZXhlY19wcmVmaXgiID0g
Ik5PTkUiICYmIHRlc3QgIiRwcmVmaXgiICE9ICJOT05FIjsgdGhlbiA6Ci0gIGV4ZWNfcHJlZml4
PSRwcmVmaXgKKyAgaWYgdGVzdCAtbiAiJE9DQU1MQlVJTEQiOyB0aGVuCisgIGFjX2N2X3Byb2df
T0NBTUxCVUlMRD0iJE9DQU1MQlVJTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0
LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2Rp
ciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAm
JiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRl
bnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQi
ICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisg
ICAgYWNfY3ZfcHJvZ19PQ0FNTEJVSUxEPSIke2FjX3Rvb2xfcHJlZml4fW9jYW1sYnVpbGQiCisg
ICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8k
YWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25l
CitJRlM9JGFzX3NhdmVfSUZTCisKIGZpCi0gICAgaWYgdGVzdCAiJGV4ZWNfcHJlZml4IiA9ICJO
T05FIjsgdGhlbiA6Ci0gIGV4ZWNfcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAogZmkKLSAgICBp
ZiB0ZXN0IC1kICIke2V4ZWNfcHJlZml4fS9saWI2NCI7IHRoZW4gOgotCi0gICAgICAgIExJQl9Q
QVRIPSJsaWI2NCIKLQorT0NBTUxCVUlMRD0kYWNfY3ZfcHJvZ19PQ0FNTEJVSUxECitpZiB0ZXN0
IC1uICIkT0NBTUxCVUlMRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiByZXN1bHQ6ICRPQ0FNTEJVSUxEIiA+JjUKKyRhc19lY2hvICIkT0NBTUxCVUlM
RCIgPiY2OyB9CiBlbHNlCi0KLSAgICAgICAgTElCX1BBVEg9ImxpYiIKLQorICB7ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8g
Im5vIiA+JjY7IH0KIGZpCiAKLWVsc2UKLQotICAgIExJQl9QQVRIPSIke2xpYmRpcjpgZXhwciBs
ZW5ndGggIiRleGVjX3ByZWZpeCIgKyAxYH0iCiAKIGZpCi0KLQotIyBDaGVja3MgZm9yIGxpYnJh
cmllcy4KLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJiemxpYi5oIiAi
YWNfY3ZfaGVhZGVyX2J6bGliX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngk
YWNfY3ZfaGVhZGVyX2J6bGliX2giID0geCIieWVzOyB0aGVuIDoKLQoteyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQloyX2J6RGVjb21wcmVzc0lu
aXQgaW4gLWxiejIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEJaMl9iekRlY29tcHJl
c3NJbml0IGluIC1sYnoyLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9iejJfQloy
X2J6RGVjb21wcmVzc0luaXQrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgdGVzdCAteiAiJGFjX2N2
X3Byb2dfT0NBTUxCVUlMRCI7IHRoZW4KKyAgYWNfY3RfT0NBTUxCVUlMRD0kT0NBTUxCVUlMRAor
ICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm9jYW1sYnVpbGQiLCBzbyBpdCBjYW4gYmUg
YSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG9jYW1sYnVpbGQ7IGFjX3dvcmQ9
JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9y
ICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4m
NjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X09DQU1MQlVJTEQrc2V0fSIgPSBzZXQ7
IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBhY19jaGVja19s
aWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGJ6MiAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAt
IDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8q
IE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgot
ICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEg
R0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3Rp
bGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNo
YXIgQloyX2J6RGVjb21wcmVzc0luaXQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBCWjJf
YnpEZWNvbXByZXNzSW5pdCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNf
Zm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfYnoyX0JaMl9iekRl
Y29tcHJlc3NJbml0PXllcworICBpZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxCVUlMRCI7IHRoZW4K
KyAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTEJVSUxEPSIkYWNfY3RfT0NBTUxCVUlMRCIgIyBMZXQg
dGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCiBlbHNlCi0gIGFjX2N2X2xpYl9iejJfQloyX2J6
RGVjb21wcmVzc0luaXQ9bm8KK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IK
K2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAi
JGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1
dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFj
X2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0Ijsg
fTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxCVUlMRD0ib2NhbWxidWlsZCIKKyAg
ICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRh
Y193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUK
K0lGUz0kYXNfc2F2ZV9JRlMKKwogZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0
LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1M
SUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfYnoyX0JaMl9iekRlY29tcHJlc3NJ
bml0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2J6Ml9CWjJfYnpEZWNvbXByZXNzSW5pdCIg
PiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9iejJfQloyX2J6RGVjb21wcmVzc0luaXQiID0g
eCIieWVzOyB0aGVuIDoKLSAgemxpYj0iJHpsaWIgLURIQVZFX0JaTElCIC1sYnoyIgorYWNfY3Rf
T0NBTUxCVUlMRD0kYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTEJVSUxECitpZiB0ZXN0IC1uICIkYWNf
Y3RfT0NBTUxCVUlMRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiByZXN1bHQ6ICRhY19jdF9PQ0FNTEJVSUxEIiA+JjUKKyRhc19lY2hvICIkYWNfY3Rf
T0NBTUxCVUlMRCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAot
CisgIGlmIHRlc3QgIngkYWNfY3RfT0NBTUxCVUlMRCIgPSB4OyB0aGVuCisgICAgT0NBTUxCVUlM
RD0ibm8iCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVk
IGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJO
SU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4m
NQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZp
eGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2Fj
CisgICAgT0NBTUxCVUlMRD0kYWNfY3RfT0NBTUxCVUlMRAorICBmaQorZWxzZQorICBPQ0FNTEJV
SUxEPSIkYWNfY3ZfcHJvZ19PQ0FNTEJVSUxEIgogZmkKIAogCi1hY19mbl9jX2NoZWNrX2hlYWRl
cl9tb25ncmVsICIkTElORU5PIiAibHptYS5oIiAiYWNfY3ZfaGVhZGVyX2x6bWFfaCIgIiRhY19p
bmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbHptYV9oIiA9IHgiInll
czsgdGhlbiA6CisgICAgaWYgdGVzdCAieCRPQ0FNTEMiID0gInhubyI7IHRoZW4gOgogCi17ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsem1hX3N0
cmVhbV9kZWNvZGVyIGluIC1sbHptYSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgbHpt
YV9zdHJlYW1fZGVjb2RlciBpbiAtbGx6bWEuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zf
bGliX2x6bWFfbHptYV9zdHJlYW1fZGVjb2RlcitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19l
Y2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJ
QlMKLUxJQlM9Ii1sbHptYSAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25m
dGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCisgICAgICAgIGlmIHRlc3QgIngk
ZW5hYmxlX29jYW1sdG9vbHMiID0gInh5ZXMiOyB0aGVuIDoKIAotLyogT3ZlcnJpZGUgYW55IEdD
QyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNh
dXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4g
YW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0j
aWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBsem1hX3N0cmVhbV9k
ZWNvZGVyICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gbHptYV9zdHJlYW1fZGVjb2RlciAo
KTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJ
TkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfbHptYV9sem1hX3N0cmVhbV9kZWNvZGVyPXllcwot
ZWxzZQotICBhY19jdl9saWJfbHptYV9sem1hX3N0cmVhbV9kZWNvZGVyPW5vCi1maQotcm0gLWYg
Y29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNf
ZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKKyAg
ICAgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJPY2FtbCB0b29scyBlbmFibGVkLCBidXQgdW5hYmxl
IHRvIGZpbmQgT2NhbWwiICIkTElORU5PIiA1CiBmaQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfbHptYV9sem1hX3N0cmVhbV9kZWNv
ZGVyIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2x6bWFfbHptYV9zdHJlYW1fZGVjb2RlciIg
PiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9sem1hX2x6bWFfc3RyZWFtX2RlY29kZXIiID0g
eCIieWVzOyB0aGVuIDoKLSAgemxpYj0iJHpsaWIgLURIQVZFX0xaTUEgLWxsem1hIgorICAgICAg
ICBvY2FtbHRvb2xzPSJuIgorCiBmaQogCitmaQorIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9m
ICJiYXNoIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1t
eSBiYXNoOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Ig
JGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9CQVNIK3NldH0iID0g
c2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAk
QkFTSCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9CQVNIPSIkQkFTSCIg
IyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICop
CisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4g
JFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNf
ZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9u
czsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAk
YXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFj
X2N2X3BhdGhfQkFTSD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFj
X2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNf
c2F2ZV9JRlMKIAorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9CQVNIIiAmJiBhY19jdl9wYXRoX0JB
U0g9Im5vIgorICA7OworZXNhYworZmkKK0JBU0g9JGFjX2N2X3BhdGhfQkFTSAoraWYgdGVzdCAt
biAiJEJBU0giOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogcmVzdWx0OiAkQkFTSCIgPiY1CiskYXNfZWNobyAiJEJBU0giID4mNjsgfQorZWxzZQorICB7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQor
JGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCiAKIAotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3Jl
bCAiJExJTkVOTyIgImx6by9sem8xeC5oIiAiYWNfY3ZfaGVhZGVyX2x6b19sem8xeF9oIiAiJGFj
X2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9sem9fbHpvMXhfaCIg
PSB4IiJ5ZXM7IHRoZW4gOgoraWYgdGVzdCB4IiR7QkFTSH0iID09IHgibm8iCit0aGVuCisgICAg
YXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5kIGJhc2gsIHBsZWFzZSBpbnN0YWxsIGJhc2gi
ICIkTElORU5PIiA1CitmaQogCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IGNoZWNraW5nIGZvciBsem8xeF9kZWNvbXByZXNzIGluIC1sbHpvMiIgPiY1Ci0kYXNfZWNo
b19uICJjaGVja2luZyBmb3IgbHpvMXhfZGVjb21wcmVzcyBpbiAtbGx6bzIuLi4gIiA+JjY7IH0K
LWlmIHRlc3QgIiR7YWNfY3ZfbGliX2x6bzJfbHpvMXhfZGVjb21wcmVzcytzZXR9IiA9IHNldDsg
dGhlbiA6CithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRD
QyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRD
QyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRl
c3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJf
Z251Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhv
dyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhv
dyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yLi4uICIgPiY2OyB9CisjIE9uIFN1bnMsIHNvbWV0
aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAt
ZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCisgIGlm
IHRlc3QgIiR7YWNfY3ZfcHJvZ19DUFArc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19u
ICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1M
SUJTPSItbGx6bzIgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3Qu
JGFjX2V4dAorICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1BQIG5lZWRzIHRvIGJlIGV4
cGFuZGVkCisgICAgZm9yIENQUCBpbiAiJENDIC1FIiAiJENDIC1FIC10cmFkaXRpb25hbC1jcHAi
ICIvbGliL2NwcCIKKyAgICBkbworICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2Nf
cHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRo
YXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNo
IGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQu
aD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBl
dmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1
bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3Qg
dGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgor
ICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29u
ZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRv
IGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhl
IHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBw
cm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRl
cm4gIkMiCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBp
bmNsdWRlIDxhc3NlcnQuaD4KICNlbmRpZgotY2hhciBsem8xeF9kZWNvbXByZXNzICgpOwotaW50
Ci1tYWluICgpCi17Ci1yZXR1cm4gbHpvMXhfZGVjb21wcmVzcyAoKTsKLSAgOwotICByZXR1cm4g
MDsKLX0KKwkJICAgICBTeW50YXggZXJyb3IKIF9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAi
JExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfbHpvMl9sem8xeF9kZWNvbXByZXNzPXllcwor
aWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisKIGVsc2UKLSAgYWNfY3ZfbGli
X2x6bzJfbHpvMXhfZGVjb21wcmVzcz1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNv
bmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNf
ZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfbHpvMl9sem8xeF9kZWNv
bXByZXNzIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2x6bzJfbHpvMXhfZGVjb21wcmVzcyIg
PiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9sem8yX2x6bzF4X2RlY29tcHJlc3MiID0geCIi
eWVzOyB0aGVuIDoKLSAgemxpYj0iJHpsaWIgLURIQVZFX0xaTzFYIC1sbHpvMiIKKyAgIyBCcm9r
ZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKIGZpCitybSAtZiBjb25mdGVzdC5l
cnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CiAKLQorICAjIE9LLCB3b3JrcyBvbiBzYW5l
IGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBi
ZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVz
dC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3Rl
bnQuaD4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgICMg
QnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICAjIFBh
c3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhawogZmkKK3JtIC1mIGNvbmZ0
ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKIAorZG9uZQorIyBCZWNhdXNlIG9m
IGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQu
CitybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNf
cHJlcHJvY19vazsgdGhlbiA6CisgIGJyZWFrCitmaQogCisgICAgZG9uZQorICAgIGFjX2N2X3By
b2dfQ1BQPSRDUFAKIAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBj
aGVja2luZyBmb3IgaW9fc2V0dXAgaW4gLWxhaW8iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcg
Zm9yIGlvX3NldHVwIGluIC1sYWlvLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9h
aW9faW9fc2V0dXArc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAi
ID4mNgorZmkKKyAgQ1BQPSRhY19jdl9wcm9nX0NQUAogZWxzZQotICBhY19jaGVja19saWJfc2F2
ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGFpbyAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FD
RU9GID5jb25mdGVzdC4kYWNfZXh0CisgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKK2ZpCit7ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENQUCIgPiY1CiskYXNf
ZWNobyAiJENQUCIgPiY2OyB9CithY19wcmVwcm9jX29rPWZhbHNlCitmb3IgYWNfY19wcmVwcm9j
X3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21l
cyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3Mt
Y29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBf
X1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24g
ZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUg
Y29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdo
IGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCBj
b25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5o
LiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQg
YW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJu
IHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlw
ZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIK
KyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUg
PGFzc2VydC5oPgogI2VuZGlmCi1jaGFyIGlvX3NldHVwICgpOwotaW50Ci1tYWluICgpCi17Ci1y
ZXR1cm4gaW9fc2V0dXAgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19CisJCSAgICAgU3ludGF4IGVy
cm9yCiBfQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNf
Y3ZfbGliX2Fpb19pb19zZXR1cD15ZXMKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRo
ZW4gOgorCiBlbHNlCi0gIGFjX2N2X2xpYl9haW9faW9fc2V0dXA9bm8KKyAgIyBCcm9rZW46IGZh
aWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKIGZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVy
ciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3Qu
JGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworcm0gLWYgY29uZnRlc3QuZXJy
IGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAorCisgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2Fz
ZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCisgICMgY2FuIGJlIGRl
dGVjdGVkIGFuZCBob3cuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRh
Y19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxhY19ub25leGlzdGVudC5o
PgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIyBCcm9r
ZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitlbHNlCisgICMgUGFzc2Vz
IGJvdGggdGVzdHMuCithY19wcmVwcm9jX29rPToKK2JyZWFrCiBmaQoteyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfYWlvX2lvX3NldHVw
IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2Fpb19pb19zZXR1cCIgPiY2OyB9Ci1pZiB0ZXN0
ICJ4JGFjX2N2X2xpYl9haW9faW9fc2V0dXAiID0geCIieWVzOyB0aGVuIDoKLSAgc3lzdGVtX2Fp
bz0ieSIKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKwor
ZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5n
IGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVz
dC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6CisKIGVsc2UKLSAgc3lzdGVtX2Fp
bz0ibiIKKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9y
OiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNf
cHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFp
bHMgc2FuaXR5IGNoZWNrCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJ
TkVOTyIgNSA7IH0KIGZpCiAKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNf
Y29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1Jwor
YWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERG
TEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3Zf
Y19jb21waWxlcl9nbnUKKwogCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IGNoZWNraW5nIGZvciBNRDUgaW4gLWxjcnlwdG8iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tp
bmcgZm9yIE1ENSBpbiAtbGNyeXB0by4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJf
Y3J5cHRvX01ENStzZXR9IiA9IHNldDsgdGhlbiA6Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVz
IGFuZCAtZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMg
bG9uZyBsaW5lcyBhbmQgLWUuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9HUkVQ
K3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UK
LSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxjcnlwdG8gICRMSUJTIgot
Y2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZk
ZWZzLmguICAqLworICBpZiB0ZXN0IC16ICIkR1JFUCI7IHRoZW4KKyAgYWNfcGF0aF9HUkVQX2Zv
dW5kPWZhbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3Ig
ZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBB
UkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCitk
bworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisg
ICAgZm9yIGFjX3Byb2cgaW4gZ3JlcCBnZ3JlcDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4g
JycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGFjX3BhdGhfR1JFUD0iJGFz
X2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfR1JF
UCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfR1JFUCI7IH0gfHwgY29udGludWUKKyMgQ2hlY2sg
Zm9yIEdOVSBhY19wYXRoX0dSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgIyBD
aGVjayBmb3IgR05VICRhY19wYXRoX0dSRVAKK2Nhc2UgYCIkYWNfcGF0aF9HUkVQIiAtLXZlcnNp
b24gMj4mMWAgaW4KKypHTlUqKQorICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiIGFj
X3BhdGhfR1JFUF9mb3VuZD06OzsKKyopCisgIGFjX2NvdW50PTAKKyAgJGFzX2VjaG9fbiAwMTIz
NDU2Nzg5ID4iY29uZnRlc3QuaW4iCisgIHdoaWxlIDoKKyAgZG8KKyAgICBjYXQgImNvbmZ0ZXN0
LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgorICAgIG12ICJjb25mdGVzdC50bXAi
ICJjb25mdGVzdC5pbiIKKyAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKKyAgICAk
YXNfZWNobyAnR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9HUkVQIiAtZSAn
R1JFUCQnIC1lICctKGNhbm5vdCBtYXRjaCktJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5v
dXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRl
c3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3Vu
dCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2Fj
X3BhdGhfR1JFUF9tYXgtMH07IHRoZW4KKyAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0
IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQorICAgICAgYWNfY3ZfcGF0aF9HUkVQ
PSIkYWNfcGF0aF9HUkVQIgorICAgICAgYWNfcGF0aF9HUkVQX21heD0kYWNfY291bnQKKyAgICBm
aQorICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gK
KyAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKyAgZG9uZQorICBybSAtZiBjb25m
dGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKK2VzYWMKIAot
LyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3Iu
Ci0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2Yg
YSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBz
dGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgot
Y2hhciBNRDUgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBNRDUgKCk7Ci0gIDsKLSAgcmV0
dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoK
LSAgYWNfY3ZfbGliX2NyeXB0b19NRDU9eWVzCisgICAgICAkYWNfcGF0aF9HUkVQX2ZvdW5kICYm
IGJyZWFrIDMKKyAgICBkb25lCisgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworICBp
ZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HUkVQIjsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJu
byBhY2NlcHRhYmxlIGdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1Iv
dXNyL3hwZzQvYmluIiAiJExJTkVOTyIgNQorICBmaQogZWxzZQotICBhY19jdl9saWJfY3J5cHRv
X01ENT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQg
XAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVj
a19saWJfc2F2ZV9MSUJTCisgIGFjX2N2X3BhdGhfR1JFUD0kR1JFUAogZmkKLXsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2NyeXB0b19N
RDUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfY3J5cHRvX01ENSIgPiY2OyB9Ci1pZiB0ZXN0
ICJ4JGFjX2N2X2xpYl9jcnlwdG9fTUQ1IiA9IHgiInllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZk
ZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MSUJDUllQVE8gMQotX0FDRU9GCi0KLSAgTElC
Uz0iLWxjcnlwdG8gJExJQlMiCiAKLWVsc2UKLSAgYXNfZm5fZXJyb3IgJD8gIkNvdWxkIG5vdCBm
aW5kIGxpYmNyeXB0byIgIiRMSU5FTk8iIDUKIGZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfR1JFUCIgPiY1CiskYXNfZWNobyAi
JGFjX2N2X3BhdGhfR1JFUCIgPiY2OyB9CisgR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKIAoteyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZXh0MmZz
X29wZW4yIGluIC1sZXh0MmZzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBleHQyZnNf
b3BlbjIgaW4gLWxleHQyZnMuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX2V4dDJm
c19leHQyZnNfb3BlbjIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorCit7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBlZ3JlcCIgPiY1CiskYXNfZWNob19u
ICJjaGVja2luZyBmb3IgZWdyZXAuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9F
R1JFUCtzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBl
bHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sZXh0MmZzICAkTElC
UyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBj
b25mZGVmcy5oLiAgKi8KKyAgaWYgZWNobyBhIHwgJEdSRVAgLUUgJyhhfGIpJyA+L2Rldi9udWxs
IDI+JjEKKyAgIHRoZW4gYWNfY3ZfcGF0aF9FR1JFUD0iJEdSRVAgLUUiCisgICBlbHNlCisgICAg
IGlmIHRlc3QgLXogIiRFR1JFUCI7IHRoZW4KKyAgYWNfcGF0aF9FR1JFUF9mb3VuZD1mYWxzZQor
ICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJP
R05BTUUtTElTVAorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3Ig
YXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgorZG8KKyAgSUZTPSRh
c19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19w
cm9nIGluIGVncmVwOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJs
ZV9leHRlbnNpb25zOyBkbworICAgICAgYWNfcGF0aF9FR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRh
Y19leGVjX2V4dCIKKyAgICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfRUdSRVAiICYmICRhc190ZXN0
X3ggIiRhY19wYXRoX0VHUkVQIjsgfSB8fCBjb250aW51ZQorIyBDaGVjayBmb3IgR05VIGFjX3Bh
dGhfRUdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgIyBDaGVjayBmb3IgR05V
ICRhY19wYXRoX0VHUkVQCitjYXNlIGAiJGFjX3BhdGhfRUdSRVAiIC0tdmVyc2lvbiAyPiYxYCBp
bgorKkdOVSopCisgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIiBhY19wYXRoX0VH
UkVQX2ZvdW5kPTo7OworKikKKyAgYWNfY291bnQ9MAorICAkYXNfZWNob19uIDAxMjM0NTY3ODkg
PiJjb25mdGVzdC5pbiIKKyAgd2hpbGUgOgorICBkbworICAgIGNhdCAiY29uZnRlc3QuaW4iICJj
b25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCisgICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0
ZXN0LmluIgorICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgorICAgICRhc19lY2hv
ICdFR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9FR1JFUCIgJ0VHUkVQJCcg
PCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworICAg
IGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJl
YWsKKyAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKKyAg
ICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0VHUkVQX21heC0wfTsgdGhlbgorICAg
ICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0
ZXIgb25lCisgICAgICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIKKyAgICAgIGFj
X3BhdGhfRUdSRVBfbWF4PSRhY19jb3VudAorICAgIGZpCisgICAgIyAxMCooMl4xMCkgY2hhcnMg
YXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGFjX2NvdW50IC1ndCAx
MCAmJiBicmVhaworICBkb25lCisgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25m
dGVzdC5ubCBjb25mdGVzdC5vdXQ7OworZXNhYwogCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVy
bmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50
IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhl
biBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBf
X2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGV4dDJmc19vcGVuMiAoKTsKLWlu
dAotbWFpbiAoKQotewotcmV0dXJuIGV4dDJmc19vcGVuMiAoKTsKLSAgOwotICByZXR1cm4gMDsK
LX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19j
dl9saWJfZXh0MmZzX2V4dDJmc19vcGVuMj15ZXMKKyAgICAgICRhY19wYXRoX0VHUkVQX2ZvdW5k
ICYmIGJyZWFrIDMKKyAgICBkb25lCisgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUwor
ICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9FR1JFUCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAk
PyAibm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFS
QVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CisgIGZpCiBlbHNlCi0gIGFjX2N2X2xpYl9l
eHQyZnNfZXh0MmZzX29wZW4yPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRl
c3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQK
LUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKKyAgYWNfY3ZfcGF0aF9FR1JFUD0kRUdSRVAK
IGZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFj
X2N2X2xpYl9leHQyZnNfZXh0MmZzX29wZW4yIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2V4
dDJmc19leHQyZnNfb3BlbjIiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfZXh0MmZzX2V4
dDJmc19vcGVuMiIgPSB4IiJ5ZXM7IHRoZW4gOgotICBsaWJleHQyZnM9InkiCi1lbHNlCi0gIGxp
YmV4dDJmcz0ibiIKKworICAgZmkKIGZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfRUdSRVAiID4mNQorJGFzX2VjaG8gIiRhY19j
dl9wYXRoX0VHUkVQIiA+JjY7IH0KKyBFR1JFUD0iJGFjX2N2X3BhdGhfRUdSRVAiCiAKIAoteyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2NyeV9t
ZF9oYXNoX2J1ZmZlciBpbiAtbGdjcnlwdCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Ig
Z2NyeV9tZF9oYXNoX2J1ZmZlciBpbiAtbGdjcnlwdC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHth
Y19jdl9saWJfZ2NyeXB0X2djcnlfbWRfaGFzaF9idWZmZXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgor
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQU5T
SSBDIGhlYWRlciBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhl
YWRlciBmaWxlcy4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfc3RkYytzZXR9
IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGFj
X2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sZ2NyeXB0ICAkTElCUyIKLWNhdCBj
b25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKyAgY2F0IGNvbmZkZWZzLmgg
LSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lu
Y2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5o
PgorI2luY2x1ZGUgPGZsb2F0Lmg+CiAKLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJv
dG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQg
bWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBh
cmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNw
bHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZ2NyeV9tZF9oYXNoX2J1ZmZlciAoKTsKIGlu
dAogbWFpbiAoKQogewotcmV0dXJuIGdjcnlfbWRfaGFzaF9idWZmZXIgKCk7CisKICAgOwogICBy
ZXR1cm4gMDsKIH0KIF9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4g
OgotICBhY19jdl9saWJfZ2NyeXB0X2djcnlfbWRfaGFzaF9idWZmZXI9eWVzCi1lbHNlCi0gIGFj
X2N2X2xpYl9nY3J5cHRfZ2NyeV9tZF9oYXNoX2J1ZmZlcj1ubwotZmkKLXJtIC1mIGNvcmUgY29u
ZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBj
b25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZ2Ny
eXB0X2djcnlfbWRfaGFzaF9idWZmZXIiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfZ2NyeXB0
X2djcnlfbWRfaGFzaF9idWZmZXIiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfZ2NyeXB0
X2djcnlfbWRfaGFzaF9idWZmZXIiID0geCIieWVzOyB0aGVuIDoKLSAgbGliZ2NyeXB0PSJ5Igor
aWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9oZWFkZXJf
c3RkYz15ZXMKIGVsc2UKLSAgbGliZ2NyeXB0PSJuIgorICBhY19jdl9oZWFkZXJfc3RkYz1ubwog
ZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3Qu
JGFjX2V4dAogCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIFN1
bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0ku
CisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBj
b25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KIAorX0FDRU9GCitpZiAoZXZhbCAi
JGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAibWVtY2hyIiA+L2Rl
di9udWxsIDI+JjE7IHRoZW4gOgogCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiBjaGVja2luZyBmb3IgcHRocmVhZCBmbGFnIiA+JjUKLSRhc19lY2hvX24gImNo
ZWNraW5nIGZvciBwdGhyZWFkIGZsYWcuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YXhfY3ZfcHRo
cmVhZF9mbGFncytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIg
PiY2CiBlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCiAK
LSAgICAgICAgYXhfY3ZfcHRocmVhZF9mbGFncz0tcHRocmVhZAotCi0gICAgUFRIUkVBRF9DRkxB
R1M9IiRheF9jdl9wdGhyZWFkX2ZsYWdzIgotICAgIFBUSFJFQURfTERGTEFHUz0iJGF4X2N2X3B0
aHJlYWRfZmxhZ3MiCi0gICAgUFRIUkVBRF9MSUJTPSIiCi0KLQotICAgIHNhdmVkX0NGTEFHUz0i
JENGTEFHUyIKLQotICAgIHNhdmVkX0xERkxBR1M9IiRMREZMQUdTIgotCi0gICAgc2F2ZWRfTElC
Uz0iJExJQlMiCi0KLQotICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCi0KLSAg
ICBMREZMQUdTPSIkTERGTEFHUyAkUFRIUkVBRF9MREZMQUdTIgotCi0gICAgTElCUz0iJExJQlMg
JFBUSFJFQURfTElCUyIKK2ZpCiAKLSAgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+
Y29uZnRlc3QuJGFjX2V4dAoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4K
KyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0
byBBTlNJLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAv
KiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci1pbnQgbWFpbih2
b2lkKSB7Ci0gIHB0aHJlYWRfYXRmb3JrKDAsMCwwKTsKLSAgcHRocmVhZF9jcmVhdGUoMCwwLDAs
MCk7Ci19CisjaW5jbHVkZSA8c3RkbGliLmg+CiAKIF9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGlu
ayAiJExJTkVOTyI7IHRoZW4gOgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIp
IDI+JjUgfAorICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CiAKIGVsc2UK
LSAgYXhfY3ZfcHRocmVhZF9mbGFncz1mYWlsZWQKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KIGZp
Ci1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25m
dGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotCi0gICAgQ0ZMQUdTPSIkc2F2ZWRfQ0ZM
QUdTIgotCi0gICAgTERGTEFHUz0iJHNhdmVkX0xERkxBR1MiCi0KLSAgICBMSUJTPSIkc2F2ZWRf
TElCUyIKLQorcm0gLWYgY29uZnRlc3QqCiAKIGZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IHJlc3VsdDogJGF4X2N2X3B0aHJlYWRfZmxhZ3MiID4mNQotJGFzX2Vj
aG8gIiRheF9jdl9wdGhyZWFkX2ZsYWdzIiA+JjY7IH0KLSAgICBpZiB0ZXN0ICJ4JGF4X2N2X3B0
aHJlYWRfZmxhZ3MiID0geGZhaWxlZDsgdGhlbgotICAgICAgICBhc19mbl9lcnJvciAkPyAiLXB0
aHJlYWQgZG9lcyBub3Qgd29yayIgIiRMSU5FTk8iIDUKLSAgICBmaQotCi0gICAgUFRIUkVBRF9D
RkxBR1M9IiRheF9jdl9wdGhyZWFkX2ZsYWdzIgotICAgIFBUSFJFQURfTERGTEFHUz0iJGF4X2N2
X3B0aHJlYWRfZmxhZ3MiCi0gICAgUFRIUkVBRF9MSUJTPSIiCi0KLQogCi17ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBjbG9ja19nZXR0aW1lIGlu
IC1scnQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGNsb2NrX2dldHRpbWUgaW4gLWxy
dC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfcnRfY2xvY2tfZ2V0dGltZStzZXR9
IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitpZiB0ZXN0ICRh
Y19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBn
ZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCisgIGlmIHRlc3Qg
IiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgOgogZWxzZQotICBhY19jaGVja19s
aWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHJ0ICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0g
PDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+
Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBh
bnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFy
IGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVp
bHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAg
Ki8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgorI2luY2x1ZGUgPGN0eXBlLmg+Cisj
aW5jbHVkZSA8c3RkbGliLmg+CisjaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCisjIGRlZmlu
ZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjIGRlZmluZSBUT1VQUEVS
KGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZWxzZQorIyBkZWZp
bmUgSVNMT1dFUihjKSBcCisJCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCisJCSAg
ICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAorCQkgICAgIHx8ICgncycgPD0gKGMp
ICYmIChjKSA8PSAneicpKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykg
fCAweDQwKSA6IChjKSkKICNlbmRpZgotY2hhciBjbG9ja19nZXR0aW1lICgpOworCisjZGVmaW5l
IFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQogaW50CiBtYWluICgp
CiB7Ci1yZXR1cm4gY2xvY2tfZ2V0dGltZSAoKTsKLSAgOworICBpbnQgaTsKKyAgZm9yIChpID0g
MDsgaSA8IDI1NjsgaSsrKQorICAgIGlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkK
Kwl8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkKKyAgICAgIHJldHVybiAyOwogICByZXR1
cm4gMDsKIH0KIF9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgot
ICBhY19jdl9saWJfcnRfY2xvY2tfZ2V0dGltZT15ZXMKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJ
TkVOTyI7IHRoZW4gOgorCiBlbHNlCi0gIGFjX2N2X2xpYl9ydF9jbG9ja19nZXR0aW1lPW5vCisg
IGFjX2N2X2hlYWRlcl9zdGRjPW5vCiBmaQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRl
c3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQK
LUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29u
ZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3Qu
JGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKIGZpCi17ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9ydF9jbG9j
a19nZXR0aW1lIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3J0X2Nsb2NrX2dldHRpbWUiID4m
NjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfcnRfY2xvY2tfZ2V0dGltZSIgPSB4IiJ5ZXM7IHRo
ZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfTElCUlQgMQot
X0FDRU9GCi0KLSAgTElCUz0iLWxydCAkTElCUyIKIAogZmkKK2ZpCit7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUK
KyRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfaGVh
ZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KIAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBjaGVja2luZyBmb3IgeWFqbF9hbGxvYyBpbiAtbHlhamwiID4mNQotJGFzX2VjaG9f
biAiY2hlY2tpbmcgZm9yIHlhamxfYWxsb2MgaW4gLWx5YWpsLi4uICIgPiY2OyB9Ci1pZiB0ZXN0
ICIke2FjX2N2X2xpYl95YWpsX3lhamxfYWxsb2Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNf
ZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRM
SUJTCi1MSUJTPSItbHlhamwgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29u
ZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFzX2VjaG8gIiNkZWZpbmUg
U1REQ19IRUFERVJTIDEiID4+Y29uZmRlZnMuaAogCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVy
bmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50
IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhl
biBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBf
X2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIHlhamxfYWxsb2MgKCk7Ci1pbnQK
LW1haW4gKCkKLXsKLXJldHVybiB5YWpsX2FsbG9jICgpOwotICA7Ci0gIHJldHVybiAwOwotfQot
X0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xp
Yl95YWpsX3lhamxfYWxsb2M9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl95YWpsX3lhamxfYWxsb2M9
bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAg
ICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGli
X3NhdmVfTElCUwogZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiAkYWNfY3ZfbGliX3lhamxfeWFqbF9hbGxvYyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2
X2xpYl95YWpsX3lhamxfYWxsb2MiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfeWFqbF95
YWpsX2FsbG9jIiA9IHgiInllczsgdGhlbiA6CisKKyMgT24gSVJJWCA1LjMsIHN5cy90eXBlcyBh
bmQgaW50dHlwZXMuaCBhcmUgY29uZmxpY3RpbmcuCitmb3IgYWNfaGVhZGVyIGluIHN5cy90eXBl
cy5oIHN5cy9zdGF0Lmggc3RkbGliLmggc3RyaW5nLmggbWVtb3J5Lmggc3RyaW5ncy5oIFwKKwkJ
ICBpbnR0eXBlcy5oIHN0ZGludC5oIHVuaXN0ZC5oCitkbyA6CisgIGFzX2FjX0hlYWRlcj1gJGFz
X2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hl
Y2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIg
IiRhY19pbmNsdWRlc19kZWZhdWx0CisiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRl
ciJcIiA9IHgieWVzIjsgdGhlbiA6CiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZp
bmUgSEFWRV9MSUJZQUpMIDEKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwg
JGFzX3RyX2NwcGAgMQogX0FDRU9GCiAKLSAgTElCUz0iLWx5YWpsICRMSUJTIgorZmkKKworZG9u
ZQorCisKK2lmIHRlc3QgIngkcHl0aG9udG9vbHMiID0gInh5IjsgdGhlbiA6CisKKyAgICBpZiBl
Y2hvICIkUFlUSE9OIiB8IGdyZXAgLXEgIl4vIjsgdGhlbiA6CisKKyAgICAgICAgUFlUSE9OUEFU
SD0kUFlUSE9OCisgICAgICAgIFBZVEhPTj1gYmFzZW5hbWUgJFBZVEhPTlBBVEhgCiAKK2VsaWYg
dGVzdCAteiAiJFBZVEhPTiI7IHRoZW4gOgorICBQWVRIT049InB5dGhvbiIKIGVsc2UKLSAgYXNf
Zm5fZXJyb3IgJD8gIkNvdWxkIG5vdCBmaW5kIHlhamwiICIkTElORU5PIiA1CisgIGFzX2ZuX2Vy
cm9yICQ/ICJQWVRIT04gc3BlY2lmaWVkLCBidXQgaXMgbm90IGFuIGFic29sdXRlIHBhdGgiICIk
TElORU5PIiA1CiBmaQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IGNoZWNraW5nIGZvciBkZWZsYXRlQ29weSBpbiAtbHoiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tp
bmcgZm9yIGRlZmxhdGVDb3B5IGluIC1sei4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9s
aWJfel9kZWZsYXRlQ29weStzZXR9IiA9IHNldDsgdGhlbiA6CisgICAgIyBFeHRyYWN0IHRoZSBm
aXJzdCB3b3JkIG9mICIkUFlUSE9OIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGgg
YXJncy4KK3NldCBkdW1teSAkUFlUSE9OOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNo
b19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zf
cGF0aF9QWVRIT05QQVRIK3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hl
ZCkgIiA+JjYKIGVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWx6
ICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8q
IGVuZCBjb25mZGVmcy5oLiAgKi8KKyAgY2FzZSAkUFlUSE9OUEFUSCBpbgorICBbXFwvXSogfCA/
OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9QWVRIT05QQVRIPSIkUFlUSE9OUEFUSCIgIyBMZXQgdGhl
IHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3Nh
dmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2Rv
CisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAg
ICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAg
aWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94
ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhf
UFlUSE9OUEFUSD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4
ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2
ZV9JRlMKIAotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQg
YW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJu
IHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlw
ZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIK
LSNlbmRpZgotY2hhciBkZWZsYXRlQ29weSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGRl
ZmxhdGVDb3B5ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3Ry
eV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl96X2RlZmxhdGVDb3B5PXllcwor
ICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9QWVRIT05QQVRIIiAmJiBhY19jdl9wYXRoX1BZVEhPTlBB
VEg9Im5vIgorICA7OworZXNhYworZmkKK1BZVEhPTlBBVEg9JGFjX2N2X3BhdGhfUFlUSE9OUEFU
SAoraWYgdGVzdCAtbiAiJFBZVEhPTlBBVEgiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUFlUSE9OUEFUSCIgPiY1CiskYXNfZWNobyAi
JFBZVEhPTlBBVEgiID4mNjsgfQogZWxzZQotICBhY19jdl9saWJfel9kZWZsYXRlQ29weT1ubwor
ICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4m
NQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25m
dGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4
dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworCisKK2lmIHRlc3QgeCIke1BZVEhPTlBB
VEh9IiA9PSB4Im5vIgordGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJVbmFibGUgdG8gZmluZCAk
UFlUSE9OLCBwbGVhc2UgaW5zdGFsbCAkUFlUSE9OIiAiJExJTkVOTyIgNQorZmkKKyAgICB7ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBweXRob24g
dmVyc2lvbiA+PSAyLjMgIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBweXRob24gdmVy
c2lvbiA+PSAyLjMgLi4uICIgPiY2OyB9CitgJFBZVEhPTiAtYyAnaW1wb3J0IHN5czsgc3lzLmV4
aXQoZXZhbCgic3lzLnZlcnNpb25faW5mbyA8ICgyLCAzKSIpKSdgCitpZiB0ZXN0ICIkPyIgIT0g
IjAiCit0aGVuCisgICAgcHl0aG9uX3ZlcnNpb249YCRQWVRIT04gLVYgMj4mMWAKKyAgICB7ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFz
X2VjaG8gIm5vIiA+JjY7IH0KKyAgICBhc19mbl9lcnJvciAkPyAiJHB5dGhvbl92ZXJzaW9uIGlz
IHRvbyBvbGQsIG1pbmltdW0gcmVxdWlyZWQgdmVyc2lvbiBpcyAyLjMiICIkTElORU5PIiA1Citl
bHNlCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6
IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KIGZpCi17ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl96X2RlZmxhdGVDb3B5IiA+
JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3pfZGVmbGF0ZUNvcHkiID4mNjsgfQotaWYgdGVzdCAi
eCRhY19jdl9saWJfel9kZWZsYXRlQ29weSIgPSB4IiJ5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25m
ZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfTElCWiAxCi1fQUNFT0YKIAotICBMSUJTPSIt
bHogJExJQlMiCithY19weXRob25fdmVyc2lvbj1gJFBZVEhPTiAtYyAnaW1wb3J0IGRpc3R1dGls
cy5zeXNjb25maWc7IFwKKyAgICBwcmludCBkaXN0dXRpbHMuc3lzY29uZmlnLmdldF9jb25maWdf
dmFyKCJWRVJTSU9OIiknYAorYWNfcHJldmlvdXNfY3BwZmxhZ3M9JENQUEZMQUdTCitDUFBGTEFH
Uz0iJENGTEFHUyBgJFBZVEhPTiAtYyAnaW1wb3J0IGRpc3R1dGlscy5zeXNjb25maWc7IFwKKyAg
ICBwcmludCAiLUkiICsgZGlzdHV0aWxzLnN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiSU5DTFVE
RVBZIiknYCIKK0NQUEZMQUdTPSIkQ1BQRkxBR1MgYCRQWVRIT04gLWMgJ2ltcG9ydCBkaXN0dXRp
bHMuc3lzY29uZmlnOyBcCisgICAgcHJpbnQgZGlzdHV0aWxzLnN5c2NvbmZpZy5nZXRfY29uZmln
X3ZhcigiQ0ZMQUdTIiknYCIKK2FjX3ByZXZpb3VzX2xkZmxhZ3M9JExERkxBR1MKK0xERkxBR1M9
IiRMREZMQUdTIGAkUFlUSE9OIC1jICdpbXBvcnQgZGlzdHV0aWxzLnN5c2NvbmZpZzsgXAorICAg
IHByaW50IGRpc3R1dGlscy5zeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIkxJQlMiKSdgIgorTERG
TEFHUz0iJExERkxBR1MgYCRQWVRIT04gLWMgJ2ltcG9ydCBkaXN0dXRpbHMuc3lzY29uZmlnOyBc
CisgICAgcHJpbnQgZGlzdHV0aWxzLnN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiU1lTTElCUyIp
J2AiCitMREZMQUdTPSIkTERGTEFHUyBgJFBZVEhPTiAtYyAnaW1wb3J0IGRpc3R1dGlscy5zeXNj
b25maWc7IFwKKyAgICBwcmludCAiLUwiICsgZGlzdHV0aWxzLnN5c2NvbmZpZy5nZXRfcHl0aG9u
X2xpYihwbGF0X3NwZWNpZmljPTEsXAorICAgIHN0YW5kYXJkX2xpYj0xKSArICIvY29uZmlnIidg
IgorTERGTEFHUz0iJExERkxBR1MgYCRQWVRIT04gLWMgJ2ltcG9ydCBkaXN0dXRpbHMuc3lzY29u
ZmlnOyBcCisgICAgcHJpbnQgZGlzdHV0aWxzLnN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiTElO
S0ZPUlNIQVJFRCIpJ2AiCitMREZMQUdTPSIkTERGTEFHUyBgJFBZVEhPTiAtYyAnaW1wb3J0IGRp
c3R1dGlscy5zeXNjb25maWc7IFwKKyAgICBwcmludCBkaXN0dXRpbHMuc3lzY29uZmlnLmdldF9j
b25maWdfdmFyKCJMREZMQUdTIiknYCIKKworYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAi
JExJTkVOTyIgIlB5dGhvbi5oIiAiYWNfY3ZfaGVhZGVyX1B5dGhvbl9oIiAiJGFjX2luY2x1ZGVz
X2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9QeXRob25faCIgPSB4IiJ5ZXM7IHRo
ZW4gOgogCiBlbHNlCi0gIGFzX2ZuX2Vycm9yICQ/ICJDb3VsZCBub3QgZmluZCB6bGliIiAiJExJ
TkVOTyIgNQorICBhc19mbl9lcnJvciAkPyAiVW5hYmxlIHRvIGZpbmQgUHl0aG9uIGRldmVsb3Bt
ZW50IGhlYWRlcnMiICIkTElORU5PIiA1CiBmaQogCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJpY29udl9vcGVuIGluIC1saWNvbnYiID4m
NQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYmljb252X29wZW4gaW4gLWxpY29udi4uLiAi
ID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfaWNvbnZfbGliaWNvbnZfb3BlbitzZXR9IiA9
IHNldDsgdGhlbiA6CisKK2FzX2FjX0xpYj1gJGFzX2VjaG8gImFjX2N2X2xpYl9weXRob24kYWNf
cHl0aG9uX3ZlcnNpb24nJ19QeUFyZ19QYXJzZVR1cGxlIiB8ICRhc190cl9zaGAKK3sgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFB5QXJnX1BhcnNl
VHVwbGUgaW4gLWxweXRob24kYWNfcHl0aG9uX3ZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hl
Y2tpbmcgZm9yIFB5QXJnX1BhcnNlVHVwbGUgaW4gLWxweXRob24kYWNfcHl0aG9uX3ZlcnNpb24u
Li4gIiA+JjY7IH0KK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfTGliK3NldH1cIiIgPSBzZXQ7
IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBhY19jaGVja19s
aWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGljb252ICAkTElCUyIKK0xJQlM9Ii1scHl0aG9u
JGFjX3B5dGhvbl92ZXJzaW9uICAkTElCUyIKIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNv
bmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIApAQCAtNzQ3MCwxODQ2ICs1
MTY4LDExNzQgQEAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAog
I2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiCiAjZW5kaWYKLWNoYXIgbGliaWNvbnZfb3Bl
biAoKTsKK2NoYXIgUHlBcmdfUGFyc2VUdXBsZSAoKTsKIGludAogbWFpbiAoKQogewotcmV0dXJu
IGxpYmljb252X29wZW4gKCk7CityZXR1cm4gUHlBcmdfUGFyc2VUdXBsZSAoKTsKICAgOwogICBy
ZXR1cm4gMDsKIH0KIF9BQ0VPRgogaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4g
OgotICBhY19jdl9saWJfaWNvbnZfbGliaWNvbnZfb3Blbj15ZXMKKyAgZXZhbCAiJGFzX2FjX0xp
Yj15ZXMiCiBlbHNlCi0gIGFjX2N2X2xpYl9pY29udl9saWJpY29udl9vcGVuPW5vCisgIGV2YWwg
IiRhc19hY19MaWI9bm8iCiBmaQogcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFj
X29iamV4dCBcCiAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9
JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9pY29udl9saWJpY29udl9vcGVuIiA+JjUK
LSRhc19lY2hvICIkYWNfY3ZfbGliX2ljb252X2xpYmljb252X29wZW4iID4mNjsgfQotaWYgdGVz
dCAieCRhY19jdl9saWJfaWNvbnZfbGliaWNvbnZfb3BlbiIgPSB4IiJ5ZXM7IHRoZW4gOgotICBs
aWJpY29udj0ieSIKLWVsc2UKLSAgbGliaWNvbnY9Im4iCi1maQotCitldmFsIGFjX3Jlcz1cJCRh
c19hY19MaWIKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQoraWYgZXZh
bCB0ZXN0IFwieFwkIiRhc19hY19MaWIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25m
ZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV9MSUJweXRob24kYWNfcHl0
aG9uX3ZlcnNpb24iIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCiAKKyAgTElCUz0iLWxweXRob24k
YWNfcHl0aG9uX3ZlcnNpb24gJExJQlMiCiAKLSMgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCi0j
IFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmgg
b25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLXsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxs
b2NhLmgiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmguLi4g
IiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfd29ya2luZ19hbGxvY2FfaCtzZXR9IiA9IHNldDsg
dGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVm
cy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8K
LSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludAotbWFpbiAoKQotewotY2hhciAqcCA9IChjaGFyICop
IGFsbG9jYSAoMiAqIHNpemVvZiAoaW50KSk7Ci0JCQkgIGlmIChwKSByZXR1cm4gMDsKLSAgOwot
ICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRo
ZW4gOgotICBhY19jdl93b3JraW5nX2FsbG9jYV9oPXllcwogZWxzZQotICBhY19jdl93b3JraW5n
X2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29i
amV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgYXNfZm5f
ZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5kIGEgc3VpdGFibGUgcHl0aG9uIGRldmVsb3BtZW50IGxp
YnJhcnkiICIkTElORU5PIiA1CiBmaQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiByZXN1bHQ6ICRhY19jdl93b3JraW5nX2FsbG9jYV9oIiA+JjUKLSRhc19lY2hvICIk
YWNfY3Zfd29ya2luZ19hbGxvY2FfaCIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl93b3JraW5nX2Fs
bG9jYV9oID0geWVzOyB0aGVuCiAKLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfQUxMT0NBX0ggMSIg
Pj5jb25mZGVmcy5oCitDUFBGTEFHUz0kYWNfcHJldmlvdXNfY3BwZmxhZ3MKK0xETEZBR1M9JGFj
X3ByZXZpb3VzX2xkZmxhZ3MKKwogCiBmaQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tp
bmcgZm9yIGFsbG9jYS4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9mdW5jX2FsbG9jYV93
b3JrcytzZXR9IiA9IHNldDsgdGhlbiA6CisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhn
ZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1t
eSB4Z2V0dGV4dDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcg
Zm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfWEdFVFRFWFQr
c2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQot
ICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29u
ZmRlZnMuaC4gICovCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5f
YWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0j
ICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWZkZWYgSEFWRV9BTExPQ0FfSAot
IyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21h
IGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQ
IGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRp
ZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgorICBjYXNlICRYR0VUVEVYVCBpbgorICBbXFwv
XSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0
aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNf
c2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAor
ZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgor
ICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwor
ICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0
X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0
aF9YR0VUVEVYVD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4
ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2
ZV9JRlMKIAotaW50Ci1tYWluICgpCi17Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhICgxKTsK
LQkJCQkgICAgaWYgKHApIHJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1p
ZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfYWxsb2Nh
X3dvcmtzPXllcwotZWxzZQotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubworICB0ZXN0IC16
ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0ibm8iCisgIDs7
Citlc2FjCiBmaQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBc
Ci0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK1hHRVRURVhUPSRhY19j
dl9wYXRoX1hHRVRURVhUCitpZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCisgIHsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkWEdFVFRFWFQiID4mNQor
JGFzX2VjaG8gIiRYR0VUVEVYVCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsg
fQogZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAk
YWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiID4mNQotJGFzX2VjaG8gIiRhY19jdl9mdW5jX2FsbG9j
YV93b3JrcyIgPiY2OyB9CiAKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVz
OyB0aGVuCiAKLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfQUxMT0NBIDEiID4+Y29uZmRlZnMuaAor
aWYgdGVzdCB4IiR7WEdFVFRFWFR9IiA9PSB4Im5vIgordGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/
ICJVbmFibGUgdG8gZmluZCB4Z2V0dGV4dCwgcGxlYXNlIGluc3RhbGwgeGdldHRleHQiICIkTElO
RU5PIiA1CitmaQorIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhczg2Iiwgc28gaXQgY2Fu
IGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBhczg2OyBhY193b3JkPSQy
Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAk
YWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7
IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9BUzg2K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFz
X2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkQVM4NiBpbgorICBbXFwvXSog
fCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9BUzg2PSIkQVM4NiIgIyBMZXQgdGhlIHVzZXIgb3Zl
cnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJ
RlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0k
YXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNf
ZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0
IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGly
LyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfQVM4Nj0iJGFz
X2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAg
ICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKIAorICB0ZXN0
IC16ICIkYWNfY3ZfcGF0aF9BUzg2IiAmJiBhY19jdl9wYXRoX0FTODY9Im5vIgorICA7OworZXNh
YworZmkKK0FTODY9JGFjX2N2X3BhdGhfQVM4NgoraWYgdGVzdCAtbiAiJEFTODYiOyB0aGVuCisg
IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVM4NiIg
PiY1CiskYXNfZWNobyAiJEFTODYiID4mNjsgfQogZWxzZQotICAjIFRoZSBTVlIzIGxpYlBXIGFu
ZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotIyB0aGF0
IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2Nh
IG9yCi0jIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNl
IHRoZWlyIGFsbG9jYSwKLSMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGlu
c3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotCi1BTExPQ0E9XCR7TElCT0JKRElSfWFsbG9j
YS4kYWNfb2JqZXh0Ci0KLSRhc19lY2hvICIjZGVmaW5lIENfQUxMT0NBIDEiID4+Y29uZmRlZnMu
aAorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8i
ID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCiAKIAoteyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIFxgYWxsb2NhLmMnIG5lZWRzIENy
YXkgaG9va3MiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBcYGFsbG9jYS5jJyBu
ZWVkcyBDcmF5IGhvb2tzLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X29zX2NyYXkrc2V0
fSIgPSBzZXQ7IHRoZW4gOgoraWYgdGVzdCB4IiR7QVM4Nn0iID09IHgibm8iCit0aGVuCisgICAg
YXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5kIGFzODYsIHBsZWFzZSBpbnN0YWxsIGFzODYi
ICIkTElORU5PIiA1CitmaQorIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJsZDg2Iiwgc28g
aXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBsZDg2OyBhY193
b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5n
IGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4g
IiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9MRDg2K3NldH0iID0gc2V0OyB0aGVuIDoK
ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8
PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmIGRl
ZmluZWQgQ1JBWSAmJiAhIGRlZmluZWQgQ1JBWTIKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNy
YXkKLSNlbmRpZgorICBjYXNlICRMRDg2IGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19j
dl9wYXRoX0xEODY9IiRMRDg2IiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRo
IGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFS
QVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0
IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNf
ZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dv
cmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19l
eHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9MRDg2PSIkYXNfZGlyLyRhY193b3JkJGFjX2V4
ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5k
ICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2Rv
bmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUwogCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3Bw
IGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVHUkVQICJ3ZWJlY3JheSIgPi9kZXYvbnVs
bCAyPiYxOyB0aGVuIDoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgYWNfY3Zfb3NfY3Jh
eT1ubworICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9MRDg2IiAmJiBhY19jdl9wYXRoX0xEODY9Im5v
IgorICA7OworZXNhYwogZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCitMRDg2PSRhY19jdl9wYXRoX0xE
ODYKK2lmIHRlc3QgLW4gIiRMRDg2IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IHJlc3VsdDogJExEODYiID4mNQorJGFzX2VjaG8gIiRMRDg2IiA+JjY7
IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1
bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CiBmaQoteyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9vc19jcmF5IiA+JjUKLSRhc19l
Y2hvICIkYWNfY3Zfb3NfY3JheSIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVz
OyB0aGVuCi0gIGZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgICBh
c19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKLWFj
X2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKLWlmIGV2
YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKLQotY2F0ID4+Y29u
ZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotX0FD
RU9GCiAKLSAgICBicmVhawotZmkKIAotICBkb25lCitpZiB0ZXN0IHgiJHtMRDg2fSIgPT0geCJu
byIKK3RoZW4KKyAgICBhc19mbl9lcnJvciAkPyAiVW5hYmxlIHRvIGZpbmQgbGQ4NiwgcGxlYXNl
IGluc3RhbGwgbGQ4NiIgIiRMSU5FTk8iIDUKIGZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIg
PiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhLi4u
ICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uK3NldH0iID0gc2V0
OyB0aGVuIDoKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYmNjIiwgc28gaXQgY2FuIGJl
IGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBiY2M7IGFjX3dvcmQ9JDIKK3sg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193
b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQor
aWYgdGVzdCAiJHthY19jdl9wYXRoX0JDQytzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hv
X24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0g
eWVzOyB0aGVuIDoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgY29u
ZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4g
ICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotaW50Ci1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQot
ewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFk
ZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRf
c3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4g
YWRkcikgPyAxIDogLTE7Ci19CisgIGNhc2UgJEJDQyBpbgorICBbXFwvXSogfCA/OltcXC9dKikK
KyAgYWNfY3ZfcGF0aF9CQ0M9IiRCQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0
IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhf
U0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisg
IHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcn
ICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8k
YWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19l
eGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX0JDQz0iJGFzX2Rpci8kYWNfd29yZCRh
Y19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBm
b3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZp
Citkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKIAotaW50Ci1tYWluICgpCi17Ci0gIHJl
dHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKSA8IDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2Nf
dHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1l
bHNlCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWYgY29yZSAqLmNvcmUg
Y29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBj
b25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorICB0ZXN0
IC16ICIkYWNfY3ZfcGF0aF9CQ0MiICYmIGFjX2N2X3BhdGhfQkNDPSJubyIKKyAgOzsKK2VzYWMK
IGZpCi0KK0JDQz0kYWNfY3ZfcGF0aF9CQ0MKK2lmIHRlc3QgLW4gIiRCQ0MiOyB0aGVuCisgIHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQkNDIiA+JjUK
KyRhc19lY2hvICIkQkNDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CiBm
aQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19j
dl9jX3N0YWNrX2RpcmVjdGlvbiIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0
aW9uIiA+JjY7IH0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgU1RBQ0tfRElS
RUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotX0FDRU9GCiAKIAoraWYgdGVzdCB4IiR7
QkNDfSIgPT0geCJubyIKK3RoZW4KKyAgICBhc19mbl9lcnJvciAkPyAiVW5hYmxlIHRvIGZpbmQg
YmNjLCBwbGVhc2UgaW5zdGFsbCBiY2MiICIkTElORU5PIiA1CiBmaQorIyBFeHRyYWN0IHRoZSBm
aXJzdCB3b3JkIG9mICJpYXNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJn
cy4KK3NldCBkdW1teSBpYXNsOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJj
aGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9J
QVNMK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vs
c2UKKyAgY2FzZSAkSUFTTCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9J
QVNMPSIkSUFTTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGgu
CisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2Zv
ciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFz
X2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFi
bGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4
ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsg
dGhlbgorICAgIGFjX2N2X3BhdGhfSUFTTD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIK
KyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGly
LyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRv
bmUKK0lGUz0kYXNfc2F2ZV9JRlMKIAotZm9yIGFjX2hlYWRlciBpbiAgXAotICAgICAgICAgICAg
ICAgIGFycGEvaW5ldC5oIGZjbnRsLmggaW50dHlwZXMuaCBsaWJpbnRsLmggbGltaXRzLmggbWFs
bG9jLmggXAotICAgICAgICAgICAgICAgIG5ldGRiLmggbmV0aW5ldC9pbi5oIHN0ZGRlZi5oIHN0
ZGludC5oIHN0ZGxpYi5oIHN0cmluZy5oIFwKLSAgICAgICAgICAgICAgICBzdHJpbmdzLmggc3lz
L2ZpbGUuaCBzeXMvaW9jdGwuaCBzeXMvbW91bnQuaCBzeXMvcGFyYW0uaCBcCi0gICAgICAgICAg
ICAgICAgc3lzL3NvY2tldC5oIHN5cy9zdGF0dmZzLmggc3lzL3RpbWUuaCBzeXNsb2cuaCB0ZXJt
aW9zLmggXAotICAgICAgICAgICAgICAgIHVuaXN0ZC5oIHlhamwveWFqbF92ZXJzaW9uLmggXAor
ICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9JQVNMIiAmJiBhY19jdl9wYXRoX0lBU0w9Im5vIgorICA7
OworZXNhYworZmkKK0lBU0w9JGFjX2N2X3BhdGhfSUFTTAoraWYgdGVzdCAtbiAiJElBU0wiOyB0
aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAk
SUFTTCIgPiY1CiskYXNfZWNobyAiJElBU0wiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5v
IiA+JjY7IH0KK2ZpCiAKLWRvIDoKLSAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVh
ZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3Jl
bCAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2Rl
ZmF1bHQiCi1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhl
biA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYCRhc19lY2hvICJIQVZF
XyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCiAKK2lmIHRlc3QgeCIke0lBU0x9
IiA9PSB4Im5vIgordGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJVbmFibGUgdG8gZmluZCBpYXNs
LCBwbGVhc2UgaW5zdGFsbCBpYXNsIiAiJExJTkVOTyIgNQogZmkKIAotZG9uZQotCithY19mbl9j
X2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAidXVpZC91dWlkLmgiICJhY19jdl9oZWFk
ZXJfdXVpZF91dWlkX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3Zf
aGVhZGVyX3V1aWRfdXVpZF9oIiA9IHgiInllczsgdGhlbiA6CiAKLSMgQ2hlY2tzIGZvciB0eXBl
ZGVmcywgc3RydWN0dXJlcywgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcy4KLXsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0ZGJvb2wuaCB0
aGF0IGNvbmZvcm1zIHRvIEM5OSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3RkYm9v
bC5oIHRoYXQgY29uZm9ybXMgdG8gQzk5Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2hl
YWRlcl9zdGRib29sX2grc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAgIHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHV1aWRfY2xlYXIgaW4gLWx1dWlk
IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1dWlkX2NsZWFyIGluIC1sdXVpZC4uLiAi
ID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfdXVpZF91dWlkX2NsZWFyK3NldH0iID0gc2V0
OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgY2F0IGNvbmZk
ZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorICBhY19jaGVja19saWJfc2F2ZV9M
SUJTPSRMSUJTCitMSUJTPSItbHV1aWQgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VP
RiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwogCi0jaW5jbHVkZSA8
c3RkYm9vbC5oPgotI2lmbmRlZiBib29sCi0gImVycm9yOiBib29sIGlzIG5vdCBkZWZpbmVkIgot
I2VuZGlmCi0jaWZuZGVmIGZhbHNlCi0gImVycm9yOiBmYWxzZSBpcyBub3QgZGVmaW5lZCIKLSNl
bmRpZgotI2lmIGZhbHNlCi0gImVycm9yOiBmYWxzZSBpcyBub3QgMCIKLSNlbmRpZgotI2lmbmRl
ZiB0cnVlCi0gImVycm9yOiB0cnVlIGlzIG5vdCBkZWZpbmVkIgotI2VuZGlmCi0jaWYgdHJ1ZSAh
PSAxCi0gImVycm9yOiB0cnVlIGlzIG5vdCAxIgotI2VuZGlmCi0jaWZuZGVmIF9fYm9vbF90cnVl
X2ZhbHNlX2FyZV9kZWZpbmVkCi0gImVycm9yOiBfX2Jvb2xfdHJ1ZV9mYWxzZV9hcmVfZGVmaW5l
ZCBpcyBub3QgZGVmaW5lZCIKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBl
IHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2gg
dGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVu
dCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitl
eHRlcm4gIkMiCiAjZW5kaWYKLQotCXN0cnVjdCBzIHsgX0Jvb2wgczogMTsgX0Jvb2wgdDsgfSBz
OwotCi0JY2hhciBhW3RydWUgPT0gMSA/IDEgOiAtMV07Ci0JY2hhciBiW2ZhbHNlID09IDAgPyAx
IDogLTFdOwotCWNoYXIgY1tfX2Jvb2xfdHJ1ZV9mYWxzZV9hcmVfZGVmaW5lZCA9PSAxID8gMSA6
IC0xXTsKLQljaGFyIGRbKGJvb2wpIDAuNSA9PSB0cnVlID8gMSA6IC0xXTsKLQlib29sIGUgPSAm
czsKLQljaGFyIGZbKF9Cb29sKSAwLjAgPT0gZmFsc2UgPyAxIDogLTFdOwotCWNoYXIgZ1t0cnVl
XTsKLQljaGFyIGhbc2l6ZW9mIChfQm9vbCldOwotCWNoYXIgaVtzaXplb2Ygcy50XTsKLQllbnVt
IHsgaiA9IGZhbHNlLCBrID0gdHJ1ZSwgbCA9IGZhbHNlICogdHJ1ZSwgbSA9IHRydWUgKiAyNTYg
fTsKLQkvKiBUaGUgZm9sbG93aW5nIGZhaWxzIGZvcgotCSAgIEhQIGFDKysvQU5TSSBDIEIzOTEw
QiBBLjA1LjU1IFtEZWMgMDQgMjAwM10uICovCi0JX0Jvb2wgblttXTsKLQljaGFyIG9bc2l6ZW9m
IG4gPT0gbSAqIHNpemVvZiBuWzBdID8gMSA6IC0xXTsKLQljaGFyIHBbLTEgLSAoX0Jvb2wpIDAg
PCAwICYmIC0xIC0gKGJvb2wpIDAgPCAwID8gMSA6IC0xXTsKLSMJaWYgZGVmaW5lZCBfX3hsY19f
IHx8IGRlZmluZWQgX19HTlVDX18KLQkgLyogQ2F0Y2ggYSBidWcgaW4gSUJNIEFJWCB4bGMgY29t
cGlsZXIgdmVyc2lvbiA2LjAuMC4wCi0JICAgIHJlcG9ydGVkIGJ5IEphbWVzIExlbWxleSBvbiAy
MDA1LTEwLTA1OyBzZWUKLQkgICAgaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2J1
Zy1jb3JldXRpbHMvMjAwNS0xMC9tc2cwMDA4Ni5odG1sCi0JICAgIFRoaXMgdGVzdCBpcyBub3Qg
cXVpdGUgcmlnaHQsIHNpbmNlIHhsYyBpcyBhbGxvd2VkIHRvCi0JICAgIHJlamVjdCB0aGlzIHBy
b2dyYW0sIGFzIHRoZSBpbml0aWFsaXplciBmb3IgeGxjYnVnIGlzCi0JICAgIG5vdCBvbmUgb2Yg
dGhlIGZvcm1zIHRoYXQgQyByZXF1aXJlcyBzdXBwb3J0IGZvci4KLQkgICAgSG93ZXZlciwgZG9p
bmcgdGhlIHRlc3QgcmlnaHQgd291bGQgcmVxdWlyZSBhIHJ1bnRpbWUKLQkgICAgdGVzdCwgYW5k
IHRoYXQgd291bGQgbWFrZSBjcm9zcy1jb21waWxhdGlvbiBoYXJkZXIuCi0JICAgIExldCB1cyBo
b3BlIHRoYXQgSUJNIGZpeGVzIHRoZSB4bGMgYnVnLCBhbmQgYWxzbyBhZGRzCi0JICAgIHN1cHBv
cnQgZm9yIHRoaXMga2luZCBvZiBjb25zdGFudCBleHByZXNzaW9uLiAgSW4gdGhlCi0JICAgIG1l
YW50aW1lLCB0aGlzIHRlc3Qgd2lsbCByZWplY3QgeGxjLCB3aGljaCBpcyBPSywgc2luY2UKLQkg
ICAgb3VyIHN0ZGJvb2wuaCBzdWJzdGl0dXRlIHNob3VsZCBzdWZmaWNlLiAgV2UgYWxzbyB0ZXN0
Ci0JICAgIHRoaXMgd2l0aCBHQ0MsIHdoZXJlIGl0IHNob3VsZCB3b3JrLCB0byBkZXRlY3QgbW9y
ZQotCSAgICBxdWlja2x5IHdoZXRoZXIgc29tZW9uZSBtZXNzZXMgdXAgdGhlIHRlc3QgaW4gdGhl
Ci0JICAgIGZ1dHVyZS4gICovCi0JIGNoYXIgZGlnc1tdID0gIjAxMjM0NTY3ODkiOwotCSBpbnQg
eGxjYnVnID0gMSAvICgmKGRpZ3MgKyA1KVstMiArIChib29sKSAxXSA9PSAmZGlnc1s0XSA/IDEg
OiAtMSk7Ci0jCWVuZGlmCi0JLyogQ2F0Y2ggYSBidWcgaW4gYW4gSFAtVVggQyBjb21waWxlci4g
IFNlZQotCSAgIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9nY2MtcGF0Y2hlcy8yMDAzLTEyL21zZzAy
MzAzLmh0bWwKLQkgICBodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvYnVnLWNvcmV1
dGlscy8yMDA1LTExL21zZzAwMTYxLmh0bWwKLQkgKi8KLQlfQm9vbCBxID0gdHJ1ZTsKLQlfQm9v
bCAqcHEgPSAmcTsKLQorY2hhciB1dWlkX2NsZWFyICgpOwogaW50CiBtYWluICgpCiB7Ci0KLQkq
cHEgfD0gcTsKLQkqcHEgfD0gISBxOwotCS8qIFJlZmVyIHRvIGV2ZXJ5IGRlY2xhcmVkIHZhbHVl
LCB0byBhdm9pZCBjb21waWxlciBvcHRpbWl6YXRpb25zLiAgKi8KLQlyZXR1cm4gKCFhICsgIWIg
KyAhYyArICFkICsgIWUgKyAhZiArICFnICsgIWggKyAhaSArICEhaiArICFrICsgISFsCi0JCSsg
IW0gKyAhbiArICFvICsgIXAgKyAhcSArICFwcSk7Ci0KK3JldHVybiB1dWlkX2NsZWFyICgpOwog
ICA7CiAgIHJldHVybiAwOwogfQogX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElO
RU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2hlYWRlcl9zdGRib29sX2g9eWVzCi1lbHNlCi0gIGFjX2N2
X2hlYWRlcl9zdGRib29sX2g9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVz
dC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRib29sX2giID4mNQot
JGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3RkYm9vbF9oIiA+JjY7IH0KLWFjX2ZuX2NfY2hlY2tf
dHlwZSAiJExJTkVOTyIgIl9Cb29sIiAiYWNfY3ZfdHlwZV9fQm9vbCIgIiRhY19pbmNsdWRlc19k
ZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl90eXBlX19Cb29sIiA9IHgiInllczsgdGhlbiA6Ci0K
LWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9fQk9PTCAxCi1fQUNFT0YK
LQotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYm9vbF9oID0geWVzOyB0aGVuCi0K
LSRhc19lY2hvICIjZGVmaW5lIEhBVkVfU1REQk9PTF9IIDEiID4+Y29uZmRlZnMuaAotCi1maQot
Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1
aWRfdCBpbiBzeXMvdHlwZXMuaCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdWlkX3Qg
aW4gc3lzL3R5cGVzLmguLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfdHlwZV91aWRfdCtz
ZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0g
IGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25m
ZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotX0FDRU9GCi1pZiAoZXZhbCAi
JGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAidWlkX3QiID4vZGV2
L251bGwgMj4mMTsgdGhlbiA6Ci0gIGFjX2N2X3R5cGVfdWlkX3Q9eWVzCi1lbHNlCi0gIGFjX2N2
X3R5cGVfdWlkX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLXsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfdHlwZV91aWRfdCIgPiY1
Ci0kYXNfZWNobyAiJGFjX2N2X3R5cGVfdWlkX3QiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfdHlw
ZV91aWRfdCA9IG5vOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIHVpZF90IGludCIgPj5jb25m
ZGVmcy5oCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgZ2lkX3QgaW50IiA+PmNvbmZkZWZzLmgKLQot
ZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBm
b3IgaW5saW5lIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbmxpbmUuLi4gIiA+JjY7
IH0KLWlmIHRlc3QgIiR7YWNfY3ZfY19pbmxpbmUrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNf
ZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFj
X2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgY29uZmRlZnMuaCAt
IDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaWZu
ZGVmIF9fY3BsdXNwbHVzCi10eXBlZGVmIGludCBmb29fdDsKLXN0YXRpYyAkYWNfa3cgZm9vX3Qg
c3RhdGljX2ZvbyAoKSB7cmV0dXJuIDA7IH0KLSRhY19rdyBmb29fdCBmb28gKCkge3JldHVybiAw
OyB9Ci0jZW5kaWYKLQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsg
dGhlbiA6Ci0gIGFjX2N2X2NfaW5saW5lPSRhY19rdworaWYgYWNfZm5fY190cnlfbGluayAiJExJ
TkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfdXVpZF91dWlkX2NsZWFyPXllcworZWxzZQorICBh
Y19jdl9saWJfdXVpZF91dWlkX2NsZWFyPW5vCiBmaQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIg
Y29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIHRlc3QgIiRhY19jdl9jX2lu
bGluZSIgIT0gbm8gJiYgYnJlYWsKLWRvbmUKLQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29u
ZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19l
eHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl91dWlkX3V1aWRfY2xlYXIi
ID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfdXVpZF91dWlkX2NsZWFyIiA+JjY7IH0KK2lmIHRl
c3QgIngkYWNfY3ZfbGliX3V1aWRfdXVpZF9jbGVhciIgPSB4IiJ5ZXM7IHRoZW4gOgorICBsaWJ1
dWlkPSJ5IgogZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVz
dWx0OiAkYWNfY3ZfY19pbmxpbmUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9jX2lubGluZSIgPiY2
OyB9CiAKLWNhc2UgJGFjX2N2X2NfaW5saW5lIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgKikK
LSAgICBjYXNlICRhY19jdl9jX2lubGluZSBpbgotICAgICAgbm8pIGFjX3ZhbD07OwotICAgICAg
KikgYWNfdmFsPSRhY19jdl9jX2lubGluZTs7Ci0gICAgZXNhYwotICAgIGNhdCA+PmNvbmZkZWZz
LmggPDxfQUNFT0YKLSNpZm5kZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgaW5saW5lICRhY192YWwK
LSNlbmRpZgotX0FDRU9GCi0gICAgOzsKLWVzYWMKIAotYWNfZm5fY19maW5kX2ludFhfdCAiJExJ
TkVOTyIgIjE2IiAiYWNfY3ZfY19pbnQxNl90IgotY2FzZSAkYWNfY3ZfY19pbnQxNl90IGluICMo
Ci0gIG5vfHllcykgOzsgIygKLSAgKikKK2ZpCiAKLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YK
LSNkZWZpbmUgaW50MTZfdCAkYWNfY3ZfY19pbnQxNl90Ci1fQUNFT0YKLTs7Ci1lc2FjCiAKLWFj
X2ZuX2NfZmluZF9pbnRYX3QgIiRMSU5FTk8iICIzMiIgImFjX2N2X2NfaW50MzJfdCIKLWNhc2Ug
JGFjX2N2X2NfaW50MzJfdCBpbiAjKAotICBub3x5ZXMpIDs7ICMoCi0gICopCithY19mbl9jX2No
ZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAidXVpZC5oIiAiYWNfY3ZfaGVhZGVyX3V1aWRf
aCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfdXVpZF9o
IiA9IHgiInllczsgdGhlbiA6CisgIGxpYnV1aWQ9InkiCitmaQogCi1jYXQgPj5jb25mZGVmcy5o
IDw8X0FDRU9GCi0jZGVmaW5lIGludDMyX3QgJGFjX2N2X2NfaW50MzJfdAotX0FDRU9GCi07Owot
ZXNhYwogCi1hY19mbl9jX2ZpbmRfaW50WF90ICIkTElORU5PIiAiNjQiICJhY19jdl9jX2ludDY0
X3QiCi1jYXNlICRhY19jdl9jX2ludDY0X3QgaW4gIygKLSAgbm98eWVzKSA7OyAjKAotICAqKQor
aWYgdGVzdCAiJGxpYnV1aWQiICE9ICJ5IjsgdGhlbiA6CiAKLWNhdCA+PmNvbmZkZWZzLmggPDxf
QUNFT0YKLSNkZWZpbmUgaW50NjRfdCAkYWNfY3ZfY19pbnQ2NF90Ci1fQUNFT0YKLTs7Ci1lc2Fj
CisgICAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIGEgdmFsaWQgdXVpZCBsaWJyYXJ5IiAi
JExJTkVOTyIgNQogCi1hY19mbl9jX2ZpbmRfaW50WF90ICIkTElORU5PIiAiOCIgImFjX2N2X2Nf
aW50OF90IgotY2FzZSAkYWNfY3ZfY19pbnQ4X3QgaW4gIygKLSAgbm98eWVzKSA7OyAjKAotICAq
KQorZmkKIAotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBpbnQ4X3QgJGFjX2N2
X2NfaW50OF90Ci1fQUNFT0YKLTs7Ci1lc2FjCiAKLWFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVO
TyIgIm1vZGVfdCIgImFjX2N2X3R5cGVfbW9kZV90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1p
ZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfbW9kZV90IiA9IHgiInllczsgdGhlbiA6CithY19mbl9jX2No
ZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiY3Vyc2VzLmgiICJhY19jdl9oZWFkZXJfY3Vy
c2VzX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2N1
cnNlc19oIiA9IHgiInllczsgdGhlbiA6CiAKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBjbGVhciBpbiAtbGN1cnNlcyIgPiY1CiskYXNf
ZWNob19uICJjaGVja2luZyBmb3IgY2xlYXIgaW4gLWxjdXJzZXMuLi4gIiA+JjY7IH0KK2lmIHRl
c3QgIiR7YWNfY3ZfbGliX2N1cnNlc19jbGVhcitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19l
Y2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJ
QlMKK0xJQlM9Ii1sY3Vyc2VzICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNv
bmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAotY2F0ID4+Y29uZmRlZnMu
aCA8PF9BQ0VPRgotI2RlZmluZSBtb2RlX3QgaW50CisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVy
bmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50
IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhl
biBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBf
X2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGNsZWFyICgpOworaW50CittYWlu
ICgpCit7CityZXR1cm4gY2xlYXIgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CiBfQUNFT0YKLQor
aWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfY3Vyc2Vz
X2NsZWFyPXllcworZWxzZQorICBhY19jdl9saWJfY3Vyc2VzX2NsZWFyPW5vCiBmaQotCi1hY19m
bl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJvZmZfdCIgImFjX2N2X3R5cGVfb2ZmX3QiICIkYWNf
aW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV9vZmZfdCIgPSB4IiJ5ZXM7
IHRoZW4gOgotCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwK
KyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tf
bGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogcmVzdWx0OiAkYWNfY3ZfbGliX2N1cnNlc19jbGVhciIgPiY1CiskYXNfZWNobyAiJGFjX2N2
X2xpYl9jdXJzZXNfY2xlYXIiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfY3Vyc2VzX2Ns
ZWFyIiA9IHgiInllczsgdGhlbiA6CisgIGN1cnNlcz0ieSIKIGVsc2UKLQotY2F0ID4+Y29uZmRl
ZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBvZmZfdCBsb25nIGludAotX0FDRU9GCi0KKyAgY3Vyc2Vz
PSJuIgogZmkKIAotYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAicGlkX3QiICJhY19jdl90
eXBlX3BpZF90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVf
cGlkX3QiID0geCIieWVzOyB0aGVuIDoKIAogZWxzZQorICBjdXJzZXM9Im4iCitmaQogCi1jYXQg
Pj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIHBpZF90IGludAotX0FDRU9GCiAKLWZpCith
Y19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibmN1cnNlcy5oIiAiYWNfY3Zf
aGVhZGVyX25jdXJzZXNfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19j
dl9oZWFkZXJfbmN1cnNlc19oIiA9IHgiInllczsgdGhlbiA6CiAKLXsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMvQysrIHJlc3RyaWN0IGtleXdv
cmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEMvQysrIHJlc3RyaWN0IGtleXdvcmQu
Li4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfY19yZXN0cmljdCtzZXR9IiA9IHNldDsgdGhl
biA6CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2lu
ZyBmb3IgY2xlYXIgaW4gLWxuY3Vyc2VzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBj
bGVhciBpbiAtbG5jdXJzZXMuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX25jdXJz
ZXNfY2xlYXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4m
NgogZWxzZQotICBhY19jdl9jX3Jlc3RyaWN0PW5vCi0gICAjIFRoZSBvcmRlciBoZXJlIGNhdGVy
cyB0byB0aGUgZmFjdCB0aGF0IEMrKyBkb2VzIG5vdCByZXF1aXJlIHJlc3RyaWN0LgotICAgZm9y
IGFjX2t3IGluIF9fcmVzdHJpY3QgX19yZXN0cmljdF9fIF9SZXN0cmljdCByZXN0cmljdDsgZG8K
LSAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorICBhY19j
aGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbG5jdXJzZXMgICRMSUJTIgorY2F0IGNv
bmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmgu
ICAqLwotdHlwZWRlZiBpbnQgKiBpbnRfcHRyOwotCWludCBmb28gKGludF9wdHIgJGFjX2t3IGlw
KSB7Ci0JcmV0dXJuIGlwWzBdOwotICAgICAgIH0KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRl
cm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGlu
dCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRo
ZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYg
X19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBjbGVhciAoKTsKIGludAogbWFp
biAoKQogewotaW50IHNbMV07Ci0JaW50ICogJGFjX2t3IHQgPSBzOwotCXRbMF0gPSAwOwotCXJl
dHVybiBmb28odCkKK3JldHVybiBjbGVhciAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KIF9BQ0VP
RgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9jX3Jl
c3RyaWN0PSRhY19rdworaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBh
Y19jdl9saWJfbmN1cnNlc19jbGVhcj15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX25jdXJzZXNfY2xl
YXI9bm8KIGZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNv
bmZ0ZXN0LiRhY19leHQKLSAgICAgdGVzdCAiJGFjX2N2X2NfcmVzdHJpY3QiICE9IG5vICYmIGJy
ZWFrCi0gICBkb25lCi0KK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpl
eHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19j
aGVja19saWJfc2F2ZV9MSUJTCiBmaQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX3Jlc3RyaWN0IiA+JjUKLSRhc19lY2hvICIkYWNfY3Zf
Y19yZXN0cmljdCIgPiY2OyB9Ci0KLSBjYXNlICRhY19jdl9jX3Jlc3RyaWN0IGluCi0gICByZXN0
cmljdCkgOzsKLSAgIG5vKSAkYXNfZWNobyAiI2RlZmluZSByZXN0cmljdCAvKiovIiA+PmNvbmZk
ZWZzLmgKLSA7OwotICAgKikgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgcmVz
dHJpY3QgJGFjX2N2X2NfcmVzdHJpY3QKLV9BQ0VPRgotIDs7Ci0gZXNhYwotCi1hY19mbl9jX2No
ZWNrX3R5cGUgIiRMSU5FTk8iICJzaXplX3QiICJhY19jdl90eXBlX3NpemVfdCIgIiRhY19pbmNs
dWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl90eXBlX3NpemVfdCIgPSB4IiJ5ZXM7IHRo
ZW4gOgotCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDog
JGFjX2N2X2xpYl9uY3Vyc2VzX2NsZWFyIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX25jdXJz
ZXNfY2xlYXIiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfbmN1cnNlc19jbGVhciIgPSB4
IiJ5ZXM7IHRoZW4gOgorICBuY3Vyc2VzPSJ5IgogZWxzZQotCi1jYXQgPj5jb25mZGVmcy5oIDw8
X0FDRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBpbnQKLV9BQ0VPRgotCisgIG5jdXJzZXM9
Im4iCiBmaQogCi1hY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzc2l6ZV90IiAiYWNfY3Zf
dHlwZV9zc2l6ZV90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5
cGVfc3NpemVfdCIgPSB4IiJ5ZXM7IHRoZW4gOgogCiBlbHNlCi0KLWNhdCA+PmNvbmZkZWZzLmgg
PDxfQUNFT0YKLSNkZWZpbmUgc3NpemVfdCBpbnQKLV9BQ0VPRgotCisgIG5jdXJzZXM9Im4iCiBm
aQogCi1hY19mbl9jX2NoZWNrX21lbWJlciAiJExJTkVOTyIgInN0cnVjdCBzdGF0IiAic3RfYmxr
c2l6ZSIgImFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9ibGtzaXplIiAiJGFjX2luY2x1ZGVz
X2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9ibGtzaXpl
IiA9IHgiInllczsgdGhlbiA6CiAKLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUg
SEFWRV9TVFJVQ1RfU1RBVF9TVF9CTEtTSVpFIDEKLV9BQ0VPRgoraWYgdGVzdCAiJGN1cnNlcyIg
PSAibiIgJiYgdGVzdCAiJG5jdXJzZXMiID0gIm4iOyB0aGVuIDoKIAorICAgIGFzX2ZuX2Vycm9y
ICQ/ICJVbmFibGUgdG8gZmluZCBhIHN1aXRhYmxlIGN1cnNlcyBsaWJyYXJ5IiAiJExJTkVOTyIg
NQogCiBmaQorIyBQcmVmZXIgbmN1cnNlcyBvdmVyIGN1cnNlcyBpZiBib3RoIGFyZSBwcmVzZW50
CitpZiB0ZXN0ICIkbmN1cnNlcyIgPSAieSI7IHRoZW4gOgogCi1hY19mbl9jX2NoZWNrX21lbWJl
ciAiJExJTkVOTyIgInN0cnVjdCBzdGF0IiAic3RfYmxvY2tzIiAiYWNfY3ZfbWVtYmVyX3N0cnVj
dF9zdGF0X3N0X2Jsb2NrcyIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19j
dl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmxvY2tzIiA9IHgiInllczsgdGhlbiA6Ci0KLWNhdCA+
PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9TVFJVQ1RfU1RBVF9TVF9CTE9DS1Mg
MQotX0FDRU9GCisgICAgQ1VSU0VTX0xJQlM9Ii1sbmN1cnNlcyIKIAorJGFzX2VjaG8gIiNkZWZp
bmUgSU5DTFVERV9DVVJTRVNfSCA8bmN1cnNlcy5oPiIgPj5jb25mZGVmcy5oCiAKLSRhc19lY2hv
ICIjZGVmaW5lIEhBVkVfU1RfQkxPQ0tTIDEiID4+Y29uZmRlZnMuaAogCiBlbHNlCi0gIGNhc2Ug
IiAkTElCT0JKUyAiIGluCi0gICoiIGZpbGVibG9ja3MuJGFjX29iamV4dCAiKiApIDs7Ci0gICop
IExJQk9CSlM9IiRMSUJPQkpTIGZpbGVibG9ja3MuJGFjX29iamV4dCIKLSA7OwotZXNhYwotCi1m
aQotCiAKLWFjX2ZuX2NfY2hlY2tfbWVtYmVyICIkTElORU5PIiAic3RydWN0IHN0YXQiICJzdF9y
ZGV2IiAiYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X3JkZXYiICIkYWNfaW5jbHVkZXNfZGVm
YXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X3JkZXYiID0geCIi
eWVzOyB0aGVuIDoKKyAgICBDVVJTRVNfTElCUz0iLWxjdXJzZXMiCiAKLWNhdCA+PmNvbmZkZWZz
LmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9TVFJVQ1RfU1RBVF9TVF9SREVWIDEKLV9BQ0VPRgor
JGFzX2VjaG8gIiNkZWZpbmUgSU5DTFVERV9DVVJTRVNfSCA8Y3Vyc2VzLmg+IiA+PmNvbmZkZWZz
LmgKIAogCiBmaQogCi1hY19mbl9jX2ZpbmRfdWludFhfdCAiJExJTkVOTyIgIjE2IiAiYWNfY3Zf
Y191aW50MTZfdCIKLWNhc2UgJGFjX2N2X2NfdWludDE2X3QgaW4gIygKLSAgbm98eWVzKSA7OyAj
KAotICAqKQogCiAKLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgdWludDE2X3Qg
JGFjX2N2X2NfdWludDE2X3QKLV9BQ0VPRgotOzsKLSAgZXNhYwogCi1hY19mbl9jX2ZpbmRfdWlu
dFhfdCAiJExJTkVOTyIgIjMyIiAiYWNfY3ZfY191aW50MzJfdCIKLWNhc2UgJGFjX2N2X2NfdWlu
dDMyX3QgaW4gIygKLSAgbm98eWVzKSA7OyAjKAotICAqKQogCi0kYXNfZWNobyAiI2RlZmluZSBf
VUlOVDMyX1QgMSIgPj5jb25mZGVmcy5oCiAKIAotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgot
I2RlZmluZSB1aW50MzJfdCAkYWNfY3ZfY191aW50MzJfdAotX0FDRU9GCi07OwotICBlc2FjCiAK
LWFjX2ZuX2NfZmluZF91aW50WF90ICIkTElORU5PIiAiNjQiICJhY19jdl9jX3VpbnQ2NF90Igot
Y2FzZSAkYWNfY3ZfY191aW50NjRfdCBpbiAjKAotICBub3x5ZXMpIDs7ICMoCitpZiB0ZXN0ICJ4
JGFjX2N2X2Vudl9QS0dfQ09ORklHX3NldCIgIT0gInhzZXQiOyB0aGVuCisJaWYgdGVzdCAtbiAi
JGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7
YWNfdG9vbF9wcmVmaXh9cGtnLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3
aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1wa2ctY29uZmlnOyBhY193b3Jk
PSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZv
ciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+
JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9QS0dfQ09ORklHK3NldH0iID0gc2V0OyB0aGVu
IDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkUEtHX0NPTkZJ
RyBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9QS0dfQ09ORklHPSIkUEtH
X0NPTkZJRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisg
IDs7CiAgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBh
c19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2Rp
ciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVf
ZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNf
ZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhl
bgorICAgIGFjX2N2X3BhdGhfUEtHX0NPTkZJRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4
dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNf
ZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisg
IGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKIAotJGFzX2VjaG8gIiNkZWZpbmUgX1VJTlQ2NF9UIDEi
ID4+Y29uZmRlZnMuaAotCisgIDs7Citlc2FjCitmaQorUEtHX0NPTkZJRz0kYWNfY3ZfcGF0aF9Q
S0dfQ09ORklHCitpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KKyAgeyAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQS0dfQ09ORklHIiA+JjUKKyRh
c19lY2hvICIkUEtHX0NPTkZJRyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsg
fQorZmkKIAotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSB1aW50NjRfdCAkYWNf
Y3ZfY191aW50NjRfdAotX0FDRU9GCi07OwotICBlc2FjCiAKLWFjX2ZuX2NfZmluZF91aW50WF90
ICIkTElORU5PIiAiOCIgImFjX2N2X2NfdWludDhfdCIKLWNhc2UgJGFjX2N2X2NfdWludDhfdCBp
biAjKAotICBub3x5ZXMpIDs7ICMoCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfUEtHX0NP
TkZJRyI7IHRoZW4KKyAgYWNfcHRfUEtHX0NPTkZJRz0kUEtHX0NPTkZJRworICAjIEV4dHJhY3Qg
dGhlIGZpcnN0IHdvcmQgb2YgInBrZy1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5h
bWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHBrZy1jb25maWc7IGFjX3dvcmQ9JDIKK3sgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+
JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVz
dCAiJHthY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUcrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAk
YXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRhY19wdF9QS0dfQ09ORklH
IGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUc9
IiRhY19wdF9QS0dfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRo
IGEgcGF0aC4KKyAgOzsKICAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFS
QVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0
IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNf
ZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dv
cmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19l
eHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9hY19wdF9QS0dfQ09ORklHPSIkYXNfZGlyLyRh
Y193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFr
IDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUwogCi0kYXNfZWNobyAiI2Rl
ZmluZSBfVUlOVDhfVCAxIiA+PmNvbmZkZWZzLmgKLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FD
RU9GCi0jZGVmaW5lIHVpbnQ4X3QgJGFjX2N2X2NfdWludDhfdAotX0FDRU9GCi07OwotICBlc2Fj
Ci0KLWFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInB0cmRpZmZfdCIgImFjX2N2X3R5cGVf
cHRyZGlmZl90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVf
cHRyZGlmZl90IiA9IHgiInllczsgdGhlbiA6Ci0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YK
LSNkZWZpbmUgSEFWRV9QVFJESUZGX1QgMQotX0FDRU9GCi0KLQorICA7OworZXNhYworZmkKK2Fj
X3B0X1BLR19DT05GSUc9JGFjX2N2X3BhdGhfYWNfcHRfUEtHX0NPTkZJRworaWYgdGVzdCAtbiAi
JGFjX3B0X1BLR19DT05GSUciOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogcmVzdWx0OiAkYWNfcHRfUEtHX0NPTkZJRyIgPiY1CiskYXNfZWNobyAiJGFj
X3B0X1BLR19DT05GSUciID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZp
CiAKLQotIyBDaGVja3MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zLgoteyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZXJyb3JfYXRfbGluZSIgPiY1Ci0k
YXNfZWNob19uICJjaGVja2luZyBmb3IgZXJyb3JfYXRfbGluZS4uLiAiID4mNjsgfQotaWYgdGVz
dCAiJHthY19jdl9saWJfZXJyb3JfYXRfbGluZStzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19l
Y2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0Yg
PmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxlcnJv
ci5oPgotaW50Ci1tYWluICgpCi17Ci1lcnJvcl9hdF9saW5lICgwLCAwLCAiIiwgMCwgImFuIGVy
cm9yIG9jY3VycmVkIik7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2Nf
dHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2Vycm9yX2F0X2xpbmU9eWVz
CisgIGlmIHRlc3QgIngkYWNfcHRfUEtHX0NPTkZJRyIgPSB4OyB0aGVuCisgICAgUEtHX0NPTkZJ
Rz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBp
bgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklO
RzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUK
KyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhl
ZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYwor
ICAgIFBLR19DT05GSUc9JGFjX3B0X1BLR19DT05GSUcKKyAgZmkKIGVsc2UKLSAgYWNfY3ZfbGli
X2Vycm9yX2F0X2xpbmU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4k
YWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICBQ
S0dfQ09ORklHPSIkYWNfY3ZfcGF0aF9QS0dfQ09ORklHIgogZmkKLXsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2Vycm9yX2F0X2xpbmUi
ID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfZXJyb3JfYXRfbGluZSIgPiY2OyB9Ci1pZiB0ZXN0
ICRhY19jdl9saWJfZXJyb3JfYXRfbGluZSA9IG5vOyB0aGVuCi0gIGNhc2UgIiAkTElCT0JKUyAi
IGluCi0gICoiIGVycm9yLiRhY19vYmpleHQgIiogKSA7OwotICAqKSBMSUJPQkpTPSIkTElCT0JK
UyBlcnJvci4kYWNfb2JqZXh0IgotIDs7Ci1lc2FjCiAKIGZpCi0KLWZvciBhY19oZWFkZXIgaW4g
dmZvcmsuaAotZG8gOgotICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAi
dmZvcmsuaCIgImFjX2N2X2hlYWRlcl92Zm9ya19oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1p
ZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl92Zm9ya19oIiA9IHgiInllczsgdGhlbiA6Ci0gIGNhdCA+
PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9WRk9SS19IIDEKLV9BQ0VPRgotCitp
ZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KKwlfcGtnX21pbl92ZXJzaW9uPTAuOS4wCisJ
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBwa2ctY29u
ZmlnIGlzIGF0IGxlYXN0IHZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb24iID4mNQorJGFzX2VjaG9f
biAiY2hlY2tpbmcgcGtnLWNvbmZpZyBpcyBhdCBsZWFzdCB2ZXJzaW9uICRfcGtnX21pbl92ZXJz
aW9uLi4uICIgPiY2OyB9CisJaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJz
aW9uICRfcGtnX21pbl92ZXJzaW9uOyB0aGVuCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp
bmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJ
ZWxzZQorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDog
bm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkJUEtHX0NPTkZJRz0iIgorCWZpCiBmaQog
Ci1kb25lCi0KLWZvciBhY19mdW5jIGluIGZvcmsgdmZvcmsKLWRvIDoKLSAgYXNfYWNfdmFyPWAk
YXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi1hY19mbl9jX2NoZWNr
X2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCi1pZiBldmFsIHRlc3QgXCJ4
XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxf
QUNFT0YKLSNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEK
LV9BQ0VPRgotCi1maQotZG9uZQorcGtnX2ZhaWxlZD1ubworeyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2xpYiIgPiY1CiskYXNfZWNob19uICJj
aGVja2luZyBmb3IgZ2xpYi4uLiAiID4mNjsgfQogCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZm9y
ayIgPSB4eWVzOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgZm9yayIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBm
b3Igd29ya2luZyBmb3JrLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2Z1bmNfZm9ya193
b3JrcytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1l
bHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgYWNfY3Zf
ZnVuY19mb3JrX3dvcmtzPWNyb3NzCitpZiB0ZXN0IC1uICIkZ2xpYl9DRkxBR1MiOyB0aGVuCisg
ICAgcGtnX2N2X2dsaWJfQ0ZMQUdTPSIkZ2xpYl9DRkxBR1MiCisgZWxpZiB0ZXN0IC1uICIkUEtH
X0NPTkZJRyI7IHRoZW4KKyAgICBpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyIgJiYgXAorICAgIHsg
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJFBLR19DT05GSUcgLS1l
eGlzdHMgLS1wcmludC1lcnJvcnMgXCJnbGliLTIuMFwiIjsgfSA+JjUKKyAgKCRQS0dfQ09ORklH
IC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICJnbGliLTIuMCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/
CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0
dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCisgIHBrZ19jdl9nbGliX0NG
TEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgImdsaWItMi4wIiAyPi9kZXYvbnVsbGAKIGVsc2UK
LSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNv
bmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLWludAotbWFpbiAoKQotewotCi0J
ICAvKiBCeSBSdWVkaWdlciBLdWhsbWFubi4gKi8KLQkgIHJldHVybiBmb3JrICgpIDwgMDsKLQot
ICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8i
OyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPXllcworICBwa2dfZmFpbGVkPXllcwor
ZmkKKyBlbHNlCisgICAgcGtnX2ZhaWxlZD11bnRyaWVkCitmaQoraWYgdGVzdCAtbiAiJGdsaWJf
TElCUyI7IHRoZW4KKyAgICBwa2dfY3ZfZ2xpYl9MSUJTPSIkZ2xpYl9MSUJTIgorIGVsaWYgdGVz
dCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYm
IFwKKyAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0df
Q09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwiZ2xpYi0yLjBcIiI7IH0gPiY1CisgICgk
UEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAiZ2xpYi0yLjAiKSAyPiY1CisgIGFj
X3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8g
PSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICBwa2df
Y3ZfZ2xpYl9MSUJTPWAkUEtHX0NPTkZJRyAtLWxpYnMgImdsaWItMi4wIiAyPi9kZXYvbnVsbGAK
IGVsc2UKLSAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPW5vCisgIHBrZ19mYWlsZWQ9eWVzCiBmaQot
cm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVz
dCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRl
c3QuJGFjX2V4dAorIGVsc2UKKyAgICBwa2dfZmFpbGVkPXVudHJpZWQKIGZpCiAKLWZpCi17ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNf
Zm9ya193b3JrcyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2Z1bmNfZm9ya193b3JrcyIgPiY2OyB9
CiAKKworaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHllczsgdGhlbgorICAgCXsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8i
ID4mNjsgfQorCitpZiAkUEtHX0NPTkZJRyAtLWF0bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gMC4y
MDsgdGhlbgorICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9eWVzCiBlbHNlCi0g
IGFjX2N2X2Z1bmNfZm9ya193b3Jrcz0kYWNfY3ZfZnVuY19mb3JrCisgICAgICAgIF9wa2dfc2hv
cnRfZXJyb3JzX3N1cHBvcnRlZD1ubwogZmkKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrX3dv
cmtzIiA9IHhjcm9zczsgdGhlbgotICBjYXNlICRob3N0IGluCi0gICAgKi0qLWFtaWdhb3MqIHwg
Ki0qLW1zZG9zZGpncHAqKQotICAgICAgIyBPdmVycmlkZSwgYXMgdGhlc2Ugc3lzdGVtcyBoYXZl
IG9ubHkgYSBkdW1teSBmb3JrKCkgc3R1YgotICAgICAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPW5v
Ci0gICAgICA7OwotICAgICopCi0gICAgICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9eWVzCi0gICAg
ICA7OwotICBlc2FjCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
V0FSTklORzogcmVzdWx0ICRhY19jdl9mdW5jX2Zvcmtfd29ya3MgZ3Vlc3NlZCBiZWNhdXNlIG9m
IGNyb3NzIGNvbXBpbGF0aW9uIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHJlc3Vs
dCAkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIGd1ZXNzZWQgYmVjYXVzZSBvZiBjcm9zcyBjb21waWxh
dGlvbiIgPiYyO30KLWZpCi1hY19jdl9mdW5jX3Zmb3JrX3dvcmtzPSRhY19jdl9mdW5jX3Zmb3Jr
Ci1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfdmZvcmsiID0geHllczsgdGhlbgotICB7ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIHZmb3Jr
IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciB3b3JraW5nIHZmb3JrLi4uICIgPiY2OyB9
Ci1pZiB0ZXN0ICIke2FjX2N2X2Z1bmNfdmZvcmtfd29ya3Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgot
ICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29t
cGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9Y3Jvc3MKLWVs
c2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5k
IGNvbmZkZWZzLmguICAqLwotLyogVGhhbmtzIHRvIFBhdWwgRWdnZXJ0IGZvciB0aGlzIHRlc3Qu
ICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2lmZGVm
IEhBVkVfVkZPUktfSAotIyBpbmNsdWRlIDx2Zm9yay5oPgotI2VuZGlmCi0vKiBPbiBzb21lIHNw
YXJjIHN5c3RlbXMsIGNoYW5nZXMgYnkgdGhlIGNoaWxkIHRvIGxvY2FsIGFuZCBpbmNvbWluZwot
ICAgYXJndW1lbnQgcmVnaXN0ZXJzIGFyZSBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIHBhcmVudC4g
IFRoZSBjb21waWxlcgotICAgaXMgdG9sZCBhYm91dCB0aGlzIHdpdGggI2luY2x1ZGUgPHZmb3Jr
Lmg+LCBidXQgc29tZSBjb21waWxlcnMKLSAgIChlLmcuIGdjYyAtTykgZG9uJ3QgZ3JvayA8dmZv
cmsuaD4uICBUZXN0IGZvciB0aGlzIGJ5IHVzaW5nIGEKLSAgIHN0YXRpYyB2YXJpYWJsZSB3aG9z
ZSBhZGRyZXNzIGlzIHB1dCBpbnRvIGEgcmVnaXN0ZXIgdGhhdCBpcwotICAgY2xvYmJlcmVkIGJ5
IHRoZSB2Zm9yay4gICovCi1zdGF0aWMgdm9pZAotI2lmZGVmIF9fY3BsdXNwbHVzCi1zcGFyY19h
ZGRyZXNzX3Rlc3QgKGludCBhcmcpCi0jIGVsc2UKLXNwYXJjX2FkZHJlc3NfdGVzdCAoYXJnKSBp
bnQgYXJnOwotI2VuZGlmCi17Ci0gIHN0YXRpYyBwaWRfdCBjaGlsZDsKLSAgaWYgKCFjaGlsZCkg
ewotICAgIGNoaWxkID0gdmZvcmsgKCk7Ci0gICAgaWYgKGNoaWxkIDwgMCkgewotICAgICAgcGVy
cm9yICgidmZvcmsiKTsKLSAgICAgIF9leGl0KDIpOwotICAgIH0KLSAgICBpZiAoIWNoaWxkKSB7
Ci0gICAgICBhcmcgPSBnZXRwaWQoKTsKLSAgICAgIHdyaXRlKC0xLCAiIiwgMCk7Ci0gICAgICBf
ZXhpdCAoYXJnKTsKLSAgICB9Ci0gIH0KLX0KKyAgICAgICAgaWYgdGVzdCAkX3BrZ19zaG9ydF9l
cnJvcnNfc3VwcG9ydGVkID0geWVzOyB0aGVuCisJICAgICAgICBnbGliX1BLR19FUlJPUlM9YCRQ
S0dfQ09ORklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzICJnbGliLTIuMCIgMj4mMWAK
KyAgICAgICAgZWxzZQorCSAgICAgICAgZ2xpYl9QS0dfRVJST1JTPWAkUEtHX0NPTkZJRyAtLXBy
aW50LWVycm9ycyAiZ2xpYi0yLjAiIDI+JjFgCisgICAgICAgIGZpCisJIyBQdXQgdGhlIG5hc3R5
IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCisJZWNobyAiJGds
aWJfUEtHX0VSUk9SUyIgPiY1CiAKLWludAotbWFpbiAoKQotewotICBwaWRfdCBwYXJlbnQgPSBn
ZXRwaWQgKCk7Ci0gIHBpZF90IGNoaWxkOwotCi0gIHNwYXJjX2FkZHJlc3NfdGVzdCAoMCk7Ci0K
LSAgY2hpbGQgPSB2Zm9yayAoKTsKLQotICBpZiAoY2hpbGQgPT0gMCkgewotICAgIC8qIEhlcmUg
aXMgYW5vdGhlciB0ZXN0IGZvciBzcGFyYyB2Zm9yayByZWdpc3RlciBwcm9ibGVtcy4gIFRoaXMK
LSAgICAgICB0ZXN0IHVzZXMgbG90cyBvZiBsb2NhbCB2YXJpYWJsZXMsIGF0IGxlYXN0IGFzIG1h
bnkgbG9jYWwKLSAgICAgICB2YXJpYWJsZXMgYXMgbWFpbiBoYXMgYWxsb2NhdGVkIHNvIGZhciBp
bmNsdWRpbmcgY29tcGlsZXIKLSAgICAgICB0ZW1wb3Jhcmllcy4gIDQgbG9jYWxzIGFyZSBlbm91
Z2ggZm9yIGdjYyAxLjQwLjMgb24gYSBTb2xhcmlzCi0gICAgICAgNC4xLjMgc3BhcmMsIGJ1dCB3
ZSB1c2UgOCB0byBiZSBzYWZlLiAgQSBidWdneSBjb21waWxlciBzaG91bGQKLSAgICAgICByZXVz
ZSB0aGUgcmVnaXN0ZXIgb2YgcGFyZW50IGZvciBvbmUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlcywK
LSAgICAgICBzaW5jZSBpdCB3aWxsIHRoaW5rIHRoYXQgcGFyZW50IGNhbid0IHBvc3NpYmx5IGJl
IHVzZWQgYW55IG1vcmUKLSAgICAgICBpbiB0aGlzIHJvdXRpbmUuICBBc3NpZ25pbmcgdG8gdGhl
IGxvY2FsIHZhcmlhYmxlIHdpbGwgdGh1cwotICAgICAgIG11bmdlIHBhcmVudCBpbiB0aGUgcGFy
ZW50IHByb2Nlc3MuICAqLwotICAgIHBpZF90Ci0gICAgICBwID0gZ2V0cGlkKCksIHAxID0gZ2V0
cGlkKCksIHAyID0gZ2V0cGlkKCksIHAzID0gZ2V0cGlkKCksCi0gICAgICBwNCA9IGdldHBpZCgp
LCBwNSA9IGdldHBpZCgpLCBwNiA9IGdldHBpZCgpLCBwNyA9IGdldHBpZCgpOwotICAgIC8qIENv
bnZpbmNlIHRoZSBjb21waWxlciB0aGF0IHAuLnA3IGFyZSBsaXZlOyBvdGhlcndpc2UsIGl0IG1p
Z2h0Ci0gICAgICAgdXNlIHRoZSBzYW1lIGhhcmR3YXJlIHJlZ2lzdGVyIGZvciBhbGwgOCBsb2Nh
bCB2YXJpYWJsZXMuICAqLwotICAgIGlmIChwICE9IHAxIHx8IHAgIT0gcDIgfHwgcCAhPSBwMyB8
fCBwICE9IHA0Ci0JfHwgcCAhPSBwNSB8fCBwICE9IHA2IHx8IHAgIT0gcDcpCi0gICAgICBfZXhp
dCgxKTsKLQotICAgIC8qIE9uIHNvbWUgc3lzdGVtcyAoZS5nLiBJUklYIDMuMyksIHZmb3JrIGRv
ZXNuJ3Qgc2VwYXJhdGUgcGFyZW50Ci0gICAgICAgZnJvbSBjaGlsZCBmaWxlIGRlc2NyaXB0b3Jz
LiAgSWYgdGhlIGNoaWxkIGNsb3NlcyBhIGRlc2NyaXB0b3IKLSAgICAgICBiZWZvcmUgaXQgZXhl
Y3Mgb3IgZXhpdHMsIHRoaXMgbXVuZ2VzIHRoZSBwYXJlbnQncyBkZXNjcmlwdG9yCi0gICAgICAg
YXMgd2VsbC4gIFRlc3QgZm9yIHRoaXMgYnkgY2xvc2luZyBzdGRvdXQgaW4gdGhlIGNoaWxkLiAg
Ki8KLSAgICBfZXhpdChjbG9zZShmaWxlbm8oc3Rkb3V0KSkgIT0gMCk7Ci0gIH0gZWxzZSB7Ci0g
ICAgaW50IHN0YXR1czsKLSAgICBzdHJ1Y3Qgc3RhdCBzdDsKKwlhc19mbl9lcnJvciAkPyAiUGFj
a2FnZSByZXF1aXJlbWVudHMgKGdsaWItMi4wKSB3ZXJlIG5vdCBtZXQ6CiAKLSAgICB3aGlsZSAo
d2FpdCgmc3RhdHVzKSAhPSBjaGlsZCkKLSAgICAgIDsKLSAgICByZXR1cm4gKAotCSAvKiBXYXMg
dGhlcmUgc29tZSBwcm9ibGVtIHdpdGggdmZvcmtpbmc/ICAqLwotCSBjaGlsZCA8IDAKKyRnbGli
X1BLR19FUlJPUlMKIAotCSAvKiBEaWQgdGhlIGNoaWxkIGZhaWw/ICAoVGhpcyBzaG91bGRuJ3Qg
aGFwcGVuLikgICovCi0JIHx8IHN0YXR1cworQ29uc2lkZXIgYWRqdXN0aW5nIHRoZSBQS0dfQ09O
RklHX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgeW91CitpbnN0YWxsZWQgc29mdHdhcmUg
aW4gYSBub24tc3RhbmRhcmQgcHJlZml4LgogCi0JIC8qIERpZCB0aGUgdmZvcmsvY29tcGlsZXIg
YnVnIG9jY3VyPyAgKi8KLQkgfHwgcGFyZW50ICE9IGdldHBpZCgpCitBbHRlcm5hdGl2ZWx5LCB5
b3UgbWF5IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGdsaWJfQ0ZMQUdTCithbmQgZ2xp
Yl9MSUJTIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGNhbGwgcGtnLWNvbmZpZy4KK1NlZSB0aGUgcGtn
LWNvbmZpZyBtYW4gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLiIgIiRMSU5FTk8iIDUKK2VsaWYgdGVz
dCAkcGtnX2ZhaWxlZCA9IHVudHJpZWQ7IHRoZW4KKyAgICAgCXsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsg
fQorCXsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4g
XGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6
IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gIlRoZSBwa2ctY29uZmlnIHNjcmlwdCBjb3VsZCBub3Qg
YmUgZm91bmQgb3IgaXMgdG9vIG9sZC4gIE1ha2Ugc3VyZSBpdAoraXMgaW4geW91ciBQQVRIIG9y
IHNldCB0aGUgUEtHX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgZnVsbAorcGF0
aCB0byBwa2ctY29uZmlnLgogCi0JIC8qIERpZCB0aGUgZmlsZSBkZXNjcmlwdG9yIGJ1ZyBvY2N1
cj8gICovCi0JIHx8IGZzdGF0KGZpbGVubyhzdGRvdXQpLCAmc3QpICE9IDAKLQkgKTsKLSAgfQot
fQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3Zf
ZnVuY192Zm9ya193b3Jrcz15ZXMKK0FsdGVybmF0aXZlbHksIHlvdSBtYXkgc2V0IHRoZSBlbnZp
cm9ubWVudCB2YXJpYWJsZXMgZ2xpYl9DRkxBR1MKK2FuZCBnbGliX0xJQlMgdG8gYXZvaWQgdGhl
IG5lZWQgdG8gY2FsbCBwa2ctY29uZmlnLgorU2VlIHRoZSBwa2ctY29uZmlnIG1hbiBwYWdlIGZv
ciBtb3JlIGRldGFpbHMuCisKK1RvIGdldCBwa2ctY29uZmlnLCBzZWUgPGh0dHA6Ly9wa2ctY29u
ZmlnLmZyZWVkZXNrdG9wLm9yZy8+LgorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWls
cyIgIiRMSU5FTk8iIDUgOyB9CiBlbHNlCi0gIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9bm8KLWZp
Ci1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0
ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25m
dGVzdC4kYWNfZXh0Ci1maQorCWdsaWJfQ0ZMQUdTPSRwa2dfY3ZfZ2xpYl9DRkxBR1MKKwlnbGli
X0xJQlM9JHBrZ19jdl9nbGliX0xJQlMKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0K
IAogZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAk
YWNfY3ZfZnVuY192Zm9ya193b3JrcyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2Z1bmNfdmZvcmtf
d29ya3MiID4mNjsgfQogCi1maTsKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA9
IHhjcm9zczsgdGhlbgotICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPSRhY19jdl9mdW5jX3Zmb3Jr
Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogcmVz
dWx0ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIGd1ZXNzZWQgYmVjYXVzZSBvZiBjcm9zcyBjb21w
aWxhdGlvbiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiByZXN1bHQgJGFjX2N2X2Z1
bmNfdmZvcmtfd29ya3MgZ3Vlc3NlZCBiZWNhdXNlIG9mIGNyb3NzIGNvbXBpbGF0aW9uIiA+JjI7
fQorIyBDaGVjayBsaWJyYXJ5IHBhdGgKK2lmIHRlc3QgIlwke2V4ZWNfcHJlZml4fS9saWIiID0g
IiRsaWJkaXIiOyB0aGVuIDoKKyAgaWYgdGVzdCAiJGV4ZWNfcHJlZml4IiA9ICJOT05FIiAmJiB0
ZXN0ICIkcHJlZml4IiAhPSAiTk9ORSI7IHRoZW4gOgorICBleGVjX3ByZWZpeD0kcHJlZml4CiBm
aQorICAgIGlmIHRlc3QgIiRleGVjX3ByZWZpeCIgPSAiTk9ORSI7IHRoZW4gOgorICBleGVjX3By
ZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKK2ZpCisgICAgaWYgdGVzdCAtZCAiJHtleGVjX3ByZWZp
eH0vbGliNjQiOyB0aGVuIDoKIAotaWYgdGVzdCAieCRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIiA9
IHh5ZXM7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9XT1JLSU5HX1ZGT1JLIDEiID4+
Y29uZmRlZnMuaAorICAgICAgICBMSUJfUEFUSD0ibGliNjQiCiAKIGVsc2UKIAotJGFzX2VjaG8g
IiNkZWZpbmUgdmZvcmsgZm9yayIgPj5jb25mZGVmcy5oCisgICAgICAgIExJQl9QQVRIPSJsaWIi
CiAKIGZpCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZm9ya193b3JrcyIgPSB4eWVzOyB0aGVuCiAK
LSRhc19lY2hvICIjZGVmaW5lIEhBVkVfV09SS0lOR19GT1JLIDEiID4+Y29uZmRlZnMuaAorZWxz
ZQogCi1maQorICAgIExJQl9QQVRIPSIke2xpYmRpcjpgZXhwciBsZW5ndGggIiRleGVjX3ByZWZp
eCIgKyAxYH0iCiAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hl
Y2tpbmcgZm9yIF9MQVJHRUZJTEVfU09VUkNFIHZhbHVlIG5lZWRlZCBmb3IgbGFyZ2UgZmlsZXMi
ID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIF9MQVJHRUZJTEVfU09VUkNFIHZhbHVlIG5l
ZWRlZCBmb3IgbGFyZ2UgZmlsZXMuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfc3lzX2xh
cmdlZmlsZV9zb3VyY2Urc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVk
KSAiID4mNgotZWxzZQotICB3aGlsZSA6OyBkbwotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9G
ID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lz
L3R5cGVzLmg+IC8qIGZvciBvZmZfdCAqLwotICAgICAjaW5jbHVkZSA8c3RkaW8uaD4KLWludAot
bWFpbiAoKQotewotaW50ICgqZnApIChGSUxFICosIG9mZl90LCBpbnQpID0gZnNlZWtvOwotICAg
ICByZXR1cm4gZnNlZWtvIChzdGRpbiwgMCwgMCkgJiYgZnAgKHN0ZGluLCAwLCAwKTsKLSAgOwot
ICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRo
ZW4gOgotICBhY19jdl9zeXNfbGFyZ2VmaWxlX3NvdXJjZT1ubzsgYnJlYWsKLWZpCi1ybSAtZiBj
b3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19l
eGVleHQgY29uZnRlc3QuJGFjX2V4dAotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25m
dGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jZGVmaW5lIF9MQVJHRUZJTEVf
U09VUkNFIDEKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogZm9yIG9mZl90ICovCi0gICAgICNp
bmNsdWRlIDxzdGRpby5oPgotaW50Ci1tYWluICgpCi17Ci1pbnQgKCpmcCkgKEZJTEUgKiwgb2Zm
X3QsIGludCkgPSBmc2Vla287Ci0gICAgIHJldHVybiBmc2Vla28gKHN0ZGluLCAwLCAwKSAmJiBm
cCAoc3RkaW4sIDAsIDApOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9j
X3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X3N5c19sYXJnZWZpbGVfc291cmNl
PTE7IGJyZWFrCiBmaQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4
dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3Zfc3lz
X2xhcmdlZmlsZV9zb3VyY2U9dW5rbm93bgotICBicmVhawotZG9uZQotZmkKLXsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc3lzX2xhcmdlZmls
ZV9zb3VyY2UiID4mNQotJGFzX2VjaG8gIiRhY19jdl9zeXNfbGFyZ2VmaWxlX3NvdXJjZSIgPiY2
OyB9Ci1jYXNlICRhY19jdl9zeXNfbGFyZ2VmaWxlX3NvdXJjZSBpbiAjKAotICBubyB8IHVua25v
d24pIDs7Ci0gICopCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIF9MQVJHRUZJ
TEVfU09VUkNFICRhY19jdl9zeXNfbGFyZ2VmaWxlX3NvdXJjZQotX0FDRU9GCi07OwotZXNhYwot
cm0gLXJmIGNvbmZ0ZXN0KgotCi0jIFdlIHVzZWQgdG8gdHJ5IGRlZmluaW5nIF9YT1BFTl9TT1VS
Q0U9NTAwIHRvbywgdG8gd29yayBhcm91bmQgYSBidWcKLSMgaW4gZ2xpYmMgMi4xLjMsIGJ1dCB0
aGF0IGJyZWFrcyB0b28gbWFueSBvdGhlciB0aGluZ3MuCi0jIElmIHlvdSB3YW50IGZzZWVrbyBh
bmQgZnRlbGxvIHdpdGggZ2xpYmMsIHVwZ3JhZGUgdG8gYSBmaXhlZCBnbGliYy4KLWlmIHRlc3Qg
JGFjX2N2X3N5c19sYXJnZWZpbGVfc291cmNlICE9IHVua25vd247IHRoZW4KIAotJGFzX2VjaG8g
IiNkZWZpbmUgSEFWRV9GU0VFS08gMSIgPj5jb25mZGVmcy5oCiAKLWZpCisjIENoZWNrcyBmb3Ig
bGlicmFyaWVzLgorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImJ6bGli
LmgiICJhY19jdl9oZWFkZXJfYnpsaWJfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVz
dCAieCRhY19jdl9oZWFkZXJfYnpsaWJfaCIgPSB4IiJ5ZXM7IHRoZW4gOgogCi17ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgbHN0YXQgY29y
cmVjdGx5IGhhbmRsZXMgdHJhaWxpbmcgc2xhc2giID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcg
d2hldGhlciBsc3RhdCBjb3JyZWN0bHkgaGFuZGxlcyB0cmFpbGluZyBzbGFzaC4uLiAiID4mNjsg
fQotaWYgdGVzdCAiJHthY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxp
bmsrc2V0fSIgPSBzZXQ7IHRoZW4gOgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBjaGVja2luZyBmb3IgQloyX2J6RGVjb21wcmVzc0luaXQgaW4gLWxiejIiID4mNQor
JGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEJaMl9iekRlY29tcHJlc3NJbml0IGluIC1sYnoyLi4u
ICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9iejJfQloyX2J6RGVjb21wcmVzc0luaXQr
c2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQot
ICBybSAtZiBjb25mdGVzdC5zeW0gY29uZnRlc3QuZmlsZQotZWNobyA+Y29uZnRlc3QuZmlsZQot
aWYgdGVzdCAiJGFzX2xuX3MiID0gImxuIC1zIiAmJiBsbiAtcyBjb25mdGVzdC5maWxlIGNvbmZ0
ZXN0LnN5bTsgdGhlbgotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6
Ci0gIGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluaz1ubwotZWxz
ZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisgIGFjX2No
ZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sYnoyICAkTElCUyIKK2NhdCBjb25mZGVm
cy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8K
LSRhY19pbmNsdWRlc19kZWZhdWx0CisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJv
dG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQg
bWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBh
cmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNw
bHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgQloyX2J6RGVjb21wcmVzc0luaXQgKCk7CiBp
bnQKIG1haW4gKCkKIHsKLXN0cnVjdCBzdGF0IHNidWY7Ci0gICAgIC8qIExpbnV4IHdpbGwgZGVy
ZWZlcmVuY2UgdGhlIHN5bWxpbmsgYW5kIGZhaWwsIGFzIHJlcXVpcmVkIGJ5IFBPU0lYLgotCVRo
YXQgaXMgYmV0dGVyIGluIHRoZSBzZW5zZSB0aGF0IGl0IG1lYW5zIHdlIHdpbGwgbm90Ci0JaGF2
ZSB0byBjb21waWxlIGFuZCB1c2UgdGhlIGxzdGF0IHdyYXBwZXIuICAqLwotICAgICByZXR1cm4g
bHN0YXQgKCJjb25mdGVzdC5zeW0vIiwgJnNidWYpID09IDA7CityZXR1cm4gQloyX2J6RGVjb21w
cmVzc0luaXQgKCk7CiAgIDsKICAgcmV0dXJuIDA7CiB9CiBfQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5
X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19z
bGFzaGVkX3N5bWxpbms9eWVzCi1lbHNlCi0gIGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2Vz
X3NsYXNoZWRfc3ltbGluaz1ubwotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3Qu
KiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29i
amV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KK2lmIGFjX2ZuX2NfdHJ5
X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2J6Ml9CWjJfYnpEZWNvbXByZXNz
SW5pdD15ZXMKIGVsc2UKLSAgIyBJZiB0aGUgYGxuIC1zJyBjb21tYW5kIGZhaWxlZCwgdGhlbiB3
ZSBwcm9iYWJseSBkb24ndCBldmVuCi0gICMgaGF2ZSBhbiBsc3RhdCBmdW5jdGlvbi4KLSAgYWNf
Y3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rPW5vCisgIGFjX2N2X2xp
Yl9iejJfQloyX2J6RGVjb21wcmVzc0luaXQ9bm8KIGZpCi1ybSAtZiBjb25mdGVzdC5zeW0gY29u
ZnRlc3QuZmlsZQotCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0
IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hl
Y2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2J6Ml9CWjJfYnpEZWNvbXByZXNzSW5pdCIgPiY1Cisk
YXNfZWNobyAiJGFjX2N2X2xpYl9iejJfQloyX2J6RGVjb21wcmVzc0luaXQiID4mNjsgfQoraWYg
dGVzdCAieCRhY19jdl9saWJfYnoyX0JaMl9iekRlY29tcHJlc3NJbml0IiA9IHgiInllczsgdGhl
biA6CisgIHpsaWI9IiR6bGliIC1ESEFWRV9CWkxJQiAtbGJ6MiIKIGZpCi17ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfbHN0YXRfZGVy
ZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluayIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2Z1bmNfbHN0
YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluayIgPiY2OyB9Ci0KLXRlc3QgJGFjX2N2X2Z1
bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluayA9IHllcyAmJgogCi1jYXQgPj5j
b25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIExTVEFUX0ZPTExPV1NfU0xBU0hFRF9TWU1MSU5L
IDEKLV9BQ0VPRgogCitmaQogCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVu
Y2VzX3NsYXNoZWRfc3ltbGluayIgPSB4bm87IHRoZW4KLSAgY2FzZSAiICRMSUJPQkpTICIgaW4K
LSAgKiIgbHN0YXQuJGFjX29iamV4dCAiKiApIDs7Ci0gICopIExJQk9CSlM9IiRMSUJPQkpTIGxz
dGF0LiRhY19vYmpleHQiCi0gOzsKLWVzYWMKIAotZmkKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21v
bmdyZWwgIiRMSU5FTk8iICJsem1hLmgiICJhY19jdl9oZWFkZXJfbHptYV9oIiAiJGFjX2luY2x1
ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9sem1hX2giID0geCIieWVzOyB0
aGVuIDoKIAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2lu
ZyB3aGV0aGVyIHN5cy90eXBlcy5oIGRlZmluZXMgbWFrZWRldiIgPiY1Ci0kYXNfZWNob19uICJj
aGVja2luZyB3aGV0aGVyIHN5cy90eXBlcy5oIGRlZmluZXMgbWFrZWRldi4uLiAiID4mNjsgfQot
aWYgdGVzdCAiJHthY19jdl9oZWFkZXJfc3lzX3R5cGVzX2hfbWFrZWRlditzZXR9IiA9IHNldDsg
dGhlbiA6Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5n
IGZvciBsem1hX3N0cmVhbV9kZWNvZGVyIGluIC1sbHptYSIgPiY1CiskYXNfZWNob19uICJjaGVj
a2luZyBmb3IgbHptYV9zdHJlYW1fZGVjb2RlciBpbiAtbGx6bWEuLi4gIiA+JjY7IH0KK2lmIHRl
c3QgIiR7YWNfY3ZfbGliX2x6bWFfbHptYV9zdHJlYW1fZGVjb2RlcitzZXR9IiA9IHNldDsgdGhl
biA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGNhdCBjb25mZGVmcy5o
IC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0k
TElCUworTElCUz0iLWxsem1hICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNv
bmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlw
ZXMuaD4KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQg
YW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJu
IHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlw
ZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIK
KyNlbmRpZgorY2hhciBsem1hX3N0cmVhbV9kZWNvZGVyICgpOwogaW50CiBtYWluICgpCiB7Ci1y
ZXR1cm4gbWFrZWRldigwLCAwKTsKK3JldHVybiBsem1hX3N0cmVhbV9kZWNvZGVyICgpOwogICA7
CiAgIHJldHVybiAwOwogfQogX0FDRU9GCiBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsg
dGhlbiA6Ci0gIGFjX2N2X2hlYWRlcl9zeXNfdHlwZXNfaF9tYWtlZGV2PXllcworICBhY19jdl9s
aWJfbHptYV9sem1hX3N0cmVhbV9kZWNvZGVyPXllcwogZWxzZQotICBhY19jdl9oZWFkZXJfc3lz
X3R5cGVzX2hfbWFrZWRldj1ubworICBhY19jdl9saWJfbHptYV9sem1hX3N0cmVhbV9kZWNvZGVy
PW5vCiBmaQogcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAg
ICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotZmkKLXsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N5c190
eXBlc19oX21ha2VkZXYiID4mNQotJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3lzX3R5cGVzX2hf
bWFrZWRldiIgPiY2OyB9Ci0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zeXNfdHlwZXNfaF9tYWtl
ZGV2ID0gbm87IHRoZW4KLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJz
eXMvbWtkZXYuaCIgImFjX2N2X2hlYWRlcl9zeXNfbWtkZXZfaCIgIiRhY19pbmNsdWRlc19kZWZh
dWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfc3lzX21rZGV2X2giID0geCIieWVzOyB0aGVu
IDoKLQotJGFzX2VjaG8gIiNkZWZpbmUgTUFKT1JfSU5fTUtERVYgMSIgPj5jb25mZGVmcy5oCi0K
K0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCi0KLQotCi0gIGlmIHRlc3QgJGFjX2N2
X2hlYWRlcl9zeXNfbWtkZXZfaCA9IG5vOyB0aGVuCi0gICAgYWNfZm5fY19jaGVja19oZWFkZXJf
bW9uZ3JlbCAiJExJTkVOTyIgInN5cy9zeXNtYWNyb3MuaCIgImFjX2N2X2hlYWRlcl9zeXNfc3lz
bWFjcm9zX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVy
X3N5c19zeXNtYWNyb3NfaCIgPSB4IiJ5ZXM7IHRoZW4gOgotCi0kYXNfZWNobyAiI2RlZmluZSBN
QUpPUl9JTl9TWVNNQUNST1MgMSIgPj5jb25mZGVmcy5oCi0KK3sgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2x6bWFfbHptYV9zdHJlYW1f
ZGVjb2RlciIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9sem1hX2x6bWFfc3RyZWFtX2RlY29k
ZXIiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfbHptYV9sem1hX3N0cmVhbV9kZWNvZGVy
IiA9IHgiInllczsgdGhlbiA6CisgIHpsaWI9IiR6bGliIC1ESEFWRV9MWk1BIC1sbHptYSIKIGZp
CiAKIAotICBmaQogZmkKIAotZm9yIGFjX2hlYWRlciBpbiBzdGRsaWIuaAotZG8gOgotICBhY19m
bl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAic3RkbGliLmgiICJhY19jdl9oZWFk
ZXJfc3RkbGliX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVh
ZGVyX3N0ZGxpYl9oIiA9IHgiInllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNF
T0YKLSNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi1fQUNFT0YKLQotZmkKIAotZG9uZQorYWNfZm5f
Y19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImx6by9sem8xeC5oIiAiYWNfY3ZfaGVh
ZGVyX2x6b19sem8xeF9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2
X2hlYWRlcl9sem9fbHpvMXhfaCIgPSB4IiJ5ZXM7IHRoZW4gOgogCi17ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBHTlUgbGliYyBjb21wYXRpYmxl
IG1hbGxvYyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgR05VIGxpYmMgY29tcGF0aWJs
ZSBtYWxsb2MuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfZnVuY19tYWxsb2NfMF9ub25u
dWxsK3NldH0iID0gc2V0OyB0aGVuIDoKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogY2hlY2tpbmcgZm9yIGx6bzF4X2RlY29tcHJlc3MgaW4gLWxsem8yIiA+JjUKKyRh
c19lY2hvX24gImNoZWNraW5nIGZvciBsem8xeF9kZWNvbXByZXNzIGluIC1sbHpvMi4uLiAiID4m
NjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfbHpvMl9sem8xeF9kZWNvbXByZXNzK3NldH0iID0g
c2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgaWYgdGVz
dCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICBhY19jdl9mdW5jX21hbGxvY18w
X25vbm51bGw9bm8KLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3Qu
JGFjX2V4dAorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGx6bzIgICRM
SUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5k
IGNvbmZkZWZzLmguICAqLwotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgSEFW
RV9TVERMSUJfSAotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi1jaGFyICptYWxsb2MgKCk7
Ci0jZW5kaWYKIAorLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZv
aWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0
dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3Rv
dHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAi
QyIKKyNlbmRpZgorY2hhciBsem8xeF9kZWNvbXByZXNzICgpOwogaW50CiBtYWluICgpCiB7Ci1y
ZXR1cm4gISBtYWxsb2MgKDApOworcmV0dXJuIGx6bzF4X2RlY29tcHJlc3MgKCk7CiAgIDsKICAg
cmV0dXJuIDA7CiB9CiBfQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4g
OgotICBhY19jdl9mdW5jX21hbGxvY18wX25vbm51bGw9eWVzCitpZiBhY19mbl9jX3RyeV9saW5r
ICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9sem8yX2x6bzF4X2RlY29tcHJlc3M9eWVz
CiBlbHNlCi0gIGFjX2N2X2Z1bmNfbWFsbG9jXzBfbm9ubnVsbD1ubworICBhY19jdl9saWJfbHpv
Ml9sem8xeF9kZWNvbXByZXNzPW5vCiBmaQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVz
dC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNf
b2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVz
dC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0
ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCi0KK3sgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2x6bzJf
bHpvMXhfZGVjb21wcmVzcyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9sem8yX2x6bzF4X2Rl
Y29tcHJlc3MiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfbHpvMl9sem8xeF9kZWNvbXBy
ZXNzIiA9IHgiInllczsgdGhlbiA6CisgIHpsaWI9IiR6bGliIC1ESEFWRV9MWk8xWCAtbGx6bzIi
CiBmaQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRh
Y19jdl9mdW5jX21hbGxvY18wX25vbm51bGwiID4mNQotJGFzX2VjaG8gIiRhY19jdl9mdW5jX21h
bGxvY18wX25vbm51bGwiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfZnVuY19tYWxsb2NfMF9ub25u
dWxsID0geWVzOyB0aGVuIDoKLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9NQUxMT0MgMSIgPj5j
b25mZGVmcy5oCi0KLWVsc2UKLSAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9NQUxMT0MgMCIgPj5j
b25mZGVmcy5oCi0KLSAgIGNhc2UgIiAkTElCT0JKUyAiIGluCi0gICoiIG1hbGxvYy4kYWNfb2Jq
ZXh0ICIqICkgOzsKLSAgKikgTElCT0JKUz0iJExJQk9CSlMgbWFsbG9jLiRhY19vYmpleHQiCi0g
OzsKLWVzYWMKLQogCi0kYXNfZWNobyAiI2RlZmluZSBtYWxsb2MgcnBsX21hbGxvYyIgPj5jb25m
ZGVmcy5oCiAKIGZpCiAKIAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiBjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNs
dWRlZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3Rp
bWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9o
ZWFkZXJfdGltZStzZXR9IiA9IHNldDsgdGhlbiA6CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGlvX3NldHVwIGluIC1sYWlvIiA+JjUKKyRh
c19lY2hvX24gImNoZWNraW5nIGZvciBpb19zZXR1cCBpbiAtbGFpby4uLiAiID4mNjsgfQoraWYg
dGVzdCAiJHthY19jdl9saWJfYWlvX2lvX3NldHVwK3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFz
X2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VP
RiA+Y29uZnRlc3QuJGFjX2V4dAorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJT
PSItbGFpbyAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNf
ZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5j
bHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+CiAKKy8qIE92ZXJyaWRlIGFueSBH
Q0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVj
YXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGlu
IGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwor
I2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgaW9fc2V0dXAgKCk7
CiBpbnQKIG1haW4gKCkKIHsKLWlmICgoc3RydWN0IHRtICopIDApCi1yZXR1cm4gMDsKK3JldHVy
biBpb19zZXR1cCAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KIF9BQ0VPRgotaWYgYWNfZm5fY190
cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9oZWFkZXJfdGltZT15ZXMKK2lm
IGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2Fpb19pb19z
ZXR1cD15ZXMKIGVsc2UKLSAgYWNfY3ZfaGVhZGVyX3RpbWU9bm8KLWZpCi1ybSAtZiBjb3JlIGNv
bmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRl
cl90aW1lIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX3RpbWUiID4mNjsgfQotaWYgdGVz
dCAkYWNfY3ZfaGVhZGVyX3RpbWUgPSB5ZXM7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgVElN
RV9XSVRIX1NZU19USU1FIDEiID4+Y29uZmRlZnMuaAotCisgIGFjX2N2X2xpYl9haW9faW9fc2V0
dXA9bm8KIGZpCi0KLQotCi0KLSAgZm9yIGFjX2hlYWRlciBpbiAkYWNfaGVhZGVyX2xpc3QKLWRv
IDoKLSAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwg
JGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIiRhY19o
ZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSIKLWlmIGV2YWwg
dGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKLSAgY2F0ID4+Y29u
ZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAk
YXNfdHJfY3BwYCAxCi1fQUNFT0YKLQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3Qu
JGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJ
QlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCi0KLWRvbmUKLQotCi0KLQotCi0KLQotCi0g
IGZvciBhY19mdW5jIGluICRhY19mdW5jX2xpc3QKLWRvIDoKLSAgYXNfYWNfdmFyPWAkYXNfZWNo
byAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi1hY19mbl9jX2NoZWNrX2Z1bmMg
IiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCi1pZiBldmFsIHRlc3QgXCJ4XCQiJGFz
X2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YK
LSNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VP
RgotCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFj
X2N2X2xpYl9haW9faW9fc2V0dXAiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfYWlvX2lvX3Nl
dHVwIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX2Fpb19pb19zZXR1cCIgPSB4IiJ5ZXM7
IHRoZW4gOgorICBzeXN0ZW1fYWlvPSJ5IgorZWxzZQorICBzeXN0ZW1fYWlvPSJuIgogZmkKLWRv
bmUKLQogCiAKLQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNo
ZWNraW5nIGZvciB3b3JraW5nIG1rdGltZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Ig
d29ya2luZyBta3RpbWUuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfZnVuY193b3JraW5n
X21rdGltZStzZXR9IiA9IHNldDsgdGhlbiA6Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IGNoZWNraW5nIGZvciBNRDUgaW4gLWxjcnlwdG8iID4mNQorJGFzX2VjaG9f
biAiY2hlY2tpbmcgZm9yIE1ENSBpbiAtbGNyeXB0by4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHth
Y19jdl9saWJfY3J5cHRvX01ENStzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihj
YWNoZWQpICIgPiY2CiBlbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0
aGVuIDoKLSAgYWNfY3ZfZnVuY193b3JraW5nX21rdGltZT1ubwotZWxzZQotICBjYXQgY29uZmRl
ZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJ
QlM9JExJQlMKK0xJQlM9Ii1sY3J5cHRvICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNF
T0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIFRlc3QgcHJv
Z3JhbSBmcm9tIFBhdWwgRWdnZXJ0IGFuZCBUb255IExlbmVpcy4gICovCi0jaWZkZWYgVElNRV9X
SVRIX1NZU19USU1FCi0jIGluY2x1ZGUgPHN5cy90aW1lLmg+Ci0jIGluY2x1ZGUgPHRpbWUuaD4K
LSNlbHNlCi0jIGlmZGVmIEhBVkVfU1lTX1RJTUVfSAotIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4K
LSMgZWxzZQotIyAgaW5jbHVkZSA8dGltZS5oPgotIyBlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRl
IDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KIAotI2lmZGVmIEhBVkVfVU5JU1REX0gK
LSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0FMQVJNCi0jIGRl
ZmluZSBhbGFybShYKSAvKiBlbXB0eSAqLworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBw
cm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdo
dCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRz
IGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1
c3BsdXMKK2V4dGVybiAiQyIKICNlbmRpZgotCi0vKiBXb3JrIGFyb3VuZCByZWRlZmluaXRpb24g
dG8gcnBsX3B1dGVudiBieSBvdGhlciBjb25maWcgdGVzdHMuICAqLwotI3VuZGVmIHB1dGVudgot
Ci1zdGF0aWMgdGltZV90IHRpbWVfdF9tYXg7Ci1zdGF0aWMgdGltZV90IHRpbWVfdF9taW47Ci0K
LS8qIFZhbHVlcyB3ZSdsbCB1c2UgdG8gc2V0IHRoZSBUWiBlbnZpcm9ubWVudCB2YXJpYWJsZS4g
ICovCi1zdGF0aWMgY29uc3QgY2hhciAqdHpfc3RyaW5nc1tdID0gewotICAoY29uc3QgY2hhciAq
KSAwLCAiVFo9R01UMCIsICJUWj1KU1QtOSIsCi0gICJUWj1FU1QrM0VEVCsyLE0xMC4xLjAvMDA6
MDA6MDAsTTIuMy4wLzAwOjAwOjAwIgotfTsKLSNkZWZpbmUgTl9TVFJJTkdTIChzaXplb2YgKHR6
X3N0cmluZ3MpIC8gc2l6ZW9mICh0el9zdHJpbmdzWzBdKSkKLQotLyogUmV0dXJuIDAgaWYgbWt0
aW1lIGZhaWxzIHRvIGNvbnZlcnQgYSBkYXRlIGluIHRoZSBzcHJpbmctZm9yd2FyZCBnYXAuCi0g
ICBCYXNlZCBvbiBhIHByb2JsZW0gcmVwb3J0IGZyb20gQW5kcmVhcyBKYWVnZXIuICAqLwotc3Rh
dGljIGludAotc3ByaW5nX2ZvcndhcmRfZ2FwICgpCi17Ci0gIC8qIGdsaWJjICh1cCB0byBhYm91
dCAxOTk4LTEwLTA3KSBmYWlsZWQgdGhpcyB0ZXN0LiAqLwotICBzdHJ1Y3QgdG0gdG07Ci0KLSAg
LyogVXNlIHRoZSBwb3J0YWJsZSBQT1NJWC4xIHNwZWNpZmljYXRpb24gIlRaPVBTVDhQRFQsTTQu
MS4wLE0xMC41LjAiCi0gICAgIGluc3RlYWQgb2YgIlRaPUFtZXJpY2EvVmFuY291dmVyIiBpbiBv
cmRlciB0byBkZXRlY3QgdGhlIGJ1ZyBldmVuCi0gICAgIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBz
dXBwb3J0IHRoZSBPbHNvbiBleHRlbnNpb24sIG9yIGRvbid0IGhhdmUgdGhlCi0gICAgIGZ1bGwg
em9uZWluZm8gdGFibGVzIGluc3RhbGxlZC4gICovCi0gIHB1dGVudiAoKGNoYXIqKSAiVFo9UFNU
OFBEVCxNNC4xLjAsTTEwLjUuMCIpOwotCi0gIHRtLnRtX3llYXIgPSA5ODsKLSAgdG0udG1fbW9u
ID0gMzsKLSAgdG0udG1fbWRheSA9IDU7Ci0gIHRtLnRtX2hvdXIgPSAyOwotICB0bS50bV9taW4g
PSAwOwotICB0bS50bV9zZWMgPSAwOwotICB0bS50bV9pc2RzdCA9IC0xOwotICByZXR1cm4gbWt0
aW1lICgmdG0pICE9ICh0aW1lX3QpIC0xOwotfQotCi1zdGF0aWMgaW50Ci1ta3RpbWVfdGVzdDEg
KHRpbWVfdCBub3cpCi17Ci0gIHN0cnVjdCB0bSAqbHQ7Ci0gIHJldHVybiAhIChsdCA9IGxvY2Fs
dGltZSAoJm5vdykpIHx8IG1rdGltZSAobHQpID09IG5vdzsKLX0KLQotc3RhdGljIGludAotbWt0
aW1lX3Rlc3QgKHRpbWVfdCBub3cpCi17Ci0gIHJldHVybiAobWt0aW1lX3Rlc3QxIChub3cpCi0J
ICAmJiBta3RpbWVfdGVzdDEgKCh0aW1lX3QpICh0aW1lX3RfbWF4IC0gbm93KSkKLQkgICYmIG1r
dGltZV90ZXN0MSAoKHRpbWVfdCkgKHRpbWVfdF9taW4gKyBub3cpKSk7Ci19Ci0KLXN0YXRpYyBp
bnQKLWlyaXhfNl80X2J1ZyAoKQotewotICAvKiBCYXNlZCBvbiBjb2RlIGZyb20gQXJpZWwgRmFp
Z29uLiAgKi8KLSAgc3RydWN0IHRtIHRtOwotICB0bS50bV95ZWFyID0gOTY7Ci0gIHRtLnRtX21v
biA9IDM7Ci0gIHRtLnRtX21kYXkgPSAwOwotICB0bS50bV9ob3VyID0gMDsKLSAgdG0udG1fbWlu
ID0gMDsKLSAgdG0udG1fc2VjID0gMDsKLSAgdG0udG1faXNkc3QgPSAtMTsKLSAgbWt0aW1lICgm
dG0pOwotICByZXR1cm4gdG0udG1fbW9uID09IDIgJiYgdG0udG1fbWRheSA9PSAzMTsKLX0KLQot
c3RhdGljIGludAotYmlndGltZV90ZXN0IChpbnQgaikKLXsKLSAgc3RydWN0IHRtIHRtOwotICB0
aW1lX3Qgbm93OwotICB0bS50bV95ZWFyID0gdG0udG1fbW9uID0gdG0udG1fbWRheSA9IHRtLnRt
X2hvdXIgPSB0bS50bV9taW4gPSB0bS50bV9zZWMgPSBqOwotICBub3cgPSBta3RpbWUgKCZ0bSk7
Ci0gIGlmIChub3cgIT0gKHRpbWVfdCkgLTEpCi0gICAgewotICAgICAgc3RydWN0IHRtICpsdCA9
IGxvY2FsdGltZSAoJm5vdyk7Ci0gICAgICBpZiAoISAobHQKLQkgICAgICYmIGx0LT50bV95ZWFy
ID09IHRtLnRtX3llYXIKLQkgICAgICYmIGx0LT50bV9tb24gPT0gdG0udG1fbW9uCi0JICAgICAm
JiBsdC0+dG1fbWRheSA9PSB0bS50bV9tZGF5Ci0JICAgICAmJiBsdC0+dG1faG91ciA9PSB0bS50
bV9ob3VyCi0JICAgICAmJiBsdC0+dG1fbWluID09IHRtLnRtX21pbgotCSAgICAgJiYgbHQtPnRt
X3NlYyA9PSB0bS50bV9zZWMKLQkgICAgICYmIGx0LT50bV95ZGF5ID09IHRtLnRtX3lkYXkKLQkg
ICAgICYmIGx0LT50bV93ZGF5ID09IHRtLnRtX3dkYXkKLQkgICAgICYmICgobHQtPnRtX2lzZHN0
IDwgMCA/IC0xIDogMCA8IGx0LT50bV9pc2RzdCkKLQkJICA9PSAodG0udG1faXNkc3QgPCAwID8g
LTEgOiAwIDwgdG0udG1faXNkc3QpKSkpCi0JcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gMTsK
LX0KLQotc3RhdGljIGludAoteWVhcl8yMDUwX3Rlc3QgKCkKLXsKLSAgLyogVGhlIGNvcnJlY3Qg
YW5zd2VyIGZvciAyMDUwLTAyLTAxIDAwOjAwOjAwIGluIFBhY2lmaWMgdGltZSwKLSAgICAgaWdu
b3JpbmcgbGVhcCBzZWNvbmRzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBpbnQgYW5zd2VyID0gMjUy
NzMxNTIwMFVMOwotCi0gIHN0cnVjdCB0bSB0bTsKLSAgdGltZV90IHQ7Ci0gIHRtLnRtX3llYXIg
PSAyMDUwIC0gMTkwMDsKLSAgdG0udG1fbW9uID0gMiAtIDE7Ci0gIHRtLnRtX21kYXkgPSAxOwot
ICB0bS50bV9ob3VyID0gdG0udG1fbWluID0gdG0udG1fc2VjID0gMDsKLSAgdG0udG1faXNkc3Qg
PSAtMTsKLQotICAvKiBVc2UgdGhlIHBvcnRhYmxlIFBPU0lYLjEgc3BlY2lmaWNhdGlvbiAiVFo9
UFNUOFBEVCxNNC4xLjAsTTEwLjUuMCIKLSAgICAgaW5zdGVhZCBvZiAiVFo9QW1lcmljYS9WYW5j
b3V2ZXIiIGluIG9yZGVyIHRvIGRldGVjdCB0aGUgYnVnIGV2ZW4KLSAgICAgb24gc3lzdGVtcyB0
aGF0IGRvbid0IHN1cHBvcnQgdGhlIE9sc29uIGV4dGVuc2lvbiwgb3IgZG9uJ3QgaGF2ZSB0aGUK
LSAgICAgZnVsbCB6b25laW5mbyB0YWJsZXMgaW5zdGFsbGVkLiAgKi8KLSAgcHV0ZW52ICgoY2hh
ciopICJUWj1QU1Q4UERULE00LjEuMCxNMTAuNS4wIik7Ci0KLSAgdCA9IG1rdGltZSAoJnRtKTsK
LQotICAvKiBDaGVjayB0aGF0IHRoZSByZXN1bHQgaXMgZWl0aGVyIGEgZmFpbHVyZSwgb3IgY2xv
c2UgZW5vdWdoCi0gICAgIHRvIHRoZSBjb3JyZWN0IGFuc3dlciB0aGF0IHdlIGNhbiBhc3N1bWUg
dGhlIGRpc2NyZXBhbmN5IGlzCi0gICAgIGR1ZSB0byBsZWFwIHNlY29uZHMuICAqLwotICByZXR1
cm4gKHQgPT0gKHRpbWVfdCkgLTEKLQkgIHx8ICgwIDwgdCAmJiBhbnN3ZXIgLSAxMjAgPD0gdCAm
JiB0IDw9IGFuc3dlciArIDEyMCkpOwotfQotCitjaGFyIE1ENSAoKTsKIGludAogbWFpbiAoKQog
ewotICB0aW1lX3QgdCwgZGVsdGE7Ci0gIGludCBpLCBqOwotCi0gIC8qIFRoaXMgdGVzdCBtYWtl
cyBzb21lIGJ1Z2d5IG1rdGltZSBpbXBsZW1lbnRhdGlvbnMgbG9vcC4KLSAgICAgR2l2ZSB1cCBh
ZnRlciA2MCBzZWNvbmRzOyBhIG1rdGltZSBzbG93ZXIgdGhhbiB0aGF0Ci0gICAgIGlzbid0IHdv
cnRoIHVzaW5nIGFueXdheS4gICovCi0gIGFsYXJtICg2MCk7Ci0KLSAgZm9yICg7OykKLSAgICB7
Ci0gICAgICB0ID0gKHRpbWVfdF9tYXggPDwgMSkgKyAxOwotICAgICAgaWYgKHQgPD0gdGltZV90
X21heCkKLQlicmVhazsKLSAgICAgIHRpbWVfdF9tYXggPSB0OwotICAgIH0KLSAgdGltZV90X21p
biA9IC0gKCh0aW1lX3QpIH4gKHRpbWVfdCkgMCA9PSAodGltZV90KSAtMSkgLSB0aW1lX3RfbWF4
OwotCi0gIGRlbHRhID0gdGltZV90X21heCAvIDk5NzsgLyogYSBzdWl0YWJsZSBwcmltZSBudW1i
ZXIgKi8KLSAgZm9yIChpID0gMDsgaSA8IE5fU1RSSU5HUzsgaSsrKQotICAgIHsKLSAgICAgIGlm
ICh0el9zdHJpbmdzW2ldKQotCXB1dGVudiAoKGNoYXIqKSB0el9zdHJpbmdzW2ldKTsKLQotICAg
ICAgZm9yICh0ID0gMDsgdCA8PSB0aW1lX3RfbWF4IC0gZGVsdGE7IHQgKz0gZGVsdGEpCi0JaWYg
KCEgbWt0aW1lX3Rlc3QgKHQpKQotCSAgcmV0dXJuIDE7Ci0gICAgICBpZiAoISAobWt0aW1lX3Rl
c3QgKCh0aW1lX3QpIDEpCi0JICAgICAmJiBta3RpbWVfdGVzdCAoKHRpbWVfdCkgKDYwICogNjAp
KQotCSAgICAgJiYgbWt0aW1lX3Rlc3QgKCh0aW1lX3QpICg2MCAqIDYwICogMjQpKSkpCi0JcmV0
dXJuIDE7Ci0KLSAgICAgIGZvciAoaiA9IDE7IDsgaiA8PD0gMSkKLQlpZiAoISBiaWd0aW1lX3Rl
c3QgKGopKQotCSAgcmV0dXJuIDE7Ci0JZWxzZSBpZiAoSU5UX01BWCAvIDIgPCBqKQotCSAgYnJl
YWs7Ci0gICAgICBpZiAoISBiaWd0aW1lX3Rlc3QgKElOVF9NQVgpKQotCXJldHVybiAxOwotICAg
IH0KLSAgcmV0dXJuICEgKGlyaXhfNl80X2J1ZyAoKSAmJiBzcHJpbmdfZm9yd2FyZF9nYXAgKCkg
JiYgeWVhcl8yMDUwX3Rlc3QgKCkpOworcmV0dXJuIE1ENSAoKTsKKyAgOworICByZXR1cm4gMDsK
IH0KIF9BQ0VPRgotaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2
X2Z1bmNfd29ya2luZ19ta3RpbWU9eWVzCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsg
dGhlbiA6CisgIGFjX2N2X2xpYl9jcnlwdG9fTUQ1PXllcwogZWxzZQotICBhY19jdl9mdW5jX3dv
cmtpbmdfbWt0aW1lPW5vCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdt
b24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0
IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQorICBhY19jdl9saWJfY3J5cHRv
X01ENT1ubwogZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVz
dWx0OiAkYWNfY3ZfZnVuY193b3JraW5nX21rdGltZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2Z1
bmNfd29ya2luZ19ta3RpbWUiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfZnVuY193b3JraW5nX21r
dGltZSA9IG5vOyB0aGVuCi0gIGNhc2UgIiAkTElCT0JKUyAiIGluCi0gICoiIG1rdGltZS4kYWNf
b2JqZXh0ICIqICkgOzsKLSAgKikgTElCT0JKUz0iJExJQk9CSlMgbWt0aW1lLiRhY19vYmpleHQi
Ci0gOzsKLWVzYWMKLQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4
dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2No
ZWNrX2xpYl9zYXZlX0xJQlMKIGZpCi0KLQotCi0KLQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdl
c2l6ZQotZG8gOgotICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJnZXRwYWdlc2l6ZSIg
ImFjX2N2X2Z1bmNfZ2V0cGFnZXNpemUiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0cGFnZXNp
emUiID0geCIieWVzOyB0aGVuIDoKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2NyeXB0b19NRDUiID4mNQorJGFzX2VjaG8gIiRhY19j
dl9saWJfY3J5cHRvX01ENSIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9jcnlwdG9fTUQ1
IiA9IHgiInllczsgdGhlbiA6CiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUg
SEFWRV9HRVRQQUdFU0laRSAxCisjZGVmaW5lIEhBVkVfTElCQ1JZUFRPIDEKIF9BQ0VPRgogCisg
IExJQlM9Ii1sY3J5cHRvICRMSUJTIgorCitlbHNlCisgIGFzX2ZuX2Vycm9yICQ/ICJDb3VsZCBu
b3QgZmluZCBsaWJjcnlwdG8iICIkTElORU5PIiA1CiBmaQotZG9uZQogCi17ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4m
NQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcC4uLiAiID4mNjsgfQotaWYg
dGVzdCAiJHthY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkK3NldH0iID0gc2V0OyB0aGVuIDoK
K3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGV4
dDJmc19vcGVuMiBpbiAtbGV4dDJmcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZXh0
MmZzX29wZW4yIGluIC1sZXh0MmZzLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9l
eHQyZnNfZXh0MmZzX29wZW4yK3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNh
Y2hlZCkgIiA+JjYKIGVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRo
ZW4gOgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCBjb25m
ZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKyAgYWNfY2hlY2tfbGliX3NhdmVf
TElCUz0kTElCUworTElCUz0iLWxleHQyZnMgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9B
Q0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1
ZGVzX2RlZmF1bHQKLS8qIG1hbGxvYyBtaWdodCBoYXZlIGJlZW4gcmVuYW1lZCBhcyBycGxfbWFs
bG9jLiAqLwotI3VuZGVmIG1hbGxvYwotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBK
aW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3Nz
aWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQg
YXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBz
b21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNo
YXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQg
Zml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5n
cywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFj
ayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZl
cmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRl
IHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2
IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3Qg
Y29oZXJlbnQgd2l0aCB0aGUgZmlsZSBzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5
IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQot
ICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQg
Y2hhbmdlcyBnZXQKLSAgIHByb3BhZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3Jl
IHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBt
YXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAg
YXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhl
IG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0KLSNp
bmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLSNpZiAhZGVmaW5lZCBT
VERDX0hFQURFUlMgJiYgIWRlZmluZWQgSEFWRV9TVERMSUJfSAotY2hhciAqbWFsbG9jICgpOwot
I2VuZGlmCi0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6
ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBfU0NfUEFHRVNJWkUK
LSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8q
IG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1
ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdl
dHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAq
LwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xT
SVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBl
bmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRl
ZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBu
byBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2Vz
aXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYg
Lyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8g
RVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAg
ZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8q
IG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0K
LSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCiAKKy8qIE92ZXJyaWRlIGFueSBHQ0Mg
aW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVz
ZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFu
ZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lm
ZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZXh0MmZzX29wZW4yICgp
OwogaW50CiBtYWluICgpCiB7Ci0gIGNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotICBjb25z
dCBjaGFyICpjZGF0YTI7Ci0gIGludCBpLCBwYWdlc2l6ZTsKLSAgaW50IGZkLCBmZDI7Ci0KLSAg
cGFnZXNpemUgPSBnZXRwYWdlc2l6ZSAoKTsKLQotICAvKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0
aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuICovCi0gIGRhdGEgPSAoY2hhciAqKSBtYWxsb2Mg
KHBhZ2VzaXplKTsKLSAgaWYgKCFkYXRhKQotICAgIHJldHVybiAxOwotICBmb3IgKGkgPSAwOyBp
IDwgcGFnZXNpemU7ICsraSkKLSAgICAqKGRhdGEgKyBpKSA9IHJhbmQgKCk7Ci0gIHVtYXNrICgw
KTsKLSAgZmQgPSBjcmVhdCAoImNvbmZ0ZXN0Lm1tYXAiLCAwNjAwKTsKLSAgaWYgKGZkIDwgMCkK
LSAgICByZXR1cm4gMjsKLSAgaWYgKHdyaXRlIChmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2Vz
aXplKQotICAgIHJldHVybiAzOwotICBjbG9zZSAoZmQpOwotCi0gIC8qIE5leHQsIGNoZWNrIHRo
YXQgdGhlIHRhaWwgb2YgYSBwYWdlIGlzIHplcm8tZmlsbGVkLiAgRmlsZSBtdXN0IGhhdmUKLSAg
ICAgbm9uLXplcm8gbGVuZ3RoLCBvdGhlcndpc2Ugd2UgcmlzayBTSUdCVVMgZm9yIGVudGlyZSBw
YWdlLiAgKi8KLSAgZmQyID0gb3BlbiAoImNvbmZ0ZXN0LnR4dCIsIE9fUkRXUiB8IE9fQ1JFQVQg
fCBPX1RSVU5DLCAwNjAwKTsKLSAgaWYgKGZkMiA8IDApCi0gICAgcmV0dXJuIDQ7Ci0gIGNkYXRh
MiA9ICIiOwotICBpZiAod3JpdGUgKGZkMiwgY2RhdGEyLCAxKSAhPSAxKQotICAgIHJldHVybiA1
OwotICBkYXRhMiA9IChjaGFyICopIG1tYXAgKDAsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9U
X1dSSVRFLCBNQVBfU0hBUkVELCBmZDIsIDBMKTsKLSAgaWYgKGRhdGEyID09IE1BUF9GQUlMRUQp
Ci0gICAgcmV0dXJuIDY7Ci0gIGZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotICAgIGlm
ICgqKGRhdGEyICsgaSkpCi0gICAgICByZXR1cm4gNzsKLSAgY2xvc2UgKGZkMik7Ci0gIGlmICht
dW5tYXAgKGRhdGEyLCBwYWdlc2l6ZSkpCi0gICAgcmV0dXJuIDg7Ci0KLSAgLyogTmV4dCwgdHJ5
IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoIGFscmVhZHkgaGFzCi0g
ICAgIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwgYWxzbyBtYWtl
IHN1cmUgdGhhdAotICAgICB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4gICovCi0gIGZkID0gb3Bl
biAoImNvbmZ0ZXN0Lm1tYXAiLCBPX1JEV1IpOwotICBpZiAoZmQgPCAwKQotICAgIHJldHVybiA5
OwotICBpZiAoZGF0YTIgIT0gbW1hcCAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9U
X1dSSVRFLAotCQkgICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotICAgIHJl
dHVybiAxMDsKLSAgZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0gICAgaWYgKCooZGF0
YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLSAgICAgIHJldHVybiAxMTsKLQotICAvKiBGaW5hbGx5
LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYSBkbyBub3QKLSAgICAg
cGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuICAoVGhpcyBpcyBh
IGJ1ZyBvbgotICAgICBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikgICovCi0gIGZvciAo
aSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotICAgICooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBp
KSArIDE7Ci0gIGRhdGEzID0gKGNoYXIgKikgbWFsbG9jIChwYWdlc2l6ZSk7Ci0gIGlmICghZGF0
YTMpCi0gICAgcmV0dXJuIDEyOwotICBpZiAocmVhZCAoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0g
cGFnZXNpemUpCi0gICAgcmV0dXJuIDEzOwotICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsr
aSkKLSAgICBpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotICAgICAgcmV0dXJuIDE0
OwotICBjbG9zZSAoZmQpOworcmV0dXJuIGV4dDJmc19vcGVuMiAoKTsKKyAgOwogICByZXR1cm4g
MDsKIH0KIF9BQ0VPRgotaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0gIGFj
X2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElO
RU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9leHQyZnNfZXh0MmZzX29wZW4yPXllcwogZWxzZQot
ICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWYgY29yZSAqLmNvcmUg
Y29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBj
b25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQor
ICBhY19jdl9saWJfZXh0MmZzX2V4dDJmc19vcGVuMj1ubwogZmkKLXsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21h
cHBlZCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiID4mNjsg
fQotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotCi0k
YXNfZWNobyAiI2RlZmluZSBIQVZFX01NQVAgMSIgPj5jb25mZGVmcy5oCi0KK3JtIC1mIGNvcmUg
Y29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4
dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQotcm0g
LWYgY29uZnRlc3QubW1hcCBjb25mdGVzdC50eHQKLQotZm9yIGFjX2hlYWRlciBpbiBzdGRsaWIu
aAotZG8gOgotICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAic3RkbGli
LmgiICJhY19jdl9oZWFkZXJfc3RkbGliX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRl
c3QgIngkYWNfY3ZfaGVhZGVyX3N0ZGxpYl9oIiA9IHgiInllczsgdGhlbiA6Ci0gIGNhdCA+PmNv
bmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi1fQUNFT0YKLQoreyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJf
ZXh0MmZzX2V4dDJmc19vcGVuMiIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9leHQyZnNfZXh0
MmZzX29wZW4yIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX2V4dDJmc19leHQyZnNfb3Bl
bjIiID0geCIieWVzOyB0aGVuIDoKKyAgbGliZXh0MmZzPSJ5IgorZWxzZQorICBsaWJleHQyZnM9
Im4iCiBmaQogCi1kb25lCiAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogY2hlY2tpbmcgZm9yIEdOVSBsaWJjIGNvbXBhdGlibGUgcmVhbGxvYyIgPiY1Ci0kYXNfZWNo
b19uICJjaGVja2luZyBmb3IgR05VIGxpYmMgY29tcGF0aWJsZSByZWFsbG9jLi4uICIgPiY2OyB9
Ci1pZiB0ZXN0ICIke2FjX2N2X2Z1bmNfcmVhbGxvY18wX25vbm51bGwrc2V0fSIgPSBzZXQ7IHRo
ZW4gOgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBm
b3IgZ2NyeV9tZF9oYXNoX2J1ZmZlciBpbiAtbGdjcnlwdCIgPiY1CiskYXNfZWNob19uICJjaGVj
a2luZyBmb3IgZ2NyeV9tZF9oYXNoX2J1ZmZlciBpbiAtbGdjcnlwdC4uLiAiID4mNjsgfQoraWYg
dGVzdCAiJHthY19jdl9saWJfZ2NyeXB0X2djcnlfbWRfaGFzaF9idWZmZXIrc2V0fSIgPSBzZXQ7
IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBpZiB0ZXN0ICIk
Y3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfcmVhbGxvY18wX25v
bm51bGw9bm8KLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFj
X2V4dAorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGdjcnlwdCAgJExJ
QlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQg
Y29uZmRlZnMuaC4gICovCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBIQVZF
X1NURExJQl9ICi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLWNoYXIgKnJlYWxsb2MgKCk7
Ci0jZW5kaWYKIAorLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZv
aWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0
dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3Rv
dHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAi
QyIKKyNlbmRpZgorY2hhciBnY3J5X21kX2hhc2hfYnVmZmVyICgpOwogaW50CiBtYWluICgpCiB7
Ci1yZXR1cm4gISByZWFsbG9jICgwLCAwKTsKK3JldHVybiBnY3J5X21kX2hhc2hfYnVmZmVyICgp
OwogICA7CiAgIHJldHVybiAwOwogfQogX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5F
Tk8iOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19yZWFsbG9jXzBfbm9ubnVsbD15ZXMKK2lmIGFjX2Zu
X2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2djcnlwdF9nY3J5X21k
X2hhc2hfYnVmZmVyPXllcwogZWxzZQotICBhY19jdl9mdW5jX3JlYWxsb2NfMF9ub25udWxsPW5v
CisgIGFjX2N2X2xpYl9nY3J5cHRfZ2NyeV9tZF9oYXNoX2J1ZmZlcj1ubwogZmkKLXJtIC1mIGNv
cmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhl
ZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19l
eHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNv
bmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2
ZV9MSUJTCiBmaQotCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJl
c3VsdDogJGFjX2N2X2xpYl9nY3J5cHRfZ2NyeV9tZF9oYXNoX2J1ZmZlciIgPiY1CiskYXNfZWNo
byAiJGFjX2N2X2xpYl9nY3J5cHRfZ2NyeV9tZF9oYXNoX2J1ZmZlciIgPiY2OyB9CitpZiB0ZXN0
ICJ4JGFjX2N2X2xpYl9nY3J5cHRfZ2NyeV9tZF9oYXNoX2J1ZmZlciIgPSB4IiJ5ZXM7IHRoZW4g
OgorICBsaWJnY3J5cHQ9InkiCitlbHNlCisgIGxpYmdjcnlwdD0ibiIKIGZpCi17ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfcmVhbGxv
Y18wX25vbm51bGwiID4mNQotJGFzX2VjaG8gIiRhY19jdl9mdW5jX3JlYWxsb2NfMF9ub25udWxs
IiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfcmVhbGxvY18wX25vbm51bGwgPSB5ZXM7IHRo
ZW4gOgogCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX1JFQUxMT0MgMSIgPj5jb25mZGVmcy5oCiAK
KworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcg
Zm9yIHB0aHJlYWQgZmxhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgcHRocmVhZCBm
bGFnLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2F4X2N2X3B0aHJlYWRfZmxhZ3Mrc2V0fSIgPSBz
ZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICAkYXNfZWNo
byAiI2RlZmluZSBIQVZFX1JFQUxMT0MgMCIgPj5jb25mZGVmcy5oCiAKLSAgIGNhc2UgIiAkTElC
T0JKUyAiIGluCi0gICoiIHJlYWxsb2MuJGFjX29iamV4dCAiKiApIDs7Ci0gICopIExJQk9CSlM9
IiRMSUJPQkpTIHJlYWxsb2MuJGFjX29iamV4dCIKLSA7OwotZXNhYworICAgICAgICBheF9jdl9w
dGhyZWFkX2ZsYWdzPS1wdGhyZWFkCisKKyAgICBQVEhSRUFEX0NGTEFHUz0iJGF4X2N2X3B0aHJl
YWRfZmxhZ3MiCisgICAgUFRIUkVBRF9MREZMQUdTPSIkYXhfY3ZfcHRocmVhZF9mbGFncyIKKyAg
ICBQVEhSRUFEX0xJQlM9IiIKKworCisgICAgc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgorCisgICAg
c2F2ZWRfTERGTEFHUz0iJExERkxBR1MiCisKKyAgICBzYXZlZF9MSUJTPSIkTElCUyIKKworCisg
ICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKworICAgIExERkxBR1M9IiRMREZM
QUdTICRQVEhSRUFEX0xERkxBR1MiCisKKyAgICBMSUJTPSIkTElCUyAkUFRIUkVBRF9MSUJTIgor
CisgICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8q
IGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KK2ludCBtYWluKHZv
aWQpIHsKKyAgcHRocmVhZF9hdGZvcmsoMCwwLDApOworICBwdGhyZWFkX2NyZWF0ZSgwLDAsMCww
KTsKK30KKworX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisK
K2Vsc2UKKyAgYXhfY3ZfcHRocmVhZF9mbGFncz1mYWlsZWQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0
ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29u
ZnRlc3QuJGFjX2V4dAorCisgICAgQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTIgorCisgICAgTERGTEFH
Uz0iJHNhdmVkX0xERkxBR1MiCiAKKyAgICBMSUJTPSIkc2F2ZWRfTElCUyIKIAotJGFzX2VjaG8g
IiNkZWZpbmUgcmVhbGxvYyBycGxfcmVhbGxvYyIgPj5jb25mZGVmcy5oCiAKIGZpCit7ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGF4X2N2X3B0aHJlYWRf
ZmxhZ3MiID4mNQorJGFzX2VjaG8gIiRheF9jdl9wdGhyZWFkX2ZsYWdzIiA+JjY7IH0KKyAgICBp
ZiB0ZXN0ICJ4JGF4X2N2X3B0aHJlYWRfZmxhZ3MiID0geGZhaWxlZDsgdGhlbgorICAgICAgICBh
c19mbl9lcnJvciAkPyAiLXB0aHJlYWQgZG9lcyBub3Qgd29yayIgIiRMSU5FTk8iIDUKKyAgICBm
aQorCisgICAgUFRIUkVBRF9DRkxBR1M9IiRheF9jdl9wdGhyZWFkX2ZsYWdzIgorICAgIFBUSFJF
QURfTERGTEFHUz0iJGF4X2N2X3B0aHJlYWRfZmxhZ3MiCisgICAgUFRIUkVBRF9MSUJTPSIiCisK
IAogCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZv
ciB3b3JraW5nIHN0cm5sZW4iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcg
c3Rybmxlbi4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cm5sZW5fd29ya2lu
ZytzZXR9IiA9IHNldDsgdGhlbiA6CitBWF9DSEVDS19QVFlGVU5DUworeyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgeWFqbF9hbGxvYyBpbiAtbHlh
amwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHlhamxfYWxsb2MgaW4gLWx5YWpsLi4u
ICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl95YWpsX3lhamxfYWxsb2Mrc2V0fSIgPSBz
ZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBpZiB0ZXN0
ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfc3Rybmxlbl93
b3JraW5nPW5vCi1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRh
Y19leHQKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWx5YWpsICAkTElC
UyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBj
b25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0CisKKy8qIE92ZXJyaWRlIGFueSBH
Q0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVj
YXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGlu
IGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwor
I2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgeWFqbF9hbGxvYyAo
KTsKIGludAogbWFpbiAoKQogewotCi0jZGVmaW5lIFMgImZvb2JhciIKLSNkZWZpbmUgU19MRU4g
KHNpemVvZiBTIC0gMSkKLQotICAvKiBBdCBsZWFzdCBvbmUgaW1wbGVtZW50YXRpb24gaXMgYnVn
Z3k6IHRoYXQgb2YgQUlYIDQuMyB3b3VsZAotICAgICBnaXZlIHN0cm5sZW4gKFMsIDEpID09IDMu
ICAqLwotCi0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgU19MRU4gKyAxOyArK2kpCi0gICAg
ewotICAgICAgaW50IGV4cGVjdGVkID0gaSA8PSBTX0xFTiA/IGkgOiBTX0xFTjsKLSAgICAgIGlm
IChzdHJubGVuIChTLCBpKSAhPSBleHBlY3RlZCkKLQlyZXR1cm4gMTsKLSAgICB9Ci0gIHJldHVy
biAwOwotCityZXR1cm4geWFqbF9hbGxvYyAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KIF9BQ0VP
RgotaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfc3Ry
bmxlbl93b3JraW5nPXllcworaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgor
ICBhY19jdl9saWJfeWFqbF95YWpsX2FsbG9jPXllcwogZWxzZQotICBhY19jdl9mdW5jX3N0cm5s
ZW5fd29ya2luZz1ubworICBhY19jdl9saWJfeWFqbF95YWpsX2FsbG9jPW5vCiBmaQotcm0gLWYg
Y29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19l
eGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFj
X2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAg
Y29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9z
YXZlX0xJQlMKIGZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJl
c3VsdDogJGFjX2N2X2xpYl95YWpsX3lhamxfYWxsb2MiID4mNQorJGFzX2VjaG8gIiRhY19jdl9s
aWJfeWFqbF95YWpsX2FsbG9jIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3lhamxfeWFq
bF9hbGxvYyIgPSB4IiJ5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisj
ZGVmaW5lIEhBVkVfTElCWUFKTCAxCitfQUNFT0YKIAotZmkKLXsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY19zdHJubGVuX3dvcmtpbmci
ID4mNQotJGFzX2VjaG8gIiRhY19jdl9mdW5jX3N0cm5sZW5fd29ya2luZyIgPiY2OyB9Ci10ZXN0
ICRhY19jdl9mdW5jX3N0cm5sZW5fd29ya2luZyA9IG5vICYmIGNhc2UgIiAkTElCT0JKUyAiIGlu
Ci0gICoiIHN0cm5sZW4uJGFjX29iamV4dCAiKiApIDs7Ci0gICopIExJQk9CSlM9IiRMSUJPQkpT
IHN0cm5sZW4uJGFjX29iamV4dCIKLSA7OwotZXNhYworICBMSUJTPSItbHlhamwgJExJQlMiCiAK
K2Vsc2UKKyAgYXNfZm5fZXJyb3IgJD8gIkNvdWxkIG5vdCBmaW5kIHlhamwiICIkTElORU5PIiA1
CitmaQogCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5n
IGZvciB3b3JraW5nIHN0cnRvZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igd29ya2lu
ZyBzdHJ0b2QuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHJ0b2Qrc2V0fSIg
PSBzZXQ7IHRoZW4gOgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBj
aGVja2luZyBmb3IgZGVmbGF0ZUNvcHkgaW4gLWx6IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5n
IGZvciBkZWZsYXRlQ29weSBpbiAtbHouLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGli
X3pfZGVmbGF0ZUNvcHkrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVk
KSAiID4mNgogZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6
Ci0gIGFjX2N2X2Z1bmNfc3RydG9kPW5vCi1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNF
T0YgPmNvbmZ0ZXN0LiRhY19leHQKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElC
Uz0iLWx6ICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19l
eHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSNpZm5k
ZWYgc3RydG9kCi1kb3VibGUgc3RydG9kICgpOworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5h
bCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBt
aWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4g
aXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19j
cGx1c3BsdXMKK2V4dGVybiAiQyIKICNlbmRpZgorY2hhciBkZWZsYXRlQ29weSAoKTsKIGludAot
bWFpbigpCittYWluICgpCiB7Ci0gIHsKLSAgICAvKiBTb21lIHZlcnNpb25zIG9mIExpbnV4IHN0
cnRvZCBtaXMtcGFyc2Ugc3RyaW5ncyB3aXRoIGxlYWRpbmcgJysnLiAgKi8KLSAgICBjaGFyICpz
dHJpbmcgPSAiICs2OSI7Ci0gICAgY2hhciAqdGVybTsKLSAgICBkb3VibGUgdmFsdWU7Ci0gICAg
dmFsdWUgPSBzdHJ0b2QgKHN0cmluZywgJnRlcm0pOwotICAgIGlmICh2YWx1ZSAhPSA2OSB8fCB0
ZXJtICE9IChzdHJpbmcgKyA0KSkKLSAgICAgIHJldHVybiAxOwotICB9Ci0KLSAgewotICAgIC8q
IFVuZGVyIFNvbGFyaXMgMi40LCBzdHJ0b2QgcmV0dXJucyB0aGUgd3JvbmcgdmFsdWUgZm9yIHRo
ZQotICAgICAgIHRlcm1pbmF0aW5nIGNoYXJhY3RlciB1bmRlciBzb21lIGNvbmRpdGlvbnMuICAq
LwotICAgIGNoYXIgKnN0cmluZyA9ICJOYU4iOwotICAgIGNoYXIgKnRlcm07Ci0gICAgc3RydG9k
IChzdHJpbmcsICZ0ZXJtKTsKLSAgICBpZiAodGVybSAhPSBzdHJpbmcgJiYgKih0ZXJtIC0gMSkg
PT0gMCkKLSAgICAgIHJldHVybiAxOwotICB9CityZXR1cm4gZGVmbGF0ZUNvcHkgKCk7CisgIDsK
ICAgcmV0dXJuIDA7CiB9Ci0KIF9BQ0VPRgotaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsg
dGhlbiA6Ci0gIGFjX2N2X2Z1bmNfc3RydG9kPXllcworaWYgYWNfZm5fY190cnlfbGluayAiJExJ
TkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfel9kZWZsYXRlQ29weT15ZXMKIGVsc2UKLSAgYWNf
Y3ZfZnVuY19zdHJ0b2Q9bm8KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0Liog
Z21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpl
eHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CisgIGFjX2N2X2xpYl96X2RlZmxhdGVD
b3B5PW5vCiBmaQotCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0
IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hl
Y2tfbGliX3NhdmVfTElCUwogZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY19zdHJ0b2QiID4mNQotJGFzX2VjaG8gIiRhY19jdl9m
dW5jX3N0cnRvZCIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX3N0cnRvZCA9IG5vOyB0aGVu
Ci0gIGNhc2UgIiAkTElCT0JKUyAiIGluCi0gICoiIHN0cnRvZC4kYWNfb2JqZXh0ICIqICkgOzsK
LSAgKikgTElCT0JKUz0iJExJQk9CSlMgc3RydG9kLiRhY19vYmpleHQiCi0gOzsKLWVzYWMKK3sg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGli
X3pfZGVmbGF0ZUNvcHkiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfel9kZWZsYXRlQ29weSIg
PiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl96X2RlZmxhdGVDb3B5IiA9IHgiInllczsgdGhl
biA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MSUJaIDEKK19B
Q0VPRgogCi1hY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJwb3ciICJhY19jdl9mdW5jX3Bv
dyIKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19wb3ciID0geCIieWVzOyB0aGVuIDoKKyAgTElCUz0i
LWx6ICRMSUJTIgogCitlbHNlCisgIGFzX2ZuX2Vycm9yICQ/ICJDb3VsZCBub3QgZmluZCB6bGli
IiAiJExJTkVOTyIgNQogZmkKIAotaWYgdGVzdCAkYWNfY3ZfZnVuY19wb3cgPSBubzsgdGhlbgot
ICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBw
b3cgaW4gLWxtIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBwb3cgaW4gLWxtLi4uICIg
PiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9tX3BvdytzZXR9IiA9IHNldDsgdGhlbiA6Cit7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsaWJp
Y29udl9vcGVuIGluIC1saWNvbnYiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYmlj
b252X29wZW4gaW4gLWxpY29udi4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfaWNv
bnZfbGliaWNvbnZfb3BlbitzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNo
ZWQpICIgPiY2CiBlbHNlCiAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1s
bSAgJExJQlMiCitMSUJTPSItbGljb252ICAkTElCUyIKIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNF
T0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIApAQCAtOTMxOSw1
NSArNjM0NSw0NSBAQCBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0
CiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIKICNlbmRpZgotY2hhciBwb3cgKCk7Citj
aGFyIGxpYmljb252X29wZW4gKCk7CiBpbnQKIG1haW4gKCkKIHsKLXJldHVybiBwb3cgKCk7City
ZXR1cm4gbGliaWNvbnZfb3BlbiAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KIF9BQ0VPRgogaWYg
YWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfbV9wb3c9eWVz
CisgIGFjX2N2X2xpYl9pY29udl9saWJpY29udl9vcGVuPXllcwogZWxzZQotICBhY19jdl9saWJf
bV9wb3c9bm8KKyAgYWNfY3ZfbGliX2ljb252X2xpYmljb252X29wZW49bm8KIGZpCiBybSAtZiBj
b3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICBjb25mdGVzdCRhY19l
eGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkK
LXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zf
bGliX21fcG93IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX21fcG93IiA+JjY7IH0KLWlmIHRl
c3QgIngkYWNfY3ZfbGliX21fcG93IiA9IHgiInllczsgdGhlbiA6Ci0gIFBPV19MSUI9LWxtCit7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xp
Yl9pY29udl9saWJpY29udl9vcGVuIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2ljb252X2xp
Ymljb252X29wZW4iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfaWNvbnZfbGliaWNvbnZf
b3BlbiIgPSB4IiJ5ZXM7IHRoZW4gOgorICBsaWJpY29udj0ieSIKIGVsc2UKLSAgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYW5ub3QgZmluZCBsaWJy
YXJ5IGNvbnRhaW5pbmcgZGVmaW5pdGlvbiBvZiBwb3ciID4mNQotJGFzX2VjaG8gIiRhc19tZTog
V0FSTklORzogY2Fubm90IGZpbmQgbGlicmFyeSBjb250YWluaW5nIGRlZmluaXRpb24gb2YgcG93
IiA+JjI7fQotZmkKLQorICBsaWJpY29udj0ibiIKIGZpCiAKLWZpCiAKLWZvciBhY19mdW5jIGlu
ICBcCi0gICAgICAgICAgICAgICAgYWxhcm0gYXRleGl0IGJ6ZXJvIGNsb2NrX2dldHRpbWUgZHVw
MiBmZGF0YXN5bmMgZnRydW5jYXRlIFwKLSAgICAgICAgICAgICAgICBnZXRjd2QgZ2V0aG9zdGJ5
bmFtZSBnZXRob3N0bmFtZSBnZXRwYWdlc2l6ZSBnZXR0aW1lb2ZkYXkgXAotICAgICAgICAgICAg
ICAgIGluZXRfbnRvYSBpc2FzY2lpIGxvY2FsdGltZV9yIG1lbWNociBtZW1tb3ZlIG1lbXNldCBt
a2RpciBcCi0gICAgICAgICAgICAgICAgbWtmaWZvIG11bm1hcCBwYXRoY29uZiByZWFscGF0aCBy
ZWdjb21wIHJtZGlyIHNlbGVjdCBzZXRlbnYgXAotICAgICAgICAgICAgICAgIHNvY2tldCBzdHJj
YXNlY21wIHN0cmNociBzdHJjc3BuIHN0cmR1cCBzdHJlcnJvciBzdHJuZHVwIFwKLSAgICAgICAg
ICAgICAgICBzdHJwYnJrIHN0cnJjaHIgc3Ryc3BuIHN0cnN0ciBzdHJ0b2wgc3RydG91bCBzdHJ0
b3VsbCB0enNldCBcCi0gICAgICAgICAgICAgICAgdW5hbWUgXAogCisjIENoZWNrcyBmb3IgaGVh
ZGVyIGZpbGVzLgorZm9yIGFjX2hlYWRlciBpbiB5YWpsL3lhamxfdmVyc2lvbi5oCiBkbyA6Ci0g
IGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAot
YWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgotaWYg
ZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBhY19mbl9j
X2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAieWFqbC95YWpsX3ZlcnNpb24uaCIgImFj
X2N2X2hlYWRlcl95YWpsX3lhamxfdmVyc2lvbl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitp
ZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl95YWpsX3lhamxfdmVyc2lvbl9oIiA9IHgiInllczsgdGhl
biA6CiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYCRhc19lY2hvICJIQVZF
XyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKKyNkZWZpbmUgSEFWRV9ZQUpMX1lBSkxfVkVSU0lP
Tl9IIDEKIF9BQ0VPRgogCiBmaQorCiBkb25lCiAKIApkaWZmIC0tZ2l0IGEvdG9vbHMvY29uZmln
dXJlLmFjIGIvdG9vbHMvY29uZmlndXJlLmFjCmluZGV4IDI1MGRmZmQuLjdmZGUyZmIgMTAwNjQ0
Ci0tLSBhL3Rvb2xzL2NvbmZpZ3VyZS5hYworKysgYi90b29scy9jb25maWd1cmUuYWMKQEAgLTE5
LDkgKzE5LDYgQEAgcmVjb21tZW5kZWQsIHVzZSBQUkVQRU5EX0lOQ0xVREVTLCBQUkVQRU5EX0xJ
QiwgXAogQVBQRU5EX0lOQ0xVREVTIGFuZCBBUFBFTkRfTElCIGluc3RlYWQgd2hlbiBwb3NzaWJs
ZS5dKQogXSkKIAotQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TCi1BQ19DQU5PTklDQUxfSE9TVAot
CiAjIE00IE1hY3JvIGluY2x1ZGVzCiBtNF9pbmNsdWRlKFttNC9zYXZldmFyLm00XSkKIG00X2lu
Y2x1ZGUoW200L2ZlYXR1cmVzLm00XSkKQEAgLTcyLDkgKzY5LDcgQEAgQUNfQVJHX1ZBUihbQkND
XSwgW1BhdGggdG8gYmNjIHRvb2xdKQogQUNfQVJHX1ZBUihbSUFTTF0sIFtQYXRoIHRvIGlhc2wg
dG9vbF0pCiAKICMgQ2hlY2tzIGZvciBwcm9ncmFtcy4KLUFDX1BST0dfU0VECiBBQ19QUk9HX0ND
Ci1BQ19QUk9HX0xOX1MKIEFDX1BST0dfTUFLRV9TRVQKIEFDX1BST0dfSU5TVEFMTAogQVhfUEFU
SF9QUk9HX09SX0ZBSUwoW1BFUkxdLCBbcGVybF0pCkBAIC0xMzIsNyArMTI3LDcgQEAgQUNfU1VC
U1QobGliZXh0MmZzKQogQUNfQ0hFQ0tfTElCKFtnY3J5cHRdLCBbZ2NyeV9tZF9oYXNoX2J1ZmZl
cl0sIFtsaWJnY3J5cHQ9InkiXSwgW2xpYmdjcnlwdD0ibiJdKQogQUNfU1VCU1QobGliZ2NyeXB0
KQogQVhfQ0hFQ0tfUFRIUkVBRAotQUNfQ0hFQ0tfTElCKFtydF0sIFtjbG9ja19nZXR0aW1lXSkK
K0FYX0NIRUNLX1BUWUZVTkNTCiBBQ19DSEVDS19MSUIoW3lhamxdLCBbeWFqbF9hbGxvY10sIFtd
LAogICAgIFtBQ19NU0dfRVJST1IoW0NvdWxkIG5vdCBmaW5kIHlhamxdKV0pCiBBQ19DSEVDS19M
SUIoW3pdLCBbZGVmbGF0ZUNvcHldLCBbXSwgW0FDX01TR19FUlJPUihbQ291bGQgbm90IGZpbmQg
emxpYl0pXSkKQEAgLTE0MCw1OCArMTM1LDYgQEAgQUNfQ0hFQ0tfTElCKFtpY29udl0sIFtsaWJp
Y29udl9vcGVuXSwgW2xpYmljb252PSJ5Il0sIFtsaWJpY29udj0ibiJdKQogQUNfU1VCU1QobGli
aWNvbnYpCiAKICMgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCi1BQ19GVU5DX0FMTE9DQQotQUNf
Q0hFQ0tfSEVBREVSUyhbIFwKLSAgICAgICAgICAgICAgICBhcnBhL2luZXQuaCBmY250bC5oIGlu
dHR5cGVzLmggbGliaW50bC5oIGxpbWl0cy5oIG1hbGxvYy5oIFwKLSAgICAgICAgICAgICAgICBu
ZXRkYi5oIG5ldGluZXQvaW4uaCBzdGRkZWYuaCBzdGRpbnQuaCBzdGRsaWIuaCBzdHJpbmcuaCBc
Ci0gICAgICAgICAgICAgICAgc3RyaW5ncy5oIHN5cy9maWxlLmggc3lzL2lvY3RsLmggc3lzL21v
dW50Lmggc3lzL3BhcmFtLmggXAotICAgICAgICAgICAgICAgIHN5cy9zb2NrZXQuaCBzeXMvc3Rh
dHZmcy5oIHN5cy90aW1lLmggc3lzbG9nLmggdGVybWlvcy5oIFwKLSAgICAgICAgICAgICAgICB1
bmlzdGQuaCB5YWpsL3lhamxfdmVyc2lvbi5oIFwKLSAgICAgICAgICAgICAgICBdKQotCi0jIENo
ZWNrcyBmb3IgdHlwZWRlZnMsIHN0cnVjdHVyZXMsIGFuZCBjb21waWxlciBjaGFyYWN0ZXJpc3Rp
Y3MuCi1BQ19IRUFERVJfU1REQk9PTAotQUNfVFlQRV9VSURfVAotQUNfQ19JTkxJTkUKLUFDX1RZ
UEVfSU5UMTZfVAotQUNfVFlQRV9JTlQzMl9UCi1BQ19UWVBFX0lOVDY0X1QKLUFDX1RZUEVfSU5U
OF9UCi1BQ19UWVBFX01PREVfVAotQUNfVFlQRV9PRkZfVAotQUNfVFlQRV9QSURfVAotQUNfQ19S
RVNUUklDVAotQUNfVFlQRV9TSVpFX1QKLUFDX1RZUEVfU1NJWkVfVAotQUNfQ0hFQ0tfTUVNQkVS
Uyhbc3RydWN0IHN0YXQuc3RfYmxrc2l6ZV0pCi1BQ19TVFJVQ1RfU1RfQkxPQ0tTCi1BQ19DSEVD
S19NRU1CRVJTKFtzdHJ1Y3Qgc3RhdC5zdF9yZGV2XSkKLUFDX1RZUEVfVUlOVDE2X1QKLUFDX1RZ
UEVfVUlOVDMyX1QKLUFDX1RZUEVfVUlOVDY0X1QKLUFDX1RZUEVfVUlOVDhfVAotQUNfQ0hFQ0tf
VFlQRVMoW3B0cmRpZmZfdF0pCi0KLSMgQ2hlY2tzIGZvciBsaWJyYXJ5IGZ1bmN0aW9ucy4KLUFD
X0ZVTkNfRVJST1JfQVRfTElORQotQUNfRlVOQ19GT1JLCi1BQ19GVU5DX0ZTRUVLTwotQUNfRlVO
Q19MU1RBVF9GT0xMT1dTX1NMQVNIRURfU1lNTElOSwotQUNfSEVBREVSX01BSk9SCi1BQ19GVU5D
X01BTExPQwotQUNfRlVOQ19NS1RJTUUKLUFDX0ZVTkNfTU1BUAotQUNfRlVOQ19SRUFMTE9DCi1B
Q19GVU5DX1NUUk5MRU4KLUFDX0ZVTkNfU1RSVE9ECi1BQ19DSEVDS19GVU5DUyhbIFwKLSAgICAg
ICAgICAgICAgICBhbGFybSBhdGV4aXQgYnplcm8gY2xvY2tfZ2V0dGltZSBkdXAyIGZkYXRhc3lu
YyBmdHJ1bmNhdGUgXAotICAgICAgICAgICAgICAgIGdldGN3ZCBnZXRob3N0YnluYW1lIGdldGhv
c3RuYW1lIGdldHBhZ2VzaXplIGdldHRpbWVvZmRheSBcCi0gICAgICAgICAgICAgICAgaW5ldF9u
dG9hIGlzYXNjaWkgbG9jYWx0aW1lX3IgbWVtY2hyIG1lbW1vdmUgbWVtc2V0IG1rZGlyIFwKLSAg
ICAgICAgICAgICAgICBta2ZpZm8gbXVubWFwIHBhdGhjb25mIHJlYWxwYXRoIHJlZ2NvbXAgcm1k
aXIgc2VsZWN0IHNldGVudiBcCi0gICAgICAgICAgICAgICAgc29ja2V0IHN0cmNhc2VjbXAgc3Ry
Y2hyIHN0cmNzcG4gc3RyZHVwIHN0cmVycm9yIHN0cm5kdXAgXAotICAgICAgICAgICAgICAgIHN0
cnBicmsgc3RycmNociBzdHJzcG4gc3Ryc3RyIHN0cnRvbCBzdHJ0b3VsIHN0cnRvdWxsIHR6c2V0
IFwKLSAgICAgICAgICAgICAgICB1bmFtZSBcCi0gICAgICAgICAgICAgICAgXSkKK0FDX0NIRUNL
X0hFQURFUlMoW3lhamwveWFqbF92ZXJzaW9uLmhdKQogCiBBQ19PVVRQVVQoKQotLSAKMS43LjIu
NQoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1k
ZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbi5vcmcKaHR0cDovL2xpc3RzLnhl
bi5vcmcveGVuLWRldmVsCg==

From xen-users-bounces@lists.xen.org Wed Apr 25 14:37:57 2012
Return-path: <xen-users-bounces@lists.xen.org>
Envelope-to: archives@lists.xen.org
Delivery-date: Wed, 25 Apr 2012 14:37:57 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-users-bounces@lists.xen.org>)
	id 1SN3L1-0005qQ-4G; Wed, 25 Apr 2012 14:36:59 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <alan.mckay@gmail.com>) id 1SN3Ky-0005qL-0B
	for xen-users@lists.xen.org; Wed, 25 Apr 2012 14:36:56 +0000
Received: from [85.158.143.99:17024] by server-3.bemta-4.messagelabs.com id
	8E/AD-05853-70C089F4; Wed, 25 Apr 2012 14:36:55 +0000
X-Env-Sender: alan.mckay@gmail.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1335364607!18856851!1
X-Originating-IP: [74.125.82.51]
X-SpamReason: No, hits=1.2 required=7.0 tests=HTML_20_30,HTML_MESSAGE,
	ML_RADAR_SPEW_LINKS_14,RCVD_BY_IP,spamassassin: 
X-StarScan-Version: 6.5.7; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1332 invoked from network); 25 Apr 2012 14:36:48 -0000
Received: from mail-wg0-f51.google.com (HELO mail-wg0-f51.google.com)
	(74.125.82.51)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	25 Apr 2012 14:36:48 -0000
Received: by wgbed3 with SMTP id ed3so119318wgb.32
	for <xen-users@lists.xen.org>; Wed, 25 Apr 2012 07:36:46 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:content-type;
	bh=gx1TtvefCSc1DdzOvrkd4x6TD2V7PZQMrzQhfbLIA/M=;
	b=UEFQdDLng0SN4x43qHEr6p1dBf2C4sJEU+1XRJCfsFjhWMsGXmBF/OlOxlfbKKwIvI
	EYAkVvo+EYWlav4szxRaLXOrDRHG+6Q0GlVc7fx+NNqJXHRsOjRqAEXz9zGRn4LR2H8h
	t+j+JAeZKxguIoW33kcJ6qul3kJJSjCI0z64++MjuxEe44/Axp5CorQJFm+Y40I2m6TW
	fVV8eYrFR5bwgk+hkjOn+BJHazT0VvgOQHuCuq2DFf4ELEWDzGR8TvuzqfpRqW7YweIX
	wLAlBAXpGAzJvIKg4OD0iYv92Gs0DWjGiHbFx93fj99C1HRBE4gkwzKpOP9Y+NegTJOO
	tLQA==
MIME-Version: 1.0
Received: by 10.216.139.67 with SMTP id b45mr2076980wej.0.1335364606221; Wed,
	25 Apr 2012 07:36:46 -0700 (PDT)
Received: by 10.223.88.130 with HTTP; Wed, 25 Apr 2012 07:36:46 -0700 (PDT)
In-Reply-To: <4F97F916.70405@internetx.com>
References: <CAH8ZPGm16afMrdSALdQmiyAxO0NBpZ2J8O4wJ5m=g5CYU_PfEQ@mail.gmail.com>
	<4F97F916.70405@internetx.com>
Date: Wed, 25 Apr 2012 10:36:46 -0400
X-Google-Sender-Auth: N5dCQcGgG-UcwP2F9jIuj_83ygk
Message-ID: <CAH8ZPG=6DkLPB-UaYNxD+Vti=pPWs+324gabDjPKRw7PQkAXjg@mail.gmail.com>
From: Alan McKay <alan.mckay+xen@gmail.com>
To: xen-users@lists.xen.org
Subject: Re: [Xen-users] latest 4.1.2 RPMs for RHEL 5.8?
X-BeenThere: xen-users@lists.xen.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen user discussion <xen-users.lists.xen.org>
List-Unsubscribe: <http://lists.xen.org/cgi-bin/mailman/options/xen-users>,
	<mailto:xen-users-request@lists.xen.org?subject=unsubscribe>
List-Post: <mailto:xen-users@lists.xen.org>
List-Help: <mailto:xen-users-request@lists.xen.org?subject=help>
List-Subscribe: <http://lists.xen.org/cgi-bin/mailman/listinfo/xen-users>,
	<mailto:xen-users-request@lists.xen.org?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============6370594813485616582=="
Sender: xen-users-bounces@lists.xen.org
Errors-To: xen-users-bounces@lists.xen.org

--===============6370594813485616582==
Content-Type: multipart/alternative; boundary=0016e6d58f00ffdfa104be81ccd5

--0016e6d58f00ffdfa104be81ccd5
Content-Type: text/plain; charset=ISO-8859-1

On Wed, Apr 25, 2012 at 9:16 AM, Juergen Gotteswinter <jg@internetx.de>wrote:

>
> http://www.gitco.de/repo/


OK, I pulled down those as well as the libvrit RPMs but now I'm not sure
how to go about updating them.

I just try putting them all into the current directory and then :

yum -y update *.rpm

And yum chugs away and looks like it is going to work but then spews out a
bunch of dependency problems

Can someone point me at the right way to do this?

[root@solexa1 xen]# yum -y update *.rpm
Loaded plugins: downloadonly, rhnplugin, security
Skipping security plugin, no data
Setting up Update Process
Examining libvirt-0.9.4-1.x86_64.rpm: libvirt-0.9.4-1.x86_64
Marking libvirt-0.9.4-1.x86_64.rpm as an update to
libvirt-0.8.2-25.el5.x86_64
Marking libvirt-0.9.4-1.x86_64.rpm as an update to libvirt-0.8.2-25.el5.i386
Examining libvirt-python-0.9.4-1.x86_64.rpm: libvirt-python-0.9.4-1.x86_64
Marking libvirt-python-0.9.4-1.x86_64.rpm as an update to
libvirt-python-0.8.2-25.el5.x86_64
Examining xen-4.1.2-1.el5.x86_64.rpm: xen-4.1.2-1.el5.x86_64
Marking xen-4.1.2-1.el5.x86_64.rpm as an update to
xen-3.0.3-135.el5_8.2.x86_64
Examining xen-devel-4.1.2-1.el5.x86_64.rpm: xen-devel-4.1.2-1.el5.x86_64
Package xen-devel not installed, cannot update it. Run yum install to
install it instead.
Examining xen-libs-4.1.2-1.el5.x86_64.rpm: xen-libs-4.1.2-1.el5.x86_64
Marking xen-libs-4.1.2-1.el5.x86_64.rpm as an update to
xen-libs-3.0.3-135.el5_8.2.x86_64
Marking xen-libs-4.1.2-1.el5.x86_64.rpm as an update to
xen-libs-3.0.3-135.el5_8.2.i386
Resolving Dependencies
Skipping security plugin, no data
--> Running transaction check
--> Processing Dependency: libvirt.so.0()(64bit) for package: libvirt
--> Processing Dependency: libvirt.so.0()(64bit) for package:
gnome-applet-vm
--> Processing Dependency: libvirt.so.0()(64bit) for package: xenwatch
--> Processing Dependency: libvirt.so.0()(64bit) for package: libvirt-python
--> Processing Dependency: libvirt.so.0()(64bit) for package: virt-viewer
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) for package:
virt-viewer
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) for package:
virt-viewer
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.1)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.1)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.4)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.4)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.5)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.5)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.9)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.9)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.2.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.2.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.2.1)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.2.1)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.2.3)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.2.3)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.3.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.3.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.3.2)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.3.2)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.3.3)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.3.3)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.4.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.4.1)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.4.1)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.4.2)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.4.5)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.4.5)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.5.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.5.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.1)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.1)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.3)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.3)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.4)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.4)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.1)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.1)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.2)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.2)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.3)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.3)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.5)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.5)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.7)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.7)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.1)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.1)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.2)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.2)(64bit) for package:
libvirt-python
---> Package libvirt.x86_64 0:0.9.4-1 set to be updated
--> Processing Dependency: libvirt-client = 0.9.4-1 for package: libvirt
--> Processing Dependency: /usr/bin/qemu-img for package: libvirt
--> Processing Dependency: libvirt-qemu.so.0(LIBVIRT_QEMU_0.8.3)(64bit) for
package: libvirt
--> Processing Dependency: libvirt-qemu.so.0(LIBVIRT_QEMU_0.9.4)(64bit) for
package: libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.5)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.6)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.8)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.2)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.3)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.4)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_PRIVATE_0.9.4)(64bit) for
package: libvirt
--> Processing Dependency: lzop for package: libvirt
--> Processing Dependency: radvd for package: libvirt
--> Processing Dependency: libssh2.so.1()(64bit) for package: libvirt
--> Processing Dependency: libvirt-qemu.so.0()(64bit) for package: libvirt
---> Package libvirt-python.x86_64 0:0.9.4-1 set to be updated
--> Processing Dependency: libvirt-client = 0.9.4-1 for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.5)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.6)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.8)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.2)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.3)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.4)(64bit) for package:
libvirt-python
---> Package xen.x86_64 0:4.1.2-1.el5 set to be updated
---> Package xen-libs.x86_64 0:4.1.2-1.el5 set to be updated
--> Running transaction check
---> Package libssh2.x86_64 0:0.18-10.el5 set to be updated
--> Processing Dependency: libvirt.so.0()(64bit) for package: libvirt
--> Processing Dependency: libvirt.so.0()(64bit) for package:
gnome-applet-vm
--> Processing Dependency: libvirt.so.0()(64bit) for package: xenwatch
--> Processing Dependency: libvirt.so.0()(64bit) for package: libvirt-python
--> Processing Dependency: libvirt.so.0()(64bit) for package: virt-viewer
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) for package:
virt-viewer
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) for package:
virt-viewer
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.1)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.1)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.4)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.4)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.5)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.5)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.9)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.9)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.2.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.2.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.2.1)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.2.1)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.2.3)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.2.3)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.3.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.3.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.3.2)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.3.2)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.3.3)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.3.3)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.4.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.4.1)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.4.1)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.4.2)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.4.5)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.4.5)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.5.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.5.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.1)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.1)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.3)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.3)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.4)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.4)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.1)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.1)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.2)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.2)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.3)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.3)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.5)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.5)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.7)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.7)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.1)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.1)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.2)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.2)(64bit) for package:
libvirt-python
---> Package libvirt.x86_64 0:0.9.4-1 set to be updated
--> Processing Dependency: libvirt-client = 0.9.4-1 for package: libvirt
--> Processing Dependency: libvirt-qemu.so.0(LIBVIRT_QEMU_0.8.3)(64bit) for
package: libvirt
--> Processing Dependency: libvirt-qemu.so.0(LIBVIRT_QEMU_0.9.4)(64bit) for
package: libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.5)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.6)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.8)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.2)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.3)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.4)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_PRIVATE_0.9.4)(64bit) for
package: libvirt
--> Processing Dependency: libvirt-qemu.so.0()(64bit) for package: libvirt
---> Package libvirt-python.x86_64 0:0.9.4-1 set to be updated
--> Processing Dependency: libvirt-client = 0.9.4-1 for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.5)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.6)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.8)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.2)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.3)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.4)(64bit) for package:
libvirt-python
---> Package lzop.x86_64 0:1.03-2.el5 set to be updated
--> Processing Dependency: liblzo2.so.2()(64bit) for package: lzop
---> Package qemu-img.x86_64 2:0.10.5-1.el5.2 set to be updated
---> Package radvd.x86_64 0:0.9.1-4 set to be updated
--> Running transaction check
--> Processing Dependency: libvirt.so.0()(64bit) for package: libvirt
--> Processing Dependency: libvirt.so.0()(64bit) for package:
gnome-applet-vm
--> Processing Dependency: libvirt.so.0()(64bit) for package: xenwatch
--> Processing Dependency: libvirt.so.0()(64bit) for package: libvirt-python
--> Processing Dependency: libvirt.so.0()(64bit) for package: virt-viewer
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) for package:
virt-viewer
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) for package:
virt-viewer
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.1)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.1)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.4)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.4)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.5)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.5)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.9)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.1.9)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.2.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.2.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.2.1)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.2.1)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.2.3)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.2.3)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.3.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.3.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.3.2)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.3.2)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.3.3)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.3.3)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.4.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.4.1)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.4.1)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.4.2)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.4.5)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.4.5)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.5.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.5.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.1)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.1)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.3)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.3)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.4)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.6.4)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.1)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.1)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.2)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.2)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.3)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.3)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.5)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.5)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.7)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.7.7)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.1)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.1)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.2)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.2)(64bit) for package:
libvirt-python
---> Package libvirt.x86_64 0:0.9.4-1 set to be updated
--> Processing Dependency: libvirt-client = 0.9.4-1 for package: libvirt
--> Processing Dependency: libvirt-qemu.so.0(LIBVIRT_QEMU_0.8.3)(64bit) for
package: libvirt
--> Processing Dependency: libvirt-qemu.so.0(LIBVIRT_QEMU_0.9.4)(64bit) for
package: libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.5)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.6)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.8)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.0)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.2)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.3)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.4)(64bit) for package:
libvirt
--> Processing Dependency: libvirt.so.0(LIBVIRT_PRIVATE_0.9.4)(64bit) for
package: libvirt
--> Processing Dependency: libvirt-qemu.so.0()(64bit) for package: libvirt
---> Package libvirt-python.x86_64 0:0.9.4-1 set to be updated
--> Processing Dependency: libvirt-client = 0.9.4-1 for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.5)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.6)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.8.8)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.0)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.2)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.3)(64bit) for package:
libvirt-python
--> Processing Dependency: libvirt.so.0(LIBVIRT_0.9.4)(64bit) for package:
libvirt-python
---> Package lzo.x86_64 0:2.02-2.el5.1 set to be updated
--> Finished Dependency Resolution
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.4.1)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.8.8)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.8.1)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.2.1)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.3.3)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.1.1)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.7.7)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.7.3)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.4.2)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt-client = 0.9.4-1 is needed by package
libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
gnome-applet-vm-0.1.2-1.el5.x86_64 from installed has depsolving problems
  --> Missing Dependency: libvirt.so.0()(64bit) is needed by package
gnome-applet-vm-0.1.2-1.el5.x86_64 (installed)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.7.0)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.1.9)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.8.8)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.9.4)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.4.5)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
virt-viewer-0.0.2-3.el5.x86_64 from installed has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) is needed by
package virt-viewer-0.0.2-3.el5.x86_64 (installed)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.1.1)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.1.5)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.9.2)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.3.0)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.7.2)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0()(64bit) is needed by package
libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.8.5)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.9.4)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0()(64bit) is needed by package
libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.6.4)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.8.1)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.8.0)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.8.2)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.7.5)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_PRIVATE_0.9.4)(64bit) is
needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.9.3)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.7.1)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.2.0)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.4.1)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.4.0)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.6.3)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.3.3)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.6.3)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.1.4)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.1.5)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.9.2)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.3.2)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.7.2)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.3.2)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.1.9)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.6.0)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.6.1)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.6.4)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.8.5)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.6.1)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt-qemu.so.0(LIBVIRT_QEMU_0.8.3)(64bit) is
needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.5.0)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
virt-viewer-0.0.2-3.el5.x86_64 from installed has depsolving problems
  --> Missing Dependency: libvirt.so.0()(64bit) is needed by package
virt-viewer-0.0.2-3.el5.x86_64 (installed)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt-qemu.so.0(LIBVIRT_QEMU_0.9.4)(64bit) is
needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.7.7)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt-qemu.so.0()(64bit) is needed by package
libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
xenwatch-0.5.3-3.el5.x86_64 from installed has depsolving problems
  --> Missing Dependency: libvirt.so.0()(64bit) is needed by package
xenwatch-0.5.3-3.el5.x86_64 (installed)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.8.6)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
virt-viewer-0.0.2-3.el5.x86_64 from installed has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) is needed by
package virt-viewer-0.0.2-3.el5.x86_64 (installed)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.1.4)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.3.0)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.9.3)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.2.1)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.7.0)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.7.3)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.7.1)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.2.3)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.8.0)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.1.0)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt-client = 0.9.4-1 is needed by package
libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.8.2)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.9.0)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.4.5)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.2.0)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.5.0)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.7.5)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.2.3)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.9.0)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.8.6)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
libvirt-python-0.9.4-1.x86_64 from /libvirt-python-0.9.4-1.x86_64 has
depsolving problems
  --> Missing Dependency: libvirt.so.0(LIBVIRT_0.1.0)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.6.3)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.4.2)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.6.4)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.6.3)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.1.4)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.2.1)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.3.0)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.5.0)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.4.0)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.8.0)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt-client = 0.9.4-1 is needed by package
libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.3.2)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.1.4)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.8.8)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.3.3)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0()(64bit) is needed by package
libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.1.1)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0()(64bit) is needed by package
virt-viewer-0.0.2-3.el5.x86_64 (installed)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.2.3)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.2.0)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0()(64bit) is needed by package
xenwatch-0.5.3-3.el5.x86_64 (installed)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.7.1)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.1.9)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.1.1)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.1.5)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.9.0)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.4.1)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.7.0)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.4.5)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt-client = 0.9.4-1 is needed by package
libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.7.2)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.8.6)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) is needed by
package virt-viewer-0.0.2-3.el5.x86_64 (installed)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_PRIVATE_0.9.4)(64bit) is
needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.9.4)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.7.1)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.7.5)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.9.4)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.6.1)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.8.8)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.8.1)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.8.1)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) is needed by
package virt-viewer-0.0.2-3.el5.x86_64 (installed)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.1.9)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.2.1)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.9.3)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.7.7)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.7.7)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.2.3)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.1.5)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.4.5)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.8.2)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.7.0)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.7.5)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.6.4)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0()(64bit) is needed by package
gnome-applet-vm-0.1.2-1.el5.x86_64 (installed)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.8.2)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt-qemu.so.0(LIBVIRT_QEMU_0.9.4)(64bit) is
needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.8.5)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.9.3)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0()(64bit) is needed by package
libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.7.3)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.1.0)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.9.2)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.7.2)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.2.0)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.8.6)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.4.1)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.7.3)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.3.0)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.5.0)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt-qemu.so.0(LIBVIRT_QEMU_0.8.3)(64bit) is
needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.3.2)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.6.0)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.1.0)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.8.0)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.8.5)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt-qemu.so.0()(64bit) is needed by package
libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.6.1)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.9.2)(64bit) is needed by
package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.3.3)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
Error: Missing Dependency: libvirt.so.0(LIBVIRT_0.9.0)(64bit) is needed by
package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)
 You could try using --skip-broken to work around the problem
 You could try running: package-cleanup --problems
                        package-cleanup --dupes
                        rpm -Va --nofiles --nodigest
The program package-cleanup is found in the yum-utils package.

--0016e6d58f00ffdfa104be81ccd5
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<div class=3D"gmail_extra"><br><br><div class=3D"gmail_quote">On Wed, Apr 2=
5, 2012 at 9:16 AM, Juergen Gotteswinter <span dir=3D"ltr">&lt;<a href=3D"m=
ailto:jg@internetx.de" target=3D"_blank">jg@internetx.de</a>&gt;</span> wro=
te:<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex"><br>
<a href=3D"http://www.gitco.de/repo/" target=3D"_blank">http://www.gitco.de=
/repo/</a></blockquote></div><br></div><div class=3D"gmail_extra">OK, I pul=
led down those as well as the libvrit RPMs but now I&#39;m not sure how to =
go about updating them.</div>
<div class=3D"gmail_extra"><br></div><div class=3D"gmail_extra">I just try =
putting them all into the current directory and then :</div><div class=3D"g=
mail_extra"><br></div><div class=3D"gmail_extra">yum -y update *.rpm</div><=
div class=3D"gmail_extra">
<br></div><div class=3D"gmail_extra">And yum chugs away and looks like it i=
s going to work but then spews out a bunch of dependency problems</div><div=
 class=3D"gmail_extra"><br></div><div class=3D"gmail_extra">Can someone poi=
nt me at the right way to do this?</div>
<div class=3D"gmail_extra"><br></div><div class=3D"gmail_extra"><div class=
=3D"gmail_extra">[root@solexa1 xen]# yum -y update *.rpm</div><div class=3D=
"gmail_extra">Loaded plugins: downloadonly, rhnplugin, security</div><div c=
lass=3D"gmail_extra">
Skipping security plugin, no data</div><div class=3D"gmail_extra">Setting u=
p Update Process</div><div class=3D"gmail_extra">Examining libvirt-0.9.4-1.=
x86_64.rpm: libvirt-0.9.4-1.x86_64</div><div class=3D"gmail_extra">Marking =
libvirt-0.9.4-1.x86_64.rpm as an update to libvirt-0.8.2-25.el5.x86_64</div=
>
<div class=3D"gmail_extra">Marking libvirt-0.9.4-1.x86_64.rpm as an update =
to libvirt-0.8.2-25.el5.i386</div><div class=3D"gmail_extra">Examining libv=
irt-python-0.9.4-1.x86_64.rpm: libvirt-python-0.9.4-1.x86_64</div><div clas=
s=3D"gmail_extra">
Marking libvirt-python-0.9.4-1.x86_64.rpm as an update to libvirt-python-0.=
8.2-25.el5.x86_64</div><div class=3D"gmail_extra">Examining xen-4.1.2-1.el5=
.x86_64.rpm: xen-4.1.2-1.el5.x86_64</div><div class=3D"gmail_extra">Marking=
 xen-4.1.2-1.el5.x86_64.rpm as an update to xen-3.0.3-135.el5_8.2.x86_64</d=
iv>
<div class=3D"gmail_extra">Examining xen-devel-4.1.2-1.el5.x86_64.rpm: xen-=
devel-4.1.2-1.el5.x86_64</div><div class=3D"gmail_extra">Package xen-devel =
not installed, cannot update it. Run yum install to install it instead.</di=
v>
<div class=3D"gmail_extra">Examining xen-libs-4.1.2-1.el5.x86_64.rpm: xen-l=
ibs-4.1.2-1.el5.x86_64</div><div class=3D"gmail_extra">Marking xen-libs-4.1=
.2-1.el5.x86_64.rpm as an update to xen-libs-3.0.3-135.el5_8.2.x86_64</div>
<div class=3D"gmail_extra">Marking xen-libs-4.1.2-1.el5.x86_64.rpm as an up=
date to xen-libs-3.0.3-135.el5_8.2.i386</div><div class=3D"gmail_extra">Res=
olving Dependencies</div><div class=3D"gmail_extra">Skipping security plugi=
n, no data</div>
<div class=3D"gmail_extra">--&gt; Running transaction check</div><div class=
=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0()(64bit) for pa=
ckage: libvirt</div><div class=3D"gmail_extra">--&gt; Processing Dependency=
: libvirt.so.0()(64bit) for package: gnome-applet-vm</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0()(64b=
it) for package: xenwatch</div><div class=3D"gmail_extra">--&gt; Processing=
 Dependency: libvirt.so.0()(64bit) for package: libvirt-python</div><div cl=
ass=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0()(64bit) for package: virt-viewe=
r</div><div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.=
0(LIBVIRT_0.0.3)(64bit) for package: libvirt</div><div class=3D"gmail_extra=
">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.0.3)(64bit) for package: virt-viewer</div><div =
class=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) for packag=
e: libvirt</div><div class=3D"gmail_extra">--&gt; Processing Dependency: li=
bvirt.so.0(LIBVIRT_0.0.5)(64bit) for package: libvirt-python</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) for packag=
e: virt-viewer</div><div class=3D"gmail_extra">--&gt; Processing Dependency=
: libvirt.so.0(LIBVIRT_0.1.0)(64bit) for package: libvirt</div><div class=
=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.1.0)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.1.1)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.1.1)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.1.4)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.1.4)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.1.5)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.1.5)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.1.9)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.1.9)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.2.0)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.2.0)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.2.1)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.2.1)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.2.3)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.2.3)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.3.0)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.3.0)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.3.2)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.3.2)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.3.3)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.3.3)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.4.0)(64bit) for package: libvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.4.1)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.4.1)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.4.2)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.4.5)(64bit) for package: li=
bvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.4.5)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.5.0)(64bit) for pack=
age: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.5.0)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.6.0)(64bit) for pack=
age: libvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.6.1)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.6.1)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.6.3)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.6.3)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.6.4)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.6.4)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.7.0)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.7.0)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.7.1)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.7.1)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.7.2)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.7.2)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.7.3)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.7.3)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.7.5)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.7.5)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.7.7)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.7.7)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.8.0)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.8.0)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.8.1)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.8.1)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.8.2)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.8.2)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">---&gt; Package libvirt.x86_64 0:0.9.4-1 set to =
be updated</div><div class=3D"gmail_extra">--&gt; Processing Dependency: li=
bvirt-client =3D 0.9.4-1 for package: libvirt</div><div class=3D"gmail_extr=
a">--&gt; Processing Dependency: /usr/bin/qemu-img for package: libvirt</di=
v>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt-qemu.so.0(=
LIBVIRT_QEMU_0.8.3)(64bit) for package: libvirt</div><div class=3D"gmail_ex=
tra">--&gt; Processing Dependency: libvirt-qemu.so.0(LIBVIRT_QEMU_0.9.4)(64=
bit) for package: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.8.5)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.8.6)(64bit) for package: li=
bvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.8.8)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.9.0)(64bit) for package: li=
bvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.9.2)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.9.3)(64bit) for package: li=
bvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.9.4)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_PRIVATE_0.9.4)(64bit) for pac=
kage: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: lzop for package: =
libvirt</div><div class=3D"gmail_extra">--&gt; Processing Dependency: radvd=
 for package: libvirt</div><div class=3D"gmail_extra">--&gt; Processing Dep=
endency: libssh2.so.1()(64bit) for package: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt-qemu.so.0(=
)(64bit) for package: libvirt</div><div class=3D"gmail_extra">---&gt; Packa=
ge libvirt-python.x86_64 0:0.9.4-1 set to be updated</div><div class=3D"gma=
il_extra">
--&gt; Processing Dependency: libvirt-client =3D 0.9.4-1 for package: libvi=
rt-python</div><div class=3D"gmail_extra">--&gt; Processing Dependency: lib=
virt.so.0(LIBVIRT_0.8.5)(64bit) for package: libvirt-python</div><div class=
=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.8.6)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.8.8)(64bit) for package: libvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.9.0)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.9.2)(64bit) for pack=
age: libvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.9.3)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.9.4)(64bit) for pack=
age: libvirt-python</div>
<div class=3D"gmail_extra">---&gt; Package xen.x86_64 0:4.1.2-1.el5 set to =
be updated</div><div class=3D"gmail_extra">---&gt; Package xen-libs.x86_64 =
0:4.1.2-1.el5 set to be updated</div><div class=3D"gmail_extra">--&gt; Runn=
ing transaction check</div>
<div class=3D"gmail_extra">---&gt; Package libssh2.x86_64 0:0.18-10.el5 set=
 to be updated</div><div class=3D"gmail_extra">--&gt; Processing Dependency=
: libvirt.so.0()(64bit) for package: libvirt</div><div class=3D"gmail_extra=
">
--&gt; Processing Dependency: libvirt.so.0()(64bit) for package: gnome-appl=
et-vm</div><div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt=
.so.0()(64bit) for package: xenwatch</div><div class=3D"gmail_extra">--&gt;=
 Processing Dependency: libvirt.so.0()(64bit) for package: libvirt-python</=
div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0()(64b=
it) for package: virt-viewer</div><div class=3D"gmail_extra">--&gt; Process=
ing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) for package: libvirt</di=
v>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.0.3)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) for pack=
age: virt-viewer</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.0.5)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.0.5)(64bit) for package: virt-viewer</div><div class=3D"gmail_extra">-=
-&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.1.0)(64bit) for package=
: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.1.0)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.1.1)(64bit) for pack=
age: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.1.1)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.1.4)(64bit) for pack=
age: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.1.4)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.1.5)(64bit) for pack=
age: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.1.5)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.1.9)(64bit) for pack=
age: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.1.9)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.2.0)(64bit) for pack=
age: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.2.0)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.2.1)(64bit) for pack=
age: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.2.1)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.2.3)(64bit) for pack=
age: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.2.3)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.3.0)(64bit) for pack=
age: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.3.0)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.3.2)(64bit) for pack=
age: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.3.2)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.3.3)(64bit) for pack=
age: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.3.3)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.4.0)(64bit) for pack=
age: libvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.4.1)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.4.1)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.4.2)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.4.5)(64bit) for package: li=
bvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.4.5)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.5.0)(64bit) for pack=
age: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.5.0)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.6.0)(64bit) for pack=
age: libvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.6.1)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.6.1)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.6.3)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.6.3)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.6.4)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.6.4)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.7.0)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.7.0)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.7.1)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.7.1)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.7.2)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.7.2)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.7.3)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.7.3)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.7.5)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.7.5)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.7.7)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.7.7)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.8.0)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.8.0)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.8.1)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.8.1)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.8.2)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.8.2)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">---&gt; Package libvirt.x86_64 0:0.9.4-1 set to =
be updated</div><div class=3D"gmail_extra">--&gt; Processing Dependency: li=
bvirt-client =3D 0.9.4-1 for package: libvirt</div><div class=3D"gmail_extr=
a">--&gt; Processing Dependency: libvirt-qemu.so.0(LIBVIRT_QEMU_0.8.3)(64bi=
t) for package: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt-qemu.so.0(=
LIBVIRT_QEMU_0.9.4)(64bit) for package: libvirt</div><div class=3D"gmail_ex=
tra">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.8.5)(64bit) for p=
ackage: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.8.6)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.8.8)(64bit) for package: li=
bvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.9.0)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.9.2)(64bit) for package: li=
bvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.9.3)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.9.4)(64bit) for package: li=
bvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_PRIVATE_0.9.4)(64bit) for package: libvirt</div><div class=3D"gmail_extr=
a">--&gt; Processing Dependency: libvirt-qemu.so.0()(64bit) for package: li=
bvirt</div>
<div class=3D"gmail_extra">---&gt; Package libvirt-python.x86_64 0:0.9.4-1 =
set to be updated</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt-client =3D 0.9.4-1 for package: libvirt-python</div><div class=
=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.8.5)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.8.6)(64bit) for package: libvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.8.8)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.9.0)(64bit) for pack=
age: libvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.9.2)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.9.3)(64bit) for pack=
age: libvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.9.4)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">---&gt; Package lzop.x86_64 0:1.03-2.el5 set to be updated</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: liblzo2.so.2()(64bit) for package: lzop</div>=
<div class=3D"gmail_extra">---&gt; Package qemu-img.x86_64 2:0.10.5-1.el5.2=
 set to be updated</div><div class=3D"gmail_extra">---&gt; Package radvd.x8=
6_64 0:0.9.1-4 set to be updated</div>
<div class=3D"gmail_extra">--&gt; Running transaction check</div><div class=
=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0()(64bit) for pa=
ckage: libvirt</div><div class=3D"gmail_extra">--&gt; Processing Dependency=
: libvirt.so.0()(64bit) for package: gnome-applet-vm</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0()(64b=
it) for package: xenwatch</div><div class=3D"gmail_extra">--&gt; Processing=
 Dependency: libvirt.so.0()(64bit) for package: libvirt-python</div><div cl=
ass=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0()(64bit) for package: virt-viewe=
r</div><div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.=
0(LIBVIRT_0.0.3)(64bit) for package: libvirt</div><div class=3D"gmail_extra=
">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.0.3)(64bit) for package: virt-viewer</div><div =
class=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) for packag=
e: libvirt</div><div class=3D"gmail_extra">--&gt; Processing Dependency: li=
bvirt.so.0(LIBVIRT_0.0.5)(64bit) for package: libvirt-python</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) for packag=
e: virt-viewer</div><div class=3D"gmail_extra">--&gt; Processing Dependency=
: libvirt.so.0(LIBVIRT_0.1.0)(64bit) for package: libvirt</div><div class=
=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.1.0)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.1.1)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.1.1)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.1.4)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.1.4)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.1.5)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.1.5)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.1.9)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.1.9)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.2.0)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.2.0)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.2.1)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.2.1)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.2.3)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.2.3)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.3.0)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.3.0)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.3.2)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.3.2)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.3.3)(64bit) for package: libvirt</div><div clas=
s=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.3.3)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.4.0)(64bit) for package: libvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.4.1)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.4.1)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.4.2)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.4.5)(64bit) for package: li=
bvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.4.5)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.5.0)(64bit) for pack=
age: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.5.0)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.6.0)(64bit) for pack=
age: libvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.6.1)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.6.1)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.6.3)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.6.3)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.6.4)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.6.4)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.7.0)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.7.0)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.7.1)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.7.1)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.7.2)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.7.2)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.7.3)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.7.3)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.7.5)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.7.5)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.7.7)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.7.7)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.8.0)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.8.0)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.8.1)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.8.1)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.8.2)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.8.2)(64bit) for package: li=
bvirt-python</div>
<div class=3D"gmail_extra">---&gt; Package libvirt.x86_64 0:0.9.4-1 set to =
be updated</div><div class=3D"gmail_extra">--&gt; Processing Dependency: li=
bvirt-client =3D 0.9.4-1 for package: libvirt</div><div class=3D"gmail_extr=
a">--&gt; Processing Dependency: libvirt-qemu.so.0(LIBVIRT_QEMU_0.8.3)(64bi=
t) for package: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt-qemu.so.0(=
LIBVIRT_QEMU_0.9.4)(64bit) for package: libvirt</div><div class=3D"gmail_ex=
tra">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.8.5)(64bit) for p=
ackage: libvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.8.6)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.8.8)(64bit) for package: li=
bvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.9.0)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.9.2)(64bit) for package: li=
bvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.9.3)(64bit) for package: libvirt</div><div class=3D"gmail_extra">--&gt=
; Processing Dependency: libvirt.so.0(LIBVIRT_0.9.4)(64bit) for package: li=
bvirt</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_PRIVATE_0.9.4)(64bit) for package: libvirt</div><div class=3D"gmail_extr=
a">--&gt; Processing Dependency: libvirt-qemu.so.0()(64bit) for package: li=
bvirt</div>
<div class=3D"gmail_extra">---&gt; Package libvirt-python.x86_64 0:0.9.4-1 =
set to be updated</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt-client =3D 0.9.4-1 for package: libvirt-python</div><div class=
=3D"gmail_extra">
--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.8.5)(64bit) for packag=
e: libvirt-python</div><div class=3D"gmail_extra">--&gt; Processing Depende=
ncy: libvirt.so.0(LIBVIRT_0.8.6)(64bit) for package: libvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.8.8)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.9.0)(64bit) for pack=
age: libvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.9.2)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">--&gt; Processing Dependency: libvirt.so.0(LIBVIRT_0.9.3)(64bit) for pack=
age: libvirt-python</div>
<div class=3D"gmail_extra">--&gt; Processing Dependency: libvirt.so.0(LIBVI=
RT_0.9.4)(64bit) for package: libvirt-python</div><div class=3D"gmail_extra=
">---&gt; Package lzo.x86_64 0:2.02-2.el5.1 set to be updated</div><div cla=
ss=3D"gmail_extra">
--&gt; Finished Dependency Resolution</div><div class=3D"gmail_extra">libvi=
rt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86_64 has depsolving problems</div=
><div class=3D"gmail_extra">=A0 --&gt; Missing Dependency: libvirt.so.0(LIB=
VIRT_0.4.1)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.=
9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.8.8)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.8.1)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.2.1)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.3.3)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.1.1)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.7.7)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.7.3)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.4.2)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt-client =3D 0.9.4-1 is needed by package libvirt-0.9=
.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">gnome-applet-vm-0.1.2-1.el5.x86_64 from installe=
d has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Missin=
g Dependency: libvirt.so.0()(64bit) is needed by package gnome-applet-vm-0.=
1.2-1.el5.x86_64 (installed)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.7.0)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.1.9)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.8.8)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.9.4)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.4.5)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">virt-viewer-0.0.2-3.el5.x86_64 from installed ha=
s depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Missing De=
pendency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) is needed by package virt-view=
er-0.0.2-3.el5.x86_64 (installed)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.1.1)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.1.5)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.9.2)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.3.0)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.7.2)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0()(64bit) is needed by package l=
ibvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.8.5)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.9.4)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0()(64bit) is needed by package libvirt-0.9.4-1.=
x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.6.4)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.8.1)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.8.0)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.8.2)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.7.5)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_PRIVATE_0.9.4)(64bit) is needed by pac=
kage libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.9.3)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.7.1)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.2.0)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.4.1)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.4.0)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.6.3)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.3.3)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.6.3)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.1.4)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.1.5)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.9.2)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.3.2)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.7.2)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.3.2)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.1.9)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.6.0)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.6.1)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.6.4)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.8.5)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.6.1)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt-qemu.so.0(LIBVIRT_QEMU_0.8.3)(64bit) is needed by p=
ackage libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.5.0)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">virt-viewer-0.0.2-3.el5.x86_64 from installed ha=
s depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Missing De=
pendency: libvirt.so.0()(64bit) is needed by package virt-viewer-0.0.2-3.el=
5.x86_64 (installed)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt-qemu.so.0(LIBVIRT_QEMU_0.9.4)(64bit) is needed by p=
ackage libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.7.7)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt-qemu.so.0()(64bit) is needed by package libvirt-0.9=
.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">xenwatch-0.5.3-3.el5.x86_64 from installed has d=
epsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Missing Depen=
dency: libvirt.so.0()(64bit) is needed by package xenwatch-0.5.3-3.el5.x86_=
64 (installed)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.8.6)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">virt-viewer-0.0.2-3.el5.x86_64 from installed ha=
s depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Missing De=
pendency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) is needed by package virt-view=
er-0.0.2-3.el5.x86_64 (installed)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.1.4)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.3.0)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.9.3)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.2.1)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.7.0)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.7.3)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.7.1)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.2.3)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.8.0)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.1.0)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt-client =3D 0.9.4-1 is needed by pack=
age libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.8.2)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.9.0)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.4.5)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.2.0)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.5.0)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-0.9.4-1.x86_64 from /libvirt-0.9.4-1.x86=
_64 has depsolving problems</div><div class=3D"gmail_extra">=A0 --&gt; Miss=
ing Dependency: libvirt.so.0(LIBVIRT_0.7.5)(64bit) is needed by package lib=
virt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.2.3)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.9.0)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.8.6)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">libvirt-python-0.9.4-1.x86_64 from /libvirt-pyth=
on-0.9.4-1.x86_64 has depsolving problems</div><div class=3D"gmail_extra">=
=A0 --&gt; Missing Dependency: libvirt.so.0(LIBVIRT_0.1.0)(64bit) is needed=
 by package libvirt-python-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)<=
/div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.6.3)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
.so.0(LIBVIRT_0.4.2)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/l=
ibvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.6.4)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
.so.0(LIBVIRT_0.6.3)(64bit) is needed by package libvirt-python-0.9.4-1.x86=
_64 (/libvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.1.4)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt-=
python-0.9.4-1.x86_64)</div><div class=3D"gmail_extra">Error: Missing Depen=
dency: libvirt.so.0(LIBVIRT_0.2.1)(64bit) is needed by package libvirt-0.9.=
4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.3.0)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt-=
python-0.9.4-1.x86_64)</div><div class=3D"gmail_extra">Error: Missing Depen=
dency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) is needed by package libvirt-0.9.=
4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.5.0)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt-=
python-0.9.4-1.x86_64)</div><div class=3D"gmail_extra">Error: Missing Depen=
dency: libvirt.so.0(LIBVIRT_0.4.0)(64bit) is needed by package libvirt-pyth=
on-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.8.0)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt-=
python-0.9.4-1.x86_64)</div><div class=3D"gmail_extra">Error: Missing Depen=
dency: libvirt.so.0(LIBVIRT_0.0.5)(64bit) is needed by package libvirt-pyth=
on-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt-client =3D 0.=
9.4-1 is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)=
</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LI=
BVIRT_0.3.2)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/li=
bvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.1.4)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
.so.0(LIBVIRT_0.8.8)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/l=
ibvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.3.3)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
.so.0()(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt=
-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.1.1)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
.so.0()(64bit) is needed by package virt-viewer-0.0.2-3.el5.x86_64 (install=
ed)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.2.3)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt-=
python-0.9.4-1.x86_64)</div><div class=3D"gmail_extra">Error: Missing Depen=
dency: libvirt.so.0(LIBVIRT_0.0.3)(64bit) is needed by package libvirt-pyth=
on-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.2.0)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt-=
python-0.9.4-1.x86_64)</div><div class=3D"gmail_extra">Error: Missing Depen=
dency: libvirt.so.0()(64bit) is needed by package xenwatch-0.5.3-3.el5.x86_=
64 (installed)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.7.1)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
.so.0(LIBVIRT_0.1.9)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/l=
ibvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.1.1)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt-=
python-0.9.4-1.x86_64)</div><div class=3D"gmail_extra">Error: Missing Depen=
dency: libvirt.so.0(LIBVIRT_0.1.5)(64bit) is needed by package libvirt-pyth=
on-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.9.0)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
.so.0(LIBVIRT_0.0.3)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/l=
ibvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.4.1)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
.so.0(LIBVIRT_0.7.0)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/l=
ibvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.4.5)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt-=
python-0.9.4-1.x86_64)</div><div class=3D"gmail_extra">Error: Missing Depen=
dency: libvirt-client =3D 0.9.4-1 is needed by package libvirt-python-0.9.4=
-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.7.2)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
.so.0(LIBVIRT_0.8.6)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/l=
ibvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.0.5)(64bit) is needed by package virt-viewer-0.0.2-3.el5.x86_64 (installe=
d)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(=
LIBVIRT_PRIVATE_0.9.4)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (=
/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.9.4)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt-=
python-0.9.4-1.x86_64)</div><div class=3D"gmail_extra">Error: Missing Depen=
dency: libvirt.so.0(LIBVIRT_0.7.1)(64bit) is needed by package libvirt-pyth=
on-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.7.5)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
.so.0(LIBVIRT_0.9.4)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/l=
ibvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.6.1)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
.so.0(LIBVIRT_0.8.8)(64bit) is needed by package libvirt-python-0.9.4-1.x86=
_64 (/libvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.8.1)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
.so.0(LIBVIRT_0.8.1)(64bit) is needed by package libvirt-python-0.9.4-1.x86=
_64 (/libvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.0.3)(64bit) is needed by package virt-viewer-0.0.2-3.el5.x86_64 (installe=
d)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(=
LIBVIRT_0.1.9)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/=
libvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.2.1)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt-=
python-0.9.4-1.x86_64)</div><div class=3D"gmail_extra">Error: Missing Depen=
dency: libvirt.so.0(LIBVIRT_0.9.3)(64bit) is needed by package libvirt-0.9.=
4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.7.7)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
.so.0(LIBVIRT_0.7.7)(64bit) is needed by package libvirt-python-0.9.4-1.x86=
_64 (/libvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.2.3)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
.so.0(LIBVIRT_0.1.5)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/l=
ibvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.4.5)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
.so.0(LIBVIRT_0.8.2)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/l=
ibvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.7.0)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt-=
python-0.9.4-1.x86_64)</div><div class=3D"gmail_extra">Error: Missing Depen=
dency: libvirt.so.0(LIBVIRT_0.7.5)(64bit) is needed by package libvirt-pyth=
on-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.6.4)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt-=
python-0.9.4-1.x86_64)</div><div class=3D"gmail_extra">Error: Missing Depen=
dency: libvirt.so.0()(64bit) is needed by package gnome-applet-vm-0.1.2-1.e=
l5.x86_64 (installed)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.8.2)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt-=
python-0.9.4-1.x86_64)</div><div class=3D"gmail_extra">Error: Missing Depen=
dency: libvirt-qemu.so.0(LIBVIRT_QEMU_0.9.4)(64bit) is needed by package li=
bvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.8.5)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
.so.0(LIBVIRT_0.9.3)(64bit) is needed by package libvirt-python-0.9.4-1.x86=
_64 (/libvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0()(64bit)=
 is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div=
><div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT=
_0.7.3)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt=
-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.1.0)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt-=
python-0.9.4-1.x86_64)</div><div class=3D"gmail_extra">Error: Missing Depen=
dency: libvirt.so.0(LIBVIRT_0.9.2)(64bit) is needed by package libvirt-pyth=
on-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.7.2)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt-=
python-0.9.4-1.x86_64)</div><div class=3D"gmail_extra">Error: Missing Depen=
dency: libvirt.so.0(LIBVIRT_0.2.0)(64bit) is needed by package libvirt-0.9.=
4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.8.6)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt-=
python-0.9.4-1.x86_64)</div><div class=3D"gmail_extra">Error: Missing Depen=
dency: libvirt.so.0(LIBVIRT_0.4.1)(64bit) is needed by package libvirt-pyth=
on-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.7.3)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
.so.0(LIBVIRT_0.3.0)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/l=
ibvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.5.0)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
-qemu.so.0(LIBVIRT_QEMU_0.8.3)(64bit) is needed by package libvirt-0.9.4-1.=
x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.3.2)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
.so.0(LIBVIRT_0.6.0)(64bit) is needed by package libvirt-python-0.9.4-1.x86=
_64 (/libvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.1.0)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/libvirt-0.9.4-1=
.x86_64)</div><div class=3D"gmail_extra">Error: Missing Dependency: libvirt=
.so.0(LIBVIRT_0.8.0)(64bit) is needed by package libvirt-0.9.4-1.x86_64 (/l=
ibvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.8.5)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt-=
python-0.9.4-1.x86_64)</div><div class=3D"gmail_extra">Error: Missing Depen=
dency: libvirt-qemu.so.0()(64bit) is needed by package libvirt-0.9.4-1.x86_=
64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.6.1)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt-=
python-0.9.4-1.x86_64)</div><div class=3D"gmail_extra">Error: Missing Depen=
dency: libvirt.so.0(LIBVIRT_0.9.2)(64bit) is needed by package libvirt-0.9.=
4-1.x86_64 (/libvirt-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">Error: Missing Dependency: libvirt.so.0(LIBVIRT_=
0.3.3)(64bit) is needed by package libvirt-python-0.9.4-1.x86_64 (/libvirt-=
python-0.9.4-1.x86_64)</div><div class=3D"gmail_extra">Error: Missing Depen=
dency: libvirt.so.0(LIBVIRT_0.9.0)(64bit) is needed by package libvirt-pyth=
on-0.9.4-1.x86_64 (/libvirt-python-0.9.4-1.x86_64)</div>
<div class=3D"gmail_extra">=A0You could try using --skip-broken to work aro=
und the problem</div><div class=3D"gmail_extra">=A0You could try running: p=
ackage-cleanup --problems</div><div class=3D"gmail_extra">=A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 package-cleanup --dupes</div>
<div class=3D"gmail_extra">=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
rpm -Va --nofiles --nodigest</div><div class=3D"gmail_extra">The program pa=
ckage-cleanup is found in the yum-utils package.</div><div class=3D"gmail_e=
xtra"><br></div></div>

--0016e6d58f00ffdfa104be81ccd5--


--===============6370594813485616582==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-users mailing list
Xen-users@lists.xen.org
http://lists.xen.org/xen-users
--===============6370594813485616582==--


From xen-devel-bounces@lists.xen.org Wed Apr 25 15:56:18 2012
Return-path: <xen-devel-bounces@lists.xen.org>
Envelope-to: archives@lists.xen.org
Delivery-date: Wed, 25 Apr 2012 15:56:18 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xen.org>)
	id 1SN4Zj-0000Jv-LN; Wed, 25 Apr 2012 15:56:15 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>) id 1SN4Zf-00009K-At
	for xen-devel@lists.xen.org; Wed, 25 Apr 2012 15:56:12 +0000
Received: from [193.109.254.147:51904] by server-3.bemta-14.messagelabs.com id
	C9/7C-23274-99E189F4; Wed, 25 Apr 2012 15:56:09 +0000
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1335369363!1112892!2
X-Originating-IP: [62.200.22.115]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjIuMjAwLjIyLjExNSA9PiA5NjE4MA==\n
X-StarScan-Version: 6.5.7; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20927 invoked from network); 25 Apr 2012 15:56:06 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	25 Apr 2012 15:56:06 -0000
X-IronPort-AV: E=Sophos;i="4.75,481,1330905600"; d="scan'208";a="12137141"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Apr 2012 15:56:02 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.213.0; Wed, 25 Apr 2012 16:56:00 +0100
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1SN4ZR-0007ar-0K; Wed, 25 Apr 2012 15:55:57 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1SN4ZQ-0003Qa-TT;
	Wed, 25 Apr 2012 16:55:56 +0100
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: <xen-devel@lists.xen.org>
Date: Wed, 25 Apr 2012 16:55:32 +0100
Message-ID: <1335369353-13012-5-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1335369353-13012-1-git-send-email-ian.jackson@eu.citrix.com>
References: <1335369353-13012-1-git-send-email-ian.jackson@eu.citrix.com>
MIME-Version: 1.0
Cc: Roger Pau Monne <roger.pau@entel.upc.edu>,
	Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [Xen-devel] =?utf-8?q?=5BPATCH_04/25=5D_autoconf=3A_trim_the_conf?=
	=?utf-8?q?igure_script=3B_use_autoheader?=
X-BeenThere: xen-devel@lists.xen.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xen.org>
List-Unsubscribe: <http://lists.xen.org/cgi-bin/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xen.org?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xen.org>
List-Help: <mailto:xen-devel-request@lists.xen.org?subject=help>
List-Subscribe: <http://lists.xen.org/cgi-bin/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xen.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: xen-devel-bounces@lists.xen.org
Errors-To: xen-devel-bounces@lists.xen.org

UmVtb3ZlIGEgbG90IG9mIHVubmVjZXNzYXJ5IHRlc3RzLiAgU3BlY2lmaWNhbGx5LCB3ZSBubyBs
b25nZXIgdGVzdApmb3Igc3RhbmRhcmQgUE9TSVggZmFjaWxpdGllcyB3aGljaCB3ZSBleHBlY3Qg
dG8gYmUgcHJvdmlkZWQKZXZlcnl3aGVyZSBhbmQgd2hpY2ggd2UgZG9uJ3QgaW4gYW55IGNhc2Ug
aGF2ZSBhbnkgYWx0ZXJuYXRpdmUgZm9yLgoKU3dpdGNoIHRvIGdlbmVyYXRpbmcgY29uZmlnLmgu
aW4gd2l0aCBhdXRvaGVhZGVyLgoKU2lnbmVkLW9mZi1ieTogSWFuIEphY2tzb24gPGlhbi5qYWNr
c29uQGV1LmNpdHJpeC5jb20+CkNjOiBSb2dlciBQYXUgTW9ubmUgPHJvZ2VyLnBhdUBlbnRlbC51
cGMuZWR1PgoKQ2hhbmdlcyBzaW5jZSB2NzoKICogUmVtb3ZlZCBBWF9DSEVDS19QVFlGVU5DUyAo
c251Y2sgaW4gZnJvbSBwcmV2aW91cyBwYXRjaCkKLS0tCiBhdXRvZ2VuLnNoICAgICAgICAgfCAg
ICAxICsKIHRvb2xzL2NvbmZpZy5oLmluICB8ICAgNzMgKy0KIHRvb2xzL2NvbmZpZ3VyZSAgICB8
IDg4MjUgKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQogdG9vbHMvY29uZmlndXJlLmFjIHwgICA2MCArLQogNCBmaWxlcyBjaGFuZ2VkLCAyOTgxIGlu
c2VydGlvbnMoKyksIDU5NzggZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvYXV0b2dlbi5zaCBi
L2F1dG9nZW4uc2gKaW5kZXggYzI4OGI3MS4uNThhNzFjZSAxMDA3NTUKLS0tIGEvYXV0b2dlbi5z
aAorKysgYi9hdXRvZ2VuLnNoCkBAIC0xLDMgKzEsNCBAQAogIyEvYmluL3NoIC1lCiBjZCB0b29s
cwogYXV0b2NvbmYKK2F1dG9oZWFkZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2NvbmZpZy5oLmluIGIv
dG9vbHMvY29uZmlnLmguaW4KaW5kZXggZjhmOTZkYy4uMTdjODkxMyAxMDA2NDQKLS0tIGEvdG9v
bHMvY29uZmlnLmguaW4KKysrIGIvdG9vbHMvY29uZmlnLmguaW4KQEAgLTEsMTkgKzEsNjQgQEAK
LS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMg
cHVibGlzaGVkCi0gKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIu
MSBvbmx5LiB3aXRoIHRoZSBzcGVjaWFsCi0gKiBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmli
ZWQgaW4gZmlsZSBMSUNFTlNFLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAq
IEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICov
CisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVh
ZGVyLiAgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBo
ZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0lOVFRZUEVTX0gKKworLyogRGVmaW5lIHRvIDEg
aWYgeW91IGhhdmUgdGhlIGBjcnlwdG8nIGxpYnJhcnkgKC1sY3J5cHRvKS4gKi8KKyN1bmRlZiBI
QVZFX0xJQkNSWVBUTworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHlhamwnIGxp
YnJhcnkgKC1seWFqbCkuICovCisjdW5kZWYgSEFWRV9MSUJZQUpMCisKKy8qIERlZmluZSB0byAx
IGlmIHlvdSBoYXZlIHRoZSBgeicgbGlicmFyeSAoLWx6KS4gKi8KKyN1bmRlZiBIQVZFX0xJQloK
KworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUu
ICovCisjdW5kZWYgSEFWRV9NRU1PUllfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0
aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NURElOVF9ICisKKy8q
IERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLwor
I3VuZGVmIEhBVkVfU1RETElCX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxz
dHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RSSU5HU19ICisKKy8qIERl
ZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLworI3Vu
ZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMv
c3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19TVEFUX0gKKworLyogRGVm
aW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisj
dW5kZWYgSEFWRV9TWVNfVFlQRVNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUg
PHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1VOSVNURF9ICiAKIC8qIERl
ZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8eWFqbC95YWpsX3ZlcnNpb24uaD4gaGVhZGVyIGZp
bGUuICovCiAjdW5kZWYgSEFWRV9ZQUpMX1lBSkxfVkVSU0lPTl9ICiAKLS8qIERlZmluZSBjdXJz
ZXMgaGVhZGVyIHRvIGluY2x1ZGUuICovCisvKiBEZWZpbmUgY3Vyc2VzIGhlYWRlciB0byB1c2Ug
Ki8KICN1bmRlZiBJTkNMVURFX0NVUlNFU19ICisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3
aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI3Vu
ZGVmIFBBQ0tBR0VfQlVHUkVQT1JUCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRo
aXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX05BTUUKKworLyogRGVmaW5lIHRvIHRoZSBm
dWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0Vf
U1RSSU5HCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMg
cGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1RBUk5BTUUKKworLyogRGVmaW5lIHRvIHRoZSBo
b21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1VSTAorCisvKiBE
ZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0Vf
VkVSU0lPTgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBm
aWxlcy4gKi8KKyN1bmRlZiBTVERDX0hFQURFUlMKZGlmZiAtLWdpdCBhL3Rvb2xzL2NvbmZpZ3Vy
ZSBiL3Rvb2xzL2NvbmZpZ3VyZQppbmRleCA4OTdlMDYxLi5kODkxOGZlIDEwMDc1NQotLS0gYS90
b29scy9jb25maWd1cmUKKysrIGIvdG9vbHMvY29uZmlndXJlCkBAIC01OTUsMTIgKzU5NSw4IEBA
IGFjX2luY2x1ZGVzX2RlZmF1bHQ9IlwKICMgaW5jbHVkZSA8dW5pc3RkLmg+CiAjZW5kaWYiCiAK
LWFjX2hlYWRlcl9saXN0PQotYWNfZnVuY19saXN0PQogYWNfc3Vic3RfdmFycz0nTFRMSUJPQkpT
Ci1QT1dfTElCCiBMSUJPQkpTCi1BTExPQ0EKIGxpYmljb252CiBQVEhSRUFEX0xJQlMKIFBUSFJF
QURfTERGTEFHUwpAQCAtNjE2LDYgKzYxMiw5IEBAIFBLR19DT05GSUdfTElCRElSCiBQS0dfQ09O
RklHX1BBVEgKIFBLR19DT05GSUcKIENVUlNFU19MSUJTCitFR1JFUAorR1JFUAorQ1BQCiBweWNv
bmZpZwogUFlUSE9OUEFUSAogT0NBTUxCVUlMRApAQCAtNjM1LDggKzYzNCwxMyBAQCBJTlNUQUxM
X0RBVEEKIElOU1RBTExfU0NSSVBUCiBJTlNUQUxMX1BST0dSQU0KIFNFVF9NQUtFCi1MTl9TCi1T
RUQKK09CSkVYVAorRVhFRVhUCithY19jdF9DQworQ1BQRkxBR1MKK0xERkxBR1MKK0NGTEFHUwor
Q0MKIElBU0wKIEJDQwogTEQ4NgpAQCAtNjY1LDI0ICs2NjksNiBAQCB4ZW5hcGkKIHZ0cG0KIG1v
bml0b3JzCiBnaXRodHRwCi1ob3N0X29zCi1ob3N0X3ZlbmRvcgotaG9zdF9jcHUKLWhvc3QKLWJ1
aWxkX29zCi1idWlsZF92ZW5kb3IKLWJ1aWxkX2NwdQotYnVpbGQKLUVHUkVQCi1HUkVQCi1DUFAK
LU9CSkVYVAotRVhFRVhUCi1hY19jdF9DQwotQ1BQRkxBR1MKLUxERkxBR1MKLUNGTEFHUwotQ0MK
IHRhcmdldF9hbGlhcwogaG9zdF9hbGlhcwogYnVpbGRfYWxpYXMKQEAgLTc0MCwxMiArNzI2LDYg
QEAgZW5hYmxlX2RlYnVnCiAgICAgICBhY19wcmVjaW91c192YXJzPSdidWlsZF9hbGlhcwogaG9z
dF9hbGlhcwogdGFyZ2V0X2FsaWFzCi1DQwotQ0ZMQUdTCi1MREZMQUdTCi1MSUJTCi1DUFBGTEFH
UwotQ1BQCiBQUkVQRU5EX0lOQ0xVREVTCiBQUkVQRU5EX0xJQgogQVBQRU5EX0lOQ0xVREVTCkBA
IC03NjIsNiArNzQyLDEyIEBAIEFTODYKIExEODYKIEJDQwogSUFTTAorQ0MKK0NGTEFHUworTERG
TEFHUworTElCUworQ1BQRkxBR1MKK0NQUAogUEtHX0NPTkZJRwogUEtHX0NPTkZJR19QQVRICiBQ
S0dfQ09ORklHX0xJQkRJUgpAQCAtMTM2NSwxMCArMTM1MSw2IEBAIEZpbmUgdHVuaW5nIG9mIHRo
ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CiBfQUNFT0YKIAogICBjYXQgPDxcX0FDRU9GCi0K
LVN5c3RlbSB0eXBlczoKLSAgLS1idWlsZD1CVUlMRCAgICAgY29uZmlndXJlIGZvciBidWlsZGlu
ZyBvbiBCVUlMRCBbZ3Vlc3NlZF0KLSAgLS1ob3N0PUhPU1QgICAgICAgY3Jvc3MtY29tcGlsZSB0
byBidWlsZCBwcm9ncmFtcyB0byBydW4gb24gSE9TVCBbQlVJTERdCiBfQUNFT0YKIGZpCiAKQEAg
LTEzOTksMTQgKzEzODEsNiBAQCBPcHRpb25hbCBGZWF0dXJlczoKICAgLS1kaXNhYmxlLWRlYnVn
ICAgICAgICAgRGlzYWJsZSBkZWJ1ZyBidWlsZCBvZiB0b29scyAoZGVmYXVsdCBpcyBFTkFCTEVE
KQogCiBTb21lIGluZmx1ZW50aWFsIGVudmlyb25tZW50IHZhcmlhYmxlczoKLSAgQ0MgICAgICAg
ICAgQyBjb21waWxlciBjb21tYW5kCi0gIENGTEFHUyAgICAgIEMgY29tcGlsZXIgZmxhZ3MKLSAg
TERGTEFHUyAgICAgbGlua2VyIGZsYWdzLCBlLmcuIC1MPGxpYiBkaXI+IGlmIHlvdSBoYXZlIGxp
YnJhcmllcyBpbiBhCi0gICAgICAgICAgICAgIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8bGliIGRp
cj4KLSAgTElCUyAgICAgICAgbGlicmFyaWVzIHRvIHBhc3MgdG8gdGhlIGxpbmtlciwgZS5nLiAt
bDxsaWJyYXJ5PgotICBDUFBGTEFHUyAgICAoT2JqZWN0aXZlKSBDL0MrKyBwcmVwcm9jZXNzb3Ig
ZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmCi0gICAgICAgICAgICAgIHlvdSBoYXZlIGhl
YWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgotICBDUFAgICAg
ICAgICBDIHByZXByb2Nlc3NvcgogICBQUkVQRU5EX0lOQ0xVREVTCiAgICAgICAgICAgICAgIExp
c3Qgb2YgaW5jbHVkZSBmb2xkZXJzIHRvIHByZXBlbmQgdG8gQ0ZMQUdTICh3aXRob3V0IC1JKQog
ICBQUkVQRU5EX0xJQiBMaXN0IG9mIGxpYnJhcnkgZm9sZGVycyB0byBwcmVwZW5kIHRvIExERkxB
R1MgKHdpdGhvdXQgLUwpCkBAIC0xNDI1LDYgKzEzOTksMTQgQEAgU29tZSBpbmZsdWVudGlhbCBl
bnZpcm9ubWVudCB2YXJpYWJsZXM6CiAgIExEODYgICAgICAgIFBhdGggdG8gbGQ4NiB0b29sCiAg
IEJDQyAgICAgICAgIFBhdGggdG8gYmNjIHRvb2wKICAgSUFTTCAgICAgICAgUGF0aCB0byBpYXNs
IHRvb2wKKyAgQ0MgICAgICAgICAgQyBjb21waWxlciBjb21tYW5kCisgIENGTEFHUyAgICAgIEMg
Y29tcGlsZXIgZmxhZ3MKKyAgTERGTEFHUyAgICAgbGlua2VyIGZsYWdzLCBlLmcuIC1MPGxpYiBk
aXI+IGlmIHlvdSBoYXZlIGxpYnJhcmllcyBpbiBhCisgICAgICAgICAgICAgIG5vbnN0YW5kYXJk
IGRpcmVjdG9yeSA8bGliIGRpcj4KKyAgTElCUyAgICAgICAgbGlicmFyaWVzIHRvIHBhc3MgdG8g
dGhlIGxpbmtlciwgZS5nLiAtbDxsaWJyYXJ5PgorICBDUFBGTEFHUyAgICAoT2JqZWN0aXZlKSBD
L0MrKyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmCisgICAgICAg
ICAgICAgIHlvdSBoYXZlIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1
ZGUgZGlyPgorICBDUFAgICAgICAgICBDIHByZXByb2Nlc3NvcgogICBQS0dfQ09ORklHICBwYXRo
IHRvIHBrZy1jb25maWcgdXRpbGl0eQogICBQS0dfQ09ORklHX1BBVEgKICAgICAgICAgICAgICAg
ZGlyZWN0b3JpZXMgdG8gYWRkIHRvIHBrZy1jb25maWcncyBzZWFyY2ggcGF0aApAQCAtMTc5Nywz
MTEgKzE3NzksNiBAQCBmaQogICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKIAogfSAjIGFj
X2ZuX2NfdHJ5X2xpbmsKLQotIyBhY19mbl9jX2NoZWNrX2Z1bmMgTElORU5PIEZVTkMgVkFSCi0j
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGVzdHMgd2hldGhlciBGVU5D
IGV4aXN0cywgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5Ci1hY19m
bl9jX2NoZWNrX2Z1bmMgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xp
bmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICB7ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1Ci0kYXNf
ZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KLWlmIGV2YWwgInRlc3QgXCJcJHsk
MytzZXR9XCIiID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVs
c2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5k
IGNvbmZkZWZzLmguICAqLwotLyogRGVmaW5lICQyIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBp
biBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgJDIuCi0gICBGb3IgZXhhbXBsZSwgSFAtVVggMTFp
IDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KLSNkZWZpbmUgJDIgaW5ub2N1
b3VzXyQyCi0KLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhv
cGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFy
ICQyICgpOyBiZWxvdy4KLSAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9f
U1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBm
cmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUg
PGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQotI3VuZGVm
ICQyCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFu
IGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0
eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUg
d291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0j
ZW5kaWYKLWNoYXIgJDIgKCk7Ci0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9y
IGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBF
Tk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcg
c3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNp
ZiBkZWZpbmVkIF9fc3R1Yl8kMiB8fCBkZWZpbmVkIF9fc3R1Yl9fXyQyCi1jaG9rZSBtZQotI2Vu
ZGlmCi0KLWludAotbWFpbiAoKQotewotcmV0dXJuICQyICgpOwotICA7Ci0gIHJldHVybiAwOwot
fQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGV2YWwg
IiQzPXllcyIKLWVsc2UKLSAgZXZhbCAiJDM9bm8iCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5l
cnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0
LiRhY19leHQKLWZpCi1ldmFsIGFjX3Jlcz1cJCQzCi0JICAgICAgIHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLSRhc19lY2hvICIk
YWNfcmVzIiA+JjY7IH0KLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xpbmVu
b19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KLQotfSAjIGFj
X2ZuX2NfY2hlY2tfZnVuYwotCi0jIGFjX2ZuX2NfY2hlY2tfdHlwZSBMSU5FTk8gVFlQRSBWQVIg
SU5DTFVERVMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
IyBUZXN0cyB3aGV0aGVyIFRZUEUgZXhpc3RzIGFmdGVyIGhhdmluZyBpbmNsdWRlZCBJTkNMVURF
Uywgc2V0dGluZyBjYWNoZQotIyB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkuCi1hY19mbl9jX2No
ZWNrX3R5cGUgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19z
dGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICB7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1Ci0kYXNfZWNob19u
ICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KLWlmIGV2YWwgInRlc3QgXCJcJHskMytzZXR9
XCIiID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAg
ZXZhbCAiJDM9bm8iCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19l
eHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSQ0Ci1pbnQKLW1haW4gKCkKLXsKLWlmIChzaXpl
b2YgKCQyKSkKLQkgcmV0dXJuIDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFj
X2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgY2F0IGNvbmZkZWZzLmggLSA8
PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJDQKLWlu
dAotbWFpbiAoKQotewotaWYgKHNpemVvZiAoKCQyKSkpCi0JICAgIHJldHVybiAwOwotICA7Ci0g
IHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsg
dGhlbiA6Ci0KLWVsc2UKLSAgZXZhbCAiJDM9eWVzIgotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3Qu
ZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUg
Y29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWV2
YWwgYWNfcmVzPVwkJDMKLQkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQotJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQot
ICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYg
eyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQotCi19ICMgYWNfZm5fY19jaGVja190eXBl
Ci0KLSMgYWNfZm5fY19maW5kX2ludFhfdCBMSU5FTk8gQklUUyBWQVIKLSMgLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRmluZHMgYSBzaWduZWQgaW50ZWdlciB0eXBlIHdp
dGggd2lkdGggQklUUywgc2V0dGluZyBjYWNoZSB2YXJpYWJsZSBWQVIKLSMgYWNjb3JkaW5nbHku
Ci1hY19mbl9jX2ZpbmRfaW50WF90ICgpCi17Ci0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEi
fSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKLSAgeyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaW50JDJf
dCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgaW50JDJfdC4uLiAiID4mNjsgfQotaWYg
ZXZhbCAidGVzdCBcIlwkeyQzK3NldH1cIiIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIo
Y2FjaGVkKSAiID4mNgotZWxzZQotICBldmFsICIkMz1ubyIKLSAgICAgIyBPcmRlciBpcyBpbXBv
cnRhbnQgLSBuZXZlciBjaGVjayBhIHR5cGUgdGhhdCBpcyBwb3RlbnRpYWxseSBzbWFsbGVyCi0g
ICAgICMgdGhhbiBoYWxmIG9mIHRoZSBleHBlY3RlZCB0YXJnZXQgd2lkdGguCi0gICAgIGZvciBh
Y190eXBlIGluIGludCQyX3QgJ2ludCcgJ2xvbmcgaW50JyBcCi0JICdsb25nIGxvbmcgaW50JyAn
c2hvcnQgaW50JyAnc2lnbmVkIGNoYXInOyBkbwotICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxf
QUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNs
dWRlc19kZWZhdWx0Ci0JICAgICBlbnVtIHsgTiA9ICQyIC8gMiAtIDEgfTsKLWludAotbWFpbiAo
KQotewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoMCA8ICgkYWNfdHlwZSkgKCgo
KCgkYWNfdHlwZSkgMSA8PCBOKSA8PCBOKSAtIDEpICogMiArIDEpKV07Ci10ZXN0X2FycmF5IFsw
XSA9IDAKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21w
aWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0
ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0
Ci0JICAgICAgICBlbnVtIHsgTiA9ICQyIC8gMiAtIDEgfTsKLWludAotbWFpbiAoKQotewotc3Rh
dGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKCRhY190eXBlKSAoKCgoKCRhY190eXBlKSAx
IDw8IE4pIDw8IE4pIC0gMSkgKiAyICsgMSkKLQkJIDwgKCRhY190eXBlKSAoKCgoKCRhY190eXBl
KSAxIDw8IE4pIDw8IE4pIC0gMSkgKiAyICsgMikpXTsKLXRlc3RfYXJyYXkgWzBdID0gMAotCi0g
IDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5F
Tk8iOyB0aGVuIDoKLQotZWxzZQotICBjYXNlICRhY190eXBlIGluICMoCi0gIGludCQyX3QpIDoK
LSAgICBldmFsICIkMz15ZXMiIDs7ICMoCi0gICopIDoKLSAgICBldmFsICIkMz1cJGFjX3R5cGUi
IDs7Ci1lc2FjCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4
dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3Qu
JGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gICAgICAgaWYgZXZhbCB0ZXN0IFwieFwkIiQz
IlwiID0geCJubyI7IHRoZW4gOgotCi1lbHNlCi0gIGJyZWFrCi1maQotICAgICBkb25lCi1maQot
ZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9
Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAm
JiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9Ci0KLX0gIyBhY19mbl9jX2ZpbmRfaW50
WF90Ci0KLSMgYWNfZm5fY19jaGVja19tZW1iZXIgTElORU5PIEFHR1IgTUVNQkVSIFZBUiBJTkNM
VURFUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0jIFRyaWVzIHRvIGZpbmQgaWYgdGhlIGZpZWxkIE1FTUJFUiBleGlzdHMgaW4gdHlwZSBB
R0dSLCBhZnRlciBpbmNsdWRpbmcKLSMgSU5DTFVERVMsIHNldHRpbmcgY2FjaGUgdmFyaWFibGUg
VkFSIGFjY29yZGluZ2x5LgotYWNfZm5fY19jaGVja19tZW1iZXIgKCkKLXsKLSAgYXNfbGluZW5v
PSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xp
bmVub19zdGFjawotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNo
ZWNraW5nIGZvciAkMi4kMyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuJDMuLi4g
IiA+JjY7IH0KLWlmIGV2YWwgInRlc3QgXCJcJHskNCtzZXR9XCIiID0gc2V0OyB0aGVuIDoKLSAg
JGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9B
Q0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJDUKLWludAot
bWFpbiAoKQotewotc3RhdGljICQyIGFjX2FnZ3I7Ci1pZiAoYWNfYWdnci4kMykKLXJldHVybiAw
OwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIk
TElORU5PIjsgdGhlbiA6Ci0gIGV2YWwgIiQ0PXllcyIKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmgg
LSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJDUK
LWludAotbWFpbiAoKQotewotc3RhdGljICQyIGFjX2FnZ3I7Ci1pZiAoc2l6ZW9mIGFjX2FnZ3Iu
JDMpCi1yZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190
cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBldmFsICIkND15ZXMiCi1lbHNlCi0gIGV2
YWwgIiQ0PW5vIgotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpl
eHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0
LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWV2YWwgYWNfcmVzPVwkJDQKLQkgICAg
ICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19y
ZXMiID4mNQotJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQotICBldmFsICRhc19saW5lbm9fc3Rh
Y2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBh
c19saW5lbm87fQotCi19ICMgYWNfZm5fY19jaGVja19tZW1iZXIKLQotIyBhY19mbl9jX2ZpbmRf
dWludFhfdCBMSU5FTk8gQklUUyBWQVIKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi0jIEZpbmRzIGFuIHVuc2lnbmVkIGludGVnZXIgdHlwZSB3aXRoIHdpZHRoIEJJVFMs
IHNldHRpbmcgY2FjaGUgdmFyaWFibGUgVkFSCi0jIGFjY29yZGluZ2x5LgotYWNfZm5fY19maW5k
X3VpbnRYX3QgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19z
dGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICB7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1aW50JDJfdCIgPiY1Ci0kYXNf
ZWNob19uICJjaGVja2luZyBmb3IgdWludCQyX3QuLi4gIiA+JjY7IH0KLWlmIGV2YWwgInRlc3Qg
XCJcJHskMytzZXR9XCIiID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+
JjYKLWVsc2UKLSAgZXZhbCAiJDM9bm8iCi0gICAgICMgT3JkZXIgaXMgaW1wb3J0YW50IC0gbmV2
ZXIgY2hlY2sgYSB0eXBlIHRoYXQgaXMgcG90ZW50aWFsbHkgc21hbGxlcgotICAgICAjIHRoYW4g
aGFsZiBvZiB0aGUgZXhwZWN0ZWQgdGFyZ2V0IHdpZHRoLgotICAgICBmb3IgYWNfdHlwZSBpbiB1
aW50JDJfdCAndW5zaWduZWQgaW50JyAndW5zaWduZWQgbG9uZyBpbnQnIFwKLQkgJ3Vuc2lnbmVk
IGxvbmcgbG9uZyBpbnQnICd1bnNpZ25lZCBzaG9ydCBpbnQnICd1bnNpZ25lZCBjaGFyJzsgZG8K
LSAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBl
bmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotaW50Ci1tYWluICgpCi17
Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKCRhY190eXBlKSAtMSA+PiAoJDIg
LyAyIC0gMSkpID4+ICgkMiAvIDIgLSAxKSA9PSAzKV07Ci10ZXN0X2FycmF5IFswXSA9IDAKLQot
ICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElO
RU5PIjsgdGhlbiA6Ci0gIGNhc2UgJGFjX3R5cGUgaW4gIygKLSAgdWludCQyX3QpIDoKLSAgICBl
dmFsICIkMz15ZXMiIDs7ICMoCi0gICopIDoKLSAgICBldmFsICIkMz1cJGFjX3R5cGUiIDs7Ci1l
c2FjCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25m
dGVzdC4kYWNfZXh0Ci0gICAgICAgaWYgZXZhbCB0ZXN0IFwieFwkIiQzIlwiID0geCJubyI7IHRo
ZW4gOgotCi1lbHNlCi0gIGJyZWFrCi1maQotICAgICBkb25lCi1maQotZXZhbCBhY19yZXM9XCQk
MwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xp
bmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07
IHVuc2V0IGFzX2xpbmVubzt9Ci0KLX0gIyBhY19mbl9jX2ZpbmRfdWludFhfdAogY2F0ID5jb25m
aWcubG9nIDw8X0FDRU9GCiBUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2Vk
IGJ5IGNvbXBpbGVycyB3aGlsZQogcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcg
aWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KQEAgLTIzODYsMTEgKzIwNjMsNiBAQCAkYXNf
ZWNobyAiJGFzX21lOiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KICAgPiRjYWNo
ZV9maWxlCiBmaQogCi1hc19mbl9hcHBlbmQgYWNfaGVhZGVyX2xpc3QgIiBzeXMvdGltZS5oIgot
YXNfZm5fYXBwZW5kIGFjX2hlYWRlcl9saXN0ICIgdW5pc3RkLmgiCi1hc19mbl9hcHBlbmQgYWNf
ZnVuY19saXN0ICIgYWxhcm0iCi1hc19mbl9hcHBlbmQgYWNfaGVhZGVyX2xpc3QgIiBzdGRsaWIu
aCIKLWFzX2ZuX2FwcGVuZCBhY19oZWFkZXJfbGlzdCAiIHN5cy9wYXJhbS5oIgogIyBDaGVjayB0
aGF0IHRoZSBwcmVjaW91cyB2YXJpYWJsZXMgc2F2ZWQgaW4gdGhlIGNhY2hlIGhhdmUga2VwdCB0
aGUgc2FtZQogIyB2YWx1ZS4KIGFjX2NhY2hlX2NvcnJ1cHRlZD1mYWxzZQpAQCAtMjUwOCwxNzMw
ICsyMTgwLDQwIEBAIEFQUEVORF9JTkNMVURFUyBhbmQgQVBQRU5EX0xJQiBpbnN0ZWFkIHdoZW4g
cG9zc2libGUuIiA+JjI7fQogCiBmaQogCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFH
UycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0
ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxB
R1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9
JGFjX2N2X2NfY29tcGlsZXJfZ251Ci1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVu
Ci0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBz
byBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9v
bF9wcmVmaXh9Z2NjOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2lu
ZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9
IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlm
IHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNl
ciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9T
RVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAg
dGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycg
JGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRh
Y193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4
ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Z2Nj
IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19k
aXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAg
ZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0
ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiAkQ0MiID4mNQotJGFzX2VjaG8gIiRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0k
YXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2df
Q0MiOyB0aGVuCi0gIGFjX2N0X0NDPSRDQwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2Yg
ImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkg
Z2NjOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFj
X3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9
IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRl
c3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0ND
IiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJ
RlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0k
YXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNf
ZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0
IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGly
LyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9
ImdjYyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAk
YXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25l
Ci0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1hY19jdF9DQz0kYWNfY3ZfcHJv
Z19hY19jdF9DQwotaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICB7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKLSRhc19l
Y2hvICIkYWNfY3RfQ0MiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZp
Ci0KLSAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCi0gICAgQ0M9IiIKLSAgZWxzZQot
ICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3Nz
IHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFz
X21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRy
aXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBDQz0kYWNfY3Rf
Q0MKLSAgZmkKLWVsc2UKLSAgQ0M9IiRhY19jdl9wcm9nX0NDIgotZmkKLQotaWYgdGVzdCAteiAi
JENDIjsgdGhlbgotICAgICAgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4K
LSAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2MiLCBz
byBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9v
bF9wcmVmaXh9Y2M7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5n
IGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0i
ID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYg
dGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2Vy
IG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NF
UEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0
ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAk
YWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFj
X3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhl
Y19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIK
LSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGly
LyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRv
bmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVz
dCAtbiAiJENDIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IHJlc3VsdDogJENDIiA+JjUKLSRhc19lY2hvICIkQ0MiID4mNjsgfQotZWxzZQotICB7ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFz
X2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotICBmaQotZmkKLWlmIHRlc3QgLXogIiRDQyI7IHRo
ZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHBy
b2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLXsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+
JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVz
dCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNh
Y2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9n
X0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBhY19w
cm9nX3JlamVjdGVkPW5vCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1m
b3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRh
c19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRh
YmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19l
eGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07
IHRoZW4KLSAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIvdXNy
L3VjYi9jYyI7IHRoZW4KLSAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotICAgICAgIGNvbnRp
bnVlCi0gICAgIGZpCi0gICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4
dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZT
Ci0KLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBh
IGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQg
ZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAhPSAwOyB0aGVuCi0g
ICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0g
ICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxs
IGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1l
OyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0i
JGFzX2Rpci8kYWNfd29yZCR7MSsnICd9JEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0kYWNfY3Zf
cHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKLSRhc19lY2hvICIkQ0MiID4mNjsg
fQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXog
IiRDQyI7IHRoZW4KLSAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICBmb3Ig
YWNfcHJvZyBpbiBjbC5leGUKLSAgZG8KLSAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2Yg
IiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdp
dGggYXJncy4KLXNldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgot
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFj
X3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9
Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNo
b19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFj
X2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNl
Ci1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQ
QVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rp
cj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7
IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFz
X3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19j
dl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKLSAgICAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0
IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMK
LQotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICB7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUK
LSRhc19lY2hvICIkQ0MiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZp
Ci0KLQotICAgIHRlc3QgLW4gIiRDQyIgJiYgYnJlYWsKLSAgZG9uZQotZmkKLWlmIHRlc3QgLXog
IiRDQyI7IHRoZW4KLSAgYWNfY3RfQ0M9JENDCi0gIGZvciBhY19wcm9nIGluIGNsLmV4ZQotZG8K
LSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBh
IHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIK
LXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRh
Y193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsg
fQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuIDoKLSAg
JGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0ND
IjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2Vy
IG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NF
UEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0
ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAk
YWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFj
X3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhl
Y19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCi0gICAg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNf
d29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1J
RlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MK
LWlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0
X0NDIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVz
dCAtbiAiJGFjX2N0X0NDIiAmJiBicmVhawotZG9uZQotCi0gIGlmIHRlc3QgIngkYWNfY3RfQ0Mi
ID0geDsgdGhlbgotICAgIENDPSIiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6
JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBo
b3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3Mg
dG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJu
ZWQ9eWVzIDs7Ci1lc2FjCi0gICAgQ0M9JGFjX2N0X0NDCi0gIGZpCi1maQotCi1maQotCi0KLXRl
c3QgLXogIiRDQyIgJiYgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4g
XGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBDIGNvbXBp
bGVyIGZvdW5kIGluIFwkUEFUSAotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIg
IiRMSU5FTk8iIDUgOyB9Ci0KLSMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBj
b21waWxlci4KLSRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5n
IGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQotc2V0IFggJGFjX2NvbXBpbGUKLWFjX2NvbXBp
bGVyPSQyCi1mb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247IGRvCi0g
IHsgeyBhY190cnk9IiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIKLWNhc2UgIigoJGFjX3Ry
eSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICop
IGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5
X2VjaG8iOyB9ID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IikgMj5j
b25mdGVzdC5lcnIKLSAgYWNfc3RhdHVzPSQ/Ci0gIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0
aGVuCi0gICAgc2VkICcxMGFcCi0uLi4gcmVzdCBvZiBzdGRlcnIgb3V0cHV0IGRlbGV0ZWQgLi4u
Ci0gICAgICAgICAxMHEnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCi0gICAgY2F0IGNvbmZ0
ZXN0LmVyMSA+JjUKLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+
JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQotZG9uZQotCi1jYXQgY29uZmRlZnMuaCAtIDw8
X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAot
bWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWFjX2NsZWFuX2ZpbGVz
X3NhdmU9JGFjX2NsZWFuX2ZpbGVzCi1hY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGEu
b3V0IGEub3V0LmRTWU0gYS5leGUgYi5vdXQiCi0jIFRyeSB0byBjcmVhdGUgYW4gZXhlY3V0YWJs
ZSB3aXRob3V0IC1vIGZpcnN0LCBkaXNyZWdhcmQgYS5vdXQuCi0jIEl0IHdpbGwgaGVscCB1cyBk
aWFnbm9zZSBicm9rZW4gY29tcGlsZXJzLCBhbmQgZmluZGluZyBvdXQgYW4gaW50dWl0aW9uCi0j
IG9mIGV4ZWV4dC4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hl
Y2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3JrcyIgPiY1Ci0kYXNfZWNob19uICJjaGVj
a2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzLi4uICIgPiY2OyB9Ci1hY19saW5rX2Rl
ZmF1bHQ9YCRhc19lY2hvICIkYWNfbGluayIgfCBzZWQgJ3MvIC1vICpjb25mdGVzdFteIF0qLy8n
YAotCi0jIFRoZSBwb3NzaWJsZSBvdXRwdXQgZmlsZXM6Ci1hY19maWxlcz0iYS5vdXQgY29uZnRl
c3QuZXhlIGNvbmZ0ZXN0IGEuZXhlIGFfb3V0LmV4ZSBiLm91dCBjb25mdGVzdC4qIgotCi1hY19y
bWZpbGVzPQotZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzCi1kbwotICBjYXNlICRhY19maWxlIGlu
Ci0gICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0g
fCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKSA7
OwotICAgICogKSBhY19ybWZpbGVzPSIkYWNfcm1maWxlcyAkYWNfZmlsZSI7OwotICBlc2FjCi1k
b25lCi1ybSAtZiAkYWNfcm1maWxlcwotCi1pZiB7IHsgYWNfdHJ5PSIkYWNfbGlua19kZWZhdWx0
IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hv
PVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsIGFjX3Ry
eV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgot
JGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfbGlua19kZWZhdWx0
IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07
IHRoZW4gOgotICAjIEF1dG9jb25mLTIuMTMgY291bGQgc2V0IHRoZSBhY19jdl9leGVleHQgdmFy
aWFibGUgdG8gYG5vJy4KLSMgU28gaWdub3JlIGEgdmFsdWUgb2YgYG5vJywgb3RoZXJ3aXNlIHRo
aXMgd291bGQgbGVhZCB0byBgRVhFRVhUID0gbm8nCi0jIGluIGEgTWFrZWZpbGUuICBXZSBzaG91
bGQgbm90IG92ZXJyaWRlIGFjX2N2X2V4ZWV4dCBpZiBpdCB3YXMgY2FjaGVkLAotIyBzbyB0aGF0
IHRoZSB1c2VyIGNhbiBzaG9ydC1jaXJjdWl0IHRoaXMgdGVzdCBmb3IgY29tcGlsZXJzIHVua25v
d24gdG8KLSMgQXV0b2NvbmYuCi1mb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMgJycKLWRvCi0gIHRl
c3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQotICBjYXNlICRhY19maWxlIGluCi0gICAgKi4k
YWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwg
Ki5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKQotCTs7Ci0gICAg
W2FiXS5vdXQgKQotCSMgV2UgZm91bmQgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSwgYnV0IGV4ZWV4
dD0nJyBpcyBtb3N0Ci0JIyBjZXJ0YWlubHkgcmlnaHQuCi0JYnJlYWs7OwotICAgICouKiApCi0J
aWYgdGVzdCAiJHthY19jdl9leGVleHQrc2V0fSIgPSBzZXQgJiYgdGVzdCAiJGFjX2N2X2V4ZWV4
dCIgIT0gbm87Ci0JdGhlbiA6OyBlbHNlCi0JICAgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmls
ZSIgOiAnW14uXSpcKFwuLipcKSdgCi0JZmkKLQkjIFdlIHNldCBhY19jdl9leGVleHQgaGVyZSBi
ZWNhdXNlIHRoZSBsYXRlciB0ZXN0IGZvciBpdCBpcyBub3QKLQkjIHNhZmU6IGNyb3NzIGNvbXBp
bGVycyBtYXkgbm90IGFkZCB0aGUgc3VmZml4IGlmIGdpdmVuIGFuIGAtbycKLQkjIGFyZ3VtZW50
LCBzbyB3ZSBtYXkgbmVlZCB0byBrbm93IGl0IGF0IHRoYXQgcG9pbnQgYWxyZWFkeS4KLQkjIEV2
ZW4gaWYgdGhpcyBzZWN0aW9uIGxvb2tzIGNydWZ0eTogaXQgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YK
LQkjIGFjdHVhbGx5IHdvcmtpbmcuCi0JYnJlYWs7OwotICAgICogKQotCWJyZWFrOzsKLSAgZXNh
YwotZG9uZQotdGVzdCAiJGFjX2N2X2V4ZWV4dCIgPSBubyAmJiBhY19jdl9leGVleHQ9Ci0KLWVs
c2UKLSAgYWNfZmlsZT0nJwotZmkKLWlmIHRlc3QgLXogIiRhY19maWxlIjsgdGhlbiA6Ci0gIHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0k
YXNfZWNobyAibm8iID4mNjsgfQotJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2Fz
OiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLXsgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4m
NQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5f
ZXJyb3IgNzcgIkMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcwotU2VlIFxgY29u
ZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUgOyB9Ci1lbHNlCi0gIHsgJGFz
X2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFz
X2VjaG8gInllcyIgPiY2OyB9Ci1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUi
ID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQg
ZmlsZSBuYW1lLi4uICIgPiY2OyB9Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IHJlc3VsdDogJGFjX2ZpbGUiID4mNQotJGFzX2VjaG8gIiRhY19maWxlIiA+JjY7IH0K
LWFjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0Ci0KLXJtIC1mIC1yIGEub3V0IGEub3V0LmRTWU0gYS5l
eGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0Ci1hY19jbGVhbl9maWxlcz0kYWNfY2xlYW5f
ZmlsZXNfc2F2ZQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVj
a2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5n
IGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gIiA+JjY7IH0KLWlmIHsgeyBhY190cnk9IiRh
Y19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3Ry
eV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFs
IGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNo
b1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIkYWNfbGluayIp
IDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0
aGVuIDoKLSAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJl
c2VudCcgKHdlbGwsIG9ic2VydmFibGUpCi0jIGNhdGNoIGBjb25mdGVzdC5leGUnLiAgRm9yIGlu
c3RhbmNlIHdpdGggQ3lnd2luLCBgbHMgY29uZnRlc3QnIHdpbGwKLSMgd29yayBwcm9wZXJseSAo
aS5lLiwgcmVmZXIgdG8gYGNvbmZ0ZXN0LmV4ZScpLCB3aGlsZSBpdCB3b24ndCB3aXRoCi0jIGBy
bScuCi1mb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5leGUgY29uZnRlc3QgY29uZnRlc3QuKjsgZG8K
LSAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAg
ICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICou
YmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7Ci0g
ICAgKi4qICkgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdg
Ci0JICBicmVhazs7Ci0gICAgKiApIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotZWxzZQotICB7IHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3
ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30K
LWFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNh
bm5vdCBjb21waWxlIGFuZCBsaW5rCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxz
IiAiJExJTkVOTyIgNSA7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCBjb25mdGVzdCRhY19jdl9leGVl
eHQKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNf
Y3ZfZXhlZXh0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfZXhlZXh0IiA+JjY7IH0KLQotcm0gLWYg
Y29uZnRlc3QuJGFjX2V4dAotRVhFRVhUPSRhY19jdl9leGVleHQKLWFjX2V4ZWV4dD0kRVhFRVhU
Ci1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29u
ZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLWludAotbWFpbiAoKQotewotRklMRSAq
ZiA9IGZvcGVuICgiY29uZnRlc3Qub3V0IiwgInciKTsKLSByZXR1cm4gZmVycm9yIChmKSB8fCBm
Y2xvc2UgKGYpICE9IDA7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotYWNfY2xlYW5f
ZmlsZXM9IiRhY19jbGVhbl9maWxlcyBjb25mdGVzdC5vdXQiCi0jIENoZWNrIHRoYXQgdGhlIGNv
bXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgot
IyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgoteyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBj
cm9zcyBjb21waWxpbmciID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUg
Y3Jvc3MgY29tcGlsaW5nLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAh
PSB5ZXM7IHRoZW4KLSAgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGlu
Ci0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190
cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNfZWNobyAiJGFjX3RyeV9lY2hv
IjsgfSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFz
X2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1
Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KLSAgaWYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNf
Y3ZfZXhlZXh0JwotICB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpc
XCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1l
c2FjCi1ldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRh
Y190cnlfZWNob1wiIgotJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Ci0gIChldmFsICIk
YWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp
bmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9
IDA7IH07IH07IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9bm8KLSAgZWxzZQotICAgIGlmIHRl
c3QgIiRjcm9zc19jb21waWxpbmciID0gbWF5YmU7IHRoZW4KLQljcm9zc19jb21waWxpbmc9eWVz
Ci0gICAgZWxzZQotCXsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBl
cnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxg
JGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBydW4gQyBjb21waWxlZCBw
cm9ncmFtcy4KLUlmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgot
U2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUgOyB9Ci0gICAg
ZmkKLSAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJl
c3VsdDogJGNyb3NzX2NvbXBpbGluZyIgPiY1Ci0kYXNfZWNobyAiJGNyb3NzX2NvbXBpbGluZyIg
PiY2OyB9Ci0KLXJtIC1mIGNvbmZ0ZXN0LiRhY19leHQgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGNv
bmZ0ZXN0Lm91dAotYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKLXsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBv
YmplY3QgZmlsZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmpl
Y3QgZmlsZXMuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfb2JqZXh0K3NldH0iID0gc2V0
OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2F0IGNvbmZk
ZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAq
LwotCi1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAt
ZiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iagotaWYgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1j
YXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRh
Y190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgYWNfdHJ5X2Vj
aG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCi0kYXNf
ZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj4mNQot
ICBhY19zdGF0dXM9JD8KLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
XCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgot
ICBmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iaiBjb25mdGVzdC4qOyBkbwot
ICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWU7Ci0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAg
ICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICou
YmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gKSA7OwotICAgICopIGFjX2N2X29i
amV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJy4qXC5cKC4qXCknYAotICAgICAgIGJyZWFrOzsKLSAg
ZXNhYwotZG9uZQotZWxzZQotICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6
IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQoteyB7ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1
Ci0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9l
cnJvciAkPyAiY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIG9iamVjdCBmaWxlczogY2Fubm90IGNv
bXBpbGUKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsg
fQotZmkKLXJtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkK
LXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zf
b2JqZXh0IiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfb2JqZXh0IiA+JjY7IH0KLU9CSkVYVD0kYWNf
Y3Zfb2JqZXh0Ci1hY19vYmpleHQ9JE9CSkVYVAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29t
cGlsZXIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhl
IEdOVSBDIGNvbXBpbGVyLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2NfY29tcGlsZXJf
Z251K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVs
c2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5k
IGNvbmZkZWZzLmguICAqLwotCi1pbnQKLW1haW4gKCkKLXsKLSNpZm5kZWYgX19HTlVDX18KLSAg
ICAgICBjaG9rZSBtZQotI2VuZGlmCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYg
YWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jb21waWxlcl9nbnU9
eWVzCi1lbHNlCi0gIGFjX2NvbXBpbGVyX2dudT1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3Qu
ZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotYWNfY3ZfY19jb21waWxl
cl9nbnU9JGFjX2NvbXBpbGVyX2dudQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1Ci0kYXNfZWNo
byAiJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjY7IH0KLWlmIHRlc3QgJGFjX2NvbXBpbGVyX2du
dSA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi1hY190ZXN0X0NGTEFH
Uz0ke0NGTEFHUytzZXR9Ci1hY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCi17ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWci
ID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZy4uLiAiID4m
NjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2crc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAk
YXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19zYXZlX2Nfd2Vycm9yX2ZsYWc9
JGFjX2Nfd2Vycm9yX2ZsYWcKLSAgIGFjX2Nfd2Vycm9yX2ZsYWc9eWVzCi0gICBhY19jdl9wcm9n
X2NjX2c9bm8KLSAgIENGTEFHUz0iLWciCi0gICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5j
b25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQot
ewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUg
IiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBDRkxBR1M9
IiIKLSAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8q
IGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4g
MDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgot
Ci1lbHNlCi0gIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwotCSBDRkxB
R1M9Ii1nIgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0v
KiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJu
IDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoK
LSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0
ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3Qu
ZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvcmUg
Y29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICAgYWNf
Y193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCi1maQoteyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQot
JGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZM
QUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCi1lbGlmIHRlc3QgJGFj
X2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgot
ICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UK
LSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQot
ICAgIENGTEFHUz0KLSAgZmkKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5IiA+JjUKLSRh
c19lY2hvX24gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICIg
PiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfYzg5K3NldH0iID0gc2V0OyB0aGVuIDoK
LSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19jODk9
bm8KLWFjX3NhdmVfQ0M9JENDCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4k
YWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5j
bHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3Rh
dC5oPgotLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1Mg
NS43J3Mgc3JjL2NvbmYuc2guICAqLwotc3RydWN0IGJ1ZiB7IGludCB4OyB9OwotRklMRSAqICgq
cmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKLXN0YXRpYyBjaGFy
ICplIChwLCBpKQotICAgICBjaGFyICoqcDsKLSAgICAgaW50IGk7Ci17Ci0gIHJldHVybiBwW2ld
OwotfQotc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoq
cCwgLi4uKQotewotICBjaGFyICpzOwotICB2YV9saXN0IHY7Ci0gIHZhX3N0YXJ0ICh2LHApOwot
ICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOwotICB2YV9lbmQgKHYpOwotICByZXR1cm4gczsK
LX0KLQotLyogT1NGIDQuMCBDb21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5
IGRlZmF1bHQuICBJdCBoYXMKLSAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQg
bm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KLSAgIFRoZXNlIGRvbid0IHByb3Zv
a2UgYW4gZXJyb3IgdW5mb3J0dW5hdGVseSwgaW5zdGVhZCBhcmUgc2lsZW50bHkgdHJlYXRlZAot
ICAgYXMgJ3gnLiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkIGlz
IGFkZGVkIHRvIGdldAotICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4
JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgotICAgYXJyYXkgc2l6ZSBhdCBsZWFzdC4g
IEl0J3MgbmVjZXNzYXJ5IHRvIHdyaXRlICdceDAwJz09MCB0byBnZXQgc29tZXRoaW5nCi0gICB0
aGF0J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZC4gICovCi1pbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAn
ID09IDAgPyAxIDogLTFdOwotCi0vKiBJQk0gQyA2IGZvciBBSVggaXMgYWxtb3N0LUFOU0kgYnkg
ZGVmYXVsdCwgYnV0IGl0IHJlcGxhY2VzIG1hY3JvIHBhcmFtZXRlcnMKLSAgIGluc2lkZSBzdHJp
bmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KLSNkZWZpbmUgRk9PKHgpICd4JwotaW50
IHhsYzZfY2NfYXJyYXlbRk9PKGEpID09ICd4JyA/IDEgOiAtMV07Ci0KLWludCB0ZXN0IChpbnQg
aSwgZG91YmxlIHgpOwotc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307Ci1zdHJ1Y3QgczIg
e2ludCAoKmYpIChkb3VibGUgYSk7fTsKLWludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklM
RSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOwotaW50
IGFyZ2M7Ci1jaGFyICoqYXJndjsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGYgKGUsIGFyZ3Ys
IDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOwotICA7Ci0gIHJl
dHVybiAwOwotfQotX0FDRU9GCi1mb3IgYWNfYXJnIGluICcnIC1xbGFuZ2x2bD1leHRjODkgLXFs
YW5nbHZsPWFuc2kgLXN0ZCBcCi0JLUFlICItQWEgLURfSFBVWF9TT1VSQ0UiICItWGMgLURfX0VY
VEVOU0lPTlNfXyIKLWRvCi0gIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgotICBpZiBhY19mbl9j
X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X3Byb2dfY2NfYzg5PSRhY19h
cmcKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0Ci0gIHRl
c3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9ICJ4bm8iICYmIGJyZWFrCi1kb25lCi1ybSAtZiBj
b25mdGVzdC4kYWNfZXh0Ci1DQz0kYWNfc2F2ZV9DQwotCi1maQotIyBBQ19DQUNIRV9WQUwKLWNh
c2UgIngkYWNfY3ZfcHJvZ19jY19jODkiIGluCi0gIHgpCi0gICAgeyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKLSRhc19lY2hv
ICJub25lIG5lZWRlZCIgPiY2OyB9IDs7Ci0gIHhubykKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogdW5zdXBwb3J0ZWQiID4mNQotJGFzX2VjaG8g
InVuc3VwcG9ydGVkIiA+JjY7IH0gOzsKLSAgKikKLSAgICBDQz0iJENDICRhY19jdl9wcm9nX2Nj
X2M4OSIKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19jODki
ID4mNjsgfSA7OwotZXNhYwotaWYgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0geG5vOyB0
aGVuIDoKLQotZmkKLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21w
aWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19s
aW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdT
IGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2Nv
bXBpbGVyX2dudQotCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29t
cGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNf
bGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFH
UyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19j
b21waWxlcl9nbnUKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hl
Y2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotJGFzX2VjaG9fbiAiY2hl
Y2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuLi4gIiA+JjY7IH0KLSMgT24gU3Vu
cywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAm
JiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRo
ZW4KLSAgaWYgdGVzdCAiJHthY19jdl9wcm9nX0NQUCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRh
c19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gICAgICAjIERvdWJsZSBxdW90ZXMgYmVj
YXVzZSBDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKLSAgICBmb3IgQ1BQIGluICIkQ0MgLUUiICIk
Q0MgLUUgLXRyYWRpdGlvbmFsLWNwcCIgIi9saWIvY3BwIgotICAgIGRvCi0gICAgICBhY19wcmVw
cm9jX29rPWZhbHNlCi1mb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKLWRvCi0g
ICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcg
Z2xpYmMKLSAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCi0gICMgUHJlZmVy
IDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQot
ICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KLSAg
IyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidz
IHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVy
ZSB0byBjYXRjaCB0aGlzIGNhc2UuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0
ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpZmRlZiBfX1NURENfXwotIyBp
bmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0J
CSAgICAgU3ludGF4IGVycm9yCi1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7
IHRoZW4gOgotCi1lbHNlCi0gICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KLWNvbnRp
bnVlCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAot
Ci0gICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlz
dGVudCBoZWFkZXJzCi0gICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCi0gIGNhdCBjb25mZGVm
cy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8K
LSNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jcHAg
IiRMSU5FTk8iOyB0aGVuIDoKLSAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4K
LWNvbnRpbnVlCi1lbHNlCi0gICMgUGFzc2VzIGJvdGggdGVzdHMuCi1hY19wcmVwcm9jX29rPToK
LWJyZWFrCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4
dAotCi1kb25lCi0jIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xl
YW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KLXJtIC1mIGNvbmZ0ZXN0LmkgY29uZnRlc3QuZXJyIGNv
bmZ0ZXN0LiRhY19leHQKLWlmICRhY19wcmVwcm9jX29rOyB0aGVuIDoKLSAgYnJlYWsKLWZpCi0K
LSAgICBkb25lCi0gICAgYWNfY3ZfcHJvZ19DUFA9JENQUAotCi1maQotICBDUFA9JGFjX2N2X3By
b2dfQ1BQCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSRDUFAKLWZpCi17ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENQUCIgPiY1Ci0kYXNfZWNobyAiJENQ
UCIgPiY2OyB9Ci1hY19wcmVwcm9jX29rPWZhbHNlCi1mb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxh
ZyBpbiAnJyB5ZXMKLWRvCi0gICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdj
Yywgc28gY29uZmlndXJpbmcgZ2xpYmMKLSAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIg
d29ya3MuCi0gICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBp
cyBkZWZpbmVkLCBzaW5jZQotICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5k
aW5nIGNvbXBpbGVycy4KLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJv
dWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5
bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCi0gIGNhdCBjb25mZGVmcy5o
IC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNp
ZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFz
c2VydC5oPgotI2VuZGlmCi0JCSAgICAgU3ludGF4IGVycm9yCi1fQUNFT0YKLWlmIGFjX2ZuX2Nf
dHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgotCi1lbHNlCi0gICMgQnJva2VuOiBmYWlscyBvbiB2
YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0Lmkg
Y29uZnRlc3QuJGFjX2V4dAotCi0gICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hl
Y2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCi0gICMgY2FuIGJlIGRldGVjdGVkIGFuZCBo
b3cuCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVu
ZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgotX0FDRU9GCi1p
ZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKLSAgIyBCcm9rZW46IHN1Y2Nlc3Mg
b24gaW52YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1lbHNlCi0gICMgUGFzc2VzIGJvdGggdGVzdHMu
Ci1hY19wcmVwcm9jX29rPToKLWJyZWFrCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0
LmkgY29uZnRlc3QuJGFjX2V4dAotCi1kb25lCi0jIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BS
RVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KLXJtIC1mIGNvbmZ0ZXN0
LmkgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLWlmICRhY19wcmVwcm9jX29rOyB0aGVu
IDoKLQotZWxzZQotICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
ZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBc
YCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yICQ/ICJDIHByZXByb2Nlc3NvciBcIiRDUFBc
IiBmYWlscyBzYW5pdHkgY2hlY2sKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMi
ICIkTElORU5PIiA1IDsgfQotZmkKLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1Mn
Ci1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+
JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdT
ICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRh
Y19jdl9jX2NvbXBpbGVyX2dudQotCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1l
IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxp
bmVzIGFuZCAtZS4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX0dSRVArc2V0fSIg
PSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0
ZXN0IC16ICIkR1JFUCI7IHRoZW4KLSAgYWNfcGF0aF9HUkVQX2ZvdW5kPWZhbHNlCi0gICMgTG9v
cCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1M
SVNUCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIg
aW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCi1kbwotICBJRlM9JGFzX3NhdmVf
SUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX3Byb2cgaW4g
Z3JlcCBnZ3JlcDsgZG8KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVf
ZXh0ZW5zaW9uczsgZG8KLSAgICAgIGFjX3BhdGhfR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19l
eGVjX2V4dCIKLSAgICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfR1JFUCIgJiYgJGFzX3Rlc3RfeCAi
JGFjX3BhdGhfR1JFUCI7IH0gfHwgY29udGludWUKLSMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0dS
RVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KLSAgIyBDaGVjayBmb3IgR05VICRhY19w
YXRoX0dSRVAKLWNhc2UgYCIkYWNfcGF0aF9HUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KLSpHTlUq
KQotICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiIGFjX3BhdGhfR1JFUF9mb3VuZD06
OzsKLSopCi0gIGFjX2NvdW50PTAKLSAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3Qu
aW4iCi0gIHdoaWxlIDoKLSAgZG8KLSAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4i
ID4iY29uZnRlc3QudG1wIgotICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKLSAg
ICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKLSAgICAkYXNfZWNobyAnR1JFUCcgPj4g
ImNvbmZ0ZXN0Lm5sIgotICAgICIkYWNfcGF0aF9HUkVQIiAtZSAnR1JFUCQnIC1lICctKGNhbm5v
dCBtYXRjaCktJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8
IGJyZWFrCi0gICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwg
Mj4mMSB8fCBicmVhawotICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9
JGFzX3ZhbAotICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfR1JFUF9tYXgtMH07
IHRoZW4KLSAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcg
Zm9yIGEgYmV0dGVyIG9uZQotICAgICAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIgot
ICAgICAgYWNfcGF0aF9HUkVQX21heD0kYWNfY291bnQKLSAgICBmaQotICAgICMgMTAqKDJeMTAp
IGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKLSAgICB0ZXN0ICRhY19jb3Vu
dCAtZ3QgMTAgJiYgYnJlYWsKLSAgZG9uZQotICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50
bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKLWVzYWMKLQotICAgICAgJGFjX3BhdGhfR1JF
UF9mb3VuZCAmJiBicmVhayAzCi0gICAgZG9uZQotICBkb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2
ZV9JRlMKLSAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfR1JFUCI7IHRoZW4KLSAgICBhc19mbl9l
cnJvciAkPyAibm8gYWNjZXB0YWJsZSBncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhf
U0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgIiRMSU5FTk8iIDUKLSAgZmkKLWVsc2UKLSAgYWNfY3Zf
cGF0aF9HUkVQPSRHUkVQCi1maQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wYXRoX0dSRVAiID4mNQotJGFzX2VjaG8gIiRhY19j
dl9wYXRoX0dSRVAiID4mNjsgfQotIEdSRVA9IiRhY19jdl9wYXRoX0dSRVAiCi0KLQoteyAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZWdyZXAiID4m
NQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGVncmVwLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIk
e2FjX2N2X3BhdGhfRUdSRVArc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2Fj
aGVkKSAiID4mNgotZWxzZQotICBpZiBlY2hvIGEgfCAkR1JFUCAtRSAnKGF8YiknID4vZGV2L251
bGwgMj4mMQotICAgdGhlbiBhY19jdl9wYXRoX0VHUkVQPSIkR1JFUCAtRSIKLSAgIGVsc2UKLSAg
ICAgaWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgotICBhY19wYXRoX0VHUkVQX2ZvdW5kPWZhbHNl
Ci0gICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQ
Uk9HTkFNRS1MSVNUCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZv
ciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCi1kbwotICBJRlM9
JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFj
X3Byb2cgaW4gZWdyZXA7IGRvCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRh
YmxlX2V4dGVuc2lvbnM7IGRvCi0gICAgICBhY19wYXRoX0VHUkVQPSIkYXNfZGlyLyRhY19wcm9n
JGFjX2V4ZWNfZXh0IgotICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9FR1JFUCIgJiYgJGFzX3Rl
c3RfeCAiJGFjX3BhdGhfRUdSRVAiOyB9IHx8IGNvbnRpbnVlCi0jIENoZWNrIGZvciBHTlUgYWNf
cGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgotICAjIENoZWNrIGZvciBH
TlUgJGFjX3BhdGhfRUdSRVAKLWNhc2UgYCIkYWNfcGF0aF9FR1JFUCIgLS12ZXJzaW9uIDI+JjFg
IGluCi0qR05VKikKLSAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiIGFjX3BhdGhf
RUdSRVBfZm91bmQ9Ojs7Ci0qKQotICBhY19jb3VudD0wCi0gICRhc19lY2hvX24gMDEyMzQ1Njc4
OSA+ImNvbmZ0ZXN0LmluIgotICB3aGlsZSA6Ci0gIGRvCi0gICAgY2F0ICJjb25mdGVzdC5pbiIg
ImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKLSAgICBtdiAiY29uZnRlc3QudG1wIiAiY29u
ZnRlc3QuaW4iCi0gICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCi0gICAgJGFzX2Vj
aG8gJ0VHUkVQJyA+PiAiY29uZnRlc3QubmwiCi0gICAgIiRhY19wYXRoX0VHUkVQIiAnRUdSRVAk
JyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCi0g
ICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBi
cmVhawotICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAot
ICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfRUdSRVBfbWF4LTB9OyB0aGVuCi0g
ICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJl
dHRlciBvbmUKLSAgICAgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIgotICAgICAg
YWNfcGF0aF9FR1JFUF9tYXg9JGFjX2NvdW50Ci0gICAgZmkKLSAgICAjIDEwKigyXjEwKSBjaGFy
cyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCi0gICAgdGVzdCAkYWNfY291bnQgLWd0
IDEwICYmIGJyZWFrCi0gIGRvbmUKLSAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNv
bmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Ci1lc2FjCi0KLSAgICAgICRhY19wYXRoX0VHUkVQX2Zv
dW5kICYmIGJyZWFrIDMKLSAgICBkb25lCi0gIGRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lG
UwotICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9FR1JFUCI7IHRoZW4KLSAgICBhc19mbl9lcnJv
ciAkPyAibm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NF
UEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1Ci0gIGZpCi1lbHNlCi0gIGFjX2N2X3Bh
dGhfRUdSRVA9JEVHUkVQCi1maQotCi0gICBmaQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9FR1JFUCIgPiY1Ci0kYXNfZWNo
byAiJGFjX2N2X3BhdGhfRUdSRVAiID4mNjsgfQotIEVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIK
LQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZv
ciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJ
IEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zdGRj
K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UK
LSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNv
bmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgot
I2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci0KLWludAotbWFpbiAoKQot
ewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUg
IiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGFjX2N2
X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFj
X29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0g
eWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwg
Y29udHJhcnkgdG8gQU5TSS4KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3Qu
JGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0cmluZy5oPgotCi1f
QUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVH
UkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0KLWVsc2UKLSAgYWNfY3ZfaGVh
ZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3Zf
aGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3Qg
ZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FD
RU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8
c3RkbGliLmg+Ci0KLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIp
IDI+JjUgfAotICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0KLWVsc2UK
LSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYg
dGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgt
NC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotICBp
ZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIDoKLWVsc2UKLSAgY2F0
IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZz
LmguICAqLwotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWYgKCgn
ICcgJiAweDBGRikgPT0gMHgwMjApCi0jIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYm
IChjKSA8PSAneicpCi0jIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChj
KSAtICdhJykgOiAoYykpCi0jZWxzZQotIyBkZWZpbmUgSVNMT1dFUihjKSBcCi0JCSAgICgoJ2En
IDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCi0JCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9
ICdyJykgXAotCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQotIyBkZWZpbmUg
VE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKLSNlbmRpZgotCi0j
ZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50Ci1t
YWluICgpCi17Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgaWYg
KFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQotCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQ
RVIgKGkpKQotICAgICAgcmV0dXJuIDI7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19m
bl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLQotZWxzZQotICBhY19jdl9oZWFkZXJfc3Rk
Yz1ubwotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5v
dXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5i
ZWFtIGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLWZpCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1Ci0kYXNf
ZWNobyAiJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9z
dGRjID0geWVzOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIFNURENfSEVBREVSUyAxIiA+PmNv
bmZkZWZzLmgKLQotZmkKLQotIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5o
IGFyZSBjb25mbGljdGluZy4KLWZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQu
aCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAotCQkgIGludHR5cGVzLmgg
c3RkaW50LmggdW5pc3RkLmgKLWRvIDoKLSAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3Zf
aGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19jaGVja19oZWFkZXJfY29t
cGlsZSAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVz
X2RlZmF1bHQKLSIKLWlmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMi
OyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgJGFzX2VjaG8g
IkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLQotZG9uZQot
Ci0KLQotICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibWluaXgvY29u
ZmlnLmgiICJhY19jdl9oZWFkZXJfbWluaXhfY29uZmlnX2giICIkYWNfaW5jbHVkZXNfZGVmYXVs
dCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX21pbml4X2NvbmZpZ19oIiA9IHgiInllczsgdGhl
biA6Ci0gIE1JTklYPXllcwotZWxzZQotICBNSU5JWD0KLWZpCi0KLQotICBpZiB0ZXN0ICIkTUlO
SVgiID0geWVzOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMSIgPj5j
b25mZGVmcy5oCi0KLQotJGFzX2VjaG8gIiNkZWZpbmUgX1BPU0lYXzFfU09VUkNFIDIiID4+Y29u
ZmRlZnMuaAotCi0KLSRhc19lY2hvICIjZGVmaW5lIF9NSU5JWCAxIiA+PmNvbmZkZWZzLmgKLQot
ICBmaQotCi0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVj
a2luZyB3aGV0aGVyIGl0IGlzIHNhZmUgdG8gZGVmaW5lIF9fRVhURU5TSU9OU19fIiA+JjUKLSRh
c19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgaXQgaXMgc2FmZSB0byBkZWZpbmUgX19FWFRFTlNJ
T05TX18uLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfc2FmZV90b19kZWZpbmVfX19leHRl
bnNpb25zX18rc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4m
NgotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0v
KiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSMJICBkZWZpbmUgX19FWFRFTlNJT05TX18gMQotCSAg
JGFjX2luY2x1ZGVzX2RlZmF1bHQKLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7
Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAg
YWNfY3Zfc2FmZV90b19kZWZpbmVfX19leHRlbnNpb25zX189eWVzCi1lbHNlCi0gIGFjX2N2X3Nh
ZmVfdG9fZGVmaW5lX19fZXh0ZW5zaW9uc19fPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5l
cnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zYWZlX3RvX2RlZmlu
ZV9fX2V4dGVuc2lvbnNfXyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3NhZmVfdG9fZGVmaW5lX19f
ZXh0ZW5zaW9uc19fIiA+JjY7IH0KLSAgdGVzdCAkYWNfY3Zfc2FmZV90b19kZWZpbmVfX19leHRl
bnNpb25zX18gPSB5ZXMgJiYKLSAgICAkYXNfZWNobyAiI2RlZmluZSBfX0VYVEVOU0lPTlNfXyAx
IiA+PmNvbmZkZWZzLmgKLQotICAkYXNfZWNobyAiI2RlZmluZSBfQUxMX1NPVVJDRSAxIiA+PmNv
bmZkZWZzLmgKLQotICAkYXNfZWNobyAiI2RlZmluZSBfR05VX1NPVVJDRSAxIiA+PmNvbmZkZWZz
LmgKLQotICAkYXNfZWNobyAiI2RlZmluZSBfUE9TSVhfUFRIUkVBRF9TRU1BTlRJQ1MgMSIgPj5j
b25mZGVmcy5oCi0KLSAgJGFzX2VjaG8gIiNkZWZpbmUgX1RBTkRFTV9TT1VSQ0UgMSIgPj5jb25m
ZGVmcy5oCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotJFNIRUxMICIk
YWNfYXV4X2Rpci9jb25maWcuc3ViIiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAotICBhc19mbl9l
cnJvciAkPyAiY2Fubm90IHJ1biAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgIiRMSU5F
Tk8iIDUKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2lu
ZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBidWlsZCBzeXN0
ZW0gdHlwZS4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9idWlsZCtzZXR9IiA9IHNldDsg
dGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2J1aWxkX2Fs
aWFzPSRidWlsZF9hbGlhcwotdGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCi0gIGFjX2J1
aWxkX2FsaWFzPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyJgCi10ZXN0ICJ4JGFj
X2J1aWxkX2FsaWFzIiA9IHggJiYKLSAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBndWVzcyBidWls
ZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgIiRMSU5FTk8iIDUKLWFjX2N2X2J1aWxkPWAk
U0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRhY19idWlsZF9hbGlhc2AgfHwKLSAgYXNf
Zm5fZXJyb3IgJD8gIiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlh
cyBmYWlsZWQiICIkTElORU5PIiA1Ci0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKLSRhc19lY2hvICIkYWNfY3Zf
YnVpbGQiID4mNjsgfQotY2FzZSAkYWNfY3ZfYnVpbGQgaW4KLSotKi0qKSA7OwotKikgYXNfZm5f
ZXJyb3IgJD8gImludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiAiJExJTkVOTyIgNSA7
OwotZXNhYwotYnVpbGQ9JGFjX2N2X2J1aWxkCi1hY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCi1z
ZXQgeCAkYWNfY3ZfYnVpbGQKLXNoaWZ0Ci1idWlsZF9jcHU9JDEKLWJ1aWxkX3ZlbmRvcj0kMgot
c2hpZnQ7IHNoaWZ0Ci0jIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1
c2VkIHRvIGNyZWF0ZSAkKiwKLSMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKLWJ1aWxkX29zPSQq
Ci1JRlM9JGFjX3NhdmVfSUZTCi1jYXNlICRidWlsZF9vcyBpbiAqXCAqKSBidWlsZF9vcz1gZWNo
byAiJGJ1aWxkX29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYwotCi0KLXsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1
Ci0kYXNfZWNob19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9Ci1pZiB0
ZXN0ICIke2FjX2N2X2hvc3Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2Fj
aGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiID0geDsgdGhlbgotICBh
Y19jdl9ob3N0PSRhY19jdl9idWlsZAotZWxzZQotICBhY19jdl9ob3N0PWAkU0hFTEwgIiRhY19h
dXhfZGlyL2NvbmZpZy5zdWIiICRob3N0X2FsaWFzYCB8fAotICAgIGFzX2ZuX2Vycm9yICQ/ICIk
U0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkaG9zdF9hbGlhcyBmYWlsZWQiICIkTElORU5P
IiA1Ci1maQotCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBy
ZXN1bHQ6ICRhY19jdl9ob3N0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfaG9zdCIgPiY2OyB9Ci1j
YXNlICRhY19jdl9ob3N0IGluCi0qLSotKikgOzsKLSopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlk
IHZhbHVlIG9mIGNhbm9uaWNhbCBob3N0IiAiJExJTkVOTyIgNSA7OwotZXNhYwotaG9zdD0kYWNf
Y3ZfaG9zdAotYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJwotc2V0IHggJGFjX2N2X2hvc3QKLXNo
aWZ0Ci1ob3N0X2NwdT0kMQotaG9zdF92ZW5kb3I9JDIKLXNoaWZ0OyBzaGlmdAotIyBSZW1lbWJl
ciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCi0jIGV4
Y2VwdCB3aXRoIG9sZCBzaGVsbHM6Ci1ob3N0X29zPSQqCi1JRlM9JGFjX3NhdmVfSUZTCi1jYXNl
ICRob3N0X29zIGluICpcICopIGhvc3Rfb3M9YGVjaG8gIiRob3N0X29zIiB8IHNlZCAncy8gLy0v
ZydgOzsgZXNhYwotCi0KLQotIyBNNCBNYWNybyBpbmNsdWRlcwotCi0KLQotCi0KLQotCi0KLQot
Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0K
LQotCi0KLQotCi0KLQotCi0KLSMgcGtnLm00IC0gTWFjcm9zIHRvIGxvY2F0ZSBhbmQgdXRpbGlz
ZSBwa2ctY29uZmlnLiAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KLSMgc2VyaWFsIDEgKHBr
Zy1jb25maWctMC4yNCkKLSMKLSMgQ29weXJpZ2h0IMKpIDIwMDQgU2NvdHQgSmFtZXMgUmVtbmFu
dCA8c2NvdHRAbmV0c3BsaXQuY29tPi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkK
LSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUg
TGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMg
VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs
aWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07
IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwg
NTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4K
LSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3Jh
bSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1
dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9u
IHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIFBL
R19QUk9HX1BLR19DT05GSUcoW01JTi1WRVJTSU9OXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotIyBQS0dfUFJPR19QS0dfQ09ORklHCi0KLSMgUEtHX0NIRUNLX0VYSVNU
UyhNT0RVTEVTLCBbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQotIwot
IyBDaGVjayB0byBzZWUgd2hldGhlciBhIHBhcnRpY3VsYXIgc2V0IG9mIG1vZHVsZXMgZXhpc3Rz
LiAgU2ltaWxhcgotIyB0byBQS0dfQ0hFQ0tfTU9EVUxFUygpLCBidXQgZG9lcyBub3Qgc2V0IHZh
cmlhYmxlcyBvciBwcmludCBlcnJvcnMuCi0jCi0jIFBsZWFzZSByZW1lbWJlciB0aGF0IG00IGV4
cGFuZHMgQUNfUkVRVUlSRShbUEtHX1BST0dfUEtHX0NPTkZJR10pCi0jIG9ubHkgYXQgdGhlIGZp
cnN0IG9jY3VyZW5jZSBpbiBjb25maWd1cmUuYWMsIHNvIGlmIHRoZSBmaXJzdCBwbGFjZQotIyBp
dCdzIGNhbGxlZCBtaWdodCBiZSBza2lwcGVkIChzdWNoIGFzIGlmIGl0IGlzIHdpdGhpbiBhbiAi
aWYiLCB5b3UKLSMgaGF2ZSB0byBjYWxsIFBLR19DSEVDS19FWElTVFMgbWFudWFsbHkKLSMgLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotCi0jIF9QS0dfQ09ORklHKFtWQVJJQUJMRV0sIFtDT01NQU5EXSwgW01PRFVMRVNdKQot
IyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgX1BLR19D
T05GSUcKLQotIyBfUEtHX1NIT1JUX0VSUk9SU19TVVBQT1JURUQKLSMgLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLSMgX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVECi0KLQotIyBQS0df
Q0hFQ0tfTU9EVUxFUyhWQVJJQUJMRS1QUkVGSVgsIE1PRFVMRVMsIFtBQ1RJT04tSUYtRk9VTkRd
LAotIyBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCi0jCi0jCi0jIE5vdGUgdGhhdCBpZiB0aGVyZSBp
cyBhIHBvc3NpYmlsaXR5IHRoZSBmaXJzdCBjYWxsIHRvCi0jIFBLR19DSEVDS19NT0RVTEVTIG1p
Z2h0IG5vdCBoYXBwZW4sIHlvdSBzaG91bGQgYmUgc3VyZSB0byBpbmNsdWRlIGFuCi0jIGV4cGxp
Y2l0IGNhbGwgdG8gUEtHX1BST0dfUEtHX0NPTkZJRyBpbiB5b3VyIGNvbmZpZ3VyZS5hYwotIwot
IwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotIyBQS0dfQ0hFQ0tfTU9EVUxFUwotCi0KLQotIyBXZSBkZWZpbmUsIHNlcGFy
YXRlbHksIFBUSFJFQURfQ0ZMQUdTLCBfTERGTEFHUyBhbmQgX0xJQlMKLSMgZXZlbiB0aG91Z2gg
Y3VycmVudGx5IHdlIGRvbid0IHNldCB0aGVtIHZlcnkgc2VwYXJhdGVseS4KLSMgVGhpcyBtZWFu
cyB0aGF0IHRoZSBtYWtlZmlsZXMgd2lsbCBub3QgbmVlZCB0byBjaGFuZ2UgaW4KLSMgdGhlIGZ1
dHVyZSBpZiB3ZSBtYWtlIHRoZSB0ZXN0IG1vcmUgc29waGlzdGljYXRlZC4KLQotCi0KLSMgV2Ug
aW52b2tlIEFYX1BUSFJFQURfVkFSUyB3aXRoIHRoZSBuYW1lIG9mIGFub3RoZXIgbWFjcm8KLSMg
d2hpY2ggaXMgdGhlbiBleHBhbmRlZCBvbmNlIGZvciBlYWNoIHZhcmlhYmxlLgotCi0KLQotCi0K
LQotCi0KLSMgRW5hYmxlL2Rpc2FibGUgb3B0aW9ucwotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFi
bGUtZ2l0aHR0cCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9naXRodHRwK3NldH0iID0g
c2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfZ2l0aHR0cDsKLWZpCi0KLQotaWYgdGVz
dCAieCRlbmFibGVfZ2l0aHR0cCIgPSAieG5vIjsgdGhlbiA6Ci0KLSAgICBheF9jdl9naXRodHRw
PSJuIgotCi1lbGlmIHRlc3QgIngkZW5hYmxlX2dpdGh0dHAiID0gInh5ZXMiOyB0aGVuIDoKLQot
ICAgIGF4X2N2X2dpdGh0dHA9InkiCi0KLWVsaWYgdGVzdCAteiAkYXhfY3ZfZ2l0aHR0cDsgdGhl
biA6Ci0KLSAgICBheF9jdl9naXRodHRwPSJuIgotCi1maQotZ2l0aHR0cD0kYXhfY3ZfZ2l0aHR0
cAotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1vbml0b3JzIHdhcyBnaXZlbi4KLWlm
IHRlc3QgIiR7ZW5hYmxlX21vbml0b3JzK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFs
PSRlbmFibGVfbW9uaXRvcnM7Ci1maQotCi0KLWlmIHRlc3QgIngkZW5hYmxlX21vbml0b3JzIiA9
ICJ4bm8iOyB0aGVuIDoKLQotICAgIGF4X2N2X21vbml0b3JzPSJuIgotCi1lbGlmIHRlc3QgIngk
ZW5hYmxlX21vbml0b3JzIiA9ICJ4eWVzIjsgdGhlbiA6Ci0KLSAgICBheF9jdl9tb25pdG9ycz0i
eSIKLQotZWxpZiB0ZXN0IC16ICRheF9jdl9tb25pdG9yczsgdGhlbiA6Ci0KLSAgICBheF9jdl9t
b25pdG9ycz0ieSIKLQotZmkKLW1vbml0b3JzPSRheF9jdl9tb25pdG9ycwotCi0KLQotIyBDaGVj
ayB3aGV0aGVyIC0tZW5hYmxlLXZ0cG0gd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfdnRw
bStzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIGVuYWJsZXZhbD0kZW5hYmxlX3Z0cG07Ci1maQotCi0K
LWlmIHRlc3QgIngkZW5hYmxlX3Z0cG0iID0gInhubyI7IHRoZW4gOgotCi0gICAgYXhfY3ZfdnRw
bT0ibiIKLQotZWxpZiB0ZXN0ICJ4JGVuYWJsZV92dHBtIiA9ICJ4eWVzIjsgdGhlbiA6Ci0KLSAg
ICBheF9jdl92dHBtPSJ5IgotCi1lbGlmIHRlc3QgLXogJGF4X2N2X3Z0cG07IHRoZW4gOgotCi0g
ICAgYXhfY3ZfdnRwbT0ibiIKLQotZmkKLXZ0cG09JGF4X2N2X3Z0cG0KLQotCi0KLSMgQ2hlY2sg
d2hldGhlciAtLWVuYWJsZS14ZW5hcGkgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfeGVu
YXBpK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfeGVuYXBpOwotZmkK
LQotCi1pZiB0ZXN0ICJ4JGVuYWJsZV94ZW5hcGkiID0gInhubyI7IHRoZW4gOgotCi0gICAgYXhf
Y3ZfeGVuYXBpPSJuIgotCi1lbGlmIHRlc3QgIngkZW5hYmxlX3hlbmFwaSIgPSAieHllcyI7IHRo
ZW4gOgotCi0gICAgYXhfY3ZfeGVuYXBpPSJ5IgotCi1lbGlmIHRlc3QgLXogJGF4X2N2X3hlbmFw
aTsgdGhlbiA6Ci0KLSAgICBheF9jdl94ZW5hcGk9Im4iCi0KLWZpCi14ZW5hcGk9JGF4X2N2X3hl
bmFwaQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXB5dGhvbnRvb2xzIHdhcyBnaXZl
bi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3B5dGhvbnRvb2xzK3NldH0iID0gc2V0OyB0aGVuIDoKLSAg
ZW5hYmxldmFsPSRlbmFibGVfcHl0aG9udG9vbHM7Ci1maQotCi0KLWlmIHRlc3QgIngkZW5hYmxl
X3B5dGhvbnRvb2xzIiA9ICJ4bm8iOyB0aGVuIDoKLQotICAgIGF4X2N2X3B5dGhvbnRvb2xzPSJu
IgotCi1lbGlmIHRlc3QgIngkZW5hYmxlX3B5dGhvbnRvb2xzIiA9ICJ4eWVzIjsgdGhlbiA6Ci0K
LSAgICBheF9jdl9weXRob250b29scz0ieSIKLQotZWxpZiB0ZXN0IC16ICRheF9jdl9weXRob250
b29sczsgdGhlbiA6Ci0KLSAgICBheF9jdl9weXRob250b29scz0ieSIKLQotZmkKLXB5dGhvbnRv
b2xzPSRheF9jdl9weXRob250b29scwotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW9j
YW1sdG9vbHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfb2NhbWx0b29scytzZXR9IiA9
IHNldDsgdGhlbiA6Ci0gIGVuYWJsZXZhbD0kZW5hYmxlX29jYW1sdG9vbHM7Ci1maQotCi0KLWlm
IHRlc3QgIngkZW5hYmxlX29jYW1sdG9vbHMiID0gInhubyI7IHRoZW4gOgotCi0gICAgYXhfY3Zf
b2NhbWx0b29scz0ibiIKLQotZWxpZiB0ZXN0ICJ4JGVuYWJsZV9vY2FtbHRvb2xzIiA9ICJ4eWVz
IjsgdGhlbiA6Ci0KLSAgICBheF9jdl9vY2FtbHRvb2xzPSJ5IgotCi1lbGlmIHRlc3QgLXogJGF4
X2N2X29jYW1sdG9vbHM7IHRoZW4gOgotCi0gICAgYXhfY3Zfb2NhbWx0b29scz0ieSIKLQotZmkK
LW9jYW1sdG9vbHM9JGF4X2N2X29jYW1sdG9vbHMKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVu
YWJsZS1taW5pdGVybSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9taW5pdGVybStzZXR9
IiA9IHNldDsgdGhlbiA6Ci0gIGVuYWJsZXZhbD0kZW5hYmxlX21pbml0ZXJtOwotZmkKLQotCi1p
ZiB0ZXN0ICJ4JGVuYWJsZV9taW5pdGVybSIgPSAieG5vIjsgdGhlbiA6Ci0KLSAgICBheF9jdl9t
aW5pdGVybT0ibiIKLQotZWxpZiB0ZXN0ICJ4JGVuYWJsZV9taW5pdGVybSIgPSAieHllcyI7IHRo
ZW4gOgotCi0gICAgYXhfY3ZfbWluaXRlcm09InkiCi0KLWVsaWYgdGVzdCAteiAkYXhfY3ZfbWlu
aXRlcm07IHRoZW4gOgotCi0gICAgYXhfY3ZfbWluaXRlcm09Im4iCi0KLWZpCi1taW5pdGVybT0k
YXhfY3ZfbWluaXRlcm0KLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1sb21vdW50IHdh
cyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2xvbW91bnQrc2V0fSIgPSBzZXQ7IHRoZW4gOgot
ICBlbmFibGV2YWw9JGVuYWJsZV9sb21vdW50OwotZmkKLQotCi1pZiB0ZXN0ICJ4JGVuYWJsZV9s
b21vdW50IiA9ICJ4bm8iOyB0aGVuIDoKLQotICAgIGF4X2N2X2xvbW91bnQ9Im4iCi0KLWVsaWYg
dGVzdCAieCRlbmFibGVfbG9tb3VudCIgPSAieHllcyI7IHRoZW4gOgotCi0gICAgYXhfY3ZfbG9t
b3VudD0ieSIKLQotZWxpZiB0ZXN0IC16ICRheF9jdl9sb21vdW50OyB0aGVuIDoKLQotICAgIGF4
X2N2X2xvbW91bnQ9Im4iCi0KLWZpCi1sb21vdW50PSRheF9jdl9sb21vdW50Ci0KLQotCi0jIENo
ZWNrIHdoZXRoZXIgLS1lbmFibGUtb3ZtZiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9v
dm1mK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgZW5hYmxldmFsPSRlbmFibGVfb3ZtZjsKLWZpCi0K
LQotaWYgdGVzdCAieCRlbmFibGVfb3ZtZiIgPSAieG5vIjsgdGhlbiA6Ci0KLSAgICBheF9jdl9v
dm1mPSJuIgotCi1lbGlmIHRlc3QgIngkZW5hYmxlX292bWYiID0gInh5ZXMiOyB0aGVuIDoKLQot
ICAgIGF4X2N2X292bWY9InkiCi0KLWVsaWYgdGVzdCAteiAkYXhfY3Zfb3ZtZjsgdGhlbiA6Ci0K
LSAgICBheF9jdl9vdm1mPSJuIgotCi1maQotb3ZtZj0kYXhfY3Zfb3ZtZgorIyBNNCBNYWNybyBp
bmNsdWRlcwogCiAKIAotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXJvbWJpb3Mgd2FzIGdpdmVu
LgotaWYgdGVzdCAiJHtlbmFibGVfcm9tYmlvcytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIGVuYWJs
ZXZhbD0kZW5hYmxlX3JvbWJpb3M7Ci1maQogCiAKLWlmIHRlc3QgIngkZW5hYmxlX3JvbWJpb3Mi
ID0gInhubyI7IHRoZW4gOgogCi0gICAgYXhfY3Zfcm9tYmlvcz0ibiIKIAotZWxpZiB0ZXN0ICJ4
JGVuYWJsZV9yb21iaW9zIiA9ICJ4eWVzIjsgdGhlbiA6CiAKLSAgICBheF9jdl9yb21iaW9zPSJ5
IgogCi1lbGlmIHRlc3QgLXogJGF4X2N2X3JvbWJpb3M7IHRoZW4gOgogCi0gICAgYXhfY3Zfcm9t
Ymlvcz0ieSIKIAotZmkKLXJvbWJpb3M9JGF4X2N2X3JvbWJpb3MKIAogCiAKLSMgQ2hlY2sgd2hl
dGhlciAtLWVuYWJsZS1zZWFiaW9zIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NlYWJp
b3Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9zZWFiaW9zOwotZmkK
IAogCi1pZiB0ZXN0ICJ4JGVuYWJsZV9zZWFiaW9zIiA9ICJ4bm8iOyB0aGVuIDoKIAotICAgIGF4
X2N2X3NlYWJpb3M9Im4iCiAKLWVsaWYgdGVzdCAieCRlbmFibGVfc2VhYmlvcyIgPSAieHllcyI7
IHRoZW4gOgogCi0gICAgYXhfY3Zfc2VhYmlvcz0ieSIKIAotZWxpZiB0ZXN0IC16ICRheF9jdl9z
ZWFiaW9zOyB0aGVuIDoKIAotICAgIGF4X2N2X3NlYWJpb3M9InkiCiAKLWZpCi1zZWFiaW9zPSRh
eF9jdl9zZWFiaW9zCiAKIAogCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVidWcgd2FzIGdp
dmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFi
bGV2YWw9JGVuYWJsZV9kZWJ1ZzsKLWZpCiAKIAotaWYgdGVzdCAieCRlbmFibGVfZGVidWciID0g
InhubyI7IHRoZW4gOgogCi0gICAgYXhfY3ZfZGVidWc9Im4iCiAKLWVsaWYgdGVzdCAieCRlbmFi
bGVfZGVidWciID0gInh5ZXMiOyB0aGVuIDoKIAotICAgIGF4X2N2X2RlYnVnPSJ5IgogCi1lbGlm
IHRlc3QgLXogJGF4X2N2X2RlYnVnOyB0aGVuIDoKIAotICAgIGF4X2N2X2RlYnVnPSJ5IgogCi1m
aQotZGVidWc9JGF4X2N2X2RlYnVnCiAKIAogCkBAIC00MjQwLDkzMCArMjIyMiw0MzIgQEAgZGVi
dWc9JGF4X2N2X2RlYnVnCiAKIAogCi1mb3IgY2ZsYWcgaW4gJFBSRVBFTkRfSU5DTFVERVMKLWRv
Ci0gICAgUFJFUEVORF9DRkxBR1MrPSIgLUkkY2ZsYWciCi1kb25lCi1mb3IgbGRmbGFnIGluICRQ
UkVQRU5EX0xJQgotZG8KLSAgICBQUkVQRU5EX0xERkxBR1MrPSIgLUwkbGRmbGFnIgotZG9uZQot
Zm9yIGNmbGFnIGluICRBUFBFTkRfSU5DTFVERVMKLWRvCi0gICAgQVBQRU5EX0NGTEFHUys9IiAt
SSRjZmxhZyIKLWRvbmUKLWZvciBsZGZsYWcgaW4gJEFQUEVORF9MSUIKLWRvCi0gICAgQVBQRU5E
X0xERkxBR1MrPSIgLUwkbGRmbGFnIgotZG9uZQotQ0ZMQUdTPSIkUFJFUEVORF9DRkxBR1MgJENG
TEFHUyAkQVBQRU5EX0NGTEFHUyIKLUxERkxBR1M9IiRQUkVQRU5EX0xERkxBR1MgJExERkxBR1Mg
JEFQUEVORF9MREZMQUdTIgogCiAKIAogCiAKIAorIyBwa2cubTQgLSBNYWNyb3MgdG8gbG9jYXRl
IGFuZCB1dGlsaXNlIHBrZy1jb25maWcuICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorIyBz
ZXJpYWwgMSAocGtnLWNvbmZpZy0wLjI0KQorIworIyBDb3B5cmlnaHQgwqkgMjAwNCBTY290dCBK
YW1lcyBSZW1uYW50IDxzY290dEBuZXRzcGxpdC5jb20+LgorIworIyBUaGlzIHByb2dyYW0gaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lv
biAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRo
aXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0
aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEt
MTMwNywgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQg
b2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5l
cmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBk
aXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dy
YW0uCiAKKyMgUEtHX1BST0dfUEtHX0NPTkZJRyhbTUlOLVZFUlNJT05dKQorIyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBLR19QUk9HX1BLR19DT05GSUcKIAorIyBQS0df
Q0hFQ0tfRVhJU1RTKE1PRFVMRVMsIFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1G
T1VORF0pCisjCisjIENoZWNrIHRvIHNlZSB3aGV0aGVyIGEgcGFydGljdWxhciBzZXQgb2YgbW9k
dWxlcyBleGlzdHMuICBTaW1pbGFyCisjIHRvIFBLR19DSEVDS19NT0RVTEVTKCksIGJ1dCBkb2Vz
IG5vdCBzZXQgdmFyaWFibGVzIG9yIHByaW50IGVycm9ycy4KKyMKKyMgUGxlYXNlIHJlbWVtYmVy
IHRoYXQgbTQgZXhwYW5kcyBBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSkKKyMgb25s
eSBhdCB0aGUgZmlyc3Qgb2NjdXJlbmNlIGluIGNvbmZpZ3VyZS5hYywgc28gaWYgdGhlIGZpcnN0
IHBsYWNlCisjIGl0J3MgY2FsbGVkIG1pZ2h0IGJlIHNraXBwZWQgKHN1Y2ggYXMgaWYgaXQgaXMg
d2l0aGluIGFuICJpZiIsIHlvdQorIyBoYXZlIHRvIGNhbGwgUEtHX0NIRUNLX0VYSVNUUyBtYW51
YWxseQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQogCiAKKyMgX1BLR19DT05GSUcoW1ZBUklBQkxFXSwgW0NPTU1BTkRdLCBb
TU9EVUxFU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQorIyBfUEtHX0NPTkZJRwogCisjIF9QS0dfU0hPUlRfRVJST1JTX1NVUFBPUlRFRAorIyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfUEtHX1NIT1JUX0VSUk9SU19TVVBQT1JURUQK
IAogCisjIFBLR19DSEVDS19NT0RVTEVTKFZBUklBQkxFLVBSRUZJWCwgTU9EVUxFUywgW0FDVElP
Ti1JRi1GT1VORF0sCisjIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkKKyMKKyMKKyMgTm90ZSB0aGF0
IGlmIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhlIGZpcnN0IGNhbGwgdG8KKyMgUEtHX0NIRUNL
X01PRFVMRVMgbWlnaHQgbm90IGhhcHBlbiwgeW91IHNob3VsZCBiZSBzdXJlIHRvIGluY2x1ZGUg
YW4KKyMgZXhwbGljaXQgY2FsbCB0byBQS0dfUFJPR19QS0dfQ09ORklHIGluIHlvdXIgY29uZmln
dXJlLmFjCisjCisjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBLR19DSEVDS19NT0RVTEVTCiAKLSMgQ2hlY2tzIGZv
ciBwcm9ncmFtcy4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hl
Y2tpbmcgZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0IiA+JjUKLSRhc19l
Y2hvX24gImNoZWNraW5nIGZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dC4u
LiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX1NFRCtzZXR9IiA9IHNldDsgdGhlbiA6
Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gICAgICAgICAgICBhY19zY3Jp
cHQ9cy9hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS9iYmJiYmJiYmJiYmJiYmJi
YmJiYmJiYmJiYmJiYmJiYmIvCi0gICAgIGZvciBhY19pIGluIDEgMiAzIDQgNSA2IDc7IGRvCi0g
ICAgICAgYWNfc2NyaXB0PSIkYWNfc2NyaXB0JGFzX25sJGFjX3NjcmlwdCIKLSAgICAgZG9uZQot
ICAgICBlY2hvICIkYWNfc2NyaXB0IiAyPi9kZXYvbnVsbCB8IHNlZCA5OXEgPmNvbmZ0ZXN0LnNl
ZAotICAgICB7IGFjX3NjcmlwdD07IHVuc2V0IGFjX3NjcmlwdDt9Ci0gICAgIGlmIHRlc3QgLXog
IiRTRUQiOyB0aGVuCi0gIGFjX3BhdGhfU0VEX2ZvdW5kPWZhbHNlCi0gICMgTG9vcCB0aHJvdWdo
IHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCi0gIGFz
X3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgK
LWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4K
LSAgICBmb3IgYWNfcHJvZyBpbiBzZWQgZ3NlZDsgZG8KLSAgICBmb3IgYWNfZXhlY19leHQgaW4g
JycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgICAgIGFjX3BhdGhfU0VEPSIkYXNf
ZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgotICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9TRUQi
ICYmICRhc190ZXN0X3ggIiRhY19wYXRoX1NFRCI7IH0gfHwgY29udGludWUKLSMgQ2hlY2sgZm9y
IEdOVSBhY19wYXRoX1NFRCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgotICAjIENoZWNr
IGZvciBHTlUgJGFjX3BhdGhfU0VECi1jYXNlIGAiJGFjX3BhdGhfU0VEIiAtLXZlcnNpb24gMj4m
MWAgaW4KLSpHTlUqKQotICBhY19jdl9wYXRoX1NFRD0iJGFjX3BhdGhfU0VEIiBhY19wYXRoX1NF
RF9mb3VuZD06OzsKLSopCi0gIGFjX2NvdW50PTAKLSAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4i
Y29uZnRlc3QuaW4iCi0gIHdoaWxlIDoKLSAgZG8KLSAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29u
ZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgotICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVz
dC5pbiIKLSAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKLSAgICAkYXNfZWNobyAn
JyA+PiAiY29uZnRlc3QubmwiCi0gICAgIiRhY19wYXRoX1NFRCIgLWYgY29uZnRlc3Quc2VkIDwg
ImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKLSAgICBk
aWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFr
Ci0gICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCi0gICAg
aWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9TRURfbWF4LTB9OyB0aGVuCi0gICAgICAj
IEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBv
bmUKLSAgICAgIGFjX2N2X3BhdGhfU0VEPSIkYWNfcGF0aF9TRUQiCi0gICAgICBhY19wYXRoX1NF
RF9tYXg9JGFjX2NvdW50Ci0gICAgZmkKLSAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBz
ZWVtcyBtb3JlIHRoYW4gZW5vdWdoCi0gICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFr
Ci0gIGRvbmUKLSAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNv
bmZ0ZXN0Lm91dDs7Ci1lc2FjCiAKLSAgICAgICRhY19wYXRoX1NFRF9mb3VuZCAmJiBicmVhayAz
Ci0gICAgZG9uZQotICBkb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLSAgaWYgdGVzdCAt
eiAiJGFjX2N2X3BhdGhfU0VEIjsgdGhlbgotICAgIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRh
YmxlIHNlZCBjb3VsZCBiZSBmb3VuZCBpbiBcJFBBVEgiICIkTElORU5PIiA1Ci0gIGZpCi1lbHNl
Ci0gIGFjX2N2X3BhdGhfU0VEPSRTRUQKLWZpCiAKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfU0VEIiA+JjUKLSRhc19lY2hv
ICIkYWNfY3ZfcGF0aF9TRUQiID4mNjsgfQotIFNFRD0iJGFjX2N2X3BhdGhfU0VEIgotICBybSAt
ZiBjb25mdGVzdC5zZWQKKyMgV2UgZGVmaW5lLCBzZXBhcmF0ZWx5LCBQVEhSRUFEX0NGTEFHUywg
X0xERkxBR1MgYW5kIF9MSUJTCisjIGV2ZW4gdGhvdWdoIGN1cnJlbnRseSB3ZSBkb24ndCBzZXQg
dGhlbSB2ZXJ5IHNlcGFyYXRlbHkuCisjIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWFrZWZpbGVzIHdp
bGwgbm90IG5lZWQgdG8gY2hhbmdlIGluCisjIHRoZSBmdXR1cmUgaWYgd2UgbWFrZSB0aGUgdGVz
dCBtb3JlIHNvcGhpc3RpY2F0ZWQuCiAKLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdT
JwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQg
PiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFH
UyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0k
YWNfY3ZfY19jb21waWxlcl9nbnUKLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4K
LSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNv
IGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29s
X3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5n
IGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0i
ID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYg
dGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2Vy
IG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NF
UEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0
ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAk
YWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFj
X3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhl
Y19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2Mi
Ci0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rp
ci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBk
b25lCi1JRlM9JGFzX3NhdmVfSUZTCiAKLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRl
c3QgLW4gIiRDQyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiByZXN1bHQ6ICRDQyIgPiY1Ci0kYXNfZWNobyAiJENDIiA+JjY7IH0KLWVsc2UKLSAgeyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRh
c19lY2hvICJubyIgPiY2OyB9Ci1maQogCisjIFdlIGludm9rZSBBWF9QVEhSRUFEX1ZBUlMgd2l0
aCB0aGUgbmFtZSBvZiBhbm90aGVyIG1hY3JvCisjIHdoaWNoIGlzIHRoZW4gZXhwYW5kZWQgb25j
ZSBmb3IgZWFjaCB2YXJpYWJsZS4KIAotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0NDIjsg
dGhlbgotICBhY19jdF9DQz0kQ0MKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2Mi
LCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsg
YWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVj
a2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3Jk
Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7
IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1u
ICIkYWNfY3RfQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBM
ZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJ
RlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3Nh
dmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNf
ZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAi
JGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNf
d29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSJnY2Mi
Ci0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rp
ci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBk
b25lCi1JRlM9JGFzX3NhdmVfSUZTCiAKLWZpCi1maQotYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNf
Y3RfQ0MKLWlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1Ci0kYXNfZWNobyAi
JGFjX2N0X0NDIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQogCi0g
IGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgotICAgIENDPSIiCi0gIGVsc2UKLSAgICBj
YXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29s
cyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTog
V0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0
IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgQ0M9JGFjX2N0X0NDCi0g
IGZpCi1lbHNlCi0gIENDPSIkYWNfY3ZfcHJvZ19DQyIKLWZpCiAKLWlmIHRlc3QgLXogIiRDQyI7
IHRoZW4KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICAg
IyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQg
Y2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJl
Zml4fWNjOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Ig
JGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNl
dDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3Qg
LW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVy
cmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFU
T1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAt
eiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4
ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3Jk
JGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0
IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCi0gICAg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNf
d29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1J
RlM9JGFzX3NhdmVfSUZTCiAKLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4g
IiRDQyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBy
ZXN1bHQ6ICRDQyIgPiY1Ci0kYXNfZWNobyAiJENDIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hv
ICJubyIgPiY2OyB9Ci1maQogCiAKLSAgZmkKLWZpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0g
ICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFt
IG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0k
YXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7
YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQp
ICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0i
JENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgYWNfcHJvZ19y
ZWplY3RlZD1ubwotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFz
X2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGly
IiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9l
eHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19l
eHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVu
Ci0gICAgaWYgdGVzdCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPSAiL3Vzci91Y2Iv
Y2MiOyB0aGVuCi0gICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLSAgICAgICBjb250aW51ZQot
ICAgICBmaQotICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4m
NQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwogCi1p
ZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dv
biBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15
ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgIT0gMDsgdGhlbgotICAgICMg
V2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMg
SG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBj
aG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNl
IHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRhc19k
aXIvJGFjX3dvcmQkezErJyAnfSRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9JGFjX2N2X3Byb2df
Q0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1Ci0kYXNfZWNobyAiJENDIiA+JjY7IH0KLWVs
c2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5v
IiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9CisjIEVuYWJsZS9kaXNhYmxlIG9wdGlvbnMKKwor
IyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWdpdGh0dHAgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtl
bmFibGVfZ2l0aHR0cCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2dp
dGh0dHA7CiBmaQogCiAKLWZpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gIGlmIHRlc3QgLW4g
IiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCi0gIGRvCi0g
ICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIs
IHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Rv
b2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp
bmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNo
ZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0ND
K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UK
LSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRo
ZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQ
QVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lG
UwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBp
biAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19k
aXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQk
YWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19DQz0iJGFjX3Rvb2xfcHJlZml4
JGFjX3Byb2ciCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91
bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQot
ZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCitpZiB0ZXN0ICJ4JGVuYWJsZV9naXRodHRw
IiA9ICJ4bm8iOyB0aGVuIDoKIAotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAt
biAiJENDIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IHJlc3VsdDogJENDIiA+JjUKLSRhc19lY2hvICIkQ0MiID4mNjsgfQotZWxzZQotICB7ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2Vj
aG8gIm5vIiA+JjY7IH0KLWZpCisgICAgYXhfY3ZfZ2l0aHR0cD0ibiIKIAorZWxpZiB0ZXN0ICJ4
JGVuYWJsZV9naXRodHRwIiA9ICJ4eWVzIjsgdGhlbiA6CiAKLSAgICB0ZXN0IC1uICIkQ0MiICYm
IGJyZWFrCi0gIGRvbmUKLWZpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gIGFjX2N0X0NDPSRD
QwotICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29y
ZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgot
c2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJj
aGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19h
Y19jdF9DQytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2
Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19j
dF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UK
LWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBB
VEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGly
PS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsg
ZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNf
dGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2
X3Byb2dfYWNfY3RfQ0M9IiRhY19wcm9nIgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAg
IGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUworICAgIGF4X2N2
X2dpdGh0dHA9InkiCisKK2VsaWYgdGVzdCAteiAkYXhfY3ZfZ2l0aHR0cDsgdGhlbiA6CisKKyAg
ICBheF9jdl9naXRodHRwPSJuIgogCiBmaQotZmkKLWFjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0
X0NDCi1pZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQotJGFzX2VjaG8gIiRh
Y19jdF9DQyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKK2dpdGh0
dHA9JGF4X2N2X2dpdGh0dHAKIAogCi0gIHRlc3QgLW4gIiRhY19jdF9DQyIgJiYgYnJlYWsKLWRv
bmUKIAotICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KLSAgICBDQz0iIgotICBlbHNl
Ci0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jv
c3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKLSRhc19lY2hvICIk
YXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3Qg
dHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwotICAgIENDPSRhY19j
dF9DQwotICBmaQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1vbml0b3JzIHdhcyBnaXZlbi4K
K2lmIHRlc3QgIiR7ZW5hYmxlX21vbml0b3JzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxl
dmFsPSRlbmFibGVfbW9uaXRvcnM7CiBmaQogCi1maQogCitpZiB0ZXN0ICJ4JGVuYWJsZV9tb25p
dG9ycyIgPSAieG5vIjsgdGhlbiA6CiAKLXRlc3QgLXogIiRDQyIgJiYgeyB7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0k
YXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJv
ciAkPyAibm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAotU2VlIFxgY29u
ZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUgOyB9CisgICAgYXhfY3ZfbW9u
aXRvcnM9Im4iCiAKLSMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxl
ci4KLSRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBD
IGNvbXBpbGVyIHZlcnNpb24iID4mNQotc2V0IFggJGFjX2NvbXBpbGUKLWFjX2NvbXBpbGVyPSQy
Ci1mb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247IGRvCi0gIHsgeyBh
Y190cnk9IiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIKLWNhc2UgIigoJGFjX3RyeSIgaW4K
LSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3Ry
eV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8i
OyB9ID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IikgMj5jb25mdGVz
dC5lcnIKLSAgYWNfc3RhdHVzPSQ/Ci0gIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0g
ICAgc2VkICcxMGFcCi0uLi4gcmVzdCBvZiBzdGRlcnIgb3V0cHV0IGRlbGV0ZWQgLi4uCi0gICAg
ICAgICAxMHEnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCi0gICAgY2F0IGNvbmZ0ZXN0LmVy
MSA+JjUKLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgotICAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAg
dGVzdCAkYWNfc3RhdHVzID0gMDsgfQotZG9uZQorZWxpZiB0ZXN0ICJ4JGVuYWJsZV9tb25pdG9y
cyIgPSAieHllcyI7IHRoZW4gOgogCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlciIg
PiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMg
Y29tcGlsZXIuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfY19jb21waWxlcl9nbnUrc2V0
fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBj
YXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRl
ZnMuaC4gICovCisgICAgYXhfY3ZfbW9uaXRvcnM9InkiCiAKLWludAotbWFpbiAoKQotewotI2lm
bmRlZiBfX0dOVUNfXwotICAgICAgIGNob2tlIG1lCi0jZW5kaWYKK2VsaWYgdGVzdCAteiAkYXhf
Y3ZfbW9uaXRvcnM7IHRoZW4gOgogCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFj
X2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY29tcGlsZXJfZ251PXll
cwotZWxzZQotICBhY19jb21waWxlcl9nbnU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVy
ciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWFjX2N2X2NfY29tcGlsZXJf
Z251PSRhY19jb21waWxlcl9nbnUKKyAgICBheF9jdl9tb25pdG9ycz0ieSIKIAogZmkKLXsgJGFz
X2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19jb21w
aWxlcl9nbnUiID4mNQotJGFzX2VjaG8gIiRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2OyB9Ci1p
ZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBH
Q0M9Ci1maQotYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQotYWNfc2F2ZV9DRkxBR1M9JENG
TEFHUwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3
aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIg
JENDIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19nK3Nl
dH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAg
YWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9mbGFnCi0gICBhY19jX3dlcnJvcl9m
bGFnPXllcwotICAgYWNfY3ZfcHJvZ19jY19nPW5vCi0gICBDRkxBR1M9Ii1nIgotICAgY2F0IGNv
bmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmgu
ICAqLworbW9uaXRvcnM9JGF4X2N2X21vbml0b3JzCiAKLWludAotbWFpbiAoKQotewogCi0gIDsK
LSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8i
OyB0aGVuIDoKLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBDRkxBR1M9IiIKLSAgICAg
IGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25m
ZGVmcy5oLiAgKi8KIAotaW50Ci1tYWluICgpCi17CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUt
dnRwbSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV92dHBtK3NldH0iID0gc2V0OyB0aGVu
IDoKKyAgZW5hYmxldmFsPSRlbmFibGVfdnRwbTsKK2ZpCiAKLSAgOwotICByZXR1cm4gMDsKLX0K
LV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgogCi1lbHNl
Ci0gIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwotCSBDRkxBR1M9Ii1n
IgotCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQg
Y29uZmRlZnMuaC4gICovCitpZiB0ZXN0ICJ4JGVuYWJsZV92dHBtIiA9ICJ4bm8iOyB0aGVuIDoK
IAotaW50Ci1tYWluICgpCi17CisgICAgYXhfY3ZfdnRwbT0ibiIKKworZWxpZiB0ZXN0ICJ4JGVu
YWJsZV92dHBtIiA9ICJ4eWVzIjsgdGhlbiA6CisKKyAgICBheF9jdl92dHBtPSJ5IgorCitlbGlm
IHRlc3QgLXogJGF4X2N2X3Z0cG07IHRoZW4gOgorCisgICAgYXhfY3ZfdnRwbT0ibiIKIAotICA7
Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5P
IjsgdGhlbiA6Ci0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0
LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1ybSAtZiBjb3Jl
IGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1y
bSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19l
eHQKLSAgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwotZmkKLXsgJGFz
X2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19j
Y19nIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KLWlmIHRlc3QgIiRh
Y190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUwotZWxp
ZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5
ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0g
IGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIi
Ci0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCiBmaQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4
OSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNP
IEM4OS4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2M4OStzZXR9IiA9IHNl
dDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGFjX2N2X3By
b2dfY2NfYzg5PW5vCi1hY19zYXZlX0NDPSRDQwotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+
Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGFy
Zy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVk
ZSA8c3lzL3N0YXQuaD4KLS8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc3RvbGVu
IGZyb20gUkNTIDUuNydzIHNyYy9jb25mLnNoLiAgKi8KLXN0cnVjdCBidWYgeyBpbnQgeDsgfTsK
LUZJTEUgKiAoKnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7Ci1z
dGF0aWMgY2hhciAqZSAocCwgaSkKLSAgICAgY2hhciAqKnA7Ci0gICAgIGludCBpOwotewotICBy
ZXR1cm4gcFtpXTsKLX0KLXN0YXRpYyBjaGFyICpmIChjaGFyICogKCpnKSAoY2hhciAqKiwgaW50
KSwgY2hhciAqKnAsIC4uLikKLXsKLSAgY2hhciAqczsKLSAgdmFfbGlzdCB2OwotICB2YV9zdGFy
dCAodixwKTsKLSAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKLSAgdmFfZW5kICh2KTsKLSAg
cmV0dXJuIHM7Ci19Cit2dHBtPSRheF9jdl92dHBtCiAKLS8qIE9TRiA0LjAgQ29tcGFxIGNjIGlz
IHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCi0gICBmdW5jdGlv
biBwcm90b3R5cGVzIGFuZCBzdHVmZiwgYnV0IG5vdCAnXHhISCcgaGV4IGNoYXJhY3RlciBjb25z
dGFudHMuCi0gICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9yIHVuZm9ydHVuYXRlbHksIGlu
c3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKLSAgIGFzICd4Jy4gIFRoZSBmb2xsb3dpbmcgaW5k
dWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZCBpcyBhZGRlZCB0byBnZXQKLSAgIHByb3BlciBBTlNJ
IG1vZGUuICBDdXJpb3VzbHkgJ1x4MDAnIT0neCcgYWx3YXlzIGNvbWVzIG91dCB0cnVlLCBmb3Ig
YW4KLSAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgw
MCc9PTAgdG8gZ2V0IHNvbWV0aGluZwotICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQuICAq
LwotaW50IG9zZjRfY2NfYXJyYXkgWydceDAwJyA9PSAwID8gMSA6IC0xXTsKIAotLyogSUJNIEMg
NiBmb3IgQUlYIGlzIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQsIGJ1dCBpdCByZXBsYWNlcyBtYWNy
byBwYXJhbWV0ZXJzCi0gICBpbnNpZGUgc3RyaW5ncyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4g
ICovCi0jZGVmaW5lIEZPTyh4KSAneCcKLWludCB4bGM2X2NjX2FycmF5W0ZPTyhhKSA9PSAneCcg
PyAxIDogLTFdOwogCi1pbnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKLXN0cnVjdCBzMSB7aW50
ICgqZikgKGludCBhKTt9Owotc3RydWN0IHMyIHtpbnQgKCpmKSAoZG91YmxlIGEpO307Ci1pbnQg
cGFpcm5hbWVzIChpbnQsIGNoYXIgKiosIEZJTEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBz
dGF0ICosIGludCksIGludCwgaW50KTsKLWludCBhcmdjOwotY2hhciAqKmFyZ3Y7Ci1pbnQKLW1h
aW4gKCkKLXsKLXJldHVybiBmIChlLCBhcmd2LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwgYXJn
diwgMSkgIT0gYXJndlsxXTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotZm9yIGFjX2Fy
ZyBpbiAnJyAtcWxhbmdsdmw9ZXh0Yzg5IC1xbGFuZ2x2bD1hbnNpIC1zdGQgXAotCS1BZSAiLUFh
IC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCi1kbwotICBDQz0iJGFjX3Nh
dmVfQ0MgJGFjX2FyZyIKLSAgaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4g
OgotICBhY19jdl9wcm9nX2NjX2M4OT0kYWNfYXJnCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUt
eGVuYXBpIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3hlbmFwaStzZXR9IiA9IHNldDsg
dGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3hlbmFwaTsKIGZpCi1ybSAtZiBjb3JlIGNvbmZ0
ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0Ci0gIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODki
ICE9ICJ4bm8iICYmIGJyZWFrCi1kb25lCi1ybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci1DQz0kYWNf
c2F2ZV9DQworCisKK2lmIHRlc3QgIngkZW5hYmxlX3hlbmFwaSIgPSAieG5vIjsgdGhlbiA6CisK
KyAgICBheF9jdl94ZW5hcGk9Im4iCisKK2VsaWYgdGVzdCAieCRlbmFibGVfeGVuYXBpIiA9ICJ4
eWVzIjsgdGhlbiA6CisKKyAgICBheF9jdl94ZW5hcGk9InkiCisKK2VsaWYgdGVzdCAteiAkYXhf
Y3ZfeGVuYXBpOyB0aGVuIDoKKworICAgIGF4X2N2X3hlbmFwaT0ibiIKIAogZmkKLSMgQUNfQ0FD
SEVfVkFMCi1jYXNlICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiBpbgotICB4KQotICAgIHsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub25lIG5lZWRlZCIgPiY1
Ci0kYXNfZWNobyAibm9uZSBuZWVkZWQiID4mNjsgfSA7OwotICB4bm8pCi0gICAgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHVuc3VwcG9ydGVkIiA+JjUK
LSRhc19lY2hvICJ1bnN1cHBvcnRlZCIgPiY2OyB9IDs7Ci0gICopCi0gICAgQ0M9IiRDQyAkYWNf
Y3ZfcHJvZ19jY19jODkiCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2M4OSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3By
b2dfY2NfYzg5IiA+JjY7IH0gOzsKLWVzYWMKLWlmIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODki
ICE9IHhubzsgdGhlbiA6Cit4ZW5hcGk9JGF4X2N2X3hlbmFwaQorCiAKKworIyBDaGVjayB3aGV0
aGVyIC0tZW5hYmxlLXB5dGhvbnRvb2xzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3B5
dGhvbnRvb2xzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfcHl0aG9u
dG9vbHM7CiBmaQogCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBp
bGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xp
bms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1Mg
Y29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29t
cGlsZXJfZ251CiAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hl
Y2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0
aGVyIGxuIC1zIHdvcmtzLi4uICIgPiY2OyB9Ci1MTl9TPSRhc19sbl9zCi1pZiB0ZXN0ICIkTE5f
UyIgPSAibG4gLXMiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci1lbHNlCi0gIHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubywgdXNpbmcg
JExOX1MiID4mNQotJGFzX2VjaG8gIm5vLCB1c2luZyAkTE5fUyIgPiY2OyB9CitpZiB0ZXN0ICJ4
JGVuYWJsZV9weXRob250b29scyIgPSAieG5vIjsgdGhlbiA6CisKKyAgICBheF9jdl9weXRob250
b29scz0ibiIKKworZWxpZiB0ZXN0ICJ4JGVuYWJsZV9weXRob250b29scyIgPSAieHllcyI7IHRo
ZW4gOgorCisgICAgYXhfY3ZfcHl0aG9udG9vbHM9InkiCisKK2VsaWYgdGVzdCAteiAkYXhfY3Zf
cHl0aG9udG9vbHM7IHRoZW4gOgorCisgICAgYXhfY3ZfcHl0aG9udG9vbHM9InkiCisKIGZpCitw
eXRob250b29scz0kYXhfY3ZfcHl0aG9udG9vbHMKIAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1B
S0UpIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMg
XCQoTUFLRSkuLi4gIiA+JjY7IH0KLXNldCB4ICR7TUFLRS1tYWtlfQotYWNfbWFrZT1gJGFzX2Vj
aG8gIiQyIiB8IHNlZCAncy8rL3AvZzsgcy9bXmEtekEtWjAtOV9dL18vZydgCi1pZiBldmFsICJ0
ZXN0IFwiXCR7YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0K3NldH1cIiIgPSBzZXQ7IHRo
ZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0
Lm1ha2UgPDxcX0FDRU9GCi1TSEVMTCA9IC9iaW4vc2gKLWFsbDoKLQlAZWNobyAnQEBAJSUlPSQo
TUFLRSk9QEBAJSUlJwotX0FDRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2Vb
MV06IEVudGVyaW5nIC4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1jYXNlIGAke01BS0Ut
bWFrZX0gLWYgY29uZnRlc3QubWFrZSAyPi9kZXYvbnVsbGAgaW4KLSAgKkBAQCUlJT0/Kj1AQEAl
JSUqKQotICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllczs7Ci0gICop
Ci0gICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm87OwotZXNhYwotcm0g
LWYgY29uZnRlc3QubWFrZQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1vY2FtbHRvb2xz
IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX29jYW1sdG9vbHMrc2V0fSIgPSBzZXQ7IHRo
ZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9vY2FtbHRvb2xzOwogZmkKLWlmIGV2YWwgdGVzdCBc
JGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCA9IHllczsgdGhlbgotICB7ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKLSRhc19lY2hv
ICJ5ZXMiID4mNjsgfQotICBTRVRfTUFLRT0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9
Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKKworCitpZiB0ZXN0ICJ4JGVuYWJsZV9v
Y2FtbHRvb2xzIiA9ICJ4bm8iOyB0aGVuIDoKKworICAgIGF4X2N2X29jYW1sdG9vbHM9Im4iCisK
K2VsaWYgdGVzdCAieCRlbmFibGVfb2NhbWx0b29scyIgPSAieHllcyI7IHRoZW4gOgorCisgICAg
YXhfY3Zfb2NhbWx0b29scz0ieSIKKworZWxpZiB0ZXN0IC16ICRheF9jdl9vY2FtbHRvb2xzOyB0
aGVuIDoKKworICAgIGF4X2N2X29jYW1sdG9vbHM9InkiCisKIGZpCitvY2FtbHRvb2xzPSRheF9j
dl9vY2FtbHRvb2xzCiAKLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVy
IGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5v
dGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoK
LSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRj
L2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQW1p
Z2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNj
cwotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91
dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRs
ZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVz
IHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyBPUy8yJ3Mgc3lzdGVtIGlu
c3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCi0jIC4vaW5z
dGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5z
dGFsbC5zaC4KLSMgUmVqZWN0IGluc3RhbGwgcHJvZ3JhbXMgdGhhdCBjYW5ub3QgaW5zdGFsbCBt
dWx0aXBsZSBmaWxlcy4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
Y2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci0kYXNfZWNob19uICJj
aGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsLi4uICIgPiY2OyB9Ci1pZiB0ZXN0
IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0i
ID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYXNf
c2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAot
ZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgot
ICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRI
IGVsZW1lbnRzLgotY2FzZSAkYXNfZGlyLyBpbiAjKCgKLSAgLi8gfCAuLy8gfCAvW2NDXS8qIHwg
XAotICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9h
ZnN3cy9iaW4vKiB8IFwKLSAgPzpbXFwvXW9zMltcXC9daW5zdGFsbFtcXC9dKiB8ID86W1xcL11P
UzJbXFwvXUlOU1RBTExbXFwvXSogfCBcCi0gIC91c3IvdWNiLyogKSA7OwotICAqKQotICAgICMg
T1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0g
ICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVm
ZiBhcyByb290Ci0gICAgIyBieSBkZWZhdWx0LgotICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxs
IHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhl
Y3V0YWJsZV9leHRlbnNpb25zOyBkbwotCWlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRh
Y19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7
IH07IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAgIGdyZXAgZHNw
bXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4K
LQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252
ZW50aW9uLgotCSAgICA6Ci0JICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAg
IGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+
JjE7IHRoZW4KLQkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkg
SFAgcHdwbHVzLS1kb24ndCB1c2UuCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgcm0gLXJmIGNvbmZ0
ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCi0JICAgIGVjaG8gb25lID4gY29uZnRl
c3Qub25lCi0JICAgIGVjaG8gdHdvID4gY29uZnRlc3QudHdvCi0JICAgIG1rZGlyIGNvbmZ0ZXN0
LmRpcgotCSAgICBpZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLWMgY29uZnRlc3Qu
b25lIGNvbmZ0ZXN0LnR3byAiYHB3ZGAvY29uZnRlc3QuZGlyIiAmJgotCSAgICAgIHRlc3QgLXMg
Y29uZnRlc3Qub25lICYmIHRlc3QgLXMgY29uZnRlc3QudHdvICYmCi0JICAgICAgdGVzdCAtcyBj
b25mdGVzdC5kaXIvY29uZnRlc3Qub25lICYmCi0JICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIv
Y29uZnRlc3QudHdvCi0JICAgIHRoZW4KLQkgICAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19k
aXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCi0JICAgICAgYnJlYWsgMwotCSAgICBmaQotCSAg
ZmkKLQlmaQotICAgICAgZG9uZQotICAgIGRvbmUKLSAgICA7OwotZXNhYwogCi0gIGRvbmUKLUlG
Uz0kYXNfc2F2ZV9JRlMKIAotcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRl
c3QuZGlyCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWluaXRlcm0gd2FzIGdpdmVuLgoraWYg
dGVzdCAiJHtlbmFibGVfbWluaXRlcm0rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9
JGVuYWJsZV9taW5pdGVybTsKK2ZpCisKKworaWYgdGVzdCAieCRlbmFibGVfbWluaXRlcm0iID0g
InhubyI7IHRoZW4gOgorCisgICAgYXhfY3ZfbWluaXRlcm09Im4iCisKK2VsaWYgdGVzdCAieCRl
bmFibGVfbWluaXRlcm0iID0gInh5ZXMiOyB0aGVuIDoKKworICAgIGF4X2N2X21pbml0ZXJtPSJ5
IgorCitlbGlmIHRlc3QgLXogJGF4X2N2X21pbml0ZXJtOyB0aGVuIDoKKworICAgIGF4X2N2X21p
bml0ZXJtPSJuIgogCiBmaQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9
IHNldDsgdGhlbgotICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAotICBlbHNlCi0gICAg
IyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2Fj
aGUgYQotICAgICMgdmFsdWUgZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwg
YmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBj
YWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVl
IGlzIGEgcmVsYXRpdmUgbmFtZS4KLSAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCi0gIGZpCitt
aW5pdGVybT0kYXhfY3ZfbWluaXRlcm0KKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1s
b21vdW50IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2xvbW91bnQrc2V0fSIgPSBzZXQ7
IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9sb21vdW50OwogZmkKLXsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkSU5TVEFMTCIgPiY1Ci0kYXNfZWNo
byAiJElOU1RBTEwiID4mNjsgfQogCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1p
c2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xv
c2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RB
TExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwogCi10ZXN0IC16ICIk
SU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JworaWYgdGVzdCAi
eCRlbmFibGVfbG9tb3VudCIgPSAieG5vIjsgdGhlbiA6CiAKLXRlc3QgLXogIiRJTlNUQUxMX0RB
VEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisgICAgYXhfY3ZfbG9tb3Vu
dD0ibiIKIAotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJiaXNvbiIsIHNvIGl0IGNhbiBi
ZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYmlzb247IGFjX3dvcmQ9JDIK
LXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRh
Y193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsg
fQotaWYgdGVzdCAiJHthY19jdl9wYXRoX0JJU09OK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFz
X2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2FzZSAkQklTT04gaW4KLSAgW1xcL10q
IHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfQklTT049IiRCSVNPTiIgIyBMZXQgdGhlIHVzZXIg
b3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIGFzX3NhdmVfSUZT
PSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElG
Uz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3Ig
YWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0
ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNf
ZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3BhdGhfQklTT049
IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1
Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCitlbGlm
IHRlc3QgIngkZW5hYmxlX2xvbW91bnQiID0gInh5ZXMiOyB0aGVuIDoKKworICAgIGF4X2N2X2xv
bW91bnQ9InkiCisKK2VsaWYgdGVzdCAteiAkYXhfY3ZfbG9tb3VudDsgdGhlbiA6CisKKyAgICBh
eF9jdl9sb21vdW50PSJuIgogCi0gIDs7Ci1lc2FjCiBmaQotQklTT049JGFjX2N2X3BhdGhfQklT
T04KLWlmIHRlc3QgLW4gIiRCSVNPTiI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCSVNPTiIgPiY1Ci0kYXNfZWNobyAiJEJJU09OIiA+
JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBy
ZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Citsb21vdW50PSRheF9jdl9sb21v
dW50CisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtb3ZtZiB3YXMgZ2l2ZW4uCitpZiB0
ZXN0ICIke2VuYWJsZV9vdm1mK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFi
bGVfb3ZtZjsKIGZpCiAKIAotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJmbGV4Iiwgc28g
aXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBmbGV4OyBhY193
b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5n
IGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4g
IiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9GTEVYK3NldH0iID0gc2V0OyB0aGVuIDoK
LSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2FzZSAkRkxFWCBpbgotICBb
XFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9GTEVYPSIkRkxFWCIgIyBMZXQgdGhlIHVz
ZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIGFzX3NhdmVf
SUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0g
IElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBm
b3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYg
eyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIk
YXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3BhdGhfRkxF
WD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+
JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKK2lm
IHRlc3QgIngkZW5hYmxlX292bWYiID0gInhubyI7IHRoZW4gOgorCisgICAgYXhfY3Zfb3ZtZj0i
biIKKworZWxpZiB0ZXN0ICJ4JGVuYWJsZV9vdm1mIiA9ICJ4eWVzIjsgdGhlbiA6CisKKyAgICBh
eF9jdl9vdm1mPSJ5IgorCitlbGlmIHRlc3QgLXogJGF4X2N2X292bWY7IHRoZW4gOgorCisgICAg
YXhfY3Zfb3ZtZj0ibiIKIAotICA7OwotZXNhYwogZmkKLUZMRVg9JGFjX2N2X3BhdGhfRkxFWAot
aWYgdGVzdCAtbiAiJEZMRVgiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogcmVzdWx0OiAkRkxFWCIgPiY1Ci0kYXNfZWNobyAiJEZMRVgiID4mNjsgfQot
ZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDog
bm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KK292bWY9JGF4X2N2X292bWYKKworCisKKyMg
Q2hlY2sgd2hldGhlciAtLWVuYWJsZS1yb21iaW9zIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5h
YmxlX3JvbWJpb3Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9yb21i
aW9zOwogZmkKIAogCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInBlcmwiLCBzbyBpdCBj
YW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHBlcmw7IGFjX3dvcmQ9
JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9y
ICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4m
NjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX1BFUkwrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAk
YXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRQRVJMIGluCi0gIFtcXC9d
KiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX1BFUkw9IiRQRVJMIiAjIExldCB0aGUgdXNlciBv
dmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9
JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZT
PSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBh
Y19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRl
c3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19k
aXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9QRVJMPSIk
YXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQot
ICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUworaWYgdGVz
dCAieCRlbmFibGVfcm9tYmlvcyIgPSAieG5vIjsgdGhlbiA6CisKKyAgICBheF9jdl9yb21iaW9z
PSJuIgorCitlbGlmIHRlc3QgIngkZW5hYmxlX3JvbWJpb3MiID0gInh5ZXMiOyB0aGVuIDoKKwor
ICAgIGF4X2N2X3JvbWJpb3M9InkiCisKK2VsaWYgdGVzdCAteiAkYXhfY3Zfcm9tYmlvczsgdGhl
biA6CisKKyAgICBheF9jdl9yb21iaW9zPSJ5IgogCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1BF
UkwiICYmIGFjX2N2X3BhdGhfUEVSTD0ibm8iCi0gIDs7Ci1lc2FjCiBmaQotUEVSTD0kYWNfY3Zf
cGF0aF9QRVJMCi1pZiB0ZXN0IC1uICIkUEVSTCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQRVJMIiA+JjUKLSRhc19lY2hvICIkUEVS
TCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQorcm9tYmlvcz0kYXhfY3Zf
cm9tYmlvcworCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNlYWJpb3Mgd2FzIGdpdmVu
LgoraWYgdGVzdCAiJHtlbmFibGVfc2VhYmlvcytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJs
ZXZhbD0kZW5hYmxlX3NlYWJpb3M7CitmaQorCisKK2lmIHRlc3QgIngkZW5hYmxlX3NlYWJpb3Mi
ID0gInhubyI7IHRoZW4gOgorCisgICAgYXhfY3Zfc2VhYmlvcz0ibiIKKworZWxpZiB0ZXN0ICJ4
JGVuYWJsZV9zZWFiaW9zIiA9ICJ4eWVzIjsgdGhlbiA6CisKKyAgICBheF9jdl9zZWFiaW9zPSJ5
IgorCitlbGlmIHRlc3QgLXogJGF4X2N2X3NlYWJpb3M7IHRoZW4gOgorCisgICAgYXhfY3Zfc2Vh
Ymlvcz0ieSIKKworZmkKK3NlYWJpb3M9JGF4X2N2X3NlYWJpb3MKKworCisKKyMgQ2hlY2sgd2hl
dGhlciAtLWVuYWJsZS1kZWJ1ZyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9kZWJ1Zytz
ZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2RlYnVnOworZmkKKworCitp
ZiB0ZXN0ICJ4JGVuYWJsZV9kZWJ1ZyIgPSAieG5vIjsgdGhlbiA6CisKKyAgICBheF9jdl9kZWJ1
Zz0ibiIKKworZWxpZiB0ZXN0ICJ4JGVuYWJsZV9kZWJ1ZyIgPSAieHllcyI7IHRoZW4gOgorCisg
ICAgYXhfY3ZfZGVidWc9InkiCisKK2VsaWYgdGVzdCAteiAkYXhfY3ZfZGVidWc7IHRoZW4gOgor
CisgICAgYXhfY3ZfZGVidWc9InkiCisKIGZpCitkZWJ1Zz0kYXhfY3ZfZGVidWcKKworCisKKwor
CisKKworCitmb3IgY2ZsYWcgaW4gJFBSRVBFTkRfSU5DTFVERVMKK2RvCisgICAgUFJFUEVORF9D
RkxBR1MrPSIgLUkkY2ZsYWciCitkb25lCitmb3IgbGRmbGFnIGluICRQUkVQRU5EX0xJQgorZG8K
KyAgICBQUkVQRU5EX0xERkxBR1MrPSIgLUwkbGRmbGFnIgorZG9uZQorZm9yIGNmbGFnIGluICRB
UFBFTkRfSU5DTFVERVMKK2RvCisgICAgQVBQRU5EX0NGTEFHUys9IiAtSSRjZmxhZyIKK2RvbmUK
K2ZvciBsZGZsYWcgaW4gJEFQUEVORF9MSUIKK2RvCisgICAgQVBQRU5EX0xERkxBR1MrPSIgLUwk
bGRmbGFnIgorZG9uZQorQ0ZMQUdTPSIkUFJFUEVORF9DRkxBR1MgJENGTEFHUyAkQVBQRU5EX0NG
TEFHUyIKK0xERkxBR1M9IiRQUkVQRU5EX0xERkxBR1MgJExERkxBR1MgJEFQUEVORF9MREZMQUdT
IgorCisKIAogCi1pZiB0ZXN0IHgiJHtQRVJMfSIgPT0geCJubyIKLXRoZW4KLSAgICBhc19mbl9l
cnJvciAkPyAiVW5hYmxlIHRvIGZpbmQgcGVybCwgcGxlYXNlIGluc3RhbGwgcGVybCIgIiRMSU5F
Tk8iIDUKLWZpCi1pZiB0ZXN0ICJ4JHhhcGkiID0gInh5IjsgdGhlbiA6CiAKLSAgICAjIEV4dHJh
Y3QgdGhlIGZpcnN0IHdvcmQgb2YgImN1cmwtY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3Jh
bSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjdXJsLWNvbmZpZzsgYWNfd29yZD0kMgorCisK
KworCisKKworCisKKworIyBDaGVja3MgZm9yIHByb2dyYW1zLgorYWNfZXh0PWMKK2FjX2NwcD0n
JENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29u
ZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRD
RkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNf
Y29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoraWYgdGVzdCAtbiAiJGFjX3Rvb2xf
cHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9w
cmVmaXh9Z2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBk
dW1teSAke2FjX3Rvb2xfcHJlZml4fWdjYzsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2Vj
aG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2
X3BhdGhfQ1VSTCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mr
c2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQot
ICBjYXNlICRDVVJMIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX0NVUkw9
IiRDVVJMIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAg
OzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBpZiB0
ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIg
b3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQ
QVJBVE9SCiBmb3IgYXNfZGlyIGluICRQQVRICiBkbwogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRl
c3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRh
Y19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNf
d29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVj
X2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX0NVUkw9IiRhc19kaXIvJGFjX3dvcmQkYWNf
ZXhlY19leHQiCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2MiCiAgICAg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNf
d29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQpAQCAtNTE3MSw0NCArMjY1
NSwzOSBAQCBkb25lCiAgIGRvbmUKIElGUz0kYXNfc2F2ZV9JRlMKIAotICB0ZXN0IC16ICIkYWNf
Y3ZfcGF0aF9DVVJMIiAmJiBhY19jdl9wYXRoX0NVUkw9Im5vIgotICA7OwotZXNhYwogZmkKLUNV
Ukw9JGFjX2N2X3BhdGhfQ1VSTAotaWYgdGVzdCAtbiAiJENVUkwiOyB0aGVuCi0gIHsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1VSTCIgPiY1Ci0kYXNf
ZWNobyAiJENVUkwiID4mNjsgfQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIk
Q0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVz
dWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRDQyIgPiY2OyB9CiBlbHNlCiAgIHsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiAkYXNfZWNobyAi
bm8iID4mNjsgfQogZmkKIAogCi1pZiB0ZXN0IHgiJHtDVVJMfSIgPT0geCJubyIKLXRoZW4KLSAg
ICBhc19mbl9lcnJvciAkPyAiVW5hYmxlIHRvIGZpbmQgY3VybC1jb25maWcsIHBsZWFzZSBpbnN0
YWxsIGN1cmwtY29uZmlnIiAiJExJTkVOTyIgNQogZmkKLSAgICAjIEV4dHJhY3QgdGhlIGZpcnN0
IHdvcmQgb2YgInhtbDItY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGgg
YXJncy4KLXNldCBkdW1teSB4bWwyLWNvbmZpZzsgYWNfd29yZD0kMgoraWYgdGVzdCAteiAiJGFj
X2N2X3Byb2dfQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICAjIEV4dHJhY3QgdGhlIGZpcnN0
IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitz
ZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2lu
ZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9YTUwrc2V0
fSIgPSBzZXQ7IHRoZW4gOgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0g
c2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgY2FzZSAk
WE1MIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX1hNTD0iJFhNTCIgIyBM
ZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0g
IGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgaWYgdGVzdCAtbiAiJGFj
X2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRo
ZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQ
QVRIX1NFUEFSQVRPUgogZm9yIGFzX2RpciBpbiAkUEFUSAogZG8KICAgSUZTPSRhc19zYXZlX0lG
UwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBp
biAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwogICBpZiB7IHRlc3QgLWYgIiRhc19k
aXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQk
YWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9YTUw9IiRhc19kaXIvJGFjX3dv
cmQkYWNfZXhlY19leHQiCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgogICAgICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQk
YWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkKQEAgLTUyMTYsMzkgKzI2OTUsNDMg
QEAgZG9uZQogICBkb25lCiBJRlM9JGFzX3NhdmVfSUZTCiAKLSAgdGVzdCAteiAiJGFjX2N2X3Bh
dGhfWE1MIiAmJiBhY19jdl9wYXRoX1hNTD0ibm8iCi0gIDs7Ci1lc2FjCiBmaQotWE1MPSRhY19j
dl9wYXRoX1hNTAotaWYgdGVzdCAtbiAiJFhNTCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRYTUwiID4mNQotJGFzX2VjaG8gIiRYTUwi
ID4mNjsgfQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIk
YWNfY3RfQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9CiBl
bHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBu
byIgPiY1CiAkYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAotCi1pZiB0ZXN0IHgiJHtYTUx9IiA9
PSB4Im5vIgotdGhlbgotICAgIGFzX2ZuX2Vycm9yICQ/ICJVbmFibGUgdG8gZmluZCB4bWwyLWNv
bmZpZywgcGxlYXNlIGluc3RhbGwgeG1sMi1jb25maWciICIkTElORU5PIiA1Ci1maQotCisgIGlm
IHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgorICAgIENDPSIiCisgIGVsc2UKKyAgICBjYXNl
ICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBu
b3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FS
TklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+
JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ0M9JGFjX2N0X0NDCisgIGZp
CitlbHNlCisgIENDPSIkYWNfY3ZfcHJvZ19DQyIKIGZpCi1pZiB0ZXN0ICJ4JG9jYW1sdG9vbHMi
ID0gInh5IjsgdGhlbiA6CiAKLSAgICAgICMgY2hlY2tpbmcgZm9yIG9jYW1sYwotICBpZiB0ZXN0
IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBv
ZiAiJHthY190b29sX3ByZWZpeH1vY2FtbGMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUg
d2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2NhbWxjOyBhY193b3JkPSQy
CitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgICAgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xf
cHJlZml4IjsgdGhlbgorICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29s
X3ByZWZpeH1jYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQg
ZHVtbXkgJHthY190b29sX3ByZWZpeH1jYzsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2Vj
aG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2
X3Byb2dfT0NBTUxDK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19D
QytzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNl
Ci0gIGlmIHRlc3QgLW4gIiRPQ0FNTEMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfT0NBTUxDPSIkT0NB
TUxDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgaWYgdGVzdCAtbiAiJEND
IjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRo
ZSB0ZXN0LgogZWxzZQogYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgogZm9y
IGFzX2RpciBpbiAkUEFUSApAQCAtNTI1Nyw3ICsyNzQwLDcgQEAgZG8KICAgdGVzdCAteiAiJGFz
X2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFi
bGVfZXh0ZW5zaW9uczsgZG8KICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4
ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsg
dGhlbgotICAgIGFjX2N2X3Byb2dfT0NBTUxDPSIke2FjX3Rvb2xfcHJlZml4fW9jYW1sYyIKKyAg
ICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWNjIgogICAgICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19l
eHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkKQEAgLTUyNjcsMjkgKzI3NTAsMzAgQEAgSUZTPSRh
c19zYXZlX0lGUwogCiBmaQogZmkKLU9DQU1MQz0kYWNfY3ZfcHJvZ19PQ0FNTEMKLWlmIHRlc3Qg
LW4gIiRPQ0FNTEMiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiAkT0NBTUxDIiA+JjUKLSRhc19lY2hvICIkT0NBTUxDIiA+JjY7IH0KK0ND
PSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQorJGFzX2VjaG8gIiRD
QyIgPiY2OyB9CiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogcmVzdWx0OiBubyIgPiY1CiAkYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAogCisgIGZpCiBm
aQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT0NBTUxDIjsgdGhlbgotICBhY19jdF9PQ0FNTEM9
JE9DQU1MQwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm9jYW1sYyIsIHNvIGl0IGNh
biBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgb2NhbWxjOyBhY193b3Jk
PSQyCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBv
ZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15
IGNjOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFj
X3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9PQ0FNTEMrc2V0
fSIgPSBzZXQ7IHRoZW4gOgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0
aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgaWYgdGVzdCAtbiAi
JGFjX2N0X09DQU1MQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTEM9IiRhY19jdF9P
Q0FNTEMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBpZiB0ZXN0IC1uICIk
Q0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUg
dGhlIHRlc3QuCiBlbHNlCisgIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KIGFzX3NhdmVfSUZTPSRJRlM7
IElGUz0kUEFUSF9TRVBBUkFUT1IKIGZvciBhc19kaXIgaW4gJFBBVEgKIGRvCkBAIC01Mjk3LDcg
KzI3ODEsMTEgQEAgZG8KICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3Ig
YWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KICAgaWYgeyB0
ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNf
ZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3Rf
T0NBTUxDPSJvY2FtbGMiCisgICAgaWYgdGVzdCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4
dCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKyAg
ICAgICBjb250aW51ZQorICAgICBmaQorICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgogICAgICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQk
YWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkKQEAgLTUzMDUsNjEgKzI3OTMsNDQg
QEAgZG9uZQogICBkb25lCiBJRlM9JGFzX3NhdmVfSUZTCiAKK2lmIHRlc3QgJGFjX3Byb2dfcmVq
ZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBt
YWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgorICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAg
c2hpZnQKKyAgaWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVu
dCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhl
IHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3Qg
aWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1l
LgorICAgIHNoaWZ0CisgICAgYWNfY3ZfcHJvZ19DQz0iJGFzX2Rpci8kYWNfd29yZCR7MSsnICd9
JEAiCisgIGZpCiBmaQogZmkKLWFjX2N0X09DQU1MQz0kYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTEMK
LWlmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTEMiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0NBTUxDIiA+JjUKLSRhc19lY2hv
ICIkYWNfY3RfT0NBTUxDIiA+JjY7IH0KK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAt
biAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQogZWxzZQogICB7ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQogJGFzX2Vj
aG8gIm5vIiA+JjY7IH0KIGZpCiAKLSAgaWYgdGVzdCAieCRhY19jdF9PQ0FNTEMiID0geDsgdGhl
bgotICAgIE9DQU1MQz0ibm8iCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFj
X3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0
IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9v
bHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9
eWVzIDs7Ci1lc2FjCi0gICAgT0NBTUxDPSRhY19jdF9PQ0FNTEMKLSAgZmkKLWVsc2UKLSAgT0NB
TUxDPSIkYWNfY3ZfcHJvZ19PQ0FNTEMiCi1maQotCi0KLSAgaWYgdGVzdCAiJE9DQU1MQyIgIT0g
Im5vIjsgdGhlbgotICAgICBPQ0FNTFZFUlNJT049YCRPQ0FNTEMgLXYgfCBzZWQgLW4gLWUgJ3N8
Lip2ZXJzaW9uKiAqXCguKlwpJHxcMXxwJ2AKLSAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IE9DYW1sIHZlcnNpb24gaXMgJE9DQU1MVkVSU0lPTiIg
PiY1Ci0kYXNfZWNobyAiT0NhbWwgdmVyc2lvbiBpcyAkT0NBTUxWRVJTSU9OIiA+JjY7IH0KLSAg
ICAgIyBJZiBPQ0FNTExJQiBpcyBzZXQsIHVzZSBpdAotICAgICBpZiB0ZXN0ICIkT0NBTUxMSUIi
ID0gIiI7IHRoZW4KLSAgICAgICAgT0NBTUxMSUI9YCRPQ0FNTEMgLXdoZXJlIDI+L2Rldi9udWxs
IHx8ICRPQ0FNTEMgLXZ8dGFpbCAtMXxjdXQgLWQgJyAnIC1mIDRgCi0gICAgIGVsc2UKLSAgICAg
ICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IE9DQU1M
TElCIHByZXZpb3VzbHkgc2V0OyBwcmVzZXJ2aW5nIGl0LiIgPiY1Ci0kYXNfZWNobyAiT0NBTUxM
SUIgcHJldmlvdXNseSBzZXQ7IHByZXNlcnZpbmcgaXQuIiA+JjY7IH0KLSAgICAgZmkKLSAgICAg
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IE9DYW1sIGxp
YnJhcnkgcGF0aCBpcyAkT0NBTUxMSUIiID4mNQotJGFzX2VjaG8gIk9DYW1sIGxpYnJhcnkgcGF0
aCBpcyAkT0NBTUxMSUIiID4mNjsgfQotCi0KIAotCi0gICAgICMgY2hlY2tpbmcgZm9yIG9jYW1s
b3B0Ci0gICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0
IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9jYW1sb3B0Iiwgc28gaXQgY2Fu
IGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4
fW9jYW1sb3B0OyBhY193b3JkPSQyCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBpZiB0
ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGNsLmV4ZQor
ICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFj
X3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15
ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNo
b19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zf
cHJvZ19PQ0FNTE9QVCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiB0ZXN0ICIke2FjX2N2X3Byb2df
Q0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxz
ZQotICBpZiB0ZXN0IC1uICIkT0NBTUxPUFQiOyB0aGVuCi0gIGFjX2N2X3Byb2dfT0NBTUxPUFQ9
IiRPQ0FNTE9QVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGlmIHRlc3Qg
LW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVy
cmlkZSB0aGUgdGVzdC4KIGVsc2UKIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFU
T1IKIGZvciBhc19kaXIgaW4gJFBBVEgKQEAgLTUzNjgsNyArMjgzOSw3IEBAIGRvCiAgIHRlc3Qg
LXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19l
eGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29y
ZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4
dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX09DQU1MT1BUPSIke2FjX3Rvb2xfcHJlZml4fW9j
YW1sb3B0IgorICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgogICAg
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFj
X3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkKQEAgLTUzNzgsMjggKzI4
NDksMzIgQEAgSUZTPSRhc19zYXZlX0lGUwogCiBmaQogZmkKLU9DQU1MT1BUPSRhY19jdl9wcm9n
X09DQU1MT1BUCi1pZiB0ZXN0IC1uICIkT0NBTUxPUFQiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0NBTUxPUFQiID4mNQotJGFzX2Vj
aG8gIiRPQ0FNTE9QVCIgPiY2OyB9CitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJEND
IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQogZWxzZQogICB7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQogJGFzX2VjaG8gIm5v
IiA+JjY7IH0KIGZpCiAKIAorICAgIHRlc3QgLW4gIiRDQyIgJiYgYnJlYWsKKyAgZG9uZQogZmkK
LWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX09DQU1MT1BUIjsgdGhlbgotICBhY19jdF9PQ0FNTE9Q
VD0kT0NBTUxPUFQKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvY2FtbG9wdCIsIHNv
IGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgb2NhbWxvcHQ7
IGFjX3dvcmQ9JDIKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgIGZv
ciBhY19wcm9nIGluIGNsLmV4ZQorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIk
YWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVt
bXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5n
IGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X09D
QU1MT1BUK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9D
QytzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNl
Ci0gIGlmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTE9QVCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19j
dF9PQ0FNTE9QVD0iJGFjX2N0X09DQU1MT1BUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUg
dGVzdC4KKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0
X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgogZWxzZQog
YXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgogZm9yIGFzX2RpciBpbiAkUEFU
SApAQCAtNTQwOCw3ICsyODgzLDcgQEAgZG8KICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGly
PS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsg
ZG8KICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNf
dGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2
X3Byb2dfYWNfY3RfT0NBTUxPUFQ9Im9jYW1sb3B0IgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9
IiRhY19wcm9nIgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZv
dW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkK
QEAgLTU0MTYsMTkgKzI4OTEsMjMgQEAgZG9uZQogICBkb25lCiBJRlM9JGFzX3NhdmVfSUZTCiAK
LWZpCi1maQotYWNfY3RfT0NBTUxPUFQ9JGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxPUFQKLWlmIHRl
c3QgLW4gIiRhY19jdF9PQ0FNTE9QVCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9PQ0FNTE9QVCIgPiY1Ci0kYXNfZWNobyAi
JGFjX2N0X09DQU1MT1BUIiA+JjY7IH0KK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNf
Y3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CiskYXNfZWNobyAi
JGFjX2N0X0NDIiA+JjY7IH0KIGVsc2UKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKICRhc19lY2hvICJubyIgPiY2OyB9CiBmaQogCi0g
IGlmIHRlc3QgIngkYWNfY3RfT0NBTUxPUFQiID0geDsgdGhlbgotICAgIE9DQU1MT1BUPSJubyIK
KworICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCitkb25lCisKKyAgaWYgdGVzdCAieCRh
Y19jdF9DQyIgPSB4OyB0aGVuCisgICAgQ0M9IiIKICAgZWxzZQogICAgIGNhc2UgJGNyb3NzX2Nv
bXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KIHllczopCkBAIC01NDM2LDM5NiArMjkxNSw2NDkg
QEAgeWVzOikKICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5v
dCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KIGFjX3Rvb2xfd2FybmVkPXllcyA7
OwogZXNhYwotICAgIE9DQU1MT1BUPSRhY19jdF9PQ0FNTE9QVAorICAgIENDPSRhY19jdF9DQwog
ICBmaQotZWxzZQotICBPQ0FNTE9QVD0iJGFjX2N2X3Byb2dfT0NBTUxPUFQiCiBmaQogCi0gICAg
IE9DQU1MQkVTVD1ieXRlCi0gICAgIGlmIHRlc3QgIiRPQ0FNTE9QVCIgPSAibm8iOyB0aGVuCi0J
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBDYW5ub3Qg
ZmluZCBvY2FtbG9wdDsgYnl0ZWNvZGUgY29tcGlsYXRpb24gb25seS4iID4mNQotJGFzX2VjaG8g
IiRhc19tZTogV0FSTklORzogQ2Fubm90IGZpbmQgb2NhbWxvcHQ7IGJ5dGVjb2RlIGNvbXBpbGF0
aW9uIG9ubHkuIiA+JjI7fQotICAgICBlbHNlCi0JVE1QVkVSU0lPTj1gJE9DQU1MT1BUIC12IHwg
c2VkIC1uIC1lICdzfC4qdmVyc2lvbiogKlwoLipcKSR8XDF8cCcgYAotCWlmIHRlc3QgIiRUTVBW
RVJTSU9OIiAhPSAiJE9DQU1MVkVSU0lPTiIgOyB0aGVuCi0JICAgIHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB2ZXJzaW9ucyBkaWZmZXJzIGZyb20gb2Nh
bWxjOyBvY2FtbG9wdCBkaXNjYXJkZWQuIiA+JjUKLSRhc19lY2hvICJ2ZXJzaW9ucyBkaWZmZXJz
IGZyb20gb2NhbWxjOyBvY2FtbG9wdCBkaXNjYXJkZWQuIiA+JjY7IH0KLQkgICAgT0NBTUxPUFQ9
bm8KLQllbHNlCi0JICAgIE9DQU1MQkVTVD1vcHQKK2ZpCisKKwordGVzdCAteiAiJENDIiAmJiB7
IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFj
X3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYy
O30KK2FzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQ
QVRICitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNSA7IH0K
KworIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgorJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIg
dmVyc2lvbiIgPiY1CitzZXQgWCAkYWNfY29tcGlsZQorYWNfY29tcGlsZXI9JDIKK2ZvciBhY19v
cHRpb24gaW4gLS12ZXJzaW9uIC12IC1WIC1xdmVyc2lvbjsgZG8KKyAgeyB7IGFjX3RyeT0iJGFj
X2NvbXBpbGVyICRhY19vcHRpb24gPiY1IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwg
KlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFj
X3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Cisg
IChldmFsICIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiKSAyPmNvbmZ0ZXN0LmVycgorICBh
Y19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBzZWQgJzEw
YVwKKy4uLiByZXN0IG9mIHN0ZGVyciBvdXRwdXQgZGVsZXRlZCAuLi4KKyAgICAgICAgIDEwcScg
Y29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICBm
aQorICBybSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19z
dGF0dXMgPSAwOyB9Citkb25lCisKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0
LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAg
OworICByZXR1cm4gMDsKK30KK19BQ0VPRgorYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5f
ZmlsZXMKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5vdXQuZFNZTSBh
LmV4ZSBiLm91dCIKKyMgVHJ5IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgLW8gZmly
c3QsIGRpc3JlZ2FyZCBhLm91dC4KKyMgSXQgd2lsbCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBj
b21waWxlcnMsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KKyMgb2YgZXhlZXh0LgoreyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRo
ZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhl
IEMgY29tcGlsZXIgd29ya3MuLi4gIiA+JjY7IH0KK2FjX2xpbmtfZGVmYXVsdD1gJGFzX2VjaG8g
IiRhY19saW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCisKKyMgVGhlIHBvc3Np
YmxlIG91dHB1dCBmaWxlczoKK2FjX2ZpbGVzPSJhLm91dCBjb25mdGVzdC5leGUgY29uZnRlc3Qg
YS5leGUgYV9vdXQuZXhlIGIub3V0IGNvbmZ0ZXN0LioiCisKK2FjX3JtZmlsZXM9Citmb3IgYWNf
ZmlsZSBpbiAkYWNfZmlsZXMKK2RvCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQg
fCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8
ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7CisgICAgKiApIGFjX3Jt
ZmlsZXM9IiRhY19ybWZpbGVzICRhY19maWxlIjs7CisgIGVzYWMKK2RvbmUKK3JtIC1mICRhY19y
bWZpbGVzCisKK2lmIHsgeyBhY190cnk9IiRhY19saW5rX2RlZmF1bHQiCitjYXNlICIoKCRhY190
cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAq
KSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3Ry
eV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rX2RlZmF1bHQiKSAyPiY1CisgIGFjX3N0
YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAk
YWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6CisgICMgQXV0
b2NvbmYtMi4xMyBjb3VsZCBzZXQgdGhlIGFjX2N2X2V4ZWV4dCB2YXJpYWJsZSB0byBgbm8nLgor
IyBTbyBpZ25vcmUgYSB2YWx1ZSBvZiBgbm8nLCBvdGhlcndpc2UgdGhpcyB3b3VsZCBsZWFkIHRv
IGBFWEVFWFQgPSBubycKKyMgaW4gYSBNYWtlZmlsZS4gIFdlIHNob3VsZCBub3Qgb3ZlcnJpZGUg
YWNfY3ZfZXhlZXh0IGlmIGl0IHdhcyBjYWNoZWQsCisjIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNo
b3J0LWNpcmN1aXQgdGhpcyB0ZXN0IGZvciBjb21waWxlcnMgdW5rbm93biB0bworIyBBdXRvY29u
Zi4KK2ZvciBhY19maWxlIGluICRhY19maWxlcyAnJworZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUi
IHx8IGNvbnRpbnVlCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2Zm
IHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwg
Ki5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApCisJOzsKKyAgICBbYWJdLm91dCApCisJIyBX
ZSBmb3VuZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlzIG1vc3QKKwkj
IGNlcnRhaW5seSByaWdodC4KKwlicmVhazs7CisgICAgKi4qICkKKwlpZiB0ZXN0ICIke2FjX2N2
X2V4ZWV4dCtzZXR9IiA9IHNldCAmJiB0ZXN0ICIkYWNfY3ZfZXhlZXh0IiAhPSBubzsKKwl0aGVu
IDo7IGVsc2UKKwkgICBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4u
KlwpJ2AKIAlmaQotICAgICBmaQorCSMgV2Ugc2V0IGFjX2N2X2V4ZWV4dCBoZXJlIGJlY2F1c2Ug
dGhlIGxhdGVyIHRlc3QgZm9yIGl0IGlzIG5vdAorCSMgc2FmZTogY3Jvc3MgY29tcGlsZXJzIG1h
eSBub3QgYWRkIHRoZSBzdWZmaXggaWYgZ2l2ZW4gYW4gYC1vJworCSMgYXJndW1lbnQsIHNvIHdl
IG1heSBuZWVkIHRvIGtub3cgaXQgYXQgdGhhdCBwb2ludCBhbHJlYWR5LgorCSMgRXZlbiBpZiB0
aGlzIHNlY3Rpb24gbG9va3MgY3J1ZnR5OiBpdCBoYXMgdGhlIGFkdmFudGFnZSBvZgorCSMgYWN0
dWFsbHkgd29ya2luZy4KKwlicmVhazs7CisgICAgKiApCisJYnJlYWs7OworICBlc2FjCitkb25l
Cit0ZXN0ICIkYWNfY3ZfZXhlZXh0IiA9IG5vICYmIGFjX2N2X2V4ZWV4dD0KKworZWxzZQorICBh
Y19maWxlPScnCitmaQoraWYgdGVzdCAteiAiJGFjX2ZpbGUiOyB0aGVuIDoKKyAgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hv
ICJubyIgPiY2OyB9CiskYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUK
K3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworeyB7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNf
ZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciA3
NyAiQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCitTZWUgXGBjb25maWcubG9n
JyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNSA7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAi
eWVzIiA+JjY7IH0KK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZSIgPiY1Cisk
YXNfZWNob19uICJjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5h
bWUuLi4gIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiAkYWNfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFjX2ZpbGUiID4mNjsgfQorYWNfZXhl
ZXh0PSRhY19jdl9leGVleHQKKworcm0gLWYgLXIgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBjb25m
dGVzdCRhY19jdl9leGVleHQgYi5vdXQKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19z
YXZlCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZv
ciBzdWZmaXggb2YgZXhlY3V0YWJsZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN1
ZmZpeCBvZiBleGVjdXRhYmxlcy4uLiAiID4mNjsgfQoraWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsi
CitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89
XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5
X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCisk
YXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQor
ICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
XCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgor
ICAjIElmIGJvdGggYGNvbmZ0ZXN0LmV4ZScgYW5kIGBjb25mdGVzdCcgYXJlIGBwcmVzZW50JyAo
d2VsbCwgb2JzZXJ2YWJsZSkKKyMgY2F0Y2ggYGNvbmZ0ZXN0LmV4ZScuICBGb3IgaW5zdGFuY2Ug
d2l0aCBDeWd3aW4sIGBscyBjb25mdGVzdCcgd2lsbAorIyB3b3JrIHByb3Blcmx5IChpLmUuLCBy
ZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKKyMgYHJtJy4KK2Zv
ciBhY19maWxlIGluIGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBjb25mdGVzdC4qOyBkbworICB0ZXN0
IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFj
X2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICou
YmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKKyAgICAqLiog
KSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKKwkgIGJy
ZWFrOzsKKyAgICAqICkgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgIHsgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4m
NQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5f
ZXJyb3IgJD8gImNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNv
bXBpbGUgYW5kIGxpbmsKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElO
RU5PIiA1IDsgfQorZmkKK3JtIC1mIGNvbmZ0ZXN0IGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAoreyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9leGVl
eHQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9leGVleHQiID4mNjsgfQogCitybSAtZiBjb25mdGVz
dC4kYWNfZXh0CitFWEVFWFQ9JGFjX2N2X2V4ZWV4dAorYWNfZXhlZXh0PSRFWEVFWFQKK2NhdCBj
b25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5o
LiAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgoraW50CittYWluICgpCit7CitGSUxFICpmID0gZm9w
ZW4gKCJjb25mdGVzdC5vdXQiLCAidyIpOworIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAo
ZikgIT0gMDsKIAorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCithY19jbGVhbl9maWxlcz0i
JGFjX2NsZWFuX2ZpbGVzIGNvbmZ0ZXN0Lm91dCIKKyMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIg
cHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCisjIHRoZSBj
b21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCit7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNv
bXBpbGluZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBj
b21waWxpbmcuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsg
dGhlbgorICB7IHsgYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwi
KiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hv
PSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4m
NQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVz
dCAkYWNfc3RhdHVzID0gMDsgfQorICBpZiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19jdl9leGVl
eHQnCisgIHsgeyBjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNf
dHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2
YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9l
Y2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY190cnki
KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsg
fTsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz1ubworICBlbHNlCisgICAgaWYgdGVzdCAiJGNy
b3NzX2NvbXBpbGluZyIgPSBtYXliZTsgdGhlbgorCWNyb3NzX2NvbXBpbGluZz15ZXMKKyAgICBl
bHNlCisJeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBp
biBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdk
JzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1z
LgorSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuCitTZWUgXGBj
b25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNSA7IH0KKyAgICBmaQorICBm
aQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAk
Y3Jvc3NfY29tcGlsaW5nIiA+JjUKKyRhc19lY2hvICIkY3Jvc3NfY29tcGlsaW5nIiA+JjY7IH0K
IAotICAgICAjIGNoZWNraW5nIGZvciBvY2FtbGMub3B0Ci0gICAgIGlmIHRlc3QgLW4gIiRhY190
b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rv
b2xfcHJlZml4fW9jYW1sYy5vcHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBh
cmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2NhbWxjLm9wdDsgYWNfd29yZD0kMgot
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFj
X3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9
Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfT0NBTUxDRE9UT1BUK3NldH0iID0gc2V0OyB0aGVuIDoK
K3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGNvbmZ0ZXN0Lm91
dAorYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKK3sgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmls
ZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMu
Li4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfb2JqZXh0K3NldH0iID0gc2V0OyB0aGVuIDoK
ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgaWYgdGVzdCAtbiAiJE9DQU1M
Q0RPVE9QVCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19PQ0FNTENET1RPUFQ9IiRPQ0FNTENET1RPUFQi
ICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElG
UzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRh
c19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19l
eGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3Qg
LWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIv
JGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19PQ0FNTENET1RP
UFQ9IiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxjLm9wdCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+
JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKKyAg
Y2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZk
ZWZzLmguICAqLwogCi1maQotZmkKLU9DQU1MQ0RPVE9QVD0kYWNfY3ZfcHJvZ19PQ0FNTENET1RP
UFQKLWlmIHRlc3QgLW4gIiRPQ0FNTENET1RPUFQiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0NBTUxDRE9UT1BUIiA+JjUKLSRhc19l
Y2hvICIkT0NBTUxDRE9UT1BUIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9
Ci1maQoraW50CittYWluICgpCit7CiAKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0g
LWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKK2lmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgor
Y2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwk
YWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9l
Y2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFz
X2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+JjUK
KyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoK
KyAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QubyBjb25mdGVzdC5vYmogY29uZnRlc3QuKjsgZG8K
KyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlOworICBjYXNlICRhY19maWxlIGluCisg
ICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAq
LmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNICkgOzsKKyAgICAqKSBhY19jdl9v
YmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKKyAgICAgICBicmVhazs7Cisg
IGVzYWMKK2RvbmUKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2Fz
OiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKK3sgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4m
NQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5f
ZXJyb3IgJD8gImNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBj
b21waWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNSA7
IH0KIGZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19PQ0FNTENET1RPUFQiOyB0aGVuCi0gIGFj
X2N0X09DQU1MQ0RPVE9QVD0kT0NBTUxDRE9UT1BUCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29y
ZCBvZiAib2NhbWxjLm9wdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3Mu
Ci1zZXQgZHVtbXkgb2NhbWxjLm9wdDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9f
biAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3By
b2dfYWNfY3RfT0NBTUxDRE9UT1BUK3NldH0iID0gc2V0OyB0aGVuIDoKK3JtIC1mIGNvbmZ0ZXN0
LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKKyRhc19lY2hv
ICIkYWNfY3Zfb2JqZXh0IiA+JjY7IH0KK09CSkVYVD0kYWNfY3Zfb2JqZXh0CithY19vYmpleHQ9
JE9CSkVYVAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2lu
ZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQorJGFzX2VjaG9f
biAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICIg
PiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2NfY29tcGlsZXJfZ251K3NldH0iID0gc2V0OyB0aGVu
IDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgaWYgdGVzdCAtbiAiJGFj
X2N0X09DQU1MQ0RPVE9QVCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTENET1RPUFQ9
IiRhY19jdF9PQ0FNTENET1RPUFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0Lgot
ZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBp
biAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBh
c19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNp
b25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYm
ICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAg
YWNfY3ZfcHJvZ19hY19jdF9PQ0FNTENET1RPUFQ9Im9jYW1sYy5vcHQiCi0gICAgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19l
eGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3Nh
dmVfSUZTCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8q
IGVuZCBjb25mZGVmcy5oLiAgKi8KIAotZmkKLWZpCi1hY19jdF9PQ0FNTENET1RPUFQ9JGFjX2N2
X3Byb2dfYWNfY3RfT0NBTUxDRE9UT1BUCi1pZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxDRE9UT1BU
IjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJGFjX2N0X09DQU1MQ0RPVE9QVCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X09DQU1MQ0RPVE9Q
VCIgPiY2OyB9CitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgX19HTlVDX18KKyAgICAgICBjaG9r
ZSBtZQorI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190
cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jb21waWxlcl9nbnU9eWVzCiBlbHNl
Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIg
PiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQorICBhY19jb21waWxlcl9nbnU9bm8KIGZpCitybSAt
ZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQK
K2FjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKIAotICBpZiB0ZXN0ICJ4JGFj
X2N0X09DQU1MQ0RPVE9QVCIgPSB4OyB0aGVuCi0gICAgT0NBTUxDRE9UT1BUPSJubyIKLSAgZWxz
ZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNy
b3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAi
JGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0
IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBPQ0FNTENE
T1RPUFQ9JGFjX2N0X09DQU1MQ0RPVE9QVAotICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNQor
JGFzX2VjaG8gIiRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2OyB9CitpZiB0ZXN0ICRhY19jb21w
aWxlcl9nbnUgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcwogZWxzZQotICBPQ0FNTENET1RPUFQ9IiRh
Y19jdl9wcm9nX09DQU1MQ0RPVE9QVCIKKyAgR0NDPQogZmkKLQotICAgICBpZiB0ZXN0ICIkT0NB
TUxDRE9UT1BUIiAhPSAibm8iOyB0aGVuCi0JVE1QVkVSU0lPTj1gJE9DQU1MQ0RPVE9QVCAtdiB8
IHNlZCAtbiAtZSAnc3wuKnZlcnNpb24qICpcKC4qXCkkfFwxfHAnIGAKLQlpZiB0ZXN0ICIkVE1Q
VkVSU0lPTiIgIT0gIiRPQ0FNTFZFUlNJT04iIDsgdGhlbgotCSAgICB7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogdmVyc2lvbnMgZGlmZmVycyBmcm9tIG9j
YW1sYzsgb2NhbWxjLm9wdCBkaXNjYXJkZWQuIiA+JjUKLSRhc19lY2hvICJ2ZXJzaW9ucyBkaWZm
ZXJzIGZyb20gb2NhbWxjOyBvY2FtbGMub3B0IGRpc2NhcmRlZC4iID4mNjsgfQotCWVsc2UKLQkg
ICAgT0NBTUxDPSRPQ0FNTENET1RPUFQKLQlmaQotICAgICBmaQotCi0gICAgICMgY2hlY2tpbmcg
Zm9yIG9jYW1sb3B0Lm9wdAotICAgICBpZiB0ZXN0ICIkT0NBTUxPUFQiICE9ICJubyIgOyB0aGVu
Ci0JaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZp
cnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxvcHQub3B0Iiwgc28gaXQgY2FuIGJl
IGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW9j
YW1sb3B0Lm9wdDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcg
Zm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfT0NBTUxPUFRE
T1RPUFQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQor
YWNfc2F2ZV9DRkxBR1M9JENGTEFHUworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKKyRhc19lY2hvX24g
ImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7
YWNfY3ZfcHJvZ19jY19nK3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hl
ZCkgIiA+JjYKIGVsc2UKLSAgaWYgdGVzdCAtbiAiJE9DQU1MT1BURE9UT1BUIjsgdGhlbgotICBh
Y19jdl9wcm9nX09DQU1MT1BURE9UT1BUPSIkT0NBTUxPUFRET1RPUFQiICMgTGV0IHRoZSB1c2Vy
IG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NF
UEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0
ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAk
YWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFj
X3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhl
Y19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19PQ0FNTE9QVERPVE9QVD0iJHthY190b29s
X3ByZWZpeH1vY2FtbG9wdC5vcHQiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJl
YWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCisgIGFjX3NhdmVfY193
ZXJyb3JfZmxhZz0kYWNfY193ZXJyb3JfZmxhZworICAgYWNfY193ZXJyb3JfZmxhZz15ZXMKKyAg
IGFjX2N2X3Byb2dfY2NfZz1ubworICAgQ0ZMQUdTPSItZyIKKyAgIGNhdCBjb25mZGVmcy5oIC0g
PDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAotZmkK
LWZpCi1PQ0FNTE9QVERPVE9QVD0kYWNfY3ZfcHJvZ19PQ0FNTE9QVERPVE9QVAotaWYgdGVzdCAt
biAiJE9DQU1MT1BURE9UT1BUIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IHJlc3VsdDogJE9DQU1MT1BURE9UT1BUIiA+JjUKLSRhc19lY2hvICIkT0NB
TUxPUFRET1RPUFQiID4mNjsgfQoraW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsK
K30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBh
Y19jdl9wcm9nX2NjX2c9eWVzCiBlbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKKyAg
Q0ZMQUdTPSIiCisgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNf
ZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKK2ludAorbWFpbiAoKQorewogCi1maQotaWYg
dGVzdCAteiAiJGFjX2N2X3Byb2dfT0NBTUxPUFRET1RPUFQiOyB0aGVuCi0gIGFjX2N0X09DQU1M
T1BURE9UT1BUPSRPQ0FNTE9QVERPVE9QVAotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2Yg
Im9jYW1sb3B0Lm9wdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1z
ZXQgZHVtbXkgb2NhbWxvcHQub3B0OyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19u
ICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJv
Z19hY19jdF9PQ0FNTE9QVERPVE9QVCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24g
IihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTE9QVERPVE9Q
VCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTE9QVERPVE9QVD0iJGFjX2N0X09DQU1M
T1BURE9UT1BUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3Nh
dmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRv
Ci0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAg
ICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAg
aWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94
ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2df
YWNfY3RfT0NBTUxPUFRET1RPUFQ9Im9jYW1sb3B0Lm9wdCIKLSAgICAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0
IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMK
KyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJ
TkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJy
b3JfZmxhZworCSBDRkxBR1M9Ii1nIgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25m
dGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQorewog
CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRM
SU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfcHJvZ19jY19nPXllcwogZmkKK3JtIC1mIGNvcmUgY29u
ZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWFjX2N0
X09DQU1MT1BURE9UT1BUPSRhY19jdl9wcm9nX2FjX2N0X09DQU1MT1BURE9UT1BUCi1pZiB0ZXN0
IC1uICIkYWNfY3RfT0NBTUxPUFRET1RPUFQiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0NBTUxPUFRET1RPUFQiID4mNQot
JGFzX2VjaG8gIiRhY19jdF9PQ0FNTE9QVERPVE9QVCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNo
byAibm8iID4mNjsgfQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4
dCBjb25mdGVzdC4kYWNfZXh0CiBmaQotCi0gIGlmIHRlc3QgIngkYWNfY3RfT0NBTUxPUFRET1RP
UFQiID0geDsgdGhlbgotICAgIE9DQU1MT1BURE9UT1BUPSJubyIKK3JtIC1mIGNvcmUgY29uZnRl
c3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgYWNfY193ZXJy
b3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQorJGFzX2Vj
aG8gIiRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9
IHNldDsgdGhlbgorICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCitlbGlmIHRlc3QgJGFjX2N2X3By
b2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENG
TEFHUz0iLWcgLU8yIgogICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29s
X3dhcm5lZCBpbgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlw
bGV0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5v
dCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7
OwotZXNhYwotICAgIE9DQU1MT1BURE9UT1BUPSRhY19jdF9PQ0FNTE9QVERPVE9QVAorICAgIENG
TEFHUz0iLWciCiAgIGZpCiBlbHNlCi0gIE9DQU1MT1BURE9UT1BUPSIkYWNfY3ZfcHJvZ19PQ0FN
TE9QVERPVE9QVCIKLWZpCi0KLQlpZiB0ZXN0ICIkT0NBTUxPUFRET1RPUFQiICE9ICJubyI7IHRo
ZW4KLQkgICBUTVBWRVJTSU9OPWAkT0NBTUxPUFRET1RPUFQgLXYgfCBzZWQgLW4gLWUgJ3N8Lip2
ZXJzaW9uKiAqXCguKlwpJHxcMXxwJyBgCi0JICAgaWYgdGVzdCAiJFRNUFZFUlNJT04iICE9ICIk
T0NBTUxWRVJTSU9OIiA7IHRoZW4KLQkgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IHJlc3VsdDogdmVyc2lvbiBkaWZmZXJzIGZyb20gb2NhbWxjOyBvY2FtbG9w
dC5vcHQgZGlzY2FyZGVkLiIgPiY1Ci0kYXNfZWNobyAidmVyc2lvbiBkaWZmZXJzIGZyb20gb2Nh
bWxjOyBvY2FtbG9wdC5vcHQgZGlzY2FyZGVkLiIgPiY2OyB9Ci0JICAgZWxzZQotCSAgICAgIE9D
QU1MT1BUPSRPQ0FNTE9QVERPVE9QVAotCSAgIGZpCi0gICAgICAgIGZpCi0gICAgIGZpCi0KLQor
ICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLU8yIgorICBlbHNlCisg
ICAgQ0ZMQUdTPQogICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkiID4mNQorJGFz
X2VjaG9fbiAiY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkuLi4gIiA+
JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19jODkrc2V0fSIgPSBzZXQ7IHRoZW4gOgor
ICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jdl9wcm9nX2NjX2M4OT1u
bworYWNfc2F2ZV9DQz0kQ0MKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRh
Y19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNs
dWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0
Lmg+CisvKiBNb3N0IG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIHN0b2xlbiBmcm9tIFJDUyA1
LjcncyBzcmMvY29uZi5zaC4gICovCitzdHJ1Y3QgYnVmIHsgaW50IHg7IH07CitGSUxFICogKCpy
Y3NvcGVuKSAoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpOworc3RhdGljIGNoYXIg
KmUgKHAsIGkpCisgICAgIGNoYXIgKipwOworICAgICBpbnQgaTsKK3sKKyAgcmV0dXJuIHBbaV07
Cit9CitzdGF0aWMgY2hhciAqZiAoY2hhciAqICgqZykgKGNoYXIgKiosIGludCksIGNoYXIgKipw
LCAuLi4pCit7CisgIGNoYXIgKnM7CisgIHZhX2xpc3QgdjsKKyAgdmFfc3RhcnQgKHYscCk7Cisg
IHMgPSBnIChwLCB2YV9hcmcgKHYsaW50KSk7CisgIHZhX2VuZCAodik7CisgIHJldHVybiBzOwor
fQogCisvKiBPU0YgNC4wIENvbXBhcSBjYyBpcyBzb21lIHNvcnQgb2YgYWxtb3N0LUFOU0kgYnkg
ZGVmYXVsdC4gIEl0IGhhcworICAgZnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgc3R1ZmYsIGJ1dCBu
b3QgJ1x4SEgnIGhleCBjaGFyYWN0ZXIgY29uc3RhbnRzLgorICAgVGhlc2UgZG9uJ3QgcHJvdm9r
ZSBhbiBlcnJvciB1bmZvcnR1bmF0ZWx5LCBpbnN0ZWFkIGFyZSBzaWxlbnRseSB0cmVhdGVkCisg
ICBhcyAneCcuICBUaGUgZm9sbG93aW5nIGluZHVjZXMgYW4gZXJyb3IsIHVudGlsIC1zdGQgaXMg
YWRkZWQgdG8gZ2V0CisgICBwcm9wZXIgQU5TSSBtb2RlLiAgQ3VyaW91c2x5ICdceDAwJyE9J3gn
IGFsd2F5cyBjb21lcyBvdXQgdHJ1ZSwgZm9yIGFuCisgICBhcnJheSBzaXplIGF0IGxlYXN0LiAg
SXQncyBuZWNlc3NhcnkgdG8gd3JpdGUgJ1x4MDAnPT0wIHRvIGdldCBzb21ldGhpbmcKKyAgIHRo
YXQncyB0cnVlIG9ubHkgd2l0aCAtc3RkLiAgKi8KK2ludCBvc2Y0X2NjX2FycmF5IFsnXHgwMCcg
PT0gMCA/IDEgOiAtMV07CiAKKy8qIElCTSBDIDYgZm9yIEFJWCBpcyBhbG1vc3QtQU5TSSBieSBk
ZWZhdWx0LCBidXQgaXQgcmVwbGFjZXMgbWFjcm8gcGFyYW1ldGVycworICAgaW5zaWRlIHN0cmlu
Z3MgYW5kIGNoYXJhY3RlciBjb25zdGFudHMuICAqLworI2RlZmluZSBGT08oeCkgJ3gnCitpbnQg
eGxjNl9jY19hcnJheVtGT08oYSkgPT0gJ3gnID8gMSA6IC0xXTsKIAotICAjIGNoZWNraW5nIGZv
ciBvY2FtbCB0b3BsZXZlbAotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0g
ICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1vY2FtbCIsIHNv
IGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29s
X3ByZWZpeH1vY2FtbDsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tp
bmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfT0NBTUwr
c2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQot
ICBpZiB0ZXN0IC1uICIkT0NBTUwiOyB0aGVuCi0gIGFjX2N2X3Byb2dfT0NBTUw9IiRPQ0FNTCIg
IyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZT
OyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICitpbnQgdGVzdCAoaW50
IGksIGRvdWJsZSB4KTsKK3N0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9Oworc3RydWN0IHMy
IHtpbnQgKCpmKSAoZG91YmxlIGEpO307CitpbnQgcGFpcm5hbWVzIChpbnQsIGNoYXIgKiosIEZJ
TEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCksIGludCwgaW50KTsKK2lu
dCBhcmdjOworY2hhciAqKmFyZ3Y7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBmIChlLCBhcmd2
LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwgYXJndiwgMSkgIT0gYXJndlsxXTsKKyAgOworICBy
ZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2FyZyBpbiAnJyAtcWxhbmdsdmw9ZXh0Yzg5IC1x
bGFuZ2x2bD1hbnNpIC1zdGQgXAorCS1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19F
WFRFTlNJT05TX18iCiBkbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIi
ICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4
dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4
dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4K
LSAgICBhY19jdl9wcm9nX09DQU1MPSIke2FjX3Rvb2xfcHJlZml4fW9jYW1sIgotICAgICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQk
YWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKKyAgQ0M9IiRhY19zYXZlX0NDICRh
Y19hcmciCisgIGlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNf
Y3ZfcHJvZ19jY19jODk9JGFjX2FyZworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0
ZXN0LiRhY19vYmpleHQKKyAgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0gInhubyIgJiYg
YnJlYWsKIGRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUworcm0gLWYgY29uZnRlc3QuJGFj
X2V4dAorQ0M9JGFjX3NhdmVfQ0MKIAogZmkKLWZpCi1PQ0FNTD0kYWNfY3ZfcHJvZ19PQ0FNTAot
aWYgdGVzdCAtbiAiJE9DQU1MIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IHJlc3VsdDogJE9DQU1MIiA+JjUKLSRhc19lY2hvICIkT0NBTUwiID4mNjsg
fQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyMgQUNfQ0FDSEVfVkFMCitjYXNlICJ4
JGFjX2N2X3Byb2dfY2NfYzg5IiBpbgorICB4KQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub25lIG5lZWRlZCIgPiY1CiskYXNfZWNobyAibm9u
ZSBuZWVkZWQiID4mNjsgfSA7OworICB4bm8pCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHVuc3VwcG9ydGVkIiA+JjUKKyRhc19lY2hvICJ1bnN1
cHBvcnRlZCIgPiY2OyB9IDs7CisgICopCisgICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19jODki
CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRh
Y19jdl9wcm9nX2NjX2M4OSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjY7
IH0gOzsKK2VzYWMKK2lmIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9IHhubzsgdGhlbiA6
CisKIGZpCiAKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0n
JENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0n
JENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25m
dGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxl
cl9nbnUKIAotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX09DQU1MIjsgdGhlbgotICBhY19j
dF9PQ0FNTD0kT0NBTUwKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvY2FtbCIsIHNv
IGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgb2NhbWw7IGFj
X3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tp
bmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4u
LiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X09DQU1MK3NldH0iID0gc2V0
OyB0aGVuIDoKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tp
bmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKSIgPiY1CiskYXNfZWNob19uICJj
aGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpLi4uICIgPiY2OyB9Citz
ZXQgeCAke01BS0UtbWFrZX0KK2FjX21ha2U9YCRhc19lY2hvICIkMiIgfCBzZWQgJ3MvKy9wL2c7
IHMvW15hLXpBLVowLTlfXS9fL2cnYAoraWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfbWFr
ZV8ke2FjX21ha2V9X3NldCtzZXR9XCIiID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNh
Y2hlZCkgIiA+JjYKIGVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MIjsgdGhlbgotICBh
Y19jdl9wcm9nX2FjX2N0X09DQU1MPSIkYWNfY3RfT0NBTUwiICMgTGV0IHRoZSB1c2VyIG92ZXJy
aWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRP
UgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16
ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhl
Y3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQk
YWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQi
OyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTD0ib2NhbWwiCi0gICAgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRh
Y19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFz
X3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfT0NBTUw9JGFjX2N2X3Byb2dfYWNfY3RfT0NBTUwK
LWlmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9PQ0FNTCIgPiY1Ci0kYXNfZWNobyAi
JGFjX2N0X09DQU1MIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQot
Ci0gIGlmIHRlc3QgIngkYWNfY3RfT0NBTUwiID0geDsgdGhlbgotICAgIE9DQU1MPSJubyIKLSAg
ZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczop
Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5n
IGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNo
byAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBo
b3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKKyAgY2F0ID5jb25mdGVz
dC5tYWtlIDw8XF9BQ0VPRgorU0hFTEwgPSAvYmluL3NoCithbGw6CisJQGVjaG8gJ0BAQCUlJT0k
KE1BS0UpPUBAQCUlJScKK19BQ0VPRgorIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtl
WzFdOiBFbnRlcmluZyAuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorY2FzZSBgJHtNQUtF
LW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCisgICpAQEAlJSU9Pyo9QEBA
JSUlKikKKyAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OworICAq
KQorICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKIGVzYWMKLSAg
ICBPQ0FNTD0kYWNfY3RfT0NBTUwKLSAgZmkKK3JtIC1mIGNvbmZ0ZXN0Lm1ha2UKK2ZpCitpZiBl
dmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KKyAg
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1
CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKyAgU0VUX01BS0U9CiBlbHNlCi0gIE9DQU1MPSIkYWNf
Y3ZfcHJvZ19PQ0FNTCIKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgIFNFVF9NQUtFPSJNQUtF
PSR7TUFLRS1tYWtlfSIKIGZpCiAKLQotICAjIGNoZWNraW5nIGZvciBvY2FtbGRlcAotICBpZiB0
ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29y
ZCBvZiAiJHthY190b29sX3ByZWZpeH1vY2FtbGRlcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0g
bmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vY2FtbGRlcDsgYWNf
d29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2lu
ZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4u
ICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfT0NBTUxERVArc2V0fSIgPSBzZXQ7IHRo
ZW4gOgorIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dy
YW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0
IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9l
dGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAor
IyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBbWlnYU9TIC9DL2lu
c3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxvcHB5IGRpc2NzCisjIEFJWCA0
IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxh
ZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlz
dGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRo
ZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIE9TLzIncyBzeXN0ZW0gaW5zdGFsbCwgd2hp
Y2ggaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWMKKyMgLi9pbnN0YWxsLCB3aGlj
aCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgor
IyBSZWplY3QgaW5zdGFsbCBwcm9ncmFtcyB0aGF0IGNhbm5vdCBpbnN0YWxsIG11bHRpcGxlIGZp
bGVzLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBm
b3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZv
ciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gIiA+JjY7IH0KK2lmIHRlc3QgLXogIiRJTlNU
QUxMIjsgdGhlbgoraWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRo
ZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBpZiB0ZXN0IC1uICIk
T0NBTUxERVAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfT0NBTUxERVA9IiRPQ0FNTERFUCIgIyBMZXQg
dGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9
JFBBVEhfU0VQQVJBVE9SCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IK
IGZvciBhc19kaXIgaW4gJFBBVEgKIGRvCiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAi
JGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1
dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFj
X2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0Ijsg
fTsgdGhlbgotICAgIGFjX2N2X3Byb2dfT0NBTUxERVA9IiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxk
ZXAiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFz
X2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQor
ICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRI
IGVsZW1lbnRzLgorY2FzZSAkYXNfZGlyLyBpbiAjKCgKKyAgLi8gfCAuLy8gfCAvW2NDXS8qIHwg
XAorICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9h
ZnN3cy9iaW4vKiB8IFwKKyAgPzpbXFwvXW9zMltcXC9daW5zdGFsbFtcXC9dKiB8ID86W1xcL11P
UzJbXFwvXUlOU1RBTExbXFwvXSogfCBcCisgIC91c3IvdWNiLyogKSA7OworICAqKQorICAgICMg
T1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisg
ICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVm
ZiBhcyByb290CisgICAgIyBieSBkZWZhdWx0LgorICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxs
IHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhl
Y3V0YWJsZV9leHRlbnNpb25zOyBkbworCWlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRh
Y19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7
IH07IHRoZW4KKwkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisJICAgIGdyZXAgZHNw
bXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4K
KwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252
ZW50aW9uLgorCSAgICA6CisJICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisJICAg
IGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+
JjE7IHRoZW4KKwkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkg
SFAgcHdwbHVzLS1kb24ndCB1c2UuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgcm0gLXJmIGNvbmZ0
ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCisJICAgIGVjaG8gb25lID4gY29uZnRl
c3Qub25lCisJICAgIGVjaG8gdHdvID4gY29uZnRlc3QudHdvCisJICAgIG1rZGlyIGNvbmZ0ZXN0
LmRpcgorCSAgICBpZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLWMgY29uZnRlc3Qu
b25lIGNvbmZ0ZXN0LnR3byAiYHB3ZGAvY29uZnRlc3QuZGlyIiAmJgorCSAgICAgIHRlc3QgLXMg
Y29uZnRlc3Qub25lICYmIHRlc3QgLXMgY29uZnRlc3QudHdvICYmCisJICAgICAgdGVzdCAtcyBj
b25mdGVzdC5kaXIvY29uZnRlc3Qub25lICYmCisJICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIv
Y29uZnRlc3QudHdvCisJICAgIHRoZW4KKwkgICAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19k
aXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCisJICAgICAgYnJlYWsgMworCSAgICBmaQorCSAg
ZmkKKwlmaQorICAgICAgZG9uZQorICAgIGRvbmUKKyAgICA7OworZXNhYworCiAgIGRvbmUKIElG
Uz0kYXNfc2F2ZV9JRlMKIAorcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRl
c3QuZGlyCisKIGZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0
OyB0aGVuCisgICAgSU5TVEFMTD0kYWNfY3ZfcGF0aF9pbnN0YWxsCisgIGVsc2UKKyAgICAjIEFz
IGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBh
CisgICAgIyB2YWx1ZSBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNh
dXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hl
IGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMg
YSByZWxhdGl2ZSBuYW1lLgorICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKKyAgZmkKIGZpCi1P
Q0FNTERFUD0kYWNfY3ZfcHJvZ19PQ0FNTERFUAotaWYgdGVzdCAtbiAiJE9DQU1MREVQIjsgdGhl
bgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9D
QU1MREVQIiA+JjUKLSRhc19lY2hvICIkT0NBTUxERVAiID4mNjsgfQotZWxzZQotICB7ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2Vj
aG8gIm5vIiA+JjY7IH0KLWZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IHJlc3VsdDogJElOU1RBTEwiID4mNQorJGFzX2VjaG8gIiRJTlNUQUxMIiA+JjY7IH0KIAor
IyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zh
ci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlh
YmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExf
UFJPR1JBTT0nJHtJTlNUQUxMfScKIAotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX09DQU1M
REVQIjsgdGhlbgotICBhY19jdF9PQ0FNTERFUD0kT0NBTUxERVAKLSAgIyBFeHRyYWN0IHRoZSBm
aXJzdCB3b3JkIG9mICJvY2FtbGRlcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRo
IGFyZ3MuCi1zZXQgZHVtbXkgb2NhbWxkZXA7IGFjX3dvcmQ9JDIKK3Rlc3QgLXogIiRJTlNUQUxM
X1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNU
QUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisKKyMgRXh0cmFj
dCB0aGUgZmlyc3Qgd29yZCBvZiAiYmlzb24iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUg
d2l0aCBhcmdzLgorc2V0IGR1bW15IGJpc29uOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNf
ZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNf
Y3ZfcHJvZ19hY19jdF9PQ0FNTERFUCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiB0ZXN0ICIke2Fj
X2N2X3BhdGhfQklTT04rc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVk
KSAiID4mNgogZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxERVAiOyB0aGVuCi0gIGFj
X2N2X3Byb2dfYWNfY3RfT0NBTUxERVA9IiRhY19jdF9PQ0FNTERFUCIgIyBMZXQgdGhlIHVzZXIg
b3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQ
QVJBVE9SCisgIGNhc2UgJEJJU09OIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9w
YXRoX0JJU09OPSIkQklTT04iICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGgg
YSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJB
VE9SCiBmb3IgYXNfZGlyIGluICRQQVRICiBkbwogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3Qg
LXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19l
eGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29y
ZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4
dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX2FjX2N0X09DQU1MREVQPSJvY2FtbGRlcCIKKyAg
ICBhY19jdl9wYXRoX0JJU09OPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgogICAgICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dv
cmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkKQEAgLTU4MzMsNTMgKzM1NjUs
MzkgQEAgZG9uZQogICBkb25lCiBJRlM9JGFzX3NhdmVfSUZTCiAKKyAgOzsKK2VzYWMKIGZpCi1m
aQotYWNfY3RfT0NBTUxERVA9JGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxERVAKLWlmIHRlc3QgLW4g
IiRhY19jdF9PQ0FNTERFUCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9PQ0FNTERFUCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0
X09DQU1MREVQIiA+JjY7IH0KK0JJU09OPSRhY19jdl9wYXRoX0JJU09OCitpZiB0ZXN0IC1uICIk
QklTT04iOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiAkQklTT04iID4mNQorJGFzX2VjaG8gIiRCSVNPTiIgPiY2OyB9CiBlbHNlCiAgIHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiAk
YXNfZWNobyAibm8iID4mNjsgfQogZmkKIAotICBpZiB0ZXN0ICJ4JGFjX2N0X09DQU1MREVQIiA9
IHg7IHRoZW4KLSAgICBPQ0FNTERFUD0ibm8iCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21w
aWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQg
d2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcg
Y3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9v
bF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgT0NBTUxERVA9JGFjX2N0X09DQU1MREVQCi0gIGZp
Ci1lbHNlCi0gIE9DQU1MREVQPSIkYWNfY3ZfcHJvZ19PQ0FNTERFUCIKLWZpCi0KIAotICAjIGNo
ZWNraW5nIGZvciBvY2FtbG1rdG9wCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRo
ZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9jYW1s
bWt0b3AiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15
ICR7YWNfdG9vbF9wcmVmaXh9b2NhbWxta3RvcDsgYWNfd29yZD0kMgorIyBFeHRyYWN0IHRoZSBm
aXJzdCB3b3JkIG9mICJmbGV4Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJn
cy4KK3NldCBkdW1teSBmbGV4OyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJj
aGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19P
Q0FNTE1LVE9QK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9GTEVY
K3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UK
LSAgaWYgdGVzdCAtbiAiJE9DQU1MTUtUT1AiOyB0aGVuCi0gIGFjX2N2X3Byb2dfT0NBTUxNS1RP
UD0iJE9DQU1MTUtUT1AiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQot
YXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBjYXNlICRGTEVYIGluCisg
IFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0ZMRVg9IiRGTEVYIiAjIExldCB0aGUg
dXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2
ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgogZm9yIGFzX2RpciBpbiAkUEFUSAogZG8K
ICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAg
IGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwogICBp
ZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3gg
IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19P
Q0FNTE1LVE9QPSIke2FjX3Rvb2xfcHJlZml4fW9jYW1sbWt0b3AiCisgICAgYWNfY3ZfcGF0aF9G
TEVYPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgogICAgICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQi
ID4mNQogICAgIGJyZWFrIDIKICAgZmkKQEAgLTU4ODcsMzkgKzM2MDUsMzkgQEAgZG9uZQogICBk
b25lCiBJRlM9JGFzX3NhdmVfSUZTCiAKKyAgOzsKK2VzYWMKIGZpCi1maQotT0NBTUxNS1RPUD0k
YWNfY3ZfcHJvZ19PQ0FNTE1LVE9QCi1pZiB0ZXN0IC1uICIkT0NBTUxNS1RPUCI7IHRoZW4KLSAg
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPQ0FNTE1L
VE9QIiA+JjUKLSRhc19lY2hvICIkT0NBTUxNS1RPUCIgPiY2OyB9CitGTEVYPSRhY19jdl9wYXRo
X0ZMRVgKK2lmIHRlc3QgLW4gIiRGTEVYIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEZMRVgiID4mNQorJGFzX2VjaG8gIiRGTEVYIiA+
JjY7IH0KIGVsc2UKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBy
ZXN1bHQ6IG5vIiA+JjUKICRhc19lY2hvICJubyIgPiY2OyB9CiBmaQogCiAKLWZpCi1pZiB0ZXN0
IC16ICIkYWNfY3ZfcHJvZ19PQ0FNTE1LVE9QIjsgdGhlbgotICBhY19jdF9PQ0FNTE1LVE9QPSRP
Q0FNTE1LVE9QCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2NhbWxta3RvcCIsIHNv
IGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgb2NhbWxta3Rv
cDsgYWNfd29yZD0kMgorIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJwZXJsIiwgc28gaXQg
Y2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBwZXJsOyBhY193b3Jk
PSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZv
ciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+
JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9PQ0FNTE1LVE9QK3NldH0iID0gc2V0
OyB0aGVuIDoKK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9QRVJMK3NldH0iID0gc2V0OyB0aGVuIDoK
ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0
X09DQU1MTUtUT1AiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxNS1RPUD0iJGFjX2N0
X09DQU1MTUtUT1AiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNf
c2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBjYXNlICRQRVJMIGluCisgIFtc
XC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX1BFUkw9IiRQRVJMIiAjIExldCB0aGUgdXNl
ciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9J
RlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgogZm9yIGFzX2RpciBpbiAkUEFUSAogZG8KICAg
SUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZv
ciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwogICBpZiB7
IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRh
c19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19j
dF9PQ0FNTE1LVE9QPSJvY2FtbG1rdG9wIgorICAgIGFjX2N2X3BhdGhfUEVSTD0iJGFzX2Rpci8k
YWNfd29yZCRhY19leGVjX2V4dCIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVh
ayAyCiAgIGZpCkBAIC01OTI3LDUzICszNjQ1LDQ2IEBAIGRvbmUKICAgZG9uZQogSUZTPSRhc19z
YXZlX0lGUwogCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1BFUkwiICYmIGFjX2N2X3BhdGhfUEVS
TD0ibm8iCisgIDs7Citlc2FjCiBmaQotZmkKLWFjX2N0X09DQU1MTUtUT1A9JGFjX2N2X3Byb2df
YWNfY3RfT0NBTUxNS1RPUAotaWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MTUtUT1AiOyB0aGVuCi0g
IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Rf
T0NBTUxNS1RPUCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X09DQU1MTUtUT1AiID4mNjsgfQorUEVS
TD0kYWNfY3ZfcGF0aF9QRVJMCitpZiB0ZXN0IC1uICIkUEVSTCI7IHRoZW4KKyAgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQRVJMIiA+JjUKKyRhc19l
Y2hvICIkUEVSTCIgPiY2OyB9CiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiAkYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAot
ICBpZiB0ZXN0ICJ4JGFjX2N0X09DQU1MTUtUT1AiID0geDsgdGhlbgotICAgIE9DQU1MTUtUT1A9
Im5vIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBp
bgoteWVzOikKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklO
RzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUK
LSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhl
ZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KLWFjX3Rvb2xfd2FybmVkPXllcyA7OwotZXNhYwot
ICAgIE9DQU1MTUtUT1A9JGFjX2N0X09DQU1MTUtUT1AKLSAgZmkKLWVsc2UKLSAgT0NBTUxNS1RP
UD0iJGFjX2N2X3Byb2dfT0NBTUxNS1RPUCIKLWZpCiAKK2lmIHRlc3QgeCIke1BFUkx9IiA9PSB4
Im5vIgordGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJVbmFibGUgdG8gZmluZCBwZXJsLCBwbGVh
c2UgaW5zdGFsbCBwZXJsIiAiJExJTkVOTyIgNQorZmkKK2lmIHRlc3QgIngkeGFwaSIgPSAieHki
OyB0aGVuIDoKIAotICAjIGNoZWNraW5nIGZvciBvY2FtbG1rbGliCi0gIGlmIHRlc3QgLW4gIiRh
Y190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2Fj
X3Rvb2xfcHJlZml4fW9jYW1sbWtsaWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0
aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2NhbWxta2xpYjsgYWNfd29yZD0k
MgorICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY3VybC1jb25maWciLCBzbyBpdCBj
YW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGN1cmwtY29uZmlnOyBh
Y193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNr
aW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQu
Li4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19PQ0FNTE1LTElCK3NldH0iID0gc2V0
OyB0aGVuIDoKK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9DVVJMK3NldH0iID0gc2V0OyB0aGVuIDoK
ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgaWYgdGVzdCAtbiAiJE9DQU1M
TUtMSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfT0NBTUxNS0xJQj0iJE9DQU1MTUtMSUIiICMgTGV0
IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZT
PSRQQVRIX1NFUEFSQVRPUgorICBjYXNlICRDVVJMIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQor
ICBhY19jdl9wYXRoX0NVUkw9IiRDVVJMIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVz
dCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRI
X1NFUEFSQVRPUgogZm9yIGFzX2RpciBpbiAkUEFUSAogZG8KICAgSUZTPSRhc19zYXZlX0lGUwog
ICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAn
JyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwogICBpZiB7IHRlc3QgLWYgIiRhc19kaXIv
JGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNf
ZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19PQ0FNTE1LTElCPSIke2FjX3Rvb2xf
cHJlZml4fW9jYW1sbWtsaWIiCisgICAgYWNfY3ZfcGF0aF9DVVJMPSIkYXNfZGlyLyRhY193b3Jk
JGFjX2V4ZWNfZXh0IgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAg
ZmkKQEAgLTU5ODEsMzkgKzM2OTIsNDQgQEAgZG9uZQogICBkb25lCiBJRlM9JGFzX3NhdmVfSUZT
CiAKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfQ1VSTCIgJiYgYWNfY3ZfcGF0aF9DVVJMPSJubyIK
KyAgOzsKK2VzYWMKIGZpCi1maQotT0NBTUxNS0xJQj0kYWNfY3ZfcHJvZ19PQ0FNTE1LTElCCi1p
ZiB0ZXN0IC1uICIkT0NBTUxNS0xJQiI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPQ0FNTE1LTElCIiA+JjUKLSRhc19lY2hvICIkT0NB
TUxNS0xJQiIgPiY2OyB9CitDVVJMPSRhY19jdl9wYXRoX0NVUkwKK2lmIHRlc3QgLW4gIiRDVVJM
IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJENVUkwiID4mNQorJGFzX2VjaG8gIiRDVVJMIiA+JjY7IH0KIGVsc2UKICAgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKICRhc19lY2hv
ICJubyIgPiY2OyB9CiBmaQogCiAKK2lmIHRlc3QgeCIke0NVUkx9IiA9PSB4Im5vIgordGhlbgor
ICAgIGFzX2ZuX2Vycm9yICQ/ICJVbmFibGUgdG8gZmluZCBjdXJsLWNvbmZpZywgcGxlYXNlIGlu
c3RhbGwgY3VybC1jb25maWciICIkTElORU5PIiA1CiBmaQotaWYgdGVzdCAteiAiJGFjX2N2X3By
b2dfT0NBTUxNS0xJQiI7IHRoZW4KLSAgYWNfY3RfT0NBTUxNS0xJQj0kT0NBTUxNS0xJQgotICAj
IEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm9jYW1sbWtsaWIiLCBzbyBpdCBjYW4gYmUgYSBw
cm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG9jYW1sbWtsaWI7IGFjX3dvcmQ9JDIK
KyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhtbDItY29uZmlnIiwgc28gaXQgY2Fu
IGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB4bWwyLWNvbmZpZzsgYWNf
d29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2lu
ZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4u
ICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfT0NBTUxNS0xJQitzZXR9IiA9
IHNldDsgdGhlbiA6CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfWE1MK3NldH0iID0gc2V0OyB0aGVu
IDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgaWYgdGVzdCAtbiAiJGFj
X2N0X09DQU1MTUtMSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxNS0xJQj0iJGFj
X2N0X09DQU1MTUtMSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQot
YXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBjYXNlICRYTUwgaW4KKyAg
W1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfWE1MPSIkWE1MIiAjIExldCB0aGUgdXNl
ciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9J
RlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgogZm9yIGFzX2RpciBpbiAkUEFUSAogZG8KICAg
SUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZv
ciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwogICBpZiB7
IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRh
c19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19hY19j
dF9PQ0FNTE1LTElCPSJvY2FtbG1rbGliIgorICAgIGFjX2N2X3BhdGhfWE1MPSIkYXNfZGlyLyRh
Y193b3JkJGFjX2V4ZWNfZXh0IgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFr
IDIKICAgZmkKQEAgLTYwMjEsNDQgKzM3MzcsMzkgQEAgZG9uZQogICBkb25lCiBJRlM9JGFzX3Nh
dmVfSUZTCiAKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWE1MIiAmJiBhY19jdl9wYXRoX1hNTD0i
bm8iCisgIDs7Citlc2FjCiBmaQotZmkKLWFjX2N0X09DQU1MTUtMSUI9JGFjX2N2X3Byb2dfYWNf
Y3RfT0NBTUxNS0xJQgotaWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MTUtMSUIiOyB0aGVuCi0gIHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0NB
TUxNS0xJQiIgPiY1Ci0kYXNfZWNobyAiJGFjX2N0X09DQU1MTUtMSUIiID4mNjsgfQorWE1MPSRh
Y19jdl9wYXRoX1hNTAoraWYgdGVzdCAtbiAiJFhNTCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRYTUwiID4mNQorJGFzX2VjaG8gIiRY
TUwiID4mNjsgfQogZWxzZQogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IHJlc3VsdDogbm8iID4mNQogJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCiAKLSAgaWYgdGVz
dCAieCRhY19jdF9PQ0FNTE1LTElCIiA9IHg7IHRoZW4KLSAgICBPQ0FNTE1LTElCPSJubyIKLSAg
ZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczop
Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5n
IGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNo
byAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBo
b3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBPQ0FN
TE1LTElCPSRhY19jdF9PQ0FNTE1LTElCCi0gIGZpCi1lbHNlCi0gIE9DQU1MTUtMSUI9IiRhY19j
dl9wcm9nX09DQU1MTUtMSUIiCisKK2lmIHRlc3QgeCIke1hNTH0iID09IHgibm8iCit0aGVuCisg
ICAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5kIHhtbDItY29uZmlnLCBwbGVhc2UgaW5z
dGFsbCB4bWwyLWNvbmZpZyIgIiRMSU5FTk8iIDUKIGZpCiAKK2ZpCitpZiB0ZXN0ICJ4JG9jYW1s
dG9vbHMiID0gInh5IjsgdGhlbiA6CiAKLSAgIyBjaGVja2luZyBmb3Igb2NhbWxkb2MKKyAgICAg
ICMgY2hlY2tpbmcgZm9yIG9jYW1sYwogICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0
aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1vY2Ft
bGRvYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkg
JHthY190b29sX3ByZWZpeH1vY2FtbGRvYzsgYWNfd29yZD0kMgorICAjIEV4dHJhY3QgdGhlIGZp
cnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxjIiwgc28gaXQgY2FuIGJlIGEgcHJv
Z3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW9jYW1sYzsg
YWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVj
a2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3Jk
Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfT0NBTUxET0Mrc2V0fSIgPSBzZXQ7
IHRoZW4gOgoraWYgdGVzdCAiJHthY19jdl9wcm9nX09DQU1MQytzZXR9IiA9IHNldDsgdGhlbiA6
CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGlmIHRlc3QgLW4gIiRPQ0FN
TERPQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19PQ0FNTERPQz0iJE9DQU1MRE9DIiAjIExldCB0aGUg
dXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgaWYgdGVzdCAtbiAiJE9DQU1MQyI7IHRoZW4KKyAg
YWNfY3ZfcHJvZ19PQ0FNTEM9IiRPQ0FNTEMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0
ZXN0LgogZWxzZQogYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgogZm9yIGFz
X2RpciBpbiAkUEFUSApAQCAtNjA2Nyw3ICszNzc4LDcgQEAgZG8KICAgdGVzdCAteiAiJGFzX2Rp
ciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVf
ZXh0ZW5zaW9uczsgZG8KICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNf
ZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhl
bgotICAgIGFjX2N2X3Byb2dfT0NBTUxET0M9IiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxkb2MiCisg
ICAgYWNfY3ZfcHJvZ19PQ0FNTEM9IiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxjIgogICAgICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQk
YWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkKQEAgLTYwNzcsMTAgKzM3ODgsMTAg
QEAgSUZTPSRhc19zYXZlX0lGUwogCiBmaQogZmkKLU9DQU1MRE9DPSRhY19jdl9wcm9nX09DQU1M
RE9DCi1pZiB0ZXN0IC1uICIkT0NBTUxET0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0NBTUxET0MiID4mNQotJGFzX2VjaG8gIiRP
Q0FNTERPQyIgPiY2OyB9CitPQ0FNTEM9JGFjX2N2X3Byb2dfT0NBTUxDCitpZiB0ZXN0IC1uICIk
T0NBTUxDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IHJlc3VsdDogJE9DQU1MQyIgPiY1CiskYXNfZWNobyAiJE9DQU1MQyIgPiY2OyB9CiBlbHNlCiAg
IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1
CiAkYXNfZWNobyAibm8iID4mNjsgfQpAQCAtNjA4OCwxNyArMzc5OSwxNyBAQCBmaQogCiAKIGZp
Ci1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19PQ0FNTERPQyI7IHRoZW4KLSAgYWNfY3RfT0NBTUxE
T0M9JE9DQU1MRE9DCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2NhbWxkb2MiLCBz
byBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG9jYW1sZG9j
OyBhY193b3JkPSQyCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19PQ0FNTEMiOyB0aGVuCisgIGFj
X2N0X09DQU1MQz0kT0NBTUxDCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2NhbWxj
Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBvY2Ft
bGM7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
Y2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNf
d29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X09DQU1MRE9DK3Nl
dH0iID0gc2V0OyB0aGVuIDoKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9PQ0FNTEMrc2V0
fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBp
ZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxET0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfT0NB
TUxET0M9IiRhY19jdF9PQ0FNTERPQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qu
CisgIGlmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTEMiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3Rf
T0NBTUxDPSIkYWNfY3RfT0NBTUxDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4K
IGVsc2UKIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKIGZvciBhc19kaXIg
aW4gJFBBVEgKQEAgLTYxMDcsNyArMzgxOCw3IEBAIGRvCiAgIHRlc3QgLXogIiRhc19kaXIiICYm
IGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVu
c2lvbnM7IGRvCiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIg
JiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAg
ICBhY19jdl9wcm9nX2FjX2N0X09DQU1MRE9DPSJvY2FtbGRvYyIKKyAgICBhY19jdl9wcm9nX2Fj
X2N0X09DQU1MQz0ib2NhbWxjIgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFr
IDIKICAgZmkKQEAgLTYxMTcsMTcgKzM4MjgsMTcgQEAgSUZTPSRhc19zYXZlX0lGUwogCiBmaQog
ZmkKLWFjX2N0X09DQU1MRE9DPSRhY19jdl9wcm9nX2FjX2N0X09DQU1MRE9DCi1pZiB0ZXN0IC1u
ICIkYWNfY3RfT0NBTUxET0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0NBTUxET0MiID4mNQotJGFzX2VjaG8gIiRhY19j
dF9PQ0FNTERPQyIgPiY2OyB9CithY19jdF9PQ0FNTEM9JGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxD
CitpZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09DQU1MQyIgPiY1CiskYXNfZWNo
byAiJGFjX2N0X09DQU1MQyIgPiY2OyB9CiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiAkYXNfZWNobyAibm8iID4mNjsgfQog
ZmkKIAotICBpZiB0ZXN0ICJ4JGFjX2N0X09DQU1MRE9DIiA9IHg7IHRoZW4KLSAgICBPQ0FNTERP
Qz0ibm8iCisgIGlmIHRlc3QgIngkYWNfY3RfT0NBTUxDIiA9IHg7IHRoZW4KKyAgICBPQ0FNTEM9
Im5vIgogICBlbHNlCiAgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBp
bgogeWVzOikKQEAgLTYxMzUsMjQgKzM4NDYsNDEgQEAgeWVzOikKICRhc19lY2hvICIkYXNfbWU6
IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxl
dCIgPiYyO30KIGFjX3Rvb2xfd2FybmVkPXllcyA7OwogZXNhYwotICAgIE9DQU1MRE9DPSRhY19j
dF9PQ0FNTERPQworICAgIE9DQU1MQz0kYWNfY3RfT0NBTUxDCiAgIGZpCiBlbHNlCi0gIE9DQU1M
RE9DPSIkYWNfY3ZfcHJvZ19PQ0FNTERPQyIKKyAgT0NBTUxDPSIkYWNfY3ZfcHJvZ19PQ0FNTEMi
CiBmaQogCiAKLSAgIyBjaGVja2luZyBmb3Igb2NhbWxidWlsZAotICBpZiB0ZXN0IC1uICIkYWNf
dG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190
b29sX3ByZWZpeH1vY2FtbGJ1aWxkIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGgg
YXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW9jYW1sYnVpbGQ7IGFjX3dvcmQ9JDIK
KyAgaWYgdGVzdCAiJE9DQU1MQyIgIT0gIm5vIjsgdGhlbgorICAgICBPQ0FNTFZFUlNJT049YCRP
Q0FNTEMgLXYgfCBzZWQgLW4gLWUgJ3N8Lip2ZXJzaW9uKiAqXCguKlwpJHxcMXxwJ2AKKyAgICAg
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IE9DYW1sIHZl
cnNpb24gaXMgJE9DQU1MVkVSU0lPTiIgPiY1CiskYXNfZWNobyAiT0NhbWwgdmVyc2lvbiBpcyAk
T0NBTUxWRVJTSU9OIiA+JjY7IH0KKyAgICAgIyBJZiBPQ0FNTExJQiBpcyBzZXQsIHVzZSBpdAor
ICAgICBpZiB0ZXN0ICIkT0NBTUxMSUIiID0gIiI7IHRoZW4KKyAgICAgICAgT0NBTUxMSUI9YCRP
Q0FNTEMgLXdoZXJlIDI+L2Rldi9udWxsIHx8ICRPQ0FNTEMgLXZ8dGFpbCAtMXxjdXQgLWQgJyAn
IC1mIDRgCisgICAgIGVsc2UKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiByZXN1bHQ6IE9DQU1MTElCIHByZXZpb3VzbHkgc2V0OyBwcmVzZXJ2aW5nIGl0
LiIgPiY1CiskYXNfZWNobyAiT0NBTUxMSUIgcHJldmlvdXNseSBzZXQ7IHByZXNlcnZpbmcgaXQu
IiA+JjY7IH0KKyAgICAgZmkKKyAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiByZXN1bHQ6IE9DYW1sIGxpYnJhcnkgcGF0aCBpcyAkT0NBTUxMSUIiID4mNQorJGFz
X2VjaG8gIk9DYW1sIGxpYnJhcnkgcGF0aCBpcyAkT0NBTUxMSUIiID4mNjsgfQorCisKKworCisg
ICAgICMgY2hlY2tpbmcgZm9yIG9jYW1sb3B0CisgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3By
ZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJl
Zml4fW9jYW1sb3B0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3Nl
dCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW9jYW1sb3B0OyBhY193b3JkPSQyCiB7ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1
CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3Qg
IiR7YWNfY3ZfcHJvZ19PQ0FNTEJVSUxEK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmIHRlc3QgIiR7
YWNfY3ZfcHJvZ19PQ0FNTE9QVCtzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihj
YWNoZWQpICIgPiY2CiBlbHNlCi0gIGlmIHRlc3QgLW4gIiRPQ0FNTEJVSUxEIjsgdGhlbgotICBh
Y19jdl9wcm9nX09DQU1MQlVJTEQ9IiRPQ0FNTEJVSUxEIiAjIExldCB0aGUgdXNlciBvdmVycmlk
ZSB0aGUgdGVzdC4KKyAgaWYgdGVzdCAtbiAiJE9DQU1MT1BUIjsgdGhlbgorICBhY19jdl9wcm9n
X09DQU1MT1BUPSIkT0NBTUxPUFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0Lgog
ZWxzZQogYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgogZm9yIGFzX2RpciBp
biAkUEFUSApAQCAtNjE2MSw3ICszODg5LDcgQEAgZG8KICAgdGVzdCAteiAiJGFzX2RpciIgJiYg
YXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5z
aW9uczsgZG8KICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAm
JiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAg
IGFjX2N2X3Byb2dfT0NBTUxCVUlMRD0iJHthY190b29sX3ByZWZpeH1vY2FtbGJ1aWxkIgorICAg
IGFjX2N2X3Byb2dfT0NBTUxPUFQ9IiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxvcHQiCiAgICAgJGFz
X2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29y
ZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQpAQCAtNjE3MSwxMCArMzg5OSwx
MCBAQCBJRlM9JGFzX3NhdmVfSUZTCiAKIGZpCiBmaQotT0NBTUxCVUlMRD0kYWNfY3ZfcHJvZ19P
Q0FNTEJVSUxECi1pZiB0ZXN0IC1uICIkT0NBTUxCVUlMRCI7IHRoZW4KLSAgeyAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPQ0FNTEJVSUxEIiA+JjUKLSRh
c19lY2hvICIkT0NBTUxCVUlMRCIgPiY2OyB9CitPQ0FNTE9QVD0kYWNfY3ZfcHJvZ19PQ0FNTE9Q
VAoraWYgdGVzdCAtbiAiJE9DQU1MT1BUIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9DQU1MT1BUIiA+JjUKKyRhc19lY2hvICIkT0NB
TUxPUFQiID4mNjsgfQogZWxzZQogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IHJlc3VsdDogbm8iID4mNQogJGFzX2VjaG8gIm5vIiA+JjY7IH0KQEAgLTYxODIsMTcg
KzM5MTAsMTcgQEAgZmkKIAogCiBmaQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT0NBTUxCVUlM
RCI7IHRoZW4KLSAgYWNfY3RfT0NBTUxCVUlMRD0kT0NBTUxCVUlMRAotICAjIEV4dHJhY3QgdGhl
IGZpcnN0IHdvcmQgb2YgIm9jYW1sYnVpbGQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUg
d2l0aCBhcmdzLgotc2V0IGR1bW15IG9jYW1sYnVpbGQ7IGFjX3dvcmQ9JDIKK2lmIHRlc3QgLXog
IiRhY19jdl9wcm9nX09DQU1MT1BUIjsgdGhlbgorICBhY19jdF9PQ0FNTE9QVD0kT0NBTUxPUFQK
KyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvY2FtbG9wdCIsIHNvIGl0IGNhbiBiZSBh
IHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgb2NhbWxvcHQ7IGFjX3dvcmQ9JDIK
IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRh
Y193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsg
fQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X09DQU1MQlVJTEQrc2V0fSIgPSBzZXQ7IHRo
ZW4gOgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X09DQU1MT1BUK3NldH0iID0gc2V0OyB0
aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgaWYgdGVzdCAtbiAi
JGFjX2N0X09DQU1MQlVJTEQiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxCVUlMRD0i
JGFjX2N0X09DQU1MQlVJTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBp
ZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxPUFQiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfT0NB
TUxPUFQ9IiRhY19jdF9PQ0FNTE9QVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qu
CiBlbHNlCiBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCiBmb3IgYXNfZGly
IGluICRQQVRICkBAIC02MjAxLDcgKzM5MjksNyBAQCBkbwogICB0ZXN0IC16ICIkYXNfZGlyIiAm
JiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRl
bnNpb25zOyBkbwogICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQi
ICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0g
ICAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTEJVSUxEPSJvY2FtbGJ1aWxkIgorICAgIGFjX2N2X3By
b2dfYWNfY3RfT0NBTUxPUFQ9Im9jYW1sb3B0IgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQog
ICAgIGJyZWFrIDIKICAgZmkKQEAgLTYyMTEsMTcgKzM5MzksMTcgQEAgSUZTPSRhc19zYXZlX0lG
UwogCiBmaQogZmkKLWFjX2N0X09DQU1MQlVJTEQ9JGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxCVUlM
RAotaWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MQlVJTEQiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0NBTUxCVUlMRCIgPiY1
Ci0kYXNfZWNobyAiJGFjX2N0X09DQU1MQlVJTEQiID4mNjsgfQorYWNfY3RfT0NBTUxPUFQ9JGFj
X2N2X3Byb2dfYWNfY3RfT0NBTUxPUFQKK2lmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTE9QVCI7IHRo
ZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRh
Y19jdF9PQ0FNTE9QVCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X09DQU1MT1BUIiA+JjY7IH0KIGVs
c2UKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5v
IiA+JjUKICRhc19lY2hvICJubyIgPiY2OyB9CiBmaQogCi0gIGlmIHRlc3QgIngkYWNfY3RfT0NB
TUxCVUlMRCIgPSB4OyB0aGVuCi0gICAgT0NBTUxCVUlMRD0ibm8iCisgIGlmIHRlc3QgIngkYWNf
Y3RfT0NBTUxPUFQiID0geDsgdGhlbgorICAgIE9DQU1MT1BUPSJubyIKICAgZWxzZQogICAgIGNh
c2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KIHllczopCkBAIC02MjI5LDQ0
ICszOTU3LDg5IEBAIHllczopCiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9z
cyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CiBhY190b29sX3dh
cm5lZD15ZXMgOzsKIGVzYWMKLSAgICBPQ0FNTEJVSUxEPSRhY19jdF9PQ0FNTEJVSUxECisgICAg
T0NBTUxPUFQ9JGFjX2N0X09DQU1MT1BUCiAgIGZpCiBlbHNlCi0gIE9DQU1MQlVJTEQ9IiRhY19j
dl9wcm9nX09DQU1MQlVJTEQiCisgIE9DQU1MT1BUPSIkYWNfY3ZfcHJvZ19PQ0FNTE9QVCIKIGZp
CiAKKyAgICAgT0NBTUxCRVNUPWJ5dGUKKyAgICAgaWYgdGVzdCAiJE9DQU1MT1BUIiA9ICJubyI7
IHRoZW4KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6
IENhbm5vdCBmaW5kIG9jYW1sb3B0OyBieXRlY29kZSBjb21waWxhdGlvbiBvbmx5LiIgPiY1Cisk
YXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBDYW5ub3QgZmluZCBvY2FtbG9wdDsgYnl0ZWNvZGUg
Y29tcGlsYXRpb24gb25seS4iID4mMjt9CisgICAgIGVsc2UKKwlUTVBWRVJTSU9OPWAkT0NBTUxP
UFQgLXYgfCBzZWQgLW4gLWUgJ3N8Lip2ZXJzaW9uKiAqXCguKlwpJHxcMXxwJyBgCisJaWYgdGVz
dCAiJFRNUFZFUlNJT04iICE9ICIkT0NBTUxWRVJTSU9OIiA7IHRoZW4KKwkgICAgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHZlcnNpb25zIGRpZmZlcnMg
ZnJvbSBvY2FtbGM7IG9jYW1sb3B0IGRpc2NhcmRlZC4iID4mNQorJGFzX2VjaG8gInZlcnNpb25z
IGRpZmZlcnMgZnJvbSBvY2FtbGM7IG9jYW1sb3B0IGRpc2NhcmRlZC4iID4mNjsgfQorCSAgICBP
Q0FNTE9QVD1ubworCWVsc2UKKwkgICAgT0NBTUxCRVNUPW9wdAorCWZpCisgICAgIGZpCiAKLSAg
ICBpZiB0ZXN0ICJ4JE9DQU1MQyIgPSAieG5vIjsgdGhlbiA6CiAKLSAgICAgICAgaWYgdGVzdCAi
eCRlbmFibGVfb2NhbWx0b29scyIgPSAieHllcyI7IHRoZW4gOgogCi0gICAgICAgICAgICBhc19m
bl9lcnJvciAkPyAiT2NhbWwgdG9vbHMgZW5hYmxlZCwgYnV0IHVuYWJsZSB0byBmaW5kIE9jYW1s
IiAiJExJTkVOTyIgNQotZmkKLSAgICAgICAgb2NhbWx0b29scz0ibiIKKyAgICAgIyBjaGVja2lu
ZyBmb3Igb2NhbWxjLm9wdAorICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVu
CisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1vY2FtbGMu
b3B0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAk
e2FjX3Rvb2xfcHJlZml4fW9jYW1sYy5vcHQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19l
Y2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19j
dl9wcm9nX09DQU1MQ0RPVE9QVCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihj
YWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRPQ0FNTENET1RPUFQiOyB0aGVuCisg
IGFjX2N2X3Byb2dfT0NBTUxDRE9UT1BUPSIkT0NBTUxDRE9UT1BUIiAjIExldCB0aGUgdXNlciBv
dmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBB
UkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVz
dCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFj
X2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193
b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNf
ZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfT0NBTUxDRE9UT1BUPSIke2FjX3Rvb2xfcHJl
Zml4fW9jYW1sYy5vcHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgor
ICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCiAKIGZpCitmaQorT0NBTUxDRE9U
T1BUPSRhY19jdl9wcm9nX09DQU1MQ0RPVE9QVAoraWYgdGVzdCAtbiAiJE9DQU1MQ0RPVE9QVCI7
IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6
ICRPQ0FNTENET1RPUFQiID4mNQorJGFzX2VjaG8gIiRPQ0FNTENET1RPUFQiID4mNjsgfQorZWxz
ZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8i
ID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKIAogZmkKLSMgRXh0cmFjdCB0aGUgZmly
c3Qgd29yZCBvZiAiYmFzaCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3Mu
Ci1zZXQgZHVtbXkgYmFzaDsgYWNfd29yZD0kMgoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT0NB
TUxDRE9UT1BUIjsgdGhlbgorICBhY19jdF9PQ0FNTENET1RPUFQ9JE9DQU1MQ0RPVE9QVAorICAj
IEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm9jYW1sYy5vcHQiLCBzbyBpdCBjYW4gYmUgYSBw
cm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG9jYW1sYy5vcHQ7IGFjX3dvcmQ9JDIK
IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRh
Y193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsg
fQotaWYgdGVzdCAiJHthY19jdl9wYXRoX0JBU0grc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgdGVz
dCAiJHthY19jdl9wcm9nX2FjX2N0X09DQU1MQ0RPVE9QVCtzZXR9IiA9IHNldDsgdGhlbiA6CiAg
ICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGNhc2UgJEJBU0ggaW4KLSAgW1xc
L10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfQkFTSD0iJEJBU0giICMgTGV0IHRoZSB1c2Vy
IG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lG
Uz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGlmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTENE
T1RPUFQiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxDRE9UT1BUPSIkYWNfY3RfT0NB
TUxDRE9UT1BUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3Nh
dmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKIGZvciBhc19kaXIgaW4gJFBBVEgKIGRv
CiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAg
ICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KICAg
aWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94
ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3BhdGhf
QkFTSD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICBhY19jdl9wcm9nX2FjX2N0
X09DQU1MQ0RPVE9QVD0ib2NhbWxjLm9wdCIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAg
ICBicmVhayAyCiAgIGZpCkBAIC02Mjc0LDU2ICs0MDQ3LDYzIEBAIGRvbmUKICAgZG9uZQogSUZT
PSRhc19zYXZlX0lGUwogCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0JBU0giICYmIGFjX2N2X3Bh
dGhfQkFTSD0ibm8iCi0gIDs7Ci1lc2FjCiBmaQotQkFTSD0kYWNfY3ZfcGF0aF9CQVNICi1pZiB0
ZXN0IC1uICIkQkFTSCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiByZXN1bHQ6ICRCQVNIIiA+JjUKLSRhc19lY2hvICIkQkFTSCIgPiY2OyB9CitmaQor
YWNfY3RfT0NBTUxDRE9UT1BUPSRhY19jdl9wcm9nX2FjX2N0X09DQU1MQ0RPVE9QVAoraWYgdGVz
dCAtbiAiJGFjX2N0X09DQU1MQ0RPVE9QVCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9PQ0FNTENET1RPUFQiID4mNQorJGFz
X2VjaG8gIiRhY19jdF9PQ0FNTENET1RPUFQiID4mNjsgfQogZWxzZQogICB7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQogJGFzX2VjaG8gIm5v
IiA+JjY7IH0KIGZpCiAKLQotaWYgdGVzdCB4IiR7QkFTSH0iID09IHgibm8iCi10aGVuCi0gICAg
YXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5kIGJhc2gsIHBsZWFzZSBpbnN0YWxsIGJhc2gi
ICIkTElORU5PIiA1CisgIGlmIHRlc3QgIngkYWNfY3RfT0NBTUxDRE9UT1BUIiA9IHg7IHRoZW4K
KyAgICBPQ0FNTENET1RPUFQ9Im5vIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5n
OiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGgg
aG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3Nz
IHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2Fy
bmVkPXllcyA7OworZXNhYworICAgIE9DQU1MQ0RPVE9QVD0kYWNfY3RfT0NBTUxDRE9UT1BUCisg
IGZpCitlbHNlCisgIE9DQU1MQ0RPVE9QVD0iJGFjX2N2X3Byb2dfT0NBTUxDRE9UT1BUIgogZmkK
LWlmIHRlc3QgIngkcHl0aG9udG9vbHMiID0gInh5IjsgdGhlbiA6Ci0KLSAgICBpZiBlY2hvICIk
UFlUSE9OIiB8IGdyZXAgLXEgIl4vIjsgdGhlbiA6CiAKLSAgICAgICAgUFlUSE9OUEFUSD0kUFlU
SE9OCi0gICAgICAgIFBZVEhPTj1gYmFzZW5hbWUgJFBZVEhPTlBBVEhgCisgICAgIGlmIHRlc3Qg
IiRPQ0FNTENET1RPUFQiICE9ICJubyI7IHRoZW4KKwlUTVBWRVJTSU9OPWAkT0NBTUxDRE9UT1BU
IC12IHwgc2VkIC1uIC1lICdzfC4qdmVyc2lvbiogKlwoLipcKSR8XDF8cCcgYAorCWlmIHRlc3Qg
IiRUTVBWRVJTSU9OIiAhPSAiJE9DQU1MVkVSU0lPTiIgOyB0aGVuCisJICAgIHsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB2ZXJzaW9ucyBkaWZmZXJzIGZy
b20gb2NhbWxjOyBvY2FtbGMub3B0IGRpc2NhcmRlZC4iID4mNQorJGFzX2VjaG8gInZlcnNpb25z
IGRpZmZlcnMgZnJvbSBvY2FtbGM7IG9jYW1sYy5vcHQgZGlzY2FyZGVkLiIgPiY2OyB9CisJZWxz
ZQorCSAgICBPQ0FNTEM9JE9DQU1MQ0RPVE9QVAorCWZpCisgICAgIGZpCiAKLWVsaWYgdGVzdCAt
eiAiJFBZVEhPTiI7IHRoZW4gOgotICBQWVRIT049InB5dGhvbiIKLWVsc2UKLSAgYXNfZm5fZXJy
b3IgJD8gIlBZVEhPTiBzcGVjaWZpZWQsIGJ1dCBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aCIgIiRM
SU5FTk8iIDUKLWZpCi0gICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkUFlUSE9OIiwg
c28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkUFlUSE9O
OyBhY193b3JkPSQyCisgICAgICMgY2hlY2tpbmcgZm9yIG9jYW1sb3B0Lm9wdAorICAgICBpZiB0
ZXN0ICIkT0NBTUxPUFQiICE9ICJubyIgOyB0aGVuCisJaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJl
Zml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVm
aXh9b2NhbWxvcHQub3B0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4K
K3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW9jYW1sb3B0Lm9wdDsgYWNfd29yZD0kMgogeyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dv
cmQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1p
ZiB0ZXN0ICIke2FjX2N2X3BhdGhfUFlUSE9OUEFUSCtzZXR9IiA9IHNldDsgdGhlbiA6CitpZiB0
ZXN0ICIke2FjX2N2X3Byb2dfT0NBTUxPUFRET1RPUFQrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAk
YXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBjYXNlICRQWVRIT05QQVRIIGluCi0g
IFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX1BZVEhPTlBBVEg9IiRQWVRIT05QQVRI
IiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAg
KikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBpZiB0ZXN0IC1u
ICIkT0NBTUxPUFRET1RPUFQiOyB0aGVuCisgIGFjX2N2X3Byb2dfT0NBTUxPUFRET1RPUFQ9IiRP
Q0FNTE9QVERPVE9QVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCith
c19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCiBmb3IgYXNfZGlyIGluICRQQVRI
CiBkbwogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0u
CiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRv
CiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rl
c3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9w
YXRoX1BZVEhPTlBBVEg9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgYWNfY3Zf
cHJvZ19PQ0FNTE9QVERPVE9QVD0iJHthY190b29sX3ByZWZpeH1vY2FtbG9wdC5vcHQiCiAgICAg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNf
d29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQpAQCAtNjMzMSw2MiArNDEx
MSwzOSBAQCBkb25lCiAgIGRvbmUKIElGUz0kYXNfc2F2ZV9JRlMKIAotICB0ZXN0IC16ICIkYWNf
Y3ZfcGF0aF9QWVRIT05QQVRIIiAmJiBhY19jdl9wYXRoX1BZVEhPTlBBVEg9Im5vIgotICA7Owot
ZXNhYwogZmkKLVBZVEhPTlBBVEg9JGFjX2N2X3BhdGhfUFlUSE9OUEFUSAotaWYgdGVzdCAtbiAi
JFBZVEhPTlBBVEgiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiAkUFlUSE9OUEFUSCIgPiY1Ci0kYXNfZWNobyAiJFBZVEhPTlBBVEgiID4m
NjsgfQorZmkKK09DQU1MT1BURE9UT1BUPSRhY19jdl9wcm9nX09DQU1MT1BURE9UT1BUCitpZiB0
ZXN0IC1uICIkT0NBTUxPUFRET1RPUFQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0NBTUxPUFRET1RPUFQiID4mNQorJGFzX2VjaG8g
IiRPQ0FNTE9QVERPVE9QVCIgPiY2OyB9CiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiAkYXNfZWNobyAibm8iID4mNjsgfQog
ZmkKIAogCi1pZiB0ZXN0IHgiJHtQWVRIT05QQVRIfSIgPT0geCJubyIKLXRoZW4KLSAgICBhc19m
bl9lcnJvciAkPyAiVW5hYmxlIHRvIGZpbmQgJFBZVEhPTiwgcGxlYXNlIGluc3RhbGwgJFBZVEhP
TiIgIiRMSU5FTk8iIDUKLWZpCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBjaGVja2luZyBmb3IgcHl0aG9uIHZlcnNpb24gPj0gMi4zICIgPiY1Ci0kYXNfZWNo
b19uICJjaGVja2luZyBmb3IgcHl0aG9uIHZlcnNpb24gPj0gMi4zIC4uLiAiID4mNjsgfQotYCRQ
WVRIT04gLWMgJ2ltcG9ydCBzeXM7IHN5cy5leGl0KGV2YWwoInN5cy52ZXJzaW9uX2luZm8gPCAo
MiwgMykiKSknYAotaWYgdGVzdCAiJD8iICE9ICIwIgotdGhlbgotICAgIHB5dGhvbl92ZXJzaW9u
PWAkUFlUSE9OIC1WIDI+JjFgCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0gICAgYXNfZm5f
ZXJyb3IgJD8gIiRweXRob25fdmVyc2lvbiBpcyB0b28gb2xkLCBtaW5pbXVtIHJlcXVpcmVkIHZl
cnNpb24gaXMgMi4zIiAiJExJTkVOTyIgNQotZWxzZQotICAgIHsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2
OyB9CiBmaQotCi1hY19wcmV2aW91c19jcHBmbGFncz0kQ1BQRkxBR1MKLWFjX3ByZXZpb3VzX2xk
ZmxhZ3M9JExERkxBR1MKLWFjX3B5dGhvbl92ZXJzaW9uPWAkUFlUSE9OIC1jICdpbXBvcnQgZGlz
dHV0aWxzLnN5c2NvbmZpZzsgXAotICAgIHByaW50IGRpc3R1dGlscy5zeXNjb25maWcuZ2V0X2Nv
bmZpZ192YXIoIlZFUlNJT04iKSdgCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRQWVRI
T04tY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBk
dW1teSAkUFlUSE9OLWNvbmZpZzsgYWNfd29yZD0kMgoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2df
T0NBTUxPUFRET1RPUFQiOyB0aGVuCisgIGFjX2N0X09DQU1MT1BURE9UT1BUPSRPQ0FNTE9QVERP
VE9QVAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm9jYW1sb3B0Lm9wdCIsIHNvIGl0
IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgb2NhbWxvcHQub3B0
OyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNo
ZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dv
cmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9weWNvbmZpZytzZXR9IiA9IHNl
dDsgdGhlbiA6CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfT0NBTUxPUFRET1RPUFQrc2V0
fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBj
YXNlICRweWNvbmZpZyBpbgotICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9weWNv
bmZpZz0iJHB5Y29uZmlnIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEg
cGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRP
UgorICBpZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxPUFRET1RPUFQiOyB0aGVuCisgIGFjX2N2X3By
b2dfYWNfY3RfT0NBTUxPUFRET1RPUFQ9IiRhY19jdF9PQ0FNTE9QVERPVE9QVCIgIyBMZXQgdGhl
IHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBB
VEhfU0VQQVJBVE9SCiBmb3IgYXNfZGlyIGluICRQQVRICiBkbwogICBJRlM9JGFzX3NhdmVfSUZT
CiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGlu
ICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rp
ci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRh
Y19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX3B5Y29uZmlnPSIkYXNfZGlyLyRh
Y193b3JkJGFjX2V4ZWNfZXh0IgorICAgIGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxPUFRET1RPUFQ9
Im9jYW1sb3B0Lm9wdCIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAg
IGZpCkBAIC02Mzk0LDEyNyArNDE1MSw2OCBAQCBkb25lCiAgIGRvbmUKIElGUz0kYXNfc2F2ZV9J
RlMKIAotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9weWNvbmZpZyIgJiYgYWNfY3ZfcGF0aF9weWNv
bmZpZz0ibm8iCi0gIDs7Ci1lc2FjCiBmaQotcHljb25maWc9JGFjX2N2X3BhdGhfcHljb25maWcK
LWlmIHRlc3QgLW4gIiRweWNvbmZpZyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRweWNvbmZpZyIgPiY1Ci0kYXNfZWNobyAiJHB5Y29u
ZmlnIiA+JjY7IH0KK2ZpCithY19jdF9PQ0FNTE9QVERPVE9QVD0kYWNfY3ZfcHJvZ19hY19jdF9P
Q0FNTE9QVERPVE9QVAoraWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MT1BURE9UT1BUIjsgdGhlbgor
ICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0
X09DQU1MT1BURE9UT1BUIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfT0NBTUxPUFRET1RPUFQiID4m
NjsgfQogZWxzZQogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJl
c3VsdDogbm8iID4mNQogJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCiAKLQotaWYgdGVzdCB4IiRw
eWNvbmZpZyIgPT0geCJubyI7IHRoZW4gOgotCi0gICAgICAgIENQUEZMQUdTPSIkQ0ZMQUdTIGAk
UFlUSE9OIC1jICdpbXBvcnQgZGlzdHV0aWxzLnN5c2NvbmZpZzsgXAotICAgICAgICBwcmludCAi
LUkiICsgZGlzdHV0aWxzLnN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiSU5DTFVERVBZIiknYCIK
LSAgICBDUFBGTEFHUz0iJENQUEZMQUdTIGAkUFlUSE9OIC1jICdpbXBvcnQgZGlzdHV0aWxzLnN5
c2NvbmZpZzsgXAotICAgICAgICBwcmludCBkaXN0dXRpbHMuc3lzY29uZmlnLmdldF9jb25maWdf
dmFyKCJDRkxBR1MiKSdgIgotICAgIExERkxBR1M9IiRMREZMQUdTIGAkUFlUSE9OIC1jICdpbXBv
cnQgZGlzdHV0aWxzLnN5c2NvbmZpZzsgXAotICAgICAgICBwcmludCBkaXN0dXRpbHMuc3lzY29u
ZmlnLmdldF9jb25maWdfdmFyKCJMSUJTIiknYCIKLSAgICBMREZMQUdTPSIkTERGTEFHUyBgJFBZ
VEhPTiAtYyAnaW1wb3J0IGRpc3R1dGlscy5zeXNjb25maWc7IFwKLSAgICAgICAgcHJpbnQgZGlz
dHV0aWxzLnN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiU1lTTElCUyIpJ2AiCi0gICAgTERGTEFH
Uz0iJExERkxBR1MgYCRQWVRIT04gLWMgJ2ltcG9ydCBkaXN0dXRpbHMuc3lzY29uZmlnOyBcCi0g
ICAgICAgIHByaW50ICItTCIgKyBkaXN0dXRpbHMuc3lzY29uZmlnLmdldF9weXRob25fbGliKHBs
YXRfc3BlY2lmaWM9MSxcCi0gICAgICAgIHN0YW5kYXJkX2xpYj0xKSArICIvY29uZmlnIidgIgot
ICAgIExERkxBR1M9IiRMREZMQUdTIGAkUFlUSE9OIC1jICdpbXBvcnQgZGlzdHV0aWxzLnN5c2Nv
bmZpZzsgXAotICAgICAgICBwcmludCBkaXN0dXRpbHMuc3lzY29uZmlnLmdldF9jb25maWdfdmFy
KCJMSU5LRk9SU0hBUkVEIiknYCIKLSAgICBMREZMQUdTPSIkTERGTEFHUyBgJFBZVEhPTiAtYyAn
aW1wb3J0IGRpc3R1dGlscy5zeXNjb25maWc7IFwKLSAgICAgICAgcHJpbnQgZGlzdHV0aWxzLnN5
c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiTERGTEFHUyIpJ2AiCi0KLWVsc2UKLQotICAgICAgICBD
UFBGTEFHUz0iJENGTEFHUyBgJFBZVEhPTi1jb25maWcgLS1jZmxhZ3NgIgotICAgIExERkxBR1M9
IiRMREZMQUdTIGAkUFlUSE9OLWNvbmZpZyAtLWxkZmxhZ3NgIgotCi1maQotCi1hY19mbl9jX2No
ZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiUHl0aG9uLmgiICJhY19jdl9oZWFkZXJfUHl0
aG9uX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX1B5
dGhvbl9oIiA9IHgiInllczsgdGhlbiA6Ci0KKyAgaWYgdGVzdCAieCRhY19jdF9PQ0FNTE9QVERP
VE9QVCIgPSB4OyB0aGVuCisgICAgT0NBTUxPUFRET1RPUFQ9Im5vIgorICBlbHNlCisgICAgY2Fz
ZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMg
bm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdB
Uk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIg
PiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIE9DQU1MT1BURE9UT1BUPSRh
Y19jdF9PQ0FNTE9QVERPVE9QVAorICBmaQogZWxzZQotICBhc19mbl9lcnJvciAkPyAiVW5hYmxl
IHRvIGZpbmQgUHl0aG9uIGRldmVsb3BtZW50IGhlYWRlcnMiICIkTElORU5PIiA1CisgIE9DQU1M
T1BURE9UT1BUPSIkYWNfY3ZfcHJvZ19PQ0FNTE9QVERPVE9QVCIKIGZpCiAKKwlpZiB0ZXN0ICIk
T0NBTUxPUFRET1RPUFQiICE9ICJubyI7IHRoZW4KKwkgICBUTVBWRVJTSU9OPWAkT0NBTUxPUFRE
T1RPUFQgLXYgfCBzZWQgLW4gLWUgJ3N8Lip2ZXJzaW9uKiAqXCguKlwpJHxcMXxwJyBgCisJICAg
aWYgdGVzdCAiJFRNUFZFUlNJT04iICE9ICIkT0NBTUxWRVJTSU9OIiA7IHRoZW4KKwkgICAgICB7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogdmVyc2lvbiBk
aWZmZXJzIGZyb20gb2NhbWxjOyBvY2FtbG9wdC5vcHQgZGlzY2FyZGVkLiIgPiY1CiskYXNfZWNo
byAidmVyc2lvbiBkaWZmZXJzIGZyb20gb2NhbWxjOyBvY2FtbG9wdC5vcHQgZGlzY2FyZGVkLiIg
PiY2OyB9CisJICAgZWxzZQorCSAgICAgIE9DQU1MT1BUPSRPQ0FNTE9QVERPVE9QVAorCSAgIGZp
CisgICAgICAgIGZpCisgICAgIGZpCiAKLWFzX2FjX0xpYj1gJGFzX2VjaG8gImFjX2N2X2xpYl9w
eXRob24kYWNfcHl0aG9uX3ZlcnNpb24nJ19QeUFyZ19QYXJzZVR1cGxlIiB8ICRhc190cl9zaGAK
LXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFB5
QXJnX1BhcnNlVHVwbGUgaW4gLWxweXRob24kYWNfcHl0aG9uX3ZlcnNpb24iID4mNQotJGFzX2Vj
aG9fbiAiY2hlY2tpbmcgZm9yIFB5QXJnX1BhcnNlVHVwbGUgaW4gLWxweXRob24kYWNfcHl0aG9u
X3ZlcnNpb24uLi4gIiA+JjY7IH0KLWlmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfTGliK3NldH1c
IiIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBh
Y19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHB5dGhvbiRhY19weXRob25fdmVy
c2lvbiAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0
Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwg
cHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWln
aHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0
cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3Bs
dXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgUHlBcmdfUGFyc2VUdXBsZSAoKTsKLWlu
dAotbWFpbiAoKQotewotcmV0dXJuIFB5QXJnX1BhcnNlVHVwbGUgKCk7Ci0gIDsKLSAgcmV0dXJu
IDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAg
ZXZhbCAiJGFzX2FjX0xpYj15ZXMiCi1lbHNlCi0gIGV2YWwgIiRhc19hY19MaWI9bm8iCi1maQot
cm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRl
c3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJ
QlMKLWZpCi1ldmFsIGFjX3Jlcz1cJCRhc19hY19MaWIKLQkgICAgICAgeyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQotJGFzX2VjaG8g
IiRhY19yZXMiID4mNjsgfQotaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19MaWIiXCIgPSB4Inll
cyI7IHRoZW4gOgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGAkYXNfZWNo
byAiSEFWRV9MSUJweXRob24kYWNfcHl0aG9uX3ZlcnNpb24iIHwgJGFzX3RyX2NwcGAgMQotX0FD
RU9GCi0KLSAgTElCUz0iLWxweXRob24kYWNfcHl0aG9uX3ZlcnNpb24gJExJQlMiCiAKLWVsc2UK
LSAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5kIGEgc3VpdGFibGUgcHl0aG9uIGRldmVs
b3BtZW50IGxpYnJhcnkiICIkTElORU5PIiA1Ci1maQorICBmaQogCi1DUFBGTEFHUz0kYWNfcHJl
dmlvdXNfY3BwZmxhZ3MKLUxETEZBR1M9JGFjX3ByZXZpb3VzX2xkZmxhZ3MKIAogCi1maQotIyBF
eHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dy
YW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKKyAgIyBj
aGVja2luZyBmb3Igb2NhbWwgdG9wbGV2ZWwKKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4
IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9
b2NhbWwiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15
ICR7YWNfdG9vbF9wcmVmaXh9b2NhbWw7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hv
X24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9w
YXRoX1hHRVRURVhUK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19P
Q0FNTCtzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBl
bHNlCi0gIGNhc2UgJFhHRVRURVhUIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9w
YXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0
IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhf
U0VQQVJBVE9SCisgIGlmIHRlc3QgLW4gIiRPQ0FNTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19PQ0FN
TD0iJE9DQU1MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3Nh
dmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKIGZvciBhc19kaXIgaW4gJFBBVEgKIGRv
CiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAg
ICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KICAg
aWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94
ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3BhdGhf
WEdFVFRFWFQ9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgYWNfY3ZfcHJvZ19P
Q0FNTD0iJHthY190b29sX3ByZWZpeH1vY2FtbCIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUK
ICAgICBicmVhayAyCiAgIGZpCkBAIC02NTIyLDQ0ICs0MjIwLDM5IEBAIGRvbmUKICAgZG9uZQog
SUZTPSRhc19zYXZlX0lGUwogCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBh
Y19jdl9wYXRoX1hHRVRURVhUPSJubyIKLSAgOzsKLWVzYWMKIGZpCi1YR0VUVEVYVD0kYWNfY3Zf
cGF0aF9YR0VUVEVYVAotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICB7ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFhHRVRURVhUIiA+JjUKLSRh
c19lY2hvICIkWEdFVFRFWFQiID4mNjsgfQorZmkKK09DQU1MPSRhY19jdl9wcm9nX09DQU1MCitp
ZiB0ZXN0IC1uICIkT0NBTUwiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogcmVzdWx0OiAkT0NBTUwiID4mNQorJGFzX2VjaG8gIiRPQ0FNTCIgPiY2OyB9
CiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0
OiBubyIgPiY1CiAkYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAogCi1pZiB0ZXN0IHgiJHtYR0VU
VEVYVH0iID09IHgibm8iCi10aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5k
IHhnZXR0ZXh0LCBwbGVhc2UgaW5zdGFsbCB4Z2V0dGV4dCIgIiRMSU5FTk8iIDUKIGZpCi0jIEV4
dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFzODYiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5h
bWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGFzODY7IGFjX3dvcmQ9JDIKK2lmIHRlc3QgLXogIiRh
Y19jdl9wcm9nX09DQU1MIjsgdGhlbgorICBhY19jdF9PQ0FNTD0kT0NBTUwKKyAgIyBFeHRyYWN0
IHRoZSBmaXJzdCB3b3JkIG9mICJvY2FtbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3
aXRoIGFyZ3MuCitzZXQgZHVtbXkgb2NhbWw7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19l
Y2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19j
dl9wYXRoX0FTODYrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2Fj
X2N0X09DQU1MK3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+
JjYKIGVsc2UKLSAgY2FzZSAkQVM4NiBpbgotICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3Zf
cGF0aF9BUzg2PSIkQVM4NiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBh
IHBhdGguCi0gIDs7Ci0gICopCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFU
T1IKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0
X09DQU1MPSIkYWNfY3RfT0NBTUwiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0Lgor
ZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgogZm9yIGFzX2RpciBp
biAkUEFUSAogZG8KICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBh
c19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNp
b25zOyBkbwogICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYm
ICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAg
YWNfY3ZfcGF0aF9BUzg2PSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgIGFjX2N2
X3Byb2dfYWNfY3RfT0NBTUw9Im9jYW1sIgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAg
IGJyZWFrIDIKICAgZmkKQEAgLTY1NjcsNDQgKzQyNjAsNTMgQEAgZG9uZQogICBkb25lCiBJRlM9
JGFzX3NhdmVfSUZTCiAKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfQVM4NiIgJiYgYWNfY3ZfcGF0
aF9BUzg2PSJubyIKLSAgOzsKLWVzYWMKIGZpCi1BUzg2PSRhY19jdl9wYXRoX0FTODYKLWlmIHRl
c3QgLW4gIiRBUzg2IjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IHJlc3VsdDogJEFTODYiID4mNQotJGFzX2VjaG8gIiRBUzg2IiA+JjY7IH0KK2ZpCith
Y19jdF9PQ0FNTD0kYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTAoraWYgdGVzdCAtbiAiJGFjX2N0X09D
QU1MIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJl
c3VsdDogJGFjX2N0X09DQU1MIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfT0NBTUwiID4mNjsgfQog
ZWxzZQogICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDog
bm8iID4mNQogJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCiAKLQotaWYgdGVzdCB4IiR7QVM4Nn0i
ID09IHgibm8iCi10aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5kIGFzODYs
IHBsZWFzZSBpbnN0YWxsIGFzODYiICIkTElORU5PIiA1CisgIGlmIHRlc3QgIngkYWNfY3RfT0NB
TUwiID0geDsgdGhlbgorICAgIE9DQU1MPSJubyIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2Nv
bXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhl
ZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2lu
ZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190
b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBPQ0FNTD0kYWNfY3RfT0NBTUwKKyAgZmkKK2Vs
c2UKKyAgT0NBTUw9IiRhY19jdl9wcm9nX09DQU1MIgogZmkKLSMgRXh0cmFjdCB0aGUgZmlyc3Qg
d29yZCBvZiAibGQ4NiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1z
ZXQgZHVtbXkgbGQ4NjsgYWNfd29yZD0kMgorCisKKyAgIyBjaGVja2luZyBmb3Igb2NhbWxkZXAK
KyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZp
cnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxkZXAiLCBzbyBpdCBjYW4gYmUgYSBw
cm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2NhbWxk
ZXA7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
Y2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNf
d29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX0xEODYrc2V0fSIgPSBzZXQ7
IHRoZW4gOgoraWYgdGVzdCAiJHthY19jdl9wcm9nX09DQU1MREVQK3NldH0iID0gc2V0OyB0aGVu
IDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgY2FzZSAkTEQ4NiBpbgot
ICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9MRDg2PSIkTEQ4NiIgIyBMZXQgdGhl
IHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIGFzX3Nh
dmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgaWYgdGVzdCAtbiAiJE9DQU1MREVQ
IjsgdGhlbgorICBhY19jdl9wcm9nX09DQU1MREVQPSIkT0NBTUxERVAiICMgTGV0IHRoZSB1c2Vy
IG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NF
UEFSQVRPUgogZm9yIGFzX2RpciBpbiAkUEFUSAogZG8KICAgSUZTPSRhc19zYXZlX0lGUwogICB0
ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAk
YWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwogICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFj
X3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhl
Y19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9MRDg2PSIkYXNfZGlyLyRhY193b3JkJGFj
X2V4ZWNfZXh0IgorICAgIGFjX2N2X3Byb2dfT0NBTUxERVA9IiR7YWNfdG9vbF9wcmVmaXh9b2Nh
bWxkZXAiCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQg
JGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQpAQCAt
NjYxMiw0NCArNDMxNCwzOSBAQCBkb25lCiAgIGRvbmUKIElGUz0kYXNfc2F2ZV9JRlMKIAotICB0
ZXN0IC16ICIkYWNfY3ZfcGF0aF9MRDg2IiAmJiBhY19jdl9wYXRoX0xEODY9Im5vIgotICA7Owot
ZXNhYwogZmkKLUxEODY9JGFjX2N2X3BhdGhfTEQ4NgotaWYgdGVzdCAtbiAiJExEODYiOyB0aGVu
Ci0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTEQ4
NiIgPiY1Ci0kYXNfZWNobyAiJExEODYiID4mNjsgfQorZmkKK09DQU1MREVQPSRhY19jdl9wcm9n
X09DQU1MREVQCitpZiB0ZXN0IC1uICIkT0NBTUxERVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0NBTUxERVAiID4mNQorJGFzX2Vj
aG8gIiRPQ0FNTERFUCIgPiY2OyB9CiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp
bmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiAkYXNfZWNobyAibm8iID4mNjsgfQogZmkK
IAogCi1pZiB0ZXN0IHgiJHtMRDg2fSIgPT0geCJubyIKLXRoZW4KLSAgICBhc19mbl9lcnJvciAk
PyAiVW5hYmxlIHRvIGZpbmQgbGQ4NiwgcGxlYXNlIGluc3RhbGwgbGQ4NiIgIiRMSU5FTk8iIDUK
IGZpCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImJjYyIsIHNvIGl0IGNhbiBiZSBhIHBy
b2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYmNjOyBhY193b3JkPSQyCitpZiB0ZXN0
IC16ICIkYWNfY3ZfcHJvZ19PQ0FNTERFUCI7IHRoZW4KKyAgYWNfY3RfT0NBTUxERVA9JE9DQU1M
REVQCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2NhbWxkZXAiLCBzbyBpdCBjYW4g
YmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG9jYW1sZGVwOyBhY193b3Jk
PSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZv
ciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+
JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9CQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYg
dGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X09DQU1MREVQK3NldH0iID0gc2V0OyB0aGVuIDoKICAg
JGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgY2FzZSAkQkNDIGluCi0gIFtcXC9d
KiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX0JDQz0iJEJDQyIgIyBMZXQgdGhlIHVzZXIgb3Zl
cnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIGFzX3NhdmVfSUZTPSRJ
RlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MREVQIjsg
dGhlbgorICBhY19jdl9wcm9nX2FjX2N0X09DQU1MREVQPSIkYWNfY3RfT0NBTUxERVAiICMgTGV0
IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZT
PSRQQVRIX1NFUEFSQVRPUgogZm9yIGFzX2RpciBpbiAkUEFUSAogZG8KICAgSUZTPSRhc19zYXZl
X0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4
dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwogICBpZiB7IHRlc3QgLWYgIiRh
c19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dv
cmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9CQ0M9IiRhc19kaXIvJGFj
X3dvcmQkYWNfZXhlY19leHQiCisgICAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTERFUD0ib2NhbWxk
ZXAiCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFz
X2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQpAQCAtNjY1
NywyODMgKzQzNTQsMjQxIEBAIGRvbmUKICAgZG9uZQogSUZTPSRhc19zYXZlX0lGUwogCi0gIHRl
c3QgLXogIiRhY19jdl9wYXRoX0JDQyIgJiYgYWNfY3ZfcGF0aF9CQ0M9Im5vIgotICA7OwotZXNh
YwogZmkKLUJDQz0kYWNfY3ZfcGF0aF9CQ0MKLWlmIHRlc3QgLW4gIiRCQ0MiOyB0aGVuCi0gIHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQkNDIiA+JjUK
LSRhc19lY2hvICIkQkNDIiA+JjY7IH0KK2ZpCithY19jdF9PQ0FNTERFUD0kYWNfY3ZfcHJvZ19h
Y19jdF9PQ0FNTERFUAoraWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MREVQIjsgdGhlbgorICB7ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09DQU1M
REVQIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfT0NBTUxERVAiID4mNjsgfQogZWxzZQogICB7ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQogJGFz
X2VjaG8gIm5vIiA+JjY7IH0KIGZpCiAKLQotaWYgdGVzdCB4IiR7QkNDfSIgPT0geCJubyIKLXRo
ZW4KLSAgICBhc19mbl9lcnJvciAkPyAiVW5hYmxlIHRvIGZpbmQgYmNjLCBwbGVhc2UgaW5zdGFs
bCBiY2MiICIkTElORU5PIiA1CisgIGlmIHRlc3QgIngkYWNfY3RfT0NBTUxERVAiID0geDsgdGhl
bgorICAgIE9DQU1MREVQPSJubyIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzok
YWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhv
c3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0
b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5l
ZD15ZXMgOzsKK2VzYWMKKyAgICBPQ0FNTERFUD0kYWNfY3RfT0NBTUxERVAKKyAgZmkKK2Vsc2UK
KyAgT0NBTUxERVA9IiRhY19jdl9wcm9nX09DQU1MREVQIgogZmkKLSMgRXh0cmFjdCB0aGUgZmly
c3Qgd29yZCBvZiAiaWFzbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3Mu
Ci1zZXQgZHVtbXkgaWFzbDsgYWNfd29yZD0kMgorCisKKyAgIyBjaGVja2luZyBmb3Igb2NhbWxt
a3RvcAorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0
aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1vY2FtbG1rdG9wIiwgc28gaXQgY2Fu
IGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4
fW9jYW1sbWt0b3A7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5n
IGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX0lBU0wrc2V0
fSIgPSBzZXQ7IHRoZW4gOgoraWYgdGVzdCAiJHthY19jdl9wcm9nX09DQU1MTUtUT1Arc2V0fSIg
PSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBjYXNl
ICRJQVNMIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX0lBU0w9IiRJQVNM
IiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAg
KikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBpZiB0ZXN0IC1u
ICIkT0NBTUxNS1RPUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19PQ0FNTE1LVE9QPSIkT0NBTUxNS1RP
UCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0k
SUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCiBmb3IgYXNfZGlyIGluICRQQVRICiBkbwogICBJRlM9
JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFj
X2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCiAgIGlmIHsgdGVz
dCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rp
ci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX0lBU0w9IiRh
c19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgYWNfY3ZfcHJvZ19PQ0FNTE1LVE9QPSIk
e2FjX3Rvb2xfcHJlZml4fW9jYW1sbWt0b3AiCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp
bmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAg
ICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgdGVz
dCAteiAiJGFjX2N2X3BhdGhfSUFTTCIgJiYgYWNfY3ZfcGF0aF9JQVNMPSJubyIKLSAgOzsKLWVz
YWMKLWZpCi1JQVNMPSRhY19jdl9wYXRoX0lBU0wKLWlmIHRlc3QgLW4gIiRJQVNMIjsgdGhlbgot
ICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJElBU0wi
ID4mNQotJGFzX2VjaG8gIiRJQVNMIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2
OyB9Ci1maQotCi0KLWlmIHRlc3QgeCIke0lBU0x9IiA9PSB4Im5vIgotdGhlbgotICAgIGFzX2Zu
X2Vycm9yICQ/ICJVbmFibGUgdG8gZmluZCBpYXNsLCBwbGVhc2UgaW5zdGFsbCBpYXNsIiAiJExJ
TkVOTyIgNQotZmkKLQotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInV1
aWQvdXVpZC5oIiAiYWNfY3ZfaGVhZGVyX3V1aWRfdXVpZF9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1
bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl91dWlkX3V1aWRfaCIgPSB4IiJ5ZXM7IHRoZW4g
OgotCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2lu
ZyBmb3IgdXVpZF9jbGVhciBpbiAtbHV1aWQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9y
IHV1aWRfY2xlYXIgaW4gLWx1dWlkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl91
dWlkX3V1aWRfY2xlYXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVk
KSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHV1
aWQgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAot
LyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHBy
b3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0
IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMg
YXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVz
cGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIHV1aWRfY2xlYXIgKCk7Ci1pbnQKLW1haW4g
KCkKLXsKLXJldHVybiB1dWlkX2NsZWFyICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9G
Ci1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl91dWlk
X3V1aWRfY2xlYXI9eWVzCi1lbHNlCi0gIGFjX2N2X2xpYl91dWlkX3V1aWRfY2xlYXI9bm8KLWZp
Ci1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25m
dGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVf
TElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0
OiAkYWNfY3ZfbGliX3V1aWRfdXVpZF9jbGVhciIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl91
dWlkX3V1aWRfY2xlYXIiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfdXVpZF91dWlkX2Ns
ZWFyIiA9IHgiInllczsgdGhlbiA6Ci0gIGxpYnV1aWQ9InkiCi1maQotCisgIGZpCitkb25lCisg
IGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKIAogZmkKLQotCi1hY19mbl9jX2NoZWNrX2hlYWRlcl9t
b25ncmVsICIkTElORU5PIiAidXVpZC5oIiAiYWNfY3ZfaGVhZGVyX3V1aWRfaCIgIiRhY19pbmNs
dWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfdXVpZF9oIiA9IHgiInllczsg
dGhlbiA6Ci0gIGxpYnV1aWQ9InkiCiBmaQotCi0KLWlmIHRlc3QgIiRsaWJ1dWlkIiAhPSAieSI7
IHRoZW4gOgotCi0gICAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIGEgdmFsaWQgdXVpZCBs
aWJyYXJ5IiAiJExJTkVOTyIgNQotCitPQ0FNTE1LVE9QPSRhY19jdl9wcm9nX09DQU1MTUtUT1AK
K2lmIHRlc3QgLW4gIiRPQ0FNTE1LVE9QIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9DQU1MTUtUT1AiID4mNQorJGFzX2VjaG8gIiRP
Q0FNTE1LVE9QIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CiBmaQogCiAK
LWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJjdXJzZXMuaCIgImFjX2N2
X2hlYWRlcl9jdXJzZXNfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19j
dl9oZWFkZXJfY3Vyc2VzX2giID0geCIieWVzOyB0aGVuIDoKLQotICAgIHsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGNsZWFyIGluIC1sY3Vyc2Vz
IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBjbGVhciBpbiAtbGN1cnNlcy4uLiAiID4m
NjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfY3Vyc2VzX2NsZWFyK3NldH0iID0gc2V0OyB0aGVu
IDoKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19PQ0FNTE1LVE9QIjsgdGhlbgorICBhY19j
dF9PQ0FNTE1LVE9QPSRPQ0FNTE1LVE9QCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAi
b2NhbWxta3RvcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQg
ZHVtbXkgb2NhbWxta3RvcDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hl
Y2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNf
Y3RfT0NBTUxNS1RPUCtzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQp
ICIgPiY2CiBlbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sY3Vy
c2VzICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQK
LS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBw
cm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdo
dCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRz
IGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1
c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBjbGVhciAoKTsKLWludAotbWFpbiAoKQot
ewotcmV0dXJuIGNsZWFyICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19m
bl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9jdXJzZXNfY2xlYXI9
eWVzCisgIGlmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTE1LVE9QIjsgdGhlbgorICBhY19jdl9wcm9n
X2FjX2N0X09DQU1MTUtUT1A9IiRhY19jdF9PQ0FNTE1LVE9QIiAjIExldCB0aGUgdXNlciBvdmVy
cmlkZSB0aGUgdGVzdC4KIGVsc2UKLSAgYWNfY3ZfbGliX2N1cnNlc19jbGVhcj1ubworYXNfc2F2
ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8K
KyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAg
IGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBp
ZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3gg
IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19h
Y19jdF9PQ0FNTE1LVE9QPSJvY2FtbG1rdG9wIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQor
ICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCiBmaQot
cm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRl
c3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJ
QlMKIGZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDog
JGFjX2N2X2xpYl9jdXJzZXNfY2xlYXIiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfY3Vyc2Vz
X2NsZWFyIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX2N1cnNlc19jbGVhciIgPSB4IiJ5
ZXM7IHRoZW4gOgotICBjdXJzZXM9InkiCithY19jdF9PQ0FNTE1LVE9QPSRhY19jdl9wcm9nX2Fj
X2N0X09DQU1MTUtUT1AKK2lmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTE1LVE9QIjsgdGhlbgorICB7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09D
QU1MTUtUT1AiID4mNQorJGFzX2VjaG8gIiRhY19jdF9PQ0FNTE1LVE9QIiA+JjY7IH0KIGVsc2UK
LSAgY3Vyc2VzPSJuIgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCiAKLQorICBpZiB0ZXN0
ICJ4JGFjX2N0X09DQU1MTUtUT1AiID0geDsgdGhlbgorICAgIE9DQU1MTUtUT1A9Im5vIgorICBl
bHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikK
K3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcg
Y3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hv
ICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhv
c3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIE9DQU1M
TUtUT1A9JGFjX2N0X09DQU1MTUtUT1AKKyAgZmkKIGVsc2UKLSAgY3Vyc2VzPSJuIgorICBPQ0FN
TE1LVE9QPSIkYWNfY3ZfcHJvZ19PQ0FNTE1LVE9QIgogZmkKIAogCi1hY19mbl9jX2NoZWNrX2hl
YWRlcl9tb25ncmVsICIkTElORU5PIiAibmN1cnNlcy5oIiAiYWNfY3ZfaGVhZGVyX25jdXJzZXNf
aCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbmN1cnNl
c19oIiA9IHgiInllczsgdGhlbiA6Ci0KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IGNoZWNraW5nIGZvciBjbGVhciBpbiAtbG5jdXJzZXMiID4mNQotJGFzX2Vj
aG9fbiAiY2hlY2tpbmcgZm9yIGNsZWFyIGluIC1sbmN1cnNlcy4uLiAiID4mNjsgfQotaWYgdGVz
dCAiJHthY19jdl9saWJfbmN1cnNlc19jbGVhcitzZXR9IiA9IHNldDsgdGhlbiA6CisgICMgY2hl
Y2tpbmcgZm9yIG9jYW1sbWtsaWIKKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhl
bgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxt
a2xpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkg
JHthY190b29sX3ByZWZpeH1vY2FtbG1rbGliOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNf
ZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNf
Y3ZfcHJvZ19PQ0FNTE1LTElCK3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNh
Y2hlZCkgIiA+JjYKIGVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0i
LWxuY3Vyc2VzICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRh
Y19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRl
cm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGlu
dCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRo
ZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYg
X19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBjbGVhciAoKTsKLWludAotbWFp
biAoKQotewotcmV0dXJuIGNsZWFyICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1p
ZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9uY3Vyc2Vz
X2NsZWFyPXllcworICBpZiB0ZXN0IC1uICIkT0NBTUxNS0xJQiI7IHRoZW4KKyAgYWNfY3ZfcHJv
Z19PQ0FNTE1LTElCPSIkT0NBTUxNS0xJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRl
c3QuCiBlbHNlCi0gIGFjX2N2X2xpYl9uY3Vyc2VzX2NsZWFyPW5vCithc19zYXZlX0lGUz0kSUZT
OyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFz
X3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4
ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAt
ZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8k
YWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX09DQU1MTUtMSUI9
IiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxta2xpYiIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUK
KyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKwogZmkK
LXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0
ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9M
SUJTCiBmaQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6
ICRhY19jdl9saWJfbmN1cnNlc19jbGVhciIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9uY3Vy
c2VzX2NsZWFyIiA+JjY7IH0KLWlmIHRlc3QgIngkYWNfY3ZfbGliX25jdXJzZXNfY2xlYXIiID0g
eCIieWVzOyB0aGVuIDoKLSAgbmN1cnNlcz0ieSIKK09DQU1MTUtMSUI9JGFjX2N2X3Byb2dfT0NB
TUxNS0xJQgoraWYgdGVzdCAtbiAiJE9DQU1MTUtMSUIiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0NBTUxNS0xJQiIgPiY1CiskYXNf
ZWNobyAiJE9DQU1MTUtMSUIiID4mNjsgfQogZWxzZQotICBuY3Vyc2VzPSJuIgorICB7ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2Vj
aG8gIm5vIiA+JjY7IH0KIGZpCiAKIAotZWxzZQotICBuY3Vyc2VzPSJuIgogZmkKLQotCi1pZiB0
ZXN0ICIkY3Vyc2VzIiA9ICJuIiAmJiB0ZXN0ICIkbmN1cnNlcyIgPSAibiI7IHRoZW4gOgotCi0g
ICAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5kIGEgc3VpdGFibGUgY3Vyc2VzIGxpYnJh
cnkiICIkTElORU5PIiA1CitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19PQ0FNTE1LTElCIjsgdGhl
bgorICBhY19jdF9PQ0FNTE1LTElCPSRPQ0FNTE1LTElCCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qg
d29yZCBvZiAib2NhbWxta2xpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFy
Z3MuCitzZXQgZHVtbXkgb2NhbWxta2xpYjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2Vj
aG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2
X3Byb2dfYWNfY3RfT0NBTUxNS0xJQitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24g
IihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTE1LTElCIjsg
dGhlbgorICBhY19jdl9wcm9nX2FjX2N0X09DQU1MTUtMSUI9IiRhY19jdF9PQ0FNTE1LTElCIiAj
IExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7
IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNf
c2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhl
Y19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1m
ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRh
Y193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxN
S0xJQj0ib2NhbWxta2xpYiIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAy
CisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKIAogZmkKLSMgUHJlZmVyIG5j
dXJzZXMgb3ZlciBjdXJzZXMgaWYgYm90aCBhcmUgcHJlc2VudAotaWYgdGVzdCAiJG5jdXJzZXMi
ID0gInkiOyB0aGVuIDoKLQotICAgIENVUlNFU19MSUJTPSItbG5jdXJzZXMiCi0KLSRhc19lY2hv
ICIjZGVmaW5lIElOQ0xVREVfQ1VSU0VTX0ggPG5jdXJzZXMuaD4iID4+Y29uZmRlZnMuaAotCi0K
K2ZpCithY19jdF9PQ0FNTE1LTElCPSRhY19jdl9wcm9nX2FjX2N0X09DQU1MTUtMSUIKK2lmIHRl
c3QgLW4gIiRhY19jdF9PQ0FNTE1LTElCIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09DQU1MTUtMSUIiID4mNQorJGFzX2Vj
aG8gIiRhY19jdF9PQ0FNTE1LTElCIiA+JjY7IH0KIGVsc2UKLQotICAgIENVUlNFU19MSUJTPSIt
bGN1cnNlcyIKLQotJGFzX2VjaG8gIiNkZWZpbmUgSU5DTFVERV9DVVJTRVNfSCA8Y3Vyc2VzLmg+
IiA+PmNvbmZkZWZzLmgKLQotCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAorICBpZiB0
ZXN0ICJ4JGFjX2N0X09DQU1MTUtMSUIiID0geDsgdGhlbgorICAgIE9DQU1MTUtMSUI9Im5vIgor
ICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVz
OikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNp
bmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19l
Y2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRo
IGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIE9D
QU1MTUtMSUI9JGFjX2N0X09DQU1MTUtMSUIKKyAgZmkKK2Vsc2UKKyAgT0NBTUxNS0xJQj0iJGFj
X2N2X3Byb2dfT0NBTUxNS0xJQiIKK2ZpCiAKIAotCi0KLQotCi0KLWlmIHRlc3QgIngkYWNfY3Zf
ZW52X1BLR19DT05GSUdfc2V0IiAhPSAieHNldCI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkYWNfdG9v
bF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29s
X3ByZWZpeH1wa2ctY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJn
cy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXBrZy1jb25maWc7IGFjX3dvcmQ9JDIKKyAg
IyBjaGVja2luZyBmb3Igb2NhbWxkb2MKKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4Ijsg
dGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2Nh
bWxkb2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15
ICR7YWNfdG9vbF9wcmVmaXh9b2NhbWxkb2M7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19l
Y2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19j
dl9wYXRoX1BLR19DT05GSUcrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgdGVzdCAiJHthY19jdl9w
cm9nX09DQU1MRE9DK3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkg
IiA+JjYKIGVsc2UKLSAgY2FzZSAkUEtHX0NPTkZJRyBpbgotICBbXFwvXSogfCA/OltcXC9dKikK
LSAgYWNfY3ZfcGF0aF9QS0dfQ09ORklHPSIkUEtHX0NPTkZJRyIgIyBMZXQgdGhlIHVzZXIgb3Zl
cnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIGFzX3NhdmVfSUZTPSRJ
RlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgaWYgdGVzdCAtbiAiJE9DQU1MRE9DIjsgdGhlbgor
ICBhY19jdl9wcm9nX09DQU1MRE9DPSIkT0NBTUxET0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRl
IHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgog
Zm9yIGFzX2RpciBpbiAkUEFUSAogZG8KICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIk
YXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0
YWJsZV9leHRlbnNpb25zOyBkbwogICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNf
ZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9
OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9QS0dfQ09ORklHPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4
ZWNfZXh0IgorICAgIGFjX2N2X3Byb2dfT0NBTUxET0M9IiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxk
b2MiCiAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFz
X2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQpAQCAtNjk0
MSwxMyArNDU5NiwxMiBAQCBkb25lCiAgIGRvbmUKIElGUz0kYXNfc2F2ZV9JRlMKIAotICA7Owot
ZXNhYwogZmkKLVBLR19DT05GSUc9JGFjX2N2X3BhdGhfUEtHX0NPTkZJRwotaWYgdGVzdCAtbiAi
JFBLR19DT05GSUciOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiAkUEtHX0NPTkZJRyIgPiY1Ci0kYXNfZWNobyAiJFBLR19DT05GSUciID4m
NjsgfQorZmkKK09DQU1MRE9DPSRhY19jdl9wcm9nX09DQU1MRE9DCitpZiB0ZXN0IC1uICIkT0NB
TUxET0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiAkT0NBTUxET0MiID4mNQorJGFzX2VjaG8gIiRPQ0FNTERPQyIgPiY2OyB9CiBlbHNl
CiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIg
PiY1CiAkYXNfZWNobyAibm8iID4mNjsgfQpAQCAtNjk1NSwyOCArNDYwOSwyNiBAQCBmaQogCiAK
IGZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9QS0dfQ09ORklHIjsgdGhlbgotICBhY19wdF9Q
S0dfQ09ORklHPSRQS0dfQ09ORklHCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicGtn
LWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVt
bXkgcGtnLWNvbmZpZzsgYWNfd29yZD0kMgoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT0NBTUxE
T0MiOyB0aGVuCisgIGFjX2N0X09DQU1MRE9DPSRPQ0FNTERPQworICAjIEV4dHJhY3QgdGhlIGZp
cnN0IHdvcmQgb2YgIm9jYW1sZG9jIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGgg
YXJncy4KK3NldCBkdW1teSBvY2FtbGRvYzsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2Vj
aG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2
X3BhdGhfYWNfcHRfUEtHX0NPTkZJRytzZXR9IiA9IHNldDsgdGhlbiA6CitpZiB0ZXN0ICIke2Fj
X2N2X3Byb2dfYWNfY3RfT0NBTUxET0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19u
ICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBjYXNlICRhY19wdF9QS0dfQ09ORklHIGluCi0gIFtc
XC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUc9IiRhY19wdF9Q
S0dfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4K
LSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBp
ZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxET0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfT0NB
TUxET0M9IiRhY19jdF9PQ0FNTERPQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qu
CitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCiBmb3IgYXNfZGly
IGluICRQQVRICiBkbwogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYm
IGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVu
c2lvbnM7IGRvCiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIg
JiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAg
ICBhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUc9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19l
eHQiCisgICAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTERPQz0ib2NhbWxkb2MiCiAgICAgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRh
Y19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQpAQCAtNjk4NCwyMCArNDYzNiwxOSBA
QCBkb25lCiAgIGRvbmUKIElGUz0kYXNfc2F2ZV9JRlMKIAotICA7OwotZXNhYwogZmkKLWFjX3B0
X1BLR19DT05GSUc9JGFjX2N2X3BhdGhfYWNfcHRfUEtHX0NPTkZJRwotaWYgdGVzdCAtbiAiJGFj
X3B0X1BLR19DT05GSUciOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogcmVzdWx0OiAkYWNfcHRfUEtHX0NPTkZJRyIgPiY1Ci0kYXNfZWNobyAiJGFjX3B0
X1BLR19DT05GSUciID4mNjsgfQorZmkKK2FjX2N0X09DQU1MRE9DPSRhY19jdl9wcm9nX2FjX2N0
X09DQU1MRE9DCitpZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxET0MiOyB0aGVuCisgIHsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0NBTUxET0Mi
ID4mNQorJGFzX2VjaG8gIiRhY19jdF9PQ0FNTERPQyIgPiY2OyB9CiBlbHNlCiAgIHsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiAkYXNfZWNo
byAibm8iID4mNjsgfQogZmkKIAotICBpZiB0ZXN0ICJ4JGFjX3B0X1BLR19DT05GSUciID0geDsg
dGhlbgotICAgIFBLR19DT05GSUc9IiIKKyAgaWYgdGVzdCAieCRhY19jdF9PQ0FNTERPQyIgPSB4
OyB0aGVuCisgICAgT0NBTUxET0M9Im5vIgogICBlbHNlCiAgICAgY2FzZSAkY3Jvc3NfY29tcGls
aW5nOiRhY190b29sX3dhcm5lZCBpbgogeWVzOikKQEAgLTcwMDUsNjI0ICs0NjU2LDcxOCBAQCB5
ZXM6KQogJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHBy
ZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQogYWNfdG9vbF93YXJuZWQ9eWVzIDs7CiBl
c2FjCi0gICAgUEtHX0NPTkZJRz0kYWNfcHRfUEtHX0NPTkZJRworICAgIE9DQU1MRE9DPSRhY19j
dF9PQ0FNTERPQwogICBmaQogZWxzZQotICBQS0dfQ09ORklHPSIkYWNfY3ZfcGF0aF9QS0dfQ09O
RklHIgotZmkKLQotZmkKLWlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgotCV9wa2dfbWlu
X3ZlcnNpb249MC45LjAKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IGNoZWNraW5nIHBrZy1jb25maWcgaXMgYXQgbGVhc3QgdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lv
biIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBwa2ctY29uZmlnIGlzIGF0IGxlYXN0IHZlcnNp
b24gJF9wa2dfbWluX3ZlcnNpb24uLi4gIiA+JjY7IH0KLQlpZiAkUEtHX0NPTkZJRyAtLWF0bGVh
c3QtcGtnY29uZmlnLXZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb247IHRoZW4KLQkJeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNo
byAieWVzIiA+JjY7IH0KLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCQlQS0dfQ09O
RklHPSIiCi0JZmkKLWZpCi0KLXBrZ19mYWlsZWQ9bm8KLXsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdsaWIiID4mNQotJGFzX2VjaG9fbiAiY2hl
Y2tpbmcgZm9yIGdsaWIuLi4gIiA+JjY7IH0KLQotaWYgdGVzdCAtbiAiJGdsaWJfQ0ZMQUdTIjsg
dGhlbgotICAgIHBrZ19jdl9nbGliX0NGTEFHUz0iJGdsaWJfQ0ZMQUdTIgotIGVsaWYgdGVzdCAt
biAiJFBLR19DT05GSUciOyB0aGVuCi0gICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwK
LSAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09O
RklHIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzIFwiZ2xpYi0yLjBcIiI7IH0gPiY1Ci0gICgkUEtH
X0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAiZ2xpYi0yLjAiKSAyPiY1Ci0gIGFjX3N0
YXR1cz0kPwotICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAk
YWNfc3RhdHVzIiA+JjUKLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgotICBwa2dfY3Zf
Z2xpYl9DRkxBR1M9YCRQS0dfQ09ORklHIC0tY2ZsYWdzICJnbGliLTIuMCIgMj4vZGV2L251bGxg
Ci1lbHNlCi0gIHBrZ19mYWlsZWQ9eWVzCi1maQotIGVsc2UKLSAgICBwa2dfZmFpbGVkPXVudHJp
ZWQKLWZpCi1pZiB0ZXN0IC1uICIkZ2xpYl9MSUJTIjsgdGhlbgotICAgIHBrZ19jdl9nbGliX0xJ
QlM9IiRnbGliX0xJQlMiCi0gZWxpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KLSAgICBp
ZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyIgJiYgXAotICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiBcJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMg
XCJnbGliLTIuMFwiIjsgfSA+JjUKLSAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJy
b3JzICJnbGliLTIuMCIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICB0ZXN0ICRhY19z
dGF0dXMgPSAwOyB9OyB0aGVuCi0gIHBrZ19jdl9nbGliX0xJQlM9YCRQS0dfQ09ORklHIC0tbGli
cyAiZ2xpYi0yLjAiIDI+L2Rldi9udWxsYAotZWxzZQotICBwa2dfZmFpbGVkPXllcwotZmkKLSBl
bHNlCi0gICAgcGtnX2ZhaWxlZD11bnRyaWVkCi1maQotCi0KLQotaWYgdGVzdCAkcGtnX2ZhaWxl
ZCA9IHllczsgdGhlbgotICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCi1pZiAkUEtHX0NPTkZJ
RyAtLWF0bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gMC4yMDsgdGhlbgotICAgICAgICBfcGtnX3No
b3J0X2Vycm9yc19zdXBwb3J0ZWQ9eWVzCi1lbHNlCi0gICAgICAgIF9wa2dfc2hvcnRfZXJyb3Jz
X3N1cHBvcnRlZD1ubworICBPQ0FNTERPQz0iJGFjX2N2X3Byb2dfT0NBTUxET0MiCiBmaQotICAg
ICAgICBpZiB0ZXN0ICRfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQgPSB5ZXM7IHRoZW4KLQkg
ICAgICAgIGdsaWJfUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1zaG9ydC1lcnJvcnMgLS1wcmlu
dC1lcnJvcnMgImdsaWItMi4wIiAyPiYxYAotICAgICAgICBlbHNlCi0JICAgICAgICBnbGliX1BL
R19FUlJPUlM9YCRQS0dfQ09ORklHIC0tcHJpbnQtZXJyb3JzICJnbGliLTIuMCIgMj4mMWAKLSAg
ICAgICAgZmkKLQkjIFB1dCB0aGUgbmFzdHkgZXJyb3IgbWVzc2FnZSBpbiBjb25maWcubG9nIHdo
ZXJlIGl0IGJlbG9uZ3MKLQllY2hvICIkZ2xpYl9QS0dfRVJST1JTIiA+JjUKLQotCWFzX2ZuX2Vy
cm9yICQ/ICJQYWNrYWdlIHJlcXVpcmVtZW50cyAoZ2xpYi0yLjApIHdlcmUgbm90IG1ldDoKLQot
JGdsaWJfUEtHX0VSUk9SUwotCi1Db25zaWRlciBhZGp1c3RpbmcgdGhlIFBLR19DT05GSUdfUEFU
SCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiB5b3UKLWluc3RhbGxlZCBzb2Z0d2FyZSBpbiBhIG5v
bi1zdGFuZGFyZCBwcmVmaXguCi0KLUFsdGVybmF0aXZlbHksIHlvdSBtYXkgc2V0IHRoZSBlbnZp
cm9ubWVudCB2YXJpYWJsZXMgZ2xpYl9DRkxBR1MKLWFuZCBnbGliX0xJQlMgdG8gYXZvaWQgdGhl
IG5lZWQgdG8gY2FsbCBwa2ctY29uZmlnLgotU2VlIHRoZSBwa2ctY29uZmlnIG1hbiBwYWdlIGZv
ciBtb3JlIGRldGFpbHMuIiAiJExJTkVOTyIgNQotZWxpZiB0ZXN0ICRwa2dfZmFpbGVkID0gdW50
cmllZDsgdGhlbgotICAgICAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0JeyB7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Ci0k
YXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Ci1hc19mbl9lcnJv
ciAkPyAiVGhlIHBrZy1jb25maWcgc2NyaXB0IGNvdWxkIG5vdCBiZSBmb3VuZCBvciBpcyB0b28g
b2xkLiAgTWFrZSBzdXJlIGl0Ci1pcyBpbiB5b3VyIFBBVEggb3Igc2V0IHRoZSBQS0dfQ09ORklH
IGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBmdWxsCi1wYXRoIHRvIHBrZy1jb25maWcuCiAK
LUFsdGVybmF0aXZlbHksIHlvdSBtYXkgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZ2xp
Yl9DRkxBR1MKLWFuZCBnbGliX0xJQlMgdG8gYXZvaWQgdGhlIG5lZWQgdG8gY2FsbCBwa2ctY29u
ZmlnLgotU2VlIHRoZSBwa2ctY29uZmlnIG1hbiBwYWdlIGZvciBtb3JlIGRldGFpbHMuCiAKLVRv
IGdldCBwa2ctY29uZmlnLCBzZWUgPGh0dHA6Ly9wa2ctY29uZmlnLmZyZWVkZXNrdG9wLm9yZy8+
LgotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUgOyB9Cisg
ICMgY2hlY2tpbmcgZm9yIG9jYW1sYnVpbGQKKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4
IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9
b2NhbWxidWlsZCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQg
ZHVtbXkgJHthY190b29sX3ByZWZpeH1vY2FtbGJ1aWxkOyBhY193b3JkPSQyCit7ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1
CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3Qg
IiR7YWNfY3ZfcHJvZ19PQ0FNTEJVSUxEK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9f
biAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLQlnbGliX0NGTEFHUz0kcGtnX2N2X2dsaWJfQ0ZMQUdT
Ci0JZ2xpYl9MSUJTPSRwa2dfY3ZfZ2xpYl9MSUJTCi0gICAgICAgIHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIg
PiY2OyB9Ci0KLWZpCi0KLSMgQ2hlY2sgbGlicmFyeSBwYXRoCi1pZiB0ZXN0ICJcJHtleGVjX3By
ZWZpeH0vbGliIiA9ICIkbGliZGlyIjsgdGhlbiA6Ci0gIGlmIHRlc3QgIiRleGVjX3ByZWZpeCIg
PSAiTk9ORSIgJiYgdGVzdCAiJHByZWZpeCIgIT0gIk5PTkUiOyB0aGVuIDoKLSAgZXhlY19wcmVm
aXg9JHByZWZpeAotZmkKLSAgICBpZiB0ZXN0ICIkZXhlY19wcmVmaXgiID0gIk5PTkUiOyB0aGVu
IDoKLSAgZXhlY19wcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci1maQotICAgIGlmIHRlc3QgLWQg
IiR7ZXhlY19wcmVmaXh9L2xpYjY0IjsgdGhlbiA6Ci0KLSAgICAgICAgTElCX1BBVEg9ImxpYjY0
IgotCisgIGlmIHRlc3QgLW4gIiRPQ0FNTEJVSUxEIjsgdGhlbgorICBhY19jdl9wcm9nX09DQU1M
QlVJTEQ9IiRPQ0FNTEJVSUxEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KIGVs
c2UKLQotICAgICAgICBMSUJfUEFUSD0ibGliIgorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRI
X1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUwor
ICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAn
JyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIv
JGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNf
ZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19PQ0FNTEJVSUxEPSIke2FjX3Rvb2xf
cHJlZml4fW9jYW1sYnVpbGQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsg
MgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCiAKIGZpCi0KLWVsc2UKLQot
ICAgIExJQl9QQVRIPSIke2xpYmRpcjpgZXhwciBsZW5ndGggIiRleGVjX3ByZWZpeCIgKyAxYH0i
Ci0KIGZpCi0KLQotIyBDaGVja3MgZm9yIGxpYnJhcmllcy4KLWFjX2ZuX2NfY2hlY2tfaGVhZGVy
X21vbmdyZWwgIiRMSU5FTk8iICJiemxpYi5oIiAiYWNfY3ZfaGVhZGVyX2J6bGliX2giICIkYWNf
aW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2J6bGliX2giID0geCIi
eWVzOyB0aGVuIDoKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBj
aGVja2luZyBmb3IgQloyX2J6RGVjb21wcmVzc0luaXQgaW4gLWxiejIiID4mNQotJGFzX2VjaG9f
biAiY2hlY2tpbmcgZm9yIEJaMl9iekRlY29tcHJlc3NJbml0IGluIC1sYnoyLi4uICIgPiY2OyB9
Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9iejJfQloyX2J6RGVjb21wcmVzc0luaXQrc2V0fSIgPSBz
ZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVj
a19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGJ6MiAgJExJQlMiCi1jYXQgY29uZmRlZnMu
aCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0K
LS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9y
LgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9m
IGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQg
c3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYK
LWNoYXIgQloyX2J6RGVjb21wcmVzc0luaXQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBC
WjJfYnpEZWNvbXByZXNzSW5pdCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYg
YWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfYnoyX0JaMl9i
ekRlY29tcHJlc3NJbml0PXllcworT0NBTUxCVUlMRD0kYWNfY3ZfcHJvZ19PQ0FNTEJVSUxECitp
ZiB0ZXN0IC1uICIkT0NBTUxCVUlMRCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPQ0FNTEJVSUxEIiA+JjUKKyRhc19lY2hvICIkT0NB
TUxCVUlMRCIgPiY2OyB9CiBlbHNlCi0gIGFjX2N2X2xpYl9iejJfQloyX2J6RGVjb21wcmVzc0lu
aXQ9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwK
LSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tf
bGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogcmVzdWx0OiAkYWNfY3ZfbGliX2J6Ml9CWjJfYnpEZWNvbXByZXNzSW5pdCIgPiY1Ci0kYXNf
ZWNobyAiJGFjX2N2X2xpYl9iejJfQloyX2J6RGVjb21wcmVzc0luaXQiID4mNjsgfQotaWYgdGVz
dCAieCRhY19jdl9saWJfYnoyX0JaMl9iekRlY29tcHJlc3NJbml0IiA9IHgiInllczsgdGhlbiA6
Ci0gIHpsaWI9IiR6bGliIC1ESEFWRV9CWkxJQiAtbGJ6MiIKKyAgeyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2
OyB9CiBmaQogCiAKIGZpCi0KLQotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVO
TyIgImx6bWEuaCIgImFjX2N2X2hlYWRlcl9sem1hX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIK
LWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2x6bWFfaCIgPSB4IiJ5ZXM7IHRoZW4gOgotCi17ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsem1hX3N0
cmVhbV9kZWNvZGVyIGluIC1sbHptYSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgbHpt
YV9zdHJlYW1fZGVjb2RlciBpbiAtbGx6bWEuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zf
bGliX2x6bWFfbHptYV9zdHJlYW1fZGVjb2RlcitzZXR9IiA9IHNldDsgdGhlbiA6CitpZiB0ZXN0
IC16ICIkYWNfY3ZfcHJvZ19PQ0FNTEJVSUxEIjsgdGhlbgorICBhY19jdF9PQ0FNTEJVSUxEPSRP
Q0FNTEJVSUxECisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2NhbWxidWlsZCIsIHNv
IGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgb2NhbWxidWls
ZDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBj
aGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193
b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfT0NBTUxCVUlMRCtz
ZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0g
IGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sbHptYSAgJExJQlMiCi1jYXQg
Y29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMu
aC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lk
IGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVy
biB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5
cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMi
Ci0jZW5kaWYKLWNoYXIgbHptYV9zdHJlYW1fZGVjb2RlciAoKTsKLWludAotbWFpbiAoKQotewot
cmV0dXJuIGx6bWFfc3RyZWFtX2RlY29kZXIgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNF
T0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2x6
bWFfbHptYV9zdHJlYW1fZGVjb2Rlcj15ZXMKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MQlVJ
TEQiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxCVUlMRD0iJGFjX2N0X09DQU1MQlVJ
TEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgogZWxzZQotICBhY19jdl9saWJf
bHptYV9sem1hX3N0cmVhbV9kZWNvZGVyPW5vCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhf
U0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisg
IHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcn
ICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8k
YWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19l
eGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X09DQU1MQlVJTEQ9Im9jYW1s
YnVpbGQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQg
JGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9u
ZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKIGZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVy
ciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3Qu
JGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKLXsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2x6bWFfbHptYV9z
dHJlYW1fZGVjb2RlciIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9sem1hX2x6bWFfc3RyZWFt
X2RlY29kZXIiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfbHptYV9sem1hX3N0cmVhbV9k
ZWNvZGVyIiA9IHgiInllczsgdGhlbiA6Ci0gIHpsaWI9IiR6bGliIC1ESEFWRV9MWk1BIC1sbHpt
YSIKK2FjX2N0X09DQU1MQlVJTEQ9JGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxCVUlMRAoraWYgdGVz
dCAtbiAiJGFjX2N0X09DQU1MQlVJTEQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0NBTUxCVUlMRCIgPiY1CiskYXNfZWNo
byAiJGFjX2N0X09DQU1MQlVJTEQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7
IH0KIGZpCiAKLQorICBpZiB0ZXN0ICJ4JGFjX2N0X09DQU1MQlVJTEQiID0geDsgdGhlbgorICAg
IE9DQU1MQlVJTEQ9Im5vIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190
b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0
cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xz
IG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXll
cyA7OworZXNhYworICAgIE9DQU1MQlVJTEQ9JGFjX2N0X09DQU1MQlVJTEQKKyAgZmkKK2Vsc2UK
KyAgT0NBTUxCVUlMRD0iJGFjX2N2X3Byb2dfT0NBTUxCVUlMRCIKIGZpCiAKIAotYWNfZm5fY19j
aGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImx6by9sem8xeC5oIiAiYWNfY3ZfaGVhZGVy
X2x6b19sem8xeF9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hl
YWRlcl9sem9fbHpvMXhfaCIgPSB4IiJ5ZXM7IHRoZW4gOgorICAgIGlmIHRlc3QgIngkT0NBTUxD
IiA9ICJ4bm8iOyB0aGVuIDoKIAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiBjaGVja2luZyBmb3IgbHpvMXhfZGVjb21wcmVzcyBpbiAtbGx6bzIiID4mNQotJGFzX2Vj
aG9fbiAiY2hlY2tpbmcgZm9yIGx6bzF4X2RlY29tcHJlc3MgaW4gLWxsem8yLi4uICIgPiY2OyB9
Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9sem8yX2x6bzF4X2RlY29tcHJlc3Mrc2V0fSIgPSBzZXQ7
IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19s
aWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGx6bzIgICRMSUJTIgotY2F0IGNvbmZkZWZzLmgg
LSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLworICAg
ICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9vY2FtbHRvb2xzIiA9ICJ4eWVzIjsgdGhlbiA6CiAKLS8q
IE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgot
ICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEg
R0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3Rp
bGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNo
YXIgbHpvMXhfZGVjb21wcmVzcyAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGx6bzF4X2Rl
Y29tcHJlc3MgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5
X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfbGliX2x6bzJfbHpvMXhfZGVjb21wcmVz
cz15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX2x6bzJfbHpvMXhfZGVjb21wcmVzcz1ubwotZmkKLXJt
IC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0
JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJT
CisgICAgICAgICAgICBhc19mbl9lcnJvciAkPyAiT2NhbWwgdG9vbHMgZW5hYmxlZCwgYnV0IHVu
YWJsZSB0byBmaW5kIE9jYW1sIiAiJExJTkVOTyIgNQogZmkKLXsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2x6bzJfbHpvMXhfZGVjb21w
cmVzcyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2xpYl9sem8yX2x6bzF4X2RlY29tcHJlc3MiID4m
NjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfbHpvMl9sem8xeF9kZWNvbXByZXNzIiA9IHgiInll
czsgdGhlbiA6Ci0gIHpsaWI9IiR6bGliIC1ESEFWRV9MWk8xWCAtbGx6bzIiCisgICAgICAgIG9j
YW1sdG9vbHM9Im4iCisKIGZpCiAKK2ZpCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImJh
c2giLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGJh
c2g7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
Y2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNf
d29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX0JBU0grc2V0fSIgPSBzZXQ7
IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRCQVNI
IGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0JBU0g9IiRCQVNIIiAjIExl
dCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAg
YXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFU
SAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9
LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBk
bworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190
ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3Zf
cGF0aF9CQVNIPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhl
Y19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZl
X0lGUwogCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0JBU0giICYmIGFjX2N2X3BhdGhfQkFTSD0i
bm8iCisgIDs7Citlc2FjCitmaQorQkFTSD0kYWNfY3ZfcGF0aF9CQVNICitpZiB0ZXN0IC1uICIk
QkFTSCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBy
ZXN1bHQ6ICRCQVNIIiA+JjUKKyRhc19lY2hvICIkQkFTSCIgPiY2OyB9CitlbHNlCisgIHsgJGFz
X2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNf
ZWNobyAibm8iID4mNjsgfQogZmkKIAogCitpZiB0ZXN0IHgiJHtCQVNIfSIgPT0geCJubyIKK3Ro
ZW4KKyAgICBhc19mbl9lcnJvciAkPyAiVW5hYmxlIHRvIGZpbmQgYmFzaCwgcGxlYXNlIGluc3Rh
bGwgYmFzaCIgIiRMSU5FTk8iIDUKK2ZpCiAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogY2hlY2tpbmcgZm9yIGlvX3NldHVwIGluIC1sYWlvIiA+JjUKLSRhc19lY2hv
X24gImNoZWNraW5nIGZvciBpb19zZXR1cCBpbiAtbGFpby4uLiAiID4mNjsgfQotaWYgdGVzdCAi
JHthY19jdl9saWJfYWlvX2lvX3NldHVwK3NldH0iID0gc2V0OyB0aGVuIDoKK2FjX2V4dD1jCith
Y19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZM
QUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4
ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4m
NScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK3sgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVw
cm9jZXNzb3IiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVw
cm9jZXNzb3IuLi4gIiA+JjY7IH0KKyMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBk
aXJlY3RvcnkuCitpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgorICBD
UFA9CitmaQoraWYgdGVzdCAteiAiJENQUCI7IHRoZW4KKyAgaWYgdGVzdCAiJHthY19jdl9wcm9n
X0NQUCtzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBl
bHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sYWlvICAkTElCUyIK
LWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKyAgICAgICMgRG91
YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAorICAgIGZvciBDUFAg
aW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCisgICAgZG8K
KyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGlu
ICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBz
byBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jr
cy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRl
ZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcg
Y29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2gg
dGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4
IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8
PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBP
dmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAg
IFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdD
QwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxs
IGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgorI2lmZGVmIF9fU1RE
Q19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CiAj
ZW5kaWYKLWNoYXIgaW9fc2V0dXAgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBpb19zZXR1
cCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KKwkJICAgICBTeW50YXggZXJyb3IKIF9BQ0VPRgot
aWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfYWlvX2lv
X3NldHVwPXllcworaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisKIGVsc2UK
LSAgYWNfY3ZfbGliX2Fpb19pb19zZXR1cD1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJy
IGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4k
YWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCisgICMgQnJva2VuOiBmYWlscyBv
biB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCiBmaQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfYWlvX2lvX3NldHVwIiA+JjUKLSRhc19l
Y2hvICIkYWNfY3ZfbGliX2Fpb19pb19zZXR1cCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xp
Yl9haW9faW9fc2V0dXAiID0geCIieWVzOyB0aGVuIDoKLSAgc3lzdGVtX2Fpbz0ieSIKK3JtIC1m
IGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3Jr
cyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycwor
ICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9G
ID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNf
bm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhl
biA6CisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQogZWxz
ZQotICBzeXN0ZW1fYWlvPSJuIgorICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19v
az06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRh
Y19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdz
IGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVy
ciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6CisgIGJyZWFrCiBm
aQogCisgICAgZG9uZQorICAgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKIAoteyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgTUQ1IGluIC1sY3J5cHRvIiA+
JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBNRDUgaW4gLWxjcnlwdG8uLi4gIiA+JjY7IH0K
LWlmIHRlc3QgIiR7YWNfY3ZfbGliX2NyeXB0b19NRDUrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAk
YXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZmkKKyAgQ1BQPSRhY19jdl9wcm9nX0NQUAogZWxz
ZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbGNyeXB0byAgJExJQlMi
Ci1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisgIGFjX2N2X3By
b2dfQ1BQPSRDUFAKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IHJlc3VsdDogJENQUCIgPiY1CiskYXNfZWNobyAiJENQUCIgPiY2OyB9CithY19wcmVwcm9jX29r
PWZhbHNlCitmb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNl
IGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMK
KyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1p
dHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxs
aW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0
aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNl
ciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBj
YXRjaCB0aGlzIGNhc2UuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRh
Y19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRl
cm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGlu
dCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRo
ZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYg
X19jcGx1c3BsdXMKLWV4dGVybiAiQyIKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1p
dHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgogI2VuZGlmCi1jaGFyIE1ENSAoKTsK
LWludAotbWFpbiAoKQotewotcmV0dXJuIE1ENSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KKwkJ
ICAgICBTeW50YXggZXJyb3IKIF9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7
IHRoZW4gOgotICBhY19jdl9saWJfY3J5cHRvX01ENT15ZXMKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAi
JExJTkVOTyI7IHRoZW4gOgorCiBlbHNlCi0gIGFjX2N2X2xpYl9jcnlwdG9fTUQ1PW5vCi1maQot
cm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRl
c3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJ
QlMKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKIGZpCi17ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9j
cnlwdG9fTUQ1IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX2NyeXB0b19NRDUiID4mNjsgfQot
aWYgdGVzdCAieCRhY19jdl9saWJfY3J5cHRvX01ENSIgPSB4IiJ5ZXM7IHRoZW4gOgotICBjYXQg
Pj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfTElCQ1JZUFRPIDEKK3JtIC1mIGNv
bmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBv
biBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworICAj
IGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5j
b25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9u
ZXhpc3RlbnQuaD4KIF9BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6
CisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQor
ICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1m
IGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKIAotICBMSUJTPSItbGNy
eXB0byAkTElCUyIKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVM
U0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVz
dC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgogCiBlbHNl
Ci0gIGFzX2ZuX2Vycm9yICQ/ICJDb3VsZCBub3QgZmluZCBsaWJjcnlwdG8iICIkTElORU5PIiA1
CisgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4g
XGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6
IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gIkMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNh
bml0eSBjaGVjaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8i
IDUgOyB9CiBmaQogCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNo
ZWNraW5nIGZvciBleHQyZnNfb3BlbjIgaW4gLWxleHQyZnMiID4mNQotJGFzX2VjaG9fbiAiY2hl
Y2tpbmcgZm9yIGV4dDJmc19vcGVuMiBpbiAtbGV4dDJmcy4uLiAiID4mNjsgfQotaWYgdGVzdCAi
JHthY19jdl9saWJfZXh0MmZzX2V4dDJmc19vcGVuMitzZXR9IiA9IHNldDsgdGhlbiA6CithY19l
eHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdT
ICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVz
dCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAk
TElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworeyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ3JlcCB0
aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcg
Zm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lLi4uICIgPiY2OyB9CitpZiB0
ZXN0ICIke2FjX2N2X3BhdGhfR1JFUCtzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24g
IihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJ
QlM9Ii1sZXh0MmZzICAkTElCUyIKLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0
LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAgaWYgdGVzdCAteiAiJEdSRVAiOyB0
aGVuCisgIGFjX3BhdGhfR1JFUF9mb3VuZD1mYWxzZQorICAjIExvb3AgdGhyb3VnaCB0aGUgdXNl
cidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorICBhc19zYXZlX0lG
Uz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQ
QVJBVE9SL3Vzci94cGc0L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIk
YXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCisg
ICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisg
ICAgICBhY19wYXRoX0dSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCisgICAgICB7
IHRlc3QgLWYgIiRhY19wYXRoX0dSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0dSRVAiOyB9
IHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9HUkVQIGFuZCBzZWxlY3QgaXQg
aWYgaXQgaXMgZm91bmQuCisgICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9HUkVQCitjYXNlIGAi
JGFjX3BhdGhfR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9H
UkVQPSIkYWNfcGF0aF9HUkVQIiBhY19wYXRoX0dSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3Vu
dD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6Cisg
IGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIK
KyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0Lmlu
IiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0dSRVAnID4+ICJjb25mdGVzdC5ubCIKKyAg
ICAiJGFjX3BhdGhfR1JFUCIgLWUgJ0dSRVAkJyAtZSAnLShjYW5ub3QgbWF0Y2gpLScgPCAiY29u
ZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworICAgIGRpZmYg
ImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKyAg
ICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKKyAgICBpZiB0
ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0dSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJl
c3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUK
KyAgICAgIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIKKyAgICAgIGFjX3BhdGhfR1JF
UF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBz
ZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFr
CisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNv
bmZ0ZXN0Lm91dDs7Citlc2FjCiAKLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90
eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0
Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1
bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVz
Ci1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgZXh0MmZzX29wZW4yICgpOwotaW50Ci1tYWluICgp
Ci17Ci1yZXR1cm4gZXh0MmZzX29wZW4yICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9G
Ci1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9leHQy
ZnNfZXh0MmZzX29wZW4yPXllcworICAgICAgJGFjX3BhdGhfR1JFUF9mb3VuZCAmJiBicmVhayAz
CisgICAgZG9uZQorICBkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKyAgaWYgdGVzdCAt
eiAiJGFjX2N2X3BhdGhfR1JFUCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0
YWJsZSBncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0
L2JpbiIgIiRMSU5FTk8iIDUKKyAgZmkKIGVsc2UKLSAgYWNfY3ZfbGliX2V4dDJmc19leHQyZnNf
b3BlbjI9bm8KKyAgYWNfY3ZfcGF0aF9HUkVQPSRHUkVQCiBmaQotcm0gLWYgY29yZSBjb25mdGVz
dC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0
ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKKwogZmkKLXsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2V4dDJm
c19leHQyZnNfb3BlbjIiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfZXh0MmZzX2V4dDJmc19v
cGVuMiIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9leHQyZnNfZXh0MmZzX29wZW4yIiA9
IHgiInllczsgdGhlbiA6Ci0gIGxpYmV4dDJmcz0ieSIKK3sgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9HUkVQIiA+JjUKKyRhc19lY2hv
ICIkYWNfY3ZfcGF0aF9HUkVQIiA+JjY7IH0KKyBHUkVQPSIkYWNfY3ZfcGF0aF9HUkVQIgorCisK
K3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGVn
cmVwIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBlZ3JlcC4uLiAiID4mNjsgfQoraWYg
dGVzdCAiJHthY19jdl9wYXRoX0VHUkVQK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9f
biAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgbGliZXh0MmZzPSJuIgorICBpZiBlY2hvIGEgfCAk
R1JFUCAtRSAnKGF8YiknID4vZGV2L251bGwgMj4mMQorICAgdGhlbiBhY19jdl9wYXRoX0VHUkVQ
PSIkR1JFUCAtRSIKKyAgIGVsc2UKKyAgICAgaWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgorICBh
Y19wYXRoX0VHUkVQX2ZvdW5kPWZhbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0
aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisgIGFzX3NhdmVfSUZTPSRJRlM7
IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1Iv
dXNyL3hwZzQvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIi
ICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX3Byb2cgaW4gZWdyZXA7IGRvCisgICAgZm9yIGFjX2V4
ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBhY19wYXRo
X0VHUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgeyB0ZXN0IC1mICIk
YWNfcGF0aF9FR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfRUdSRVAiOyB9IHx8IGNvbnRp
bnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlz
IGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfRUdSRVAKK2Nhc2UgYCIkYWNfcGF0
aF9FR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9FR1JFUD0i
JGFjX3BhdGhfRUdSRVAiIGFjX3BhdGhfRUdSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0w
CisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRv
CisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAg
ICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAi
Y29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0VHUkVQJyA+PiAiY29uZnRlc3QubmwiCisgICAg
IiRhY19wYXRoX0VHUkVQIiAnRUdSRVAkJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQi
IDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3Qu
bmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCAr
IDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3Bh
dGhfRUdSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBi
dXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfRUdSRVA9
IiRhY19wYXRoX0VHUkVQIgorICAgICAgYWNfcGF0aF9FR1JFUF9tYXg9JGFjX2NvdW50CisgICAg
ZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdo
CisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29u
ZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisK
KyAgICAgICRhY19wYXRoX0VHUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgICBkb25lCisgIGRvbmUK
KyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9FR1JF
UCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBi
ZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1
CisgIGZpCitlbHNlCisgIGFjX2N2X3BhdGhfRUdSRVA9JEVHUkVQCiBmaQogCisgICBmaQorZmkK
K3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zf
cGF0aF9FR1JFUCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3BhdGhfRUdSRVAiID4mNjsgfQorIEVH
UkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKIAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2NyeV9tZF9oYXNoX2J1ZmZlciBpbiAtbGdjcnlwdCIg
PiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2NyeV9tZF9oYXNoX2J1ZmZlciBpbiAtbGdj
cnlwdC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfZ2NyeXB0X2djcnlfbWRfaGFz
aF9idWZmZXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKKyRh
c19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9Citp
ZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zdGRjK3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2Vj
aG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElC
UwotTElCUz0iLWxnY3J5cHQgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29u
ZnRlc3QuJGFjX2V4dAorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNf
ZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVk
ZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KIAot
LyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3Iu
Ci0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2Yg
YSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBz
dGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgot
Y2hhciBnY3J5X21kX2hhc2hfYnVmZmVyICgpOwogaW50CiBtYWluICgpCiB7Ci1yZXR1cm4gZ2Ny
eV9tZF9oYXNoX2J1ZmZlciAoKTsKKwogICA7CiAgIHJldHVybiAwOwogfQogX0FDRU9GCi1pZiBh
Y19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl9nY3J5cHRfZ2Ny
eV9tZF9oYXNoX2J1ZmZlcj15ZXMKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0
aGVuIDoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCiBlbHNlCi0gIGFjX2N2X2xpYl9nY3J5cHRf
Z2NyeV9tZF9oYXNoX2J1ZmZlcj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0
ZXN0LiRhY19vYmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0
Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCiBm
aQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19j
dl9saWJfZ2NyeXB0X2djcnlfbWRfaGFzaF9idWZmZXIiID4mNQotJGFzX2VjaG8gIiRhY19jdl9s
aWJfZ2NyeXB0X2djcnlfbWRfaGFzaF9idWZmZXIiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9s
aWJfZ2NyeXB0X2djcnlfbWRfaGFzaF9idWZmZXIiID0geCIieWVzOyB0aGVuIDoKLSAgbGliZ2Ny
eXB0PSJ5Igorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25m
dGVzdC4kYWNfZXh0CisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisg
ICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8g
QU5TSS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyog
ZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCitfQUNFT0YKK2lmIChl
dmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJtZW1jaHIi
ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisKIGVsc2UKLSAgbGliZ2NyeXB0PSJuIgorICBhY19j
dl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCiBmaQogCitpZiB0ZXN0ICRh
Y19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2Vz
IG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCisgIGNhdCBjb25mZGVmcy5oIC0g
PDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNs
dWRlIDxzdGRsaWIuaD4KIAorX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNf
ZXh0IikgMj4mNSB8CisgICRFR1JFUCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKIAot
ICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9y
IHB0aHJlYWQgZmxhZyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgcHRocmVhZCBmbGFn
Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2F4X2N2X3B0aHJlYWRfZmxhZ3Mrc2V0fSIgPSBzZXQ7
IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQorICBhY19jdl9oZWFk
ZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgogCi0gICAgICAgIGF4X2N2X3B0aHJlYWRf
ZmxhZ3M9LXB0aHJlYWQKK2ZpCiAKLSAgICBQVEhSRUFEX0NGTEFHUz0iJGF4X2N2X3B0aHJlYWRf
ZmxhZ3MiCi0gICAgUFRIUkVBRF9MREZMQUdTPSIkYXhfY3ZfcHRocmVhZF9mbGFncyIKLSAgICBQ
VEhSRUFEX0xJQlM9IiIKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisg
ICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVz
cyB1c2luZyAtYW5zaS4KKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4g
OgorICA6CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19l
eHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUg
PHN0ZGxpYi5oPgorI2lmICgoJyAnICYgMHgwRkYpID09IDB4MDIwKQorIyBkZWZpbmUgSVNMT1dF
UihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNM
T1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorI2Vsc2UKKyMgZGVmaW5lIElTTE9X
RVIoYykgXAorCQkgICAoKCdhJyA8PSAoYykgJiYgKGMpIDw9ICdpJykgXAorCQkgICAgIHx8ICgn
aicgPD0gKGMpICYmIChjKSA8PSAncicpIFwKKwkJICAgICB8fCAoJ3MnIDw9IChjKSAmJiAoYykg
PD0gJ3onKSkKKyMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAoKGMpIHwgMHg0MCkg
OiAoYykpCisjZW5kaWYKIAorI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEo
ZSkgJiYgKGYpKSkKK2ludAorbWFpbiAoKQoreworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8
IDI1NjsgaSsrKQorICAgIGlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkKKwl8fCB0
b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkKKyAgICAgIHJldHVybiAyOworICByZXR1cm4gMDsK
K30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CiAKLSAgICBz
YXZlZF9DRkxBR1M9IiRDRkxBR1MiCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQor
cm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVz
dCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRl
c3QuJGFjX2V4dAorZmkKIAotICAgIHNhdmVkX0xERkxBR1M9IiRMREZMQUdTIgorZmkKK2ZpCit7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hl
YWRlcl9zdGRjIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNjsgfQoraWYg
dGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KIAotICAgIHNhdmVkX0xJQlM9IiRM
SUJTIgorJGFzX2VjaG8gIiNkZWZpbmUgU1REQ19IRUFERVJTIDEiID4+Y29uZmRlZnMuaAogCitm
aQogCi0gICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKyMgT24gSVJJWCA1LjMs
IHN5cy90eXBlcyBhbmQgaW50dHlwZXMuaCBhcmUgY29uZmxpY3RpbmcuCitmb3IgYWNfaGVhZGVy
IGluIHN5cy90eXBlcy5oIHN5cy9zdGF0Lmggc3RkbGliLmggc3RyaW5nLmggbWVtb3J5Lmggc3Ry
aW5ncy5oIFwKKwkJICBpbnR0eXBlcy5oIHN0ZGludC5oIHVuaXN0ZC5oCitkbyA6CisgIGFzX2Fj
X0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAK
K2FjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFz
X2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0CisiCitpZiBldmFsIHRlc3QgXCJ4XCQi
JGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxf
QUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAg
MQorX0FDRU9GCiAKLSAgICBMREZMQUdTPSIkTERGTEFHUyAkUFRIUkVBRF9MREZMQUdTIgorZmkK
IAotICAgIExJQlM9IiRMSUJTICRQVEhSRUFEX0xJQlMiCitkb25lCiAKLSAgICAgICAgY2F0IGNv
bmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmgu
ICAqLwogCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotaW50IG1haW4odm9pZCkgewotICBwdGhyZWFk
X2F0Zm9yaygwLDAsMCk7Ci0gIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOwotfQoraWYgdGVzdCAi
eCRweXRob250b29scyIgPSAieHkiOyB0aGVuIDoKIAotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9s
aW5rICIkTElORU5PIjsgdGhlbiA6CisgICAgaWYgZWNobyAiJFBZVEhPTiIgfCBncmVwIC1xICJe
LyI7IHRoZW4gOgogCisgICAgICAgIFBZVEhPTlBBVEg9JFBZVEhPTgorICAgICAgICBQWVRIT049
YGJhc2VuYW1lICRQWVRIT05QQVRIYAorCitlbGlmIHRlc3QgLXogIiRQWVRIT04iOyB0aGVuIDoK
KyAgUFlUSE9OPSJweXRob24iCiBlbHNlCi0gIGF4X2N2X3B0aHJlYWRfZmxhZ3M9ZmFpbGVkCisg
IGFzX2ZuX2Vycm9yICQ/ICJQWVRIT04gc3BlY2lmaWVkLCBidXQgaXMgbm90IGFuIGFic29sdXRl
IHBhdGgiICIkTElORU5PIiA1CiBmaQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3Qu
JGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAg
ICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRQWVRIT04iLCBzbyBpdCBjYW4gYmUgYSBw
cm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRQWVRIT047IGFjX3dvcmQ9JDIKK3sg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193
b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQor
aWYgdGVzdCAiJHthY19jdl9wYXRoX1BZVEhPTlBBVEgrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAk
YXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRQWVRIT05QQVRIIGluCisg
IFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX1BZVEhPTlBBVEg9IiRQWVRIT05QQVRI
IiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAg
KikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBp
biAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBh
c19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNp
b25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYm
ICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAg
YWNfY3ZfcGF0aF9QWVRIT05QQVRIPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAg
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFj
X3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQor
SUZTPSRhc19zYXZlX0lGUwogCi0gICAgQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTIgorICB0ZXN0IC16
ICIkYWNfY3ZfcGF0aF9QWVRIT05QQVRIIiAmJiBhY19jdl9wYXRoX1BZVEhPTlBBVEg9Im5vIgor
ICA7OworZXNhYworZmkKK1BZVEhPTlBBVEg9JGFjX2N2X3BhdGhfUFlUSE9OUEFUSAoraWYgdGVz
dCAtbiAiJFBZVEhPTlBBVEgiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogcmVzdWx0OiAkUFlUSE9OUEFUSCIgPiY1CiskYXNfZWNobyAiJFBZVEhPTlBB
VEgiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCiAKLSAgICBMREZM
QUdTPSIkc2F2ZWRfTERGTEFHUyIKIAotICAgIExJQlM9IiRzYXZlZF9MSUJTIgoraWYgdGVzdCB4
IiR7UFlUSE9OUEFUSH0iID09IHgibm8iCit0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIlVuYWJs
ZSB0byBmaW5kICRQWVRIT04sIHBsZWFzZSBpbnN0YWxsICRQWVRIT04iICIkTElORU5PIiA1Citm
aQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcg
Zm9yIHB5dGhvbiB2ZXJzaW9uID49IDIuMyAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9y
IHB5dGhvbiB2ZXJzaW9uID49IDIuMyAuLi4gIiA+JjY7IH0KK2AkUFlUSE9OIC1jICdpbXBvcnQg
c3lzOyBzeXMuZXhpdChldmFsKCJzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDMpIikpJ2AKK2lmIHRl
c3QgIiQ/IiAhPSAiMCIKK3RoZW4KKyAgICBweXRob25fdmVyc2lvbj1gJFBZVEhPTiAtViAyPiYx
YAorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBu
byIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICAgIGFzX2ZuX2Vycm9yICQ/ICIkcHl0aG9u
X3ZlcnNpb24gaXMgdG9vIG9sZCwgbWluaW11bSByZXF1aXJlZCB2ZXJzaW9uIGlzIDIuMyIgIiRM
SU5FTk8iIDUKK2Vsc2UKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZmkKIAorYWNfcHJl
dmlvdXNfY3BwZmxhZ3M9JENQUEZMQUdTCithY19wcmV2aW91c19sZGZsYWdzPSRMREZMQUdTCith
Y19weXRob25fdmVyc2lvbj1gJFBZVEhPTiAtYyAnaW1wb3J0IGRpc3R1dGlscy5zeXNjb25maWc7
IFwKKyAgICBwcmludCBkaXN0dXRpbHMuc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJWRVJTSU9O
IiknYAorIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkUFlUSE9OLWNvbmZpZyIsIHNvIGl0
IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJFBZVEhPTi1jb25m
aWc7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
Y2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNf
d29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX3B5Y29uZmlnK3NldH0iID0g
c2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAk
cHljb25maWcgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfcHljb25maWc9
IiRweWNvbmZpZyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGgu
CisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2Zv
ciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFz
X2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFi
bGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4
ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsg
dGhlbgorICAgIGFjX2N2X3BhdGhfcHljb25maWc9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19l
eHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFz
X2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQor
ICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCiAKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfcHljb25m
aWciICYmIGFjX2N2X3BhdGhfcHljb25maWc9Im5vIgorICA7OworZXNhYworZmkKK3B5Y29uZmln
PSRhY19jdl9wYXRoX3B5Y29uZmlnCitpZiB0ZXN0IC1uICIkcHljb25maWciOyB0aGVuCisgIHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkcHljb25maWci
ID4mNQorJGFzX2VjaG8gIiRweWNvbmZpZyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8i
ID4mNjsgfQogZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVz
dWx0OiAkYXhfY3ZfcHRocmVhZF9mbGFncyIgPiY1Ci0kYXNfZWNobyAiJGF4X2N2X3B0aHJlYWRf
ZmxhZ3MiID4mNjsgfQotICAgIGlmIHRlc3QgIngkYXhfY3ZfcHRocmVhZF9mbGFncyIgPSB4ZmFp
bGVkOyB0aGVuCi0gICAgICAgIGFzX2ZuX2Vycm9yICQ/ICItcHRocmVhZCBkb2VzIG5vdCB3b3Jr
IiAiJExJTkVOTyIgNQotICAgIGZpCi0KLSAgICBQVEhSRUFEX0NGTEFHUz0iJGF4X2N2X3B0aHJl
YWRfZmxhZ3MiCi0gICAgUFRIUkVBRF9MREZMQUdTPSIkYXhfY3ZfcHRocmVhZF9mbGFncyIKLSAg
ICBQVEhSRUFEX0xJQlM9IiIKIAogCitpZiB0ZXN0IHgiJHB5Y29uZmlnIiA9PSB4Im5vIjsgdGhl
biA6CiAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcg
Zm9yIGNsb2NrX2dldHRpbWUgaW4gLWxydCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Ig
Y2xvY2tfZ2V0dGltZSBpbiAtbHJ0Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9y
dF9jbG9ja19nZXR0aW1lK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hl
ZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxy
dCAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0v
KiBlbmQgY29uZmRlZnMuaC4gICovCisgICAgICAgIENQUEZMQUdTPSIkQ0ZMQUdTIGAkUFlUSE9O
IC1jICdpbXBvcnQgZGlzdHV0aWxzLnN5c2NvbmZpZzsgXAorICAgICAgICBwcmludCAiLUkiICsg
ZGlzdHV0aWxzLnN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiSU5DTFVERVBZIiknYCIKKyAgICBD
UFBGTEFHUz0iJENQUEZMQUdTIGAkUFlUSE9OIC1jICdpbXBvcnQgZGlzdHV0aWxzLnN5c2NvbmZp
ZzsgXAorICAgICAgICBwcmludCBkaXN0dXRpbHMuc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJD
RkxBR1MiKSdgIgorICAgIExERkxBR1M9IiRMREZMQUdTIGAkUFlUSE9OIC1jICdpbXBvcnQgZGlz
dHV0aWxzLnN5c2NvbmZpZzsgXAorICAgICAgICBwcmludCBkaXN0dXRpbHMuc3lzY29uZmlnLmdl
dF9jb25maWdfdmFyKCJMSUJTIiknYCIKKyAgICBMREZMQUdTPSIkTERGTEFHUyBgJFBZVEhPTiAt
YyAnaW1wb3J0IGRpc3R1dGlscy5zeXNjb25maWc7IFwKKyAgICAgICAgcHJpbnQgZGlzdHV0aWxz
LnN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiU1lTTElCUyIpJ2AiCisgICAgTERGTEFHUz0iJExE
RkxBR1MgYCRQWVRIT04gLWMgJ2ltcG9ydCBkaXN0dXRpbHMuc3lzY29uZmlnOyBcCisgICAgICAg
IHByaW50ICItTCIgKyBkaXN0dXRpbHMuc3lzY29uZmlnLmdldF9weXRob25fbGliKHBsYXRfc3Bl
Y2lmaWM9MSxcCisgICAgICAgIHN0YW5kYXJkX2xpYj0xKSArICIvY29uZmlnIidgIgorICAgIExE
RkxBR1M9IiRMREZMQUdTIGAkUFlUSE9OIC1jICdpbXBvcnQgZGlzdHV0aWxzLnN5c2NvbmZpZzsg
XAorICAgICAgICBwcmludCBkaXN0dXRpbHMuc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJMSU5L
Rk9SU0hBUkVEIiknYCIKKyAgICBMREZMQUdTPSIkTERGTEFHUyBgJFBZVEhPTiAtYyAnaW1wb3J0
IGRpc3R1dGlscy5zeXNjb25maWc7IFwKKyAgICAgICAgcHJpbnQgZGlzdHV0aWxzLnN5c2NvbmZp
Zy5nZXRfY29uZmlnX3ZhcigiTERGTEFHUyIpJ2AiCiAKLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50
ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBp
bnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0
aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVm
IF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgY2xvY2tfZ2V0dGltZSAoKTsK
LWludAotbWFpbiAoKQotewotcmV0dXJuIGNsb2NrX2dldHRpbWUgKCk7Ci0gIDsKLSAgcmV0dXJu
IDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAg
YWNfY3ZfbGliX3J0X2Nsb2NrX2dldHRpbWU9eWVzCiBlbHNlCi0gIGFjX2N2X2xpYl9ydF9jbG9j
a19nZXR0aW1lPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29i
amV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFj
X2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9ydF9jbG9ja19nZXR0aW1lIiA+JjUKLSRhc19l
Y2hvICIkYWNfY3ZfbGliX3J0X2Nsb2NrX2dldHRpbWUiID4mNjsgfQotaWYgdGVzdCAieCRhY19j
dl9saWJfcnRfY2xvY2tfZ2V0dGltZSIgPSB4IiJ5ZXM7IHRoZW4gOgotICBjYXQgPj5jb25mZGVm
cy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfTElCUlQgMQotX0FDRU9GCiAKLSAgTElCUz0iLWxy
dCAkTElCUyIKKyAgICAgICAgQ1BQRkxBR1M9IiRDRkxBR1MgYCRQWVRIT04tY29uZmlnIC0tY2Zs
YWdzYCIKKyAgICBMREZMQUdTPSIkTERGTEFHUyBgJFBZVEhPTi1jb25maWcgLS1sZGZsYWdzYCIK
IAogZmkKIAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2lu
ZyBmb3IgeWFqbF9hbGxvYyBpbiAtbHlhamwiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9y
IHlhamxfYWxsb2MgaW4gLWx5YWpsLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl95
YWpsX3lhamxfYWxsb2Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVk
KSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHlh
amwgICRMSUJTIgotY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAot
LyogZW5kIGNvbmZkZWZzLmguICAqLworYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJ
TkVOTyIgIlB5dGhvbi5oIiAiYWNfY3ZfaGVhZGVyX1B5dGhvbl9oIiAiJGFjX2luY2x1ZGVzX2Rl
ZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9QeXRob25faCIgPSB4IiJ5ZXM7IHRoZW4g
OgogCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBl
cnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlw
ZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdv
dWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2Vu
ZGlmCi1jaGFyIHlhamxfYWxsb2MgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiB5YWpsX2Fs
bG9jICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5r
ICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2xpYl95YWpsX3lhamxfYWxsb2M9eWVzCiBlbHNl
Ci0gIGFjX2N2X2xpYl95YWpsX3lhamxfYWxsb2M9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0
LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRl
c3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworICBhc19mbl9lcnJvciAk
PyAiVW5hYmxlIHRvIGZpbmQgUHl0aG9uIGRldmVsb3BtZW50IGhlYWRlcnMiICIkTElORU5PIiA1
CiBmaQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRh
Y19jdl9saWJfeWFqbF95YWpsX2FsbG9jIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGliX3lhamxf
eWFqbF9hbGxvYyIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl95YWpsX3lhamxfYWxsb2Mi
ID0geCIieWVzOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBI
QVZFX0xJQllBSkwgMQotX0FDRU9GCi0KLSAgTElCUz0iLWx5YWpsICRMSUJTIgogCi1lbHNlCi0g
IGFzX2ZuX2Vycm9yICQ/ICJDb3VsZCBub3QgZmluZCB5YWpsIiAiJExJTkVOTyIgNQotZmkKIAot
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGVm
bGF0ZUNvcHkgaW4gLWx6IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBkZWZsYXRlQ29w
eSBpbiAtbHouLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX3pfZGVmbGF0ZUNvcHkr
c2V0fSIgPSBzZXQ7IHRoZW4gOgorYXNfYWNfTGliPWAkYXNfZWNobyAiYWNfY3ZfbGliX3B5dGhv
biRhY19weXRob25fdmVyc2lvbicnX1B5QXJnX1BhcnNlVHVwbGUiIHwgJGFzX3RyX3NoYAoreyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgUHlBcmdf
UGFyc2VUdXBsZSBpbiAtbHB5dGhvbiRhY19weXRob25fdmVyc2lvbiIgPiY1CiskYXNfZWNob19u
ICJjaGVja2luZyBmb3IgUHlBcmdfUGFyc2VUdXBsZSBpbiAtbHB5dGhvbiRhY19weXRob25fdmVy
c2lvbi4uLiAiID4mNjsgfQoraWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19MaWIrc2V0fVwiIiA9
IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGFjX2No
ZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1seiAgJExJQlMiCitMSUJTPSItbHB5dGhv
biRhY19weXRob25fdmVyc2lvbiAgJExJQlMiCiBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5j
b25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKQEAgLTc2MzIsMTg5MyAr
NTM3NywxMTczIEBAIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQK
ICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIgogI2VuZGlmCi1jaGFyIGRlZmxhdGVDb3B5
ICgpOworY2hhciBQeUFyZ19QYXJzZVR1cGxlICgpOwogaW50CiBtYWluICgpCiB7Ci1yZXR1cm4g
ZGVmbGF0ZUNvcHkgKCk7CityZXR1cm4gUHlBcmdfUGFyc2VUdXBsZSAoKTsKICAgOwogICByZXR1
cm4gMDsKIH0KIF9BQ0VPRgogaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgot
ICBhY19jdl9saWJfel9kZWZsYXRlQ29weT15ZXMKKyAgZXZhbCAiJGFzX2FjX0xpYj15ZXMiCiBl
bHNlCi0gIGFjX2N2X2xpYl96X2RlZmxhdGVDb3B5PW5vCisgIGV2YWwgIiRhc19hY19MaWI9bm8i
CiBmaQogcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAg
Y29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9z
YXZlX0xJQlMKIGZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJl
c3VsdDogJGFjX2N2X2xpYl96X2RlZmxhdGVDb3B5IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGli
X3pfZGVmbGF0ZUNvcHkiID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfel9kZWZsYXRlQ29w
eSIgPSB4IiJ5ZXM7IHRoZW4gOgorZXZhbCBhY19yZXM9XCQkYXNfYWNfTGliCisJICAgICAgIHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+
JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNf
TGliIlwiID0geCJ5ZXMiOyB0aGVuIDoKICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2Rl
ZmluZSBIQVZFX0xJQlogMQorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfTElCcHl0aG9uJGFjX3B5
dGhvbl92ZXJzaW9uIiB8ICRhc190cl9jcHBgIDEKIF9BQ0VPRgogCi0gIExJQlM9Ii1seiAkTElC
UyIKLQotZWxzZQotICBhc19mbl9lcnJvciAkPyAiQ291bGQgbm90IGZpbmQgemxpYiIgIiRMSU5F
Tk8iIDUKLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hl
Y2tpbmcgZm9yIGxpYmljb252X29wZW4gaW4gLWxpY29udiIgPiY1Ci0kYXNfZWNob19uICJjaGVj
a2luZyBmb3IgbGliaWNvbnZfb3BlbiBpbiAtbGljb252Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIk
e2FjX2N2X2xpYl9pY29udl9saWJpY29udl9vcGVuK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFz
X2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0k
TElCUwotTElCUz0iLWxpY29udiAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5j
b25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCisgIExJQlM9Ii1scHl0aG9u
JGFjX3B5dGhvbl92ZXJzaW9uICRMSUJTIgogCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFs
IHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1p
Z2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBp
dHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2Nw
bHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGxpYmljb252X29wZW4gKCk7Ci1pbnQK
LW1haW4gKCkKLXsKLXJldHVybiBsaWJpY29udl9vcGVuICgpOwotICA7Ci0gIHJldHVybiAwOwot
fQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2
X2xpYl9pY29udl9saWJpY29udl9vcGVuPXllcwotZWxzZQotICBhY19jdl9saWJfaWNvbnZfbGli
aWNvbnZfb3Blbj1ubwotZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19v
YmpleHQgXAotICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRh
Y19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfaWNvbnZfbGliaWNvbnZfb3BlbiIgPiY1Ci0k
YXNfZWNobyAiJGFjX2N2X2xpYl9pY29udl9saWJpY29udl9vcGVuIiA+JjY7IH0KLWlmIHRlc3Qg
IngkYWNfY3ZfbGliX2ljb252X2xpYmljb252X29wZW4iID0geCIieWVzOyB0aGVuIDoKLSAgbGli
aWNvbnY9InkiCiBlbHNlCi0gIGxpYmljb252PSJuIgorICBhc19mbl9lcnJvciAkPyAiVW5hYmxl
IHRvIGZpbmQgYSBzdWl0YWJsZSBweXRob24gZGV2ZWxvcG1lbnQgbGlicmFyeSIgIiRMSU5FTk8i
IDUKIGZpCiAKK0NQUEZMQUdTPSRhY19wcmV2aW91c19jcHBmbGFncworTERMRkFHUz0kYWNfcHJl
dmlvdXNfbGRmbGFncwogCiAKLSMgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCi0jIFRoZSBVbHRy
aXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3Jr
cwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLXsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4m
NQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmguLi4gIiA+JjY7IH0K
LWlmIHRlc3QgIiR7YWNfY3Zfd29ya2luZ19hbGxvY2FfaCtzZXR9IiA9IHNldDsgdGhlbiA6Citm
aQorIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBh
IHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIK
K3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRh
Y193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsg
fQoraWYgdGVzdCAiJHthY19jdl9wYXRoX1hHRVRURVhUK3NldH0iID0gc2V0OyB0aGVuIDoKICAg
JGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9B
Q0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUg
PGFsbG9jYS5oPgotaW50Ci1tYWluICgpCi17Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhICgy
ICogc2l6ZW9mIChpbnQpKTsKLQkJCSAgaWYgKHApIHJldHVybiAwOwotICA7Ci0gIHJldHVybiAw
OwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFj
X2N2X3dvcmtpbmdfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGFjX2N2X3dvcmtpbmdfYWxsb2NhX2g9
bm8KKyAgY2FzZSAkWEdFVFRFWFQgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3Bh
dGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qg
d2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9T
RVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAg
dGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycg
JGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRh
Y193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4
ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhc19kaXIvJGFjX3dv
cmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgor
ICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgdGVzdCAteiAiJGFjX2N2
X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9Im5vIgorICA7OworZXNhYwog
ZmkKLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgIGNv
bmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitYR0VUVEVYVD0kYWNfY3ZfcGF0aF9Y
R0VUVEVYVAoraWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFhHRVRURVhUIiA+JjUKKyRhc19lY2hv
ICIkWEdFVFRFWFQiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCi17
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3dv
cmtpbmdfYWxsb2NhX2giID4mNQotJGFzX2VjaG8gIiRhY19jdl93b3JraW5nX2FsbG9jYV9oIiA+
JjY7IH0KLWlmIHRlc3QgJGFjX2N2X3dvcmtpbmdfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KIAotJGFz
X2VjaG8gIiNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxIiA+PmNvbmZkZWZzLmgKIAoraWYgdGVzdCB4
IiR7WEdFVFRFWFR9IiA9PSB4Im5vIgordGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJVbmFibGUg
dG8gZmluZCB4Z2V0dGV4dCwgcGxlYXNlIGluc3RhbGwgeGdldHRleHQiICIkTElORU5PIiA1CiBm
aQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZv
ciBhbGxvY2EiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGFsbG9jYS4uLiAiID4mNjsg
fQotaWYgdGVzdCAiJHthY19jdl9mdW5jX2FsbG9jYV93b3JrcytzZXR9IiA9IHNldDsgdGhlbiA6
CisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFzODYiLCBzbyBpdCBjYW4gYmUgYSBwcm9n
cmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGFzODY7IGFjX3dvcmQ9JDIKK3sgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+
JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVz
dCAiJHthY19jdl9wYXRoX0FTODYrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIo
Y2FjaGVkKSAiID4mNgogZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVz
dC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaWZkZWYgX19HTlVDX18KLSMgZGVm
aW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAg
aW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAg
aWZkZWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAg
IGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9j
YSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsK
LSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQK
LW1haW4gKCkKLXsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EgKDEpOwotCQkJCSAgICBpZiAo
cCkgcmV0dXJuIDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5
X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1l
bHNlCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVz
dC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0
ZXN0LiRhY19leHQKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IHJlc3VsdDogJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiA+JjUKLSRhc19lY2hvICIkYWNfY3Zf
ZnVuY19hbGxvY2Ffd29ya3MiID4mNjsgfQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93
b3JrcyA9IHllczsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX0FMTE9DQSAxIiA+PmNv
bmZkZWZzLmgKKyAgY2FzZSAkQVM4NiBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3Zf
cGF0aF9BUzg2PSIkQVM4NiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBh
IHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFU
T1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAt
eiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4
ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3Jk
JGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0
IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfQVM4Nj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVj
X2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAk
YXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25l
CisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKIAorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9BUzg2
IiAmJiBhY19jdl9wYXRoX0FTODY9Im5vIgorICA7OworZXNhYworZmkKK0FTODY9JGFjX2N2X3Bh
dGhfQVM4NgoraWYgdGVzdCAtbiAiJEFTODYiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVM4NiIgPiY1CiskYXNfZWNobyAiJEFTODYi
ID4mNjsgfQogZWxzZQotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNv
bnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21l
IHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0jIGNvbnRhaW4gYSBidWdn
eSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSMgdXNl
IGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFs
bG9jYS5jLgotCi1BTExPQ0E9XCR7TElCT0JKRElSfWFsbG9jYS4kYWNfb2JqZXh0Ci0KLSRhc19l
Y2hvICIjZGVmaW5lIENfQUxMT0NBIDEiID4+Y29uZmRlZnMuaAorICB7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+
JjY7IH0KK2ZpCiAKIAoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBj
aGVja2luZyB3aGV0aGVyIFxgYWxsb2NhLmMnIG5lZWRzIENyYXkgaG9va3MiID4mNQotJGFzX2Vj
aG9fbiAiY2hlY2tpbmcgd2hldGhlciBcYGFsbG9jYS5jJyBuZWVkcyBDcmF5IGhvb2tzLi4uICIg
PiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X29zX2NyYXkrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYg
dGVzdCB4IiR7QVM4Nn0iID09IHgibm8iCit0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIlVuYWJs
ZSB0byBmaW5kIGFzODYsIHBsZWFzZSBpbnN0YWxsIGFzODYiICIkTElORU5PIiA1CitmaQorIyBF
eHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJsZDg2Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBu
YW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBsZDg2OyBhY193b3JkPSQyCit7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cisk
YXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7
YWNfY3ZfcGF0aF9MRDg2K3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hl
ZCkgIiA+JjYKIGVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFj
X2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lmIGRlZmluZWQgQ1JBWSAmJiAhIGRlZmlu
ZWQgQ1JBWTIKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgorICBjYXNlICRM
RDg2IGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0xEODY9IiRMRDg2IiAj
IExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikK
KyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAk
UEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19k
aXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25z
OyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRh
c190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNf
Y3ZfcGF0aF9MRDg2PSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNf
ZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19z
YXZlX0lGUwogCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAy
PiY1IHwKLSAgJEVHUkVQICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgYWNf
Y3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgYWNfY3Zfb3NfY3JheT1ubworICB0ZXN0IC16ICIkYWNf
Y3ZfcGF0aF9MRDg2IiAmJiBhY19jdl9wYXRoX0xEODY9Im5vIgorICA7OworZXNhYwogZmkKLXJt
IC1mIGNvbmZ0ZXN0KgotCitMRDg2PSRhY19jdl9wYXRoX0xEODYKK2lmIHRlc3QgLW4gIiRMRDg2
IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJExEODYiID4mNQorJGFzX2VjaG8gIiRMRDg2IiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hv
ICJubyIgPiY2OyB9CiBmaQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiByZXN1bHQ6ICRhY19jdl9vc19jcmF5IiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfb3NfY3JheSIg
PiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi0gIGZvciBhY19mdW5j
IGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgICBhc19hY192YXI9YCRhc19lY2hvICJh
Y19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKLWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJ
TkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKLWlmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNf
dmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2Rl
ZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotX0FDRU9GCiAKLSAgICBicmVhawotZmkK
IAotICBkb25lCitpZiB0ZXN0IHgiJHtMRDg2fSIgPT0geCJubyIKK3RoZW4KKyAgICBhc19mbl9l
cnJvciAkPyAiVW5hYmxlIHRvIGZpbmQgbGQ4NiwgcGxlYXNlIGluc3RhbGwgbGQ4NiIgIiRMSU5F
Tk8iIDUKIGZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hl
Y2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci0kYXNfZWNob19uICJjaGVj
a2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIk
e2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uK3NldH0iID0gc2V0OyB0aGVuIDoKKyMgRXh0cmFjdCB0
aGUgZmlyc3Qgd29yZCBvZiAiYmNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGgg
YXJncy4KK3NldCBkdW1teSBiY2M7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24g
ImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRo
X0JDQytzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBl
bHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgYWNfY3Zf
Y19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5j
b25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVm
YXVsdAotaW50Ci1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRk
ciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAg
ICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwot
ICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Cisg
IGNhc2UgJEJDQyBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9CQ0M9IiRC
Q0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7Owor
ICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGly
IGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYm
IGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVu
c2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIg
JiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAg
ICBhY19jdl9wYXRoX0JDQz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3Jk
JGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0k
YXNfc2F2ZV9JRlMKIAotaW50Ci1tYWluICgpCi17Ci0gIHJldHVybiBmaW5kX3N0YWNrX2RpcmVj
dGlvbiAoKSA8IDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRo
ZW4gOgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGFjX2N2X2Nfc3RhY2tf
ZGlyZWN0aW9uPS0xCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24u
b3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNv
bmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9CQ0Mi
ICYmIGFjX2N2X3BhdGhfQkNDPSJubyIKKyAgOzsKK2VzYWMKIGZpCi0KK0JDQz0kYWNfY3ZfcGF0
aF9CQ0MKK2lmIHRlc3QgLW4gIiRCQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQkNDIiA+JjUKKyRhc19lY2hvICIkQkNDIiA+JjY7
IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1
bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CiBmaQoteyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIg
PiY1Ci0kYXNfZWNobyAiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiA+JjY7IH0KLWNhdCA+PmNv
bmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNr
X2RpcmVjdGlvbgotX0FDRU9GCiAKIAoraWYgdGVzdCB4IiR7QkNDfSIgPT0geCJubyIKK3RoZW4K
KyAgICBhc19mbl9lcnJvciAkPyAiVW5hYmxlIHRvIGZpbmQgYmNjLCBwbGVhc2UgaW5zdGFsbCBi
Y2MiICIkTElORU5PIiA1CiBmaQorIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJpYXNsIiwg
c28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBpYXNsOyBh
Y193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNr
aW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQu
Li4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9JQVNMK3NldH0iID0gc2V0OyB0aGVu
IDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkSUFTTCBpbgor
ICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9JQVNMPSIkSUFTTCIgIyBMZXQgdGhl
IHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3Nh
dmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2Rv
CisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAg
ICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAg
aWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94
ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhf
SUFTTD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0
IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMK
IAotZm9yIGFjX2hlYWRlciBpbiAgXAotICAgICAgICAgICAgICAgIGFycGEvaW5ldC5oIGZjbnRs
LmggaW50dHlwZXMuaCBsaWJpbnRsLmggbGltaXRzLmggbWFsbG9jLmggXAotICAgICAgICAgICAg
ICAgIG5ldGRiLmggbmV0aW5ldC9pbi5oIHN0ZGRlZi5oIHN0ZGludC5oIHN0ZGxpYi5oIHN0cmlu
Zy5oIFwKLSAgICAgICAgICAgICAgICBzdHJpbmdzLmggc3lzL2ZpbGUuaCBzeXMvaW9jdGwuaCBz
eXMvbW91bnQuaCBzeXMvcGFyYW0uaCBcCi0gICAgICAgICAgICAgICAgc3lzL3NvY2tldC5oIHN5
cy9zdGF0dmZzLmggc3lzL3RpbWUuaCBzeXNsb2cuaCB0ZXJtaW9zLmggXAotICAgICAgICAgICAg
ICAgIHVuaXN0ZC5oIHlhamwveWFqbF92ZXJzaW9uLmggXAorICB0ZXN0IC16ICIkYWNfY3ZfcGF0
aF9JQVNMIiAmJiBhY19jdl9wYXRoX0lBU0w9Im5vIgorICA7OworZXNhYworZmkKK0lBU0w9JGFj
X2N2X3BhdGhfSUFTTAoraWYgdGVzdCAtbiAiJElBU0wiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkSUFTTCIgPiY1CiskYXNfZWNobyAi
JElBU0wiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCiAKLWRvIDoK
LSAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFz
X3RyX3NoYAotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRhY19oZWFk
ZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiBldmFsIHRlc3Qg
XCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZz
LmggPDxfQUNFT0YKLSNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3Ry
X2NwcGAgMQotX0FDRU9GCiAKK2lmIHRlc3QgeCIke0lBU0x9IiA9PSB4Im5vIgordGhlbgorICAg
IGFzX2ZuX2Vycm9yICQ/ICJVbmFibGUgdG8gZmluZCBpYXNsLCBwbGVhc2UgaW5zdGFsbCBpYXNs
IiAiJExJTkVOTyIgNQogZmkKIAotZG9uZQotCithY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVs
ICIkTElORU5PIiAidXVpZC91dWlkLmgiICJhY19jdl9oZWFkZXJfdXVpZF91dWlkX2giICIkYWNf
aW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3V1aWRfdXVpZF9oIiA9
IHgiInllczsgdGhlbiA6CiAKLSMgQ2hlY2tzIGZvciB0eXBlZGVmcywgc3RydWN0dXJlcywgYW5k
IGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcy4KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0ZGJvb2wuaCB0aGF0IGNvbmZvcm1zIHRvIEM5OSIg
PiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3RkYm9vbC5oIHRoYXQgY29uZm9ybXMgdG8g
Qzk5Li4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zdGRib29sX2grc2V0fSIg
PSBzZXQ7IHRoZW4gOgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogY2hlY2tpbmcgZm9yIHV1aWRfY2xlYXIgaW4gLWx1dWlkIiA+JjUKKyRhc19lY2hvX24gImNo
ZWNraW5nIGZvciB1dWlkX2NsZWFyIGluIC1sdXVpZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHth
Y19jdl9saWJfdXVpZF91dWlkX2NsZWFyK3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9f
biAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29u
ZnRlc3QuJGFjX2V4dAorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHV1
aWQgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAog
LyogZW5kIGNvbmZkZWZzLmguICAqLwogCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2lmbmRlZiBi
b29sCi0gImVycm9yOiBib29sIGlzIG5vdCBkZWZpbmVkIgotI2VuZGlmCi0jaWZuZGVmIGZhbHNl
Ci0gImVycm9yOiBmYWxzZSBpcyBub3QgZGVmaW5lZCIKLSNlbmRpZgotI2lmIGZhbHNlCi0gImVy
cm9yOiBmYWxzZSBpcyBub3QgMCIKLSNlbmRpZgotI2lmbmRlZiB0cnVlCi0gImVycm9yOiB0cnVl
IGlzIG5vdCBkZWZpbmVkIgotI2VuZGlmCi0jaWYgdHJ1ZSAhPSAxCi0gImVycm9yOiB0cnVlIGlz
IG5vdCAxIgotI2VuZGlmCi0jaWZuZGVmIF9fYm9vbF90cnVlX2ZhbHNlX2FyZV9kZWZpbmVkCi0g
ImVycm9yOiBfX2Jvb2xfdHJ1ZV9mYWxzZV9hcmVfZGVmaW5lZCBpcyBub3QgZGVmaW5lZCIKKy8q
IE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgor
ICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEg
R0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3Rp
bGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCiAjZW5kaWYKLQot
CXN0cnVjdCBzIHsgX0Jvb2wgczogMTsgX0Jvb2wgdDsgfSBzOwotCi0JY2hhciBhW3RydWUgPT0g
MSA/IDEgOiAtMV07Ci0JY2hhciBiW2ZhbHNlID09IDAgPyAxIDogLTFdOwotCWNoYXIgY1tfX2Jv
b2xfdHJ1ZV9mYWxzZV9hcmVfZGVmaW5lZCA9PSAxID8gMSA6IC0xXTsKLQljaGFyIGRbKGJvb2wp
IDAuNSA9PSB0cnVlID8gMSA6IC0xXTsKLQlib29sIGUgPSAmczsKLQljaGFyIGZbKF9Cb29sKSAw
LjAgPT0gZmFsc2UgPyAxIDogLTFdOwotCWNoYXIgZ1t0cnVlXTsKLQljaGFyIGhbc2l6ZW9mIChf
Qm9vbCldOwotCWNoYXIgaVtzaXplb2Ygcy50XTsKLQllbnVtIHsgaiA9IGZhbHNlLCBrID0gdHJ1
ZSwgbCA9IGZhbHNlICogdHJ1ZSwgbSA9IHRydWUgKiAyNTYgfTsKLQkvKiBUaGUgZm9sbG93aW5n
IGZhaWxzIGZvcgotCSAgIEhQIGFDKysvQU5TSSBDIEIzOTEwQiBBLjA1LjU1IFtEZWMgMDQgMjAw
M10uICovCi0JX0Jvb2wgblttXTsKLQljaGFyIG9bc2l6ZW9mIG4gPT0gbSAqIHNpemVvZiBuWzBd
ID8gMSA6IC0xXTsKLQljaGFyIHBbLTEgLSAoX0Jvb2wpIDAgPCAwICYmIC0xIC0gKGJvb2wpIDAg
PCAwID8gMSA6IC0xXTsKLSMJaWYgZGVmaW5lZCBfX3hsY19fIHx8IGRlZmluZWQgX19HTlVDX18K
LQkgLyogQ2F0Y2ggYSBidWcgaW4gSUJNIEFJWCB4bGMgY29tcGlsZXIgdmVyc2lvbiA2LjAuMC4w
Ci0JICAgIHJlcG9ydGVkIGJ5IEphbWVzIExlbWxleSBvbiAyMDA1LTEwLTA1OyBzZWUKLQkgICAg
aHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2J1Zy1jb3JldXRpbHMvMjAwNS0xMC9t
c2cwMDA4Ni5odG1sCi0JICAgIFRoaXMgdGVzdCBpcyBub3QgcXVpdGUgcmlnaHQsIHNpbmNlIHhs
YyBpcyBhbGxvd2VkIHRvCi0JICAgIHJlamVjdCB0aGlzIHByb2dyYW0sIGFzIHRoZSBpbml0aWFs
aXplciBmb3IgeGxjYnVnIGlzCi0JICAgIG5vdCBvbmUgb2YgdGhlIGZvcm1zIHRoYXQgQyByZXF1
aXJlcyBzdXBwb3J0IGZvci4KLQkgICAgSG93ZXZlciwgZG9pbmcgdGhlIHRlc3QgcmlnaHQgd291
bGQgcmVxdWlyZSBhIHJ1bnRpbWUKLQkgICAgdGVzdCwgYW5kIHRoYXQgd291bGQgbWFrZSBjcm9z
cy1jb21waWxhdGlvbiBoYXJkZXIuCi0JICAgIExldCB1cyBob3BlIHRoYXQgSUJNIGZpeGVzIHRo
ZSB4bGMgYnVnLCBhbmQgYWxzbyBhZGRzCi0JICAgIHN1cHBvcnQgZm9yIHRoaXMga2luZCBvZiBj
b25zdGFudCBleHByZXNzaW9uLiAgSW4gdGhlCi0JICAgIG1lYW50aW1lLCB0aGlzIHRlc3Qgd2ls
bCByZWplY3QgeGxjLCB3aGljaCBpcyBPSywgc2luY2UKLQkgICAgb3VyIHN0ZGJvb2wuaCBzdWJz
dGl0dXRlIHNob3VsZCBzdWZmaWNlLiAgV2UgYWxzbyB0ZXN0Ci0JICAgIHRoaXMgd2l0aCBHQ0Ms
IHdoZXJlIGl0IHNob3VsZCB3b3JrLCB0byBkZXRlY3QgbW9yZQotCSAgICBxdWlja2x5IHdoZXRo
ZXIgc29tZW9uZSBtZXNzZXMgdXAgdGhlIHRlc3QgaW4gdGhlCi0JICAgIGZ1dHVyZS4gICovCi0J
IGNoYXIgZGlnc1tdID0gIjAxMjM0NTY3ODkiOwotCSBpbnQgeGxjYnVnID0gMSAvICgmKGRpZ3Mg
KyA1KVstMiArIChib29sKSAxXSA9PSAmZGlnc1s0XSA/IDEgOiAtMSk7Ci0jCWVuZGlmCi0JLyog
Q2F0Y2ggYSBidWcgaW4gYW4gSFAtVVggQyBjb21waWxlci4gIFNlZQotCSAgIGh0dHA6Ly9nY2Mu
Z251Lm9yZy9tbC9nY2MtcGF0Y2hlcy8yMDAzLTEyL21zZzAyMzAzLmh0bWwKLQkgICBodHRwOi8v
bGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvYnVnLWNvcmV1dGlscy8yMDA1LTExL21zZzAwMTYx
Lmh0bWwKLQkgKi8KLQlfQm9vbCBxID0gdHJ1ZTsKLQlfQm9vbCAqcHEgPSAmcTsKLQorY2hhciB1
dWlkX2NsZWFyICgpOwogaW50CiBtYWluICgpCiB7Ci0KLQkqcHEgfD0gcTsKLQkqcHEgfD0gISBx
OwotCS8qIFJlZmVyIHRvIGV2ZXJ5IGRlY2xhcmVkIHZhbHVlLCB0byBhdm9pZCBjb21waWxlciBv
cHRpbWl6YXRpb25zLiAgKi8KLQlyZXR1cm4gKCFhICsgIWIgKyAhYyArICFkICsgIWUgKyAhZiAr
ICFnICsgIWggKyAhaSArICEhaiArICFrICsgISFsCi0JCSsgIW0gKyAhbiArICFvICsgIXAgKyAh
cSArICFwcSk7Ci0KK3JldHVybiB1dWlkX2NsZWFyICgpOwogICA7CiAgIHJldHVybiAwOwogfQog
X0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2
X2hlYWRlcl9zdGRib29sX2g9eWVzCi1lbHNlCi0gIGFjX2N2X2hlYWRlcl9zdGRib29sX2g9bm8K
LWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0
LiRhY19leHQKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJl
c3VsdDogJGFjX2N2X2hlYWRlcl9zdGRib29sX2giID4mNQotJGFzX2VjaG8gIiRhY19jdl9oZWFk
ZXJfc3RkYm9vbF9oIiA+JjY7IH0KLWFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgIl9Cb29s
IiAiYWNfY3ZfdHlwZV9fQm9vbCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRh
Y19jdl90eXBlX19Cb29sIiA9IHgiInllczsgdGhlbiA6Ci0KLWNhdCA+PmNvbmZkZWZzLmggPDxf
QUNFT0YKLSNkZWZpbmUgSEFWRV9fQk9PTCAxCi1fQUNFT0YKLQotCi1maQotCi1pZiB0ZXN0ICRh
Y19jdl9oZWFkZXJfc3RkYm9vbF9oID0geWVzOyB0aGVuCi0KLSRhc19lY2hvICIjZGVmaW5lIEhB
VkVfU1REQk9PTF9IIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1aWRfdCBpbiBzeXMvdHlwZXMuaCIg
PiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdWlkX3QgaW4gc3lzL3R5cGVzLmguLi4gIiA+
JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfdHlwZV91aWRfdCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0g
ICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxf
QUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRl
IDxzeXMvdHlwZXMuaD4KLQotX0FDRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNf
ZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAidWlkX3QiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0g
IGFjX2N2X3R5cGVfdWlkX3Q9eWVzCi1lbHNlCi0gIGFjX2N2X3R5cGVfdWlkX3Q9bm8KLWZpCi1y
bSAtZiBjb25mdGVzdCoKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiAkYWNfY3ZfdHlwZV91aWRfdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3R5
cGVfdWlkX3QiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfdHlwZV91aWRfdCA9IG5vOyB0aGVuCi0K
LSRhc19lY2hvICIjZGVmaW5lIHVpZF90IGludCIgPj5jb25mZGVmcy5oCi0KLQotJGFzX2VjaG8g
IiNkZWZpbmUgZ2lkX3QgaW50IiA+PmNvbmZkZWZzLmgKLQotZmkKLQoteyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLSRhc19l
Y2hvX24gImNoZWNraW5nIGZvciBpbmxpbmUuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zf
Y19pbmxpbmUrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4m
NgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGlu
ZV9fIF9faW5saW5lOyBkbwotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4k
YWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi10eXBl
ZGVmIGludCBmb29fdDsKLXN0YXRpYyAkYWNfa3cgZm9vX3Qgc3RhdGljX2ZvbyAoKSB7cmV0dXJu
IDA7IH0KLSRhY19rdyBmb29fdCBmb28gKCkge3JldHVybiAwOyB9Ci0jZW5kaWYKLQotX0FDRU9G
Ci1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2NfaW5s
aW5lPSRhY19rdworaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19j
dl9saWJfdXVpZF91dWlkX2NsZWFyPXllcworZWxzZQorICBhY19jdl9saWJfdXVpZF91dWlkX2Ns
ZWFyPW5vCiBmaQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBj
b25mdGVzdC4kYWNfZXh0Ci0gIHRlc3QgIiRhY19jdl9jX2lubGluZSIgIT0gbm8gJiYgYnJlYWsK
LWRvbmUKLQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisg
ICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xp
Yl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IHJlc3VsdDogJGFjX2N2X2xpYl91dWlkX3V1aWRfY2xlYXIiID4mNQorJGFzX2VjaG8gIiRhY19j
dl9saWJfdXVpZF91dWlkX2NsZWFyIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3V1aWRf
dXVpZF9jbGVhciIgPSB4IiJ5ZXM7IHRoZW4gOgorICBsaWJ1dWlkPSJ5IgogZmkKLXsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19pbmxpbmUi
ID4mNQotJGFzX2VjaG8gIiRhY19jdl9jX2lubGluZSIgPiY2OyB9CiAKLWNhc2UgJGFjX2N2X2Nf
aW5saW5lIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgKikKLSAgICBjYXNlICRhY19jdl9jX2lu
bGluZSBpbgotICAgICAgbm8pIGFjX3ZhbD07OwotICAgICAgKikgYWNfdmFsPSRhY19jdl9jX2lu
bGluZTs7Ci0gICAgZXNhYwotICAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNpZm5kZWYg
X19jcGx1c3BsdXMKLSNkZWZpbmUgaW5saW5lICRhY192YWwKLSNlbmRpZgotX0FDRU9GCi0gICAg
OzsKLWVzYWMKIAotYWNfZm5fY19maW5kX2ludFhfdCAiJExJTkVOTyIgIjE2IiAiYWNfY3ZfY19p
bnQxNl90IgotY2FzZSAkYWNfY3ZfY19pbnQxNl90IGluICMoCi0gIG5vfHllcykgOzsgIygKLSAg
KikKK2ZpCiAKLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgaW50MTZfdCAkYWNf
Y3ZfY19pbnQxNl90Ci1fQUNFT0YKLTs7Ci1lc2FjCiAKLWFjX2ZuX2NfZmluZF9pbnRYX3QgIiRM
SU5FTk8iICIzMiIgImFjX2N2X2NfaW50MzJfdCIKLWNhc2UgJGFjX2N2X2NfaW50MzJfdCBpbiAj
KAotICBub3x5ZXMpIDs7ICMoCi0gICopCithY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIk
TElORU5PIiAidXVpZC5oIiAiYWNfY3ZfaGVhZGVyX3V1aWRfaCIgIiRhY19pbmNsdWRlc19kZWZh
dWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfdXVpZF9oIiA9IHgiInllczsgdGhlbiA6Cisg
IGxpYnV1aWQ9InkiCitmaQogCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGlu
dDMyX3QgJGFjX2N2X2NfaW50MzJfdAotX0FDRU9GCi07OwotZXNhYwogCi1hY19mbl9jX2ZpbmRf
aW50WF90ICIkTElORU5PIiAiNjQiICJhY19jdl9jX2ludDY0X3QiCi1jYXNlICRhY19jdl9jX2lu
dDY0X3QgaW4gIygKLSAgbm98eWVzKSA7OyAjKAotICAqKQoraWYgdGVzdCAiJGxpYnV1aWQiICE9
ICJ5IjsgdGhlbiA6CiAKLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgaW50NjRf
dCAkYWNfY3ZfY19pbnQ2NF90Ci1fQUNFT0YKLTs7Ci1lc2FjCisgICAgYXNfZm5fZXJyb3IgJD8g
ImNhbm5vdCBmaW5kIGEgdmFsaWQgdXVpZCBsaWJyYXJ5IiAiJExJTkVOTyIgNQogCi1hY19mbl9j
X2ZpbmRfaW50WF90ICIkTElORU5PIiAiOCIgImFjX2N2X2NfaW50OF90IgotY2FzZSAkYWNfY3Zf
Y19pbnQ4X3QgaW4gIygKLSAgbm98eWVzKSA7OyAjKAotICAqKQorZmkKIAotY2F0ID4+Y29uZmRl
ZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBpbnQ4X3QgJGFjX2N2X2NfaW50OF90Ci1fQUNFT0YKLTs7
Ci1lc2FjCiAKLWFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgIm1vZGVfdCIgImFjX2N2X3R5
cGVfbW9kZV90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVf
bW9kZV90IiA9IHgiInllczsgdGhlbiA6CithY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIk
TElORU5PIiAiY3Vyc2VzLmgiICJhY19jdl9oZWFkZXJfY3Vyc2VzX2giICIkYWNfaW5jbHVkZXNf
ZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2N1cnNlc19oIiA9IHgiInllczsgdGhl
biA6CiAKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNr
aW5nIGZvciBjbGVhciBpbiAtbGN1cnNlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Ig
Y2xlYXIgaW4gLWxjdXJzZXMuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2N1cnNl
c19jbGVhcitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2
CiBlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sY3Vyc2VzICAk
TElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVu
ZCBjb25mZGVmcy5oLiAgKi8KIAotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBt
b2RlX3QgaW50CisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9p
ZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1
cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90
eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJD
IgorI2VuZGlmCitjaGFyIGNsZWFyICgpOworaW50CittYWluICgpCit7CityZXR1cm4gY2xlYXIg
KCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CiBfQUNFT0YKLQoraWYgYWNfZm5fY190cnlfbGluayAi
JExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfY3Vyc2VzX2NsZWFyPXllcworZWxzZQorICBh
Y19jdl9saWJfY3Vyc2VzX2NsZWFyPW5vCiBmaQotCi1hY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5F
Tk8iICJvZmZfdCIgImFjX2N2X3R5cGVfb2ZmX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlm
IHRlc3QgIngkYWNfY3ZfdHlwZV9vZmZfdCIgPSB4IiJ5ZXM7IHRoZW4gOgotCitybSAtZiBjb3Jl
IGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVl
eHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGli
X2N1cnNlc19jbGVhciIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9jdXJzZXNfY2xlYXIiID4m
NjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfY3Vyc2VzX2NsZWFyIiA9IHgiInllczsgdGhlbiA6
CisgIGN1cnNlcz0ieSIKIGVsc2UKLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmlu
ZSBvZmZfdCBsb25nIGludAotX0FDRU9GCi0KKyAgY3Vyc2VzPSJuIgogZmkKIAotYWNfZm5fY19j
aGVja190eXBlICIkTElORU5PIiAicGlkX3QiICJhY19jdl90eXBlX3BpZF90IiAiJGFjX2luY2x1
ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfcGlkX3QiID0geCIieWVzOyB0aGVu
IDoKIAogZWxzZQorICBjdXJzZXM9Im4iCitmaQogCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9G
Ci0jZGVmaW5lIHBpZF90IGludAotX0FDRU9GCiAKLWZpCithY19mbl9jX2NoZWNrX2hlYWRlcl9t
b25ncmVsICIkTElORU5PIiAibmN1cnNlcy5oIiAiYWNfY3ZfaGVhZGVyX25jdXJzZXNfaCIgIiRh
Y19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbmN1cnNlc19oIiA9
IHgiInllczsgdGhlbiA6CiAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogY2hlY2tpbmcgZm9yIEMvQysrIHJlc3RyaWN0IGtleXdvcmQiID4mNQotJGFzX2VjaG9fbiAi
Y2hlY2tpbmcgZm9yIEMvQysrIHJlc3RyaWN0IGtleXdvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3Qg
IiR7YWNfY3ZfY19yZXN0cmljdCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICAgeyAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgY2xlYXIgaW4gLWxuY3Vy
c2VzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBjbGVhciBpbiAtbG5jdXJzZXMuLi4g
IiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX25jdXJzZXNfY2xlYXIrc2V0fSIgPSBzZXQ7
IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBhY19jdl9jX3Jl
c3RyaWN0PW5vCi0gICAjIFRoZSBvcmRlciBoZXJlIGNhdGVycyB0byB0aGUgZmFjdCB0aGF0IEMr
KyBkb2VzIG5vdCByZXF1aXJlIHJlc3RyaWN0LgotICAgZm9yIGFjX2t3IGluIF9fcmVzdHJpY3Qg
X19yZXN0cmljdF9fIF9SZXN0cmljdCByZXN0cmljdDsgZG8KLSAgICAgY2F0IGNvbmZkZWZzLmgg
LSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRM
SUJTCitMSUJTPSItbG5jdXJzZXMgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+
Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwotdHlwZWRlZiBpbnQgKiBp
bnRfcHRyOwotCWludCBmb28gKGludF9wdHIgJGFjX2t3IGlwKSB7Ci0JcmV0dXJuIGlwWzBdOwot
ICAgICAgIH0KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZv
aWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0
dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3Rv
dHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAi
QyIKKyNlbmRpZgorY2hhciBjbGVhciAoKTsKIGludAogbWFpbiAoKQogewotaW50IHNbMV07Ci0J
aW50ICogJGFjX2t3IHQgPSBzOwotCXRbMF0gPSAwOwotCXJldHVybiBmb28odCkKK3JldHVybiBj
bGVhciAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KIF9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29t
cGlsZSAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9jX3Jlc3RyaWN0PSRhY19rdworaWYgYWNf
Zm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfbmN1cnNlc19jbGVh
cj15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX25jdXJzZXNfY2xlYXI9bm8KIGZpCi1ybSAtZiBjb3Jl
IGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgICAg
dGVzdCAiJGFjX2N2X2NfcmVzdHJpY3QiICE9IG5vICYmIGJyZWFrCi0gICBkb25lCi0KK3JtIC1m
IGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFj
X2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBm
aQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19j
dl9jX3Jlc3RyaWN0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfY19yZXN0cmljdCIgPiY2OyB9Ci0K
LSBjYXNlICRhY19jdl9jX3Jlc3RyaWN0IGluCi0gICByZXN0cmljdCkgOzsKLSAgIG5vKSAkYXNf
ZWNobyAiI2RlZmluZSByZXN0cmljdCAvKiovIiA+PmNvbmZkZWZzLmgKLSA7OwotICAgKikgIGNh
dCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgcmVzdHJpY3QgJGFjX2N2X2NfcmVzdHJp
Y3QKLV9BQ0VPRgotIDs7Ci0gZXNhYwotCi1hY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJz
aXplX3QiICJhY19jdl90eXBlX3NpemVfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVz
dCAieCRhY19jdl90eXBlX3NpemVfdCIgPSB4IiJ5ZXM7IHRoZW4gOgotCit7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9uY3Vyc2VzX2Ns
ZWFyIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX25jdXJzZXNfY2xlYXIiID4mNjsgfQoraWYg
dGVzdCAieCRhY19jdl9saWJfbmN1cnNlc19jbGVhciIgPSB4IiJ5ZXM7IHRoZW4gOgorICBuY3Vy
c2VzPSJ5IgogZWxzZQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIHNpemVf
dCB1bnNpZ25lZCBpbnQKLV9BQ0VPRgotCisgIG5jdXJzZXM9Im4iCiBmaQogCi1hY19mbl9jX2No
ZWNrX3R5cGUgIiRMSU5FTk8iICJzc2l6ZV90IiAiYWNfY3ZfdHlwZV9zc2l6ZV90IiAiJGFjX2lu
Y2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc3NpemVfdCIgPSB4IiJ5ZXM7
IHRoZW4gOgogCiBlbHNlCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgc3Np
emVfdCBpbnQKLV9BQ0VPRgotCisgIG5jdXJzZXM9Im4iCiBmaQogCi1hY19mbl9jX2NoZWNrX21l
bWJlciAiJExJTkVOTyIgInN0cnVjdCBzdGF0IiAic3RfYmxrc2l6ZSIgImFjX2N2X21lbWJlcl9z
dHJ1Y3Rfc3RhdF9zdF9ibGtzaXplIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4
JGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9ibGtzaXplIiA9IHgiInllczsgdGhlbiA6CiAK
LWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9TVFJVQ1RfU1RBVF9TVF9C
TEtTSVpFIDEKLV9BQ0VPRgoraWYgdGVzdCAiJGN1cnNlcyIgPSAibiIgJiYgdGVzdCAiJG5jdXJz
ZXMiID0gIm4iOyB0aGVuIDoKIAorICAgIGFzX2ZuX2Vycm9yICQ/ICJVbmFibGUgdG8gZmluZCBh
IHN1aXRhYmxlIGN1cnNlcyBsaWJyYXJ5IiAiJExJTkVOTyIgNQogCiBmaQorIyBQcmVmZXIgbmN1
cnNlcyBvdmVyIGN1cnNlcyBpZiBib3RoIGFyZSBwcmVzZW50CitpZiB0ZXN0ICIkbmN1cnNlcyIg
PSAieSI7IHRoZW4gOgogCi1hY19mbl9jX2NoZWNrX21lbWJlciAiJExJTkVOTyIgInN0cnVjdCBz
dGF0IiAic3RfYmxvY2tzIiAiYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2Jsb2NrcyIgIiRh
Y19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRf
c3RfYmxvY2tzIiA9IHgiInllczsgdGhlbiA6Ci0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YK
LSNkZWZpbmUgSEFWRV9TVFJVQ1RfU1RBVF9TVF9CTE9DS1MgMQotX0FDRU9GCisgICAgQ1VSU0VT
X0xJQlM9Ii1sbmN1cnNlcyIKIAorJGFzX2VjaG8gIiNkZWZpbmUgSU5DTFVERV9DVVJTRVNfSCA8
bmN1cnNlcy5oPiIgPj5jb25mZGVmcy5oCiAKLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfU1RfQkxP
Q0tTIDEiID4+Y29uZmRlZnMuaAogCiBlbHNlCi0gIGNhc2UgIiAkTElCT0JKUyAiIGluCi0gICoi
IGZpbGVibG9ja3MuJGFjX29iamV4dCAiKiApIDs7Ci0gICopIExJQk9CSlM9IiRMSUJPQkpTIGZp
bGVibG9ja3MuJGFjX29iamV4dCIKLSA7OwotZXNhYwotCi1maQotCiAKLWFjX2ZuX2NfY2hlY2tf
bWVtYmVyICIkTElORU5PIiAic3RydWN0IHN0YXQiICJzdF9yZGV2IiAiYWNfY3ZfbWVtYmVyX3N0
cnVjdF9zdGF0X3N0X3JkZXYiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNf
Y3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X3JkZXYiID0geCIieWVzOyB0aGVuIDoKKyAgICBDVVJT
RVNfTElCUz0iLWxjdXJzZXMiCiAKLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUg
SEFWRV9TVFJVQ1RfU1RBVF9TVF9SREVWIDEKLV9BQ0VPRgorJGFzX2VjaG8gIiNkZWZpbmUgSU5D
TFVERV9DVVJTRVNfSCA8Y3Vyc2VzLmg+IiA+PmNvbmZkZWZzLmgKIAogCiBmaQogCi1hY19mbl9j
X2ZpbmRfdWludFhfdCAiJExJTkVOTyIgIjE2IiAiYWNfY3ZfY191aW50MTZfdCIKLWNhc2UgJGFj
X2N2X2NfdWludDE2X3QgaW4gIygKLSAgbm98eWVzKSA7OyAjKAotICAqKQogCiAKLWNhdCA+PmNv
bmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgdWludDE2X3QgJGFjX2N2X2NfdWludDE2X3QKLV9B
Q0VPRgotOzsKLSAgZXNhYwogCi1hY19mbl9jX2ZpbmRfdWludFhfdCAiJExJTkVOTyIgIjMyIiAi
YWNfY3ZfY191aW50MzJfdCIKLWNhc2UgJGFjX2N2X2NfdWludDMyX3QgaW4gIygKLSAgbm98eWVz
KSA7OyAjKAotICAqKQogCi0kYXNfZWNobyAiI2RlZmluZSBfVUlOVDMyX1QgMSIgPj5jb25mZGVm
cy5oCiAKIAotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSB1aW50MzJfdCAkYWNf
Y3ZfY191aW50MzJfdAotX0FDRU9GCi07OwotICBlc2FjCiAKLWFjX2ZuX2NfZmluZF91aW50WF90
ICIkTElORU5PIiAiNjQiICJhY19jdl9jX3VpbnQ2NF90IgotY2FzZSAkYWNfY3ZfY191aW50NjRf
dCBpbiAjKAotICBub3x5ZXMpIDs7ICMoCitpZiB0ZXN0ICJ4JGFjX2N2X2Vudl9QS0dfQ09ORklH
X3NldCIgIT0gInhzZXQiOyB0aGVuCisJaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhl
bgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cGtnLWNv
bmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkg
JHthY190b29sX3ByZWZpeH1wa2ctY29uZmlnOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNf
ZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNf
Y3ZfcGF0aF9QS0dfQ09ORklHK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNh
Y2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkUEtHX0NPTkZJRyBpbgorICBbXFwvXSogfCA/Oltc
XC9dKikKKyAgYWNfY3ZfcGF0aF9QS0dfQ09ORklHPSIkUEtHX0NPTkZJRyIgIyBMZXQgdGhlIHVz
ZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CiAgICopCisgIGFzX3NhdmVf
SUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisg
IElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBm
b3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYg
eyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIk
YXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfUEtH
X0NPTkZJRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNf
ZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9J
RlMKIAotJGFzX2VjaG8gIiNkZWZpbmUgX1VJTlQ2NF9UIDEiID4+Y29uZmRlZnMuaAotCisgIDs7
Citlc2FjCitmaQorUEtHX0NPTkZJRz0kYWNfY3ZfcGF0aF9QS0dfQ09ORklHCitpZiB0ZXN0IC1u
ICIkUEtHX0NPTkZJRyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiByZXN1bHQ6ICRQS0dfQ09ORklHIiA+JjUKKyRhc19lY2hvICIkUEtHX0NPTkZJRyIg
PiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKIAotY2F0ID4+Y29uZmRl
ZnMuaCA8PF9BQ0VPRgotI2RlZmluZSB1aW50NjRfdCAkYWNfY3ZfY191aW50NjRfdAotX0FDRU9G
Ci07OwotICBlc2FjCiAKLWFjX2ZuX2NfZmluZF91aW50WF90ICIkTElORU5PIiAiOCIgImFjX2N2
X2NfdWludDhfdCIKLWNhc2UgJGFjX2N2X2NfdWludDhfdCBpbiAjKAotICBub3x5ZXMpIDs7ICMo
CitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfUEtHX0NPTkZJRyI7IHRoZW4KKyAgYWNfcHRf
UEtHX0NPTkZJRz0kUEtHX0NPTkZJRworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInBr
Zy1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1
bW15IHBrZy1jb25maWc7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNr
aW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX2FjX3B0
X1BLR19DT05GSUcrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAi
ID4mNgorZWxzZQorICBjYXNlICRhY19wdF9QS0dfQ09ORklHIGluCisgIFtcXC9dKiB8ID86W1xc
L10qKQorICBhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUc9IiRhY19wdF9QS0dfQ09ORklHIiAj
IExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKICAgKikK
KyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAk
UEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19k
aXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25z
OyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRh
c190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNf
Y3ZfcGF0aF9hY19wdF9QS0dfQ09ORklHPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0Igor
ICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIv
JGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9u
ZQorSUZTPSRhc19zYXZlX0lGUwogCi0kYXNfZWNobyAiI2RlZmluZSBfVUlOVDhfVCAxIiA+PmNv
bmZkZWZzLmgKLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIHVpbnQ4X3Qg
JGFjX2N2X2NfdWludDhfdAotX0FDRU9GCi07OwotICBlc2FjCi0KLWFjX2ZuX2NfY2hlY2tfdHlw
ZSAiJExJTkVOTyIgInB0cmRpZmZfdCIgImFjX2N2X3R5cGVfcHRyZGlmZl90IiAiJGFjX2luY2x1
ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfcHRyZGlmZl90IiA9IHgiInllczsg
dGhlbiA6Ci0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9QVFJESUZG
X1QgMQotX0FDRU9GCi0KLQorICA7OworZXNhYworZmkKK2FjX3B0X1BLR19DT05GSUc9JGFjX2N2
X3BhdGhfYWNfcHRfUEtHX0NPTkZJRworaWYgdGVzdCAtbiAiJGFjX3B0X1BLR19DT05GSUciOyB0
aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAk
YWNfcHRfUEtHX0NPTkZJRyIgPiY1CiskYXNfZWNobyAiJGFjX3B0X1BLR19DT05GSUciID4mNjsg
fQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KIGZpCiAKLQotIyBDaGVja3MgZm9yIGxp
YnJhcnkgZnVuY3Rpb25zLgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiBjaGVja2luZyBmb3IgZXJyb3JfYXRfbGluZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBm
b3IgZXJyb3JfYXRfbGluZS4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfZXJyb3Jf
YXRfbGluZStzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2
Ci1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8q
IGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxlcnJvci5oPgotaW50Ci1tYWluICgpCi17
Ci1lcnJvcl9hdF9saW5lICgwLCAwLCAiIiwgMCwgImFuIGVycm9yIG9jY3VycmVkIik7Ci0gIDsK
LSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0
aGVuIDoKLSAgYWNfY3ZfbGliX2Vycm9yX2F0X2xpbmU9eWVzCisgIGlmIHRlc3QgIngkYWNfcHRf
UEtHX0NPTkZJRyIgPSB4OyB0aGVuCisgICAgUEtHX0NPTkZJRz0iIgorICBlbHNlCisgICAgY2Fz
ZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMg
bm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdB
Uk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIg
PiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFBLR19DT05GSUc9JGFjX3B0
X1BLR19DT05GSUcKKyAgZmkKIGVsc2UKLSAgYWNfY3ZfbGliX2Vycm9yX2F0X2xpbmU9bm8KLWZp
Ci1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25m
dGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICBQS0dfQ09ORklHPSIkYWNfY3ZfcGF0
aF9QS0dfQ09ORklHIgogZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogcmVzdWx0OiAkYWNfY3ZfbGliX2Vycm9yX2F0X2xpbmUiID4mNQotJGFzX2VjaG8gIiRhY19j
dl9saWJfZXJyb3JfYXRfbGluZSIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9saWJfZXJyb3JfYXRf
bGluZSA9IG5vOyB0aGVuCi0gIGNhc2UgIiAkTElCT0JKUyAiIGluCi0gICoiIGVycm9yLiRhY19v
YmpleHQgIiogKSA7OwotICAqKSBMSUJPQkpTPSIkTElCT0JKUyBlcnJvci4kYWNfb2JqZXh0Igot
IDs7Ci1lc2FjCiAKIGZpCi0KLWZvciBhY19oZWFkZXIgaW4gdmZvcmsuaAotZG8gOgotICBhY19m
bl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAidmZvcmsuaCIgImFjX2N2X2hlYWRl
cl92Zm9ya19oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRl
cl92Zm9ya19oIiA9IHgiInllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YK
LSNkZWZpbmUgSEFWRV9WRk9SS19IIDEKLV9BQ0VPRgotCitpZiB0ZXN0IC1uICIkUEtHX0NPTkZJ
RyI7IHRoZW4KKwlfcGtnX21pbl92ZXJzaW9uPTAuOS4wCisJeyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBwa2ctY29uZmlnIGlzIGF0IGxlYXN0IHZlcnNp
b24gJF9wa2dfbWluX3ZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgcGtnLWNvbmZp
ZyBpcyBhdCBsZWFzdCB2ZXJzaW9uICRfcGtnX21pbl92ZXJzaW9uLi4uICIgPiY2OyB9CisJaWYg
JFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uICRfcGtnX21pbl92ZXJzaW9u
OyB0aGVuCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0
OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJZWxzZQorCQl7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5v
IiA+JjY7IH0KKwkJUEtHX0NPTkZJRz0iIgorCWZpCiBmaQogCi1kb25lCi0KLWZvciBhY19mdW5j
IGluIGZvcmsgdmZvcmsKLWRvIDoKLSAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18k
YWNfZnVuYyIgfCAkYXNfdHJfc2hgCi1hY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNf
ZnVuYyIgIiRhc19hY192YXIiCi1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgi
eWVzIjsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYCRhc19l
Y2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotCi1maQotZG9uZQor
cGtnX2ZhaWxlZD1ubworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBj
aGVja2luZyBmb3IgZ2xpYiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2xpYi4uLiAi
ID4mNjsgfQogCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZm9yayIgPSB4eWVzOyB0aGVuCi0gIHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHdvcmtp
bmcgZm9yayIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igd29ya2luZyBmb3JrLi4uICIg
PiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2Z1bmNfZm9ya193b3JrcytzZXR9IiA9IHNldDsgdGhl
biA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9z
c19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPWNyb3Nz
CitpZiB0ZXN0IC1uICIkZ2xpYl9DRkxBR1MiOyB0aGVuCisgICAgcGtnX2N2X2dsaWJfQ0ZMQUdT
PSIkZ2xpYl9DRkxBR1MiCisgZWxpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KKyAgICBp
ZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyIgJiYgXAorICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiBcJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMg
XCJnbGliLTIuMFwiIjsgfSA+JjUKKyAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQtZXJy
b3JzICJnbGliLTIuMCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19z
dGF0dXMgPSAwOyB9OyB0aGVuCisgIHBrZ19jdl9nbGliX0NGTEFHUz1gJFBLR19DT05GSUcgLS1j
ZmxhZ3MgImdsaWItMi4wIiAyPi9kZXYvbnVsbGAKIGVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8
PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2lu
Y2x1ZGVzX2RlZmF1bHQKLWludAotbWFpbiAoKQotewotCi0JICAvKiBCeSBSdWVkaWdlciBLdWhs
bWFubi4gKi8KLQkgIHJldHVybiBmb3JrICgpIDwgMDsKLQotICA7Ci0gIHJldHVybiAwOwotfQot
X0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfZnVu
Y19mb3JrX3dvcmtzPXllcworICBwa2dfZmFpbGVkPXllcworZmkKKyBlbHNlCisgICAgcGtnX2Zh
aWxlZD11bnRyaWVkCitmaQoraWYgdGVzdCAtbiAiJGdsaWJfTElCUyI7IHRoZW4KKyAgICBwa2df
Y3ZfZ2xpYl9MSUJTPSIkZ2xpYl9MSUJTIgorIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0
aGVuCisgICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKKyAgICB7IHsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJp
bnQtZXJyb3JzIFwiZ2xpYi0yLjBcIiI7IH0gPiY1CisgICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAt
LXByaW50LWVycm9ycyAiZ2xpYi0yLjAiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAg
dGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgorICBwa2dfY3ZfZ2xpYl9MSUJTPWAkUEtHX0NP
TkZJRyAtLWxpYnMgImdsaWItMi4wIiAyPi9kZXYvbnVsbGAKIGVsc2UKLSAgYWNfY3ZfZnVuY19m
b3JrX3dvcmtzPW5vCisgIHBrZ19mYWlsZWQ9eWVzCiBmaQotcm0gLWYgY29yZSAqLmNvcmUgY29y
ZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25m
dGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorIGVsc2UKKyAg
ICBwa2dfZmFpbGVkPXVudHJpZWQKIGZpCiAKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfZm9ya193b3JrcyIgPiY1Ci0kYXNf
ZWNobyAiJGFjX2N2X2Z1bmNfZm9ya193b3JrcyIgPiY2OyB9CiAKKworaWYgdGVzdCAkcGtnX2Zh
aWxlZCA9IHllczsgdGhlbgorICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCitpZiAkUEtHX0NP
TkZJRyAtLWF0bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gMC4yMDsgdGhlbgorICAgICAgICBfcGtn
X3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9eWVzCiBlbHNlCi0gIGFjX2N2X2Z1bmNfZm9ya193b3Jr
cz0kYWNfY3ZfZnVuY19mb3JrCisgICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD1u
bwogZmkKLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA9IHhjcm9zczsgdGhlbgot
ICBjYXNlICRob3N0IGluCi0gICAgKi0qLWFtaWdhb3MqIHwgKi0qLW1zZG9zZGpncHAqKQotICAg
ICAgIyBPdmVycmlkZSwgYXMgdGhlc2Ugc3lzdGVtcyBoYXZlIG9ubHkgYSBkdW1teSBmb3JrKCkg
c3R1YgotICAgICAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPW5vCi0gICAgICA7OwotICAgICopCi0g
ICAgICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9eWVzCi0gICAgICA7OwotICBlc2FjCi0gIHsgJGFz
X2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogcmVzdWx0ICRhY19j
dl9mdW5jX2Zvcmtfd29ya3MgZ3Vlc3NlZCBiZWNhdXNlIG9mIGNyb3NzIGNvbXBpbGF0aW9uIiA+
JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHJlc3VsdCAkYWNfY3ZfZnVuY19mb3JrX3dv
cmtzIGd1ZXNzZWQgYmVjYXVzZSBvZiBjcm9zcyBjb21waWxhdGlvbiIgPiYyO30KLWZpCi1hY19j
dl9mdW5jX3Zmb3JrX3dvcmtzPSRhY19jdl9mdW5jX3Zmb3JrCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1
bmNfdmZvcmsiID0geHllczsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIHZmb3JrIiA+JjUKLSRhc19lY2hvX24gImNo
ZWNraW5nIGZvciB3b3JraW5nIHZmb3JrLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2Z1
bmNfdmZvcmtfd29ya3Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVk
KSAiID4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6
Ci0gIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9Y3Jvc3MKLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmgg
LSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotLyog
VGhhbmtzIHRvIFBhdWwgRWdnZXJ0IGZvciB0aGlzIHRlc3QuICAqLwotJGFjX2luY2x1ZGVzX2Rl
ZmF1bHQKLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2lmZGVmIEhBVkVfVkZPUktfSAotIyBpbmNs
dWRlIDx2Zm9yay5oPgotI2VuZGlmCi0vKiBPbiBzb21lIHNwYXJjIHN5c3RlbXMsIGNoYW5nZXMg
YnkgdGhlIGNoaWxkIHRvIGxvY2FsIGFuZCBpbmNvbWluZwotICAgYXJndW1lbnQgcmVnaXN0ZXJz
IGFyZSBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIHBhcmVudC4gIFRoZSBjb21waWxlcgotICAgaXMg
dG9sZCBhYm91dCB0aGlzIHdpdGggI2luY2x1ZGUgPHZmb3JrLmg+LCBidXQgc29tZSBjb21waWxl
cnMKLSAgIChlLmcuIGdjYyAtTykgZG9uJ3QgZ3JvayA8dmZvcmsuaD4uICBUZXN0IGZvciB0aGlz
IGJ5IHVzaW5nIGEKLSAgIHN0YXRpYyB2YXJpYWJsZSB3aG9zZSBhZGRyZXNzIGlzIHB1dCBpbnRv
IGEgcmVnaXN0ZXIgdGhhdCBpcwotICAgY2xvYmJlcmVkIGJ5IHRoZSB2Zm9yay4gICovCi1zdGF0
aWMgdm9pZAotI2lmZGVmIF9fY3BsdXNwbHVzCi1zcGFyY19hZGRyZXNzX3Rlc3QgKGludCBhcmcp
Ci0jIGVsc2UKLXNwYXJjX2FkZHJlc3NfdGVzdCAoYXJnKSBpbnQgYXJnOwotI2VuZGlmCi17Ci0g
IHN0YXRpYyBwaWRfdCBjaGlsZDsKLSAgaWYgKCFjaGlsZCkgewotICAgIGNoaWxkID0gdmZvcmsg
KCk7Ci0gICAgaWYgKGNoaWxkIDwgMCkgewotICAgICAgcGVycm9yICgidmZvcmsiKTsKLSAgICAg
IF9leGl0KDIpOwotICAgIH0KLSAgICBpZiAoIWNoaWxkKSB7Ci0gICAgICBhcmcgPSBnZXRwaWQo
KTsKLSAgICAgIHdyaXRlKC0xLCAiIiwgMCk7Ci0gICAgICBfZXhpdCAoYXJnKTsKLSAgICB9Ci0g
IH0KLX0KKyAgICAgICAgaWYgdGVzdCAkX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkID0geWVz
OyB0aGVuCisJICAgICAgICBnbGliX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0tc2hvcnQtZXJy
b3JzIC0tcHJpbnQtZXJyb3JzICJnbGliLTIuMCIgMj4mMWAKKyAgICAgICAgZWxzZQorCSAgICAg
ICAgZ2xpYl9QS0dfRVJST1JTPWAkUEtHX0NPTkZJRyAtLXByaW50LWVycm9ycyAiZ2xpYi0yLjAi
IDI+JjFgCisgICAgICAgIGZpCisJIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29u
ZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCisJZWNobyAiJGdsaWJfUEtHX0VSUk9SUyIgPiY1CiAK
LWludAotbWFpbiAoKQotewotICBwaWRfdCBwYXJlbnQgPSBnZXRwaWQgKCk7Ci0gIHBpZF90IGNo
aWxkOwotCi0gIHNwYXJjX2FkZHJlc3NfdGVzdCAoMCk7Ci0KLSAgY2hpbGQgPSB2Zm9yayAoKTsK
LQotICBpZiAoY2hpbGQgPT0gMCkgewotICAgIC8qIEhlcmUgaXMgYW5vdGhlciB0ZXN0IGZvciBz
cGFyYyB2Zm9yayByZWdpc3RlciBwcm9ibGVtcy4gIFRoaXMKLSAgICAgICB0ZXN0IHVzZXMgbG90
cyBvZiBsb2NhbCB2YXJpYWJsZXMsIGF0IGxlYXN0IGFzIG1hbnkgbG9jYWwKLSAgICAgICB2YXJp
YWJsZXMgYXMgbWFpbiBoYXMgYWxsb2NhdGVkIHNvIGZhciBpbmNsdWRpbmcgY29tcGlsZXIKLSAg
ICAgICB0ZW1wb3Jhcmllcy4gIDQgbG9jYWxzIGFyZSBlbm91Z2ggZm9yIGdjYyAxLjQwLjMgb24g
YSBTb2xhcmlzCi0gICAgICAgNC4xLjMgc3BhcmMsIGJ1dCB3ZSB1c2UgOCB0byBiZSBzYWZlLiAg
QSBidWdneSBjb21waWxlciBzaG91bGQKLSAgICAgICByZXVzZSB0aGUgcmVnaXN0ZXIgb2YgcGFy
ZW50IGZvciBvbmUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlcywKLSAgICAgICBzaW5jZSBpdCB3aWxs
IHRoaW5rIHRoYXQgcGFyZW50IGNhbid0IHBvc3NpYmx5IGJlIHVzZWQgYW55IG1vcmUKLSAgICAg
ICBpbiB0aGlzIHJvdXRpbmUuICBBc3NpZ25pbmcgdG8gdGhlIGxvY2FsIHZhcmlhYmxlIHdpbGwg
dGh1cwotICAgICAgIG11bmdlIHBhcmVudCBpbiB0aGUgcGFyZW50IHByb2Nlc3MuICAqLwotICAg
IHBpZF90Ci0gICAgICBwID0gZ2V0cGlkKCksIHAxID0gZ2V0cGlkKCksIHAyID0gZ2V0cGlkKCks
IHAzID0gZ2V0cGlkKCksCi0gICAgICBwNCA9IGdldHBpZCgpLCBwNSA9IGdldHBpZCgpLCBwNiA9
IGdldHBpZCgpLCBwNyA9IGdldHBpZCgpOwotICAgIC8qIENvbnZpbmNlIHRoZSBjb21waWxlciB0
aGF0IHAuLnA3IGFyZSBsaXZlOyBvdGhlcndpc2UsIGl0IG1pZ2h0Ci0gICAgICAgdXNlIHRoZSBz
YW1lIGhhcmR3YXJlIHJlZ2lzdGVyIGZvciBhbGwgOCBsb2NhbCB2YXJpYWJsZXMuICAqLwotICAg
IGlmIChwICE9IHAxIHx8IHAgIT0gcDIgfHwgcCAhPSBwMyB8fCBwICE9IHA0Ci0JfHwgcCAhPSBw
NSB8fCBwICE9IHA2IHx8IHAgIT0gcDcpCi0gICAgICBfZXhpdCgxKTsKLQotICAgIC8qIE9uIHNv
bWUgc3lzdGVtcyAoZS5nLiBJUklYIDMuMyksIHZmb3JrIGRvZXNuJ3Qgc2VwYXJhdGUgcGFyZW50
Ci0gICAgICAgZnJvbSBjaGlsZCBmaWxlIGRlc2NyaXB0b3JzLiAgSWYgdGhlIGNoaWxkIGNsb3Nl
cyBhIGRlc2NyaXB0b3IKLSAgICAgICBiZWZvcmUgaXQgZXhlY3Mgb3IgZXhpdHMsIHRoaXMgbXVu
Z2VzIHRoZSBwYXJlbnQncyBkZXNjcmlwdG9yCi0gICAgICAgYXMgd2VsbC4gIFRlc3QgZm9yIHRo
aXMgYnkgY2xvc2luZyBzdGRvdXQgaW4gdGhlIGNoaWxkLiAgKi8KLSAgICBfZXhpdChjbG9zZShm
aWxlbm8oc3Rkb3V0KSkgIT0gMCk7Ci0gIH0gZWxzZSB7Ci0gICAgaW50IHN0YXR1czsKLSAgICBz
dHJ1Y3Qgc3RhdCBzdDsKKwlhc19mbl9lcnJvciAkPyAiUGFja2FnZSByZXF1aXJlbWVudHMgKGds
aWItMi4wKSB3ZXJlIG5vdCBtZXQ6CiAKLSAgICB3aGlsZSAod2FpdCgmc3RhdHVzKSAhPSBjaGls
ZCkKLSAgICAgIDsKLSAgICByZXR1cm4gKAotCSAvKiBXYXMgdGhlcmUgc29tZSBwcm9ibGVtIHdp
dGggdmZvcmtpbmc/ICAqLwotCSBjaGlsZCA8IDAKKyRnbGliX1BLR19FUlJPUlMKIAotCSAvKiBE
aWQgdGhlIGNoaWxkIGZhaWw/ICAoVGhpcyBzaG91bGRuJ3QgaGFwcGVuLikgICovCi0JIHx8IHN0
YXR1cworQ29uc2lkZXIgYWRqdXN0aW5nIHRoZSBQS0dfQ09ORklHX1BBVEggZW52aXJvbm1lbnQg
dmFyaWFibGUgaWYgeW91CitpbnN0YWxsZWQgc29mdHdhcmUgaW4gYSBub24tc3RhbmRhcmQgcHJl
Zml4LgogCi0JIC8qIERpZCB0aGUgdmZvcmsvY29tcGlsZXIgYnVnIG9jY3VyPyAgKi8KLQkgfHwg
cGFyZW50ICE9IGdldHBpZCgpCitBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IHNldCB0aGUgZW52aXJv
bm1lbnQgdmFyaWFibGVzIGdsaWJfQ0ZMQUdTCithbmQgZ2xpYl9MSUJTIHRvIGF2b2lkIHRoZSBu
ZWVkIHRvIGNhbGwgcGtnLWNvbmZpZy4KK1NlZSB0aGUgcGtnLWNvbmZpZyBtYW4gcGFnZSBmb3Ig
bW9yZSBkZXRhaWxzLiIgIiRMSU5FTk8iIDUKK2VsaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHVudHJp
ZWQ7IHRoZW4KKyAgICAgCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCXsgeyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFz
X2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3Ig
JD8gIlRoZSBwa2ctY29uZmlnIHNjcmlwdCBjb3VsZCBub3QgYmUgZm91bmQgb3IgaXMgdG9vIG9s
ZC4gIE1ha2Ugc3VyZSBpdAoraXMgaW4geW91ciBQQVRIIG9yIHNldCB0aGUgUEtHX0NPTkZJRyBl
bnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgZnVsbAorcGF0aCB0byBwa2ctY29uZmlnLgogCi0J
IC8qIERpZCB0aGUgZmlsZSBkZXNjcmlwdG9yIGJ1ZyBvY2N1cj8gICovCi0JIHx8IGZzdGF0KGZp
bGVubyhzdGRvdXQpLCAmc3QpICE9IDAKLQkgKTsKLSAgfQotfQotX0FDRU9GCi1pZiBhY19mbl9j
X3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz15ZXMK
K0FsdGVybmF0aXZlbHksIHlvdSBtYXkgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZ2xp
Yl9DRkxBR1MKK2FuZCBnbGliX0xJQlMgdG8gYXZvaWQgdGhlIG5lZWQgdG8gY2FsbCBwa2ctY29u
ZmlnLgorU2VlIHRoZSBwa2ctY29uZmlnIG1hbiBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisKK1Rv
IGdldCBwa2ctY29uZmlnLCBzZWUgPGh0dHA6Ly9wa2ctY29uZmlnLmZyZWVkZXNrdG9wLm9yZy8+
LgorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUgOyB9CiBl
bHNlCi0gIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9bm8KLWZpCi1ybSAtZiBjb3JlICouY29yZSBj
b3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNv
bmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Ci1maQorCWds
aWJfQ0ZMQUdTPSRwa2dfY3ZfZ2xpYl9DRkxBR1MKKwlnbGliX0xJQlM9JHBrZ19jdl9nbGliX0xJ
QlMKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1
bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KIAogZmkKLXsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY192Zm9ya193b3Jr
cyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MiID4mNjsgfQogCi1maTsK
LWlmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA9IHhjcm9zczsgdGhlbgotICBhY19j
dl9mdW5jX3Zmb3JrX3dvcmtzPSRhY19jdl9mdW5jX3Zmb3JrCi0gIHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogcmVzdWx0ICRhY19jdl9mdW5jX3Zmb3Jr
X3dvcmtzIGd1ZXNzZWQgYmVjYXVzZSBvZiBjcm9zcyBjb21waWxhdGlvbiIgPiY1Ci0kYXNfZWNo
byAiJGFzX21lOiBXQVJOSU5HOiByZXN1bHQgJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MgZ3Vlc3Nl
ZCBiZWNhdXNlIG9mIGNyb3NzIGNvbXBpbGF0aW9uIiA+JjI7fQorIyBDaGVjayBsaWJyYXJ5IHBh
dGgKK2lmIHRlc3QgIlwke2V4ZWNfcHJlZml4fS9saWIiID0gIiRsaWJkaXIiOyB0aGVuIDoKKyAg
aWYgdGVzdCAiJGV4ZWNfcHJlZml4IiA9ICJOT05FIiAmJiB0ZXN0ICIkcHJlZml4IiAhPSAiTk9O
RSI7IHRoZW4gOgorICBleGVjX3ByZWZpeD0kcHJlZml4CiBmaQorICAgIGlmIHRlc3QgIiRleGVj
X3ByZWZpeCIgPSAiTk9ORSI7IHRoZW4gOgorICBleGVjX3ByZWZpeD0kYWNfZGVmYXVsdF9wcmVm
aXgKK2ZpCisgICAgaWYgdGVzdCAtZCAiJHtleGVjX3ByZWZpeH0vbGliNjQiOyB0aGVuIDoKIAot
aWYgdGVzdCAieCRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIiA9IHh5ZXM7IHRoZW4KLQotJGFzX2Vj
aG8gIiNkZWZpbmUgSEFWRV9XT1JLSU5HX1ZGT1JLIDEiID4+Y29uZmRlZnMuaAorICAgICAgICBM
SUJfUEFUSD0ibGliNjQiCiAKIGVsc2UKIAotJGFzX2VjaG8gIiNkZWZpbmUgdmZvcmsgZm9yayIg
Pj5jb25mZGVmcy5oCisgICAgICAgIExJQl9QQVRIPSJsaWIiCiAKIGZpCi1pZiB0ZXN0ICJ4JGFj
X2N2X2Z1bmNfZm9ya193b3JrcyIgPSB4eWVzOyB0aGVuCiAKLSRhc19lY2hvICIjZGVmaW5lIEhB
VkVfV09SS0lOR19GT1JLIDEiID4+Y29uZmRlZnMuaAorZWxzZQogCi1maQorICAgIExJQl9QQVRI
PSIke2xpYmRpcjpgZXhwciBsZW5ndGggIiRleGVjX3ByZWZpeCIgKyAxYH0iCiAKLXsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIF9MQVJHRUZJTEVf
U09VUkNFIHZhbHVlIG5lZWRlZCBmb3IgbGFyZ2UgZmlsZXMiID4mNQotJGFzX2VjaG9fbiAiY2hl
Y2tpbmcgZm9yIF9MQVJHRUZJTEVfU09VUkNFIHZhbHVlIG5lZWRlZCBmb3IgbGFyZ2UgZmlsZXMu
Li4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfc3lzX2xhcmdlZmlsZV9zb3VyY2Urc2V0fSIg
PSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICB3aGls
ZSA6OyBkbwotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0v
KiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+IC8qIGZvciBvZmZf
dCAqLwotICAgICAjaW5jbHVkZSA8c3RkaW8uaD4KLWludAotbWFpbiAoKQotewotaW50ICgqZnAp
IChGSUxFICosIG9mZl90LCBpbnQpID0gZnNlZWtvOwotICAgICByZXR1cm4gZnNlZWtvIChzdGRp
biwgMCwgMCkgJiYgZnAgKHN0ZGluLCAwLCAwKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VP
RgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9zeXNfbGFy
Z2VmaWxlX3NvdXJjZT1ubzsgYnJlYWsKLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25m
dGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4
dAotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQg
Y29uZmRlZnMuaC4gICovCi0jZGVmaW5lIF9MQVJHRUZJTEVfU09VUkNFIDEKLSNpbmNsdWRlIDxz
eXMvdHlwZXMuaD4gLyogZm9yIG9mZl90ICovCi0gICAgICNpbmNsdWRlIDxzdGRpby5oPgotaW50
Ci1tYWluICgpCi17Ci1pbnQgKCpmcCkgKEZJTEUgKiwgb2ZmX3QsIGludCkgPSBmc2Vla287Ci0g
ICAgIHJldHVybiBmc2Vla28gKHN0ZGluLCAwLCAwKSAmJiBmcCAoc3RkaW4sIDAsIDApOwotICA7
Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsg
dGhlbiA6Ci0gIGFjX2N2X3N5c19sYXJnZWZpbGVfc291cmNlPTE7IGJyZWFrCiBmaQotcm0gLWYg
Y29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgY29uZnRlc3QkYWNf
ZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3Zfc3lzX2xhcmdlZmlsZV9zb3VyY2U9dW5r
bm93bgotICBicmVhawotZG9uZQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc3lzX2xhcmdlZmlsZV9zb3VyY2UiID4mNQotJGFzX2Vj
aG8gIiRhY19jdl9zeXNfbGFyZ2VmaWxlX3NvdXJjZSIgPiY2OyB9Ci1jYXNlICRhY19jdl9zeXNf
bGFyZ2VmaWxlX3NvdXJjZSBpbiAjKAotICBubyB8IHVua25vd24pIDs7Ci0gICopCi1jYXQgPj5j
b25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIF9MQVJHRUZJTEVfU09VUkNFICRhY19jdl9zeXNf
bGFyZ2VmaWxlX3NvdXJjZQotX0FDRU9GCi07OwotZXNhYwotcm0gLXJmIGNvbmZ0ZXN0KgotCi0j
IFdlIHVzZWQgdG8gdHJ5IGRlZmluaW5nIF9YT1BFTl9TT1VSQ0U9NTAwIHRvbywgdG8gd29yayBh
cm91bmQgYSBidWcKLSMgaW4gZ2xpYmMgMi4xLjMsIGJ1dCB0aGF0IGJyZWFrcyB0b28gbWFueSBv
dGhlciB0aGluZ3MuCi0jIElmIHlvdSB3YW50IGZzZWVrbyBhbmQgZnRlbGxvIHdpdGggZ2xpYmMs
IHVwZ3JhZGUgdG8gYSBmaXhlZCBnbGliYy4KLWlmIHRlc3QgJGFjX2N2X3N5c19sYXJnZWZpbGVf
c291cmNlICE9IHVua25vd247IHRoZW4KIAotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9GU0VFS08g
MSIgPj5jb25mZGVmcy5oCiAKLWZpCisjIENoZWNrcyBmb3IgbGlicmFyaWVzLgorYWNfZm5fY19j
aGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImJ6bGliLmgiICJhY19jdl9oZWFkZXJfYnps
aWJfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfYnps
aWJfaCIgPSB4IiJ5ZXM7IHRoZW4gOgogCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgbHN0YXQgY29ycmVjdGx5IGhhbmRsZXMgdHJhaWxp
bmcgc2xhc2giID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBsc3RhdCBjb3JyZWN0
bHkgaGFuZGxlcyB0cmFpbGluZyBzbGFzaC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9m
dW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbmsrc2V0fSIgPSBzZXQ7IHRoZW4g
OgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Ig
QloyX2J6RGVjb21wcmVzc0luaXQgaW4gLWxiejIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcg
Zm9yIEJaMl9iekRlY29tcHJlc3NJbml0IGluIC1sYnoyLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIk
e2FjX2N2X2xpYl9iejJfQloyX2J6RGVjb21wcmVzc0luaXQrc2V0fSIgPSBzZXQ7IHRoZW4gOgog
ICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBybSAtZiBjb25mdGVzdC5zeW0g
Y29uZnRlc3QuZmlsZQotZWNobyA+Y29uZnRlc3QuZmlsZQotaWYgdGVzdCAiJGFzX2xuX3MiID0g
ImxuIC1zIiAmJiBsbiAtcyBjb25mdGVzdC5maWxlIGNvbmZ0ZXN0LnN5bTsgdGhlbgotICBpZiB0
ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfbHN0YXRf
ZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluaz1ubwotZWxzZQotICBjYXQgY29uZmRlZnMuaCAt
IDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJ
QlMKK0xJQlM9Ii1sYnoyICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0
ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0
CisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVy
cm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBl
IG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291
bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5k
aWYKK2NoYXIgQloyX2J6RGVjb21wcmVzc0luaXQgKCk7CiBpbnQKIG1haW4gKCkKIHsKLXN0cnVj
dCBzdGF0IHNidWY7Ci0gICAgIC8qIExpbnV4IHdpbGwgZGVyZWZlcmVuY2UgdGhlIHN5bWxpbmsg
YW5kIGZhaWwsIGFzIHJlcXVpcmVkIGJ5IFBPU0lYLgotCVRoYXQgaXMgYmV0dGVyIGluIHRoZSBz
ZW5zZSB0aGF0IGl0IG1lYW5zIHdlIHdpbGwgbm90Ci0JaGF2ZSB0byBjb21waWxlIGFuZCB1c2Ug
dGhlIGxzdGF0IHdyYXBwZXIuICAqLwotICAgICByZXR1cm4gbHN0YXQgKCJjb25mdGVzdC5zeW0v
IiwgJnNidWYpID09IDA7CityZXR1cm4gQloyX2J6RGVjb21wcmVzc0luaXQgKCk7CiAgIDsKICAg
cmV0dXJuIDA7CiB9CiBfQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4g
OgotICBhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbms9eWVzCi1l
bHNlCi0gIGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluaz1ubwot
ZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29u
ZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNv
bmZ0ZXN0LiRhY19leHQKLWZpCi0KK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVu
IDoKKyAgYWNfY3ZfbGliX2J6Ml9CWjJfYnpEZWNvbXByZXNzSW5pdD15ZXMKIGVsc2UKLSAgIyBJ
ZiB0aGUgYGxuIC1zJyBjb21tYW5kIGZhaWxlZCwgdGhlbiB3ZSBwcm9iYWJseSBkb24ndCBldmVu
Ci0gICMgaGF2ZSBhbiBsc3RhdCBmdW5jdGlvbi4KLSAgYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVy
ZW5jZXNfc2xhc2hlZF9zeW1saW5rPW5vCisgIGFjX2N2X2xpYl9iejJfQloyX2J6RGVjb21wcmVz
c0luaXQ9bm8KIGZpCi1ybSAtZiBjb25mdGVzdC5zeW0gY29uZnRlc3QuZmlsZQotCitybSAtZiBj
b3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19l
eGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkK
K3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zf
bGliX2J6Ml9CWjJfYnpEZWNvbXByZXNzSW5pdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9i
ejJfQloyX2J6RGVjb21wcmVzc0luaXQiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfYnoy
X0JaMl9iekRlY29tcHJlc3NJbml0IiA9IHgiInllczsgdGhlbiA6CisgIHpsaWI9IiR6bGliIC1E
SEFWRV9CWkxJQiAtbGJ6MiIKIGZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3lt
bGluayIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNo
ZWRfc3ltbGluayIgPiY2OyB9Ci0KLXRlc3QgJGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2Vz
X3NsYXNoZWRfc3ltbGluayA9IHllcyAmJgogCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0j
ZGVmaW5lIExTVEFUX0ZPTExPV1NfU0xBU0hFRF9TWU1MSU5LIDEKLV9BQ0VPRgogCitmaQogCi1p
ZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluayIg
PSB4bm87IHRoZW4KLSAgY2FzZSAiICRMSUJPQkpTICIgaW4KLSAgKiIgbHN0YXQuJGFjX29iamV4
dCAiKiApIDs7Ci0gICopIExJQk9CSlM9IiRMSUJPQkpTIGxzdGF0LiRhY19vYmpleHQiCi0gOzsK
LWVzYWMKIAotZmkKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJsem1h
LmgiICJhY19jdl9oZWFkZXJfbHptYV9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0
ICJ4JGFjX2N2X2hlYWRlcl9sem1hX2giID0geCIieWVzOyB0aGVuIDoKIAoteyAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHN5cy90eXBlcy5o
IGRlZmluZXMgbWFrZWRldiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHN5cy90
eXBlcy5oIGRlZmluZXMgbWFrZWRldi4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9oZWFk
ZXJfc3lzX3R5cGVzX2hfbWFrZWRlditzZXR9IiA9IHNldDsgdGhlbiA6Cit7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsem1hX3N0cmVhbV9kZWNv
ZGVyIGluIC1sbHptYSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbHptYV9zdHJlYW1f
ZGVjb2RlciBpbiAtbGx6bWEuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2x6bWFf
bHptYV9zdHJlYW1fZGVjb2RlcitzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihj
YWNoZWQpICIgPiY2CiBlbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0
LiRhY19leHQKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxsem1hICAk
TElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVu
ZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogT3ZlcnJpZGUg
YW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hh
ciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1
aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4g
ICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBsem1hX3N0
cmVhbV9kZWNvZGVyICgpOwogaW50CiBtYWluICgpCiB7Ci1yZXR1cm4gbWFrZWRldigwLCAwKTsK
K3JldHVybiBsem1hX3N0cmVhbV9kZWNvZGVyICgpOwogICA7CiAgIHJldHVybiAwOwogfQogX0FD
RU9GCiBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2hlYWRl
cl9zeXNfdHlwZXNfaF9tYWtlZGV2PXllcworICBhY19jdl9saWJfbHptYV9sem1hX3N0cmVhbV9k
ZWNvZGVyPXllcwogZWxzZQotICBhY19jdl9oZWFkZXJfc3lzX3R5cGVzX2hfbWFrZWRldj1ubwor
ICBhY19jdl9saWJfbHptYV9sem1hX3N0cmVhbV9kZWNvZGVyPW5vCiBmaQogcm0gLWYgY29yZSBj
b25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgY29uZnRlc3QkYWNfZXhlZXh0
IGNvbmZ0ZXN0LiRhY19leHQKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N5c190eXBlc19oX21ha2VkZXYiID4mNQot
JGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3lzX3R5cGVzX2hfbWFrZWRldiIgPiY2OyB9Ci0KLWlm
IHRlc3QgJGFjX2N2X2hlYWRlcl9zeXNfdHlwZXNfaF9tYWtlZGV2ID0gbm87IHRoZW4KLWFjX2Zu
X2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJzeXMvbWtkZXYuaCIgImFjX2N2X2hl
YWRlcl9zeXNfbWtkZXZfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19j
dl9oZWFkZXJfc3lzX21rZGV2X2giID0geCIieWVzOyB0aGVuIDoKLQotJGFzX2VjaG8gIiNkZWZp
bmUgTUFKT1JfSU5fTUtERVYgMSIgPj5jb25mZGVmcy5oCi0KK0xJQlM9JGFjX2NoZWNrX2xpYl9z
YXZlX0xJQlMKIGZpCi0KLQotCi0gIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zeXNfbWtkZXZfaCA9
IG5vOyB0aGVuCi0gICAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInN5
cy9zeXNtYWNyb3MuaCIgImFjX2N2X2hlYWRlcl9zeXNfc3lzbWFjcm9zX2giICIkYWNfaW5jbHVk
ZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3N5c19zeXNtYWNyb3NfaCIgPSB4
IiJ5ZXM7IHRoZW4gOgotCi0kYXNfZWNobyAiI2RlZmluZSBNQUpPUl9JTl9TWVNNQUNST1MgMSIg
Pj5jb25mZGVmcy5oCi0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiAkYWNfY3ZfbGliX2x6bWFfbHptYV9zdHJlYW1fZGVjb2RlciIgPiY1CiskYXNfZWNo
byAiJGFjX2N2X2xpYl9sem1hX2x6bWFfc3RyZWFtX2RlY29kZXIiID4mNjsgfQoraWYgdGVzdCAi
eCRhY19jdl9saWJfbHptYV9sem1hX3N0cmVhbV9kZWNvZGVyIiA9IHgiInllczsgdGhlbiA6Cisg
IHpsaWI9IiR6bGliIC1ESEFWRV9MWk1BIC1sbHptYSIKIGZpCiAKIAotICBmaQogZmkKIAotZm9y
IGFjX2hlYWRlciBpbiBzdGRsaWIuaAotZG8gOgotICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25n
cmVsICIkTElORU5PIiAic3RkbGliLmgiICJhY19jdl9oZWFkZXJfc3RkbGliX2giICIkYWNfaW5j
bHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3N0ZGxpYl9oIiA9IHgiInll
czsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9TVERM
SUJfSCAxCi1fQUNFT0YKLQotZmkKIAotZG9uZQorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3Jl
bCAiJExJTkVOTyIgImx6by9sem8xeC5oIiAiYWNfY3ZfaGVhZGVyX2x6b19sem8xeF9oIiAiJGFj
X2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9sem9fbHpvMXhfaCIg
PSB4IiJ5ZXM7IHRoZW4gOgogCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IGNoZWNraW5nIGZvciBHTlUgbGliYyBjb21wYXRpYmxlIG1hbGxvYyIgPiY1Ci0kYXNfZWNo
b19uICJjaGVja2luZyBmb3IgR05VIGxpYmMgY29tcGF0aWJsZSBtYWxsb2MuLi4gIiA+JjY7IH0K
LWlmIHRlc3QgIiR7YWNfY3ZfZnVuY19tYWxsb2NfMF9ub25udWxsK3NldH0iID0gc2V0OyB0aGVu
IDoKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9y
IGx6bzF4X2RlY29tcHJlc3MgaW4gLWxsem8yIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZv
ciBsem8xeF9kZWNvbXByZXNzIGluIC1sbHpvMi4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19j
dl9saWJfbHpvMl9sem8xeF9kZWNvbXByZXNzK3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2Vj
aG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIg
PSB5ZXM7IHRoZW4gOgotICBhY19jdl9mdW5jX21hbGxvY18wX25vbm51bGw9bm8KLWVsc2UKLSAg
Y2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorICBhY19jaGVja19s
aWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGx6bzIgICRMSUJTIgorY2F0IGNvbmZkZWZzLmgg
LSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2lm
IGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgSEFWRV9TVERMSUJfSAotIyBpbmNsdWRl
IDxzdGRsaWIuaD4KLSNlbHNlCi1jaGFyICptYWxsb2MgKCk7Ci0jZW5kaWYKIAorLyogT3ZlcnJp
ZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2Ug
Y2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAg
IGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBs
eS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBsem8x
eF9kZWNvbXByZXNzICgpOwogaW50CiBtYWluICgpCiB7Ci1yZXR1cm4gISBtYWxsb2MgKDApOwor
cmV0dXJuIGx6bzF4X2RlY29tcHJlc3MgKCk7CiAgIDsKICAgcmV0dXJuIDA7CiB9CiBfQUNFT0YK
LWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9mdW5jX21hbGxv
Y18wX25vbm51bGw9eWVzCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Cisg
IGFjX2N2X2xpYl9sem8yX2x6bzF4X2RlY29tcHJlc3M9eWVzCiBlbHNlCi0gIGFjX2N2X2Z1bmNf
bWFsbG9jXzBfbm9ubnVsbD1ubworICBhY19jdl9saWJfbHpvMl9sem8xeF9kZWNvbXByZXNzPW5v
CiBmaQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBj
b25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0g
Y29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29i
amV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFj
X2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCi0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2x6bzJfbHpvMXhfZGVjb21wcmVzcyIgPiY1
CiskYXNfZWNobyAiJGFjX2N2X2xpYl9sem8yX2x6bzF4X2RlY29tcHJlc3MiID4mNjsgfQoraWYg
dGVzdCAieCRhY19jdl9saWJfbHpvMl9sem8xeF9kZWNvbXByZXNzIiA9IHgiInllczsgdGhlbiA6
CisgIHpsaWI9IiR6bGliIC1ESEFWRV9MWk8xWCAtbGx6bzIiCiBmaQoteyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX21hbGxvY18wX25v
bm51bGwiID4mNQotJGFzX2VjaG8gIiRhY19jdl9mdW5jX21hbGxvY18wX25vbm51bGwiID4mNjsg
fQotaWYgdGVzdCAkYWNfY3ZfZnVuY19tYWxsb2NfMF9ub25udWxsID0geWVzOyB0aGVuIDoKLQot
JGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9NQUxMT0MgMSIgPj5jb25mZGVmcy5oCi0KLWVsc2UKLSAg
JGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9NQUxMT0MgMCIgPj5jb25mZGVmcy5oCi0KLSAgIGNhc2Ug
IiAkTElCT0JKUyAiIGluCi0gICoiIG1hbGxvYy4kYWNfb2JqZXh0ICIqICkgOzsKLSAgKikgTElC
T0JKUz0iJExJQk9CSlMgbWFsbG9jLiRhY19vYmpleHQiCi0gOzsKLWVzYWMKLQogCi0kYXNfZWNo
byAiI2RlZmluZSBtYWxsb2MgcnBsX21hbGxvYyIgPj5jb25mZGVmcy5oCiAKIGZpCiAKIAoteyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRp
bWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZCIgPiY1Ci0kYXNfZWNob19u
ICJjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNs
dWRlZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfdGltZStzZXR9IiA9IHNl
dDsgdGhlbiA6CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hl
Y2tpbmcgZm9yIGlvX3NldHVwIGluIC1sYWlvIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZv
ciBpb19zZXR1cCBpbiAtbGFpby4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfYWlv
X2lvX3NldHVwK3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+
JjYKIGVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAor
ICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGFpbyAgJExJQlMiCitjYXQg
Y29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMu
aC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNp
bmNsdWRlIDx0aW1lLmg+CiAKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBl
IHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2gg
dGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVu
dCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitl
eHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgaW9fc2V0dXAgKCk7CiBpbnQKIG1haW4gKCkKIHsKLWlm
ICgoc3RydWN0IHRtICopIDApCi1yZXR1cm4gMDsKK3JldHVybiBpb19zZXR1cCAoKTsKICAgOwog
ICByZXR1cm4gMDsKIH0KIF9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7
IHRoZW4gOgotICBhY19jdl9oZWFkZXJfdGltZT15ZXMKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRM
SU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2Fpb19pb19zZXR1cD15ZXMKIGVsc2UKLSAgYWNf
Y3ZfaGVhZGVyX3RpbWU9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4k
YWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRlcl90aW1lIiA+JjUKLSRhc19lY2hv
ICIkYWNfY3ZfaGVhZGVyX3RpbWUiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3RpbWUg
PSB5ZXM7IHRoZW4KLQotJGFzX2VjaG8gIiNkZWZpbmUgVElNRV9XSVRIX1NZU19USU1FIDEiID4+
Y29uZmRlZnMuaAotCisgIGFjX2N2X2xpYl9haW9faW9fc2V0dXA9bm8KIGZpCi0KLQotCi0KLSAg
Zm9yIGFjX2hlYWRlciBpbiAkYWNfaGVhZGVyX2xpc3QKLWRvIDoKLSAgYXNfYWNfSGVhZGVyPWAk
YXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAotYWNfZm5fY19j
aGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVy
IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSIKLWlmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVh
ZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2Rl
ZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YK
LQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29u
ZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZl
X0xJQlMKIGZpCi0KLWRvbmUKLQotCi0KLQotCi0KLQotCi0gIGZvciBhY19mdW5jIGluICRhY19m
dW5jX2xpc3QKLWRvIDoKLSAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVu
YyIgfCAkYXNfdHJfc2hgCi1hY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIg
IiRhc19hY192YXIiCi1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsg
dGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYCRhc19lY2hvICJI
QVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotCit7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9haW9faW9fc2V0dXAi
ID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfYWlvX2lvX3NldHVwIiA+JjY7IH0KK2lmIHRlc3Qg
IngkYWNfY3ZfbGliX2Fpb19pb19zZXR1cCIgPSB4IiJ5ZXM7IHRoZW4gOgorICBzeXN0ZW1fYWlv
PSJ5IgorZWxzZQorICBzeXN0ZW1fYWlvPSJuIgogZmkKLWRvbmUKLQogCiAKLQotCi17ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIG1r
dGltZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igd29ya2luZyBta3RpbWUuLi4gIiA+
JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfZnVuY193b3JraW5nX21rdGltZStzZXR9IiA9IHNldDsg
dGhlbiA6Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5n
IGZvciBNRDUgaW4gLWxjcnlwdG8iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIE1ENSBp
biAtbGNyeXB0by4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfY3J5cHRvX01ENStz
ZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0g
IGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY193
b3JraW5nX21rdGltZT1ubwotZWxzZQotICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25m
dGVzdC4kYWNfZXh0CisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sY3J5
cHRvICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQK
IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIFRlc3QgcHJvZ3JhbSBmcm9tIFBhdWwgRWdnZXJ0
IGFuZCBUb255IExlbmVpcy4gICovCi0jaWZkZWYgVElNRV9XSVRIX1NZU19USU1FCi0jIGluY2x1
ZGUgPHN5cy90aW1lLmg+Ci0jIGluY2x1ZGUgPHRpbWUuaD4KLSNlbHNlCi0jIGlmZGVmIEhBVkVf
U1lTX1RJTUVfSAotIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSMgZWxzZQotIyAgaW5jbHVkZSA8
dGltZS5oPgotIyBlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRl
IDxzdGRsaWIuaD4KIAotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSMgaW5jbHVkZSA8dW5pc3RkLmg+
Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0FMQVJNCi0jIGRlZmluZSBhbGFybShYKSAvKiBlbXB0
eSAqLworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4g
ZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5
cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3
b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKICNl
bmRpZgotCi0vKiBXb3JrIGFyb3VuZCByZWRlZmluaXRpb24gdG8gcnBsX3B1dGVudiBieSBvdGhl
ciBjb25maWcgdGVzdHMuICAqLwotI3VuZGVmIHB1dGVudgotCi1zdGF0aWMgdGltZV90IHRpbWVf
dF9tYXg7Ci1zdGF0aWMgdGltZV90IHRpbWVfdF9taW47Ci0KLS8qIFZhbHVlcyB3ZSdsbCB1c2Ug
dG8gc2V0IHRoZSBUWiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gICovCi1zdGF0aWMgY29uc3QgY2hh
ciAqdHpfc3RyaW5nc1tdID0gewotICAoY29uc3QgY2hhciAqKSAwLCAiVFo9R01UMCIsICJUWj1K
U1QtOSIsCi0gICJUWj1FU1QrM0VEVCsyLE0xMC4xLjAvMDA6MDA6MDAsTTIuMy4wLzAwOjAwOjAw
IgotfTsKLSNkZWZpbmUgTl9TVFJJTkdTIChzaXplb2YgKHR6X3N0cmluZ3MpIC8gc2l6ZW9mICh0
el9zdHJpbmdzWzBdKSkKLQotLyogUmV0dXJuIDAgaWYgbWt0aW1lIGZhaWxzIHRvIGNvbnZlcnQg
YSBkYXRlIGluIHRoZSBzcHJpbmctZm9yd2FyZCBnYXAuCi0gICBCYXNlZCBvbiBhIHByb2JsZW0g
cmVwb3J0IGZyb20gQW5kcmVhcyBKYWVnZXIuICAqLwotc3RhdGljIGludAotc3ByaW5nX2Zvcndh
cmRfZ2FwICgpCi17Ci0gIC8qIGdsaWJjICh1cCB0byBhYm91dCAxOTk4LTEwLTA3KSBmYWlsZWQg
dGhpcyB0ZXN0LiAqLwotICBzdHJ1Y3QgdG0gdG07Ci0KLSAgLyogVXNlIHRoZSBwb3J0YWJsZSBQ
T1NJWC4xIHNwZWNpZmljYXRpb24gIlRaPVBTVDhQRFQsTTQuMS4wLE0xMC41LjAiCi0gICAgIGlu
c3RlYWQgb2YgIlRaPUFtZXJpY2EvVmFuY291dmVyIiBpbiBvcmRlciB0byBkZXRlY3QgdGhlIGJ1
ZyBldmVuCi0gICAgIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZSBPbHNvbiBleHRl
bnNpb24sIG9yIGRvbid0IGhhdmUgdGhlCi0gICAgIGZ1bGwgem9uZWluZm8gdGFibGVzIGluc3Rh
bGxlZC4gICovCi0gIHB1dGVudiAoKGNoYXIqKSAiVFo9UFNUOFBEVCxNNC4xLjAsTTEwLjUuMCIp
OwotCi0gIHRtLnRtX3llYXIgPSA5ODsKLSAgdG0udG1fbW9uID0gMzsKLSAgdG0udG1fbWRheSA9
IDU7Ci0gIHRtLnRtX2hvdXIgPSAyOwotICB0bS50bV9taW4gPSAwOwotICB0bS50bV9zZWMgPSAw
OwotICB0bS50bV9pc2RzdCA9IC0xOwotICByZXR1cm4gbWt0aW1lICgmdG0pICE9ICh0aW1lX3Qp
IC0xOwotfQotCi1zdGF0aWMgaW50Ci1ta3RpbWVfdGVzdDEgKHRpbWVfdCBub3cpCi17Ci0gIHN0
cnVjdCB0bSAqbHQ7Ci0gIHJldHVybiAhIChsdCA9IGxvY2FsdGltZSAoJm5vdykpIHx8IG1rdGlt
ZSAobHQpID09IG5vdzsKLX0KLQotc3RhdGljIGludAotbWt0aW1lX3Rlc3QgKHRpbWVfdCBub3cp
Ci17Ci0gIHJldHVybiAobWt0aW1lX3Rlc3QxIChub3cpCi0JICAmJiBta3RpbWVfdGVzdDEgKCh0
aW1lX3QpICh0aW1lX3RfbWF4IC0gbm93KSkKLQkgICYmIG1rdGltZV90ZXN0MSAoKHRpbWVfdCkg
KHRpbWVfdF9taW4gKyBub3cpKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWlyaXhfNl80X2J1ZyAoKQot
ewotICAvKiBCYXNlZCBvbiBjb2RlIGZyb20gQXJpZWwgRmFpZ29uLiAgKi8KLSAgc3RydWN0IHRt
IHRtOwotICB0bS50bV95ZWFyID0gOTY7Ci0gIHRtLnRtX21vbiA9IDM7Ci0gIHRtLnRtX21kYXkg
PSAwOwotICB0bS50bV9ob3VyID0gMDsKLSAgdG0udG1fbWluID0gMDsKLSAgdG0udG1fc2VjID0g
MDsKLSAgdG0udG1faXNkc3QgPSAtMTsKLSAgbWt0aW1lICgmdG0pOwotICByZXR1cm4gdG0udG1f
bW9uID09IDIgJiYgdG0udG1fbWRheSA9PSAzMTsKLX0KLQotc3RhdGljIGludAotYmlndGltZV90
ZXN0IChpbnQgaikKLXsKLSAgc3RydWN0IHRtIHRtOwotICB0aW1lX3Qgbm93OwotICB0bS50bV95
ZWFyID0gdG0udG1fbW9uID0gdG0udG1fbWRheSA9IHRtLnRtX2hvdXIgPSB0bS50bV9taW4gPSB0
bS50bV9zZWMgPSBqOwotICBub3cgPSBta3RpbWUgKCZ0bSk7Ci0gIGlmIChub3cgIT0gKHRpbWVf
dCkgLTEpCi0gICAgewotICAgICAgc3RydWN0IHRtICpsdCA9IGxvY2FsdGltZSAoJm5vdyk7Ci0g
ICAgICBpZiAoISAobHQKLQkgICAgICYmIGx0LT50bV95ZWFyID09IHRtLnRtX3llYXIKLQkgICAg
ICYmIGx0LT50bV9tb24gPT0gdG0udG1fbW9uCi0JICAgICAmJiBsdC0+dG1fbWRheSA9PSB0bS50
bV9tZGF5Ci0JICAgICAmJiBsdC0+dG1faG91ciA9PSB0bS50bV9ob3VyCi0JICAgICAmJiBsdC0+
dG1fbWluID09IHRtLnRtX21pbgotCSAgICAgJiYgbHQtPnRtX3NlYyA9PSB0bS50bV9zZWMKLQkg
ICAgICYmIGx0LT50bV95ZGF5ID09IHRtLnRtX3lkYXkKLQkgICAgICYmIGx0LT50bV93ZGF5ID09
IHRtLnRtX3dkYXkKLQkgICAgICYmICgobHQtPnRtX2lzZHN0IDwgMCA/IC0xIDogMCA8IGx0LT50
bV9pc2RzdCkKLQkJICA9PSAodG0udG1faXNkc3QgPCAwID8gLTEgOiAwIDwgdG0udG1faXNkc3Qp
KSkpCi0JcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAoteWVh
cl8yMDUwX3Rlc3QgKCkKLXsKLSAgLyogVGhlIGNvcnJlY3QgYW5zd2VyIGZvciAyMDUwLTAyLTAx
IDAwOjAwOjAwIGluIFBhY2lmaWMgdGltZSwKLSAgICAgaWdub3JpbmcgbGVhcCBzZWNvbmRzLiAg
Ki8KLSAgdW5zaWduZWQgbG9uZyBpbnQgYW5zd2VyID0gMjUyNzMxNTIwMFVMOwotCi0gIHN0cnVj
dCB0bSB0bTsKLSAgdGltZV90IHQ7Ci0gIHRtLnRtX3llYXIgPSAyMDUwIC0gMTkwMDsKLSAgdG0u
dG1fbW9uID0gMiAtIDE7Ci0gIHRtLnRtX21kYXkgPSAxOwotICB0bS50bV9ob3VyID0gdG0udG1f
bWluID0gdG0udG1fc2VjID0gMDsKLSAgdG0udG1faXNkc3QgPSAtMTsKLQotICAvKiBVc2UgdGhl
IHBvcnRhYmxlIFBPU0lYLjEgc3BlY2lmaWNhdGlvbiAiVFo9UFNUOFBEVCxNNC4xLjAsTTEwLjUu
MCIKLSAgICAgaW5zdGVhZCBvZiAiVFo9QW1lcmljYS9WYW5jb3V2ZXIiIGluIG9yZGVyIHRvIGRl
dGVjdCB0aGUgYnVnIGV2ZW4KLSAgICAgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhl
IE9sc29uIGV4dGVuc2lvbiwgb3IgZG9uJ3QgaGF2ZSB0aGUKLSAgICAgZnVsbCB6b25laW5mbyB0
YWJsZXMgaW5zdGFsbGVkLiAgKi8KLSAgcHV0ZW52ICgoY2hhciopICJUWj1QU1Q4UERULE00LjEu
MCxNMTAuNS4wIik7Ci0KLSAgdCA9IG1rdGltZSAoJnRtKTsKLQotICAvKiBDaGVjayB0aGF0IHRo
ZSByZXN1bHQgaXMgZWl0aGVyIGEgZmFpbHVyZSwgb3IgY2xvc2UgZW5vdWdoCi0gICAgIHRvIHRo
ZSBjb3JyZWN0IGFuc3dlciB0aGF0IHdlIGNhbiBhc3N1bWUgdGhlIGRpc2NyZXBhbmN5IGlzCi0g
ICAgIGR1ZSB0byBsZWFwIHNlY29uZHMuICAqLwotICByZXR1cm4gKHQgPT0gKHRpbWVfdCkgLTEK
LQkgIHx8ICgwIDwgdCAmJiBhbnN3ZXIgLSAxMjAgPD0gdCAmJiB0IDw9IGFuc3dlciArIDEyMCkp
OwotfQotCitjaGFyIE1ENSAoKTsKIGludAogbWFpbiAoKQogewotICB0aW1lX3QgdCwgZGVsdGE7
Ci0gIGludCBpLCBqOwotCi0gIC8qIFRoaXMgdGVzdCBtYWtlcyBzb21lIGJ1Z2d5IG1rdGltZSBp
bXBsZW1lbnRhdGlvbnMgbG9vcC4KLSAgICAgR2l2ZSB1cCBhZnRlciA2MCBzZWNvbmRzOyBhIG1r
dGltZSBzbG93ZXIgdGhhbiB0aGF0Ci0gICAgIGlzbid0IHdvcnRoIHVzaW5nIGFueXdheS4gICov
Ci0gIGFsYXJtICg2MCk7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICB0ID0gKHRpbWVfdF9t
YXggPDwgMSkgKyAxOwotICAgICAgaWYgKHQgPD0gdGltZV90X21heCkKLQlicmVhazsKLSAgICAg
IHRpbWVfdF9tYXggPSB0OwotICAgIH0KLSAgdGltZV90X21pbiA9IC0gKCh0aW1lX3QpIH4gKHRp
bWVfdCkgMCA9PSAodGltZV90KSAtMSkgLSB0aW1lX3RfbWF4OwotCi0gIGRlbHRhID0gdGltZV90
X21heCAvIDk5NzsgLyogYSBzdWl0YWJsZSBwcmltZSBudW1iZXIgKi8KLSAgZm9yIChpID0gMDsg
aSA8IE5fU1RSSU5HUzsgaSsrKQotICAgIHsKLSAgICAgIGlmICh0el9zdHJpbmdzW2ldKQotCXB1
dGVudiAoKGNoYXIqKSB0el9zdHJpbmdzW2ldKTsKLQotICAgICAgZm9yICh0ID0gMDsgdCA8PSB0
aW1lX3RfbWF4IC0gZGVsdGE7IHQgKz0gZGVsdGEpCi0JaWYgKCEgbWt0aW1lX3Rlc3QgKHQpKQot
CSAgcmV0dXJuIDE7Ci0gICAgICBpZiAoISAobWt0aW1lX3Rlc3QgKCh0aW1lX3QpIDEpCi0JICAg
ICAmJiBta3RpbWVfdGVzdCAoKHRpbWVfdCkgKDYwICogNjApKQotCSAgICAgJiYgbWt0aW1lX3Rl
c3QgKCh0aW1lX3QpICg2MCAqIDYwICogMjQpKSkpCi0JcmV0dXJuIDE7Ci0KLSAgICAgIGZvciAo
aiA9IDE7IDsgaiA8PD0gMSkKLQlpZiAoISBiaWd0aW1lX3Rlc3QgKGopKQotCSAgcmV0dXJuIDE7
Ci0JZWxzZSBpZiAoSU5UX01BWCAvIDIgPCBqKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoISBiaWd0
aW1lX3Rlc3QgKElOVF9NQVgpKQotCXJldHVybiAxOwotICAgIH0KLSAgcmV0dXJuICEgKGlyaXhf
Nl80X2J1ZyAoKSAmJiBzcHJpbmdfZm9yd2FyZF9nYXAgKCkgJiYgeWVhcl8yMDUwX3Rlc3QgKCkp
OworcmV0dXJuIE1ENSAoKTsKKyAgOworICByZXR1cm4gMDsKIH0KIF9BQ0VPRgotaWYgYWNfZm5f
Y190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfd29ya2luZ19ta3RpbWU9
eWVzCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9j
cnlwdG9fTUQ1PXllcwogZWxzZQotICBhY19jdl9mdW5jX3dvcmtpbmdfbWt0aW1lPW5vCi1maQot
cm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVz
dCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRl
c3QuJGFjX2V4dAotZmkKLQorICBhY19jdl9saWJfY3J5cHRvX01ENT1ubwogZmkKLXsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY193b3Jr
aW5nX21rdGltZSIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2Z1bmNfd29ya2luZ19ta3RpbWUiID4m
NjsgfQotaWYgdGVzdCAkYWNfY3ZfZnVuY193b3JraW5nX21rdGltZSA9IG5vOyB0aGVuCi0gIGNh
c2UgIiAkTElCT0JKUyAiIGluCi0gICoiIG1rdGltZS4kYWNfb2JqZXh0ICIqICkgOzsKLSAgKikg
TElCT0JKUz0iJExJQk9CSlMgbWt0aW1lLiRhY19vYmpleHQiCi0gOzsKLWVzYWMKLQorcm0gLWYg
Y29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNf
ZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZp
Ci0KLQotCi0KLQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8gOgotICBhY19mbl9j
X2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJnZXRwYWdlc2l6ZSIgImFjX2N2X2Z1bmNfZ2V0cGFnZXNp
emUiCi1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0cGFnZXNpemUiID0geCIieWVzOyB0aGVuIDoK
K3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zf
bGliX2NyeXB0b19NRDUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfY3J5cHRvX01ENSIgPiY2
OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9jcnlwdG9fTUQ1IiA9IHgiInllczsgdGhlbiA6CiAg
IGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9HRVRQQUdFU0laRSAxCisj
ZGVmaW5lIEhBVkVfTElCQ1JZUFRPIDEKIF9BQ0VPRgogCisgIExJQlM9Ii1sY3J5cHRvICRMSUJT
IgorCitlbHNlCisgIGFzX2ZuX2Vycm9yICQ/ICJDb3VsZCBub3QgZmluZCBsaWJjcnlwdG8iICIk
TElORU5PIiA1CiBmaQotZG9uZQogCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tp
bmcgZm9yIHdvcmtpbmcgbW1hcC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9mdW5jX21t
YXBfZml4ZWRfbWFwcGVkK3NldH0iID0gc2V0OyB0aGVuIDoKK3sgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGV4dDJmc19vcGVuMiBpbiAtbGV4dDJm
cyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZXh0MmZzX29wZW4yIGluIC1sZXh0MmZz
Li4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9leHQyZnNfZXh0MmZzX29wZW4yK3Nl
dH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAg
aWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgotICBhY19jdl9mdW5jX21t
YXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNv
bmZ0ZXN0LiRhY19leHQKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxl
eHQyZnMgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4
dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLS8qIG1hbGxv
YyBtaWdodCBoYXZlIGJlZW4gcmVuYW1lZCBhcyBycGxfbWFsbG9jLiAqLwotI3VuZGVmIG1hbGxv
YwotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVz
dC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJp
dmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRs
eSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBw
ZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hl
cmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFs
cmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0
aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3Ig
bW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChU
aGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0g
ICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMg
d2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmls
ZSBzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0Qg
YW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5n
cywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3Bh
Z2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0g
ICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0
aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4
aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhv
dyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0KLSNpbmNsdWRlIDxmY250bC5oPgotI2lu
Y2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLSNpZiAhZGVmaW5lZCBTVERDX0hFQURFUlMgJiYgIWRlZmlu
ZWQgSEFWRV9TVERMSUJfSAotY2hhciAqbWFsbG9jICgpOwotI2VuZGlmCi0KLS8qIFRoaXMgbWVz
cyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFW
RV9HRVRQQUdFU0laRQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6
ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwot
IyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAg
IGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdF
U0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0j
ICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xT
SVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8K
LSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5l
IGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZk
ZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAg
ICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBl
bmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAg
ZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkg
ODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0gg
Ki8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dF
VFBBR0VTSVpFICovCiAKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRv
IGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhl
IHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBw
cm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRl
cm4gIkMiCisjZW5kaWYKK2NoYXIgZXh0MmZzX29wZW4yICgpOwogaW50CiBtYWluICgpCiB7Ci0g
IGNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotICBjb25zdCBjaGFyICpjZGF0YTI7Ci0gIGlu
dCBpLCBwYWdlc2l6ZTsKLSAgaW50IGZkLCBmZDI7Ci0KLSAgcGFnZXNpemUgPSBnZXRwYWdlc2l6
ZSAoKTsKLQotICAvKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2Ug
aW4gaXQuICovCi0gIGRhdGEgPSAoY2hhciAqKSBtYWxsb2MgKHBhZ2VzaXplKTsKLSAgaWYgKCFk
YXRhKQotICAgIHJldHVybiAxOwotICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLSAg
ICAqKGRhdGEgKyBpKSA9IHJhbmQgKCk7Ci0gIHVtYXNrICgwKTsKLSAgZmQgPSBjcmVhdCAoImNv
bmZ0ZXN0Lm1tYXAiLCAwNjAwKTsKLSAgaWYgKGZkIDwgMCkKLSAgICByZXR1cm4gMjsKLSAgaWYg
KHdyaXRlIChmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotICAgIHJldHVybiAzOwot
ICBjbG9zZSAoZmQpOwotCi0gIC8qIE5leHQsIGNoZWNrIHRoYXQgdGhlIHRhaWwgb2YgYSBwYWdl
IGlzIHplcm8tZmlsbGVkLiAgRmlsZSBtdXN0IGhhdmUKLSAgICAgbm9uLXplcm8gbGVuZ3RoLCBv
dGhlcndpc2Ugd2UgcmlzayBTSUdCVVMgZm9yIGVudGlyZSBwYWdlLiAgKi8KLSAgZmQyID0gb3Bl
biAoImNvbmZ0ZXN0LnR4dCIsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjAwKTsKLSAg
aWYgKGZkMiA8IDApCi0gICAgcmV0dXJuIDQ7Ci0gIGNkYXRhMiA9ICIiOwotICBpZiAod3JpdGUg
KGZkMiwgY2RhdGEyLCAxKSAhPSAxKQotICAgIHJldHVybiA1OwotICBkYXRhMiA9IChjaGFyICop
IG1tYXAgKDAsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBm
ZDIsIDBMKTsKLSAgaWYgKGRhdGEyID09IE1BUF9GQUlMRUQpCi0gICAgcmV0dXJuIDY7Ci0gIGZv
ciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotICAgIGlmICgqKGRhdGEyICsgaSkpCi0gICAg
ICByZXR1cm4gNzsKLSAgY2xvc2UgKGZkMik7Ci0gIGlmIChtdW5tYXAgKGRhdGEyLCBwYWdlc2l6
ZSkpCi0gICAgcmV0dXJuIDg7Ci0KLSAgLyogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQg
YSBmaXhlZCBhZGRyZXNzIHdoaWNoIGFscmVhZHkgaGFzCi0gICAgIHNvbWV0aGluZyBlbHNlIGFs
bG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwgYWxzbyBtYWtlIHN1cmUgdGhhdAotICAgICB3ZSBz
ZWUgdGhlIHNhbWUgZ2FyYmFnZS4gICovCi0gIGZkID0gb3BlbiAoImNvbmZ0ZXN0Lm1tYXAiLCBP
X1JEV1IpOwotICBpZiAoZmQgPCAwKQotICAgIHJldHVybiA5OwotICBpZiAoZGF0YTIgIT0gbW1h
cCAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkgICAgIE1BUF9Q
UklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotICAgIHJldHVybiAxMDsKLSAgZm9yIChpID0g
MDsgaSA8IHBhZ2VzaXplOyArK2kpCi0gICAgaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBp
KSkKLSAgICAgIHJldHVybiAxMTsKLQotICAvKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFu
Z2VzIHRvIHRoZSBtYXBwZWQgYXJlYSBkbyBub3QKLSAgICAgcGVyY29sYXRlIGJhY2sgdG8gdGhl
IGZpbGUgYXMgc2VlbiBieSByZWFkKCkuICAoVGhpcyBpcyBhIGJ1ZyBvbgotICAgICBzb21lIHZh
cmlhbnRzIG9mIGkzODYgc3ZyNC4wLikgICovCi0gIGZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsg
KytpKQotICAgICooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0gIGRhdGEzID0gKGNo
YXIgKikgbWFsbG9jIChwYWdlc2l6ZSk7Ci0gIGlmICghZGF0YTMpCi0gICAgcmV0dXJuIDEyOwot
ICBpZiAocmVhZCAoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0gICAgcmV0dXJu
IDEzOwotICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLSAgICBpZiAoKihkYXRhICsg
aSkgIT0gKihkYXRhMyArIGkpKQotICAgICAgcmV0dXJuIDE0OwotICBjbG9zZSAoZmQpOworcmV0
dXJuIGV4dDJmc19vcGVuMiAoKTsKKyAgOwogICByZXR1cm4gMDsKIH0KIF9BQ0VPRgotaWYgYWNf
Zm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9t
YXBwZWQ9eWVzCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2
X2xpYl9leHQyZnNfZXh0MmZzX29wZW4yPXllcwogZWxzZQotICBhY19jdl9mdW5jX21tYXBfZml4
ZWRfbWFwcGVkPW5vCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24u
b3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAotICBjb25mdGVzdC4kYWNfb2JqZXh0IGNv
bmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAotZmkKLQorICBhY19jdl9saWJfZXh0MmZzX2V4
dDJmc19vcGVuMj1ubwogZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogcmVzdWx0OiAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgPiY1Ci0kYXNfZWNobyAi
JGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfZnVu
Y19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZF
X01NQVAgMSIgPj5jb25mZGVmcy5oCi0KK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0
LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitM
SUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQotcm0gLWYgY29uZnRlc3QubW1hcCBjb25m
dGVzdC50eHQKLQotZm9yIGFjX2hlYWRlciBpbiBzdGRsaWIuaAotZG8gOgotICBhY19mbl9jX2No
ZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAic3RkbGliLmgiICJhY19jdl9oZWFkZXJfc3Rk
bGliX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3N0
ZGxpYl9oIiA9IHgiInllczsgdGhlbiA6Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNk
ZWZpbmUgSEFWRV9TVERMSUJfSCAxCi1fQUNFT0YKLQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZXh0MmZzX2V4dDJmc19vcGVuMiIg
PiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9leHQyZnNfZXh0MmZzX29wZW4yIiA+JjY7IH0KK2lm
IHRlc3QgIngkYWNfY3ZfbGliX2V4dDJmc19leHQyZnNfb3BlbjIiID0geCIieWVzOyB0aGVuIDoK
KyAgbGliZXh0MmZzPSJ5IgorZWxzZQorICBsaWJleHQyZnM9Im4iCiBmaQogCi1kb25lCiAKLXsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEdOVSBs
aWJjIGNvbXBhdGlibGUgcmVhbGxvYyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgR05V
IGxpYmMgY29tcGF0aWJsZSByZWFsbG9jLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2Z1
bmNfcmVhbGxvY18wX25vbm51bGwrc2V0fSIgPSBzZXQ7IHRoZW4gOgoreyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ2NyeV9tZF9oYXNoX2J1ZmZl
ciBpbiAtbGdjcnlwdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2NyeV9tZF9oYXNo
X2J1ZmZlciBpbiAtbGdjcnlwdC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfZ2Ny
eXB0X2djcnlfbWRfaGFzaF9idWZmZXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19u
ICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHll
czsgdGhlbiA6Ci0gIGFjX2N2X2Z1bmNfcmVhbGxvY18wX25vbm51bGw9bm8KLWVsc2UKLSAgY2F0
IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorICBhY19jaGVja19saWJf
c2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGdjcnlwdCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAt
IDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaWYg
ZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBIQVZFX1NURExJQl9ICi0jIGluY2x1ZGUg
PHN0ZGxpYi5oPgotI2Vsc2UKLWNoYXIgKnJlYWxsb2MgKCk7Ci0jZW5kaWYKIAorLyogT3ZlcnJp
ZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2Ug
Y2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAg
IGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBs
eS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBnY3J5
X21kX2hhc2hfYnVmZmVyICgpOwogaW50CiBtYWluICgpCiB7Ci1yZXR1cm4gISByZWFsbG9jICgw
LCAwKTsKK3JldHVybiBnY3J5X21kX2hhc2hfYnVmZmVyICgpOwogICA7CiAgIHJldHVybiAwOwog
fQogX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3Zf
ZnVuY19yZWFsbG9jXzBfbm9ubnVsbD15ZXMKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8i
OyB0aGVuIDoKKyAgYWNfY3ZfbGliX2djcnlwdF9nY3J5X21kX2hhc2hfYnVmZmVyPXllcwogZWxz
ZQotICBhY19jdl9mdW5jX3JlYWxsb2NfMF9ub25udWxsPW5vCisgIGFjX2N2X2xpYl9nY3J5cHRf
Z2NyeV9tZF9oYXNoX2J1ZmZlcj1ubwogZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRl
c3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAgY29uZnRlc3QuJGFj
X29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRl
c3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25m
dGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQotCit7ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9nY3J5
cHRfZ2NyeV9tZF9oYXNoX2J1ZmZlciIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9nY3J5cHRf
Z2NyeV9tZF9oYXNoX2J1ZmZlciIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9nY3J5cHRf
Z2NyeV9tZF9oYXNoX2J1ZmZlciIgPSB4IiJ5ZXM7IHRoZW4gOgorICBsaWJnY3J5cHQ9InkiCitl
bHNlCisgIGxpYmdjcnlwdD0ibiIKIGZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfcmVhbGxvY18wX25vbm51bGwiID4mNQotJGFz
X2VjaG8gIiRhY19jdl9mdW5jX3JlYWxsb2NfMF9ub25udWxsIiA+JjY7IH0KLWlmIHRlc3QgJGFj
X2N2X2Z1bmNfcmVhbGxvY18wX25vbm51bGwgPSB5ZXM7IHRoZW4gOgogCi0kYXNfZWNobyAiI2Rl
ZmluZSBIQVZFX1JFQUxMT0MgMSIgPj5jb25mZGVmcy5oCiAKKworICAgIHsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHB0aHJlYWQgZmxhZyIgPiY1
CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgcHRocmVhZCBmbGFnLi4uICIgPiY2OyB9CitpZiB0
ZXN0ICIke2F4X2N2X3B0aHJlYWRfZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNo
b19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICAkYXNfZWNobyAiI2RlZmluZSBIQVZFX1JFQUxM
T0MgMCIgPj5jb25mZGVmcy5oCiAKLSAgIGNhc2UgIiAkTElCT0JKUyAiIGluCi0gICoiIHJlYWxs
b2MuJGFjX29iamV4dCAiKiApIDs7Ci0gICopIExJQk9CSlM9IiRMSUJPQkpTIHJlYWxsb2MuJGFj
X29iamV4dCIKLSA7OwotZXNhYworICAgICAgICBheF9jdl9wdGhyZWFkX2ZsYWdzPS1wdGhyZWFk
CisKKyAgICBQVEhSRUFEX0NGTEFHUz0iJGF4X2N2X3B0aHJlYWRfZmxhZ3MiCisgICAgUFRIUkVB
RF9MREZMQUdTPSIkYXhfY3ZfcHRocmVhZF9mbGFncyIKKyAgICBQVEhSRUFEX0xJQlM9IiIKKwor
CisgICAgc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgorCisgICAgc2F2ZWRfTERGTEFHUz0iJExERkxB
R1MiCisKKyAgICBzYXZlZF9MSUJTPSIkTElCUyIKKworCisgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQ
VEhSRUFEX0NGTEFHUyIKKworICAgIExERkxBR1M9IiRMREZMQUdTICRQVEhSRUFEX0xERkxBR1Mi
CisKKyAgICBMSUJTPSIkTElCUyAkUFRIUkVBRF9MSUJTIgorCisgICAgICAgIGNhdCBjb25mZGVm
cy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8K
KworI2luY2x1ZGUgPHB0aHJlYWQuaD4KK2ludCBtYWluKHZvaWQpIHsKKyAgcHRocmVhZF9hdGZv
cmsoMCwwLDApOworICBwdGhyZWFkX2NyZWF0ZSgwLDAsMCwwKTsKK30KKworX0FDRU9GCitpZiBh
Y19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgYXhfY3ZfcHRocmVh
ZF9mbGFncz1mYWlsZWQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNf
b2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCisgICAg
Q0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTIgorCisgICAgTERGTEFHUz0iJHNhdmVkX0xERkxBR1MiCiAK
KyAgICBMSUJTPSIkc2F2ZWRfTElCUyIKIAotJGFzX2VjaG8gIiNkZWZpbmUgcmVhbGxvYyBycGxf
cmVhbGxvYyIgPj5jb25mZGVmcy5oCiAKIGZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IHJlc3VsdDogJGF4X2N2X3B0aHJlYWRfZmxhZ3MiID4mNQorJGFzX2VjaG8g
IiRheF9jdl9wdGhyZWFkX2ZsYWdzIiA+JjY7IH0KKyAgICBpZiB0ZXN0ICJ4JGF4X2N2X3B0aHJl
YWRfZmxhZ3MiID0geGZhaWxlZDsgdGhlbgorICAgICAgICBhc19mbl9lcnJvciAkPyAiLXB0aHJl
YWQgZG9lcyBub3Qgd29yayIgIiRMSU5FTk8iIDUKKyAgICBmaQorCisgICAgUFRIUkVBRF9DRkxB
R1M9IiRheF9jdl9wdGhyZWFkX2ZsYWdzIgorICAgIFBUSFJFQURfTERGTEFHUz0iJGF4X2N2X3B0
aHJlYWRfZmxhZ3MiCisgICAgUFRIUkVBRF9MSUJTPSIiCisKIAogCi17ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIHN0cm5sZW4iID4m
NQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgc3Rybmxlbi4uLiAiID4mNjsgfQot
aWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cm5sZW5fd29ya2luZytzZXR9IiA9IHNldDsgdGhlbiA6
Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB5
YWpsX2FsbG9jIGluIC1seWFqbCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgeWFqbF9h
bGxvYyBpbiAtbHlhamwuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX3lhamxfeWFq
bF9hbGxvYytzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2
CiBlbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKLSAgYWNf
Y3ZfZnVuY19zdHJubGVuX3dvcmtpbmc9bm8KLWVsc2UKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9B
Q0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitM
SUJTPSItbHlhamwgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3Qu
JGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKKwor
LyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3Iu
CisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2Yg
YSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBz
dGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgor
Y2hhciB5YWpsX2FsbG9jICgpOwogaW50CiBtYWluICgpCiB7Ci0KLSNkZWZpbmUgUyAiZm9vYmFy
IgotI2RlZmluZSBTX0xFTiAoc2l6ZW9mIFMgLSAxKQotCi0gIC8qIEF0IGxlYXN0IG9uZSBpbXBs
ZW1lbnRhdGlvbiBpcyBidWdneTogdGhhdCBvZiBBSVggNC4zIHdvdWxkCi0gICAgIGdpdmUgc3Ry
bmxlbiAoUywgMSkgPT0gMy4gICovCi0KLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBTX0xF
TiArIDE7ICsraSkKLSAgICB7Ci0gICAgICBpbnQgZXhwZWN0ZWQgPSBpIDw9IFNfTEVOID8gaSA6
IFNfTEVOOwotICAgICAgaWYgKHN0cm5sZW4gKFMsIGkpICE9IGV4cGVjdGVkKQotCXJldHVybiAx
OwotICAgIH0KLSAgcmV0dXJuIDA7Ci0KK3JldHVybiB5YWpsX2FsbG9jICgpOwogICA7CiAgIHJl
dHVybiAwOwogfQogX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoK
LSAgYWNfY3ZfZnVuY19zdHJubGVuX3dvcmtpbmc9eWVzCitpZiBhY19mbl9jX3RyeV9saW5rICIk
TElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl95YWpsX3lhamxfYWxsb2M9eWVzCiBlbHNlCi0g
IGFjX2N2X2Z1bmNfc3Rybmxlbl93b3JraW5nPW5vCisgIGFjX2N2X2xpYl95YWpsX3lhamxfYWxs
b2M9bm8KIGZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIu
b3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCi0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3Qu
YmVhbSBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4k
YWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElC
Uz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp
bmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3lhamxfeWFqbF9hbGxvYyIgPiY1Cisk
YXNfZWNobyAiJGFjX2N2X2xpYl95YWpsX3lhamxfYWxsb2MiID4mNjsgfQoraWYgdGVzdCAieCRh
Y19jdl9saWJfeWFqbF95YWpsX2FsbG9jIiA9IHgiInllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZk
ZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MSUJZQUpMIDEKK19BQ0VPRgogCi1maQoteyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5j
X3N0cm5sZW5fd29ya2luZyIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X2Z1bmNfc3Rybmxlbl93b3Jr
aW5nIiA+JjY7IH0KLXRlc3QgJGFjX2N2X2Z1bmNfc3Rybmxlbl93b3JraW5nID0gbm8gJiYgY2Fz
ZSAiICRMSUJPQkpTICIgaW4KLSAgKiIgc3Rybmxlbi4kYWNfb2JqZXh0ICIqICkgOzsKLSAgKikg
TElCT0JKUz0iJExJQk9CSlMgc3Rybmxlbi4kYWNfb2JqZXh0IgotIDs7Ci1lc2FjCisgIExJQlM9
Ii1seWFqbCAkTElCUyIKIAorZWxzZQorICBhc19mbl9lcnJvciAkPyAiQ291bGQgbm90IGZpbmQg
eWFqbCIgIiRMSU5FTk8iIDUKK2ZpCiAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgc3RydG9kIiA+JjUKLSRhc19lY2hvX24gImNo
ZWNraW5nIGZvciB3b3JraW5nIHN0cnRvZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9m
dW5jX3N0cnRvZCtzZXR9IiA9IHNldDsgdGhlbiA6Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkZWZsYXRlQ29weSBpbiAtbHoiID4mNQorJGFz
X2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRlZmxhdGVDb3B5IGluIC1sei4uLiAiID4mNjsgfQoraWYg
dGVzdCAiJHthY19jdl9saWJfel9kZWZsYXRlQ29weStzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRh
c19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxp
bmciID0geWVzOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19zdHJ0b2Q9bm8KLWVsc2UKLSAgY2F0IGNv
bmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorICBhY19jaGVja19saWJfc2F2
ZV9MSUJTPSRMSUJTCitMSUJTPSItbHogICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VP
RiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwogCi0kYWNfaW5jbHVk
ZXNfZGVmYXVsdAotI2lmbmRlZiBzdHJ0b2QKLWRvdWJsZSBzdHJ0b2QgKCk7CisvKiBPdmVycmlk
ZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBj
aGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAg
YnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5
LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgogI2VuZGlmCitjaGFyIGRlZmxh
dGVDb3B5ICgpOwogaW50Ci1tYWluKCkKK21haW4gKCkKIHsKLSAgewotICAgIC8qIFNvbWUgdmVy
c2lvbnMgb2YgTGludXggc3RydG9kIG1pcy1wYXJzZSBzdHJpbmdzIHdpdGggbGVhZGluZyAnKycu
ICAqLwotICAgIGNoYXIgKnN0cmluZyA9ICIgKzY5IjsKLSAgICBjaGFyICp0ZXJtOwotICAgIGRv
dWJsZSB2YWx1ZTsKLSAgICB2YWx1ZSA9IHN0cnRvZCAoc3RyaW5nLCAmdGVybSk7Ci0gICAgaWYg
KHZhbHVlICE9IDY5IHx8IHRlcm0gIT0gKHN0cmluZyArIDQpKQotICAgICAgcmV0dXJuIDE7Ci0g
IH0KLQotICB7Ci0gICAgLyogVW5kZXIgU29sYXJpcyAyLjQsIHN0cnRvZCByZXR1cm5zIHRoZSB3
cm9uZyB2YWx1ZSBmb3IgdGhlCi0gICAgICAgdGVybWluYXRpbmcgY2hhcmFjdGVyIHVuZGVyIHNv
bWUgY29uZGl0aW9ucy4gICovCi0gICAgY2hhciAqc3RyaW5nID0gIk5hTiI7Ci0gICAgY2hhciAq
dGVybTsKLSAgICBzdHJ0b2QgKHN0cmluZywgJnRlcm0pOwotICAgIGlmICh0ZXJtICE9IHN0cmlu
ZyAmJiAqKHRlcm0gLSAxKSA9PSAwKQotICAgICAgcmV0dXJuIDE7Ci0gIH0KK3JldHVybiBkZWZs
YXRlQ29weSAoKTsKKyAgOwogICByZXR1cm4gMDsKIH0KLQogX0FDRU9GCi1pZiBhY19mbl9jX3Ry
eV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfY3ZfZnVuY19zdHJ0b2Q9eWVzCitpZiBhY19m
bl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl96X2RlZmxhdGVDb3B5
PXllcwogZWxzZQotICBhY19jdl9mdW5jX3N0cnRvZD1ubwotZmkKLXJtIC1mIGNvcmUgKi5jb3Jl
IGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKLSAg
Y29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKKyAgYWNf
Y3ZfbGliX3pfZGVmbGF0ZUNvcHk9bm8KIGZpCi0KK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNv
bmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNf
ZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQoteyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX3N0cnRvZCIgPiY1Ci0k
YXNfZWNobyAiJGFjX2N2X2Z1bmNfc3RydG9kIiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNf
c3RydG9kID0gbm87IHRoZW4KLSAgY2FzZSAiICRMSUJPQkpTICIgaW4KLSAgKiIgc3RydG9kLiRh
Y19vYmpleHQgIiogKSA7OwotICAqKSBMSUJPQkpTPSIkTElCT0JKUyBzdHJ0b2QuJGFjX29iamV4
dCIKLSA7OwotZXNhYworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBy
ZXN1bHQ6ICRhY19jdl9saWJfel9kZWZsYXRlQ29weSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xp
Yl96X2RlZmxhdGVDb3B5IiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3pfZGVmbGF0ZUNv
cHkiID0geCIieWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmlu
ZSBIQVZFX0xJQlogMQorX0FDRU9GCiAKLWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInBv
dyIgImFjX2N2X2Z1bmNfcG93IgotaWYgdGVzdCAieCRhY19jdl9mdW5jX3BvdyIgPSB4IiJ5ZXM7
IHRoZW4gOgorICBMSUJTPSItbHogJExJQlMiCiAKK2Vsc2UKKyAgYXNfZm5fZXJyb3IgJD8gIkNv
dWxkIG5vdCBmaW5kIHpsaWIiICIkTElORU5PIiA1CiBmaQogCi1pZiB0ZXN0ICRhY19jdl9mdW5j
X3BvdyA9IG5vOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogY2hlY2tpbmcgZm9yIHBvdyBpbiAtbG0iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9y
IHBvdyBpbiAtbG0uLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX21fcG93K3NldH0i
ID0gc2V0OyB0aGVuIDoKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
Y2hlY2tpbmcgZm9yIGxpYmljb252X29wZW4gaW4gLWxpY29udiIgPiY1CiskYXNfZWNob19uICJj
aGVja2luZyBmb3IgbGliaWNvbnZfb3BlbiBpbiAtbGljb252Li4uICIgPiY2OyB9CitpZiB0ZXN0
ICIke2FjX2N2X2xpYl9pY29udl9saWJpY29udl9vcGVuK3NldH0iID0gc2V0OyB0aGVuIDoKICAg
JGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKICAgYWNfY2hlY2tfbGliX3NhdmVfTElC
Uz0kTElCUwotTElCUz0iLWxtICAkTElCUyIKK0xJQlM9Ii1saWNvbnYgICRMSUJTIgogY2F0IGNv
bmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmgu
ICAqLwogCkBAIC05NTI4LDU1ICs2NTUzLDQ1IEBAIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0Yg
PmNvbmZ0ZXN0LiRhY19leHQKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIgogI2VuZGlm
Ci1jaGFyIHBvdyAoKTsKK2NoYXIgbGliaWNvbnZfb3BlbiAoKTsKIGludAogbWFpbiAoKQogewot
cmV0dXJuIHBvdyAoKTsKK3JldHVybiBsaWJpY29udl9vcGVuICgpOwogICA7CiAgIHJldHVybiAw
OwogfQogX0FDRU9GCiBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Ci0gIGFj
X2N2X2xpYl9tX3Bvdz15ZXMKKyAgYWNfY3ZfbGliX2ljb252X2xpYmljb252X29wZW49eWVzCiBl
bHNlCi0gIGFjX2N2X2xpYl9tX3Bvdz1ubworICBhY19jdl9saWJfaWNvbnZfbGliaWNvbnZfb3Bl
bj1ubwogZmkKIHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAog
ICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19s
aWJfc2F2ZV9MSUJTCiBmaQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiByZXN1bHQ6ICRhY19jdl9saWJfbV9wb3ciID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfbV9w
b3ciID4mNjsgfQotaWYgdGVzdCAieCRhY19jdl9saWJfbV9wb3ciID0geCIieWVzOyB0aGVuIDoK
LSAgUE9XX0xJQj0tbG0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiAkYWNfY3ZfbGliX2ljb252X2xpYmljb252X29wZW4iID4mNQorJGFzX2VjaG8gIiRh
Y19jdl9saWJfaWNvbnZfbGliaWNvbnZfb3BlbiIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xp
Yl9pY29udl9saWJpY29udl9vcGVuIiA9IHgiInllczsgdGhlbiA6CisgIGxpYmljb252PSJ5Igog
ZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6
IGNhbm5vdCBmaW5kIGxpYnJhcnkgY29udGFpbmluZyBkZWZpbml0aW9uIG9mIHBvdyIgPiY1Ci0k
YXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYW5ub3QgZmluZCBsaWJyYXJ5IGNvbnRhaW5pbmcg
ZGVmaW5pdGlvbiBvZiBwb3ciID4mMjt9Ci1maQotCisgIGxpYmljb252PSJuIgogZmkKIAotZmkK
IAotZm9yIGFjX2Z1bmMgaW4gIFwKLSAgICAgICAgICAgICAgICBhbGFybSBhdGV4aXQgYnplcm8g
Y2xvY2tfZ2V0dGltZSBkdXAyIGZkYXRhc3luYyBmdHJ1bmNhdGUgXAotICAgICAgICAgICAgICAg
IGdldGN3ZCBnZXRob3N0YnluYW1lIGdldGhvc3RuYW1lIGdldHBhZ2VzaXplIGdldHRpbWVvZmRh
eSBcCi0gICAgICAgICAgICAgICAgaW5ldF9udG9hIGlzYXNjaWkgbG9jYWx0aW1lX3IgbWVtY2hy
IG1lbW1vdmUgbWVtc2V0IG1rZGlyIFwKLSAgICAgICAgICAgICAgICBta2ZpZm8gbXVubWFwIHBh
dGhjb25mIHJlYWxwYXRoIHJlZ2NvbXAgcm1kaXIgc2VsZWN0IHNldGVudiBcCi0gICAgICAgICAg
ICAgICAgc29ja2V0IHN0cmNhc2VjbXAgc3RyY2hyIHN0cmNzcG4gc3RyZHVwIHN0cmVycm9yIHN0
cm5kdXAgXAotICAgICAgICAgICAgICAgIHN0cnBicmsgc3RycmNociBzdHJzcG4gc3Ryc3RyIHN0
cnRvbCBzdHJ0b3VsIHN0cnRvdWxsIHR6c2V0IFwKLSAgICAgICAgICAgICAgICB1bmFtZSBcCiAK
KyMgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCitmb3IgYWNfaGVhZGVyIGluIHlhamwveWFqbF92
ZXJzaW9uLmgKIGRvIDoKLSAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVu
YyIgfCAkYXNfdHJfc2hgCi1hY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIg
IiRhc19hY192YXIiCi1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsg
dGhlbiA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJ5YWpsL3lh
amxfdmVyc2lvbi5oIiAiYWNfY3ZfaGVhZGVyX3lhamxfeWFqbF92ZXJzaW9uX2giICIkYWNfaW5j
bHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3lhamxfeWFqbF92ZXJzaW9u
X2giID0geCIieWVzOyB0aGVuIDoKICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmlu
ZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorI2RlZmluZSBIQVZF
X1lBSkxfWUFKTF9WRVJTSU9OX0ggMQogX0FDRU9GCiAKIGZpCisKIGRvbmUKIAogCmRpZmYgLS1n
aXQgYS90b29scy9jb25maWd1cmUuYWMgYi90b29scy9jb25maWd1cmUuYWMKaW5kZXggNTdjODg3
ZC4uZGViODQ4ZCAxMDA2NDQKLS0tIGEvdG9vbHMvY29uZmlndXJlLmFjCisrKyBiL3Rvb2xzL2Nv
bmZpZ3VyZS5hYwpAQCAtMTksOSArMTksNiBAQCByZWNvbW1lbmRlZCwgdXNlIFBSRVBFTkRfSU5D
TFVERVMsIFBSRVBFTkRfTElCLCBcCiBBUFBFTkRfSU5DTFVERVMgYW5kIEFQUEVORF9MSUIgaW5z
dGVhZCB3aGVuIHBvc3NpYmxlLl0pCiBdKQogCi1BQ19VU0VfU1lTVEVNX0VYVEVOU0lPTlMKLUFD
X0NBTk9OSUNBTF9IT1NUCi0KICMgTTQgTWFjcm8gaW5jbHVkZXMKIG00X2luY2x1ZGUoW200L3Nh
dmV2YXIubTRdKQogbTRfaW5jbHVkZShbbTQvZmVhdHVyZXMubTRdKQpAQCAtNzUsOSArNzIsNyBA
QCBBQ19BUkdfVkFSKFtCQ0NdLCBbUGF0aCB0byBiY2MgdG9vbF0pCiBBQ19BUkdfVkFSKFtJQVNM
XSwgW1BhdGggdG8gaWFzbCB0b29sXSkKIAogIyBDaGVja3MgZm9yIHByb2dyYW1zLgotQUNfUFJP
R19TRUQKIEFDX1BST0dfQ0MKLUFDX1BST0dfTE5fUwogQUNfUFJPR19NQUtFX1NFVAogQUNfUFJP
R19JTlNUQUxMCiBBQ19QQVRIX1BST0coW0JJU09OXSwgW2Jpc29uXSkKQEAgLTEzNyw3ICsxMzIs
NiBAQCBBQ19TVUJTVChsaWJleHQyZnMpCiBBQ19DSEVDS19MSUIoW2djcnlwdF0sIFtnY3J5X21k
X2hhc2hfYnVmZmVyXSwgW2xpYmdjcnlwdD0ieSJdLCBbbGliZ2NyeXB0PSJuIl0pCiBBQ19TVUJT
VChsaWJnY3J5cHQpCiBBWF9DSEVDS19QVEhSRUFECi1BQ19DSEVDS19MSUIoW3J0XSwgW2Nsb2Nr
X2dldHRpbWVdKQogQUNfQ0hFQ0tfTElCKFt5YWpsXSwgW3lhamxfYWxsb2NdLCBbXSwKICAgICBb
QUNfTVNHX0VSUk9SKFtDb3VsZCBub3QgZmluZCB5YWpsXSldKQogQUNfQ0hFQ0tfTElCKFt6XSwg
W2RlZmxhdGVDb3B5XSwgW10sIFtBQ19NU0dfRVJST1IoW0NvdWxkIG5vdCBmaW5kIHpsaWJdKV0p
CkBAIC0xNDUsNTggKzEzOSw2IEBAIEFDX0NIRUNLX0xJQihbaWNvbnZdLCBbbGliaWNvbnZfb3Bl
bl0sIFtsaWJpY29udj0ieSJdLCBbbGliaWNvbnY9Im4iXSkKIEFDX1NVQlNUKGxpYmljb252KQog
CiAjIENoZWNrcyBmb3IgaGVhZGVyIGZpbGVzLgotQUNfRlVOQ19BTExPQ0EKLUFDX0NIRUNLX0hF
QURFUlMoWyBcCi0gICAgICAgICAgICAgICAgYXJwYS9pbmV0LmggZmNudGwuaCBpbnR0eXBlcy5o
IGxpYmludGwuaCBsaW1pdHMuaCBtYWxsb2MuaCBcCi0gICAgICAgICAgICAgICAgbmV0ZGIuaCBu
ZXRpbmV0L2luLmggc3RkZGVmLmggc3RkaW50Lmggc3RkbGliLmggc3RyaW5nLmggXAotICAgICAg
ICAgICAgICAgIHN0cmluZ3MuaCBzeXMvZmlsZS5oIHN5cy9pb2N0bC5oIHN5cy9tb3VudC5oIHN5
cy9wYXJhbS5oIFwKLSAgICAgICAgICAgICAgICBzeXMvc29ja2V0Lmggc3lzL3N0YXR2ZnMuaCBz
eXMvdGltZS5oIHN5c2xvZy5oIHRlcm1pb3MuaCBcCi0gICAgICAgICAgICAgICAgdW5pc3RkLmgg
eWFqbC95YWpsX3ZlcnNpb24uaCBcCi0gICAgICAgICAgICAgICAgXSkKLQotIyBDaGVja3MgZm9y
IHR5cGVkZWZzLCBzdHJ1Y3R1cmVzLCBhbmQgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzLgotQUNf
SEVBREVSX1NUREJPT0wKLUFDX1RZUEVfVUlEX1QKLUFDX0NfSU5MSU5FCi1BQ19UWVBFX0lOVDE2
X1QKLUFDX1RZUEVfSU5UMzJfVAotQUNfVFlQRV9JTlQ2NF9UCi1BQ19UWVBFX0lOVDhfVAotQUNf
VFlQRV9NT0RFX1QKLUFDX1RZUEVfT0ZGX1QKLUFDX1RZUEVfUElEX1QKLUFDX0NfUkVTVFJJQ1QK
LUFDX1RZUEVfU0laRV9UCi1BQ19UWVBFX1NTSVpFX1QKLUFDX0NIRUNLX01FTUJFUlMoW3N0cnVj
dCBzdGF0LnN0X2Jsa3NpemVdKQotQUNfU1RSVUNUX1NUX0JMT0NLUwotQUNfQ0hFQ0tfTUVNQkVS
Uyhbc3RydWN0IHN0YXQuc3RfcmRldl0pCi1BQ19UWVBFX1VJTlQxNl9UCi1BQ19UWVBFX1VJTlQz
Ml9UCi1BQ19UWVBFX1VJTlQ2NF9UCi1BQ19UWVBFX1VJTlQ4X1QKLUFDX0NIRUNLX1RZUEVTKFtw
dHJkaWZmX3RdKQotCi0jIENoZWNrcyBmb3IgbGlicmFyeSBmdW5jdGlvbnMuCi1BQ19GVU5DX0VS
Uk9SX0FUX0xJTkUKLUFDX0ZVTkNfRk9SSwotQUNfRlVOQ19GU0VFS08KLUFDX0ZVTkNfTFNUQVRf
Rk9MTE9XU19TTEFTSEVEX1NZTUxJTksKLUFDX0hFQURFUl9NQUpPUgotQUNfRlVOQ19NQUxMT0MK
LUFDX0ZVTkNfTUtUSU1FCi1BQ19GVU5DX01NQVAKLUFDX0ZVTkNfUkVBTExPQwotQUNfRlVOQ19T
VFJOTEVOCi1BQ19GVU5DX1NUUlRPRAotQUNfQ0hFQ0tfRlVOQ1MoWyBcCi0gICAgICAgICAgICAg
ICAgYWxhcm0gYXRleGl0IGJ6ZXJvIGNsb2NrX2dldHRpbWUgZHVwMiBmZGF0YXN5bmMgZnRydW5j
YXRlIFwKLSAgICAgICAgICAgICAgICBnZXRjd2QgZ2V0aG9zdGJ5bmFtZSBnZXRob3N0bmFtZSBn
ZXRwYWdlc2l6ZSBnZXR0aW1lb2ZkYXkgXAotICAgICAgICAgICAgICAgIGluZXRfbnRvYSBpc2Fz
Y2lpIGxvY2FsdGltZV9yIG1lbWNociBtZW1tb3ZlIG1lbXNldCBta2RpciBcCi0gICAgICAgICAg
ICAgICAgbWtmaWZvIG11bm1hcCBwYXRoY29uZiByZWFscGF0aCByZWdjb21wIHJtZGlyIHNlbGVj
dCBzZXRlbnYgXAotICAgICAgICAgICAgICAgIHNvY2tldCBzdHJjYXNlY21wIHN0cmNociBzdHJj
c3BuIHN0cmR1cCBzdHJlcnJvciBzdHJuZHVwIFwKLSAgICAgICAgICAgICAgICBzdHJwYnJrIHN0
cnJjaHIgc3Ryc3BuIHN0cnN0ciBzdHJ0b2wgc3RydG91bCBzdHJ0b3VsbCB0enNldCBcCi0gICAg
ICAgICAgICAgICAgdW5hbWUgXAotICAgICAgICAgICAgICAgIF0pCitBQ19DSEVDS19IRUFERVJT
KFt5YWpsL3lhamxfdmVyc2lvbi5oXSkKIAogQUNfT1VUUFVUKCkKLS0gCjEuNy4yLjUKCgpfX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFp
bGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW4ub3JnCmh0dHA6Ly9saXN0cy54ZW4ub3JnL3hl
bi1kZXZlbAo=

From xen-devel-bounces@lists.xen.org Wed Apr 25 16:07:29 2012
Return-path: <xen-devel-bounces@lists.xen.org>
Envelope-to: archives@lists.xen.org
Delivery-date: Wed, 25 Apr 2012 16:07:29 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xen.org>)
	id 1SN4kP-0003dJ-UD; Wed, 25 Apr 2012 16:07:17 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <Ian.Campbell@citrix.com>) id 1SN4kN-0003dD-4S
	for xen-devel@lists.xen.org; Wed, 25 Apr 2012 16:07:16 +0000
Received: from [193.109.254.147:47642] by server-1.bemta-14.messagelabs.com id
	89/18-29372-231289F4; Wed, 25 Apr 2012 16:07:14 +0000
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1335370033!3849349!1
X-Originating-IP: [62.200.22.115]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjIuMjAwLjIyLjExNSA9PiA5NjE4MA==\n
X-StarScan-Version: 6.5.7; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27297 invoked from network); 25 Apr 2012 16:07:13 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	25 Apr 2012 16:07:13 -0000
X-IronPort-AV: E=Sophos;i="4.75,481,1330905600"; d="scan'208";a="12137658"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Apr 2012 16:07:12 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.213.0;
	Wed, 25 Apr 2012 17:07:11 +0100
Message-ID: <1335370030.28015.52.camel@zakaz.uk.xensource.com>
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <ian.jackson@eu.citrix.com>
Date: Wed, 25 Apr 2012 17:07:10 +0100
In-Reply-To: <1335369353-13012-5-git-send-email-ian.jackson@eu.citrix.com>
References: <1335369353-13012-1-git-send-email-ian.jackson@eu.citrix.com>
	<1335369353-13012-5-git-send-email-ian.jackson@eu.citrix.com>
Organization: Citrix Systems, Inc.
X-Mailer: Evolution 3.2.2-1 
MIME-Version: 1.0
Cc: Roger Pau Monne <roger.pau@entel.upc.edu>,
	"xen-devel@lists.xen.org" <xen-devel@lists.xen.org>
Subject: Re: [Xen-devel] [PATCH 04/25] autoconf: trim the configure script;
 use autoheader
X-BeenThere: xen-devel@lists.xen.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xen.org>
List-Unsubscribe: <http://lists.xen.org/cgi-bin/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xen.org?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xen.org>
List-Help: <mailto:xen-devel-request@lists.xen.org?subject=help>
List-Subscribe: <http://lists.xen.org/cgi-bin/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xen.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: xen-devel-bounces@lists.xen.org
Errors-To: xen-devel-bounces@lists.xen.org

T24gV2VkLCAyMDEyLTA0LTI1IGF0IDE2OjU1ICswMTAwLCBJYW4gSmFja3NvbiB3cm90ZToKPiBS
ZW1vdmUgYSBsb3Qgb2YgdW5uZWNlc3NhcnkgdGVzdHMuICBTcGVjaWZpY2FsbHksIHdlIG5vIGxv
bmdlciB0ZXN0Cj4gZm9yIHN0YW5kYXJkIFBPU0lYIGZhY2lsaXRpZXMgd2hpY2ggd2UgZXhwZWN0
IHRvIGJlIHByb3ZpZGVkCj4gZXZlcnl3aGVyZSBhbmQgd2hpY2ggd2UgZG9uJ3QgaW4gYW55IGNh
c2UgaGF2ZSBhbnkgYWx0ZXJuYXRpdmUgZm9yLgo+IAo+IFN3aXRjaCB0byBnZW5lcmF0aW5nIGNv
bmZpZy5oLmluIHdpdGggYXV0b2hlYWRlci4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBJYW4gSmFja3Nv
biA8aWFuLmphY2tzb25AZXUuY2l0cml4LmNvbT4KPiBDYzogUm9nZXIgUGF1IE1vbm5lIDxyb2dl
ci5wYXVAZW50ZWwudXBjLmVkdT4KCkFja2VkLWJ5OiBJYW4gQ2FtcGJlbGwgPGlhbi5jYW1wYmVs
bEBjaXRyaXguY29tPgoKPiAKPiBDaGFuZ2VzIHNpbmNlIHY3Ogo+ICAqIFJlbW92ZWQgQVhfQ0hF
Q0tfUFRZRlVOQ1MgKHNudWNrIGluIGZyb20gcHJldmlvdXMgcGF0Y2gpCj4gLS0tCj4gIGF1dG9n
ZW4uc2ggICAgICAgICB8ICAgIDEgKwo+ICB0b29scy9jb25maWcuaC5pbiAgfCAgIDczICstCj4g
IHRvb2xzL2NvbmZpZ3VyZSAgICB8IDg4MjUgKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICB0b29scy9jb25maWd1cmUuYWMgfCAgIDYwICstCj4g
IDQgZmlsZXMgY2hhbmdlZCwgMjk4MSBpbnNlcnRpb25zKCspLCA1OTc4IGRlbGV0aW9ucygtKQo+
IAo+IGRpZmYgLS1naXQgYS9hdXRvZ2VuLnNoIGIvYXV0b2dlbi5zaAo+IGluZGV4IGMyODhiNzEu
LjU4YTcxY2UgMTAwNzU1Cj4gLS0tIGEvYXV0b2dlbi5zaAo+ICsrKyBiL2F1dG9nZW4uc2gKPiBA
QCAtMSwzICsxLDQgQEAKPiAgIyEvYmluL3NoIC1lCj4gIGNkIHRvb2xzCj4gIGF1dG9jb25mCj4g
K2F1dG9oZWFkZXIKPiBkaWZmIC0tZ2l0IGEvdG9vbHMvY29uZmlnLmguaW4gYi90b29scy9jb25m
aWcuaC5pbgo+IGluZGV4IGY4Zjk2ZGMuLjE3Yzg5MTMgMTAwNjQ0Cj4gLS0tIGEvdG9vbHMvY29u
ZmlnLmguaW4KPiArKysgYi90b29scy9jb25maWcuaC5pbgo+IEBAIC0xLDE5ICsxLDY0IEBACj4g
LS8qCj4gLSAqIENvcHlyaWdodCAoQykgMjAxMgo+IC0gKgo+IC0gKiBUaGlzIHByb2dyYW0gaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+IC0g
KiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBhcyBwdWJsaXNoZWQKPiAtICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg
dmVyc2lvbiAyLjEgb25seS4gd2l0aCB0aGUgc3BlY2lhbAo+IC0gKiBleGNlcHRpb24gb24gbGlu
a2luZyBkZXNjcmliZWQgaW4gZmlsZSBMSUNFTlNFLgo+IC0gKgo+IC0gKiBUaGlzIHByb2dyYW0g
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKPiAtICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKPiAtICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZQo+IC0gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KPiAtICovCj4gKy8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZy
b20gY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLwo+ICsKPiArLyogRGVmaW5lIHRvIDEg
aWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KPiArI3VuZGVmIEhB
VkVfSU5UVFlQRVNfSAo+ICsKPiArLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjcnlw
dG8nIGxpYnJhcnkgKC1sY3J5cHRvKS4gKi8KPiArI3VuZGVmIEhBVkVfTElCQ1JZUFRPCj4gKwo+
ICsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHlhamwnIGxpYnJhcnkgKC1seWFqbCku
ICovCj4gKyN1bmRlZiBIQVZFX0xJQllBSkwKPiArCj4gKy8qIERlZmluZSB0byAxIGlmIHlvdSBo
YXZlIHRoZSBgeicgbGlicmFyeSAoLWx6KS4gKi8KPiArI3VuZGVmIEhBVkVfTElCWgo+ICsKPiAr
LyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICov
Cj4gKyN1bmRlZiBIQVZFX01FTU9SWV9ICj4gKwo+ICsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2
ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KPiArI3VuZGVmIEhBVkVfU1RESU5UX0gK
PiArCj4gKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBm
aWxlLiAqLwo+ICsjdW5kZWYgSEFWRV9TVERMSUJfSAo+ICsKPiArLyogRGVmaW5lIHRvIDEgaWYg
eW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLwo+ICsjdW5kZWYgSEFWRV9T
VFJJTkdTX0gKPiArCj4gKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+
IGhlYWRlciBmaWxlLiAqLwo+ICsjdW5kZWYgSEFWRV9TVFJJTkdfSAo+ICsKPiArLyogRGVmaW5l
IHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KPiArI3Vu
ZGVmIEhBVkVfU1lTX1NUQVRfSAo+ICsKPiArLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhl
IDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCj4gKyN1bmRlZiBIQVZFX1NZU19UWVBFU19I
Cj4gKwo+ICsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIg
ZmlsZS4gKi8KPiArI3VuZGVmIEhBVkVfVU5JU1REX0gKPiAKPiAgLyogRGVmaW5lIHRvIDEgaWYg
eW91IGhhdmUgdGhlIDx5YWpsL3lhamxfdmVyc2lvbi5oPiBoZWFkZXIgZmlsZS4gKi8KPiAgI3Vu
ZGVmIEhBVkVfWUFKTF9ZQUpMX1ZFUlNJT05fSAo+IAo+IC0vKiBEZWZpbmUgY3Vyc2VzIGhlYWRl
ciB0byBpbmNsdWRlLiAqLwo+ICsvKiBEZWZpbmUgY3Vyc2VzIGhlYWRlciB0byB1c2UgKi8KPiAg
I3VuZGVmIElOQ0xVREVfQ1VSU0VTX0gKPiArCj4gKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3
aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLwo+ICsj
dW5kZWYgUEFDS0FHRV9CVUdSRVBPUlQKPiArCj4gKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1l
IG9mIHRoaXMgcGFja2FnZS4gKi8KPiArI3VuZGVmIFBBQ0tBR0VfTkFNRQo+ICsKPiArLyogRGVm
aW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwo+ICsj
dW5kZWYgUEFDS0FHRV9TVFJJTkcKPiArCj4gKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBz
aG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KPiArI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRQo+
ICsKPiArLyogRGVmaW5lIHRvIHRoZSBob21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS4gKi8KPiAr
I3VuZGVmIFBBQ0tBR0VfVVJMCj4gKwo+ICsvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhp
cyBwYWNrYWdlLiAqLwo+ICsjdW5kZWYgUEFDS0FHRV9WRVJTSU9OCj4gKwo+ICsvKiBEZWZpbmUg
dG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KPiArI3VuZGVmIFNU
RENfSEVBREVSUwo+IGRpZmYgLS1naXQgYS90b29scy9jb25maWd1cmUgYi90b29scy9jb25maWd1
cmUKPiBpbmRleCA4OTdlMDYxLi5kODkxOGZlIDEwMDc1NQo+IC0tLSBhL3Rvb2xzL2NvbmZpZ3Vy
ZQo+ICsrKyBiL3Rvb2xzL2NvbmZpZ3VyZQo+IEBAIC01OTUsMTIgKzU5NSw4IEBAIGFjX2luY2x1
ZGVzX2RlZmF1bHQ9IlwKPiAgIyBpbmNsdWRlIDx1bmlzdGQuaD4KPiAgI2VuZGlmIgo+IAo+IC1h
Y19oZWFkZXJfbGlzdD0KPiAtYWNfZnVuY19saXN0PQo+ICBhY19zdWJzdF92YXJzPSdMVExJQk9C
SlMKPiAtUE9XX0xJQgo+ICBMSUJPQkpTCj4gLUFMTE9DQQo+ICBsaWJpY29udgo+ICBQVEhSRUFE
X0xJQlMKPiAgUFRIUkVBRF9MREZMQUdTCj4gQEAgLTYxNiw2ICs2MTIsOSBAQCBQS0dfQ09ORklH
X0xJQkRJUgo+ICBQS0dfQ09ORklHX1BBVEgKPiAgUEtHX0NPTkZJRwo+ICBDVVJTRVNfTElCUwo+
ICtFR1JFUAo+ICtHUkVQCj4gK0NQUAo+ICBweWNvbmZpZwo+ICBQWVRIT05QQVRICj4gIE9DQU1M
QlVJTEQKPiBAQCAtNjM1LDggKzYzNCwxMyBAQCBJTlNUQUxMX0RBVEEKPiAgSU5TVEFMTF9TQ1JJ
UFQKPiAgSU5TVEFMTF9QUk9HUkFNCj4gIFNFVF9NQUtFCj4gLUxOX1MKPiAtU0VECj4gK09CSkVY
VAo+ICtFWEVFWFQKPiArYWNfY3RfQ0MKPiArQ1BQRkxBR1MKPiArTERGTEFHUwo+ICtDRkxBR1MK
PiArQ0MKPiAgSUFTTAo+ICBCQ0MKPiAgTEQ4Ngo+IEBAIC02NjUsMjQgKzY2OSw2IEBAIHhlbmFw
aQo+ICB2dHBtCj4gIG1vbml0b3JzCj4gIGdpdGh0dHAKPiAtaG9zdF9vcwo+IC1ob3N0X3ZlbmRv
cgo+IC1ob3N0X2NwdQo+IC1ob3N0Cj4gLWJ1aWxkX29zCj4gLWJ1aWxkX3ZlbmRvcgo+IC1idWls
ZF9jcHUKPiAtYnVpbGQKPiAtRUdSRVAKPiAtR1JFUAo+IC1DUFAKPiAtT0JKRVhUCj4gLUVYRUVY
VAo+IC1hY19jdF9DQwo+IC1DUFBGTEFHUwo+IC1MREZMQUdTCj4gLUNGTEFHUwo+IC1DQwo+ICB0
YXJnZXRfYWxpYXMKPiAgaG9zdF9hbGlhcwo+ICBidWlsZF9hbGlhcwo+IEBAIC03NDAsMTIgKzcy
Niw2IEBAIGVuYWJsZV9kZWJ1Zwo+ICAgICAgICBhY19wcmVjaW91c192YXJzPSdidWlsZF9hbGlh
cwo+ICBob3N0X2FsaWFzCj4gIHRhcmdldF9hbGlhcwo+IC1DQwo+IC1DRkxBR1MKPiAtTERGTEFH
Uwo+IC1MSUJTCj4gLUNQUEZMQUdTCj4gLUNQUAo+ICBQUkVQRU5EX0lOQ0xVREVTCj4gIFBSRVBF
TkRfTElCCj4gIEFQUEVORF9JTkNMVURFUwo+IEBAIC03NjIsNiArNzQyLDEyIEBAIEFTODYKPiAg
TEQ4Ngo+ICBCQ0MKPiAgSUFTTAo+ICtDQwo+ICtDRkxBR1MKPiArTERGTEFHUwo+ICtMSUJTCj4g
K0NQUEZMQUdTCj4gK0NQUAo+ICBQS0dfQ09ORklHCj4gIFBLR19DT05GSUdfUEFUSAo+ICBQS0df
Q09ORklHX0xJQkRJUgo+IEBAIC0xMzY1LDEwICsxMzUxLDYgQEAgRmluZSB0dW5pbmcgb2YgdGhl
IGluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKPiAgX0FDRU9GCj4gCj4gICAgY2F0IDw8XF9BQ0VP
Rgo+IC0KPiAtU3lzdGVtIHR5cGVzOgo+IC0gIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBm
b3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCj4gLSAgLS1ob3N0PUhPU1QgICAgICAgY3Jv
c3MtY29tcGlsZSB0byBidWlsZCBwcm9ncmFtcyB0byBydW4gb24gSE9TVCBbQlVJTERdCj4gIF9B
Q0VPRgo+ICBmaQo+IAo+IEBAIC0xMzk5LDE0ICsxMzgxLDYgQEAgT3B0aW9uYWwgRmVhdHVyZXM6
Cj4gICAgLS1kaXNhYmxlLWRlYnVnICAgICAgICAgRGlzYWJsZSBkZWJ1ZyBidWlsZCBvZiB0b29s
cyAoZGVmYXVsdCBpcyBFTkFCTEVEKQo+IAo+ICBTb21lIGluZmx1ZW50aWFsIGVudmlyb25tZW50
IHZhcmlhYmxlczoKPiAtICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKPiAtICBDRkxB
R1MgICAgICBDIGNvbXBpbGVyIGZsYWdzCj4gLSAgTERGTEFHUyAgICAgbGlua2VyIGZsYWdzLCBl
LmcuIC1MPGxpYiBkaXI+IGlmIHlvdSBoYXZlIGxpYnJhcmllcyBpbiBhCj4gLSAgICAgICAgICAg
ICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgo+IC0gIExJQlMgICAgICAgIGxpYnJh
cmllcyB0byBwYXNzIHRvIHRoZSBsaW5rZXIsIGUuZy4gLWw8bGlicmFyeT4KPiAtICBDUFBGTEFH
UyAgICAoT2JqZWN0aXZlKSBDL0MrKyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVk
ZSBkaXI+IGlmCj4gLSAgICAgICAgICAgICAgeW91IGhhdmUgaGVhZGVycyBpbiBhIG5vbnN0YW5k
YXJkIGRpcmVjdG9yeSA8aW5jbHVkZSBkaXI+Cj4gLSAgQ1BQICAgICAgICAgQyBwcmVwcm9jZXNz
b3IKPiAgICBQUkVQRU5EX0lOQ0xVREVTCj4gICAgICAgICAgICAgICAgTGlzdCBvZiBpbmNsdWRl
IGZvbGRlcnMgdG8gcHJlcGVuZCB0byBDRkxBR1MgKHdpdGhvdXQgLUkpCj4gICAgUFJFUEVORF9M
SUIgTGlzdCBvZiBsaWJyYXJ5IGZvbGRlcnMgdG8gcHJlcGVuZCB0byBMREZMQUdTICh3aXRob3V0
IC1MKQo+IEBAIC0xNDI1LDYgKzEzOTksMTQgQEAgU29tZSBpbmZsdWVudGlhbCBlbnZpcm9ubWVu
dCB2YXJpYWJsZXM6Cj4gICAgTEQ4NiAgICAgICAgUGF0aCB0byBsZDg2IHRvb2wKPiAgICBCQ0Mg
ICAgICAgICBQYXRoIHRvIGJjYyB0b29sCj4gICAgSUFTTCAgICAgICAgUGF0aCB0byBpYXNsIHRv
b2wKPiArICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKPiArICBDRkxBR1MgICAgICBD
IGNvbXBpbGVyIGZsYWdzCj4gKyAgTERGTEFHUyAgICAgbGlua2VyIGZsYWdzLCBlLmcuIC1MPGxp
YiBkaXI+IGlmIHlvdSBoYXZlIGxpYnJhcmllcyBpbiBhCj4gKyAgICAgICAgICAgICAgbm9uc3Rh
bmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgo+ICsgIExJQlMgICAgICAgIGxpYnJhcmllcyB0byBw
YXNzIHRvIHRoZSBsaW5rZXIsIGUuZy4gLWw8bGlicmFyeT4KPiArICBDUFBGTEFHUyAgICAoT2Jq
ZWN0aXZlKSBDL0MrKyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlm
Cj4gKyAgICAgICAgICAgICAgeW91IGhhdmUgaGVhZGVycyBpbiBhIG5vbnN0YW5kYXJkIGRpcmVj
dG9yeSA8aW5jbHVkZSBkaXI+Cj4gKyAgQ1BQICAgICAgICAgQyBwcmVwcm9jZXNzb3IKPiAgICBQ
S0dfQ09ORklHICBwYXRoIHRvIHBrZy1jb25maWcgdXRpbGl0eQo+ICAgIFBLR19DT05GSUdfUEFU
SAo+ICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzIHRvIGFkZCB0byBwa2ctY29uZmlnJ3Mgc2Vh
cmNoIHBhdGgKPiBAQCAtMTc5NywzMTEgKzE3NzksNiBAQCBmaQo+ICAgIGFzX2ZuX3NldF9zdGF0
dXMgJGFjX3JldHZhbAo+IAo+ICB9ICMgYWNfZm5fY190cnlfbGluawo+IC0KPiAtIyBhY19mbl9j
X2NoZWNrX2Z1bmMgTElORU5PIEZVTkMgVkFSCj4gLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQo+IC0jIFRlc3RzIHdoZXRoZXIgRlVOQyBleGlzdHMsIHNldHRpbmcgdGhlIGNh
Y2hlIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseQo+IC1hY19mbl9jX2NoZWNrX2Z1bmMgKCkKPiAt
ewo+IC0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGlu
ZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKPiAtICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1Cj4gLSRhc19lY2hvX24gImNoZWNr
aW5nIGZvciAkMi4uLiAiID4mNjsgfQo+IC1pZiBldmFsICJ0ZXN0IFwiXCR7JDMrc2V0fVwiIiA9
IHNldDsgdGhlbiA6Cj4gLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAtZWxzZQo+IC0g
IGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKPiAtLyogZW5kIGNv
bmZkZWZzLmguICAqLwo+IC0vKiBEZWZpbmUgJDIgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGlu
IGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkMi4KPiAtICAgRm9yIGV4YW1wbGUsIEhQLVVYIDEx
aSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCj4gLSNkZWZpbmUgJDIgaW5u
b2N1b3VzXyQyCj4gLQo+IC0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9z
IGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCj4gLSAgICB3aGljaCBjYW4gY29uZmxpY3Qg
d2l0aCBjaGFyICQyICgpOyBiZWxvdy4KPiAtICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3Nl
cnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKPiAtICAgIDxsaW1pdHMuaD4gZXhp
c3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCj4gLQo+IC0jaWZkZWYgX19T
VERDX18KPiAtIyBpbmNsdWRlIDxsaW1pdHMuaD4KPiAtI2Vsc2UKPiAtIyBpbmNsdWRlIDxhc3Nl
cnQuaD4KPiAtI2VuZGlmCj4gLQo+IC0jdW5kZWYgJDIKPiAtCj4gLS8qIE92ZXJyaWRlIGFueSBH
Q0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgo+IC0gICBVc2UgY2hhciBi
ZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKPiAtICAgYnVp
bHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAg
Ki8KPiAtI2lmZGVmIF9fY3BsdXNwbHVzCj4gLWV4dGVybiAiQyIKPiAtI2VuZGlmCj4gLWNoYXIg
JDIgKCk7Cj4gLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25z
IHdoaWNoIGl0IGltcGxlbWVudHMKPiAtICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAg
U29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCj4gLSAgICBzb21ldGhpbmcgc3RhcnRp
bmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KPiAtI2lmIGRl
ZmluZWQgX19zdHViXyQyIHx8IGRlZmluZWQgX19zdHViX19fJDIKPiAtY2hva2UgbWUKPiAtI2Vu
ZGlmCj4gLQo+IC1pbnQKPiAtbWFpbiAoKQo+IC17Cj4gLXJldHVybiAkMiAoKTsKPiAtICA7Cj4g
LSAgcmV0dXJuIDA7Cj4gLX0KPiAtX0FDRU9GCj4gLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5F
Tk8iOyB0aGVuIDoKPiAtICBldmFsICIkMz15ZXMiCj4gLWVsc2UKPiAtICBldmFsICIkMz1ubyIK
PiAtZmkKPiAtcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCj4g
LSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAo+IC1maQo+IC1ldmFsIGFj
X3Jlcz1cJCQzCj4gLSAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQo+IC0kYXNfZWNobyAiJGFjX3JlcyIgPiY2
OyB9Cj4gLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xpbmVub19zdGFjayIg
PSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KPiAtCj4gLX0gIyBhY19mbl9j
X2NoZWNrX2Z1bmMKPiAtCj4gLSMgYWNfZm5fY19jaGVja190eXBlIExJTkVOTyBUWVBFIFZBUiBJ
TkNMVURFUwo+IC0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
PiAtIyBUZXN0cyB3aGV0aGVyIFRZUEUgZXhpc3RzIGFmdGVyIGhhdmluZyBpbmNsdWRlZCBJTkNM
VURFUywgc2V0dGluZyBjYWNoZQo+IC0jIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS4KPiAtYWNf
Zm5fY19jaGVja190eXBlICgpCj4gLXsKPiAtICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0g
YXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCj4gLSAgeyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4m
NQo+IC0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KPiAtaWYgZXZhbCAi
dGVzdCBcIlwkeyQzK3NldH1cIiIgPSBzZXQ7IHRoZW4gOgo+IC0gICRhc19lY2hvX24gIihjYWNo
ZWQpICIgPiY2Cj4gLWVsc2UKPiAtICBldmFsICIkMz1ubyIKPiAtICBjYXQgY29uZmRlZnMuaCAt
IDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Cj4gLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KPiAt
JDQKPiAtaW50Cj4gLW1haW4gKCkKPiAtewo+IC1pZiAoc2l6ZW9mICgkMikpCj4gLSAgICAgICAg
cmV0dXJuIDA7Cj4gLSAgOwo+IC0gIHJldHVybiAwOwo+IC19Cj4gLV9BQ0VPRgo+IC1pZiBhY19m
bl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Cj4gLSAgY2F0IGNvbmZkZWZzLmggLSA8
PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAo+IC0vKiBlbmQgY29uZmRlZnMuaC4gICovCj4gLSQ0
Cj4gLWludAo+IC1tYWluICgpCj4gLXsKPiAtaWYgKHNpemVvZiAoKCQyKSkpCj4gLSAgICAgICAg
ICAgcmV0dXJuIDA7Cj4gLSAgOwo+IC0gIHJldHVybiAwOwo+IC19Cj4gLV9BQ0VPRgo+IC1pZiBh
Y19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Cj4gLQo+IC1lbHNlCj4gLSAgZXZh
bCAiJDM9eWVzIgo+IC1maQo+IC1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNf
b2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKPiAtZmkKPiAtcm0gLWYgY29yZSBjb25mdGVzdC5lcnIg
Y29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cj4gLWZpCj4gLWV2YWwgYWNfcmVz
PVwkJDMKPiAtICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Cj4gLSRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0K
PiAtICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHgg
JiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQo+IC0KPiAtfSAjIGFjX2ZuX2NfY2hl
Y2tfdHlwZQo+IC0KPiAtIyBhY19mbl9jX2ZpbmRfaW50WF90IExJTkVOTyBCSVRTIFZBUgo+IC0j
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gLSMgRmluZHMgYSBzaWduZWQg
aW50ZWdlciB0eXBlIHdpdGggd2lkdGggQklUUywgc2V0dGluZyBjYWNoZSB2YXJpYWJsZSBWQVIK
PiAtIyBhY2NvcmRpbmdseS4KPiAtYWNfZm5fY19maW5kX2ludFhfdCAoKQo+IC17Cj4gLSAgYXNf
bGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9
JGFzX2xpbmVub19zdGFjawo+IC0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogY2hlY2tpbmcgZm9yIGludCQyX3QiID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyBm
b3IgaW50JDJfdC4uLiAiID4mNjsgfQo+IC1pZiBldmFsICJ0ZXN0IFwiXCR7JDMrc2V0fVwiIiA9
IHNldDsgdGhlbiA6Cj4gLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAtZWxzZQo+IC0g
IGV2YWwgIiQzPW5vIgo+IC0gICAgICMgT3JkZXIgaXMgaW1wb3J0YW50IC0gbmV2ZXIgY2hlY2sg
YSB0eXBlIHRoYXQgaXMgcG90ZW50aWFsbHkgc21hbGxlcgo+IC0gICAgICMgdGhhbiBoYWxmIG9m
IHRoZSBleHBlY3RlZCB0YXJnZXQgd2lkdGguCj4gLSAgICAgZm9yIGFjX3R5cGUgaW4gaW50JDJf
dCAnaW50JyAnbG9uZyBpbnQnIFwKPiAtICAgICAgICAnbG9uZyBsb25nIGludCcgJ3Nob3J0IGlu
dCcgJ3NpZ25lZCBjaGFyJzsgZG8KPiAtICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0Yg
PmNvbmZ0ZXN0LiRhY19leHQKPiAtLyogZW5kIGNvbmZkZWZzLmguICAqLwo+IC0kYWNfaW5jbHVk
ZXNfZGVmYXVsdAo+IC0gICAgICAgICAgICBlbnVtIHsgTiA9ICQyIC8gMiAtIDEgfTsKPiAtaW50
Cj4gLW1haW4gKCkKPiAtewo+IC1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgwIDwg
KCRhY190eXBlKSAoKCgoKCRhY190eXBlKSAxIDw8IE4pIDw8IE4pIC0gMSkgKiAyICsgMSkpXTsK
PiAtdGVzdF9hcnJheSBbMF0gPSAwCj4gLQo+IC0gIDsKPiAtICByZXR1cm4gMDsKPiAtfQo+IC1f
QUNFT0YKPiAtaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgo+IC0gIGNh
dCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKPiAtLyogZW5kIGNvbmZk
ZWZzLmguICAqLwo+IC0kYWNfaW5jbHVkZXNfZGVmYXVsdAo+IC0gICAgICAgICAgICAgICBlbnVt
IHsgTiA9ICQyIC8gMiAtIDEgfTsKPiAtaW50Cj4gLW1haW4gKCkKPiAtewo+IC1zdGF0aWMgaW50
IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJGFjX3R5cGUpICgoKCgoJGFjX3R5cGUpIDEgPDwgTikg
PDwgTikgLSAxKSAqIDIgKyAxKQo+IC0gICAgICAgICAgICAgICAgPCAoJGFjX3R5cGUpICgoKCgo
JGFjX3R5cGUpIDEgPDwgTikgPDwgTikgLSAxKSAqIDIgKyAyKSldOwo+IC10ZXN0X2FycmF5IFsw
XSA9IDAKPiAtCj4gLSAgOwo+IC0gIHJldHVybiAwOwo+IC19Cj4gLV9BQ0VPRgo+IC1pZiBhY19m
bl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Cj4gLQo+IC1lbHNlCj4gLSAgY2FzZSAk
YWNfdHlwZSBpbiAjKAo+IC0gIGludCQyX3QpIDoKPiAtICAgIGV2YWwgIiQzPXllcyIgOzsgIygK
PiAtICAqKSA6Cj4gLSAgICBldmFsICIkMz1cJGFjX3R5cGUiIDs7Cj4gLWVzYWMKPiAtZmkKPiAt
cm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNf
ZXh0Cj4gLWZpCj4gLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQg
Y29uZnRlc3QuJGFjX2V4dAo+IC0gICAgICAgaWYgZXZhbCB0ZXN0IFwieFwkIiQzIlwiID0geCJu
byI7IHRoZW4gOgo+IC0KPiAtZWxzZQo+IC0gIGJyZWFrCj4gLWZpCj4gLSAgICAgZG9uZQo+IC1m
aQo+IC1ldmFsIGFjX3Jlcz1cJCQzCj4gLSAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQo+IC0kYXNfZWNobyAi
JGFjX3JlcyIgPiY2OyB9Cj4gLSAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xp
bmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KPiAtCj4g
LX0gIyBhY19mbl9jX2ZpbmRfaW50WF90Cj4gLQo+IC0jIGFjX2ZuX2NfY2hlY2tfbWVtYmVyIExJ
TkVOTyBBR0dSIE1FTUJFUiBWQVIgSU5DTFVERVMKPiAtIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gLSMgVHJpZXMgdG8gZmluZCBpZiB0aGUg
ZmllbGQgTUVNQkVSIGV4aXN0cyBpbiB0eXBlIEFHR1IsIGFmdGVyIGluY2x1ZGluZwo+IC0jIElO
Q0xVREVTLCBzZXR0aW5nIGNhY2hlIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS4KPiAtYWNfZm5f
Y19jaGVja19tZW1iZXIgKCkKPiAtewo+IC0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBh
c19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKPiAtICB7ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMi4kMyIg
PiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4kMy4uLiAiID4mNjsgfQo+IC1pZiBl
dmFsICJ0ZXN0IFwiXCR7JDQrc2V0fVwiIiA9IHNldDsgdGhlbiA6Cj4gLSAgJGFzX2VjaG9fbiAi
KGNhY2hlZCkgIiA+JjYKPiAtZWxzZQo+IC0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNv
bmZ0ZXN0LiRhY19leHQKPiAtLyogZW5kIGNvbmZkZWZzLmguICAqLwo+IC0kNQo+IC1pbnQKPiAt
bWFpbiAoKQo+IC17Cj4gLXN0YXRpYyAkMiBhY19hZ2dyOwo+IC1pZiAoYWNfYWdnci4kMykKPiAt
cmV0dXJuIDA7Cj4gLSAgOwo+IC0gIHJldHVybiAwOwo+IC19Cj4gLV9BQ0VPRgo+IC1pZiBhY19m
bl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Cj4gLSAgZXZhbCAiJDQ9eWVzIgo+IC1l
bHNlCj4gLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAo+IC0v
KiBlbmQgY29uZmRlZnMuaC4gICovCj4gLSQ1Cj4gLWludAo+IC1tYWluICgpCj4gLXsKPiAtc3Rh
dGljICQyIGFjX2FnZ3I7Cj4gLWlmIChzaXplb2YgYWNfYWdnci4kMykKPiAtcmV0dXJuIDA7Cj4g
LSAgOwo+IC0gIHJldHVybiAwOwo+IC19Cj4gLV9BQ0VPRgo+IC1pZiBhY19mbl9jX3RyeV9jb21w
aWxlICIkTElORU5PIjsgdGhlbiA6Cj4gLSAgZXZhbCAiJDQ9eWVzIgo+IC1lbHNlCj4gLSAgZXZh
bCAiJDQ9bm8iCj4gLWZpCj4gLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19v
YmpleHQgY29uZnRlc3QuJGFjX2V4dAo+IC1maQo+IC1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBj
b25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKPiAtZmkKPiAtZXZhbCBhY19yZXM9
XCQkNAo+IC0gICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKPiAtJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQo+
IC0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAm
JiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9Cj4gLQo+IC19ICMgYWNfZm5fY19jaGVj
a19tZW1iZXIKPiAtCj4gLSMgYWNfZm5fY19maW5kX3VpbnRYX3QgTElORU5PIEJJVFMgVkFSCj4g
LSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gLSMgRmluZHMgYW4gdW5z
aWduZWQgaW50ZWdlciB0eXBlIHdpdGggd2lkdGggQklUUywgc2V0dGluZyBjYWNoZSB2YXJpYWJs
ZSBWQVIKPiAtIyBhY2NvcmRpbmdseS4KPiAtYWNfZm5fY19maW5kX3VpbnRYX3QgKCkKPiAtewo+
IC0gIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5v
X3N0YWNrPSRhc19saW5lbm9fc3RhY2sKPiAtICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1aW50JDJfdCIgPiY1Cj4gLSRhc19lY2hvX24gImNo
ZWNraW5nIGZvciB1aW50JDJfdC4uLiAiID4mNjsgfQo+IC1pZiBldmFsICJ0ZXN0IFwiXCR7JDMr
c2V0fVwiIiA9IHNldDsgdGhlbiA6Cj4gLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAt
ZWxzZQo+IC0gIGV2YWwgIiQzPW5vIgo+IC0gICAgICMgT3JkZXIgaXMgaW1wb3J0YW50IC0gbmV2
ZXIgY2hlY2sgYSB0eXBlIHRoYXQgaXMgcG90ZW50aWFsbHkgc21hbGxlcgo+IC0gICAgICMgdGhh
biBoYWxmIG9mIHRoZSBleHBlY3RlZCB0YXJnZXQgd2lkdGguCj4gLSAgICAgZm9yIGFjX3R5cGUg
aW4gdWludCQyX3QgJ3Vuc2lnbmVkIGludCcgJ3Vuc2lnbmVkIGxvbmcgaW50JyBcCj4gLSAgICAg
ICAgJ3Vuc2lnbmVkIGxvbmcgbG9uZyBpbnQnICd1bnNpZ25lZCBzaG9ydCBpbnQnICd1bnNpZ25l
ZCBjaGFyJzsgZG8KPiAtICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0
LiRhY19leHQKPiAtLyogZW5kIGNvbmZkZWZzLmguICAqLwo+IC0kYWNfaW5jbHVkZXNfZGVmYXVs
dAo+IC1pbnQKPiAtbWFpbiAoKQo+IC17Cj4gLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIg
KiAhKCgoJGFjX3R5cGUpIC0xID4+ICgkMiAvIDIgLSAxKSkgPj4gKCQyIC8gMiAtIDEpID09IDMp
XTsKPiAtdGVzdF9hcnJheSBbMF0gPSAwCj4gLQo+IC0gIDsKPiAtICByZXR1cm4gMDsKPiAtfQo+
IC1fQUNFT0YKPiAtaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgo+IC0g
IGNhc2UgJGFjX3R5cGUgaW4gIygKPiAtICB1aW50JDJfdCkgOgo+IC0gICAgZXZhbCAiJDM9eWVz
IiA7OyAjKAo+IC0gICopIDoKPiAtICAgIGV2YWwgIiQzPVwkYWNfdHlwZSIgOzsKPiAtZXNhYwo+
IC1maQo+IC1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0
ZXN0LiRhY19leHQKPiAtICAgICAgIGlmIGV2YWwgdGVzdCBcInhcJCIkMyJcIiA9IHgibm8iOyB0
aGVuIDoKPiAtCj4gLWVsc2UKPiAtICBicmVhawo+IC1maQo+IC0gICAgIGRvbmUKPiAtZmkKPiAt
ZXZhbCBhY19yZXM9XCQkMwo+IC0gICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKPiAtJGFzX2VjaG8gIiRhY19y
ZXMiID4mNjsgfQo+IC0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9f
c3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9Cj4gLQo+IC19ICMg
YWNfZm5fY19maW5kX3VpbnRYX3QKPiAgY2F0ID5jb25maWcubG9nIDw8X0FDRU9GCj4gIFRoaXMg
ZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCj4g
IHJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBh
IG1pc3Rha2UuCj4gQEAgLTIzODYsMTEgKzIwNjMsNiBAQCAkYXNfZWNobyAiJGFzX21lOiBjcmVh
dGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KPiAgICA+JGNhY2hlX2ZpbGUKPiAgZmkKPiAK
PiAtYXNfZm5fYXBwZW5kIGFjX2hlYWRlcl9saXN0ICIgc3lzL3RpbWUuaCIKPiAtYXNfZm5fYXBw
ZW5kIGFjX2hlYWRlcl9saXN0ICIgdW5pc3RkLmgiCj4gLWFzX2ZuX2FwcGVuZCBhY19mdW5jX2xp
c3QgIiBhbGFybSIKPiAtYXNfZm5fYXBwZW5kIGFjX2hlYWRlcl9saXN0ICIgc3RkbGliLmgiCj4g
LWFzX2ZuX2FwcGVuZCBhY19oZWFkZXJfbGlzdCAiIHN5cy9wYXJhbS5oIgo+ICAjIENoZWNrIHRo
YXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRo
ZSBzYW1lCj4gICMgdmFsdWUuCj4gIGFjX2NhY2hlX2NvcnJ1cHRlZD1mYWxzZQo+IEBAIC0yNTA4
LDE3MzAgKzIxODAsNDAgQEAgQVBQRU5EX0lOQ0xVREVTIGFuZCBBUFBFTkRfTElCIGluc3RlYWQg
d2hlbiBwb3NzaWJsZS4iID4mMjt9Cj4gCj4gIGZpCj4gCj4gLWFjX2V4dD1jCj4gLWFjX2NwcD0n
JENQUCAkQ1BQRkxBR1MnCj4gLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBj
b25mdGVzdC4kYWNfZXh0ID4mNScKPiAtYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4
dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScK
PiAtYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQo+IC1pZiB0ZXN0IC1uICIk
YWNfdG9vbF9wcmVmaXgiOyB0aGVuCj4gLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIk
e2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFy
Z3MuCj4gLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWdjYzsgYWNfd29yZD0kMgo+IC17ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29y
ZCIgPiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQo+
IC1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+IC0gICRhc19l
Y2hvX24gIihjYWNoZWQpICIgPiY2Cj4gLWVsc2UKPiAtICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVu
Cj4gLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVz
dC4KPiAtZWxzZQo+IC1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCj4gLWZv
ciBhc19kaXIgaW4gJFBBVEgKPiAtZG8KPiAtICBJRlM9JGFzX3NhdmVfSUZTCj4gLSAgdGVzdCAt
eiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KPiAtICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNf
ZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwo+IC0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNf
d29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVj
X2V4dCI7IH07IHRoZW4KPiAtICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Z2Nj
Igo+IC0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFz
X2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Cj4gLSAgICBicmVhayAyCj4gLSAgZmkKPiAt
ZG9uZQo+IC0gIGRvbmUKPiAtSUZTPSRhc19zYXZlX0lGUwo+IC0KPiAtZmkKPiAtZmkKPiAtQ0M9
JGFjX2N2X3Byb2dfQ0MKPiAtaWYgdGVzdCAtbiAiJENDIjsgdGhlbgo+IC0gIHsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQo+IC0kYXNfZWNo
byAiJENDIiA+JjY7IH0KPiAtZWxzZQo+IC0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Cj4gLSRhc19lY2hvICJubyIgPiY2OyB9Cj4gLWZp
Cj4gLQo+IC0KPiAtZmkKPiAtaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCj4gLSAg
YWNfY3RfQ0M9JENDCj4gLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBp
dCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgo+IC1zZXQgZHVtbXkgZ2NjOyBhY193
b3JkPSQyCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tp
bmcgZm9yICRhY193b3JkIiA+JjUKPiAtJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3Jk
Li4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNl
dDsgdGhlbiA6Cj4gLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAtZWxzZQo+IC0gIGlm
IHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KPiAtICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNf
Y3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0Lgo+IC1lbHNlCj4gLWFzX3Nh
dmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKPiAtZm9yIGFzX2RpciBpbiAkUEFUSAo+
IC1kbwo+IC0gIElGUz0kYXNfc2F2ZV9JRlMKPiAtICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19k
aXI9Lgo+IC0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lv
bnM7IGRvCj4gLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAm
JiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+IC0g
ICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgo+IC0gICAgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1
Cj4gLSAgICBicmVhayAyCj4gLSAgZmkKPiAtZG9uZQo+IC0gIGRvbmUKPiAtSUZTPSRhc19zYXZl
X0lGUwo+IC0KPiAtZmkKPiAtZmkKPiAtYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKPiAt
aWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgo+IC0gIHsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQo+IC0kYXNfZWNobyAiJGFj
X2N0X0NDIiA+JjY7IH0KPiAtZWxzZQo+IC0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Cj4gLSRhc19lY2hvICJubyIgPiY2OyB9Cj4gLWZp
Cj4gLQo+IC0gIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgo+IC0gICAgQ0M9IiIKPiAt
ICBlbHNlCj4gLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCj4g
LXllczopCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklO
RzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUK
PiAtJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZp
eGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQo+IC1hY190b29sX3dhcm5lZD15ZXMgOzsKPiAt
ZXNhYwo+IC0gICAgQ0M9JGFjX2N0X0NDCj4gLSAgZmkKPiAtZWxzZQo+IC0gIENDPSIkYWNfY3Zf
cHJvZ19DQyIKPiAtZmkKPiAtCj4gLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KPiAtICAgICAgICAg
IGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KPiAtICAgICMgRXh0cmFjdCB0aGUg
Zmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1jYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dy
YW0gbmFtZSB3aXRoIGFyZ3MuCj4gLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193
b3JkPSQyCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tp
bmcgZm9yICRhY193b3JkIiA+JjUKPiAtJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3Jk
Li4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhl
biA6Cj4gLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAtZWxzZQo+IC0gIGlmIHRlc3Qg
LW4gIiRDQyI7IHRoZW4KPiAtICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92
ZXJyaWRlIHRoZSB0ZXN0Lgo+IC1lbHNlCj4gLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9T
RVBBUkFUT1IKPiAtZm9yIGFzX2RpciBpbiAkUEFUSAo+IC1kbwo+IC0gIElGUz0kYXNfc2F2ZV9J
RlMKPiAtICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+IC0gICAgZm9yIGFjX2V4ZWNf
ZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gLSAgaWYgeyB0ZXN0IC1m
ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRh
Y193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+IC0gICAgYWNfY3ZfcHJvZ19DQz0iJHthY190
b29sX3ByZWZpeH1jYyIKPiAtICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQo+IC0gICAgYnJlYWsg
Mgo+IC0gIGZpCj4gLWRvbmUKPiAtICBkb25lCj4gLUlGUz0kYXNfc2F2ZV9JRlMKPiAtCj4gLWZp
Cj4gLWZpCj4gLUNDPSRhY19jdl9wcm9nX0NDCj4gLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KPiAt
ICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+
JjUKPiAtJGFzX2VjaG8gIiRDQyIgPiY2OyB9Cj4gLWVsc2UKPiAtICB7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQo+IC0kYXNfZWNobyAibm8i
ID4mNjsgfQo+IC1maQo+IC0KPiAtCj4gLSAgZmkKPiAtZmkKPiAtaWYgdGVzdCAteiAiJENDIjsg
dGhlbgo+IC0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUg
YSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgo+IC1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKPiAt
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFj
X3dvcmQiID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7
IH0KPiAtaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuIDoKPiAtICAk
YXNfZWNob19uICIoY2FjaGVkKSAiID4mNgo+IC1lbHNlCj4gLSAgaWYgdGVzdCAtbiAiJENDIjsg
dGhlbgo+IC0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhl
IHRlc3QuCj4gLWVsc2UKPiAtICBhY19wcm9nX3JlamVjdGVkPW5vCj4gLWFzX3NhdmVfSUZTPSRJ
RlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKPiAtZm9yIGFzX2RpciBpbiAkUEFUSAo+IC1kbwo+IC0g
IElGUz0kYXNfc2F2ZV9JRlMKPiAtICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+IC0g
ICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4g
LSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVz
dF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+IC0gICAgaWYgdGVz
dCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCj4g
LSAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwo+IC0gICAgICAgY29udGludWUKPiAtICAgICBm
aQo+IC0gICAgYWNfY3ZfcHJvZ19DQz0iY2MiCj4gLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUK
PiAtICAgIGJyZWFrIDIKPiAtICBmaQo+IC1kb25lCj4gLSAgZG9uZQo+IC1JRlM9JGFzX3NhdmVf
SUZTCj4gLQo+IC1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCj4gLSAgIyBX
ZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0
Lgo+IC0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwo+IC0gIHNoaWZ0Cj4gLSAgaWYgdGVzdCAk
IyAhPSAwOyB0aGVuCj4gLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20g
dGhlIGJvZ3VzIG9uZS4KPiAtICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1l
LCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KPiAtICAgICMgZmlyc3QgaWYgd2Ugc2V0IEND
IHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgo+IC0gICAgc2hp
ZnQKPiAtICAgIGFjX2N2X3Byb2dfQ0M9IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRAIgo+IC0g
IGZpCj4gLWZpCj4gLWZpCj4gLWZpCj4gLUNDPSRhY19jdl9wcm9nX0NDCj4gLWlmIHRlc3QgLW4g
IiRDQyI7IHRoZW4KPiAtICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IHJlc3VsdDogJENDIiA+JjUKPiAtJGFzX2VjaG8gIiRDQyIgPiY2OyB9Cj4gLWVsc2UKPiAtICB7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQo+
IC0kYXNfZWNobyAibm8iID4mNjsgfQo+IC1maQo+IC0KPiAtCj4gLWZpCj4gLWlmIHRlc3QgLXog
IiRDQyI7IHRoZW4KPiAtICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCj4gLSAg
Zm9yIGFjX3Byb2cgaW4gY2wuZXhlCj4gLSAgZG8KPiAtICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qg
d29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFt
IG5hbWUgd2l0aCBhcmdzLgo+IC1zZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFj
X3dvcmQ9JDIKPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVj
a2luZyBmb3IgJGFjX3dvcmQiID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dv
cmQuLi4gIiA+JjY7IH0KPiAtaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0
aGVuIDoKPiAtICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgo+IC1lbHNlCj4gLSAgaWYgdGVz
dCAtbiAiJENDIjsgdGhlbgo+IC0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIg
b3ZlcnJpZGUgdGhlIHRlc3QuCj4gLWVsc2UKPiAtYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRI
X1NFUEFSQVRPUgo+IC1mb3IgYXNfZGlyIGluICRQQVRICj4gLWRvCj4gLSAgSUZTPSRhc19zYXZl
X0lGUwo+IC0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCj4gLSAgICBmb3IgYWNfZXhl
Y19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KPiAtICBpZiB7IHRlc3Qg
LWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIv
JGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCj4gLSAgICBhY19jdl9wcm9nX0NDPSIkYWNf
dG9vbF9wcmVmaXgkYWNfcHJvZyIKPiAtICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQo+IC0gICAg
YnJlYWsgMgo+IC0gIGZpCj4gLWRvbmUKPiAtICBkb25lCj4gLUlGUz0kYXNfc2F2ZV9JRlMKPiAt
Cj4gLWZpCj4gLWZpCj4gLUNDPSRhY19jdl9wcm9nX0NDCj4gLWlmIHRlc3QgLW4gIiRDQyI7IHRo
ZW4KPiAtICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDog
JENDIiA+JjUKPiAtJGFzX2VjaG8gIiRDQyIgPiY2OyB9Cj4gLWVsc2UKPiAtICB7ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQo+IC0kYXNfZWNo
byAibm8iID4mNjsgfQo+IC1maQo+IC0KPiAtCj4gLSAgICB0ZXN0IC1uICIkQ0MiICYmIGJyZWFr
Cj4gLSAgZG9uZQo+IC1maQo+IC1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCj4gLSAgYWNfY3RfQ0M9
JENDCj4gLSAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCj4gLWRvCj4gLSAgIyBFeHRyYWN0IHRoZSBm
aXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRo
IGFyZ3MuCj4gLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgo+IC17ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cj4g
LSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0
ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+IC0gICRhc19lY2hv
X24gIihjYWNoZWQpICIgPiY2Cj4gLWVsc2UKPiAtICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0
aGVuCj4gLSAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBv
dmVycmlkZSB0aGUgdGVzdC4KPiAtZWxzZQo+IC1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhf
U0VQQVJBVE9SCj4gLWZvciBhc19kaXIgaW4gJFBBVEgKPiAtZG8KPiAtICBJRlM9JGFzX3NhdmVf
SUZTCj4gLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KPiAtICAgIGZvciBhY19leGVj
X2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwo+IC0gIGlmIHsgdGVzdCAt
ZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8k
YWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KPiAtICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9
IiRhY19wcm9nIgo+IC0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
Zm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Cj4gLSAgICBicmVhayAyCj4g
LSAgZmkKPiAtZG9uZQo+IC0gIGRvbmUKPiAtSUZTPSRhc19zYXZlX0lGUwo+IC0KPiAtZmkKPiAt
ZmkKPiAtYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKPiAtaWYgdGVzdCAtbiAiJGFjX2N0
X0NDIjsgdGhlbgo+IC0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiAkYWNfY3RfQ0MiID4mNQo+IC0kYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KPiAt
ZWxzZQo+IC0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0
OiBubyIgPiY1Cj4gLSRhc19lY2hvICJubyIgPiY2OyB9Cj4gLWZpCj4gLQo+IC0KPiAtICB0ZXN0
IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCj4gLWRvbmUKPiAtCj4gLSAgaWYgdGVzdCAieCRhY19j
dF9DQyIgPSB4OyB0aGVuCj4gLSAgICBDQz0iIgo+IC0gIGVsc2UKPiAtICAgIGNhc2UgJGNyb3Nz
X2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KPiAteWVzOikKPiAteyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3Qg
cHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQo+IC0kYXNfZWNobyAiJGFzX21lOiBXQVJO
SU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4m
Mjt9Cj4gLWFjX3Rvb2xfd2FybmVkPXllcyA7Owo+IC1lc2FjCj4gLSAgICBDQz0kYWNfY3RfQ0MK
PiAtICBmaQo+IC1maQo+IC0KPiAtZmkKPiAtCj4gLQo+IC10ZXN0IC16ICIkQ0MiICYmIHsgeyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdk
JzoiID4mNQo+IC0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9
Cj4gLWFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQ
QVRICj4gLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsg
fQo+IC0KPiAtIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgo+
IC0kYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBj
b21waWxlciB2ZXJzaW9uIiA+JjUKPiAtc2V0IFggJGFjX2NvbXBpbGUKPiAtYWNfY29tcGlsZXI9
JDIKPiAtZm9yIGFjX29wdGlvbiBpbiAtLXZlcnNpb24gLXYgLVYgLXF2ZXJzaW9uOyBkbwo+IC0g
IHsgeyBhY190cnk9IiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIKPiAtY2FzZSAiKCgkYWNf
dHJ5IiBpbgo+IC0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7Owo+
IC0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7Owo+IC1lc2FjCj4gLWV2YWwgYWNfdHJ5X2VjaG89
IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCj4gLSRhc19l
Y2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQo+IC0gIChldmFsICIkYWNfY29tcGlsZXIgJGFjX29w
dGlvbiA+JjUiKSAyPmNvbmZ0ZXN0LmVycgo+IC0gIGFjX3N0YXR1cz0kPwo+IC0gIGlmIHRlc3Qg
LXMgY29uZnRlc3QuZXJyOyB0aGVuCj4gLSAgICBzZWQgJzEwYVwKPiAtLi4uIHJlc3Qgb2Ygc3Rk
ZXJyIG91dHB1dCBkZWxldGVkIC4uLgo+IC0gICAgICAgICAxMHEnIGNvbmZ0ZXN0LmVyciA+Y29u
ZnRlc3QuZXIxCj4gLSAgICBjYXQgY29uZnRlc3QuZXIxID4mNQo+IC0gIGZpCj4gLSAgcm0gLWYg
Y29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgo+IC0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQo+IC0gIHRlc3QgJGFjX3N0YXR1cyA9
IDA7IH0KPiAtZG9uZQo+IC0KPiAtY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3Qu
JGFjX2V4dAo+IC0vKiBlbmQgY29uZmRlZnMuaC4gICovCj4gLQo+IC1pbnQKPiAtbWFpbiAoKQo+
IC17Cj4gLQo+IC0gIDsKPiAtICByZXR1cm4gMDsKPiAtfQo+IC1fQUNFT0YKPiAtYWNfY2xlYW5f
ZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKPiAtYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9m
aWxlcyBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGIub3V0Igo+IC0jIFRyeSB0byBjcmVhdGUgYW4g
ZXhlY3V0YWJsZSB3aXRob3V0IC1vIGZpcnN0LCBkaXNyZWdhcmQgYS5vdXQuCj4gLSMgSXQgd2ls
bCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBjb21waWxlcnMsIGFuZCBmaW5kaW5nIG91dCBhbiBp
bnR1aXRpb24KPiAtIyBvZiBleGVleHQuCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3JrcyIgPiY1Cj4g
LSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MuLi4gIiA+
JjY7IH0KPiAtYWNfbGlua19kZWZhdWx0PWAkYXNfZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAt
byAqY29uZnRlc3RbXiBdKi8vJ2AKPiAtCj4gLSMgVGhlIHBvc3NpYmxlIG91dHB1dCBmaWxlczoK
PiAtYWNfZmlsZXM9ImEub3V0IGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBhLmV4ZSBhX291dC5leGUg
Yi5vdXQgY29uZnRlc3QuKiIKPiAtCj4gLWFjX3JtZmlsZXM9Cj4gLWZvciBhY19maWxlIGluICRh
Y19maWxlcwo+IC1kbwo+IC0gIGNhc2UgJGFjX2ZpbGUgaW4KPiAtICAgICouJGFjX2V4dCB8ICou
eGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5t
YXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKPiAtICAgICogKSBhY19ybWZp
bGVzPSIkYWNfcm1maWxlcyAkYWNfZmlsZSI7Owo+IC0gIGVzYWMKPiAtZG9uZQo+IC1ybSAtZiAk
YWNfcm1maWxlcwo+IC0KPiAtaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmtfZGVmYXVsdCIKPiAtY2Fz
ZSAiKCgkYWNfdHJ5IiBpbgo+IC0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRh
Y190cnk7Owo+IC0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7Owo+IC1lc2FjCj4gLWV2YWwgYWNf
dHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIi
Cj4gLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQo+IC0gIChldmFsICIkYWNfbGlua19k
ZWZhdWx0IikgMj4mNQo+IC0gIGFjX3N0YXR1cz0kPwo+IC0gICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQo+IC0gIHRlc3QgJGFjX3N0
YXR1cyA9IDA7IH07IHRoZW4gOgo+IC0gICMgQXV0b2NvbmYtMi4xMyBjb3VsZCBzZXQgdGhlIGFj
X2N2X2V4ZWV4dCB2YXJpYWJsZSB0byBgbm8nLgo+IC0jIFNvIGlnbm9yZSBhIHZhbHVlIG9mIGBu
bycsIG90aGVyd2lzZSB0aGlzIHdvdWxkIGxlYWQgdG8gYEVYRUVYVCA9IG5vJwo+IC0jIGluIGEg
TWFrZWZpbGUuICBXZSBzaG91bGQgbm90IG92ZXJyaWRlIGFjX2N2X2V4ZWV4dCBpZiBpdCB3YXMg
Y2FjaGVkLAo+IC0jIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNob3J0LWNpcmN1aXQgdGhpcyB0ZXN0
IGZvciBjb21waWxlcnMgdW5rbm93biB0bwo+IC0jIEF1dG9jb25mLgo+IC1mb3IgYWNfZmlsZSBp
biAkYWNfZmlsZXMgJycKPiAtZG8KPiAtICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUK
PiAtICBjYXNlICRhY19maWxlIGluCj4gLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMg
fCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAq
LmRTWU0gfCAqLm8gfCAqLm9iaiApCj4gLSAgICAgICA7Owo+IC0gICAgW2FiXS5vdXQgKQo+IC0g
ICAgICAgIyBXZSBmb3VuZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlz
IG1vc3QKPiAtICAgICAgICMgY2VydGFpbmx5IHJpZ2h0Lgo+IC0gICAgICAgYnJlYWs7Owo+IC0g
ICAgKi4qICkKPiAtICAgICAgIGlmIHRlc3QgIiR7YWNfY3ZfZXhlZXh0K3NldH0iID0gc2V0ICYm
IHRlc3QgIiRhY19jdl9leGVleHQiICE9IG5vOwo+IC0gICAgICAgdGhlbiA6OyBlbHNlCj4gLSAg
ICAgICAgICBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AK
PiAtICAgICAgIGZpCj4gLSAgICAgICAjIFdlIHNldCBhY19jdl9leGVleHQgaGVyZSBiZWNhdXNl
IHRoZSBsYXRlciB0ZXN0IGZvciBpdCBpcyBub3QKPiAtICAgICAgICMgc2FmZTogY3Jvc3MgY29t
cGlsZXJzIG1heSBub3QgYWRkIHRoZSBzdWZmaXggaWYgZ2l2ZW4gYW4gYC1vJwo+IC0gICAgICAg
IyBhcmd1bWVudCwgc28gd2UgbWF5IG5lZWQgdG8ga25vdyBpdCBhdCB0aGF0IHBvaW50IGFscmVh
ZHkuCj4gLSAgICAgICAjIEV2ZW4gaWYgdGhpcyBzZWN0aW9uIGxvb2tzIGNydWZ0eTogaXQgaGFz
IHRoZSBhZHZhbnRhZ2Ugb2YKPiAtICAgICAgICMgYWN0dWFsbHkgd29ya2luZy4KPiAtICAgICAg
IGJyZWFrOzsKPiAtICAgICogKQo+IC0gICAgICAgYnJlYWs7Owo+IC0gIGVzYWMKPiAtZG9uZQo+
IC10ZXN0ICIkYWNfY3ZfZXhlZXh0IiA9IG5vICYmIGFjX2N2X2V4ZWV4dD0KPiAtCj4gLWVsc2UK
PiAtICBhY19maWxlPScnCj4gLWZpCj4gLWlmIHRlc3QgLXogIiRhY19maWxlIjsgdGhlbiA6Cj4g
LSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+
JjUKPiAtJGFzX2VjaG8gIm5vIiA+JjY7IH0KPiAtJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHBy
b2dyYW0gd2FzOiIgPiY1Cj4gLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKPiAt
Cj4gLXsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4g
XGAkYWNfcHdkJzoiID4mNQo+IC0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdk
JzoiID4mMjt9Cj4gLWFzX2ZuX2Vycm9yIDc3ICJDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhl
Y3V0YWJsZXMKPiAtU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8i
IDUgOyB9Cj4gLWVsc2UKPiAtICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IHJlc3VsdDogeWVzIiA+JjUKPiAtJGFzX2VjaG8gInllcyIgPiY2OyB9Cj4gLWZpCj4gLXsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMgY29t
cGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lIiA+JjUKPiAtJGFzX2VjaG9fbiAiY2hlY2tp
bmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lLi4uICIgPiY2OyB9Cj4g
LXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfZmls
ZSIgPiY1Cj4gLSRhc19lY2hvICIkYWNfZmlsZSIgPiY2OyB9Cj4gLWFjX2V4ZWV4dD0kYWNfY3Zf
ZXhlZXh0Cj4gLQo+IC1ybSAtZiAtciBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGNvbmZ0ZXN0JGFj
X2N2X2V4ZWV4dCBiLm91dAo+IC1hY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQo+
IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBz
dWZmaXggb2YgZXhlY3V0YWJsZXMiID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3Vm
Zml4IG9mIGV4ZWN1dGFibGVzLi4uICIgPiY2OyB9Cj4gLWlmIHsgeyBhY190cnk9IiRhY19saW5r
Igo+IC1jYXNlICIoKCRhY190cnkiIGluCj4gLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlf
ZWNobz1cJGFjX3RyeTs7Cj4gLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cj4gLWVzYWMKPiAt
ZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5
X2VjaG9cIiIKPiAtJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Cj4gLSAgKGV2YWwgIiRh
Y19saW5rIikgMj4mNQo+IC0gIGFjX3N0YXR1cz0kPwo+IC0gICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQo+IC0gIHRlc3QgJGFjX3N0
YXR1cyA9IDA7IH07IHRoZW4gOgo+IC0gICMgSWYgYm90aCBgY29uZnRlc3QuZXhlJyBhbmQgYGNv
bmZ0ZXN0JyBhcmUgYHByZXNlbnQnICh3ZWxsLCBvYnNlcnZhYmxlKQo+IC0jIGNhdGNoIGBjb25m
dGVzdC5leGUnLiAgRm9yIGluc3RhbmNlIHdpdGggQ3lnd2luLCBgbHMgY29uZnRlc3QnIHdpbGwK
PiAtIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxl
IGl0IHdvbid0IHdpdGgKPiAtIyBgcm0nLgo+IC1mb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5leGUg
Y29uZnRlc3QgY29uZnRlc3QuKjsgZG8KPiAtICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGlu
dWUKPiAtICBjYXNlICRhY19maWxlIGluCj4gLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50
ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYg
fCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApIDs7Cj4gLSAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4
cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKPiAtICAgICAgICAgYnJlYWs7Owo+IC0g
ICAgKiApIGJyZWFrOzsKPiAtICBlc2FjCj4gLWRvbmUKPiAtZWxzZQo+IC0gIHsgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4m
NQo+IC0kYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cj4gLWFz
X2ZuX2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5v
dCBjb21waWxlIGFuZCBsaW5rCj4gLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMi
ICIkTElORU5PIiA1IDsgfQo+IC1maQo+IC1ybSAtZiBjb25mdGVzdCBjb25mdGVzdCRhY19jdl9l
eGVleHQKPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6
ICRhY19jdl9leGVleHQiID4mNQo+IC0kYXNfZWNobyAiJGFjX2N2X2V4ZWV4dCIgPiY2OyB9Cj4g
LQo+IC1ybSAtZiBjb25mdGVzdC4kYWNfZXh0Cj4gLUVYRUVYVD0kYWNfY3ZfZXhlZXh0Cj4gLWFj
X2V4ZWV4dD0kRVhFRVhUCj4gLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRh
Y19leHQKPiAtLyogZW5kIGNvbmZkZWZzLmguICAqLwo+IC0jaW5jbHVkZSA8c3RkaW8uaD4KPiAt
aW50Cj4gLW1haW4gKCkKPiAtewo+IC1GSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC5vdXQiLCAi
dyIpOwo+IC0gcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOwo+IC0KPiAtICA7
Cj4gLSAgcmV0dXJuIDA7Cj4gLX0KPiAtX0FDRU9GCj4gLWFjX2NsZWFuX2ZpbGVzPSIkYWNfY2xl
YW5fZmlsZXMgY29uZnRlc3Qub3V0Igo+IC0jIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1
Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgo+IC0jIHRoZSBjb21w
aWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCj4gLXsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29t
cGlsaW5nIiA+JjUKPiAtJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3Mg
Y29tcGlsaW5nLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHll
czsgdGhlbgo+IC0gIHsgeyBhY190cnk9IiRhY19saW5rIgo+IC1jYXNlICIoKCRhY190cnkiIGlu
Cj4gLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cj4gLSAgKikg
YWNfdHJ5X2VjaG89JGFjX3RyeTs7Cj4gLWVzYWMKPiAtZXZhbCBhY190cnlfZWNobz0iXCJcJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKPiAtJGFzX2VjaG8gIiRh
Y190cnlfZWNobyI7IH0gPiY1Cj4gLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQo+IC0gIGFjX3N0
YXR1cz0kPwo+IC0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9
ICRhY19zdGF0dXMiID4mNQo+IC0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KPiAtICBpZiB7IGFj
X3RyeT0nLi9jb25mdGVzdCRhY19jdl9leGVleHQnCj4gLSAgeyB7IGNhc2UgIigoJGFjX3RyeSIg
aW4KPiAtICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKPiAtICAq
KSBhY190cnlfZWNobz0kYWNfdHJ5OzsKPiAtZXNhYwo+IC1ldmFsIGFjX3RyeV9lY2hvPSJcIlwk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgo+IC0kYXNfZWNobyAi
JGFjX3RyeV9lY2hvIjsgfSA+JjUKPiAtICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKPiAtICBhY19z
dGF0dXM9JD8KPiAtICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8g
PSAkYWNfc3RhdHVzIiA+JjUKPiAtICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuCj4g
LSAgICBjcm9zc19jb21waWxpbmc9bm8KPiAtICBlbHNlCj4gLSAgICBpZiB0ZXN0ICIkY3Jvc3Nf
Y29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCj4gLSAgICAgICBjcm9zc19jb21waWxpbmc9eWVzCj4g
LSAgICBlbHNlCj4gLSAgICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKPiAtJGFzX2VjaG8gIiRhc19tZTogZXJy
b3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQo+IC1hc19mbl9lcnJvciAkPyAiY2Fubm90IHJ1biBD
IGNvbXBpbGVkIHByb2dyYW1zLgo+IC1JZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNl
IFxgLS1ob3N0Jy4KPiAtU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5F
Tk8iIDUgOyB9Cj4gLSAgICBmaQo+IC0gIGZpCj4gLWZpCj4gLXsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5nIiA+JjUKPiAtJGFz
X2VjaG8gIiRjcm9zc19jb21waWxpbmciID4mNjsgfQo+IC0KPiAtcm0gLWYgY29uZnRlc3QuJGFj
X2V4dCBjb25mdGVzdCRhY19jdl9leGVleHQgY29uZnRlc3Qub3V0Cj4gLWFjX2NsZWFuX2ZpbGVz
PSRhY19jbGVhbl9maWxlc19zYXZlCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMiID4mNQo+IC0kYXNf
ZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcy4uLiAiID4mNjsgfQo+
IC1pZiB0ZXN0ICIke2FjX2N2X29iamV4dCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gLSAgJGFzX2Vj
aG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAtZWxzZQo+IC0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNF
T0YgPmNvbmZ0ZXN0LiRhY19leHQKPiAtLyogZW5kIGNvbmZkZWZzLmguICAqLwo+IC0KPiAtaW50
Cj4gLW1haW4gKCkKPiAtewo+IC0KPiAtICA7Cj4gLSAgcmV0dXJuIDA7Cj4gLX0KPiAtX0FDRU9G
Cj4gLXJtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCj4gLWlmIHsgeyBhY190cnk9IiRhY19j
b21waWxlIgo+IC1jYXNlICIoKCRhY190cnkiIGluCj4gLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBh
Y190cnlfZWNobz1cJGFjX3RyeTs7Cj4gLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cj4gLWVz
YWMKPiAtZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAk
YWNfdHJ5X2VjaG9cIiIKPiAtJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Cj4gLSAgKGV2
YWwgIiRhY19jb21waWxlIikgMj4mNQo+IC0gIGFjX3N0YXR1cz0kPwo+IC0gICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQo+IC0gIHRl
c3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgo+IC0gIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0
Lm8gY29uZnRlc3Qub2JqIGNvbmZ0ZXN0Lio7IGRvCj4gLSAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8
IGNvbnRpbnVlOwo+IC0gIGNhc2UgJGFjX2ZpbGUgaW4KPiAtICAgICouJGFjX2V4dCB8ICoueGNv
ZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAg
fCAqLmluZiB8ICouZFNZTSApIDs7Cj4gLSAgICAqKSBhY19jdl9vYmpleHQ9YGV4cHIgIiRhY19m
aWxlIiA6ICcuKlwuXCguKlwpJ2AKPiAtICAgICAgIGJyZWFrOzsKPiAtICBlc2FjCj4gLWRvbmUK
PiAtZWxzZQo+IC0gICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQo+
IC1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cj4gLQo+IC17IHsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUK
PiAtJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQo+IC1hc19m
bl9lcnJvciAkPyAiY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIG9iamVjdCBmaWxlczogY2Fubm90
IGNvbXBpbGUKPiAtU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8i
IDUgOyB9Cj4gLWZpCj4gLXJtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFj
X2V4dAo+IC1maQo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJl
c3VsdDogJGFjX2N2X29iamV4dCIgPiY1Cj4gLSRhc19lY2hvICIkYWNfY3Zfb2JqZXh0IiA+JjY7
IH0KPiAtT0JKRVhUPSRhY19jdl9vYmpleHQKPiAtYWNfb2JqZXh0PSRPQkpFWFQKPiAteyAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFy
ZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyB3
aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gIiA+JjY7IH0KPiAtaWYg
dGVzdCAiJHthY19jdl9jX2NvbXBpbGVyX2dudStzZXR9IiA9IHNldDsgdGhlbiA6Cj4gLSAgJGFz
X2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAtZWxzZQo+IC0gIGNhdCBjb25mZGVmcy5oIC0gPDxf
QUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKPiAtLyogZW5kIGNvbmZkZWZzLmguICAqLwo+IC0KPiAt
aW50Cj4gLW1haW4gKCkKPiAtewo+IC0jaWZuZGVmIF9fR05VQ19fCj4gLSAgICAgICBjaG9rZSBt
ZQo+IC0jZW5kaWYKPiAtCj4gLSAgOwo+IC0gIHJldHVybiAwOwo+IC19Cj4gLV9BQ0VPRgo+IC1p
ZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Cj4gLSAgYWNfY29tcGlsZXJf
Z251PXllcwo+IC1lbHNlCj4gLSAgYWNfY29tcGlsZXJfZ251PW5vCj4gLWZpCj4gLXJtIC1mIGNv
cmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAo+IC1h
Y19jdl9jX2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251Cj4gLQo+IC1maQo+IC17ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfY29tcGls
ZXJfZ251IiA+JjUKPiAtJGFzX2VjaG8gIiRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2OyB9Cj4g
LWlmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgo+IC0gIEdDQz15ZXMKPiAtZWxz
ZQo+IC0gIEdDQz0KPiAtZmkKPiAtYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQo+IC1hY19z
YXZlX0NGTEFHUz0kQ0ZMQUdTCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1Cj4gLSRhc19lY2hvX24g
ImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KPiAtaWYgdGVzdCAi
JHthY19jdl9wcm9nX2NjX2crc2V0fSIgPSBzZXQ7IHRoZW4gOgo+IC0gICRhc19lY2hvX24gIihj
YWNoZWQpICIgPiY2Cj4gLWVsc2UKPiAtICBhY19zYXZlX2Nfd2Vycm9yX2ZsYWc9JGFjX2Nfd2Vy
cm9yX2ZsYWcKPiAtICAgYWNfY193ZXJyb3JfZmxhZz15ZXMKPiAtICAgYWNfY3ZfcHJvZ19jY19n
PW5vCj4gLSAgIENGTEFHUz0iLWciCj4gLSAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNv
bmZ0ZXN0LiRhY19leHQKPiAtLyogZW5kIGNvbmZkZWZzLmguICAqLwo+IC0KPiAtaW50Cj4gLW1h
aW4gKCkKPiAtewo+IC0KPiAtICA7Cj4gLSAgcmV0dXJuIDA7Cj4gLX0KPiAtX0FDRU9GCj4gLWlm
IGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKPiAtICBhY19jdl9wcm9nX2Nj
X2c9eWVzCj4gLWVsc2UKPiAtICBDRkxBR1M9IiIKPiAtICAgICAgY2F0IGNvbmZkZWZzLmggLSA8
PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAo+IC0vKiBlbmQgY29uZmRlZnMuaC4gICovCj4gLQo+
IC1pbnQKPiAtbWFpbiAoKQo+IC17Cj4gLQo+IC0gIDsKPiAtICByZXR1cm4gMDsKPiAtfQo+IC1f
QUNFT0YKPiAtaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgo+IC0KPiAt
ZWxzZQo+IC0gIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwo+IC0gICAg
ICAgIENGTEFHUz0iLWciCj4gLSAgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29u
ZnRlc3QuJGFjX2V4dAo+IC0vKiBlbmQgY29uZmRlZnMuaC4gICovCj4gLQo+IC1pbnQKPiAtbWFp
biAoKQo+IC17Cj4gLQo+IC0gIDsKPiAtICByZXR1cm4gMDsKPiAtfQo+IC1fQUNFT0YKPiAtaWYg
YWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgo+IC0gIGFjX2N2X3Byb2dfY2Nf
Zz15ZXMKPiAtZmkKPiAtcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4
dCBjb25mdGVzdC4kYWNfZXh0Cj4gLWZpCj4gLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0
ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAo+IC1maQo+IC1ybSAtZiBjb3JlIGNvbmZ0
ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKPiAtICAgYWNfY193
ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCj4gLWZpCj4gLXsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19nIiA+JjUK
PiAtJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQo+IC1pZiB0ZXN0ICIkYWNfdGVz
dF9DRkxBR1MiID0gc2V0OyB0aGVuCj4gLSAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUwo+IC1lbGlm
IHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgo+IC0gIGlmIHRlc3QgIiRHQ0MiID0g
eWVzOyB0aGVuCj4gLSAgICBDRkxBR1M9Ii1nIC1PMiIKPiAtICBlbHNlCj4gLSAgICBDRkxBR1M9
Ii1nIgo+IC0gIGZpCj4gLWVsc2UKPiAtICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgo+IC0g
ICAgQ0ZMQUdTPSItTzIiCj4gLSAgZWxzZQo+IC0gICAgQ0ZMQUdTPQo+IC0gIGZpCj4gLWZpCj4g
LXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRD
QyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkiID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyBm
b3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OS4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0ICIk
e2FjX2N2X3Byb2dfY2NfYzg5K3NldH0iID0gc2V0OyB0aGVuIDoKPiAtICAkYXNfZWNob19uICIo
Y2FjaGVkKSAiID4mNgo+IC1lbHNlCj4gLSAgYWNfY3ZfcHJvZ19jY19jODk9bm8KPiAtYWNfc2F2
ZV9DQz0kQ0MKPiAtY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAo+
IC0vKiBlbmQgY29uZmRlZnMuaC4gICovCj4gLSNpbmNsdWRlIDxzdGRhcmcuaD4KPiAtI2luY2x1
ZGUgPHN0ZGlvLmg+Cj4gLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KPiAtI2luY2x1ZGUgPHN5cy9z
dGF0Lmg+Cj4gLS8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc3RvbGVuIGZyb20g
UkNTIDUuNydzIHNyYy9jb25mLnNoLiAgKi8KPiAtc3RydWN0IGJ1ZiB7IGludCB4OyB9Owo+IC1G
SUxFICogKCpyY3NvcGVuKSAoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpOwo+IC1z
dGF0aWMgY2hhciAqZSAocCwgaSkKPiAtICAgICBjaGFyICoqcDsKPiAtICAgICBpbnQgaTsKPiAt
ewo+IC0gIHJldHVybiBwW2ldOwo+IC19Cj4gLXN0YXRpYyBjaGFyICpmIChjaGFyICogKCpnKSAo
Y2hhciAqKiwgaW50KSwgY2hhciAqKnAsIC4uLikKPiAtewo+IC0gIGNoYXIgKnM7Cj4gLSAgdmFf
bGlzdCB2Owo+IC0gIHZhX3N0YXJ0ICh2LHApOwo+IC0gIHMgPSBnIChwLCB2YV9hcmcgKHYsaW50
KSk7Cj4gLSAgdmFfZW5kICh2KTsKPiAtICByZXR1cm4gczsKPiAtfQo+IC0KPiAtLyogT1NGIDQu
MCBDb21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBo
YXMKPiAtICAgZnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgc3R1ZmYsIGJ1dCBub3QgJ1x4SEgnIGhl
eCBjaGFyYWN0ZXIgY29uc3RhbnRzLgo+IC0gICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9y
IHVuZm9ydHVuYXRlbHksIGluc3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKPiAtICAgYXMgJ3gn
LiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkIGlzIGFkZGVkIHRv
IGdldAo+IC0gICBwcm9wZXIgQU5TSSBtb2RlLiAgQ3VyaW91c2x5ICdceDAwJyE9J3gnIGFsd2F5
cyBjb21lcyBvdXQgdHJ1ZSwgZm9yIGFuCj4gLSAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdz
IG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZwo+IC0gICB0aGF0
J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZC4gICovCj4gLWludCBvc2Y0X2NjX2FycmF5IFsnXHgwMCcg
PT0gMCA/IDEgOiAtMV07Cj4gLQo+IC0vKiBJQk0gQyA2IGZvciBBSVggaXMgYWxtb3N0LUFOU0kg
YnkgZGVmYXVsdCwgYnV0IGl0IHJlcGxhY2VzIG1hY3JvIHBhcmFtZXRlcnMKPiAtICAgaW5zaWRl
IHN0cmluZ3MgYW5kIGNoYXJhY3RlciBjb25zdGFudHMuICAqLwo+IC0jZGVmaW5lIEZPTyh4KSAn
eCcKPiAtaW50IHhsYzZfY2NfYXJyYXlbRk9PKGEpID09ICd4JyA/IDEgOiAtMV07Cj4gLQo+IC1p
bnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKPiAtc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEp
O307Cj4gLXN0cnVjdCBzMiB7aW50ICgqZikgKGRvdWJsZSBhKTt9Owo+IC1pbnQgcGFpcm5hbWVz
IChpbnQsIGNoYXIgKiosIEZJTEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGlu
dCksIGludCwgaW50KTsKPiAtaW50IGFyZ2M7Cj4gLWNoYXIgKiphcmd2Owo+IC1pbnQKPiAtbWFp
biAoKQo+IC17Cj4gLXJldHVybiBmIChlLCBhcmd2LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwg
YXJndiwgMSkgIT0gYXJndlsxXTsKPiAtICA7Cj4gLSAgcmV0dXJuIDA7Cj4gLX0KPiAtX0FDRU9G
Cj4gLWZvciBhY19hcmcgaW4gJycgLXFsYW5nbHZsPWV4dGM4OSAtcWxhbmdsdmw9YW5zaSAtc3Rk
IFwKPiAtICAgICAgIC1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05T
X18iCj4gLWRvCj4gLSAgQ0M9IiRhY19zYXZlX0NDICRhY19hcmciCj4gLSAgaWYgYWNfZm5fY190
cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgo+IC0gIGFjX2N2X3Byb2dfY2NfYzg5PSRhY19h
cmcKPiAtZmkKPiAtcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dAo+
IC0gIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9ICJ4bm8iICYmIGJyZWFrCj4gLWRvbmUK
PiAtcm0gLWYgY29uZnRlc3QuJGFjX2V4dAo+IC1DQz0kYWNfc2F2ZV9DQwo+IC0KPiAtZmkKPiAt
IyBBQ19DQUNIRV9WQUwKPiAtY2FzZSAieCRhY19jdl9wcm9nX2NjX2M4OSIgaW4KPiAtICB4KQo+
IC0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5v
bmUgbmVlZGVkIiA+JjUKPiAtJGFzX2VjaG8gIm5vbmUgbmVlZGVkIiA+JjY7IH0gOzsKPiAtICB4
bm8pCj4gLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogdW5zdXBwb3J0ZWQiID4mNQo+IC0kYXNfZWNobyAidW5zdXBwb3J0ZWQiID4mNjsgfSA7Owo+
IC0gICopCj4gLSAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjX2M4OSIKPiAtICAgIHsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19j
ODkiID4mNQo+IC0kYXNfZWNobyAiJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjY7IH0gOzsKPiAtZXNh
Ywo+IC1pZiB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSB4bm87IHRoZW4gOgo+IC0KPiAt
ZmkKPiAtCj4gLWFjX2V4dD1jCj4gLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCj4gLWFjX2NvbXBp
bGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKPiAtYWNf
bGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFH
UyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKPiAtYWNfY29tcGlsZXJfZ251PSRhY19jdl9j
X2NvbXBpbGVyX2dudQo+IC0KPiAtCj4gLWFjX2V4dD1jCj4gLWFjX2NwcD0nJENQUCAkQ1BQRkxB
R1MnCj4gLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNf
ZXh0ID4mNScKPiAtYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRD
UFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKPiAtYWNfY29tcGls
ZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+
JjUKPiAtJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3Iu
Li4gIiA+JjY7IH0KPiAtIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9y
eS4KPiAtaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KPiAtICBDUFA9
Cj4gLWZpCj4gLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCj4gLSAgaWYgdGVzdCAiJHthY19jdl9w
cm9nX0NQUCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+
JjYKPiAtZWxzZQo+IC0gICAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDUFAgbmVlZHMgdG8g
YmUgZXhwYW5kZWQKPiAtICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9u
YWwtY3BwIiAiL2xpYi9jcHAiCj4gLSAgICBkbwo+IC0gICAgICBhY19wcmVwcm9jX29rPWZhbHNl
Cj4gLWZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwo+IC1kbwo+IC0gICMgVXNl
IGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMK
PiAtICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KPiAtICAjIFByZWZlciA8
bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKPiAt
ICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KPiAt
ICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVy
J3MgcGFyc2VyLAo+IC0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlz
IGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgo+IC0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0Yg
PmNvbmZ0ZXN0LiRhY19leHQKPiAtLyogZW5kIGNvbmZkZWZzLmguICAqLwo+IC0jaWZkZWYgX19T
VERDX18KPiAtIyBpbmNsdWRlIDxsaW1pdHMuaD4KPiAtI2Vsc2UKPiAtIyBpbmNsdWRlIDxhc3Nl
cnQuaD4KPiAtI2VuZGlmCj4gLSAgICAgICAgICAgICAgICAgICAgU3ludGF4IGVycm9yCj4gLV9B
Q0VPRgo+IC1pZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKPiAtCj4gLWVsc2UK
PiAtICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCj4gLWNvbnRpbnVlCj4gLWZpCj4g
LXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKPiAtCj4gLSAg
IyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50
IGhlYWRlcnMKPiAtICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93Lgo+IC0gIGNhdCBjb25mZGVm
cy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKPiAtLyogZW5kIGNvbmZkZWZzLmguICAq
Lwo+IC0jaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KPiAtX0FDRU9GCj4gLWlmIGFjX2ZuX2Nf
dHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgo+IC0gICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFs
aWQgaW5wdXQuCj4gLWNvbnRpbnVlCj4gLWVsc2UKPiAtICAjIFBhc3NlcyBib3RoIHRlc3RzLgo+
IC1hY19wcmVwcm9jX29rPToKPiAtYnJlYWsKPiAtZmkKPiAtcm0gLWYgY29uZnRlc3QuZXJyIGNv
bmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAo+IC0KPiAtZG9uZQo+IC0jIEJlY2F1c2Ugb2YgYGJy
ZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KPiAt
cm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAo+IC1pZiAkYWNf
cHJlcHJvY19vazsgdGhlbiA6Cj4gLSAgYnJlYWsKPiAtZmkKPiAtCj4gLSAgICBkb25lCj4gLSAg
ICBhY19jdl9wcm9nX0NQUD0kQ1BQCj4gLQo+IC1maQo+IC0gIENQUD0kYWNfY3ZfcHJvZ19DUFAK
PiAtZWxzZQo+IC0gIGFjX2N2X3Byb2dfQ1BQPSRDUFAKPiAtZmkKPiAteyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDUFAiID4mNQo+IC0kYXNfZWNobyAi
JENQUCIgPiY2OyB9Cj4gLWFjX3ByZXByb2Nfb2s9ZmFsc2UKPiAtZm9yIGFjX2NfcHJlcHJvY193
YXJuX2ZsYWcgaW4gJycgeWVzCj4gLWRvCj4gLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNv
bWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwo+IC0gICMgd2l0aCBhIGZyZXNoIGNy
b3NzLWNvbXBpbGVyIHdvcmtzLgo+IC0gICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5o
PiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQo+IC0gICMgPGxpbWl0cy5oPiBleGlzdHMg
ZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgo+IC0gICMgT24gdGhlIE5lWFQsIGNjIC1F
IHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCj4gLSAgIyBub3Qg
anVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNh
c2UuCj4gLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAo+IC0v
KiBlbmQgY29uZmRlZnMuaC4gICovCj4gLSNpZmRlZiBfX1NURENfXwo+IC0jIGluY2x1ZGUgPGxp
bWl0cy5oPgo+IC0jZWxzZQo+IC0jIGluY2x1ZGUgPGFzc2VydC5oPgo+IC0jZW5kaWYKPiAtICAg
ICAgICAgICAgICAgICAgICBTeW50YXggZXJyb3IKPiAtX0FDRU9GCj4gLWlmIGFjX2ZuX2NfdHJ5
X2NwcCAiJExJTkVOTyI7IHRoZW4gOgo+IC0KPiAtZWxzZQo+IC0gICMgQnJva2VuOiBmYWlscyBv
biB2YWxpZCBpbnB1dC4KPiAtY29udGludWUKPiAtZmkKPiAtcm0gLWYgY29uZnRlc3QuZXJyIGNv
bmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAo+IC0KPiAtICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNh
c2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycwo+IC0gICMgY2FuIGJl
IGRldGVjdGVkIGFuZCBob3cuCj4gLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRl
c3QuJGFjX2V4dAo+IC0vKiBlbmQgY29uZmRlZnMuaC4gICovCj4gLSNpbmNsdWRlIDxhY19ub25l
eGlzdGVudC5oPgo+IC1fQUNFT0YKPiAtaWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhl
biA6Cj4gLSAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KPiAtY29udGludWUK
PiAtZWxzZQo+IC0gICMgUGFzc2VzIGJvdGggdGVzdHMuCj4gLWFjX3ByZXByb2Nfb2s9Ogo+IC1i
cmVhawo+IC1maQo+IC1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNf
ZXh0Cj4gLQo+IC1kb25lCj4gLSMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVM
U0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgo+IC1ybSAtZiBjb25mdGVzdC5pIGNvbmZ0
ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Cj4gLWlmICRhY19wcmVwcm9jX29rOyB0aGVuIDoKPiAt
Cj4gLWVsc2UKPiAtICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
ZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKPiAtJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGlu
IFxgJGFjX3B3ZCc6IiA+JjI7fQo+IC1hc19mbl9lcnJvciAkPyAiQyBwcmVwcm9jZXNzb3IgXCIk
Q1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCj4gLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRl
dGFpbHMiICIkTElORU5PIiA1IDsgfQo+IC1maQo+IC0KPiAtYWNfZXh0PWMKPiAtYWNfY3BwPSck
Q1BQICRDUFBGTEFHUycKPiAtYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNv
bmZ0ZXN0LiRhY19leHQgPiY1Jwo+IC1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0
ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1Jwo+
IC1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Cj4gLQo+IC0KPiAteyAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ3JlcCB0aGF0
IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUiID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyBm
b3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUuLi4gIiA+JjY7IH0KPiAtaWYg
dGVzdCAiJHthY19jdl9wYXRoX0dSRVArc2V0fSIgPSBzZXQ7IHRoZW4gOgo+IC0gICRhc19lY2hv
X24gIihjYWNoZWQpICIgPiY2Cj4gLWVsc2UKPiAtICBpZiB0ZXN0IC16ICIkR1JFUCI7IHRoZW4K
PiAtICBhY19wYXRoX0dSRVBfZm91bmQ9ZmFsc2UKPiAtICAjIExvb3AgdGhyb3VnaCB0aGUgdXNl
cidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAo+IC0gIGFzX3NhdmVf
SUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKPiAtZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRI
X1NFUEFSQVRPUi91c3IveHBnNC9iaW4KPiAtZG8KPiAtICBJRlM9JGFzX3NhdmVfSUZTCj4gLSAg
dGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KPiAtICAgIGZvciBhY19wcm9nIGluIGdyZXAg
Z2dyZXA7IGRvCj4gLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0
ZW5zaW9uczsgZG8KPiAtICAgICAgYWNfcGF0aF9HUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4
ZWNfZXh0Igo+IC0gICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0dSRVAiICYmICRhc190ZXN0X3gg
IiRhY19wYXRoX0dSRVAiOyB9IHx8IGNvbnRpbnVlCj4gLSMgQ2hlY2sgZm9yIEdOVSBhY19wYXRo
X0dSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KPiAtICAjIENoZWNrIGZvciBHTlUg
JGFjX3BhdGhfR1JFUAo+IC1jYXNlIGAiJGFjX3BhdGhfR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGlu
Cj4gLSpHTlUqKQo+IC0gIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIgYWNfcGF0aF9H
UkVQX2ZvdW5kPTo7Owo+IC0qKQo+IC0gIGFjX2NvdW50PTAKPiAtICAkYXNfZWNob19uIDAxMjM0
NTY3ODkgPiJjb25mdGVzdC5pbiIKPiAtICB3aGlsZSA6Cj4gLSAgZG8KPiAtICAgIGNhdCAiY29u
ZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCj4gLSAgICBtdiAiY29uZnRl
c3QudG1wIiAiY29uZnRlc3QuaW4iCj4gLSAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5u
bCIKPiAtICAgICRhc19lY2hvICdHUkVQJyA+PiAiY29uZnRlc3QubmwiCj4gLSAgICAiJGFjX3Bh
dGhfR1JFUCIgLWUgJ0dSRVAkJyAtZSAnLShjYW5ub3QgbWF0Y2gpLScgPCAiY29uZnRlc3Qubmwi
ID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhawo+IC0gICAgZGlmZiAiY29uZnRl
c3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhawo+IC0gICAgYXNf
Zm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCj4gLSAgICBpZiB0ZXN0
ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0dSRVBfbWF4LTB9OyB0aGVuCj4gLSAgICAgICMgQmVz
dCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQo+
IC0gICAgICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiCj4gLSAgICAgIGFjX3BhdGhf
R1JFUF9tYXg9JGFjX2NvdW50Cj4gLSAgICBmaQo+IC0gICAgIyAxMCooMl4xMCkgY2hhcnMgYXMg
aW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAo+IC0gICAgdGVzdCAkYWNfY291bnQgLWd0IDEw
ICYmIGJyZWFrCj4gLSAgZG9uZQo+IC0gIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBj
b25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7Owo+IC1lc2FjCj4gLQo+IC0gICAgICAkYWNfcGF0aF9H
UkVQX2ZvdW5kICYmIGJyZWFrIDMKPiAtICAgIGRvbmUKPiAtICBkb25lCj4gLSAgZG9uZQo+IC1J
RlM9JGFzX3NhdmVfSUZTCj4gLSAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfR1JFUCI7IHRoZW4K
PiAtICAgIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIGdyZXAgY291bGQgYmUgZm91bmQg
aW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiAiJExJTkVOTyIgNQo+IC0gIGZp
Cj4gLWVsc2UKPiAtICBhY19jdl9wYXRoX0dSRVA9JEdSRVAKPiAtZmkKPiAtCj4gLWZpCj4gLXsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0
aF9HUkVQIiA+JjUKPiAtJGFzX2VjaG8gIiRhY19jdl9wYXRoX0dSRVAiID4mNjsgfQo+IC0gR1JF
UD0iJGFjX2N2X3BhdGhfR1JFUCIKPiAtCj4gLQo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBlZ3JlcCIgPiY1Cj4gLSRhc19lY2hvX24gImNo
ZWNraW5nIGZvciBlZ3JlcC4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfRUdS
RVArc2V0fSIgPSBzZXQ7IHRoZW4gOgo+IC0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4g
LWVsc2UKPiAtICBpZiBlY2hvIGEgfCAkR1JFUCAtRSAnKGF8YiknID4vZGV2L251bGwgMj4mMQo+
IC0gICB0aGVuIGFjX2N2X3BhdGhfRUdSRVA9IiRHUkVQIC1FIgo+IC0gICBlbHNlCj4gLSAgICAg
aWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgo+IC0gIGFjX3BhdGhfRUdSRVBfZm91bmQ9ZmFsc2UK
PiAtICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2Yg
UFJPR05BTUUtTElTVAo+IC0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IK
PiAtZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KPiAtZG8K
PiAtICBJRlM9JGFzX3NhdmVfSUZTCj4gLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4K
PiAtICAgIGZvciBhY19wcm9nIGluIGVncmVwOyBkbwo+IC0gICAgZm9yIGFjX2V4ZWNfZXh0IGlu
ICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gLSAgICAgIGFjX3BhdGhfRUdSRVA9
IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCj4gLSAgICAgIHsgdGVzdCAtZiAiJGFjX3Bh
dGhfRUdSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0VHUkVQIjsgfSB8fCBjb250aW51ZQo+
IC0jIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZv
dW5kLgo+IC0gICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9FR1JFUAo+IC1jYXNlIGAiJGFjX3Bh
dGhfRUdSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgo+IC0qR05VKikKPiAtICBhY19jdl9wYXRoX0VH
UkVQPSIkYWNfcGF0aF9FR1JFUCIgYWNfcGF0aF9FR1JFUF9mb3VuZD06OzsKPiAtKikKPiAtICBh
Y19jb3VudD0wCj4gLSAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCj4gLSAg
d2hpbGUgOgo+IC0gIGRvCj4gLSAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4i
Y29uZnRlc3QudG1wIgo+IC0gICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgo+IC0g
ICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCj4gLSAgICAkYXNfZWNobyAnRUdSRVAn
ID4+ICJjb25mdGVzdC5ubCIKPiAtICAgICIkYWNfcGF0aF9FR1JFUCIgJ0VHUkVQJCcgPCAiY29u
ZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhawo+IC0gICAgZGlm
ZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhawo+
IC0gICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCj4gLSAg
ICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0VHUkVQX21heC0wfTsgdGhlbgo+IC0g
ICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJl
dHRlciBvbmUKPiAtICAgICAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiCj4gLSAg
ICAgIGFjX3BhdGhfRUdSRVBfbWF4PSRhY19jb3VudAo+IC0gICAgZmkKPiAtICAgICMgMTAqKDJe
MTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKPiAtICAgIHRlc3QgJGFj
X2NvdW50IC1ndCAxMCAmJiBicmVhawo+IC0gIGRvbmUKPiAtICBybSAtZiBjb25mdGVzdC5pbiBj
b25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKPiAtZXNhYwo+IC0KPiAtICAg
ICAgJGFjX3BhdGhfRUdSRVBfZm91bmQgJiYgYnJlYWsgMwo+IC0gICAgZG9uZQo+IC0gIGRvbmUK
PiAtICBkb25lCj4gLUlGUz0kYXNfc2F2ZV9JRlMKPiAtICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0
aF9FR1JFUCI7IHRoZW4KPiAtICAgIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIGVncmVw
IGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgIiRM
SU5FTk8iIDUKPiAtICBmaQo+IC1lbHNlCj4gLSAgYWNfY3ZfcGF0aF9FR1JFUD0kRUdSRVAKPiAt
ZmkKPiAtCj4gLSAgIGZpCj4gLWZpCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9FR1JFUCIgPiY1Cj4gLSRhc19lY2hvICIkYWNf
Y3ZfcGF0aF9FR1JFUCIgPiY2OyB9Cj4gLSBFR1JFUD0iJGFjX2N2X3BhdGhfRUdSRVAiCj4gLQo+
IC0KPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBm
b3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBB
TlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVy
X3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+IC0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2
Cj4gLWVsc2UKPiAtICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0
Cj4gLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KPiAtI2luY2x1ZGUgPHN0ZGxpYi5oPgo+IC0jaW5j
bHVkZSA8c3RkYXJnLmg+Cj4gLSNpbmNsdWRlIDxzdHJpbmcuaD4KPiAtI2luY2x1ZGUgPGZsb2F0
Lmg+Cj4gLQo+IC1pbnQKPiAtbWFpbiAoKQo+IC17Cj4gLQo+IC0gIDsKPiAtICByZXR1cm4gMDsK
PiAtfQo+IC1fQUNFT0YKPiAtaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4g
Ogo+IC0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwo+IC1lbHNlCj4gLSAgYWNfY3ZfaGVhZGVyX3N0
ZGM9bm8KPiAtZmkKPiAtcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4
dCBjb25mdGVzdC4kYWNfZXh0Cj4gLQo+IC1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHll
czsgdGhlbgo+IC0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwg
Y29udHJhcnkgdG8gQU5TSS4KPiAtICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVz
dC4kYWNfZXh0Cj4gLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KPiAtI2luY2x1ZGUgPHN0cmluZy5o
Pgo+IC0KPiAtX0FDRU9GCj4gLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAy
PiY1IHwKPiAtICAkRUdSRVAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKPiAtCj4g
LWVsc2UKPiAtICBhY19jdl9oZWFkZXJfc3RkYz1ubwo+IC1maQo+IC1ybSAtZiBjb25mdGVzdCoK
PiAtCj4gLWZpCj4gLQo+IC1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgo+
IC0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkg
dG8gQU5TSS4KPiAtICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0
Cj4gLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KPiAtI2luY2x1ZGUgPHN0ZGxpYi5oPgo+IC0KPiAt
X0FDRU9GCj4gLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKPiAt
ICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Cj4gLQo+IC1lbHNlCj4gLSAg
YWNfY3ZfaGVhZGVyX3N0ZGM9bm8KPiAtZmkKPiAtcm0gLWYgY29uZnRlc3QqCj4gLQo+IC1maQo+
IC0KPiAtaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KPiAtICAjIC9iaW4v
Y2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcg
LWFuc2kuCj4gLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgo+IC0g
IDoKPiAtZWxzZQo+IC0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19l
eHQKPiAtLyogZW5kIGNvbmZkZWZzLmguICAqLwo+IC0jaW5jbHVkZSA8Y3R5cGUuaD4KPiAtI2lu
Y2x1ZGUgPHN0ZGxpYi5oPgo+IC0jaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCj4gLSMgZGVm
aW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKPiAtIyBkZWZpbmUgVE9V
UFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQo+IC0jZWxzZQo+
IC0jIGRlZmluZSBJU0xPV0VSKGMpIFwKPiAtICAgICAgICAgICAgICAgICAgKCgnYScgPD0gKGMp
ICYmIChjKSA8PSAnaScpIFwKPiAtICAgICAgICAgICAgICAgICAgICB8fCAoJ2onIDw9IChjKSAm
JiAoYykgPD0gJ3InKSBcCj4gLSAgICAgICAgICAgICAgICAgICAgfHwgKCdzJyA8PSAoYykgJiYg
KGMpIDw9ICd6JykpCj4gLSMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAoKGMpIHwg
MHg0MCkgOiAoYykpCj4gLSNlbmRpZgo+IC0KPiAtI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYg
IShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKPiAtaW50Cj4gLW1haW4gKCkKPiAtewo+IC0gIGludCBp
Owo+IC0gIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKPiAtICAgIGlmIChYT1IgKGlzbG93ZXIg
KGkpLCBJU0xPV0VSIChpKSkKPiAtICAgICAgIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkp
KQo+IC0gICAgICByZXR1cm4gMjsKPiAtICByZXR1cm4gMDsKPiAtfQo+IC1fQUNFT0YKPiAtaWYg
YWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Cj4gLQo+IC1lbHNlCj4gLSAgYWNfY3Zf
aGVhZGVyX3N0ZGM9bm8KPiAtZmkKPiAtcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4q
IGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAo+IC0gIGNvbmZ0ZXN0LiRhY19v
YmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Cj4gLWZpCj4gLQo+IC1maQo+IC1m
aQo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFj
X2N2X2hlYWRlcl9zdGRjIiA+JjUKPiAtJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3RkYyIgPiY2
OyB9Cj4gLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCj4gLQo+IC0kYXNf
ZWNobyAiI2RlZmluZSBTVERDX0hFQURFUlMgMSIgPj5jb25mZGVmcy5oCj4gLQo+IC1maQo+IC0K
PiAtIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGlu
Zy4KPiAtZm9yIGFjX2hlYWRlciBpbiBzeXMvdHlwZXMuaCBzeXMvc3RhdC5oIHN0ZGxpYi5oIHN0
cmluZy5oIG1lbW9yeS5oIHN0cmluZ3MuaCBcCj4gLSAgICAgICAgICAgICAgICAgaW50dHlwZXMu
aCBzdGRpbnQuaCB1bmlzdGQuaAo+IC1kbyA6Cj4gLSAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAi
YWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAo+IC1hY19mbl9jX2NoZWNrX2hl
YWRlcl9jb21waWxlICIkTElORU5PIiAiJGFjX2hlYWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNf
aW5jbHVkZXNfZGVmYXVsdAo+IC0iCj4gLWlmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVy
IlwiID0geCJ5ZXMiOyB0aGVuIDoKPiAtICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCj4gLSNk
ZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQo+IC1fQUNF
T0YKPiAtCj4gLWZpCj4gLQo+IC1kb25lCj4gLQo+IC0KPiAtCj4gLSAgYWNfZm5fY19jaGVja19o
ZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIm1pbml4L2NvbmZpZy5oIiAiYWNfY3ZfaGVhZGVyX21p
bml4X2NvbmZpZ19oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCj4gLWlmIHRlc3QgIngkYWNfY3Zf
aGVhZGVyX21pbml4X2NvbmZpZ19oIiA9IHgiInllczsgdGhlbiA6Cj4gLSAgTUlOSVg9eWVzCj4g
LWVsc2UKPiAtICBNSU5JWD0KPiAtZmkKPiAtCj4gLQo+IC0gIGlmIHRlc3QgIiRNSU5JWCIgPSB5
ZXM7IHRoZW4KPiAtCj4gLSRhc19lY2hvICIjZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMSIgPj5jb25m
ZGVmcy5oCj4gLQo+IC0KPiAtJGFzX2VjaG8gIiNkZWZpbmUgX1BPU0lYXzFfU09VUkNFIDIiID4+
Y29uZmRlZnMuaAo+IC0KPiAtCj4gLSRhc19lY2hvICIjZGVmaW5lIF9NSU5JWCAxIiA+PmNvbmZk
ZWZzLmgKPiAtCj4gLSAgZmkKPiAtCj4gLQo+IC0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp
bmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBpdCBpcyBzYWZlIHRvIGRlZmluZSBfX0VY
VEVOU0lPTlNfXyIgPiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgaXQgaXMgc2Fm
ZSB0byBkZWZpbmUgX19FWFRFTlNJT05TX18uLi4gIiA+JjY7IH0KPiAtaWYgdGVzdCAiJHthY19j
dl9zYWZlX3RvX2RlZmluZV9fX2V4dGVuc2lvbnNfXytzZXR9IiA9IHNldDsgdGhlbiA6Cj4gLSAg
JGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAtZWxzZQo+IC0gIGNhdCBjb25mZGVmcy5oIC0g
PDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKPiAtLyogZW5kIGNvbmZkZWZzLmguICAqLwo+IC0K
PiAtIyAgICAgICAgZGVmaW5lIF9fRVhURU5TSU9OU19fIDEKPiAtICAgICAgICAgJGFjX2luY2x1
ZGVzX2RlZmF1bHQKPiAtaW50Cj4gLW1haW4gKCkKPiAtewo+IC0KPiAtICA7Cj4gLSAgcmV0dXJu
IDA7Cj4gLX0KPiAtX0FDRU9GCj4gLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0
aGVuIDoKPiAtICBhY19jdl9zYWZlX3RvX2RlZmluZV9fX2V4dGVuc2lvbnNfXz15ZXMKPiAtZWxz
ZQo+IC0gIGFjX2N2X3NhZmVfdG9fZGVmaW5lX19fZXh0ZW5zaW9uc19fPW5vCj4gLWZpCj4gLXJt
IC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4
dAo+IC1maQo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJGFjX2N2X3NhZmVfdG9fZGVmaW5lX19fZXh0ZW5zaW9uc19fIiA+JjUKPiAtJGFzX2VjaG8g
IiRhY19jdl9zYWZlX3RvX2RlZmluZV9fX2V4dGVuc2lvbnNfXyIgPiY2OyB9Cj4gLSAgdGVzdCAk
YWNfY3Zfc2FmZV90b19kZWZpbmVfX19leHRlbnNpb25zX18gPSB5ZXMgJiYKPiAtICAgICRhc19l
Y2hvICIjZGVmaW5lIF9fRVhURU5TSU9OU19fIDEiID4+Y29uZmRlZnMuaAo+IC0KPiAtICAkYXNf
ZWNobyAiI2RlZmluZSBfQUxMX1NPVVJDRSAxIiA+PmNvbmZkZWZzLmgKPiAtCj4gLSAgJGFzX2Vj
aG8gIiNkZWZpbmUgX0dOVV9TT1VSQ0UgMSIgPj5jb25mZGVmcy5oCj4gLQo+IC0gICRhc19lY2hv
ICIjZGVmaW5lIF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUyAxIiA+PmNvbmZkZWZzLmgKPiAtCj4g
LSAgJGFzX2VjaG8gIiNkZWZpbmUgX1RBTkRFTV9TT1VSQ0UgMSIgPj5jb25mZGVmcy5oCj4gLQo+
IC0KPiAtIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgo+IC0kU0hFTEwgIiRhY19h
dXhfZGlyL2NvbmZpZy5zdWIiIHN1bjQgPi9kZXYvbnVsbCAyPiYxIHx8Cj4gLSAgYXNfZm5fZXJy
b3IgJD8gImNhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICIkTElORU5P
IiA1Cj4gLQo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNr
aW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKPiAtJGFzX2VjaG9fbiAiY2hlY2tpbmcgYnVpbGQg
c3lzdGVtIHR5cGUuLi4gIiA+JjY7IH0KPiAtaWYgdGVzdCAiJHthY19jdl9idWlsZCtzZXR9IiA9
IHNldDsgdGhlbiA6Cj4gLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAtZWxzZQo+IC0g
IGFjX2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwo+IC10ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9
IHggJiYKPiAtICBhY19idWlsZF9hbGlhcz1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuZ3Vl
c3MiYAo+IC10ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKPiAtICBhc19mbl9lcnJvciAk
PyAiY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAiJExJTkVO
TyIgNQo+IC1hY19jdl9idWlsZD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkYWNf
YnVpbGRfYWxpYXNgIHx8Cj4gLSAgYXNfZm5fZXJyb3IgJD8gIiRTSEVMTCAkYWNfYXV4X2Rpci9j
b25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1Cj4gLQo+IC1maQo+
IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2
X2J1aWxkIiA+JjUKPiAtJGFzX2VjaG8gIiRhY19jdl9idWlsZCIgPiY2OyB9Cj4gLWNhc2UgJGFj
X2N2X2J1aWxkIGluCj4gLSotKi0qKSA7Owo+IC0qKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2
YWx1ZSBvZiBjYW5vbmljYWwgYnVpbGQiICIkTElORU5PIiA1IDs7Cj4gLWVzYWMKPiAtYnVpbGQ9
JGFjX2N2X2J1aWxkCj4gLWFjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKPiAtc2V0IHggJGFjX2N2
X2J1aWxkCj4gLXNoaWZ0Cj4gLWJ1aWxkX2NwdT0kMQo+IC1idWlsZF92ZW5kb3I9JDIKPiAtc2hp
ZnQ7IHNoaWZ0Cj4gLSMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVz
ZWQgdG8gY3JlYXRlICQqLAo+IC0jIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6Cj4gLWJ1aWxkX29z
PSQqCj4gLUlGUz0kYWNfc2F2ZV9JRlMKPiAtY2FzZSAkYnVpbGRfb3MgaW4gKlwgKikgYnVpbGRf
b3M9YGVjaG8gIiRidWlsZF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKPiAtCj4gLQo+IC17
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvc3Qgc3lz
dGVtIHR5cGUiID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4u
ICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfaG9zdCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4g
LSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAtZWxzZQo+IC0gIGlmIHRlc3QgIngkaG9z
dF9hbGlhcyIgPSB4OyB0aGVuCj4gLSAgYWNfY3ZfaG9zdD0kYWNfY3ZfYnVpbGQKPiAtZWxzZQo+
IC0gIGFjX2N2X2hvc3Q9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGhvc3RfYWxp
YXNgIHx8Cj4gLSAgICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5z
dWIgJGhvc3RfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQo+IC1maQo+IC0KPiAtZmkKPiAteyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9ob3N0
IiA+JjUKPiAtJGFzX2VjaG8gIiRhY19jdl9ob3N0IiA+JjY7IH0KPiAtY2FzZSAkYWNfY3ZfaG9z
dCBpbgo+IC0qLSotKikgOzsKPiAtKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFsdWUgb2Yg
Y2Fub25pY2FsIGhvc3QiICIkTElORU5PIiA1IDs7Cj4gLWVzYWMKPiAtaG9zdD0kYWNfY3ZfaG9z
dAo+IC1hY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCj4gLXNldCB4ICRhY19jdl9ob3N0Cj4gLXNo
aWZ0Cj4gLWhvc3RfY3B1PSQxCj4gLWhvc3RfdmVuZG9yPSQyCj4gLXNoaWZ0OyBzaGlmdAo+IC0j
IFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAk
KiwKPiAtIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgo+IC1ob3N0X29zPSQqCj4gLUlGUz0kYWNf
c2F2ZV9JRlMKPiAtY2FzZSAkaG9zdF9vcyBpbiAqXCAqKSBob3N0X29zPWBlY2hvICIkaG9zdF9v
cyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKPiAtCj4gLQo+IC0KPiAtIyBNNCBNYWNybyBpbmNs
dWRlcwo+IC0KPiAtCj4gLQo+IC0KPiAtCj4gLQo+IC0KPiAtCj4gLQo+IC0KPiAtCj4gLQo+IC0K
PiAtCj4gLQo+IC0KPiAtCj4gLQo+IC0KPiAtCj4gLQo+IC0KPiAtCj4gLQo+IC0KPiAtCj4gLQo+
IC0KPiAtCj4gLQo+IC0KPiAtCj4gLQo+IC0KPiAtCj4gLQo+IC0KPiAtCj4gLQo+IC0KPiAtCj4g
LQo+IC0KPiAtCj4gLQo+IC0KPiAtCj4gLSMgcGtnLm00IC0gTWFjcm9zIHRvIGxvY2F0ZSBhbmQg
dXRpbGlzZSBwa2ctY29uZmlnLiAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KPiAtIyBzZXJp
YWwgMSAocGtnLWNvbmZpZy0wLjI0KQo+IC0jCj4gLSMgQ29weXJpZ2h0IMKpIDIwMDQgU2NvdHQg
SmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPi4KPiAtIwo+IC0jIFRoaXMgcHJvZ3Jh
bSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5
Cj4gLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkKPiAtIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgo+IC0jIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCj4gLSMKPiAtIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Cj4gLSMgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+IC0jIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
Cj4gLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+IC0jCj4gLSMg
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKPiAtIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0
aGUgRnJlZSBTb2Z0d2FyZQo+IC0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAt
IFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCj4gLSMKPiAtIyBBcyBhIHNw
ZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91
Cj4gLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250
YWlucyBhCj4gLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5
b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKPiAtIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMg
dGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCj4gLQo+IC0jIFBLR19Q
Uk9HX1BLR19DT05GSUcoW01JTi1WRVJTSU9OXSkKPiAtIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCj4gLSMgUEtHX1BST0dfUEtHX0NPTkZJRwo+IC0KPiAtIyBQS0dfQ0hFQ0tf
RVhJU1RTKE1PRFVMRVMsIFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0p
Cj4gLSMKPiAtIyBDaGVjayB0byBzZWUgd2hldGhlciBhIHBhcnRpY3VsYXIgc2V0IG9mIG1vZHVs
ZXMgZXhpc3RzLiAgU2ltaWxhcgo+IC0jIHRvIFBLR19DSEVDS19NT0RVTEVTKCksIGJ1dCBkb2Vz
IG5vdCBzZXQgdmFyaWFibGVzIG9yIHByaW50IGVycm9ycy4KPiAtIwo+IC0jIFBsZWFzZSByZW1l
bWJlciB0aGF0IG00IGV4cGFuZHMgQUNfUkVRVUlSRShbUEtHX1BST0dfUEtHX0NPTkZJR10pCj4g
LSMgb25seSBhdCB0aGUgZmlyc3Qgb2NjdXJlbmNlIGluIGNvbmZpZ3VyZS5hYywgc28gaWYgdGhl
IGZpcnN0IHBsYWNlCj4gLSMgaXQncyBjYWxsZWQgbWlnaHQgYmUgc2tpcHBlZCAoc3VjaCBhcyBp
ZiBpdCBpcyB3aXRoaW4gYW4gImlmIiwgeW91Cj4gLSMgaGF2ZSB0byBjYWxsIFBLR19DSEVDS19F
WElTVFMgbWFudWFsbHkKPiAtIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+IC0KPiAtCj4gLSMgX1BLR19DT05GSUcoW1ZBUklB
QkxFXSwgW0NPTU1BTkRdLCBbTU9EVUxFU10pCj4gLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gLSMgX1BLR19DT05GSUcKPiAtCj4gLSMgX1BLR19TSE9S
VF9FUlJPUlNfU1VQUE9SVEVECj4gLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiAt
IyBfUEtHX1NIT1JUX0VSUk9SU19TVVBQT1JURUQKPiAtCj4gLQo+IC0jIFBLR19DSEVDS19NT0RV
TEVTKFZBUklBQkxFLVBSRUZJWCwgTU9EVUxFUywgW0FDVElPTi1JRi1GT1VORF0sCj4gLSMgW0FD
VElPTi1JRi1OT1QtRk9VTkRdKQo+IC0jCj4gLSMKPiAtIyBOb3RlIHRoYXQgaWYgdGhlcmUgaXMg
YSBwb3NzaWJpbGl0eSB0aGUgZmlyc3QgY2FsbCB0bwo+IC0jIFBLR19DSEVDS19NT0RVTEVTIG1p
Z2h0IG5vdCBoYXBwZW4sIHlvdSBzaG91bGQgYmUgc3VyZSB0byBpbmNsdWRlIGFuCj4gLSMgZXhw
bGljaXQgY2FsbCB0byBQS0dfUFJPR19QS0dfQ09ORklHIGluIHlvdXIgY29uZmlndXJlLmFjCj4g
LSMKPiAtIwo+IC0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCj4gLSMgUEtHX0NIRUNLX01PRFVMRVMKPiAtCj4gLQo+IC0KPiAt
IyBXZSBkZWZpbmUsIHNlcGFyYXRlbHksIFBUSFJFQURfQ0ZMQUdTLCBfTERGTEFHUyBhbmQgX0xJ
QlMKPiAtIyBldmVuIHRob3VnaCBjdXJyZW50bHkgd2UgZG9uJ3Qgc2V0IHRoZW0gdmVyeSBzZXBh
cmF0ZWx5Lgo+IC0jIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWFrZWZpbGVzIHdpbGwgbm90IG5lZWQg
dG8gY2hhbmdlIGluCj4gLSMgdGhlIGZ1dHVyZSBpZiB3ZSBtYWtlIHRoZSB0ZXN0IG1vcmUgc29w
aGlzdGljYXRlZC4KPiAtCj4gLQo+IC0KPiAtIyBXZSBpbnZva2UgQVhfUFRIUkVBRF9WQVJTIHdp
dGggdGhlIG5hbWUgb2YgYW5vdGhlciBtYWNybwo+IC0jIHdoaWNoIGlzIHRoZW4gZXhwYW5kZWQg
b25jZSBmb3IgZWFjaCB2YXJpYWJsZS4KPiAtCj4gLQo+IC0KPiAtCj4gLQo+IC0KPiAtCj4gLQo+
IC0jIEVuYWJsZS9kaXNhYmxlIG9wdGlvbnMKPiAtCj4gLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJs
ZS1naXRodHRwIHdhcyBnaXZlbi4KPiAtaWYgdGVzdCAiJHtlbmFibGVfZ2l0aHR0cCtzZXR9IiA9
IHNldDsgdGhlbiA6Cj4gLSAgZW5hYmxldmFsPSRlbmFibGVfZ2l0aHR0cDsKPiAtZmkKPiAtCj4g
LQo+IC1pZiB0ZXN0ICJ4JGVuYWJsZV9naXRodHRwIiA9ICJ4bm8iOyB0aGVuIDoKPiAtCj4gLSAg
ICBheF9jdl9naXRodHRwPSJuIgo+IC0KPiAtZWxpZiB0ZXN0ICJ4JGVuYWJsZV9naXRodHRwIiA9
ICJ4eWVzIjsgdGhlbiA6Cj4gLQo+IC0gICAgYXhfY3ZfZ2l0aHR0cD0ieSIKPiAtCj4gLWVsaWYg
dGVzdCAteiAkYXhfY3ZfZ2l0aHR0cDsgdGhlbiA6Cj4gLQo+IC0gICAgYXhfY3ZfZ2l0aHR0cD0i
biIKPiAtCj4gLWZpCj4gLWdpdGh0dHA9JGF4X2N2X2dpdGh0dHAKPiAtCj4gLQo+IC0KPiAtIyBD
aGVjayB3aGV0aGVyIC0tZW5hYmxlLW1vbml0b3JzIHdhcyBnaXZlbi4KPiAtaWYgdGVzdCAiJHtl
bmFibGVfbW9uaXRvcnMrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+IC0gIGVuYWJsZXZhbD0kZW5hYmxl
X21vbml0b3JzOwo+IC1maQo+IC0KPiAtCj4gLWlmIHRlc3QgIngkZW5hYmxlX21vbml0b3JzIiA9
ICJ4bm8iOyB0aGVuIDoKPiAtCj4gLSAgICBheF9jdl9tb25pdG9ycz0ibiIKPiAtCj4gLWVsaWYg
dGVzdCAieCRlbmFibGVfbW9uaXRvcnMiID0gInh5ZXMiOyB0aGVuIDoKPiAtCj4gLSAgICBheF9j
dl9tb25pdG9ycz0ieSIKPiAtCj4gLWVsaWYgdGVzdCAteiAkYXhfY3ZfbW9uaXRvcnM7IHRoZW4g
Ogo+IC0KPiAtICAgIGF4X2N2X21vbml0b3JzPSJ5Igo+IC0KPiAtZmkKPiAtbW9uaXRvcnM9JGF4
X2N2X21vbml0b3JzCj4gLQo+IC0KPiAtCj4gLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS12dHBt
IHdhcyBnaXZlbi4KPiAtaWYgdGVzdCAiJHtlbmFibGVfdnRwbStzZXR9IiA9IHNldDsgdGhlbiA6
Cj4gLSAgZW5hYmxldmFsPSRlbmFibGVfdnRwbTsKPiAtZmkKPiAtCj4gLQo+IC1pZiB0ZXN0ICJ4
JGVuYWJsZV92dHBtIiA9ICJ4bm8iOyB0aGVuIDoKPiAtCj4gLSAgICBheF9jdl92dHBtPSJuIgo+
IC0KPiAtZWxpZiB0ZXN0ICJ4JGVuYWJsZV92dHBtIiA9ICJ4eWVzIjsgdGhlbiA6Cj4gLQo+IC0g
ICAgYXhfY3ZfdnRwbT0ieSIKPiAtCj4gLWVsaWYgdGVzdCAteiAkYXhfY3ZfdnRwbTsgdGhlbiA6
Cj4gLQo+IC0gICAgYXhfY3ZfdnRwbT0ibiIKPiAtCj4gLWZpCj4gLXZ0cG09JGF4X2N2X3Z0cG0K
PiAtCj4gLQo+IC0KPiAtIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXhlbmFwaSB3YXMgZ2l2ZW4u
Cj4gLWlmIHRlc3QgIiR7ZW5hYmxlX3hlbmFwaStzZXR9IiA9IHNldDsgdGhlbiA6Cj4gLSAgZW5h
YmxldmFsPSRlbmFibGVfeGVuYXBpOwo+IC1maQo+IC0KPiAtCj4gLWlmIHRlc3QgIngkZW5hYmxl
X3hlbmFwaSIgPSAieG5vIjsgdGhlbiA6Cj4gLQo+IC0gICAgYXhfY3ZfeGVuYXBpPSJuIgo+IC0K
PiAtZWxpZiB0ZXN0ICJ4JGVuYWJsZV94ZW5hcGkiID0gInh5ZXMiOyB0aGVuIDoKPiAtCj4gLSAg
ICBheF9jdl94ZW5hcGk9InkiCj4gLQo+IC1lbGlmIHRlc3QgLXogJGF4X2N2X3hlbmFwaTsgdGhl
biA6Cj4gLQo+IC0gICAgYXhfY3ZfeGVuYXBpPSJuIgo+IC0KPiAtZmkKPiAteGVuYXBpPSRheF9j
dl94ZW5hcGkKPiAtCj4gLQo+IC0KPiAtIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXB5dGhvbnRv
b2xzIHdhcyBnaXZlbi4KPiAtaWYgdGVzdCAiJHtlbmFibGVfcHl0aG9udG9vbHMrc2V0fSIgPSBz
ZXQ7IHRoZW4gOgo+IC0gIGVuYWJsZXZhbD0kZW5hYmxlX3B5dGhvbnRvb2xzOwo+IC1maQo+IC0K
PiAtCj4gLWlmIHRlc3QgIngkZW5hYmxlX3B5dGhvbnRvb2xzIiA9ICJ4bm8iOyB0aGVuIDoKPiAt
Cj4gLSAgICBheF9jdl9weXRob250b29scz0ibiIKPiAtCj4gLWVsaWYgdGVzdCAieCRlbmFibGVf
cHl0aG9udG9vbHMiID0gInh5ZXMiOyB0aGVuIDoKPiAtCj4gLSAgICBheF9jdl9weXRob250b29s
cz0ieSIKPiAtCj4gLWVsaWYgdGVzdCAteiAkYXhfY3ZfcHl0aG9udG9vbHM7IHRoZW4gOgo+IC0K
PiAtICAgIGF4X2N2X3B5dGhvbnRvb2xzPSJ5Igo+IC0KPiAtZmkKPiAtcHl0aG9udG9vbHM9JGF4
X2N2X3B5dGhvbnRvb2xzCj4gLQo+IC0KPiAtCj4gLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1v
Y2FtbHRvb2xzIHdhcyBnaXZlbi4KPiAtaWYgdGVzdCAiJHtlbmFibGVfb2NhbWx0b29scytzZXR9
IiA9IHNldDsgdGhlbiA6Cj4gLSAgZW5hYmxldmFsPSRlbmFibGVfb2NhbWx0b29sczsKPiAtZmkK
PiAtCj4gLQo+IC1pZiB0ZXN0ICJ4JGVuYWJsZV9vY2FtbHRvb2xzIiA9ICJ4bm8iOyB0aGVuIDoK
PiAtCj4gLSAgICBheF9jdl9vY2FtbHRvb2xzPSJuIgo+IC0KPiAtZWxpZiB0ZXN0ICJ4JGVuYWJs
ZV9vY2FtbHRvb2xzIiA9ICJ4eWVzIjsgdGhlbiA6Cj4gLQo+IC0gICAgYXhfY3Zfb2NhbWx0b29s
cz0ieSIKPiAtCj4gLWVsaWYgdGVzdCAteiAkYXhfY3Zfb2NhbWx0b29sczsgdGhlbiA6Cj4gLQo+
IC0gICAgYXhfY3Zfb2NhbWx0b29scz0ieSIKPiAtCj4gLWZpCj4gLW9jYW1sdG9vbHM9JGF4X2N2
X29jYW1sdG9vbHMKPiAtCj4gLQo+IC0KPiAtIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1pbml0
ZXJtIHdhcyBnaXZlbi4KPiAtaWYgdGVzdCAiJHtlbmFibGVfbWluaXRlcm0rc2V0fSIgPSBzZXQ7
IHRoZW4gOgo+IC0gIGVuYWJsZXZhbD0kZW5hYmxlX21pbml0ZXJtOwo+IC1maQo+IC0KPiAtCj4g
LWlmIHRlc3QgIngkZW5hYmxlX21pbml0ZXJtIiA9ICJ4bm8iOyB0aGVuIDoKPiAtCj4gLSAgICBh
eF9jdl9taW5pdGVybT0ibiIKPiAtCj4gLWVsaWYgdGVzdCAieCRlbmFibGVfbWluaXRlcm0iID0g
Inh5ZXMiOyB0aGVuIDoKPiAtCj4gLSAgICBheF9jdl9taW5pdGVybT0ieSIKPiAtCj4gLWVsaWYg
dGVzdCAteiAkYXhfY3ZfbWluaXRlcm07IHRoZW4gOgo+IC0KPiAtICAgIGF4X2N2X21pbml0ZXJt
PSJuIgo+IC0KPiAtZmkKPiAtbWluaXRlcm09JGF4X2N2X21pbml0ZXJtCj4gLQo+IC0KPiAtCj4g
LSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1sb21vdW50IHdhcyBnaXZlbi4KPiAtaWYgdGVzdCAi
JHtlbmFibGVfbG9tb3VudCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gLSAgZW5hYmxldmFsPSRlbmFi
bGVfbG9tb3VudDsKPiAtZmkKPiAtCj4gLQo+IC1pZiB0ZXN0ICJ4JGVuYWJsZV9sb21vdW50IiA9
ICJ4bm8iOyB0aGVuIDoKPiAtCj4gLSAgICBheF9jdl9sb21vdW50PSJuIgo+IC0KPiAtZWxpZiB0
ZXN0ICJ4JGVuYWJsZV9sb21vdW50IiA9ICJ4eWVzIjsgdGhlbiA6Cj4gLQo+IC0gICAgYXhfY3Zf
bG9tb3VudD0ieSIKPiAtCj4gLWVsaWYgdGVzdCAteiAkYXhfY3ZfbG9tb3VudDsgdGhlbiA6Cj4g
LQo+IC0gICAgYXhfY3ZfbG9tb3VudD0ibiIKPiAtCj4gLWZpCj4gLWxvbW91bnQ9JGF4X2N2X2xv
bW91bnQKPiAtCj4gLQo+IC0KPiAtIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW92bWYgd2FzIGdp
dmVuLgo+IC1pZiB0ZXN0ICIke2VuYWJsZV9vdm1mK3NldH0iID0gc2V0OyB0aGVuIDoKPiAtICBl
bmFibGV2YWw9JGVuYWJsZV9vdm1mOwo+IC1maQo+IC0KPiAtCj4gLWlmIHRlc3QgIngkZW5hYmxl
X292bWYiID0gInhubyI7IHRoZW4gOgo+IC0KPiAtICAgIGF4X2N2X292bWY9Im4iCj4gLQo+IC1l
bGlmIHRlc3QgIngkZW5hYmxlX292bWYiID0gInh5ZXMiOyB0aGVuIDoKPiAtCj4gLSAgICBheF9j
dl9vdm1mPSJ5Igo+IC0KPiAtZWxpZiB0ZXN0IC16ICRheF9jdl9vdm1mOyB0aGVuIDoKPiAtCj4g
LSAgICBheF9jdl9vdm1mPSJuIgo+IC0KPiAtZmkKPiAtb3ZtZj0kYXhfY3Zfb3ZtZgo+ICsjIE00
IE1hY3JvIGluY2x1ZGVzCj4gCj4gCj4gCj4gLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1yb21i
aW9zIHdhcyBnaXZlbi4KPiAtaWYgdGVzdCAiJHtlbmFibGVfcm9tYmlvcytzZXR9IiA9IHNldDsg
dGhlbiA6Cj4gLSAgZW5hYmxldmFsPSRlbmFibGVfcm9tYmlvczsKPiAtZmkKPiAKPiAKPiAtaWYg
dGVzdCAieCRlbmFibGVfcm9tYmlvcyIgPSAieG5vIjsgdGhlbiA6Cj4gCj4gLSAgICBheF9jdl9y
b21iaW9zPSJuIgo+IAo+IC1lbGlmIHRlc3QgIngkZW5hYmxlX3JvbWJpb3MiID0gInh5ZXMiOyB0
aGVuIDoKPiAKPiAtICAgIGF4X2N2X3JvbWJpb3M9InkiCj4gCj4gLWVsaWYgdGVzdCAteiAkYXhf
Y3Zfcm9tYmlvczsgdGhlbiA6Cj4gCj4gLSAgICBheF9jdl9yb21iaW9zPSJ5Igo+IAo+IC1maQo+
IC1yb21iaW9zPSRheF9jdl9yb21iaW9zCj4gCj4gCj4gCj4gLSMgQ2hlY2sgd2hldGhlciAtLWVu
YWJsZS1zZWFiaW9zIHdhcyBnaXZlbi4KPiAtaWYgdGVzdCAiJHtlbmFibGVfc2VhYmlvcytzZXR9
IiA9IHNldDsgdGhlbiA6Cj4gLSAgZW5hYmxldmFsPSRlbmFibGVfc2VhYmlvczsKPiAtZmkKPiAK
PiAKPiAtaWYgdGVzdCAieCRlbmFibGVfc2VhYmlvcyIgPSAieG5vIjsgdGhlbiA6Cj4gCj4gLSAg
ICBheF9jdl9zZWFiaW9zPSJuIgo+IAo+IC1lbGlmIHRlc3QgIngkZW5hYmxlX3NlYWJpb3MiID0g
Inh5ZXMiOyB0aGVuIDoKPiAKPiAtICAgIGF4X2N2X3NlYWJpb3M9InkiCj4gCj4gLWVsaWYgdGVz
dCAteiAkYXhfY3Zfc2VhYmlvczsgdGhlbiA6Cj4gCj4gLSAgICBheF9jdl9zZWFiaW9zPSJ5Igo+
IAo+IC1maQo+IC1zZWFiaW9zPSRheF9jdl9zZWFiaW9zCj4gCj4gCj4gCj4gLSMgQ2hlY2sgd2hl
dGhlciAtLWVuYWJsZS1kZWJ1ZyB3YXMgZ2l2ZW4uCj4gLWlmIHRlc3QgIiR7ZW5hYmxlX2RlYnVn
K3NldH0iID0gc2V0OyB0aGVuIDoKPiAtICBlbmFibGV2YWw9JGVuYWJsZV9kZWJ1ZzsKPiAtZmkK
PiAKPiAKPiAtaWYgdGVzdCAieCRlbmFibGVfZGVidWciID0gInhubyI7IHRoZW4gOgo+IAo+IC0g
ICAgYXhfY3ZfZGVidWc9Im4iCj4gCj4gLWVsaWYgdGVzdCAieCRlbmFibGVfZGVidWciID0gInh5
ZXMiOyB0aGVuIDoKPiAKPiAtICAgIGF4X2N2X2RlYnVnPSJ5Igo+IAo+IC1lbGlmIHRlc3QgLXog
JGF4X2N2X2RlYnVnOyB0aGVuIDoKPiAKPiAtICAgIGF4X2N2X2RlYnVnPSJ5Igo+IAo+IC1maQo+
IC1kZWJ1Zz0kYXhfY3ZfZGVidWcKPiAKPiAKPiAKPiBAQCAtNDI0MCw5MzAgKzIyMjIsNDMyIEBA
IGRlYnVnPSRheF9jdl9kZWJ1Zwo+IAo+IAo+IAo+IC1mb3IgY2ZsYWcgaW4gJFBSRVBFTkRfSU5D
TFVERVMKPiAtZG8KPiAtICAgIFBSRVBFTkRfQ0ZMQUdTKz0iIC1JJGNmbGFnIgo+IC1kb25lCj4g
LWZvciBsZGZsYWcgaW4gJFBSRVBFTkRfTElCCj4gLWRvCj4gLSAgICBQUkVQRU5EX0xERkxBR1Mr
PSIgLUwkbGRmbGFnIgo+IC1kb25lCj4gLWZvciBjZmxhZyBpbiAkQVBQRU5EX0lOQ0xVREVTCj4g
LWRvCj4gLSAgICBBUFBFTkRfQ0ZMQUdTKz0iIC1JJGNmbGFnIgo+IC1kb25lCj4gLWZvciBsZGZs
YWcgaW4gJEFQUEVORF9MSUIKPiAtZG8KPiAtICAgIEFQUEVORF9MREZMQUdTKz0iIC1MJGxkZmxh
ZyIKPiAtZG9uZQo+IC1DRkxBR1M9IiRQUkVQRU5EX0NGTEFHUyAkQ0ZMQUdTICRBUFBFTkRfQ0ZM
QUdTIgo+IC1MREZMQUdTPSIkUFJFUEVORF9MREZMQUdTICRMREZMQUdTICRBUFBFTkRfTERGTEFH
UyIKPiAKPiAKPiAKPiAKPiAKPiAKPiArIyBwa2cubTQgLSBNYWNyb3MgdG8gbG9jYXRlIGFuZCB1
dGlsaXNlIHBrZy1jb25maWcuICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQo+ICsjIHNlcmlh
bCAxIChwa2ctY29uZmlnLTAuMjQpCj4gKyMKPiArIyBDb3B5cmlnaHQgwqkgMjAwNCBTY290dCBK
YW1lcyBSZW1uYW50IDxzY290dEBuZXRzcGxpdC5jb20+Lgo+ICsjCj4gKyMgVGhpcyBwcm9ncmFt
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkK
PiArIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieQo+ICsjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
ciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCj4gKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KPiArIwo+ICsjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKPiArIyBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCj4gKyMgTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
PiArIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4gKyMKPiArIyBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZQo+ICsjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRo
ZSBGcmVlIFNvZnR3YXJlCj4gKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0g
U3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KPiArIwo+ICsjIEFzIGEgc3Bl
Y2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UK
PiArIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRh
aW5zIGEKPiArIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlv
dSBtYXkgaW5jbHVkZSBpdCB1bmRlcgo+ICsjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0
aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KPiAKPiArIyBQS0dfUFJP
R19QS0dfQ09ORklHKFtNSU4tVkVSU0lPTl0pCj4gKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQo+ICsjIFBLR19QUk9HX1BLR19DT05GSUcKPiAKPiArIyBQS0dfQ0hFQ0tfRVhJ
U1RTKE1PRFVMRVMsIFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCj4g
KyMKPiArIyBDaGVjayB0byBzZWUgd2hldGhlciBhIHBhcnRpY3VsYXIgc2V0IG9mIG1vZHVsZXMg
ZXhpc3RzLiAgU2ltaWxhcgo+ICsjIHRvIFBLR19DSEVDS19NT0RVTEVTKCksIGJ1dCBkb2VzIG5v
dCBzZXQgdmFyaWFibGVzIG9yIHByaW50IGVycm9ycy4KPiArIwo+ICsjIFBsZWFzZSByZW1lbWJl
ciB0aGF0IG00IGV4cGFuZHMgQUNfUkVRVUlSRShbUEtHX1BST0dfUEtHX0NPTkZJR10pCj4gKyMg
b25seSBhdCB0aGUgZmlyc3Qgb2NjdXJlbmNlIGluIGNvbmZpZ3VyZS5hYywgc28gaWYgdGhlIGZp
cnN0IHBsYWNlCj4gKyMgaXQncyBjYWxsZWQgbWlnaHQgYmUgc2tpcHBlZCAoc3VjaCBhcyBpZiBp
dCBpcyB3aXRoaW4gYW4gImlmIiwgeW91Cj4gKyMgaGF2ZSB0byBjYWxsIFBLR19DSEVDS19FWElT
VFMgbWFudWFsbHkKPiArIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+IAo+IAo+ICsjIF9QS0dfQ09ORklHKFtWQVJJQUJMRV0s
IFtDT01NQU5EXSwgW01PRFVMRVNdKQo+ICsjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQo+ICsjIF9QS0dfQ09ORklHCj4gCj4gKyMgX1BLR19TSE9SVF9FUlJP
UlNfU1VQUE9SVEVECj4gKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiArIyBfUEtH
X1NIT1JUX0VSUk9SU19TVVBQT1JURUQKPiAKPiAKPiArIyBQS0dfQ0hFQ0tfTU9EVUxFUyhWQVJJ
QUJMRS1QUkVGSVgsIE1PRFVMRVMsIFtBQ1RJT04tSUYtRk9VTkRdLAo+ICsjIFtBQ1RJT04tSUYt
Tk9ULUZPVU5EXSkKPiArIwo+ICsjCj4gKyMgTm90ZSB0aGF0IGlmIHRoZXJlIGlzIGEgcG9zc2li
aWxpdHkgdGhlIGZpcnN0IGNhbGwgdG8KPiArIyBQS0dfQ0hFQ0tfTU9EVUxFUyBtaWdodCBub3Qg
aGFwcGVuLCB5b3Ugc2hvdWxkIGJlIHN1cmUgdG8gaW5jbHVkZSBhbgo+ICsjIGV4cGxpY2l0IGNh
bGwgdG8gUEtHX1BST0dfUEtHX0NPTkZJRyBpbiB5b3VyIGNvbmZpZ3VyZS5hYwo+ICsjCj4gKyMK
PiArIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQo+ICsjIFBLR19DSEVDS19NT0RVTEVTCj4gCj4gLSMgQ2hlY2tzIGZvciBwcm9n
cmFtcy4KPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2lu
ZyBmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQiID4mNQo+IC0kYXNfZWNo
b19uICJjaGVja2luZyBmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQuLi4g
IiA+JjY7IH0KPiAtaWYgdGVzdCAiJHthY19jdl9wYXRoX1NFRCtzZXR9IiA9IHNldDsgdGhlbiA6
Cj4gLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAtZWxzZQo+IC0gICAgICAgICAgICBh
Y19zY3JpcHQ9cy9hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS9iYmJiYmJiYmJi
YmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIvCj4gLSAgICAgZm9yIGFjX2kgaW4gMSAyIDMgNCA1IDYg
NzsgZG8KPiAtICAgICAgIGFjX3NjcmlwdD0iJGFjX3NjcmlwdCRhc19ubCRhY19zY3JpcHQiCj4g
LSAgICAgZG9uZQo+IC0gICAgIGVjaG8gIiRhY19zY3JpcHQiIDI+L2Rldi9udWxsIHwgc2VkIDk5
cSA+Y29uZnRlc3Quc2VkCj4gLSAgICAgeyBhY19zY3JpcHQ9OyB1bnNldCBhY19zY3JpcHQ7fQo+
IC0gICAgIGlmIHRlc3QgLXogIiRTRUQiOyB0aGVuCj4gLSAgYWNfcGF0aF9TRURfZm91bmQ9ZmFs
c2UKPiAtICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2gg
b2YgUFJPR05BTUUtTElTVAo+IC0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFU
T1IKPiAtZm9yIGFzX2RpciBpbiAkUEFUSAo+IC1kbwo+IC0gIElGUz0kYXNfc2F2ZV9JRlMKPiAt
ICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+IC0gICAgZm9yIGFjX3Byb2cgaW4gc2Vk
IGdzZWQ7IGRvCj4gLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0
ZW5zaW9uczsgZG8KPiAtICAgICAgYWNfcGF0aF9TRUQ9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhl
Y19leHQiCj4gLSAgICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfU0VEIiAmJiAkYXNfdGVzdF94ICIk
YWNfcGF0aF9TRUQiOyB9IHx8IGNvbnRpbnVlCj4gLSMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX1NF
RCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgo+IC0gICMgQ2hlY2sgZm9yIEdOVSAkYWNf
cGF0aF9TRUQKPiAtY2FzZSBgIiRhY19wYXRoX1NFRCIgLS12ZXJzaW9uIDI+JjFgIGluCj4gLSpH
TlUqKQo+IC0gIGFjX2N2X3BhdGhfU0VEPSIkYWNfcGF0aF9TRUQiIGFjX3BhdGhfU0VEX2ZvdW5k
PTo7Owo+IC0qKQo+IC0gIGFjX2NvdW50PTAKPiAtICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJj
b25mdGVzdC5pbiIKPiAtICB3aGlsZSA6Cj4gLSAgZG8KPiAtICAgIGNhdCAiY29uZnRlc3QuaW4i
ICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCj4gLSAgICBtdiAiY29uZnRlc3QudG1wIiAi
Y29uZnRlc3QuaW4iCj4gLSAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKPiAtICAg
ICRhc19lY2hvICcnID4+ICJjb25mdGVzdC5ubCIKPiAtICAgICIkYWNfcGF0aF9TRUQiIC1mIGNv
bmZ0ZXN0LnNlZCA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8
IGJyZWFrCj4gLSAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVs
bCAyPiYxIHx8IGJyZWFrCj4gLSAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2Nv
dW50PSRhc192YWwKPiAtICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfU0VEX21h
eC0wfTsgdGhlbgo+IC0gICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBs
b29raW5nIGZvciBhIGJldHRlciBvbmUKPiAtICAgICAgYWNfY3ZfcGF0aF9TRUQ9IiRhY19wYXRo
X1NFRCIKPiAtICAgICAgYWNfcGF0aF9TRURfbWF4PSRhY19jb3VudAo+IC0gICAgZmkKPiAtICAg
ICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKPiAtICAg
IHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhawo+IC0gIGRvbmUKPiAtICBybSAtZiBjb25m
dGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKPiAtZXNhYwo+
IAo+IC0gICAgICAkYWNfcGF0aF9TRURfZm91bmQgJiYgYnJlYWsgMwo+IC0gICAgZG9uZQo+IC0g
IGRvbmUKPiAtICBkb25lCj4gLUlGUz0kYXNfc2F2ZV9JRlMKPiAtICBpZiB0ZXN0IC16ICIkYWNf
Y3ZfcGF0aF9TRUQiOyB0aGVuCj4gLSAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBz
ZWQgY291bGQgYmUgZm91bmQgaW4gXCRQQVRIIiAiJExJTkVOTyIgNQo+IC0gIGZpCj4gLWVsc2UK
PiAtICBhY19jdl9wYXRoX1NFRD0kU0VECj4gLWZpCj4gCj4gLWZpCj4gLXsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9TRUQiID4mNQo+
IC0kYXNfZWNobyAiJGFjX2N2X3BhdGhfU0VEIiA+JjY7IH0KPiAtIFNFRD0iJGFjX2N2X3BhdGhf
U0VEIgo+IC0gIHJtIC1mIGNvbmZ0ZXN0LnNlZAo+ICsjIFdlIGRlZmluZSwgc2VwYXJhdGVseSwg
UFRIUkVBRF9DRkxBR1MsIF9MREZMQUdTIGFuZCBfTElCUwo+ICsjIGV2ZW4gdGhvdWdoIGN1cnJl
bnRseSB3ZSBkb24ndCBzZXQgdGhlbSB2ZXJ5IHNlcGFyYXRlbHkuCj4gKyMgVGhpcyBtZWFucyB0
aGF0IHRoZSBtYWtlZmlsZXMgd2lsbCBub3QgbmVlZCB0byBjaGFuZ2UgaW4KPiArIyB0aGUgZnV0
dXJlIGlmIHdlIG1ha2UgdGhlIHRlc3QgbW9yZSBzb3BoaXN0aWNhdGVkLgo+IAo+IC1hY19leHQ9
Ywo+IC1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwo+IC1hY19jb21waWxlPSckQ0MgLWMgJENGTEFH
UyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCj4gLWFjX2xpbms9JyRDQyAtbyBjb25m
dGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4
dCAkTElCUyA+JjUnCj4gLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKPiAt
aWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgo+IC0gICMgRXh0cmFjdCB0aGUgZmly
c3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFt
IG5hbWUgd2l0aCBhcmdzLgo+IC1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dv
cmQ9JDIKPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2lu
ZyBmb3IgJGFjX3dvcmQiID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQu
Li4gIiA+JjY7IH0KPiAtaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVu
IDoKPiAtICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgo+IC1lbHNlCj4gLSAgaWYgdGVzdCAt
biAiJENDIjsgdGhlbgo+IC0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3Zl
cnJpZGUgdGhlIHRlc3QuCj4gLWVsc2UKPiAtYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NF
UEFSQVRPUgo+IC1mb3IgYXNfZGlyIGluICRQQVRICj4gLWRvCj4gLSAgSUZTPSRhc19zYXZlX0lG
Uwo+IC0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCj4gLSAgICBmb3IgYWNfZXhlY19l
eHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KPiAtICBpZiB7IHRlc3QgLWYg
IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFj
X3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCj4gLSAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rv
b2xfcHJlZml4fWdjYyIKPiAtICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQo+IC0gICAgYnJlYWsg
Mgo+IC0gIGZpCj4gLWRvbmUKPiAtICBkb25lCj4gLUlGUz0kYXNfc2F2ZV9JRlMKPiAKPiAtZmkK
PiAtZmkKPiAtQ0M9JGFjX2N2X3Byb2dfQ0MKPiAtaWYgdGVzdCAtbiAiJENDIjsgdGhlbgo+IC0g
IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4m
NQo+IC0kYXNfZWNobyAiJENDIiA+JjY7IH0KPiAtZWxzZQo+IC0gIHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Cj4gLSRhc19lY2hvICJubyIg
PiY2OyB9Cj4gLWZpCj4gCj4gKyMgV2UgaW52b2tlIEFYX1BUSFJFQURfVkFSUyB3aXRoIHRoZSBu
YW1lIG9mIGFub3RoZXIgbWFjcm8KPiArIyB3aGljaCBpcyB0aGVuIGV4cGFuZGVkIG9uY2UgZm9y
IGVhY2ggdmFyaWFibGUuCj4gCj4gLWZpCj4gLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0NDIjsg
dGhlbgo+IC0gIGFjX2N0X0NDPSRDQwo+IC0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAi
Z2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KPiAtc2V0IGR1bW15
IGdjYzsgYWNfd29yZD0kMgo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5nIGZv
ciAkYWNfd29yZC4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mr
c2V0fSIgPSBzZXQ7IHRoZW4gOgo+IC0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gLWVs
c2UKPiAtICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCj4gLSAgYWNfY3ZfcHJvZ19hY19j
dF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KPiAtZWxz
ZQo+IC1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCj4gLWZvciBhc19kaXIg
aW4gJFBBVEgKPiAtZG8KPiAtICBJRlM9JGFzX3NhdmVfSUZTCj4gLSAgdGVzdCAteiAiJGFzX2Rp
ciIgJiYgYXNfZGlyPS4KPiAtICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJs
ZV9leHRlbnNpb25zOyBkbwo+IC0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19l
eGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07
IHRoZW4KPiAtICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKPiAtICAgICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhl
Y19leHQiID4mNQo+IC0gICAgYnJlYWsgMgo+IC0gIGZpCj4gLWRvbmUKPiAtICBkb25lCj4gLUlG
Uz0kYXNfc2F2ZV9JRlMKPiAKPiAtZmkKPiAtZmkKPiAtYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNf
Y3RfQ0MKPiAtaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgo+IC0gIHsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQo+IC0kYXNf
ZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KPiAtZWxzZQo+IC0gIHsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Cj4gLSRhc19lY2hvICJubyIgPiY2
OyB9Cj4gLWZpCj4gCj4gLSAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCj4gLSAgICBD
Qz0iIgo+IC0gIGVsc2UKPiAtICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJu
ZWQgaW4KPiAteWVzOikKPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBs
ZXQiID4mNQo+IC0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBu
b3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Cj4gLWFjX3Rvb2xfd2FybmVkPXll
cyA7Owo+IC1lc2FjCj4gLSAgICBDQz0kYWNfY3RfQ0MKPiAtICBmaQo+IC1lbHNlCj4gLSAgQ0M9
IiRhY19jdl9wcm9nX0NDIgo+IC1maQo+IAo+IC1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCj4gLSAg
ICAgICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCj4gLSAgICAjIEV4dHJh
Y3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2MiLCBzbyBpdCBjYW4gYmUg
YSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgo+IC1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1j
YzsgYWNfd29yZD0kMgo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAk
YWNfd29yZC4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBz
ZXQ7IHRoZW4gOgo+IC0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gLWVsc2UKPiAtICBp
ZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCj4gLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUg
dXNlciBvdmVycmlkZSB0aGUgdGVzdC4KPiAtZWxzZQo+IC1hc19zYXZlX0lGUz0kSUZTOyBJRlM9
JFBBVEhfU0VQQVJBVE9SCj4gLWZvciBhc19kaXIgaW4gJFBBVEgKPiAtZG8KPiAtICBJRlM9JGFz
X3NhdmVfSUZTCj4gLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KPiAtICAgIGZvciBh
Y19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwo+IC0gIGlmIHsg
dGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFz
X2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KPiAtICAgIGFjX2N2X3Byb2dfQ0M9
IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCj4gLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKPiAtICAg
IGJyZWFrIDIKPiAtICBmaQo+IC1kb25lCj4gLSAgZG9uZQo+IC1JRlM9JGFzX3NhdmVfSUZTCj4g
Cj4gLWZpCj4gLWZpCj4gLUNDPSRhY19jdl9wcm9nX0NDCj4gLWlmIHRlc3QgLW4gIiRDQyI7IHRo
ZW4KPiAtICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDog
JENDIiA+JjUKPiAtJGFzX2VjaG8gIiRDQyIgPiY2OyB9Cj4gLWVsc2UKPiAtICB7ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQo+IC0kYXNfZWNo
byAibm8iID4mNjsgfQo+IC1maQo+IAo+IAo+IC0gIGZpCj4gLWZpCj4gLWlmIHRlc3QgLXogIiRD
QyI7IHRoZW4KPiAtICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2Fu
IGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KPiAtc2V0IGR1bW15IGNjOyBhY193b3JkPSQy
Cj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9y
ICRhY193b3JkIiA+JjUKPiAtJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIg
PiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbiA6Cj4g
LSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAtZWxzZQo+IC0gIGlmIHRlc3QgLW4gIiRD
QyI7IHRoZW4KPiAtICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRl
IHRoZSB0ZXN0Lgo+IC1lbHNlCj4gLSAgYWNfcHJvZ19yZWplY3RlZD1ubwo+IC1hc19zYXZlX0lG
Uz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCj4gLWZvciBhc19kaXIgaW4gJFBBVEgKPiAtZG8K
PiAtICBJRlM9JGFzX3NhdmVfSUZTCj4gLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4K
PiAtICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBk
bwo+IC0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFz
X3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KPiAtICAgIGlm
IHRlc3QgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhl
bgo+IC0gICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKPiAtICAgICAgIGNvbnRpbnVlCj4gLSAg
ICAgZmkKPiAtICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgo+IC0gICAgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIg
PiY1Cj4gLSAgICBicmVhayAyCj4gLSAgZmkKPiAtZG9uZQo+IC0gIGRvbmUKPiAtSUZTPSRhc19z
YXZlX0lGUwo+IAo+IC1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCj4gLSAg
IyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNl
IGl0Lgo+IC0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwo+IC0gIHNoaWZ0Cj4gLSAgaWYgdGVz
dCAkIyAhPSAwOyB0aGVuCj4gLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZy
b20gdGhlIGJvZ3VzIG9uZS4KPiAtICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2Vu
YW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KPiAtICAgICMgZmlyc3QgaWYgd2Ugc2V0
IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgo+IC0gICAg
c2hpZnQKPiAtICAgIGFjX2N2X3Byb2dfQ0M9IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRAIgo+
IC0gIGZpCj4gLWZpCj4gLWZpCj4gLWZpCj4gLUNDPSRhY19jdl9wcm9nX0NDCj4gLWlmIHRlc3Qg
LW4gIiRDQyI7IHRoZW4KPiAtICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IHJlc3VsdDogJENDIiA+JjUKPiAtJGFzX2VjaG8gIiRDQyIgPiY2OyB9Cj4gLWVsc2UKPiAt
ICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4m
NQo+IC0kYXNfZWNobyAibm8iID4mNjsgfQo+ICsjIEVuYWJsZS9kaXNhYmxlIG9wdGlvbnMKPiAr
Cj4gKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1naXRodHRwIHdhcyBnaXZlbi4KPiAraWYgdGVz
dCAiJHtlbmFibGVfZ2l0aHR0cCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gKyAgZW5hYmxldmFsPSRl
bmFibGVfZ2l0aHR0cDsKPiAgZmkKPiAKPiAKPiAtZmkKPiAtaWYgdGVzdCAteiAiJENDIjsgdGhl
bgo+IC0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KPiAtICBmb3IgYWNfcHJv
ZyBpbiBjbC5leGUKPiAtICBkbwo+IC0gICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIk
YWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRo
IGFyZ3MuCj4gLXNldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgo+
IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAk
YWNfd29yZCIgPiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4m
NjsgfQo+IC1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+IC0g
ICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gLWVsc2UKPiAtICBpZiB0ZXN0IC1uICIkQ0Mi
OyB0aGVuCj4gLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0
aGUgdGVzdC4KPiAtZWxzZQo+IC1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9S
Cj4gLWZvciBhc19kaXIgaW4gJFBBVEgKPiAtZG8KPiAtICBJRlM9JGFzX3NhdmVfSUZTCj4gLSAg
dGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KPiAtICAgIGZvciBhY19leGVjX2V4dCBpbiAn
JyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwo+IC0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rp
ci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRh
Y19leGVjX2V4dCI7IH07IHRoZW4KPiAtICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZp
eCRhY19wcm9nIgo+IC0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
Zm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Cj4gLSAgICBicmVhayAyCj4g
LSAgZmkKPiAtZG9uZQo+IC0gIGRvbmUKPiAtSUZTPSRhc19zYXZlX0lGUwo+ICtpZiB0ZXN0ICJ4
JGVuYWJsZV9naXRodHRwIiA9ICJ4bm8iOyB0aGVuIDoKPiAKPiAtZmkKPiAtZmkKPiAtQ0M9JGFj
X2N2X3Byb2dfQ0MKPiAtaWYgdGVzdCAtbiAiJENDIjsgdGhlbgo+IC0gIHsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQo+IC0kYXNfZWNobyAi
JENDIiA+JjY7IH0KPiAtZWxzZQo+IC0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogcmVzdWx0OiBubyIgPiY1Cj4gLSRhc19lY2hvICJubyIgPiY2OyB9Cj4gLWZpCj4g
KyAgICBheF9jdl9naXRodHRwPSJuIgo+IAo+ICtlbGlmIHRlc3QgIngkZW5hYmxlX2dpdGh0dHAi
ID0gInh5ZXMiOyB0aGVuIDoKPiAKPiAtICAgIHRlc3QgLW4gIiRDQyIgJiYgYnJlYWsKPiAtICBk
b25lCj4gLWZpCj4gLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KPiAtICBhY19jdF9DQz0kQ0MKPiAt
ICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKPiAtZG8KPiAtICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdv
cmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4K
PiAtc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCj4gLXsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKPiAtJGFzX2Vj
aG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNf
Y3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbiA6Cj4gLSAgJGFzX2VjaG9fbiAiKGNh
Y2hlZCkgIiA+JjYKPiAtZWxzZQo+IC0gIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KPiAt
ICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRl
IHRoZSB0ZXN0Lgo+IC1lbHNlCj4gLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFU
T1IKPiAtZm9yIGFzX2RpciBpbiAkUEFUSAo+IC1kbwo+IC0gIElGUz0kYXNfc2F2ZV9JRlMKPiAt
ICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+IC0gICAgZm9yIGFjX2V4ZWNfZXh0IGlu
ICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gLSAgaWYgeyB0ZXN0IC1mICIkYXNf
ZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3Jk
JGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+IC0gICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3By
b2ciCj4gLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAk
YXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKPiAtICAgIGJyZWFrIDIKPiAtICBmaQo+
IC1kb25lCj4gLSAgZG9uZQo+IC1JRlM9JGFzX3NhdmVfSUZTCj4gKyAgICBheF9jdl9naXRodHRw
PSJ5Igo+ICsKPiArZWxpZiB0ZXN0IC16ICRheF9jdl9naXRodHRwOyB0aGVuIDoKPiArCj4gKyAg
ICBheF9jdl9naXRodHRwPSJuIgo+IAo+ICBmaQo+IC1maQo+IC1hY19jdF9DQz0kYWNfY3ZfcHJv
Z19hY19jdF9DQwo+IC1pZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCj4gLSAgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1Cj4g
LSRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQo+IC1lbHNlCj4gLSAgeyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKPiAtJGFzX2VjaG8gIm5v
IiA+JjY7IH0KPiAtZmkKPiArZ2l0aHR0cD0kYXhfY3ZfZ2l0aHR0cAo+IAo+IAo+IC0gIHRlc3Qg
LW4gIiRhY19jdF9DQyIgJiYgYnJlYWsKPiAtZG9uZQo+IAo+IC0gIGlmIHRlc3QgIngkYWNfY3Rf
Q0MiID0geDsgdGhlbgo+IC0gICAgQ0M9IiIKPiAtICBlbHNlCj4gLSAgICBjYXNlICRjcm9zc19j
b21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCj4gLXllczopCj4gLXsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHBy
ZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKPiAtJGFzX2VjaG8gIiRhc19tZTogV0FSTklO
RzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7
fQo+IC1hY190b29sX3dhcm5lZD15ZXMgOzsKPiAtZXNhYwo+IC0gICAgQ0M9JGFjX2N0X0NDCj4g
LSAgZmkKPiArIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1vbml0b3JzIHdhcyBnaXZlbi4KPiAr
aWYgdGVzdCAiJHtlbmFibGVfbW9uaXRvcnMrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICsgIGVuYWJs
ZXZhbD0kZW5hYmxlX21vbml0b3JzOwo+ICBmaQo+IAo+IC1maQo+IAo+ICtpZiB0ZXN0ICJ4JGVu
YWJsZV9tb25pdG9ycyIgPSAieG5vIjsgdGhlbiA6Cj4gCj4gLXRlc3QgLXogIiRDQyIgJiYgeyB7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19w
d2QnOiIgPiY1Cj4gLSRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYy
O30KPiAtYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBc
JFBBVEgKPiAtU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUg
OyB9Cj4gKyAgICBheF9jdl9tb25pdG9ycz0ibiIKPiAKPiAtIyBQcm92aWRlIHNvbWUgaW5mb3Jt
YXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgo+IC0kYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKPiAtc2V0IFgg
JGFjX2NvbXBpbGUKPiAtYWNfY29tcGlsZXI9JDIKPiAtZm9yIGFjX29wdGlvbiBpbiAtLXZlcnNp
b24gLXYgLVYgLXF2ZXJzaW9uOyBkbwo+IC0gIHsgeyBhY190cnk9IiRhY19jb21waWxlciAkYWNf
b3B0aW9uID4mNSIKPiAtY2FzZSAiKCgkYWNfdHJ5IiBpbgo+IC0gICpcIiogfCAqXGAqIHwgKlxc
KikgYWNfdHJ5X2VjaG89XCRhY190cnk7Owo+IC0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7Owo+
IC1lc2FjCj4gLWV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogJGFjX3RyeV9lY2hvXCIiCj4gLSRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQo+IC0g
IChldmFsICIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiKSAyPmNvbmZ0ZXN0LmVycgo+IC0g
IGFjX3N0YXR1cz0kPwo+IC0gIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCj4gLSAgICBz
ZWQgJzEwYVwKPiAtLi4uIHJlc3Qgb2Ygc3RkZXJyIG91dHB1dCBkZWxldGVkIC4uLgo+IC0gICAg
ICAgICAxMHEnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCj4gLSAgICBjYXQgY29uZnRlc3Qu
ZXIxID4mNQo+IC0gIGZpCj4gLSAgcm0gLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgo+IC0g
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMi
ID4mNQo+IC0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KPiAtZG9uZQo+ICtlbGlmIHRlc3QgIngk
ZW5hYmxlX21vbml0b3JzIiA9ICJ4eWVzIjsgdGhlbiA6Cj4gCj4gLXsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhl
IEdOVSBDIGNvbXBpbGVyIiA+JjUKPiAtJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBh
cmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNf
Y3ZfY19jb21waWxlcl9nbnUrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+IC0gICRhc19lY2hvX24gIihj
YWNoZWQpICIgPiY2Cj4gLWVsc2UKPiAtICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25m
dGVzdC4kYWNfZXh0Cj4gLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KPiArICAgIGF4X2N2X21vbml0
b3JzPSJ5Igo+IAo+IC1pbnQKPiAtbWFpbiAoKQo+IC17Cj4gLSNpZm5kZWYgX19HTlVDX18KPiAt
ICAgICAgIGNob2tlIG1lCj4gLSNlbmRpZgo+ICtlbGlmIHRlc3QgLXogJGF4X2N2X21vbml0b3Jz
OyB0aGVuIDoKPiAKPiAtICA7Cj4gLSAgcmV0dXJuIDA7Cj4gLX0KPiAtX0FDRU9GCj4gLWlmIGFj
X2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKPiAtICBhY19jb21waWxlcl9nbnU9
eWVzCj4gLWVsc2UKPiAtICBhY19jb21waWxlcl9nbnU9bm8KPiAtZmkKPiAtcm0gLWYgY29yZSBj
b25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cj4gLWFjX2N2
X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKPiArICAgIGF4X2N2X21vbml0b3JzPSJ5
Igo+IAo+ICBmaQo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJl
c3VsdDogJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjUKPiAtJGFzX2VjaG8gIiRhY19jdl9jX2Nv
bXBpbGVyX2dudSIgPiY2OyB9Cj4gLWlmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhl
bgo+IC0gIEdDQz15ZXMKPiAtZWxzZQo+IC0gIEdDQz0KPiAtZmkKPiAtYWNfdGVzdF9DRkxBR1M9
JHtDRkxBR1Mrc2V0fQo+IC1hY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCj4gLXsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAt
ZyIgPiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4g
IiA+JjY7IH0KPiAtaWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2crc2V0fSIgPSBzZXQ7IHRoZW4g
Ogo+IC0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gLWVsc2UKPiAtICBhY19zYXZlX2Nf
d2Vycm9yX2ZsYWc9JGFjX2Nfd2Vycm9yX2ZsYWcKPiAtICAgYWNfY193ZXJyb3JfZmxhZz15ZXMK
PiAtICAgYWNfY3ZfcHJvZ19jY19nPW5vCj4gLSAgIENGTEFHUz0iLWciCj4gLSAgIGNhdCBjb25m
ZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKPiAtLyogZW5kIGNvbmZkZWZzLmgu
ICAqLwo+ICttb25pdG9ycz0kYXhfY3ZfbW9uaXRvcnMKPiAKPiAtaW50Cj4gLW1haW4gKCkKPiAt
ewo+IAo+IC0gIDsKPiAtICByZXR1cm4gMDsKPiAtfQo+IC1fQUNFT0YKPiAtaWYgYWNfZm5fY190
cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgo+IC0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKPiAt
ZWxzZQo+IC0gIENGTEFHUz0iIgo+IC0gICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5j
b25mdGVzdC4kYWNfZXh0Cj4gLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KPiAKPiAtaW50Cj4gLW1h
aW4gKCkKPiAtewo+ICsjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdnRwbSB3YXMgZ2l2ZW4uCj4g
K2lmIHRlc3QgIiR7ZW5hYmxlX3Z0cG0rc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICsgIGVuYWJsZXZh
bD0kZW5hYmxlX3Z0cG07Cj4gK2ZpCj4gCj4gLSAgOwo+IC0gIHJldHVybiAwOwo+IC19Cj4gLV9B
Q0VPRgo+IC1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Cj4gCj4gLWVs
c2UKPiAtICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKPiAtICAgICAg
ICBDRkxBR1M9Ii1nIgo+IC0gICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0
ZXN0LiRhY19leHQKPiAtLyogZW5kIGNvbmZkZWZzLmguICAqLwo+ICtpZiB0ZXN0ICJ4JGVuYWJs
ZV92dHBtIiA9ICJ4bm8iOyB0aGVuIDoKPiAKPiAtaW50Cj4gLW1haW4gKCkKPiAtewo+ICsgICAg
YXhfY3ZfdnRwbT0ibiIKPiArCj4gK2VsaWYgdGVzdCAieCRlbmFibGVfdnRwbSIgPSAieHllcyI7
IHRoZW4gOgo+ICsKPiArICAgIGF4X2N2X3Z0cG09InkiCj4gKwo+ICtlbGlmIHRlc3QgLXogJGF4
X2N2X3Z0cG07IHRoZW4gOgo+ICsKPiArICAgIGF4X2N2X3Z0cG09Im4iCj4gCj4gLSAgOwo+IC0g
IHJldHVybiAwOwo+IC19Cj4gLV9BQ0VPRgo+IC1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElO
RU5PIjsgdGhlbiA6Cj4gLSAgYWNfY3ZfcHJvZ19jY19nPXllcwo+IC1maQo+IC1ybSAtZiBjb3Jl
IGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKPiAtZmkK
PiAtcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4k
YWNfZXh0Cj4gLWZpCj4gLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpl
eHQgY29uZnRlc3QuJGFjX2V4dAo+IC0gICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vy
cm9yX2ZsYWcKPiAtZmkKPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQo+IC0kYXNfZWNobyAiJGFjX2N2X3Byb2df
Y2NfZyIgPiY2OyB9Cj4gLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KPiAt
ICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCj4gLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0g
eWVzOyB0aGVuCj4gLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KPiAtICAgIENGTEFHUz0i
LWcgLU8yIgo+IC0gIGVsc2UKPiAtICAgIENGTEFHUz0iLWciCj4gLSAgZmkKPiAtZWxzZQo+IC0g
IGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCj4gLSAgICBDRkxBR1M9Ii1PMiIKPiAtICBlbHNl
Cj4gLSAgICBDRkxBR1M9Cj4gLSAgZmkKPiAgZmkKPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4
OSIgPiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJ
U08gQzg5Li4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19jODkrc2V0fSIg
PSBzZXQ7IHRoZW4gOgo+IC0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gLWVsc2UKPiAt
ICBhY19jdl9wcm9nX2NjX2M4OT1ubwo+IC1hY19zYXZlX0NDPSRDQwo+IC1jYXQgY29uZmRlZnMu
aCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Cj4gLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8K
PiAtI2luY2x1ZGUgPHN0ZGFyZy5oPgo+IC0jaW5jbHVkZSA8c3RkaW8uaD4KPiAtI2luY2x1ZGUg
PHN5cy90eXBlcy5oPgo+IC0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KPiAtLyogTW9zdCBvZiB0aGUg
Zm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAq
Lwo+IC1zdHJ1Y3QgYnVmIHsgaW50IHg7IH07Cj4gLUZJTEUgKiAoKnJjc29wZW4pIChzdHJ1Y3Qg
YnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7Cj4gLXN0YXRpYyBjaGFyICplIChwLCBpKQo+IC0g
ICAgIGNoYXIgKipwOwo+IC0gICAgIGludCBpOwo+IC17Cj4gLSAgcmV0dXJuIHBbaV07Cj4gLX0K
PiAtc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwg
Li4uKQo+IC17Cj4gLSAgY2hhciAqczsKPiAtICB2YV9saXN0IHY7Cj4gLSAgdmFfc3RhcnQgKHYs
cCk7Cj4gLSAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKPiAtICB2YV9lbmQgKHYpOwo+IC0g
IHJldHVybiBzOwo+IC19Cj4gK3Z0cG09JGF4X2N2X3Z0cG0KPiAKPiAtLyogT1NGIDQuMCBDb21w
YXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMKPiAt
ICAgZnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgc3R1ZmYsIGJ1dCBub3QgJ1x4SEgnIGhleCBjaGFy
YWN0ZXIgY29uc3RhbnRzLgo+IC0gICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9yIHVuZm9y
dHVuYXRlbHksIGluc3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKPiAtICAgYXMgJ3gnLiAgVGhl
IGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkIGlzIGFkZGVkIHRvIGdldAo+
IC0gICBwcm9wZXIgQU5TSSBtb2RlLiAgQ3VyaW91c2x5ICdceDAwJyE9J3gnIGFsd2F5cyBjb21l
cyBvdXQgdHJ1ZSwgZm9yIGFuCj4gLSAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vz
c2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZwo+IC0gICB0aGF0J3MgdHJ1
ZSBvbmx5IHdpdGggLXN0ZC4gICovCj4gLWludCBvc2Y0X2NjX2FycmF5IFsnXHgwMCcgPT0gMCA/
IDEgOiAtMV07Cj4gCj4gLS8qIElCTSBDIDYgZm9yIEFJWCBpcyBhbG1vc3QtQU5TSSBieSBkZWZh
dWx0LCBidXQgaXQgcmVwbGFjZXMgbWFjcm8gcGFyYW1ldGVycwo+IC0gICBpbnNpZGUgc3RyaW5n
cyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4gICovCj4gLSNkZWZpbmUgRk9PKHgpICd4Jwo+IC1p
bnQgeGxjNl9jY19hcnJheVtGT08oYSkgPT0gJ3gnID8gMSA6IC0xXTsKPiAKPiAtaW50IHRlc3Qg
KGludCBpLCBkb3VibGUgeCk7Cj4gLXN0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9Owo+IC1z
dHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKPiAtaW50IHBhaXJuYW1lcyAoaW50LCBj
aGFyICoqLCBGSUxFICooKikoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpLCBpbnQs
IGludCk7Cj4gLWludCBhcmdjOwo+IC1jaGFyICoqYXJndjsKPiAtaW50Cj4gLW1haW4gKCkKPiAt
ewo+IC1yZXR1cm4gZiAoZSwgYXJndiwgMCkgIT0gYXJndlswXSAgfHwgIGYgKGUsIGFyZ3YsIDEp
ICE9IGFyZ3ZbMV07Cj4gLSAgOwo+IC0gIHJldHVybiAwOwo+IC19Cj4gLV9BQ0VPRgo+IC1mb3Ig
YWNfYXJnIGluICcnIC1xbGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBcCj4gLSAg
ICAgICAtQWUgIi1BYSAtRF9IUFVYX1NPVVJDRSIgIi1YYyAtRF9fRVhURU5TSU9OU19fIgo+IC1k
bwo+IC0gIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgo+IC0gIGlmIGFjX2ZuX2NfdHJ5X2NvbXBp
bGUgIiRMSU5FTk8iOyB0aGVuIDoKPiAtICBhY19jdl9wcm9nX2NjX2M4OT0kYWNfYXJnCj4gKyMg
Q2hlY2sgd2hldGhlciAtLWVuYWJsZS14ZW5hcGkgd2FzIGdpdmVuLgo+ICtpZiB0ZXN0ICIke2Vu
YWJsZV94ZW5hcGkrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICsgIGVuYWJsZXZhbD0kZW5hYmxlX3hl
bmFwaTsKPiAgZmkKPiAtcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4
dAo+IC0gIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9ICJ4bm8iICYmIGJyZWFrCj4gLWRv
bmUKPiAtcm0gLWYgY29uZnRlc3QuJGFjX2V4dAo+IC1DQz0kYWNfc2F2ZV9DQwo+ICsKPiArCj4g
K2lmIHRlc3QgIngkZW5hYmxlX3hlbmFwaSIgPSAieG5vIjsgdGhlbiA6Cj4gKwo+ICsgICAgYXhf
Y3ZfeGVuYXBpPSJuIgo+ICsKPiArZWxpZiB0ZXN0ICJ4JGVuYWJsZV94ZW5hcGkiID0gInh5ZXMi
OyB0aGVuIDoKPiArCj4gKyAgICBheF9jdl94ZW5hcGk9InkiCj4gKwo+ICtlbGlmIHRlc3QgLXog
JGF4X2N2X3hlbmFwaTsgdGhlbiA6Cj4gKwo+ICsgICAgYXhfY3ZfeGVuYXBpPSJuIgo+IAo+ICBm
aQo+IC0jIEFDX0NBQ0hFX1ZBTAo+IC1jYXNlICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiBpbgo+IC0g
IHgpCj4gLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogbm9uZSBuZWVkZWQiID4mNQo+IC0kYXNfZWNobyAibm9uZSBuZWVkZWQiID4mNjsgfSA7Owo+
IC0gIHhubykKPiAtICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiB1bnN1cHBvcnRlZCIgPiY1Cj4gLSRhc19lY2hvICJ1bnN1cHBvcnRlZCIgPiY2OyB9
IDs7Cj4gLSAgKikKPiAtICAgIENDPSIkQ0MgJGFjX2N2X3Byb2dfY2NfYzg5Igo+IC0gICAgeyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9n
X2NjX2M4OSIgPiY1Cj4gLSRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19jODkiID4mNjsgfSA7Owo+
IC1lc2FjCj4gLWlmIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9IHhubzsgdGhlbiA6Cj4g
K3hlbmFwaT0kYXhfY3ZfeGVuYXBpCj4gKwo+IAo+ICsKPiArIyBDaGVjayB3aGV0aGVyIC0tZW5h
YmxlLXB5dGhvbnRvb2xzIHdhcyBnaXZlbi4KPiAraWYgdGVzdCAiJHtlbmFibGVfcHl0aG9udG9v
bHMrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICsgIGVuYWJsZXZhbD0kZW5hYmxlX3B5dGhvbnRvb2xz
Owo+ICBmaQo+IAo+IC1hY19leHQ9Ywo+IC1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwo+IC1hY19j
b21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCj4g
LWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExE
RkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCj4gLWFjX2NvbXBpbGVyX2dudT0kYWNf
Y3ZfY19jb21waWxlcl9nbnUKPiAKPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKPiAtJGFzX2VjaG9fbiAi
Y2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3Jrcy4uLiAiID4mNjsgfQo+IC1MTl9TPSRhc19sbl9z
Cj4gLWlmIHRlc3QgIiRMTl9TIiA9ICJsbiAtcyI7IHRoZW4KPiAtICB7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKPiAtJGFzX2VjaG8gInll
cyIgPiY2OyB9Cj4gLWVsc2UKPiAtICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IHJlc3VsdDogbm8sIHVzaW5nICRMTl9TIiA+JjUKPiAtJGFzX2VjaG8gIm5vLCB1c2lu
ZyAkTE5fUyIgPiY2OyB9Cj4gK2lmIHRlc3QgIngkZW5hYmxlX3B5dGhvbnRvb2xzIiA9ICJ4bm8i
OyB0aGVuIDoKPiArCj4gKyAgICBheF9jdl9weXRob250b29scz0ibiIKPiArCj4gK2VsaWYgdGVz
dCAieCRlbmFibGVfcHl0aG9udG9vbHMiID0gInh5ZXMiOyB0aGVuIDoKPiArCj4gKyAgICBheF9j
dl9weXRob250b29scz0ieSIKPiArCj4gK2VsaWYgdGVzdCAteiAkYXhfY3ZfcHl0aG9udG9vbHM7
IHRoZW4gOgo+ICsKPiArICAgIGF4X2N2X3B5dGhvbnRvb2xzPSJ5Igo+ICsKPiAgZmkKPiArcHl0
aG9udG9vbHM9JGF4X2N2X3B5dGhvbnRvb2xzCj4gCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChN
QUtFKSIgPiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNl
dHMgXCQoTUFLRSkuLi4gIiA+JjY7IH0KPiAtc2V0IHggJHtNQUtFLW1ha2V9Cj4gLWFjX21ha2U9
YCRhc19lY2hvICIkMiIgfCBzZWQgJ3MvKy9wL2c7IHMvW15hLXpBLVowLTlfXS9fL2cnYAo+IC1p
ZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0K3NldH1cIiIg
PSBzZXQ7IHRoZW4gOgo+IC0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gLWVsc2UKPiAt
ICBjYXQgPmNvbmZ0ZXN0Lm1ha2UgPDxcX0FDRU9GCj4gLVNIRUxMID0gL2Jpbi9zaAo+IC1hbGw6
Cj4gLSAgICAgICBAZWNobyAnQEBAJSUlPSQoTUFLRSk9QEBAJSUlJwo+IC1fQUNFT0YKPiAtIyBH
TlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZyAuLi4iLCB3aGljaCB3
b3VsZCBjb25mdXNlIHVzLgo+IC1jYXNlIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3QubWFrZSAy
Pi9kZXYvbnVsbGAgaW4KPiAtICAqQEBAJSUlPT8qPUBAQCUlJSopCj4gLSAgICBldmFsIGFjX2N2
X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7Owo+IC0gICopCj4gLSAgICBldmFsIGFjX2N2
X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubzs7Cj4gLWVzYWMKPiAtcm0gLWYgY29uZnRlc3Qu
bWFrZQo+ICsKPiArCj4gKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1vY2FtbHRvb2xzIHdhcyBn
aXZlbi4KPiAraWYgdGVzdCAiJHtlbmFibGVfb2NhbWx0b29scytzZXR9IiA9IHNldDsgdGhlbiA6
Cj4gKyAgZW5hYmxldmFsPSRlbmFibGVfb2NhbWx0b29sczsKPiAgZmkKPiAtaWYgZXZhbCB0ZXN0
IFwkYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0ID0geWVzOyB0aGVuCj4gLSAgeyAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Cj4gLSRh
c19lY2hvICJ5ZXMiID4mNjsgfQo+IC0gIFNFVF9NQUtFPQo+IC1lbHNlCj4gLSAgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKPiAtJGFzX2Vj
aG8gIm5vIiA+JjY7IH0KPiAtICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCj4gKwo+ICsK
PiAraWYgdGVzdCAieCRlbmFibGVfb2NhbWx0b29scyIgPSAieG5vIjsgdGhlbiA6Cj4gKwo+ICsg
ICAgYXhfY3Zfb2NhbWx0b29scz0ibiIKPiArCj4gK2VsaWYgdGVzdCAieCRlbmFibGVfb2NhbWx0
b29scyIgPSAieHllcyI7IHRoZW4gOgo+ICsKPiArICAgIGF4X2N2X29jYW1sdG9vbHM9InkiCj4g
Kwo+ICtlbGlmIHRlc3QgLXogJGF4X2N2X29jYW1sdG9vbHM7IHRoZW4gOgo+ICsKPiArICAgIGF4
X2N2X29jYW1sdG9vbHM9InkiCj4gKwo+ICBmaQo+ICtvY2FtbHRvb2xzPSRheF9jdl9vY2FtbHRv
b2xzCj4gCj4gLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBw
cm9ncmFtIChmYXN0ZXIpLAo+IC0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVy
LiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKPiAtIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Cj4g
LSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCj4gLSMgU3VuT1MgL3Vzci9l
dGMvaW5zdGFsbAo+IC0jIElSSVggL3NiaW4vaW5zdGFsbAo+IC0jIEFJWCAvYmluL2luc3RhbGwK
PiAtIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxv
cHB5IGRpc2NzCj4gLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3
b3JrIHdpdGhvdXQgYSAtZyBmbGFnCj4gLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdo
aWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwo+IC0jIFNWUjQgL3Vzci91Y2IvaW5zdGFs
bCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCj4gLSMg
T1MvMidzIHN5c3RlbSBpbnN0YWxsLCB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBz
ZW1hbnRpYwo+IC0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQg
YnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KPiAtIyBSZWplY3QgaW5zdGFsbCBwcm9ncmFtcyB0
aGF0IGNhbm5vdCBpbnN0YWxsIG11bHRpcGxlIGZpbGVzLgo+IC17ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3Rh
bGwiID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0
YWxsLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgo+IC1pZiB0ZXN0
ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gLSAgJGFzX2VjaG9f
biAiKGNhY2hlZCkgIiA+JjYKPiAtZWxzZQo+IC0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFU
SF9TRVBBUkFUT1IKPiAtZm9yIGFzX2RpciBpbiAkUEFUSAo+IC1kbwo+IC0gIElGUz0kYXNfc2F2
ZV9JRlMKPiAtICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+IC0gICAgIyBBY2NvdW50
IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCj4g
LWNhc2UgJGFzX2Rpci8gaW4gIygoCj4gLSAgLi8gfCAuLy8gfCAvW2NDXS8qIHwgXAo+IC0gIC9l
dGMvKiB8IC91c3Ivc2Jpbi8qIHwgL3Vzci9ldGMvKiB8IC9zYmluLyogfCAvdXNyL2Fmc3dzL2Jp
bi8qIHwgXAo+IC0gID86W1xcL11vczJbXFwvXWluc3RhbGxbXFwvXSogfCA/OltcXC9dT1MyW1xc
L11JTlNUQUxMW1xcL10qIHwgXAo+IC0gIC91c3IvdWNiLyogKSA7Owo+IC0gICopCj4gLSAgICAj
IE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgo+
IC0gICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBz
dHVmZiBhcyByb290Cj4gLSAgICAjIGJ5IGRlZmF1bHQuCj4gLSAgICBmb3IgYWNfcHJvZyBpbiBn
aW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCj4gLSAgICAgIGZvciBhY19leGVjX2V4dCBpbiAn
JyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwo+IC0gICAgICAgaWYgeyB0ZXN0IC1mICIk
YXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY19w
cm9nJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+IC0gICAgICAgICBpZiB0ZXN0ICRhY19wcm9nID0g
aW5zdGFsbCAmJgo+IC0gICAgICAgICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFj
X2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KPiAtICAgICAgICAgICAjIEFJWCBpbnN0
YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCj4gLSAgICAg
ICAgICAgOgo+IC0gICAgICAgICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCj4gLSAg
ICAgICAgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2
L251bGwgMj4mMTsgdGhlbgo+IC0gICAgICAgICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxs
IHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgo+IC0gICAgICAgICAgIDoKPiAt
ICAgICAgICAgZWxzZQo+IC0gICAgICAgICAgIHJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3Qu
dHdvIGNvbmZ0ZXN0LmRpcgo+IC0gICAgICAgICAgIGVjaG8gb25lID4gY29uZnRlc3Qub25lCj4g
LSAgICAgICAgICAgZWNobyB0d28gPiBjb25mdGVzdC50d28KPiAtICAgICAgICAgICBta2RpciBj
b25mdGVzdC5kaXIKPiAtICAgICAgICAgICBpZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4
dCIgLWMgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byAiYHB3ZGAvY29uZnRlc3QuZGlyIiAmJgo+
IC0gICAgICAgICAgICAgdGVzdCAtcyBjb25mdGVzdC5vbmUgJiYgdGVzdCAtcyBjb25mdGVzdC50
d28gJiYKPiAtICAgICAgICAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0Lm9uZSAm
Jgo+IC0gICAgICAgICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3QudHdvCj4gLSAg
ICAgICAgICAgdGhlbgo+IC0gICAgICAgICAgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGly
LyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgo+IC0gICAgICAgICAgICAgYnJlYWsgMwo+IC0gICAg
ICAgICAgIGZpCj4gLSAgICAgICAgIGZpCj4gLSAgICAgICBmaQo+IC0gICAgICBkb25lCj4gLSAg
ICBkb25lCj4gLSAgICA7Owo+IC1lc2FjCj4gCj4gLSAgZG9uZQo+IC1JRlM9JGFzX3NhdmVfSUZT
Cj4gCj4gLXJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgo+ICsj
IENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWluaXRlcm0gd2FzIGdpdmVuLgo+ICtpZiB0ZXN0ICIk
e2VuYWJsZV9taW5pdGVybStzZXR9IiA9IHNldDsgdGhlbiA6Cj4gKyAgZW5hYmxldmFsPSRlbmFi
bGVfbWluaXRlcm07Cj4gK2ZpCj4gKwo+ICsKPiAraWYgdGVzdCAieCRlbmFibGVfbWluaXRlcm0i
ID0gInhubyI7IHRoZW4gOgo+ICsKPiArICAgIGF4X2N2X21pbml0ZXJtPSJuIgo+ICsKPiArZWxp
ZiB0ZXN0ICJ4JGVuYWJsZV9taW5pdGVybSIgPSAieHllcyI7IHRoZW4gOgo+ICsKPiArICAgIGF4
X2N2X21pbml0ZXJtPSJ5Igo+ICsKPiArZWxpZiB0ZXN0IC16ICRheF9jdl9taW5pdGVybTsgdGhl
biA6Cj4gKwo+ICsgICAgYXhfY3ZfbWluaXRlcm09Im4iCj4gCj4gIGZpCj4gLSAgaWYgdGVzdCAi
JHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KPiAtICAgIElOU1RBTEw9JGFj
X2N2X3BhdGhfaW5zdGFsbAo+IC0gIGVsc2UKPiAtICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNl
IHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKPiAtICAgICMgdmFsdWUgZm9y
IElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKPiAt
ICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0
b3J5IGlzCj4gLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5h
bWUuCj4gLSAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCj4gLSAgZmkKPiArbWluaXRlcm09JGF4
X2N2X21pbml0ZXJtCj4gKwo+ICsKPiArCj4gKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1sb21v
dW50IHdhcyBnaXZlbi4KPiAraWYgdGVzdCAiJHtlbmFibGVfbG9tb3VudCtzZXR9IiA9IHNldDsg
dGhlbiA6Cj4gKyAgZW5hYmxldmFsPSRlbmFibGVfbG9tb3VudDsKPiAgZmkKPiAteyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKPiAt
JGFzX2VjaG8gIiRJTlNUQUxMIiA+JjY7IH0KPiAKPiAtIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1
bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9Lgo+IC0jIEl0IHRoaW5rcyB0
aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgo+IC10
ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0n
Cj4gCj4gLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5T
VEFMTH0nCj4gK2lmIHRlc3QgIngkZW5hYmxlX2xvbW91bnQiID0gInhubyI7IHRoZW4gOgo+IAo+
IC10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0g
NjQ0Jwo+ICsgICAgYXhfY3ZfbG9tb3VudD0ibiIKPiAKPiAtIyBFeHRyYWN0IHRoZSBmaXJzdCB3
b3JkIG9mICJiaXNvbiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCj4g
LXNldCBkdW1teSBiaXNvbjsgYWNfd29yZD0kMgo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cj4gLSRhc19lY2hvX24g
ImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0ICIke2FjX2N2X3Bh
dGhfQklTT04rc2V0fSIgPSBzZXQ7IHRoZW4gOgo+IC0gICRhc19lY2hvX24gIihjYWNoZWQpICIg
PiY2Cj4gLWVsc2UKPiAtICBjYXNlICRCSVNPTiBpbgo+IC0gIFtcXC9dKiB8ID86W1xcL10qKQo+
IC0gIGFjX2N2X3BhdGhfQklTT049IiRCSVNPTiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhl
IHRlc3Qgd2l0aCBhIHBhdGguCj4gLSAgOzsKPiAtICAqKQo+IC0gIGFzX3NhdmVfSUZTPSRJRlM7
IElGUz0kUEFUSF9TRVBBUkFUT1IKPiAtZm9yIGFzX2RpciBpbiAkUEFUSAo+IC1kbwo+IC0gIElG
Uz0kYXNfc2F2ZV9JRlMKPiAtICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+IC0gICAg
Zm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gLSAg
aWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94
ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+IC0gICAgYWNfY3ZfcGF0
aF9CSVNPTj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKPiAtICAgICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhl
Y19leHQiID4mNQo+IC0gICAgYnJlYWsgMgo+IC0gIGZpCj4gLWRvbmUKPiAtICBkb25lCj4gLUlG
Uz0kYXNfc2F2ZV9JRlMKPiArZWxpZiB0ZXN0ICJ4JGVuYWJsZV9sb21vdW50IiA9ICJ4eWVzIjsg
dGhlbiA6Cj4gKwo+ICsgICAgYXhfY3ZfbG9tb3VudD0ieSIKPiArCj4gK2VsaWYgdGVzdCAteiAk
YXhfY3ZfbG9tb3VudDsgdGhlbiA6Cj4gKwo+ICsgICAgYXhfY3ZfbG9tb3VudD0ibiIKPiAKPiAt
ICA7Owo+IC1lc2FjCj4gIGZpCj4gLUJJU09OPSRhY19jdl9wYXRoX0JJU09OCj4gLWlmIHRlc3Qg
LW4gIiRCSVNPTiI7IHRoZW4KPiAtICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IHJlc3VsdDogJEJJU09OIiA+JjUKPiAtJGFzX2VjaG8gIiRCSVNPTiIgPiY2OyB9Cj4g
LWVsc2UKPiAtICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogbm8iID4mNQo+IC0kYXNfZWNobyAibm8iID4mNjsgfQo+ICtsb21vdW50PSRheF9jdl9sb21v
dW50Cj4gKwo+ICsKPiArCj4gKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1vdm1mIHdhcyBnaXZl
bi4KPiAraWYgdGVzdCAiJHtlbmFibGVfb3ZtZitzZXR9IiA9IHNldDsgdGhlbiA6Cj4gKyAgZW5h
YmxldmFsPSRlbmFibGVfb3ZtZjsKPiAgZmkKPiAKPiAKPiAtIyBFeHRyYWN0IHRoZSBmaXJzdCB3
b3JkIG9mICJmbGV4Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KPiAt
c2V0IGR1bW15IGZsZXg7IGFjX3dvcmQ9JDIKPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQo+IC0kYXNfZWNob19uICJj
aGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KPiAtaWYgdGVzdCAiJHthY19jdl9wYXRo
X0ZMRVgrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+IC0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2
Cj4gLWVsc2UKPiAtICBjYXNlICRGTEVYIGluCj4gLSAgW1xcL10qIHwgPzpbXFwvXSopCj4gLSAg
YWNfY3ZfcGF0aF9GTEVYPSIkRkxFWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qg
d2l0aCBhIHBhdGguCj4gLSAgOzsKPiAtICAqKQo+IC0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0k
UEFUSF9TRVBBUkFUT1IKPiAtZm9yIGFzX2RpciBpbiAkUEFUSAo+IC1kbwo+IC0gIElGUz0kYXNf
c2F2ZV9JRlMKPiAtICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+IC0gICAgZm9yIGFj
X2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gLSAgaWYgeyB0
ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNf
ZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+IC0gICAgYWNfY3ZfcGF0aF9GTEVY
PSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0Igo+IC0gICAgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIg
PiY1Cj4gLSAgICBicmVhayAyCj4gLSAgZmkKPiAtZG9uZQo+IC0gIGRvbmUKPiAtSUZTPSRhc19z
YXZlX0lGUwo+ICtpZiB0ZXN0ICJ4JGVuYWJsZV9vdm1mIiA9ICJ4bm8iOyB0aGVuIDoKPiArCj4g
KyAgICBheF9jdl9vdm1mPSJuIgo+ICsKPiArZWxpZiB0ZXN0ICJ4JGVuYWJsZV9vdm1mIiA9ICJ4
eWVzIjsgdGhlbiA6Cj4gKwo+ICsgICAgYXhfY3Zfb3ZtZj0ieSIKPiArCj4gK2VsaWYgdGVzdCAt
eiAkYXhfY3Zfb3ZtZjsgdGhlbiA6Cj4gKwo+ICsgICAgYXhfY3Zfb3ZtZj0ibiIKPiAKPiAtICA7
Owo+IC1lc2FjCj4gIGZpCj4gLUZMRVg9JGFjX2N2X3BhdGhfRkxFWAo+IC1pZiB0ZXN0IC1uICIk
RkxFWCI7IHRoZW4KPiAtICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IHJlc3VsdDogJEZMRVgiID4mNQo+IC0kYXNfZWNobyAiJEZMRVgiID4mNjsgfQo+IC1lbHNlCj4g
LSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+
JjUKPiAtJGFzX2VjaG8gIm5vIiA+JjY7IH0KPiArb3ZtZj0kYXhfY3Zfb3ZtZgo+ICsKPiArCj4g
Kwo+ICsjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcm9tYmlvcyB3YXMgZ2l2ZW4uCj4gK2lmIHRl
c3QgIiR7ZW5hYmxlX3JvbWJpb3Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICsgIGVuYWJsZXZhbD0k
ZW5hYmxlX3JvbWJpb3M7Cj4gIGZpCj4gCj4gCj4gLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBv
ZiAicGVybCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCj4gLXNldCBk
dW1teSBwZXJsOyBhY193b3JkPSQyCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKPiAtJGFzX2VjaG9fbiAiY2hlY2tp
bmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9QRVJM
K3NldH0iID0gc2V0OyB0aGVuIDoKPiAtICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgo+IC1l
bHNlCj4gLSAgY2FzZSAkUEVSTCBpbgo+IC0gIFtcXC9dKiB8ID86W1xcL10qKQo+IC0gIGFjX2N2
X3BhdGhfUEVSTD0iJFBFUkwiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGgg
YSBwYXRoLgo+IC0gIDs7Cj4gLSAgKikKPiAtICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhf
U0VQQVJBVE9SCj4gLWZvciBhc19kaXIgaW4gJFBBVEgKPiAtZG8KPiAtICBJRlM9JGFzX3NhdmVf
SUZTCj4gLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KPiAtICAgIGZvciBhY19leGVj
X2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwo+IC0gIGlmIHsgdGVzdCAt
ZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8k
YWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KPiAtICAgIGFjX2N2X3BhdGhfUEVSTD0iJGFz
X2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKPiAtICAgICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQo+
IC0gICAgYnJlYWsgMgo+IC0gIGZpCj4gLWRvbmUKPiAtICBkb25lCj4gLUlGUz0kYXNfc2F2ZV9J
RlMKPiAraWYgdGVzdCAieCRlbmFibGVfcm9tYmlvcyIgPSAieG5vIjsgdGhlbiA6Cj4gKwo+ICsg
ICAgYXhfY3Zfcm9tYmlvcz0ibiIKPiArCj4gK2VsaWYgdGVzdCAieCRlbmFibGVfcm9tYmlvcyIg
PSAieHllcyI7IHRoZW4gOgo+ICsKPiArICAgIGF4X2N2X3JvbWJpb3M9InkiCj4gKwo+ICtlbGlm
IHRlc3QgLXogJGF4X2N2X3JvbWJpb3M7IHRoZW4gOgo+ICsKPiArICAgIGF4X2N2X3JvbWJpb3M9
InkiCj4gCj4gLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfUEVSTCIgJiYgYWNfY3ZfcGF0aF9QRVJM
PSJubyIKPiAtICA7Owo+IC1lc2FjCj4gIGZpCj4gLVBFUkw9JGFjX2N2X3BhdGhfUEVSTAo+IC1p
ZiB0ZXN0IC1uICIkUEVSTCI7IHRoZW4KPiAtICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IHJlc3VsdDogJFBFUkwiID4mNQo+IC0kYXNfZWNobyAiJFBFUkwiID4mNjsg
fQo+IC1lbHNlCj4gLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBy
ZXN1bHQ6IG5vIiA+JjUKPiAtJGFzX2VjaG8gIm5vIiA+JjY7IH0KPiArcm9tYmlvcz0kYXhfY3Zf
cm9tYmlvcwo+ICsKPiArCj4gKwo+ICsjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2VhYmlvcyB3
YXMgZ2l2ZW4uCj4gK2lmIHRlc3QgIiR7ZW5hYmxlX3NlYWJpb3Mrc2V0fSIgPSBzZXQ7IHRoZW4g
Ogo+ICsgIGVuYWJsZXZhbD0kZW5hYmxlX3NlYWJpb3M7Cj4gK2ZpCj4gKwo+ICsKPiAraWYgdGVz
dCAieCRlbmFibGVfc2VhYmlvcyIgPSAieG5vIjsgdGhlbiA6Cj4gKwo+ICsgICAgYXhfY3Zfc2Vh
Ymlvcz0ibiIKPiArCj4gK2VsaWYgdGVzdCAieCRlbmFibGVfc2VhYmlvcyIgPSAieHllcyI7IHRo
ZW4gOgo+ICsKPiArICAgIGF4X2N2X3NlYWJpb3M9InkiCj4gKwo+ICtlbGlmIHRlc3QgLXogJGF4
X2N2X3NlYWJpb3M7IHRoZW4gOgo+ICsKPiArICAgIGF4X2N2X3NlYWJpb3M9InkiCj4gKwo+ICtm
aQo+ICtzZWFiaW9zPSRheF9jdl9zZWFiaW9zCj4gKwo+ICsKPiArCj4gKyMgQ2hlY2sgd2hldGhl
ciAtLWVuYWJsZS1kZWJ1ZyB3YXMgZ2l2ZW4uCj4gK2lmIHRlc3QgIiR7ZW5hYmxlX2RlYnVnK3Nl
dH0iID0gc2V0OyB0aGVuIDoKPiArICBlbmFibGV2YWw9JGVuYWJsZV9kZWJ1ZzsKPiArZmkKPiAr
Cj4gKwo+ICtpZiB0ZXN0ICJ4JGVuYWJsZV9kZWJ1ZyIgPSAieG5vIjsgdGhlbiA6Cj4gKwo+ICsg
ICAgYXhfY3ZfZGVidWc9Im4iCj4gKwo+ICtlbGlmIHRlc3QgIngkZW5hYmxlX2RlYnVnIiA9ICJ4
eWVzIjsgdGhlbiA6Cj4gKwo+ICsgICAgYXhfY3ZfZGVidWc9InkiCj4gKwo+ICtlbGlmIHRlc3Qg
LXogJGF4X2N2X2RlYnVnOyB0aGVuIDoKPiArCj4gKyAgICBheF9jdl9kZWJ1Zz0ieSIKPiArCj4g
IGZpCj4gK2RlYnVnPSRheF9jdl9kZWJ1Zwo+ICsKPiArCj4gKwo+ICsKPiArCj4gKwo+ICsKPiAr
Cj4gK2ZvciBjZmxhZyBpbiAkUFJFUEVORF9JTkNMVURFUwo+ICtkbwo+ICsgICAgUFJFUEVORF9D
RkxBR1MrPSIgLUkkY2ZsYWciCj4gK2RvbmUKPiArZm9yIGxkZmxhZyBpbiAkUFJFUEVORF9MSUIK
PiArZG8KPiArICAgIFBSRVBFTkRfTERGTEFHUys9IiAtTCRsZGZsYWciCj4gK2RvbmUKPiArZm9y
IGNmbGFnIGluICRBUFBFTkRfSU5DTFVERVMKPiArZG8KPiArICAgIEFQUEVORF9DRkxBR1MrPSIg
LUkkY2ZsYWciCj4gK2RvbmUKPiArZm9yIGxkZmxhZyBpbiAkQVBQRU5EX0xJQgo+ICtkbwo+ICsg
ICAgQVBQRU5EX0xERkxBR1MrPSIgLUwkbGRmbGFnIgo+ICtkb25lCj4gK0NGTEFHUz0iJFBSRVBF
TkRfQ0ZMQUdTICRDRkxBR1MgJEFQUEVORF9DRkxBR1MiCj4gK0xERkxBR1M9IiRQUkVQRU5EX0xE
RkxBR1MgJExERkxBR1MgJEFQUEVORF9MREZMQUdTIgo+ICsKPiArCj4gCj4gCj4gLWlmIHRlc3Qg
eCIke1BFUkx9IiA9PSB4Im5vIgo+IC10aGVuCj4gLSAgICBhc19mbl9lcnJvciAkPyAiVW5hYmxl
IHRvIGZpbmQgcGVybCwgcGxlYXNlIGluc3RhbGwgcGVybCIgIiRMSU5FTk8iIDUKPiAtZmkKPiAt
aWYgdGVzdCAieCR4YXBpIiA9ICJ4eSI7IHRoZW4gOgo+IAo+IC0gICAgIyBFeHRyYWN0IHRoZSBm
aXJzdCB3b3JkIG9mICJjdXJsLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3
aXRoIGFyZ3MuCj4gLXNldCBkdW1teSBjdXJsLWNvbmZpZzsgYWNfd29yZD0kMgo+ICsKPiArCj4g
Kwo+ICsKPiArCj4gKwo+ICsKPiArCj4gKwo+ICsjIENoZWNrcyBmb3IgcHJvZ3JhbXMuCj4gK2Fj
X2V4dD1jCj4gK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCj4gK2FjX2NvbXBpbGU9JyRDQyAtYyAk
Q0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKPiArYWNfbGluaz0nJENDIC1v
IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4k
YWNfZXh0ICRMSUJTID4mNScKPiArYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2du
dQo+ICtpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCj4gKyAgIyBFeHRyYWN0IHRo
ZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHBy
b2dyYW0gbmFtZSB3aXRoIGFyZ3MuCj4gK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWdjYzsg
YWNfd29yZD0kMgo+ICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNo
ZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cj4gICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNf
d29yZC4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfQ1VSTCtzZXR9IiA9IHNl
dDsgdGhlbiA6Cj4gK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbiA6
Cj4gICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAgZWxzZQo+IC0gIGNhc2UgJENVUkwg
aW4KPiAtICBbXFwvXSogfCA/OltcXC9dKikKPiAtICBhY19jdl9wYXRoX0NVUkw9IiRDVVJMIiAj
IExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KPiAtICA7Owo+IC0g
ICopCj4gLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgo+ICsgIGlmIHRl
c3QgLW4gIiRDQyI7IHRoZW4KPiArICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2Vy
IG92ZXJyaWRlIHRoZSB0ZXN0Lgo+ICtlbHNlCj4gK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFU
SF9TRVBBUkFUT1IKPiAgZm9yIGFzX2RpciBpbiAkUEFUSAo+ICBkbwo+ICAgIElGUz0kYXNfc2F2
ZV9JRlMKPiAgICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+ICAgICAgZm9yIGFjX2V4
ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gICAgaWYgeyB0ZXN0
IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGly
LyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+IC0gICAgYWNfY3ZfcGF0aF9DVVJMPSIk
YXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0Igo+ICsgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190
b29sX3ByZWZpeH1nY2MiCj4gICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKPiAgICAgIGJyZWFr
IDIKPiAgICBmaQo+IEBAIC01MTcxLDQ0ICsyNjU1LDM5IEBAIGRvbmUKPiAgICBkb25lCj4gIElG
Uz0kYXNfc2F2ZV9JRlMKPiAKPiAtICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9DVVJMIiAmJiBhY19j
dl9wYXRoX0NVUkw9Im5vIgo+IC0gIDs7Cj4gLWVzYWMKPiAgZmkKPiAtQ1VSTD0kYWNfY3ZfcGF0
aF9DVVJMCj4gLWlmIHRlc3QgLW4gIiRDVVJMIjsgdGhlbgo+IC0gIHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1VSTCIgPiY1Cj4gLSRhc19lY2hvICIk
Q1VSTCIgPiY2OyB9Cj4gK2ZpCj4gK0NDPSRhY19jdl9wcm9nX0NDCj4gK2lmIHRlc3QgLW4gIiRD
QyI7IHRoZW4KPiArICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJl
c3VsdDogJENDIiA+JjUKPiArJGFzX2VjaG8gIiRDQyIgPiY2OyB9Cj4gIGVsc2UKPiAgICB7ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQo+ICAk
YXNfZWNobyAibm8iID4mNjsgfQo+ICBmaQo+IAo+IAo+IC1pZiB0ZXN0IHgiJHtDVVJMfSIgPT0g
eCJubyIKPiAtdGhlbgo+IC0gICAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5kIGN1cmwt
Y29uZmlnLCBwbGVhc2UgaW5zdGFsbCBjdXJsLWNvbmZpZyIgIiRMSU5FTk8iIDUKPiAgZmkKPiAt
ICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieG1sMi1jb25maWciLCBzbyBpdCBjYW4g
YmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgo+IC1zZXQgZHVtbXkgeG1sMi1jb25maWc7IGFj
X3dvcmQ9JDIKPiAraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCj4gKyAgYWNfY3Rf
Q0M9JENDCj4gKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4g
YmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgo+ICtzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQy
Cj4gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9y
ICRhY193b3JkIiA+JjUKPiAgJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIg
PiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9YTUwrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+
ICtpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICAg
ICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gIGVsc2UKPiAtICBjYXNlICRYTUwgaW4KPiAt
ICBbXFwvXSogfCA/OltcXC9dKikKPiAtICBhY19jdl9wYXRoX1hNTD0iJFhNTCIgIyBMZXQgdGhl
IHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCj4gLSAgOzsKPiAtICAqKQo+IC0g
IGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKPiArICBpZiB0ZXN0IC1uICIk
YWNfY3RfQ0MiOyB0aGVuCj4gKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExl
dCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KPiArZWxzZQo+ICthc19zYXZlX0lGUz0kSUZT
OyBJRlM9JFBBVEhfU0VQQVJBVE9SCj4gIGZvciBhc19kaXIgaW4gJFBBVEgKPiAgZG8KPiAgICBJ
RlM9JGFzX3NhdmVfSUZTCj4gICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KPiAgICAg
IGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwo+ICAg
IGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3Rf
eCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KPiAtICAgIGFjX2N2X3Bh
dGhfWE1MPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0Igo+ICsgICAgYWNfY3ZfcHJvZ19h
Y19jdF9DQz0iZ2NjIgo+ICAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Cj4gICAgICBicmVhayAy
Cj4gICAgZmkKPiBAQCAtNTIxNiwzOSArMjY5NSw0MyBAQCBkb25lCj4gICAgZG9uZQo+ICBJRlM9
JGFzX3NhdmVfSUZTCj4gCj4gLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWE1MIiAmJiBhY19jdl9w
YXRoX1hNTD0ibm8iCj4gLSAgOzsKPiAtZXNhYwo+ICBmaQo+IC1YTUw9JGFjX2N2X3BhdGhfWE1M
Cj4gLWlmIHRlc3QgLW4gIiRYTUwiOyB0aGVuCj4gLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRYTUwiID4mNQo+IC0kYXNfZWNobyAiJFhNTCIgPiY2
OyB9Cj4gK2ZpCj4gK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCj4gK2lmIHRlc3QgLW4g
IiRhY19jdF9DQyI7IHRoZW4KPiArICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKPiArJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2
OyB9Cj4gIGVsc2UKPiAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IHJlc3VsdDogbm8iID4mNQo+ICAkYXNfZWNobyAibm8iID4mNjsgfQo+ICBmaQo+IAo+IC0KPiAt
aWYgdGVzdCB4IiR7WE1MfSIgPT0geCJubyIKPiAtdGhlbgo+IC0gICAgYXNfZm5fZXJyb3IgJD8g
IlVuYWJsZSB0byBmaW5kIHhtbDItY29uZmlnLCBwbGVhc2UgaW5zdGFsbCB4bWwyLWNvbmZpZyIg
IiRMSU5FTk8iIDUKPiAtZmkKPiAtCj4gKyAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVu
Cj4gKyAgICBDQz0iIgo+ICsgIGVsc2UKPiArICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNf
dG9vbF93YXJuZWQgaW4KPiAreWVzOikKPiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBo
b3N0IHRyaXBsZXQiID4mNQo+ICskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9z
cyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Cj4gK2FjX3Rvb2xf
d2FybmVkPXllcyA7Owo+ICtlc2FjCj4gKyAgICBDQz0kYWNfY3RfQ0MKPiArICBmaQo+ICtlbHNl
Cj4gKyAgQ0M9IiRhY19jdl9wcm9nX0NDIgo+ICBmaQo+IC1pZiB0ZXN0ICJ4JG9jYW1sdG9vbHMi
ID0gInh5IjsgdGhlbiA6Cj4gCj4gLSAgICAgICMgY2hlY2tpbmcgZm9yIG9jYW1sYwo+IC0gIGlm
IHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KPiAtICAjIEV4dHJhY3QgdGhlIGZpcnN0
IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3Jh
bSBuYW1lIHdpdGggYXJncy4KPiAtc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2NhbWxjOyBh
Y193b3JkPSQyCj4gK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KPiArICAgICAgICAgIGlmIHRlc3Qg
LW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KPiArICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29y
ZCBvZiAiJHthY190b29sX3ByZWZpeH1jYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3
aXRoIGFyZ3MuCj4gK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCj4g
IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRh
Y193b3JkIiA+JjUKPiAgJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2
OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19PQ0FNTEMrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+
ICtpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICAgICRhc19l
Y2hvX24gIihjYWNoZWQpICIgPiY2Cj4gIGVsc2UKPiAtICBpZiB0ZXN0IC1uICIkT0NBTUxDIjsg
dGhlbgo+IC0gIGFjX2N2X3Byb2dfT0NBTUxDPSIkT0NBTUxDIiAjIExldCB0aGUgdXNlciBvdmVy
cmlkZSB0aGUgdGVzdC4KPiArICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCj4gKyAgYWNfY3ZfcHJv
Z19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KPiAgZWxzZQo+ICBh
c19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCj4gIGZvciBhc19kaXIgaW4gJFBB
VEgKPiBAQCAtNTI1Nyw3ICsyNzQwLDcgQEAgZG8KPiAgICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBh
c19kaXI9Lgo+ICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVu
c2lvbnM7IGRvCj4gICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0
IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+
IC0gICAgYWNfY3ZfcHJvZ19PQ0FNTEM9IiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxjIgo+ICsgICAg
YWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKPiAgICAgICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19l
eHQiID4mNQo+ICAgICAgYnJlYWsgMgo+ICAgIGZpCj4gQEAgLTUyNjcsMjkgKzI3NTAsMzAgQEAg
SUZTPSRhc19zYXZlX0lGUwo+IAo+ICBmaQo+ICBmaQo+IC1PQ0FNTEM9JGFjX2N2X3Byb2dfT0NB
TUxDCj4gLWlmIHRlc3QgLW4gIiRPQ0FNTEMiOyB0aGVuCj4gLSAgeyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPQ0FNTEMiID4mNQo+IC0kYXNfZWNobyAi
JE9DQU1MQyIgPiY2OyB9Cj4gK0NDPSRhY19jdl9wcm9nX0NDCj4gK2lmIHRlc3QgLW4gIiRDQyI7
IHRoZW4KPiArICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJENDIiA+JjUKPiArJGFzX2VjaG8gIiRDQyIgPiY2OyB9Cj4gIGVsc2UKPiAgICB7ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQo+ICAkYXNf
ZWNobyAibm8iID4mNjsgfQo+ICBmaQo+IAo+IAo+ICsgIGZpCj4gIGZpCj4gLWlmIHRlc3QgLXog
IiRhY19jdl9wcm9nX09DQU1MQyI7IHRoZW4KPiAtICBhY19jdF9PQ0FNTEM9JE9DQU1MQwo+IC0g
ICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2NhbWxjIiwgc28gaXQgY2FuIGJlIGEgcHJv
Z3JhbSBuYW1lIHdpdGggYXJncy4KPiAtc2V0IGR1bW15IG9jYW1sYzsgYWNfd29yZD0kMgo+ICtp
ZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCj4gKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJj
YyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCj4gK3NldCBkdW1teSBj
YzsgYWNfd29yZD0kMgo+ICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cj4gICRhc19lY2hvX24gImNoZWNraW5nIGZvciAk
YWNfd29yZC4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfT0NBTUxD
K3NldH0iID0gc2V0OyB0aGVuIDoKPiAraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0g
c2V0OyB0aGVuIDoKPiAgICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgo+ICBlbHNlCj4gLSAg
aWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MQyI7IHRoZW4KPiAtICBhY19jdl9wcm9nX2FjX2N0X09D
QU1MQz0iJGFjX2N0X09DQU1MQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCj4g
KyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgo+ICsgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQg
dGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCj4gIGVsc2UKPiArICBhY19wcm9nX3JlamVjdGVk
PW5vCj4gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKPiAgZm9yIGFzX2Rp
ciBpbiAkUEFUSAo+ICBkbwo+IEBAIC01Mjk3LDcgKzI3ODEsMTEgQEAgZG8KPiAgICB0ZXN0IC16
ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+ICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19l
eGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193
b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNf
ZXh0IjsgfTsgdGhlbgo+IC0gICAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTEM9Im9jYW1sYyIKPiAr
ICAgIGlmIHRlc3QgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2Nj
IjsgdGhlbgo+ICsgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKPiArICAgICAgIGNvbnRpbnVl
Cj4gKyAgICAgZmkKPiArICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgo+ICAgICAgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVj
X2V4dCIgPiY1Cj4gICAgICBicmVhayAyCj4gICAgZmkKPiBAQCAtNTMwNSw2MSArMjc5Myw0NCBA
QCBkb25lCj4gICAgZG9uZQo+ICBJRlM9JGFzX3NhdmVfSUZTCj4gCj4gK2lmIHRlc3QgJGFjX3By
b2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KPiArICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBh
dGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCj4gKyAgc2V0IGR1bW15ICRhY19jdl9w
cm9nX0NDCj4gKyAgc2hpZnQKPiArICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KPiArICAgICMgV2Ug
Y2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgo+ICsgICAgIyBI
b3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNo
b3Nlbgo+ICsgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVz
ZSB0aGUgZnVsbCBmaWxlIG5hbWUuCj4gKyAgICBzaGlmdAo+ICsgICAgYWNfY3ZfcHJvZ19DQz0i
JGFzX2Rpci8kYWNfd29yZCR7MSsnICd9JEAiCj4gKyAgZmkKPiAgZmkKPiAgZmkKPiAtYWNfY3Rf
T0NBTUxDPSRhY19jdl9wcm9nX2FjX2N0X09DQU1MQwo+IC1pZiB0ZXN0IC1uICIkYWNfY3RfT0NB
TUxDIjsgdGhlbgo+IC0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiAkYWNfY3RfT0NBTUxDIiA+JjUKPiAtJGFzX2VjaG8gIiRhY19jdF9PQ0FNTEMiID4m
NjsgfQo+ICtmaQo+ICtDQz0kYWNfY3ZfcHJvZ19DQwo+ICtpZiB0ZXN0IC1uICIkQ0MiOyB0aGVu
Cj4gKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRD
QyIgPiY1Cj4gKyRhc19lY2hvICIkQ0MiID4mNjsgfQo+ICBlbHNlCj4gICAgeyAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKPiAgJGFzX2VjaG8g
Im5vIiA+JjY7IH0KPiAgZmkKPiAKPiAtICBpZiB0ZXN0ICJ4JGFjX2N0X09DQU1MQyIgPSB4OyB0
aGVuCj4gLSAgICBPQ0FNTEM9Im5vIgo+IC0gIGVsc2UKPiAtICAgIGNhc2UgJGNyb3NzX2NvbXBp
bGluZzokYWNfdG9vbF93YXJuZWQgaW4KPiAteWVzOikKPiAteyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4
ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQo+IC0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1
c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Cj4g
LWFjX3Rvb2xfd2FybmVkPXllcyA7Owo+IC1lc2FjCj4gLSAgICBPQ0FNTEM9JGFjX2N0X09DQU1M
Qwo+IC0gIGZpCj4gLWVsc2UKPiAtICBPQ0FNTEM9IiRhY19jdl9wcm9nX09DQU1MQyIKPiAtZmkK
PiAtCj4gLQo+IC0gIGlmIHRlc3QgIiRPQ0FNTEMiICE9ICJubyI7IHRoZW4KPiAtICAgICBPQ0FN
TFZFUlNJT049YCRPQ0FNTEMgLXYgfCBzZWQgLW4gLWUgJ3N8Lip2ZXJzaW9uKiAqXCguKlwpJHxc
MXxwJ2AKPiAtICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJl
c3VsdDogT0NhbWwgdmVyc2lvbiBpcyAkT0NBTUxWRVJTSU9OIiA+JjUKPiAtJGFzX2VjaG8gIk9D
YW1sIHZlcnNpb24gaXMgJE9DQU1MVkVSU0lPTiIgPiY2OyB9Cj4gLSAgICAgIyBJZiBPQ0FNTExJ
QiBpcyBzZXQsIHVzZSBpdAo+IC0gICAgIGlmIHRlc3QgIiRPQ0FNTExJQiIgPSAiIjsgdGhlbgo+
IC0gICAgICAgIE9DQU1MTElCPWAkT0NBTUxDIC13aGVyZSAyPi9kZXYvbnVsbCB8fCAkT0NBTUxD
IC12fHRhaWwgLTF8Y3V0IC1kICcgJyAtZiA0YAo+IC0gICAgIGVsc2UKPiAtICAgICAgICB7ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogT0NBTUxMSUIgcHJl
dmlvdXNseSBzZXQ7IHByZXNlcnZpbmcgaXQuIiA+JjUKPiAtJGFzX2VjaG8gIk9DQU1MTElCIHBy
ZXZpb3VzbHkgc2V0OyBwcmVzZXJ2aW5nIGl0LiIgPiY2OyB9Cj4gLSAgICAgZmkKPiAtICAgICB7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogT0NhbWwgbGli
cmFyeSBwYXRoIGlzICRPQ0FNTExJQiIgPiY1Cj4gLSRhc19lY2hvICJPQ2FtbCBsaWJyYXJ5IHBh
dGggaXMgJE9DQU1MTElCIiA+JjY7IH0KPiAtCj4gLQo+IAo+IC0KPiAtICAgICAjIGNoZWNraW5n
IGZvciBvY2FtbG9wdAo+IC0gICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4K
PiAtICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxv
cHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgo+IC1zZXQgZHVtbXkg
JHthY190b29sX3ByZWZpeH1vY2FtbG9wdDsgYWNfd29yZD0kMgo+ICtmaQo+ICtpZiB0ZXN0IC16
ICIkQ0MiOyB0aGVuCj4gKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgo+ICsg
IGZvciBhY19wcm9nIGluIGNsLmV4ZQo+ICsgIGRvCj4gKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0
IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3Jh
bSBuYW1lIHdpdGggYXJncy4KPiArc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBh
Y193b3JkPSQyCj4gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hl
Y2tpbmcgZm9yICRhY193b3JkIiA+JjUKPiAgJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193
b3JkLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19PQ0FNTE9QVCtzZXR9IiA9
IHNldDsgdGhlbiA6Cj4gK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhl
biA6Cj4gICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAgZWxzZQo+IC0gIGlmIHRlc3Qg
LW4gIiRPQ0FNTE9QVCI7IHRoZW4KPiAtICBhY19jdl9wcm9nX09DQU1MT1BUPSIkT0NBTUxPUFQi
ICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0Lgo+ICsgIGlmIHRlc3QgLW4gIiRDQyI7
IHRoZW4KPiArICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRo
ZSB0ZXN0Lgo+ICBlbHNlCj4gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IK
PiAgZm9yIGFzX2RpciBpbiAkUEFUSAo+IEBAIC01MzY4LDcgKzI4MzksNyBAQCBkbwo+ICAgIHRl
c3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCj4gICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycg
JGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KPiAgICBpZiB7IHRlc3QgLWYgIiRhc19kaXIv
JGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNf
ZXhlY19leHQiOyB9OyB0aGVuCj4gLSAgICBhY19jdl9wcm9nX09DQU1MT1BUPSIke2FjX3Rvb2xf
cHJlZml4fW9jYW1sb3B0Igo+ICsgICAgYWNfY3ZfcHJvZ19DQz0iJGFjX3Rvb2xfcHJlZml4JGFj
X3Byb2ciCj4gICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3Vu
ZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKPiAgICAgIGJyZWFrIDIKPiAgICBm
aQo+IEBAIC01Mzc4LDI4ICsyODQ5LDMyIEBAIElGUz0kYXNfc2F2ZV9JRlMKPiAKPiAgZmkKPiAg
ZmkKPiAtT0NBTUxPUFQ9JGFjX2N2X3Byb2dfT0NBTUxPUFQKPiAtaWYgdGVzdCAtbiAiJE9DQU1M
T1BUIjsgdGhlbgo+IC0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiAkT0NBTUxPUFQiID4mNQo+IC0kYXNfZWNobyAiJE9DQU1MT1BUIiA+JjY7IH0KPiAr
Q0M9JGFjX2N2X3Byb2dfQ0MKPiAraWYgdGVzdCAtbiAiJENDIjsgdGhlbgo+ICsgIHsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0MiID4mNQo+ICskYXNf
ZWNobyAiJENDIiA+JjY7IH0KPiAgZWxzZQo+ICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp
bmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Cj4gICRhc19lY2hvICJubyIgPiY2OyB9Cj4g
IGZpCj4gCj4gCj4gKyAgICB0ZXN0IC1uICIkQ0MiICYmIGJyZWFrCj4gKyAgZG9uZQo+ICBmaQo+
IC1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19PQ0FNTE9QVCI7IHRoZW4KPiAtICBhY19jdF9PQ0FN
TE9QVD0kT0NBTUxPUFQKPiAtICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm9jYW1sb3B0
Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KPiAtc2V0IGR1bW15IG9j
YW1sb3B0OyBhY193b3JkPSQyCj4gK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KPiArICBhY19jdF9D
Qz0kQ0MKPiArICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKPiArZG8KPiArICAjIEV4dHJhY3QgdGhl
IGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdp
dGggYXJncy4KPiArc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCj4gIHsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUK
PiAgJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cj4gLWlmIHRl
c3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9PQ0FNTE9QVCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gK2lm
IHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbiA6Cj4gICAgJGFz
X2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAgZWxzZQo+IC0gIGlmIHRlc3QgLW4gIiRhY19jdF9P
Q0FNTE9QVCI7IHRoZW4KPiAtICBhY19jdl9wcm9nX2FjX2N0X09DQU1MT1BUPSIkYWNfY3RfT0NB
TUxPUFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0Lgo+ICsgIGlmIHRlc3QgLW4g
IiRhY19jdF9DQyI7IHRoZW4KPiArICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMg
TGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0Lgo+ICBlbHNlCj4gIGFzX3NhdmVfSUZTPSRJ
RlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKPiAgZm9yIGFzX2RpciBpbiAkUEFUSAo+IEBAIC01NDA4
LDcgKzI4ODMsNyBAQCBkbwo+ICAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCj4gICAg
ICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KPiAg
ICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0
X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCj4gLSAgICBhY19jdl9w
cm9nX2FjX2N0X09DQU1MT1BUPSJvY2FtbG9wdCIKPiArICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9
IiRhY19wcm9nIgo+ICAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
Zm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Cj4gICAgICBicmVhayAyCj4g
ICAgZmkKPiBAQCAtNTQxNiwxOSArMjg5MSwyMyBAQCBkb25lCj4gICAgZG9uZQo+ICBJRlM9JGFz
X3NhdmVfSUZTCj4gCj4gLWZpCj4gLWZpCj4gLWFjX2N0X09DQU1MT1BUPSRhY19jdl9wcm9nX2Fj
X2N0X09DQU1MT1BUCj4gLWlmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTE9QVCI7IHRoZW4KPiAtICB7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09D
QU1MT1BUIiA+JjUKPiAtJGFzX2VjaG8gIiRhY19jdF9PQ0FNTE9QVCIgPiY2OyB9Cj4gK2ZpCj4g
K2ZpCj4gK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCj4gK2lmIHRlc3QgLW4gIiRhY19j
dF9DQyI7IHRoZW4KPiArICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKPiArJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9Cj4g
IGVsc2UKPiAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogbm8iID4mNQo+ICAkYXNfZWNobyAibm8iID4mNjsgfQo+ICBmaQo+IAo+IC0gIGlmIHRlc3Qg
IngkYWNfY3RfT0NBTUxPUFQiID0geDsgdGhlbgo+IC0gICAgT0NBTUxPUFQ9Im5vIgo+ICsKPiAr
ICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCj4gK2RvbmUKPiArCj4gKyAgaWYgdGVzdCAi
eCRhY19jdF9DQyIgPSB4OyB0aGVuCj4gKyAgICBDQz0iIgo+ICAgIGVsc2UKPiAgICAgIGNhc2Ug
JGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KPiAgeWVzOikKPiBAQCAtNTQzNiwz
OTYgKzI5MTUsNjQ5IEBAIHllczopCj4gICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5n
IGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KPiAgYWNf
dG9vbF93YXJuZWQ9eWVzIDs7Cj4gIGVzYWMKPiAtICAgIE9DQU1MT1BUPSRhY19jdF9PQ0FNTE9Q
VAo+ICsgICAgQ0M9JGFjX2N0X0NDCj4gICAgZmkKPiAtZWxzZQo+IC0gIE9DQU1MT1BUPSIkYWNf
Y3ZfcHJvZ19PQ0FNTE9QVCIKPiAgZmkKPiAKPiAtICAgICBPQ0FNTEJFU1Q9Ynl0ZQo+IC0gICAg
IGlmIHRlc3QgIiRPQ0FNTE9QVCIgPSAibm8iOyB0aGVuCj4gLSAgICAgICB7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IENhbm5vdCBmaW5kIG9jYW1sb3B0
OyBieXRlY29kZSBjb21waWxhdGlvbiBvbmx5LiIgPiY1Cj4gLSRhc19lY2hvICIkYXNfbWU6IFdB
Uk5JTkc6IENhbm5vdCBmaW5kIG9jYW1sb3B0OyBieXRlY29kZSBjb21waWxhdGlvbiBvbmx5LiIg
PiYyO30KPiAtICAgICBlbHNlCj4gLSAgICAgICBUTVBWRVJTSU9OPWAkT0NBTUxPUFQgLXYgfCBz
ZWQgLW4gLWUgJ3N8Lip2ZXJzaW9uKiAqXCguKlwpJHxcMXxwJyBgCj4gLSAgICAgICBpZiB0ZXN0
ICIkVE1QVkVSU0lPTiIgIT0gIiRPQ0FNTFZFUlNJT04iIDsgdGhlbgo+IC0gICAgICAgICAgIHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB2ZXJzaW9ucyBk
aWZmZXJzIGZyb20gb2NhbWxjOyBvY2FtbG9wdCBkaXNjYXJkZWQuIiA+JjUKPiAtJGFzX2VjaG8g
InZlcnNpb25zIGRpZmZlcnMgZnJvbSBvY2FtbGM7IG9jYW1sb3B0IGRpc2NhcmRlZC4iID4mNjsg
fQo+IC0gICAgICAgICAgIE9DQU1MT1BUPW5vCj4gLSAgICAgICBlbHNlCj4gLSAgICAgICAgICAg
T0NBTUxCRVNUPW9wdAo+ICtmaQo+ICsKPiArCj4gK3Rlc3QgLXogIiRDQyIgJiYgeyB7ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIg
PiY1Cj4gKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KPiAr
YXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgK
PiArU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUgOyB9Cj4g
Kwo+ICsjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCj4gKyRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBDIGNvbXBp
bGVyIHZlcnNpb24iID4mNQo+ICtzZXQgWCAkYWNfY29tcGlsZQo+ICthY19jb21waWxlcj0kMgo+
ICtmb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247IGRvCj4gKyAgeyB7
IGFjX3RyeT0iJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1Igo+ICtjYXNlICIoKCRhY190cnki
IGluCj4gKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cj4gKyAg
KikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cj4gK2VzYWMKPiArZXZhbCBhY190cnlfZWNobz0iXCJc
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKPiArJGFzX2VjaG8g
IiRhY190cnlfZWNobyI7IH0gPiY1Cj4gKyAgKGV2YWwgIiRhY19jb21waWxlciAkYWNfb3B0aW9u
ID4mNSIpIDI+Y29uZnRlc3QuZXJyCj4gKyAgYWNfc3RhdHVzPSQ/Cj4gKyAgaWYgdGVzdCAtcyBj
b25mdGVzdC5lcnI7IHRoZW4KPiArICAgIHNlZCAnMTBhXAo+ICsuLi4gcmVzdCBvZiBzdGRlcnIg
b3V0cHV0IGRlbGV0ZWQgLi4uCj4gKyAgICAgICAgIDEwcScgY29uZnRlc3QuZXJyID5jb25mdGVz
dC5lcjEKPiArICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1Cj4gKyAgZmkKPiArICBybSAtZiBjb25m
dGVzdC5lcjEgY29uZnRlc3QuZXJyCj4gKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cj4gKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsg
fQo+ICtkb25lCj4gKwo+ICtjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNf
ZXh0Cj4gKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KPiArCj4gK2ludAo+ICttYWluICgpCj4gK3sK
PiArCj4gKyAgOwo+ICsgIHJldHVybiAwOwo+ICt9Cj4gK19BQ0VPRgo+ICthY19jbGVhbl9maWxl
c19zYXZlPSRhY19jbGVhbl9maWxlcwo+ICthY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVz
IGEub3V0IGEub3V0LmRTWU0gYS5leGUgYi5vdXQiCj4gKyMgVHJ5IHRvIGNyZWF0ZSBhbiBleGVj
dXRhYmxlIHdpdGhvdXQgLW8gZmlyc3QsIGRpc3JlZ2FyZCBhLm91dC4KPiArIyBJdCB3aWxsIGhl
bHAgdXMgZGlhZ25vc2UgYnJva2VuIGNvbXBpbGVycywgYW5kIGZpbmRpbmcgb3V0IGFuIGludHVp
dGlvbgo+ICsjIG9mIGV4ZWV4dC4KPiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKPiArJGFz
X2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAiID4mNjsg
fQo+ICthY19saW5rX2RlZmF1bHQ9YCRhc19lY2hvICIkYWNfbGluayIgfCBzZWQgJ3MvIC1vICpj
b25mdGVzdFteIF0qLy8nYAo+ICsKPiArIyBUaGUgcG9zc2libGUgb3V0cHV0IGZpbGVzOgo+ICth
Y19maWxlcz0iYS5vdXQgY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGEuZXhlIGFfb3V0LmV4ZSBiLm91
dCBjb25mdGVzdC4qIgo+ICsKPiArYWNfcm1maWxlcz0KPiArZm9yIGFjX2ZpbGUgaW4gJGFjX2Zp
bGVzCj4gK2RvCj4gKyAgY2FzZSAkYWNfZmlsZSBpbgo+ICsgICAgKi4kYWNfZXh0IHwgKi54Y29m
ZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8
ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKSA7Owo+ICsgICAgKiApIGFjX3JtZmlsZXM9
IiRhY19ybWZpbGVzICRhY19maWxlIjs7Cj4gKyAgZXNhYwo+ICtkb25lCj4gK3JtIC1mICRhY19y
bWZpbGVzCj4gKwo+ICtpZiB7IHsgYWNfdHJ5PSIkYWNfbGlua19kZWZhdWx0Igo+ICtjYXNlICIo
KCRhY190cnkiIGluCj4gKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3Ry
eTs7Cj4gKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cj4gK2VzYWMKPiArZXZhbCBhY190cnlf
ZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKPiAr
JGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1Cj4gKyAgKGV2YWwgIiRhY19saW5rX2RlZmF1
bHQiKSAyPiY1Cj4gKyAgYWNfc3RhdHVzPSQ/Cj4gKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp
bmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cj4gKyAgdGVzdCAkYWNfc3RhdHVz
ID0gMDsgfTsgdGhlbiA6Cj4gKyAgIyBBdXRvY29uZi0yLjEzIGNvdWxkIHNldCB0aGUgYWNfY3Zf
ZXhlZXh0IHZhcmlhYmxlIHRvIGBubycuCj4gKyMgU28gaWdub3JlIGEgdmFsdWUgb2YgYG5vJywg
b3RoZXJ3aXNlIHRoaXMgd291bGQgbGVhZCB0byBgRVhFRVhUID0gbm8nCj4gKyMgaW4gYSBNYWtl
ZmlsZS4gIFdlIHNob3VsZCBub3Qgb3ZlcnJpZGUgYWNfY3ZfZXhlZXh0IGlmIGl0IHdhcyBjYWNo
ZWQsCj4gKyMgc28gdGhhdCB0aGUgdXNlciBjYW4gc2hvcnQtY2lyY3VpdCB0aGlzIHRlc3QgZm9y
IGNvbXBpbGVycyB1bmtub3duIHRvCj4gKyMgQXV0b2NvbmYuCj4gK2ZvciBhY19maWxlIGluICRh
Y19maWxlcyAnJwo+ICtkbwo+ICsgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQo+ICsg
IGNhc2UgJGFjX2ZpbGUgaW4KPiArICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICou
ZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZ
TSB8ICoubyB8ICoub2JqICkKPiArICAgICAgIDs7Cj4gKyAgICBbYWJdLm91dCApCj4gKyAgICAg
ICAjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9z
dAo+ICsgICAgICAgIyBjZXJ0YWlubHkgcmlnaHQuCj4gKyAgICAgICBicmVhazs7Cj4gKyAgICAq
LiogKQo+ICsgICAgICAgaWYgdGVzdCAiJHthY19jdl9leGVleHQrc2V0fSIgPSBzZXQgJiYgdGVz
dCAiJGFjX2N2X2V4ZWV4dCIgIT0gbm87Cj4gKyAgICAgICB0aGVuIDo7IGVsc2UKPiArICAgICAg
ICAgIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAo+ICAg
ICAgICAgZmkKPiAtICAgICBmaQo+ICsgICAgICAgIyBXZSBzZXQgYWNfY3ZfZXhlZXh0IGhlcmUg
YmVjYXVzZSB0aGUgbGF0ZXIgdGVzdCBmb3IgaXQgaXMgbm90Cj4gKyAgICAgICAjIHNhZmU6IGNy
b3NzIGNvbXBpbGVycyBtYXkgbm90IGFkZCB0aGUgc3VmZml4IGlmIGdpdmVuIGFuIGAtbycKPiAr
ICAgICAgICMgYXJndW1lbnQsIHNvIHdlIG1heSBuZWVkIHRvIGtub3cgaXQgYXQgdGhhdCBwb2lu
dCBhbHJlYWR5Lgo+ICsgICAgICAgIyBFdmVuIGlmIHRoaXMgc2VjdGlvbiBsb29rcyBjcnVmdHk6
IGl0IGhhcyB0aGUgYWR2YW50YWdlIG9mCj4gKyAgICAgICAjIGFjdHVhbGx5IHdvcmtpbmcuCj4g
KyAgICAgICBicmVhazs7Cj4gKyAgICAqICkKPiArICAgICAgIGJyZWFrOzsKPiArICBlc2FjCj4g
K2RvbmUKPiArdGVzdCAiJGFjX2N2X2V4ZWV4dCIgPSBubyAmJiBhY19jdl9leGVleHQ9Cj4gKwo+
ICtlbHNlCj4gKyAgYWNfZmlsZT0nJwo+ICtmaQo+ICtpZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRo
ZW4gOgo+ICsgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0
OiBubyIgPiY1Cj4gKyRhc19lY2hvICJubyIgPiY2OyB9Cj4gKyRhc19lY2hvICIkYXNfbWU6IGZh
aWxlZCBwcm9ncmFtIHdhczoiID4mNQo+ICtzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQg
PiY1Cj4gKwo+ICt7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJy
b3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKPiArJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxg
JGFjX3B3ZCc6IiA+JjI7fQo+ICthc19mbl9lcnJvciA3NyAiQyBjb21waWxlciBjYW5ub3QgY3Jl
YXRlIGV4ZWN1dGFibGVzCj4gK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIk
TElORU5PIiA1IDsgfQo+ICtlbHNlCj4gKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Cj4gKyRhc19lY2hvICJ5ZXMiID4mNjsgfQo+ICtm
aQo+ICt7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZv
ciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZSIgPiY1Cj4gKyRhc19lY2hvX24g
ImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZS4uLiAiID4m
NjsgfQo+ICt7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDog
JGFjX2ZpbGUiID4mNQo+ICskYXNfZWNobyAiJGFjX2ZpbGUiID4mNjsgfQo+ICthY19leGVleHQ9
JGFjX2N2X2V4ZWV4dAo+ICsKPiArcm0gLWYgLXIgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBjb25m
dGVzdCRhY19jdl9leGVleHQgYi5vdXQKPiArYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVz
X3NhdmUKPiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2lu
ZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzIiA+JjUKPiArJGFzX2VjaG9fbiAiY2hlY2tpbmcg
Zm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcy4uLiAiID4mNjsgfQo+ICtpZiB7IHsgYWNfdHJ5PSIk
YWNfbGluayIKPiArY2FzZSAiKCgkYWNfdHJ5IiBpbgo+ICsgICpcIiogfCAqXGAqIHwgKlxcKikg
YWNfdHJ5X2VjaG89XCRhY190cnk7Owo+ICsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7Owo+ICtl
c2FjCj4gK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
JGFjX3RyeV9lY2hvXCIiCj4gKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQo+ICsgIChl
dmFsICIkYWNfbGluayIpIDI+JjUKPiArICBhY19zdGF0dXM9JD8KPiArICAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKPiArICB0ZXN0
ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKPiArICAjIElmIGJvdGggYGNvbmZ0ZXN0LmV4ZScg
YW5kIGBjb25mdGVzdCcgYXJlIGBwcmVzZW50JyAod2VsbCwgb2JzZXJ2YWJsZSkKPiArIyBjYXRj
aCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0
JyB3aWxsCj4gKyMgd29yayBwcm9wZXJseSAoaS5lLiwgcmVmZXIgdG8gYGNvbmZ0ZXN0LmV4ZScp
LCB3aGlsZSBpdCB3b24ndCB3aXRoCj4gKyMgYHJtJy4KPiArZm9yIGFjX2ZpbGUgaW4gY29uZnRl
c3QuZXhlIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lio7IGRvCj4gKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8
IGNvbnRpbnVlCj4gKyAgY2FzZSAkYWNfZmlsZSBpbgo+ICsgICAgKi4kYWNfZXh0IHwgKi54Y29m
ZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8
ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKSA7Owo+ICsgICAgKi4qICkgYWNfY3ZfZXhl
ZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCj4gKyAgICAgICAgIGJyZWFr
OzsKPiArICAgICogKSBicmVhazs7Cj4gKyAgZXNhYwo+ICtkb25lCj4gK2Vsc2UKPiArICB7IHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3
ZCc6IiA+JjUKPiArJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7
fQo+ICthc19mbl9lcnJvciAkPyAiY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVz
OiBjYW5ub3QgY29tcGlsZSBhbmQgbGluawo+ICtTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBk
ZXRhaWxzIiAiJExJTkVOTyIgNSA7IH0KPiArZmkKPiArcm0gLWYgY29uZnRlc3QgY29uZnRlc3Qk
YWNfY3ZfZXhlZXh0Cj4gK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKPiArJGFzX2VjaG8gIiRhY19jdl9leGVleHQiID4m
NjsgfQo+IAo+ICtybSAtZiBjb25mdGVzdC4kYWNfZXh0Cj4gK0VYRUVYVD0kYWNfY3ZfZXhlZXh0
Cj4gK2FjX2V4ZWV4dD0kRVhFRVhUCj4gK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0
ZXN0LiRhY19leHQKPiArLyogZW5kIGNvbmZkZWZzLmguICAqLwo+ICsjaW5jbHVkZSA8c3RkaW8u
aD4KPiAraW50Cj4gK21haW4gKCkKPiArewo+ICtGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC5v
dXQiLCAidyIpOwo+ICsgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOwo+IAo+
ICsgIDsKPiArICByZXR1cm4gMDsKPiArfQo+ICtfQUNFT0YKPiArYWNfY2xlYW5fZmlsZXM9IiRh
Y19jbGVhbl9maWxlcyBjb25mdGVzdC5vdXQiCj4gKyMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIg
cHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCj4gKyMgdGhl
IGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KPiAreyAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9z
cyBjb21waWxpbmciID4mNQo+ICskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBj
cm9zcyBjb21waWxpbmcuLi4gIiA+JjY7IH0KPiAraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIg
IT0geWVzOyB0aGVuCj4gKyAgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCj4gK2Nhc2UgIigoJGFjX3Ry
eSIgaW4KPiArICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKPiAr
ICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKPiArZXNhYwo+ICtldmFsIGFjX3RyeV9lY2hvPSJc
IlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgo+ICskYXNfZWNo
byAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKPiArICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Cj4gKyAg
YWNfc3RhdHVzPSQ/Cj4gKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
XCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cj4gKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQo+ICsgIGlm
IHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCcKPiArICB7IHsgY2FzZSAiKCgkYWNf
dHJ5IiBpbgo+ICsgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7Owo+
ICsgICopIGFjX3RyeV9lY2hvPSRhY190cnk7Owo+ICtlc2FjCj4gK2V2YWwgYWNfdHJ5X2VjaG89
IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCj4gKyRhc19l
Y2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQo+ICsgIChldmFsICIkYWNfdHJ5IikgMj4mNQo+ICsg
IGFjX3N0YXR1cz0kPwo+ICsgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IFwkPyA9ICRhY19zdGF0dXMiID4mNQo+ICsgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRo
ZW4KPiArICAgIGNyb3NzX2NvbXBpbGluZz1ubwo+ICsgIGVsc2UKPiArICAgIGlmIHRlc3QgIiRj
cm9zc19jb21waWxpbmciID0gbWF5YmU7IHRoZW4KPiArICAgICAgIGNyb3NzX2NvbXBpbGluZz15
ZXMKPiArICAgIGVsc2UKPiArICAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQo+ICskYXNfZWNobyAiJGFzX21l
OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cj4gK2FzX2ZuX2Vycm9yICQ/ICJjYW5ub3Qg
cnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCj4gK0lmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxl
LCB1c2UgXGAtLWhvc3QnLgo+ICtTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAi
JExJTkVOTyIgNSA7IH0KPiArICAgIGZpCj4gKyAgZmkKPiArZmkKPiAreyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQo+
ICskYXNfZWNobyAiJGNyb3NzX2NvbXBpbGluZyIgPiY2OyB9Cj4gCj4gLSAgICAgIyBjaGVja2lu
ZyBmb3Igb2NhbWxjLm9wdAo+IC0gICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRo
ZW4KPiAtICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2Nh
bWxjLm9wdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCj4gLXNldCBk
dW1teSAke2FjX3Rvb2xfcHJlZml4fW9jYW1sYy5vcHQ7IGFjX3dvcmQ9JDIKPiAteyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4m
NQo+IC0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KPiAtaWYg
dGVzdCAiJHthY19jdl9wcm9nX09DQU1MQ0RPVE9QVCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gK3Jt
IC1mIGNvbmZ0ZXN0LiRhY19leHQgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGNvbmZ0ZXN0Lm91dAo+
ICthY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQo+ICt7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZp
bGVzIiA+JjUKPiArJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmls
ZXMuLi4gIiA+JjY7IH0KPiAraWYgdGVzdCAiJHthY19jdl9vYmpleHQrc2V0fSIgPSBzZXQ7IHRo
ZW4gOgo+ICAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gIGVsc2UKPiAtICBpZiB0ZXN0
IC1uICIkT0NBTUxDRE9UT1BUIjsgdGhlbgo+IC0gIGFjX2N2X3Byb2dfT0NBTUxDRE9UT1BUPSIk
T0NBTUxDRE9UT1BUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KPiAtZWxzZQo+
IC1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCj4gLWZvciBhc19kaXIgaW4g
JFBBVEgKPiAtZG8KPiAtICBJRlM9JGFzX3NhdmVfSUZTCj4gLSAgdGVzdCAteiAiJGFzX2RpciIg
JiYgYXNfZGlyPS4KPiAtICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9l
eHRlbnNpb25zOyBkbwo+IC0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVj
X2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRo
ZW4KPiAtICAgIGFjX2N2X3Byb2dfT0NBTUxDRE9UT1BUPSIke2FjX3Rvb2xfcHJlZml4fW9jYW1s
Yy5vcHQiCj4gLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3Vu
ZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKPiAtICAgIGJyZWFrIDIKPiAtICBm
aQo+IC1kb25lCj4gLSAgZG9uZQo+IC1JRlM9JGFzX3NhdmVfSUZTCj4gKyAgY2F0IGNvbmZkZWZz
LmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAo+ICsvKiBlbmQgY29uZmRlZnMuaC4gICov
Cj4gCj4gLWZpCj4gLWZpCj4gLU9DQU1MQ0RPVE9QVD0kYWNfY3ZfcHJvZ19PQ0FNTENET1RPUFQK
PiAtaWYgdGVzdCAtbiAiJE9DQU1MQ0RPVE9QVCI7IHRoZW4KPiAtICB7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9DQU1MQ0RPVE9QVCIgPiY1Cj4gLSRh
c19lY2hvICIkT0NBTUxDRE9UT1BUIiA+JjY7IH0KPiAtZWxzZQo+IC0gIHsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Cj4gLSRhc19lY2hvICJu
byIgPiY2OyB9Cj4gLWZpCj4gK2ludAo+ICttYWluICgpCj4gK3sKPiAKPiArICA7Cj4gKyAgcmV0
dXJuIDA7Cj4gK30KPiArX0FDRU9GCj4gK3JtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCj4g
K2lmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgo+ICtjYXNlICIoKCRhY190cnkiIGluCj4gKyAg
KlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cj4gKyAgKikgYWNfdHJ5
X2VjaG89JGFjX3RyeTs7Cj4gK2VzYWMKPiArZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKPiArJGFzX2VjaG8gIiRhY190cnlf
ZWNobyI7IH0gPiY1Cj4gKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj4mNQo+ICsgIGFjX3N0YXR1
cz0kPwo+ICsgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRh
Y19zdGF0dXMiID4mNQo+ICsgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgo+ICsgIGZv
ciBhY19maWxlIGluIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqIGNvbmZ0ZXN0Lio7IGRvCj4gKyAg
dGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlOwo+ICsgIGNhc2UgJGFjX2ZpbGUgaW4KPiAr
ICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwg
Ki5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSApIDs7Cj4gKyAgICAqKSBhY19j
dl9vYmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKPiArICAgICAgIGJyZWFr
OzsKPiArICBlc2FjCj4gK2RvbmUKPiArZWxzZQo+ICsgICRhc19lY2hvICIkYXNfbWU6IGZhaWxl
ZCBwcm9ncmFtIHdhczoiID4mNQo+ICtzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1
Cj4gCj4gK3sgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjog
aW4gXGAkYWNfcHdkJzoiID4mNQo+ICskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNf
cHdkJzoiID4mMjt9Cj4gK2FzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Yg
b2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQo+ICtTZWUgXGBjb25maWcubG9nJyBmb3IgbW9y
ZSBkZXRhaWxzIiAiJExJTkVOTyIgNSA7IH0KPiAgZmkKPiAtaWYgdGVzdCAteiAiJGFjX2N2X3By
b2dfT0NBTUxDRE9UT1BUIjsgdGhlbgo+IC0gIGFjX2N0X09DQU1MQ0RPVE9QVD0kT0NBTUxDRE9U
T1BUCj4gLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvY2FtbGMub3B0Iiwgc28gaXQg
Y2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KPiAtc2V0IGR1bW15IG9jYW1sYy5vcHQ7
IGFjX3dvcmQ9JDIKPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBj
aGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFj
X3dvcmQuLi4gIiA+JjY7IH0KPiAtaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X09DQU1MQ0RP
VE9QVCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gK3JtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQg
Y29uZnRlc3QuJGFjX2V4dAo+ICtmaQo+ICt7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1Cj4gKyRhc19lY2hvICIkYWNfY3Zf
b2JqZXh0IiA+JjY7IH0KPiArT0JKRVhUPSRhY19jdl9vYmpleHQKPiArYWNfb2JqZXh0PSRPQkpF
WFQKPiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3
aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQo+ICskYXNfZWNob19u
ICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gIiA+
JjY7IH0KPiAraWYgdGVzdCAiJHthY19jdl9jX2NvbXBpbGVyX2dudStzZXR9IiA9IHNldDsgdGhl
biA6Cj4gICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAgZWxzZQo+IC0gIGlmIHRlc3Qg
LW4gIiRhY19jdF9PQ0FNTENET1RPUFQiOyB0aGVuCj4gLSAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FN
TENET1RPUFQ9IiRhY19jdF9PQ0FNTENET1RPUFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRo
ZSB0ZXN0Lgo+IC1lbHNlCj4gLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IK
PiAtZm9yIGFzX2RpciBpbiAkUEFUSAo+IC1kbwo+IC0gIElGUz0kYXNfc2F2ZV9JRlMKPiAtICB0
ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+IC0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcn
ICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGly
LyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFj
X2V4ZWNfZXh0IjsgfTsgdGhlbgo+IC0gICAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTENET1RPUFQ9
Im9jYW1sYy5vcHQiCj4gLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKPiAtICAgIGJyZWFrIDIK
PiAtICBmaQo+IC1kb25lCj4gLSAgZG9uZQo+IC1JRlM9JGFzX3NhdmVfSUZTCj4gKyAgY2F0IGNv
bmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAo+ICsvKiBlbmQgY29uZmRlZnMu
aC4gICovCj4gCj4gLWZpCj4gLWZpCj4gLWFjX2N0X09DQU1MQ0RPVE9QVD0kYWNfY3ZfcHJvZ19h
Y19jdF9PQ0FNTENET1RPUFQKPiAtaWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MQ0RPVE9QVCI7IHRo
ZW4KPiAtICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDog
JGFjX2N0X09DQU1MQ0RPVE9QVCIgPiY1Cj4gLSRhc19lY2hvICIkYWNfY3RfT0NBTUxDRE9UT1BU
IiA+JjY7IH0KPiAraW50Cj4gK21haW4gKCkKPiArewo+ICsjaWZuZGVmIF9fR05VQ19fCj4gKyAg
ICAgICBjaG9rZSBtZQo+ICsjZW5kaWYKPiArCj4gKyAgOwo+ICsgIHJldHVybiAwOwo+ICt9Cj4g
K19BQ0VPRgo+ICtpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Cj4gKyAg
YWNfY29tcGlsZXJfZ251PXllcwo+ICBlbHNlCj4gLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKPiAtJGFzX2VjaG8gIm5vIiA+JjY7IH0K
PiArICBhY19jb21waWxlcl9nbnU9bm8KPiAgZmkKPiArcm0gLWYgY29yZSBjb25mdGVzdC5lcnIg
Y29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cj4gK2FjX2N2X2NfY29tcGlsZXJf
Z251PSRhY19jb21waWxlcl9nbnUKPiAKPiAtICBpZiB0ZXN0ICJ4JGFjX2N0X09DQU1MQ0RPVE9Q
VCIgPSB4OyB0aGVuCj4gLSAgICBPQ0FNTENET1RPUFQ9Im5vIgo+IC0gIGVsc2UKPiAtICAgIGNh
c2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KPiAteWVzOikKPiAteyAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0
b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQo+IC0kYXNfZWNobyAiJGFz
X21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRy
aXBsZXQiID4mMjt9Cj4gLWFjX3Rvb2xfd2FybmVkPXllcyA7Owo+IC1lc2FjCj4gLSAgICBPQ0FN
TENET1RPUFQ9JGFjX2N0X09DQU1MQ0RPVE9QVAo+IC0gIGZpCj4gK2ZpCj4gK3sgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9n
bnUiID4mNQo+ICskYXNfZWNobyAiJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjY7IH0KPiAraWYg
dGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzOyB0aGVuCj4gKyAgR0NDPXllcwo+ICBlbHNlCj4g
LSAgT0NBTUxDRE9UT1BUPSIkYWNfY3ZfcHJvZ19PQ0FNTENET1RPUFQiCj4gKyAgR0NDPQo+ICBm
aQo+IC0KPiAtICAgICBpZiB0ZXN0ICIkT0NBTUxDRE9UT1BUIiAhPSAibm8iOyB0aGVuCj4gLSAg
ICAgICBUTVBWRVJTSU9OPWAkT0NBTUxDRE9UT1BUIC12IHwgc2VkIC1uIC1lICdzfC4qdmVyc2lv
biogKlwoLipcKSR8XDF8cCcgYAo+IC0gICAgICAgaWYgdGVzdCAiJFRNUFZFUlNJT04iICE9ICIk
T0NBTUxWRVJTSU9OIiA7IHRoZW4KPiAtICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IHJlc3VsdDogdmVyc2lvbnMgZGlmZmVycyBmcm9tIG9jYW1sYzsg
b2NhbWxjLm9wdCBkaXNjYXJkZWQuIiA+JjUKPiAtJGFzX2VjaG8gInZlcnNpb25zIGRpZmZlcnMg
ZnJvbSBvY2FtbGM7IG9jYW1sYy5vcHQgZGlzY2FyZGVkLiIgPiY2OyB9Cj4gLSAgICAgICBlbHNl
Cj4gLSAgICAgICAgICAgT0NBTUxDPSRPQ0FNTENET1RPUFQKPiAtICAgICAgIGZpCj4gLSAgICAg
ZmkKPiAtCj4gLSAgICAgIyBjaGVja2luZyBmb3Igb2NhbWxvcHQub3B0Cj4gLSAgICAgaWYgdGVz
dCAiJE9DQU1MT1BUIiAhPSAibm8iIDsgdGhlbgo+IC0gICAgICAgaWYgdGVzdCAtbiAiJGFjX3Rv
b2xfcHJlZml4IjsgdGhlbgo+IC0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190
b29sX3ByZWZpeH1vY2FtbG9wdC5vcHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0
aCBhcmdzLgo+IC1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vY2FtbG9wdC5vcHQ7IGFjX3dv
cmQ9JDIKPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2lu
ZyBmb3IgJGFjX3dvcmQiID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQu
Li4gIiA+JjY7IH0KPiAtaWYgdGVzdCAiJHthY19jdl9wcm9nX09DQU1MT1BURE9UT1BUK3NldH0i
ID0gc2V0OyB0aGVuIDoKPiArYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQo+ICthY19zYXZl
X0NGTEFHUz0kQ0ZMQUdTCj4gK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1Cj4gKyRhc19lY2hvX24gImNo
ZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KPiAraWYgdGVzdCAiJHth
Y19jdl9wcm9nX2NjX2crc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICAgICRhc19lY2hvX24gIihjYWNo
ZWQpICIgPiY2Cj4gIGVsc2UKPiAtICBpZiB0ZXN0IC1uICIkT0NBTUxPUFRET1RPUFQiOyB0aGVu
Cj4gLSAgYWNfY3ZfcHJvZ19PQ0FNTE9QVERPVE9QVD0iJE9DQU1MT1BURE9UT1BUIiAjIExldCB0
aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KPiAtZWxzZQo+IC1hc19zYXZlX0lGUz0kSUZTOyBJ
RlM9JFBBVEhfU0VQQVJBVE9SCj4gLWZvciBhc19kaXIgaW4gJFBBVEgKPiAtZG8KPiAtICBJRlM9
JGFzX3NhdmVfSUZTCj4gLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KPiAtICAgIGZv
ciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwo+IC0gIGlm
IHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAi
JGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KPiAtICAgIGFjX2N2X3Byb2df
T0NBTUxPUFRET1RPUFQ9IiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxvcHQub3B0Igo+IC0gICAgJGFz
X2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29y
ZCRhY19leGVjX2V4dCIgPiY1Cj4gLSAgICBicmVhayAyCj4gLSAgZmkKPiAtZG9uZQo+IC0gIGRv
bmUKPiAtSUZTPSRhc19zYXZlX0lGUwo+ICsgIGFjX3NhdmVfY193ZXJyb3JfZmxhZz0kYWNfY193
ZXJyb3JfZmxhZwo+ICsgICBhY19jX3dlcnJvcl9mbGFnPXllcwo+ICsgICBhY19jdl9wcm9nX2Nj
X2c9bm8KPiArICAgQ0ZMQUdTPSItZyIKPiArICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+
Y29uZnRlc3QuJGFjX2V4dAo+ICsvKiBlbmQgY29uZmRlZnMuaC4gICovCj4gCj4gLWZpCj4gLWZp
Cj4gLU9DQU1MT1BURE9UT1BUPSRhY19jdl9wcm9nX09DQU1MT1BURE9UT1BUCj4gLWlmIHRlc3Qg
LW4gIiRPQ0FNTE9QVERPVE9QVCI7IHRoZW4KPiAtICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9DQU1MT1BURE9UT1BUIiA+JjUKPiAtJGFzX2VjaG8g
IiRPQ0FNTE9QVERPVE9QVCIgPiY2OyB9Cj4gK2ludAo+ICttYWluICgpCj4gK3sKPiArCj4gKyAg
Owo+ICsgIHJldHVybiAwOwo+ICt9Cj4gK19BQ0VPRgo+ICtpZiBhY19mbl9jX3RyeV9jb21waWxl
ICIkTElORU5PIjsgdGhlbiA6Cj4gKyAgYWNfY3ZfcHJvZ19jY19nPXllcwo+ICBlbHNlCj4gLSAg
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUK
PiAtJGFzX2VjaG8gIm5vIiA+JjY7IH0KPiAtZmkKPiArICBDRkxBR1M9IiIKPiArICAgICAgY2F0
IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAo+ICsvKiBlbmQgY29uZmRl
ZnMuaC4gICovCj4gCj4gK2ludAo+ICttYWluICgpCj4gK3sKPiAKPiAtZmkKPiAtaWYgdGVzdCAt
eiAiJGFjX2N2X3Byb2dfT0NBTUxPUFRET1RPUFQiOyB0aGVuCj4gLSAgYWNfY3RfT0NBTUxPUFRE
T1RPUFQ9JE9DQU1MT1BURE9UT1BUCj4gLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJv
Y2FtbG9wdC5vcHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgo+IC1z
ZXQgZHVtbXkgb2NhbWxvcHQub3B0OyBhY193b3JkPSQyCj4gLXsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKPiAtJGFzX2Vj
aG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNf
Y3ZfcHJvZ19hY19jdF9PQ0FNTE9QVERPVE9QVCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gLSAgJGFz
X2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAtZWxzZQo+IC0gIGlmIHRlc3QgLW4gIiRhY19jdF9P
Q0FNTE9QVERPVE9QVCI7IHRoZW4KPiAtICBhY19jdl9wcm9nX2FjX2N0X09DQU1MT1BURE9UT1BU
PSIkYWNfY3RfT0NBTUxPUFRET1RPUFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0
Lgo+IC1lbHNlCj4gLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKPiAtZm9y
IGFzX2RpciBpbiAkUEFUSAo+IC1kbwo+IC0gIElGUz0kYXNfc2F2ZV9JRlMKPiAtICB0ZXN0IC16
ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+IC0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19l
eGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193
b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNf
ZXh0IjsgfTsgdGhlbgo+IC0gICAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTE9QVERPVE9QVD0ib2Nh
bWxvcHQub3B0Igo+IC0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
Zm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Cj4gLSAgICBicmVhayAyCj4g
LSAgZmkKPiAtZG9uZQo+IC0gIGRvbmUKPiAtSUZTPSRhc19zYXZlX0lGUwo+ICsgIDsKPiArICBy
ZXR1cm4gMDsKPiArfQo+ICtfQUNFT0YKPiAraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVO
TyI7IHRoZW4gOgo+ICsKPiArZWxzZQo+ICsgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193
ZXJyb3JfZmxhZwo+ICsgICAgICAgIENGTEFHUz0iLWciCj4gKyAgICAgICAgY2F0IGNvbmZkZWZz
LmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAo+ICsvKiBlbmQgY29uZmRlZnMuaC4gICov
Cj4gKwo+ICtpbnQKPiArbWFpbiAoKQo+ICt7Cj4gCj4gKyAgOwo+ICsgIHJldHVybiAwOwo+ICt9
Cj4gK19BQ0VPRgo+ICtpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Cj4g
KyAgYWNfY3ZfcHJvZ19jY19nPXllcwo+ICBmaQo+ICtybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBj
b25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKPiAgZmkKPiAtYWNfY3RfT0NBTUxP
UFRET1RPUFQ9JGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxPUFRET1RPUFQKPiAtaWYgdGVzdCAtbiAi
JGFjX2N0X09DQU1MT1BURE9UT1BUIjsgdGhlbgo+IC0gIHsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0NBTUxPUFRET1RPUFQiID4mNQo+IC0k
YXNfZWNobyAiJGFjX2N0X09DQU1MT1BURE9UT1BUIiA+JjY7IH0KPiAtZWxzZQo+IC0gIHsgJGFz
X2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Cj4gLSRh
c19lY2hvICJubyIgPiY2OyB9Cj4gK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRh
Y19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAo+ICBmaQo+IC0KPiAtICBpZiB0ZXN0ICJ4JGFjX2N0
X09DQU1MT1BURE9UT1BUIiA9IHg7IHRoZW4KPiAtICAgIE9DQU1MT1BURE9UT1BUPSJubyIKPiAr
cm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNf
ZXh0Cj4gKyAgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwo+ICtmaQo+
ICt7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2
X3Byb2dfY2NfZyIgPiY1Cj4gKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KPiAr
aWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgo+ICsgIENGTEFHUz0kYWNfc2F2
ZV9DRkxBR1MKPiArZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KPiArICBp
ZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgo+ICsgICAgQ0ZMQUdTPSItZyAtTzIiCj4gICAgZWxz
ZQo+IC0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgo+IC15ZXM6
KQo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVz
aW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Cj4gLSRh
c19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3
aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KPiAtYWNfdG9vbF93YXJuZWQ9eWVzIDs7Cj4gLWVzYWMK
PiAtICAgIE9DQU1MT1BURE9UT1BUPSRhY19jdF9PQ0FNTE9QVERPVE9QVAo+ICsgICAgQ0ZMQUdT
PSItZyIKPiAgICBmaQo+ICBlbHNlCj4gLSAgT0NBTUxPUFRET1RPUFQ9IiRhY19jdl9wcm9nX09D
QU1MT1BURE9UT1BUIgo+IC1maQo+IC0KPiAtICAgICAgIGlmIHRlc3QgIiRPQ0FNTE9QVERPVE9Q
VCIgIT0gIm5vIjsgdGhlbgo+IC0gICAgICAgICAgVE1QVkVSU0lPTj1gJE9DQU1MT1BURE9UT1BU
IC12IHwgc2VkIC1uIC1lICdzfC4qdmVyc2lvbiogKlwoLipcKSR8XDF8cCcgYAo+IC0gICAgICAg
ICAgaWYgdGVzdCAiJFRNUFZFUlNJT04iICE9ICIkT0NBTUxWRVJTSU9OIiA7IHRoZW4KPiAtICAg
ICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0
OiB2ZXJzaW9uIGRpZmZlcnMgZnJvbSBvY2FtbGM7IG9jYW1sb3B0Lm9wdCBkaXNjYXJkZWQuIiA+
JjUKPiAtJGFzX2VjaG8gInZlcnNpb24gZGlmZmVycyBmcm9tIG9jYW1sYzsgb2NhbWxvcHQub3B0
IGRpc2NhcmRlZC4iID4mNjsgfQo+IC0gICAgICAgICAgZWxzZQo+IC0gICAgICAgICAgICAgT0NB
TUxPUFQ9JE9DQU1MT1BURE9UT1BUCj4gLSAgICAgICAgICBmaQo+IC0gICAgICAgIGZpCj4gLSAg
ICAgZmkKPiAtCj4gLQo+ICsgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCj4gKyAgICBDRkxB
R1M9Ii1PMiIKPiArICBlbHNlCj4gKyAgICBDRkxBR1M9Cj4gICAgZmkKPiArZmkKPiAreyAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJENDIG9wdGlv
biB0byBhY2NlcHQgSVNPIEM4OSIgPiY1Cj4gKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkQ0Mg
b3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICIgPiY2OyB9Cj4gK2lmIHRlc3QgIiR7YWNfY3Zf
cHJvZ19jY19jODkrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICsgICRhc19lY2hvX24gIihjYWNoZWQp
ICIgPiY2Cj4gK2Vsc2UKPiArICBhY19jdl9wcm9nX2NjX2M4OT1ubwo+ICthY19zYXZlX0NDPSRD
Qwo+ICtjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Cj4gKy8qIGVu
ZCBjb25mZGVmcy5oLiAgKi8KPiArI2luY2x1ZGUgPHN0ZGFyZy5oPgo+ICsjaW5jbHVkZSA8c3Rk
aW8uaD4KPiArI2luY2x1ZGUgPHN5cy90eXBlcy5oPgo+ICsjaW5jbHVkZSA8c3lzL3N0YXQuaD4K
PiArLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43
J3Mgc3JjL2NvbmYuc2guICAqLwo+ICtzdHJ1Y3QgYnVmIHsgaW50IHg7IH07Cj4gK0ZJTEUgKiAo
KnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7Cj4gK3N0YXRpYyBj
aGFyICplIChwLCBpKQo+ICsgICAgIGNoYXIgKipwOwo+ICsgICAgIGludCBpOwo+ICt7Cj4gKyAg
cmV0dXJuIHBbaV07Cj4gK30KPiArc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoq
LCBpbnQpLCBjaGFyICoqcCwgLi4uKQo+ICt7Cj4gKyAgY2hhciAqczsKPiArICB2YV9saXN0IHY7
Cj4gKyAgdmFfc3RhcnQgKHYscCk7Cj4gKyAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKPiAr
ICB2YV9lbmQgKHYpOwo+ICsgIHJldHVybiBzOwo+ICt9Cj4gCj4gKy8qIE9TRiA0LjAgQ29tcGFx
IGNjIGlzIHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCj4gKyAg
IGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFj
dGVyIGNvbnN0YW50cy4KPiArICAgVGhlc2UgZG9uJ3QgcHJvdm9rZSBhbiBlcnJvciB1bmZvcnR1
bmF0ZWx5LCBpbnN0ZWFkIGFyZSBzaWxlbnRseSB0cmVhdGVkCj4gKyAgIGFzICd4Jy4gIFRoZSBm
b2xsb3dpbmcgaW5kdWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZCBpcyBhZGRlZCB0byBnZXQKPiAr
ICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMg
b3V0IHRydWUsIGZvciBhbgo+ICsgICBhcnJheSBzaXplIGF0IGxlYXN0LiAgSXQncyBuZWNlc3Nh
cnkgdG8gd3JpdGUgJ1x4MDAnPT0wIHRvIGdldCBzb21ldGhpbmcKPiArICAgdGhhdCdzIHRydWUg
b25seSB3aXRoIC1zdGQuICAqLwo+ICtpbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAx
IDogLTFdOwo+IAo+ICsvKiBJQk0gQyA2IGZvciBBSVggaXMgYWxtb3N0LUFOU0kgYnkgZGVmYXVs
dCwgYnV0IGl0IHJlcGxhY2VzIG1hY3JvIHBhcmFtZXRlcnMKPiArICAgaW5zaWRlIHN0cmluZ3Mg
YW5kIGNoYXJhY3RlciBjb25zdGFudHMuICAqLwo+ICsjZGVmaW5lIEZPTyh4KSAneCcKPiAraW50
IHhsYzZfY2NfYXJyYXlbRk9PKGEpID09ICd4JyA/IDEgOiAtMV07Cj4gCj4gLSAgIyBjaGVja2lu
ZyBmb3Igb2NhbWwgdG9wbGV2ZWwKPiAtICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0
aGVuCj4gLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9j
YW1sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KPiAtc2V0IGR1bW15
ICR7YWNfdG9vbF9wcmVmaXh9b2NhbWw7IGFjX3dvcmQ9JDIKPiAteyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQo+IC0kYXNf
ZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KPiAtaWYgdGVzdCAiJHth
Y19jdl9wcm9nX09DQU1MK3NldH0iID0gc2V0OyB0aGVuIDoKPiAtICAkYXNfZWNob19uICIoY2Fj
aGVkKSAiID4mNgo+IC1lbHNlCj4gLSAgaWYgdGVzdCAtbiAiJE9DQU1MIjsgdGhlbgo+IC0gIGFj
X2N2X3Byb2dfT0NBTUw9IiRPQ0FNTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qu
Cj4gLWVsc2UKPiAtYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgo+IC1mb3Ig
YXNfZGlyIGluICRQQVRICj4gK2ludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOwo+ICtzdHJ1Y3Qg
czEge2ludCAoKmYpIChpbnQgYSk7fTsKPiArc3RydWN0IHMyIHtpbnQgKCpmKSAoZG91YmxlIGEp
O307Cj4gK2ludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYg
Kiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOwo+ICtpbnQgYXJnYzsKPiArY2hhciAq
KmFyZ3Y7Cj4gK2ludAo+ICttYWluICgpCj4gK3sKPiArcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9
IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOwo+ICsgIDsKPiArICByZXR1
cm4gMDsKPiArfQo+ICtfQUNFT0YKPiArZm9yIGFjX2FyZyBpbiAnJyAtcWxhbmdsdmw9ZXh0Yzg5
IC1xbGFuZ2x2bD1hbnNpIC1zdGQgXAo+ICsgICAgICAgLUFlICItQWEgLURfSFBVWF9TT1VSQ0Ui
ICItWGMgLURfX0VYVEVOU0lPTlNfXyIKPiAgZG8KPiAtICBJRlM9JGFzX3NhdmVfSUZTCj4gLSAg
dGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KPiAtICAgIGZvciBhY19leGVjX2V4dCBpbiAn
JyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwo+IC0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rp
ci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRh
Y19leGVjX2V4dCI7IH07IHRoZW4KPiAtICAgIGFjX2N2X3Byb2dfT0NBTUw9IiR7YWNfdG9vbF9w
cmVmaXh9b2NhbWwiCj4gLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKPiAtICAgIGJyZWFrIDIK
PiAtICBmaQo+ICsgIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgo+ICsgIGlmIGFjX2ZuX2NfdHJ5
X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKPiArICBhY19jdl9wcm9nX2NjX2M4OT0kYWNfYXJn
Cj4gK2ZpCj4gK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKPiAr
ICB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSAieG5vIiAmJiBicmVhawo+ICBkb25lCj4g
LSAgZG9uZQo+IC1JRlM9JGFzX3NhdmVfSUZTCj4gK3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQKPiAr
Q0M9JGFjX3NhdmVfQ0MKPiAKPiAgZmkKPiAtZmkKPiAtT0NBTUw9JGFjX2N2X3Byb2dfT0NBTUwK
PiAtaWYgdGVzdCAtbiAiJE9DQU1MIjsgdGhlbgo+IC0gIHsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0NBTUwiID4mNQo+IC0kYXNfZWNobyAiJE9DQU1M
IiA+JjY7IH0KPiAtZWxzZQo+IC0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiBubyIgPiY1Cj4gLSRhc19lY2hvICJubyIgPiY2OyB9Cj4gKyMgQUNfQ0FD
SEVfVkFMCj4gK2Nhc2UgIngkYWNfY3ZfcHJvZ19jY19jODkiIGluCj4gKyAgeCkKPiArICAgIHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub25lIG5lZWRl
ZCIgPiY1Cj4gKyRhc19lY2hvICJub25lIG5lZWRlZCIgPiY2OyB9IDs7Cj4gKyAgeG5vKQo+ICsg
ICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHVuc3Vw
cG9ydGVkIiA+JjUKPiArJGFzX2VjaG8gInVuc3VwcG9ydGVkIiA+JjY7IH0gOzsKPiArICAqKQo+
ICsgICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19jODkiCj4gKyAgICB7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUK
PiArJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2M4OSIgPiY2OyB9IDs7Cj4gK2VzYWMKPiAraWYg
dGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0geG5vOyB0aGVuIDoKPiArCj4gIGZpCj4gCj4g
K2FjX2V4dD1jCj4gK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCj4gK2FjX2NvbXBpbGU9JyRDQyAt
YyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKPiArYWNfbGluaz0nJEND
IC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVz
dC4kYWNfZXh0ICRMSUJTID4mNScKPiArYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVy
X2dudQo+IAo+IC1maQo+IC1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19PQ0FNTCI7IHRoZW4KPiAt
ICBhY19jdF9PQ0FNTD0kT0NBTUwKPiAtICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm9j
YW1sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KPiAtc2V0IGR1bW15
IG9jYW1sOyBhY193b3JkPSQyCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKPiAtJGFzX2VjaG9fbiAiY2hlY2tpbmcg
Zm9yICRhY193b3JkLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9P
Q0FNTCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKSIg
PiY1Cj4gKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQo
TUFLRSkuLi4gIiA+JjY7IH0KPiArc2V0IHggJHtNQUtFLW1ha2V9Cj4gK2FjX21ha2U9YCRhc19l
Y2hvICIkMiIgfCBzZWQgJ3MvKy9wL2c7IHMvW15hLXpBLVowLTlfXS9fL2cnYAo+ICtpZiBldmFs
ICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0K3NldH1cIiIgPSBzZXQ7
IHRoZW4gOgo+ICAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gIGVsc2UKPiAtICBpZiB0
ZXN0IC1uICIkYWNfY3RfT0NBTUwiOyB0aGVuCj4gLSAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTD0i
JGFjX2N0X09DQU1MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KPiAtZWxzZQo+
IC1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCj4gLWZvciBhc19kaXIgaW4g
JFBBVEgKPiAtZG8KPiAtICBJRlM9JGFzX3NhdmVfSUZTCj4gLSAgdGVzdCAteiAiJGFzX2RpciIg
JiYgYXNfZGlyPS4KPiAtICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9l
eHRlbnNpb25zOyBkbwo+IC0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVj
X2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRo
ZW4KPiAtICAgIGFjX2N2X3Byb2dfYWNfY3RfT0NBTUw9Im9jYW1sIgo+IC0gICAgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19l
eGVjX2V4dCIgPiY1Cj4gLSAgICBicmVhayAyCj4gLSAgZmkKPiAtZG9uZQo+IC0gIGRvbmUKPiAt
SUZTPSRhc19zYXZlX0lGUwo+IC0KPiAtZmkKPiAtZmkKPiAtYWNfY3RfT0NBTUw9JGFjX2N2X3By
b2dfYWNfY3RfT0NBTUwKPiAtaWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MIjsgdGhlbgo+IC0gIHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0NB
TUwiID4mNQo+IC0kYXNfZWNobyAiJGFjX2N0X09DQU1MIiA+JjY7IH0KPiAtZWxzZQo+IC0gIHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Cj4g
LSRhc19lY2hvICJubyIgPiY2OyB9Cj4gLWZpCj4gLQo+IC0gIGlmIHRlc3QgIngkYWNfY3RfT0NB
TUwiID0geDsgdGhlbgo+IC0gICAgT0NBTUw9Im5vIgo+IC0gIGVsc2UKPiAtICAgIGNhc2UgJGNy
b3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KPiAteWVzOikKPiAteyAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBu
b3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQo+IC0kYXNfZWNobyAiJGFzX21lOiBX
QVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQi
ID4mMjt9Cj4gLWFjX3Rvb2xfd2FybmVkPXllcyA7Owo+ICsgIGNhdCA+Y29uZnRlc3QubWFrZSA8
PFxfQUNFT0YKPiArU0hFTEwgPSAvYmluL3NoCj4gK2FsbDoKPiArICAgICAgIEBlY2hvICdAQEAl
JSU9JChNQUtFKT1AQEAlJSUnCj4gK19BQ0VPRgo+ICsjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmlu
dHMgIm1ha2VbMV06IEVudGVyaW5nIC4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCj4gK2Nh
c2UgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdC5tYWtlIDI+L2Rldi9udWxsYCBpbgo+ICsgICpA
QEAlJSU9Pyo9QEBAJSUlKikKPiArICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1f
c2V0PXllczs7Cj4gKyAgKikKPiArICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1f
c2V0PW5vOzsKPiAgZXNhYwo+IC0gICAgT0NBTUw9JGFjX2N0X09DQU1MCj4gLSAgZmkKPiArcm0g
LWYgY29uZnRlc3QubWFrZQo+ICtmaQo+ICtpZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2Vf
JHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KPiArICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKPiArJGFzX2VjaG8gInllcyIgPiY2OyB9
Cj4gKyAgU0VUX01BS0U9Cj4gIGVsc2UKPiAtICBPQ0FNTD0iJGFjX2N2X3Byb2dfT0NBTUwiCj4g
KyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+
JjUKPiArJGFzX2VjaG8gIm5vIiA+JjY7IH0KPiArICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFr
ZX0iCj4gIGZpCj4gCj4gLQo+IC0gICMgY2hlY2tpbmcgZm9yIG9jYW1sZGVwCj4gLSAgaWYgdGVz
dCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgo+IC0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29y
ZCBvZiAiJHthY190b29sX3ByZWZpeH1vY2FtbGRlcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0g
bmFtZSB3aXRoIGFyZ3MuCj4gLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW9jYW1sZGVwOyBh
Y193b3JkPSQyCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hl
Y2tpbmcgZm9yICRhY193b3JkIiA+JjUKPiAtJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193
b3JkLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19PQ0FNTERFUCtzZXR9IiA9
IHNldDsgdGhlbiA6Cj4gKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVy
IGEgQyBwcm9ncmFtIChmYXN0ZXIpLAo+ICsjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBh
bm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKPiArIyBpbmNvbXBhdGlibGUgdmVyc2lv
bnM6Cj4gKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCj4gKyMgU3VuT1Mg
L3Vzci9ldGMvaW5zdGFsbAo+ICsjIElSSVggL3NiaW4vaW5zdGFsbAo+ICsjIEFJWCAvYmluL2lu
c3RhbGwKPiArIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mg
b24gZmxvcHB5IGRpc2NzCj4gKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9l
c24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCj4gKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3Rh
bGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwo+ICsjIFNWUjQgL3Vzci91Y2Iv
aW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYi
Cj4gKyMgT1MvMidzIHN5c3RlbSBpbnN0YWxsLCB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IGRpZmZl
cmVudCBzZW1hbnRpYwo+ICsjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNy
ZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KPiArIyBSZWplY3QgaW5zdGFsbCBwcm9n
cmFtcyB0aGF0IGNhbm5vdCBpbnN0YWxsIG11bHRpcGxlIGZpbGVzLgo+ICt7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxl
IGluc3RhbGwiID4mNQo+ICskYXNfZWNob19uICJjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJs
ZSBpbnN0YWxsLi4uICIgPiY2OyB9Cj4gK2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgo+ICtp
ZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gICAgJGFz
X2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAgZWxzZQo+IC0gIGlmIHRlc3QgLW4gIiRPQ0FNTERF
UCI7IHRoZW4KPiAtICBhY19jdl9wcm9nX09DQU1MREVQPSIkT0NBTUxERVAiICMgTGV0IHRoZSB1
c2VyIG92ZXJyaWRlIHRoZSB0ZXN0Lgo+IC1lbHNlCj4gLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0k
UEFUSF9TRVBBUkFUT1IKPiArICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9S
Cj4gIGZvciBhc19kaXIgaW4gJFBBVEgKPiAgZG8KPiAgICBJRlM9JGFzX3NhdmVfSUZTCj4gICAg
dGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KPiAtICAgIGZvciBhY19leGVjX2V4dCBpbiAn
JyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwo+IC0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rp
ci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRh
Y19leGVjX2V4dCI7IH07IHRoZW4KPiAtICAgIGFjX2N2X3Byb2dfT0NBTUxERVA9IiR7YWNfdG9v
bF9wcmVmaXh9b2NhbWxkZXAiCj4gLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKPiAtICAgIGJy
ZWFrIDIKPiAtICBmaQo+IC1kb25lCj4gKyAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0
IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KPiArY2FzZSAkYXNfZGlyLyBpbiAj
KCgKPiArICAuLyB8IC4vLyB8IC9bY0NdLyogfCBcCj4gKyAgL2V0Yy8qIHwgL3Vzci9zYmluLyog
fCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogfCBcCj4gKyAgPzpbXFwv
XW9zMltcXC9daW5zdGFsbFtcXC9dKiB8ID86W1xcL11PUzJbXFwvXUlOU1RBTExbXFwvXSogfCBc
Cj4gKyAgL3Vzci91Y2IvKiApIDs7Cj4gKyAgKikKPiArICAgICMgT1NGMSBhbmQgU0NPIE9EVCAz
LjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCj4gKyAgICAjIERvbid0IHVzZSBp
bnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKPiArICAg
ICMgYnkgZGVmYXVsdC4KPiArICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5z
dGFsbDsgZG8KPiArICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4
dGVuc2lvbnM7IGRvCj4gKyAgICAgICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3Byb2ckYWNf
ZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB9
OyB0aGVuCj4gKyAgICAgICAgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCj4gKyAgICAg
ICAgICAgZ3JlcCBkc3Btc2cgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251
bGwgMj4mMTsgdGhlbgo+ICsgICAgICAgICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5j
b21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KPiArICAgICAgICAgICA6Cj4gKyAgICAgICAg
IGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKPiArICAgICAgICAgICBncmVwIHB3cGx1
cyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCj4g
KyAgICAgICAgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAg
cHdwbHVzLS1kb24ndCB1c2UuCj4gKyAgICAgICAgICAgOgo+ICsgICAgICAgICBlbHNlCj4gKyAg
ICAgICAgICAgcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCj4g
KyAgICAgICAgICAgZWNobyBvbmUgPiBjb25mdGVzdC5vbmUKPiArICAgICAgICAgICBlY2hvIHR3
byA+IGNvbmZ0ZXN0LnR3bwo+ICsgICAgICAgICAgIG1rZGlyIGNvbmZ0ZXN0LmRpcgo+ICsgICAg
ICAgICAgIGlmICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiAtYyBjb25mdGVzdC5vbmUg
Y29uZnRlc3QudHdvICJgcHdkYC9jb25mdGVzdC5kaXIiICYmCj4gKyAgICAgICAgICAgICB0ZXN0
IC1zIGNvbmZ0ZXN0Lm9uZSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LnR3byAmJgo+ICsgICAgICAgICAg
ICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3Qub25lICYmCj4gKyAgICAgICAgICAgICB0
ZXN0IC1zIGNvbmZ0ZXN0LmRpci9jb25mdGVzdC50d28KPiArICAgICAgICAgICB0aGVuCj4gKyAg
ICAgICAgICAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19l
eHQgLWMiCj4gKyAgICAgICAgICAgICBicmVhayAzCj4gKyAgICAgICAgICAgZmkKPiArICAgICAg
ICAgZmkKPiArICAgICAgIGZpCj4gKyAgICAgIGRvbmUKPiArICAgIGRvbmUKPiArICAgIDs7Cj4g
K2VzYWMKPiArCj4gICAgZG9uZQo+ICBJRlM9JGFzX3NhdmVfSUZTCj4gCj4gK3JtIC1yZiBjb25m
dGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgo+ICsKPiAgZmkKPiArICBpZiB0ZXN0
ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgo+ICsgICAgSU5TVEFMTD0k
YWNfY3ZfcGF0aF9pbnN0YWxsCj4gKyAgZWxzZQo+ICsgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1
c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQo+ICsgICAgIyB2YWx1ZSBm
b3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAo+
ICsgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJl
Y3RvcnkgaXMKPiArICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUg
bmFtZS4KPiArICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKPiArICBmaQo+ICBmaQo+IC1PQ0FN
TERFUD0kYWNfY3ZfcHJvZ19PQ0FNTERFUAo+IC1pZiB0ZXN0IC1uICIkT0NBTUxERVAiOyB0aGVu
Cj4gLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRP
Q0FNTERFUCIgPiY1Cj4gLSRhc19lY2hvICIkT0NBTUxERVAiID4mNjsgfQo+IC1lbHNlCj4gLSAg
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUK
PiAtJGFzX2VjaG8gIm5vIiA+JjY7IH0KPiAtZmkKPiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKPiArJGFzX2VjaG8gIiRJTlNU
QUxMIiA+JjY7IH0KPiAKPiArIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5k
bGVzIGJyYWNlcyBpbiAke3Zhci12YWx9Lgo+ICsjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2Ug
YnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgo+ICt0ZXN0IC16ICIkSU5TVEFM
TF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCj4gCj4gLWZpCj4gLWlm
IHRlc3QgLXogIiRhY19jdl9wcm9nX09DQU1MREVQIjsgdGhlbgo+IC0gIGFjX2N0X09DQU1MREVQ
PSRPQ0FNTERFUAo+IC0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2NhbWxkZXAiLCBz
byBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgo+IC1zZXQgZHVtbXkgb2NhbWxk
ZXA7IGFjX3dvcmQ9JDIKPiArdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1ND
UklQVD0nJHtJTlNUQUxMfScKPiArCj4gK3Rlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RB
TExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCj4gKwo+ICsjIEV4dHJhY3QgdGhlIGZpcnN0IHdv
cmQgb2YgImJpc29uIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KPiAr
c2V0IGR1bW15IGJpc29uOyBhY193b3JkPSQyCj4gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp
bmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKPiAgJGFzX2VjaG9fbiAi
Y2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfcHJv
Z19hY19jdF9PQ0FNTERFUCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gK2lmIHRlc3QgIiR7YWNfY3Zf
cGF0aF9CSVNPTitzZXR9IiA9IHNldDsgdGhlbiA6Cj4gICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkg
IiA+JjYKPiAgZWxzZQo+IC0gIGlmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTERFUCI7IHRoZW4KPiAt
ICBhY19jdl9wcm9nX2FjX2N0X09DQU1MREVQPSIkYWNfY3RfT0NBTUxERVAiICMgTGV0IHRoZSB1
c2VyIG92ZXJyaWRlIHRoZSB0ZXN0Lgo+IC1lbHNlCj4gLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0k
UEFUSF9TRVBBUkFUT1IKPiArICBjYXNlICRCSVNPTiBpbgo+ICsgIFtcXC9dKiB8ID86W1xcL10q
KQo+ICsgIGFjX2N2X3BhdGhfQklTT049IiRCSVNPTiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUg
dGhlIHRlc3Qgd2l0aCBhIHBhdGguCj4gKyAgOzsKPiArICAqKQo+ICsgIGFzX3NhdmVfSUZTPSRJ
RlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKPiAgZm9yIGFzX2RpciBpbiAkUEFUSAo+ICBkbwo+ICAg
IElGUz0kYXNfc2F2ZV9JRlMKPiAgICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+ICAg
ICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4g
ICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVz
dF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+IC0gICAgYWNfY3Zf
cHJvZ19hY19jdF9PQ0FNTERFUD0ib2NhbWxkZXAiCj4gKyAgICBhY19jdl9wYXRoX0JJU09OPSIk
YXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0Igo+ICAgICAgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1
Cj4gICAgICBicmVhayAyCj4gICAgZmkKPiBAQCAtNTgzMyw1MyArMzU2NSwzOSBAQCBkb25lCj4g
ICAgZG9uZQo+ICBJRlM9JGFzX3NhdmVfSUZTCj4gCj4gKyAgOzsKPiArZXNhYwo+ICBmaQo+IC1m
aQo+IC1hY19jdF9PQ0FNTERFUD0kYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTERFUAo+IC1pZiB0ZXN0
IC1uICIkYWNfY3RfT0NBTUxERVAiOyB0aGVuCj4gLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9PQ0FNTERFUCIgPiY1Cj4gLSRhc19lY2hv
ICIkYWNfY3RfT0NBTUxERVAiID4mNjsgfQo+ICtCSVNPTj0kYWNfY3ZfcGF0aF9CSVNPTgo+ICtp
ZiB0ZXN0IC1uICIkQklTT04iOyB0aGVuCj4gKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCSVNPTiIgPiY1Cj4gKyRhc19lY2hvICIkQklTT04iID4m
NjsgfQo+ICBlbHNlCj4gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiByZXN1bHQ6IG5vIiA+JjUKPiAgJGFzX2VjaG8gIm5vIiA+JjY7IH0KPiAgZmkKPiAKPiAtICBp
ZiB0ZXN0ICJ4JGFjX2N0X09DQU1MREVQIiA9IHg7IHRoZW4KPiAtICAgIE9DQU1MREVQPSJubyIK
PiAtICBlbHNlCj4gLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGlu
Cj4gLXllczopCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FS
TklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+
JjUKPiAtJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHBy
ZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQo+IC1hY190b29sX3dhcm5lZD15ZXMgOzsK
PiAtZXNhYwo+IC0gICAgT0NBTUxERVA9JGFjX2N0X09DQU1MREVQCj4gLSAgZmkKPiAtZWxzZQo+
IC0gIE9DQU1MREVQPSIkYWNfY3ZfcHJvZ19PQ0FNTERFUCIKPiAtZmkKPiAtCj4gCj4gLSAgIyBj
aGVja2luZyBmb3Igb2NhbWxta3RvcAo+IC0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7
IHRoZW4KPiAtICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9
b2NhbWxta3RvcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCj4gLXNl
dCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW9jYW1sbWt0b3A7IGFjX3dvcmQ9JDIKPiArIyBFeHRy
YWN0IHRoZSBmaXJzdCB3b3JkIG9mICJmbGV4Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1l
IHdpdGggYXJncy4KPiArc2V0IGR1bW15IGZsZXg7IGFjX3dvcmQ9JDIKPiAgeyAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQo+
ICAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KPiAtaWYgdGVz
dCAiJHthY19jdl9wcm9nX09DQU1MTUtUT1Arc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICtpZiB0ZXN0
ICIke2FjX2N2X3BhdGhfRkxFWCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gICAgJGFzX2VjaG9fbiAi
KGNhY2hlZCkgIiA+JjYKPiAgZWxzZQo+IC0gIGlmIHRlc3QgLW4gIiRPQ0FNTE1LVE9QIjsgdGhl
bgo+IC0gIGFjX2N2X3Byb2dfT0NBTUxNS1RPUD0iJE9DQU1MTUtUT1AiICMgTGV0IHRoZSB1c2Vy
IG92ZXJyaWRlIHRoZSB0ZXN0Lgo+IC1lbHNlCj4gLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFU
SF9TRVBBUkFUT1IKPiArICBjYXNlICRGTEVYIGluCj4gKyAgW1xcL10qIHwgPzpbXFwvXSopCj4g
KyAgYWNfY3ZfcGF0aF9GTEVYPSIkRkxFWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRl
c3Qgd2l0aCBhIHBhdGguCj4gKyAgOzsKPiArICAqKQo+ICsgIGFzX3NhdmVfSUZTPSRJRlM7IElG
Uz0kUEFUSF9TRVBBUkFUT1IKPiAgZm9yIGFzX2RpciBpbiAkUEFUSAo+ICBkbwo+ICAgIElGUz0k
YXNfc2F2ZV9JRlMKPiAgICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+ICAgICAgZm9y
IGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gICAgaWYg
eyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIk
YXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+IC0gICAgYWNfY3ZfcHJvZ19P
Q0FNTE1LVE9QPSIke2FjX3Rvb2xfcHJlZml4fW9jYW1sbWt0b3AiCj4gKyAgICBhY19jdl9wYXRo
X0ZMRVg9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCj4gICAgICAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNf
ZXh0IiA+JjUKPiAgICAgIGJyZWFrIDIKPiAgICBmaQo+IEBAIC01ODg3LDM5ICszNjA1LDM5IEBA
IGRvbmUKPiAgICBkb25lCj4gIElGUz0kYXNfc2F2ZV9JRlMKPiAKPiArICA7Owo+ICtlc2FjCj4g
IGZpCj4gLWZpCj4gLU9DQU1MTUtUT1A9JGFjX2N2X3Byb2dfT0NBTUxNS1RPUAo+IC1pZiB0ZXN0
IC1uICIkT0NBTUxNS1RPUCI7IHRoZW4KPiAtICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IHJlc3VsdDogJE9DQU1MTUtUT1AiID4mNQo+IC0kYXNfZWNobyAiJE9DQU1M
TUtUT1AiID4mNjsgfQo+ICtGTEVYPSRhY19jdl9wYXRoX0ZMRVgKPiAraWYgdGVzdCAtbiAiJEZM
RVgiOyB0aGVuCj4gKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBy
ZXN1bHQ6ICRGTEVYIiA+JjUKPiArJGFzX2VjaG8gIiRGTEVYIiA+JjY7IH0KPiAgZWxzZQo+ICAg
IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1
Cj4gICRhc19lY2hvICJubyIgPiY2OyB9Cj4gIGZpCj4gCj4gCj4gLWZpCj4gLWlmIHRlc3QgLXog
IiRhY19jdl9wcm9nX09DQU1MTUtUT1AiOyB0aGVuCj4gLSAgYWNfY3RfT0NBTUxNS1RPUD0kT0NB
TUxNS1RPUAo+IC0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2NhbWxta3RvcCIsIHNv
IGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCj4gLXNldCBkdW1teSBvY2FtbG1r
dG9wOyBhY193b3JkPSQyCj4gKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicGVybCIsIHNv
IGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCj4gK3NldCBkdW1teSBwZXJsOyBh
Y193b3JkPSQyCj4gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hl
Y2tpbmcgZm9yICRhY193b3JkIiA+JjUKPiAgJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193
b3JkLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9PQ0FNTE1LVE9Q
K3NldH0iID0gc2V0OyB0aGVuIDoKPiAraWYgdGVzdCAiJHthY19jdl9wYXRoX1BFUkwrc2V0fSIg
PSBzZXQ7IHRoZW4gOgo+ICAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gIGVsc2UKPiAt
ICBpZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxNS1RPUCI7IHRoZW4KPiAtICBhY19jdl9wcm9nX2Fj
X2N0X09DQU1MTUtUT1A9IiRhY19jdF9PQ0FNTE1LVE9QIiAjIExldCB0aGUgdXNlciBvdmVycmlk
ZSB0aGUgdGVzdC4KPiAtZWxzZQo+IC1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJB
VE9SCj4gKyAgY2FzZSAkUEVSTCBpbgo+ICsgIFtcXC9dKiB8ID86W1xcL10qKQo+ICsgIGFjX2N2
X3BhdGhfUEVSTD0iJFBFUkwiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGgg
YSBwYXRoLgo+ICsgIDs7Cj4gKyAgKikKPiArICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhf
U0VQQVJBVE9SCj4gIGZvciBhc19kaXIgaW4gJFBBVEgKPiAgZG8KPiAgICBJRlM9JGFzX3NhdmVf
SUZTCj4gICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KPiAgICAgIGZvciBhY19leGVj
X2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwo+ICAgIGlmIHsgdGVzdCAt
ZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8k
YWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KPiAtICAgIGFjX2N2X3Byb2dfYWNfY3RfT0NB
TUxNS1RPUD0ib2NhbWxta3RvcCIKPiArICAgIGFjX2N2X3BhdGhfUEVSTD0iJGFzX2Rpci8kYWNf
d29yZCRhY19leGVjX2V4dCIKPiAgICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQo+ICAgICAgYnJl
YWsgMgo+ICAgIGZpCj4gQEAgLTU5MjcsNTMgKzM2NDUsNDYgQEAgZG9uZQo+ICAgIGRvbmUKPiAg
SUZTPSRhc19zYXZlX0lGUwo+IAo+ICsgIHRlc3QgLXogIiRhY19jdl9wYXRoX1BFUkwiICYmIGFj
X2N2X3BhdGhfUEVSTD0ibm8iCj4gKyAgOzsKPiArZXNhYwo+ICBmaQo+IC1maQo+IC1hY19jdF9P
Q0FNTE1LVE9QPSRhY19jdl9wcm9nX2FjX2N0X09DQU1MTUtUT1AKPiAtaWYgdGVzdCAtbiAiJGFj
X2N0X09DQU1MTUtUT1AiOyB0aGVuCj4gLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9PQ0FNTE1LVE9QIiA+JjUKPiAtJGFzX2VjaG8gIiRh
Y19jdF9PQ0FNTE1LVE9QIiA+JjY7IH0KPiArUEVSTD0kYWNfY3ZfcGF0aF9QRVJMCj4gK2lmIHRl
c3QgLW4gIiRQRVJMIjsgdGhlbgo+ICsgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogcmVzdWx0OiAkUEVSTCIgPiY1Cj4gKyRhc19lY2hvICIkUEVSTCIgPiY2OyB9Cj4g
IGVsc2UKPiAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogbm8iID4mNQo+ICAkYXNfZWNobyAibm8iID4mNjsgfQo+ICBmaQo+IAo+IC0gIGlmIHRlc3Qg
IngkYWNfY3RfT0NBTUxNS1RPUCIgPSB4OyB0aGVuCj4gLSAgICBPQ0FNTE1LVE9QPSJubyIKPiAt
ICBlbHNlCj4gLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCj4g
LXllczopCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklO
RzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUK
PiAtJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZp
eGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQo+IC1hY190b29sX3dhcm5lZD15ZXMgOzsKPiAt
ZXNhYwo+IC0gICAgT0NBTUxNS1RPUD0kYWNfY3RfT0NBTUxNS1RPUAo+IC0gIGZpCj4gLWVsc2UK
PiAtICBPQ0FNTE1LVE9QPSIkYWNfY3ZfcHJvZ19PQ0FNTE1LVE9QIgo+IC1maQo+IAo+ICtpZiB0
ZXN0IHgiJHtQRVJMfSIgPT0geCJubyIKPiArdGhlbgo+ICsgICAgYXNfZm5fZXJyb3IgJD8gIlVu
YWJsZSB0byBmaW5kIHBlcmwsIHBsZWFzZSBpbnN0YWxsIHBlcmwiICIkTElORU5PIiA1Cj4gK2Zp
Cj4gK2lmIHRlc3QgIngkeGFwaSIgPSAieHkiOyB0aGVuIDoKPiAKPiAtICAjIGNoZWNraW5nIGZv
ciBvY2FtbG1rbGliCj4gLSAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgo+IC0g
ICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1vY2FtbG1rbGli
Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KPiAtc2V0IGR1bW15ICR7
YWNfdG9vbF9wcmVmaXh9b2NhbWxta2xpYjsgYWNfd29yZD0kMgo+ICsgICAgIyBFeHRyYWN0IHRo
ZSBmaXJzdCB3b3JkIG9mICJjdXJsLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFt
ZSB3aXRoIGFyZ3MuCj4gK3NldCBkdW1teSBjdXJsLWNvbmZpZzsgYWNfd29yZD0kMgo+ICB7ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29y
ZCIgPiY1Cj4gICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQo+
IC1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfT0NBTUxNS0xJQitzZXR9IiA9IHNldDsgdGhlbiA6Cj4g
K2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9DVVJMK3NldH0iID0gc2V0OyB0aGVuIDoKPiAgICAkYXNf
ZWNob19uICIoY2FjaGVkKSAiID4mNgo+ICBlbHNlCj4gLSAgaWYgdGVzdCAtbiAiJE9DQU1MTUtM
SUIiOyB0aGVuCj4gLSAgYWNfY3ZfcHJvZ19PQ0FNTE1LTElCPSIkT0NBTUxNS0xJQiIgIyBMZXQg
dGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCj4gLWVsc2UKPiAtYXNfc2F2ZV9JRlM9JElGUzsg
SUZTPSRQQVRIX1NFUEFSQVRPUgo+ICsgIGNhc2UgJENVUkwgaW4KPiArICBbXFwvXSogfCA/Oltc
XC9dKikKPiArICBhY19jdl9wYXRoX0NVUkw9IiRDVVJMIiAjIExldCB0aGUgdXNlciBvdmVycmlk
ZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KPiArICA7Owo+ICsgICopCj4gKyAgYXNfc2F2ZV9JRlM9
JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgo+ICBmb3IgYXNfZGlyIGluICRQQVRICj4gIGRvCj4g
ICAgSUZTPSRhc19zYXZlX0lGUwo+ICAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCj4g
ICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8K
PiAgICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190
ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCj4gLSAgICBhY19j
dl9wcm9nX09DQU1MTUtMSUI9IiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxta2xpYiIKPiArICAgIGFj
X2N2X3BhdGhfQ1VSTD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKPiAgICAgICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQk
YWNfZXhlY19leHQiID4mNQo+ICAgICAgYnJlYWsgMgo+ICAgIGZpCj4gQEAgLTU5ODEsMzkgKzM2
OTIsNDQgQEAgZG9uZQo+ICAgIGRvbmUKPiAgSUZTPSRhc19zYXZlX0lGUwo+IAo+ICsgIHRlc3Qg
LXogIiRhY19jdl9wYXRoX0NVUkwiICYmIGFjX2N2X3BhdGhfQ1VSTD0ibm8iCj4gKyAgOzsKPiAr
ZXNhYwo+ICBmaQo+IC1maQo+IC1PQ0FNTE1LTElCPSRhY19jdl9wcm9nX09DQU1MTUtMSUIKPiAt
aWYgdGVzdCAtbiAiJE9DQU1MTUtMSUIiOyB0aGVuCj4gLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPQ0FNTE1LTElCIiA+JjUKPiAtJGFzX2VjaG8g
IiRPQ0FNTE1LTElCIiA+JjY7IH0KPiArQ1VSTD0kYWNfY3ZfcGF0aF9DVVJMCj4gK2lmIHRlc3Qg
LW4gIiRDVVJMIjsgdGhlbgo+ICsgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiAkQ1VSTCIgPiY1Cj4gKyRhc19lY2hvICIkQ1VSTCIgPiY2OyB9Cj4gIGVs
c2UKPiAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDog
bm8iID4mNQo+ICAkYXNfZWNobyAibm8iID4mNjsgfQo+ICBmaQo+IAo+IAo+ICtpZiB0ZXN0IHgi
JHtDVVJMfSIgPT0geCJubyIKPiArdGhlbgo+ICsgICAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0
byBmaW5kIGN1cmwtY29uZmlnLCBwbGVhc2UgaW5zdGFsbCBjdXJsLWNvbmZpZyIgIiRMSU5FTk8i
IDUKPiAgZmkKPiAtaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT0NBTUxNS0xJQiI7IHRoZW4KPiAt
ICBhY19jdF9PQ0FNTE1LTElCPSRPQ0FNTE1LTElCCj4gLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3
b3JkIG9mICJvY2FtbG1rbGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJn
cy4KPiAtc2V0IGR1bW15IG9jYW1sbWtsaWI7IGFjX3dvcmQ9JDIKPiArICAgICMgRXh0cmFjdCB0
aGUgZmlyc3Qgd29yZCBvZiAieG1sMi1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5h
bWUgd2l0aCBhcmdzLgo+ICtzZXQgZHVtbXkgeG1sMi1jb25maWc7IGFjX3dvcmQ9JDIKPiAgeyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dv
cmQiID4mNQo+ICAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0K
PiAtaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X09DQU1MTUtMSUIrc2V0fSIgPSBzZXQ7IHRo
ZW4gOgo+ICtpZiB0ZXN0ICIke2FjX2N2X3BhdGhfWE1MK3NldH0iID0gc2V0OyB0aGVuIDoKPiAg
ICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgo+ICBlbHNlCj4gLSAgaWYgdGVzdCAtbiAiJGFj
X2N0X09DQU1MTUtMSUIiOyB0aGVuCj4gLSAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTE1LTElCPSIk
YWNfY3RfT0NBTUxNS0xJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCj4gLWVs
c2UKPiAtYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgo+ICsgIGNhc2UgJFhN
TCBpbgo+ICsgIFtcXC9dKiB8ID86W1xcL10qKQo+ICsgIGFjX2N2X3BhdGhfWE1MPSIkWE1MIiAj
IExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KPiArICA7Owo+ICsg
ICopCj4gKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgo+ICBmb3IgYXNf
ZGlyIGluICRQQVRICj4gIGRvCj4gICAgSUZTPSRhc19zYXZlX0lGUwo+ICAgIHRlc3QgLXogIiRh
c19kaXIiICYmIGFzX2Rpcj0uCj4gICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1
dGFibGVfZXh0ZW5zaW9uczsgZG8KPiAgICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQk
YWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQi
OyB9OyB0aGVuCj4gLSAgICBhY19jdl9wcm9nX2FjX2N0X09DQU1MTUtMSUI9Im9jYW1sbWtsaWIi
Cj4gKyAgICBhY19jdl9wYXRoX1hNTD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKPiAg
ICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIv
JGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQo+ICAgICAgYnJlYWsgMgo+ICAgIGZpCj4gQEAgLTYw
MjEsNDQgKzM3MzcsMzkgQEAgZG9uZQo+ICAgIGRvbmUKPiAgSUZTPSRhc19zYXZlX0lGUwo+IAo+
ICsgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hNTCIgJiYgYWNfY3ZfcGF0aF9YTUw9Im5vIgo+ICsg
IDs7Cj4gK2VzYWMKPiAgZmkKPiAtZmkKPiAtYWNfY3RfT0NBTUxNS0xJQj0kYWNfY3ZfcHJvZ19h
Y19jdF9PQ0FNTE1LTElCCj4gLWlmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTE1LTElCIjsgdGhlbgo+
IC0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNf
Y3RfT0NBTUxNS0xJQiIgPiY1Cj4gLSRhc19lY2hvICIkYWNfY3RfT0NBTUxNS0xJQiIgPiY2OyB9
Cj4gK1hNTD0kYWNfY3ZfcGF0aF9YTUwKPiAraWYgdGVzdCAtbiAiJFhNTCI7IHRoZW4KPiArICB7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFhNTCIgPiY1
Cj4gKyRhc19lY2hvICIkWE1MIiA+JjY7IH0KPiAgZWxzZQo+ICAgIHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Cj4gICRhc19lY2hvICJubyIg
PiY2OyB9Cj4gIGZpCj4gCj4gLSAgaWYgdGVzdCAieCRhY19jdF9PQ0FNTE1LTElCIiA9IHg7IHRo
ZW4KPiAtICAgIE9DQU1MTUtMSUI9Im5vIgo+IC0gIGVsc2UKPiAtICAgIGNhc2UgJGNyb3NzX2Nv
bXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KPiAteWVzOikKPiAteyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJl
Zml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQo+IC0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5H
OiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9
Cj4gLWFjX3Rvb2xfd2FybmVkPXllcyA7Owo+IC1lc2FjCj4gLSAgICBPQ0FNTE1LTElCPSRhY19j
dF9PQ0FNTE1LTElCCj4gLSAgZmkKPiAtZWxzZQo+IC0gIE9DQU1MTUtMSUI9IiRhY19jdl9wcm9n
X09DQU1MTUtMSUIiCj4gKwo+ICtpZiB0ZXN0IHgiJHtYTUx9IiA9PSB4Im5vIgo+ICt0aGVuCj4g
KyAgICBhc19mbl9lcnJvciAkPyAiVW5hYmxlIHRvIGZpbmQgeG1sMi1jb25maWcsIHBsZWFzZSBp
bnN0YWxsIHhtbDItY29uZmlnIiAiJExJTkVOTyIgNQo+ICBmaQo+IAo+ICtmaQo+ICtpZiB0ZXN0
ICJ4JG9jYW1sdG9vbHMiID0gInh5IjsgdGhlbiA6Cj4gCj4gLSAgIyBjaGVja2luZyBmb3Igb2Nh
bWxkb2MKPiArICAgICAgIyBjaGVja2luZyBmb3Igb2NhbWxjCj4gICAgaWYgdGVzdCAtbiAiJGFj
X3Rvb2xfcHJlZml4IjsgdGhlbgo+IC0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHth
Y190b29sX3ByZWZpeH1vY2FtbGRvYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRo
IGFyZ3MuCj4gLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW9jYW1sZG9jOyBhY193b3JkPSQy
Cj4gKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9jYW1s
YyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCj4gK3NldCBkdW1teSAk
e2FjX3Rvb2xfcHJlZml4fW9jYW1sYzsgYWNfd29yZD0kMgo+ICB7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cj4gICRhc19l
Y2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0ICIke2Fj
X2N2X3Byb2dfT0NBTUxET0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICtpZiB0ZXN0ICIke2FjX2N2
X3Byb2dfT0NBTUxDK3NldH0iID0gc2V0OyB0aGVuIDoKPiAgICAkYXNfZWNob19uICIoY2FjaGVk
KSAiID4mNgo+ICBlbHNlCj4gLSAgaWYgdGVzdCAtbiAiJE9DQU1MRE9DIjsgdGhlbgo+IC0gIGFj
X2N2X3Byb2dfT0NBTUxET0M9IiRPQ0FNTERPQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhl
IHRlc3QuCj4gKyAgaWYgdGVzdCAtbiAiJE9DQU1MQyI7IHRoZW4KPiArICBhY19jdl9wcm9nX09D
QU1MQz0iJE9DQU1MQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCj4gIGVsc2UK
PiAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgo+ICBmb3IgYXNfZGlyIGlu
ICRQQVRICj4gQEAgLTYwNjcsNyArMzc3OCw3IEBAIGRvCj4gICAgdGVzdCAteiAiJGFzX2RpciIg
JiYgYXNfZGlyPS4KPiAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9l
eHRlbnNpb25zOyBkbwo+ICAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVj
X2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRo
ZW4KPiAtICAgIGFjX2N2X3Byb2dfT0NBTUxET0M9IiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxkb2Mi
Cj4gKyAgICBhY19jdl9wcm9nX09DQU1MQz0iJHthY190b29sX3ByZWZpeH1vY2FtbGMiCj4gICAg
ICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRh
Y193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKPiAgICAgIGJyZWFrIDIKPiAgICBmaQo+IEBAIC02MDc3
LDEwICszNzg4LDEwIEBAIElGUz0kYXNfc2F2ZV9JRlMKPiAKPiAgZmkKPiAgZmkKPiAtT0NBTUxE
T0M9JGFjX2N2X3Byb2dfT0NBTUxET0MKPiAtaWYgdGVzdCAtbiAiJE9DQU1MRE9DIjsgdGhlbgo+
IC0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0NB
TUxET0MiID4mNQo+IC0kYXNfZWNobyAiJE9DQU1MRE9DIiA+JjY7IH0KPiArT0NBTUxDPSRhY19j
dl9wcm9nX09DQU1MQwo+ICtpZiB0ZXN0IC1uICIkT0NBTUxDIjsgdGhlbgo+ICsgIHsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0NBTUxDIiA+JjUKPiAr
JGFzX2VjaG8gIiRPQ0FNTEMiID4mNjsgfQo+ICBlbHNlCj4gICAgeyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKPiAgJGFzX2VjaG8gIm5vIiA+
JjY7IH0KPiBAQCAtNjA4OCwxNyArMzc5OSwxNyBAQCBmaQo+IAo+IAo+ICBmaQo+IC1pZiB0ZXN0
IC16ICIkYWNfY3ZfcHJvZ19PQ0FNTERPQyI7IHRoZW4KPiAtICBhY19jdF9PQ0FNTERPQz0kT0NB
TUxET0MKPiAtICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm9jYW1sZG9jIiwgc28gaXQg
Y2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KPiAtc2V0IGR1bW15IG9jYW1sZG9jOyBh
Y193b3JkPSQyCj4gK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX09DQU1MQyI7IHRoZW4KPiArICBh
Y19jdF9PQ0FNTEM9JE9DQU1MQwo+ICsgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2Nh
bWxjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KPiArc2V0IGR1bW15
IG9jYW1sYzsgYWNfd29yZD0kMgo+ICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cj4gICRhc19lY2hvX24gImNoZWNraW5n
IGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3Rf
T0NBTUxET0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICtpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNf
Y3RfT0NBTUxDK3NldH0iID0gc2V0OyB0aGVuIDoKPiAgICAkYXNfZWNob19uICIoY2FjaGVkKSAi
ID4mNgo+ICBlbHNlCj4gLSAgaWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MRE9DIjsgdGhlbgo+IC0g
IGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxET0M9IiRhY19jdF9PQ0FNTERPQyIgIyBMZXQgdGhlIHVz
ZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCj4gKyAgaWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MQyI7IHRo
ZW4KPiArICBhY19jdl9wcm9nX2FjX2N0X09DQU1MQz0iJGFjX2N0X09DQU1MQyIgIyBMZXQgdGhl
IHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCj4gIGVsc2UKPiAgYXNfc2F2ZV9JRlM9JElGUzsgSUZT
PSRQQVRIX1NFUEFSQVRPUgo+ICBmb3IgYXNfZGlyIGluICRQQVRICj4gQEAgLTYxMDcsNyArMzgx
OCw3IEBAIGRvCj4gICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KPiAgICAgIGZvciBh
Y19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwo+ICAgIGlmIHsg
dGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFz
X2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KPiAtICAgIGFjX2N2X3Byb2dfYWNf
Y3RfT0NBTUxET0M9Im9jYW1sZG9jIgo+ICsgICAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTEM9Im9j
YW1sYyIKPiAgICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5k
ICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQo+ICAgICAgYnJlYWsgMgo+ICAgIGZp
Cj4gQEAgLTYxMTcsMTcgKzM4MjgsMTcgQEAgSUZTPSRhc19zYXZlX0lGUwo+IAo+ICBmaQo+ICBm
aQo+IC1hY19jdF9PQ0FNTERPQz0kYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTERPQwo+IC1pZiB0ZXN0
IC1uICIkYWNfY3RfT0NBTUxET0MiOyB0aGVuCj4gLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9PQ0FNTERPQyIgPiY1Cj4gLSRhc19lY2hv
ICIkYWNfY3RfT0NBTUxET0MiID4mNjsgfQo+ICthY19jdF9PQ0FNTEM9JGFjX2N2X3Byb2dfYWNf
Y3RfT0NBTUxDCj4gK2lmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTEMiOyB0aGVuCj4gKyAgeyAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9PQ0FNTEMi
ID4mNQo+ICskYXNfZWNobyAiJGFjX2N0X09DQU1MQyIgPiY2OyB9Cj4gIGVsc2UKPiAgICB7ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQo+ICAk
YXNfZWNobyAibm8iID4mNjsgfQo+ICBmaQo+IAo+IC0gIGlmIHRlc3QgIngkYWNfY3RfT0NBTUxE
T0MiID0geDsgdGhlbgo+IC0gICAgT0NBTUxET0M9Im5vIgo+ICsgIGlmIHRlc3QgIngkYWNfY3Rf
T0NBTUxDIiA9IHg7IHRoZW4KPiArICAgIE9DQU1MQz0ibm8iCj4gICAgZWxzZQo+ICAgICAgY2Fz
ZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgo+ICB5ZXM6KQo+IEBAIC02MTM1
LDI0ICszODQ2LDQxIEBAIHllczopCj4gICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5n
IGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KPiAgYWNf
dG9vbF93YXJuZWQ9eWVzIDs7Cj4gIGVzYWMKPiAtICAgIE9DQU1MRE9DPSRhY19jdF9PQ0FNTERP
Qwo+ICsgICAgT0NBTUxDPSRhY19jdF9PQ0FNTEMKPiAgICBmaQo+ICBlbHNlCj4gLSAgT0NBTUxE
T0M9IiRhY19jdl9wcm9nX09DQU1MRE9DIgo+ICsgIE9DQU1MQz0iJGFjX2N2X3Byb2dfT0NBTUxD
Igo+ICBmaQo+IAo+IAo+IC0gICMgY2hlY2tpbmcgZm9yIG9jYW1sYnVpbGQKPiAtICBpZiB0ZXN0
IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCj4gLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3Jk
IG9mICIke2FjX3Rvb2xfcHJlZml4fW9jYW1sYnVpbGQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFt
IG5hbWUgd2l0aCBhcmdzLgo+IC1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vY2FtbGJ1aWxk
OyBhY193b3JkPSQyCj4gKyAgaWYgdGVzdCAiJE9DQU1MQyIgIT0gIm5vIjsgdGhlbgo+ICsgICAg
IE9DQU1MVkVSU0lPTj1gJE9DQU1MQyAtdiB8IHNlZCAtbiAtZSAnc3wuKnZlcnNpb24qICpcKC4q
XCkkfFwxfHAnYAo+ICsgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogcmVzdWx0OiBPQ2FtbCB2ZXJzaW9uIGlzICRPQ0FNTFZFUlNJT04iID4mNQo+ICskYXNfZWNo
byAiT0NhbWwgdmVyc2lvbiBpcyAkT0NBTUxWRVJTSU9OIiA+JjY7IH0KPiArICAgICAjIElmIE9D
QU1MTElCIGlzIHNldCwgdXNlIGl0Cj4gKyAgICAgaWYgdGVzdCAiJE9DQU1MTElCIiA9ICIiOyB0
aGVuCj4gKyAgICAgICAgT0NBTUxMSUI9YCRPQ0FNTEMgLXdoZXJlIDI+L2Rldi9udWxsIHx8ICRP
Q0FNTEMgLXZ8dGFpbCAtMXxjdXQgLWQgJyAnIC1mIDRgCj4gKyAgICAgZWxzZQo+ICsgICAgICAg
IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBPQ0FNTExJ
QiBwcmV2aW91c2x5IHNldDsgcHJlc2VydmluZyBpdC4iID4mNQo+ICskYXNfZWNobyAiT0NBTUxM
SUIgcHJldmlvdXNseSBzZXQ7IHByZXNlcnZpbmcgaXQuIiA+JjY7IH0KPiArICAgICBmaQo+ICsg
ICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBPQ2Ft
bCBsaWJyYXJ5IHBhdGggaXMgJE9DQU1MTElCIiA+JjUKPiArJGFzX2VjaG8gIk9DYW1sIGxpYnJh
cnkgcGF0aCBpcyAkT0NBTUxMSUIiID4mNjsgfQo+ICsKPiArCj4gKwo+ICsKPiArICAgICAjIGNo
ZWNraW5nIGZvciBvY2FtbG9wdAo+ICsgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7
IHRoZW4KPiArICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9
b2NhbWxvcHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgo+ICtzZXQg
ZHVtbXkgJHthY190b29sX3ByZWZpeH1vY2FtbG9wdDsgYWNfd29yZD0kMgo+ICB7ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1
Cj4gICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQo+IC1pZiB0
ZXN0ICIke2FjX2N2X3Byb2dfT0NBTUxCVUlMRCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gK2lmIHRl
c3QgIiR7YWNfY3ZfcHJvZ19PQ0FNTE9QVCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gICAgJGFzX2Vj
aG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAgZWxzZQo+IC0gIGlmIHRlc3QgLW4gIiRPQ0FNTEJVSUxE
IjsgdGhlbgo+IC0gIGFjX2N2X3Byb2dfT0NBTUxCVUlMRD0iJE9DQU1MQlVJTEQiICMgTGV0IHRo
ZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0Lgo+ICsgIGlmIHRlc3QgLW4gIiRPQ0FNTE9QVCI7IHRo
ZW4KPiArICBhY19jdl9wcm9nX09DQU1MT1BUPSIkT0NBTUxPUFQiICMgTGV0IHRoZSB1c2VyIG92
ZXJyaWRlIHRoZSB0ZXN0Lgo+ICBlbHNlCj4gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9T
RVBBUkFUT1IKPiAgZm9yIGFzX2RpciBpbiAkUEFUSAo+IEBAIC02MTYxLDcgKzM4ODksNyBAQCBk
bwo+ICAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCj4gICAgICBmb3IgYWNfZXhlY19l
eHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KPiAgICBpZiB7IHRlc3QgLWYg
IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFj
X3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCj4gLSAgICBhY19jdl9wcm9nX09DQU1MQlVJTEQ9
IiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxidWlsZCIKPiArICAgIGFjX2N2X3Byb2dfT0NBTUxPUFQ9
IiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxvcHQiCj4gICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUK
PiAgICAgIGJyZWFrIDIKPiAgICBmaQo+IEBAIC02MTcxLDEwICszODk5LDEwIEBAIElGUz0kYXNf
c2F2ZV9JRlMKPiAKPiAgZmkKPiAgZmkKPiAtT0NBTUxCVUlMRD0kYWNfY3ZfcHJvZ19PQ0FNTEJV
SUxECj4gLWlmIHRlc3QgLW4gIiRPQ0FNTEJVSUxEIjsgdGhlbgo+IC0gIHsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0NBTUxCVUlMRCIgPiY1Cj4gLSRh
c19lY2hvICIkT0NBTUxCVUlMRCIgPiY2OyB9Cj4gK09DQU1MT1BUPSRhY19jdl9wcm9nX09DQU1M
T1BUCj4gK2lmIHRlc3QgLW4gIiRPQ0FNTE9QVCI7IHRoZW4KPiArICB7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9DQU1MT1BUIiA+JjUKPiArJGFzX2Vj
aG8gIiRPQ0FNTE9QVCIgPiY2OyB9Cj4gIGVsc2UKPiAgICB7ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQo+ICAkYXNfZWNobyAibm8iID4mNjsg
fQo+IEBAIC02MTgyLDE3ICszOTEwLDE3IEBAIGZpCj4gCj4gCj4gIGZpCj4gLWlmIHRlc3QgLXog
IiRhY19jdl9wcm9nX09DQU1MQlVJTEQiOyB0aGVuCj4gLSAgYWNfY3RfT0NBTUxCVUlMRD0kT0NB
TUxCVUlMRAo+IC0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2NhbWxidWlsZCIsIHNv
IGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCj4gLXNldCBkdW1teSBvY2FtbGJ1
aWxkOyBhY193b3JkPSQyCj4gK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX09DQU1MT1BUIjsgdGhl
bgo+ICsgIGFjX2N0X09DQU1MT1BUPSRPQ0FNTE9QVAo+ICsgICMgRXh0cmFjdCB0aGUgZmlyc3Qg
d29yZCBvZiAib2NhbWxvcHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdz
Lgo+ICtzZXQgZHVtbXkgb2NhbWxvcHQ7IGFjX3dvcmQ9JDIKPiAgeyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQo+ICAkYXNf
ZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KPiAtaWYgdGVzdCAiJHth
Y19jdl9wcm9nX2FjX2N0X09DQU1MQlVJTEQrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICtpZiB0ZXN0
ICIke2FjX2N2X3Byb2dfYWNfY3RfT0NBTUxPUFQrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICAgICRh
c19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gIGVsc2UKPiAtICBpZiB0ZXN0IC1uICIkYWNfY3Rf
T0NBTUxCVUlMRCI7IHRoZW4KPiAtICBhY19jdl9wcm9nX2FjX2N0X09DQU1MQlVJTEQ9IiRhY19j
dF9PQ0FNTEJVSUxEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KPiArICBpZiB0
ZXN0IC1uICIkYWNfY3RfT0NBTUxPUFQiOyB0aGVuCj4gKyAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FN
TE9QVD0iJGFjX2N0X09DQU1MT1BUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4K
PiAgZWxzZQo+ICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCj4gIGZvciBh
c19kaXIgaW4gJFBBVEgKPiBAQCAtNjIwMSw3ICszOTI5LDcgQEAgZG8KPiAgICB0ZXN0IC16ICIk
YXNfZGlyIiAmJiBhc19kaXI9Lgo+ICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVj
dXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3Jk
JGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0
IjsgfTsgdGhlbgo+IC0gICAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTEJVSUxEPSJvY2FtbGJ1aWxk
Igo+ICsgICAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTE9QVD0ib2NhbWxvcHQiCj4gICAgICAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3Jk
JGFjX2V4ZWNfZXh0IiA+JjUKPiAgICAgIGJyZWFrIDIKPiAgICBmaQo+IEBAIC02MjExLDE3ICsz
OTM5LDE3IEBAIElGUz0kYXNfc2F2ZV9JRlMKPiAKPiAgZmkKPiAgZmkKPiAtYWNfY3RfT0NBTUxC
VUlMRD0kYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTEJVSUxECj4gLWlmIHRlc3QgLW4gIiRhY19jdF9P
Q0FNTEJVSUxEIjsgdGhlbgo+IC0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiAkYWNfY3RfT0NBTUxCVUlMRCIgPiY1Cj4gLSRhc19lY2hvICIkYWNfY3Rf
T0NBTUxCVUlMRCIgPiY2OyB9Cj4gK2FjX2N0X09DQU1MT1BUPSRhY19jdl9wcm9nX2FjX2N0X09D
QU1MT1BUCj4gK2lmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTE9QVCI7IHRoZW4KPiArICB7ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09DQU1MT1BU
IiA+JjUKPiArJGFzX2VjaG8gIiRhY19jdF9PQ0FNTE9QVCIgPiY2OyB9Cj4gIGVsc2UKPiAgICB7
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQo+
ICAkYXNfZWNobyAibm8iID4mNjsgfQo+ICBmaQo+IAo+IC0gIGlmIHRlc3QgIngkYWNfY3RfT0NB
TUxCVUlMRCIgPSB4OyB0aGVuCj4gLSAgICBPQ0FNTEJVSUxEPSJubyIKPiArICBpZiB0ZXN0ICJ4
JGFjX2N0X09DQU1MT1BUIiA9IHg7IHRoZW4KPiArICAgIE9DQU1MT1BUPSJubyIKPiAgICBlbHNl
Cj4gICAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCj4gIHllczop
Cj4gQEAgLTYyMjksNDQgKzM5NTcsODkgQEAgeWVzOikKPiAgJGFzX2VjaG8gIiRhc19tZTogV0FS
TklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+
JjI7fQo+ICBhY190b29sX3dhcm5lZD15ZXMgOzsKPiAgZXNhYwo+IC0gICAgT0NBTUxCVUlMRD0k
YWNfY3RfT0NBTUxCVUlMRAo+ICsgICAgT0NBTUxPUFQ9JGFjX2N0X09DQU1MT1BUCj4gICAgZmkK
PiAgZWxzZQo+IC0gIE9DQU1MQlVJTEQ9IiRhY19jdl9wcm9nX09DQU1MQlVJTEQiCj4gKyAgT0NB
TUxPUFQ9IiRhY19jdl9wcm9nX09DQU1MT1BUIgo+ICBmaQo+IAo+ICsgICAgIE9DQU1MQkVTVD1i
eXRlCj4gKyAgICAgaWYgdGVzdCAiJE9DQU1MT1BUIiA9ICJubyI7IHRoZW4KPiArICAgICAgIHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogQ2Fubm90IGZp
bmQgb2NhbWxvcHQ7IGJ5dGVjb2RlIGNvbXBpbGF0aW9uIG9ubHkuIiA+JjUKPiArJGFzX2VjaG8g
IiRhc19tZTogV0FSTklORzogQ2Fubm90IGZpbmQgb2NhbWxvcHQ7IGJ5dGVjb2RlIGNvbXBpbGF0
aW9uIG9ubHkuIiA+JjI7fQo+ICsgICAgIGVsc2UKPiArICAgICAgIFRNUFZFUlNJT049YCRPQ0FN
TE9QVCAtdiB8IHNlZCAtbiAtZSAnc3wuKnZlcnNpb24qICpcKC4qXCkkfFwxfHAnIGAKPiArICAg
ICAgIGlmIHRlc3QgIiRUTVBWRVJTSU9OIiAhPSAiJE9DQU1MVkVSU0lPTiIgOyB0aGVuCj4gKyAg
ICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6
IHZlcnNpb25zIGRpZmZlcnMgZnJvbSBvY2FtbGM7IG9jYW1sb3B0IGRpc2NhcmRlZC4iID4mNQo+
ICskYXNfZWNobyAidmVyc2lvbnMgZGlmZmVycyBmcm9tIG9jYW1sYzsgb2NhbWxvcHQgZGlzY2Fy
ZGVkLiIgPiY2OyB9Cj4gKyAgICAgICAgICAgT0NBTUxPUFQ9bm8KPiArICAgICAgIGVsc2UKPiAr
ICAgICAgICAgICBPQ0FNTEJFU1Q9b3B0Cj4gKyAgICAgICBmaQo+ICsgICAgIGZpCj4gCj4gLSAg
ICBpZiB0ZXN0ICJ4JE9DQU1MQyIgPSAieG5vIjsgdGhlbiA6Cj4gCj4gLSAgICAgICAgaWYgdGVz
dCAieCRlbmFibGVfb2NhbWx0b29scyIgPSAieHllcyI7IHRoZW4gOgo+IAo+IC0gICAgICAgICAg
ICBhc19mbl9lcnJvciAkPyAiT2NhbWwgdG9vbHMgZW5hYmxlZCwgYnV0IHVuYWJsZSB0byBmaW5k
IE9jYW1sIiAiJExJTkVOTyIgNQo+IC1maQo+IC0gICAgICAgIG9jYW1sdG9vbHM9Im4iCj4gKyAg
ICAgIyBjaGVja2luZyBmb3Igb2NhbWxjLm9wdAo+ICsgICAgIGlmIHRlc3QgLW4gIiRhY190b29s
X3ByZWZpeCI7IHRoZW4KPiArICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9v
bF9wcmVmaXh9b2NhbWxjLm9wdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFy
Z3MuCj4gK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW9jYW1sYy5vcHQ7IGFjX3dvcmQ9JDIK
PiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Ig
JGFjX3dvcmQiID4mNQo+ICskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+
JjY7IH0KPiAraWYgdGVzdCAiJHthY19jdl9wcm9nX09DQU1MQ0RPVE9QVCtzZXR9IiA9IHNldDsg
dGhlbiA6Cj4gKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiArZWxzZQo+ICsgIGlmIHRl
c3QgLW4gIiRPQ0FNTENET1RPUFQiOyB0aGVuCj4gKyAgYWNfY3ZfcHJvZ19PQ0FNTENET1RPUFQ9
IiRPQ0FNTENET1RPUFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0Lgo+ICtlbHNl
Cj4gK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKPiArZm9yIGFzX2RpciBp
biAkUEFUSAo+ICtkbwo+ICsgIElGUz0kYXNfc2F2ZV9JRlMKPiArICB0ZXN0IC16ICIkYXNfZGly
IiAmJiBhc19kaXI9Lgo+ICsgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxl
X2V4dGVuc2lvbnM7IGRvCj4gKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4
ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsg
dGhlbgo+ICsgICAgYWNfY3ZfcHJvZ19PQ0FNTENET1RPUFQ9IiR7YWNfdG9vbF9wcmVmaXh9b2Nh
bWxjLm9wdCIKPiArICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZv
dW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQo+ICsgICAgYnJlYWsgMgo+ICsg
IGZpCj4gK2RvbmUKPiArICBkb25lCj4gK0lGUz0kYXNfc2F2ZV9JRlMKPiAKPiAgZmkKPiArZmkK
PiArT0NBTUxDRE9UT1BUPSRhY19jdl9wcm9nX09DQU1MQ0RPVE9QVAo+ICtpZiB0ZXN0IC1uICIk
T0NBTUxDRE9UT1BUIjsgdGhlbgo+ICsgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogcmVzdWx0OiAkT0NBTUxDRE9UT1BUIiA+JjUKPiArJGFzX2VjaG8gIiRPQ0FNTENE
T1RPUFQiID4mNjsgfQo+ICtlbHNlCj4gKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKPiArJGFzX2VjaG8gIm5vIiA+JjY7IH0KPiArZmkK
PiArCj4gCj4gIGZpCj4gLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYmFzaCIsIHNvIGl0
IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCj4gLXNldCBkdW1teSBiYXNoOyBhY193
b3JkPSQyCj4gK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX09DQU1MQ0RPVE9QVCI7IHRoZW4KPiAr
ICBhY19jdF9PQ0FNTENET1RPUFQ9JE9DQU1MQ0RPVE9QVAo+ICsgICMgRXh0cmFjdCB0aGUgZmly
c3Qgd29yZCBvZiAib2NhbWxjLm9wdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRo
IGFyZ3MuCj4gK3NldCBkdW1teSBvY2FtbGMub3B0OyBhY193b3JkPSQyCj4gIHsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUK
PiAgJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cj4gLWlmIHRl
c3QgIiR7YWNfY3ZfcGF0aF9CQVNIK3NldH0iID0gc2V0OyB0aGVuIDoKPiAraWYgdGVzdCAiJHth
Y19jdl9wcm9nX2FjX2N0X09DQU1MQ0RPVE9QVCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gICAgJGFz
X2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAgZWxzZQo+IC0gIGNhc2UgJEJBU0ggaW4KPiAtICBb
XFwvXSogfCA/OltcXC9dKikKPiAtICBhY19jdl9wYXRoX0JBU0g9IiRCQVNIIiAjIExldCB0aGUg
dXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KPiAtICA7Owo+IC0gICopCj4gLSAg
YXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgo+ICsgIGlmIHRlc3QgLW4gIiRh
Y19jdF9PQ0FNTENET1RPUFQiOyB0aGVuCj4gKyAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTENET1RP
UFQ9IiRhY19jdF9PQ0FNTENET1RPUFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0
Lgo+ICtlbHNlCj4gK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKPiAgZm9y
IGFzX2RpciBpbiAkUEFUSAo+ICBkbwo+ICAgIElGUz0kYXNfc2F2ZV9JRlMKPiAgICB0ZXN0IC16
ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+ICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19l
eGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193
b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNf
ZXh0IjsgfTsgdGhlbgo+IC0gICAgYWNfY3ZfcGF0aF9CQVNIPSIkYXNfZGlyLyRhY193b3JkJGFj
X2V4ZWNfZXh0Igo+ICsgICAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTENET1RPUFQ9Im9jYW1sYy5v
cHQiCj4gICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAk
YXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKPiAgICAgIGJyZWFrIDIKPiAgICBmaQo+
IEBAIC02Mjc0LDU2ICs0MDQ3LDYzIEBAIGRvbmUKPiAgICBkb25lCj4gIElGUz0kYXNfc2F2ZV9J
RlMKPiAKPiAtICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9CQVNIIiAmJiBhY19jdl9wYXRoX0JBU0g9
Im5vIgo+IC0gIDs7Cj4gLWVzYWMKPiAgZmkKPiAtQkFTSD0kYWNfY3ZfcGF0aF9CQVNICj4gLWlm
IHRlc3QgLW4gIiRCQVNIIjsgdGhlbgo+IC0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogcmVzdWx0OiAkQkFTSCIgPiY1Cj4gLSRhc19lY2hvICIkQkFTSCIgPiY2OyB9
Cj4gK2ZpCj4gK2FjX2N0X09DQU1MQ0RPVE9QVD0kYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTENET1RP
UFQKPiAraWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MQ0RPVE9QVCI7IHRoZW4KPiArICB7ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09DQU1MQ0RP
VE9QVCIgPiY1Cj4gKyRhc19lY2hvICIkYWNfY3RfT0NBTUxDRE9UT1BUIiA+JjY7IH0KPiAgZWxz
ZQo+ICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBu
byIgPiY1Cj4gICRhc19lY2hvICJubyIgPiY2OyB9Cj4gIGZpCj4gCj4gLQo+IC1pZiB0ZXN0IHgi
JHtCQVNIfSIgPT0geCJubyIKPiAtdGhlbgo+IC0gICAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0
byBmaW5kIGJhc2gsIHBsZWFzZSBpbnN0YWxsIGJhc2giICIkTElORU5PIiA1Cj4gKyAgaWYgdGVz
dCAieCRhY19jdF9PQ0FNTENET1RPUFQiID0geDsgdGhlbgo+ICsgICAgT0NBTUxDRE9UT1BUPSJu
byIKPiArICBlbHNlCj4gKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVk
IGluCj4gK3llczopCj4gK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
V0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0
IiA+JjUKPiArJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90
IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQo+ICthY190b29sX3dhcm5lZD15ZXMg
OzsKPiArZXNhYwo+ICsgICAgT0NBTUxDRE9UT1BUPSRhY19jdF9PQ0FNTENET1RPUFQKPiArICBm
aQo+ICtlbHNlCj4gKyAgT0NBTUxDRE9UT1BUPSIkYWNfY3ZfcHJvZ19PQ0FNTENET1RPUFQiCj4g
IGZpCj4gLWlmIHRlc3QgIngkcHl0aG9udG9vbHMiID0gInh5IjsgdGhlbiA6Cj4gLQo+IC0gICAg
aWYgZWNobyAiJFBZVEhPTiIgfCBncmVwIC1xICJeLyI7IHRoZW4gOgo+IAo+IC0gICAgICAgIFBZ
VEhPTlBBVEg9JFBZVEhPTgo+IC0gICAgICAgIFBZVEhPTj1gYmFzZW5hbWUgJFBZVEhPTlBBVEhg
Cj4gKyAgICAgaWYgdGVzdCAiJE9DQU1MQ0RPVE9QVCIgIT0gIm5vIjsgdGhlbgo+ICsgICAgICAg
VE1QVkVSU0lPTj1gJE9DQU1MQ0RPVE9QVCAtdiB8IHNlZCAtbiAtZSAnc3wuKnZlcnNpb24qICpc
KC4qXCkkfFwxfHAnIGAKPiArICAgICAgIGlmIHRlc3QgIiRUTVBWRVJTSU9OIiAhPSAiJE9DQU1M
VkVSU0lPTiIgOyB0aGVuCj4gKyAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiByZXN1bHQ6IHZlcnNpb25zIGRpZmZlcnMgZnJvbSBvY2FtbGM7IG9jYW1s
Yy5vcHQgZGlzY2FyZGVkLiIgPiY1Cj4gKyRhc19lY2hvICJ2ZXJzaW9ucyBkaWZmZXJzIGZyb20g
b2NhbWxjOyBvY2FtbGMub3B0IGRpc2NhcmRlZC4iID4mNjsgfQo+ICsgICAgICAgZWxzZQo+ICsg
ICAgICAgICAgIE9DQU1MQz0kT0NBTUxDRE9UT1BUCj4gKyAgICAgICBmaQo+ICsgICAgIGZpCj4g
Cj4gLWVsaWYgdGVzdCAteiAiJFBZVEhPTiI7IHRoZW4gOgo+IC0gIFBZVEhPTj0icHl0aG9uIgo+
IC1lbHNlCj4gLSAgYXNfZm5fZXJyb3IgJD8gIlBZVEhPTiBzcGVjaWZpZWQsIGJ1dCBpcyBub3Qg
YW4gYWJzb2x1dGUgcGF0aCIgIiRMSU5FTk8iIDUKPiAtZmkKPiAtICAgICMgRXh0cmFjdCB0aGUg
Zmlyc3Qgd29yZCBvZiAiJFBZVEhPTiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRo
IGFyZ3MuCj4gLXNldCBkdW1teSAkUFlUSE9OOyBhY193b3JkPSQyCj4gKyAgICAgIyBjaGVja2lu
ZyBmb3Igb2NhbWxvcHQub3B0Cj4gKyAgICAgaWYgdGVzdCAiJE9DQU1MT1BUIiAhPSAibm8iIDsg
dGhlbgo+ICsgICAgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgo+ICsgICMg
RXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1vY2FtbG9wdC5vcHQi
LCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgo+ICtzZXQgZHVtbXkgJHth
Y190b29sX3ByZWZpeH1vY2FtbG9wdC5vcHQ7IGFjX3dvcmQ9JDIKPiAgeyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQo+ICAk
YXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KPiAtaWYgdGVzdCAi
JHthY19jdl9wYXRoX1BZVEhPTlBBVEgrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICtpZiB0ZXN0ICIk
e2FjX2N2X3Byb2dfT0NBTUxPUFRET1RPUFQrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICAgICRhc19l
Y2hvX24gIihjYWNoZWQpICIgPiY2Cj4gIGVsc2UKPiAtICBjYXNlICRQWVRIT05QQVRIIGluCj4g
LSAgW1xcL10qIHwgPzpbXFwvXSopCj4gLSAgYWNfY3ZfcGF0aF9QWVRIT05QQVRIPSIkUFlUSE9O
UEFUSCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCj4gLSAg
OzsKPiAtICAqKQo+IC0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKPiAr
ICBpZiB0ZXN0IC1uICIkT0NBTUxPUFRET1RPUFQiOyB0aGVuCj4gKyAgYWNfY3ZfcHJvZ19PQ0FN
TE9QVERPVE9QVD0iJE9DQU1MT1BURE9UT1BUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUg
dGVzdC4KPiArZWxzZQo+ICthc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCj4g
IGZvciBhc19kaXIgaW4gJFBBVEgKPiAgZG8KPiAgICBJRlM9JGFzX3NhdmVfSUZTCj4gICAgdGVz
dCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KPiAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAk
YWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwo+ICAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8k
YWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19l
eGVjX2V4dCI7IH07IHRoZW4KPiAtICAgIGFjX2N2X3BhdGhfUFlUSE9OUEFUSD0iJGFzX2Rpci8k
YWNfd29yZCRhY19leGVjX2V4dCIKPiArICAgIGFjX2N2X3Byb2dfT0NBTUxPUFRET1RPUFQ9IiR7
YWNfdG9vbF9wcmVmaXh9b2NhbWxvcHQub3B0Igo+ICAgICAgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1
Cj4gICAgICBicmVhayAyCj4gICAgZmkKPiBAQCAtNjMzMSw2MiArNDExMSwzOSBAQCBkb25lCj4g
ICAgZG9uZQo+ICBJRlM9JGFzX3NhdmVfSUZTCj4gCj4gLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhf
UFlUSE9OUEFUSCIgJiYgYWNfY3ZfcGF0aF9QWVRIT05QQVRIPSJubyIKPiAtICA7Owo+IC1lc2Fj
Cj4gIGZpCj4gLVBZVEhPTlBBVEg9JGFjX2N2X3BhdGhfUFlUSE9OUEFUSAo+IC1pZiB0ZXN0IC1u
ICIkUFlUSE9OUEFUSCI7IHRoZW4KPiAtICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IHJlc3VsdDogJFBZVEhPTlBBVEgiID4mNQo+IC0kYXNfZWNobyAiJFBZVEhPTlBB
VEgiID4mNjsgfQo+ICtmaQo+ICtPQ0FNTE9QVERPVE9QVD0kYWNfY3ZfcHJvZ19PQ0FNTE9QVERP
VE9QVAo+ICtpZiB0ZXN0IC1uICIkT0NBTUxPUFRET1RPUFQiOyB0aGVuCj4gKyAgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPQ0FNTE9QVERPVE9QVCIg
PiY1Cj4gKyRhc19lY2hvICIkT0NBTUxPUFRET1RPUFQiID4mNjsgfQo+ICBlbHNlCj4gICAgeyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKPiAg
JGFzX2VjaG8gIm5vIiA+JjY7IH0KPiAgZmkKPiAKPiAKPiAtaWYgdGVzdCB4IiR7UFlUSE9OUEFU
SH0iID09IHgibm8iCj4gLXRoZW4KPiAtICAgIGFzX2ZuX2Vycm9yICQ/ICJVbmFibGUgdG8gZmlu
ZCAkUFlUSE9OLCBwbGVhc2UgaW5zdGFsbCAkUFlUSE9OIiAiJExJTkVOTyIgNQo+IC1maQo+IC0g
ICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Ig
cHl0aG9uIHZlcnNpb24gPj0gMi4zICIgPiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBw
eXRob24gdmVyc2lvbiA+PSAyLjMgLi4uICIgPiY2OyB9Cj4gLWAkUFlUSE9OIC1jICdpbXBvcnQg
c3lzOyBzeXMuZXhpdChldmFsKCJzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDMpIikpJ2AKPiAtaWYg
dGVzdCAiJD8iICE9ICIwIgo+IC10aGVuCj4gLSAgICBweXRob25fdmVyc2lvbj1gJFBZVEhPTiAt
ViAyPiYxYAo+IC0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBy
ZXN1bHQ6IG5vIiA+JjUKPiAtJGFzX2VjaG8gIm5vIiA+JjY7IH0KPiAtICAgIGFzX2ZuX2Vycm9y
ICQ/ICIkcHl0aG9uX3ZlcnNpb24gaXMgdG9vIG9sZCwgbWluaW11bSByZXF1aXJlZCB2ZXJzaW9u
IGlzIDIuMyIgIiRMSU5FTk8iIDUKPiAtZWxzZQo+IC0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Cj4gLSRhc19lY2hvICJ5ZXMiID4m
NjsgfQo+ICBmaQo+IC0KPiAtYWNfcHJldmlvdXNfY3BwZmxhZ3M9JENQUEZMQUdTCj4gLWFjX3By
ZXZpb3VzX2xkZmxhZ3M9JExERkxBR1MKPiAtYWNfcHl0aG9uX3ZlcnNpb249YCRQWVRIT04gLWMg
J2ltcG9ydCBkaXN0dXRpbHMuc3lzY29uZmlnOyBcCj4gLSAgICBwcmludCBkaXN0dXRpbHMuc3lz
Y29uZmlnLmdldF9jb25maWdfdmFyKCJWRVJTSU9OIiknYAo+IC0jIEV4dHJhY3QgdGhlIGZpcnN0
IHdvcmQgb2YgIiRQWVRIT04tY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdp
dGggYXJncy4KPiAtc2V0IGR1bW15ICRQWVRIT04tY29uZmlnOyBhY193b3JkPSQyCj4gK2lmIHRl
c3QgLXogIiRhY19jdl9wcm9nX09DQU1MT1BURE9UT1BUIjsgdGhlbgo+ICsgIGFjX2N0X09DQU1M
T1BURE9UT1BUPSRPQ0FNTE9QVERPVE9QVAo+ICsgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBv
ZiAib2NhbWxvcHQub3B0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4K
PiArc2V0IGR1bW15IG9jYW1sb3B0Lm9wdDsgYWNfd29yZD0kMgo+ICB7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cj4gICRh
c19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0ICIk
e2FjX2N2X3BhdGhfcHljb25maWcrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICtpZiB0ZXN0ICIke2Fj
X2N2X3Byb2dfYWNfY3RfT0NBTUxPUFRET1RPUFQrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICAgICRh
c19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gIGVsc2UKPiAtICBjYXNlICRweWNvbmZpZyBpbgo+
IC0gIFtcXC9dKiB8ID86W1xcL10qKQo+IC0gIGFjX2N2X3BhdGhfcHljb25maWc9IiRweWNvbmZp
ZyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCj4gLSAgOzsK
PiAtICAqKQo+IC0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKPiArICBp
ZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxPUFRET1RPUFQiOyB0aGVuCj4gKyAgYWNfY3ZfcHJvZ19h
Y19jdF9PQ0FNTE9QVERPVE9QVD0iJGFjX2N0X09DQU1MT1BURE9UT1BUIiAjIExldCB0aGUgdXNl
ciBvdmVycmlkZSB0aGUgdGVzdC4KPiArZWxzZQo+ICthc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBB
VEhfU0VQQVJBVE9SCj4gIGZvciBhc19kaXIgaW4gJFBBVEgKPiAgZG8KPiAgICBJRlM9JGFzX3Nh
dmVfSUZTCj4gICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KPiAgICAgIGZvciBhY19l
eGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwo+ICAgIGlmIHsgdGVz
dCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rp
ci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KPiAtICAgIGFjX2N2X3BhdGhfcHljb25m
aWc9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCj4gKyAgICBhY19jdl9wcm9nX2FjX2N0
X09DQU1MT1BURE9UT1BUPSJvY2FtbG9wdC5vcHQiCj4gICAgICAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+
JjUKPiAgICAgIGJyZWFrIDIKPiAgICBmaQo+IEBAIC02Mzk0LDEyNyArNDE1MSw2OCBAQCBkb25l
Cj4gICAgZG9uZQo+ICBJRlM9JGFzX3NhdmVfSUZTCj4gCj4gLSAgdGVzdCAteiAiJGFjX2N2X3Bh
dGhfcHljb25maWciICYmIGFjX2N2X3BhdGhfcHljb25maWc9Im5vIgo+IC0gIDs7Cj4gLWVzYWMK
PiAgZmkKPiAtcHljb25maWc9JGFjX2N2X3BhdGhfcHljb25maWcKPiAtaWYgdGVzdCAtbiAiJHB5
Y29uZmlnIjsgdGhlbgo+IC0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogcmVzdWx0OiAkcHljb25maWciID4mNQo+IC0kYXNfZWNobyAiJHB5Y29uZmlnIiA+JjY7IH0K
PiArZmkKPiArYWNfY3RfT0NBTUxPUFRET1RPUFQ9JGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxPUFRE
T1RPUFQKPiAraWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MT1BURE9UT1BUIjsgdGhlbgo+ICsgIHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0NB
TUxPUFRET1RPUFQiID4mNQo+ICskYXNfZWNobyAiJGFjX2N0X09DQU1MT1BURE9UT1BUIiA+JjY7
IH0KPiAgZWxzZQo+ICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiBubyIgPiY1Cj4gICRhc19lY2hvICJubyIgPiY2OyB9Cj4gIGZpCj4gCj4gLQo+IC1p
ZiB0ZXN0IHgiJHB5Y29uZmlnIiA9PSB4Im5vIjsgdGhlbiA6Cj4gLQo+IC0gICAgICAgIENQUEZM
QUdTPSIkQ0ZMQUdTIGAkUFlUSE9OIC1jICdpbXBvcnQgZGlzdHV0aWxzLnN5c2NvbmZpZzsgXAo+
IC0gICAgICAgIHByaW50ICItSSIgKyBkaXN0dXRpbHMuc3lzY29uZmlnLmdldF9jb25maWdfdmFy
KCJJTkNMVURFUFkiKSdgIgo+IC0gICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyBgJFBZVEhPTiAtYyAn
aW1wb3J0IGRpc3R1dGlscy5zeXNjb25maWc7IFwKPiAtICAgICAgICBwcmludCBkaXN0dXRpbHMu
c3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJDRkxBR1MiKSdgIgo+IC0gICAgTERGTEFHUz0iJExE
RkxBR1MgYCRQWVRIT04gLWMgJ2ltcG9ydCBkaXN0dXRpbHMuc3lzY29uZmlnOyBcCj4gLSAgICAg
ICAgcHJpbnQgZGlzdHV0aWxzLnN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiTElCUyIpJ2AiCj4g
LSAgICBMREZMQUdTPSIkTERGTEFHUyBgJFBZVEhPTiAtYyAnaW1wb3J0IGRpc3R1dGlscy5zeXNj
b25maWc7IFwKPiAtICAgICAgICBwcmludCBkaXN0dXRpbHMuc3lzY29uZmlnLmdldF9jb25maWdf
dmFyKCJTWVNMSUJTIiknYCIKPiAtICAgIExERkxBR1M9IiRMREZMQUdTIGAkUFlUSE9OIC1jICdp
bXBvcnQgZGlzdHV0aWxzLnN5c2NvbmZpZzsgXAo+IC0gICAgICAgIHByaW50ICItTCIgKyBkaXN0
dXRpbHMuc3lzY29uZmlnLmdldF9weXRob25fbGliKHBsYXRfc3BlY2lmaWM9MSxcCj4gLSAgICAg
ICAgc3RhbmRhcmRfbGliPTEpICsgIi9jb25maWciJ2AiCj4gLSAgICBMREZMQUdTPSIkTERGTEFH
UyBgJFBZVEhPTiAtYyAnaW1wb3J0IGRpc3R1dGlscy5zeXNjb25maWc7IFwKPiAtICAgICAgICBw
cmludCBkaXN0dXRpbHMuc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJMSU5LRk9SU0hBUkVEIikn
YCIKPiAtICAgIExERkxBR1M9IiRMREZMQUdTIGAkUFlUSE9OIC1jICdpbXBvcnQgZGlzdHV0aWxz
LnN5c2NvbmZpZzsgXAo+IC0gICAgICAgIHByaW50IGRpc3R1dGlscy5zeXNjb25maWcuZ2V0X2Nv
bmZpZ192YXIoIkxERkxBR1MiKSdgIgo+IC0KPiAtZWxzZQo+IC0KPiAtICAgICAgICBDUFBGTEFH
Uz0iJENGTEFHUyBgJFBZVEhPTi1jb25maWcgLS1jZmxhZ3NgIgo+IC0gICAgTERGTEFHUz0iJExE
RkxBR1MgYCRQWVRIT04tY29uZmlnIC0tbGRmbGFnc2AiCj4gLQo+IC1maQo+IC0KPiAtYWNfZm5f
Y19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIlB5dGhvbi5oIiAiYWNfY3ZfaGVhZGVy
X1B5dGhvbl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCj4gLWlmIHRlc3QgIngkYWNfY3ZfaGVh
ZGVyX1B5dGhvbl9oIiA9IHgiInllczsgdGhlbiA6Cj4gLQo+ICsgIGlmIHRlc3QgIngkYWNfY3Rf
T0NBTUxPUFRET1RPUFQiID0geDsgdGhlbgo+ICsgICAgT0NBTUxPUFRET1RPUFQ9Im5vIgo+ICsg
IGVsc2UKPiArICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KPiAr
eWVzOikKPiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5H
OiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQo+
ICskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4
ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Cj4gK2FjX3Rvb2xfd2FybmVkPXllcyA7Owo+ICtl
c2FjCj4gKyAgICBPQ0FNTE9QVERPVE9QVD0kYWNfY3RfT0NBTUxPUFRET1RPUFQKPiArICBmaQo+
ICBlbHNlCj4gLSAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5kIFB5dGhvbiBkZXZlbG9w
bWVudCBoZWFkZXJzIiAiJExJTkVOTyIgNQo+ICsgIE9DQU1MT1BURE9UT1BUPSIkYWNfY3ZfcHJv
Z19PQ0FNTE9QVERPVE9QVCIKPiAgZmkKPiAKPiArICAgICAgIGlmIHRlc3QgIiRPQ0FNTE9QVERP
VE9QVCIgIT0gIm5vIjsgdGhlbgo+ICsgICAgICAgICAgVE1QVkVSU0lPTj1gJE9DQU1MT1BURE9U
T1BUIC12IHwgc2VkIC1uIC1lICdzfC4qdmVyc2lvbiogKlwoLipcKSR8XDF8cCcgYAo+ICsgICAg
ICAgICAgaWYgdGVzdCAiJFRNUFZFUlNJT04iICE9ICIkT0NBTUxWRVJTSU9OIiA7IHRoZW4KPiAr
ICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVz
dWx0OiB2ZXJzaW9uIGRpZmZlcnMgZnJvbSBvY2FtbGM7IG9jYW1sb3B0Lm9wdCBkaXNjYXJkZWQu
IiA+JjUKPiArJGFzX2VjaG8gInZlcnNpb24gZGlmZmVycyBmcm9tIG9jYW1sYzsgb2NhbWxvcHQu
b3B0IGRpc2NhcmRlZC4iID4mNjsgfQo+ICsgICAgICAgICAgZWxzZQo+ICsgICAgICAgICAgICAg
T0NBTUxPUFQ9JE9DQU1MT1BURE9UT1BUCj4gKyAgICAgICAgICBmaQo+ICsgICAgICAgIGZpCj4g
KyAgICAgZmkKPiAKPiAtYXNfYWNfTGliPWAkYXNfZWNobyAiYWNfY3ZfbGliX3B5dGhvbiRhY19w
eXRob25fdmVyc2lvbicnX1B5QXJnX1BhcnNlVHVwbGUiIHwgJGFzX3RyX3NoYAo+IC17ICRhc19l
Y2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBQeUFyZ19QYXJz
ZVR1cGxlIGluIC1scHl0aG9uJGFjX3B5dGhvbl92ZXJzaW9uIiA+JjUKPiAtJGFzX2VjaG9fbiAi
Y2hlY2tpbmcgZm9yIFB5QXJnX1BhcnNlVHVwbGUgaW4gLWxweXRob24kYWNfcHl0aG9uX3ZlcnNp
b24uLi4gIiA+JjY7IH0KPiAtaWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19MaWIrc2V0fVwiIiA9
IHNldDsgdGhlbiA6Cj4gLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAtZWxzZQo+IC0g
IGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKPiAtTElCUz0iLWxweXRob24kYWNfcHl0aG9u
X3ZlcnNpb24gICRMSUJTIgo+IC1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4k
YWNfZXh0Cj4gLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KPiAtCj4gLS8qIE92ZXJyaWRlIGFueSBH
Q0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgo+IC0gICBVc2UgY2hhciBi
ZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKPiAtICAgYnVp
bHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAg
Ki8KPiAtI2lmZGVmIF9fY3BsdXNwbHVzCj4gLWV4dGVybiAiQyIKPiAtI2VuZGlmCj4gLWNoYXIg
UHlBcmdfUGFyc2VUdXBsZSAoKTsKPiAtaW50Cj4gLW1haW4gKCkKPiAtewo+IC1yZXR1cm4gUHlB
cmdfUGFyc2VUdXBsZSAoKTsKPiAtICA7Cj4gLSAgcmV0dXJuIDA7Cj4gLX0KPiAtX0FDRU9GCj4g
LWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKPiAtICBldmFsICIkYXNfYWNf
TGliPXllcyIKPiAtZWxzZQo+IC0gIGV2YWwgIiRhc19hY19MaWI9bm8iCj4gLWZpCj4gLXJtIC1m
IGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAo+IC0gICAgY29uZnRlc3Qk
YWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKPiAtTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElC
Uwo+IC1maQo+IC1ldmFsIGFjX3Jlcz1cJCRhc19hY19MaWIKPiAtICAgICAgICAgICAgICB7ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1
Cj4gLSRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KPiAtaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19h
Y19MaWIiXCIgPSB4InllcyI7IHRoZW4gOgo+IC0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YK
PiAtI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfTElCcHl0aG9uJGFjX3B5dGhvbl92ZXJzaW9uIiB8
ICRhc190cl9jcHBgIDEKPiAtX0FDRU9GCj4gLQo+IC0gIExJQlM9Ii1scHl0aG9uJGFjX3B5dGhv
bl92ZXJzaW9uICRMSUJTIgo+IAo+IC1lbHNlCj4gLSAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0
byBmaW5kIGEgc3VpdGFibGUgcHl0aG9uIGRldmVsb3BtZW50IGxpYnJhcnkiICIkTElORU5PIiA1
Cj4gLWZpCj4gKyAgZmkKPiAKPiAtQ1BQRkxBR1M9JGFjX3ByZXZpb3VzX2NwcGZsYWdzCj4gLUxE
TEZBR1M9JGFjX3ByZXZpb3VzX2xkZmxhZ3MKPiAKPiAKPiAtZmkKPiAtIyBFeHRyYWN0IHRoZSBm
aXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRo
IGFyZ3MuCj4gLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgo+ICsgICMgY2hlY2tpbmcg
Zm9yIG9jYW1sIHRvcGxldmVsCj4gKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhl
bgo+ICsgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1vY2Ft
bCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCj4gK3NldCBkdW1teSAk
e2FjX3Rvb2xfcHJlZml4fW9jYW1sOyBhY193b3JkPSQyCj4gIHsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKPiAgJGFzX2Vj
aG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNf
Y3ZfcGF0aF9YR0VUVEVYVCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gK2lmIHRlc3QgIiR7YWNfY3Zf
cHJvZ19PQ0FNTCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkg
IiA+JjYKPiAgZWxzZQo+IC0gIGNhc2UgJFhHRVRURVhUIGluCj4gLSAgW1xcL10qIHwgPzpbXFwv
XSopCj4gLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBv
dmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KPiAtICA7Owo+IC0gICopCj4gLSAgYXNfc2F2
ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgo+ICsgIGlmIHRlc3QgLW4gIiRPQ0FNTCI7
IHRoZW4KPiArICBhY19jdl9wcm9nX09DQU1MPSIkT0NBTUwiICMgTGV0IHRoZSB1c2VyIG92ZXJy
aWRlIHRoZSB0ZXN0Lgo+ICtlbHNlCj4gK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBB
UkFUT1IKPiAgZm9yIGFzX2RpciBpbiAkUEFUSAo+ICBkbwo+ICAgIElGUz0kYXNfc2F2ZV9JRlMK
PiAgICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+ICAgICAgZm9yIGFjX2V4ZWNfZXh0
IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gICAgaWYgeyB0ZXN0IC1mICIk
YXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193
b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+IC0gICAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFz
X2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKPiArICAgIGFjX2N2X3Byb2dfT0NBTUw9IiR7YWNf
dG9vbF9wcmVmaXh9b2NhbWwiCj4gICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKPiAgICAgIGJy
ZWFrIDIKPiAgICBmaQo+IEBAIC02NTIyLDQ0ICs0MjIwLDM5IEBAIGRvbmUKPiAgICBkb25lCj4g
IElGUz0kYXNfc2F2ZV9JRlMKPiAKPiAtICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIg
JiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0ibm8iCj4gLSAgOzsKPiAtZXNhYwo+ICBmaQo+IC1YR0VU
VEVYVD0kYWNfY3ZfcGF0aF9YR0VUVEVYVAo+IC1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVu
Cj4gLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRY
R0VUVEVYVCIgPiY1Cj4gLSRhc19lY2hvICIkWEdFVFRFWFQiID4mNjsgfQo+ICtmaQo+ICtPQ0FN
TD0kYWNfY3ZfcHJvZ19PQ0FNTAo+ICtpZiB0ZXN0IC1uICIkT0NBTUwiOyB0aGVuCj4gKyAgeyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPQ0FNTCIgPiY1
Cj4gKyRhc19lY2hvICIkT0NBTUwiID4mNjsgfQo+ICBlbHNlCj4gICAgeyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKPiAgJGFzX2VjaG8gIm5v
IiA+JjY7IH0KPiAgZmkKPiAKPiAKPiAtaWYgdGVzdCB4IiR7WEdFVFRFWFR9IiA9PSB4Im5vIgo+
IC10aGVuCj4gLSAgICBhc19mbl9lcnJvciAkPyAiVW5hYmxlIHRvIGZpbmQgeGdldHRleHQsIHBs
ZWFzZSBpbnN0YWxsIHhnZXR0ZXh0IiAiJExJTkVOTyIgNQo+ICBmaQo+IC0jIEV4dHJhY3QgdGhl
IGZpcnN0IHdvcmQgb2YgImFzODYiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBh
cmdzLgo+IC1zZXQgZHVtbXkgYXM4NjsgYWNfd29yZD0kMgo+ICtpZiB0ZXN0IC16ICIkYWNfY3Zf
cHJvZ19PQ0FNTCI7IHRoZW4KPiArICBhY19jdF9PQ0FNTD0kT0NBTUwKPiArICAjIEV4dHJhY3Qg
dGhlIGZpcnN0IHdvcmQgb2YgIm9jYW1sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdp
dGggYXJncy4KPiArc2V0IGR1bW15IG9jYW1sOyBhY193b3JkPSQyCj4gIHsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKPiAg
JGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3Qg
IiR7YWNfY3ZfcGF0aF9BUzg2K3NldH0iID0gc2V0OyB0aGVuIDoKPiAraWYgdGVzdCAiJHthY19j
dl9wcm9nX2FjX2N0X09DQU1MK3NldH0iID0gc2V0OyB0aGVuIDoKPiAgICAkYXNfZWNob19uICIo
Y2FjaGVkKSAiID4mNgo+ICBlbHNlCj4gLSAgY2FzZSAkQVM4NiBpbgo+IC0gIFtcXC9dKiB8ID86
W1xcL10qKQo+IC0gIGFjX2N2X3BhdGhfQVM4Nj0iJEFTODYiICMgTGV0IHRoZSB1c2VyIG92ZXJy
aWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgo+IC0gIDs7Cj4gLSAgKikKPiAtICBhc19zYXZlX0lG
Uz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCj4gKyAgaWYgdGVzdCAtbiAiJGFjX2N0X09DQU1M
IjsgdGhlbgo+ICsgIGFjX2N2X3Byb2dfYWNfY3RfT0NBTUw9IiRhY19jdF9PQ0FNTCIgIyBMZXQg
dGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCj4gK2Vsc2UKPiArYXNfc2F2ZV9JRlM9JElGUzsg
SUZTPSRQQVRIX1NFUEFSQVRPUgo+ICBmb3IgYXNfZGlyIGluICRQQVRICj4gIGRvCj4gICAgSUZT
PSRhc19zYXZlX0lGUwo+ICAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCj4gICAgICBm
b3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KPiAgICBp
ZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3gg
IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCj4gLSAgICBhY19jdl9wYXRo
X0FTODY9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCj4gKyAgICBhY19jdl9wcm9nX2Fj
X2N0X09DQU1MPSJvY2FtbCIKPiAgICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQo+ICAgICAgYnJl
YWsgMgo+ICAgIGZpCj4gQEAgLTY1NjcsNDQgKzQyNjAsNTMgQEAgZG9uZQo+ICAgIGRvbmUKPiAg
SUZTPSRhc19zYXZlX0lGUwo+IAo+IC0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0FTODYiICYmIGFj
X2N2X3BhdGhfQVM4Nj0ibm8iCj4gLSAgOzsKPiAtZXNhYwo+ICBmaQo+IC1BUzg2PSRhY19jdl9w
YXRoX0FTODYKPiAtaWYgdGVzdCAtbiAiJEFTODYiOyB0aGVuCj4gLSAgeyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRBUzg2IiA+JjUKPiAtJGFzX2VjaG8g
IiRBUzg2IiA+JjY7IH0KPiArZmkKPiArYWNfY3RfT0NBTUw9JGFjX2N2X3Byb2dfYWNfY3RfT0NB
TUwKPiAraWYgdGVzdCAtbiAiJGFjX2N0X09DQU1MIjsgdGhlbgo+ICsgIHsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0NBTUwiID4mNQo+ICsk
YXNfZWNobyAiJGFjX2N0X09DQU1MIiA+JjY7IH0KPiAgZWxzZQo+ICAgIHsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Cj4gICRhc19lY2hvICJu
byIgPiY2OyB9Cj4gIGZpCj4gCj4gLQo+IC1pZiB0ZXN0IHgiJHtBUzg2fSIgPT0geCJubyIKPiAt
dGhlbgo+IC0gICAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5kIGFzODYsIHBsZWFzZSBp
bnN0YWxsIGFzODYiICIkTElORU5PIiA1Cj4gKyAgaWYgdGVzdCAieCRhY19jdF9PQ0FNTCIgPSB4
OyB0aGVuCj4gKyAgICBPQ0FNTD0ibm8iCj4gKyAgZWxzZQo+ICsgICAgY2FzZSAkY3Jvc3NfY29t
cGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgo+ICt5ZXM6KQo+ICt7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVm
aXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Cj4gKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6
IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30K
PiArYWNfdG9vbF93YXJuZWQ9eWVzIDs7Cj4gK2VzYWMKPiArICAgIE9DQU1MPSRhY19jdF9PQ0FN
TAo+ICsgIGZpCj4gK2Vsc2UKPiArICBPQ0FNTD0iJGFjX2N2X3Byb2dfT0NBTUwiCj4gIGZpCj4g
LSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibGQ4NiIsIHNvIGl0IGNhbiBiZSBhIHByb2dy
YW0gbmFtZSB3aXRoIGFyZ3MuCj4gLXNldCBkdW1teSBsZDg2OyBhY193b3JkPSQyCj4gKwo+ICsK
PiArICAjIGNoZWNraW5nIGZvciBvY2FtbGRlcAo+ICsgIGlmIHRlc3QgLW4gIiRhY190b29sX3By
ZWZpeCI7IHRoZW4KPiArICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9w
cmVmaXh9b2NhbWxkZXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgo+
ICtzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vY2FtbGRlcDsgYWNfd29yZD0kMgo+ICB7ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29y
ZCIgPiY1Cj4gICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQo+
IC1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfTEQ4NitzZXR9IiA9IHNldDsgdGhlbiA6Cj4gK2lmIHRl
c3QgIiR7YWNfY3ZfcHJvZ19PQ0FNTERFUCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gICAgJGFzX2Vj
aG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAgZWxzZQo+IC0gIGNhc2UgJExEODYgaW4KPiAtICBbXFwv
XSogfCA/OltcXC9dKikKPiAtICBhY19jdl9wYXRoX0xEODY9IiRMRDg2IiAjIExldCB0aGUgdXNl
ciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KPiAtICA7Owo+IC0gICopCj4gLSAgYXNf
c2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgo+ICsgIGlmIHRlc3QgLW4gIiRPQ0FN
TERFUCI7IHRoZW4KPiArICBhY19jdl9wcm9nX09DQU1MREVQPSIkT0NBTUxERVAiICMgTGV0IHRo
ZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0Lgo+ICtlbHNlCj4gK2FzX3NhdmVfSUZTPSRJRlM7IElG
Uz0kUEFUSF9TRVBBUkFUT1IKPiAgZm9yIGFzX2RpciBpbiAkUEFUSAo+ICBkbwo+ICAgIElGUz0k
YXNfc2F2ZV9JRlMKPiAgICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+ICAgICAgZm9y
IGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gICAgaWYg
eyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIk
YXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+IC0gICAgYWNfY3ZfcGF0aF9M
RDg2PSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0Igo+ICsgICAgYWNfY3ZfcHJvZ19PQ0FN
TERFUD0iJHthY190b29sX3ByZWZpeH1vY2FtbGRlcCIKPiAgICAgICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQi
ID4mNQo+ICAgICAgYnJlYWsgMgo+ICAgIGZpCj4gQEAgLTY2MTIsNDQgKzQzMTQsMzkgQEAgZG9u
ZQo+ICAgIGRvbmUKPiAgSUZTPSRhc19zYXZlX0lGUwo+IAo+IC0gIHRlc3QgLXogIiRhY19jdl9w
YXRoX0xEODYiICYmIGFjX2N2X3BhdGhfTEQ4Nj0ibm8iCj4gLSAgOzsKPiAtZXNhYwo+ICBmaQo+
IC1MRDg2PSRhY19jdl9wYXRoX0xEODYKPiAtaWYgdGVzdCAtbiAiJExEODYiOyB0aGVuCj4gLSAg
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMRDg2IiA+
JjUKPiAtJGFzX2VjaG8gIiRMRDg2IiA+JjY7IH0KPiArZmkKPiArT0NBTUxERVA9JGFjX2N2X3By
b2dfT0NBTUxERVAKPiAraWYgdGVzdCAtbiAiJE9DQU1MREVQIjsgdGhlbgo+ICsgIHsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0NBTUxERVAiID4mNQo+
ICskYXNfZWNobyAiJE9DQU1MREVQIiA+JjY7IH0KPiAgZWxzZQo+ICAgIHsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Cj4gICRhc19lY2hvICJu
byIgPiY2OyB9Cj4gIGZpCj4gCj4gCj4gLWlmIHRlc3QgeCIke0xEODZ9IiA9PSB4Im5vIgo+IC10
aGVuCj4gLSAgICBhc19mbl9lcnJvciAkPyAiVW5hYmxlIHRvIGZpbmQgbGQ4NiwgcGxlYXNlIGlu
c3RhbGwgbGQ4NiIgIiRMSU5FTk8iIDUKPiAgZmkKPiAtIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3Jk
IG9mICJiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgo+IC1zZXQg
ZHVtbXkgYmNjOyBhY193b3JkPSQyCj4gK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX09DQU1MREVQ
IjsgdGhlbgo+ICsgIGFjX2N0X09DQU1MREVQPSRPQ0FNTERFUAo+ICsgICMgRXh0cmFjdCB0aGUg
Zmlyc3Qgd29yZCBvZiAib2NhbWxkZXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0
aCBhcmdzLgo+ICtzZXQgZHVtbXkgb2NhbWxkZXA7IGFjX3dvcmQ9JDIKPiAgeyAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQo+
ICAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KPiAtaWYgdGVz
dCAiJHthY19jdl9wYXRoX0JDQytzZXR9IiA9IHNldDsgdGhlbiA6Cj4gK2lmIHRlc3QgIiR7YWNf
Y3ZfcHJvZ19hY19jdF9PQ0FNTERFUCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gICAgJGFzX2VjaG9f
biAiKGNhY2hlZCkgIiA+JjYKPiAgZWxzZQo+IC0gIGNhc2UgJEJDQyBpbgo+IC0gIFtcXC9dKiB8
ID86W1xcL10qKQo+IC0gIGFjX2N2X3BhdGhfQkNDPSIkQkNDIiAjIExldCB0aGUgdXNlciBvdmVy
cmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KPiAtICA7Owo+IC0gICopCj4gLSAgYXNfc2F2ZV9J
RlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgo+ICsgIGlmIHRlc3QgLW4gIiRhY19jdF9PQ0FN
TERFUCI7IHRoZW4KPiArICBhY19jdl9wcm9nX2FjX2N0X09DQU1MREVQPSIkYWNfY3RfT0NBTUxE
RVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0Lgo+ICtlbHNlCj4gK2FzX3NhdmVf
SUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKPiAgZm9yIGFzX2RpciBpbiAkUEFUSAo+ICBk
bwo+ICAgIElGUz0kYXNfc2F2ZV9JRlMKPiAgICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9
Lgo+ICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7
IGRvCj4gICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAk
YXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+IC0gICAg
YWNfY3ZfcGF0aF9CQ0M9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCj4gKyAgICBhY19j
dl9wcm9nX2FjX2N0X09DQU1MREVQPSJvY2FtbGRlcCIKPiAgICAgICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQi
ID4mNQo+ICAgICAgYnJlYWsgMgo+ICAgIGZpCj4gQEAgLTY2NTcsMjgzICs0MzU0LDI0MSBAQCBk
b25lCj4gICAgZG9uZQo+ICBJRlM9JGFzX3NhdmVfSUZTCj4gCj4gLSAgdGVzdCAteiAiJGFjX2N2
X3BhdGhfQkNDIiAmJiBhY19jdl9wYXRoX0JDQz0ibm8iCj4gLSAgOzsKPiAtZXNhYwo+ICBmaQo+
IC1CQ0M9JGFjX2N2X3BhdGhfQkNDCj4gLWlmIHRlc3QgLW4gIiRCQ0MiOyB0aGVuCj4gLSAgeyAk
YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCQ0MiID4mNQo+
IC0kYXNfZWNobyAiJEJDQyIgPiY2OyB9Cj4gK2ZpCj4gK2FjX2N0X09DQU1MREVQPSRhY19jdl9w
cm9nX2FjX2N0X09DQU1MREVQCj4gK2lmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTERFUCI7IHRoZW4K
PiArICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFj
X2N0X09DQU1MREVQIiA+JjUKPiArJGFzX2VjaG8gIiRhY19jdF9PQ0FNTERFUCIgPiY2OyB9Cj4g
IGVsc2UKPiAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogbm8iID4mNQo+ICAkYXNfZWNobyAibm8iID4mNjsgfQo+ICBmaQo+IAo+IC0KPiAtaWYgdGVz
dCB4IiR7QkNDfSIgPT0geCJubyIKPiAtdGhlbgo+IC0gICAgYXNfZm5fZXJyb3IgJD8gIlVuYWJs
ZSB0byBmaW5kIGJjYywgcGxlYXNlIGluc3RhbGwgYmNjIiAiJExJTkVOTyIgNQo+ICsgIGlmIHRl
c3QgIngkYWNfY3RfT0NBTUxERVAiID0geDsgdGhlbgo+ICsgICAgT0NBTUxERVA9Im5vIgo+ICsg
IGVsc2UKPiArICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KPiAr
eWVzOikKPiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5H
OiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQo+
ICskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4
ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Cj4gK2FjX3Rvb2xfd2FybmVkPXllcyA7Owo+ICtl
c2FjCj4gKyAgICBPQ0FNTERFUD0kYWNfY3RfT0NBTUxERVAKPiArICBmaQo+ICtlbHNlCj4gKyAg
T0NBTUxERVA9IiRhY19jdl9wcm9nX09DQU1MREVQIgo+ICBmaQo+IC0jIEV4dHJhY3QgdGhlIGZp
cnN0IHdvcmQgb2YgImlhc2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdz
Lgo+IC1zZXQgZHVtbXkgaWFzbDsgYWNfd29yZD0kMgo+ICsKPiArCj4gKyAgIyBjaGVja2luZyBm
b3Igb2NhbWxta3RvcAo+ICsgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KPiAr
ICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxta3Rv
cCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCj4gK3NldCBkdW1teSAk
e2FjX3Rvb2xfcHJlZml4fW9jYW1sbWt0b3A7IGFjX3dvcmQ9JDIKPiAgeyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQo+ICAk
YXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KPiAtaWYgdGVzdCAi
JHthY19jdl9wYXRoX0lBU0wrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICtpZiB0ZXN0ICIke2FjX2N2
X3Byb2dfT0NBTUxNS1RPUCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gICAgJGFzX2VjaG9fbiAiKGNh
Y2hlZCkgIiA+JjYKPiAgZWxzZQo+IC0gIGNhc2UgJElBU0wgaW4KPiAtICBbXFwvXSogfCA/Oltc
XC9dKikKPiAtICBhY19jdl9wYXRoX0lBU0w9IiRJQVNMIiAjIExldCB0aGUgdXNlciBvdmVycmlk
ZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KPiAtICA7Owo+IC0gICopCj4gLSAgYXNfc2F2ZV9JRlM9
JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgo+ICsgIGlmIHRlc3QgLW4gIiRPQ0FNTE1LVE9QIjsg
dGhlbgo+ICsgIGFjX2N2X3Byb2dfT0NBTUxNS1RPUD0iJE9DQU1MTUtUT1AiICMgTGV0IHRoZSB1
c2VyIG92ZXJyaWRlIHRoZSB0ZXN0Lgo+ICtlbHNlCj4gK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0k
UEFUSF9TRVBBUkFUT1IKPiAgZm9yIGFzX2RpciBpbiAkUEFUSAo+ICBkbwo+ICAgIElGUz0kYXNf
c2F2ZV9JRlMKPiAgICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+ICAgICAgZm9yIGFj
X2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gICAgaWYgeyB0
ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNf
ZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+IC0gICAgYWNfY3ZfcGF0aF9JQVNM
PSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0Igo+ICsgICAgYWNfY3ZfcHJvZ19PQ0FNTE1L
VE9QPSIke2FjX3Rvb2xfcHJlZml4fW9jYW1sbWt0b3AiCj4gICAgICAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0
IiA+JjUKPiAgICAgIGJyZWFrIDIKPiAtICBmaQo+IC1kb25lCj4gLSAgZG9uZQo+IC1JRlM9JGFz
X3NhdmVfSUZTCj4gLQo+IC0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0lBU0wiICYmIGFjX2N2X3Bh
dGhfSUFTTD0ibm8iCj4gLSAgOzsKPiAtZXNhYwo+IC1maQo+IC1JQVNMPSRhY19jdl9wYXRoX0lB
U0wKPiAtaWYgdGVzdCAtbiAiJElBU0wiOyB0aGVuCj4gLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRJQVNMIiA+JjUKPiAtJGFzX2VjaG8gIiRJQVNM
IiA+JjY7IH0KPiAtZWxzZQo+IC0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiBubyIgPiY1Cj4gLSRhc19lY2hvICJubyIgPiY2OyB9Cj4gLWZpCj4gLQo+
IC0KPiAtaWYgdGVzdCB4IiR7SUFTTH0iID09IHgibm8iCj4gLXRoZW4KPiAtICAgIGFzX2ZuX2Vy
cm9yICQ/ICJVbmFibGUgdG8gZmluZCBpYXNsLCBwbGVhc2UgaW5zdGFsbCBpYXNsIiAiJExJTkVO
TyIgNQo+IC1maQo+IC0KPiAtYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIg
InV1aWQvdXVpZC5oIiAiYWNfY3ZfaGVhZGVyX3V1aWRfdXVpZF9oIiAiJGFjX2luY2x1ZGVzX2Rl
ZmF1bHQiCj4gLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3V1aWRfdXVpZF9oIiA9IHgiInllczsg
dGhlbiA6Cj4gLQo+IC0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiBjaGVja2luZyBmb3IgdXVpZF9jbGVhciBpbiAtbHV1aWQiID4mNQo+IC0kYXNfZWNob19uICJj
aGVja2luZyBmb3IgdXVpZF9jbGVhciBpbiAtbHV1aWQuLi4gIiA+JjY7IH0KPiAtaWYgdGVzdCAi
JHthY19jdl9saWJfdXVpZF91dWlkX2NsZWFyK3NldH0iID0gc2V0OyB0aGVuIDoKPiAtICAkYXNf
ZWNob19uICIoY2FjaGVkKSAiID4mNgo+IC1lbHNlCj4gLSAgYWNfY2hlY2tfbGliX3NhdmVfTElC
Uz0kTElCUwo+IC1MSUJTPSItbHV1aWQgICRMSUJTIgo+IC1jYXQgY29uZmRlZnMuaCAtIDw8X0FD
RU9GID5jb25mdGVzdC4kYWNfZXh0Cj4gLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KPiAtCj4gLS8q
IE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgo+
IC0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2Yg
YSBHQ0MKPiAtICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxk
IHN0aWxsIGFwcGx5LiAgKi8KPiAtI2lmZGVmIF9fY3BsdXNwbHVzCj4gLWV4dGVybiAiQyIKPiAt
I2VuZGlmCj4gLWNoYXIgdXVpZF9jbGVhciAoKTsKPiAtaW50Cj4gLW1haW4gKCkKPiAtewo+IC1y
ZXR1cm4gdXVpZF9jbGVhciAoKTsKPiAtICA7Cj4gLSAgcmV0dXJuIDA7Cj4gLX0KPiAtX0FDRU9G
Cj4gLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKPiAtICBhY19jdl9saWJf
dXVpZF91dWlkX2NsZWFyPXllcwo+IC1lbHNlCj4gLSAgYWNfY3ZfbGliX3V1aWRfdXVpZF9jbGVh
cj1ubwo+IC1maQo+IC1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0
IFwKPiAtICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Cj4gLUxJQlM9JGFj
X2NoZWNrX2xpYl9zYXZlX0xJQlMKPiAtZmkKPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfdXVpZF91dWlkX2NsZWFyIiA+JjUKPiAt
JGFzX2VjaG8gIiRhY19jdl9saWJfdXVpZF91dWlkX2NsZWFyIiA+JjY7IH0KPiAtaWYgdGVzdCAi
eCRhY19jdl9saWJfdXVpZF91dWlkX2NsZWFyIiA9IHgiInllczsgdGhlbiA6Cj4gLSAgbGlidXVp
ZD0ieSIKPiAtZmkKPiAtCj4gKyAgZmkKPiArZG9uZQo+ICsgIGRvbmUKPiArSUZTPSRhc19zYXZl
X0lGUwo+IAo+ICBmaQo+IC0KPiAtCj4gLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRM
SU5FTk8iICJ1dWlkLmgiICJhY19jdl9oZWFkZXJfdXVpZF9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1
bHQiCj4gLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3V1aWRfaCIgPSB4IiJ5ZXM7IHRoZW4gOgo+
IC0gIGxpYnV1aWQ9InkiCj4gIGZpCj4gLQo+IC0KPiAtaWYgdGVzdCAiJGxpYnV1aWQiICE9ICJ5
IjsgdGhlbiA6Cj4gLQo+IC0gICAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIGEgdmFsaWQg
dXVpZCBsaWJyYXJ5IiAiJExJTkVOTyIgNQo+IC0KPiArT0NBTUxNS1RPUD0kYWNfY3ZfcHJvZ19P
Q0FNTE1LVE9QCj4gK2lmIHRlc3QgLW4gIiRPQ0FNTE1LVE9QIjsgdGhlbgo+ICsgIHsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0NBTUxNS1RPUCIgPiY1
Cj4gKyRhc19lY2hvICIkT0NBTUxNS1RPUCIgPiY2OyB9Cj4gK2Vsc2UKPiArICB7ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQo+ICskYXNfZWNo
byAibm8iID4mNjsgfQo+ICBmaQo+IAo+IAo+IC1hY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVs
ICIkTElORU5PIiAiY3Vyc2VzLmgiICJhY19jdl9oZWFkZXJfY3Vyc2VzX2giICIkYWNfaW5jbHVk
ZXNfZGVmYXVsdCIKPiAtaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfY3Vyc2VzX2giID0geCIieWVz
OyB0aGVuIDoKPiAtCj4gLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IGNoZWNraW5nIGZvciBjbGVhciBpbiAtbGN1cnNlcyIgPiY1Cj4gLSRhc19lY2hvX24gImNo
ZWNraW5nIGZvciBjbGVhciBpbiAtbGN1cnNlcy4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0ICIke2Fj
X2N2X2xpYl9jdXJzZXNfY2xlYXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICtmaQo+ICtpZiB0ZXN0
IC16ICIkYWNfY3ZfcHJvZ19PQ0FNTE1LVE9QIjsgdGhlbgo+ICsgIGFjX2N0X09DQU1MTUtUT1A9
JE9DQU1MTUtUT1AKPiArICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm9jYW1sbWt0b3Ai
LCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgo+ICtzZXQgZHVtbXkgb2Nh
bWxta3RvcDsgYWNfd29yZD0kMgo+ICt7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cj4gKyRhc19lY2hvX24gImNoZWNraW5n
IGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQo+ICtpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3Rf
T0NBTUxNS1RPUCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkg
IiA+JjYKPiAgZWxzZQo+IC0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKPiAtTElCUz0i
LWxjdXJzZXMgICRMSUJTIgo+IC1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4k
YWNfZXh0Cj4gLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KPiAtCj4gLS8qIE92ZXJyaWRlIGFueSBH
Q0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgo+IC0gICBVc2UgY2hhciBi
ZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKPiAtICAgYnVp
bHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAg
Ki8KPiAtI2lmZGVmIF9fY3BsdXNwbHVzCj4gLWV4dGVybiAiQyIKPiAtI2VuZGlmCj4gLWNoYXIg
Y2xlYXIgKCk7Cj4gLWludAo+IC1tYWluICgpCj4gLXsKPiAtcmV0dXJuIGNsZWFyICgpOwo+IC0g
IDsKPiAtICByZXR1cm4gMDsKPiAtfQo+IC1fQUNFT0YKPiAtaWYgYWNfZm5fY190cnlfbGluayAi
JExJTkVOTyI7IHRoZW4gOgo+IC0gIGFjX2N2X2xpYl9jdXJzZXNfY2xlYXI9eWVzCj4gKyAgaWYg
dGVzdCAtbiAiJGFjX2N0X09DQU1MTUtUT1AiOyB0aGVuCj4gKyAgYWNfY3ZfcHJvZ19hY19jdF9P
Q0FNTE1LVE9QPSIkYWNfY3RfT0NBTUxNS1RPUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhl
IHRlc3QuCj4gIGVsc2UKPiAtICBhY19jdl9saWJfY3Vyc2VzX2NsZWFyPW5vCj4gK2FzX3NhdmVf
SUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKPiArZm9yIGFzX2RpciBpbiAkUEFUSAo+ICtk
bwo+ICsgIElGUz0kYXNfc2F2ZV9JRlMKPiArICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9
Lgo+ICsgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7
IGRvCj4gKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAk
YXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+ICsgICAg
YWNfY3ZfcHJvZ19hY19jdF9PQ0FNTE1LVE9QPSJvY2FtbG1rdG9wIgo+ICsgICAgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19l
eGVjX2V4dCIgPiY1Cj4gKyAgICBicmVhayAyCj4gKyAgZmkKPiArZG9uZQo+ICsgIGRvbmUKPiAr
SUZTPSRhc19zYXZlX0lGUwo+ICsKPiAgZmkKPiAtcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29u
ZnRlc3QuJGFjX29iamV4dCBcCj4gLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFj
X2V4dAo+IC1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCj4gIGZpCj4gLXsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2N1cnNlc19j
bGVhciIgPiY1Cj4gLSRhc19lY2hvICIkYWNfY3ZfbGliX2N1cnNlc19jbGVhciIgPiY2OyB9Cj4g
LWlmIHRlc3QgIngkYWNfY3ZfbGliX2N1cnNlc19jbGVhciIgPSB4IiJ5ZXM7IHRoZW4gOgo+IC0g
IGN1cnNlcz0ieSIKPiArYWNfY3RfT0NBTUxNS1RPUD0kYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTE1L
VE9QCj4gK2lmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTE1LVE9QIjsgdGhlbgo+ICsgIHsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfT0NBTUxNS1RP
UCIgPiY1Cj4gKyRhc19lY2hvICIkYWNfY3RfT0NBTUxNS1RPUCIgPiY2OyB9Cj4gIGVsc2UKPiAt
ICBjdXJzZXM9Im4iCj4gKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiByZXN1bHQ6IG5vIiA+JjUKPiArJGFzX2VjaG8gIm5vIiA+JjY7IH0KPiAgZmkKPiAKPiAtCj4g
KyAgaWYgdGVzdCAieCRhY19jdF9PQ0FNTE1LVE9QIiA9IHg7IHRoZW4KPiArICAgIE9DQU1MTUtU
T1A9Im5vIgo+ICsgIGVsc2UKPiArICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93
YXJuZWQgaW4KPiAreWVzOikKPiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRy
aXBsZXQiID4mNQo+ICskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29s
cyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Cj4gK2FjX3Rvb2xfd2FybmVk
PXllcyA7Owo+ICtlc2FjCj4gKyAgICBPQ0FNTE1LVE9QPSRhY19jdF9PQ0FNTE1LVE9QCj4gKyAg
ZmkKPiAgZWxzZQo+IC0gIGN1cnNlcz0ibiIKPiArICBPQ0FNTE1LVE9QPSIkYWNfY3ZfcHJvZ19P
Q0FNTE1LVE9QIgo+ICBmaQo+IAo+IAo+IC1hY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIk
TElORU5PIiAibmN1cnNlcy5oIiAiYWNfY3ZfaGVhZGVyX25jdXJzZXNfaCIgIiRhY19pbmNsdWRl
c19kZWZhdWx0Igo+IC1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9uY3Vyc2VzX2giID0geCIieWVz
OyB0aGVuIDoKPiAtCj4gLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IGNoZWNraW5nIGZvciBjbGVhciBpbiAtbG5jdXJzZXMiID4mNQo+IC0kYXNfZWNob19uICJj
aGVja2luZyBmb3IgY2xlYXIgaW4gLWxuY3Vyc2VzLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7
YWNfY3ZfbGliX25jdXJzZXNfY2xlYXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICsgICMgY2hlY2tp
bmcgZm9yIG9jYW1sbWtsaWIKPiArICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVu
Cj4gKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9jYW1s
bWtsaWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgo+ICtzZXQgZHVt
bXkgJHthY190b29sX3ByZWZpeH1vY2FtbG1rbGliOyBhY193b3JkPSQyCj4gK3sgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUK
PiArJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cj4gK2lmIHRl
c3QgIiR7YWNfY3ZfcHJvZ19PQ0FNTE1LTElCK3NldH0iID0gc2V0OyB0aGVuIDoKPiAgICAkYXNf
ZWNob19uICIoY2FjaGVkKSAiID4mNgo+ICBlbHNlCj4gLSAgYWNfY2hlY2tfbGliX3NhdmVfTElC
Uz0kTElCUwo+IC1MSUJTPSItbG5jdXJzZXMgICRMSUJTIgo+IC1jYXQgY29uZmRlZnMuaCAtIDw8
X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Cj4gLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KPiAtCj4g
LS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9y
Lgo+IC0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUg
b2YgYSBHQ0MKPiAtICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdv
dWxkIHN0aWxsIGFwcGx5LiAgKi8KPiAtI2lmZGVmIF9fY3BsdXNwbHVzCj4gLWV4dGVybiAiQyIK
PiAtI2VuZGlmCj4gLWNoYXIgY2xlYXIgKCk7Cj4gLWludAo+IC1tYWluICgpCj4gLXsKPiAtcmV0
dXJuIGNsZWFyICgpOwo+IC0gIDsKPiAtICByZXR1cm4gMDsKPiAtfQo+IC1fQUNFT0YKPiAtaWYg
YWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgo+IC0gIGFjX2N2X2xpYl9uY3Vyc2Vz
X2NsZWFyPXllcwo+ICsgIGlmIHRlc3QgLW4gIiRPQ0FNTE1LTElCIjsgdGhlbgo+ICsgIGFjX2N2
X3Byb2dfT0NBTUxNS0xJQj0iJE9DQU1MTUtMSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRo
ZSB0ZXN0Lgo+ICBlbHNlCj4gLSAgYWNfY3ZfbGliX25jdXJzZXNfY2xlYXI9bm8KPiArYXNfc2F2
ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgo+ICtmb3IgYXNfZGlyIGluICRQQVRICj4g
K2RvCj4gKyAgSUZTPSRhc19zYXZlX0lGUwo+ICsgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rp
cj0uCj4gKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9u
czsgZG8KPiArICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYm
ICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCj4gKyAg
ICBhY19jdl9wcm9nX09DQU1MTUtMSUI9IiR7YWNfdG9vbF9wcmVmaXh9b2NhbWxta2xpYiIKPiAr
ICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIv
JGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQo+ICsgICAgYnJlYWsgMgo+ICsgIGZpCj4gK2RvbmUK
PiArICBkb25lCj4gK0lGUz0kYXNfc2F2ZV9JRlMKPiArCj4gIGZpCj4gLXJtIC1mIGNvcmUgY29u
ZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAo+IC0gICAgY29uZnRlc3QkYWNfZXhlZXh0
IGNvbmZ0ZXN0LiRhY19leHQKPiAtTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwo+ICBmaQo+
IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2
X2xpYl9uY3Vyc2VzX2NsZWFyIiA+JjUKPiAtJGFzX2VjaG8gIiRhY19jdl9saWJfbmN1cnNlc19j
bGVhciIgPiY2OyB9Cj4gLWlmIHRlc3QgIngkYWNfY3ZfbGliX25jdXJzZXNfY2xlYXIiID0geCIi
eWVzOyB0aGVuIDoKPiAtICBuY3Vyc2VzPSJ5Igo+ICtPQ0FNTE1LTElCPSRhY19jdl9wcm9nX09D
QU1MTUtMSUIKPiAraWYgdGVzdCAtbiAiJE9DQU1MTUtMSUIiOyB0aGVuCj4gKyAgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPQ0FNTE1LTElCIiA+JjUK
PiArJGFzX2VjaG8gIiRPQ0FNTE1LTElCIiA+JjY7IH0KPiAgZWxzZQo+IC0gIG5jdXJzZXM9Im4i
Cj4gKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5v
IiA+JjUKPiArJGFzX2VjaG8gIm5vIiA+JjY7IH0KPiAgZmkKPiAKPiAKPiAtZWxzZQo+IC0gIG5j
dXJzZXM9Im4iCj4gIGZpCj4gLQo+IC0KPiAtaWYgdGVzdCAiJGN1cnNlcyIgPSAibiIgJiYgdGVz
dCAiJG5jdXJzZXMiID0gIm4iOyB0aGVuIDoKPiAtCj4gLSAgICBhc19mbl9lcnJvciAkPyAiVW5h
YmxlIHRvIGZpbmQgYSBzdWl0YWJsZSBjdXJzZXMgbGlicmFyeSIgIiRMSU5FTk8iIDUKPiAraWYg
dGVzdCAteiAiJGFjX2N2X3Byb2dfT0NBTUxNS0xJQiI7IHRoZW4KPiArICBhY19jdF9PQ0FNTE1L
TElCPSRPQ0FNTE1LTElCCj4gKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvY2FtbG1r
bGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KPiArc2V0IGR1bW15
IG9jYW1sbWtsaWI7IGFjX3dvcmQ9JDIKPiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQo+ICskYXNfZWNob19uICJjaGVj
a2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KPiAraWYgdGVzdCAiJHthY19jdl9wcm9nX2Fj
X2N0X09DQU1MTUtMSUIrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICsgICRhc19lY2hvX24gIihjYWNo
ZWQpICIgPiY2Cj4gK2Vsc2UKPiArICBpZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxNS0xJQiI7IHRo
ZW4KPiArICBhY19jdl9wcm9nX2FjX2N0X09DQU1MTUtMSUI9IiRhY19jdF9PQ0FNTE1LTElCIiAj
IExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KPiArZWxzZQo+ICthc19zYXZlX0lGUz0k
SUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCj4gK2ZvciBhc19kaXIgaW4gJFBBVEgKPiArZG8KPiAr
ICBJRlM9JGFzX3NhdmVfSUZTCj4gKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KPiAr
ICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwo+
ICsgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rl
c3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KPiArICAgIGFjX2N2
X3Byb2dfYWNfY3RfT0NBTUxNS0xJQj0ib2NhbWxta2xpYiIKPiArICAgICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19l
eHQiID4mNQo+ICsgICAgYnJlYWsgMgo+ICsgIGZpCj4gK2RvbmUKPiArICBkb25lCj4gK0lGUz0k
YXNfc2F2ZV9JRlMKPiAKPiAgZmkKPiAtIyBQcmVmZXIgbmN1cnNlcyBvdmVyIGN1cnNlcyBpZiBi
b3RoIGFyZSBwcmVzZW50Cj4gLWlmIHRlc3QgIiRuY3Vyc2VzIiA9ICJ5IjsgdGhlbiA6Cj4gLQo+
IC0gICAgQ1VSU0VTX0xJQlM9Ii1sbmN1cnNlcyIKPiAtCj4gLSRhc19lY2hvICIjZGVmaW5lIElO
Q0xVREVfQ1VSU0VTX0ggPG5jdXJzZXMuaD4iID4+Y29uZmRlZnMuaAo+IC0KPiAtCj4gK2ZpCj4g
K2FjX2N0X09DQU1MTUtMSUI9JGFjX2N2X3Byb2dfYWNfY3RfT0NBTUxNS0xJQgo+ICtpZiB0ZXN0
IC1uICIkYWNfY3RfT0NBTUxNS0xJQiI7IHRoZW4KPiArICB7ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09DQU1MTUtMSUIiID4mNQo+ICskYXNf
ZWNobyAiJGFjX2N0X09DQU1MTUtMSUIiID4mNjsgfQo+ICBlbHNlCj4gLQo+IC0gICAgQ1VSU0VT
X0xJQlM9Ii1sY3Vyc2VzIgo+IC0KPiAtJGFzX2VjaG8gIiNkZWZpbmUgSU5DTFVERV9DVVJTRVNf
SCA8Y3Vyc2VzLmg+IiA+PmNvbmZkZWZzLmgKPiAtCj4gLQo+ICsgIHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Cj4gKyRhc19lY2hvICJubyIg
PiY2OyB9Cj4gIGZpCj4gCj4gKyAgaWYgdGVzdCAieCRhY19jdF9PQ0FNTE1LTElCIiA9IHg7IHRo
ZW4KPiArICAgIE9DQU1MTUtMSUI9Im5vIgo+ICsgIGVsc2UKPiArICAgIGNhc2UgJGNyb3NzX2Nv
bXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KPiAreWVzOikKPiAreyAkYXNfZWNobyAiJGFzX21l
OiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJl
Zml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQo+ICskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5H
OiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9
Cj4gK2FjX3Rvb2xfd2FybmVkPXllcyA7Owo+ICtlc2FjCj4gKyAgICBPQ0FNTE1LTElCPSRhY19j
dF9PQ0FNTE1LTElCCj4gKyAgZmkKPiArZWxzZQo+ICsgIE9DQU1MTUtMSUI9IiRhY19jdl9wcm9n
X09DQU1MTUtMSUIiCj4gK2ZpCj4gCj4gCj4gLQo+IC0KPiAtCj4gLQo+IC0KPiAtaWYgdGVzdCAi
eCRhY19jdl9lbnZfUEtHX0NPTkZJR19zZXQiICE9ICJ4c2V0IjsgdGhlbgo+IC0gICAgICAgaWYg
dGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgo+IC0gICMgRXh0cmFjdCB0aGUgZmlyc3Qg
d29yZCBvZiAiJHthY190b29sX3ByZWZpeH1wa2ctY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJv
Z3JhbSBuYW1lIHdpdGggYXJncy4KPiAtc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cGtnLWNv
bmZpZzsgYWNfd29yZD0kMgo+ICsgICMgY2hlY2tpbmcgZm9yIG9jYW1sZG9jCj4gKyAgaWYgdGVz
dCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgo+ICsgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29y
ZCBvZiAiJHthY190b29sX3ByZWZpeH1vY2FtbGRvYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0g
bmFtZSB3aXRoIGFyZ3MuCj4gK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW9jYW1sZG9jOyBh
Y193b3JkPSQyCj4gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hl
Y2tpbmcgZm9yICRhY193b3JkIiA+JjUKPiAgJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193
b3JkLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9QS0dfQ09ORklHK3NldH0i
ID0gc2V0OyB0aGVuIDoKPiAraWYgdGVzdCAiJHthY19jdl9wcm9nX09DQU1MRE9DK3NldH0iID0g
c2V0OyB0aGVuIDoKPiAgICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgo+ICBlbHNlCj4gLSAg
Y2FzZSAkUEtHX0NPTkZJRyBpbgo+IC0gIFtcXC9dKiB8ID86W1xcL10qKQo+IC0gIGFjX2N2X3Bh
dGhfUEtHX0NPTkZJRz0iJFBLR19DT05GSUciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0
ZXN0IHdpdGggYSBwYXRoLgo+IC0gIDs7Cj4gLSAgKikKPiAtICBhc19zYXZlX0lGUz0kSUZTOyBJ
RlM9JFBBVEhfU0VQQVJBVE9SCj4gKyAgaWYgdGVzdCAtbiAiJE9DQU1MRE9DIjsgdGhlbgo+ICsg
IGFjX2N2X3Byb2dfT0NBTUxET0M9IiRPQ0FNTERPQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUg
dGhlIHRlc3QuCj4gK2Vsc2UKPiArYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRP
Ugo+ICBmb3IgYXNfZGlyIGluICRQQVRICj4gIGRvCj4gICAgSUZTPSRhc19zYXZlX0lGUwo+ICAg
IHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCj4gICAgICBmb3IgYWNfZXhlY19leHQgaW4g
JycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KPiAgICBpZiB7IHRlc3QgLWYgIiRhc19k
aXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQk
YWNfZXhlY19leHQiOyB9OyB0aGVuCj4gLSAgICBhY19jdl9wYXRoX1BLR19DT05GSUc9IiRhc19k
aXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCj4gKyAgICBhY19jdl9wcm9nX09DQU1MRE9DPSIke2Fj
X3Rvb2xfcHJlZml4fW9jYW1sZG9jIgo+ICAgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Cj4gICAg
ICBicmVhayAyCj4gICAgZmkKPiBAQCAtNjk0MSwxMyArNDU5NiwxMiBAQCBkb25lCj4gICAgZG9u
ZQo+ICBJRlM9JGFzX3NhdmVfSUZTCj4gCj4gLSAgOzsKPiAtZXNhYwo+ICBmaQo+IC1QS0dfQ09O
RklHPSRhY19jdl9wYXRoX1BLR19DT05GSUcKPiAtaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0
aGVuCj4gLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6
ICRQS0dfQ09ORklHIiA+JjUKPiAtJGFzX2VjaG8gIiRQS0dfQ09ORklHIiA+JjY7IH0KPiArZmkK
PiArT0NBTUxET0M9JGFjX2N2X3Byb2dfT0NBTUxET0MKPiAraWYgdGVzdCAtbiAiJE9DQU1MRE9D
IjsgdGhlbgo+ICsgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVz
dWx0OiAkT0NBTUxET0MiID4mNQo+ICskYXNfZWNobyAiJE9DQU1MRE9DIiA+JjY7IH0KPiAgZWxz
ZQo+ICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBu
byIgPiY1Cj4gICRhc19lY2hvICJubyIgPiY2OyB9Cj4gQEAgLTY5NTUsMjggKzQ2MDksMjYgQEAg
ZmkKPiAKPiAKPiAgZmkKPiAtaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfUEtHX0NPTkZJRyI7IHRo
ZW4KPiAtICBhY19wdF9QS0dfQ09ORklHPSRQS0dfQ09ORklHCj4gLSAgIyBFeHRyYWN0IHRoZSBm
aXJzdCB3b3JkIG9mICJwa2ctY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdp
dGggYXJncy4KPiAtc2V0IGR1bW15IHBrZy1jb25maWc7IGFjX3dvcmQ9JDIKPiAraWYgdGVzdCAt
eiAiJGFjX2N2X3Byb2dfT0NBTUxET0MiOyB0aGVuCj4gKyAgYWNfY3RfT0NBTUxET0M9JE9DQU1M
RE9DCj4gKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvY2FtbGRvYyIsIHNvIGl0IGNh
biBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCj4gK3NldCBkdW1teSBvY2FtbGRvYzsgYWNf
d29yZD0kMgo+ICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNr
aW5nIGZvciAkYWNfd29yZCIgPiY1Cj4gICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29y
ZC4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfYWNfcHRfUEtHX0NPTkZJRytz
ZXR9IiA9IHNldDsgdGhlbiA6Cj4gK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9PQ0FNTERP
QytzZXR9IiA9IHNldDsgdGhlbiA6Cj4gICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAg
ZWxzZQo+IC0gIGNhc2UgJGFjX3B0X1BLR19DT05GSUcgaW4KPiAtICBbXFwvXSogfCA/OltcXC9d
KikKPiAtICBhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUc9IiRhY19wdF9QS0dfQ09ORklHIiAj
IExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KPiAtICA7Owo+IC0g
ICopCj4gLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgo+ICsgIGlmIHRl
c3QgLW4gIiRhY19jdF9PQ0FNTERPQyI7IHRoZW4KPiArICBhY19jdl9wcm9nX2FjX2N0X09DQU1M
RE9DPSIkYWNfY3RfT0NBTUxET0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0Lgo+
ICtlbHNlCj4gK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKPiAgZm9yIGFz
X2RpciBpbiAkUEFUSAo+ICBkbwo+ICAgIElGUz0kYXNfc2F2ZV9JRlMKPiAgICB0ZXN0IC16ICIk
YXNfZGlyIiAmJiBhc19kaXI9Lgo+ICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVj
dXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3Jk
JGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0
IjsgfTsgdGhlbgo+IC0gICAgYWNfY3ZfcGF0aF9hY19wdF9QS0dfQ09ORklHPSIkYXNfZGlyLyRh
Y193b3JkJGFjX2V4ZWNfZXh0Igo+ICsgICAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTERPQz0ib2Nh
bWxkb2MiCj4gICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3Vu
ZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKPiAgICAgIGJyZWFrIDIKPiAgICBm
aQo+IEBAIC02OTg0LDIwICs0NjM2LDE5IEBAIGRvbmUKPiAgICBkb25lCj4gIElGUz0kYXNfc2F2
ZV9JRlMKPiAKPiAtICA7Owo+IC1lc2FjCj4gIGZpCj4gLWFjX3B0X1BLR19DT05GSUc9JGFjX2N2
X3BhdGhfYWNfcHRfUEtHX0NPTkZJRwo+IC1pZiB0ZXN0IC1uICIkYWNfcHRfUEtHX0NPTkZJRyI7
IHRoZW4KPiAtICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJGFjX3B0X1BLR19DT05GSUciID4mNQo+IC0kYXNfZWNobyAiJGFjX3B0X1BLR19DT05GSUci
ID4mNjsgfQo+ICtmaQo+ICthY19jdF9PQ0FNTERPQz0kYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTERP
Qwo+ICtpZiB0ZXN0IC1uICIkYWNfY3RfT0NBTUxET0MiOyB0aGVuCj4gKyAgeyAkYXNfZWNobyAi
JGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9PQ0FNTERPQyIgPiY1
Cj4gKyRhc19lY2hvICIkYWNfY3RfT0NBTUxET0MiID4mNjsgfQo+ICBlbHNlCj4gICAgeyAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKPiAgJGFz
X2VjaG8gIm5vIiA+JjY7IH0KPiAgZmkKPiAKPiAtICBpZiB0ZXN0ICJ4JGFjX3B0X1BLR19DT05G
SUciID0geDsgdGhlbgo+IC0gICAgUEtHX0NPTkZJRz0iIgo+ICsgIGlmIHRlc3QgIngkYWNfY3Rf
T0NBTUxET0MiID0geDsgdGhlbgo+ICsgICAgT0NBTUxET0M9Im5vIgo+ICAgIGVsc2UKPiAgICAg
IGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KPiAgeWVzOikKPiBAQCAt
NzAwNSw2MjQgKzQ2NTYsNzE4IEBAIHllczopCj4gICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6
IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30K
PiAgYWNfdG9vbF93YXJuZWQ9eWVzIDs7Cj4gIGVzYWMKPiAtICAgIFBLR19DT05GSUc9JGFjX3B0
X1BLR19DT05GSUcKPiArICAgIE9DQU1MRE9DPSRhY19jdF9PQ0FNTERPQwo+ICAgIGZpCj4gIGVs
c2UKPiAtICBQS0dfQ09ORklHPSIkYWNfY3ZfcGF0aF9QS0dfQ09ORklHIgo+IC1maQo+IC0KPiAt
ZmkKPiAtaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCj4gLSAgICAgICBfcGtnX21pbl92
ZXJzaW9uPTAuOS4wCj4gLSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IGNoZWNraW5nIHBrZy1jb25maWcgaXMgYXQgbGVhc3QgdmVyc2lvbiAkX3BrZ19taW5f
dmVyc2lvbiIgPiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5nIHBrZy1jb25maWcgaXMgYXQgbGVh
c3QgdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbi4uLiAiID4mNjsgfQo+IC0gICAgICAgaWYgJFBL
R19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uICRfcGtnX21pbl92ZXJzaW9uOyB0
aGVuCj4gLSAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiB5ZXMiID4mNQo+IC0kYXNfZWNobyAieWVzIiA+JjY7IH0KPiAtICAgICAg
IGVsc2UKPiAtICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKPiAtJGFzX2VjaG8gIm5vIiA+JjY7IH0KPiAtICAgICAg
ICAgICAgICAgUEtHX0NPTkZJRz0iIgo+IC0gICAgICAgZmkKPiAtZmkKPiAtCj4gLXBrZ19mYWls
ZWQ9bm8KPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2lu
ZyBmb3IgZ2xpYiIgPiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBnbGliLi4uICIgPiY2
OyB9Cj4gLQo+IC1pZiB0ZXN0IC1uICIkZ2xpYl9DRkxBR1MiOyB0aGVuCj4gLSAgICBwa2dfY3Zf
Z2xpYl9DRkxBR1M9IiRnbGliX0NGTEFHUyIKPiAtIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUci
OyB0aGVuCj4gLSAgICBpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyIgJiYgXAo+IC0gICAgeyB7ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkUEtHX0NPTkZJRyAtLWV4aXN0
cyAtLXByaW50LWVycm9ycyBcImdsaWItMi4wXCIiOyB9ID4mNQo+IC0gICgkUEtHX0NPTkZJRyAt
LWV4aXN0cyAtLXByaW50LWVycm9ycyAiZ2xpYi0yLjAiKSAyPiY1Cj4gLSAgYWNfc3RhdHVzPSQ/
Cj4gLSAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0
YXR1cyIgPiY1Cj4gLSAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbgo+IC0gIHBrZ19jdl9n
bGliX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgImdsaWItMi4wIiAyPi9kZXYvbnVsbGAK
PiAtZWxzZQo+IC0gIHBrZ19mYWlsZWQ9eWVzCj4gLWZpCj4gLSBlbHNlCj4gLSAgICBwa2dfZmFp
bGVkPXVudHJpZWQKPiAtZmkKPiAtaWYgdGVzdCAtbiAiJGdsaWJfTElCUyI7IHRoZW4KPiAtICAg
IHBrZ19jdl9nbGliX0xJQlM9IiRnbGliX0xJQlMiCj4gLSBlbGlmIHRlc3QgLW4gIiRQS0dfQ09O
RklHIjsgdGhlbgo+IC0gICAgaWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKPiAtICAgIHsg
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJFBLR19DT05GSUcgLS1l
eGlzdHMgLS1wcmludC1lcnJvcnMgXCJnbGliLTIuMFwiIjsgfSA+JjUKPiAtICAoJFBLR19DT05G
SUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgImdsaWItMi4wIikgMj4mNQo+IC0gIGFjX3N0YXR1
cz0kPwo+IC0gICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRh
Y19zdGF0dXMiID4mNQo+IC0gIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4KPiAtICBwa2df
Y3ZfZ2xpYl9MSUJTPWAkUEtHX0NPTkZJRyAtLWxpYnMgImdsaWItMi4wIiAyPi9kZXYvbnVsbGAK
PiAtZWxzZQo+IC0gIHBrZ19mYWlsZWQ9eWVzCj4gLWZpCj4gLSBlbHNlCj4gLSAgICBwa2dfZmFp
bGVkPXVudHJpZWQKPiAtZmkKPiAtCj4gLQo+IC0KPiAtaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHll
czsgdGhlbgo+IC0gICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiByZXN1bHQ6IG5vIiA+JjUKPiAtJGFzX2VjaG8gIm5vIiA+JjY7IH0KPiAtCj4gLWlmICRQS0df
Q09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAwLjIwOyB0aGVuCj4gLSAgICAgICAg
X3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPXllcwo+IC1lbHNlCj4gLSAgICAgICAgX3BrZ19z
aG9ydF9lcnJvcnNfc3VwcG9ydGVkPW5vCj4gKyAgT0NBTUxET0M9IiRhY19jdl9wcm9nX09DQU1M
RE9DIgo+ICBmaQo+IC0gICAgICAgIGlmIHRlc3QgJF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRl
ZCA9IHllczsgdGhlbgo+IC0gICAgICAgICAgICAgICBnbGliX1BLR19FUlJPUlM9YCRQS0dfQ09O
RklHIC0tc2hvcnQtZXJyb3JzIC0tcHJpbnQtZXJyb3JzICJnbGliLTIuMCIgMj4mMWAKPiAtICAg
ICAgICBlbHNlCj4gLSAgICAgICAgICAgICAgIGdsaWJfUEtHX0VSUk9SUz1gJFBLR19DT05GSUcg
LS1wcmludC1lcnJvcnMgImdsaWItMi4wIiAyPiYxYAo+IC0gICAgICAgIGZpCj4gLSAgICAgICAj
IFB1dCB0aGUgbmFzdHkgZXJyb3IgbWVzc2FnZSBpbiBjb25maWcubG9nIHdoZXJlIGl0IGJlbG9u
Z3MKPiAtICAgICAgIGVjaG8gIiRnbGliX1BLR19FUlJPUlMiID4mNQo+IC0KPiAtICAgICAgIGFz
X2ZuX2Vycm9yICQ/ICJQYWNrYWdlIHJlcXVpcmVtZW50cyAoZ2xpYi0yLjApIHdlcmUgbm90IG1l
dDoKPiAtCj4gLSRnbGliX1BLR19FUlJPUlMKPiAtCj4gLUNvbnNpZGVyIGFkanVzdGluZyB0aGUg
UEtHX0NPTkZJR19QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHlvdQo+IC1pbnN0YWxsZWQg
c29mdHdhcmUgaW4gYSBub24tc3RhbmRhcmQgcHJlZml4Lgo+IC0KPiAtQWx0ZXJuYXRpdmVseSwg
eW91IG1heSBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBnbGliX0NGTEFHUwo+IC1hbmQg
Z2xpYl9MSUJTIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGNhbGwgcGtnLWNvbmZpZy4KPiAtU2VlIHRo
ZSBwa2ctY29uZmlnIG1hbiBwYWdlIGZvciBtb3JlIGRldGFpbHMuIiAiJExJTkVOTyIgNQo+IC1l
bGlmIHRlc3QgJHBrZ19mYWlsZWQgPSB1bnRyaWVkOyB0aGVuCj4gLSAgICAgICB7ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQo+IC0kYXNfZWNo
byAibm8iID4mNjsgfQo+IC0gICAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Cj4gLSRhc19lY2hvICIkYXNfbWU6
IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KPiAtYXNfZm5fZXJyb3IgJD8gIlRoZSBwa2ct
Y29uZmlnIHNjcmlwdCBjb3VsZCBub3QgYmUgZm91bmQgb3IgaXMgdG9vIG9sZC4gIE1ha2Ugc3Vy
ZSBpdAo+IC1pcyBpbiB5b3VyIFBBVEggb3Igc2V0IHRoZSBQS0dfQ09ORklHIGVudmlyb25tZW50
IHZhcmlhYmxlIHRvIHRoZSBmdWxsCj4gLXBhdGggdG8gcGtnLWNvbmZpZy4KPiAKPiAtQWx0ZXJu
YXRpdmVseSwgeW91IG1heSBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBnbGliX0NGTEFH
Uwo+IC1hbmQgZ2xpYl9MSUJTIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGNhbGwgcGtnLWNvbmZpZy4K
PiAtU2VlIHRoZSBwa2ctY29uZmlnIG1hbiBwYWdlIGZvciBtb3JlIGRldGFpbHMuCj4gCj4gLVRv
IGdldCBwa2ctY29uZmlnLCBzZWUgPGh0dHA6Ly9wa2ctY29uZmlnLmZyZWVkZXNrdG9wLm9yZy8+
Lgo+IC1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNSA7IH0K
PiArICAjIGNoZWNraW5nIGZvciBvY2FtbGJ1aWxkCj4gKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xf
cHJlZml4IjsgdGhlbgo+ICsgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29s
X3ByZWZpeH1vY2FtbGJ1aWxkIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJn
cy4KPiArc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2NhbWxidWlsZDsgYWNfd29yZD0kMgo+
ICt7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAk
YWNfd29yZCIgPiY1Cj4gKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4m
NjsgfQo+ICtpZiB0ZXN0ICIke2FjX2N2X3Byb2dfT0NBTUxCVUlMRCtzZXR9IiA9IHNldDsgdGhl
biA6Cj4gKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAgZWxzZQo+IC0gICAgICAgZ2xp
Yl9DRkxBR1M9JHBrZ19jdl9nbGliX0NGTEFHUwo+IC0gICAgICAgZ2xpYl9MSUJTPSRwa2dfY3Zf
Z2xpYl9MSUJTCj4gLSAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiByZXN1bHQ6IHllcyIgPiY1Cj4gLSRhc19lY2hvICJ5ZXMiID4mNjsgfQo+IC0KPiAtZmkK
PiAtCj4gLSMgQ2hlY2sgbGlicmFyeSBwYXRoCj4gLWlmIHRlc3QgIlwke2V4ZWNfcHJlZml4fS9s
aWIiID0gIiRsaWJkaXIiOyB0aGVuIDoKPiAtICBpZiB0ZXN0ICIkZXhlY19wcmVmaXgiID0gIk5P
TkUiICYmIHRlc3QgIiRwcmVmaXgiICE9ICJOT05FIjsgdGhlbiA6Cj4gLSAgZXhlY19wcmVmaXg9
JHByZWZpeAo+IC1maQo+IC0gICAgaWYgdGVzdCAiJGV4ZWNfcHJlZml4IiA9ICJOT05FIjsgdGhl
biA6Cj4gLSAgZXhlY19wcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Cj4gLWZpCj4gLSAgICBpZiB0
ZXN0IC1kICIke2V4ZWNfcHJlZml4fS9saWI2NCI7IHRoZW4gOgo+IC0KPiAtICAgICAgICBMSUJf
UEFUSD0ibGliNjQiCj4gLQo+ICsgIGlmIHRlc3QgLW4gIiRPQ0FNTEJVSUxEIjsgdGhlbgo+ICsg
IGFjX2N2X3Byb2dfT0NBTUxCVUlMRD0iJE9DQU1MQlVJTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJy
aWRlIHRoZSB0ZXN0Lgo+ICBlbHNlCj4gLQo+IC0gICAgICAgIExJQl9QQVRIPSJsaWIiCj4gK2Fz
X3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKPiArZm9yIGFzX2RpciBpbiAkUEFU
SAo+ICtkbwo+ICsgIElGUz0kYXNfc2F2ZV9JRlMKPiArICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBh
c19kaXI9Lgo+ICsgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVu
c2lvbnM7IGRvCj4gKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0
IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+
ICsgICAgYWNfY3ZfcHJvZ19PQ0FNTEJVSUxEPSIke2FjX3Rvb2xfcHJlZml4fW9jYW1sYnVpbGQi
Cj4gKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNf
ZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKPiArICAgIGJyZWFrIDIKPiArICBmaQo+ICtk
b25lCj4gKyAgZG9uZQo+ICtJRlM9JGFzX3NhdmVfSUZTCj4gCj4gIGZpCj4gLQo+IC1lbHNlCj4g
LQo+IC0gICAgTElCX1BBVEg9IiR7bGliZGlyOmBleHByIGxlbmd0aCAiJGV4ZWNfcHJlZml4IiAr
IDFgfSIKPiAtCj4gIGZpCj4gLQo+IC0KPiAtIyBDaGVja3MgZm9yIGxpYnJhcmllcy4KPiAtYWNf
Zm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImJ6bGliLmgiICJhY19jdl9oZWFk
ZXJfYnpsaWJfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0Igo+IC1pZiB0ZXN0ICJ4JGFjX2N2X2hl
YWRlcl9iemxpYl9oIiA9IHgiInllczsgdGhlbiA6Cj4gLQo+IC17ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBCWjJfYnpEZWNvbXByZXNzSW5pdCBp
biAtbGJ6MiIgPiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBCWjJfYnpEZWNvbXByZXNz
SW5pdCBpbiAtbGJ6Mi4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0ICIke2FjX2N2X2xpYl9iejJfQloy
X2J6RGVjb21wcmVzc0luaXQrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+IC0gICRhc19lY2hvX24gIihj
YWNoZWQpICIgPiY2Cj4gLWVsc2UKPiAtICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCj4g
LUxJQlM9Ii1sYnoyICAkTElCUyIKPiAtY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRl
c3QuJGFjX2V4dAo+IC0vKiBlbmQgY29uZmRlZnMuaC4gICovCj4gLQo+IC0vKiBPdmVycmlkZSBh
bnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KPiAtICAgVXNlIGNo
YXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCj4gLSAg
IGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBs
eS4gICovCj4gLSNpZmRlZiBfX2NwbHVzcGx1cwo+IC1leHRlcm4gIkMiCj4gLSNlbmRpZgo+IC1j
aGFyIEJaMl9iekRlY29tcHJlc3NJbml0ICgpOwo+IC1pbnQKPiAtbWFpbiAoKQo+IC17Cj4gLXJl
dHVybiBCWjJfYnpEZWNvbXByZXNzSW5pdCAoKTsKPiAtICA7Cj4gLSAgcmV0dXJuIDA7Cj4gLX0K
PiAtX0FDRU9GCj4gLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKPiAtICBh
Y19jdl9saWJfYnoyX0JaMl9iekRlY29tcHJlc3NJbml0PXllcwo+ICtPQ0FNTEJVSUxEPSRhY19j
dl9wcm9nX09DQU1MQlVJTEQKPiAraWYgdGVzdCAtbiAiJE9DQU1MQlVJTEQiOyB0aGVuCj4gKyAg
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPQ0FNTEJV
SUxEIiA+JjUKPiArJGFzX2VjaG8gIiRPQ0FNTEJVSUxEIiA+JjY7IH0KPiAgZWxzZQo+IC0gIGFj
X2N2X2xpYl9iejJfQloyX2J6RGVjb21wcmVzc0luaXQ9bm8KPiAtZmkKPiAtcm0gLWYgY29yZSBj
b25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCj4gLSAgICBjb25mdGVzdCRhY19leGVl
eHQgY29uZnRlc3QuJGFjX2V4dAo+IC1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCj4gLWZp
Cj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNf
Y3ZfbGliX2J6Ml9CWjJfYnpEZWNvbXByZXNzSW5pdCIgPiY1Cj4gLSRhc19lY2hvICIkYWNfY3Zf
bGliX2J6Ml9CWjJfYnpEZWNvbXByZXNzSW5pdCIgPiY2OyB9Cj4gLWlmIHRlc3QgIngkYWNfY3Zf
bGliX2J6Ml9CWjJfYnpEZWNvbXByZXNzSW5pdCIgPSB4IiJ5ZXM7IHRoZW4gOgo+IC0gIHpsaWI9
IiR6bGliIC1ESEFWRV9CWkxJQiAtbGJ6MiIKPiArICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQo+ICskYXNfZWNobyAibm8iID4mNjsgfQo+
ICBmaQo+IAo+IAo+ICBmaQo+IC0KPiAtCj4gLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwg
IiRMSU5FTk8iICJsem1hLmgiICJhY19jdl9oZWFkZXJfbHptYV9oIiAiJGFjX2luY2x1ZGVzX2Rl
ZmF1bHQiCj4gLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2x6bWFfaCIgPSB4IiJ5ZXM7IHRoZW4g
Ogo+IC0KPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2lu
ZyBmb3IgbHptYV9zdHJlYW1fZGVjb2RlciBpbiAtbGx6bWEiID4mNQo+IC0kYXNfZWNob19uICJj
aGVja2luZyBmb3IgbHptYV9zdHJlYW1fZGVjb2RlciBpbiAtbGx6bWEuLi4gIiA+JjY7IH0KPiAt
aWYgdGVzdCAiJHthY19jdl9saWJfbHptYV9sem1hX3N0cmVhbV9kZWNvZGVyK3NldH0iID0gc2V0
OyB0aGVuIDoKPiAraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfT0NBTUxCVUlMRCI7IHRoZW4KPiAr
ICBhY19jdF9PQ0FNTEJVSUxEPSRPQ0FNTEJVSUxECj4gKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3
b3JkIG9mICJvY2FtbGJ1aWxkIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJn
cy4KPiArc2V0IGR1bW15IG9jYW1sYnVpbGQ7IGFjX3dvcmQ9JDIKPiAreyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQo+ICsk
YXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KPiAraWYgdGVzdCAi
JHthY19jdl9wcm9nX2FjX2N0X09DQU1MQlVJTEQrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICAgICRh
c19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gIGVsc2UKPiAtICBhY19jaGVja19saWJfc2F2ZV9M
SUJTPSRMSUJTCj4gLUxJQlM9Ii1sbHptYSAgJExJQlMiCj4gLWNhdCBjb25mZGVmcy5oIC0gPDxf
QUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKPiAtLyogZW5kIGNvbmZkZWZzLmguICAqLwo+IC0KPiAt
LyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3Iu
Cj4gLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBv
ZiBhIEdDQwo+IC0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291
bGQgc3RpbGwgYXBwbHkuICAqLwo+IC0jaWZkZWYgX19jcGx1c3BsdXMKPiAtZXh0ZXJuICJDIgo+
IC0jZW5kaWYKPiAtY2hhciBsem1hX3N0cmVhbV9kZWNvZGVyICgpOwo+IC1pbnQKPiAtbWFpbiAo
KQo+IC17Cj4gLXJldHVybiBsem1hX3N0cmVhbV9kZWNvZGVyICgpOwo+IC0gIDsKPiAtICByZXR1
cm4gMDsKPiAtfQo+IC1fQUNFT0YKPiAtaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRo
ZW4gOgo+IC0gIGFjX2N2X2xpYl9sem1hX2x6bWFfc3RyZWFtX2RlY29kZXI9eWVzCj4gKyAgaWYg
dGVzdCAtbiAiJGFjX2N0X09DQU1MQlVJTEQiOyB0aGVuCj4gKyAgYWNfY3ZfcHJvZ19hY19jdF9P
Q0FNTEJVSUxEPSIkYWNfY3RfT0NBTUxCVUlMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhl
IHRlc3QuCj4gIGVsc2UKPiAtICBhY19jdl9saWJfbHptYV9sem1hX3N0cmVhbV9kZWNvZGVyPW5v
Cj4gK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKPiArZm9yIGFzX2RpciBp
biAkUEFUSAo+ICtkbwo+ICsgIElGUz0kYXNfc2F2ZV9JRlMKPiArICB0ZXN0IC16ICIkYXNfZGly
IiAmJiBhc19kaXI9Lgo+ICsgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxl
X2V4dGVuc2lvbnM7IGRvCj4gKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4
ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsg
dGhlbgo+ICsgICAgYWNfY3ZfcHJvZ19hY19jdF9PQ0FNTEJVSUxEPSJvY2FtbGJ1aWxkIgo+ICsg
ICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8k
YWNfd29yZCRhY19leGVjX2V4dCIgPiY1Cj4gKyAgICBicmVhayAyCj4gKyAgZmkKPiArZG9uZQo+
ICsgIGRvbmUKPiArSUZTPSRhc19zYXZlX0lGUwo+ICsKPiAgZmkKPiAtcm0gLWYgY29yZSBjb25m
dGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCj4gLSAgICBjb25mdGVzdCRhY19leGVleHQg
Y29uZnRlc3QuJGFjX2V4dAo+IC1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCj4gIGZpCj4g
LXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zf
bGliX2x6bWFfbHptYV9zdHJlYW1fZGVjb2RlciIgPiY1Cj4gLSRhc19lY2hvICIkYWNfY3ZfbGli
X2x6bWFfbHptYV9zdHJlYW1fZGVjb2RlciIgPiY2OyB9Cj4gLWlmIHRlc3QgIngkYWNfY3ZfbGli
X2x6bWFfbHptYV9zdHJlYW1fZGVjb2RlciIgPSB4IiJ5ZXM7IHRoZW4gOgo+IC0gIHpsaWI9IiR6
bGliIC1ESEFWRV9MWk1BIC1sbHptYSIKPiArYWNfY3RfT0NBTUxCVUlMRD0kYWNfY3ZfcHJvZ19h
Y19jdF9PQ0FNTEJVSUxECj4gK2lmIHRlc3QgLW4gIiRhY19jdF9PQ0FNTEJVSUxEIjsgdGhlbgo+
ICsgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNf
Y3RfT0NBTUxCVUlMRCIgPiY1Cj4gKyRhc19lY2hvICIkYWNfY3RfT0NBTUxCVUlMRCIgPiY2OyB9
Cj4gK2Vsc2UKPiArICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJl
c3VsdDogbm8iID4mNQo+ICskYXNfZWNobyAibm8iID4mNjsgfQo+ICBmaQo+IAo+IC0KPiArICBp
ZiB0ZXN0ICJ4JGFjX2N0X09DQU1MQlVJTEQiID0geDsgdGhlbgo+ICsgICAgT0NBTUxCVUlMRD0i
bm8iCj4gKyAgZWxzZQo+ICsgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5l
ZCBpbgo+ICt5ZXM6KQo+ICt7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxl
dCIgPiY1Cj4gKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5v
dCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KPiArYWNfdG9vbF93YXJuZWQ9eWVz
IDs7Cj4gK2VzYWMKPiArICAgIE9DQU1MQlVJTEQ9JGFjX2N0X09DQU1MQlVJTEQKPiArICBmaQo+
ICtlbHNlCj4gKyAgT0NBTUxCVUlMRD0iJGFjX2N2X3Byb2dfT0NBTUxCVUlMRCIKPiAgZmkKPiAK
PiAKPiAtYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImx6by9sem8xeC5o
IiAiYWNfY3ZfaGVhZGVyX2x6b19sem8xeF9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCj4gLWlm
IHRlc3QgIngkYWNfY3ZfaGVhZGVyX2x6b19sem8xeF9oIiA9IHgiInllczsgdGhlbiA6Cj4gKyAg
ICBpZiB0ZXN0ICJ4JE9DQU1MQyIgPSAieG5vIjsgdGhlbiA6Cj4gCj4gLXsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGx6bzF4X2RlY29tcHJlc3Mg
aW4gLWxsem8yIiA+JjUKPiAtJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGx6bzF4X2RlY29tcHJl
c3MgaW4gLWxsem8yLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfbGliX2x6bzJfbHpv
MXhfZGVjb21wcmVzcytzZXR9IiA9IHNldDsgdGhlbiA6Cj4gLSAgJGFzX2VjaG9fbiAiKGNhY2hl
ZCkgIiA+JjYKPiAtZWxzZQo+IC0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKPiAtTElC
Uz0iLWxsem8yICAkTElCUyIKPiAtY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3Qu
JGFjX2V4dAo+IC0vKiBlbmQgY29uZmRlZnMuaC4gICovCj4gKyAgICAgICAgaWYgdGVzdCAieCRl
bmFibGVfb2NhbWx0b29scyIgPSAieHllcyI7IHRoZW4gOgo+IAo+IC0vKiBPdmVycmlkZSBhbnkg
R0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KPiAtICAgVXNlIGNoYXIg
YmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCj4gLSAgIGJ1
aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4g
ICovCj4gLSNpZmRlZiBfX2NwbHVzcGx1cwo+IC1leHRlcm4gIkMiCj4gLSNlbmRpZgo+IC1jaGFy
IGx6bzF4X2RlY29tcHJlc3MgKCk7Cj4gLWludAo+IC1tYWluICgpCj4gLXsKPiAtcmV0dXJuIGx6
bzF4X2RlY29tcHJlc3MgKCk7Cj4gLSAgOwo+IC0gIHJldHVybiAwOwo+IC19Cj4gLV9BQ0VPRgo+
IC1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Cj4gLSAgYWNfY3ZfbGliX2x6
bzJfbHpvMXhfZGVjb21wcmVzcz15ZXMKPiAtZWxzZQo+IC0gIGFjX2N2X2xpYl9sem8yX2x6bzF4
X2RlY29tcHJlc3M9bm8KPiAtZmkKPiAtcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3Qu
JGFjX29iamV4dCBcCj4gLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAo+
IC1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCj4gKyAgICAgICAgICAgIGFzX2ZuX2Vycm9y
ICQ/ICJPY2FtbCB0b29scyBlbmFibGVkLCBidXQgdW5hYmxlIHRvIGZpbmQgT2NhbWwiICIkTElO
RU5PIiA1Cj4gIGZpCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
cmVzdWx0OiAkYWNfY3ZfbGliX2x6bzJfbHpvMXhfZGVjb21wcmVzcyIgPiY1Cj4gLSRhc19lY2hv
ICIkYWNfY3ZfbGliX2x6bzJfbHpvMXhfZGVjb21wcmVzcyIgPiY2OyB9Cj4gLWlmIHRlc3QgIngk
YWNfY3ZfbGliX2x6bzJfbHpvMXhfZGVjb21wcmVzcyIgPSB4IiJ5ZXM7IHRoZW4gOgo+IC0gIHps
aWI9IiR6bGliIC1ESEFWRV9MWk8xWCAtbGx6bzIiCj4gKyAgICAgICAgb2NhbWx0b29scz0ibiIK
PiArCj4gIGZpCj4gCj4gK2ZpCj4gKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYmFzaCIs
IHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCj4gK3NldCBkdW1teSBiYXNo
OyBhY193b3JkPSQyCj4gK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog
Y2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKPiArJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRh
Y193b3JkLi4uICIgPiY2OyB9Cj4gK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9CQVNIK3NldH0iID0g
c2V0OyB0aGVuIDoKPiArICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgo+ICtlbHNlCj4gKyAg
Y2FzZSAkQkFTSCBpbgo+ICsgIFtcXC9dKiB8ID86W1xcL10qKQo+ICsgIGFjX2N2X3BhdGhfQkFT
SD0iJEJBU0giICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgo+
ICsgIDs7Cj4gKyAgKikKPiArICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9S
Cj4gK2ZvciBhc19kaXIgaW4gJFBBVEgKPiArZG8KPiArICBJRlM9JGFzX3NhdmVfSUZTCj4gKyAg
dGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KPiArICAgIGZvciBhY19leGVjX2V4dCBpbiAn
JyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwo+ICsgIGlmIHsgdGVzdCAtZiAiJGFzX2Rp
ci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRh
Y19leGVjX2V4dCI7IH07IHRoZW4KPiArICAgIGFjX2N2X3BhdGhfQkFTSD0iJGFzX2Rpci8kYWNf
d29yZCRhY19leGVjX2V4dCIKPiArICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQo+ICsgICAgYnJl
YWsgMgo+ICsgIGZpCj4gK2RvbmUKPiArICBkb25lCj4gK0lGUz0kYXNfc2F2ZV9JRlMKPiAKPiAr
ICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9CQVNIIiAmJiBhY19jdl9wYXRoX0JBU0g9Im5vIgo+ICsg
IDs7Cj4gK2VzYWMKPiArZmkKPiArQkFTSD0kYWNfY3ZfcGF0aF9CQVNICj4gK2lmIHRlc3QgLW4g
IiRCQVNIIjsgdGhlbgo+ICsgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogcmVzdWx0OiAkQkFTSCIgPiY1Cj4gKyRhc19lY2hvICIkQkFTSCIgPiY2OyB9Cj4gK2Vsc2UK
PiArICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8i
ID4mNQo+ICskYXNfZWNobyAibm8iID4mNjsgfQo+ICBmaQo+IAo+IAo+ICtpZiB0ZXN0IHgiJHtC
QVNIfSIgPT0geCJubyIKPiArdGhlbgo+ICsgICAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBm
aW5kIGJhc2gsIHBsZWFzZSBpbnN0YWxsIGJhc2giICIkTElORU5PIiA1Cj4gK2ZpCj4gCj4gLXsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGlvX3Nl
dHVwIGluIC1sYWlvIiA+JjUKPiAtJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGlvX3NldHVwIGlu
IC1sYWlvLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfbGliX2Fpb19pb19zZXR1cCtz
ZXR9IiA9IHNldDsgdGhlbiA6Cj4gK2FjX2V4dD1jCj4gK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1Mn
Cj4gK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0
ID4mNScKPiArYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBG
TEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKPiArYWNfY29tcGlsZXJf
Z251PSRhY19jdl9jX2NvbXBpbGVyX2dudQo+ICt7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUK
PiArJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuLi4g
IiA+JjY7IH0KPiArIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4K
PiAraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KPiArICBDUFA9Cj4g
K2ZpCj4gK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCj4gKyAgaWYgdGVzdCAiJHthY19jdl9wcm9n
X0NQUCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYK
PiAgZWxzZQo+IC0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKPiAtTElCUz0iLWxhaW8g
ICRMSUJTIgo+IC1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Cj4g
KyAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAo+
ICsgICAgZm9yIENQUCBpbiAiJENDIC1FIiAiJENDIC1FIC10cmFkaXRpb25hbC1jcHAiICIvbGli
L2NwcCIKPiArICAgIGRvCj4gKyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKPiArZm9yIGFjX2Nf
cHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCj4gK2RvCj4gKyAgIyBVc2UgYSBoZWFkZXIgZmls
ZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwo+ICsgICMgd2l0aCBh
IGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgo+ICsgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8g
PGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQo+ICsgICMgPGxpbWl0cy5o
PiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgo+ICsgICMgT24gdGhlIE5l
WFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCj4g
KyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRj
aCB0aGlzIGNhc2UuCj4gKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFj
X2V4dAo+ICAvKiBlbmQgY29uZmRlZnMuaC4gICovCj4gLQo+IC0vKiBPdmVycmlkZSBhbnkgR0ND
IGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KPiAtICAgVXNlIGNoYXIgYmVj
YXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCj4gLSAgIGJ1aWx0
aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICov
Cj4gLSNpZmRlZiBfX2NwbHVzcGx1cwo+IC1leHRlcm4gIkMiCj4gKyNpZmRlZiBfX1NURENfXwo+
ICsjIGluY2x1ZGUgPGxpbWl0cy5oPgo+ICsjZWxzZQo+ICsjIGluY2x1ZGUgPGFzc2VydC5oPgo+
ICAjZW5kaWYKPiAtY2hhciBpb19zZXR1cCAoKTsKPiAtaW50Cj4gLW1haW4gKCkKPiAtewo+IC1y
ZXR1cm4gaW9fc2V0dXAgKCk7Cj4gLSAgOwo+IC0gIHJldHVybiAwOwo+IC19Cj4gKyAgICAgICAg
ICAgICAgICAgICAgU3ludGF4IGVycm9yCj4gIF9BQ0VPRgo+IC1pZiBhY19mbl9jX3RyeV9saW5r
ICIkTElORU5PIjsgdGhlbiA6Cj4gLSAgYWNfY3ZfbGliX2Fpb19pb19zZXR1cD15ZXMKPiAraWYg
YWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6Cj4gKwo+ICBlbHNlCj4gLSAgYWNfY3Zf
bGliX2Fpb19pb19zZXR1cD1ubwo+IC1maQo+IC1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25m
dGVzdC4kYWNfb2JqZXh0IFwKPiAtICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNf
ZXh0Cj4gLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKPiArICAjIEJyb2tlbjogZmFpbHMg
b24gdmFsaWQgaW5wdXQuCj4gK2NvbnRpbnVlCj4gIGZpCj4gLXsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2Fpb19pb19zZXR1cCIgPiY1
Cj4gLSRhc19lY2hvICIkYWNfY3ZfbGliX2Fpb19pb19zZXR1cCIgPiY2OyB9Cj4gLWlmIHRlc3Qg
IngkYWNfY3ZfbGliX2Fpb19pb19zZXR1cCIgPSB4IiJ5ZXM7IHRoZW4gOgo+IC0gIHN5c3RlbV9h
aW89InkiCj4gK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQK
PiArCj4gKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5v
bmV4aXN0ZW50IGhlYWRlcnMKPiArICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93Lgo+ICsgIGNh
dCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKPiArLyogZW5kIGNvbmZk
ZWZzLmguICAqLwo+ICsjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KPiArX0FDRU9GCj4gK2lm
IGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgo+ICsgICMgQnJva2VuOiBzdWNjZXNz
IG9uIGludmFsaWQgaW5wdXQuCj4gK2NvbnRpbnVlCj4gIGVsc2UKPiAtICBzeXN0ZW1fYWlvPSJu
Igo+ICsgICMgUGFzc2VzIGJvdGggdGVzdHMuCj4gK2FjX3ByZXByb2Nfb2s9Ogo+ICticmVhawo+
ICtmaQo+ICtybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Cj4g
Kwo+ICtkb25lCj4gKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBj
bGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgo+ICtybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVy
ciBjb25mdGVzdC4kYWNfZXh0Cj4gK2lmICRhY19wcmVwcm9jX29rOyB0aGVuIDoKPiArICBicmVh
awo+ICBmaQo+IAo+ICsgICAgZG9uZQo+ICsgICAgYWNfY3ZfcHJvZ19DUFA9JENQUAo+IAo+IC17
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBNRDUg
aW4gLWxjcnlwdG8iID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyBmb3IgTUQ1IGluIC1sY3J5
cHRvLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfbGliX2NyeXB0b19NRDUrc2V0fSIg
PSBzZXQ7IHRoZW4gOgo+IC0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gK2ZpCj4gKyAg
Q1BQPSRhY19jdl9wcm9nX0NQUAo+ICBlbHNlCj4gLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0k
TElCUwo+IC1MSUJTPSItbGNyeXB0byAgJExJQlMiCj4gLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNF
T0YgPmNvbmZ0ZXN0LiRhY19leHQKPiArICBhY19jdl9wcm9nX0NQUD0kQ1BQCj4gK2ZpCj4gK3sg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1BQIiA+JjUK
PiArJGFzX2VjaG8gIiRDUFAiID4mNjsgfQo+ICthY19wcmVwcm9jX29rPWZhbHNlCj4gK2ZvciBh
Y19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwo+ICtkbwo+ICsgICMgVXNlIGEgaGVhZGVy
IGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKPiArICAjIHdp
dGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KPiArICAjIFByZWZlciA8bGltaXRzLmg+
IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKPiArICAjIDxsaW1p
dHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KPiArICAjIE9uIHRo
ZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2Vy
LAo+ICsgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8g
Y2F0Y2ggdGhpcyBjYXNlLgo+ICsgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0
LiRhY19leHQKPiAgLyogZW5kIGNvbmZkZWZzLmguICAqLwo+IC0KPiAtLyogT3ZlcnJpZGUgYW55
IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCj4gLSAgIFVzZSBjaGFy
IGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwo+IC0gICBi
dWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHku
ICAqLwo+IC0jaWZkZWYgX19jcGx1c3BsdXMKPiAtZXh0ZXJuICJDIgo+ICsjaWZkZWYgX19TVERD
X18KPiArIyBpbmNsdWRlIDxsaW1pdHMuaD4KPiArI2Vsc2UKPiArIyBpbmNsdWRlIDxhc3NlcnQu
aD4KPiAgI2VuZGlmCj4gLWNoYXIgTUQ1ICgpOwo+IC1pbnQKPiAtbWFpbiAoKQo+IC17Cj4gLXJl
dHVybiBNRDUgKCk7Cj4gLSAgOwo+IC0gIHJldHVybiAwOwo+IC19Cj4gKyAgICAgICAgICAgICAg
ICAgICAgU3ludGF4IGVycm9yCj4gIF9BQ0VPRgo+IC1pZiBhY19mbl9jX3RyeV9saW5rICIkTElO
RU5PIjsgdGhlbiA6Cj4gLSAgYWNfY3ZfbGliX2NyeXB0b19NRDU9eWVzCj4gK2lmIGFjX2ZuX2Nf
dHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgo+ICsKPiAgZWxzZQo+IC0gIGFjX2N2X2xpYl9jcnlw
dG9fTUQ1PW5vCj4gLWZpCj4gLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19v
YmpleHQgXAo+IC0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKPiAtTElC
Uz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwo+ICsgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBp
bnB1dC4KPiArY29udGludWUKPiAgZmkKPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfY3J5cHRvX01ENSIgPiY1Cj4gLSRhc19lY2hv
ICIkYWNfY3ZfbGliX2NyeXB0b19NRDUiID4mNjsgfQo+IC1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9j
cnlwdG9fTUQ1IiA9IHgiInllczsgdGhlbiA6Cj4gLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VP
Rgo+IC0jZGVmaW5lIEhBVkVfTElCQ1JZUFRPIDEKPiArcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0
ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAo+ICsKPiArICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2Vz
LiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycwo+ICsgICMgY2FuIGJlIGRl
dGVjdGVkIGFuZCBob3cuCj4gKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3Qu
JGFjX2V4dAo+ICsvKiBlbmQgY29uZmRlZnMuaC4gICovCj4gKyNpbmNsdWRlIDxhY19ub25leGlz
dGVudC5oPgo+ICBfQUNFT0YKPiAraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6
Cj4gKyAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KPiArY29udGludWUKPiAr
ZWxzZQo+ICsgICMgUGFzc2VzIGJvdGggdGVzdHMuCj4gK2FjX3ByZXByb2Nfb2s9Ogo+ICticmVh
awo+ICtmaQo+ICtybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0
Cj4gCj4gLSAgTElCUz0iLWxjcnlwdG8gJExJQlMiCj4gK2RvbmUKPiArIyBCZWNhdXNlIG9mIGBi
cmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCj4g
K3JtIC1mIGNvbmZ0ZXN0LmkgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKPiAraWYgJGFj
X3ByZXByb2Nfb2s7IHRoZW4gOgo+IAo+ICBlbHNlCj4gLSAgYXNfZm5fZXJyb3IgJD8gIkNvdWxk
IG5vdCBmaW5kIGxpYmNyeXB0byIgIiRMSU5FTk8iIDUKPiArICB7IHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKPiArJGFz
X2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQo+ICthc19mbl9lcnJv
ciAkPyAiQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCj4gK1NlZSBc
YGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsgfQo+ICBmaQo+IAo+
IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBl
eHQyZnNfb3BlbjIgaW4gLWxleHQyZnMiID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyBmb3Ig
ZXh0MmZzX29wZW4yIGluIC1sZXh0MmZzLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3Zf
bGliX2V4dDJmc19leHQyZnNfb3BlbjIrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICthY19leHQ9Ywo+
ICthY19jcHA9JyRDUFAgJENQUEZMQUdTJwo+ICthY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAk
Q1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCj4gK2FjX2xpbms9JyRDQyAtbyBjb25mdGVz
dCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAk
TElCUyA+JjUnCj4gK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKPiArCj4g
Kwo+ICt7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZv
ciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZSIgPiY1Cj4gKyRhc19lY2hvX24g
ImNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZS4uLiAiID4m
NjsgfQo+ICtpZiB0ZXN0ICIke2FjX2N2X3BhdGhfR1JFUCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4g
ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAgZWxzZQo+IC0gIGFjX2NoZWNrX2xpYl9z
YXZlX0xJQlM9JExJQlMKPiAtTElCUz0iLWxleHQyZnMgICRMSUJTIgo+IC1jYXQgY29uZmRlZnMu
aCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Cj4gLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8K
PiArICBpZiB0ZXN0IC16ICIkR1JFUCI7IHRoZW4KPiArICBhY19wYXRoX0dSRVBfZm91bmQ9ZmFs
c2UKPiArICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2gg
b2YgUFJPR05BTUUtTElTVAo+ICsgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFU
T1IKPiArZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KPiAr
ZG8KPiArICBJRlM9JGFzX3NhdmVfSUZTCj4gKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGly
PS4KPiArICAgIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCj4gKyAgICBmb3IgYWNfZXhl
Y19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KPiArICAgICAgYWNfcGF0
aF9HUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0Igo+ICsgICAgICB7IHRlc3QgLWYg
IiRhY19wYXRoX0dSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0dSRVAiOyB9IHx8IGNvbnRp
bnVlCj4gKyMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0dSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBp
cyBmb3VuZC4KPiArICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfR1JFUAo+ICtjYXNlIGAiJGFj
X3BhdGhfR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCj4gKypHTlUqKQo+ICsgIGFjX2N2X3BhdGhf
R1JFUD0iJGFjX3BhdGhfR1JFUCIgYWNfcGF0aF9HUkVQX2ZvdW5kPTo7Owo+ICsqKQo+ICsgIGFj
X2NvdW50PTAKPiArICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKPiArICB3
aGlsZSA6Cj4gKyAgZG8KPiArICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJj
b25mdGVzdC50bXAiCj4gKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCj4gKyAg
ICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKPiArICAgICRhc19lY2hvICdHUkVQJyA+
PiAiY29uZnRlc3QubmwiCj4gKyAgICAiJGFjX3BhdGhfR1JFUCIgLWUgJ0dSRVAkJyAtZSAnLShj
YW5ub3QgbWF0Y2gpLScgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVs
bCB8fCBicmVhawo+ICsgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2
L251bGwgMj4mMSB8fCBicmVhawo+ICsgICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBh
Y19jb3VudD0kYXNfdmFsCj4gKyAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0dS
RVBfbWF4LTB9OyB0aGVuCj4gKyAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBr
ZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQo+ICsgICAgICBhY19jdl9wYXRoX0dSRVA9IiRh
Y19wYXRoX0dSRVAiCj4gKyAgICAgIGFjX3BhdGhfR1JFUF9tYXg9JGFjX2NvdW50Cj4gKyAgICBm
aQo+ICsgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3Vn
aAo+ICsgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCj4gKyAgZG9uZQo+ICsgIHJt
IC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7Owo+
ICtlc2FjCj4gCj4gLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2
b2lkIGFuIGVycm9yLgo+IC0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUg
cmV0dXJuIHR5cGUgb2YgYSBHQ0MKPiAtICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQg
cHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KPiAtI2lmZGVmIF9fY3BsdXNwbHVzCj4g
LWV4dGVybiAiQyIKPiAtI2VuZGlmCj4gLWNoYXIgZXh0MmZzX29wZW4yICgpOwo+IC1pbnQKPiAt
bWFpbiAoKQo+IC17Cj4gLXJldHVybiBleHQyZnNfb3BlbjIgKCk7Cj4gLSAgOwo+IC0gIHJldHVy
biAwOwo+IC19Cj4gLV9BQ0VPRgo+IC1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhl
biA6Cj4gLSAgYWNfY3ZfbGliX2V4dDJmc19leHQyZnNfb3BlbjI9eWVzCj4gKyAgICAgICRhY19w
YXRoX0dSRVBfZm91bmQgJiYgYnJlYWsgMwo+ICsgICAgZG9uZQo+ICsgIGRvbmUKPiArICBkb25l
Cj4gK0lGUz0kYXNfc2F2ZV9JRlMKPiArICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HUkVQIjsg
dGhlbgo+ICsgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZ3JlcCBjb3VsZCBiZSBm
b3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1Cj4g
KyAgZmkKPiAgZWxzZQo+IC0gIGFjX2N2X2xpYl9leHQyZnNfZXh0MmZzX29wZW4yPW5vCj4gKyAg
YWNfY3ZfcGF0aF9HUkVQPSRHUkVQCj4gIGZpCj4gLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNv
bmZ0ZXN0LiRhY19vYmpleHQgXAo+IC0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRh
Y19leHQKPiAtTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwo+ICsKPiAgZmkKPiAteyAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfZXh0
MmZzX2V4dDJmc19vcGVuMiIgPiY1Cj4gLSRhc19lY2hvICIkYWNfY3ZfbGliX2V4dDJmc19leHQy
ZnNfb3BlbjIiID4mNjsgfQo+IC1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9leHQyZnNfZXh0MmZzX29w
ZW4yIiA9IHgiInllczsgdGhlbiA6Cj4gLSAgbGliZXh0MmZzPSJ5Igo+ICt7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfR1JFUCIgPiY1
Cj4gKyRhc19lY2hvICIkYWNfY3ZfcGF0aF9HUkVQIiA+JjY7IH0KPiArIEdSRVA9IiRhY19jdl9w
YXRoX0dSRVAiCj4gKwo+ICsKPiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiBjaGVja2luZyBmb3IgZWdyZXAiID4mNQo+ICskYXNfZWNob19uICJjaGVja2luZyBmb3Ig
ZWdyZXAuLi4gIiA+JjY7IH0KPiAraWYgdGVzdCAiJHthY19jdl9wYXRoX0VHUkVQK3NldH0iID0g
c2V0OyB0aGVuIDoKPiArICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgo+ICBlbHNlCj4gLSAg
bGliZXh0MmZzPSJuIgo+ICsgIGlmIGVjaG8gYSB8ICRHUkVQIC1FICcoYXxiKScgPi9kZXYvbnVs
bCAyPiYxCj4gKyAgIHRoZW4gYWNfY3ZfcGF0aF9FR1JFUD0iJEdSRVAgLUUiCj4gKyAgIGVsc2UK
PiArICAgICBpZiB0ZXN0IC16ICIkRUdSRVAiOyB0aGVuCj4gKyAgYWNfcGF0aF9FR1JFUF9mb3Vu
ZD1mYWxzZQo+ICsgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3Ig
ZWFjaCBvZiBQUk9HTkFNRS1MSVNUCj4gKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NF
UEFSQVRPUgo+ICtmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2Jp
bgo+ICtkbwo+ICsgIElGUz0kYXNfc2F2ZV9JRlMKPiArICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBh
c19kaXI9Lgo+ICsgICAgZm9yIGFjX3Byb2cgaW4gZWdyZXA7IGRvCj4gKyAgICBmb3IgYWNfZXhl
Y19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KPiArICAgICAgYWNfcGF0
aF9FR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKPiArICAgICAgeyB0ZXN0IC1m
ICIkYWNfcGF0aF9FR1JFUCIgJiYgJGFzX3Rlc3RfeCAiJGFjX3BhdGhfRUdSRVAiOyB9IHx8IGNv
bnRpbnVlCj4gKyMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0VHUkVQIGFuZCBzZWxlY3QgaXQgaWYg
aXQgaXMgZm91bmQuCj4gKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0VHUkVQCj4gK2Nhc2Ug
YCIkYWNfcGF0aF9FR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCj4gKypHTlUqKQo+ICsgIGFjX2N2
X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIiBhY19wYXRoX0VHUkVQX2ZvdW5kPTo7Owo+ICsq
KQo+ICsgIGFjX2NvdW50PTAKPiArICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5p
biIKPiArICB3aGlsZSA6Cj4gKyAgZG8KPiArICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVz
dC5pbiIgPiJjb25mdGVzdC50bXAiCj4gKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3Qu
aW4iCj4gKyAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKPiArICAgICRhc19lY2hv
ICdFR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgo+ICsgICAgIiRhY19wYXRoX0VHUkVQIiAnRUdSRVAk
JyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCj4g
KyAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8
IGJyZWFrCj4gKyAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192
YWwKPiArICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfRUdSRVBfbWF4LTB9OyB0
aGVuCj4gKyAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcg
Zm9yIGEgYmV0dGVyIG9uZQo+ICsgICAgICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JF
UCIKPiArICAgICAgYWNfcGF0aF9FR1JFUF9tYXg9JGFjX2NvdW50Cj4gKyAgICBmaQo+ICsgICAg
IyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAo+ICsgICAg
dGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCj4gKyAgZG9uZQo+ICsgIHJtIC1mIGNvbmZ0
ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7Owo+ICtlc2FjCj4g
Kwo+ICsgICAgICAkYWNfcGF0aF9FR1JFUF9mb3VuZCAmJiBicmVhayAzCj4gKyAgICBkb25lCj4g
KyAgZG9uZQo+ICsgIGRvbmUKPiArSUZTPSRhc19zYXZlX0lGUwo+ICsgIGlmIHRlc3QgLXogIiRh
Y19jdl9wYXRoX0VHUkVQIjsgdGhlbgo+ICsgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFi
bGUgZWdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQv
YmluIiAiJExJTkVOTyIgNQo+ICsgIGZpCj4gK2Vsc2UKPiArICBhY19jdl9wYXRoX0VHUkVQPSRF
R1JFUAo+ICBmaQo+IAo+ICsgICBmaQo+ICtmaQo+ICt7ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfRUdSRVAiID4mNQo+ICskYXNfZWNo
byAiJGFjX2N2X3BhdGhfRUdSRVAiID4mNjsgfQo+ICsgRUdSRVA9IiRhY19jdl9wYXRoX0VHUkVQ
Igo+IAo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5n
IGZvciBnY3J5X21kX2hhc2hfYnVmZmVyIGluIC1sZ2NyeXB0IiA+JjUKPiAtJGFzX2VjaG9fbiAi
Y2hlY2tpbmcgZm9yIGdjcnlfbWRfaGFzaF9idWZmZXIgaW4gLWxnY3J5cHQuLi4gIiA+JjY7IH0K
PiAtaWYgdGVzdCAiJHthY19jdl9saWJfZ2NyeXB0X2djcnlfbWRfaGFzaF9idWZmZXIrc2V0fSIg
PSBzZXQ7IHRoZW4gOgo+ICsKPiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Cj4gKyRhc19lY2hvX24g
ImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9Cj4gK2lmIHRlc3Qg
IiR7YWNfY3ZfaGVhZGVyX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICAgICRhc19lY2hvX24g
IihjYWNoZWQpICIgPiY2Cj4gIGVsc2UKPiAtICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJT
Cj4gLUxJQlM9Ii1sZ2NyeXB0ICAkTElCUyIKPiAtY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+
Y29uZnRlc3QuJGFjX2V4dAo+ICsgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0
LiRhY19leHQKPiAgLyogZW5kIGNvbmZkZWZzLmguICAqLwo+ICsjaW5jbHVkZSA8c3RkbGliLmg+
Cj4gKyNpbmNsdWRlIDxzdGRhcmcuaD4KPiArI2luY2x1ZGUgPHN0cmluZy5oPgo+ICsjaW5jbHVk
ZSA8ZmxvYXQuaD4KPiAKPiAtLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUg
dG8gYXZvaWQgYW4gZXJyb3IuCj4gLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNo
IHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwo+IC0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1
bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwo+IC0jaWZkZWYgX19jcGx1c3Bs
dXMKPiAtZXh0ZXJuICJDIgo+IC0jZW5kaWYKPiAtY2hhciBnY3J5X21kX2hhc2hfYnVmZmVyICgp
Owo+ICBpbnQKPiAgbWFpbiAoKQo+ICB7Cj4gLXJldHVybiBnY3J5X21kX2hhc2hfYnVmZmVyICgp
Owo+ICsKPiAgICA7Cj4gICAgcmV0dXJuIDA7Cj4gIH0KPiAgX0FDRU9GCj4gLWlmIGFjX2ZuX2Nf
dHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKPiAtICBhY19jdl9saWJfZ2NyeXB0X2djcnlfbWRf
aGFzaF9idWZmZXI9eWVzCj4gK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVu
IDoKPiArICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKPiAgZWxzZQo+IC0gIGFjX2N2X2xpYl9nY3J5
cHRfZ2NyeV9tZF9oYXNoX2J1ZmZlcj1ubwo+IC1maQo+IC1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVy
ciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKPiAtICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVz
dC4kYWNfZXh0Cj4gLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKPiArICBhY19jdl9oZWFk
ZXJfc3RkYz1ubwo+ICBmaQo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IHJlc3VsdDogJGFjX2N2X2xpYl9nY3J5cHRfZ2NyeV9tZF9oYXNoX2J1ZmZlciIgPiY1Cj4g
LSRhc19lY2hvICIkYWNfY3ZfbGliX2djcnlwdF9nY3J5X21kX2hhc2hfYnVmZmVyIiA+JjY7IH0K
PiAtaWYgdGVzdCAieCRhY19jdl9saWJfZ2NyeXB0X2djcnlfbWRfaGFzaF9idWZmZXIiID0geCIi
eWVzOyB0aGVuIDoKPiAtICBsaWJnY3J5cHQ9InkiCj4gK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJy
IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAo+ICsKPiAraWYgdGVzdCAkYWNf
Y3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KPiArICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2Vz
IG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCj4gKyAgY2F0IGNvbmZkZWZzLmgg
LSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAo+ICsvKiBlbmQgY29uZmRlZnMuaC4gICovCj4g
KyNpbmNsdWRlIDxzdHJpbmcuaD4KPiArCj4gK19BQ0VPRgo+ICtpZiAoZXZhbCAiJGFjX2NwcCBj
b25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Cj4gKyAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwg
Mj4mMTsgdGhlbiA6Cj4gKwo+ICBlbHNlCj4gLSAgbGliZ2NyeXB0PSJuIgo+ICsgIGFjX2N2X2hl
YWRlcl9zdGRjPW5vCj4gK2ZpCj4gK3JtIC1mIGNvbmZ0ZXN0Kgo+ICsKPiAgZmkKPiAKPiAraWYg
dGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KPiArICAjIElTQyAyLjAuMiBzdGRs
aWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCj4gKyAgY2F0IGNv
bmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAo+ICsvKiBlbmQgY29uZmRlZnMu
aC4gICovCj4gKyNpbmNsdWRlIDxzdGRsaWIuaD4KPiAKPiArX0FDRU9GCj4gK2lmIChldmFsICIk
YWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKPiArICAkRUdSRVAgImZyZWUiID4vZGV2
L251bGwgMj4mMTsgdGhlbiA6Cj4gCj4gLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IGNoZWNraW5nIGZvciBwdGhyZWFkIGZsYWciID4mNQo+IC0kYXNfZWNob19u
ICJjaGVja2luZyBmb3IgcHRocmVhZCBmbGFnLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YXhf
Y3ZfcHRocmVhZF9mbGFncytzZXR9IiA9IHNldDsgdGhlbiA6Cj4gLSAgJGFzX2VjaG9fbiAiKGNh
Y2hlZCkgIiA+JjYKPiAgZWxzZQo+ICsgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCj4gK2ZpCj4gK3Jt
IC1mIGNvbmZ0ZXN0Kgo+IAo+IC0gICAgICAgIGF4X2N2X3B0aHJlYWRfZmxhZ3M9LXB0aHJlYWQK
PiArZmkKPiAKPiAtICAgIFBUSFJFQURfQ0ZMQUdTPSIkYXhfY3ZfcHRocmVhZF9mbGFncyIKPiAt
ICAgIFBUSFJFQURfTERGTEFHUz0iJGF4X2N2X3B0aHJlYWRfZmxhZ3MiCj4gLSAgICBQVEhSRUFE
X0xJQlM9IiIKPiAraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KPiArICAj
IC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3Mg
dXNpbmcgLWFuc2kuCj4gKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4g
Ogo+ICsgIDoKPiArZWxzZQo+ICsgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0
LiRhY19leHQKPiArLyogZW5kIGNvbmZkZWZzLmguICAqLwo+ICsjaW5jbHVkZSA8Y3R5cGUuaD4K
PiArI2luY2x1ZGUgPHN0ZGxpYi5oPgo+ICsjaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCj4g
KyMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKPiArIyBkZWZp
bmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQo+ICsj
ZWxzZQo+ICsjIGRlZmluZSBJU0xPV0VSKGMpIFwKPiArICAgICAgICAgICAgICAgICAgKCgnYScg
PD0gKGMpICYmIChjKSA8PSAnaScpIFwKPiArICAgICAgICAgICAgICAgICAgICB8fCAoJ2onIDw9
IChjKSAmJiAoYykgPD0gJ3InKSBcCj4gKyAgICAgICAgICAgICAgICAgICAgfHwgKCdzJyA8PSAo
YykgJiYgKGMpIDw9ICd6JykpCj4gKyMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAo
KGMpIHwgMHg0MCkgOiAoYykpCj4gKyNlbmRpZgo+IAo+ICsjZGVmaW5lIFhPUihlLCBmKSAoKChl
KSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQo+ICtpbnQKPiArbWFpbiAoKQo+ICt7Cj4gKyAg
aW50IGk7Cj4gKyAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQo+ICsgICAgaWYgKFhPUiAoaXNs
b3dlciAoaSksIElTTE9XRVIgKGkpKQo+ICsgICAgICAgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBF
UiAoaSkpCj4gKyAgICAgIHJldHVybiAyOwo+ICsgIHJldHVybiAwOwo+ICt9Cj4gK19BQ0VPRgo+
ICtpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKPiAKPiAtICAgIHNhdmVkX0NG
TEFHUz0iJENGTEFHUyIKPiArZWxzZQo+ICsgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCj4gK2ZpCj4g
K3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRl
c3QkYWNfZXhlZXh0IFwKPiArICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29u
ZnRlc3QuJGFjX2V4dAo+ICtmaQo+IAo+IC0gICAgc2F2ZWRfTERGTEFHUz0iJExERkxBR1MiCj4g
K2ZpCj4gK2ZpCj4gK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVz
dWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQo+ICskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9z
dGRjIiA+JjY7IH0KPiAraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KPiAK
PiAtICAgIHNhdmVkX0xJQlM9IiRMSUJTIgo+ICskYXNfZWNobyAiI2RlZmluZSBTVERDX0hFQURF
UlMgMSIgPj5jb25mZGVmcy5oCj4gCj4gK2ZpCj4gCj4gLSAgICBDRkxBR1M9IiRDRkxBR1MgJFBU
SFJFQURfQ0ZMQUdTIgo+ICsjIE9uIElSSVggNS4zLCBzeXMvdHlwZXMgYW5kIGludHR5cGVzLmgg
YXJlIGNvbmZsaWN0aW5nLgo+ICtmb3IgYWNfaGVhZGVyIGluIHN5cy90eXBlcy5oIHN5cy9zdGF0
Lmggc3RkbGliLmggc3RyaW5nLmggbWVtb3J5Lmggc3RyaW5ncy5oIFwKPiArICAgICAgICAgICAg
ICAgICBpbnR0eXBlcy5oIHN0ZGludC5oIHVuaXN0ZC5oCj4gK2RvIDoKPiArICBhc19hY19IZWFk
ZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCj4gK2Fj
X2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2Fj
X0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0Cj4gKyIKPiAraWYgZXZhbCB0ZXN0IFwieFwk
IiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgo+ICsgIGNhdCA+PmNvbmZkZWZzLmgg
PDxfQUNFT0YKPiArI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJf
Y3BwYCAxCj4gK19BQ0VPRgo+IAo+IC0gICAgTERGTEFHUz0iJExERkxBR1MgJFBUSFJFQURfTERG
TEFHUyIKPiArZmkKPiAKPiAtICAgIExJQlM9IiRMSUJTICRQVEhSRUFEX0xJQlMiCj4gK2RvbmUK
PiAKPiAtICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0
Cj4gLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KPiAKPiAtI2luY2x1ZGUgPHB0aHJlYWQuaD4KPiAt
aW50IG1haW4odm9pZCkgewo+IC0gIHB0aHJlYWRfYXRmb3JrKDAsMCwwKTsKPiAtICBwdGhyZWFk
X2NyZWF0ZSgwLDAsMCwwKTsKPiAtfQo+ICtpZiB0ZXN0ICJ4JHB5dGhvbnRvb2xzIiA9ICJ4eSI7
IHRoZW4gOgo+IAo+IC1fQUNFT0YKPiAtaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRo
ZW4gOgo+ICsgICAgaWYgZWNobyAiJFBZVEhPTiIgfCBncmVwIC1xICJeLyI7IHRoZW4gOgo+IAo+
ICsgICAgICAgIFBZVEhPTlBBVEg9JFBZVEhPTgo+ICsgICAgICAgIFBZVEhPTj1gYmFzZW5hbWUg
JFBZVEhPTlBBVEhgCj4gKwo+ICtlbGlmIHRlc3QgLXogIiRQWVRIT04iOyB0aGVuIDoKPiArICBQ
WVRIT049InB5dGhvbiIKPiAgZWxzZQo+IC0gIGF4X2N2X3B0aHJlYWRfZmxhZ3M9ZmFpbGVkCj4g
KyAgYXNfZm5fZXJyb3IgJD8gIlBZVEhPTiBzcGVjaWZpZWQsIGJ1dCBpcyBub3QgYW4gYWJzb2x1
dGUgcGF0aCIgIiRMSU5FTk8iIDUKPiAgZmkKPiAtcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29u
ZnRlc3QuJGFjX29iamV4dCBcCj4gLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFj
X2V4dAo+ICsgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkUFlUSE9OIiwgc28gaXQg
Y2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KPiArc2V0IGR1bW15ICRQWVRIT047IGFj
X3dvcmQ9JDIKPiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVj
a2luZyBmb3IgJGFjX3dvcmQiID4mNQo+ICskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dv
cmQuLi4gIiA+JjY7IH0KPiAraWYgdGVzdCAiJHthY19jdl9wYXRoX1BZVEhPTlBBVEgrc2V0fSIg
PSBzZXQ7IHRoZW4gOgo+ICsgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gK2Vsc2UKPiAr
ICBjYXNlICRQWVRIT05QQVRIIGluCj4gKyAgW1xcL10qIHwgPzpbXFwvXSopCj4gKyAgYWNfY3Zf
cGF0aF9QWVRIT05QQVRIPSIkUFlUSE9OUEFUSCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhl
IHRlc3Qgd2l0aCBhIHBhdGguCj4gKyAgOzsKPiArICAqKQo+ICsgIGFzX3NhdmVfSUZTPSRJRlM7
IElGUz0kUEFUSF9TRVBBUkFUT1IKPiArZm9yIGFzX2RpciBpbiAkUEFUSAo+ICtkbwo+ICsgIElG
Uz0kYXNfc2F2ZV9JRlMKPiArICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+ICsgICAg
Zm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gKyAg
aWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94
ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+ICsgICAgYWNfY3ZfcGF0
aF9QWVRIT05QQVRIPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0Igo+ICsgICAgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRh
Y19leGVjX2V4dCIgPiY1Cj4gKyAgICBicmVhayAyCj4gKyAgZmkKPiArZG9uZQo+ICsgIGRvbmUK
PiArSUZTPSRhc19zYXZlX0lGUwo+IAo+IC0gICAgQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTIgo+ICsg
IHRlc3QgLXogIiRhY19jdl9wYXRoX1BZVEhPTlBBVEgiICYmIGFjX2N2X3BhdGhfUFlUSE9OUEFU
SD0ibm8iCj4gKyAgOzsKPiArZXNhYwo+ICtmaQo+ICtQWVRIT05QQVRIPSRhY19jdl9wYXRoX1BZ
VEhPTlBBVEgKPiAraWYgdGVzdCAtbiAiJFBZVEhPTlBBVEgiOyB0aGVuCj4gKyAgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQWVRIT05QQVRIIiA+JjUK
PiArJGFzX2VjaG8gIiRQWVRIT05QQVRIIiA+JjY7IH0KPiArZWxzZQo+ICsgIHsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Cj4gKyRhc19lY2hv
ICJubyIgPiY2OyB9Cj4gK2ZpCj4gCj4gLSAgICBMREZMQUdTPSIkc2F2ZWRfTERGTEFHUyIKPiAK
PiAtICAgIExJQlM9IiRzYXZlZF9MSUJTIgo+ICtpZiB0ZXN0IHgiJHtQWVRIT05QQVRIfSIgPT0g
eCJubyIKPiArdGhlbgo+ICsgICAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5kICRQWVRI
T04sIHBsZWFzZSBpbnN0YWxsICRQWVRIT04iICIkTElORU5PIiA1Cj4gK2ZpCj4gKyAgICB7ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBweXRob24g
dmVyc2lvbiA+PSAyLjMgIiA+JjUKPiArJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHB5dGhvbiB2
ZXJzaW9uID49IDIuMyAuLi4gIiA+JjY7IH0KPiArYCRQWVRIT04gLWMgJ2ltcG9ydCBzeXM7IHN5
cy5leGl0KGV2YWwoInN5cy52ZXJzaW9uX2luZm8gPCAoMiwgMykiKSknYAo+ICtpZiB0ZXN0ICIk
PyIgIT0gIjAiCj4gK3RoZW4KPiArICAgIHB5dGhvbl92ZXJzaW9uPWAkUFlUSE9OIC1WIDI+JjFg
Cj4gKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDog
bm8iID4mNQo+ICskYXNfZWNobyAibm8iID4mNjsgfQo+ICsgICAgYXNfZm5fZXJyb3IgJD8gIiRw
eXRob25fdmVyc2lvbiBpcyB0b28gb2xkLCBtaW5pbXVtIHJlcXVpcmVkIHZlcnNpb24gaXMgMi4z
IiAiJExJTkVOTyIgNQo+ICtlbHNlCj4gKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5l
bm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKPiArJGFzX2VjaG8gInllcyIgPiY2OyB9Cj4g
K2ZpCj4gCj4gK2FjX3ByZXZpb3VzX2NwcGZsYWdzPSRDUFBGTEFHUwo+ICthY19wcmV2aW91c19s
ZGZsYWdzPSRMREZMQUdTCj4gK2FjX3B5dGhvbl92ZXJzaW9uPWAkUFlUSE9OIC1jICdpbXBvcnQg
ZGlzdHV0aWxzLnN5c2NvbmZpZzsgXAo+ICsgICAgcHJpbnQgZGlzdHV0aWxzLnN5c2NvbmZpZy5n
ZXRfY29uZmlnX3ZhcigiVkVSU0lPTiIpJ2AKPiArIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9m
ICIkUFlUSE9OLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3Mu
Cj4gK3NldCBkdW1teSAkUFlUSE9OLWNvbmZpZzsgYWNfd29yZD0kMgo+ICt7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cj4g
KyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQo+ICtpZiB0ZXN0
ICIke2FjX2N2X3BhdGhfcHljb25maWcrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICsgICRhc19lY2hv
X24gIihjYWNoZWQpICIgPiY2Cj4gK2Vsc2UKPiArICBjYXNlICRweWNvbmZpZyBpbgo+ICsgIFtc
XC9dKiB8ID86W1xcL10qKQo+ICsgIGFjX2N2X3BhdGhfcHljb25maWc9IiRweWNvbmZpZyIgIyBM
ZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCj4gKyAgOzsKPiArICAq
KQo+ICsgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKPiArZm9yIGFzX2Rp
ciBpbiAkUEFUSAo+ICtkbwo+ICsgIElGUz0kYXNfc2F2ZV9JRlMKPiArICB0ZXN0IC16ICIkYXNf
ZGlyIiAmJiBhc19kaXI9Lgo+ICsgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRh
YmxlX2V4dGVuc2lvbnM7IGRvCj4gKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFj
X2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0Ijsg
fTsgdGhlbgo+ICsgICAgYWNfY3ZfcGF0aF9weWNvbmZpZz0iJGFzX2Rpci8kYWNfd29yZCRhY19l
eGVjX2V4dCIKPiArICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZv
dW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQo+ICsgICAgYnJlYWsgMgo+ICsg
IGZpCj4gK2RvbmUKPiArICBkb25lCj4gK0lGUz0kYXNfc2F2ZV9JRlMKPiAKPiArICB0ZXN0IC16
ICIkYWNfY3ZfcGF0aF9weWNvbmZpZyIgJiYgYWNfY3ZfcGF0aF9weWNvbmZpZz0ibm8iCj4gKyAg
OzsKPiArZXNhYwo+ICtmaQo+ICtweWNvbmZpZz0kYWNfY3ZfcGF0aF9weWNvbmZpZwo+ICtpZiB0
ZXN0IC1uICIkcHljb25maWciOyB0aGVuCj4gKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRweWNvbmZpZyIgPiY1Cj4gKyRhc19lY2hvICIkcHljb25m
aWciID4mNjsgfQo+ICtlbHNlCj4gKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKPiArJGFzX2VjaG8gIm5vIiA+JjY7IH0KPiAgZmkKPiAt
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRheF9jdl9w
dGhyZWFkX2ZsYWdzIiA+JjUKPiAtJGFzX2VjaG8gIiRheF9jdl9wdGhyZWFkX2ZsYWdzIiA+JjY7
IH0KPiAtICAgIGlmIHRlc3QgIngkYXhfY3ZfcHRocmVhZF9mbGFncyIgPSB4ZmFpbGVkOyB0aGVu
Cj4gLSAgICAgICAgYXNfZm5fZXJyb3IgJD8gIi1wdGhyZWFkIGRvZXMgbm90IHdvcmsiICIkTElO
RU5PIiA1Cj4gLSAgICBmaQo+IC0KPiAtICAgIFBUSFJFQURfQ0ZMQUdTPSIkYXhfY3ZfcHRocmVh
ZF9mbGFncyIKPiAtICAgIFBUSFJFQURfTERGTEFHUz0iJGF4X2N2X3B0aHJlYWRfZmxhZ3MiCj4g
LSAgICBQVEhSRUFEX0xJQlM9IiIKPiAKPiAKPiAraWYgdGVzdCB4IiRweWNvbmZpZyIgPT0geCJu
byI7IHRoZW4gOgo+IAo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IGNoZWNraW5nIGZvciBjbG9ja19nZXR0aW1lIGluIC1scnQiID4mNQo+IC0kYXNfZWNob19uICJj
aGVja2luZyBmb3IgY2xvY2tfZ2V0dGltZSBpbiAtbHJ0Li4uICIgPiY2OyB9Cj4gLWlmIHRlc3Qg
IiR7YWNfY3ZfbGliX3J0X2Nsb2NrX2dldHRpbWUrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+IC0gICRh
c19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gLWVsc2UKPiAtICBhY19jaGVja19saWJfc2F2ZV9M
SUJTPSRMSUJTCj4gLUxJQlM9Ii1scnQgICRMSUJTIgo+IC1jYXQgY29uZmRlZnMuaCAtIDw8X0FD
RU9GID5jb25mdGVzdC4kYWNfZXh0Cj4gLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KPiArICAgICAg
ICBDUFBGTEFHUz0iJENGTEFHUyBgJFBZVEhPTiAtYyAnaW1wb3J0IGRpc3R1dGlscy5zeXNjb25m
aWc7IFwKPiArICAgICAgICBwcmludCAiLUkiICsgZGlzdHV0aWxzLnN5c2NvbmZpZy5nZXRfY29u
ZmlnX3ZhcigiSU5DTFVERVBZIiknYCIKPiArICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgYCRQWVRI
T04gLWMgJ2ltcG9ydCBkaXN0dXRpbHMuc3lzY29uZmlnOyBcCj4gKyAgICAgICAgcHJpbnQgZGlz
dHV0aWxzLnN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiQ0ZMQUdTIiknYCIKPiArICAgIExERkxB
R1M9IiRMREZMQUdTIGAkUFlUSE9OIC1jICdpbXBvcnQgZGlzdHV0aWxzLnN5c2NvbmZpZzsgXAo+
ICsgICAgICAgIHByaW50IGRpc3R1dGlscy5zeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIkxJQlMi
KSdgIgo+ICsgICAgTERGTEFHUz0iJExERkxBR1MgYCRQWVRIT04gLWMgJ2ltcG9ydCBkaXN0dXRp
bHMuc3lzY29uZmlnOyBcCj4gKyAgICAgICAgcHJpbnQgZGlzdHV0aWxzLnN5c2NvbmZpZy5nZXRf
Y29uZmlnX3ZhcigiU1lTTElCUyIpJ2AiCj4gKyAgICBMREZMQUdTPSIkTERGTEFHUyBgJFBZVEhP
TiAtYyAnaW1wb3J0IGRpc3R1dGlscy5zeXNjb25maWc7IFwKPiArICAgICAgICBwcmludCAiLUwi
ICsgZGlzdHV0aWxzLnN5c2NvbmZpZy5nZXRfcHl0aG9uX2xpYihwbGF0X3NwZWNpZmljPTEsXAo+
ICsgICAgICAgIHN0YW5kYXJkX2xpYj0xKSArICIvY29uZmlnIidgIgo+ICsgICAgTERGTEFHUz0i
JExERkxBR1MgYCRQWVRIT04gLWMgJ2ltcG9ydCBkaXN0dXRpbHMuc3lzY29uZmlnOyBcCj4gKyAg
ICAgICAgcHJpbnQgZGlzdHV0aWxzLnN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiTElOS0ZPUlNI
QVJFRCIpJ2AiCj4gKyAgICBMREZMQUdTPSIkTERGTEFHUyBgJFBZVEhPTiAtYyAnaW1wb3J0IGRp
c3R1dGlscy5zeXNjb25maWc7IFwKPiArICAgICAgICBwcmludCBkaXN0dXRpbHMuc3lzY29uZmln
LmdldF9jb25maWdfdmFyKCJMREZMQUdTIiknYCIKPiAKPiAtLyogT3ZlcnJpZGUgYW55IEdDQyBp
bnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCj4gLSAgIFVzZSBjaGFyIGJlY2F1
c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwo+IC0gICBidWlsdGlu
IGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwo+
IC0jaWZkZWYgX19jcGx1c3BsdXMKPiAtZXh0ZXJuICJDIgo+IC0jZW5kaWYKPiAtY2hhciBjbG9j
a19nZXR0aW1lICgpOwo+IC1pbnQKPiAtbWFpbiAoKQo+IC17Cj4gLXJldHVybiBjbG9ja19nZXR0
aW1lICgpOwo+IC0gIDsKPiAtICByZXR1cm4gMDsKPiAtfQo+IC1fQUNFT0YKPiAtaWYgYWNfZm5f
Y190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgo+IC0gIGFjX2N2X2xpYl9ydF9jbG9ja19nZXR0
aW1lPXllcwo+ICBlbHNlCj4gLSAgYWNfY3ZfbGliX3J0X2Nsb2NrX2dldHRpbWU9bm8KPiAtZmkK
PiAtcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCj4gLSAgICBj
b25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAo+IC1MSUJTPSRhY19jaGVja19saWJf
c2F2ZV9MSUJTCj4gLWZpCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogcmVzdWx0OiAkYWNfY3ZfbGliX3J0X2Nsb2NrX2dldHRpbWUiID4mNQo+IC0kYXNfZWNobyAi
JGFjX2N2X2xpYl9ydF9jbG9ja19nZXR0aW1lIiA+JjY7IH0KPiAtaWYgdGVzdCAieCRhY19jdl9s
aWJfcnRfY2xvY2tfZ2V0dGltZSIgPSB4IiJ5ZXM7IHRoZW4gOgo+IC0gIGNhdCA+PmNvbmZkZWZz
LmggPDxfQUNFT0YKPiAtI2RlZmluZSBIQVZFX0xJQlJUIDEKPiAtX0FDRU9GCj4gCj4gLSAgTElC
Uz0iLWxydCAkTElCUyIKPiArICAgICAgICBDUFBGTEFHUz0iJENGTEFHUyBgJFBZVEhPTi1jb25m
aWcgLS1jZmxhZ3NgIgo+ICsgICAgTERGTEFHUz0iJExERkxBR1MgYCRQWVRIT04tY29uZmlnIC0t
bGRmbGFnc2AiCj4gCj4gIGZpCj4gCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogY2hlY2tpbmcgZm9yIHlhamxfYWxsb2MgaW4gLWx5YWpsIiA+JjUKPiAtJGFzX2Vj
aG9fbiAiY2hlY2tpbmcgZm9yIHlhamxfYWxsb2MgaW4gLWx5YWpsLi4uICIgPiY2OyB9Cj4gLWlm
IHRlc3QgIiR7YWNfY3ZfbGliX3lhamxfeWFqbF9hbGxvYytzZXR9IiA9IHNldDsgdGhlbiA6Cj4g
LSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAtZWxzZQo+IC0gIGFjX2NoZWNrX2xpYl9z
YXZlX0xJQlM9JExJQlMKPiAtTElCUz0iLWx5YWpsICAkTElCUyIKPiAtY2F0IGNvbmZkZWZzLmgg
LSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAo+IC0vKiBlbmQgY29uZmRlZnMuaC4gICovCj4g
K2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJQeXRob24uaCIgImFjX2N2
X2hlYWRlcl9QeXRob25faCIgIiRhY19pbmNsdWRlc19kZWZhdWx0Igo+ICtpZiB0ZXN0ICJ4JGFj
X2N2X2hlYWRlcl9QeXRob25faCIgPSB4IiJ5ZXM7IHRoZW4gOgo+IAo+IC0vKiBPdmVycmlkZSBh
bnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KPiAtICAgVXNlIGNo
YXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCj4gLSAg
IGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBs
eS4gICovCj4gLSNpZmRlZiBfX2NwbHVzcGx1cwo+IC1leHRlcm4gIkMiCj4gLSNlbmRpZgo+IC1j
aGFyIHlhamxfYWxsb2MgKCk7Cj4gLWludAo+IC1tYWluICgpCj4gLXsKPiAtcmV0dXJuIHlhamxf
YWxsb2MgKCk7Cj4gLSAgOwo+IC0gIHJldHVybiAwOwo+IC19Cj4gLV9BQ0VPRgo+IC1pZiBhY19m
bl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Cj4gLSAgYWNfY3ZfbGliX3lhamxfeWFqbF9h
bGxvYz15ZXMKPiAgZWxzZQo+IC0gIGFjX2N2X2xpYl95YWpsX3lhamxfYWxsb2M9bm8KPiAtZmkK
PiAtcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCj4gLSAgICBj
b25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAo+IC1MSUJTPSRhY19jaGVja19saWJf
c2F2ZV9MSUJTCj4gKyAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5kIFB5dGhvbiBkZXZl
bG9wbWVudCBoZWFkZXJzIiAiJExJTkVOTyIgNQo+ICBmaQo+IC17ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl95YWpsX3lhamxfYWxsb2Mi
ID4mNQo+IC0kYXNfZWNobyAiJGFjX2N2X2xpYl95YWpsX3lhamxfYWxsb2MiID4mNjsgfQo+IC1p
ZiB0ZXN0ICJ4JGFjX2N2X2xpYl95YWpsX3lhamxfYWxsb2MiID0geCIieWVzOyB0aGVuIDoKPiAt
ICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCj4gLSNkZWZpbmUgSEFWRV9MSUJZQUpMIDEKPiAt
X0FDRU9GCj4gLQo+IC0gIExJQlM9Ii1seWFqbCAkTElCUyIKPiAKPiAtZWxzZQo+IC0gIGFzX2Zu
X2Vycm9yICQ/ICJDb3VsZCBub3QgZmluZCB5YWpsIiAiJExJTkVOTyIgNQo+IC1maQo+IAo+IC17
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkZWZs
YXRlQ29weSBpbiAtbHoiID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZGVmbGF0ZUNv
cHkgaW4gLWx6Li4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfbGliX3pfZGVmbGF0ZUNv
cHkrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICthc19hY19MaWI9YCRhc19lY2hvICJhY19jdl9saWJf
cHl0aG9uJGFjX3B5dGhvbl92ZXJzaW9uJydfUHlBcmdfUGFyc2VUdXBsZSIgfCAkYXNfdHJfc2hg
Cj4gK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9y
IFB5QXJnX1BhcnNlVHVwbGUgaW4gLWxweXRob24kYWNfcHl0aG9uX3ZlcnNpb24iID4mNQo+ICsk
YXNfZWNob19uICJjaGVja2luZyBmb3IgUHlBcmdfUGFyc2VUdXBsZSBpbiAtbHB5dGhvbiRhY19w
eXRob25fdmVyc2lvbi4uLiAiID4mNjsgfQo+ICtpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0xp
YitzZXR9XCIiID0gc2V0OyB0aGVuIDoKPiAgICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgo+
ICBlbHNlCj4gICAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwo+IC1MSUJTPSItbHogICRM
SUJTIgo+ICtMSUJTPSItbHB5dGhvbiRhY19weXRob25fdmVyc2lvbiAgJExJQlMiCj4gIGNhdCBj
b25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKPiAgLyogZW5kIGNvbmZkZWZz
LmguICAqLwo+IAo+IEBAIC03NjMyLDE4OTMgKzUzNzcsMTE3MyBAQCBjYXQgY29uZmRlZnMuaCAt
IDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Cj4gICNpZmRlZiBfX2NwbHVzcGx1cwo+ICBleHRl
cm4gIkMiCj4gICNlbmRpZgo+IC1jaGFyIGRlZmxhdGVDb3B5ICgpOwo+ICtjaGFyIFB5QXJnX1Bh
cnNlVHVwbGUgKCk7Cj4gIGludAo+ICBtYWluICgpCj4gIHsKPiAtcmV0dXJuIGRlZmxhdGVDb3B5
ICgpOwo+ICtyZXR1cm4gUHlBcmdfUGFyc2VUdXBsZSAoKTsKPiAgICA7Cj4gICAgcmV0dXJuIDA7
Cj4gIH0KPiAgX0FDRU9GCj4gIGlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoK
PiAtICBhY19jdl9saWJfel9kZWZsYXRlQ29weT15ZXMKPiArICBldmFsICIkYXNfYWNfTGliPXll
cyIKPiAgZWxzZQo+IC0gIGFjX2N2X2xpYl96X2RlZmxhdGVDb3B5PW5vCj4gKyAgZXZhbCAiJGFz
X2FjX0xpYj1ubyIKPiAgZmkKPiAgcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFj
X29iamV4dCBcCj4gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAo+ICBM
SUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCj4gIGZpCj4gLXsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3pfZGVmbGF0ZUNvcHkiID4m
NQo+IC0kYXNfZWNobyAiJGFjX2N2X2xpYl96X2RlZmxhdGVDb3B5IiA+JjY7IH0KPiAtaWYgdGVz
dCAieCRhY19jdl9saWJfel9kZWZsYXRlQ29weSIgPSB4IiJ5ZXM7IHRoZW4gOgo+ICtldmFsIGFj
X3Jlcz1cJCRhc19hY19MaWIKPiArICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Cj4gKyRhc19lY2hvICIkYWNf
cmVzIiA+JjY7IH0KPiAraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19MaWIiXCIgPSB4InllcyI7
IHRoZW4gOgo+ICAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKPiAtI2RlZmluZSBIQVZFX0xJ
QlogMQo+ICsjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV9MSUJweXRob24kYWNfcHl0aG9uX3ZlcnNp
b24iIHwgJGFzX3RyX2NwcGAgMQo+ICBfQUNFT0YKPiAKPiAtICBMSUJTPSItbHogJExJQlMiCj4g
LQo+IC1lbHNlCj4gLSAgYXNfZm5fZXJyb3IgJD8gIkNvdWxkIG5vdCBmaW5kIHpsaWIiICIkTElO
RU5PIiA1Cj4gLWZpCj4gLQo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVO
T306IGNoZWNraW5nIGZvciBsaWJpY29udl9vcGVuIGluIC1saWNvbnYiID4mNQo+IC0kYXNfZWNo
b19uICJjaGVja2luZyBmb3IgbGliaWNvbnZfb3BlbiBpbiAtbGljb252Li4uICIgPiY2OyB9Cj4g
LWlmIHRlc3QgIiR7YWNfY3ZfbGliX2ljb252X2xpYmljb252X29wZW4rc2V0fSIgPSBzZXQ7IHRo
ZW4gOgo+IC0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gLWVsc2UKPiAtICBhY19jaGVj
a19saWJfc2F2ZV9MSUJTPSRMSUJTCj4gLUxJQlM9Ii1saWNvbnYgICRMSUJTIgo+IC1jYXQgY29u
ZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Cj4gLS8qIGVuZCBjb25mZGVmcy5o
LiAgKi8KPiArICBMSUJTPSItbHB5dGhvbiRhY19weXRob25fdmVyc2lvbiAkTElCUyIKPiAKPiAt
LyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3Iu
Cj4gLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBv
ZiBhIEdDQwo+IC0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291
bGQgc3RpbGwgYXBwbHkuICAqLwo+IC0jaWZkZWYgX19jcGx1c3BsdXMKPiAtZXh0ZXJuICJDIgo+
IC0jZW5kaWYKPiAtY2hhciBsaWJpY29udl9vcGVuICgpOwo+IC1pbnQKPiAtbWFpbiAoKQo+IC17
Cj4gLXJldHVybiBsaWJpY29udl9vcGVuICgpOwo+IC0gIDsKPiAtICByZXR1cm4gMDsKPiAtfQo+
IC1fQUNFT0YKPiAtaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgo+IC0gIGFj
X2N2X2xpYl9pY29udl9saWJpY29udl9vcGVuPXllcwo+IC1lbHNlCj4gLSAgYWNfY3ZfbGliX2lj
b252X2xpYmljb252X29wZW49bm8KPiAtZmkKPiAtcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29u
ZnRlc3QuJGFjX29iamV4dCBcCj4gLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFj
X2V4dAo+IC1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCj4gLWZpCj4gLXsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2ljb252X2xp
Ymljb252X29wZW4iID4mNQo+IC0kYXNfZWNobyAiJGFjX2N2X2xpYl9pY29udl9saWJpY29udl9v
cGVuIiA+JjY7IH0KPiAtaWYgdGVzdCAieCRhY19jdl9saWJfaWNvbnZfbGliaWNvbnZfb3BlbiIg
PSB4IiJ5ZXM7IHRoZW4gOgo+IC0gIGxpYmljb252PSJ5Igo+ICBlbHNlCj4gLSAgbGliaWNvbnY9
Im4iCj4gKyAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5kIGEgc3VpdGFibGUgcHl0aG9u
IGRldmVsb3BtZW50IGxpYnJhcnkiICIkTElORU5PIiA1Cj4gIGZpCj4gCj4gK0NQUEZMQUdTPSRh
Y19wcmV2aW91c19jcHBmbGFncwo+ICtMRExGQUdTPSRhY19wcmV2aW91c19sZGZsYWdzCj4gCj4g
Cj4gLSMgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCj4gLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBi
dWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCj4gLSMgZm9yIGNv
bnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp
bmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQo+IC0kYXNf
ZWNob19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaC4uLiAiID4mNjsgfQo+IC1pZiB0
ZXN0ICIke2FjX2N2X3dvcmtpbmdfYWxsb2NhX2grc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICtmaQo+
ICsjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEg
cHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KPiArc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQy
Cj4gK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9y
ICRhY193b3JkIiA+JjUKPiArJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIg
PiY2OyB9Cj4gK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9YR0VUVEVYVCtzZXR9IiA9IHNldDsgdGhl
biA6Cj4gICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAgZWxzZQo+IC0gIGNhdCBjb25m
ZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKPiAtLyogZW5kIGNvbmZkZWZzLmgu
ICAqLwo+IC0jaW5jbHVkZSA8YWxsb2NhLmg+Cj4gLWludAo+IC1tYWluICgpCj4gLXsKPiAtY2hh
ciAqcCA9IChjaGFyICopIGFsbG9jYSAoMiAqIHNpemVvZiAoaW50KSk7Cj4gLSAgICAgICAgICAg
ICAgICAgICAgICAgICBpZiAocCkgcmV0dXJuIDA7Cj4gLSAgOwo+IC0gIHJldHVybiAwOwo+IC19
Cj4gLV9BQ0VPRgo+IC1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Cj4gLSAg
YWNfY3Zfd29ya2luZ19hbGxvY2FfaD15ZXMKPiAtZWxzZQo+IC0gIGFjX2N2X3dvcmtpbmdfYWxs
b2NhX2g9bm8KPiArICBjYXNlICRYR0VUVEVYVCBpbgo+ICsgIFtcXC9dKiB8ID86W1xcL10qKQo+
ICsgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJp
ZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCj4gKyAgOzsKPiArICAqKQo+ICsgIGFzX3NhdmVfSUZT
PSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKPiArZm9yIGFzX2RpciBpbiAkUEFUSAo+ICtkbwo+
ICsgIElGUz0kYXNfc2F2ZV9JRlMKPiArICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+
ICsgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRv
Cj4gKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNf
dGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+ICsgICAgYWNf
Y3ZfcGF0aF9YR0VUVEVYVD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKPiArICAgICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dv
cmQkYWNfZXhlY19leHQiID4mNQo+ICsgICAgYnJlYWsgMgo+ICsgIGZpCj4gK2RvbmUKPiArICBk
b25lCj4gK0lGUz0kYXNfc2F2ZV9JRlMKPiArCj4gKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdF
VFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9Im5vIgo+ICsgIDs7Cj4gK2VzYWMKPiAgZmkK
PiAtcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCj4gLSAgICBj
b25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAo+ICtYR0VUVEVYVD0kYWNfY3ZfcGF0
aF9YR0VUVEVYVAo+ICtpZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCj4gKyAgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRYR0VUVEVYVCIgPiY1Cj4g
KyRhc19lY2hvICIkWEdFVFRFWFQiID4mNjsgfQo+ICtlbHNlCj4gKyAgeyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKPiArJGFzX2VjaG8gIm5v
IiA+JjY7IH0KPiAgZmkKPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiByZXN1bHQ6ICRhY19jdl93b3JraW5nX2FsbG9jYV9oIiA+JjUKPiAtJGFzX2VjaG8gIiRhY19j
dl93b3JraW5nX2FsbG9jYV9oIiA+JjY7IH0KPiAtaWYgdGVzdCAkYWNfY3Zfd29ya2luZ19hbGxv
Y2FfaCA9IHllczsgdGhlbgo+IAo+IC0kYXNfZWNobyAiI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEi
ID4+Y29uZmRlZnMuaAo+IAo+ICtpZiB0ZXN0IHgiJHtYR0VUVEVYVH0iID09IHgibm8iCj4gK3Ro
ZW4KPiArICAgIGFzX2ZuX2Vycm9yICQ/ICJVbmFibGUgdG8gZmluZCB4Z2V0dGV4dCwgcGxlYXNl
IGluc3RhbGwgeGdldHRleHQiICIkTElORU5PIiA1Cj4gIGZpCj4gLQo+IC17ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQo+IC0k
YXNfZWNob19uICJjaGVja2luZyBmb3IgYWxsb2NhLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7
YWNfY3ZfZnVuY19hbGxvY2Ffd29ya3Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICsjIEV4dHJhY3Qg
dGhlIGZpcnN0IHdvcmQgb2YgImFzODYiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0
aCBhcmdzLgo+ICtzZXQgZHVtbXkgYXM4NjsgYWNfd29yZD0kMgo+ICt7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cj4gKyRh
c19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQo+ICtpZiB0ZXN0ICIk
e2FjX2N2X3BhdGhfQVM4NitzZXR9IiA9IHNldDsgdGhlbiA6Cj4gICAgJGFzX2VjaG9fbiAiKGNh
Y2hlZCkgIiA+JjYKPiAgZWxzZQo+IC0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0
ZXN0LiRhY19leHQKPiAtLyogZW5kIGNvbmZkZWZzLmguICAqLwo+IC0jaWZkZWYgX19HTlVDX18K
PiAtIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKPiAtI2Vsc2UKPiAtIyBpZmRlZiBf
TVNDX1ZFUgo+IC0jICBpbmNsdWRlIDxtYWxsb2MuaD4KPiAtIyAgZGVmaW5lIGFsbG9jYSBfYWxs
b2NhCj4gLSMgZWxzZQo+IC0jICBpZmRlZiBIQVZFX0FMTE9DQV9ICj4gLSMgICBpbmNsdWRlIDxh
bGxvY2EuaD4KPiAtIyAgZWxzZQo+IC0jICAgaWZkZWYgX0FJWAo+IC0gI3ByYWdtYSBhbGxvY2EK
PiAtIyAgIGVsc2UKPiAtIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2Mg
K09saWJjYWxscyAqLwo+IC1jaGFyICphbGxvY2EgKCk7Cj4gLSMgICAgZW5kaWYKPiAtIyAgIGVu
ZGlmCj4gLSMgIGVuZGlmCj4gLSMgZW5kaWYKPiAtI2VuZGlmCj4gLQo+IC1pbnQKPiAtbWFpbiAo
KQo+IC17Cj4gLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EgKDEpOwo+IC0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGlmIChwKSByZXR1cm4gMDsKPiAtICA7Cj4gLSAgcmV0dXJu
IDA7Cj4gLX0KPiAtX0FDRU9GCj4gLWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVu
IDoKPiAtICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKPiAtZWxzZQo+IC0gIGFjX2N2X2Z1
bmNfYWxsb2NhX3dvcmtzPW5vCj4gLWZpCj4gLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0
ZXN0LiRhY19vYmpleHQgXAo+IC0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19l
eHQKPiAtZmkKPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1
bHQ6ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgPiY1Cj4gLSRhc19lY2hvICIkYWNfY3ZfZnVu
Y19hbGxvY2Ffd29ya3MiID4mNjsgfQo+IC0KPiAtaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ff
d29ya3MgPSB5ZXM7IHRoZW4KPiAtCj4gLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfQUxMT0NBIDEi
ID4+Y29uZmRlZnMuaAo+ICsgIGNhc2UgJEFTODYgaW4KPiArICBbXFwvXSogfCA/OltcXC9dKikK
PiArICBhY19jdl9wYXRoX0FTODY9IiRBUzg2IiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUg
dGVzdCB3aXRoIGEgcGF0aC4KPiArICA7Owo+ICsgICopCj4gKyAgYXNfc2F2ZV9JRlM9JElGUzsg
SUZTPSRQQVRIX1NFUEFSQVRPUgo+ICtmb3IgYXNfZGlyIGluICRQQVRICj4gK2RvCj4gKyAgSUZT
PSRhc19zYXZlX0lGUwo+ICsgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCj4gKyAgICBm
b3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KPiArICBp
ZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3gg
IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCj4gKyAgICBhY19jdl9wYXRo
X0FTODY9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCj4gKyAgICAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNf
ZXh0IiA+JjUKPiArICAgIGJyZWFrIDIKPiArICBmaQo+ICtkb25lCj4gKyAgZG9uZQo+ICtJRlM9
JGFzX3NhdmVfSUZTCj4gCj4gKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfQVM4NiIgJiYgYWNfY3Zf
cGF0aF9BUzg2PSJubyIKPiArICA7Owo+ICtlc2FjCj4gK2ZpCj4gK0FTODY9JGFjX2N2X3BhdGhf
QVM4Ngo+ICtpZiB0ZXN0IC1uICIkQVM4NiI7IHRoZW4KPiArICB7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEFTODYiID4mNQo+ICskYXNfZWNobyAiJEFT
ODYiID4mNjsgfQo+ICBlbHNlCj4gLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2Ig
Ym90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKPiAtIyB0aGF0IGNhdXNlIHRyb3Vi
bGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCj4gLSMgY29u
dGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxs
b2NhLAo+IC0jIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9m
IGNvbXBpbGluZyBhbGxvY2EuYy4KPiAtCj4gLUFMTE9DQT1cJHtMSUJPQkpESVJ9YWxsb2NhLiRh
Y19vYmpleHQKPiAtCj4gLSRhc19lY2hvICIjZGVmaW5lIENfQUxMT0NBIDEiID4+Y29uZmRlZnMu
aAo+ICsgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBu
byIgPiY1Cj4gKyRhc19lY2hvICJubyIgPiY2OyB9Cj4gK2ZpCj4gCj4gCj4gLXsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBcYGFsbG9jYS5j
JyBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKPiAtJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBc
YGFsbG9jYS5jJyBuZWVkcyBDcmF5IGhvb2tzLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNf
Y3Zfb3NfY3JheStzZXR9IiA9IHNldDsgdGhlbiA6Cj4gK2lmIHRlc3QgeCIke0FTODZ9IiA9PSB4
Im5vIgo+ICt0aGVuCj4gKyAgICBhc19mbl9lcnJvciAkPyAiVW5hYmxlIHRvIGZpbmQgYXM4Niwg
cGxlYXNlIGluc3RhbGwgYXM4NiIgIiRMSU5FTk8iIDUKPiArZmkKPiArIyBFeHRyYWN0IHRoZSBm
aXJzdCB3b3JkIG9mICJsZDg2Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJn
cy4KPiArc2V0IGR1bW15IGxkODY7IGFjX3dvcmQ9JDIKPiAreyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQo+ICskYXNfZWNo
b19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KPiAraWYgdGVzdCAiJHthY19j
dl9wYXRoX0xEODYrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICAgICRhc19lY2hvX24gIihjYWNoZWQp
ICIgPiY2Cj4gIGVsc2UKPiAtICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4k
YWNfZXh0Cj4gLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KPiAtI2lmIGRlZmluZWQgQ1JBWSAmJiAh
IGRlZmluZWQgQ1JBWTIKPiAtd2ViZWNyYXkKPiAtI2Vsc2UKPiAtd2Vub3RiZWNyYXkKPiAtI2Vu
ZGlmCj4gKyAgY2FzZSAkTEQ4NiBpbgo+ICsgIFtcXC9dKiB8ID86W1xcL10qKQo+ICsgIGFjX2N2
X3BhdGhfTEQ4Nj0iJExEODYiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGgg
YSBwYXRoLgo+ICsgIDs7Cj4gKyAgKikKPiArICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhf
U0VQQVJBVE9SCj4gK2ZvciBhc19kaXIgaW4gJFBBVEgKPiArZG8KPiArICBJRlM9JGFzX3NhdmVf
SUZTCj4gKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KPiArICAgIGZvciBhY19leGVj
X2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwo+ICsgIGlmIHsgdGVzdCAt
ZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8k
YWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KPiArICAgIGFjX2N2X3BhdGhfTEQ4Nj0iJGFz
X2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKPiArICAgICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQo+
ICsgICAgYnJlYWsgMgo+ICsgIGZpCj4gK2RvbmUKPiArICBkb25lCj4gK0lGUz0kYXNfc2F2ZV9J
RlMKPiAKPiAtX0FDRU9GCj4gLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAy
PiY1IHwKPiAtICAkRUdSRVAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgo+IC0g
IGFjX2N2X29zX2NyYXk9eWVzCj4gLWVsc2UKPiAtICBhY19jdl9vc19jcmF5PW5vCj4gKyAgdGVz
dCAteiAiJGFjX2N2X3BhdGhfTEQ4NiIgJiYgYWNfY3ZfcGF0aF9MRDg2PSJubyIKPiArICA7Owo+
ICtlc2FjCj4gIGZpCj4gLXJtIC1mIGNvbmZ0ZXN0Kgo+IC0KPiArTEQ4Nj0kYWNfY3ZfcGF0aF9M
RDg2Cj4gK2lmIHRlc3QgLW4gIiRMRDg2IjsgdGhlbgo+ICsgIHsgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTEQ4NiIgPiY1Cj4gKyRhc19lY2hvICIkTEQ4
NiIgPiY2OyB9Cj4gK2Vsc2UKPiArICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJ
TkVOT306IHJlc3VsdDogbm8iID4mNQo+ICskYXNfZWNobyAibm8iID4mNjsgfQo+ICBmaQo+IC17
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X29z
X2NyYXkiID4mNQo+IC0kYXNfZWNobyAiJGFjX2N2X29zX2NyYXkiID4mNjsgfQo+IC1pZiB0ZXN0
ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCj4gLSAgZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBH
RVRCNjcgZ2V0YjY3OyBkbwo+IC0gICAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18k
YWNfZnVuYyIgfCAkYXNfdHJfc2hgCj4gLWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRh
Y19mdW5jIiAiJGFzX2FjX3ZhciIKPiAtaWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIg
PSB4InllcyI7IHRoZW4gOgo+IC0KPiAtY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgo+IC0jZGVm
aW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCj4gLV9BQ0VPRgo+IAo+IC0gICAgYnJlYWsK
PiAtZmkKPiAKPiAtICBkb25lCj4gK2lmIHRlc3QgeCIke0xEODZ9IiA9PSB4Im5vIgo+ICt0aGVu
Cj4gKyAgICBhc19mbl9lcnJvciAkPyAiVW5hYmxlIHRvIGZpbmQgbGQ4NiwgcGxlYXNlIGluc3Rh
bGwgbGQ4NiIgIiRMSU5FTk8iIDUKPiAgZmkKPiAtCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIg
PiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2Eu
Li4gIiA+JjY7IH0KPiAtaWYgdGVzdCAiJHthY19jdl9jX3N0YWNrX2RpcmVjdGlvbitzZXR9IiA9
IHNldDsgdGhlbiA6Cj4gKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYmNjIiwgc28gaXQg
Y2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KPiArc2V0IGR1bW15IGJjYzsgYWNfd29y
ZD0kMgo+ICt7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5n
IGZvciAkYWNfd29yZCIgPiY1Cj4gKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4u
LiAiID4mNjsgfQo+ICtpZiB0ZXN0ICIke2FjX2N2X3BhdGhfQkNDK3NldH0iID0gc2V0OyB0aGVu
IDoKPiAgICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgo+ICBlbHNlCj4gLSAgaWYgdGVzdCAi
JGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgo+IC0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0
aW9uPTAKPiAtZWxzZQo+IC0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRh
Y19leHQKPiAtLyogZW5kIGNvbmZkZWZzLmguICAqLwo+IC0kYWNfaW5jbHVkZXNfZGVmYXVsdAo+
IC1pbnQKPiAtZmluZF9zdGFja19kaXJlY3Rpb24gKCkKPiAtewo+IC0gIHN0YXRpYyBjaGFyICph
ZGRyID0gMDsKPiAtICBhdXRvIGNoYXIgZHVtbXk7Cj4gLSAgaWYgKGFkZHIgPT0gMCkKPiAtICAg
IHsKPiAtICAgICAgYWRkciA9ICZkdW1teTsKPiAtICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGly
ZWN0aW9uICgpOwo+IC0gICAgfQo+IC0gIGVsc2UKPiAtICAgIHJldHVybiAoJmR1bW15ID4gYWRk
cikgPyAxIDogLTE7Cj4gLX0KPiArICBjYXNlICRCQ0MgaW4KPiArICBbXFwvXSogfCA/OltcXC9d
KikKPiArICBhY19jdl9wYXRoX0JDQz0iJEJDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhl
IHRlc3Qgd2l0aCBhIHBhdGguCj4gKyAgOzsKPiArICAqKQo+ICsgIGFzX3NhdmVfSUZTPSRJRlM7
IElGUz0kUEFUSF9TRVBBUkFUT1IKPiArZm9yIGFzX2RpciBpbiAkUEFUSAo+ICtkbwo+ICsgIElG
Uz0kYXNfc2F2ZV9JRlMKPiArICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+ICsgICAg
Zm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gKyAg
aWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94
ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+ICsgICAgYWNfY3ZfcGF0
aF9CQ0M9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCj4gKyAgICAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNf
ZXh0IiA+JjUKPiArICAgIGJyZWFrIDIKPiArICBmaQo+ICtkb25lCj4gKyAgZG9uZQo+ICtJRlM9
JGFzX3NhdmVfSUZTCj4gCj4gLWludAo+IC1tYWluICgpCj4gLXsKPiAtICByZXR1cm4gZmluZF9z
dGFja19kaXJlY3Rpb24gKCkgPCAwOwo+IC19Cj4gLV9BQ0VPRgo+IC1pZiBhY19mbl9jX3RyeV9y
dW4gIiRMSU5FTk8iOyB0aGVuIDoKPiAtICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCj4gLWVs
c2UKPiAtICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQo+IC1maQo+IC1ybSAtZiBjb3JlICou
Y29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBc
Cj4gLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQK
PiArICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9CQ0MiICYmIGFjX2N2X3BhdGhfQkNDPSJubyIKPiAr
ICA7Owo+ICtlc2FjCj4gIGZpCj4gLQo+ICtCQ0M9JGFjX2N2X3BhdGhfQkNDCj4gK2lmIHRlc3Qg
LW4gIiRCQ0MiOyB0aGVuCj4gKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiByZXN1bHQ6ICRCQ0MiID4mNQo+ICskYXNfZWNobyAiJEJDQyIgPiY2OyB9Cj4gK2Vsc2UK
PiArICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8i
ID4mNQo+ICskYXNfZWNobyAibm8iID4mNjsgfQo+ICBmaQo+IC17ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiA+
JjUKPiAtJGFzX2VjaG8gIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgPiY2OyB9Cj4gLWNhdCA+
PmNvbmZkZWZzLmggPDxfQUNFT0YKPiAtI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nf
c3RhY2tfZGlyZWN0aW9uCj4gLV9BQ0VPRgo+IAo+IAo+ICtpZiB0ZXN0IHgiJHtCQ0N9IiA9PSB4
Im5vIgo+ICt0aGVuCj4gKyAgICBhc19mbl9lcnJvciAkPyAiVW5hYmxlIHRvIGZpbmQgYmNjLCBw
bGVhc2UgaW5zdGFsbCBiY2MiICIkTElORU5PIiA1Cj4gIGZpCj4gKyMgRXh0cmFjdCB0aGUgZmly
c3Qgd29yZCBvZiAiaWFzbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3Mu
Cj4gK3NldCBkdW1teSBpYXNsOyBhY193b3JkPSQyCj4gK3sgJGFzX2VjaG8gIiRhc19tZToke2Fz
X2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKPiArJGFzX2VjaG9f
biAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cj4gK2lmIHRlc3QgIiR7YWNfY3Zf
cGF0aF9JQVNMK3NldH0iID0gc2V0OyB0aGVuIDoKPiArICAkYXNfZWNob19uICIoY2FjaGVkKSAi
ID4mNgo+ICtlbHNlCj4gKyAgY2FzZSAkSUFTTCBpbgo+ICsgIFtcXC9dKiB8ID86W1xcL10qKQo+
ICsgIGFjX2N2X3BhdGhfSUFTTD0iJElBU0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0
ZXN0IHdpdGggYSBwYXRoLgo+ICsgIDs7Cj4gKyAgKikKPiArICBhc19zYXZlX0lGUz0kSUZTOyBJ
RlM9JFBBVEhfU0VQQVJBVE9SCj4gK2ZvciBhc19kaXIgaW4gJFBBVEgKPiArZG8KPiArICBJRlM9
JGFzX3NhdmVfSUZTCj4gKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KPiArICAgIGZv
ciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwo+ICsgIGlm
IHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAi
JGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KPiArICAgIGFjX2N2X3BhdGhf
SUFTTD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKPiArICAgICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19l
eHQiID4mNQo+ICsgICAgYnJlYWsgMgo+ICsgIGZpCj4gK2RvbmUKPiArICBkb25lCj4gK0lGUz0k
YXNfc2F2ZV9JRlMKPiAKPiAtZm9yIGFjX2hlYWRlciBpbiAgXAo+IC0gICAgICAgICAgICAgICAg
YXJwYS9pbmV0LmggZmNudGwuaCBpbnR0eXBlcy5oIGxpYmludGwuaCBsaW1pdHMuaCBtYWxsb2Mu
aCBcCj4gLSAgICAgICAgICAgICAgICBuZXRkYi5oIG5ldGluZXQvaW4uaCBzdGRkZWYuaCBzdGRp
bnQuaCBzdGRsaWIuaCBzdHJpbmcuaCBcCj4gLSAgICAgICAgICAgICAgICBzdHJpbmdzLmggc3lz
L2ZpbGUuaCBzeXMvaW9jdGwuaCBzeXMvbW91bnQuaCBzeXMvcGFyYW0uaCBcCj4gLSAgICAgICAg
ICAgICAgICBzeXMvc29ja2V0Lmggc3lzL3N0YXR2ZnMuaCBzeXMvdGltZS5oIHN5c2xvZy5oIHRl
cm1pb3MuaCBcCj4gLSAgICAgICAgICAgICAgICB1bmlzdGQuaCB5YWpsL3lhamxfdmVyc2lvbi5o
IFwKPiArICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9JQVNMIiAmJiBhY19jdl9wYXRoX0lBU0w9Im5v
Igo+ICsgIDs7Cj4gK2VzYWMKPiArZmkKPiArSUFTTD0kYWNfY3ZfcGF0aF9JQVNMCj4gK2lmIHRl
c3QgLW4gIiRJQVNMIjsgdGhlbgo+ICsgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogcmVzdWx0OiAkSUFTTCIgPiY1Cj4gKyRhc19lY2hvICIkSUFTTCIgPiY2OyB9Cj4g
K2Vsc2UKPiArICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogbm8iID4mNQo+ICskYXNfZWNobyAibm8iID4mNjsgfQo+ICtmaQo+IAo+IC1kbyA6Cj4gLSAg
YXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3Ry
X3NoYAo+IC1hY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiJGFjX2hlYWRl
ciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKPiAtaWYgZXZhbCB0ZXN0
IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgo+IC0gIGNhdCA+PmNvbmZk
ZWZzLmggPDxfQUNFT0YKPiAtI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAk
YXNfdHJfY3BwYCAxCj4gLV9BQ0VPRgo+IAo+ICtpZiB0ZXN0IHgiJHtJQVNMfSIgPT0geCJubyIK
PiArdGhlbgo+ICsgICAgYXNfZm5fZXJyb3IgJD8gIlVuYWJsZSB0byBmaW5kIGlhc2wsIHBsZWFz
ZSBpbnN0YWxsIGlhc2wiICIkTElORU5PIiA1Cj4gIGZpCj4gCj4gLWRvbmUKPiAtCj4gK2FjX2Zu
X2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJ1dWlkL3V1aWQuaCIgImFjX2N2X2hl
YWRlcl91dWlkX3V1aWRfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0Igo+ICtpZiB0ZXN0ICJ4JGFj
X2N2X2hlYWRlcl91dWlkX3V1aWRfaCIgPSB4IiJ5ZXM7IHRoZW4gOgo+IAo+IC0jIENoZWNrcyBm
b3IgdHlwZWRlZnMsIHN0cnVjdHVyZXMsIGFuZCBjb21waWxlciBjaGFyYWN0ZXJpc3RpY3MuCj4g
LXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0
ZGJvb2wuaCB0aGF0IGNvbmZvcm1zIHRvIEM5OSIgPiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5n
IGZvciBzdGRib29sLmggdGhhdCBjb25mb3JtcyB0byBDOTkuLi4gIiA+JjY7IH0KPiAtaWYgdGVz
dCAiJHthY19jdl9oZWFkZXJfc3RkYm9vbF9oK3NldH0iID0gc2V0OyB0aGVuIDoKPiArICAgIHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHV1aWRf
Y2xlYXIgaW4gLWx1dWlkIiA+JjUKPiArJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHV1aWRfY2xl
YXIgaW4gLWx1dWlkLi4uICIgPiY2OyB9Cj4gK2lmIHRlc3QgIiR7YWNfY3ZfbGliX3V1aWRfdXVp
ZF9jbGVhcitzZXR9IiA9IHNldDsgdGhlbiA6Cj4gICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+
JjYKPiAgZWxzZQo+IC0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19l
eHQKPiArICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCj4gK0xJQlM9Ii1sdXVpZCAgJExJ
QlMiCj4gK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKPiAgLyog
ZW5kIGNvbmZkZWZzLmguICAqLwo+IAo+IC0jaW5jbHVkZSA8c3RkYm9vbC5oPgo+IC0jaWZuZGVm
IGJvb2wKPiAtICJlcnJvcjogYm9vbCBpcyBub3QgZGVmaW5lZCIKPiAtI2VuZGlmCj4gLSNpZm5k
ZWYgZmFsc2UKPiAtICJlcnJvcjogZmFsc2UgaXMgbm90IGRlZmluZWQiCj4gLSNlbmRpZgo+IC0j
aWYgZmFsc2UKPiAtICJlcnJvcjogZmFsc2UgaXMgbm90IDAiCj4gLSNlbmRpZgo+IC0jaWZuZGVm
IHRydWUKPiAtICJlcnJvcjogdHJ1ZSBpcyBub3QgZGVmaW5lZCIKPiAtI2VuZGlmCj4gLSNpZiB0
cnVlICE9IDEKPiAtICJlcnJvcjogdHJ1ZSBpcyBub3QgMSIKPiAtI2VuZGlmCj4gLSNpZm5kZWYg
X19ib29sX3RydWVfZmFsc2VfYXJlX2RlZmluZWQKPiAtICJlcnJvcjogX19ib29sX3RydWVfZmFs
c2VfYXJlX2RlZmluZWQgaXMgbm90IGRlZmluZWQiCj4gKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50
ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgo+ICsgICBVc2UgY2hhciBiZWNhdXNl
IGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKPiArICAgYnVpbHRpbiBh
bmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KPiAr
I2lmZGVmIF9fY3BsdXNwbHVzCj4gK2V4dGVybiAiQyIKPiAgI2VuZGlmCj4gLQo+IC0gICAgICAg
c3RydWN0IHMgeyBfQm9vbCBzOiAxOyBfQm9vbCB0OyB9IHM7Cj4gLQo+IC0gICAgICAgY2hhciBh
W3RydWUgPT0gMSA/IDEgOiAtMV07Cj4gLSAgICAgICBjaGFyIGJbZmFsc2UgPT0gMCA/IDEgOiAt
MV07Cj4gLSAgICAgICBjaGFyIGNbX19ib29sX3RydWVfZmFsc2VfYXJlX2RlZmluZWQgPT0gMSA/
IDEgOiAtMV07Cj4gLSAgICAgICBjaGFyIGRbKGJvb2wpIDAuNSA9PSB0cnVlID8gMSA6IC0xXTsK
PiAtICAgICAgIGJvb2wgZSA9ICZzOwo+IC0gICAgICAgY2hhciBmWyhfQm9vbCkgMC4wID09IGZh
bHNlID8gMSA6IC0xXTsKPiAtICAgICAgIGNoYXIgZ1t0cnVlXTsKPiAtICAgICAgIGNoYXIgaFtz
aXplb2YgKF9Cb29sKV07Cj4gLSAgICAgICBjaGFyIGlbc2l6ZW9mIHMudF07Cj4gLSAgICAgICBl
bnVtIHsgaiA9IGZhbHNlLCBrID0gdHJ1ZSwgbCA9IGZhbHNlICogdHJ1ZSwgbSA9IHRydWUgKiAy
NTYgfTsKPiAtICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgZmFpbHMgZm9yCj4gLSAgICAgICAgICBI
UCBhQysrL0FOU0kgQyBCMzkxMEIgQS4wNS41NSBbRGVjIDA0IDIwMDNdLiAqLwo+IC0gICAgICAg
X0Jvb2wgblttXTsKPiAtICAgICAgIGNoYXIgb1tzaXplb2YgbiA9PSBtICogc2l6ZW9mIG5bMF0g
PyAxIDogLTFdOwo+IC0gICAgICAgY2hhciBwWy0xIC0gKF9Cb29sKSAwIDwgMCAmJiAtMSAtIChi
b29sKSAwIDwgMCA/IDEgOiAtMV07Cj4gLSMgICAgICBpZiBkZWZpbmVkIF9feGxjX18gfHwgZGVm
aW5lZCBfX0dOVUNfXwo+IC0gICAgICAgIC8qIENhdGNoIGEgYnVnIGluIElCTSBBSVggeGxjIGNv
bXBpbGVyIHZlcnNpb24gNi4wLjAuMAo+IC0gICAgICAgICAgIHJlcG9ydGVkIGJ5IEphbWVzIExl
bWxleSBvbiAyMDA1LTEwLTA1OyBzZWUKPiAtICAgICAgICAgICBodHRwOi8vbGlzdHMuZ251Lm9y
Zy9hcmNoaXZlL2h0bWwvYnVnLWNvcmV1dGlscy8yMDA1LTEwL21zZzAwMDg2Lmh0bWwKPiAtICAg
ICAgICAgICBUaGlzIHRlc3QgaXMgbm90IHF1aXRlIHJpZ2h0LCBzaW5jZSB4bGMgaXMgYWxsb3dl
ZCB0bwo+IC0gICAgICAgICAgIHJlamVjdCB0aGlzIHByb2dyYW0sIGFzIHRoZSBpbml0aWFsaXpl
ciBmb3IgeGxjYnVnIGlzCj4gLSAgICAgICAgICAgbm90IG9uZSBvZiB0aGUgZm9ybXMgdGhhdCBD
IHJlcXVpcmVzIHN1cHBvcnQgZm9yLgo+IC0gICAgICAgICAgIEhvd2V2ZXIsIGRvaW5nIHRoZSB0
ZXN0IHJpZ2h0IHdvdWxkIHJlcXVpcmUgYSBydW50aW1lCj4gLSAgICAgICAgICAgdGVzdCwgYW5k
IHRoYXQgd291bGQgbWFrZSBjcm9zcy1jb21waWxhdGlvbiBoYXJkZXIuCj4gLSAgICAgICAgICAg
TGV0IHVzIGhvcGUgdGhhdCBJQk0gZml4ZXMgdGhlIHhsYyBidWcsIGFuZCBhbHNvIGFkZHMKPiAt
ICAgICAgICAgICBzdXBwb3J0IGZvciB0aGlzIGtpbmQgb2YgY29uc3RhbnQgZXhwcmVzc2lvbi4g
IEluIHRoZQo+IC0gICAgICAgICAgIG1lYW50aW1lLCB0aGlzIHRlc3Qgd2lsbCByZWplY3QgeGxj
LCB3aGljaCBpcyBPSywgc2luY2UKPiAtICAgICAgICAgICBvdXIgc3RkYm9vbC5oIHN1YnN0aXR1
dGUgc2hvdWxkIHN1ZmZpY2UuICBXZSBhbHNvIHRlc3QKPiAtICAgICAgICAgICB0aGlzIHdpdGgg
R0NDLCB3aGVyZSBpdCBzaG91bGQgd29yaywgdG8gZGV0ZWN0IG1vcmUKPiAtICAgICAgICAgICBx
dWlja2x5IHdoZXRoZXIgc29tZW9uZSBtZXNzZXMgdXAgdGhlIHRlc3QgaW4gdGhlCj4gLSAgICAg
ICAgICAgZnV0dXJlLiAgKi8KPiAtICAgICAgICBjaGFyIGRpZ3NbXSA9ICIwMTIzNDU2Nzg5IjsK
PiAtICAgICAgICBpbnQgeGxjYnVnID0gMSAvICgmKGRpZ3MgKyA1KVstMiArIChib29sKSAxXSA9
PSAmZGlnc1s0XSA/IDEgOiAtMSk7Cj4gLSMgICAgICBlbmRpZgo+IC0gICAgICAgLyogQ2F0Y2gg
YSBidWcgaW4gYW4gSFAtVVggQyBjb21waWxlci4gIFNlZQo+IC0gICAgICAgICAgaHR0cDovL2dj
Yy5nbnUub3JnL21sL2djYy1wYXRjaGVzLzIwMDMtMTIvbXNnMDIzMDMuaHRtbAo+IC0gICAgICAg
ICAgaHR0cDovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2J1Zy1jb3JldXRpbHMvMjAwNS0x
MS9tc2cwMDE2MS5odG1sCj4gLSAgICAgICAgKi8KPiAtICAgICAgIF9Cb29sIHEgPSB0cnVlOwo+
IC0gICAgICAgX0Jvb2wgKnBxID0gJnE7Cj4gLQo+ICtjaGFyIHV1aWRfY2xlYXIgKCk7Cj4gIGlu
dAo+ICBtYWluICgpCj4gIHsKPiAtCj4gLSAgICAgICAqcHEgfD0gcTsKPiAtICAgICAgICpwcSB8
PSAhIHE7Cj4gLSAgICAgICAvKiBSZWZlciB0byBldmVyeSBkZWNsYXJlZCB2YWx1ZSwgdG8gYXZv
aWQgY29tcGlsZXIgb3B0aW1pemF0aW9ucy4gICovCj4gLSAgICAgICByZXR1cm4gKCFhICsgIWIg
KyAhYyArICFkICsgIWUgKyAhZiArICFnICsgIWggKyAhaSArICEhaiArICFrICsgISFsCj4gLSAg
ICAgICAgICAgICAgICsgIW0gKyAhbiArICFvICsgIXAgKyAhcSArICFwcSk7Cj4gLQo+ICtyZXR1
cm4gdXVpZF9jbGVhciAoKTsKPiAgICA7Cj4gICAgcmV0dXJuIDA7Cj4gIH0KPiAgX0FDRU9GCj4g
LWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKPiAtICBhY19jdl9oZWFk
ZXJfc3RkYm9vbF9oPXllcwo+IC1lbHNlCj4gLSAgYWNfY3ZfaGVhZGVyX3N0ZGJvb2xfaD1ubwo+
IC1maQo+IC1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0
ZXN0LiRhY19leHQKPiAtZmkKPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYm9vbF9oIiA+JjUKPiAtJGFzX2VjaG8gIiRh
Y19jdl9oZWFkZXJfc3RkYm9vbF9oIiA+JjY7IH0KPiAtYWNfZm5fY19jaGVja190eXBlICIkTElO
RU5PIiAiX0Jvb2wiICJhY19jdl90eXBlX19Cb29sIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCj4g
LWlmIHRlc3QgIngkYWNfY3ZfdHlwZV9fQm9vbCIgPSB4IiJ5ZXM7IHRoZW4gOgo+IC0KPiAtY2F0
ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgo+IC0jZGVmaW5lIEhBVkVfX0JPT0wgMQo+IC1fQUNFT0YK
PiAtCj4gLQo+IC1maQo+IC0KPiAtaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGJvb2xfaCA9IHll
czsgdGhlbgo+IC0KPiAtJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TVERCT09MX0ggMSIgPj5jb25m
ZGVmcy5oCj4gLQo+IC1maQo+IC0KPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBjaGVja2luZyBmb3IgdWlkX3QgaW4gc3lzL3R5cGVzLmgiID4mNQo+IC0kYXNfZWNo
b19uICJjaGVja2luZyBmb3IgdWlkX3QgaW4gc3lzL3R5cGVzLmguLi4gIiA+JjY7IH0KPiAtaWYg
dGVzdCAiJHthY19jdl90eXBlX3VpZF90K3NldH0iID0gc2V0OyB0aGVuIDoKPiAtICAkYXNfZWNo
b19uICIoY2FjaGVkKSAiID4mNgo+IC1lbHNlCj4gLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VP
RiA+Y29uZnRlc3QuJGFjX2V4dAo+IC0vKiBlbmQgY29uZmRlZnMuaC4gICovCj4gLSNpbmNsdWRl
IDxzeXMvdHlwZXMuaD4KPiAtCj4gLV9BQ0VPRgo+IC1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVz
dC4kYWNfZXh0IikgMj4mNSB8Cj4gLSAgJEVHUkVQICJ1aWRfdCIgPi9kZXYvbnVsbCAyPiYxOyB0
aGVuIDoKPiAtICBhY19jdl90eXBlX3VpZF90PXllcwo+IC1lbHNlCj4gLSAgYWNfY3ZfdHlwZV91
aWRfdD1ubwo+IC1maQo+IC1ybSAtZiBjb25mdGVzdCoKPiAtCj4gLWZpCj4gLXsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfdHlwZV91aWRfdCIg
PiY1Cj4gLSRhc19lY2hvICIkYWNfY3ZfdHlwZV91aWRfdCIgPiY2OyB9Cj4gLWlmIHRlc3QgJGFj
X2N2X3R5cGVfdWlkX3QgPSBubzsgdGhlbgo+IC0KPiAtJGFzX2VjaG8gIiNkZWZpbmUgdWlkX3Qg
aW50IiA+PmNvbmZkZWZzLmgKPiAtCj4gLQo+IC0kYXNfZWNobyAiI2RlZmluZSBnaWRfdCBpbnQi
ID4+Y29uZmRlZnMuaAo+IC0KPiAtZmkKPiAtCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp
bmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Cj4gLSRhc19lY2hvX24gImNo
ZWNraW5nIGZvciBpbmxpbmUuLi4gIiA+JjY7IH0KPiAtaWYgdGVzdCAiJHthY19jdl9jX2lubGlu
ZStzZXR9IiA9IHNldDsgdGhlbiA6Cj4gLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAt
ZWxzZQo+IC0gIGFjX2N2X2NfaW5saW5lPW5vCj4gLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxp
bmVfXyBfX2lubGluZTsgZG8KPiAtICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVz
dC4kYWNfZXh0Cj4gLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KPiAtI2lmbmRlZiBfX2NwbHVzcGx1
cwo+IC10eXBlZGVmIGludCBmb29fdDsKPiAtc3RhdGljICRhY19rdyBmb29fdCBzdGF0aWNfZm9v
ICgpIHtyZXR1cm4gMDsgfQo+IC0kYWNfa3cgZm9vX3QgZm9vICgpIHtyZXR1cm4gMDsgfQo+IC0j
ZW5kaWYKPiAtCj4gLV9BQ0VPRgo+IC1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsg
dGhlbiA6Cj4gLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3Cj4gK2lmIGFjX2ZuX2NfdHJ5X2xpbmsg
IiRMSU5FTk8iOyB0aGVuIDoKPiArICBhY19jdl9saWJfdXVpZF91dWlkX2NsZWFyPXllcwo+ICtl
bHNlCj4gKyAgYWNfY3ZfbGliX3V1aWRfdXVpZF9jbGVhcj1ubwo+ICBmaQo+IC1ybSAtZiBjb3Jl
IGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKPiAtICB0
ZXN0ICIkYWNfY3ZfY19pbmxpbmUiICE9IG5vICYmIGJyZWFrCj4gLWRvbmUKPiAtCj4gK3JtIC1m
IGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAo+ICsgICAgY29uZnRlc3Qk
YWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKPiArTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElC
Uwo+ICtmaQo+ICt7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJGFjX2N2X2xpYl91dWlkX3V1aWRfY2xlYXIiID4mNQo+ICskYXNfZWNobyAiJGFjX2N2X2xp
Yl91dWlkX3V1aWRfY2xlYXIiID4mNjsgfQo+ICtpZiB0ZXN0ICJ4JGFjX2N2X2xpYl91dWlkX3V1
aWRfY2xlYXIiID0geCIieWVzOyB0aGVuIDoKPiArICBsaWJ1dWlkPSJ5Igo+ICBmaQo+IC17ICRh
c19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfaW5s
aW5lIiA+JjUKPiAtJGFzX2VjaG8gIiRhY19jdl9jX2lubGluZSIgPiY2OyB9Cj4gCj4gLWNhc2Ug
JGFjX2N2X2NfaW5saW5lIGluCj4gLSAgaW5saW5lIHwgeWVzKSA7Owo+IC0gICopCj4gLSAgICBj
YXNlICRhY19jdl9jX2lubGluZSBpbgo+IC0gICAgICBubykgYWNfdmFsPTs7Cj4gLSAgICAgICop
IGFjX3ZhbD0kYWNfY3ZfY19pbmxpbmU7Owo+IC0gICAgZXNhYwo+IC0gICAgY2F0ID4+Y29uZmRl
ZnMuaCA8PF9BQ0VPRgo+IC0jaWZuZGVmIF9fY3BsdXNwbHVzCj4gLSNkZWZpbmUgaW5saW5lICRh
Y192YWwKPiAtI2VuZGlmCj4gLV9BQ0VPRgo+IC0gICAgOzsKPiAtZXNhYwo+IAo+IC1hY19mbl9j
X2ZpbmRfaW50WF90ICIkTElORU5PIiAiMTYiICJhY19jdl9jX2ludDE2X3QiCj4gLWNhc2UgJGFj
X2N2X2NfaW50MTZfdCBpbiAjKAo+IC0gIG5vfHllcykgOzsgIygKPiAtICAqKQo+ICtmaQo+IAo+
IC1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCj4gLSNkZWZpbmUgaW50MTZfdCAkYWNfY3ZfY19p
bnQxNl90Cj4gLV9BQ0VPRgo+IC07Owo+IC1lc2FjCj4gCj4gLWFjX2ZuX2NfZmluZF9pbnRYX3Qg
IiRMSU5FTk8iICIzMiIgImFjX2N2X2NfaW50MzJfdCIKPiAtY2FzZSAkYWNfY3ZfY19pbnQzMl90
IGluICMoCj4gLSAgbm98eWVzKSA7OyAjKAo+IC0gICopCj4gK2FjX2ZuX2NfY2hlY2tfaGVhZGVy
X21vbmdyZWwgIiRMSU5FTk8iICJ1dWlkLmgiICJhY19jdl9oZWFkZXJfdXVpZF9oIiAiJGFjX2lu
Y2x1ZGVzX2RlZmF1bHQiCj4gK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3V1aWRfaCIgPSB4IiJ5
ZXM7IHRoZW4gOgo+ICsgIGxpYnV1aWQ9InkiCj4gK2ZpCj4gCj4gLWNhdCA+PmNvbmZkZWZzLmgg
PDxfQUNFT0YKPiAtI2RlZmluZSBpbnQzMl90ICRhY19jdl9jX2ludDMyX3QKPiAtX0FDRU9GCj4g
LTs7Cj4gLWVzYWMKPiAKPiAtYWNfZm5fY19maW5kX2ludFhfdCAiJExJTkVOTyIgIjY0IiAiYWNf
Y3ZfY19pbnQ2NF90Igo+IC1jYXNlICRhY19jdl9jX2ludDY0X3QgaW4gIygKPiAtICBub3x5ZXMp
IDs7ICMoCj4gLSAgKikKPiAraWYgdGVzdCAiJGxpYnV1aWQiICE9ICJ5IjsgdGhlbiA6Cj4gCj4g
LWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKPiAtI2RlZmluZSBpbnQ2NF90ICRhY19jdl9jX2lu
dDY0X3QKPiAtX0FDRU9GCj4gLTs7Cj4gLWVzYWMKPiArICAgIGFzX2ZuX2Vycm9yICQ/ICJjYW5u
b3QgZmluZCBhIHZhbGlkIHV1aWQgbGlicmFyeSIgIiRMSU5FTk8iIDUKPiAKPiAtYWNfZm5fY19m
aW5kX2ludFhfdCAiJExJTkVOTyIgIjgiICJhY19jdl9jX2ludDhfdCIKPiAtY2FzZSAkYWNfY3Zf
Y19pbnQ4X3QgaW4gIygKPiAtICBub3x5ZXMpIDs7ICMoCj4gLSAgKikKPiArZmkKPiAKPiAtY2F0
ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgo+IC0jZGVmaW5lIGludDhfdCAkYWNfY3ZfY19pbnQ4X3QK
PiAtX0FDRU9GCj4gLTs7Cj4gLWVzYWMKPiAKPiAtYWNfZm5fY19jaGVja190eXBlICIkTElORU5P
IiAibW9kZV90IiAiYWNfY3ZfdHlwZV9tb2RlX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKPiAt
aWYgdGVzdCAieCRhY19jdl90eXBlX21vZGVfdCIgPSB4IiJ5ZXM7IHRoZW4gOgo+ICthY19mbl9j
X2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiY3Vyc2VzLmgiICJhY19jdl9oZWFkZXJf
Y3Vyc2VzX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKPiAraWYgdGVzdCAieCRhY19jdl9oZWFk
ZXJfY3Vyc2VzX2giID0geCIieWVzOyB0aGVuIDoKPiAKPiArICAgIHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGNsZWFyIGluIC1sY3Vyc2VzIiA+
JjUKPiArJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGNsZWFyIGluIC1sY3Vyc2VzLi4uICIgPiY2
OyB9Cj4gK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2N1cnNlc19jbGVhcitzZXR9IiA9IHNldDsgdGhl
biA6Cj4gKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAgZWxzZQo+ICsgIGFjX2NoZWNr
X2xpYl9zYXZlX0xJQlM9JExJQlMKPiArTElCUz0iLWxjdXJzZXMgICRMSUJTIgo+ICtjYXQgY29u
ZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Cj4gKy8qIGVuZCBjb25mZGVmcy5o
LiAgKi8KPiAKPiAtY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgo+IC0jZGVmaW5lIG1vZGVfdCBp
bnQKPiArLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4g
ZXJyb3IuCj4gKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4g
dHlwZSBvZiBhIEdDQwo+ICsgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5
cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwo+ICsjaWZkZWYgX19jcGx1c3BsdXMKPiArZXh0ZXJu
ICJDIgo+ICsjZW5kaWYKPiArY2hhciBjbGVhciAoKTsKPiAraW50Cj4gK21haW4gKCkKPiArewo+
ICtyZXR1cm4gY2xlYXIgKCk7Cj4gKyAgOwo+ICsgIHJldHVybiAwOwo+ICt9Cj4gIF9BQ0VPRgo+
IC0KPiAraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgo+ICsgIGFjX2N2X2xp
Yl9jdXJzZXNfY2xlYXI9eWVzCj4gK2Vsc2UKPiArICBhY19jdl9saWJfY3Vyc2VzX2NsZWFyPW5v
Cj4gIGZpCj4gLQo+IC1hY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJvZmZfdCIgImFjX2N2
X3R5cGVfb2ZmX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKPiAtaWYgdGVzdCAieCRhY19jdl90
eXBlX29mZl90IiA9IHgiInllczsgdGhlbiA6Cj4gLQo+ICtybSAtZiBjb3JlIGNvbmZ0ZXN0LmVy
ciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKPiArICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVz
dC4kYWNfZXh0Cj4gK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKPiArZmkKPiAreyAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfY3Vy
c2VzX2NsZWFyIiA+JjUKPiArJGFzX2VjaG8gIiRhY19jdl9saWJfY3Vyc2VzX2NsZWFyIiA+JjY7
IH0KPiAraWYgdGVzdCAieCRhY19jdl9saWJfY3Vyc2VzX2NsZWFyIiA9IHgiInllczsgdGhlbiA6
Cj4gKyAgY3Vyc2VzPSJ5Igo+ICBlbHNlCj4gLQo+IC1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9G
Cj4gLSNkZWZpbmUgb2ZmX3QgbG9uZyBpbnQKPiAtX0FDRU9GCj4gLQo+ICsgIGN1cnNlcz0ibiIK
PiAgZmkKPiAKPiAtYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAicGlkX3QiICJhY19jdl90
eXBlX3BpZF90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCj4gLWlmIHRlc3QgIngkYWNfY3ZfdHlw
ZV9waWRfdCIgPSB4IiJ5ZXM7IHRoZW4gOgo+IAo+ICBlbHNlCj4gKyAgY3Vyc2VzPSJuIgo+ICtm
aQo+IAo+IC1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCj4gLSNkZWZpbmUgcGlkX3QgaW50Cj4g
LV9BQ0VPRgo+IAo+IC1maQo+ICthY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5P
IiAibmN1cnNlcy5oIiAiYWNfY3ZfaGVhZGVyX25jdXJzZXNfaCIgIiRhY19pbmNsdWRlc19kZWZh
dWx0Igo+ICtpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9uY3Vyc2VzX2giID0geCIieWVzOyB0aGVu
IDoKPiAKPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2lu
ZyBmb3IgQy9DKysgcmVzdHJpY3Qga2V5d29yZCIgPiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5n
IGZvciBDL0MrKyByZXN0cmljdCBrZXl3b3JkLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNf
Y3ZfY19yZXN0cmljdCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gKyAgICB7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBjbGVhciBpbiAtbG5jdXJzZXMi
ID4mNQo+ICskYXNfZWNob19uICJjaGVja2luZyBmb3IgY2xlYXIgaW4gLWxuY3Vyc2VzLi4uICIg
PiY2OyB9Cj4gK2lmIHRlc3QgIiR7YWNfY3ZfbGliX25jdXJzZXNfY2xlYXIrc2V0fSIgPSBzZXQ7
IHRoZW4gOgo+ICAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gIGVsc2UKPiAtICBhY19j
dl9jX3Jlc3RyaWN0PW5vCj4gLSAgICMgVGhlIG9yZGVyIGhlcmUgY2F0ZXJzIHRvIHRoZSBmYWN0
IHRoYXQgQysrIGRvZXMgbm90IHJlcXVpcmUgcmVzdHJpY3QuCj4gLSAgIGZvciBhY19rdyBpbiBf
X3Jlc3RyaWN0IF9fcmVzdHJpY3RfXyBfUmVzdHJpY3QgcmVzdHJpY3Q7IGRvCj4gLSAgICAgY2F0
IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAo+ICsgIGFjX2NoZWNrX2xp
Yl9zYXZlX0xJQlM9JExJQlMKPiArTElCUz0iLWxuY3Vyc2VzICAkTElCUyIKPiArY2F0IGNvbmZk
ZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAo+ICAvKiBlbmQgY29uZmRlZnMuaC4g
ICovCj4gLXR5cGVkZWYgaW50ICogaW50X3B0cjsKPiAtICAgICAgIGludCBmb28gKGludF9wdHIg
JGFjX2t3IGlwKSB7Cj4gLSAgICAgICByZXR1cm4gaXBbMF07Cj4gLSAgICAgICB9Cj4gKwo+ICsv
KiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4K
PiArICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9m
IGEgR0NDCj4gKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3Vs
ZCBzdGlsbCBhcHBseS4gICovCj4gKyNpZmRlZiBfX2NwbHVzcGx1cwo+ICtleHRlcm4gIkMiCj4g
KyNlbmRpZgo+ICtjaGFyIGNsZWFyICgpOwo+ICBpbnQKPiAgbWFpbiAoKQo+ICB7Cj4gLWludCBz
WzFdOwo+IC0gICAgICAgaW50ICogJGFjX2t3IHQgPSBzOwo+IC0gICAgICAgdFswXSA9IDA7Cj4g
LSAgICAgICByZXR1cm4gZm9vKHQpCj4gK3JldHVybiBjbGVhciAoKTsKPiAgICA7Cj4gICAgcmV0
dXJuIDA7Cj4gIH0KPiAgX0FDRU9GCj4gLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8i
OyB0aGVuIDoKPiAtICBhY19jdl9jX3Jlc3RyaWN0PSRhY19rdwo+ICtpZiBhY19mbl9jX3RyeV9s
aW5rICIkTElORU5PIjsgdGhlbiA6Cj4gKyAgYWNfY3ZfbGliX25jdXJzZXNfY2xlYXI9eWVzCj4g
K2Vsc2UKPiArICBhY19jdl9saWJfbmN1cnNlc19jbGVhcj1ubwo+ICBmaQo+IC1ybSAtZiBjb3Jl
IGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKPiAtICAg
ICB0ZXN0ICIkYWNfY3ZfY19yZXN0cmljdCIgIT0gbm8gJiYgYnJlYWsKPiAtICAgZG9uZQo+IC0K
PiArcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCj4gKyAgICBj
b25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAo+ICtMSUJTPSRhY19jaGVja19saWJf
c2F2ZV9MSUJTCj4gIGZpCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogcmVzdWx0OiAkYWNfY3ZfY19yZXN0cmljdCIgPiY1Cj4gLSRhc19lY2hvICIkYWNfY3ZfY19y
ZXN0cmljdCIgPiY2OyB9Cj4gLQo+IC0gY2FzZSAkYWNfY3ZfY19yZXN0cmljdCBpbgo+IC0gICBy
ZXN0cmljdCkgOzsKPiAtICAgbm8pICRhc19lY2hvICIjZGVmaW5lIHJlc3RyaWN0IC8qKi8iID4+
Y29uZmRlZnMuaAo+IC0gOzsKPiAtICAgKikgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKPiAt
I2RlZmluZSByZXN0cmljdCAkYWNfY3ZfY19yZXN0cmljdAo+IC1fQUNFT0YKPiAtIDs7Cj4gLSBl
c2FjCj4gLQo+IC1hY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzaXplX3QiICJhY19jdl90
eXBlX3NpemVfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0Igo+IC1pZiB0ZXN0ICJ4JGFjX2N2X3R5
cGVfc2l6ZV90IiA9IHgiInllczsgdGhlbiA6Cj4gLQo+ICt7ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9uY3Vyc2VzX2NsZWFyIiA+JjUK
PiArJGFzX2VjaG8gIiRhY19jdl9saWJfbmN1cnNlc19jbGVhciIgPiY2OyB9Cj4gK2lmIHRlc3Qg
IngkYWNfY3ZfbGliX25jdXJzZXNfY2xlYXIiID0geCIieWVzOyB0aGVuIDoKPiArICBuY3Vyc2Vz
PSJ5Igo+ICBlbHNlCj4gLQo+IC1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCj4gLSNkZWZpbmUg
c2l6ZV90IHVuc2lnbmVkIGludAo+IC1fQUNFT0YKPiAtCj4gKyAgbmN1cnNlcz0ibiIKPiAgZmkK
PiAKPiAtYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAic3NpemVfdCIgImFjX2N2X3R5cGVf
c3NpemVfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0Igo+IC1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVf
c3NpemVfdCIgPSB4IiJ5ZXM7IHRoZW4gOgo+IAo+ICBlbHNlCj4gLQo+IC1jYXQgPj5jb25mZGVm
cy5oIDw8X0FDRU9GCj4gLSNkZWZpbmUgc3NpemVfdCBpbnQKPiAtX0FDRU9GCj4gLQo+ICsgIG5j
dXJzZXM9Im4iCj4gIGZpCj4gCj4gLWFjX2ZuX2NfY2hlY2tfbWVtYmVyICIkTElORU5PIiAic3Ry
dWN0IHN0YXQiICJzdF9ibGtzaXplIiAiYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2Jsa3Np
emUiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKPiAtaWYgdGVzdCAieCRhY19jdl9tZW1iZXJfc3Ry
dWN0X3N0YXRfc3RfYmxrc2l6ZSIgPSB4IiJ5ZXM7IHRoZW4gOgo+IAo+IC1jYXQgPj5jb25mZGVm
cy5oIDw8X0FDRU9GCj4gLSNkZWZpbmUgSEFWRV9TVFJVQ1RfU1RBVF9TVF9CTEtTSVpFIDEKPiAt
X0FDRU9GCj4gK2lmIHRlc3QgIiRjdXJzZXMiID0gIm4iICYmIHRlc3QgIiRuY3Vyc2VzIiA9ICJu
IjsgdGhlbiA6Cj4gCj4gKyAgICBhc19mbl9lcnJvciAkPyAiVW5hYmxlIHRvIGZpbmQgYSBzdWl0
YWJsZSBjdXJzZXMgbGlicmFyeSIgIiRMSU5FTk8iIDUKPiAKPiAgZmkKPiArIyBQcmVmZXIgbmN1
cnNlcyBvdmVyIGN1cnNlcyBpZiBib3RoIGFyZSBwcmVzZW50Cj4gK2lmIHRlc3QgIiRuY3Vyc2Vz
IiA9ICJ5IjsgdGhlbiA6Cj4gCj4gLWFjX2ZuX2NfY2hlY2tfbWVtYmVyICIkTElORU5PIiAic3Ry
dWN0IHN0YXQiICJzdF9ibG9ja3MiICJhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmxvY2tz
IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCj4gLWlmIHRlc3QgIngkYWNfY3ZfbWVtYmVyX3N0cnVj
dF9zdGF0X3N0X2Jsb2NrcyIgPSB4IiJ5ZXM7IHRoZW4gOgo+IC0KPiAtY2F0ID4+Y29uZmRlZnMu
aCA8PF9BQ0VPRgo+IC0jZGVmaW5lIEhBVkVfU1RSVUNUX1NUQVRfU1RfQkxPQ0tTIDEKPiAtX0FD
RU9GCj4gKyAgICBDVVJTRVNfTElCUz0iLWxuY3Vyc2VzIgo+IAo+ICskYXNfZWNobyAiI2RlZmlu
ZSBJTkNMVURFX0NVUlNFU19IIDxuY3Vyc2VzLmg+IiA+PmNvbmZkZWZzLmgKPiAKPiAtJGFzX2Vj
aG8gIiNkZWZpbmUgSEFWRV9TVF9CTE9DS1MgMSIgPj5jb25mZGVmcy5oCj4gCj4gIGVsc2UKPiAt
ICBjYXNlICIgJExJQk9CSlMgIiBpbgo+IC0gICoiIGZpbGVibG9ja3MuJGFjX29iamV4dCAiKiAp
IDs7Cj4gLSAgKikgTElCT0JKUz0iJExJQk9CSlMgZmlsZWJsb2Nrcy4kYWNfb2JqZXh0Igo+IC0g
OzsKPiAtZXNhYwo+IC0KPiAtZmkKPiAtCj4gCj4gLWFjX2ZuX2NfY2hlY2tfbWVtYmVyICIkTElO
RU5PIiAic3RydWN0IHN0YXQiICJzdF9yZGV2IiAiYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0
X3JkZXYiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKPiAtaWYgdGVzdCAieCRhY19jdl9tZW1iZXJf
c3RydWN0X3N0YXRfc3RfcmRldiIgPSB4IiJ5ZXM7IHRoZW4gOgo+ICsgICAgQ1VSU0VTX0xJQlM9
Ii1sY3Vyc2VzIgo+IAo+IC1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCj4gLSNkZWZpbmUgSEFW
RV9TVFJVQ1RfU1RBVF9TVF9SREVWIDEKPiAtX0FDRU9GCj4gKyRhc19lY2hvICIjZGVmaW5lIElO
Q0xVREVfQ1VSU0VTX0ggPGN1cnNlcy5oPiIgPj5jb25mZGVmcy5oCj4gCj4gCj4gIGZpCj4gCj4g
LWFjX2ZuX2NfZmluZF91aW50WF90ICIkTElORU5PIiAiMTYiICJhY19jdl9jX3VpbnQxNl90Igo+
IC1jYXNlICRhY19jdl9jX3VpbnQxNl90IGluICMoCj4gLSAgbm98eWVzKSA7OyAjKAo+IC0gICop
Cj4gCj4gCj4gLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKPiAtI2RlZmluZSB1aW50MTZfdCAk
YWNfY3ZfY191aW50MTZfdAo+IC1fQUNFT0YKPiAtOzsKPiAtICBlc2FjCj4gCj4gLWFjX2ZuX2Nf
ZmluZF91aW50WF90ICIkTElORU5PIiAiMzIiICJhY19jdl9jX3VpbnQzMl90Igo+IC1jYXNlICRh
Y19jdl9jX3VpbnQzMl90IGluICMoCj4gLSAgbm98eWVzKSA7OyAjKAo+IC0gICopCj4gCj4gLSRh
c19lY2hvICIjZGVmaW5lIF9VSU5UMzJfVCAxIiA+PmNvbmZkZWZzLmgKPiAKPiAKPiAtY2F0ID4+
Y29uZmRlZnMuaCA8PF9BQ0VPRgo+IC0jZGVmaW5lIHVpbnQzMl90ICRhY19jdl9jX3VpbnQzMl90
Cj4gLV9BQ0VPRgo+IC07Owo+IC0gIGVzYWMKPiAKPiAtYWNfZm5fY19maW5kX3VpbnRYX3QgIiRM
SU5FTk8iICI2NCIgImFjX2N2X2NfdWludDY0X3QiCj4gLWNhc2UgJGFjX2N2X2NfdWludDY0X3Qg
aW4gIygKPiAtICBub3x5ZXMpIDs7ICMoCj4gK2lmIHRlc3QgIngkYWNfY3ZfZW52X1BLR19DT05G
SUdfc2V0IiAhPSAieHNldCI7IHRoZW4KPiArICAgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3By
ZWZpeCI7IHRoZW4KPiArICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9w
cmVmaXh9cGtnLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3Mu
Cj4gK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXBrZy1jb25maWc7IGFjX3dvcmQ9JDIKPiAr
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFj
X3dvcmQiID4mNQo+ICskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7
IH0KPiAraWYgdGVzdCAiJHthY19jdl9wYXRoX1BLR19DT05GSUcrc2V0fSIgPSBzZXQ7IHRoZW4g
Ogo+ICsgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gK2Vsc2UKPiArICBjYXNlICRQS0df
Q09ORklHIGluCj4gKyAgW1xcL10qIHwgPzpbXFwvXSopCj4gKyAgYWNfY3ZfcGF0aF9QS0dfQ09O
RklHPSIkUEtHX0NPTkZJRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBh
IHBhdGguCj4gKyAgOzsKPiAgICAqKQo+ICsgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9T
RVBBUkFUT1IKPiArZm9yIGFzX2RpciBpbiAkUEFUSAo+ICtkbwo+ICsgIElGUz0kYXNfc2F2ZV9J
RlMKPiArICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+ICsgICAgZm9yIGFjX2V4ZWNf
ZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gKyAgaWYgeyB0ZXN0IC1m
ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRh
Y193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+ICsgICAgYWNfY3ZfcGF0aF9QS0dfQ09ORklH
PSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0Igo+ICsgICAgJGFzX2VjaG8gIiRhc19tZTok
e2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIg
PiY1Cj4gKyAgICBicmVhayAyCj4gKyAgZmkKPiArZG9uZQo+ICsgIGRvbmUKPiArSUZTPSRhc19z
YXZlX0lGUwo+IAo+IC0kYXNfZWNobyAiI2RlZmluZSBfVUlOVDY0X1QgMSIgPj5jb25mZGVmcy5o
Cj4gLQo+ICsgIDs7Cj4gK2VzYWMKPiArZmkKPiArUEtHX0NPTkZJRz0kYWNfY3ZfcGF0aF9QS0df
Q09ORklHCj4gK2lmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgo+ICsgIHsgJGFzX2VjaG8g
IiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUEtHX0NPTkZJRyIgPiY1Cj4g
KyRhc19lY2hvICIkUEtHX0NPTkZJRyIgPiY2OyB9Cj4gK2Vsc2UKPiArICB7ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQo+ICskYXNfZWNobyAi
bm8iID4mNjsgfQo+ICtmaQo+IAo+IC1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCj4gLSNkZWZp
bmUgdWludDY0X3QgJGFjX2N2X2NfdWludDY0X3QKPiAtX0FDRU9GCj4gLTs7Cj4gLSAgZXNhYwo+
IAo+IC1hY19mbl9jX2ZpbmRfdWludFhfdCAiJExJTkVOTyIgIjgiICJhY19jdl9jX3VpbnQ4X3Qi
Cj4gLWNhc2UgJGFjX2N2X2NfdWludDhfdCBpbiAjKAo+IC0gIG5vfHllcykgOzsgIygKPiArZmkK
PiAraWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfUEtHX0NPTkZJRyI7IHRoZW4KPiArICBhY19wdF9Q
S0dfQ09ORklHPSRQS0dfQ09ORklHCj4gKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJw
a2ctY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KPiArc2V0
IGR1bW15IHBrZy1jb25maWc7IGFjX3dvcmQ9JDIKPiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNf
bGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQo+ICskYXNfZWNob19u
ICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KPiAraWYgdGVzdCAiJHthY19jdl9w
YXRoX2FjX3B0X1BLR19DT05GSUcrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICsgICRhc19lY2hvX24g
IihjYWNoZWQpICIgPiY2Cj4gK2Vsc2UKPiArICBjYXNlICRhY19wdF9QS0dfQ09ORklHIGluCj4g
KyAgW1xcL10qIHwgPzpbXFwvXSopCj4gKyAgYWNfY3ZfcGF0aF9hY19wdF9QS0dfQ09ORklHPSIk
YWNfcHRfUEtHX0NPTkZJRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBh
IHBhdGguCj4gKyAgOzsKPiAgICAqKQo+ICsgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9T
RVBBUkFUT1IKPiArZm9yIGFzX2RpciBpbiAkUEFUSAo+ICtkbwo+ICsgIElGUz0kYXNfc2F2ZV9J
RlMKPiArICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9Lgo+ICsgICAgZm9yIGFjX2V4ZWNf
ZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCj4gKyAgaWYgeyB0ZXN0IC1m
ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRh
Y193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgo+ICsgICAgYWNfY3ZfcGF0aF9hY19wdF9QS0df
Q09ORklHPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0Igo+ICsgICAgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVj
X2V4dCIgPiY1Cj4gKyAgICBicmVhayAyCj4gKyAgZmkKPiArZG9uZQo+ICsgIGRvbmUKPiArSUZT
PSRhc19zYXZlX0lGUwo+IAo+IC0kYXNfZWNobyAiI2RlZmluZSBfVUlOVDhfVCAxIiA+PmNvbmZk
ZWZzLmgKPiAtCj4gLQo+IC1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCj4gLSNkZWZpbmUgdWlu
dDhfdCAkYWNfY3ZfY191aW50OF90Cj4gLV9BQ0VPRgo+IC07Owo+IC0gIGVzYWMKPiAtCj4gLWFj
X2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInB0cmRpZmZfdCIgImFjX2N2X3R5cGVfcHRyZGlm
Zl90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCj4gLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV9wdHJk
aWZmX3QiID0geCIieWVzOyB0aGVuIDoKPiAtCj4gLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YK
PiAtI2RlZmluZSBIQVZFX1BUUkRJRkZfVCAxCj4gLV9BQ0VPRgo+IC0KPiAtCj4gKyAgOzsKPiAr
ZXNhYwo+ICtmaQo+ICthY19wdF9QS0dfQ09ORklHPSRhY19jdl9wYXRoX2FjX3B0X1BLR19DT05G
SUcKPiAraWYgdGVzdCAtbiAiJGFjX3B0X1BLR19DT05GSUciOyB0aGVuCj4gKyAgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19wdF9QS0dfQ09ORklH
IiA+JjUKPiArJGFzX2VjaG8gIiRhY19wdF9QS0dfQ09ORklHIiA+JjY7IH0KPiArZWxzZQo+ICsg
IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1
Cj4gKyRhc19lY2hvICJubyIgPiY2OyB9Cj4gIGZpCj4gCj4gLQo+IC0jIENoZWNrcyBmb3IgbGli
cmFyeSBmdW5jdGlvbnMuCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogY2hlY2tpbmcgZm9yIGVycm9yX2F0X2xpbmUiID4mNQo+IC0kYXNfZWNob19uICJjaGVja2lu
ZyBmb3IgZXJyb3JfYXRfbGluZS4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0ICIke2FjX2N2X2xpYl9l
cnJvcl9hdF9saW5lK3NldH0iID0gc2V0OyB0aGVuIDoKPiAtICAkYXNfZWNob19uICIoY2FjaGVk
KSAiID4mNgo+IC1lbHNlCj4gLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3Qu
JGFjX2V4dAo+IC0vKiBlbmQgY29uZmRlZnMuaC4gICovCj4gLSNpbmNsdWRlIDxlcnJvci5oPgo+
IC1pbnQKPiAtbWFpbiAoKQo+IC17Cj4gLWVycm9yX2F0X2xpbmUgKDAsIDAsICIiLCAwLCAiYW4g
ZXJyb3Igb2NjdXJyZWQiKTsKPiAtICA7Cj4gLSAgcmV0dXJuIDA7Cj4gLX0KPiAtX0FDRU9GCj4g
LWlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKPiAtICBhY19jdl9saWJfZXJy
b3JfYXRfbGluZT15ZXMKPiArICBpZiB0ZXN0ICJ4JGFjX3B0X1BLR19DT05GSUciID0geDsgdGhl
bgo+ICsgICAgUEtHX0NPTkZJRz0iIgo+ICsgIGVsc2UKPiArICAgIGNhc2UgJGNyb3NzX2NvbXBp
bGluZzokYWNfdG9vbF93YXJuZWQgaW4KPiAreWVzOikKPiAreyAkYXNfZWNobyAiJGFzX21lOiR7
YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4
ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQo+ICskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1
c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Cj4g
K2FjX3Rvb2xfd2FybmVkPXllcyA7Owo+ICtlc2FjCj4gKyAgICBQS0dfQ09ORklHPSRhY19wdF9Q
S0dfQ09ORklHCj4gKyAgZmkKPiAgZWxzZQo+IC0gIGFjX2N2X2xpYl9lcnJvcl9hdF9saW5lPW5v
Cj4gLWZpCj4gLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAo+
IC0gICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKPiArICBQS0dfQ09ORklH
PSIkYWNfY3ZfcGF0aF9QS0dfQ09ORklHIgo+ICBmaQo+IC17ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9lcnJvcl9hdF9saW5lIiA+JjUK
PiAtJGFzX2VjaG8gIiRhY19jdl9saWJfZXJyb3JfYXRfbGluZSIgPiY2OyB9Cj4gLWlmIHRlc3Qg
JGFjX2N2X2xpYl9lcnJvcl9hdF9saW5lID0gbm87IHRoZW4KPiAtICBjYXNlICIgJExJQk9CSlMg
IiBpbgo+IC0gICoiIGVycm9yLiRhY19vYmpleHQgIiogKSA7Owo+IC0gICopIExJQk9CSlM9IiRM
SUJPQkpTIGVycm9yLiRhY19vYmpleHQiCj4gLSA7Owo+IC1lc2FjCj4gCj4gIGZpCj4gLQo+IC1m
b3IgYWNfaGVhZGVyIGluIHZmb3JrLmgKPiAtZG8gOgo+IC0gIGFjX2ZuX2NfY2hlY2tfaGVhZGVy
X21vbmdyZWwgIiRMSU5FTk8iICJ2Zm9yay5oIiAiYWNfY3ZfaGVhZGVyX3Zmb3JrX2giICIkYWNf
aW5jbHVkZXNfZGVmYXVsdCIKPiAtaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfdmZvcmtfaCIgPSB4
IiJ5ZXM7IHRoZW4gOgo+IC0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKPiAtI2RlZmluZSBI
QVZFX1ZGT1JLX0ggMQo+IC1fQUNFT0YKPiAtCj4gK2lmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsg
dGhlbgo+ICsgICAgICAgX3BrZ19taW5fdmVyc2lvbj0wLjkuMAo+ICsgICAgICAgeyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBwa2ctY29uZmlnIGlzIGF0
IGxlYXN0IHZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb24iID4mNQo+ICskYXNfZWNob19uICJjaGVj
a2luZyBwa2ctY29uZmlnIGlzIGF0IGxlYXN0IHZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb24uLi4g
IiA+JjY7IH0KPiArICAgICAgIGlmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVy
c2lvbiAkX3BrZ19taW5fdmVyc2lvbjsgdGhlbgo+ICsgICAgICAgICAgICAgICB7ICRhc19lY2hv
ICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKPiArJGFzX2Vj
aG8gInllcyIgPiY2OyB9Cj4gKyAgICAgICBlbHNlCj4gKyAgICAgICAgICAgICAgIHsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Cj4gKyRhc19l
Y2hvICJubyIgPiY2OyB9Cj4gKyAgICAgICAgICAgICAgIFBLR19DT05GSUc9IiIKPiArICAgICAg
IGZpCj4gIGZpCj4gCj4gLWRvbmUKPiAtCj4gLWZvciBhY19mdW5jIGluIGZvcmsgdmZvcmsKPiAt
ZG8gOgo+IC0gIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFz
X3RyX3NoYAo+IC1hY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19h
Y192YXIiCj4gLWlmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVu
IDoKPiAtICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCj4gLSNkZWZpbmUgYCRhc19lY2hvICJI
QVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKPiAtX0FDRU9GCj4gLQo+IC1maQo+IC1kb25l
Cj4gK3BrZ19mYWlsZWQ9bm8KPiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiBjaGVja2luZyBmb3IgZ2xpYiIgPiY1Cj4gKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBn
bGliLi4uICIgPiY2OyB9Cj4gCj4gLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrIiA9IHh5ZXM7
IHRoZW4KPiAtICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNr
aW5nIGZvciB3b3JraW5nIGZvcmsiID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyBmb3Igd29y
a2luZyBmb3JrLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfZnVuY19mb3JrX3dvcmtz
K3NldH0iID0gc2V0OyB0aGVuIDoKPiAtICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgo+IC1l
bHNlCj4gLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgo+IC0gIGFj
X2N2X2Z1bmNfZm9ya193b3Jrcz1jcm9zcwo+ICtpZiB0ZXN0IC1uICIkZ2xpYl9DRkxBR1MiOyB0
aGVuCj4gKyAgICBwa2dfY3ZfZ2xpYl9DRkxBR1M9IiRnbGliX0NGTEFHUyIKPiArIGVsaWYgdGVz
dCAtbiAiJFBLR19DT05GSUciOyB0aGVuCj4gKyAgICBpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyIg
JiYgXAo+ICsgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwk
UEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyBcImdsaWItMi4wXCIiOyB9ID4mNQo+
ICsgICgkUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAiZ2xpYi0yLjAiKSAyPiY1
Cj4gKyAgYWNfc3RhdHVzPSQ/Cj4gKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cj4gKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsg
dGhlbgo+ICsgIHBrZ19jdl9nbGliX0NGTEFHUz1gJFBLR19DT05GSUcgLS1jZmxhZ3MgImdsaWIt
Mi4wIiAyPi9kZXYvbnVsbGAKPiAgZWxzZQo+IC0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0Yg
PmNvbmZ0ZXN0LiRhY19leHQKPiAtLyogZW5kIGNvbmZkZWZzLmguICAqLwo+IC0kYWNfaW5jbHVk
ZXNfZGVmYXVsdAo+IC1pbnQKPiAtbWFpbiAoKQo+IC17Cj4gLQo+IC0gICAgICAgICAvKiBCeSBS
dWVkaWdlciBLdWhsbWFubi4gKi8KPiAtICAgICAgICAgcmV0dXJuIGZvcmsgKCkgPCAwOwo+IC0K
PiAtICA7Cj4gLSAgcmV0dXJuIDA7Cj4gLX0KPiAtX0FDRU9GCj4gLWlmIGFjX2ZuX2NfdHJ5X3J1
biAiJExJTkVOTyI7IHRoZW4gOgo+IC0gIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz15ZXMKPiArICBw
a2dfZmFpbGVkPXllcwo+ICtmaQo+ICsgZWxzZQo+ICsgICAgcGtnX2ZhaWxlZD11bnRyaWVkCj4g
K2ZpCj4gK2lmIHRlc3QgLW4gIiRnbGliX0xJQlMiOyB0aGVuCj4gKyAgICBwa2dfY3ZfZ2xpYl9M
SUJTPSIkZ2xpYl9MSUJTIgo+ICsgZWxpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KPiAr
ICAgIGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCj4gKyAgICB7IHsgJGFzX2VjaG8gIiRh
c19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCRQS0dfQ09ORklHIC0tZXhpc3RzIC0tcHJpbnQt
ZXJyb3JzIFwiZ2xpYi0yLjBcIiI7IH0gPiY1Cj4gKyAgKCRQS0dfQ09ORklHIC0tZXhpc3RzIC0t
cHJpbnQtZXJyb3JzICJnbGliLTIuMCIpIDI+JjUKPiArICBhY19zdGF0dXM9JD8KPiArICAkYXNf
ZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUK
PiArICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuCj4gKyAgcGtnX2N2X2dsaWJfTElCUz1g
JFBLR19DT05GSUcgLS1saWJzICJnbGliLTIuMCIgMj4vZGV2L251bGxgCj4gIGVsc2UKPiAtICBh
Y19jdl9mdW5jX2Zvcmtfd29ya3M9bm8KPiArICBwa2dfZmFpbGVkPXllcwo+ICBmaQo+IC1ybSAt
ZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFj
X2V4ZWV4dCBcCj4gLSAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0
LiRhY19leHQKPiArIGVsc2UKPiArICAgIHBrZ19mYWlsZWQ9dW50cmllZAo+ICBmaQo+IAo+IC1m
aQo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFj
X2N2X2Z1bmNfZm9ya193b3JrcyIgPiY1Cj4gLSRhc19lY2hvICIkYWNfY3ZfZnVuY19mb3JrX3dv
cmtzIiA+JjY7IH0KPiAKPiArCj4gK2lmIHRlc3QgJHBrZ19mYWlsZWQgPSB5ZXM7IHRoZW4KPiAr
ICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBu
byIgPiY1Cj4gKyRhc19lY2hvICJubyIgPiY2OyB9Cj4gKwo+ICtpZiAkUEtHX0NPTkZJRyAtLWF0
bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gMC4yMDsgdGhlbgo+ICsgICAgICAgIF9wa2dfc2hvcnRf
ZXJyb3JzX3N1cHBvcnRlZD15ZXMKPiAgZWxzZQo+IC0gIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz0k
YWNfY3ZfZnVuY19mb3JrCj4gKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPW5v
Cj4gIGZpCj4gLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA9IHhjcm9zczsgdGhl
bgo+IC0gIGNhc2UgJGhvc3QgaW4KPiAtICAgICotKi1hbWlnYW9zKiB8ICotKi1tc2Rvc2RqZ3Bw
KikKPiAtICAgICAgIyBPdmVycmlkZSwgYXMgdGhlc2Ugc3lzdGVtcyBoYXZlIG9ubHkgYSBkdW1t
eSBmb3JrKCkgc3R1Ygo+IC0gICAgICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9bm8KPiAtICAgICAg
OzsKPiAtICAgICopCj4gLSAgICAgIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz15ZXMKPiAtICAgICAg
OzsKPiAtICBlc2FjCj4gLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99
OiBXQVJOSU5HOiByZXN1bHQgJGFjX2N2X2Z1bmNfZm9ya193b3JrcyBndWVzc2VkIGJlY2F1c2Ug
b2YgY3Jvc3MgY29tcGlsYXRpb24iID4mNQo+IC0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBy
ZXN1bHQgJGFjX2N2X2Z1bmNfZm9ya193b3JrcyBndWVzc2VkIGJlY2F1c2Ugb2YgY3Jvc3MgY29t
cGlsYXRpb24iID4mMjt9Cj4gLWZpCj4gLWFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9JGFjX2N2X2Z1
bmNfdmZvcmsKPiAtaWYgdGVzdCAieCRhY19jdl9mdW5jX3Zmb3JrIiA9IHh5ZXM7IHRoZW4KPiAt
ICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3
b3JraW5nIHZmb3JrIiA+JjUKPiAtJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgdmZv
cmsuLi4gIiA+JjY7IH0KPiAtaWYgdGVzdCAiJHthY19jdl9mdW5jX3Zmb3JrX3dvcmtzK3NldH0i
ID0gc2V0OyB0aGVuIDoKPiAtICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgo+IC1lbHNlCj4g
LSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgo+IC0gIGFjX2N2X2Z1
bmNfdmZvcmtfd29ya3M9Y3Jvc3MKPiAtZWxzZQo+IC0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNF
T0YgPmNvbmZ0ZXN0LiRhY19leHQKPiAtLyogZW5kIGNvbmZkZWZzLmguICAqLwo+IC0vKiBUaGFu
a3MgdG8gUGF1bCBFZ2dlcnQgZm9yIHRoaXMgdGVzdC4gICovCj4gLSRhY19pbmNsdWRlc19kZWZh
dWx0Cj4gLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgo+IC0jaWZkZWYgSEFWRV9WRk9SS19ICj4gLSMg
aW5jbHVkZSA8dmZvcmsuaD4KPiAtI2VuZGlmCj4gLS8qIE9uIHNvbWUgc3BhcmMgc3lzdGVtcywg
Y2hhbmdlcyBieSB0aGUgY2hpbGQgdG8gbG9jYWwgYW5kIGluY29taW5nCj4gLSAgIGFyZ3VtZW50
IHJlZ2lzdGVycyBhcmUgcHJvcGFnYXRlZCBiYWNrIHRvIHRoZSBwYXJlbnQuICBUaGUgY29tcGls
ZXIKPiAtICAgaXMgdG9sZCBhYm91dCB0aGlzIHdpdGggI2luY2x1ZGUgPHZmb3JrLmg+LCBidXQg
c29tZSBjb21waWxlcnMKPiAtICAgKGUuZy4gZ2NjIC1PKSBkb24ndCBncm9rIDx2Zm9yay5oPi4g
IFRlc3QgZm9yIHRoaXMgYnkgdXNpbmcgYQo+IC0gICBzdGF0aWMgdmFyaWFibGUgd2hvc2UgYWRk
cmVzcyBpcyBwdXQgaW50byBhIHJlZ2lzdGVyIHRoYXQgaXMKPiAtICAgY2xvYmJlcmVkIGJ5IHRo
ZSB2Zm9yay4gICovCj4gLXN0YXRpYyB2b2lkCj4gLSNpZmRlZiBfX2NwbHVzcGx1cwo+IC1zcGFy
Y19hZGRyZXNzX3Rlc3QgKGludCBhcmcpCj4gLSMgZWxzZQo+IC1zcGFyY19hZGRyZXNzX3Rlc3Qg
KGFyZykgaW50IGFyZzsKPiAtI2VuZGlmCj4gLXsKPiAtICBzdGF0aWMgcGlkX3QgY2hpbGQ7Cj4g
LSAgaWYgKCFjaGlsZCkgewo+IC0gICAgY2hpbGQgPSB2Zm9yayAoKTsKPiAtICAgIGlmIChjaGls
ZCA8IDApIHsKPiAtICAgICAgcGVycm9yICgidmZvcmsiKTsKPiAtICAgICAgX2V4aXQoMik7Cj4g
LSAgICB9Cj4gLSAgICBpZiAoIWNoaWxkKSB7Cj4gLSAgICAgIGFyZyA9IGdldHBpZCgpOwo+IC0g
ICAgICB3cml0ZSgtMSwgIiIsIDApOwo+IC0gICAgICBfZXhpdCAoYXJnKTsKPiAtICAgIH0KPiAt
ICB9Cj4gLX0KPiArICAgICAgICBpZiB0ZXN0ICRfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQg
PSB5ZXM7IHRoZW4KPiArICAgICAgICAgICAgICAgZ2xpYl9QS0dfRVJST1JTPWAkUEtHX0NPTkZJ
RyAtLXNob3J0LWVycm9ycyAtLXByaW50LWVycm9ycyAiZ2xpYi0yLjAiIDI+JjFgCj4gKyAgICAg
ICAgZWxzZQo+ICsgICAgICAgICAgICAgICBnbGliX1BLR19FUlJPUlM9YCRQS0dfQ09ORklHIC0t
cHJpbnQtZXJyb3JzICJnbGliLTIuMCIgMj4mMWAKPiArICAgICAgICBmaQo+ICsgICAgICAgIyBQ
dXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdz
Cj4gKyAgICAgICBlY2hvICIkZ2xpYl9QS0dfRVJST1JTIiA+JjUKPiAKPiAtaW50Cj4gLW1haW4g
KCkKPiAtewo+IC0gIHBpZF90IHBhcmVudCA9IGdldHBpZCAoKTsKPiAtICBwaWRfdCBjaGlsZDsK
PiAtCj4gLSAgc3BhcmNfYWRkcmVzc190ZXN0ICgwKTsKPiAtCj4gLSAgY2hpbGQgPSB2Zm9yayAo
KTsKPiAtCj4gLSAgaWYgKGNoaWxkID09IDApIHsKPiAtICAgIC8qIEhlcmUgaXMgYW5vdGhlciB0
ZXN0IGZvciBzcGFyYyB2Zm9yayByZWdpc3RlciBwcm9ibGVtcy4gIFRoaXMKPiAtICAgICAgIHRl
c3QgdXNlcyBsb3RzIG9mIGxvY2FsIHZhcmlhYmxlcywgYXQgbGVhc3QgYXMgbWFueSBsb2NhbAo+
IC0gICAgICAgdmFyaWFibGVzIGFzIG1haW4gaGFzIGFsbG9jYXRlZCBzbyBmYXIgaW5jbHVkaW5n
IGNvbXBpbGVyCj4gLSAgICAgICB0ZW1wb3Jhcmllcy4gIDQgbG9jYWxzIGFyZSBlbm91Z2ggZm9y
IGdjYyAxLjQwLjMgb24gYSBTb2xhcmlzCj4gLSAgICAgICA0LjEuMyBzcGFyYywgYnV0IHdlIHVz
ZSA4IHRvIGJlIHNhZmUuICBBIGJ1Z2d5IGNvbXBpbGVyIHNob3VsZAo+IC0gICAgICAgcmV1c2Ug
dGhlIHJlZ2lzdGVyIG9mIHBhcmVudCBmb3Igb25lIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMsCj4g
LSAgICAgICBzaW5jZSBpdCB3aWxsIHRoaW5rIHRoYXQgcGFyZW50IGNhbid0IHBvc3NpYmx5IGJl
IHVzZWQgYW55IG1vcmUKPiAtICAgICAgIGluIHRoaXMgcm91dGluZS4gIEFzc2lnbmluZyB0byB0
aGUgbG9jYWwgdmFyaWFibGUgd2lsbCB0aHVzCj4gLSAgICAgICBtdW5nZSBwYXJlbnQgaW4gdGhl
IHBhcmVudCBwcm9jZXNzLiAgKi8KPiAtICAgIHBpZF90Cj4gLSAgICAgIHAgPSBnZXRwaWQoKSwg
cDEgPSBnZXRwaWQoKSwgcDIgPSBnZXRwaWQoKSwgcDMgPSBnZXRwaWQoKSwKPiAtICAgICAgcDQg
PSBnZXRwaWQoKSwgcDUgPSBnZXRwaWQoKSwgcDYgPSBnZXRwaWQoKSwgcDcgPSBnZXRwaWQoKTsK
PiAtICAgIC8qIENvbnZpbmNlIHRoZSBjb21waWxlciB0aGF0IHAuLnA3IGFyZSBsaXZlOyBvdGhl
cndpc2UsIGl0IG1pZ2h0Cj4gLSAgICAgICB1c2UgdGhlIHNhbWUgaGFyZHdhcmUgcmVnaXN0ZXIg
Zm9yIGFsbCA4IGxvY2FsIHZhcmlhYmxlcy4gICovCj4gLSAgICBpZiAocCAhPSBwMSB8fCBwICE9
IHAyIHx8IHAgIT0gcDMgfHwgcCAhPSBwNAo+IC0gICAgICAgfHwgcCAhPSBwNSB8fCBwICE9IHA2
IHx8IHAgIT0gcDcpCj4gLSAgICAgIF9leGl0KDEpOwo+IC0KPiAtICAgIC8qIE9uIHNvbWUgc3lz
dGVtcyAoZS5nLiBJUklYIDMuMyksIHZmb3JrIGRvZXNuJ3Qgc2VwYXJhdGUgcGFyZW50Cj4gLSAg
ICAgICBmcm9tIGNoaWxkIGZpbGUgZGVzY3JpcHRvcnMuICBJZiB0aGUgY2hpbGQgY2xvc2VzIGEg
ZGVzY3JpcHRvcgo+IC0gICAgICAgYmVmb3JlIGl0IGV4ZWNzIG9yIGV4aXRzLCB0aGlzIG11bmdl
cyB0aGUgcGFyZW50J3MgZGVzY3JpcHRvcgo+IC0gICAgICAgYXMgd2VsbC4gIFRlc3QgZm9yIHRo
aXMgYnkgY2xvc2luZyBzdGRvdXQgaW4gdGhlIGNoaWxkLiAgKi8KPiAtICAgIF9leGl0KGNsb3Nl
KGZpbGVubyhzdGRvdXQpKSAhPSAwKTsKPiAtICB9IGVsc2Ugewo+IC0gICAgaW50IHN0YXR1czsK
PiAtICAgIHN0cnVjdCBzdGF0IHN0Owo+ICsgICAgICAgYXNfZm5fZXJyb3IgJD8gIlBhY2thZ2Ug
cmVxdWlyZW1lbnRzIChnbGliLTIuMCkgd2VyZSBub3QgbWV0Ogo+IAo+IC0gICAgd2hpbGUgKHdh
aXQoJnN0YXR1cykgIT0gY2hpbGQpCj4gLSAgICAgIDsKPiAtICAgIHJldHVybiAoCj4gLSAgICAg
ICAgLyogV2FzIHRoZXJlIHNvbWUgcHJvYmxlbSB3aXRoIHZmb3JraW5nPyAgKi8KPiAtICAgICAg
ICBjaGlsZCA8IDAKPiArJGdsaWJfUEtHX0VSUk9SUwo+IAo+IC0gICAgICAgIC8qIERpZCB0aGUg
Y2hpbGQgZmFpbD8gIChUaGlzIHNob3VsZG4ndCBoYXBwZW4uKSAgKi8KPiAtICAgICAgICB8fCBz
dGF0dXMKPiArQ29uc2lkZXIgYWRqdXN0aW5nIHRoZSBQS0dfQ09ORklHX1BBVEggZW52aXJvbm1l
bnQgdmFyaWFibGUgaWYgeW91Cj4gK2luc3RhbGxlZCBzb2Z0d2FyZSBpbiBhIG5vbi1zdGFuZGFy
ZCBwcmVmaXguCj4gCj4gLSAgICAgICAgLyogRGlkIHRoZSB2Zm9yay9jb21waWxlciBidWcgb2Nj
dXI/ICAqLwo+IC0gICAgICAgIHx8IHBhcmVudCAhPSBnZXRwaWQoKQo+ICtBbHRlcm5hdGl2ZWx5
LCB5b3UgbWF5IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGdsaWJfQ0ZMQUdTCj4gK2Fu
ZCBnbGliX0xJQlMgdG8gYXZvaWQgdGhlIG5lZWQgdG8gY2FsbCBwa2ctY29uZmlnLgo+ICtTZWUg
dGhlIHBrZy1jb25maWcgbWFuIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4iICIkTElORU5PIiA1Cj4g
K2VsaWYgdGVzdCAkcGtnX2ZhaWxlZCA9IHVudHJpZWQ7IHRoZW4KPiArICAgICAgIHsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Cj4gKyRhc19l
Y2hvICJubyIgPiY2OyB9Cj4gKyAgICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKPiArJGFzX2VjaG8gIiRhc19t
ZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQo+ICthc19mbl9lcnJvciAkPyAiVGhlIHBr
Zy1jb25maWcgc2NyaXB0IGNvdWxkIG5vdCBiZSBmb3VuZCBvciBpcyB0b28gb2xkLiAgTWFrZSBz
dXJlIGl0Cj4gK2lzIGluIHlvdXIgUEFUSCBvciBzZXQgdGhlIFBLR19DT05GSUcgZW52aXJvbm1l
bnQgdmFyaWFibGUgdG8gdGhlIGZ1bGwKPiArcGF0aCB0byBwa2ctY29uZmlnLgo+IAo+IC0gICAg
ICAgIC8qIERpZCB0aGUgZmlsZSBkZXNjcmlwdG9yIGJ1ZyBvY2N1cj8gICovCj4gLSAgICAgICAg
fHwgZnN0YXQoZmlsZW5vKHN0ZG91dCksICZzdCkgIT0gMAo+IC0gICAgICAgICk7Cj4gLSAgfQo+
IC19Cj4gLV9BQ0VPRgo+IC1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKPiAt
ICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPXllcwo+ICtBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IHNl
dCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGdsaWJfQ0ZMQUdTCj4gK2FuZCBnbGliX0xJQlMg
dG8gYXZvaWQgdGhlIG5lZWQgdG8gY2FsbCBwa2ctY29uZmlnLgo+ICtTZWUgdGhlIHBrZy1jb25m
aWcgbWFuIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KPiArCj4gK1RvIGdldCBwa2ctY29uZmlnLCBz
ZWUgPGh0dHA6Ly9wa2ctY29uZmlnLmZyZWVkZXNrdG9wLm9yZy8+Lgo+ICtTZWUgXGBjb25maWcu
bG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNSA7IH0KPiAgZWxzZQo+IC0gIGFjX2N2
X2Z1bmNfdmZvcmtfd29ya3M9bm8KPiAtZmkKPiAtcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25m
dGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAo+IC0gIGNvbmZ0ZXN0
LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Cj4gLWZpCj4gKyAgICAg
ICBnbGliX0NGTEFHUz0kcGtnX2N2X2dsaWJfQ0ZMQUdTCj4gKyAgICAgICBnbGliX0xJQlM9JHBr
Z19jdl9nbGliX0xJQlMKPiArICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKPiArJGFzX2VjaG8gInllcyIgPiY2OyB9Cj4gCj4g
IGZpCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAk
YWNfY3ZfZnVuY192Zm9ya193b3JrcyIgPiY1Cj4gLSRhc19lY2hvICIkYWNfY3ZfZnVuY192Zm9y
a193b3JrcyIgPiY2OyB9Cj4gCj4gLWZpOwo+IC1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZm9ya193
b3JrcyIgPSB4Y3Jvc3M7IHRoZW4KPiAtICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPSRhY19jdl9m
dW5jX3Zmb3JrCj4gLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBX
QVJOSU5HOiByZXN1bHQgJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MgZ3Vlc3NlZCBiZWNhdXNlIG9m
IGNyb3NzIGNvbXBpbGF0aW9uIiA+JjUKPiAtJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogcmVz
dWx0ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIGd1ZXNzZWQgYmVjYXVzZSBvZiBjcm9zcyBjb21w
aWxhdGlvbiIgPiYyO30KPiArIyBDaGVjayBsaWJyYXJ5IHBhdGgKPiAraWYgdGVzdCAiXCR7ZXhl
Y19wcmVmaXh9L2xpYiIgPSAiJGxpYmRpciI7IHRoZW4gOgo+ICsgIGlmIHRlc3QgIiRleGVjX3By
ZWZpeCIgPSAiTk9ORSIgJiYgdGVzdCAiJHByZWZpeCIgIT0gIk5PTkUiOyB0aGVuIDoKPiArICBl
eGVjX3ByZWZpeD0kcHJlZml4Cj4gIGZpCj4gKyAgICBpZiB0ZXN0ICIkZXhlY19wcmVmaXgiID0g
Ik5PTkUiOyB0aGVuIDoKPiArICBleGVjX3ByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKPiArZmkK
PiArICAgIGlmIHRlc3QgLWQgIiR7ZXhlY19wcmVmaXh9L2xpYjY0IjsgdGhlbiA6Cj4gCj4gLWlm
IHRlc3QgIngkYWNfY3ZfZnVuY192Zm9ya193b3JrcyIgPSB4eWVzOyB0aGVuCj4gLQo+IC0kYXNf
ZWNobyAiI2RlZmluZSBIQVZFX1dPUktJTkdfVkZPUksgMSIgPj5jb25mZGVmcy5oCj4gKyAgICAg
ICAgTElCX1BBVEg9ImxpYjY0Igo+IAo+ICBlbHNlCj4gCj4gLSRhc19lY2hvICIjZGVmaW5lIHZm
b3JrIGZvcmsiID4+Y29uZmRlZnMuaAo+ICsgICAgICAgIExJQl9QQVRIPSJsaWIiCj4gCj4gIGZp
Cj4gLWlmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA9IHh5ZXM7IHRoZW4KPiAKPiAt
JGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9XT1JLSU5HX0ZPUksgMSIgPj5jb25mZGVmcy5oCj4gK2Vs
c2UKPiAKPiAtZmkKPiArICAgIExJQl9QQVRIPSIke2xpYmRpcjpgZXhwciBsZW5ndGggIiRleGVj
X3ByZWZpeCIgKyAxYH0iCj4gCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogY2hlY2tpbmcgZm9yIF9MQVJHRUZJTEVfU09VUkNFIHZhbHVlIG5lZWRlZCBmb3IgbGFy
Z2UgZmlsZXMiID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyBmb3IgX0xBUkdFRklMRV9TT1VS
Q0UgdmFsdWUgbmVlZGVkIGZvciBsYXJnZSBmaWxlcy4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0ICIk
e2FjX2N2X3N5c19sYXJnZWZpbGVfc291cmNlK3NldH0iID0gc2V0OyB0aGVuIDoKPiAtICAkYXNf
ZWNob19uICIoY2FjaGVkKSAiID4mNgo+IC1lbHNlCj4gLSAgd2hpbGUgOjsgZG8KPiAtICBjYXQg
Y29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Cj4gLS8qIGVuZCBjb25mZGVm
cy5oLiAgKi8KPiAtI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAvKiBmb3Igb2ZmX3QgKi8KPiAtICAg
ICAjaW5jbHVkZSA8c3RkaW8uaD4KPiAtaW50Cj4gLW1haW4gKCkKPiAtewo+IC1pbnQgKCpmcCkg
KEZJTEUgKiwgb2ZmX3QsIGludCkgPSBmc2Vla287Cj4gLSAgICAgcmV0dXJuIGZzZWVrbyAoc3Rk
aW4sIDAsIDApICYmIGZwIChzdGRpbiwgMCwgMCk7Cj4gLSAgOwo+IC0gIHJldHVybiAwOwo+IC19
Cj4gLV9BQ0VPRgo+IC1pZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Cj4gLSAg
YWNfY3Zfc3lzX2xhcmdlZmlsZV9zb3VyY2U9bm87IGJyZWFrCj4gLWZpCj4gLXJtIC1mIGNvcmUg
Y29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAo+IC0gICAgY29uZnRlc3QkYWNfZXhl
ZXh0IGNvbmZ0ZXN0LiRhY19leHQKPiAtICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25m
dGVzdC4kYWNfZXh0Cj4gLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KPiAtI2RlZmluZSBfTEFSR0VG
SUxFX1NPVVJDRSAxCj4gLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogZm9yIG9mZl90ICovCj4g
LSAgICAgI2luY2x1ZGUgPHN0ZGlvLmg+Cj4gLWludAo+IC1tYWluICgpCj4gLXsKPiAtaW50ICgq
ZnApIChGSUxFICosIG9mZl90LCBpbnQpID0gZnNlZWtvOwo+IC0gICAgIHJldHVybiBmc2Vla28g
KHN0ZGluLCAwLCAwKSAmJiBmcCAoc3RkaW4sIDAsIDApOwo+IC0gIDsKPiAtICByZXR1cm4gMDsK
PiAtfQo+IC1fQUNFT0YKPiAtaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgo+
IC0gIGFjX2N2X3N5c19sYXJnZWZpbGVfc291cmNlPTE7IGJyZWFrCj4gIGZpCj4gLXJtIC1mIGNv
cmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAo+IC0gICAgY29uZnRlc3QkYWNf
ZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKPiAtICBhY19jdl9zeXNfbGFyZ2VmaWxlX3NvdXJjZT11
bmtub3duCj4gLSAgYnJlYWsKPiAtZG9uZQo+IC1maQo+IC17ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3N5c19sYXJnZWZpbGVfc291cmNlIiA+
JjUKPiAtJGFzX2VjaG8gIiRhY19jdl9zeXNfbGFyZ2VmaWxlX3NvdXJjZSIgPiY2OyB9Cj4gLWNh
c2UgJGFjX2N2X3N5c19sYXJnZWZpbGVfc291cmNlIGluICMoCj4gLSAgbm8gfCB1bmtub3duKSA7
Owo+IC0gICopCj4gLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKPiAtI2RlZmluZSBfTEFSR0VG
SUxFX1NPVVJDRSAkYWNfY3Zfc3lzX2xhcmdlZmlsZV9zb3VyY2UKPiAtX0FDRU9GCj4gLTs7Cj4g
LWVzYWMKPiAtcm0gLXJmIGNvbmZ0ZXN0Kgo+IC0KPiAtIyBXZSB1c2VkIHRvIHRyeSBkZWZpbmlu
ZyBfWE9QRU5fU09VUkNFPTUwMCB0b28sIHRvIHdvcmsgYXJvdW5kIGEgYnVnCj4gLSMgaW4gZ2xp
YmMgMi4xLjMsIGJ1dCB0aGF0IGJyZWFrcyB0b28gbWFueSBvdGhlciB0aGluZ3MuCj4gLSMgSWYg
eW91IHdhbnQgZnNlZWtvIGFuZCBmdGVsbG8gd2l0aCBnbGliYywgdXBncmFkZSB0byBhIGZpeGVk
IGdsaWJjLgo+IC1pZiB0ZXN0ICRhY19jdl9zeXNfbGFyZ2VmaWxlX3NvdXJjZSAhPSB1bmtub3du
OyB0aGVuCj4gCj4gLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfRlNFRUtPIDEiID4+Y29uZmRlZnMu
aAo+IAo+IC1maQo+ICsjIENoZWNrcyBmb3IgbGlicmFyaWVzLgo+ICthY19mbl9jX2NoZWNrX2hl
YWRlcl9tb25ncmVsICIkTElORU5PIiAiYnpsaWIuaCIgImFjX2N2X2hlYWRlcl9iemxpYl9oIiAi
JGFjX2luY2x1ZGVzX2RlZmF1bHQiCj4gK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2J6bGliX2gi
ID0geCIieWVzOyB0aGVuIDoKPiAKPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRM
SU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGxzdGF0IGNvcnJlY3RseSBoYW5kbGVzIHRyYWlsaW5n
IHNsYXNoIiA+JjUKPiAtJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBsc3RhdCBjb3JyZWN0
bHkgaGFuZGxlcyB0cmFpbGluZyBzbGFzaC4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0ICIke2FjX2N2
X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluaytzZXR9IiA9IHNldDsgdGhl
biA6Cj4gK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcg
Zm9yIEJaMl9iekRlY29tcHJlc3NJbml0IGluIC1sYnoyIiA+JjUKPiArJGFzX2VjaG9fbiAiY2hl
Y2tpbmcgZm9yIEJaMl9iekRlY29tcHJlc3NJbml0IGluIC1sYnoyLi4uICIgPiY2OyB9Cj4gK2lm
IHRlc3QgIiR7YWNfY3ZfbGliX2J6Ml9CWjJfYnpEZWNvbXByZXNzSW5pdCtzZXR9IiA9IHNldDsg
dGhlbiA6Cj4gICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAgZWxzZQo+IC0gIHJtIC1m
IGNvbmZ0ZXN0LnN5bSBjb25mdGVzdC5maWxlCj4gLWVjaG8gPmNvbmZ0ZXN0LmZpbGUKPiAtaWYg
dGVzdCAiJGFzX2xuX3MiID0gImxuIC1zIiAmJiBsbiAtcyBjb25mdGVzdC5maWxlIGNvbmZ0ZXN0
LnN5bTsgdGhlbgo+IC0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoK
PiAtICBhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbms9bm8KPiAt
ZWxzZQo+IC0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKPiAr
ICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCj4gK0xJQlM9Ii1sYnoyICAkTElCUyIKPiAr
Y2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAo+ICAvKiBlbmQgY29u
ZmRlZnMuaC4gICovCj4gLSRhY19pbmNsdWRlc19kZWZhdWx0Cj4gKwo+ICsvKiBPdmVycmlkZSBh
bnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KPiArICAgVXNlIGNo
YXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCj4gKyAg
IGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBs
eS4gICovCj4gKyNpZmRlZiBfX2NwbHVzcGx1cwo+ICtleHRlcm4gIkMiCj4gKyNlbmRpZgo+ICtj
aGFyIEJaMl9iekRlY29tcHJlc3NJbml0ICgpOwo+ICBpbnQKPiAgbWFpbiAoKQo+ICB7Cj4gLXN0
cnVjdCBzdGF0IHNidWY7Cj4gLSAgICAgLyogTGludXggd2lsbCBkZXJlZmVyZW5jZSB0aGUgc3lt
bGluayBhbmQgZmFpbCwgYXMgcmVxdWlyZWQgYnkgUE9TSVguCj4gLSAgICAgICBUaGF0IGlzIGJl
dHRlciBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBtZWFucyB3ZSB3aWxsIG5vdAo+IC0gICAgICAgaGF2
ZSB0byBjb21waWxlIGFuZCB1c2UgdGhlIGxzdGF0IHdyYXBwZXIuICAqLwo+IC0gICAgIHJldHVy
biBsc3RhdCAoImNvbmZ0ZXN0LnN5bS8iLCAmc2J1ZikgPT0gMDsKPiArcmV0dXJuIEJaMl9iekRl
Y29tcHJlc3NJbml0ICgpOwo+ICAgIDsKPiAgICByZXR1cm4gMDsKPiAgfQo+ICBfQUNFT0YKPiAt
aWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Cj4gLSAgYWNfY3ZfZnVuY19sc3Rh
dF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rPXllcwo+IC1lbHNlCj4gLSAgYWNfY3ZfZnVu
Y19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rPW5vCj4gLWZpCj4gLXJtIC1mIGNv
cmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhl
ZXh0IFwKPiAtICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFj
X2V4dAo+IC1maQo+IC0KPiAraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgo+
ICsgIGFjX2N2X2xpYl9iejJfQloyX2J6RGVjb21wcmVzc0luaXQ9eWVzCj4gIGVsc2UKPiAtICAj
IElmIHRoZSBgbG4gLXMnIGNvbW1hbmQgZmFpbGVkLCB0aGVuIHdlIHByb2JhYmx5IGRvbid0IGV2
ZW4KPiAtICAjIGhhdmUgYW4gbHN0YXQgZnVuY3Rpb24uCj4gLSAgYWNfY3ZfZnVuY19sc3RhdF9k
ZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rPW5vCj4gKyAgYWNfY3ZfbGliX2J6Ml9CWjJfYnpE
ZWNvbXByZXNzSW5pdD1ubwo+ICBmaQo+IC1ybSAtZiBjb25mdGVzdC5zeW0gY29uZnRlc3QuZmls
ZQo+IC0KPiArcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCj4g
KyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAo+ICtMSUJTPSRhY19jaGVj
a19saWJfc2F2ZV9MSUJTCj4gK2ZpCj4gK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2J6Ml9CWjJfYnpEZWNvbXByZXNzSW5pdCIgPiY1
Cj4gKyRhc19lY2hvICIkYWNfY3ZfbGliX2J6Ml9CWjJfYnpEZWNvbXByZXNzSW5pdCIgPiY2OyB9
Cj4gK2lmIHRlc3QgIngkYWNfY3ZfbGliX2J6Ml9CWjJfYnpEZWNvbXByZXNzSW5pdCIgPSB4IiJ5
ZXM7IHRoZW4gOgo+ICsgIHpsaWI9IiR6bGliIC1ESEFWRV9CWkxJQiAtbGJ6MiIKPiAgZmkKPiAt
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9m
dW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbmsiID4mNQo+IC0kYXNfZWNobyAi
JGFjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluayIgPiY2OyB9Cj4g
LQo+IC10ZXN0ICRhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbmsg
PSB5ZXMgJiYKPiAKPiAtY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgo+IC0jZGVmaW5lIExTVEFU
X0ZPTExPV1NfU0xBU0hFRF9TWU1MSU5LIDEKPiAtX0FDRU9GCj4gCj4gK2ZpCj4gCj4gLWlmIHRl
c3QgIngkYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rIiA9IHhu
bzsgdGhlbgo+IC0gIGNhc2UgIiAkTElCT0JKUyAiIGluCj4gLSAgKiIgbHN0YXQuJGFjX29iamV4
dCAiKiApIDs7Cj4gLSAgKikgTElCT0JKUz0iJExJQk9CSlMgbHN0YXQuJGFjX29iamV4dCIKPiAt
IDs7Cj4gLWVzYWMKPiAKPiAtZmkKPiArYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJ
TkVOTyIgImx6bWEuaCIgImFjX2N2X2hlYWRlcl9sem1hX2giICIkYWNfaW5jbHVkZXNfZGVmYXVs
dCIKPiAraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbHptYV9oIiA9IHgiInllczsgdGhlbiA6Cj4g
Cj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hl
dGhlciBzeXMvdHlwZXMuaCBkZWZpbmVzIG1ha2VkZXYiID4mNQo+IC0kYXNfZWNob19uICJjaGVj
a2luZyB3aGV0aGVyIHN5cy90eXBlcy5oIGRlZmluZXMgbWFrZWRldi4uLiAiID4mNjsgfQo+IC1p
ZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zeXNfdHlwZXNfaF9tYWtlZGV2K3NldH0iID0gc2V0OyB0
aGVuIDoKPiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2lu
ZyBmb3IgbHptYV9zdHJlYW1fZGVjb2RlciBpbiAtbGx6bWEiID4mNQo+ICskYXNfZWNob19uICJj
aGVja2luZyBmb3IgbHptYV9zdHJlYW1fZGVjb2RlciBpbiAtbGx6bWEuLi4gIiA+JjY7IH0KPiAr
aWYgdGVzdCAiJHthY19jdl9saWJfbHptYV9sem1hX3N0cmVhbV9kZWNvZGVyK3NldH0iID0gc2V0
OyB0aGVuIDoKPiAgICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgo+ICBlbHNlCj4gLSAgY2F0
IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAo+ICsgIGFjX2NoZWNrX2xp
Yl9zYXZlX0xJQlM9JExJQlMKPiArTElCUz0iLWxsem1hICAkTElCUyIKPiArY2F0IGNvbmZkZWZz
LmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAo+ICAvKiBlbmQgY29uZmRlZnMuaC4gICov
Cj4gLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KPiArCj4gKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50
ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgo+ICsgICBVc2UgY2hhciBiZWNhdXNl
IGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKPiArICAgYnVpbHRpbiBh
bmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KPiAr
I2lmZGVmIF9fY3BsdXNwbHVzCj4gK2V4dGVybiAiQyIKPiArI2VuZGlmCj4gK2NoYXIgbHptYV9z
dHJlYW1fZGVjb2RlciAoKTsKPiAgaW50Cj4gIG1haW4gKCkKPiAgewo+IC1yZXR1cm4gbWFrZWRl
digwLCAwKTsKPiArcmV0dXJuIGx6bWFfc3RyZWFtX2RlY29kZXIgKCk7Cj4gICAgOwo+ICAgIHJl
dHVybiAwOwo+ICB9Cj4gIF9BQ0VPRgo+ICBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsg
dGhlbiA6Cj4gLSAgYWNfY3ZfaGVhZGVyX3N5c190eXBlc19oX21ha2VkZXY9eWVzCj4gKyAgYWNf
Y3ZfbGliX2x6bWFfbHptYV9zdHJlYW1fZGVjb2Rlcj15ZXMKPiAgZWxzZQo+IC0gIGFjX2N2X2hl
YWRlcl9zeXNfdHlwZXNfaF9tYWtlZGV2PW5vCj4gKyAgYWNfY3ZfbGliX2x6bWFfbHptYV9zdHJl
YW1fZGVjb2Rlcj1ubwo+ICBmaQo+ICBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4k
YWNfb2JqZXh0IFwKPiAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Cj4g
LQo+IC1maQo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJGFjX2N2X2hlYWRlcl9zeXNfdHlwZXNfaF9tYWtlZGV2IiA+JjUKPiAtJGFzX2VjaG8gIiRh
Y19jdl9oZWFkZXJfc3lzX3R5cGVzX2hfbWFrZWRldiIgPiY2OyB9Cj4gLQo+IC1pZiB0ZXN0ICRh
Y19jdl9oZWFkZXJfc3lzX3R5cGVzX2hfbWFrZWRldiA9IG5vOyB0aGVuCj4gLWFjX2ZuX2NfY2hl
Y2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJzeXMvbWtkZXYuaCIgImFjX2N2X2hlYWRlcl9z
eXNfbWtkZXZfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0Igo+IC1pZiB0ZXN0ICJ4JGFjX2N2X2hl
YWRlcl9zeXNfbWtkZXZfaCIgPSB4IiJ5ZXM7IHRoZW4gOgo+IC0KPiAtJGFzX2VjaG8gIiNkZWZp
bmUgTUFKT1JfSU5fTUtERVYgMSIgPj5jb25mZGVmcy5oCj4gLQo+ICtMSUJTPSRhY19jaGVja19s
aWJfc2F2ZV9MSUJTCj4gIGZpCj4gLQo+IC0KPiAtCj4gLSAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVy
X3N5c19ta2Rldl9oID0gbm87IHRoZW4KPiAtICAgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdy
ZWwgIiRMSU5FTk8iICJzeXMvc3lzbWFjcm9zLmgiICJhY19jdl9oZWFkZXJfc3lzX3N5c21hY3Jv
c19oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCj4gLWlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3N5
c19zeXNtYWNyb3NfaCIgPSB4IiJ5ZXM7IHRoZW4gOgo+IC0KPiAtJGFzX2VjaG8gIiNkZWZpbmUg
TUFKT1JfSU5fU1lTTUFDUk9TIDEiID4+Y29uZmRlZnMuaAo+IC0KPiAreyAkYXNfZWNobyAiJGFz
X21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfbHptYV9sem1hX3N0
cmVhbV9kZWNvZGVyIiA+JjUKPiArJGFzX2VjaG8gIiRhY19jdl9saWJfbHptYV9sem1hX3N0cmVh
bV9kZWNvZGVyIiA+JjY7IH0KPiAraWYgdGVzdCAieCRhY19jdl9saWJfbHptYV9sem1hX3N0cmVh
bV9kZWNvZGVyIiA9IHgiInllczsgdGhlbiA6Cj4gKyAgemxpYj0iJHpsaWIgLURIQVZFX0xaTUEg
LWxsem1hIgo+ICBmaQo+IAo+IAo+IC0gIGZpCj4gIGZpCj4gCj4gLWZvciBhY19oZWFkZXIgaW4g
c3RkbGliLmgKPiAtZG8gOgo+IC0gIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5F
Tk8iICJzdGRsaWIuaCIgImFjX2N2X2hlYWRlcl9zdGRsaWJfaCIgIiRhY19pbmNsdWRlc19kZWZh
dWx0Igo+IC1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zdGRsaWJfaCIgPSB4IiJ5ZXM7IHRoZW4g
Ogo+IC0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKPiAtI2RlZmluZSBIQVZFX1NURExJQl9I
IDEKPiAtX0FDRU9GCj4gLQo+IC1maQo+IAo+IC1kb25lCj4gK2FjX2ZuX2NfY2hlY2tfaGVhZGVy
X21vbmdyZWwgIiRMSU5FTk8iICJsem8vbHpvMXguaCIgImFjX2N2X2hlYWRlcl9sem9fbHpvMXhf
aCIgIiRhY19pbmNsdWRlc19kZWZhdWx0Igo+ICtpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9sem9f
bHpvMXhfaCIgPSB4IiJ5ZXM7IHRoZW4gOgo+IAo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19s
aW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBHTlUgbGliYyBjb21wYXRpYmxlIG1hbGxvYyIg
PiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBHTlUgbGliYyBjb21wYXRpYmxlIG1hbGxv
Yy4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0ICIke2FjX2N2X2Z1bmNfbWFsbG9jXzBfbm9ubnVsbCtz
ZXR9IiA9IHNldDsgdGhlbiA6Cj4gK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogY2hlY2tpbmcgZm9yIGx6bzF4X2RlY29tcHJlc3MgaW4gLWxsem8yIiA+JjUKPiArJGFz
X2VjaG9fbiAiY2hlY2tpbmcgZm9yIGx6bzF4X2RlY29tcHJlc3MgaW4gLWxsem8yLi4uICIgPiY2
OyB9Cj4gK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2x6bzJfbHpvMXhfZGVjb21wcmVzcytzZXR9IiA9
IHNldDsgdGhlbiA6Cj4gICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAgZWxzZQo+IC0g
IGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKPiAtICBhY19jdl9mdW5j
X21hbGxvY18wX25vbm51bGw9bm8KPiAtZWxzZQo+IC0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNF
T0YgPmNvbmZ0ZXN0LiRhY19leHQKPiArICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCj4g
K0xJQlM9Ii1sbHpvMiAgJExJQlMiCj4gK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0
ZXN0LiRhY19leHQKPiAgLyogZW5kIGNvbmZkZWZzLmguICAqLwo+IC0jaWYgZGVmaW5lZCBTVERD
X0hFQURFUlMgfHwgZGVmaW5lZCBIQVZFX1NURExJQl9ICj4gLSMgaW5jbHVkZSA8c3RkbGliLmg+
Cj4gLSNlbHNlCj4gLWNoYXIgKm1hbGxvYyAoKTsKPiAtI2VuZGlmCj4gCj4gKy8qIE92ZXJyaWRl
IGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgo+ICsgICBVc2Ug
Y2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKPiAr
ICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFw
cGx5LiAgKi8KPiArI2lmZGVmIF9fY3BsdXNwbHVzCj4gK2V4dGVybiAiQyIKPiArI2VuZGlmCj4g
K2NoYXIgbHpvMXhfZGVjb21wcmVzcyAoKTsKPiAgaW50Cj4gIG1haW4gKCkKPiAgewo+IC1yZXR1
cm4gISBtYWxsb2MgKDApOwo+ICtyZXR1cm4gbHpvMXhfZGVjb21wcmVzcyAoKTsKPiAgICA7Cj4g
ICAgcmV0dXJuIDA7Cj4gIH0KPiAgX0FDRU9GCj4gLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVO
TyI7IHRoZW4gOgo+IC0gIGFjX2N2X2Z1bmNfbWFsbG9jXzBfbm9ubnVsbD15ZXMKPiAraWYgYWNf
Zm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgo+ICsgIGFjX2N2X2xpYl9sem8yX2x6bzF4
X2RlY29tcHJlc3M9eWVzCj4gIGVsc2UKPiAtICBhY19jdl9mdW5jX21hbGxvY18wX25vbm51bGw9
bm8KPiArICBhY19jdl9saWJfbHpvMl9sem8xeF9kZWNvbXByZXNzPW5vCj4gIGZpCj4gLXJtIC1m
IGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNf
ZXhlZXh0IFwKPiAtICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3Qu
JGFjX2V4dAo+ICtybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwK
PiArICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Cj4gK0xJQlM9JGFjX2No
ZWNrX2xpYl9zYXZlX0xJQlMKPiAgZmkKPiAtCj4gK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xp
bmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2x6bzJfbHpvMXhfZGVjb21wcmVzcyIg
PiY1Cj4gKyRhc19lY2hvICIkYWNfY3ZfbGliX2x6bzJfbHpvMXhfZGVjb21wcmVzcyIgPiY2OyB9
Cj4gK2lmIHRlc3QgIngkYWNfY3ZfbGliX2x6bzJfbHpvMXhfZGVjb21wcmVzcyIgPSB4IiJ5ZXM7
IHRoZW4gOgo+ICsgIHpsaWI9IiR6bGliIC1ESEFWRV9MWk8xWCAtbGx6bzIiCj4gIGZpCj4gLXsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVu
Y19tYWxsb2NfMF9ub25udWxsIiA+JjUKPiAtJGFzX2VjaG8gIiRhY19jdl9mdW5jX21hbGxvY18w
X25vbm51bGwiID4mNjsgfQo+IC1pZiB0ZXN0ICRhY19jdl9mdW5jX21hbGxvY18wX25vbm51bGwg
PSB5ZXM7IHRoZW4gOgo+IC0KPiAtJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9NQUxMT0MgMSIgPj5j
b25mZGVmcy5oCj4gLQo+IC1lbHNlCj4gLSAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9NQUxMT0Mg
MCIgPj5jb25mZGVmcy5oCj4gLQo+IC0gICBjYXNlICIgJExJQk9CSlMgIiBpbgo+IC0gICoiIG1h
bGxvYy4kYWNfb2JqZXh0ICIqICkgOzsKPiAtICAqKSBMSUJPQkpTPSIkTElCT0JKUyBtYWxsb2Mu
JGFjX29iamV4dCIKPiAtIDs7Cj4gLWVzYWMKPiAtCj4gCj4gLSRhc19lY2hvICIjZGVmaW5lIG1h
bGxvYyBycGxfbWFsbG9jIiA+PmNvbmZkZWZzLmgKPiAKPiAgZmkKPiAKPiAKPiAteyAkYXNfZWNo
byAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBh
bmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZCIgPiY1Cj4gLSRhc19lY2hvX24gImNo
ZWNraW5nIHdoZXRoZXIgdGltZS5oIGFuZCBzeXMvdGltZS5oIG1heSBib3RoIGJlIGluY2x1ZGVk
Li4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3RpbWUrc2V0fSIgPSBzZXQ7
IHRoZW4gOgo+ICsKPiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBj
aGVja2luZyBmb3IgaW9fc2V0dXAgaW4gLWxhaW8iID4mNQo+ICskYXNfZWNob19uICJjaGVja2lu
ZyBmb3IgaW9fc2V0dXAgaW4gLWxhaW8uLi4gIiA+JjY7IH0KPiAraWYgdGVzdCAiJHthY19jdl9s
aWJfYWlvX2lvX3NldHVwK3NldH0iID0gc2V0OyB0aGVuIDoKPiAgICAkYXNfZWNob19uICIoY2Fj
aGVkKSAiID4mNgo+ICBlbHNlCj4gLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRl
c3QuJGFjX2V4dAo+ICsgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKPiArTElCUz0iLWxh
aW8gICRMSUJTIgo+ICtjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0
Cj4gIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KPiAtI2luY2x1ZGUgPHN5cy90eXBlcy5oPgo+IC0j
aW5jbHVkZSA8c3lzL3RpbWUuaD4KPiAtI2luY2x1ZGUgPHRpbWUuaD4KPiAKPiArLyogT3ZlcnJp
ZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCj4gKyAgIFVz
ZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwo+
ICsgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwg
YXBwbHkuICAqLwo+ICsjaWZkZWYgX19jcGx1c3BsdXMKPiArZXh0ZXJuICJDIgo+ICsjZW5kaWYK
PiArY2hhciBpb19zZXR1cCAoKTsKPiAgaW50Cj4gIG1haW4gKCkKPiAgewo+IC1pZiAoKHN0cnVj
dCB0bSAqKSAwKQo+IC1yZXR1cm4gMDsKPiArcmV0dXJuIGlvX3NldHVwICgpOwo+ICAgIDsKPiAg
ICByZXR1cm4gMDsKPiAgfQo+ICBfQUNFT0YKPiAtaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJ
TkVOTyI7IHRoZW4gOgo+IC0gIGFjX2N2X2hlYWRlcl90aW1lPXllcwo+ICtpZiBhY19mbl9jX3Ry
eV9saW5rICIkTElORU5PIjsgdGhlbiA6Cj4gKyAgYWNfY3ZfbGliX2Fpb19pb19zZXR1cD15ZXMK
PiAgZWxzZQo+IC0gIGFjX2N2X2hlYWRlcl90aW1lPW5vCj4gLWZpCj4gLXJtIC1mIGNvcmUgY29u
ZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAo+IC1maQo+IC17
ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hl
YWRlcl90aW1lIiA+JjUKPiAtJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfdGltZSIgPiY2OyB9Cj4g
LWlmIHRlc3QgJGFjX2N2X2hlYWRlcl90aW1lID0geWVzOyB0aGVuCj4gLQo+IC0kYXNfZWNobyAi
I2RlZmluZSBUSU1FX1dJVEhfU1lTX1RJTUUgMSIgPj5jb25mZGVmcy5oCj4gLQo+ICsgIGFjX2N2
X2xpYl9haW9faW9fc2V0dXA9bm8KPiAgZmkKPiAtCj4gLQo+IC0KPiAtCj4gLSAgZm9yIGFjX2hl
YWRlciBpbiAkYWNfaGVhZGVyX2xpc3QKPiAtZG8gOgo+IC0gIGFzX2FjX0hlYWRlcj1gJGFzX2Vj
aG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKPiAtYWNfZm5fY19jaGVj
a19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAi
JGFjX2luY2x1ZGVzX2RlZmF1bHQKPiAtIgo+IC1pZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hl
YWRlciJcIiA9IHgieWVzIjsgdGhlbiA6Cj4gLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgo+
IC0jZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKPiAt
X0FDRU9GCj4gLQo+ICtybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0
IFwKPiArICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Cj4gK0xJQlM9JGFj
X2NoZWNrX2xpYl9zYXZlX0xJQlMKPiAgZmkKPiAtCj4gLWRvbmUKPiAtCj4gLQo+IC0KPiAtCj4g
LQo+IC0KPiAtCj4gLQo+IC0gIGZvciBhY19mdW5jIGluICRhY19mdW5jX2xpc3QKPiAtZG8gOgo+
IC0gIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3No
YAo+IC1hY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIi
Cj4gLWlmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKPiAt
ICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCj4gLSNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRh
Y19mdW5jIiB8ICRhc190cl9jcHBgIDEKPiAtX0FDRU9GCj4gLQo+ICt7ICRhc19lY2hvICIkYXNf
bWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9haW9faW9fc2V0dXAi
ID4mNQo+ICskYXNfZWNobyAiJGFjX2N2X2xpYl9haW9faW9fc2V0dXAiID4mNjsgfQo+ICtpZiB0
ZXN0ICJ4JGFjX2N2X2xpYl9haW9faW9fc2V0dXAiID0geCIieWVzOyB0aGVuIDoKPiArICBzeXN0
ZW1fYWlvPSJ5Igo+ICtlbHNlCj4gKyAgc3lzdGVtX2Fpbz0ibiIKPiAgZmkKPiAtZG9uZQo+IC0K
PiAKPiAKPiAtCj4gLQo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306
IGNoZWNraW5nIGZvciB3b3JraW5nIG1rdGltZSIgPiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5n
IGZvciB3b3JraW5nIG1rdGltZS4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0ICIke2FjX2N2X2Z1bmNf
d29ya2luZ19ta3RpbWUrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICt7ICRhc19lY2hvICIkYXNfbWU6
JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBNRDUgaW4gLWxjcnlwdG8iID4mNQo+
ICskYXNfZWNob19uICJjaGVja2luZyBmb3IgTUQ1IGluIC1sY3J5cHRvLi4uICIgPiY2OyB9Cj4g
K2lmIHRlc3QgIiR7YWNfY3ZfbGliX2NyeXB0b19NRDUrc2V0fSIgPSBzZXQ7IHRoZW4gOgo+ICAg
ICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cj4gIGVsc2UKPiAtICBpZiB0ZXN0ICIkY3Jvc3Nf
Y29tcGlsaW5nIiA9IHllczsgdGhlbiA6Cj4gLSAgYWNfY3ZfZnVuY193b3JraW5nX21rdGltZT1u
bwo+IC1lbHNlCj4gLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4
dAo+ICsgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKPiArTElCUz0iLWxjcnlwdG8gICRM
SUJTIgo+ICtjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Cj4gIC8q
IGVuZCBjb25mZGVmcy5oLiAgKi8KPiAtLyogVGVzdCBwcm9ncmFtIGZyb20gUGF1bCBFZ2dlcnQg
YW5kIFRvbnkgTGVuZWlzLiAgKi8KPiAtI2lmZGVmIFRJTUVfV0lUSF9TWVNfVElNRQo+IC0jIGlu
Y2x1ZGUgPHN5cy90aW1lLmg+Cj4gLSMgaW5jbHVkZSA8dGltZS5oPgo+IC0jZWxzZQo+IC0jIGlm
ZGVmIEhBVkVfU1lTX1RJTUVfSAo+IC0jICBpbmNsdWRlIDxzeXMvdGltZS5oPgo+IC0jIGVsc2UK
PiAtIyAgaW5jbHVkZSA8dGltZS5oPgo+IC0jIGVuZGlmCj4gLSNlbmRpZgo+IC0KPiAtI2luY2x1
ZGUgPGxpbWl0cy5oPgo+IC0jaW5jbHVkZSA8c3RkbGliLmg+Cj4gCj4gLSNpZmRlZiBIQVZFX1VO
SVNURF9ICj4gLSMgaW5jbHVkZSA8dW5pc3RkLmg+Cj4gLSNlbmRpZgo+IC0KPiAtI2lmbmRlZiBI
QVZFX0FMQVJNCj4gLSMgZGVmaW5lIGFsYXJtKFgpIC8qIGVtcHR5ICovCj4gKy8qIE92ZXJyaWRl
IGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgo+ICsgICBVc2Ug
Y2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKPiAr
ICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFw
cGx5LiAgKi8KPiArI2lmZGVmIF9fY3BsdXNwbHVzCj4gK2V4dGVybiAiQyIKPiAgI2VuZGlmCj4g
LQo+IC0vKiBXb3JrIGFyb3VuZCByZWRlZmluaXRpb24gdG8gcnBsX3B1dGVudiBieSBvdGhlciBj
b25maWcgdGVzdHMuICAqLwo+IC0jdW5kZWYgcHV0ZW52Cj4gLQo+IC1zdGF0aWMgdGltZV90IHRp
bWVfdF9tYXg7Cj4gLXN0YXRpYyB0aW1lX3QgdGltZV90X21pbjsKPiAtCj4gLS8qIFZhbHVlcyB3
ZSdsbCB1c2UgdG8gc2V0IHRoZSBUWiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gICovCj4gLXN0YXRp
YyBjb25zdCBjaGFyICp0el9zdHJpbmdzW10gPSB7Cj4gLSAgKGNvbnN0IGNoYXIgKikgMCwgIlRa
PUdNVDAiLCAiVFo9SlNULTkiLAo+IC0gICJUWj1FU1QrM0VEVCsyLE0xMC4xLjAvMDA6MDA6MDAs
TTIuMy4wLzAwOjAwOjAwIgo+IC19Owo+IC0jZGVmaW5lIE5fU1RSSU5HUyAoc2l6ZW9mICh0el9z
dHJpbmdzKSAvIHNpemVvZiAodHpfc3RyaW5nc1swXSkpCj4gLQo+IC0vKiBSZXR1cm4gMCBpZiBt
a3RpbWUgZmFpbHMgdG8gY29udmVydCBhIGRhdGUgaW4gdGhlIHNwcmluZy1mb3J3YXJkIGdhcC4K
PiAtICAgQmFzZWQgb24gYSBwcm9ibGVtIHJlcG9ydCBmcm9tIEFuZHJlYXMgSmFlZ2VyLiAgKi8K
PiAtc3RhdGljIGludAo+IC1zcHJpbmdfZm9yd2FyZF9nYXAgKCkKPiAtewo+IC0gIC8qIGdsaWJj
ICh1cCB0byBhYm91dCAxOTk4LTEwLTA3KSBmYWlsZWQgdGhpcyB0ZXN0LiAqLwo+IC0gIHN0cnVj
dCB0bSB0bTsKPiAtCj4gLSAgLyogVXNlIHRoZSBwb3J0YWJsZSBQT1NJWC4xIHNwZWNpZmljYXRp
b24gIlRaPVBTVDhQRFQsTTQuMS4wLE0xMC41LjAiCj4gLSAgICAgaW5zdGVhZCBvZiAiVFo9QW1l
cmljYS9WYW5jb3V2ZXIiIGluIG9yZGVyIHRvIGRldGVjdCB0aGUgYnVnIGV2ZW4KPiAtICAgICBv
biBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGUgT2xzb24gZXh0ZW5zaW9uLCBvciBkb24n
dCBoYXZlIHRoZQo+IC0gICAgIGZ1bGwgem9uZWluZm8gdGFibGVzIGluc3RhbGxlZC4gICovCj4g
LSAgcHV0ZW52ICgoY2hhciopICJUWj1QU1Q4UERULE00LjEuMCxNMTAuNS4wIik7Cj4gLQo+IC0g
IHRtLnRtX3llYXIgPSA5ODsKPiAtICB0bS50bV9tb24gPSAzOwo+IC0gIHRtLnRtX21kYXkgPSA1
Owo+IC0gIHRtLnRtX2hvdXIgPSAyOwo+IC0gIHRtLnRtX21pbiA9IDA7Cj4gLSAgdG0udG1fc2Vj
ID0gMDsKPiAtICB0bS50bV9pc2RzdCA9IC0xOwo+IC0gIHJldHVybiBta3RpbWUgKCZ0bSkgIT0g
KHRpbWVfdCkgLTE7Cj4gLX0KPiAtCj4gLXN0YXRpYyBpbnQKPiAtbWt0aW1lX3Rlc3QxICh0aW1l
X3Qgbm93KQo+IC17Cj4gLSAgc3RydWN0IHRtICpsdDsKPiAtICByZXR1cm4gISAobHQgPSBsb2Nh
bHRpbWUgKCZub3cpKSB8fCBta3RpbWUgKGx0KSA9PSBub3c7Cj4gLX0KPiAtCj4gLXN0YXRpYyBp
bnQKPiAtbWt0aW1lX3Rlc3QgKHRpbWVfdCBub3cpCj4gLXsKPiAtICByZXR1cm4gKG1rdGltZV90
ZXN0MSAobm93KQo+IC0gICAgICAgICAmJiBta3RpbWVfdGVzdDEgKCh0aW1lX3QpICh0aW1lX3Rf
bWF4IC0gbm93KSkKPiAtICAgICAgICAgJiYgbWt0aW1lX3Rlc3QxICgodGltZV90KSAodGltZV90
X21pbiArIG5vdykpKTsKPiAtfQo+IC0KPiAtc3RhdGljIGludAo+IC1pcml4XzZfNF9idWcgKCkK
PiAtewo+IC0gIC8qIEJhc2VkIG9uIGNvZGUgZnJvbSBBcmllbCBGYWlnb24uICAqLwo+IC0gIHN0
cnVjdCB0bSB0bTsKPiAtICB0bS50bV95ZWFyID0gOTY7Cj4gLSAgdG0udG1fbW9uID0gMzsKPiAt
ICB0bS50bV9tZGF5ID0gMDsKPiAtICB0bS50bV9ob3VyID0gMDsKPiAtICB0bS50bV9taW4gPSAw
Owo+IC0gIHRtLnRtX3NlYyA9IDA7Cj4gLSAgdG0udG1faXNkc3QgPSAtMTsKPiAtICBta3RpbWUg
KCZ0bSk7Cj4gLSAgcmV0dXJuIHRtLnRtX21vbiA9PSAyICYmIHRtLnRtX21kYXkgPT0gMzE7Cj4g
LX0KPiAtCj4gLXN0YXRpYyBpbnQKPiAtYmlndGltZV90ZXN0IChpbnQgaikKPiAtewo+IC0gIHN0
cnVjdCB0bSB0bTsKPiAtICB0aW1lX3Qgbm93Owo+IC0gIHRtLnRtX3llYXIgPSB0bS50bV9tb24g
PSB0bS50bV9tZGF5ID0gdG0udG1faG91ciA9IHRtLnRtX21pbiA9IHRtLnRtX3NlYyA9IGo7Cj4g
LSAgbm93ID0gbWt0aW1lICgmdG0pOwo+IC0gIGlmIChub3cgIT0gKHRpbWVfdCkgLTEpCj4gLSAg
ICB7Cj4gLSAgICAgIHN0cnVjdCB0bSAqbHQgPSBsb2NhbHRpbWUgKCZub3cpOwo+IC0gICAgICBp
ZiAoISAobHQKPiAtICAgICAgICAgICAgJiYgbHQtPnRtX3llYXIgPT0gdG0udG1feWVhcgo+IC0g
ICAgICAgICAgICAmJiBsdC0+dG1fbW9uID09IHRtLnRtX21vbgo+IC0gICAgICAgICAgICAmJiBs
dC0+dG1fbWRheSA9PSB0bS50bV9tZGF5Cj4gLSAgICAgICAgICAgICYmIGx0LT50bV9ob3VyID09
IHRtLnRtX2hvdXIKPiAtICAgICAgICAgICAgJiYgbHQtPnRtX21pbiA9PSB0bS50bV9taW4KPiAt
ICAgICAgICAgICAgJiYgbHQtPnRtX3NlYyA9PSB0bS50bV9zZWMKPiAtICAgICAgICAgICAgJiYg
bHQtPnRtX3lkYXkgPT0gdG0udG1feWRheQo+IC0gICAgICAgICAgICAmJiBsdC0+dG1fd2RheSA9
PSB0bS50bV93ZGF5Cj4gLSAgICAgICAgICAgICYmICgobHQtPnRtX2lzZHN0IDwgMCA/IC0xIDog
MCA8IGx0LT50bV9pc2RzdCkKPiAtICAgICAgICAgICAgICAgICA9PSAodG0udG1faXNkc3QgPCAw
ID8gLTEgOiAwIDwgdG0udG1faXNkc3QpKSkpCj4gLSAgICAgICByZXR1cm4gMDsKPiAtICAgIH0K
PiAtICByZXR1cm4gMTsKPiAtfQo+IC0KPiAtc3RhdGljIGludAo+IC15ZWFyXzIwNTBfdGVzdCAo
KQo+IC17Cj4gLSAgLyogVGhlIGNvcnJlY3QgYW5zd2VyIGZvciAyMDUwLTAyLTAxIDAwOjAwOjAw
IGluIFBhY2lmaWMgdGltZSwKPiAtICAgICBpZ25vcmluZyBsZWFwIHNlY29uZHMuICAqLwo+IC0g
IHVuc2lnbmVkIGxvbmcgaW50IGFuc3dlciA9IDI1MjczMTUyMDBVTDsKPiAtCj4gLSAgc3RydWN0
IHRtIHRtOwo+IC0gIHRpbWVfdCB0Owo+IC0gIHRtLnRtX3llYXIgPSAyMDUwIC0gMTkwMDsKPiAt
ICB0bS50bV9tb24gPSAyIC0gMTsKPiAtICB0bS50bV9tZGF5ID0gMTsKPiAtICB0bS50bV9ob3Vy
ID0gdG0udG1fbWluID0gdG0udG1fc2VjID0gMDsKPiAtICB0bS50bV9pc2RzdCA9IC0xOwo+IC0K
PiAtICAvKiBVc2UgdGhlIHBvcnRhYmxlIFBPU0lYLjEgc3BlY2lmaWNhdGlvbiAiVFo9UFNUOFBE
VCxNNC4xLjAsTTEwLjUuMCIKPiAtICAgICBpbnN0ZWFkIG9mICJUWj1BbWVyaWNhL1ZhbmNvdXZl
ciIgaW4gb3JkZXIgdG8gZGV0ZWN0IHRoZSBidWcgZXZlbgo+IC0gICAgIG9uIHN5c3RlbXMgdGhh
dCBkb24ndCBzdXBwb3J0IHRoZSBPbHNvbiBleHRlbnNpb24sIG9yIGRvbid0IGhhdmUgdGhlCj4g
LSAgICAgZnVsbCB6b25laW5mbyB0YWJsZXMgaW5zdGFsbGVkLiAgKi8KPiAtICBwdXRlbnYgKChj
aGFyKikgIlRaPVBTVDhQRFQsTTQuMS4wLE0xMC41LjAiKTsKPiAtCj4gLSAgdCA9IG1rdGltZSAo
JnRtKTsKPiAtCj4gLSAgLyogQ2hlY2sgdGhhdCB0aGUgcmVzdWx0IGlzIGVpdGhlciBhIGZhaWx1
cmUsIG9yIGNsb3NlIGVub3VnaAo+IC0gICAgIHRvIHRoZSBjb3JyZWN0IGFuc3dlciB0aGF0IHdl
IGNhbiBhc3N1bWUgdGhlIGRpc2NyZXBhbmN5IGlzCj4gLSAgICAgZHVlIHRvIGxlYXAgc2Vjb25k
cy4gICovCj4gLSAgcmV0dXJuICh0ID09ICh0aW1lX3QpIC0xCj4gLSAgICAgICAgIHx8ICgwIDwg
dCAmJiBhbnN3ZXIgLSAxMjAgPD0gdCAmJiB0IDw9IGFuc3dlciArIDEyMCkpOwo+IC19Cj4gLQo+
ICtjaGFyIE1ENSAoKTsKPiAgaW50Cj4gIG1haW4gKCkKPiAgewo+IC0gIHRpbWVfdCB0LCBkZWx0
YTsKPiAtICBpbnQgaSwgajsKPiAtCj4gLSAgLyogVGhpcyB0ZXN0IG1ha2VzIHNvbWUgYnVnZ3kg
bWt0aW1lIGltcGxlbWVudGF0aW9ucyBsb29wLgo+IC0gICAgIEdpdmUgdXAgYWZ0ZXIgNjAgc2Vj
b25kczsgYSBta3RpbWUgc2xvd2VyIHRoYW4gdGhhdAo+IC0gICAgIGlzbid0IHdvcnRoIHVzaW5n
IGFueXdheS4gICovCj4gLSAgYWxhcm0gKDYwKTsKPiAtCj4gLSAgZm9yICg7OykKPiAtICAgIHsK
PiAtICAgICAgdCA9ICh0aW1lX3RfbWF4IDw8IDEpICsgMTsKPiAtICAgICAgaWYgKHQgPD0gdGlt
ZV90X21heCkKPiAtICAgICAgIGJyZWFrOwo+IC0gICAgICB0aW1lX3RfbWF4ID0gdDsKPiAtICAg
IH0KPiAtICB0aW1lX3RfbWluID0gLSAoKHRpbWVfdCkgfiAodGltZV90KSAwID09ICh0aW1lX3Qp
IC0xKSAtIHRpbWVfdF9tYXg7Cj4gLQo+IC0gIGRlbHRhID0gdGltZV90X21heCAvIDk5NzsgLyog
YSBzdWl0YWJsZSBwcmltZSBudW1iZXIgKi8KPiAtICBmb3IgKGkgPSAwOyBpIDwgTl9TVFJJTkdT
OyBpKyspCj4gLSAgICB7Cj4gLSAgICAgIGlmICh0el9zdHJpbmdzW2ldKQo+IC0gICAgICAgcHV0
ZW52ICgoY2hhciopIHR6X3N0cmluZ3NbaV0pOwo+IC0KPiAtICAgICAgZm9yICh0ID0gMDsgdCA8
PSB0aW1lX3RfbWF4IC0gZGVsdGE7IHQgKz0gZGVsdGEpCj4gLSAgICAgICBpZiAoISBta3RpbWVf
dGVzdCAodCkpCj4gLSAgICAgICAgIHJldHVybiAxOwo+IC0gICAgICBpZiAoISAobWt0aW1lX3Rl
c3QgKCh0aW1lX3QpIDEpCj4gLSAgICAgICAgICAgICYmIG1rdGltZV90ZXN0ICgodGltZV90KSAo
NjAgKiA2MCkpCj4gLSAgICAgICAgICAgICYmIG1rdGltZV90ZXN0ICgodGltZV90KSAoNjAgKiA2
MCAqIDI0KSkpKQo+IC0gICAgICAgcmV0dXJuIDE7Cj4gLQo+IC0gICAgICBmb3IgKGogPSAxOyA7
IGogPDw9IDEpCj4gLSAgICAgICBpZiAoISBiaWd0aW1lX3Rlc3QgKGopKQo+IC0gICAgICAgICBy
ZXR1cm4gMTsKPiAtICAgICAgIGVsc2UgaWYgKElOVF9NQVggLyAyIDwgaikKPiAtICAgICAgICAg
YnJlYWs7Cj4gLSAgICAgIGlmICghIGJpZ3RpbWVfdGVzdCAoSU5UX01BWCkpCj4gLSAgICAgICBy
ZXR1cm4gMTsKPiAtICAgIH0KPiAtICByZXR1cm4gISAoaXJpeF82XzRfYnVnICgpICYmIHNwcmlu
Z19mb3J3YXJkX2dhcCAoKSAmJiB5ZWFyXzIwNTBfdGVzdCAoKSk7Cj4gK3JldHVybiBNRDUgKCk7
Cj4gKyAgOwo+ICsgIHJldHVybiAwOwo+ICB9Cj4gIF9BQ0VPRgo+IC1pZiBhY19mbl9jX3RyeV9y
dW4gIiRMSU5FTk8iOyB0aGVuIDoKPiAtICBhY19jdl9mdW5jX3dvcmtpbmdfbWt0aW1lPXllcwo+
ICtpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Cj4gKyAgYWNfY3ZfbGliX2Ny
eXB0b19NRDU9eWVzCj4gIGVsc2UKPiAtICBhY19jdl9mdW5jX3dvcmtpbmdfbWt0aW1lPW5vCj4g
LWZpCj4gLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQg
Y29uZnRlc3QkYWNfZXhlZXh0IFwKPiAtICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJl
YW0gY29uZnRlc3QuJGFjX2V4dAo+IC1maQo+IC0KPiArICBhY19jdl9saWJfY3J5cHRvX01ENT1u
bwo+ICBmaQo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJGFjX2N2X2Z1bmNfd29ya2luZ19ta3RpbWUiID4mNQo+IC0kYXNfZWNobyAiJGFjX2N2X2Z1
bmNfd29ya2luZ19ta3RpbWUiID4mNjsgfQo+IC1pZiB0ZXN0ICRhY19jdl9mdW5jX3dvcmtpbmdf
bWt0aW1lID0gbm87IHRoZW4KPiAtICBjYXNlICIgJExJQk9CSlMgIiBpbgo+IC0gICoiIG1rdGlt
ZS4kYWNfb2JqZXh0ICIqICkgOzsKPiAtICAqKSBMSUJPQkpTPSIkTElCT0JKUyBta3RpbWUuJGFj
X29iamV4dCIKPiAtIDs7Cj4gLWVzYWMKPiAtCj4gK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNv
bmZ0ZXN0LiRhY19vYmpleHQgXAo+ICsgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRh
Y19leHQKPiArTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwo+ICBmaQo+IC0KPiAtCj4gLQo+
IC0KPiAtCj4gLQo+IC1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQo+IC1kbyA6Cj4gLSAgYWNf
Zm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZ2V0cGFnZXNpemUiICJhY19jdl9mdW5jX2dldHBh
Z2VzaXplIgo+IC1pZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0cGFnZXNpemUiID0geCIieWVzOyB0
aGVuIDoKPiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6
ICRhY19jdl9saWJfY3J5cHRvX01ENSIgPiY1Cj4gKyRhc19lY2hvICIkYWNfY3ZfbGliX2NyeXB0
b19NRDUiID4mNjsgfQo+ICtpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9jcnlwdG9fTUQ1IiA9IHgiInll
czsgdGhlbiA6Cj4gICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgo+IC0jZGVmaW5lIEhBVkVf
R0VUUEFHRVNJWkUgMQo+ICsjZGVmaW5lIEhBVkVfTElCQ1JZUFRPIDEKPiAgX0FDRU9GCj4gCj4g
KyAgTElCUz0iLWxjcnlwdG8gJExJQlMiCj4gKwo+ICtlbHNlCj4gKyAgYXNfZm5fZXJyb3IgJD8g
IkNvdWxkIG5vdCBmaW5kIGxpYmNyeXB0byIgIiRMSU5FTk8iIDUKPiAgZmkKPiAtZG9uZQo+IAo+
IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3
b3JraW5nIG1tYXAiID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFw
Li4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCtz
ZXR9IiA9IHNldDsgdGhlbiA6Cj4gK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogY2hlY2tpbmcgZm9yIGV4dDJmc19vcGVuMiBpbiAtbGV4dDJmcyIgPiY1Cj4gKyRhc19l
Y2hvX24gImNoZWNraW5nIGZvciBleHQyZnNfb3BlbjIgaW4gLWxleHQyZnMuLi4gIiA+JjY7IH0K
PiAraWYgdGVzdCAiJHthY19jdl9saWJfZXh0MmZzX2V4dDJmc19vcGVuMitzZXR9IiA9IHNldDsg
dGhlbiA6Cj4gICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKPiAgZWxzZQo+IC0gIGlmIHRl
c3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKPiAtICBhY19jdl9mdW5jX21tYXBf
Zml4ZWRfbWFwcGVkPW5vCj4gLWVsc2UKPiAtICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5j
b25mdGVzdC4kYWNfZXh0Cj4gKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwo+ICtMSUJT
PSItbGV4dDJmcyAgJExJQlMiCj4gK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0
LiRhY19leHQKPiAgLyogZW5kIGNvbmZkZWZzLmguICAqLwo+IC0kYWNfaW5jbHVkZXNfZGVmYXVs
dAo+IC0vKiBtYWxsb2MgbWlnaHQgaGF2ZSBiZWVuIHJlbmFtZWQgYXMgcnBsX21hbGxvYy4gKi8K
PiAtI3VuZGVmIG1hbGxvYwo+IC0KPiAtLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmlt
IEF2ZXJhIGZvciB0aGlzIHRlc3QuCj4gLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3Nz
aWJpbGl0aWVzOgo+IC0gICAgICAgbW1hcCBwcml2YXRlIG5vdCBmaXhlZAo+IC0gICAgICAgbW1h
cCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKPiAtICAgICAg
IG1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKPiAtICAgICAg
IG1tYXAgc2hhcmVkIG5vdCBmaXhlZAo+IC0gICAgICAgbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29t
ZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAo+IC0gICAgICAgbW1hcCBzaGFyZWQgZml4ZWQgYXQg
c29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCj4gLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBz
aG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCj4gLSAgIGJhY2sgZnJv
bSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQK
PiAtICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdh
cyBub3QgY29ycmVjdGx5Cj4gLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYg
c3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKPiAtICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90
IGNvaGVyZW50IHdpdGggdGhlIGZpbGUgc3lzdGVtIGJ1ZmZlciBjYWNoZQo+IC0gICBsaWtlIGVh
cmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0Qu
KQo+IC0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkg
dGhhdCBjaGFuZ2VzIGdldAo+IC0gICBwcm9wYWdhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMg
dGhleSdyZSBzdXBwb3NlZCB0byBiZS4KPiAtCj4gLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhl
ZCBhbHJlYWR5IG1hcHBlZC4KPiAtICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25v
dyBhYm91dCBtbWFwIGFyZToKPiAtICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRv
IHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCj4gLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZh
cmlhbnRzKSAgKi8KPiAtCj4gLSNpbmNsdWRlIDxmY250bC5oPgo+IC0jaW5jbHVkZSA8c3lzL21t
YW4uaD4KPiAtCj4gLSNpZiAhZGVmaW5lZCBTVERDX0hFQURFUlMgJiYgIWRlZmluZWQgSEFWRV9T
VERMSUJfSAo+IC1jaGFyICptYWxsb2MgKCk7Cj4gLSNlbmRpZgo+IC0KPiAtLyogVGhpcyBtZXNz
IHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwo+IC0jaWZuZGVmIEhB
VkVfR0VUUEFHRVNJWkUKPiAtIyBpZmRlZiBfU0NfUEFHRVNJWkUKPiAtIyAgZGVmaW5lIGdldHBh
Z2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCj4gLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJ
WkUgKi8KPiAtIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAo+IC0jICAgaW5jbHVkZSA8c3lzL3Bh
cmFtLmg+Cj4gLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCj4gLSMgICAgZGVmaW5lIGdldHBhZ2Vz
aXplKCkgRVhFQ19QQUdFU0laRQo+IC0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCj4g
LSMgICAgaWZkZWYgTkJQRwo+IC0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xT
SVpFCj4gLSMgICAgIGlmbmRlZiBDTFNJWkUKPiAtIyAgICAgIGRlZmluZSBDTFNJWkUgMQo+IC0j
ICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KPiAtIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KPiAt
IyAgICAgaWZkZWYgTkJQQwo+IC0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwo+IC0j
ICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KPiAtIyAgICAgIGlmZGVmIFBBR0VTSVpFCj4gLSMgICAg
ICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKPiAtIyAgICAgIGVuZGlmIC8qIFBBR0VT
SVpFICovCj4gLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KPiAtIyAgICBlbmRpZiAvKiBubyBO
QlBHICovCj4gLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCj4gLSMgIGVsc2UgLyog
bm8gSEFWRV9TWVNfUEFSQU1fSCAqLwo+IC0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MiAg
LyogcHVudCB0b3RhbGx5ICovCj4gLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8K
PiAtIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KPiAtCj4gLSNlbmRpZiAvKiBubyBIQVZF
X0dFVFBBR0VTSVpFICovCj4gCj4gKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90
eXBlIHRvIGF2b2lkIGFuIGVycm9yLgo+ICsgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBt
YXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKPiArICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMg
YXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KPiArI2lmZGVmIF9fY3Bs
dXNwbHVzCj4gK2V4dGVybiAiQyIKPiArI2VuZGlmCj4gK2NoYXIgZXh0MmZzX29wZW4yICgpOwo+
ICBpbnQKPiAgbWFpbiAoKQo+ICB7Cj4gLSAgY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Cj4g
LSAgY29uc3QgY2hhciAqY2RhdGEyOwo+IC0gIGludCBpLCBwYWdlc2l6ZTsKPiAtICBpbnQgZmQs
IGZkMjsKPiAtCj4gLSAgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSAoKTsKPiAtCj4gLSAgLyogRmly
c3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LiAqLwo+IC0gIGRh
dGEgPSAoY2hhciAqKSBtYWxsb2MgKHBhZ2VzaXplKTsKPiAtICBpZiAoIWRhdGEpCj4gLSAgICBy
ZXR1cm4gMTsKPiAtICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKPiAtICAgICooZGF0
YSArIGkpID0gcmFuZCAoKTsKPiAtICB1bWFzayAoMCk7Cj4gLSAgZmQgPSBjcmVhdCAoImNvbmZ0
ZXN0Lm1tYXAiLCAwNjAwKTsKPiAtICBpZiAoZmQgPCAwKQo+IC0gICAgcmV0dXJuIDI7Cj4gLSAg
aWYgKHdyaXRlIChmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQo+IC0gICAgcmV0dXJu
IDM7Cj4gLSAgY2xvc2UgKGZkKTsKPiAtCj4gLSAgLyogTmV4dCwgY2hlY2sgdGhhdCB0aGUgdGFp
bCBvZiBhIHBhZ2UgaXMgemVyby1maWxsZWQuICBGaWxlIG11c3QgaGF2ZQo+IC0gICAgIG5vbi16
ZXJvIGxlbmd0aCwgb3RoZXJ3aXNlIHdlIHJpc2sgU0lHQlVTIGZvciBlbnRpcmUgcGFnZS4gICov
Cj4gLSAgZmQyID0gb3BlbiAoImNvbmZ0ZXN0LnR4dCIsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RS
VU5DLCAwNjAwKTsKPiAtICBpZiAoZmQyIDwgMCkKPiAtICAgIHJldHVybiA0Owo+IC0gIGNkYXRh
MiA9ICIiOwo+IC0gIGlmICh3cml0ZSAoZmQyLCBjZGF0YTIsIDEpICE9IDEpCj4gLSAgICByZXR1
cm4gNTsKPiAtICBkYXRhMiA9IChjaGFyICopIG1tYXAgKDAsIHBhZ2VzaXplLCBQUk9UX1JFQUQg
fCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZDIsIDBMKTsKPiAtICBpZiAoZGF0YTIgPT0gTUFQ
X0ZBSUxFRCkKPiAtICAgIHJldHVybiA2Owo+IC0gIGZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsg
KytpKQo+IC0gICAgaWYgKCooZGF0YTIgKyBpKSkKPiAtICAgICAgcmV0dXJuIDc7Cj4gLSAgY2xv
c2UgKGZkMik7Cj4gLSAgaWYgKG11bm1hcCAoZGF0YTIsIHBhZ2VzaXplKSkKPiAtICAgIHJldHVy
biA4Owo+IC0KPiAtICAvKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFk
ZHJlc3Mgd2hpY2ggYWxyZWFkeSBoYXMKPiAtICAgICBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQg
YXQgaXQuICBJZiB3ZSBjYW4sIGFsc28gbWFrZSBzdXJlIHRoYXQKPiAtICAgICB3ZSBzZWUgdGhl
IHNhbWUgZ2FyYmFnZS4gICovCj4gLSAgZmQgPSBvcGVuICgiY29uZnRlc3QubW1hcCIsIE9fUkRX
Uik7Cj4gLSAgaWYgKGZkIDwgMCkKPiAtICAgIHJldHVybiA5Owo+IC0gIGlmIChkYXRhMiAhPSBt
bWFwIChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCj4gLSAgICAgICAg
ICAgICAgICAgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCj4gLSAgICByZXR1
cm4gMTA7Cj4gLSAgZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCj4gLSAgICBpZiAoKihk
YXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQo+IC0gICAgICByZXR1cm4gMTE7Cj4gLQo+IC0gIC8q
IEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhIGRvIG5v
dAo+IC0gICAgIHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLiAg
KFRoaXMgaXMgYSBidWcgb24KPiAtICAgICBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikg
ICovCj4gLSAgZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCj4gLSAgICAqKGRhdGEyICsg
aSkgPSAqKGRhdGEyICsgaSkgKyAxOwo+IC0gIGRhdGEzID0gKGNoYXIgKikgbWFsbG9jIChwYWdl
c2l6ZSk7Cj4gLSAgaWYgKCFkYXRhMykKPiAtICAgIHJldHVybiAxMjsKPiAtICBpZiAocmVhZCAo
ZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCj4gLSAgICByZXR1cm4gMTM7Cj4gLSAg
Zm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCj4gLSAgICBpZiAoKihkYXRhICsgaSkgIT0g
KihkYXRhMyArIGkpKQo+IC0gICAgICByZXR1cm4gMTQ7Cj4gLSAgY2xvc2UgKGZkKTsKPiArcmV0
dXJuIGV4dDJmc19vcGVuMiAoKTsKPiArICA7Cj4gICAgcmV0dXJuIDA7Cj4gIH0KPiAgX0FDRU9G
Cj4gLWlmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgo+IC0gIGFjX2N2X2Z1bmNf
bW1hcF9maXhlZF9tYXBwZWQ9eWVzCj4gK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0
aGVuIDoKPiArICBhY19jdl9saWJfZXh0MmZzX2V4dDJmc19vcGVuMj15ZXMKPiAgZWxzZQo+IC0g
IGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KPiAtZmkKPiAtcm0gLWYgY29yZSAqLmNv
cmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAo+
IC0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Cj4g
LWZpCj4gLQo+ICsgIGFjX2N2X2xpYl9leHQyZnNfZXh0MmZzX29wZW4yPW5vCj4gIGZpCj4gLXsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVu
Y19tbWFwX2ZpeGVkX21hcHBlZCIgPiY1Cj4gLSRhc19lY2hvICIkYWNfY3ZfZnVuY19tbWFwX2Zp
eGVkX21hcHBlZCIgPiY2OyB9Cj4gLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBw
ZWQgPSB5ZXM7IHRoZW4KPiAtCj4gLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfTU1BUCAxIiA+PmNv
bmZkZWZzLmgKPiAtCj4gK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpl
eHQgXAo+ICsgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKPiArTElCUz0k
YWNfY2hlY2tfbGliX3NhdmVfTElCUwo+ICBmaQo+IC1ybSAtZiBjb25mdGVzdC5tbWFwIGNvbmZ0
ZXN0LnR4dAo+IC0KPiAtZm9yIGFjX2hlYWRlciBpbiBzdGRsaWIuaAo+IC1kbyA6Cj4gLSAgYWNf
Zm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInN0ZGxpYi5oIiAiYWNfY3ZfaGVh
ZGVyX3N0ZGxpYl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCj4gLWlmIHRlc3QgIngkYWNfY3Zf
aGVhZGVyX3N0ZGxpYl9oIiA9IHgiInllczsgdGhlbiA6Cj4gLSAgY2F0ID4+Y29uZmRlZnMuaCA8
PF9BQ0VPRgo+IC0jZGVmaW5lIEhBVkVfU1RETElCX0ggMQo+IC1fQUNFT0YKPiAtCj4gK3sgJGFz
X2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2V4
dDJmc19leHQyZnNfb3BlbjIiID4mNQo+ICskYXNfZWNobyAiJGFjX2N2X2xpYl9leHQyZnNfZXh0
MmZzX29wZW4yIiA+JjY7IH0KPiAraWYgdGVzdCAieCRhY19jdl9saWJfZXh0MmZzX2V4dDJmc19v
cGVuMiIgPSB4IiJ5ZXM7IHRoZW4gOgo+ICsgIGxpYmV4dDJmcz0ieSIKPiArZWxzZQo+ICsgIGxp
YmV4dDJmcz0ibiIKPiAgZmkKPiAKPiAtZG9uZQo+IAo+IC17ICRhc19lY2hvICIkYXNfbWU6JHth
c19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBHTlUgbGliYyBjb21wYXRpYmxlIHJlYWxs
b2MiID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyBmb3IgR05VIGxpYmMgY29tcGF0aWJsZSBy
ZWFsbG9jLi4uICIgPiY2OyB9Cj4gLWlmIHRlc3QgIiR7YWNfY3ZfZnVuY19yZWFsbG9jXzBfbm9u
bnVsbCtzZXR9IiA9IHNldDsgdGhlbiA6Cj4gK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVu
by0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdjcnlfbWRfaGFzaF9idWZmZXIgaW4gLWxnY3J5cHQi
ID4mNQo+ICskYXNfZWNob19uICJjaGVja2luZyBmb3IgZ2NyeV9tZF9oYXNoX2J1ZmZlciBpbiAt
bGdjcnlwdC4uLiAiID4mNjsgfQo+ICtpZiB0ZXN0ICIke2FjX2N2X2xpYl9nY3J5cHRfZ2NyeV9t
ZF9oYXNoX2J1ZmZlcitzZXR9IiA9IHNldDsgdGhlbiA6Cj4gICAgJGFzX2VjaG9fbiAiKGNhY2hl
ZCkgIiA+JjYKPiAgZWxzZQo+IC0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0
aGVuIDoKPiAtICBhY19jdl9mdW5jX3JlYWxsb2NfMF9ub25udWxsPW5vCj4gLWVsc2UKPiAtICBj
YXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Cj4gKyAgYWNfY2hlY2tf
bGliX3NhdmVfTElCUz0kTElCUwo+ICtMSUJTPSItbGdjcnlwdCAgJExJQlMiCj4gK2NhdCBjb25m
ZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKPiAgLyogZW5kIGNvbmZkZWZzLmgu
ICAqLwo+IC0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBIQVZFX1NURExJQl9I
Cj4gLSMgaW5jbHVkZSA8c3RkbGliLmg+Cj4gLSNlbHNlCj4gLWNoYXIgKnJlYWxsb2MgKCk7Cj4g
LSNlbmRpZgo+IAo+ICsvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBh
dm9pZCBhbiBlcnJvci4KPiArICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhl
IHJldHVybiB0eXBlIG9mIGEgR0NDCj4gKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50
IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCj4gKyNpZmRlZiBfX2NwbHVzcGx1cwo+
ICtleHRlcm4gIkMiCj4gKyNlbmRpZgo+ICtjaGFyIGdjcnlfbWRfaGFzaF9idWZmZXIgKCk7Cj4g
IGludAo+ICBtYWluICgpCj4gIHsKPiAtcmV0dXJuICEgcmVhbGxvYyAoMCwgMCk7Cj4gK3JldHVy
biBnY3J5X21kX2hhc2hfYnVmZmVyICgpOwo+ICAgIDsKPiAgICByZXR1cm4gMDsKPiAgfQo+ICBf
QUNFT0YKPiAtaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Cj4gLSAgYWNfY3Zf
ZnVuY19yZWFsbG9jXzBfbm9ubnVsbD15ZXMKPiAraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVO
TyI7IHRoZW4gOgo+ICsgIGFjX2N2X2xpYl9nY3J5cHRfZ2NyeV9tZF9oYXNoX2J1ZmZlcj15ZXMK
PiAgZWxzZQo+IC0gIGFjX2N2X2Z1bmNfcmVhbGxvY18wX25vbm51bGw9bm8KPiArICBhY19jdl9s
aWJfZ2NyeXB0X2djcnlfbWRfaGFzaF9idWZmZXI9bm8KPiAgZmkKPiAtcm0gLWYgY29yZSAqLmNv
cmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAo+
IC0gIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Cj4g
K3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAo+ICsgICAgY29u
ZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKPiArTElCUz0kYWNfY2hlY2tfbGliX3Nh
dmVfTElCUwo+ICBmaQo+IC0KPiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5F
Tk99OiByZXN1bHQ6ICRhY19jdl9saWJfZ2NyeXB0X2djcnlfbWRfaGFzaF9idWZmZXIiID4mNQo+
ICskYXNfZWNobyAiJGFjX2N2X2xpYl9nY3J5cHRfZ2NyeV9tZF9oYXNoX2J1ZmZlciIgPiY2OyB9
Cj4gK2lmIHRlc3QgIngkYWNfY3ZfbGliX2djcnlwdF9nY3J5X21kX2hhc2hfYnVmZmVyIiA9IHgi
InllczsgdGhlbiA6Cj4gKyAgbGliZ2NyeXB0PSJ5Igo+ICtlbHNlCj4gKyAgbGliZ2NyeXB0PSJu
Igo+ICBmaQo+IC17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJGFjX2N2X2Z1bmNfcmVhbGxvY18wX25vbm51bGwiID4mNQo+IC0kYXNfZWNobyAiJGFjX2N2
X2Z1bmNfcmVhbGxvY18wX25vbm51bGwiID4mNjsgfQo+IC1pZiB0ZXN0ICRhY19jdl9mdW5jX3Jl
YWxsb2NfMF9ub25udWxsID0geWVzOyB0aGVuIDoKPiAKPiAtJGFzX2VjaG8gIiNkZWZpbmUgSEFW
RV9SRUFMTE9DIDEiID4+Y29uZmRlZnMuaAo+IAo+ICsKPiArICAgIHsgJGFzX2VjaG8gIiRhc19t
ZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHB0aHJlYWQgZmxhZyIgPiY1Cj4g
KyRhc19lY2hvX24gImNoZWNraW5nIGZvciBwdGhyZWFkIGZsYWcuLi4gIiA+JjY7IH0KPiAraWYg
dGVzdCAiJHtheF9jdl9wdGhyZWFkX2ZsYWdzK3NldH0iID0gc2V0OyB0aGVuIDoKPiArICAkYXNf
ZWNob19uICIoY2FjaGVkKSAiID4mNgo+ICBlbHNlCj4gLSAgJGFzX2VjaG8gIiNkZWZpbmUgSEFW
RV9SRUFMTE9DIDAiID4+Y29uZmRlZnMuaAo+IAo+IC0gICBjYXNlICIgJExJQk9CSlMgIiBpbgo+
IC0gICoiIHJlYWxsb2MuJGFjX29iamV4dCAiKiApIDs7Cj4gLSAgKikgTElCT0JKUz0iJExJQk9C
SlMgcmVhbGxvYy4kYWNfb2JqZXh0Igo+IC0gOzsKPiAtZXNhYwo+ICsgICAgICAgIGF4X2N2X3B0
aHJlYWRfZmxhZ3M9LXB0aHJlYWQKPiArCj4gKyAgICBQVEhSRUFEX0NGTEFHUz0iJGF4X2N2X3B0
aHJlYWRfZmxhZ3MiCj4gKyAgICBQVEhSRUFEX0xERkxBR1M9IiRheF9jdl9wdGhyZWFkX2ZsYWdz
Igo+ICsgICAgUFRIUkVBRF9MSUJTPSIiCj4gKwo+ICsKPiArICAgIHNhdmVkX0NGTEFHUz0iJENG
TEFHUyIKPiArCj4gKyAgICBzYXZlZF9MREZMQUdTPSIkTERGTEFHUyIKPiArCj4gKyAgICBzYXZl
ZF9MSUJTPSIkTElCUyIKPiArCj4gKwo+ICsgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NG
TEFHUyIKPiArCj4gKyAgICBMREZMQUdTPSIkTERGTEFHUyAkUFRIUkVBRF9MREZMQUdTIgo+ICsK
PiArICAgIExJQlM9IiRMSUJTICRQVEhSRUFEX0xJQlMiCj4gKwo+ICsgICAgICAgIGNhdCBjb25m
ZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKPiArLyogZW5kIGNvbmZkZWZzLmgu
ICAqLwo+ICsKPiArI2luY2x1ZGUgPHB0aHJlYWQuaD4KPiAraW50IG1haW4odm9pZCkgewo+ICsg
IHB0aHJlYWRfYXRmb3JrKDAsMCwwKTsKPiArICBwdGhyZWFkX2NyZWF0ZSgwLDAsMCwwKTsKPiAr
fQo+ICsKPiArX0FDRU9GCj4gK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoK
PiArCj4gK2Vsc2UKPiArICBheF9jdl9wdGhyZWFkX2ZsYWdzPWZhaWxlZAo+ICtmaQo+ICtybSAt
ZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKPiArICAgIGNvbmZ0ZXN0
JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Cj4gKwo+ICsgICAgQ0ZMQUdTPSIkc2F2ZWRfQ0ZM
QUdTIgo+ICsKPiArICAgIExERkxBR1M9IiRzYXZlZF9MREZMQUdTIgo+IAo+ICsgICAgTElCUz0i
JHNhdmVkX0xJQlMiCj4gCj4gLSRhc19lY2hvICIjZGVmaW5lIHJlYWxsb2MgcnBsX3JlYWxsb2Mi
ID4+Y29uZmRlZnMuaAo+IAo+ICBmaQo+ICt7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8t
JExJTkVOT306IHJlc3VsdDogJGF4X2N2X3B0aHJlYWRfZmxhZ3MiID4mNQo+ICskYXNfZWNobyAi
JGF4X2N2X3B0aHJlYWRfZmxhZ3MiID4mNjsgfQo+ICsgICAgaWYgdGVzdCAieCRheF9jdl9wdGhy
ZWFkX2ZsYWdzIiA9IHhmYWlsZWQ7IHRoZW4KPiArICAgICAgICBhc19mbl9lcnJvciAkPyAiLXB0
aHJlYWQgZG9lcyBub3Qgd29yayIgIiRMSU5FTk8iIDUKPiArICAgIGZpCj4gKwo+ICsgICAgUFRI
UkVBRF9DRkxBR1M9IiRheF9jdl9wdGhyZWFkX2ZsYWdzIgo+ICsgICAgUFRIUkVBRF9MREZMQUdT
PSIkYXhfY3ZfcHRocmVhZF9mbGFncyIKPiArICAgIFBUSFJFQURfTElCUz0iIgo+ICsKPiAKPiAK
PiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Ig
d29ya2luZyBzdHJubGVuIiA+JjUKPiAtJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcg
c3Rybmxlbi4uLiAiID4mNjsgfQo+IC1pZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3Rybmxlbl93b3Jr
aW5nK3NldH0iID0gc2V0OyB0aGVuIDoKPiAreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiBjaGVja2luZyBmb3IgeWFqbF9hbGxvYyBpbiAtbHlhamwiID4mNQo+ICskYXNf
ZWNob19uICJjaGVja2luZyBmb3IgeWFqbF9hbGxvYyBpbiAtbHlhamwuLi4gIiA+JjY7IH0KPiAr
aWYgdGVzdCAiJHthY19jdl9saWJfeWFqbF95YWpsX2FsbG9jK3NldH0iID0gc2V0OyB0aGVuIDoK
PiAgICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgo+ICBlbHNlCj4gLSAgaWYgdGVzdCAiJGNy
b3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgo+IC0gIGFjX2N2X2Z1bmNfc3Rybmxlbl93b3Jr
aW5nPW5vCj4gLWVsc2UKPiAtICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4k
YWNfZXh0Cj4gKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwo+ICtMSUJTPSItbHlhamwg
ICRMSUJTIgo+ICtjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Cj4g
IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KPiAtJGFjX2luY2x1ZGVzX2RlZmF1bHQKPiArCj4gKy8q
IE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgo+
ICsgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2Yg
YSBHQ0MKPiArICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxk
IHN0aWxsIGFwcGx5LiAgKi8KPiArI2lmZGVmIF9fY3BsdXNwbHVzCj4gK2V4dGVybiAiQyIKPiAr
I2VuZGlmCj4gK2NoYXIgeWFqbF9hbGxvYyAoKTsKPiAgaW50Cj4gIG1haW4gKCkKPiAgewo+IC0K
PiAtI2RlZmluZSBTICJmb29iYXIiCj4gLSNkZWZpbmUgU19MRU4gKHNpemVvZiBTIC0gMSkKPiAt
Cj4gLSAgLyogQXQgbGVhc3Qgb25lIGltcGxlbWVudGF0aW9uIGlzIGJ1Z2d5OiB0aGF0IG9mIEFJ
WCA0LjMgd291bGQKPiAtICAgICBnaXZlIHN0cm5sZW4gKFMsIDEpID09IDMuICAqLwo+IC0KPiAt
ICBpbnQgaTsKPiAtICBmb3IgKGkgPSAwOyBpIDwgU19MRU4gKyAxOyArK2kpCj4gLSAgICB7Cj4g
LSAgICAgIGludCBleHBlY3RlZCA9IGkgPD0gU19MRU4gPyBpIDogU19MRU47Cj4gLSAgICAgIGlm
IChzdHJubGVuIChTLCBpKSAhPSBleHBlY3RlZCkKPiAtICAgICAgIHJldHVybiAxOwo+IC0gICAg
fQo+IC0gIHJldHVybiAwOwo+IC0KPiArcmV0dXJuIHlhamxfYWxsb2MgKCk7Cj4gICAgOwo+ICAg
IHJldHVybiAwOwo+ICB9Cj4gIF9BQ0VPRgo+IC1pZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8i
OyB0aGVuIDoKPiAtICBhY19jdl9mdW5jX3N0cm5sZW5fd29ya2luZz15ZXMKPiAraWYgYWNfZm5f
Y190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgo+ICsgIGFjX2N2X2xpYl95YWpsX3lhamxfYWxs
b2M9eWVzCj4gIGVsc2UKPiAtICBhY19jdl9mdW5jX3N0cm5sZW5fd29ya2luZz1ubwo+ICsgIGFj
X2N2X2xpYl95YWpsX3lhamxfYWxsb2M9bm8KPiAgZmkKPiAtcm0gLWYgY29yZSAqLmNvcmUgY29y
ZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAo+IC0gIGNv
bmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0Cj4gK3JtIC1m
IGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAo+ICsgICAgY29uZnRlc3Qk
YWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKPiArTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElC
Uwo+ICBmaQo+ICt7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3Vs
dDogJGFjX2N2X2xpYl95YWpsX3lhamxfYWxsb2MiID4mNQo+ICskYXNfZWNobyAiJGFjX2N2X2xp
Yl95YWpsX3lhamxfYWxsb2MiID4mNjsgfQo+ICtpZiB0ZXN0ICJ4JGFjX2N2X2xpYl95YWpsX3lh
amxfYWxsb2MiID0geCIieWVzOyB0aGVuIDoKPiArICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9G
Cj4gKyNkZWZpbmUgSEFWRV9MSUJZQUpMIDEKPiArX0FDRU9GCj4gCj4gLWZpCj4gLXsgJGFzX2Vj
aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY19zdHJu
bGVuX3dvcmtpbmciID4mNQo+IC0kYXNfZWNobyAiJGFjX2N2X2Z1bmNfc3Rybmxlbl93b3JraW5n
IiA+JjY7IH0KPiAtdGVzdCAkYWNfY3ZfZnVuY19zdHJubGVuX3dvcmtpbmcgPSBubyAmJiBjYXNl
ICIgJExJQk9CSlMgIiBpbgo+IC0gICoiIHN0cm5sZW4uJGFjX29iamV4dCAiKiApIDs7Cj4gLSAg
KikgTElCT0JKUz0iJExJQk9CSlMgc3Rybmxlbi4kYWNfb2JqZXh0Igo+IC0gOzsKPiAtZXNhYwo+
ICsgIExJQlM9Ii1seWFqbCAkTElCUyIKPiAKPiArZWxzZQo+ICsgIGFzX2ZuX2Vycm9yICQ/ICJD
b3VsZCBub3QgZmluZCB5YWpsIiAiJExJTkVOTyIgNQo+ICtmaQo+IAo+IC17ICRhc19lY2hvICIk
YXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIHN0cnRvZCIg
PiY1Cj4gLSRhc19lY2hvX24gImNoZWNraW5nIGZvciB3b3JraW5nIHN0cnRvZC4uLiAiID4mNjsg
fQo+IC1pZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RydG9kK3NldH0iID0gc2V0OyB0aGVuIDoKPiAr
eyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGVm
bGF0ZUNvcHkgaW4gLWx6IiA+JjUKPiArJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRlZmxhdGVD
b3B5IGluIC1sei4uLiAiID4mNjsgfQo+ICtpZiB0ZXN0ICIke2FjX2N2X2xpYl96X2RlZmxhdGVD
b3B5K3NldH0iID0gc2V0OyB0aGVuIDoKPiAgICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgo+
ICBlbHNlCj4gLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgo+IC0g
IGFjX2N2X2Z1bmNfc3RydG9kPW5vCj4gLWVsc2UKPiAtICBjYXQgY29uZmRlZnMuaCAtIDw8X0FD
RU9GID5jb25mdGVzdC4kYWNfZXh0Cj4gKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwo+
ICtMSUJTPSItbHogICRMSUJTIgo+ICtjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVz
dC4kYWNfZXh0Cj4gIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KPiAKPiAtJGFjX2luY2x1ZGVzX2Rl
ZmF1bHQKPiAtI2lmbmRlZiBzdHJ0b2QKPiAtZG91YmxlIHN0cnRvZCAoKTsKPiArLyogT3ZlcnJp
ZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCj4gKyAgIFVz
ZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwo+
ICsgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwg
YXBwbHkuICAqLwo+ICsjaWZkZWYgX19jcGx1c3BsdXMKPiArZXh0ZXJuICJDIgo+ICAjZW5kaWYK
PiArY2hhciBkZWZsYXRlQ29weSAoKTsKPiAgaW50Cj4gLW1haW4oKQo+ICttYWluICgpCj4gIHsK
PiAtICB7Cj4gLSAgICAvKiBTb21lIHZlcnNpb25zIG9mIExpbnV4IHN0cnRvZCBtaXMtcGFyc2Ug
c3RyaW5ncyB3aXRoIGxlYWRpbmcgJysnLiAgKi8KPiAtICAgIGNoYXIgKnN0cmluZyA9ICIgKzY5
IjsKPiAtICAgIGNoYXIgKnRlcm07Cj4gLSAgICBkb3VibGUgdmFsdWU7Cj4gLSAgICB2YWx1ZSA9
IHN0cnRvZCAoc3RyaW5nLCAmdGVybSk7Cj4gLSAgICBpZiAodmFsdWUgIT0gNjkgfHwgdGVybSAh
PSAoc3RyaW5nICsgNCkpCj4gLSAgICAgIHJldHVybiAxOwo+IC0gIH0KPiAtCj4gLSAgewo+IC0g
ICAgLyogVW5kZXIgU29sYXJpcyAyLjQsIHN0cnRvZCByZXR1cm5zIHRoZSB3cm9uZyB2YWx1ZSBm
b3IgdGhlCj4gLSAgICAgICB0ZXJtaW5hdGluZyBjaGFyYWN0ZXIgdW5kZXIgc29tZSBjb25kaXRp
b25zLiAgKi8KPiAtICAgIGNoYXIgKnN0cmluZyA9ICJOYU4iOwo+IC0gICAgY2hhciAqdGVybTsK
PiAtICAgIHN0cnRvZCAoc3RyaW5nLCAmdGVybSk7Cj4gLSAgICBpZiAodGVybSAhPSBzdHJpbmcg
JiYgKih0ZXJtIC0gMSkgPT0gMCkKPiAtICAgICAgcmV0dXJuIDE7Cj4gLSAgfQo+ICtyZXR1cm4g
ZGVmbGF0ZUNvcHkgKCk7Cj4gKyAgOwo+ICAgIHJldHVybiAwOwo+ICB9Cj4gLQo+ICBfQUNFT0YK
PiAtaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6Cj4gLSAgYWNfY3ZfZnVuY19z
dHJ0b2Q9eWVzCj4gK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKPiArICBh
Y19jdl9saWJfel9kZWZsYXRlQ29weT15ZXMKPiAgZWxzZQo+IC0gIGFjX2N2X2Z1bmNfc3RydG9k
PW5vCj4gLWZpCj4gLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBi
Yi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKPiAtICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0
ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAo+ICsgIGFjX2N2X2xpYl96X2RlZmxhdGVDb3B5PW5v
Cj4gIGZpCj4gLQo+ICtybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0
IFwKPiArICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Cj4gK0xJQlM9JGFj
X2NoZWNrX2xpYl9zYXZlX0xJQlMKPiAgZmkKPiAteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGlu
ZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX3N0cnRvZCIgPiY1Cj4gLSRhc19lY2hv
ICIkYWNfY3ZfZnVuY19zdHJ0b2QiID4mNjsgfQo+IC1pZiB0ZXN0ICRhY19jdl9mdW5jX3N0cnRv
ZCA9IG5vOyB0aGVuCj4gLSAgY2FzZSAiICRMSUJPQkpTICIgaW4KPiAtICAqIiBzdHJ0b2QuJGFj
X29iamV4dCAiKiApIDs7Cj4gLSAgKikgTElCT0JKUz0iJExJQk9CSlMgc3RydG9kLiRhY19vYmpl
eHQiCj4gLSA7Owo+IC1lc2FjCj4gK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElO
RU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3pfZGVmbGF0ZUNvcHkiID4mNQo+ICskYXNfZWNobyAi
JGFjX2N2X2xpYl96X2RlZmxhdGVDb3B5IiA+JjY7IH0KPiAraWYgdGVzdCAieCRhY19jdl9saWJf
el9kZWZsYXRlQ29weSIgPSB4IiJ5ZXM7IHRoZW4gOgo+ICsgIGNhdCA+PmNvbmZkZWZzLmggPDxf
QUNFT0YKPiArI2RlZmluZSBIQVZFX0xJQlogMQo+ICtfQUNFT0YKPiAKPiAtYWNfZm5fY19jaGVj
a19mdW5jICIkTElORU5PIiAicG93IiAiYWNfY3ZfZnVuY19wb3ciCj4gLWlmIHRlc3QgIngkYWNf
Y3ZfZnVuY19wb3ciID0geCIieWVzOyB0aGVuIDoKPiArICBMSUJTPSItbHogJExJQlMiCj4gCj4g
K2Vsc2UKPiArICBhc19mbl9lcnJvciAkPyAiQ291bGQgbm90IGZpbmQgemxpYiIgIiRMSU5FTk8i
IDUKPiAgZmkKPiAKPiAtaWYgdGVzdCAkYWNfY3ZfZnVuY19wb3cgPSBubzsgdGhlbgo+IC0gIHsg
JGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHBvdyBp
biAtbG0iID4mNQo+IC0kYXNfZWNob19uICJjaGVja2luZyBmb3IgcG93IGluIC1sbS4uLiAiID4m
NjsgfQo+IC1pZiB0ZXN0ICIke2FjX2N2X2xpYl9tX3BvdytzZXR9IiA9IHNldDsgdGhlbiA6Cj4g
K3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxp
Ymljb252X29wZW4gaW4gLWxpY29udiIgPiY1Cj4gKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBs
aWJpY29udl9vcGVuIGluIC1saWNvbnYuLi4gIiA+JjY7IH0KPiAraWYgdGVzdCAiJHthY19jdl9s
aWJfaWNvbnZfbGliaWNvbnZfb3BlbitzZXR9IiA9IHNldDsgdGhlbiA6Cj4gICAgJGFzX2VjaG9f
biAiKGNhY2hlZCkgIiA+JjYKPiAgZWxzZQo+ICAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJ
QlMKPiAtTElCUz0iLWxtICAkTElCUyIKPiArTElCUz0iLWxpY29udiAgJExJQlMiCj4gIGNhdCBj
b25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKPiAgLyogZW5kIGNvbmZkZWZz
LmguICAqLwo+IAo+IEBAIC05NTI4LDU1ICs2NTUzLDQ1IEBAIGNhdCBjb25mZGVmcy5oIC0gPDxf
QUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKPiAgI2lmZGVmIF9fY3BsdXNwbHVzCj4gIGV4dGVybiAi
QyIKPiAgI2VuZGlmCj4gLWNoYXIgcG93ICgpOwo+ICtjaGFyIGxpYmljb252X29wZW4gKCk7Cj4g
IGludAo+ICBtYWluICgpCj4gIHsKPiAtcmV0dXJuIHBvdyAoKTsKPiArcmV0dXJuIGxpYmljb252
X29wZW4gKCk7Cj4gICAgOwo+ICAgIHJldHVybiAwOwo+ICB9Cj4gIF9BQ0VPRgo+ICBpZiBhY19m
bl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6Cj4gLSAgYWNfY3ZfbGliX21fcG93PXllcwo+
ICsgIGFjX2N2X2xpYl9pY29udl9saWJpY29udl9vcGVuPXllcwo+ICBlbHNlCj4gLSAgYWNfY3Zf
bGliX21fcG93PW5vCj4gKyAgYWNfY3ZfbGliX2ljb252X2xpYmljb252X29wZW49bm8KPiAgZmkK
PiAgcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCj4gICAgICBj
b25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAo+ICBMSUJTPSRhY19jaGVja19saWJf
c2F2ZV9MSUJTCj4gIGZpCj4gLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5P
fTogcmVzdWx0OiAkYWNfY3ZfbGliX21fcG93IiA+JjUKPiAtJGFzX2VjaG8gIiRhY19jdl9saWJf
bV9wb3ciID4mNjsgfQo+IC1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl9tX3BvdyIgPSB4IiJ5ZXM7IHRo
ZW4gOgo+IC0gIFBPV19MSUI9LWxtCj4gK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0k
TElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2ljb252X2xpYmljb252X29wZW4iID4mNQo+ICsk
YXNfZWNobyAiJGFjX2N2X2xpYl9pY29udl9saWJpY29udl9vcGVuIiA+JjY7IH0KPiAraWYgdGVz
dCAieCRhY19jdl9saWJfaWNvbnZfbGliaWNvbnZfb3BlbiIgPSB4IiJ5ZXM7IHRoZW4gOgo+ICsg
IGxpYmljb252PSJ5Igo+ICBlbHNlCj4gLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5v
LSRMSU5FTk99OiBXQVJOSU5HOiBjYW5ub3QgZmluZCBsaWJyYXJ5IGNvbnRhaW5pbmcgZGVmaW5p
dGlvbiBvZiBwb3ciID4mNQo+IC0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYW5ub3QgZmlu
ZCBsaWJyYXJ5IGNvbnRhaW5pbmcgZGVmaW5pdGlvbiBvZiBwb3ciID4mMjt9Cj4gLWZpCj4gLQo+
ICsgIGxpYmljb252PSJuIgo+ICBmaQo+IAo+IC1maQo+IAo+IC1mb3IgYWNfZnVuYyBpbiAgXAo+
IC0gICAgICAgICAgICAgICAgYWxhcm0gYXRleGl0IGJ6ZXJvIGNsb2NrX2dldHRpbWUgZHVwMiBm
ZGF0YXN5bmMgZnRydW5jYXRlIFwKPiAtICAgICAgICAgICAgICAgIGdldGN3ZCBnZXRob3N0Ynlu
YW1lIGdldGhvc3RuYW1lIGdldHBhZ2VzaXplIGdldHRpbWVvZmRheSBcCj4gLSAgICAgICAgICAg
ICAgICBpbmV0X250b2EgaXNhc2NpaSBsb2NhbHRpbWVfciBtZW1jaHIgbWVtbW92ZSBtZW1zZXQg
bWtkaXIgXAo+IC0gICAgICAgICAgICAgICAgbWtmaWZvIG11bm1hcCBwYXRoY29uZiByZWFscGF0
aCByZWdjb21wIHJtZGlyIHNlbGVjdCBzZXRlbnYgXAo+IC0gICAgICAgICAgICAgICAgc29ja2V0
IHN0cmNhc2VjbXAgc3RyY2hyIHN0cmNzcG4gc3RyZHVwIHN0cmVycm9yIHN0cm5kdXAgXAo+IC0g
ICAgICAgICAgICAgICAgc3RycGJyayBzdHJyY2hyIHN0cnNwbiBzdHJzdHIgc3RydG9sIHN0cnRv
dWwgc3RydG91bGwgdHpzZXQgXAo+IC0gICAgICAgICAgICAgICAgdW5hbWUgXAo+IAo+ICsjIENo
ZWNrcyBmb3IgaGVhZGVyIGZpbGVzLgo+ICtmb3IgYWNfaGVhZGVyIGluIHlhamwveWFqbF92ZXJz
aW9uLmgKPiAgZG8gOgo+IC0gIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1
bmMiIHwgJGFzX3RyX3NoYAo+IC1hY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVu
YyIgIiRhc19hY192YXIiCj4gLWlmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5
ZXMiOyB0aGVuIDoKPiArICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAi
eWFqbC95YWpsX3ZlcnNpb24uaCIgImFjX2N2X2hlYWRlcl95YWpsX3lhamxfdmVyc2lvbl9oIiAi
JGFjX2luY2x1ZGVzX2RlZmF1bHQiCj4gK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3lhamxfeWFq
bF92ZXJzaW9uX2giID0geCIieWVzOyB0aGVuIDoKPiAgICBjYXQgPj5jb25mZGVmcy5oIDw8X0FD
RU9GCj4gLSNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEK
PiArI2RlZmluZSBIQVZFX1lBSkxfWUFKTF9WRVJTSU9OX0ggMQo+ICBfQUNFT0YKPiAKPiAgZmkK
PiArCj4gIGRvbmUKPiAKPiAKPiBkaWZmIC0tZ2l0IGEvdG9vbHMvY29uZmlndXJlLmFjIGIvdG9v
bHMvY29uZmlndXJlLmFjCj4gaW5kZXggNTdjODg3ZC4uZGViODQ4ZCAxMDA2NDQKPiAtLS0gYS90
b29scy9jb25maWd1cmUuYWMKPiArKysgYi90b29scy9jb25maWd1cmUuYWMKPiBAQCAtMTksOSAr
MTksNiBAQCByZWNvbW1lbmRlZCwgdXNlIFBSRVBFTkRfSU5DTFVERVMsIFBSRVBFTkRfTElCLCBc
Cj4gIEFQUEVORF9JTkNMVURFUyBhbmQgQVBQRU5EX0xJQiBpbnN0ZWFkIHdoZW4gcG9zc2libGUu
XSkKPiAgXSkKPiAKPiAtQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TCj4gLUFDX0NBTk9OSUNBTF9I
T1NUCj4gLQo+ICAjIE00IE1hY3JvIGluY2x1ZGVzCj4gIG00X2luY2x1ZGUoW200L3NhdmV2YXIu
bTRdKQo+ICBtNF9pbmNsdWRlKFttNC9mZWF0dXJlcy5tNF0pCj4gQEAgLTc1LDkgKzcyLDcgQEAg
QUNfQVJHX1ZBUihbQkNDXSwgW1BhdGggdG8gYmNjIHRvb2xdKQo+ICBBQ19BUkdfVkFSKFtJQVNM
XSwgW1BhdGggdG8gaWFzbCB0b29sXSkKPiAKPiAgIyBDaGVja3MgZm9yIHByb2dyYW1zLgo+IC1B
Q19QUk9HX1NFRAo+ICBBQ19QUk9HX0NDCj4gLUFDX1BST0dfTE5fUwo+ICBBQ19QUk9HX01BS0Vf
U0VUCj4gIEFDX1BST0dfSU5TVEFMTAo+ICBBQ19QQVRIX1BST0coW0JJU09OXSwgW2Jpc29uXSkK
PiBAQCAtMTM3LDcgKzEzMiw2IEBAIEFDX1NVQlNUKGxpYmV4dDJmcykKPiAgQUNfQ0hFQ0tfTElC
KFtnY3J5cHRdLCBbZ2NyeV9tZF9oYXNoX2J1ZmZlcl0sIFtsaWJnY3J5cHQ9InkiXSwgW2xpYmdj
cnlwdD0ibiJdKQo+ICBBQ19TVUJTVChsaWJnY3J5cHQpCj4gIEFYX0NIRUNLX1BUSFJFQUQKPiAt
QUNfQ0hFQ0tfTElCKFtydF0sIFtjbG9ja19nZXR0aW1lXSkKPiAgQUNfQ0hFQ0tfTElCKFt5YWps
XSwgW3lhamxfYWxsb2NdLCBbXSwKPiAgICAgIFtBQ19NU0dfRVJST1IoW0NvdWxkIG5vdCBmaW5k
IHlhamxdKV0pCj4gIEFDX0NIRUNLX0xJQihbel0sIFtkZWZsYXRlQ29weV0sIFtdLCBbQUNfTVNH
X0VSUk9SKFtDb3VsZCBub3QgZmluZCB6bGliXSldKQo+IEBAIC0xNDUsNTggKzEzOSw2IEBAIEFD
X0NIRUNLX0xJQihbaWNvbnZdLCBbbGliaWNvbnZfb3Blbl0sIFtsaWJpY29udj0ieSJdLCBbbGli
aWNvbnY9Im4iXSkKPiAgQUNfU1VCU1QobGliaWNvbnYpCj4gCj4gICMgQ2hlY2tzIGZvciBoZWFk
ZXIgZmlsZXMuCj4gLUFDX0ZVTkNfQUxMT0NBCj4gLUFDX0NIRUNLX0hFQURFUlMoWyBcCj4gLSAg
ICAgICAgICAgICAgICBhcnBhL2luZXQuaCBmY250bC5oIGludHR5cGVzLmggbGliaW50bC5oIGxp
bWl0cy5oIG1hbGxvYy5oIFwKPiAtICAgICAgICAgICAgICAgIG5ldGRiLmggbmV0aW5ldC9pbi5o
IHN0ZGRlZi5oIHN0ZGludC5oIHN0ZGxpYi5oIHN0cmluZy5oIFwKPiAtICAgICAgICAgICAgICAg
IHN0cmluZ3MuaCBzeXMvZmlsZS5oIHN5cy9pb2N0bC5oIHN5cy9tb3VudC5oIHN5cy9wYXJhbS5o
IFwKPiAtICAgICAgICAgICAgICAgIHN5cy9zb2NrZXQuaCBzeXMvc3RhdHZmcy5oIHN5cy90aW1l
Lmggc3lzbG9nLmggdGVybWlvcy5oIFwKPiAtICAgICAgICAgICAgICAgIHVuaXN0ZC5oIHlhamwv
eWFqbF92ZXJzaW9uLmggXAo+IC0gICAgICAgICAgICAgICAgXSkKPiAtCj4gLSMgQ2hlY2tzIGZv
ciB0eXBlZGVmcywgc3RydWN0dXJlcywgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcy4KPiAt
QUNfSEVBREVSX1NUREJPT0wKPiAtQUNfVFlQRV9VSURfVAo+IC1BQ19DX0lOTElORQo+IC1BQ19U
WVBFX0lOVDE2X1QKPiAtQUNfVFlQRV9JTlQzMl9UCj4gLUFDX1RZUEVfSU5UNjRfVAo+IC1BQ19U
WVBFX0lOVDhfVAo+IC1BQ19UWVBFX01PREVfVAo+IC1BQ19UWVBFX09GRl9UCj4gLUFDX1RZUEVf
UElEX1QKPiAtQUNfQ19SRVNUUklDVAo+IC1BQ19UWVBFX1NJWkVfVAo+IC1BQ19UWVBFX1NTSVpF
X1QKPiAtQUNfQ0hFQ0tfTUVNQkVSUyhbc3RydWN0IHN0YXQuc3RfYmxrc2l6ZV0pCj4gLUFDX1NU
UlVDVF9TVF9CTE9DS1MKPiAtQUNfQ0hFQ0tfTUVNQkVSUyhbc3RydWN0IHN0YXQuc3RfcmRldl0p
Cj4gLUFDX1RZUEVfVUlOVDE2X1QKPiAtQUNfVFlQRV9VSU5UMzJfVAo+IC1BQ19UWVBFX1VJTlQ2
NF9UCj4gLUFDX1RZUEVfVUlOVDhfVAo+IC1BQ19DSEVDS19UWVBFUyhbcHRyZGlmZl90XSkKPiAt
Cj4gLSMgQ2hlY2tzIGZvciBsaWJyYXJ5IGZ1bmN0aW9ucy4KPiAtQUNfRlVOQ19FUlJPUl9BVF9M
SU5FCj4gLUFDX0ZVTkNfRk9SSwo+IC1BQ19GVU5DX0ZTRUVLTwo+IC1BQ19GVU5DX0xTVEFUX0ZP
TExPV1NfU0xBU0hFRF9TWU1MSU5LCj4gLUFDX0hFQURFUl9NQUpPUgo+IC1BQ19GVU5DX01BTExP
Qwo+IC1BQ19GVU5DX01LVElNRQo+IC1BQ19GVU5DX01NQVAKPiAtQUNfRlVOQ19SRUFMTE9DCj4g
LUFDX0ZVTkNfU1RSTkxFTgo+IC1BQ19GVU5DX1NUUlRPRAo+IC1BQ19DSEVDS19GVU5DUyhbIFwK
PiAtICAgICAgICAgICAgICAgIGFsYXJtIGF0ZXhpdCBiemVybyBjbG9ja19nZXR0aW1lIGR1cDIg
ZmRhdGFzeW5jIGZ0cnVuY2F0ZSBcCj4gLSAgICAgICAgICAgICAgICBnZXRjd2QgZ2V0aG9zdGJ5
bmFtZSBnZXRob3N0bmFtZSBnZXRwYWdlc2l6ZSBnZXR0aW1lb2ZkYXkgXAo+IC0gICAgICAgICAg
ICAgICAgaW5ldF9udG9hIGlzYXNjaWkgbG9jYWx0aW1lX3IgbWVtY2hyIG1lbW1vdmUgbWVtc2V0
IG1rZGlyIFwKPiAtICAgICAgICAgICAgICAgIG1rZmlmbyBtdW5tYXAgcGF0aGNvbmYgcmVhbHBh
dGggcmVnY29tcCBybWRpciBzZWxlY3Qgc2V0ZW52IFwKPiAtICAgICAgICAgICAgICAgIHNvY2tl
dCBzdHJjYXNlY21wIHN0cmNociBzdHJjc3BuIHN0cmR1cCBzdHJlcnJvciBzdHJuZHVwIFwKPiAt
ICAgICAgICAgICAgICAgIHN0cnBicmsgc3RycmNociBzdHJzcG4gc3Ryc3RyIHN0cnRvbCBzdHJ0
b3VsIHN0cnRvdWxsIHR6c2V0IFwKPiAtICAgICAgICAgICAgICAgIHVuYW1lIFwKPiAtICAgICAg
ICAgICAgICAgIF0pCj4gK0FDX0NIRUNLX0hFQURFUlMoW3lhamwveWFqbF92ZXJzaW9uLmhdKQo+
IAo+ICBBQ19PVVRQVVQoKQo+IC0tCj4gMS43LjIuNQo+IAo+IAo+IF9fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4gWGVuLWRldmVsIG1haWxpbmcgbGlzdAo+
IFhlbi1kZXZlbEBsaXN0cy54ZW4ub3JnCj4gaHR0cDovL2xpc3RzLnhlbi5vcmcveGVuLWRldmVs
CgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1k
ZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbi5vcmcKaHR0cDovL2xpc3RzLnhl
bi5vcmcveGVuLWRldmVsCg==

From xen-devel-bounces@lists.xen.org Thu Apr 26 21:26:10 2012
Return-path: <xen-devel-bounces@lists.xen.org>
Envelope-to: archives@lists.xen.org
Delivery-date: Thu, 26 Apr 2012 21:26:10 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xen.org>)
	id 1SNWC9-0001Mi-JI; Thu, 26 Apr 2012 21:25:45 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72) (envelope-from <tim@xen.org>)
	id 1SNWC7-0001Md-FJ
	for xen-devel@lists.xensource.com; Thu, 26 Apr 2012 21:25:44 +0000
Received: from [85.158.143.35:28028] by server-2.bemta-4.messagelabs.com id
	E6/C4-17550-65DB99F4; Thu, 26 Apr 2012 21:25:42 +0000
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-3.tower-21.messagelabs.com!1335475538!12797452!1
X-Originating-IP: [81.29.64.94]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Version: 6.5.7; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9695 invoked from network); 26 Apr 2012 21:25:39 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-3.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 26 Apr 2012 21:25:39 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1SNWBv-000Jj7-Nj; Thu, 26 Apr 2012 21:25:31 +0000
Date: Thu, 26 Apr 2012 22:25:31 +0100
From: Tim Deegan <tim@xen.org>
To: "Zhang, Yang Z" <yang.z.zhang@intel.com>
Message-ID: <20120426212531.GH67043@ocelot.phlegethon.org>
References: <A9667DDFB95DB7438FA9D7D576C3D87E0F1154@SHSMSX101.ccr.corp.intel.com>
	<20120423091445.GA17920@ocelot.phlegethon.org>
	<2a7b92d7a952c53c0fb81bdebdd45d24.squirrel@webmail.lagarcavilla.org>
	<A9667DDFB95DB7438FA9D7D576C3D87E0F2A20@SHSMSX101.ccr.corp.intel.com>
	<20120424091646.GB34721@ocelot.phlegethon.org>
	<A9667DDFB95DB7438FA9D7D576C3D87E0F452D@SHSMSX101.ccr.corp.intel.com>
	<958f5bfcc3ae6a631cf7208086553dce.squirrel@webmail.lagarcavilla.org>
	<A9667DDFB95DB7438FA9D7D576C3D87E0F45FC@SHSMSX101.ccr.corp.intel.com>
	<dfb5bcde9672a20ef3d6b3ad846a40e3.squirrel@webmail.lagarcavilla.org>
	<A9667DDFB95DB7438FA9D7D576C3D87E0F4684@SHSMSX101.ccr.corp.intel.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="qDbXVdCdHGoSgWSk"
Content-Disposition: inline
In-Reply-To: <A9667DDFB95DB7438FA9D7D576C3D87E0F4684@SHSMSX101.ccr.corp.intel.com>
User-Agent: Mutt/1.4.2.1i
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Keir Fraser <keir@xen.org>,
	"andres@lagarcavilla.org" <andres@lagarcavilla.org>
Subject: Re: [Xen-devel] lock in vhpet
X-BeenThere: xen-devel@lists.xen.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xen.org>
List-Unsubscribe: <http://lists.xen.org/cgi-bin/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xen.org?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xen.org>
List-Help: <mailto:xen-devel-request@lists.xen.org?subject=help>
List-Subscribe: <http://lists.xen.org/cgi-bin/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xen.org?subject=subscribe>
Sender: xen-devel-bounces@lists.xen.org
Errors-To: xen-devel-bounces@lists.xen.org


--qDbXVdCdHGoSgWSk
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline

At 02:36 +0000 on 25 Apr (1335321409), Zhang, Yang Z wrote:
> > > But actually, the first cs introduced this issue is 24770. When win8
> > > booting and if hpet is enabled, it will use hpet as the time source
> > > and there have lots of hpet access and EPT violation. In EPT violation
> > > handler, it call get_gfn_type_access to get the mfn. The cs 24770
> > > introduces the gfn_lock for p2m lookups, and then the issue happens.
> > > After I removed the gfn_lock, the issue goes. But in latest xen, even
> > > I remove this lock, it still shows high cpu utilization.
> > 
> > It would seem then that even the briefest lock-protected critical section would
> > cause this? In the mmio case, the p2m lock taken in the hap fault handler is
> > held during the actual lookup, and for a couple of branch instructions
> > afterwards.
> > 
> > In latest Xen, with lock removed for get_gfn, on which lock is time spent?
> Still the p2m_lock.

Can you please try the attached patch?  I think you'll need this one
plus the ones that take the locks out of the hpet code. 

This patch makes the p2m lock into an rwlock and adjusts a number of the
paths that don't update the p2m so they only take the read lock.  It's a
bit rough but I can boot 16-way win7 guest with it.

N.B. Since rwlocks don't show up the the existing lock profiling, please
don't try to use the lock-profiling numbers to see if it's helping!

Andres, this is basically the big-hammer version of your "take a
pagecount" changes, plus the change you made to hvmemul_rep_movs().
If this works I intend to follow it up with a patch to make some of the
read-modify-write paths avoid taking the lock (by using a
compare-exchange operation so they only take the lock on a write).  If
that succeeds I might drop put_gfn() altogether. 

But first it will need a lot of tidying up.  Noticeably missing:
 - SVM code equivalents to the vmx.c changes
 - grant-table operations still use the lock, because frankly I 
   could not follow the current code, and it's quite late in the evening.
I also have a long list of uglinesses in the mm code that I found while
writing this lot. 

Keir, I have no objection to later replacing this with something better
than an rwlock. :)  Or with making a NUMA-friendly rwlock
implementation, since I really expect this to be heavily read-mostly
when paging/sharing/pod are not enabled.

Cheers,

Tim.
--qDbXVdCdHGoSgWSk
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: attachment; filename=get-page-from-gfn

# HG changeset patch
# Parent 107285938c50f82667bd4d014820b439a077c22c

diff -r 107285938c50 xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/domain.c	Thu Apr 26 22:00:25 2012 +0100
@@ -716,7 +716,7 @@ int arch_set_info_guest(
 {
     struct domain *d = v->domain;
     unsigned long cr3_gfn;
-    unsigned long cr3_pfn = INVALID_MFN;
+    struct page_info *cr3_page;
     unsigned long flags, cr4;
     unsigned int i;
     int rc = 0, compat;
@@ -925,46 +925,45 @@ int arch_set_info_guest(
     if ( !compat )
     {
         cr3_gfn = xen_cr3_to_pfn(c.nat->ctrlreg[3]);
-        cr3_pfn = get_gfn_untyped(d, cr3_gfn);
+        cr3_page = get_page_from_gfn(d, cr3_gfn, NULL, P2M_ALLOC);
 
-        if ( !mfn_valid(cr3_pfn) ||
-             (paging_mode_refcounts(d)
-              ? !get_page(mfn_to_page(cr3_pfn), d)
-              : !get_page_and_type(mfn_to_page(cr3_pfn), d,
-                                   PGT_base_page_table)) )
+        if ( !cr3_page )
         {
-            put_gfn(d, cr3_gfn);
+            destroy_gdt(v);
+            return -EINVAL;
+        }
+        if ( !paging_mode_refcounts(d)
+             && !get_page_type(cr3_page, PGT_base_page_table) )
+        {
+            put_page(cr3_page);
             destroy_gdt(v);
             return -EINVAL;
         }
 
-        v->arch.guest_table = pagetable_from_pfn(cr3_pfn);
-        put_gfn(d, cr3_gfn);
+        v->arch.guest_table = pagetable_from_page(cr3_page);
 #ifdef __x86_64__
         if ( c.nat->ctrlreg[1] )
         {
             cr3_gfn = xen_cr3_to_pfn(c.nat->ctrlreg[1]);
-            cr3_pfn = get_gfn_untyped(d, cr3_gfn);
+            cr3_page = get_page_from_gfn(d, cr3_gfn, NULL, P2M_ALLOC);
 
-            if ( !mfn_valid(cr3_pfn) ||
-                 (paging_mode_refcounts(d)
-                  ? !get_page(mfn_to_page(cr3_pfn), d)
-                  : !get_page_and_type(mfn_to_page(cr3_pfn), d,
-                                       PGT_base_page_table)) )
+            if ( !cr3_page ||
+                 (!paging_mode_refcounts(d)
+                  && !get_page_type(cr3_page, PGT_base_page_table)) )
             {
-                cr3_pfn = pagetable_get_pfn(v->arch.guest_table);
+                if (cr3_page)
+                    put_page(cr3_page);
+                cr3_page = pagetable_get_page(v->arch.guest_table);
                 v->arch.guest_table = pagetable_null();
                 if ( paging_mode_refcounts(d) )
-                    put_page(mfn_to_page(cr3_pfn));
+                    put_page(cr3_page);
                 else
-                    put_page_and_type(mfn_to_page(cr3_pfn));
-                put_gfn(d, cr3_gfn); 
+                    put_page_and_type(cr3_page);
                 destroy_gdt(v);
                 return -EINVAL;
             }
 
-            v->arch.guest_table_user = pagetable_from_pfn(cr3_pfn);
-            put_gfn(d, cr3_gfn); 
+            v->arch.guest_table_user = pagetable_from_page(cr3_page);
         }
         else if ( !(flags & VGCF_in_kernel) )
         {
@@ -977,23 +976,25 @@ int arch_set_info_guest(
         l4_pgentry_t *l4tab;
 
         cr3_gfn = compat_cr3_to_pfn(c.cmp->ctrlreg[3]);
-        cr3_pfn = get_gfn_untyped(d, cr3_gfn);
+        cr3_page = get_page_from_gfn(d, cr3_gfn, NULL, P2M_ALLOC);
 
-        if ( !mfn_valid(cr3_pfn) ||
-             (paging_mode_refcounts(d)
-              ? !get_page(mfn_to_page(cr3_pfn), d)
-              : !get_page_and_type(mfn_to_page(cr3_pfn), d,
-                                   PGT_l3_page_table)) )
+        if ( !cr3_page)
         {
-            put_gfn(d, cr3_gfn); 
+            destroy_gdt(v);
+            return -EINVAL;
+        }
+
+        if (!paging_mode_refcounts(d)
+            && !get_page_and_type(cr3_page, d, PGT_l3_page_table) )
+        {
+            put_page(cr3_page);
             destroy_gdt(v);
             return -EINVAL;
         }
 
         l4tab = __va(pagetable_get_paddr(v->arch.guest_table));
-        *l4tab = l4e_from_pfn(
-            cr3_pfn, _PAGE_PRESENT|_PAGE_RW|_PAGE_USER|_PAGE_ACCESSED);
-        put_gfn(d, cr3_gfn); 
+        *l4tab = l4e_from_pfn(page_to_mfn(cr3_page),
+            _PAGE_PRESENT|_PAGE_RW|_PAGE_USER|_PAGE_ACCESSED);
 #endif
     }
 
@@ -1064,7 +1065,7 @@ map_vcpu_info(struct vcpu *v, unsigned l
     struct domain *d = v->domain;
     void *mapping;
     vcpu_info_t *new_info;
-    unsigned long mfn;
+    struct page_info *page;
     int i;
 
     if ( offset > (PAGE_SIZE - sizeof(vcpu_info_t)) )
@@ -1077,19 +1078,20 @@ map_vcpu_info(struct vcpu *v, unsigned l
     if ( (v != current) && !test_bit(_VPF_down, &v->pause_flags) )
         return -EINVAL;
 
-    mfn = get_gfn_untyped(d, gfn);
-    if ( !mfn_valid(mfn) ||
-         !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
+    page = get_page_from_gfn(d, gfn, NULL, P2M_ALLOC);
+    if ( !page )
+        return -EINVAL;
+
+    if ( !get_page_type(page, PGT_writable_page) )
     {
-        put_gfn(d, gfn); 
+        put_page(page);
         return -EINVAL;
     }
 
-    mapping = map_domain_page_global(mfn);
+    mapping = __map_domain_page_global(page);
     if ( mapping == NULL )
     {
-        put_page_and_type(mfn_to_page(mfn));
-        put_gfn(d, gfn); 
+        put_page_and_type(page);
         return -ENOMEM;
     }
 
@@ -1106,7 +1108,7 @@ map_vcpu_info(struct vcpu *v, unsigned l
     }
 
     v->vcpu_info = new_info;
-    v->arch.pv_vcpu.vcpu_info_mfn = mfn;
+    v->arch.pv_vcpu.vcpu_info_mfn = page_to_mfn(page);
 
     /* Set new vcpu_info pointer /before/ setting pending flags. */
     wmb();
@@ -1119,7 +1121,6 @@ map_vcpu_info(struct vcpu *v, unsigned l
     for ( i = 0; i < BITS_PER_EVTCHN_WORD(d); i++ )
         set_bit(i, &vcpu_info(v, evtchn_pending_sel));
 
-    put_gfn(d, gfn); 
     return 0;
 }
 
diff -r 107285938c50 xen/arch/x86/domctl.c
--- a/xen/arch/x86/domctl.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/domctl.c	Thu Apr 26 22:00:25 2012 +0100
@@ -202,16 +202,16 @@ long arch_do_domctl(
 
                 for ( j = 0; j < k; j++ )
                 {
-                    unsigned long type = 0, mfn = get_gfn_untyped(d, arr[j]);
+                    unsigned long type = 0;
 
-                    page = mfn_to_page(mfn);
+                    page = get_page_from_gfn(d, arr[j], NULL, P2M_ALLOC);
 
-                    if ( unlikely(!mfn_valid(mfn)) ||
-                         unlikely(is_xen_heap_mfn(mfn)) )
+                    if ( unlikely(!page) ||
+                         unlikely(is_xen_heap_page(page)) )
                         type = XEN_DOMCTL_PFINFO_XTAB;
                     else if ( xsm_getpageframeinfo(page) != 0 )
                         ;
-                    else if ( likely(get_page(page, d)) )
+                    else
                     {
                         switch( page->u.inuse.type_info & PGT_type_mask )
                         {
@@ -231,13 +231,10 @@ long arch_do_domctl(
 
                         if ( page->u.inuse.type_info & PGT_pinned )
                             type |= XEN_DOMCTL_PFINFO_LPINTAB;
+                    }
 
+                    if ( page )
                         put_page(page);
-                    }
-                    else
-                        type = XEN_DOMCTL_PFINFO_XTAB;
-
-                    put_gfn(d, arr[j]);
                     arr[j] = type;
                 }
 
@@ -304,21 +301,21 @@ long arch_do_domctl(
             {      
                 struct page_info *page;
                 unsigned long gfn = arr32[j];
-                unsigned long mfn = get_gfn_untyped(d, gfn);
 
-                page = mfn_to_page(mfn);
+                page = get_page_from_gfn(d, gfn, NULL, P2M_ALLOC);
 
                 if ( domctl->cmd == XEN_DOMCTL_getpageframeinfo3)
                     arr32[j] = 0;
 
-                if ( unlikely(!mfn_valid(mfn)) ||
-                     unlikely(is_xen_heap_mfn(mfn)) )
+                if ( unlikely(!page) ||
+                     unlikely(is_xen_heap_page(page)) )
                     arr32[j] |= XEN_DOMCTL_PFINFO_XTAB;
                 else if ( xsm_getpageframeinfo(page) != 0 )
                 {
-                    put_gfn(d, gfn); 
+                    put_page(page);
                     continue;
-                } else if ( likely(get_page(page, d)) )
+                }
+                else
                 {
                     unsigned long type = 0;
 
@@ -341,12 +338,10 @@ long arch_do_domctl(
                     if ( page->u.inuse.type_info & PGT_pinned )
                         type |= XEN_DOMCTL_PFINFO_LPINTAB;
                     arr32[j] |= type;
+                }
+
+                if ( page )
                     put_page(page);
-                }
-                else
-                    arr32[j] |= XEN_DOMCTL_PFINFO_XTAB;
-
-                put_gfn(d, gfn); 
             }
 
             if ( copy_to_guest_offset(domctl->u.getpageframeinfo2.array,
@@ -419,7 +414,7 @@ long arch_do_domctl(
     {
         struct domain *d = rcu_lock_domain_by_id(domctl->domain);
         unsigned long gmfn = domctl->u.hypercall_init.gmfn;
-        unsigned long mfn;
+        struct page_info *page;
         void *hypercall_page;
 
         ret = -ESRCH;
@@ -433,26 +428,25 @@ long arch_do_domctl(
             break;
         }
 
-        mfn = get_gfn_untyped(d, gmfn);
+        page = get_page_from_gfn(d, gmfn, NULL, P2M_ALLOC);
 
         ret = -EACCES;
-        if ( !mfn_valid(mfn) ||
-             !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
+        if ( !page || !get_page_type(page, PGT_writable_page) )
         {
-            put_gfn(d, gmfn); 
+            if ( page )
+                put_page(page);
             rcu_unlock_domain(d);
             break;
         }
 
         ret = 0;
 
-        hypercall_page = map_domain_page(mfn);
+        hypercall_page = __map_domain_page(page);
         hypercall_page_initialise(d, hypercall_page);
         unmap_domain_page(hypercall_page);
 
-        put_page_and_type(mfn_to_page(mfn));
+        put_page_and_type(page);
 
-        put_gfn(d, gmfn); 
         rcu_unlock_domain(d);
     }
     break;
diff -r 107285938c50 xen/arch/x86/hvm/emulate.c
--- a/xen/arch/x86/hvm/emulate.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/hvm/emulate.c	Thu Apr 26 22:00:25 2012 +0100
@@ -60,34 +60,25 @@ static int hvmemul_do_io(
     ioreq_t *p = get_ioreq(curr);
     unsigned long ram_gfn = paddr_to_pfn(ram_gpa);
     p2m_type_t p2mt;
-    mfn_t ram_mfn;
+    struct page_info *ram_page;
     int rc;
 
     /* Check for paged out page */
-    ram_mfn = get_gfn_unshare(curr->domain, ram_gfn, &p2mt);
+    ram_page = get_page_from_gfn(curr->domain, ram_gfn, &p2mt, P2M_UNSHARE);
     if ( p2m_is_paging(p2mt) )
     {
-        put_gfn(curr->domain, ram_gfn); 
+        if ( ram_page )
+            put_page(ram_page);
         p2m_mem_paging_populate(curr->domain, ram_gfn);
         return X86EMUL_RETRY;
     }
     if ( p2m_is_shared(p2mt) )
     {
-        put_gfn(curr->domain, ram_gfn); 
+        if ( ram_page )
+            put_page(ram_page);
         return X86EMUL_RETRY;
     }
 
-    /* Maintain a ref on the mfn to ensure liveness. Put the gfn
-     * to avoid potential deadlock wrt event channel lock, later. */
-    if ( mfn_valid(mfn_x(ram_mfn)) )
-        if ( !get_page(mfn_to_page(mfn_x(ram_mfn)),
-             curr->domain) )
-        {
-            put_gfn(curr->domain, ram_gfn);
-            return X86EMUL_RETRY;
-        }
-    put_gfn(curr->domain, ram_gfn);
-
     /*
      * Weird-sized accesses have undefined behaviour: we discard writes
      * and read all-ones.
@@ -98,8 +89,8 @@ static int hvmemul_do_io(
         ASSERT(p_data != NULL); /* cannot happen with a REP prefix */
         if ( dir == IOREQ_READ )
             memset(p_data, ~0, size);
-        if ( mfn_valid(mfn_x(ram_mfn)) )
-            put_page(mfn_to_page(mfn_x(ram_mfn)));
+        if ( ram_page )
+            put_page(ram_page);
         return X86EMUL_UNHANDLEABLE;
     }
 
@@ -120,8 +111,8 @@ static int hvmemul_do_io(
             unsigned int bytes = vio->mmio_large_write_bytes;
             if ( (addr >= pa) && ((addr + size) <= (pa + bytes)) )
             {
-                if ( mfn_valid(mfn_x(ram_mfn)) )
-                    put_page(mfn_to_page(mfn_x(ram_mfn)));
+                if ( ram_page )
+                    put_page(ram_page);
                 return X86EMUL_OKAY;
             }
         }
@@ -133,8 +124,8 @@ static int hvmemul_do_io(
             {
                 memcpy(p_data, &vio->mmio_large_read[addr - pa],
                        size);
-                if ( mfn_valid(mfn_x(ram_mfn)) )
-                    put_page(mfn_to_page(mfn_x(ram_mfn)));
+                if ( ram_page )
+                    put_page(ram_page);
                 return X86EMUL_OKAY;
             }
         }
@@ -148,8 +139,8 @@ static int hvmemul_do_io(
         vio->io_state = HVMIO_none;
         if ( p_data == NULL )
         {
-            if ( mfn_valid(mfn_x(ram_mfn)) )
-                put_page(mfn_to_page(mfn_x(ram_mfn)));
+            if ( ram_page )
+                put_page(ram_page);
             return X86EMUL_UNHANDLEABLE;
         }
         goto finish_access;
@@ -159,13 +150,13 @@ static int hvmemul_do_io(
              (addr == (vio->mmio_large_write_pa +
                        vio->mmio_large_write_bytes)) )
         {
-            if ( mfn_valid(mfn_x(ram_mfn)) )
-                put_page(mfn_to_page(mfn_x(ram_mfn)));
+            if ( ram_page )
+                put_page(ram_page);
             return X86EMUL_RETRY;
         }
     default:
-        if ( mfn_valid(mfn_x(ram_mfn)) )
-            put_page(mfn_to_page(mfn_x(ram_mfn)));
+        if ( ram_page )
+            put_page(ram_page);
         return X86EMUL_UNHANDLEABLE;
     }
 
@@ -173,8 +164,8 @@ static int hvmemul_do_io(
     {
         gdprintk(XENLOG_WARNING, "WARNING: io already pending (%d)?\n",
                  p->state);
-        if ( mfn_valid(mfn_x(ram_mfn)) )
-            put_page(mfn_to_page(mfn_x(ram_mfn)));
+        if ( ram_page )
+            put_page(ram_page);
         return X86EMUL_UNHANDLEABLE;
     }
 
@@ -226,8 +217,8 @@ static int hvmemul_do_io(
 
     if ( rc != X86EMUL_OKAY )
     {
-        if ( mfn_valid(mfn_x(ram_mfn)) )
-            put_page(mfn_to_page(mfn_x(ram_mfn)));
+        if ( ram_page )
+            put_page(ram_page);
         return rc;
     }
 
@@ -263,8 +254,8 @@ static int hvmemul_do_io(
         }
     }
 
-    if ( mfn_valid(mfn_x(ram_mfn)) )
-        put_page(mfn_to_page(mfn_x(ram_mfn)));
+    if ( ram_page )
+        put_page(ram_page);
     return X86EMUL_OKAY;
 }
 
@@ -686,7 +677,6 @@ static int hvmemul_rep_movs(
     p2m_type_t sp2mt, dp2mt;
     int rc, df = !!(ctxt->regs->eflags & X86_EFLAGS_DF);
     char *buf;
-    struct two_gfns tg;
 
     rc = hvmemul_virtual_to_linear(
         src_seg, src_offset, bytes_per_rep, reps, hvm_access_read,
@@ -714,25 +704,17 @@ static int hvmemul_rep_movs(
     if ( rc != X86EMUL_OKAY )
         return rc;
 
-    get_two_gfns(current->domain, sgpa >> PAGE_SHIFT, &sp2mt, NULL, NULL,
-                 current->domain, dgpa >> PAGE_SHIFT, &dp2mt, NULL, NULL,
-                 P2M_ALLOC, &tg);
+    /* Check for MMIO ops */
+    (void) get_gfn_query_unlocked(current->domain, sgpa >> PAGE_SHIFT, &sp2mt);
+    (void) get_gfn_query_unlocked(current->domain, dgpa >> PAGE_SHIFT, &dp2mt);
 
-    if ( !p2m_is_ram(sp2mt) && !p2m_is_grant(sp2mt) )
-    {
-        rc = hvmemul_do_mmio(
+    if ( sp2mt == p2m_mmio_dm )
+        return hvmemul_do_mmio(
             sgpa, reps, bytes_per_rep, dgpa, IOREQ_READ, df, NULL);
-        put_two_gfns(&tg);
-        return rc;
-    }
 
-    if ( !p2m_is_ram(dp2mt) && !p2m_is_grant(dp2mt) )
-    {
-        rc = hvmemul_do_mmio(
+    if ( dp2mt == p2m_mmio_dm )
+        return hvmemul_do_mmio(
             dgpa, reps, bytes_per_rep, sgpa, IOREQ_WRITE, df, NULL);
-        put_two_gfns(&tg);
-        return rc;
-    }
 
     /* RAM-to-RAM copy: emulate as equivalent of memmove(dgpa, sgpa, bytes). */
     bytes = *reps * bytes_per_rep;
@@ -747,10 +729,7 @@ static int hvmemul_rep_movs(
      * can be emulated by a source-to-buffer-to-destination block copy.
      */
     if ( ((dgpa + bytes_per_rep) > sgpa) && (dgpa < (sgpa + bytes)) )
-    {
-        put_two_gfns(&tg);
         return X86EMUL_UNHANDLEABLE;
-    }
 
     /* Adjust destination address for reverse copy. */
     if ( df )
@@ -759,10 +738,7 @@ static int hvmemul_rep_movs(
     /* Allocate temporary buffer. Fall back to slow emulation if this fails. */
     buf = xmalloc_bytes(bytes);
     if ( buf == NULL )
-    {
-        put_two_gfns(&tg);
         return X86EMUL_UNHANDLEABLE;
-    }
 
     /*
      * We do a modicum of checking here, just for paranoia's sake and to
@@ -773,7 +749,6 @@ static int hvmemul_rep_movs(
         rc = hvm_copy_to_guest_phys(dgpa, buf, bytes);
 
     xfree(buf);
-    put_two_gfns(&tg);
 
     if ( rc == HVMCOPY_gfn_paged_out )
         return X86EMUL_RETRY;
diff -r 107285938c50 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/hvm/hvm.c	Thu Apr 26 22:00:25 2012 +0100
@@ -395,48 +395,41 @@ int prepare_ring_for_helper(
 {
     struct page_info *page;
     p2m_type_t p2mt;
-    unsigned long mfn;
     void *va;
 
-    mfn = mfn_x(get_gfn_unshare(d, gmfn, &p2mt));
-    if ( !p2m_is_ram(p2mt) )
-    {
-        put_gfn(d, gmfn);
-        return -EINVAL;
-    }
+    page = get_page_from_gfn(d, gmfn, &p2mt, P2M_UNSHARE);
     if ( p2m_is_paging(p2mt) )
     {
-        put_gfn(d, gmfn);
+        if ( page )
+            put_page(page);
         p2m_mem_paging_populate(d, gmfn);
         return -ENOENT;
     }
     if ( p2m_is_shared(p2mt) )
     {
-        put_gfn(d, gmfn);
+        if ( page )
+            put_page(page);
         return -ENOENT;
     }
-    ASSERT(mfn_valid(mfn));
-
-    page = mfn_to_page(mfn);
-    if ( !get_page_and_type(page, d, PGT_writable_page) )
+    if ( !page )
+        return -EINVAL;
+
+    if ( !get_page_type(page, PGT_writable_page) )
     {
-        put_gfn(d, gmfn);
+        put_page(page);
         return -EINVAL;
     }
 
-    va = map_domain_page_global(mfn);
+    va = __map_domain_page_global(page);
     if ( va == NULL )
     {
         put_page_and_type(page);
-        put_gfn(d, gmfn);
         return -ENOMEM;
     }
 
     *_va = va;
     *_page = page;
 
-    put_gfn(d, gmfn);
-
     return 0;
 }
 
@@ -1607,8 +1600,8 @@ int hvm_mov_from_cr(unsigned int cr, uns
 int hvm_set_cr0(unsigned long value)
 {
     struct vcpu *v = current;
-    p2m_type_t p2mt;
-    unsigned long gfn, mfn, old_value = v->arch.hvm_vcpu.guest_cr[0];
+    unsigned long gfn, old_value = v->arch.hvm_vcpu.guest_cr[0];
+    struct page_info *page;
 
     HVM_DBG_LOG(DBG_LEVEL_VMMU, "Update CR0 value = %lx", value);
 
@@ -1647,23 +1640,20 @@ int hvm_set_cr0(unsigned long value)
         {
             /* The guest CR3 must be pointing to the guest physical. */
             gfn = v->arch.hvm_vcpu.guest_cr[3]>>PAGE_SHIFT;
-            mfn = mfn_x(get_gfn(v->domain, gfn, &p2mt));
-            if ( !p2m_is_ram(p2mt) || !mfn_valid(mfn) ||
-                 !get_page(mfn_to_page(mfn), v->domain))
+            page = get_page_from_gfn(v->domain, gfn, NULL, P2M_ALLOC);
+            if ( !page )
             {
-                put_gfn(v->domain, gfn);
-                gdprintk(XENLOG_ERR, "Invalid CR3 value = %lx (mfn=%lx)\n",
-                         v->arch.hvm_vcpu.guest_cr[3], mfn);
+                gdprintk(XENLOG_ERR, "Invalid CR3 value = %lx\n",
+                         v->arch.hvm_vcpu.guest_cr[3]);
                 domain_crash(v->domain);
                 return X86EMUL_UNHANDLEABLE;
             }
 
             /* Now arch.guest_table points to machine physical. */
-            v->arch.guest_table = pagetable_from_pfn(mfn);
+            v->arch.guest_table = pagetable_from_page(page);
 
             HVM_DBG_LOG(DBG_LEVEL_VMMU, "Update CR3 value = %lx, mfn = %lx",
-                        v->arch.hvm_vcpu.guest_cr[3], mfn);
-            put_gfn(v->domain, gfn);
+                        v->arch.hvm_vcpu.guest_cr[3], page_to_mfn(page));
         }
     }
     else if ( !(value & X86_CR0_PG) && (old_value & X86_CR0_PG) )
@@ -1738,26 +1728,21 @@ int hvm_set_cr0(unsigned long value)
 
 int hvm_set_cr3(unsigned long value)
 {
-    unsigned long mfn;
-    p2m_type_t p2mt;
     struct vcpu *v = current;
+    struct page_info *page;
 
     if ( hvm_paging_enabled(v) && !paging_mode_hap(v->domain) &&
          (value != v->arch.hvm_vcpu.guest_cr[3]) )
     {
         /* Shadow-mode CR3 change. Check PDBR and update refcounts. */
         HVM_DBG_LOG(DBG_LEVEL_VMMU, "CR3 value = %lx", value);
-        mfn = mfn_x(get_gfn(v->domain, value >> PAGE_SHIFT, &p2mt));
-        if ( !p2m_is_ram(p2mt) || !mfn_valid(mfn) ||
-             !get_page(mfn_to_page(mfn), v->domain) )
-        {
-              put_gfn(v->domain, value >> PAGE_SHIFT);
-              goto bad_cr3;
-        }
+        page = get_page_from_gfn(v->domain, value >> PAGE_SHIFT,
+                                 NULL, P2M_ALLOC);
+        if ( !page )
+            goto bad_cr3;
 
         put_page(pagetable_get_page(v->arch.guest_table));
-        v->arch.guest_table = pagetable_from_pfn(mfn);
-        put_gfn(v->domain, value >> PAGE_SHIFT);
+        v->arch.guest_table = pagetable_from_page(page);
 
         HVM_DBG_LOG(DBG_LEVEL_VMMU, "Update CR3 value = %lx", value);
     }
@@ -1914,46 +1899,29 @@ int hvm_virtual_to_linear_addr(
 static void *__hvm_map_guest_frame(unsigned long gfn, bool_t writable)
 {
     void *map;
-    unsigned long mfn;
     p2m_type_t p2mt;
-    struct page_info *pg;
+    struct page_info *page;
     struct domain *d = current->domain;
-    int rc;
-
-    mfn = mfn_x(writable
-                ? get_gfn_unshare(d, gfn, &p2mt)
-                : get_gfn(d, gfn, &p2mt));
-    if ( (p2m_is_shared(p2mt) && writable) || !p2m_is_ram(p2mt) )
+
+    page = get_page_from_gfn(d, gfn, &p2mt,
+                             writable ? P2M_UNSHARE : P2M_ALLOC);
+    if ( (p2m_is_shared(p2mt) && writable) || !page )
     {
-        put_gfn(d, gfn);
+        if ( page )
+            put_page(page);
         return NULL;
     }
     if ( p2m_is_paging(p2mt) )
     {
-        put_gfn(d, gfn);
+        put_page(page);
         p2m_mem_paging_populate(d, gfn);
         return NULL;
     }
 
-    ASSERT(mfn_valid(mfn));
-
     if ( writable )
-        paging_mark_dirty(d, mfn);
-
-    /* Get a ref on the page, considering that it could be shared */
-    pg = mfn_to_page(mfn);
-    rc = get_page(pg, d);
-    if ( !rc && !writable )
-        /* Page could be shared */
-        rc = get_page(pg, dom_cow);
-    if ( !rc )
-    {
-        put_gfn(d, gfn);
-        return NULL;
-    }
-
-    map = map_domain_page(mfn);
-    put_gfn(d, gfn);
+        paging_mark_dirty(d, page_to_mfn(page));
+
+    map = __map_domain_page(page);
     return map;
 }
 
@@ -2358,7 +2326,8 @@ static enum hvm_copy_result __hvm_copy(
     void *buf, paddr_t addr, int size, unsigned int flags, uint32_t pfec)
 {
     struct vcpu *curr = current;
-    unsigned long gfn, mfn;
+    unsigned long gfn;
+    struct page_info *page;
     p2m_type_t p2mt;
     char *p;
     int count, todo = size;
@@ -2402,32 +2371,33 @@ static enum hvm_copy_result __hvm_copy(
             gfn = addr >> PAGE_SHIFT;
         }
 
-        mfn = mfn_x(get_gfn_unshare(curr->domain, gfn, &p2mt));
+        page = get_page_from_gfn(curr->domain, gfn, &p2mt, P2M_UNSHARE);
 
         if ( p2m_is_paging(p2mt) )
         {
-            put_gfn(curr->domain, gfn);
+            if ( page )
+                put_page(page);
             p2m_mem_paging_populate(curr->domain, gfn);
             return HVMCOPY_gfn_paged_out;
         }
         if ( p2m_is_shared(p2mt) )
         {
-            put_gfn(curr->domain, gfn);
+            if ( page )
+                put_page(page);
             return HVMCOPY_gfn_shared;
         }
         if ( p2m_is_grant(p2mt) )
         {
-            put_gfn(curr->domain, gfn);
+            if ( page )
+                put_page(page);
             return HVMCOPY_unhandleable;
         }
-        if ( !p2m_is_ram(p2mt) )
+        if ( !page )
         {
-            put_gfn(curr->domain, gfn);
             return HVMCOPY_bad_gfn_to_mfn;
         }
-        ASSERT(mfn_valid(mfn));
-
-        p = (char *)map_domain_page(mfn) + (addr & ~PAGE_MASK);
+
+        p = (char *)__map_domain_page(page) + (addr & ~PAGE_MASK);
 
         if ( flags & HVMCOPY_to_guest )
         {
@@ -2437,12 +2407,12 @@ static enum hvm_copy_result __hvm_copy(
                 if ( xchg(&lastpage, gfn) != gfn )
                     gdprintk(XENLOG_DEBUG, "guest attempted write to read-only"
                              " memory page. gfn=%#lx, mfn=%#lx\n",
-                             gfn, mfn);
+                             gfn, page_to_mfn(page));
             }
             else
             {
                 memcpy(p, buf, count);
-                paging_mark_dirty(curr->domain, mfn);
+                paging_mark_dirty(curr->domain, page_to_mfn(page));
             }
         }
         else
@@ -2455,7 +2425,7 @@ static enum hvm_copy_result __hvm_copy(
         addr += count;
         buf  += count;
         todo -= count;
-        put_gfn(curr->domain, gfn);
+        put_page(page);
     }
 
     return HVMCOPY_okay;
@@ -2464,7 +2434,8 @@ static enum hvm_copy_result __hvm_copy(
 static enum hvm_copy_result __hvm_clear(paddr_t addr, int size)
 {
     struct vcpu *curr = current;
-    unsigned long gfn, mfn;
+    unsigned long gfn;
+    struct page_info *page;
     p2m_type_t p2mt;
     char *p;
     int count, todo = size;
@@ -2500,32 +2471,35 @@ static enum hvm_copy_result __hvm_clear(
             return HVMCOPY_bad_gva_to_gfn;
         }
 
-        mfn = mfn_x(get_gfn_unshare(curr->domain, gfn, &p2mt));
+        page = get_page_from_gfn(curr->domain, gfn, &p2mt, P2M_UNSHARE);
 
         if ( p2m_is_paging(p2mt) )
         {
+            if ( page )
+                put_page(page);
             p2m_mem_paging_populate(curr->domain, gfn);
-            put_gfn(curr->domain, gfn);
             return HVMCOPY_gfn_paged_out;
         }
         if ( p2m_is_shared(p2mt) )
         {
-            put_gfn(curr->domain, gfn);
+            if ( page )
+                put_page(page);
             return HVMCOPY_gfn_shared;
         }
         if ( p2m_is_grant(p2mt) )
         {
-            put_gfn(curr->domain, gfn);
+            if ( page )
+                put_page(page);
             return HVMCOPY_unhandleable;
         }
-        if ( !p2m_is_ram(p2mt) )
+        if ( !page )
         {
-            put_gfn(curr->domain, gfn);
+            if ( page )
+                put_page(page);
             return HVMCOPY_bad_gfn_to_mfn;
         }
-        ASSERT(mfn_valid(mfn));
-
-        p = (char *)map_domain_page(mfn) + (addr & ~PAGE_MASK);
+
+        p = (char *)__map_domain_page(page) + (addr & ~PAGE_MASK);
 
         if ( p2mt == p2m_ram_ro )
         {
@@ -2533,19 +2507,19 @@ static enum hvm_copy_result __hvm_clear(
             if ( xchg(&lastpage, gfn) != gfn )
                 gdprintk(XENLOG_DEBUG, "guest attempted write to read-only"
                         " memory page. gfn=%#lx, mfn=%#lx\n",
-                        gfn, mfn);
+                         gfn, page_to_mfn(page));
         }
         else
         {
             memset(p, 0x00, count);
-            paging_mark_dirty(curr->domain, mfn);
+            paging_mark_dirty(curr->domain, page_to_mfn(page));
         }
 
         unmap_domain_page(p);
 
         addr += count;
         todo -= count;
-        put_gfn(curr->domain, gfn);
+        put_page(page);
     }
 
     return HVMCOPY_okay;
@@ -4000,35 +3974,16 @@ long do_hvm_op(unsigned long op, XEN_GUE
 
         for ( pfn = a.first_pfn; pfn < a.first_pfn + a.nr; pfn++ )
         {
-            p2m_type_t t;
-            mfn_t mfn = get_gfn_unshare(d, pfn, &t);
-            if ( p2m_is_paging(t) )
+            struct page_info *page;
+            page = get_page_from_gfn(d, pfn, NULL, P2M_UNSHARE);
+            if ( page )
             {
-                put_gfn(d, pfn);
-                p2m_mem_paging_populate(d, pfn);
-                rc = -EINVAL;
-                goto param_fail3;
-            }
-            if( p2m_is_shared(t) )
-            {
-                /* If it insists on not unsharing itself, crash the domain 
-                 * rather than crashing the host down in mark dirty */
-                gdprintk(XENLOG_WARNING,
-                         "shared pfn 0x%lx modified?\n", pfn);
-                domain_crash(d);
-                put_gfn(d, pfn);
-                rc = -EINVAL;
-                goto param_fail3;
-            }
-            
-            if ( mfn_x(mfn) != INVALID_MFN )
-            {
-                paging_mark_dirty(d, mfn_x(mfn));
+                paging_mark_dirty(d, page_to_mfn(page));
                 /* These are most probably not page tables any more */
                 /* don't take a long time and don't die either */
-                sh_remove_shadows(d->vcpu[0], mfn, 1, 0);
+                sh_remove_shadows(d->vcpu[0], _mfn(page_to_mfn(page)), 1, 0);
+                put_page(page);
             }
-            put_gfn(d, pfn);
         }
 
     param_fail3:
diff -r 107285938c50 xen/arch/x86/hvm/stdvga.c
--- a/xen/arch/x86/hvm/stdvga.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/hvm/stdvga.c	Thu Apr 26 22:00:25 2012 +0100
@@ -482,7 +482,8 @@ static int mmio_move(struct hvm_hw_stdvg
                 if ( hvm_copy_to_guest_phys(data, &tmp, p->size) !=
                      HVMCOPY_okay )
                 {
-                    (void)get_gfn(d, data >> PAGE_SHIFT, &p2mt);
+                    struct page_info *dp = get_page_from_gfn(
+                            d, data >> PAGE_SHIFT, &p2mt, P2M_ALLOC);
                     /*
                      * The only case we handle is vga_mem <-> vga_mem.
                      * Anything else disables caching and leaves it to qemu-dm.
@@ -490,11 +491,12 @@ static int mmio_move(struct hvm_hw_stdvg
                     if ( (p2mt != p2m_mmio_dm) || (data < VGA_MEM_BASE) ||
                          ((data + p->size) > (VGA_MEM_BASE + VGA_MEM_SIZE)) )
                     {
-                        put_gfn(d, data >> PAGE_SHIFT);
+                        if ( dp )
+                            put_page(dp);
                         return 0;
                     }
+                    ASSERT(!dp);
                     stdvga_mem_write(data, tmp, p->size);
-                    put_gfn(d, data >> PAGE_SHIFT);
                 }
                 data += sign * p->size;
                 addr += sign * p->size;
@@ -508,15 +510,16 @@ static int mmio_move(struct hvm_hw_stdvg
                 if ( hvm_copy_from_guest_phys(&tmp, data, p->size) !=
                      HVMCOPY_okay )
                 {
-                    (void)get_gfn(d, data >> PAGE_SHIFT, &p2mt);
+                    struct page_info *dp = get_page_from_gfn(
+                        d, data >> PAGE_SHIFT, &p2mt, P2M_ALLOC);
                     if ( (p2mt != p2m_mmio_dm) || (data < VGA_MEM_BASE) ||
                          ((data + p->size) > (VGA_MEM_BASE + VGA_MEM_SIZE)) )
                     {
-                        put_gfn(d, data >> PAGE_SHIFT);
+                        if ( dp )
+                            put_page(dp);
                         return 0;
                     }
                     tmp = stdvga_mem_read(data, p->size);
-                    put_gfn(d, data >> PAGE_SHIFT);
                 }
                 stdvga_mem_write(addr, tmp, p->size);
                 data += sign * p->size;
diff -r 107285938c50 xen/arch/x86/hvm/viridian.c
--- a/xen/arch/x86/hvm/viridian.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/hvm/viridian.c	Thu Apr 26 22:00:25 2012 +0100
@@ -134,18 +134,19 @@ void dump_apic_assist(struct vcpu *v)
 static void enable_hypercall_page(struct domain *d)
 {
     unsigned long gmfn = d->arch.hvm_domain.viridian.hypercall_gpa.fields.pfn;
-    unsigned long mfn = get_gfn_untyped(d, gmfn);
+    struct page_info *page = get_page_from_gfn(d, gmfn, NULL, P2M_ALLOC);
     uint8_t *p;
 
-    if ( !mfn_valid(mfn) ||
-         !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
+    if ( !page || !get_page_type(page, PGT_writable_page) )
     {
-        put_gfn(d, gmfn); 
-        gdprintk(XENLOG_WARNING, "Bad GMFN %lx (MFN %lx)\n", gmfn, mfn);
+        if ( page )
+            put_page(page);
+        gdprintk(XENLOG_WARNING, "Bad GMFN %lx (MFN %lx)\n", gmfn,
+                 page_to_mfn(page));
         return;
     }
 
-    p = map_domain_page(mfn);
+    p = __map_domain_page(page);
 
     /*
      * We set the bit 31 in %eax (reserved field in the Viridian hypercall
@@ -162,15 +163,14 @@ static void enable_hypercall_page(struct
 
     unmap_domain_page(p);
 
-    put_page_and_type(mfn_to_page(mfn));
-    put_gfn(d, gmfn); 
+    put_page_and_type(page);
 }
 
 void initialize_apic_assist(struct vcpu *v)
 {
     struct domain *d = v->domain;
     unsigned long gmfn = v->arch.hvm_vcpu.viridian.apic_assist.fields.pfn;
-    unsigned long mfn = get_gfn_untyped(d, gmfn);
+    struct page_info *page = get_page_from_gfn(d, gmfn, NULL, P2M_ALLOC);
     uint8_t *p;
 
     /*
@@ -183,22 +183,22 @@ void initialize_apic_assist(struct vcpu 
      * details of how Windows uses the page.
      */
 
-    if ( !mfn_valid(mfn) ||
-         !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
+    if ( !page || !get_page_type(page, PGT_writable_page) )
     {
-        put_gfn(d, gmfn); 
-        gdprintk(XENLOG_WARNING, "Bad GMFN %lx (MFN %lx)\n", gmfn, mfn);
+        if ( page )
+            put_page(page);
+        gdprintk(XENLOG_WARNING, "Bad GMFN %lx (MFN %lx)\n", gmfn,
+                 page_to_mfn(page));
         return;
     }
 
-    p = map_domain_page(mfn);
+    p = __map_domain_page(page);
 
     *(u32 *)p = 0;
 
     unmap_domain_page(p);
 
-    put_page_and_type(mfn_to_page(mfn));
-    put_gfn(d, gmfn); 
+    put_page_and_type(page);
 }
 
 int wrmsr_viridian_regs(uint32_t idx, uint64_t val)
diff -r 107285938c50 xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/hvm/vmx/vmx.c	Thu Apr 26 22:00:25 2012 +0100
@@ -480,17 +480,16 @@ static void vmx_vmcs_save(struct vcpu *v
 static int vmx_restore_cr0_cr3(
     struct vcpu *v, unsigned long cr0, unsigned long cr3)
 {
-    unsigned long mfn = 0;
-    p2m_type_t p2mt;
+    struct page_info *page = NULL;
 
     if ( paging_mode_shadow(v->domain) )
     {
         if ( cr0 & X86_CR0_PG )
         {
-            mfn = mfn_x(get_gfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt));
-            if ( !p2m_is_ram(p2mt) || !get_page(mfn_to_page(mfn), v->domain) )
+            page = get_page_from_gfn(v->domain, cr3 >> PAGE_SHIFT,
+                                     NULL, P2M_ALLOC);
+            if ( !page )
             {
-                put_gfn(v->domain, cr3 >> PAGE_SHIFT);
                 gdprintk(XENLOG_ERR, "Invalid CR3 value=0x%lx\n", cr3);
                 return -EINVAL;
             }
@@ -499,9 +498,8 @@ static int vmx_restore_cr0_cr3(
         if ( hvm_paging_enabled(v) )
             put_page(pagetable_get_page(v->arch.guest_table));
 
-        v->arch.guest_table = pagetable_from_pfn(mfn);
-        if ( cr0 & X86_CR0_PG )
-            put_gfn(v->domain, cr3 >> PAGE_SHIFT);
+        v->arch.guest_table =
+            page ? pagetable_from_page(page) : pagetable_null();
     }
 
     v->arch.hvm_vcpu.guest_cr[0] = cr0 | X86_CR0_ET;
@@ -1026,8 +1024,9 @@ static void vmx_set_interrupt_shadow(str
 
 static void vmx_load_pdptrs(struct vcpu *v)
 {
-    unsigned long cr3 = v->arch.hvm_vcpu.guest_cr[3], mfn;
+    unsigned long cr3 = v->arch.hvm_vcpu.guest_cr[3];
     uint64_t *guest_pdptrs;
+    struct page_info *page;
     p2m_type_t p2mt;
     char *p;
 
@@ -1038,24 +1037,19 @@ static void vmx_load_pdptrs(struct vcpu 
     if ( (cr3 & 0x1fUL) && !hvm_pcid_enabled(v) )
         goto crash;
 
-    mfn = mfn_x(get_gfn_unshare(v->domain, cr3 >> PAGE_SHIFT, &p2mt));
-    if ( !p2m_is_ram(p2mt) || !mfn_valid(mfn) || 
-         /* If we didn't succeed in unsharing, get_page will fail
-          * (page still belongs to dom_cow) */
-         !get_page(mfn_to_page(mfn), v->domain) )
+    page = get_page_from_gfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt, P2M_UNSHARE);
+    if ( !page )
     {
         /* Ideally you don't want to crash but rather go into a wait 
          * queue, but this is the wrong place. We're holding at least
          * the paging lock */
         gdprintk(XENLOG_ERR,
-                 "Bad cr3 on load pdptrs gfn %lx mfn %lx type %d\n",
-                 cr3 >> PAGE_SHIFT, mfn, (int) p2mt);
-        put_gfn(v->domain, cr3 >> PAGE_SHIFT);
+                 "Bad cr3 on load pdptrs gfn %lx type %d\n",
+                 cr3 >> PAGE_SHIFT, (int) p2mt);
         goto crash;
     }
-    put_gfn(v->domain, cr3 >> PAGE_SHIFT);
-
-    p = map_domain_page(mfn);
+
+    p = __map_domain_page(page);
 
     guest_pdptrs = (uint64_t *)(p + (cr3 & ~PAGE_MASK));
 
@@ -1081,7 +1075,7 @@ static void vmx_load_pdptrs(struct vcpu 
     vmx_vmcs_exit(v);
 
     unmap_domain_page(p);
-    put_page(mfn_to_page(mfn));
+    put_page(page);
     return;
 
  crash:
diff -r 107285938c50 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/mm.c	Thu Apr 26 22:00:25 2012 +0100
@@ -651,7 +651,8 @@ int map_ldt_shadow_page(unsigned int off
 {
     struct vcpu *v = current;
     struct domain *d = v->domain;
-    unsigned long gmfn, mfn;
+    unsigned long gmfn;
+    struct page_info *page;
     l1_pgentry_t l1e, nl1e;
     unsigned long gva = v->arch.pv_vcpu.ldt_base + (off << PAGE_SHIFT);
     int okay;
@@ -663,28 +664,24 @@ int map_ldt_shadow_page(unsigned int off
         return 0;
 
     gmfn = l1e_get_pfn(l1e);
-    mfn = get_gfn_untyped(d, gmfn);
-    if ( unlikely(!mfn_valid(mfn)) )
+    page = get_page_from_gfn(d, gmfn, NULL, P2M_ALLOC);
+    if ( unlikely(!page) )
+        return 0;
+
+    okay = get_page_type(page, PGT_seg_desc_page);
+    if ( unlikely(!okay) )
     {
-        put_gfn(d, gmfn); 
+        put_page(page);
         return 0;
     }
 
-    okay = get_page_and_type(mfn_to_page(mfn), d, PGT_seg_desc_page);
-    if ( unlikely(!okay) )
-    {
-        put_gfn(d, gmfn); 
-        return 0;
-    }
-
-    nl1e = l1e_from_pfn(mfn, l1e_get_flags(l1e) | _PAGE_RW);
+    nl1e = l1e_from_pfn(page_to_mfn(page), l1e_get_flags(l1e) | _PAGE_RW);
 
     spin_lock(&v->arch.pv_vcpu.shadow_ldt_lock);
     l1e_write(&v->arch.perdomain_ptes[off + 16], nl1e);
     v->arch.pv_vcpu.shadow_ldt_mapcnt++;
     spin_unlock(&v->arch.pv_vcpu.shadow_ldt_lock);
 
-    put_gfn(d, gmfn); 
     return 1;
 }
 
@@ -1819,7 +1816,6 @@ static int mod_l1_entry(l1_pgentry_t *pl
 {
     l1_pgentry_t ol1e;
     struct domain *pt_dom = pt_vcpu->domain;
-    p2m_type_t p2mt;
     int rc = 0;
 
     if ( unlikely(__copy_from_user(&ol1e, pl1e, sizeof(ol1e)) != 0) )
@@ -1835,22 +1831,21 @@ static int mod_l1_entry(l1_pgentry_t *pl
     if ( l1e_get_flags(nl1e) & _PAGE_PRESENT )
     {
         /* Translate foreign guest addresses. */
-        unsigned long mfn, gfn;
-        gfn = l1e_get_pfn(nl1e);
-        mfn = mfn_x(get_gfn(pg_dom, gfn, &p2mt));
-        if ( !p2m_is_ram(p2mt) || unlikely(mfn == INVALID_MFN) )
+        struct page_info *page = NULL;
+        if ( paging_mode_translate(pg_dom) )
         {
-            put_gfn(pg_dom, gfn);
-            return -EINVAL;
+            page = get_page_from_gfn(pg_dom, l1e_get_pfn(nl1e), NULL, P2M_ALLOC);
+            if ( !page )
+                return -EINVAL;
+            nl1e = l1e_from_pfn(page_to_mfn(page), l1e_get_flags(nl1e));
         }
-        ASSERT((mfn & ~(PADDR_MASK >> PAGE_SHIFT)) == 0);
-        nl1e = l1e_from_pfn(mfn, l1e_get_flags(nl1e));
 
         if ( unlikely(l1e_get_flags(nl1e) & l1_disallow_mask(pt_dom)) )
         {
             MEM_LOG("Bad L1 flags %x",
                     l1e_get_flags(nl1e) & l1_disallow_mask(pt_dom));
-            put_gfn(pg_dom, gfn);
+            if ( page )
+                put_page(page);
             return -EINVAL;
         }
 
@@ -1860,15 +1855,21 @@ static int mod_l1_entry(l1_pgentry_t *pl
             adjust_guest_l1e(nl1e, pt_dom);
             if ( UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, pt_vcpu,
                               preserve_ad) )
+            {
+                if ( page )
+                    put_page(page);
                 return 0;
-            put_gfn(pg_dom, gfn);
+            }
+            if ( page )
+                put_page(page);
             return -EBUSY;
         }
 
         switch ( rc = get_page_from_l1e(nl1e, pt_dom, pg_dom) )
         {
         default:
-            put_gfn(pg_dom, gfn);
+            if ( page )
+                put_page(page);
             return rc;
         case 0:
             break;
@@ -1876,7 +1877,9 @@ static int mod_l1_entry(l1_pgentry_t *pl
             l1e_remove_flags(nl1e, _PAGE_RW);
             break;
         }
-        
+        if ( page )
+            put_page(page);
+
         adjust_guest_l1e(nl1e, pt_dom);
         if ( unlikely(!UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, pt_vcpu,
                                     preserve_ad)) )
@@ -1884,7 +1887,6 @@ static int mod_l1_entry(l1_pgentry_t *pl
             ol1e = nl1e;
             rc = -EBUSY;
         }
-        put_gfn(pg_dom, gfn);
     }
     else if ( unlikely(!UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, pt_vcpu,
                                      preserve_ad)) )
@@ -3042,7 +3044,6 @@ int do_mmuext_op(
             type = PGT_l4_page_table;
 
         pin_page: {
-            unsigned long mfn;
             struct page_info *page;
 
             /* Ignore pinning of invalid paging levels. */
@@ -3052,25 +3053,28 @@ int do_mmuext_op(
             if ( paging_mode_refcounts(pg_owner) )
                 break;
 
-            mfn = get_gfn_untyped(pg_owner, op.arg1.mfn);
-            rc = get_page_and_type_from_pagenr(mfn, type, pg_owner, 0, 1);
+            page = get_page_from_gfn(pg_owner, op.arg1.mfn, NULL, P2M_ALLOC);
+            if ( unlikely(!page) )
+            {
+                rc = -EINVAL;
+                break;
+            }
+
+            rc = get_page_type_preemptible(page, type);
             okay = !rc;
             if ( unlikely(!okay) )
             {
                 if ( rc == -EINTR )
                     rc = -EAGAIN;
                 else if ( rc != -EAGAIN )
-                    MEM_LOG("Error while pinning mfn %lx", mfn);
-                put_gfn(pg_owner, op.arg1.mfn);
+                    MEM_LOG("Error while pinning mfn %lx", page_to_mfn(page));
+                put_page(page);
                 break;
             }
 
-            page = mfn_to_page(mfn);
-
             if ( (rc = xsm_memory_pin_page(d, page)) != 0 )
             {
                 put_page_and_type(page);
-                put_gfn(pg_owner, op.arg1.mfn);
                 okay = 0;
                 break;
             }
@@ -3078,16 +3082,15 @@ int do_mmuext_op(
             if ( unlikely(test_and_set_bit(_PGT_pinned,
                                            &page->u.inuse.type_info)) )
             {
-                MEM_LOG("Mfn %lx already pinned", mfn);
+                MEM_LOG("Mfn %lx already pinned", page_to_mfn(page));
                 put_page_and_type(page);
-                put_gfn(pg_owner, op.arg1.mfn);
                 okay = 0;
                 break;
             }
 
             /* A page is dirtied when its pin status is set. */
-            paging_mark_dirty(pg_owner, mfn);
-           
+            paging_mark_dirty(pg_owner, page_to_mfn(page));
+
             /* We can race domain destruction (domain_relinquish_resources). */
             if ( unlikely(pg_owner != d) )
             {
@@ -3099,35 +3102,29 @@ int do_mmuext_op(
                 spin_unlock(&pg_owner->page_alloc_lock);
                 if ( drop_ref )
                     put_page_and_type(page);
-                put_gfn(pg_owner, op.arg1.mfn);
             }
 
             break;
         }
 
         case MMUEXT_UNPIN_TABLE: {
-            unsigned long mfn;
             struct page_info *page;
 
             if ( paging_mode_refcounts(pg_owner) )
                 break;
 
-            mfn = get_gfn_untyped(pg_owner, op.arg1.mfn);
-            if ( unlikely(!(okay = get_page_from_pagenr(mfn, pg_owner))) )
+            page = get_page_from_gfn(pg_owner, op.arg1.mfn, NULL, P2M_ALLOC);
+            if ( unlikely(!page) )
             {
-                put_gfn(pg_owner, op.arg1.mfn);
-                MEM_LOG("Mfn %lx bad domain", mfn);
+                MEM_LOG("Mfn %lx bad domain", op.arg1.mfn);
                 break;
             }
 
-            page = mfn_to_page(mfn);
-
             if ( !test_and_clear_bit(_PGT_pinned, &page->u.inuse.type_info) )
             {
                 okay = 0;
                 put_page(page);
-                put_gfn(pg_owner, op.arg1.mfn);
-                MEM_LOG("Mfn %lx not pinned", mfn);
+                MEM_LOG("Mfn %lx not pinned", op.arg1.mfn);
                 break;
             }
 
@@ -3135,40 +3132,43 @@ int do_mmuext_op(
             put_page(page);
 
             /* A page is dirtied when its pin status is cleared. */
-            paging_mark_dirty(pg_owner, mfn);
-
-            put_gfn(pg_owner, op.arg1.mfn);
+            paging_mark_dirty(pg_owner, page_to_mfn(page));
+
             break;
         }
 
         case MMUEXT_NEW_BASEPTR:
-            okay = new_guest_cr3(get_gfn_untyped(d, op.arg1.mfn));
-            put_gfn(d, op.arg1.mfn);
+            okay = (!paging_mode_translate(d)
+                    && new_guest_cr3(op.arg1.mfn));
             break;
+
         
 #ifdef __x86_64__
         case MMUEXT_NEW_USER_BASEPTR: {
-            unsigned long old_mfn, mfn;
-
-            mfn = get_gfn_untyped(d, op.arg1.mfn);
-            if ( mfn != 0 )
+            unsigned long old_mfn;
+
+            if ( paging_mode_translate(current->domain) )
+            {
+                okay = 0;
+                break;
+            }
+
+            if ( op.arg1.mfn != 0 )
             {
                 if ( paging_mode_refcounts(d) )
-                    okay = get_page_from_pagenr(mfn, d);
+                    okay = get_page_from_pagenr(op.arg1.mfn, d);
                 else
                     okay = !get_page_and_type_from_pagenr(
-                        mfn, PGT_root_page_table, d, 0, 0);
+                        op.arg1.mfn, PGT_root_page_table, d, 0, 0);
                 if ( unlikely(!okay) )
                 {
-                    put_gfn(d, op.arg1.mfn);
-                    MEM_LOG("Error while installing new mfn %lx", mfn);
+                    MEM_LOG("Error while installing new mfn %lx", op.arg1.mfn);
                     break;
                 }
             }
 
             old_mfn = pagetable_get_pfn(curr->arch.guest_table_user);
-            curr->arch.guest_table_user = pagetable_from_pfn(mfn);
-            put_gfn(d, op.arg1.mfn);
+            curr->arch.guest_table_user = pagetable_from_pfn(op.arg1.mfn);
 
             if ( old_mfn != 0 )
             {
@@ -3283,28 +3283,26 @@ int do_mmuext_op(
         }
 
         case MMUEXT_CLEAR_PAGE: {
-            unsigned long mfn;
+            struct page_info *page;
             unsigned char *ptr;
 
-            mfn = get_gfn_untyped(d, op.arg1.mfn);
-            okay = !get_page_and_type_from_pagenr(
-                mfn, PGT_writable_page, d, 0, 0);
-            if ( unlikely(!okay) )
+            page = get_page_from_gfn(d, op.arg1.mfn, NULL, P2M_ALLOC);
+            if ( !page || get_page_type(page, PGT_writable_page) )
             {
-                put_gfn(d, op.arg1.mfn);
-                MEM_LOG("Error while clearing mfn %lx", mfn);
+                if ( page )
+                    put_page(page);
+                MEM_LOG("Error while clearing mfn %lx", op.arg1.mfn);
                 break;
             }
 
             /* A page is dirtied when it's being cleared. */
-            paging_mark_dirty(d, mfn);
-
-            ptr = fixmap_domain_page(mfn);
+            paging_mark_dirty(d, page_to_mfn(page));
+
+            ptr = fixmap_domain_page(page_to_mfn(page));
             clear_page(ptr);
             fixunmap_domain_page(ptr);
 
-            put_page_and_type(mfn_to_page(mfn));
-            put_gfn(d, op.arg1.mfn);
+            put_page_and_type(page);
             break;
         }
 
@@ -3312,42 +3310,38 @@ int do_mmuext_op(
         {
             const unsigned char *src;
             unsigned char *dst;
-            unsigned long src_mfn, mfn;
-
-            src_mfn = get_gfn_untyped(d, op.arg2.src_mfn);
-            okay = get_page_from_pagenr(src_mfn, d);
+            struct page_info *src_page, *dst_page;
+
+            src_page = get_page_from_gfn(d, op.arg2.src_mfn, NULL, P2M_ALLOC);
+            if ( unlikely(!src_page) )
+            {
+                okay = 0;
+                MEM_LOG("Error while copying from mfn %lx", op.arg2.src_mfn);
+                break;
+            }
+
+            dst_page = get_page_from_gfn(d, op.arg1.mfn, NULL, P2M_ALLOC);
+            okay = (dst_page && get_page_type(dst_page, PGT_writable_page));
             if ( unlikely(!okay) )
             {
-                put_gfn(d, op.arg2.src_mfn);
-                MEM_LOG("Error while copying from mfn %lx", src_mfn);
+                put_page(src_page);
+                if ( dst_page )
+                    put_page(dst_page);
+                MEM_LOG("Error while copying to mfn %lx", op.arg1.mfn);
                 break;
             }
 
-            mfn = get_gfn_untyped(d, op.arg1.mfn);
-            okay = !get_page_and_type_from_pagenr(
-                mfn, PGT_writable_page, d, 0, 0);
-            if ( unlikely(!okay) )
-            {
-                put_gfn(d, op.arg1.mfn);
-                put_page(mfn_to_page(src_mfn));
-                put_gfn(d, op.arg2.src_mfn);
-                MEM_LOG("Error while copying to mfn %lx", mfn);
-                break;
-            }
-
             /* A page is dirtied when it's being copied to. */
-            paging_mark_dirty(d, mfn);
-
-            src = map_domain_page(src_mfn);
-            dst = fixmap_domain_page(mfn);
+            paging_mark_dirty(d, page_to_mfn(dst_page));
+
+            src = __map_domain_page(src_page);
+            dst = fixmap_domain_page(page_to_mfn(dst_page));
             copy_page(dst, src);
             fixunmap_domain_page(dst);
             unmap_domain_page(src);
 
-            put_page_and_type(mfn_to_page(mfn));
-            put_gfn(d, op.arg1.mfn);
-            put_page(mfn_to_page(src_mfn));
-            put_gfn(d, op.arg2.src_mfn);
+            put_page_and_type(dst_page);
+            put_page(src_page);
             break;
         }
 
@@ -3538,29 +3532,26 @@ int do_mmu_update(
 
             req.ptr -= cmd;
             gmfn = req.ptr >> PAGE_SHIFT;
-            mfn = mfn_x(get_gfn(pt_owner, gmfn, &p2mt));
-            if ( !p2m_is_valid(p2mt) )
-                mfn = INVALID_MFN;
+            page = get_page_from_gfn(pt_owner, gmfn, &p2mt, P2M_ALLOC);
 
             if ( p2m_is_paged(p2mt) )
             {
-                put_gfn(pt_owner, gmfn);
+                ASSERT(!page);
                 p2m_mem_paging_populate(pg_owner, gmfn);
                 rc = -ENOENT;
                 break;
             }
 
-            if ( unlikely(!get_page_from_pagenr(mfn, pt_owner)) )
+            if ( unlikely(!page) )
             {
                 MEM_LOG("Could not get page for normal update");
-                put_gfn(pt_owner, gmfn);
                 break;
             }
 
+            mfn = page_to_mfn(page);
             va = map_domain_page_with_cache(mfn, &mapcache);
             va = (void *)((unsigned long)va +
                           (unsigned long)(req.ptr & ~PAGE_MASK));
-            page = mfn_to_page(mfn);
 
             if ( page_lock(page) )
             {
@@ -3569,22 +3560,23 @@ int do_mmu_update(
                 case PGT_l1_page_table:
                 {
                     l1_pgentry_t l1e = l1e_from_intpte(req.val);
-                    p2m_type_t l1e_p2mt;
-                    unsigned long l1egfn = l1e_get_pfn(l1e), l1emfn;
-    
-                    l1emfn = mfn_x(get_gfn(pg_owner, l1egfn, &l1e_p2mt));
+                    p2m_type_t l1e_p2mt = p2m_ram_rw;
+                    struct page_info *target = NULL;
+
+                    if ( paging_mode_translate(pg_owner) )
+                        target = get_page_from_gfn(pg_owner, l1e_get_pfn(l1e),
+                                                   &l1e_p2mt, P2M_ALLOC);
 
                     if ( p2m_is_paged(l1e_p2mt) )
                     {
-                        put_gfn(pg_owner, l1egfn);
+                        if ( target )
+                            put_page(target);
                         p2m_mem_paging_populate(pg_owner, l1e_get_pfn(l1e));
                         rc = -ENOENT;
                         break;
                     }
-                    else if ( p2m_ram_paging_in == l1e_p2mt && 
-                                !mfn_valid(l1emfn) )
+                    else if ( p2m_ram_paging_in == l1e_p2mt && !target )
                     {
-                        put_gfn(pg_owner, l1egfn);
                         rc = -ENOENT;
                         break;
                     }
@@ -3601,7 +3593,8 @@ int do_mmu_update(
                             rc = mem_sharing_unshare_page(pg_owner, gfn, 0); 
                             if ( rc )
                             {
-                                put_gfn(pg_owner, l1egfn);
+                                if ( target )
+                                    put_page(target);
                                 /* Notify helper, don't care about errors, will not
                                  * sleep on wq, since we're a foreign domain. */
                                 (void)mem_sharing_notify_enomem(pg_owner, gfn, 0);
@@ -3614,112 +3607,22 @@ int do_mmu_update(
                     rc = mod_l1_entry(va, l1e, mfn,
                                       cmd == MMU_PT_UPDATE_PRESERVE_AD, v,
                                       pg_owner);
-                    put_gfn(pg_owner, l1egfn);
+                    if ( target )
+                        put_page(target);
                 }
                 break;
                 case PGT_l2_page_table:
-                {
-                    l2_pgentry_t l2e = l2e_from_intpte(req.val);
-                    p2m_type_t l2e_p2mt;
-                    unsigned long l2egfn = l2e_get_pfn(l2e), l2emfn;
-
-                    l2emfn = mfn_x(get_gfn(pg_owner, l2egfn, &l2e_p2mt));
-
-                    if ( p2m_is_paged(l2e_p2mt) )
-                    {
-                        put_gfn(pg_owner, l2egfn);
-                        p2m_mem_paging_populate(pg_owner, l2egfn);
-                        rc = -ENOENT;
-                        break;
-                    }
-                    else if ( p2m_ram_paging_in == l2e_p2mt && 
-                                !mfn_valid(l2emfn) )
-                    {
-                        put_gfn(pg_owner, l2egfn);
-                        rc = -ENOENT;
-                        break;
-                    }
-                    else if ( p2m_ram_shared == l2e_p2mt )
-                    {
-                        put_gfn(pg_owner, l2egfn);
-                        MEM_LOG("Unexpected attempt to map shared page.\n");
-                        break;
-                    }
-
-
-                    rc = mod_l2_entry(va, l2e, mfn,
+                    rc = mod_l2_entry(va, l2e_from_intpte(req.val), mfn,
                                       cmd == MMU_PT_UPDATE_PRESERVE_AD, v);
-                    put_gfn(pg_owner, l2egfn);
-                }
-                break;
+                    break;
                 case PGT_l3_page_table:
-                {
-                    l3_pgentry_t l3e = l3e_from_intpte(req.val);
-                    p2m_type_t l3e_p2mt;
-                    unsigned long l3egfn = l3e_get_pfn(l3e), l3emfn;
-
-                    l3emfn = mfn_x(get_gfn(pg_owner, l3egfn, &l3e_p2mt));
-
-                    if ( p2m_is_paged(l3e_p2mt) )
-                    {
-                        put_gfn(pg_owner, l3egfn);
-                        p2m_mem_paging_populate(pg_owner, l3egfn);
-                        rc = -ENOENT;
-                        break;
-                    }
-                    else if ( p2m_ram_paging_in == l3e_p2mt && 
-                                !mfn_valid(l3emfn) )
-                    {
-                        put_gfn(pg_owner, l3egfn);
-                        rc = -ENOENT;
-                        break;
-                    }
-                    else if ( p2m_ram_shared == l3e_p2mt )
-                    {
-                        put_gfn(pg_owner, l3egfn);
-                        MEM_LOG("Unexpected attempt to map shared page.\n");
-                        break;
-                    }
-
-                    rc = mod_l3_entry(va, l3e, mfn,
+                    rc = mod_l3_entry(va, l3e_from_intpte(req.val), mfn,
                                       cmd == MMU_PT_UPDATE_PRESERVE_AD, 1, v);
-                    put_gfn(pg_owner, l3egfn);
-                }
-                break;
+                    break;
 #if CONFIG_PAGING_LEVELS >= 4
                 case PGT_l4_page_table:
-                {
-                    l4_pgentry_t l4e = l4e_from_intpte(req.val);
-                    p2m_type_t l4e_p2mt;
-                    unsigned long l4egfn = l4e_get_pfn(l4e), l4emfn;
-
-                    l4emfn = mfn_x(get_gfn(pg_owner, l4egfn, &l4e_p2mt));
-
-                    if ( p2m_is_paged(l4e_p2mt) )
-                    {
-                        put_gfn(pg_owner, l4egfn);
-                        p2m_mem_paging_populate(pg_owner, l4egfn);
-                        rc = -ENOENT;
-                        break;
-                    }
-                    else if ( p2m_ram_paging_in == l4e_p2mt && 
-                                !mfn_valid(l4emfn) )
-                    {
-                        put_gfn(pg_owner, l4egfn);
-                        rc = -ENOENT;
-                        break;
-                    }
-                    else if ( p2m_ram_shared == l4e_p2mt )
-                    {
-                        put_gfn(pg_owner, l4egfn);
-                        MEM_LOG("Unexpected attempt to map shared page.\n");
-                        break;
-                    }
-
-                    rc = mod_l4_entry(va, l4e, mfn,
+                    rc = mod_l4_entry(va, l4e_from_intpte(req.val), mfn,
                                       cmd == MMU_PT_UPDATE_PRESERVE_AD, 1, v);
-                    put_gfn(pg_owner, l4egfn);
-                }
                 break;
 #endif
                 case PGT_writable_page:
@@ -3742,7 +3645,6 @@ int do_mmu_update(
 
             unmap_domain_page_with_cache(va, &mapcache);
             put_page(page);
-            put_gfn(pt_owner, gmfn);
         }
         break;
 
diff -r 107285938c50 xen/arch/x86/mm/guest_walk.c
--- a/xen/arch/x86/mm/guest_walk.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/mm/guest_walk.c	Thu Apr 26 22:00:25 2012 +0100
@@ -94,39 +94,37 @@ static inline void *map_domain_gfn(struc
                                    p2m_type_t *p2mt,
                                    uint32_t *rc) 
 {
-    p2m_access_t p2ma;
+    struct page_info *page;
     void *map;
 
     /* Translate the gfn, unsharing if shared */
-    *mfn = get_gfn_type_access(p2m, gfn_x(gfn), p2mt, &p2ma, 
-                               P2M_ALLOC | P2M_UNSHARE, NULL);
+    page = get_page_from_gfn_p2m(p2m->domain, p2m, gfn_x(gfn), p2mt, NULL,
+                                  P2M_ALLOC | P2M_UNSHARE);
     if ( p2m_is_paging(*p2mt) )
     {
         ASSERT(!p2m_is_nestedp2m(p2m));
-        __put_gfn(p2m, gfn_x(gfn));
+        if ( page )
+            put_page(page);
         p2m_mem_paging_populate(p2m->domain, gfn_x(gfn));
         *rc = _PAGE_PAGED;
         return NULL;
     }
     if ( p2m_is_shared(*p2mt) )
     {
-        __put_gfn(p2m, gfn_x(gfn));
+        if ( page )
+            put_page(page);
         *rc = _PAGE_SHARED;
         return NULL;
     }
-    if ( !p2m_is_ram(*p2mt) ) 
+    if ( !page )
     {
-        __put_gfn(p2m, gfn_x(gfn));
         *rc |= _PAGE_PRESENT;
         return NULL;
     }
+    *mfn = _mfn(page_to_mfn(page));
     ASSERT(mfn_valid(mfn_x(*mfn)));
-    
-    /* Get an extra ref to the page to ensure liveness of the map.
-     * Then we can safely put gfn */
-    page_get_owner_and_reference(mfn_to_page(mfn_x(*mfn)));
+
     map = map_domain_page(mfn_x(*mfn));
-    __put_gfn(p2m, gfn_x(gfn));
     return map;
 }
 
diff -r 107285938c50 xen/arch/x86/mm/hap/guest_walk.c
--- a/xen/arch/x86/mm/hap/guest_walk.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/mm/hap/guest_walk.c	Thu Apr 26 22:00:25 2012 +0100
@@ -54,34 +54,37 @@ unsigned long hap_p2m_ga_to_gfn(GUEST_PA
     mfn_t top_mfn;
     void *top_map;
     p2m_type_t p2mt;
-    p2m_access_t p2ma;
     walk_t gw;
     unsigned long top_gfn;
+    struct page_info *top_page;
 
     /* Get the top-level table's MFN */
     top_gfn = cr3 >> PAGE_SHIFT;
-    top_mfn = get_gfn_type_access(p2m, top_gfn, &p2mt, &p2ma, 
-                                  P2M_ALLOC | P2M_UNSHARE, NULL);
+    top_page = get_page_from_gfn_p2m(p2m->domain, p2m, top_gfn,
+                                     &p2mt, NULL, P2M_ALLOC | P2M_UNSHARE);
     if ( p2m_is_paging(p2mt) )
     {
         ASSERT(!p2m_is_nestedp2m(p2m));
         pfec[0] = PFEC_page_paged;
-        __put_gfn(p2m, top_gfn);
+        if ( top_page )
+            put_page(top_page);
         p2m_mem_paging_populate(p2m->domain, cr3 >> PAGE_SHIFT);
         return INVALID_GFN;
     }
     if ( p2m_is_shared(p2mt) )
     {
         pfec[0] = PFEC_page_shared;
-        __put_gfn(p2m, top_gfn);
+        if ( top_page )
+            put_page(top_page);
         return INVALID_GFN;
     }
-    if ( !p2m_is_ram(p2mt) )
+    if ( !top_page )
     {
         pfec[0] &= ~PFEC_page_present;
-        __put_gfn(p2m, top_gfn);
+        put_page(top_page);
         return INVALID_GFN;
     }
+    top_mfn = _mfn(page_to_mfn(top_page));
 
     /* Map the top-level table and call the tree-walker */
     ASSERT(mfn_valid(mfn_x(top_mfn)));
@@ -91,31 +94,30 @@ unsigned long hap_p2m_ga_to_gfn(GUEST_PA
 #endif
     missing = guest_walk_tables(v, p2m, ga, &gw, pfec[0], top_mfn, top_map);
     unmap_domain_page(top_map);
-    __put_gfn(p2m, top_gfn);
+    put_page(top_page);
 
     /* Interpret the answer */
     if ( missing == 0 )
     {
         gfn_t gfn = guest_l1e_get_gfn(gw.l1e);
-        (void)get_gfn_type_access(p2m, gfn_x(gfn), &p2mt, &p2ma,
-                                  P2M_ALLOC | P2M_UNSHARE, NULL); 
+        struct page_info *page;
+        page = get_page_from_gfn_p2m(p2m->domain, p2m, gfn_x(gfn), &p2mt,
+                                     NULL, P2M_ALLOC | P2M_UNSHARE);
+        if ( page )
+            put_page(page);
         if ( p2m_is_paging(p2mt) )
         {
             ASSERT(!p2m_is_nestedp2m(p2m));
             pfec[0] = PFEC_page_paged;
-            __put_gfn(p2m, gfn_x(gfn));
             p2m_mem_paging_populate(p2m->domain, gfn_x(gfn));
             return INVALID_GFN;
         }
         if ( p2m_is_shared(p2mt) )
         {
             pfec[0] = PFEC_page_shared;
-            __put_gfn(p2m, gfn_x(gfn));
             return INVALID_GFN;
         }
 
-        __put_gfn(p2m, gfn_x(gfn));
-
         if ( page_order )
             *page_order = guest_walk_to_page_order(&gw);
 
diff -r 107285938c50 xen/arch/x86/mm/mm-locks.h
--- a/xen/arch/x86/mm/mm-locks.h	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/mm/mm-locks.h	Thu Apr 26 22:00:25 2012 +0100
@@ -166,13 +166,39 @@ declare_mm_lock(nestedp2m)
  * and later mutate it.
  */
 
-declare_mm_lock(p2m)
-#define p2m_lock(p)           mm_lock_recursive(p2m, &(p)->lock)
-#define gfn_lock(p,g,o)       mm_lock_recursive(p2m, &(p)->lock)
-#define p2m_unlock(p)         mm_unlock(&(p)->lock)
-#define gfn_unlock(p,g,o)     mm_unlock(&(p)->lock)
-#define p2m_locked_by_me(p)   mm_locked_by_me(&(p)->lock)
-#define gfn_locked_by_me(p,g) mm_locked_by_me(&(p)->lock)
+/* P2M lock is become an rwlock, purely so we can implement
+ * get_page_from_gfn.  The mess below is a ghastly hack to make a
+ * recursive rwlock.  If it works I'll come back and fix up the
+ * order-contraints magic. */
+
+static inline void p2m_lock(struct p2m_domain *p)
+{
+    if ( p->wcpu != current->processor )
+    {
+        write_lock(&p->lock);
+        p->wcpu = current->processor;
+        ASSERT(p->wcount == 0);
+    }
+    p->wcount++;
+}
+
+static inline void p2m_unlock(struct p2m_domain *p)
+{
+    ASSERT(p->wcpu == current->processor);
+    if (--(p->wcount) == 0)
+    {
+        p->wcpu = -1;
+        write_unlock(&p->lock);
+    }
+}
+
+#define gfn_lock(p,g,o)       p2m_lock(p)
+#define gfn_unlock(p,g,o)     p2m_unlock(p)
+#define p2m_read_lock(p)      read_lock(&(p)->lock)
+#define p2m_read_unlock(p)    read_unlock(&(p)->lock)
+#define p2m_locked_by_me(p)   ((p)->wcpu == current->processor)
+#define gfn_locked_by_me(p,g) p2m_locked_by_me(p)
+
 
 /* Sharing per page lock
  *
@@ -203,8 +229,8 @@ declare_mm_order_constraint(per_page_sha
  * counts, page lists, sweep parameters. */
 
 declare_mm_lock(pod)
-#define pod_lock(p)           mm_lock(pod, &(p)->pod.lock)
-#define pod_unlock(p)         mm_unlock(&(p)->pod.lock)
+#define pod_lock(p) do { p2m_lock(p); mm_lock(pod, &(p)->pod.lock); } while (0)
+#define pod_unlock(p) do { mm_unlock(&(p)->pod.lock); p2m_unlock(p);} while (0)
 #define pod_locked_by_me(p)   mm_locked_by_me(&(p)->pod.lock)
 
 /* Page alloc lock (per-domain)
diff -r 107285938c50 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/mm/p2m.c	Thu Apr 26 22:00:25 2012 +0100
@@ -71,7 +71,9 @@ boolean_param("hap_2mb", opt_hap_2mb);
 /* Init the datastructures for later use by the p2m code */
 static void p2m_initialise(struct domain *d, struct p2m_domain *p2m)
 {
-    mm_lock_init(&p2m->lock);
+    rwlock_init(&p2m->lock);
+    p2m->wcount = 0;
+    p2m->wcpu = -1;
     mm_lock_init(&p2m->pod.lock);
     INIT_LIST_HEAD(&p2m->np2m_list);
     INIT_PAGE_LIST_HEAD(&p2m->pages);
@@ -207,6 +209,61 @@ void __put_gfn(struct p2m_domain *p2m, u
     gfn_unlock(p2m, gfn, 0);
 }
 
+/* Atomically look up a GFN and take a reference count on the backing page. */
+struct page_info *get_page_from_gfn_p2m(
+    struct domain *d, struct p2m_domain *p2m, unsigned long gfn,
+    p2m_type_t *t, p2m_access_t *a, p2m_query_t q)
+{
+    struct page_info *page = NULL;
+    p2m_access_t _a;
+    p2m_type_t _t;
+    mfn_t mfn;
+
+    /* Allow t or a to be NULL */
+    t = t ?: &_t;
+    a = a ?: &_a;
+
+    if ( likely(!p2m_locked_by_me(p2m)) )
+    {
+        /* Fast path: look up and get out */
+        p2m_read_lock(p2m);
+        mfn = __get_gfn_type_access(p2m, gfn, t, a, 0, NULL, 0);
+        if ( (p2m_is_ram(*t) || p2m_is_grant(*t))
+             && mfn_valid(mfn)
+             && !((q & P2M_UNSHARE) && p2m_is_shared(*t)) )
+        {
+            page = mfn_to_page(mfn);
+            if ( !get_page(page, d)
+                 /* Page could be shared */
+                 && !get_page(page, dom_cow) )
+                page = NULL;
+        }
+        p2m_read_unlock(p2m);
+
+        if ( page )
+            return page;
+
+        /* Error path: not a suitable GFN at all */
+        if ( !p2m_is_ram(*t) && !p2m_is_paging(*t) && !p2m_is_magic(*t) )
+            return NULL;
+    }
+
+    /* Slow path: take the write lock and do fixups */
+    p2m_lock(p2m);
+    mfn = get_gfn_type_access(p2m, gfn, t, a, q, NULL);
+    if ( p2m_is_ram(*t) && mfn_valid(mfn) )
+    {
+        page = mfn_to_page(mfn);
+        if ( !get_page(page, d) )
+            page = NULL;
+    }
+    put_gfn(d, gfn);
+    p2m_unlock(p2m);
+
+    return page;
+}
+
+
 int set_p2m_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn, 
                   unsigned int page_order, p2m_type_t p2mt, p2m_access_t p2ma)
 {
diff -r 107285938c50 xen/arch/x86/physdev.c
--- a/xen/arch/x86/physdev.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/physdev.c	Thu Apr 26 22:00:25 2012 +0100
@@ -306,26 +306,27 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
     case PHYSDEVOP_pirq_eoi_gmfn_v1: {
         struct physdev_pirq_eoi_gmfn info;
         unsigned long mfn;
+        struct page_info *page;
 
         ret = -EFAULT;
         if ( copy_from_guest(&info, arg, 1) != 0 )
             break;
 
         ret = -EINVAL;
-        mfn = get_gfn_untyped(current->domain, info.gmfn);
-        if ( !mfn_valid(mfn) ||
-             !get_page_and_type(mfn_to_page(mfn), v->domain,
-                                PGT_writable_page) )
+        page = get_page_from_gfn(current->domain, info.gmfn, NULL, P2M_ALLOC);
+        if ( !page )
+            break;
+        if ( !get_page_type(page, PGT_writable_page) )
         {
-            put_gfn(current->domain, info.gmfn);
+            put_page(page);
             break;
         }
+        mfn = page_to_mfn(page);
 
         if ( cmpxchg(&v->domain->arch.pv_domain.pirq_eoi_map_mfn,
                      0, mfn) != 0 )
         {
             put_page_and_type(mfn_to_page(mfn));
-            put_gfn(current->domain, info.gmfn);
             ret = -EBUSY;
             break;
         }
@@ -335,14 +336,12 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
         {
             v->domain->arch.pv_domain.pirq_eoi_map_mfn = 0;
             put_page_and_type(mfn_to_page(mfn));
-            put_gfn(current->domain, info.gmfn);
             ret = -ENOSPC;
             break;
         }
         if ( cmd == PHYSDEVOP_pirq_eoi_gmfn_v1 )
             v->domain->arch.pv_domain.auto_unmask = 1;
 
-        put_gfn(current->domain, info.gmfn);
         ret = 0;
         break;
     }
diff -r 107285938c50 xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/traps.c	Thu Apr 26 22:00:25 2012 +0100
@@ -662,9 +662,9 @@ int wrmsr_hypervisor_regs(uint32_t idx, 
     case 0:
     {
         void *hypercall_page;
-        unsigned long mfn;
         unsigned long gmfn = val >> 12;
         unsigned int idx  = val & 0xfff;
+        struct page_info *page;
 
         if ( idx > 0 )
         {
@@ -674,24 +674,23 @@ int wrmsr_hypervisor_regs(uint32_t idx, 
             return 0;
         }
 
-        mfn = get_gfn_untyped(d, gmfn);
-
-        if ( !mfn_valid(mfn) ||
-             !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
+        page = get_page_from_gfn(d, gmfn, NULL, P2M_ALLOC);
+
+        if ( !page || !get_page_type(page, PGT_writable_page) )
         {
-            put_gfn(d, gmfn);
+            if ( page )
+                put_page(page);
             gdprintk(XENLOG_WARNING,
                      "Bad GMFN %lx (MFN %lx) to MSR %08x\n",
-                     gmfn, mfn, base + idx);
+                     gmfn, page_to_mfn(page), base + idx);
             return 0;
         }
 
-        hypercall_page = map_domain_page(mfn);
+        hypercall_page = __map_domain_page(page);
         hypercall_page_initialise(d, hypercall_page);
         unmap_domain_page(hypercall_page);
 
-        put_page_and_type(mfn_to_page(mfn));
-        put_gfn(d, gmfn);
+        put_page_and_type(page);
         break;
     }
 
@@ -2374,7 +2373,8 @@ static int emulate_privileged_op(struct 
             break;
 
         case 3: {/* Write CR3 */
-            unsigned long mfn, gfn;
+            unsigned long gfn;
+            struct page_info *page;
             domain_lock(v->domain);
             if ( !is_pv_32on64_vcpu(v) )
             {
@@ -2384,9 +2384,10 @@ static int emulate_privileged_op(struct 
                 gfn = compat_cr3_to_pfn(*reg);
 #endif
             }
-            mfn = get_gfn_untyped(v->domain, gfn);
-            rc = new_guest_cr3(mfn);
-            put_gfn(v->domain, gfn);
+            page = get_page_from_gfn(v->domain, gfn, NULL, P2M_ALLOC);
+            rc = page ? new_guest_cr3(page_to_mfn(page)) : 0;
+            if ( page )
+                put_page(page);
             domain_unlock(v->domain);
             if ( rc == 0 ) /* not okay */
                 goto fail;
diff -r 107285938c50 xen/include/asm-x86/p2m.h
--- a/xen/include/asm-x86/p2m.h	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/include/asm-x86/p2m.h	Thu Apr 26 22:00:25 2012 +0100
@@ -192,7 +192,10 @@ typedef unsigned int p2m_query_t;
 /* Per-p2m-table state */
 struct p2m_domain {
     /* Lock that protects updates to the p2m */
-    mm_lock_t          lock;
+    rwlock_t           lock;
+    int                wcpu;
+    int                wcount;
+    const char        *wfunc;
 
     /* Shadow translated domain: p2m mapping */
     pagetable_t        phys_table;
@@ -377,6 +380,33 @@ static inline mfn_t get_gfn_query_unlock
     return __get_gfn_type_access(p2m_get_hostp2m(d), gfn, t, &a, 0, NULL, 0);
 }
 
+/* Atomically look up a GFN and take a reference count on the backing page.
+ * This makes sure the page doesn't get freed (or shared) underfoot,
+ * and should be used by any path that intends to write to the backing page.
+ * Returns NULL if the page is not backed by RAM.
+ * The caller is responsible for calling put_page() afterwards. */
+struct page_info *get_page_from_gfn_p2m(struct domain *d,
+                                        struct p2m_domain *p2m,
+                                        unsigned long gfn,
+                                        p2m_type_t *t, p2m_access_t *a,
+                                        p2m_query_t q);
+
+static inline struct page_info *get_page_from_gfn(
+    struct domain *d, unsigned long gfn, p2m_type_t *t, p2m_query_t q)
+{
+    struct page_info *page;
+
+    if ( paging_mode_translate(d) )
+        return get_page_from_gfn_p2m(d, p2m_get_hostp2m(d), gfn, t, NULL, q);
+
+    /* Non-translated guests see 1-1 RAM mappings everywhere */
+    if (t)
+        *t = p2m_ram_rw;
+    page = __mfn_to_page(gfn);
+    return get_page(page, d) ? page : NULL;
+}
+
+
 /* General conversion function from mfn to gfn */
 static inline unsigned long mfn_to_gfn(struct domain *d, mfn_t mfn)
 {
diff -r 107285938c50 xen/xsm/flask/hooks.c
--- a/xen/xsm/flask/hooks.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/xsm/flask/hooks.c	Thu Apr 26 22:00:25 2012 +0100
@@ -1318,6 +1318,7 @@ static int flask_mmu_normal_update(struc
     struct domain_security_struct *dsec;
     u32 fsid;
     struct avc_audit_data ad;
+    struct page_info *page;
 
     if (d != t)
         rc = domain_has_perm(d, t, SECCLASS_MMU, MMU__REMOTE_REMAP);
@@ -1333,7 +1334,8 @@ static int flask_mmu_normal_update(struc
         map_perms |= MMU__MAP_WRITE;
 
     AVC_AUDIT_DATA_INIT(&ad, MEMORY);
-    fmfn = get_gfn_untyped(f, l1e_get_pfn(l1e_from_intpte(fpte)));
+    page = get_page_from_gfn(f, l1e_get_pfn(l1e_from_intpte(fpte)), P2M_ALLOC);
+    mfn = page ? page_to_mfn(page) : INVALID_MFN;
 
     ad.sdom = d;
     ad.tdom = f;
@@ -1342,7 +1344,8 @@ static int flask_mmu_normal_update(struc
 
     rc = get_mfn_sid(fmfn, &fsid);
 
-    put_gfn(f, fmfn);
+    if ( page )
+        put_page(page);
 
     if ( rc )
         return rc;

--qDbXVdCdHGoSgWSk
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

--qDbXVdCdHGoSgWSk--


From xen-devel-bounces@lists.xen.org Fri Apr 27 09:27:16 2012
Return-path: <xen-devel-bounces@lists.xen.org>
Envelope-to: archives@lists.xen.org
Delivery-date: Fri, 27 Apr 2012 09:27:16 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xen.org>)
	id 1SNhS3-0004z3-VE; Fri, 27 Apr 2012 09:26:55 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72) (envelope-from <tim@xen.org>)
	id 1SNhS2-0004yv-BI
	for xen-devel@lists.xensource.com; Fri, 27 Apr 2012 09:26:55 +0000
Received: from [193.109.254.147:29075] by server-8.bemta-14.messagelabs.com id
	9C/2C-23244-D566A9F4; Fri, 27 Apr 2012 09:26:53 +0000
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-3.tower-27.messagelabs.com!1335518809!6645787!1
X-Originating-IP: [81.29.64.94]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Version: 6.5.7; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4849 invoked from network); 27 Apr 2012 09:26:50 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 27 Apr 2012 09:26:50 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1SNhRt-000McR-4p; Fri, 27 Apr 2012 09:26:45 +0000
Date: Fri, 27 Apr 2012 10:26:45 +0100
From: Tim Deegan <tim@xen.org>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Message-ID: <20120427092645.GC86045@ocelot.phlegethon.org>
References: <2a7b92d7a952c53c0fb81bdebdd45d24.squirrel@webmail.lagarcavilla.org>
	<A9667DDFB95DB7438FA9D7D576C3D87E0F2A20@SHSMSX101.ccr.corp.intel.com>
	<20120424091646.GB34721@ocelot.phlegethon.org>
	<A9667DDFB95DB7438FA9D7D576C3D87E0F452D@SHSMSX101.ccr.corp.intel.com>
	<958f5bfcc3ae6a631cf7208086553dce.squirrel@webmail.lagarcavilla.org>
	<A9667DDFB95DB7438FA9D7D576C3D87E0F45FC@SHSMSX101.ccr.corp.intel.com>
	<dfb5bcde9672a20ef3d6b3ad846a40e3.squirrel@webmail.lagarcavilla.org>
	<A9667DDFB95DB7438FA9D7D576C3D87E0F4684@SHSMSX101.ccr.corp.intel.com>
	<20120426212531.GH67043@ocelot.phlegethon.org>
	<23c9d6057801250ebf2a9713a1bc5af3.squirrel@webmail.lagarcavilla.org>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="zYM0uCDKw75PZbzx"
Content-Disposition: inline
In-Reply-To: <23c9d6057801250ebf2a9713a1bc5af3.squirrel@webmail.lagarcavilla.org>
User-Agent: Mutt/1.4.2.1i
Cc: "Zhang, Yang Z" <yang.z.zhang@intel.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Keir Fraser <keir@xen.org>
Subject: Re: [Xen-devel] lock in vhpet
X-BeenThere: xen-devel@lists.xen.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xen.org>
List-Unsubscribe: <http://lists.xen.org/cgi-bin/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xen.org?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xen.org>
List-Help: <mailto:xen-devel-request@lists.xen.org?subject=help>
List-Subscribe: <http://lists.xen.org/cgi-bin/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xen.org?subject=subscribe>
Sender: xen-devel-bounces@lists.xen.org
Errors-To: xen-devel-bounces@lists.xen.org


--zYM0uCDKw75PZbzx
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline

At 20:02 -0700 on 26 Apr (1335470547), Andres Lagar-Cavilla wrote:
> > Can you please try the attached patch?  I think you'll need this one
> > plus the ones that take the locks out of the hpet code.
> 
> Right off the bat I'm getting a multitude of
> (XEN) mm.c:3294:d0 Error while clearing mfn 100cbb7
> And a hung dom0 during initramfs. I'm a little baffled as to why, but it's
> there (32 bit dom0, XenServer6).

Curses, I knew there'd be one somewhere.  I've been replacing
get_page_and_type_from_pagenr()s (which return 0 for success) with
old-school get_page_type()s (which return 1 for success) and not always
getting the right number of inversions.  That's a horrible horrible
beartrap of an API, BTW, which had me cursing at the screen, but I had
enough on my plate yesterday without touching _that_ code too!

> > Andres, this is basically the big-hammer version of your "take a
> > pagecount" changes, plus the change you made to hvmemul_rep_movs().
> > If this works I intend to follow it up with a patch to make some of the
> > read-modify-write paths avoid taking the lock (by using a
> > compare-exchange operation so they only take the lock on a write).  If
> > that succeeds I might drop put_gfn() altogether.
> 
> You mean cmpxchg the whole p2m entry? I don't think I parse the plan.
> There are code paths that do get_gfn_query -> p2m_change_type -> put_gfn.
> But I guess those could lock the p2m up-front if they become the only
> consumers of put_gfn left.

Well, that's more or less what happens now.  I was thinking of replacing
any remaining

 (implicit) lock ; read ; think a bit ; maybe write ; unlock

code with the fast-path-friendlier:

 read ; think ; maybe-cmpxchg (and on failure undo or retry 

which avoids taking the write lock altogether if there's no work to do. 
But maybe there aren't many of those left now.  Obviously any path
which will always write should just take the write-lock first. 
 
> >  - grant-table operations still use the lock, because frankly I
> >    could not follow the current code, and it's quite late in the evening.
> 
> It's pretty complex with serious nesting, and ifdef's for arm and 32 bit.
> gfn_to_mfn_private callers will suffer from altering the current meaning,
> as put_gfn resolves to the right thing for the ifdef'ed arch. The other
> user is grant_transfer which also relies on the page *not* having an extra
> ref in steal_page. So it's a prime candidate to be left alone.

Sadly, I think it's not.  The PV backends will be doing lots of grant
ops, which shouldn't get serialized against all other P2M lookups. 

> > I also have a long list of uglinesses in the mm code that I found
> 
> Uh, ugly stuff, how could that have happened?

I can't imagine. :)  Certainly nothing to do with me thinking "I'll
clean that up when I get some time."

> I have a few preliminary observations on the patch. Pasting relevant bits
> here, since the body of the patch seems to have been lost by the email
> thread:
> 
> @@ -977,23 +976,25 @@ int arch_set_info_guest(
> ...
> +
> +        if (!paging_mode_refcounts(d)
> +            && !get_page_and_type(cr3_page, d, PGT_l3_page_table) )
> replace with && !get_page_type() )

Yep.

> @@ -2404,32 +2373,33 @@ static enum hvm_copy_result __hvm_copy(
>              gfn = addr >> PAGE_SHIFT;
>          }
> 
> -        mfn = mfn_x(get_gfn_unshare(curr->domain, gfn, &p2mt));
> +        page = get_page_from_gfn(curr->domain, gfn, &p2mt, P2M_UNSHARE);
> replace with (flags & HVMCOPY_to_guest) ? P2M_UNSHARE : P2M_ALLOC (and
> same logic when checking p2m_is_shared). Not truly related to your patch
> bit since we're at it.

OK, but not in this patch.

> Same, further down
> -        if ( !p2m_is_ram(p2mt) )
> +        if ( !page )
>          {
> -            put_gfn(curr->domain, gfn);
> +            if ( page )
> +                put_page(page);
> Last two lines are redundant

Yep.

> @@ -4019,35 +3993,16 @@ long do_hvm_op(unsigned long op, XEN_GUE
>     case HVMOP_modified_memory: a lot of error checking has been removed.

Yes, but it was bogus - there's a race between the actual modification
and the call, during which anything might have happened.  The best we
can do is throw log-dirty bits at everything, and the caller can't do
anything with the error anyway.

When I come to tidy up I'll just add a new mark_gfn_dirty function
and skip the pointless gfn->mfn->gfn translation on this path.

> arch/x86/mm.c:do_mmu_update -> you blew up all the paging/sharing checking
> for target gfns of mmu updates of l2/3/4 entries. It seems that this
> wouldn't work anyways, that's why you killed it?

Yeah - since only L1es can point at foreign mappings it was all just
noise, and even if there had been real p2m lookups on those paths there
was no equivalent to the translate-in-place that happens in
mod_l1_entry so it would have been broken in a much worse way.

> +++ b/xen/arch/x86/mm/hap/guest_walk.c
> @@ -54,34 +54,37 @@ unsigned long hap_p2m_ga_to_gfn(GUEST_PA
> ...
> +    if ( !top_page )
>      {
>          pfec[0] &= ~PFEC_page_present;
> -        __put_gfn(p2m, top_gfn);
> +        put_page(top_page);
> top_page is NULL here, remove put_page

Yep.

> get_page_from_gfn_p2m, slow path: no need for p2m_lock/unlock since
> locking is already done by get_gfn_type_access/__put_gfn

Yeah, but I was writing that with half an eye on killing that lock. :) 
I'll drop them for now.

> (hope those observations made sense without inlining them in the actual
> patch)

Yes, absolutely - thanks for the review!

If we can get this to work well enough I'll tidy it up into a sensible
series next week.   In the meantime, an updated verison of the
monster patch is attached. 

Cheers,

Tim.

--zYM0uCDKw75PZbzx
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: attachment; filename=get-page-from-gfn

# HG changeset patch
# Parent 107285938c50f82667bd4d014820b439a077c22c

diff -r 107285938c50 xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/domain.c	Fri Apr 27 10:23:28 2012 +0100
@@ -716,7 +716,7 @@ int arch_set_info_guest(
 {
     struct domain *d = v->domain;
     unsigned long cr3_gfn;
-    unsigned long cr3_pfn = INVALID_MFN;
+    struct page_info *cr3_page;
     unsigned long flags, cr4;
     unsigned int i;
     int rc = 0, compat;
@@ -925,46 +925,45 @@ int arch_set_info_guest(
     if ( !compat )
     {
         cr3_gfn = xen_cr3_to_pfn(c.nat->ctrlreg[3]);
-        cr3_pfn = get_gfn_untyped(d, cr3_gfn);
+        cr3_page = get_page_from_gfn(d, cr3_gfn, NULL, P2M_ALLOC);
 
-        if ( !mfn_valid(cr3_pfn) ||
-             (paging_mode_refcounts(d)
-              ? !get_page(mfn_to_page(cr3_pfn), d)
-              : !get_page_and_type(mfn_to_page(cr3_pfn), d,
-                                   PGT_base_page_table)) )
+        if ( !cr3_page )
         {
-            put_gfn(d, cr3_gfn);
+            destroy_gdt(v);
+            return -EINVAL;
+        }
+        if ( !paging_mode_refcounts(d)
+             && !get_page_type(cr3_page, PGT_base_page_table) )
+        {
+            put_page(cr3_page);
             destroy_gdt(v);
             return -EINVAL;
         }
 
-        v->arch.guest_table = pagetable_from_pfn(cr3_pfn);
-        put_gfn(d, cr3_gfn);
+        v->arch.guest_table = pagetable_from_page(cr3_page);
 #ifdef __x86_64__
         if ( c.nat->ctrlreg[1] )
         {
             cr3_gfn = xen_cr3_to_pfn(c.nat->ctrlreg[1]);
-            cr3_pfn = get_gfn_untyped(d, cr3_gfn);
+            cr3_page = get_page_from_gfn(d, cr3_gfn, NULL, P2M_ALLOC);
 
-            if ( !mfn_valid(cr3_pfn) ||
-                 (paging_mode_refcounts(d)
-                  ? !get_page(mfn_to_page(cr3_pfn), d)
-                  : !get_page_and_type(mfn_to_page(cr3_pfn), d,
-                                       PGT_base_page_table)) )
+            if ( !cr3_page ||
+                 (!paging_mode_refcounts(d)
+                  && !get_page_type(cr3_page, PGT_base_page_table)) )
             {
-                cr3_pfn = pagetable_get_pfn(v->arch.guest_table);
+                if (cr3_page)
+                    put_page(cr3_page);
+                cr3_page = pagetable_get_page(v->arch.guest_table);
                 v->arch.guest_table = pagetable_null();
                 if ( paging_mode_refcounts(d) )
-                    put_page(mfn_to_page(cr3_pfn));
+                    put_page(cr3_page);
                 else
-                    put_page_and_type(mfn_to_page(cr3_pfn));
-                put_gfn(d, cr3_gfn); 
+                    put_page_and_type(cr3_page);
                 destroy_gdt(v);
                 return -EINVAL;
             }
 
-            v->arch.guest_table_user = pagetable_from_pfn(cr3_pfn);
-            put_gfn(d, cr3_gfn); 
+            v->arch.guest_table_user = pagetable_from_page(cr3_page);
         }
         else if ( !(flags & VGCF_in_kernel) )
         {
@@ -977,23 +976,25 @@ int arch_set_info_guest(
         l4_pgentry_t *l4tab;
 
         cr3_gfn = compat_cr3_to_pfn(c.cmp->ctrlreg[3]);
-        cr3_pfn = get_gfn_untyped(d, cr3_gfn);
+        cr3_page = get_page_from_gfn(d, cr3_gfn, NULL, P2M_ALLOC);
 
-        if ( !mfn_valid(cr3_pfn) ||
-             (paging_mode_refcounts(d)
-              ? !get_page(mfn_to_page(cr3_pfn), d)
-              : !get_page_and_type(mfn_to_page(cr3_pfn), d,
-                                   PGT_l3_page_table)) )
+        if ( !cr3_page)
         {
-            put_gfn(d, cr3_gfn); 
+            destroy_gdt(v);
+            return -EINVAL;
+        }
+
+        if (!paging_mode_refcounts(d)
+            && !get_page_type(cr3_page, PGT_l3_page_table) )
+        {
+            put_page(cr3_page);
             destroy_gdt(v);
             return -EINVAL;
         }
 
         l4tab = __va(pagetable_get_paddr(v->arch.guest_table));
-        *l4tab = l4e_from_pfn(
-            cr3_pfn, _PAGE_PRESENT|_PAGE_RW|_PAGE_USER|_PAGE_ACCESSED);
-        put_gfn(d, cr3_gfn); 
+        *l4tab = l4e_from_pfn(page_to_mfn(cr3_page),
+            _PAGE_PRESENT|_PAGE_RW|_PAGE_USER|_PAGE_ACCESSED);
 #endif
     }
 
@@ -1064,7 +1065,7 @@ map_vcpu_info(struct vcpu *v, unsigned l
     struct domain *d = v->domain;
     void *mapping;
     vcpu_info_t *new_info;
-    unsigned long mfn;
+    struct page_info *page;
     int i;
 
     if ( offset > (PAGE_SIZE - sizeof(vcpu_info_t)) )
@@ -1077,19 +1078,20 @@ map_vcpu_info(struct vcpu *v, unsigned l
     if ( (v != current) && !test_bit(_VPF_down, &v->pause_flags) )
         return -EINVAL;
 
-    mfn = get_gfn_untyped(d, gfn);
-    if ( !mfn_valid(mfn) ||
-         !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
+    page = get_page_from_gfn(d, gfn, NULL, P2M_ALLOC);
+    if ( !page )
+        return -EINVAL;
+
+    if ( !get_page_type(page, PGT_writable_page) )
     {
-        put_gfn(d, gfn); 
+        put_page(page);
         return -EINVAL;
     }
 
-    mapping = map_domain_page_global(mfn);
+    mapping = __map_domain_page_global(page);
     if ( mapping == NULL )
     {
-        put_page_and_type(mfn_to_page(mfn));
-        put_gfn(d, gfn); 
+        put_page_and_type(page);
         return -ENOMEM;
     }
 
@@ -1106,7 +1108,7 @@ map_vcpu_info(struct vcpu *v, unsigned l
     }
 
     v->vcpu_info = new_info;
-    v->arch.pv_vcpu.vcpu_info_mfn = mfn;
+    v->arch.pv_vcpu.vcpu_info_mfn = page_to_mfn(page);
 
     /* Set new vcpu_info pointer /before/ setting pending flags. */
     wmb();
@@ -1119,7 +1121,6 @@ map_vcpu_info(struct vcpu *v, unsigned l
     for ( i = 0; i < BITS_PER_EVTCHN_WORD(d); i++ )
         set_bit(i, &vcpu_info(v, evtchn_pending_sel));
 
-    put_gfn(d, gfn); 
     return 0;
 }
 
diff -r 107285938c50 xen/arch/x86/domctl.c
--- a/xen/arch/x86/domctl.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/domctl.c	Fri Apr 27 10:23:28 2012 +0100
@@ -202,16 +202,16 @@ long arch_do_domctl(
 
                 for ( j = 0; j < k; j++ )
                 {
-                    unsigned long type = 0, mfn = get_gfn_untyped(d, arr[j]);
+                    unsigned long type = 0;
 
-                    page = mfn_to_page(mfn);
+                    page = get_page_from_gfn(d, arr[j], NULL, P2M_ALLOC);
 
-                    if ( unlikely(!mfn_valid(mfn)) ||
-                         unlikely(is_xen_heap_mfn(mfn)) )
+                    if ( unlikely(!page) ||
+                         unlikely(is_xen_heap_page(page)) )
                         type = XEN_DOMCTL_PFINFO_XTAB;
                     else if ( xsm_getpageframeinfo(page) != 0 )
                         ;
-                    else if ( likely(get_page(page, d)) )
+                    else
                     {
                         switch( page->u.inuse.type_info & PGT_type_mask )
                         {
@@ -231,13 +231,10 @@ long arch_do_domctl(
 
                         if ( page->u.inuse.type_info & PGT_pinned )
                             type |= XEN_DOMCTL_PFINFO_LPINTAB;
+                    }
 
+                    if ( page )
                         put_page(page);
-                    }
-                    else
-                        type = XEN_DOMCTL_PFINFO_XTAB;
-
-                    put_gfn(d, arr[j]);
                     arr[j] = type;
                 }
 
@@ -304,21 +301,21 @@ long arch_do_domctl(
             {      
                 struct page_info *page;
                 unsigned long gfn = arr32[j];
-                unsigned long mfn = get_gfn_untyped(d, gfn);
 
-                page = mfn_to_page(mfn);
+                page = get_page_from_gfn(d, gfn, NULL, P2M_ALLOC);
 
                 if ( domctl->cmd == XEN_DOMCTL_getpageframeinfo3)
                     arr32[j] = 0;
 
-                if ( unlikely(!mfn_valid(mfn)) ||
-                     unlikely(is_xen_heap_mfn(mfn)) )
+                if ( unlikely(!page) ||
+                     unlikely(is_xen_heap_page(page)) )
                     arr32[j] |= XEN_DOMCTL_PFINFO_XTAB;
                 else if ( xsm_getpageframeinfo(page) != 0 )
                 {
-                    put_gfn(d, gfn); 
+                    put_page(page);
                     continue;
-                } else if ( likely(get_page(page, d)) )
+                }
+                else
                 {
                     unsigned long type = 0;
 
@@ -341,12 +338,10 @@ long arch_do_domctl(
                     if ( page->u.inuse.type_info & PGT_pinned )
                         type |= XEN_DOMCTL_PFINFO_LPINTAB;
                     arr32[j] |= type;
+                }
+
+                if ( page )
                     put_page(page);
-                }
-                else
-                    arr32[j] |= XEN_DOMCTL_PFINFO_XTAB;
-
-                put_gfn(d, gfn); 
             }
 
             if ( copy_to_guest_offset(domctl->u.getpageframeinfo2.array,
@@ -419,7 +414,7 @@ long arch_do_domctl(
     {
         struct domain *d = rcu_lock_domain_by_id(domctl->domain);
         unsigned long gmfn = domctl->u.hypercall_init.gmfn;
-        unsigned long mfn;
+        struct page_info *page;
         void *hypercall_page;
 
         ret = -ESRCH;
@@ -433,26 +428,25 @@ long arch_do_domctl(
             break;
         }
 
-        mfn = get_gfn_untyped(d, gmfn);
+        page = get_page_from_gfn(d, gmfn, NULL, P2M_ALLOC);
 
         ret = -EACCES;
-        if ( !mfn_valid(mfn) ||
-             !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
+        if ( !page || !get_page_type(page, PGT_writable_page) )
         {
-            put_gfn(d, gmfn); 
+            if ( page )
+                put_page(page);
             rcu_unlock_domain(d);
             break;
         }
 
         ret = 0;
 
-        hypercall_page = map_domain_page(mfn);
+        hypercall_page = __map_domain_page(page);
         hypercall_page_initialise(d, hypercall_page);
         unmap_domain_page(hypercall_page);
 
-        put_page_and_type(mfn_to_page(mfn));
+        put_page_and_type(page);
 
-        put_gfn(d, gmfn); 
         rcu_unlock_domain(d);
     }
     break;
diff -r 107285938c50 xen/arch/x86/hvm/emulate.c
--- a/xen/arch/x86/hvm/emulate.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/hvm/emulate.c	Fri Apr 27 10:23:28 2012 +0100
@@ -60,34 +60,25 @@ static int hvmemul_do_io(
     ioreq_t *p = get_ioreq(curr);
     unsigned long ram_gfn = paddr_to_pfn(ram_gpa);
     p2m_type_t p2mt;
-    mfn_t ram_mfn;
+    struct page_info *ram_page;
     int rc;
 
     /* Check for paged out page */
-    ram_mfn = get_gfn_unshare(curr->domain, ram_gfn, &p2mt);
+    ram_page = get_page_from_gfn(curr->domain, ram_gfn, &p2mt, P2M_UNSHARE);
     if ( p2m_is_paging(p2mt) )
     {
-        put_gfn(curr->domain, ram_gfn); 
+        if ( ram_page )
+            put_page(ram_page);
         p2m_mem_paging_populate(curr->domain, ram_gfn);
         return X86EMUL_RETRY;
     }
     if ( p2m_is_shared(p2mt) )
     {
-        put_gfn(curr->domain, ram_gfn); 
+        if ( ram_page )
+            put_page(ram_page);
         return X86EMUL_RETRY;
     }
 
-    /* Maintain a ref on the mfn to ensure liveness. Put the gfn
-     * to avoid potential deadlock wrt event channel lock, later. */
-    if ( mfn_valid(mfn_x(ram_mfn)) )
-        if ( !get_page(mfn_to_page(mfn_x(ram_mfn)),
-             curr->domain) )
-        {
-            put_gfn(curr->domain, ram_gfn);
-            return X86EMUL_RETRY;
-        }
-    put_gfn(curr->domain, ram_gfn);
-
     /*
      * Weird-sized accesses have undefined behaviour: we discard writes
      * and read all-ones.
@@ -98,8 +89,8 @@ static int hvmemul_do_io(
         ASSERT(p_data != NULL); /* cannot happen with a REP prefix */
         if ( dir == IOREQ_READ )
             memset(p_data, ~0, size);
-        if ( mfn_valid(mfn_x(ram_mfn)) )
-            put_page(mfn_to_page(mfn_x(ram_mfn)));
+        if ( ram_page )
+            put_page(ram_page);
         return X86EMUL_UNHANDLEABLE;
     }
 
@@ -120,8 +111,8 @@ static int hvmemul_do_io(
             unsigned int bytes = vio->mmio_large_write_bytes;
             if ( (addr >= pa) && ((addr + size) <= (pa + bytes)) )
             {
-                if ( mfn_valid(mfn_x(ram_mfn)) )
-                    put_page(mfn_to_page(mfn_x(ram_mfn)));
+                if ( ram_page )
+                    put_page(ram_page);
                 return X86EMUL_OKAY;
             }
         }
@@ -133,8 +124,8 @@ static int hvmemul_do_io(
             {
                 memcpy(p_data, &vio->mmio_large_read[addr - pa],
                        size);
-                if ( mfn_valid(mfn_x(ram_mfn)) )
-                    put_page(mfn_to_page(mfn_x(ram_mfn)));
+                if ( ram_page )
+                    put_page(ram_page);
                 return X86EMUL_OKAY;
             }
         }
@@ -148,8 +139,8 @@ static int hvmemul_do_io(
         vio->io_state = HVMIO_none;
         if ( p_data == NULL )
         {
-            if ( mfn_valid(mfn_x(ram_mfn)) )
-                put_page(mfn_to_page(mfn_x(ram_mfn)));
+            if ( ram_page )
+                put_page(ram_page);
             return X86EMUL_UNHANDLEABLE;
         }
         goto finish_access;
@@ -159,13 +150,13 @@ static int hvmemul_do_io(
              (addr == (vio->mmio_large_write_pa +
                        vio->mmio_large_write_bytes)) )
         {
-            if ( mfn_valid(mfn_x(ram_mfn)) )
-                put_page(mfn_to_page(mfn_x(ram_mfn)));
+            if ( ram_page )
+                put_page(ram_page);
             return X86EMUL_RETRY;
         }
     default:
-        if ( mfn_valid(mfn_x(ram_mfn)) )
-            put_page(mfn_to_page(mfn_x(ram_mfn)));
+        if ( ram_page )
+            put_page(ram_page);
         return X86EMUL_UNHANDLEABLE;
     }
 
@@ -173,8 +164,8 @@ static int hvmemul_do_io(
     {
         gdprintk(XENLOG_WARNING, "WARNING: io already pending (%d)?\n",
                  p->state);
-        if ( mfn_valid(mfn_x(ram_mfn)) )
-            put_page(mfn_to_page(mfn_x(ram_mfn)));
+        if ( ram_page )
+            put_page(ram_page);
         return X86EMUL_UNHANDLEABLE;
     }
 
@@ -226,8 +217,8 @@ static int hvmemul_do_io(
 
     if ( rc != X86EMUL_OKAY )
     {
-        if ( mfn_valid(mfn_x(ram_mfn)) )
-            put_page(mfn_to_page(mfn_x(ram_mfn)));
+        if ( ram_page )
+            put_page(ram_page);
         return rc;
     }
 
@@ -263,8 +254,8 @@ static int hvmemul_do_io(
         }
     }
 
-    if ( mfn_valid(mfn_x(ram_mfn)) )
-        put_page(mfn_to_page(mfn_x(ram_mfn)));
+    if ( ram_page )
+        put_page(ram_page);
     return X86EMUL_OKAY;
 }
 
@@ -686,7 +677,6 @@ static int hvmemul_rep_movs(
     p2m_type_t sp2mt, dp2mt;
     int rc, df = !!(ctxt->regs->eflags & X86_EFLAGS_DF);
     char *buf;
-    struct two_gfns tg;
 
     rc = hvmemul_virtual_to_linear(
         src_seg, src_offset, bytes_per_rep, reps, hvm_access_read,
@@ -714,25 +704,17 @@ static int hvmemul_rep_movs(
     if ( rc != X86EMUL_OKAY )
         return rc;
 
-    get_two_gfns(current->domain, sgpa >> PAGE_SHIFT, &sp2mt, NULL, NULL,
-                 current->domain, dgpa >> PAGE_SHIFT, &dp2mt, NULL, NULL,
-                 P2M_ALLOC, &tg);
+    /* Check for MMIO ops */
+    (void) get_gfn_query_unlocked(current->domain, sgpa >> PAGE_SHIFT, &sp2mt);
+    (void) get_gfn_query_unlocked(current->domain, dgpa >> PAGE_SHIFT, &dp2mt);
 
-    if ( !p2m_is_ram(sp2mt) && !p2m_is_grant(sp2mt) )
-    {
-        rc = hvmemul_do_mmio(
+    if ( sp2mt == p2m_mmio_dm )
+        return hvmemul_do_mmio(
             sgpa, reps, bytes_per_rep, dgpa, IOREQ_READ, df, NULL);
-        put_two_gfns(&tg);
-        return rc;
-    }
 
-    if ( !p2m_is_ram(dp2mt) && !p2m_is_grant(dp2mt) )
-    {
-        rc = hvmemul_do_mmio(
+    if ( dp2mt == p2m_mmio_dm )
+        return hvmemul_do_mmio(
             dgpa, reps, bytes_per_rep, sgpa, IOREQ_WRITE, df, NULL);
-        put_two_gfns(&tg);
-        return rc;
-    }
 
     /* RAM-to-RAM copy: emulate as equivalent of memmove(dgpa, sgpa, bytes). */
     bytes = *reps * bytes_per_rep;
@@ -747,10 +729,7 @@ static int hvmemul_rep_movs(
      * can be emulated by a source-to-buffer-to-destination block copy.
      */
     if ( ((dgpa + bytes_per_rep) > sgpa) && (dgpa < (sgpa + bytes)) )
-    {
-        put_two_gfns(&tg);
         return X86EMUL_UNHANDLEABLE;
-    }
 
     /* Adjust destination address for reverse copy. */
     if ( df )
@@ -759,10 +738,7 @@ static int hvmemul_rep_movs(
     /* Allocate temporary buffer. Fall back to slow emulation if this fails. */
     buf = xmalloc_bytes(bytes);
     if ( buf == NULL )
-    {
-        put_two_gfns(&tg);
         return X86EMUL_UNHANDLEABLE;
-    }
 
     /*
      * We do a modicum of checking here, just for paranoia's sake and to
@@ -773,7 +749,6 @@ static int hvmemul_rep_movs(
         rc = hvm_copy_to_guest_phys(dgpa, buf, bytes);
 
     xfree(buf);
-    put_two_gfns(&tg);
 
     if ( rc == HVMCOPY_gfn_paged_out )
         return X86EMUL_RETRY;
diff -r 107285938c50 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/hvm/hvm.c	Fri Apr 27 10:23:28 2012 +0100
@@ -395,48 +395,41 @@ int prepare_ring_for_helper(
 {
     struct page_info *page;
     p2m_type_t p2mt;
-    unsigned long mfn;
     void *va;
 
-    mfn = mfn_x(get_gfn_unshare(d, gmfn, &p2mt));
-    if ( !p2m_is_ram(p2mt) )
-    {
-        put_gfn(d, gmfn);
-        return -EINVAL;
-    }
+    page = get_page_from_gfn(d, gmfn, &p2mt, P2M_UNSHARE);
     if ( p2m_is_paging(p2mt) )
     {
-        put_gfn(d, gmfn);
+        if ( page )
+            put_page(page);
         p2m_mem_paging_populate(d, gmfn);
         return -ENOENT;
     }
     if ( p2m_is_shared(p2mt) )
     {
-        put_gfn(d, gmfn);
+        if ( page )
+            put_page(page);
         return -ENOENT;
     }
-    ASSERT(mfn_valid(mfn));
-
-    page = mfn_to_page(mfn);
-    if ( !get_page_and_type(page, d, PGT_writable_page) )
+    if ( !page )
+        return -EINVAL;
+
+    if ( !get_page_type(page, PGT_writable_page) )
     {
-        put_gfn(d, gmfn);
+        put_page(page);
         return -EINVAL;
     }
 
-    va = map_domain_page_global(mfn);
+    va = __map_domain_page_global(page);
     if ( va == NULL )
     {
         put_page_and_type(page);
-        put_gfn(d, gmfn);
         return -ENOMEM;
     }
 
     *_va = va;
     *_page = page;
 
-    put_gfn(d, gmfn);
-
     return 0;
 }
 
@@ -1607,8 +1600,8 @@ int hvm_mov_from_cr(unsigned int cr, uns
 int hvm_set_cr0(unsigned long value)
 {
     struct vcpu *v = current;
-    p2m_type_t p2mt;
-    unsigned long gfn, mfn, old_value = v->arch.hvm_vcpu.guest_cr[0];
+    unsigned long gfn, old_value = v->arch.hvm_vcpu.guest_cr[0];
+    struct page_info *page;
 
     HVM_DBG_LOG(DBG_LEVEL_VMMU, "Update CR0 value = %lx", value);
 
@@ -1647,23 +1640,20 @@ int hvm_set_cr0(unsigned long value)
         {
             /* The guest CR3 must be pointing to the guest physical. */
             gfn = v->arch.hvm_vcpu.guest_cr[3]>>PAGE_SHIFT;
-            mfn = mfn_x(get_gfn(v->domain, gfn, &p2mt));
-            if ( !p2m_is_ram(p2mt) || !mfn_valid(mfn) ||
-                 !get_page(mfn_to_page(mfn), v->domain))
+            page = get_page_from_gfn(v->domain, gfn, NULL, P2M_ALLOC);
+            if ( !page )
             {
-                put_gfn(v->domain, gfn);
-                gdprintk(XENLOG_ERR, "Invalid CR3 value = %lx (mfn=%lx)\n",
-                         v->arch.hvm_vcpu.guest_cr[3], mfn);
+                gdprintk(XENLOG_ERR, "Invalid CR3 value = %lx\n",
+                         v->arch.hvm_vcpu.guest_cr[3]);
                 domain_crash(v->domain);
                 return X86EMUL_UNHANDLEABLE;
             }
 
             /* Now arch.guest_table points to machine physical. */
-            v->arch.guest_table = pagetable_from_pfn(mfn);
+            v->arch.guest_table = pagetable_from_page(page);
 
             HVM_DBG_LOG(DBG_LEVEL_VMMU, "Update CR3 value = %lx, mfn = %lx",
-                        v->arch.hvm_vcpu.guest_cr[3], mfn);
-            put_gfn(v->domain, gfn);
+                        v->arch.hvm_vcpu.guest_cr[3], page_to_mfn(page));
         }
     }
     else if ( !(value & X86_CR0_PG) && (old_value & X86_CR0_PG) )
@@ -1738,26 +1728,21 @@ int hvm_set_cr0(unsigned long value)
 
 int hvm_set_cr3(unsigned long value)
 {
-    unsigned long mfn;
-    p2m_type_t p2mt;
     struct vcpu *v = current;
+    struct page_info *page;
 
     if ( hvm_paging_enabled(v) && !paging_mode_hap(v->domain) &&
          (value != v->arch.hvm_vcpu.guest_cr[3]) )
     {
         /* Shadow-mode CR3 change. Check PDBR and update refcounts. */
         HVM_DBG_LOG(DBG_LEVEL_VMMU, "CR3 value = %lx", value);
-        mfn = mfn_x(get_gfn(v->domain, value >> PAGE_SHIFT, &p2mt));
-        if ( !p2m_is_ram(p2mt) || !mfn_valid(mfn) ||
-             !get_page(mfn_to_page(mfn), v->domain) )
-        {
-              put_gfn(v->domain, value >> PAGE_SHIFT);
-              goto bad_cr3;
-        }
+        page = get_page_from_gfn(v->domain, value >> PAGE_SHIFT,
+                                 NULL, P2M_ALLOC);
+        if ( !page )
+            goto bad_cr3;
 
         put_page(pagetable_get_page(v->arch.guest_table));
-        v->arch.guest_table = pagetable_from_pfn(mfn);
-        put_gfn(v->domain, value >> PAGE_SHIFT);
+        v->arch.guest_table = pagetable_from_page(page);
 
         HVM_DBG_LOG(DBG_LEVEL_VMMU, "Update CR3 value = %lx", value);
     }
@@ -1914,46 +1899,29 @@ int hvm_virtual_to_linear_addr(
 static void *__hvm_map_guest_frame(unsigned long gfn, bool_t writable)
 {
     void *map;
-    unsigned long mfn;
     p2m_type_t p2mt;
-    struct page_info *pg;
+    struct page_info *page;
     struct domain *d = current->domain;
-    int rc;
-
-    mfn = mfn_x(writable
-                ? get_gfn_unshare(d, gfn, &p2mt)
-                : get_gfn(d, gfn, &p2mt));
-    if ( (p2m_is_shared(p2mt) && writable) || !p2m_is_ram(p2mt) )
+
+    page = get_page_from_gfn(d, gfn, &p2mt,
+                             writable ? P2M_UNSHARE : P2M_ALLOC);
+    if ( (p2m_is_shared(p2mt) && writable) || !page )
     {
-        put_gfn(d, gfn);
+        if ( page )
+            put_page(page);
         return NULL;
     }
     if ( p2m_is_paging(p2mt) )
     {
-        put_gfn(d, gfn);
+        put_page(page);
         p2m_mem_paging_populate(d, gfn);
         return NULL;
     }
 
-    ASSERT(mfn_valid(mfn));
-
     if ( writable )
-        paging_mark_dirty(d, mfn);
-
-    /* Get a ref on the page, considering that it could be shared */
-    pg = mfn_to_page(mfn);
-    rc = get_page(pg, d);
-    if ( !rc && !writable )
-        /* Page could be shared */
-        rc = get_page(pg, dom_cow);
-    if ( !rc )
-    {
-        put_gfn(d, gfn);
-        return NULL;
-    }
-
-    map = map_domain_page(mfn);
-    put_gfn(d, gfn);
+        paging_mark_dirty(d, page_to_mfn(page));
+
+    map = __map_domain_page(page);
     return map;
 }
 
@@ -2358,7 +2326,8 @@ static enum hvm_copy_result __hvm_copy(
     void *buf, paddr_t addr, int size, unsigned int flags, uint32_t pfec)
 {
     struct vcpu *curr = current;
-    unsigned long gfn, mfn;
+    unsigned long gfn;
+    struct page_info *page;
     p2m_type_t p2mt;
     char *p;
     int count, todo = size;
@@ -2402,32 +2371,33 @@ static enum hvm_copy_result __hvm_copy(
             gfn = addr >> PAGE_SHIFT;
         }
 
-        mfn = mfn_x(get_gfn_unshare(curr->domain, gfn, &p2mt));
+        page = get_page_from_gfn(curr->domain, gfn, &p2mt, P2M_UNSHARE);
 
         if ( p2m_is_paging(p2mt) )
         {
-            put_gfn(curr->domain, gfn);
+            if ( page )
+                put_page(page);
             p2m_mem_paging_populate(curr->domain, gfn);
             return HVMCOPY_gfn_paged_out;
         }
         if ( p2m_is_shared(p2mt) )
         {
-            put_gfn(curr->domain, gfn);
+            if ( page )
+                put_page(page);
             return HVMCOPY_gfn_shared;
         }
         if ( p2m_is_grant(p2mt) )
         {
-            put_gfn(curr->domain, gfn);
+            if ( page )
+                put_page(page);
             return HVMCOPY_unhandleable;
         }
-        if ( !p2m_is_ram(p2mt) )
+        if ( !page )
         {
-            put_gfn(curr->domain, gfn);
             return HVMCOPY_bad_gfn_to_mfn;
         }
-        ASSERT(mfn_valid(mfn));
-
-        p = (char *)map_domain_page(mfn) + (addr & ~PAGE_MASK);
+
+        p = (char *)__map_domain_page(page) + (addr & ~PAGE_MASK);
 
         if ( flags & HVMCOPY_to_guest )
         {
@@ -2437,12 +2407,12 @@ static enum hvm_copy_result __hvm_copy(
                 if ( xchg(&lastpage, gfn) != gfn )
                     gdprintk(XENLOG_DEBUG, "guest attempted write to read-only"
                              " memory page. gfn=%#lx, mfn=%#lx\n",
-                             gfn, mfn);
+                             gfn, page_to_mfn(page));
             }
             else
             {
                 memcpy(p, buf, count);
-                paging_mark_dirty(curr->domain, mfn);
+                paging_mark_dirty(curr->domain, page_to_mfn(page));
             }
         }
         else
@@ -2455,7 +2425,7 @@ static enum hvm_copy_result __hvm_copy(
         addr += count;
         buf  += count;
         todo -= count;
-        put_gfn(curr->domain, gfn);
+        put_page(page);
     }
 
     return HVMCOPY_okay;
@@ -2464,7 +2434,8 @@ static enum hvm_copy_result __hvm_copy(
 static enum hvm_copy_result __hvm_clear(paddr_t addr, int size)
 {
     struct vcpu *curr = current;
-    unsigned long gfn, mfn;
+    unsigned long gfn;
+    struct page_info *page;
     p2m_type_t p2mt;
     char *p;
     int count, todo = size;
@@ -2500,32 +2471,35 @@ static enum hvm_copy_result __hvm_clear(
             return HVMCOPY_bad_gva_to_gfn;
         }
 
-        mfn = mfn_x(get_gfn_unshare(curr->domain, gfn, &p2mt));
+        page = get_page_from_gfn(curr->domain, gfn, &p2mt, P2M_UNSHARE);
 
         if ( p2m_is_paging(p2mt) )
         {
+            if ( page )
+                put_page(page);
             p2m_mem_paging_populate(curr->domain, gfn);
-            put_gfn(curr->domain, gfn);
             return HVMCOPY_gfn_paged_out;
         }
         if ( p2m_is_shared(p2mt) )
         {
-            put_gfn(curr->domain, gfn);
+            if ( page )
+                put_page(page);
             return HVMCOPY_gfn_shared;
         }
         if ( p2m_is_grant(p2mt) )
         {
-            put_gfn(curr->domain, gfn);
+            if ( page )
+                put_page(page);
             return HVMCOPY_unhandleable;
         }
-        if ( !p2m_is_ram(p2mt) )
+        if ( !page )
         {
-            put_gfn(curr->domain, gfn);
+            if ( page )
+                put_page(page);
             return HVMCOPY_bad_gfn_to_mfn;
         }
-        ASSERT(mfn_valid(mfn));
-
-        p = (char *)map_domain_page(mfn) + (addr & ~PAGE_MASK);
+
+        p = (char *)__map_domain_page(page) + (addr & ~PAGE_MASK);
 
         if ( p2mt == p2m_ram_ro )
         {
@@ -2533,19 +2507,19 @@ static enum hvm_copy_result __hvm_clear(
             if ( xchg(&lastpage, gfn) != gfn )
                 gdprintk(XENLOG_DEBUG, "guest attempted write to read-only"
                         " memory page. gfn=%#lx, mfn=%#lx\n",
-                        gfn, mfn);
+                         gfn, page_to_mfn(page));
         }
         else
         {
             memset(p, 0x00, count);
-            paging_mark_dirty(curr->domain, mfn);
+            paging_mark_dirty(curr->domain, page_to_mfn(page));
         }
 
         unmap_domain_page(p);
 
         addr += count;
         todo -= count;
-        put_gfn(curr->domain, gfn);
+        put_page(page);
     }
 
     return HVMCOPY_okay;
@@ -4000,35 +3974,16 @@ long do_hvm_op(unsigned long op, XEN_GUE
 
         for ( pfn = a.first_pfn; pfn < a.first_pfn + a.nr; pfn++ )
         {
-            p2m_type_t t;
-            mfn_t mfn = get_gfn_unshare(d, pfn, &t);
-            if ( p2m_is_paging(t) )
+            struct page_info *page;
+            page = get_page_from_gfn(d, pfn, NULL, P2M_UNSHARE);
+            if ( page )
             {
-                put_gfn(d, pfn);
-                p2m_mem_paging_populate(d, pfn);
-                rc = -EINVAL;
-                goto param_fail3;
-            }
-            if( p2m_is_shared(t) )
-            {
-                /* If it insists on not unsharing itself, crash the domain 
-                 * rather than crashing the host down in mark dirty */
-                gdprintk(XENLOG_WARNING,
-                         "shared pfn 0x%lx modified?\n", pfn);
-                domain_crash(d);
-                put_gfn(d, pfn);
-                rc = -EINVAL;
-                goto param_fail3;
-            }
-            
-            if ( mfn_x(mfn) != INVALID_MFN )
-            {
-                paging_mark_dirty(d, mfn_x(mfn));
+                paging_mark_dirty(d, page_to_mfn(page));
                 /* These are most probably not page tables any more */
                 /* don't take a long time and don't die either */
-                sh_remove_shadows(d->vcpu[0], mfn, 1, 0);
+                sh_remove_shadows(d->vcpu[0], _mfn(page_to_mfn(page)), 1, 0);
+                put_page(page);
             }
-            put_gfn(d, pfn);
         }
 
     param_fail3:
diff -r 107285938c50 xen/arch/x86/hvm/stdvga.c
--- a/xen/arch/x86/hvm/stdvga.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/hvm/stdvga.c	Fri Apr 27 10:23:28 2012 +0100
@@ -482,7 +482,8 @@ static int mmio_move(struct hvm_hw_stdvg
                 if ( hvm_copy_to_guest_phys(data, &tmp, p->size) !=
                      HVMCOPY_okay )
                 {
-                    (void)get_gfn(d, data >> PAGE_SHIFT, &p2mt);
+                    struct page_info *dp = get_page_from_gfn(
+                            d, data >> PAGE_SHIFT, &p2mt, P2M_ALLOC);
                     /*
                      * The only case we handle is vga_mem <-> vga_mem.
                      * Anything else disables caching and leaves it to qemu-dm.
@@ -490,11 +491,12 @@ static int mmio_move(struct hvm_hw_stdvg
                     if ( (p2mt != p2m_mmio_dm) || (data < VGA_MEM_BASE) ||
                          ((data + p->size) > (VGA_MEM_BASE + VGA_MEM_SIZE)) )
                     {
-                        put_gfn(d, data >> PAGE_SHIFT);
+                        if ( dp )
+                            put_page(dp);
                         return 0;
                     }
+                    ASSERT(!dp);
                     stdvga_mem_write(data, tmp, p->size);
-                    put_gfn(d, data >> PAGE_SHIFT);
                 }
                 data += sign * p->size;
                 addr += sign * p->size;
@@ -508,15 +510,16 @@ static int mmio_move(struct hvm_hw_stdvg
                 if ( hvm_copy_from_guest_phys(&tmp, data, p->size) !=
                      HVMCOPY_okay )
                 {
-                    (void)get_gfn(d, data >> PAGE_SHIFT, &p2mt);
+                    struct page_info *dp = get_page_from_gfn(
+                        d, data >> PAGE_SHIFT, &p2mt, P2M_ALLOC);
                     if ( (p2mt != p2m_mmio_dm) || (data < VGA_MEM_BASE) ||
                          ((data + p->size) > (VGA_MEM_BASE + VGA_MEM_SIZE)) )
                     {
-                        put_gfn(d, data >> PAGE_SHIFT);
+                        if ( dp )
+                            put_page(dp);
                         return 0;
                     }
                     tmp = stdvga_mem_read(data, p->size);
-                    put_gfn(d, data >> PAGE_SHIFT);
                 }
                 stdvga_mem_write(addr, tmp, p->size);
                 data += sign * p->size;
diff -r 107285938c50 xen/arch/x86/hvm/viridian.c
--- a/xen/arch/x86/hvm/viridian.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/hvm/viridian.c	Fri Apr 27 10:23:28 2012 +0100
@@ -134,18 +134,19 @@ void dump_apic_assist(struct vcpu *v)
 static void enable_hypercall_page(struct domain *d)
 {
     unsigned long gmfn = d->arch.hvm_domain.viridian.hypercall_gpa.fields.pfn;
-    unsigned long mfn = get_gfn_untyped(d, gmfn);
+    struct page_info *page = get_page_from_gfn(d, gmfn, NULL, P2M_ALLOC);
     uint8_t *p;
 
-    if ( !mfn_valid(mfn) ||
-         !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
+    if ( !page || !get_page_type(page, PGT_writable_page) )
     {
-        put_gfn(d, gmfn); 
-        gdprintk(XENLOG_WARNING, "Bad GMFN %lx (MFN %lx)\n", gmfn, mfn);
+        if ( page )
+            put_page(page);
+        gdprintk(XENLOG_WARNING, "Bad GMFN %lx (MFN %lx)\n", gmfn,
+                 page_to_mfn(page));
         return;
     }
 
-    p = map_domain_page(mfn);
+    p = __map_domain_page(page);
 
     /*
      * We set the bit 31 in %eax (reserved field in the Viridian hypercall
@@ -162,15 +163,14 @@ static void enable_hypercall_page(struct
 
     unmap_domain_page(p);
 
-    put_page_and_type(mfn_to_page(mfn));
-    put_gfn(d, gmfn); 
+    put_page_and_type(page);
 }
 
 void initialize_apic_assist(struct vcpu *v)
 {
     struct domain *d = v->domain;
     unsigned long gmfn = v->arch.hvm_vcpu.viridian.apic_assist.fields.pfn;
-    unsigned long mfn = get_gfn_untyped(d, gmfn);
+    struct page_info *page = get_page_from_gfn(d, gmfn, NULL, P2M_ALLOC);
     uint8_t *p;
 
     /*
@@ -183,22 +183,22 @@ void initialize_apic_assist(struct vcpu 
      * details of how Windows uses the page.
      */
 
-    if ( !mfn_valid(mfn) ||
-         !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
+    if ( !page || !get_page_type(page, PGT_writable_page) )
     {
-        put_gfn(d, gmfn); 
-        gdprintk(XENLOG_WARNING, "Bad GMFN %lx (MFN %lx)\n", gmfn, mfn);
+        if ( page )
+            put_page(page);
+        gdprintk(XENLOG_WARNING, "Bad GMFN %lx (MFN %lx)\n", gmfn,
+                 page_to_mfn(page));
         return;
     }
 
-    p = map_domain_page(mfn);
+    p = __map_domain_page(page);
 
     *(u32 *)p = 0;
 
     unmap_domain_page(p);
 
-    put_page_and_type(mfn_to_page(mfn));
-    put_gfn(d, gmfn); 
+    put_page_and_type(page);
 }
 
 int wrmsr_viridian_regs(uint32_t idx, uint64_t val)
diff -r 107285938c50 xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/hvm/vmx/vmx.c	Fri Apr 27 10:23:28 2012 +0100
@@ -480,17 +480,16 @@ static void vmx_vmcs_save(struct vcpu *v
 static int vmx_restore_cr0_cr3(
     struct vcpu *v, unsigned long cr0, unsigned long cr3)
 {
-    unsigned long mfn = 0;
-    p2m_type_t p2mt;
+    struct page_info *page = NULL;
 
     if ( paging_mode_shadow(v->domain) )
     {
         if ( cr0 & X86_CR0_PG )
         {
-            mfn = mfn_x(get_gfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt));
-            if ( !p2m_is_ram(p2mt) || !get_page(mfn_to_page(mfn), v->domain) )
+            page = get_page_from_gfn(v->domain, cr3 >> PAGE_SHIFT,
+                                     NULL, P2M_ALLOC);
+            if ( !page )
             {
-                put_gfn(v->domain, cr3 >> PAGE_SHIFT);
                 gdprintk(XENLOG_ERR, "Invalid CR3 value=0x%lx\n", cr3);
                 return -EINVAL;
             }
@@ -499,9 +498,8 @@ static int vmx_restore_cr0_cr3(
         if ( hvm_paging_enabled(v) )
             put_page(pagetable_get_page(v->arch.guest_table));
 
-        v->arch.guest_table = pagetable_from_pfn(mfn);
-        if ( cr0 & X86_CR0_PG )
-            put_gfn(v->domain, cr3 >> PAGE_SHIFT);
+        v->arch.guest_table =
+            page ? pagetable_from_page(page) : pagetable_null();
     }
 
     v->arch.hvm_vcpu.guest_cr[0] = cr0 | X86_CR0_ET;
@@ -1026,8 +1024,9 @@ static void vmx_set_interrupt_shadow(str
 
 static void vmx_load_pdptrs(struct vcpu *v)
 {
-    unsigned long cr3 = v->arch.hvm_vcpu.guest_cr[3], mfn;
+    unsigned long cr3 = v->arch.hvm_vcpu.guest_cr[3];
     uint64_t *guest_pdptrs;
+    struct page_info *page;
     p2m_type_t p2mt;
     char *p;
 
@@ -1038,24 +1037,19 @@ static void vmx_load_pdptrs(struct vcpu 
     if ( (cr3 & 0x1fUL) && !hvm_pcid_enabled(v) )
         goto crash;
 
-    mfn = mfn_x(get_gfn_unshare(v->domain, cr3 >> PAGE_SHIFT, &p2mt));
-    if ( !p2m_is_ram(p2mt) || !mfn_valid(mfn) || 
-         /* If we didn't succeed in unsharing, get_page will fail
-          * (page still belongs to dom_cow) */
-         !get_page(mfn_to_page(mfn), v->domain) )
+    page = get_page_from_gfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt, P2M_UNSHARE);
+    if ( !page )
     {
         /* Ideally you don't want to crash but rather go into a wait 
          * queue, but this is the wrong place. We're holding at least
          * the paging lock */
         gdprintk(XENLOG_ERR,
-                 "Bad cr3 on load pdptrs gfn %lx mfn %lx type %d\n",
-                 cr3 >> PAGE_SHIFT, mfn, (int) p2mt);
-        put_gfn(v->domain, cr3 >> PAGE_SHIFT);
+                 "Bad cr3 on load pdptrs gfn %lx type %d\n",
+                 cr3 >> PAGE_SHIFT, (int) p2mt);
         goto crash;
     }
-    put_gfn(v->domain, cr3 >> PAGE_SHIFT);
-
-    p = map_domain_page(mfn);
+
+    p = __map_domain_page(page);
 
     guest_pdptrs = (uint64_t *)(p + (cr3 & ~PAGE_MASK));
 
@@ -1081,7 +1075,7 @@ static void vmx_load_pdptrs(struct vcpu 
     vmx_vmcs_exit(v);
 
     unmap_domain_page(p);
-    put_page(mfn_to_page(mfn));
+    put_page(page);
     return;
 
  crash:
diff -r 107285938c50 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/mm.c	Fri Apr 27 10:23:28 2012 +0100
@@ -651,7 +651,8 @@ int map_ldt_shadow_page(unsigned int off
 {
     struct vcpu *v = current;
     struct domain *d = v->domain;
-    unsigned long gmfn, mfn;
+    unsigned long gmfn;
+    struct page_info *page;
     l1_pgentry_t l1e, nl1e;
     unsigned long gva = v->arch.pv_vcpu.ldt_base + (off << PAGE_SHIFT);
     int okay;
@@ -663,28 +664,24 @@ int map_ldt_shadow_page(unsigned int off
         return 0;
 
     gmfn = l1e_get_pfn(l1e);
-    mfn = get_gfn_untyped(d, gmfn);
-    if ( unlikely(!mfn_valid(mfn)) )
+    page = get_page_from_gfn(d, gmfn, NULL, P2M_ALLOC);
+    if ( unlikely(!page) )
+        return 0;
+
+    okay = get_page_type(page, PGT_seg_desc_page);
+    if ( unlikely(!okay) )
     {
-        put_gfn(d, gmfn); 
+        put_page(page);
         return 0;
     }
 
-    okay = get_page_and_type(mfn_to_page(mfn), d, PGT_seg_desc_page);
-    if ( unlikely(!okay) )
-    {
-        put_gfn(d, gmfn); 
-        return 0;
-    }
-
-    nl1e = l1e_from_pfn(mfn, l1e_get_flags(l1e) | _PAGE_RW);
+    nl1e = l1e_from_pfn(page_to_mfn(page), l1e_get_flags(l1e) | _PAGE_RW);
 
     spin_lock(&v->arch.pv_vcpu.shadow_ldt_lock);
     l1e_write(&v->arch.perdomain_ptes[off + 16], nl1e);
     v->arch.pv_vcpu.shadow_ldt_mapcnt++;
     spin_unlock(&v->arch.pv_vcpu.shadow_ldt_lock);
 
-    put_gfn(d, gmfn); 
     return 1;
 }
 
@@ -1819,7 +1816,6 @@ static int mod_l1_entry(l1_pgentry_t *pl
 {
     l1_pgentry_t ol1e;
     struct domain *pt_dom = pt_vcpu->domain;
-    p2m_type_t p2mt;
     int rc = 0;
 
     if ( unlikely(__copy_from_user(&ol1e, pl1e, sizeof(ol1e)) != 0) )
@@ -1835,22 +1831,21 @@ static int mod_l1_entry(l1_pgentry_t *pl
     if ( l1e_get_flags(nl1e) & _PAGE_PRESENT )
     {
         /* Translate foreign guest addresses. */
-        unsigned long mfn, gfn;
-        gfn = l1e_get_pfn(nl1e);
-        mfn = mfn_x(get_gfn(pg_dom, gfn, &p2mt));
-        if ( !p2m_is_ram(p2mt) || unlikely(mfn == INVALID_MFN) )
+        struct page_info *page = NULL;
+        if ( paging_mode_translate(pg_dom) )
         {
-            put_gfn(pg_dom, gfn);
-            return -EINVAL;
+            page = get_page_from_gfn(pg_dom, l1e_get_pfn(nl1e), NULL, P2M_ALLOC);
+            if ( !page )
+                return -EINVAL;
+            nl1e = l1e_from_pfn(page_to_mfn(page), l1e_get_flags(nl1e));
         }
-        ASSERT((mfn & ~(PADDR_MASK >> PAGE_SHIFT)) == 0);
-        nl1e = l1e_from_pfn(mfn, l1e_get_flags(nl1e));
 
         if ( unlikely(l1e_get_flags(nl1e) & l1_disallow_mask(pt_dom)) )
         {
             MEM_LOG("Bad L1 flags %x",
                     l1e_get_flags(nl1e) & l1_disallow_mask(pt_dom));
-            put_gfn(pg_dom, gfn);
+            if ( page )
+                put_page(page);
             return -EINVAL;
         }
 
@@ -1860,15 +1855,21 @@ static int mod_l1_entry(l1_pgentry_t *pl
             adjust_guest_l1e(nl1e, pt_dom);
             if ( UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, pt_vcpu,
                               preserve_ad) )
+            {
+                if ( page )
+                    put_page(page);
                 return 0;
-            put_gfn(pg_dom, gfn);
+            }
+            if ( page )
+                put_page(page);
             return -EBUSY;
         }
 
         switch ( rc = get_page_from_l1e(nl1e, pt_dom, pg_dom) )
         {
         default:
-            put_gfn(pg_dom, gfn);
+            if ( page )
+                put_page(page);
             return rc;
         case 0:
             break;
@@ -1876,7 +1877,9 @@ static int mod_l1_entry(l1_pgentry_t *pl
             l1e_remove_flags(nl1e, _PAGE_RW);
             break;
         }
-        
+        if ( page )
+            put_page(page);
+
         adjust_guest_l1e(nl1e, pt_dom);
         if ( unlikely(!UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, pt_vcpu,
                                     preserve_ad)) )
@@ -1884,7 +1887,6 @@ static int mod_l1_entry(l1_pgentry_t *pl
             ol1e = nl1e;
             rc = -EBUSY;
         }
-        put_gfn(pg_dom, gfn);
     }
     else if ( unlikely(!UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, pt_vcpu,
                                      preserve_ad)) )
@@ -3042,7 +3044,6 @@ int do_mmuext_op(
             type = PGT_l4_page_table;
 
         pin_page: {
-            unsigned long mfn;
             struct page_info *page;
 
             /* Ignore pinning of invalid paging levels. */
@@ -3052,25 +3053,28 @@ int do_mmuext_op(
             if ( paging_mode_refcounts(pg_owner) )
                 break;
 
-            mfn = get_gfn_untyped(pg_owner, op.arg1.mfn);
-            rc = get_page_and_type_from_pagenr(mfn, type, pg_owner, 0, 1);
+            page = get_page_from_gfn(pg_owner, op.arg1.mfn, NULL, P2M_ALLOC);
+            if ( unlikely(!page) )
+            {
+                rc = -EINVAL;
+                break;
+            }
+
+            rc = get_page_type_preemptible(page, type);
             okay = !rc;
             if ( unlikely(!okay) )
             {
                 if ( rc == -EINTR )
                     rc = -EAGAIN;
                 else if ( rc != -EAGAIN )
-                    MEM_LOG("Error while pinning mfn %lx", mfn);
-                put_gfn(pg_owner, op.arg1.mfn);
+                    MEM_LOG("Error while pinning mfn %lx", page_to_mfn(page));
+                put_page(page);
                 break;
             }
 
-            page = mfn_to_page(mfn);
-
             if ( (rc = xsm_memory_pin_page(d, page)) != 0 )
             {
                 put_page_and_type(page);
-                put_gfn(pg_owner, op.arg1.mfn);
                 okay = 0;
                 break;
             }
@@ -3078,16 +3082,15 @@ int do_mmuext_op(
             if ( unlikely(test_and_set_bit(_PGT_pinned,
                                            &page->u.inuse.type_info)) )
             {
-                MEM_LOG("Mfn %lx already pinned", mfn);
+                MEM_LOG("Mfn %lx already pinned", page_to_mfn(page));
                 put_page_and_type(page);
-                put_gfn(pg_owner, op.arg1.mfn);
                 okay = 0;
                 break;
             }
 
             /* A page is dirtied when its pin status is set. */
-            paging_mark_dirty(pg_owner, mfn);
-           
+            paging_mark_dirty(pg_owner, page_to_mfn(page));
+
             /* We can race domain destruction (domain_relinquish_resources). */
             if ( unlikely(pg_owner != d) )
             {
@@ -3099,35 +3102,29 @@ int do_mmuext_op(
                 spin_unlock(&pg_owner->page_alloc_lock);
                 if ( drop_ref )
                     put_page_and_type(page);
-                put_gfn(pg_owner, op.arg1.mfn);
             }
 
             break;
         }
 
         case MMUEXT_UNPIN_TABLE: {
-            unsigned long mfn;
             struct page_info *page;
 
             if ( paging_mode_refcounts(pg_owner) )
                 break;
 
-            mfn = get_gfn_untyped(pg_owner, op.arg1.mfn);
-            if ( unlikely(!(okay = get_page_from_pagenr(mfn, pg_owner))) )
+            page = get_page_from_gfn(pg_owner, op.arg1.mfn, NULL, P2M_ALLOC);
+            if ( unlikely(!page) )
             {
-                put_gfn(pg_owner, op.arg1.mfn);
-                MEM_LOG("Mfn %lx bad domain", mfn);
+                MEM_LOG("Mfn %lx bad domain", op.arg1.mfn);
                 break;
             }
 
-            page = mfn_to_page(mfn);
-
             if ( !test_and_clear_bit(_PGT_pinned, &page->u.inuse.type_info) )
             {
                 okay = 0;
                 put_page(page);
-                put_gfn(pg_owner, op.arg1.mfn);
-                MEM_LOG("Mfn %lx not pinned", mfn);
+                MEM_LOG("Mfn %lx not pinned", op.arg1.mfn);
                 break;
             }
 
@@ -3135,40 +3132,43 @@ int do_mmuext_op(
             put_page(page);
 
             /* A page is dirtied when its pin status is cleared. */
-            paging_mark_dirty(pg_owner, mfn);
-
-            put_gfn(pg_owner, op.arg1.mfn);
+            paging_mark_dirty(pg_owner, page_to_mfn(page));
+
             break;
         }
 
         case MMUEXT_NEW_BASEPTR:
-            okay = new_guest_cr3(get_gfn_untyped(d, op.arg1.mfn));
-            put_gfn(d, op.arg1.mfn);
+            okay = (!paging_mode_translate(d)
+                    && new_guest_cr3(op.arg1.mfn));
             break;
+
         
 #ifdef __x86_64__
         case MMUEXT_NEW_USER_BASEPTR: {
-            unsigned long old_mfn, mfn;
-
-            mfn = get_gfn_untyped(d, op.arg1.mfn);
-            if ( mfn != 0 )
+            unsigned long old_mfn;
+
+            if ( paging_mode_translate(current->domain) )
+            {
+                okay = 0;
+                break;
+            }
+
+            if ( op.arg1.mfn != 0 )
             {
                 if ( paging_mode_refcounts(d) )
-                    okay = get_page_from_pagenr(mfn, d);
+                    okay = get_page_from_pagenr(op.arg1.mfn, d);
                 else
                     okay = !get_page_and_type_from_pagenr(
-                        mfn, PGT_root_page_table, d, 0, 0);
+                        op.arg1.mfn, PGT_root_page_table, d, 0, 0);
                 if ( unlikely(!okay) )
                 {
-                    put_gfn(d, op.arg1.mfn);
-                    MEM_LOG("Error while installing new mfn %lx", mfn);
+                    MEM_LOG("Error while installing new mfn %lx", op.arg1.mfn);
                     break;
                 }
             }
 
             old_mfn = pagetable_get_pfn(curr->arch.guest_table_user);
-            curr->arch.guest_table_user = pagetable_from_pfn(mfn);
-            put_gfn(d, op.arg1.mfn);
+            curr->arch.guest_table_user = pagetable_from_pfn(op.arg1.mfn);
 
             if ( old_mfn != 0 )
             {
@@ -3283,28 +3283,26 @@ int do_mmuext_op(
         }
 
         case MMUEXT_CLEAR_PAGE: {
-            unsigned long mfn;
+            struct page_info *page;
             unsigned char *ptr;
 
-            mfn = get_gfn_untyped(d, op.arg1.mfn);
-            okay = !get_page_and_type_from_pagenr(
-                mfn, PGT_writable_page, d, 0, 0);
-            if ( unlikely(!okay) )
+            page = get_page_from_gfn(d, op.arg1.mfn, NULL, P2M_ALLOC);
+            if ( !page || !get_page_type(page, PGT_writable_page) )
             {
-                put_gfn(d, op.arg1.mfn);
-                MEM_LOG("Error while clearing mfn %lx", mfn);
+                if ( page )
+                    put_page(page);
+                MEM_LOG("Error while clearing mfn %lx", op.arg1.mfn);
                 break;
             }
 
             /* A page is dirtied when it's being cleared. */
-            paging_mark_dirty(d, mfn);
-
-            ptr = fixmap_domain_page(mfn);
+            paging_mark_dirty(d, page_to_mfn(page));
+
+            ptr = fixmap_domain_page(page_to_mfn(page));
             clear_page(ptr);
             fixunmap_domain_page(ptr);
 
-            put_page_and_type(mfn_to_page(mfn));
-            put_gfn(d, op.arg1.mfn);
+            put_page_and_type(page);
             break;
         }
 
@@ -3312,42 +3310,38 @@ int do_mmuext_op(
         {
             const unsigned char *src;
             unsigned char *dst;
-            unsigned long src_mfn, mfn;
-
-            src_mfn = get_gfn_untyped(d, op.arg2.src_mfn);
-            okay = get_page_from_pagenr(src_mfn, d);
+            struct page_info *src_page, *dst_page;
+
+            src_page = get_page_from_gfn(d, op.arg2.src_mfn, NULL, P2M_ALLOC);
+            if ( unlikely(!src_page) )
+            {
+                okay = 0;
+                MEM_LOG("Error while copying from mfn %lx", op.arg2.src_mfn);
+                break;
+            }
+
+            dst_page = get_page_from_gfn(d, op.arg1.mfn, NULL, P2M_ALLOC);
+            okay = (dst_page && get_page_type(dst_page, PGT_writable_page));
             if ( unlikely(!okay) )
             {
-                put_gfn(d, op.arg2.src_mfn);
-                MEM_LOG("Error while copying from mfn %lx", src_mfn);
+                put_page(src_page);
+                if ( dst_page )
+                    put_page(dst_page);
+                MEM_LOG("Error while copying to mfn %lx", op.arg1.mfn);
                 break;
             }
 
-            mfn = get_gfn_untyped(d, op.arg1.mfn);
-            okay = !get_page_and_type_from_pagenr(
-                mfn, PGT_writable_page, d, 0, 0);
-            if ( unlikely(!okay) )
-            {
-                put_gfn(d, op.arg1.mfn);
-                put_page(mfn_to_page(src_mfn));
-                put_gfn(d, op.arg2.src_mfn);
-                MEM_LOG("Error while copying to mfn %lx", mfn);
-                break;
-            }
-
             /* A page is dirtied when it's being copied to. */
-            paging_mark_dirty(d, mfn);
-
-            src = map_domain_page(src_mfn);
-            dst = fixmap_domain_page(mfn);
+            paging_mark_dirty(d, page_to_mfn(dst_page));
+
+            src = __map_domain_page(src_page);
+            dst = fixmap_domain_page(page_to_mfn(dst_page));
             copy_page(dst, src);
             fixunmap_domain_page(dst);
             unmap_domain_page(src);
 
-            put_page_and_type(mfn_to_page(mfn));
-            put_gfn(d, op.arg1.mfn);
-            put_page(mfn_to_page(src_mfn));
-            put_gfn(d, op.arg2.src_mfn);
+            put_page_and_type(dst_page);
+            put_page(src_page);
             break;
         }
 
@@ -3538,29 +3532,26 @@ int do_mmu_update(
 
             req.ptr -= cmd;
             gmfn = req.ptr >> PAGE_SHIFT;
-            mfn = mfn_x(get_gfn(pt_owner, gmfn, &p2mt));
-            if ( !p2m_is_valid(p2mt) )
-                mfn = INVALID_MFN;
+            page = get_page_from_gfn(pt_owner, gmfn, &p2mt, P2M_ALLOC);
 
             if ( p2m_is_paged(p2mt) )
             {
-                put_gfn(pt_owner, gmfn);
+                ASSERT(!page);
                 p2m_mem_paging_populate(pg_owner, gmfn);
                 rc = -ENOENT;
                 break;
             }
 
-            if ( unlikely(!get_page_from_pagenr(mfn, pt_owner)) )
+            if ( unlikely(!page) )
             {
                 MEM_LOG("Could not get page for normal update");
-                put_gfn(pt_owner, gmfn);
                 break;
             }
 
+            mfn = page_to_mfn(page);
             va = map_domain_page_with_cache(mfn, &mapcache);
             va = (void *)((unsigned long)va +
                           (unsigned long)(req.ptr & ~PAGE_MASK));
-            page = mfn_to_page(mfn);
 
             if ( page_lock(page) )
             {
@@ -3569,22 +3560,23 @@ int do_mmu_update(
                 case PGT_l1_page_table:
                 {
                     l1_pgentry_t l1e = l1e_from_intpte(req.val);
-                    p2m_type_t l1e_p2mt;
-                    unsigned long l1egfn = l1e_get_pfn(l1e), l1emfn;
-    
-                    l1emfn = mfn_x(get_gfn(pg_owner, l1egfn, &l1e_p2mt));
+                    p2m_type_t l1e_p2mt = p2m_ram_rw;
+                    struct page_info *target = NULL;
+
+                    if ( paging_mode_translate(pg_owner) )
+                        target = get_page_from_gfn(pg_owner, l1e_get_pfn(l1e),
+                                                   &l1e_p2mt, P2M_ALLOC);
 
                     if ( p2m_is_paged(l1e_p2mt) )
                     {
-                        put_gfn(pg_owner, l1egfn);
+                        if ( target )
+                            put_page(target);
                         p2m_mem_paging_populate(pg_owner, l1e_get_pfn(l1e));
                         rc = -ENOENT;
                         break;
                     }
-                    else if ( p2m_ram_paging_in == l1e_p2mt && 
-                                !mfn_valid(l1emfn) )
+                    else if ( p2m_ram_paging_in == l1e_p2mt && !target )
                     {
-                        put_gfn(pg_owner, l1egfn);
                         rc = -ENOENT;
                         break;
                     }
@@ -3601,7 +3593,8 @@ int do_mmu_update(
                             rc = mem_sharing_unshare_page(pg_owner, gfn, 0); 
                             if ( rc )
                             {
-                                put_gfn(pg_owner, l1egfn);
+                                if ( target )
+                                    put_page(target);
                                 /* Notify helper, don't care about errors, will not
                                  * sleep on wq, since we're a foreign domain. */
                                 (void)mem_sharing_notify_enomem(pg_owner, gfn, 0);
@@ -3614,112 +3607,22 @@ int do_mmu_update(
                     rc = mod_l1_entry(va, l1e, mfn,
                                       cmd == MMU_PT_UPDATE_PRESERVE_AD, v,
                                       pg_owner);
-                    put_gfn(pg_owner, l1egfn);
+                    if ( target )
+                        put_page(target);
                 }
                 break;
                 case PGT_l2_page_table:
-                {
-                    l2_pgentry_t l2e = l2e_from_intpte(req.val);
-                    p2m_type_t l2e_p2mt;
-                    unsigned long l2egfn = l2e_get_pfn(l2e), l2emfn;
-
-                    l2emfn = mfn_x(get_gfn(pg_owner, l2egfn, &l2e_p2mt));
-
-                    if ( p2m_is_paged(l2e_p2mt) )
-                    {
-                        put_gfn(pg_owner, l2egfn);
-                        p2m_mem_paging_populate(pg_owner, l2egfn);
-                        rc = -ENOENT;
-                        break;
-                    }
-                    else if ( p2m_ram_paging_in == l2e_p2mt && 
-                                !mfn_valid(l2emfn) )
-                    {
-                        put_gfn(pg_owner, l2egfn);
-                        rc = -ENOENT;
-                        break;
-                    }
-                    else if ( p2m_ram_shared == l2e_p2mt )
-                    {
-                        put_gfn(pg_owner, l2egfn);
-                        MEM_LOG("Unexpected attempt to map shared page.\n");
-                        break;
-                    }
-
-
-                    rc = mod_l2_entry(va, l2e, mfn,
+                    rc = mod_l2_entry(va, l2e_from_intpte(req.val), mfn,
                                       cmd == MMU_PT_UPDATE_PRESERVE_AD, v);
-                    put_gfn(pg_owner, l2egfn);
-                }
-                break;
+                    break;
                 case PGT_l3_page_table:
-                {
-                    l3_pgentry_t l3e = l3e_from_intpte(req.val);
-                    p2m_type_t l3e_p2mt;
-                    unsigned long l3egfn = l3e_get_pfn(l3e), l3emfn;
-
-                    l3emfn = mfn_x(get_gfn(pg_owner, l3egfn, &l3e_p2mt));
-
-                    if ( p2m_is_paged(l3e_p2mt) )
-                    {
-                        put_gfn(pg_owner, l3egfn);
-                        p2m_mem_paging_populate(pg_owner, l3egfn);
-                        rc = -ENOENT;
-                        break;
-                    }
-                    else if ( p2m_ram_paging_in == l3e_p2mt && 
-                                !mfn_valid(l3emfn) )
-                    {
-                        put_gfn(pg_owner, l3egfn);
-                        rc = -ENOENT;
-                        break;
-                    }
-                    else if ( p2m_ram_shared == l3e_p2mt )
-                    {
-                        put_gfn(pg_owner, l3egfn);
-                        MEM_LOG("Unexpected attempt to map shared page.\n");
-                        break;
-                    }
-
-                    rc = mod_l3_entry(va, l3e, mfn,
+                    rc = mod_l3_entry(va, l3e_from_intpte(req.val), mfn,
                                       cmd == MMU_PT_UPDATE_PRESERVE_AD, 1, v);
-                    put_gfn(pg_owner, l3egfn);
-                }
-                break;
+                    break;
 #if CONFIG_PAGING_LEVELS >= 4
                 case PGT_l4_page_table:
-                {
-                    l4_pgentry_t l4e = l4e_from_intpte(req.val);
-                    p2m_type_t l4e_p2mt;
-                    unsigned long l4egfn = l4e_get_pfn(l4e), l4emfn;
-
-                    l4emfn = mfn_x(get_gfn(pg_owner, l4egfn, &l4e_p2mt));
-
-                    if ( p2m_is_paged(l4e_p2mt) )
-                    {
-                        put_gfn(pg_owner, l4egfn);
-                        p2m_mem_paging_populate(pg_owner, l4egfn);
-                        rc = -ENOENT;
-                        break;
-                    }
-                    else if ( p2m_ram_paging_in == l4e_p2mt && 
-                                !mfn_valid(l4emfn) )
-                    {
-                        put_gfn(pg_owner, l4egfn);
-                        rc = -ENOENT;
-                        break;
-                    }
-                    else if ( p2m_ram_shared == l4e_p2mt )
-                    {
-                        put_gfn(pg_owner, l4egfn);
-                        MEM_LOG("Unexpected attempt to map shared page.\n");
-                        break;
-                    }
-
-                    rc = mod_l4_entry(va, l4e, mfn,
+                    rc = mod_l4_entry(va, l4e_from_intpte(req.val), mfn,
                                       cmd == MMU_PT_UPDATE_PRESERVE_AD, 1, v);
-                    put_gfn(pg_owner, l4egfn);
-                }
                 break;
 #endif
                 case PGT_writable_page:
@@ -3742,7 +3645,6 @@ int do_mmu_update(
 
             unmap_domain_page_with_cache(va, &mapcache);
             put_page(page);
-            put_gfn(pt_owner, gmfn);
         }
         break;
 
diff -r 107285938c50 xen/arch/x86/mm/guest_walk.c
--- a/xen/arch/x86/mm/guest_walk.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/mm/guest_walk.c	Fri Apr 27 10:23:28 2012 +0100
@@ -94,39 +94,37 @@ static inline void *map_domain_gfn(struc
                                    p2m_type_t *p2mt,
                                    uint32_t *rc) 
 {
-    p2m_access_t p2ma;
+    struct page_info *page;
     void *map;
 
     /* Translate the gfn, unsharing if shared */
-    *mfn = get_gfn_type_access(p2m, gfn_x(gfn), p2mt, &p2ma, 
-                               P2M_ALLOC | P2M_UNSHARE, NULL);
+    page = get_page_from_gfn_p2m(p2m->domain, p2m, gfn_x(gfn), p2mt, NULL,
+                                  P2M_ALLOC | P2M_UNSHARE);
     if ( p2m_is_paging(*p2mt) )
     {
         ASSERT(!p2m_is_nestedp2m(p2m));
-        __put_gfn(p2m, gfn_x(gfn));
+        if ( page )
+            put_page(page);
         p2m_mem_paging_populate(p2m->domain, gfn_x(gfn));
         *rc = _PAGE_PAGED;
         return NULL;
     }
     if ( p2m_is_shared(*p2mt) )
     {
-        __put_gfn(p2m, gfn_x(gfn));
+        if ( page )
+            put_page(page);
         *rc = _PAGE_SHARED;
         return NULL;
     }
-    if ( !p2m_is_ram(*p2mt) ) 
+    if ( !page )
     {
-        __put_gfn(p2m, gfn_x(gfn));
         *rc |= _PAGE_PRESENT;
         return NULL;
     }
+    *mfn = _mfn(page_to_mfn(page));
     ASSERT(mfn_valid(mfn_x(*mfn)));
-    
-    /* Get an extra ref to the page to ensure liveness of the map.
-     * Then we can safely put gfn */
-    page_get_owner_and_reference(mfn_to_page(mfn_x(*mfn)));
+
     map = map_domain_page(mfn_x(*mfn));
-    __put_gfn(p2m, gfn_x(gfn));
     return map;
 }
 
diff -r 107285938c50 xen/arch/x86/mm/hap/guest_walk.c
--- a/xen/arch/x86/mm/hap/guest_walk.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/mm/hap/guest_walk.c	Fri Apr 27 10:23:28 2012 +0100
@@ -54,34 +54,36 @@ unsigned long hap_p2m_ga_to_gfn(GUEST_PA
     mfn_t top_mfn;
     void *top_map;
     p2m_type_t p2mt;
-    p2m_access_t p2ma;
     walk_t gw;
     unsigned long top_gfn;
+    struct page_info *top_page;
 
     /* Get the top-level table's MFN */
     top_gfn = cr3 >> PAGE_SHIFT;
-    top_mfn = get_gfn_type_access(p2m, top_gfn, &p2mt, &p2ma, 
-                                  P2M_ALLOC | P2M_UNSHARE, NULL);
+    top_page = get_page_from_gfn_p2m(p2m->domain, p2m, top_gfn,
+                                     &p2mt, NULL, P2M_ALLOC | P2M_UNSHARE);
     if ( p2m_is_paging(p2mt) )
     {
         ASSERT(!p2m_is_nestedp2m(p2m));
         pfec[0] = PFEC_page_paged;
-        __put_gfn(p2m, top_gfn);
+        if ( top_page )
+            put_page(top_page);
         p2m_mem_paging_populate(p2m->domain, cr3 >> PAGE_SHIFT);
         return INVALID_GFN;
     }
     if ( p2m_is_shared(p2mt) )
     {
         pfec[0] = PFEC_page_shared;
-        __put_gfn(p2m, top_gfn);
+        if ( top_page )
+            put_page(top_page);
         return INVALID_GFN;
     }
-    if ( !p2m_is_ram(p2mt) )
+    if ( !top_page )
     {
         pfec[0] &= ~PFEC_page_present;
-        __put_gfn(p2m, top_gfn);
         return INVALID_GFN;
     }
+    top_mfn = _mfn(page_to_mfn(top_page));
 
     /* Map the top-level table and call the tree-walker */
     ASSERT(mfn_valid(mfn_x(top_mfn)));
@@ -91,31 +93,30 @@ unsigned long hap_p2m_ga_to_gfn(GUEST_PA
 #endif
     missing = guest_walk_tables(v, p2m, ga, &gw, pfec[0], top_mfn, top_map);
     unmap_domain_page(top_map);
-    __put_gfn(p2m, top_gfn);
+    put_page(top_page);
 
     /* Interpret the answer */
     if ( missing == 0 )
     {
         gfn_t gfn = guest_l1e_get_gfn(gw.l1e);
-        (void)get_gfn_type_access(p2m, gfn_x(gfn), &p2mt, &p2ma,
-                                  P2M_ALLOC | P2M_UNSHARE, NULL); 
+        struct page_info *page;
+        page = get_page_from_gfn_p2m(p2m->domain, p2m, gfn_x(gfn), &p2mt,
+                                     NULL, P2M_ALLOC | P2M_UNSHARE);
+        if ( page )
+            put_page(page);
         if ( p2m_is_paging(p2mt) )
         {
             ASSERT(!p2m_is_nestedp2m(p2m));
             pfec[0] = PFEC_page_paged;
-            __put_gfn(p2m, gfn_x(gfn));
             p2m_mem_paging_populate(p2m->domain, gfn_x(gfn));
             return INVALID_GFN;
         }
         if ( p2m_is_shared(p2mt) )
         {
             pfec[0] = PFEC_page_shared;
-            __put_gfn(p2m, gfn_x(gfn));
             return INVALID_GFN;
         }
 
-        __put_gfn(p2m, gfn_x(gfn));
-
         if ( page_order )
             *page_order = guest_walk_to_page_order(&gw);
 
diff -r 107285938c50 xen/arch/x86/mm/mm-locks.h
--- a/xen/arch/x86/mm/mm-locks.h	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/mm/mm-locks.h	Fri Apr 27 10:23:28 2012 +0100
@@ -166,13 +166,39 @@ declare_mm_lock(nestedp2m)
  * and later mutate it.
  */
 
-declare_mm_lock(p2m)
-#define p2m_lock(p)           mm_lock_recursive(p2m, &(p)->lock)
-#define gfn_lock(p,g,o)       mm_lock_recursive(p2m, &(p)->lock)
-#define p2m_unlock(p)         mm_unlock(&(p)->lock)
-#define gfn_unlock(p,g,o)     mm_unlock(&(p)->lock)
-#define p2m_locked_by_me(p)   mm_locked_by_me(&(p)->lock)
-#define gfn_locked_by_me(p,g) mm_locked_by_me(&(p)->lock)
+/* P2M lock is become an rwlock, purely so we can implement
+ * get_page_from_gfn.  The mess below is a ghastly hack to make a
+ * recursive rwlock.  If it works I'll come back and fix up the
+ * order-contraints magic. */
+
+static inline void p2m_lock(struct p2m_domain *p)
+{
+    if ( p->wcpu != current->processor )
+    {
+        write_lock(&p->lock);
+        p->wcpu = current->processor;
+        ASSERT(p->wcount == 0);
+    }
+    p->wcount++;
+}
+
+static inline void p2m_unlock(struct p2m_domain *p)
+{
+    ASSERT(p->wcpu == current->processor);
+    if (--(p->wcount) == 0)
+    {
+        p->wcpu = -1;
+        write_unlock(&p->lock);
+    }
+}
+
+#define gfn_lock(p,g,o)       p2m_lock(p)
+#define gfn_unlock(p,g,o)     p2m_unlock(p)
+#define p2m_read_lock(p)      read_lock(&(p)->lock)
+#define p2m_read_unlock(p)    read_unlock(&(p)->lock)
+#define p2m_locked_by_me(p)   ((p)->wcpu == current->processor)
+#define gfn_locked_by_me(p,g) p2m_locked_by_me(p)
+
 
 /* Sharing per page lock
  *
@@ -203,8 +229,8 @@ declare_mm_order_constraint(per_page_sha
  * counts, page lists, sweep parameters. */
 
 declare_mm_lock(pod)
-#define pod_lock(p)           mm_lock(pod, &(p)->pod.lock)
-#define pod_unlock(p)         mm_unlock(&(p)->pod.lock)
+#define pod_lock(p) do { p2m_lock(p); mm_lock(pod, &(p)->pod.lock); } while (0)
+#define pod_unlock(p) do { mm_unlock(&(p)->pod.lock); p2m_unlock(p);} while (0)
 #define pod_locked_by_me(p)   mm_locked_by_me(&(p)->pod.lock)
 
 /* Page alloc lock (per-domain)
diff -r 107285938c50 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/mm/p2m.c	Fri Apr 27 10:23:28 2012 +0100
@@ -71,7 +71,9 @@ boolean_param("hap_2mb", opt_hap_2mb);
 /* Init the datastructures for later use by the p2m code */
 static void p2m_initialise(struct domain *d, struct p2m_domain *p2m)
 {
-    mm_lock_init(&p2m->lock);
+    rwlock_init(&p2m->lock);
+    p2m->wcount = 0;
+    p2m->wcpu = -1;
     mm_lock_init(&p2m->pod.lock);
     INIT_LIST_HEAD(&p2m->np2m_list);
     INIT_PAGE_LIST_HEAD(&p2m->pages);
@@ -207,6 +209,59 @@ void __put_gfn(struct p2m_domain *p2m, u
     gfn_unlock(p2m, gfn, 0);
 }
 
+/* Atomically look up a GFN and take a reference count on the backing page. */
+struct page_info *get_page_from_gfn_p2m(
+    struct domain *d, struct p2m_domain *p2m, unsigned long gfn,
+    p2m_type_t *t, p2m_access_t *a, p2m_query_t q)
+{
+    struct page_info *page = NULL;
+    p2m_access_t _a;
+    p2m_type_t _t;
+    mfn_t mfn;
+
+    /* Allow t or a to be NULL */
+    t = t ?: &_t;
+    a = a ?: &_a;
+
+    if ( likely(!p2m_locked_by_me(p2m)) )
+    {
+        /* Fast path: look up and get out */
+        p2m_read_lock(p2m);
+        mfn = __get_gfn_type_access(p2m, gfn, t, a, 0, NULL, 0);
+        if ( (p2m_is_ram(*t) || p2m_is_grant(*t))
+             && mfn_valid(mfn)
+             && !((q & P2M_UNSHARE) && p2m_is_shared(*t)) )
+        {
+            page = mfn_to_page(mfn);
+            if ( !get_page(page, d)
+                 /* Page could be shared */
+                 && !get_page(page, dom_cow) )
+                page = NULL;
+        }
+        p2m_read_unlock(p2m);
+
+        if ( page )
+            return page;
+
+        /* Error path: not a suitable GFN at all */
+        if ( !p2m_is_ram(*t) && !p2m_is_paging(*t) && !p2m_is_magic(*t) )
+            return NULL;
+    }
+
+    /* Slow path: take the write lock and do fixups */
+    mfn = get_gfn_type_access(p2m, gfn, t, a, q, NULL);
+    if ( p2m_is_ram(*t) && mfn_valid(mfn) )
+    {
+        page = mfn_to_page(mfn);
+        if ( !get_page(page, d) )
+            page = NULL;
+    }
+    put_gfn(d, gfn);
+
+    return page;
+}
+
+
 int set_p2m_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn, 
                   unsigned int page_order, p2m_type_t p2mt, p2m_access_t p2ma)
 {
diff -r 107285938c50 xen/arch/x86/physdev.c
--- a/xen/arch/x86/physdev.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/physdev.c	Fri Apr 27 10:23:28 2012 +0100
@@ -306,26 +306,27 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
     case PHYSDEVOP_pirq_eoi_gmfn_v1: {
         struct physdev_pirq_eoi_gmfn info;
         unsigned long mfn;
+        struct page_info *page;
 
         ret = -EFAULT;
         if ( copy_from_guest(&info, arg, 1) != 0 )
             break;
 
         ret = -EINVAL;
-        mfn = get_gfn_untyped(current->domain, info.gmfn);
-        if ( !mfn_valid(mfn) ||
-             !get_page_and_type(mfn_to_page(mfn), v->domain,
-                                PGT_writable_page) )
+        page = get_page_from_gfn(current->domain, info.gmfn, NULL, P2M_ALLOC);
+        if ( !page )
+            break;
+        if ( !get_page_type(page, PGT_writable_page) )
         {
-            put_gfn(current->domain, info.gmfn);
+            put_page(page);
             break;
         }
+        mfn = page_to_mfn(page);
 
         if ( cmpxchg(&v->domain->arch.pv_domain.pirq_eoi_map_mfn,
                      0, mfn) != 0 )
         {
             put_page_and_type(mfn_to_page(mfn));
-            put_gfn(current->domain, info.gmfn);
             ret = -EBUSY;
             break;
         }
@@ -335,14 +336,12 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
         {
             v->domain->arch.pv_domain.pirq_eoi_map_mfn = 0;
             put_page_and_type(mfn_to_page(mfn));
-            put_gfn(current->domain, info.gmfn);
             ret = -ENOSPC;
             break;
         }
         if ( cmd == PHYSDEVOP_pirq_eoi_gmfn_v1 )
             v->domain->arch.pv_domain.auto_unmask = 1;
 
-        put_gfn(current->domain, info.gmfn);
         ret = 0;
         break;
     }
diff -r 107285938c50 xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/arch/x86/traps.c	Fri Apr 27 10:23:28 2012 +0100
@@ -662,9 +662,9 @@ int wrmsr_hypervisor_regs(uint32_t idx, 
     case 0:
     {
         void *hypercall_page;
-        unsigned long mfn;
         unsigned long gmfn = val >> 12;
         unsigned int idx  = val & 0xfff;
+        struct page_info *page;
 
         if ( idx > 0 )
         {
@@ -674,24 +674,23 @@ int wrmsr_hypervisor_regs(uint32_t idx, 
             return 0;
         }
 
-        mfn = get_gfn_untyped(d, gmfn);
-
-        if ( !mfn_valid(mfn) ||
-             !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
+        page = get_page_from_gfn(d, gmfn, NULL, P2M_ALLOC);
+
+        if ( !page || !get_page_type(page, PGT_writable_page) )
         {
-            put_gfn(d, gmfn);
+            if ( page )
+                put_page(page);
             gdprintk(XENLOG_WARNING,
                      "Bad GMFN %lx (MFN %lx) to MSR %08x\n",
-                     gmfn, mfn, base + idx);
+                     gmfn, page_to_mfn(page), base + idx);
             return 0;
         }
 
-        hypercall_page = map_domain_page(mfn);
+        hypercall_page = __map_domain_page(page);
         hypercall_page_initialise(d, hypercall_page);
         unmap_domain_page(hypercall_page);
 
-        put_page_and_type(mfn_to_page(mfn));
-        put_gfn(d, gmfn);
+        put_page_and_type(page);
         break;
     }
 
@@ -2374,7 +2373,8 @@ static int emulate_privileged_op(struct 
             break;
 
         case 3: {/* Write CR3 */
-            unsigned long mfn, gfn;
+            unsigned long gfn;
+            struct page_info *page;
             domain_lock(v->domain);
             if ( !is_pv_32on64_vcpu(v) )
             {
@@ -2384,9 +2384,10 @@ static int emulate_privileged_op(struct 
                 gfn = compat_cr3_to_pfn(*reg);
 #endif
             }
-            mfn = get_gfn_untyped(v->domain, gfn);
-            rc = new_guest_cr3(mfn);
-            put_gfn(v->domain, gfn);
+            page = get_page_from_gfn(v->domain, gfn, NULL, P2M_ALLOC);
+            rc = page ? new_guest_cr3(page_to_mfn(page)) : 0;
+            if ( page )
+                put_page(page);
             domain_unlock(v->domain);
             if ( rc == 0 ) /* not okay */
                 goto fail;
diff -r 107285938c50 xen/include/asm-x86/p2m.h
--- a/xen/include/asm-x86/p2m.h	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/include/asm-x86/p2m.h	Fri Apr 27 10:23:28 2012 +0100
@@ -192,7 +192,10 @@ typedef unsigned int p2m_query_t;
 /* Per-p2m-table state */
 struct p2m_domain {
     /* Lock that protects updates to the p2m */
-    mm_lock_t          lock;
+    rwlock_t           lock;
+    int                wcpu;
+    int                wcount;
+    const char        *wfunc;
 
     /* Shadow translated domain: p2m mapping */
     pagetable_t        phys_table;
@@ -377,6 +380,33 @@ static inline mfn_t get_gfn_query_unlock
     return __get_gfn_type_access(p2m_get_hostp2m(d), gfn, t, &a, 0, NULL, 0);
 }
 
+/* Atomically look up a GFN and take a reference count on the backing page.
+ * This makes sure the page doesn't get freed (or shared) underfoot,
+ * and should be used by any path that intends to write to the backing page.
+ * Returns NULL if the page is not backed by RAM.
+ * The caller is responsible for calling put_page() afterwards. */
+struct page_info *get_page_from_gfn_p2m(struct domain *d,
+                                        struct p2m_domain *p2m,
+                                        unsigned long gfn,
+                                        p2m_type_t *t, p2m_access_t *a,
+                                        p2m_query_t q);
+
+static inline struct page_info *get_page_from_gfn(
+    struct domain *d, unsigned long gfn, p2m_type_t *t, p2m_query_t q)
+{
+    struct page_info *page;
+
+    if ( paging_mode_translate(d) )
+        return get_page_from_gfn_p2m(d, p2m_get_hostp2m(d), gfn, t, NULL, q);
+
+    /* Non-translated guests see 1-1 RAM mappings everywhere */
+    if (t)
+        *t = p2m_ram_rw;
+    page = __mfn_to_page(gfn);
+    return get_page(page, d) ? page : NULL;
+}
+
+
 /* General conversion function from mfn to gfn */
 static inline unsigned long mfn_to_gfn(struct domain *d, mfn_t mfn)
 {
diff -r 107285938c50 xen/xsm/flask/hooks.c
--- a/xen/xsm/flask/hooks.c	Thu Apr 26 10:03:08 2012 +0100
+++ b/xen/xsm/flask/hooks.c	Fri Apr 27 10:23:28 2012 +0100
@@ -1318,6 +1318,7 @@ static int flask_mmu_normal_update(struc
     struct domain_security_struct *dsec;
     u32 fsid;
     struct avc_audit_data ad;
+    struct page_info *page;
 
     if (d != t)
         rc = domain_has_perm(d, t, SECCLASS_MMU, MMU__REMOTE_REMAP);
@@ -1333,7 +1334,8 @@ static int flask_mmu_normal_update(struc
         map_perms |= MMU__MAP_WRITE;
 
     AVC_AUDIT_DATA_INIT(&ad, MEMORY);
-    fmfn = get_gfn_untyped(f, l1e_get_pfn(l1e_from_intpte(fpte)));
+    page = get_page_from_gfn(f, l1e_get_pfn(l1e_from_intpte(fpte)), P2M_ALLOC);
+    mfn = page ? page_to_mfn(page) : INVALID_MFN;
 
     ad.sdom = d;
     ad.tdom = f;
@@ -1342,7 +1344,8 @@ static int flask_mmu_normal_update(struc
 
     rc = get_mfn_sid(fmfn, &fsid);
 
-    put_gfn(f, fmfn);
+    if ( page )
+        put_page(page);
 
     if ( rc )
         return rc;

--zYM0uCDKw75PZbzx
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

--zYM0uCDKw75PZbzx--


