From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2239 invoked by alias); 28 Jan 2009 08:40:16 -0000 Received: (qmail 2192 invoked by uid 22791); 28 Jan 2009 08:40:05 -0000 X-SWARE-Spam-Status: No, hits=-0.3 required=5.0 tests=AWL,BAYES_50,J_CHICKENPOX_44,SARE_MSGID_LONG40,SPF_PASS X-Spam-Check-By: sourceware.org Received: from smtp-out.google.com (HELO smtp-out.google.com) (216.239.33.17) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 28 Jan 2009 08:39:56 +0000 Received: from wpaz24.hot.corp.google.com (wpaz24.hot.corp.google.com [172.24.198.88]) by smtp-out.google.com with ESMTP id n0S8doai016281 for ; Wed, 28 Jan 2009 08:39:51 GMT Received: from rv-out-0506.google.com (rvbg9.prod.google.com [10.140.83.9]) by wpaz24.hot.corp.google.com with ESMTP id n0S8dY4R012612 for ; Wed, 28 Jan 2009 00:39:48 -0800 Received: by rv-out-0506.google.com with SMTP id g9so1677033rvb.6 for ; Wed, 28 Jan 2009 00:39:47 -0800 (PST) MIME-Version: 1.0 Received: by 10.141.99.2 with SMTP id b2mr3281316rvm.3.1233131987336; Wed, 28 Jan 2009 00:39:47 -0800 (PST) In-Reply-To: <200901271715.49852.pedro@codesourcery.com> References: <20090126230013.5C7F01C72DE@localhost> <200901271715.49852.pedro@codesourcery.com> Date: Wed, 28 Jan 2009 12:39:00 -0000 Message-ID: Subject: Re: [RFA] amd64 displaced stepping support From: Doug Evans To: Pedro Alves Cc: gdb-patches@sourceware.org Content-Type: multipart/mixed; boundary=000e0cd1b57a110078046186ea16 X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-01/txt/msg00524.txt.bz2 --000e0cd1b57a110078046186ea16 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-length: 15945 On Tue, Jan 27, 2009 at 9:15 AM, Pedro Alves wrote: > On Monday 26 January 2009 23:00:12, Doug Evans wrote: >> Hi. I took a crack at implementing displaced stepping support for amd64. > > Great! Thank you so much for this. > >> I think the GNU tools need a general-purpose library of ISA-related tools. > > Right, opcodes <-> gdb could cooperate better, in several ways. > >> Until then, I went with the disassembler. The code is laid out such that >> when a better implementation of computing insn lengths comes along, it >> can be easily dropped in. > > Err, well, did you consider adding the needed interfaces to libopcodes? > It's what we use to implement the disassembler anyway... I'd like to add the needed interfaces. I'm just not sure how long a process that will be and I'd like to get started on exercising amd64 non-stop functionality. I'll pursue exporting the modrm_bytes arrays and insn-length computation with binutils. > >> (rex_prefix_p,amd64_insn_length_fprintf,amd64_insn_length_init_dis, >> amd64_insn_length,amd64_get_unused_input_int_reg,fixup_riprel, > > On the nitpicking department, the standard tells us to split these lines > as: > > (rex_prefix_p,amd64_insn_length_fprintf,amd64_insn_length_init_dis) > (amd64_insn_length,amd64_get_unused_input_int_reg,fixup_riprel) > (foo): Base. > > Emacs loves this form better too. > >> amd64_displaced_step_fixup): New fns. > > Are you really that lazy? :-) Please spell out "fns", and avoid everyone > else the extra cycles to expand that. ok. > >> +/* ??? *_has_modrm are copies of the tables in ../opcodes/i386-dis.c. >> + It might be nice if we could use them. >> + ??? This differs from the kernel version, is one of them out of date? */ > > Yes, looks like it. It is safe to assume that the opcodes version is more > up to date, as it gets updated to reflect new cpus frequently, by the Intel > and AMD folks, at least. I assumed so, but didn't actually know. > In any case, comments like this are no good, as they're doomed to get out of > date at some point themselves too. Better say, "please keep this in > sync with ... foo". If not addressing this duplication yourself, please > do open a PR about it. This will surelly end up out of date at > some point... I've modified the comment to be a warning. >> +/* Return the length in bytes of INSN. >> + MAX_LEN is the size of the buffer containing INSN >> + ??? The GNU tools need a library of basic ISA-related support. >> + Until then we use the disassembler. */ > > ... Why not say something like "Unfortunately, libopcodes doesn't export > a simpler way to query the length of instruction at a given address. We > use the disassembler interface to do that." ... The attached patch has a different wording. >> +static int >> +amd64_insn_length (const gdb_byte *insn, int max_len, CORE_ADDR addr) >> +{ >> + struct disassemble_info di; >> + struct gdbarch *gdbarch = current_gdbarch; > > Ouch, CURRENT_GDBARCH red alert. From what I can tell, you have a gdbarch > available to use. amd64_displaced_step_copy_insn gets a gdbarch* passed in > as parameter, so you can pass it to fixup_displaced_copy, and then > to fixup_riprel, which then can pass it here. Can you do that please? righto. >> +/* Return an integer register (other than RSP) that is unused as an input >> + operand in INSN. >> + MAX_LEN is the size of the buffer containing INSN. >> + OPCODE_OFFSET is the offset of the first opcode byte. >> + OPCODE_LEN is the number of opcode bytes. >> + MODRM_OFFSET is the offset of the ModRM byte or -1 if not present. >> + In order to not require adding a rex prefix if the insn doesn't already >> + have one, the result is restricted to RAX ... RDI, sans RSP. >> + The register numbering of the result follows architecture ordering, >> + e.g. RDI = 7. >> + >> + ??? The GNU tools need a library of basic ISA-related support. */ > > >> + /* We shouldn't get here. */ >> + gdb_assert (0); > > Use internal_error instead, please. Ah, righto. >> +static void >> +fixup_riprel (struct displaced_step_closure *dsc, CORE_ADDR from, CORE_ADDR to, >> + struct regcache *regs) >> +{ >> + int modrm_offset = dsc->modrm_offset; >> + gdb_byte *insn = dsc->insn_buf + modrm_offset; >> + CORE_ADDR rip_base; >> + int32_t disp; >> + int insn_length; >> + int arch_tmp_regno, tmp_regno; >> + ULONGEST orig_value; >> + >> + /* %rip+disp32 addressing mode, displacement follows ModRM byte. */ >> + ++insn; >> + > >> + /* Compute the rip-relative address. */ >> + disp = *(int32_t*) insn; // FIXME: target-fetch-value > > Err, that will cause unaligned traps on some hosts (this is a tdep file, not > a nat file). Please fix that up. Ya, oops. That one I intended to fix but forgot about. Fixed. >> + insn_length = amd64_insn_length (dsc->insn_buf, dsc->max_len, from); >> + rip_base = from + insn_length; >> + >> + /* We need a register to hold the address. >> + Pick one not used in the insn. >> + NOTE: arch_tmp_regno uses architecture ordering, e.g. RDI = 7. */ >> + arch_tmp_regno = amd64_get_unused_input_int_reg (dsc->insn_buf, dsc->max_len, >> + dsc->opcode_offset, >> + dsc->opcode_len, >> + dsc->modrm_offset); >> + tmp_regno = amd64_arch_reg_to_regnum (arch_tmp_regno); >> + >> + /* REX.B should be unset as we were using rip-relative addressing, >> + but ensure it's unset anyway, tmp_regno is not r8-r15. */ >> + if (dsc->rex_offset != -1) >> + dsc->insn_buf[dsc->rex_offset] &= ~1; >> + >> + regcache_cooked_read_unsigned (regs, tmp_regno, &orig_value); >> + dsc->tmp_regno = tmp_regno; >> + dsc->tmp_save = orig_value; >> + dsc->tmp_used = 1; >> + >> + /* Convert the ModRM field to be base+disp. */ >> + dsc->insn_buf[modrm_offset] &= ~0xc7; >> + dsc->insn_buf[modrm_offset] |= 0x80 + arch_tmp_regno; >> + >> + regcache_cooked_write_unsigned (regs, tmp_regno, rip_base); >> + >> + if (debug_displaced) >> + fprintf_unfiltered (gdb_stdlog, "displaced: %%rip-relative addressing used.\n" >> + "displaced: using temp reg %d, old value 0x%s, new value 0x%s\n", >> + dsc->tmp_regno, paddr_nz (dsc->tmp_save), >> + paddr_nz (rip_base)); >> +} >> + >> +static void >> +fixup_displaced_copy (struct displaced_step_closure *dsc, >> + CORE_ADDR from, CORE_ADDR to, struct regcache *regs) >> +{ >> + gdb_byte *insn = dsc->insn_buf; >> + int len = dsc->max_len; >> + gdb_byte *start = insn; >> + gdb_byte *end = insn + len; >> + int need_modrm; >> + >> + /* Skip legacy instruction prefixes. >> + While the kernel's kprobes support can assume the instruction is valid, >> + we can't. Don't crash if we see an invalid insn. */ > > Yeah, we'd better warn/error out to the user than to do something silly > with instructions we don't know what to do with. Should we be checking > if you've reached >= end somewhere? The code allocates sufficient extra space to obviate having to continually test "are we at the end yet?". A lot of this is copied from i386-tdep.c. If this patch is ok, I'll send patches for i386-tdep.c. > >> + >> + while (insn < end) >> + { >> + switch (*insn) >> + { >> + case 0x66: >> + case 0x67: >> + case 0x2e: >> + case 0x3e: >> + case 0x26: >> + case 0x64: >> + case 0x65: >> + case 0x36: >> + case 0xf0: >> + case 0xf3: >> + case 0xf2: >> + ++insn; >> + continue; >> + } >> + break; >> + } >> + >> + /* Skip REX instruction prefix. */ >> + if (rex_prefix_p (*insn)) >> + { >> + dsc->rex_offset = insn - start; >> + ++insn; >> + } >> + >> + dsc->opcode_offset = insn - start; >> + >> + if (*insn == 0x0f) >> + { >> + /* Two or three-byte opcode. */ >> + ++insn; >> + need_modrm = twobyte_has_modrm[*insn]; >> + >> + /* Check for three-byte opcode. */ >> + if (*insn == 0x38 || *insn == 0x3a) >> + { >> + ++insn; >> + dsc->opcode_len = 3; >> + } >> + else >> + dsc->opcode_len = 2; >> + } >> + else >> + { >> + /* One-byte opcode. */ >> + need_modrm = onebyte_has_modrm[*insn]; >> + dsc->opcode_len = 1; >> + } >> + >> + if (need_modrm) >> + { >> + gdb_byte modrm = *++insn; >> + >> + dsc->modrm_offset = insn - start; >> + >> + if ((modrm & 0xc7) == 0x05) >> + { >> + /* The insn uses rip-relative addressing. >> + Deal with it. */ >> + fixup_riprel (dsc, from, to, regs); >> + } >> + } >> +} >> + > > >> + /* GDB may get control back after the insn after the syscall. >> + If this is a syscall, make sure there's a nop afterwards. */ >> + { >> + int syscall_length; >> >> + if (amd64_syscall_p (buf, &syscall_length)) >> + buf[syscall_length] = 0x90; >> + } > > Weird. Isn't this a kernel bug? It only happens when single-stepping > the syscall insn. E.g., from your testcase, without displaced stepping: > > 58 test_syscall: > 59 syscall > 60 nop > 61 test_syscall_end: > 62 nop > > (gdb) b amd64-disp-step.S:60 > Breakpoint 1 at 0x4004fa: file ../../../src/gdb/testsuite/gdb.arch/amd64-disp-step.S, line 60. > (gdb) r > Starting program: /home/pedro/gdb/baseline/build/gdb/testsuite/gdb.arch/amd64-disp-step > > Breakpoint 1, test_syscall () at ../../../src/gdb/testsuite/gdb.arch/amd64-disp-step.S:60 > 60 nop > Current language: auto; currently asm > > But: > > (gdb) c > Continuing. > > Program exited normally. > (gdb) b 59 > Breakpoint 2 at 0x4004f8: file ../../../src/gdb/testsuite/gdb.arch/amd64-disp-step.S, line 59. > (gdb) r > Starting program: /home/pedro/gdb/baseline/build/gdb/testsuite/gdb.arch/amd64-disp-step > > Breakpoint 2, test_syscall () at ../../../src/gdb/testsuite/gdb.arch/amd64-disp-step.S:59 > 59 syscall > (gdb) c > Continuing. > > Program exited normally. > (gdb) > > GDB did a single-step to get over the "syscall", and missed the breakpoint > at 0x4004fa. > > Again, doing a manual stepi: > > (gdb) r > Starting program: /home/pedro/gdb/baseline/build/gdb/testsuite/gdb.arch/amd64-disp-step > > Breakpoint 2, test_syscall () at ../../../src/gdb/testsuite/gdb.arch/amd64-disp-step.S:59 > 59 syscall > (gdb) del 2 > (gdb) set debug infrun 1 > (gdb) stepi > infrun: clear_proceed_status_thread (process 4322) > infrun: proceed (addr=0xffffffffffffffff, signal=144, step=1) > During symbol reading, incomplete CFI data; unspecified registers (e.g., rax) at 0x7ffff781b0f3. > infrun: resume (step=1, signal=0), trap_expected=0 > infrun: wait_for_inferior (treat_exec_as_sigtrap=0) > infrun: infwait_normal_state > infrun: TARGET_WAITKIND_STOPPED > infrun: stop_pc = 0x4004fb > infrun: stepi/nexti > infrun: stop_stepping > test_syscall_end () at ../../../src/gdb/testsuite/gdb.arch/amd64-disp-step.S:62 > 62 nop > (gdb) stepi > test_syscall_end () at ../../../src/gdb/testsuite/gdb.arch/amd64-disp-step.S:62 > 62 nop > (gdb) p $pc > $1 = (void (*)()) 0x4004fb > (gdb) > > If you replace the nop with something wider, e.g., try stepping over > this: > > mov $0x27,%eax /* getpid */ > syscall > mov $0xff,%eax > nop > > You'll see that the move after the syscall is completely > stepped over, and that is was executed correctly. Ya, this is what I discovered during my experiments to understand this. > Something in the kernel not restoring the trace flag correctly, and > hence stepping one instruction too much? Presumably. > >> +/* ??? Do we need to check for rex prefix in these predicates, or their >> + callers? */ > > The caller should (amd64_displaced_step_fixup), I believe? IIUC, you also > store the prefixes in dsc->insn_buf. Well, that comment refers to the insn predicates like amd64_call_p. Having the caller skip the prefixes muddies their interface. The appended patch does something cleaner. > >> + >> +static int >> +amd64_absolute_jmp_p (gdb_byte *insn) >> +{ >> + /* jmp far (absolute address in operand) */ >> + /* ??? undefined insn actually */ >> + if (insn[0] == 0xea) >> + return 1; > > Indeed, invalid in 64-bit mode. Any reason not to drop it? Dropped. > >> + >> + if (insn[0] == 0xff) >> + { >> + /* jump near, absolute indirect (/4) */ >> + if ((insn[1] & 0x38) == 0x20) >> + return 1; >> + >> + /* jump far, absolute indirect (/5) */ >> + if ((insn[1] & 0x38) == 0x28) >> + return 1; >> + } >> + >> + return 0; >> +} >> + >> +static int >> +amd64_absolute_call_p (gdb_byte *insn) >> +{ >> + /* call far, absolute */ >> + /* ??? undefined insn actually */ >> + if (insn[0] == 0x9a) >> + return 1; >> + > > Same as above. Righto. > >> + if (insn[0] == 0xff) >> + { >> + /* Call near, absolute indirect (/2) */ >> + if ((insn[1] & 0x38) == 0x10) >> + return 1; >> + >> + /* Call far, absolute indirect (/3) */ >> + if ((insn[1] & 0x38) == 0x18) >> + return 1; >> + } >> + >> + return 0; >> +} >> + > >> Index: testsuite/gdb.arch/amd64-disp-step.S >> =================================================================== >> RCS file: testsuite/gdb.arch/amd64-disp-step.S >> diff -N testsuite/gdb.arch/amd64-disp-step.S > >> + Please email any bugs, comments, and/or additions to this file to: >> + bug-gdb@gnu.org > > Hmmm, shoudn't we be stopping using this address? cut-n-paste. Deleted. > >> +gdb_test "set non-stop on" "" >> +gdb_test "show non-stop" "Controlling the inferior in non-stop mode is on.*" > > Please use "set displaced-stepping on" instead. Righto. > >> +# Done, run program to exit. >> + >> +gdb_test "continue" \ >> + ".*Program exited normally.*" \ >> + "continue to exit" >> > > Use gdb_continue_to_end instead. Righto. Ok to check in? [Modulo I need to clear the opcode/i386.h additions with binutils. I'm not sure who to get approval from first.] 2009-01-27 Doug Evans * opcode/i386.h: Add multiple inclusion protection. (EAX_REG_NUM,ECX_REG_NUM,EDX_REGNUM,EBX_REG_NUM,ESI_REG_NUM) (EDI_REG_NUM): New macros. (MODRM_MOD_FIELD,MODRM_REG_FIELD,MODRM_RM_FIELD): New macros. (SIB_SCALE_FIELD,SIB_INDEX_FIELD,SIB_BASE_FIELD): New macros. (REG_PREFIX_P): New macro. * amd64-tdep.h (amd64_displaced_step_copy_insn): Declare. (amd64_displaced_step_fixup): Declare. * amd64-tdep.c: #include opcode/i386.h, dis-asm.h. (amd64_arch_regmap): Move out of amd64_analyze_stack_align and make static global. (amd64_arch_regmap_len): New static global. (amd64_arch_reg_to_regnum): New function. (struct amd64_insn): New struct. (struct displaced_step_closure): New struct. (onebyte_has_modrm,twobyte_has_modrm): New static globals. (rex_prefix_p,skip_prefixes) (amd64_insn_length_fprintf,amd64_insn_length_init_dis) (amd64_insn_length,amd64_get_unused_input_int_reg) (amd64_get_insn_details,fixup_riprel,fixup_displaced_copy) (amd64_displaced_step_copy_insn) (amd64_absolute_jmp_p,amd64_absolute_call_p,amd64_ret_p) (amd64_call_p,amd64_breakpoint_p,amd64_syscall_p) (amd64_displaced_step_fixup): New functions. * amd64-linux-tdep.c: #include arch-utils.h. (amd64_linux_init_abi): Install displaced stepping support. * gdb.arch/amd64-disp-step.S: New file. * gdb.arch/amd64-disp-step.exp: New file. * gdb.arch/i386-disp-step.S: New file. * gdb.arch/i386-disp-step.exp: New file. --000e0cd1b57a110078046186ea16 Content-Type: text/plain; charset=US-ASCII; name="gdb-090128-amd64-disp-step-2.patch.txt" Content-Disposition: attachment; filename="gdb-090128-amd64-disp-step-2.patch.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fqhqs46l0 Content-length: 59829 MjAwOS0wMS0yNyAgRG91ZyBFdmFucyAgPGRqZUBnb29nbGUuY29tPgoKCSog b3Bjb2RlL2kzODYuaDogQWRkIG11bHRpcGxlIGluY2x1c2lvbiBwcm90ZWN0 aW9uLgoJKEVBWF9SRUdfTlVNLEVDWF9SRUdfTlVNLEVEWF9SRUdOVU0sRUJY X1JFR19OVU0sRVNJX1JFR19OVU0pCgkoRURJX1JFR19OVU0pOiBOZXcgbWFj cm9zLgoJKE1PRFJNX01PRF9GSUVMRCxNT0RSTV9SRUdfRklFTEQsTU9EUk1f Uk1fRklFTEQpOiBOZXcgbWFjcm9zLgoJKFNJQl9TQ0FMRV9GSUVMRCxTSUJf SU5ERVhfRklFTEQsU0lCX0JBU0VfRklFTEQpOiBOZXcgbWFjcm9zLgoJKFJF R19QUkVGSVhfUCk6IE5ldyBtYWNyby4KCgkqIGFtZDY0LXRkZXAuaCAoYW1k NjRfZGlzcGxhY2VkX3N0ZXBfY29weV9pbnNuKTogRGVjbGFyZS4KCShhbWQ2 NF9kaXNwbGFjZWRfc3RlcF9maXh1cCk6IERlY2xhcmUuCgkqIGFtZDY0LXRk ZXAuYzogI2luY2x1ZGUgb3Bjb2RlL2kzODYuaCwgZGlzLWFzbS5oLgoJKGFt ZDY0X2FyY2hfcmVnbWFwKTogTW92ZSBvdXQgb2YgYW1kNjRfYW5hbHl6ZV9z dGFja19hbGlnbgoJYW5kIG1ha2Ugc3RhdGljIGdsb2JhbC4KCShhbWQ2NF9h cmNoX3JlZ21hcF9sZW4pOiBOZXcgc3RhdGljIGdsb2JhbC4KCShhbWQ2NF9h cmNoX3JlZ190b19yZWdudW0pOiBOZXcgZnVuY3Rpb24uCgkoc3RydWN0IGFt ZDY0X2luc24pOiBOZXcgc3RydWN0LgoJKHN0cnVjdCBkaXNwbGFjZWRfc3Rl cF9jbG9zdXJlKTogTmV3IHN0cnVjdC4KCShvbmVieXRlX2hhc19tb2RybSx0 d29ieXRlX2hhc19tb2RybSk6IE5ldyBzdGF0aWMgZ2xvYmFscy4KCShyZXhf cHJlZml4X3Asc2tpcF9wcmVmaXhlcykKCShhbWQ2NF9pbnNuX2xlbmd0aF9m cHJpbnRmLGFtZDY0X2luc25fbGVuZ3RoX2luaXRfZGlzKQoJKGFtZDY0X2lu c25fbGVuZ3RoLGFtZDY0X2dldF91bnVzZWRfaW5wdXRfaW50X3JlZykKCShh bWQ2NF9nZXRfaW5zbl9kZXRhaWxzLGZpeHVwX3JpcHJlbCxmaXh1cF9kaXNw bGFjZWRfY29weSkKCShhbWQ2NF9kaXNwbGFjZWRfc3RlcF9jb3B5X2luc24p CgkoYW1kNjRfYWJzb2x1dGVfam1wX3AsYW1kNjRfYWJzb2x1dGVfY2FsbF9w LGFtZDY0X3JldF9wKQoJKGFtZDY0X2NhbGxfcCxhbWQ2NF9icmVha3BvaW50 X3AsYW1kNjRfc3lzY2FsbF9wKQoJKGFtZDY0X2Rpc3BsYWNlZF9zdGVwX2Zp eHVwKTogTmV3IGZ1bmN0aW9ucy4KCSogYW1kNjQtbGludXgtdGRlcC5jOiAj aW5jbHVkZSBhcmNoLXV0aWxzLmguCgkoYW1kNjRfbGludXhfaW5pdF9hYmkp OiBJbnN0YWxsIGRpc3BsYWNlZCBzdGVwcGluZyBzdXBwb3J0LgoKCSogZ2Ri LmFyY2gvYW1kNjQtZGlzcC1zdGVwLlM6IE5ldyBmaWxlLgoJKiBnZGIuYXJj aC9hbWQ2NC1kaXNwLXN0ZXAuZXhwOiBOZXcgZmlsZS4KCSogZ2RiLmFyY2gv aTM4Ni1kaXNwLXN0ZXAuUzogTmV3IGZpbGUuCgkqIGdkYi5hcmNoL2kzODYt ZGlzcC1zdGVwLmV4cDogTmV3IGZpbGUuCgpJbmRleDogaW5jbHVkZS9vcGNv ZGUvaTM4Ni5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9j dnMvc3JjL3NyYy9pbmNsdWRlL29wY29kZS9pMzg2LmgsdgpyZXRyaWV2aW5n IHJldmlzaW9uIDEuNzkKZGlmZiAtdSAtcCAtdSAtcCAtcjEuNzkgaTM4Ni5o Ci0tLSBpbmNsdWRlL29wY29kZS9pMzg2LmgJMyBBcHIgMjAwOCAxNDowMzoy MCAtMDAwMAkxLjc5CisrKyBpbmNsdWRlL29wY29kZS9pMzg2LmgJMjggSmFu IDIwMDkgMDg6MzE6MzQgLTAwMDAKQEAgLTM1LDYgKzM1LDkgQEAKIAogICAg VGhlIGFmZmVjdGVkIG9wY29kZSBtYXAgaXMgZGNlWCwgZGNmWCwgZGVlWCwg ZGVmWC4gICovCiAKKyNpZm5kZWYgT1BDT0RFX0kzODZfSAorI2RlZmluZSBP UENPREVfSTM4Nl9ICisKICNpZm5kZWYgU1lTVjM4Nl9DT01QQVQKIC8qIFNl dCBub24temVybyBmb3IgYnJva2VuLCBjb21wYXRpYmxlIGluc3RydWN0aW9u cy4gIFNldCB0byB6ZXJvIGZvcgogICAgbm9uLWJyb2tlbiBvcGNvZGVzIGF0 IHlvdXIgcGVyaWwuICBnY2MgZ2VuZXJhdGVzIFN5c3RlbVYvMzg2CkBAIC03 Miw4ICs3NSwxNCBAQAogI2RlZmluZSBOT1BfT1BDT0RFIChjaGFyKSAweDkw CiAKIC8qIHJlZ2lzdGVyIG51bWJlcnMgKi8KLSNkZWZpbmUgRUJQX1JFR19O VU0gNQorI2RlZmluZSBFQVhfUkVHX05VTSAwCisjZGVmaW5lIEVDWF9SRUdf TlVNIDEKKyNkZWZpbmUgRURYX1JFR19OVU0gMgorI2RlZmluZSBFQlhfUkVH X05VTSAzCiAjZGVmaW5lIEVTUF9SRUdfTlVNIDQKKyNkZWZpbmUgRUJQX1JF R19OVU0gNQorI2RlZmluZSBFU0lfUkVHX05VTSA2CisjZGVmaW5lIEVESV9S RUdfTlVNIDcKIAogLyogbW9kcm1fYnl0ZS5yZWdtZW0gZm9yIHR3b2J5dGUg ZXNjYXBlICovCiAjZGVmaW5lIEVTQ0FQRV9UT19UV09fQllURV9BRERSRVNT SU5HIEVTUF9SRUdfTlVNCkBAIC04Nyw5ICs5NiwyMiBAQAogI2RlZmluZSBS RUdNRU1fRklFTERfSEFTX1JFRyAweDMvKiBhbHdheXMgPSAweDMgKi8KICNk ZWZpbmUgUkVHTUVNX0ZJRUxEX0hBU19NRU0gKH5SRUdNRU1fRklFTERfSEFT X1JFRykKIAorLyogRXh0cmFjdCBmaWVsZHMgZnJvbSB0aGUgbW9kL3JtIGJ5 dGUuICAqLworI2RlZmluZSBNT0RSTV9NT0RfRklFTEQobW9kcm0pICgoKG1v ZHJtKSA+PiA2KSAmIDMpCisjZGVmaW5lIE1PRFJNX1JFR19GSUVMRChtb2Ry bSkgKCgobW9kcm0pID4+IDMpICYgNykKKyNkZWZpbmUgTU9EUk1fUk1fRklF TEQobW9kcm0pICAoKChtb2RybSkgPj4gMCkgJiA3KQorCisvKiBFeHRyYWN0 IGZpZWxkcyBmcm9tIHRoZSBzaWIgYnl0ZS4gICovCisjZGVmaW5lIFNJQl9T Q0FMRV9GSUVMRChzaWIpICgoKHNpYikgPj4gNikgJiAzKQorI2RlZmluZSBT SUJfSU5ERVhfRklFTEQoc2liKSAoKChzaWIpID4+IDMpICYgNykKKyNkZWZp bmUgU0lCX0JBU0VfRklFTEQoc2liKSAgKCgoc2liKSA+PiAwKSAmIDcpCisK IC8qIHg4Ni02NCBleHRlbnNpb24gcHJlZml4LiAgKi8KICNkZWZpbmUgUkVY X09QQ09ERQkweDQwCiAKKy8qIE5vbi16ZXJvIGlmIE9QQ09ERSBpcyB0aGUg cmV4IHByZWZpeC4gICovCisjZGVmaW5lIFJFWF9QUkVGSVhfUChvcGNvZGUp ICgoKG9wY29kZSkgJiAweGYwKSA9PSBSRVhfT1BDT0RFKQorCiAvKiBJbmRp Y2F0ZXMgNjQgYml0IG9wZXJhbmQgc2l6ZS4gICovCiAjZGVmaW5lIFJFWF9X CTgKIC8qIEhpZ2ggZXh0ZW5zaW9uIHRvIHJlZyBmaWVsZCBvZiBtb2RybSBi eXRlLiAgKi8KQEAgLTExMywzICsxMzUsNSBAQAogCiAvKiBtYXggc2l6ZSBv ZiByZWdpc3RlciBuYW1lIGluIGluc24gbW5lbW9uaWNzLiAgKi8KICNkZWZp bmUgTUFYX1JFR19OQU1FX1NJWkUgOAorCisjZW5kaWYgLyogT1BDT0RFX0kz ODZfSCAqLwpJbmRleDogZ2RiL2FtZDY0LWxpbnV4LXRkZXAuYwo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3ZzL3NyYy9zcmMvZ2RiL2Ft ZDY0LWxpbnV4LXRkZXAuYyx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4yMQpk aWZmIC11IC1wIC11IC1wIC1yMS4yMSBhbWQ2NC1saW51eC10ZGVwLmMKLS0t IGdkYi9hbWQ2NC1saW51eC10ZGVwLmMJMyBKYW4gMjAwOSAwNTo1Nzo1MCAt MDAwMAkxLjIxCisrKyBnZGIvYW1kNjQtbGludXgtdGRlcC5jCTI4IEphbiAy MDA5IDA4OjMxOjM0IC0wMDAwCkBAIC0yMCw2ICsyMCw3IEBACiAgICBhbG9u ZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3 LmdudS5vcmcvbGljZW5zZXMvPi4gICovCiAKICNpbmNsdWRlICJkZWZzLmgi CisjaW5jbHVkZSAiYXJjaC11dGlscy5oIgogI2luY2x1ZGUgImZyYW1lLmgi CiAjaW5jbHVkZSAiZ2RiY29yZS5oIgogI2luY2x1ZGUgInJlZ2NhY2hlLmgi CkBAIC0yODYsNiArMjg3LDE1IEBAIGFtZDY0X2xpbnV4X2luaXRfYWJpIChz dHJ1Y3QgZ2RiYXJjaF9pbmYKICAgLyogRW5hYmxlIFRMUyBzdXBwb3J0LiAg Ki8KICAgc2V0X2dkYmFyY2hfZmV0Y2hfdGxzX2xvYWRfbW9kdWxlX2FkZHJl c3MgKGdkYmFyY2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzdnI0X2ZldGNoX29iamZpbGVfbGlua19tYXApOwor CisgIC8qIERpc3BsYWNlZCBzdGVwcGluZy4gICovCisgIHNldF9nZGJhcmNo X2Rpc3BsYWNlZF9zdGVwX2NvcHlfaW5zbiAoZ2RiYXJjaCwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWQ2NF9kaXNwbGFj ZWRfc3RlcF9jb3B5X2luc24pOworICBzZXRfZ2RiYXJjaF9kaXNwbGFjZWRf c3RlcF9maXh1cCAoZ2RiYXJjaCwgYW1kNjRfZGlzcGxhY2VkX3N0ZXBfZml4 dXApOworICBzZXRfZ2RiYXJjaF9kaXNwbGFjZWRfc3RlcF9mcmVlX2Nsb3N1 cmUgKGdkYmFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgc2ltcGxlX2Rpc3BsYWNlZF9zdGVwX2ZyZWVfY2xvc3Vy ZSk7CisgIHNldF9nZGJhcmNoX2Rpc3BsYWNlZF9zdGVwX2xvY2F0aW9uIChn ZGJhcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgZGlzcGxhY2VkX3N0ZXBfYXRfZW50cnlfcG9pbnQpOwogfQogDAogCklu ZGV4OiBnZGIvYW1kNjQtdGRlcC5jCj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K UkNTIGZpbGU6IC9jdnMvc3JjL3NyYy9nZGIvYW1kNjQtdGRlcC5jLHYKcmV0 cmlldmluZyByZXZpc2lvbiAxLjU2CmRpZmYgLXUgLXAgLXUgLXAgLXIxLjU2 IGFtZDY0LXRkZXAuYwotLS0gZ2RiL2FtZDY0LXRkZXAuYwkzIEphbiAyMDA5 IDA1OjU3OjUwIC0wMDAwCTEuNTYKKysrIGdkYi9hbWQ2NC10ZGVwLmMJMjgg SmFuIDIwMDkgMDg6MzE6MzQgLTAwMDAKQEAgLTIxLDYgKzIxLDggQEAKICAg IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6 Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KIAogI2luY2x1ZGUgImRl ZnMuaCIKKyNpbmNsdWRlICJvcGNvZGUvaTM4Ni5oIgorI2luY2x1ZGUgImRp cy1hc20uaCIKICNpbmNsdWRlICJhcmNoLXV0aWxzLmgiCiAjaW5jbHVkZSAi YmxvY2suaCIKICNpbmNsdWRlICJkdW1teS1mcmFtZS5oIgpAQCAtMjAwLDYg KzIwMiw0MiBAQCBhbWQ2NF9kd2FyZl9yZWdfdG9fcmVnbnVtIChzdHJ1Y3Qg Z2RiYXJjCiAgIHJldHVybiByZWdudW07CiB9CiAKKy8qIE1hcCBhcmNoaXRl Y3R1cmFsIHJlZ2lzdGVyIG51bWJlcnMgdG8gZ2RiIHJlZ2lzdGVyIG51bWJl cnMuICAqLworCitzdGF0aWMgY29uc3QgaW50IGFtZDY0X2FyY2hfcmVnbWFw WzE2XSA9Cit7CisgIEFNRDY0X1JBWF9SRUdOVU0sCS8qICVyYXggKi8KKyAg QU1ENjRfUkNYX1JFR05VTSwJLyogJXJjeCAqLworICBBTUQ2NF9SRFhfUkVH TlVNLAkvKiAlcmR4ICovCisgIEFNRDY0X1JCWF9SRUdOVU0sCS8qICVyYngg Ki8KKyAgQU1ENjRfUlNQX1JFR05VTSwJLyogJXJzcCAqLworICBBTUQ2NF9S QlBfUkVHTlVNLAkvKiAlcmJwICovCisgIEFNRDY0X1JTSV9SRUdOVU0sCS8q ICVyc2kgKi8KKyAgQU1ENjRfUkRJX1JFR05VTSwJLyogJXJkaSAqLworICBB TUQ2NF9SOF9SRUdOVU0sCS8qICVyOCAqLworICBBTUQ2NF9SOV9SRUdOVU0s CS8qICVyOSAqLworICBBTUQ2NF9SMTBfUkVHTlVNLAkvKiAlcjEwICovCisg IEFNRDY0X1IxMV9SRUdOVU0sCS8qICVyMTEgKi8KKyAgQU1ENjRfUjEyX1JF R05VTSwJLyogJXIxMiAqLworICBBTUQ2NF9SMTNfUkVHTlVNLAkvKiAlcjEz ICovCisgIEFNRDY0X1IxNF9SRUdOVU0sCS8qICVyMTQgKi8KKyAgQU1ENjRf UjE1X1JFR05VTQkvKiAlcjE1ICovCit9OworCitzdGF0aWMgY29uc3QgaW50 IGFtZDY0X2FyY2hfcmVnbWFwX2xlbiA9CisgIChzaXplb2YgKGFtZDY0X2Fy Y2hfcmVnbWFwKSAvIHNpemVvZiAoYW1kNjRfYXJjaF9yZWdtYXBbMF0pKTsK KworLyogQ29udmVydCBhcmNoaXRlY3R1cmFsIHJlZ2lzdGVyIG51bWJlciBS RUcgdG8gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyCisgICBudW1iZXIgdXNl ZCBieSBHREIuICAqLworCitzdGF0aWMgaW50CithbWQ2NF9hcmNoX3JlZ190 b19yZWdudW0gKGludCByZWcpCit7CisgIGdkYl9hc3NlcnQgKHJlZyA+PSAw ICYmIHJlZyA8IGFtZDY0X2FyY2hfcmVnbWFwX2xlbik7CisKKyAgcmV0dXJu IGFtZDY0X2FyY2hfcmVnbWFwW3JlZ107Cit9CisKIAwKIAogLyogUmVnaXN0 ZXIgY2xhc3NlcyBhcyBkZWZpbmVkIGluIHRoZSBwc0FCSS4gICovCkBAIC02 NjYsNyArNzA0LDY3OCBAQCBhbWQ2NF9wdXNoX2R1bW15X2NhbGwgKHN0cnVj dCBnZGJhcmNoICpnCiAgIHJldHVybiBzcCArIDE2OwogfQogDAorLyogRGlz cGxhY2VkIGluc3RydWN0aW9uIGhhbmRsaW5nLiAgKi8KKworLyogQSBwYXJ0 aWFsbHkgZGVjb2RlZCBpbnN0cnVjdGlvbi4KKyAgIFRoaXMgY29udGFpbnMg ZW5vdWdoIGRldGFpbHMgZm9yIGRpc3BsYWNlZCBzdGVwcGluZyBwdXJwb3Nl cy4gICovCisKK3N0cnVjdCBhbWQ2NF9pbnNuCit7CisgIC8qIFRoZSBudW1i ZXIgb2Ygb3Bjb2RlIGJ5dGVzLiAgKi8KKyAgaW50IG9wY29kZV9sZW47Cisg IC8qIFRoZSBvZmZzZXQgb2YgdGhlIHJleCBwcmVmaXggb3IgLTEgaWYgbm90 IHByZXNlbnQuICAqLworICBpbnQgcmV4X29mZnNldDsKKyAgLyogVGhlIG9m ZnNldCB0byB0aGUgZmlyc3Qgb3Bjb2RlIGJ5dGUuICAqLworICBpbnQgb3Bj b2RlX29mZnNldDsKKyAgLyogVGhlIG9mZnNldCB0byB0aGUgbW9kcm0gYnl0 ZSBvciAtMSBpZiBub3QgcHJlc2VudC4gICovCisgIGludCBtb2RybV9vZmZz ZXQ7CisKKyAgLyogVGhlIHJhdyBpbnN0cnVjdGlvbi4gICovCisgIGdkYl9i eXRlICpyYXdfaW5zbjsKK307CisKK3N0cnVjdCBkaXNwbGFjZWRfc3RlcF9j bG9zdXJlCit7CisgIC8qIEZvciByaXAtcmVsYXRpdmUgaW5zbnMsIHNhdmVk IGNvcHkgb2YgdGhlIHJlZyB3ZSB1c2UgaW5zdGVhZCBvZiAlcmlwLiAgKi8K KyAgaW50IHRtcF91c2VkOworICBpbnQgdG1wX3JlZ25vOworICBVTE9OR0VT VCB0bXBfc2F2ZTsKKworICAvKiBEZXRhaWxzIG9mIHRoZSBpbnN0cnVjdGlv bi4gICovCisgIHN0cnVjdCBhbWQ2NF9pbnNuIGluc25fZGV0YWlsczsKKwor ICAvKiBBbW91bnQgb2Ygc3BhY2UgYWxsb2NhdGVkIHRvIGluc25fYnVmLiAg Ki8KKyAgaW50IG1heF9sZW47CisKKyAgLyogVGhlIHBvc3NpYmx5IG1vZGlm aWVkIGluc24uCisgICAgIFRoaXMgaXMgYSB2YXJpYWJsZS1sZW5ndGggZmll bGQuICAqLworICBnZGJfYnl0ZSBpbnNuX2J1ZlsxXTsKK307CisKKy8qIFdB Uk5JTkc6IEtlZXAgb25lYnl0ZV9oYXNfbW9kcm0sIHR3b2J5dGVfaGFzX21v ZHJtIGluIHN5bmMgd2l0aAorICAgLi4vb3Bjb2Rlcy9pMzg2LWRpcy5jICh1 bnRpbCBsaWJvcGNvZGVzIGV4cG9ydHMgdGhlbSwgb3IgYW4gYWx0ZXJuYXRp dmUsCisgICBhdCB3aGljaCBwb2ludCBkZWxldGUgdGhlc2UgaW4gZmF2b3Ig b2YgbGlib3Bjb2RlcycgdmVyc2lvbnMpLiAgKi8KKworc3RhdGljIGNvbnN0 IHVuc2lnbmVkIGNoYXIgb25lYnl0ZV9oYXNfbW9kcm1bMjU2XSA9IHsKKyAg LyoJICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZgkgICovCisg IC8qCSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JICAqLwor ICAvKiAwMCAqLyAxLDEsMSwxLDAsMCwwLDAsMSwxLDEsMSwwLDAsMCwwLCAv KiAwMCAqLworICAvKiAxMCAqLyAxLDEsMSwxLDAsMCwwLDAsMSwxLDEsMSww LDAsMCwwLCAvKiAxMCAqLworICAvKiAyMCAqLyAxLDEsMSwxLDAsMCwwLDAs MSwxLDEsMSwwLDAsMCwwLCAvKiAyMCAqLworICAvKiAzMCAqLyAxLDEsMSwx LDAsMCwwLDAsMSwxLDEsMSwwLDAsMCwwLCAvKiAzMCAqLworICAvKiA0MCAq LyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA0MCAqLwor ICAvKiA1MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAv KiA1MCAqLworICAvKiA2MCAqLyAwLDAsMSwxLDAsMCwwLDAsMCwxLDAsMSww LDAsMCwwLCAvKiA2MCAqLworICAvKiA3MCAqLyAwLDAsMCwwLDAsMCwwLDAs MCwwLDAsMCwwLDAsMCwwLCAvKiA3MCAqLworICAvKiA4MCAqLyAxLDEsMSwx LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLCAvKiA4MCAqLworICAvKiA5MCAq LyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA5MCAqLwor ICAvKiBhMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAv KiBhMCAqLworICAvKiBiMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCww LDAsMCwwLCAvKiBiMCAqLworICAvKiBjMCAqLyAxLDEsMCwwLDEsMSwxLDEs MCwwLDAsMCwwLDAsMCwwLCAvKiBjMCAqLworICAvKiBkMCAqLyAxLDEsMSwx LDAsMCwwLDAsMSwxLDEsMSwxLDEsMSwxLCAvKiBkMCAqLworICAvKiBlMCAq LyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBlMCAqLwor ICAvKiBmMCAqLyAwLDAsMCwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMSwxICAv KiBmMCAqLworICAvKgkgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCSAgKi8KKyAgLyoJICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBk IGUgZgkgICovCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0 d29ieXRlX2hhc19tb2RybVsyNTZdID0geworICAvKgkgICAwIDEgMiAzIDQg NSA2IDcgOCA5IGEgYiBjIGQgZSBmCSAgKi8KKyAgLyoJICAgLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkgICovCisgIC8qIDAwICovIDEsMSwx LDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsIC8qIDBmICovCisgIC8qIDEw ICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIDFmICov CisgIC8qIDIwICovIDEsMSwxLDEsMSwxLDEsMCwxLDEsMSwxLDEsMSwxLDEs IC8qIDJmICovCisgIC8qIDMwICovIDAsMCwwLDAsMCwwLDAsMCwxLDAsMSww LDAsMCwwLDAsIC8qIDNmICovCisgIC8qIDQwICovIDEsMSwxLDEsMSwxLDEs MSwxLDEsMSwxLDEsMSwxLDEsIC8qIDRmICovCisgIC8qIDUwICovIDEsMSwx LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIDVmICovCisgIC8qIDYw ICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIDZmICov CisgIC8qIDcwICovIDEsMSwxLDEsMSwxLDEsMCwxLDEsMSwxLDEsMSwxLDEs IC8qIDdmICovCisgIC8qIDgwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCww LDAsMCwwLDAsIC8qIDhmICovCisgIC8qIDkwICovIDEsMSwxLDEsMSwxLDEs MSwxLDEsMSwxLDEsMSwxLDEsIC8qIDlmICovCisgIC8qIGEwICovIDAsMCww LDEsMSwxLDEsMSwwLDAsMCwxLDEsMSwxLDEsIC8qIGFmICovCisgIC8qIGIw ICovIDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwxLDEsMSwxLDEsIC8qIGJmICov CisgIC8qIGMwICovIDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAs IC8qIGNmICovCisgIC8qIGQwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwx LDEsMSwxLDEsIC8qIGRmICovCisgIC8qIGUwICovIDEsMSwxLDEsMSwxLDEs MSwxLDEsMSwxLDEsMSwxLDEsIC8qIGVmICovCisgIC8qIGYwICovIDEsMSwx LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAgIC8qIGZmICovCisgIC8qCSAg IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JICAqLworICAvKgkg ICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmCSAgKi8KK307CisK K3N0YXRpYyBpbnQgYW1kNjRfc3lzY2FsbF9wIChjb25zdCBzdHJ1Y3QgYW1k NjRfaW5zbiAqaW5zbiwgaW50ICpsZW5ndGhwKTsKKworc3RhdGljIGludAor cmV4X3ByZWZpeF9wIChnZGJfYnl0ZSBwZngpCit7CisgIHJldHVybiBSRVhf UFJFRklYX1AgKHBmeCk7Cit9CisKKy8qIFNraXAgdGhlIGxlZ2FjeSBpbnN0 cnVjdGlvbiBwcmVmaXhlcyBpbiBJTlNOLgorICAgV2UgYXNzdW1lIElOU04g aXMgcHJvcGVybHkgc2VudGluZWxlZCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdv cnJ5CisgICBhYm91dCBmYWxsaW5nIG9mZiB0aGUgZW5kIG9mIHRoZSBidWZm ZXIuICAqLworCitzdGF0aWMgZ2RiX2J5dGUgKgorc2tpcF9wcmVmaXhlcyAo Z2RiX2J5dGUgKmluc24pCit7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAg IHN3aXRjaCAoKmluc24pCisJeworCWNhc2UgREFUQV9QUkVGSVhfT1BDT0RF OgorCWNhc2UgQUREUl9QUkVGSVhfT1BDT0RFOgorCWNhc2UgQ1NfUFJFRklY X09QQ09ERToKKwljYXNlIERTX1BSRUZJWF9PUENPREU6CisJY2FzZSBFU19Q UkVGSVhfT1BDT0RFOgorCWNhc2UgRlNfUFJFRklYX09QQ09ERToKKwljYXNl IEdTX1BSRUZJWF9PUENPREU6CisJY2FzZSBTU19QUkVGSVhfT1BDT0RFOgor CWNhc2UgTE9DS19QUkVGSVhfT1BDT0RFOgorCWNhc2UgUkVQRV9QUkVGSVhf T1BDT0RFOgorCWNhc2UgUkVQTkVfUFJFRklYX09QQ09ERToKKwkgICsraW5z bjsKKwkgIGNvbnRpbnVlOworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9Cisg ICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIGluc247Cit9CisKKy8q IGZwcmludGYtZnVuY3Rpb24gZm9yIGFtZDY0X2luc25fbGVuZ3RoLgorICAg VGhpcyBmdW5jdGlvbiBpcyBhIG5vcCwgd2UgZG9uJ3Qgd2FudCB0byBwcmlu dCBhbnl0aGluZywgd2UganVzdCB3YW50IHRvCisgICBjb21wdXRlIHRoZSBs ZW5ndGggb2YgdGhlIGluc24uICAqLworCitzdGF0aWMgaW50IEFUVFJfRk9S TUFUIChwcmludGYsIDIsIDMpCithbWQ2NF9pbnNuX2xlbmd0aF9mcHJpbnRm ICh2b2lkICpzdHJlYW0sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorewor ICByZXR1cm4gMDsKK30KKworLyogSW5pdGlhbGl6ZSBhIHN0cnVjdCBkaXNh c3NlbWJsZV9pbmZvIGZvciBhbWQ2NF9pbnNuX2xlbmd0aC4JKi8KKworc3Rh dGljIHZvaWQKK2FtZDY0X2luc25fbGVuZ3RoX2luaXRfZGlzIChzdHJ1Y3Qg Z2RiYXJjaCAqZ2RiYXJjaCwKKwkJCSAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVf aW5mbyAqZGksCisJCQkgICAgY29uc3QgZ2RiX2J5dGUgKmluc24sIGludCBt YXhfbGVuLAorCQkJICAgIENPUkVfQUREUiBhZGRyKQoreworICBpbml0X2Rp c2Fzc2VtYmxlX2luZm8gKGRpLCBOVUxMLCBhbWQ2NF9pbnNuX2xlbmd0aF9m cHJpbnRmKTsKKworICAvKiBpbml0X2Rpc2Fzc2VtYmxlX2luZm8gaW5zdGFs bHMgYnVmZmVyX3JlYWRfbWVtb3J5LCBldGMuCisgICAgIHNvIHdlIGRvbid0 IG5lZWQgdG8gZG8gdGhhdCBoZXJlLgorICAgICBUaGUgY2FzdCBpcyBuZWNl c3NhcnkgdW50aWwgZGlzYXNzZW1ibGVfaW5mbyBpcyBjb25zdC1pZmllZC4g ICovCisgIGRpLT5idWZmZXIgPSAoZ2RiX2J5dGUgKikgaW5zbjsKKyAgZGkt PmJ1ZmZlcl9sZW5ndGggPSBtYXhfbGVuOworICBkaS0+YnVmZmVyX3ZtYSA9 IGFkZHI7CisKKyAgZGktPmFyY2ggPSBnZGJhcmNoX2JmZF9hcmNoX2luZm8g KGdkYmFyY2gpLT5hcmNoOworICBkaS0+bWFjaCA9IGdkYmFyY2hfYmZkX2Fy Y2hfaW5mbyAoZ2RiYXJjaCktPm1hY2g7CisgIGRpLT5lbmRpYW4gPSBnZGJh cmNoX2J5dGVfb3JkZXIgKGdkYmFyY2gpOworICBkaS0+ZW5kaWFuX2NvZGUg PSBnZGJhcmNoX2J5dGVfb3JkZXJfZm9yX2NvZGUgKGdkYmFyY2gpOworCisg IGRpc2Fzc2VtYmxlX2luaXRfZm9yX3RhcmdldCAoZGkpOworfQorCisvKiBS ZXR1cm4gdGhlIGxlbmd0aCBpbiBieXRlcyBvZiBJTlNOLgorICAgTUFYX0xF TiBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgSU5TTi4K KyAgIGxpYm9wY29kZXMgY3VycmVudGx5IGRvZXNuJ3QgZXhwb3J0IGEgdXRp bGl0eSB0byBjb21wdXRlIHRoZQorICAgaW5zdHJ1Y3Rpb24gbGVuZ3RoLCBz byB1c2UgdGhlIGRpc2Fzc2VtYmxlciB1bnRpbCB0aGVuLiAgKi8KKworc3Rh dGljIGludAorYW1kNjRfaW5zbl9sZW5ndGggKHN0cnVjdCBnZGJhcmNoICpn ZGJhcmNoLAorCQkgICBjb25zdCBnZGJfYnl0ZSAqaW5zbiwgaW50IG1heF9s ZW4sIENPUkVfQUREUiBhZGRyKQoreworICBzdHJ1Y3QgZGlzYXNzZW1ibGVf aW5mbyBkaTsKKworICBhbWQ2NF9pbnNuX2xlbmd0aF9pbml0X2RpcyAoZ2Ri YXJjaCwgJmRpLCBpbnNuLCBtYXhfbGVuLCBhZGRyKTsKKworICByZXR1cm4g Z2RiYXJjaF9wcmludF9pbnNuIChnZGJhcmNoLCBhZGRyLCAmZGkpOworfQor CisvKiBSZXR1cm4gYW4gaW50ZWdlciByZWdpc3RlciAob3RoZXIgdGhhbiBS U1ApIHRoYXQgaXMgdW51c2VkIGFzIGFuIGlucHV0CisgICBvcGVyYW5kIGlu IElOU04uCisgICBJbiBvcmRlciB0byBub3QgcmVxdWlyZSBhZGRpbmcgYSBy ZXggcHJlZml4IGlmIHRoZSBpbnNuIGRvZXNuJ3QgYWxyZWFkeQorICAgaGF2 ZSBvbmUsIHRoZSByZXN1bHQgaXMgcmVzdHJpY3RlZCB0byBSQVggLi4uIFJE SSwgc2FucyBSU1AuCisgICBUaGUgcmVnaXN0ZXIgbnVtYmVyaW5nIG9mIHRo ZSByZXN1bHQgZm9sbG93cyBhcmNoaXRlY3R1cmUgb3JkZXJpbmcsCisgICBl LmcuIFJESSA9IDcuICAqLworCitzdGF0aWMgaW50CithbWQ2NF9nZXRfdW51 c2VkX2lucHV0X2ludF9yZWcgKGNvbnN0IHN0cnVjdCBhbWQ2NF9pbnNuICpk ZXRhaWxzKQoreworICAvKiAxIGJpdCBmb3IgZWFjaCByZWcgKi8KKyAgaW50 IHVzZWRfcmVnc19tYXNrID0gMDsKKworICAvKiBUaGVyZSBjYW4gYmUgYXQg bW9zdCAzIGludCByZWdzIHVzZWQgYXMgaW5wdXRzIGluIGFuIGluc24sIGFu ZCB3ZSBoYXZlCisgICAgIDcgdG8gY2hvb3NlIGZyb20gKFJBWCAuLi4gUkRJ LCBzYW5zIFJTUCkuCisgICAgIFRoaXMgYWxsb3dzIHVzIHRvIHRha2UgYSBj b25zZXJ2YXRpdmUgYXBwcm9hY2ggYW5kIGtlZXAgdGhpbmdzIHNpbXBsZS4K KyAgICAgRS5nLiBCeSBhdm9pZGluZyBSQVgsIHdlIGRvbid0IGhhdmUgdG8g c3BlY2lmaWNhbGx5IHdhdGNoIGZvciBvcGNvZGVzCisgICAgIHRoYXQgaW1w bGljaXRseSBzcGVjaWZ5IFJBWC4gICovCisKKyAgLyogQXZvaWQgUkFYLiAg Ki8KKyAgdXNlZF9yZWdzX21hc2sgfD0gMSA8PCBFQVhfUkVHX05VTTsKKyAg LyogU2ltaWxhcmlseSBhdm9pZCBSRFgsIGltcGxpY2l0IG9wZXJhbmQgaW4g ZGl2aWRlcy4gICovCisgIHVzZWRfcmVnc19tYXNrIHw9IDEgPDwgRURYX1JF R19OVU07CisgIC8qIEF2b2lkIFJTUC4gICovCisgIHVzZWRfcmVnc19tYXNr IHw9IDEgPDwgRVNQX1JFR19OVU07CisKKyAgLyogSWYgdGhlIG9wY29kZSBp cyBvbmUgYnl0ZSBsb25nIGFuZCB0aGVyZSdzIG5vIE1vZFJNIGJ5dGUsCisg ICAgIGFzc3VtZSB0aGUgb3Bjb2RlIHNwZWNpZmllcyBhIHJlZ2lzdGVyLiAg Ki8KKyAgaWYgKGRldGFpbHMtPm9wY29kZV9sZW4gPT0gMSAmJiBkZXRhaWxz LT5tb2RybV9vZmZzZXQgPT0gLTEpCisgICAgdXNlZF9yZWdzX21hc2sgfD0g MSA8PCAoZGV0YWlscy0+cmF3X2luc25bZGV0YWlscy0+b3Bjb2RlX29mZnNl dF0gJiA3KTsKKworICAvKiBNYXJrIHVzZWQgcmVncyBpbiB0aGUgbW9kcm0v c2liIGJ5dGVzLiAgKi8KKyAgaWYgKGRldGFpbHMtPm1vZHJtX29mZnNldCAh PSAtMSkKKyAgICB7CisgICAgICBpbnQgbW9kcm0gPSBkZXRhaWxzLT5yYXdf aW5zbltkZXRhaWxzLT5tb2RybV9vZmZzZXRdOworICAgICAgaW50IG1vZCA9 IE1PRFJNX01PRF9GSUVMRCAobW9kcm0pOworICAgICAgaW50IHJlZyA9IE1P RFJNX1JFR19GSUVMRCAobW9kcm0pOworICAgICAgaW50IHJtID0gTU9EUk1f Uk1fRklFTEQgKG1vZHJtKTsKKyAgICAgIGludCBoYXZlX3NpYiA9IG1vZCAh PSAzICYmIHJtID09IDQ7CisKKyAgICAgIC8qIEFzc3VtZSB0aGUgcmVnIGZp ZWxkIG9mIHRoZSBtb2RybSBieXRlIHNwZWNpZmllcyBhIHJlZ2lzdGVyLiAg Ki8KKyAgICAgIHVzZWRfcmVnc19tYXNrIHw9IDEgPDwgKChtb2RybSA+PiAz KSAmIDMpOworCisgICAgICBpZiAoaGF2ZV9zaWIpCisJeworCSAgaW50IGJh c2UgPSBTSUJfQkFTRV9GSUVMRCAoZGV0YWlscy0+cmF3X2luc25bZGV0YWls cy0+bW9kcm1fb2Zmc2V0ICsgMV0pOworCSAgaW50IGluZGV4ID0gU0lCX0lO REVYX0ZJRUxEIChkZXRhaWxzLT5yYXdfaW5zbltkZXRhaWxzLT5tb2RybV9v ZmZzZXQgKyAxXSk7CisJICB1c2VkX3JlZ3NfbWFzayB8PSAxIDw8IGJhc2U7 CisJICB1c2VkX3JlZ3NfbWFzayB8PSAxIDw8IGluZGV4OworCX0KKyAgICAg IGVsc2UKKwl7CisJICB1c2VkX3JlZ3NfbWFzayB8PSAxIDw8IHJtOworCX0K KyAgICB9CisKKyAgZ2RiX2Fzc2VydCAodXNlZF9yZWdzX21hc2sgPCAyNTYp OworICBnZGJfYXNzZXJ0ICh1c2VkX3JlZ3NfbWFzayAhPSAyNTUpOworCisg IC8qIEZpbmFsbHksIGZpbmQgYSBmcmVlIHJlZy4gICovCisgIHsKKyAgICBp bnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpCisgICAgICB7 CisJaWYgKCEgKHVzZWRfcmVnc19tYXNrICYgKDEgPDwgaSkpKQorCSAgcmV0 dXJuIGk7CisgICAgICB9CisKKyAgICAvKiBXZSBzaG91bGRuJ3QgZ2V0IGhl cmUuICAqLworICAgIGludGVybmFsX2Vycm9yIChfX0ZJTEVfXywgX19MSU5F X18sIF8oInVuYWJsZSB0byBmaW5kIGZyZWUgcmVnIikpOworICB9Cit9CisK Ky8qIEV4dHJhY3QgdGhlIGRldGFpbHMgb2YgSU5TTiB0aGF0IHdlIG5lZWQu ICAqLworCitzdGF0aWMgdm9pZAorYW1kNjRfZ2V0X2luc25fZGV0YWlscyAo Z2RiX2J5dGUgKmluc24sIHN0cnVjdCBhbWQ2NF9pbnNuICpkZXRhaWxzKQor eworICBnZGJfYnl0ZSAqc3RhcnQgPSBpbnNuOworICBpbnQgbmVlZF9tb2Ry bTsKKworICBkZXRhaWxzLT5yYXdfaW5zbiA9IGluc247CisKKyAgZGV0YWls cy0+b3Bjb2RlX2xlbiA9IC0xOworICBkZXRhaWxzLT5yZXhfb2Zmc2V0ID0g LTE7CisgIGRldGFpbHMtPm9wY29kZV9vZmZzZXQgPSAtMTsKKyAgZGV0YWls cy0+bW9kcm1fb2Zmc2V0ID0gLTE7CisKKyAgLyogU2tpcCBsZWdhY3kgaW5z dHJ1Y3Rpb24gcHJlZml4ZXMuICAqLworICBpbnNuID0gc2tpcF9wcmVmaXhl cyAoaW5zbik7CisKKyAgLyogU2tpcCBSRVggaW5zdHJ1Y3Rpb24gcHJlZml4 LiAgKi8KKyAgaWYgKHJleF9wcmVmaXhfcCAoKmluc24pKQorICAgIHsKKyAg ICAgIGRldGFpbHMtPnJleF9vZmZzZXQgPSBpbnNuIC0gc3RhcnQ7CisgICAg ICArK2luc247CisgICAgfQorCisgIGRldGFpbHMtPm9wY29kZV9vZmZzZXQg PSBpbnNuIC0gc3RhcnQ7CisKKyAgaWYgKCppbnNuID09IFRXT19CWVRFX09Q Q09ERV9FU0NBUEUpCisgICAgeworICAgICAgLyogVHdvIG9yIHRocmVlLWJ5 dGUgb3Bjb2RlLiAgKi8KKyAgICAgICsraW5zbjsKKyAgICAgIG5lZWRfbW9k cm0gPSB0d29ieXRlX2hhc19tb2RybVsqaW5zbl07CisKKyAgICAgIC8qIENo ZWNrIGZvciB0aHJlZS1ieXRlIG9wY29kZS4gICovCisgICAgICBpZiAoKmlu c24gPT0gMHgzOCB8fCAqaW5zbiA9PSAweDNhKQorCXsKKwkgICsraW5zbjsK KwkgIGRldGFpbHMtPm9wY29kZV9sZW4gPSAzOworCX0KKyAgICAgIGVsc2UK KwlkZXRhaWxzLT5vcGNvZGVfbGVuID0gMjsKKyAgICB9CisgIGVsc2UKKyAg ICB7CisgICAgICAvKiBPbmUtYnl0ZSBvcGNvZGUuICAqLworICAgICAgbmVl ZF9tb2RybSA9IG9uZWJ5dGVfaGFzX21vZHJtWyppbnNuXTsKKyAgICAgIGRl dGFpbHMtPm9wY29kZV9sZW4gPSAxOworICAgIH0KKworICBpZiAobmVlZF9t b2RybSkKKyAgICB7CisgICAgICArK2luc247CisgICAgICBkZXRhaWxzLT5t b2RybV9vZmZzZXQgPSBpbnNuIC0gc3RhcnQ7CisgICAgfQorfQorCisvKiBV cGRhdGUgJXJpcC1yZWxhdGl2ZSBhZGRyZXNzaW5nIGluIElOU04uCisKKyAg ICVyaXAtcmVsYXRpdmUgYWRkcmVzc2luZyBvbmx5IHVzZXMgYSAzMi1iaXQg ZGlzcGxhY2VtZW50LgorICAgMzIgYml0cyBpcyBub3QgZW5vdWdoIHRvIGJl IGd1YXJhbnRlZWQgdG8gY292ZXIgdGhlIGRpc3RhbmNlIGJldHdlZW4gd2hl cmUKKyAgIHRoZSByZWFsIGluc3RydWN0aW9uIGlzIGFuZCB3aGVyZSBpdHMg Y29weSBpcy4KKyAgIENvbnZlcnQgdGhlIGluc24gdG8gdXNlIGJhc2UrZGlz cCBhZGRyZXNzaW5nLgorICAgV2Ugc2V0IGJhc2UgPSBwYyArIGluc25fbGVu Z3RoIHNvIHdlIGNhbiBsZWF2ZSBkaXNwIHVuY2hhbmdlZC4gICovCisKK3N0 YXRpYyB2b2lkCitmaXh1cF9yaXByZWwgKHN0cnVjdCBnZGJhcmNoICpnZGJh cmNoLCBzdHJ1Y3QgZGlzcGxhY2VkX3N0ZXBfY2xvc3VyZSAqZHNjLAorCSAg ICAgIENPUkVfQUREUiBmcm9tLCBDT1JFX0FERFIgdG8sIHN0cnVjdCByZWdj YWNoZSAqcmVncykKK3sKKyAgY29uc3Qgc3RydWN0IGFtZDY0X2luc24gKmlu c25fZGV0YWlscyA9ICZkc2MtPmluc25fZGV0YWlsczsKKyAgaW50IG1vZHJt X29mZnNldCA9IGluc25fZGV0YWlscy0+bW9kcm1fb2Zmc2V0OworICBnZGJf Ynl0ZSAqaW5zbiA9IGluc25fZGV0YWlscy0+cmF3X2luc24gKyBtb2RybV9v ZmZzZXQ7CisgIENPUkVfQUREUiByaXBfYmFzZTsKKyAgaW50MzJfdCBkaXNw OworICBpbnQgaW5zbl9sZW5ndGg7CisgIGludCBhcmNoX3RtcF9yZWdubywg dG1wX3JlZ25vOworICBVTE9OR0VTVCBvcmlnX3ZhbHVlOworCisgIC8qICVy aXArZGlzcDMyIGFkZHJlc3NpbmcgbW9kZSwgZGlzcGxhY2VtZW50IGZvbGxv d3MgTW9kUk0gYnl0ZS4gICovCisgICsraW5zbjsKKworICAvKiBDb21wdXRl IHRoZSByaXAtcmVsYXRpdmUgYWRkcmVzcy4JKi8KKyAgZGlzcCA9IGV4dHJh Y3Rfc2lnbmVkX2ludGVnZXIgKGluc24sIHNpemVvZiAoaW50MzJfdCkpOwor ICBpbnNuX2xlbmd0aCA9IGFtZDY0X2luc25fbGVuZ3RoIChnZGJhcmNoLCBk c2MtPmluc25fYnVmLCBkc2MtPm1heF9sZW4sIGZyb20pOworICByaXBfYmFz ZSA9IGZyb20gKyBpbnNuX2xlbmd0aDsKKworICAvKiBXZSBuZWVkIGEgcmVn aXN0ZXIgdG8gaG9sZCB0aGUgYWRkcmVzcy4KKyAgICAgUGljayBvbmUgbm90 IHVzZWQgaW4gdGhlIGluc24uCisgICAgIE5PVEU6IGFyY2hfdG1wX3JlZ25v IHVzZXMgYXJjaGl0ZWN0dXJlIG9yZGVyaW5nLCBlLmcuIFJESSA9IDcuICAq LworICBhcmNoX3RtcF9yZWdubyA9IGFtZDY0X2dldF91bnVzZWRfaW5wdXRf aW50X3JlZyAoaW5zbl9kZXRhaWxzKTsKKyAgdG1wX3JlZ25vID0gYW1kNjRf YXJjaF9yZWdfdG9fcmVnbnVtIChhcmNoX3RtcF9yZWdubyk7CisKKyAgLyog UkVYLkIgc2hvdWxkIGJlIHVuc2V0IGFzIHdlIHdlcmUgdXNpbmcgcmlwLXJl bGF0aXZlIGFkZHJlc3NpbmcsCisgICAgIGJ1dCBlbnN1cmUgaXQncyB1bnNl dCBhbnl3YXksIHRtcF9yZWdubyBpcyBub3QgcjgtcjE1LiAgKi8KKyAgaWYg KGluc25fZGV0YWlscy0+cmV4X29mZnNldCAhPSAtMSkKKyAgICBkc2MtPmlu c25fYnVmW2luc25fZGV0YWlscy0+cmV4X29mZnNldF0gJj0gflJFWF9COwor CisgIHJlZ2NhY2hlX2Nvb2tlZF9yZWFkX3Vuc2lnbmVkIChyZWdzLCB0bXBf cmVnbm8sICZvcmlnX3ZhbHVlKTsKKyAgZHNjLT50bXBfcmVnbm8gPSB0bXBf cmVnbm87CisgIGRzYy0+dG1wX3NhdmUgPSBvcmlnX3ZhbHVlOworICBkc2Mt PnRtcF91c2VkID0gMTsKKworICAvKiBDb252ZXJ0IHRoZSBNb2RSTSBmaWVs ZCB0byBiZSBiYXNlK2Rpc3AuICAqLworICBkc2MtPmluc25fYnVmW21vZHJt X29mZnNldF0gJj0gfjB4Yzc7CisgIGRzYy0+aW5zbl9idWZbbW9kcm1fb2Zm c2V0XSB8PSAweDgwICsgYXJjaF90bXBfcmVnbm87CisKKyAgcmVnY2FjaGVf Y29va2VkX3dyaXRlX3Vuc2lnbmVkIChyZWdzLCB0bXBfcmVnbm8sIHJpcF9i YXNlKTsKKworICBpZiAoZGVidWdfZGlzcGxhY2VkKQorICAgIGZwcmludGZf dW5maWx0ZXJlZCAoZ2RiX3N0ZGxvZywgImRpc3BsYWNlZDogJSVyaXAtcmVs YXRpdmUgYWRkcmVzc2luZyB1c2VkLlxuIgorCQkJImRpc3BsYWNlZDogdXNp bmcgdGVtcCByZWcgJWQsIG9sZCB2YWx1ZSAweCVzLCBuZXcgdmFsdWUgMHgl c1xuIiwKKwkJCWRzYy0+dG1wX3JlZ25vLCBwYWRkcl9ueiAoZHNjLT50bXBf c2F2ZSksCisJCQlwYWRkcl9ueiAocmlwX2Jhc2UpKTsKK30KKworc3RhdGlj IHZvaWQKK2ZpeHVwX2Rpc3BsYWNlZF9jb3B5IChzdHJ1Y3QgZ2RiYXJjaCAq Z2RiYXJjaCwKKwkJICAgICAgc3RydWN0IGRpc3BsYWNlZF9zdGVwX2Nsb3N1 cmUgKmRzYywKKwkJICAgICAgQ09SRV9BRERSIGZyb20sIENPUkVfQUREUiB0 bywgc3RydWN0IHJlZ2NhY2hlICpyZWdzKQoreworICBjb25zdCBzdHJ1Y3Qg YW1kNjRfaW5zbiAqZGV0YWlscyA9ICZkc2MtPmluc25fZGV0YWlsczsKKwor ICBpZiAoZGV0YWlscy0+bW9kcm1fb2Zmc2V0ICE9IC0xKQorICAgIHsKKyAg ICAgIGdkYl9ieXRlIG1vZHJtID0gZGV0YWlscy0+cmF3X2luc25bZGV0YWls cy0+bW9kcm1fb2Zmc2V0XTsKKworICAgICAgaWYgKChtb2RybSAmIDB4Yzcp ID09IDB4MDUpCisJeworCSAgLyogVGhlIGluc24gdXNlcyByaXAtcmVsYXRp dmUgYWRkcmVzc2luZy4KKwkgICAgIERlYWwgd2l0aCBpdC4gICovCisJICBm aXh1cF9yaXByZWwgKGdkYmFyY2gsIGRzYywgZnJvbSwgdG8sIHJlZ3MpOwor CX0KKyAgICB9Cit9CisKK3N0cnVjdCBkaXNwbGFjZWRfc3RlcF9jbG9zdXJl ICoKK2FtZDY0X2Rpc3BsYWNlZF9zdGVwX2NvcHlfaW5zbiAoc3RydWN0IGdk YmFyY2ggKmdkYmFyY2gsCisJCQkJQ09SRV9BRERSIGZyb20sIENPUkVfQURE UiB0bywKKwkJCQlzdHJ1Y3QgcmVnY2FjaGUgKnJlZ3MpCit7CisgIGludCBs ZW4gPSBnZGJhcmNoX21heF9pbnNuX2xlbmd0aCAoZ2RiYXJjaCk7CisgIC8q IEV4dHJhIHNwYWNlIGZvciBzZW50aW5lbHMgc28gZml4dXBfe3JpcHJlbCxk aXNwbGFjZWRfY29weSBkb24ndCBoYXZlIHRvCisgICAgIGNvbnRpbnVhbGx5 IHdhdGNoIGZvciBydW5uaW5nIG9mZiB0aGUgZW5kIG9mIHRoZSBidWZmZXIu ICAqLworICBpbnQgZml4dXBfc2VudGluZWxfc3BhY2UgPSBsZW47CisgIHN0 cnVjdCBkaXNwbGFjZWRfc3RlcF9jbG9zdXJlICpkc2MgPQorICAgIHhtYWxs b2MgKHNpemVvZiAoKmRzYykgKyBsZW4gKyBmaXh1cF9zZW50aW5lbF9zcGFj ZSk7CisgIGdkYl9ieXRlICpidWYgPSAmZHNjLT5pbnNuX2J1ZlswXTsKKyAg c3RydWN0IGFtZDY0X2luc24gKmRldGFpbHMgPSAmZHNjLT5pbnNuX2RldGFp bHM7CisKKyAgZHNjLT50bXBfdXNlZCA9IDA7CisgIGRzYy0+bWF4X2xlbiA9 IGxlbiArIGZpeHVwX3NlbnRpbmVsX3NwYWNlOworCisgIHJlYWRfbWVtb3J5 IChmcm9tLCBidWYsIGxlbik7CisKKyAgLyogU2V0IHVwIHRoZSBzZW50aW5l bCBzcGFjZSBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHJ1bm5p bmcKKyAgICAgb2ZmIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gIEFuIGV4Y2Vz c2l2ZSBudW1iZXIgb2YgbGVhZGluZyBwcmVmaXhlcworICAgICBjb3VsZCBv dGhlcndpc2UgY2F1c2UgdGhpcy4gICovCisgIG1lbXNldCAoYnVmICsgbGVu LCAwLCBmaXh1cF9zZW50aW5lbF9zcGFjZSk7CisKKyAgYW1kNjRfZ2V0X2lu c25fZGV0YWlscyAoYnVmLCBkZXRhaWxzKTsKKworICAvKiBHREIgbWF5IGdl dCBjb250cm9sIGJhY2sgYWZ0ZXIgdGhlIGluc24gYWZ0ZXIgdGhlIHN5c2Nh bGwuCisgICAgIFByZXN1bWFibHkgdGhpcyBpcyBhIGtlcm5lbCBidWcuCisg ICAgIElmIHRoaXMgaXMgYSBzeXNjYWxsLCBtYWtlIHN1cmUgdGhlcmUncyBh IG5vcCBhZnRlcndhcmRzLiAgKi8KKyAgeworICAgIGludCBzeXNjYWxsX2xl bmd0aDsKKworICAgIGlmIChhbWQ2NF9zeXNjYWxsX3AgKGRldGFpbHMsICZz eXNjYWxsX2xlbmd0aCkpCisgICAgICBidWZbZGV0YWlscy0+b3Bjb2RlX29m ZnNldCArIHN5c2NhbGxfbGVuZ3RoXSA9IE5PUF9PUENPREU7CisgIH0KKwor ICAvKiBNb2RpZnkgdGhlIGluc24gdG8gY29wZSB3aXRoIHRoZSBhZGRyZXNz IHdoZXJlIGl0IHdpbGwgYmUgZXhlY3V0ZWQgZnJvbS4KKyAgICAgSW4gcGFy dGljdWxhciwgaGFuZGxlIGFueSByaXAtcmVsYXRpdmUgYWRkcmVzc2luZy4J ICovCisgIGZpeHVwX2Rpc3BsYWNlZF9jb3B5IChnZGJhcmNoLCBkc2MsIGZy b20sIHRvLCByZWdzKTsKKworICB3cml0ZV9tZW1vcnkgKHRvLCBidWYsIGxl bik7CisKKyAgaWYgKGRlYnVnX2Rpc3BsYWNlZCkKKyAgICB7CisgICAgICBm cHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csICJkaXNwbGFjZWQ6IGNv cHkgMHglcy0+MHglczogIiwKKwkJCSAgcGFkZHJfbnogKGZyb20pLCBwYWRk cl9ueiAodG8pKTsKKyAgICAgIGRpc3BsYWNlZF9zdGVwX2R1bXBfYnl0ZXMg KGdkYl9zdGRsb2csIGJ1ZiwgbGVuKTsKKyAgICB9CisKKyAgcmV0dXJuIGRz YzsKK30KKworc3RhdGljIGludAorYW1kNjRfYWJzb2x1dGVfam1wX3AgKGNv bnN0IHN0cnVjdCBhbWQ2NF9pbnNuICpkZXRhaWxzKQoreworICBjb25zdCBn ZGJfYnl0ZSAqaW5zbiA9ICZkZXRhaWxzLT5yYXdfaW5zbltkZXRhaWxzLT5v cGNvZGVfb2Zmc2V0XTsKKworICBpZiAoaW5zblswXSA9PSAweGZmKQorICAg IHsKKyAgICAgIC8qIGp1bXAgbmVhciwgYWJzb2x1dGUgaW5kaXJlY3QgKC80 KSAqLworICAgICAgaWYgKChpbnNuWzFdICYgMHgzOCkgPT0gMHgyMCkKKwly ZXR1cm4gMTsKKworICAgICAgLyoganVtcCBmYXIsIGFic29sdXRlIGluZGly ZWN0ICgvNSkgKi8KKyAgICAgIGlmICgoaW5zblsxXSAmIDB4MzgpID09IDB4 MjgpCisJcmV0dXJuIDE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCitz dGF0aWMgaW50CithbWQ2NF9hYnNvbHV0ZV9jYWxsX3AgKGNvbnN0IHN0cnVj dCBhbWQ2NF9pbnNuICpkZXRhaWxzKQoreworICBjb25zdCBnZGJfYnl0ZSAq aW5zbiA9ICZkZXRhaWxzLT5yYXdfaW5zbltkZXRhaWxzLT5vcGNvZGVfb2Zm c2V0XTsKKworICBpZiAoaW5zblswXSA9PSAweGZmKQorICAgIHsKKyAgICAg IC8qIENhbGwgbmVhciwgYWJzb2x1dGUgaW5kaXJlY3QgKC8yKSAqLworICAg ICAgaWYgKChpbnNuWzFdICYgMHgzOCkgPT0gMHgxMCkKKwlyZXR1cm4gMTsK KworICAgICAgLyogQ2FsbCBmYXIsIGFic29sdXRlIGluZGlyZWN0ICgvMykg Ki8KKyAgICAgIGlmICgoaW5zblsxXSAmIDB4MzgpID09IDB4MTgpCisJcmV0 dXJuIDE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50 CithbWQ2NF9yZXRfcCAoY29uc3Qgc3RydWN0IGFtZDY0X2luc24gKmRldGFp bHMpCit7CisgIC8qIE5PVEU6IGdjYyBjYW4gZW1pdCAicmVweiA7IHJldCIu ICAqLworICBjb25zdCBnZGJfYnl0ZSAqaW5zbiA9ICZkZXRhaWxzLT5yYXdf aW5zbltkZXRhaWxzLT5vcGNvZGVfb2Zmc2V0XTsKKworICBzd2l0Y2ggKGlu c25bMF0pCisgICAgeworICAgIGNhc2UgMHhjMjogLyogcmV0IG5lYXIsIHBv cCBOIGJ5dGVzICovCisgICAgY2FzZSAweGMzOiAvKiByZXQgbmVhciAqLwor ICAgIGNhc2UgMHhjYTogLyogcmV0IGZhciwgcG9wIE4gYnl0ZXMgKi8KKyAg ICBjYXNlIDB4Y2I6IC8qIHJldCBmYXIgKi8KKyAgICBjYXNlIDB4Y2Y6IC8q IGlyZXQgKi8KKyAgICAgIHJldHVybiAxOworCisgICAgZGVmYXVsdDoKKyAg ICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIGludAorYW1kNjRf Y2FsbF9wIChjb25zdCBzdHJ1Y3QgYW1kNjRfaW5zbiAqZGV0YWlscykKK3sK KyAgY29uc3QgZ2RiX2J5dGUgKmluc24gPSAmZGV0YWlscy0+cmF3X2luc25b ZGV0YWlscy0+b3Bjb2RlX29mZnNldF07CiAKKyAgaWYgKGFtZDY0X2Fic29s dXRlX2NhbGxfcCAoZGV0YWlscykpCisgICAgcmV0dXJuIDE7CisKKyAgLyog Y2FsbCBuZWFyLCByZWxhdGl2ZSAqLworICBpZiAoaW5zblswXSA9PSAweGU4 KQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMg aW50CithbWQ2NF9icmVha3BvaW50X3AgKGNvbnN0IHN0cnVjdCBhbWQ2NF9p bnNuICpkZXRhaWxzKQoreworICBjb25zdCBnZGJfYnl0ZSAqaW5zbiA9ICZk ZXRhaWxzLT5yYXdfaW5zbltkZXRhaWxzLT5vcGNvZGVfb2Zmc2V0XTsKKwor ICByZXR1cm4gaW5zblswXSA9PSAweGNjOyAvKiBpbnQgMyAqLworfQorCisv KiBSZXR1cm4gbm9uLXplcm8gaWYgSU5TTiBpcyBhIHN5c3RlbSBjYWxsLCBh bmQgc2V0ICpMRU5HVEhQIHRvIGl0cworICAgbGVuZ3RoIGluIGJ5dGVzLiAg T3RoZXJ3aXNlLCByZXR1cm4gemVyby4gICovCisKK3N0YXRpYyBpbnQKK2Ft ZDY0X3N5c2NhbGxfcCAoY29uc3Qgc3RydWN0IGFtZDY0X2luc24gKmRldGFp bHMsIGludCAqbGVuZ3RocCkKK3sKKyAgY29uc3QgZ2RiX2J5dGUgKmluc24g PSAmZGV0YWlscy0+cmF3X2luc25bZGV0YWlscy0+b3Bjb2RlX29mZnNldF07 CisKKyAgaWYgKGluc25bMF0gPT0gMHgwZiAmJiBpbnNuWzFdID09IDB4MDUp CisgICAgeworICAgICAgKmxlbmd0aHAgPSAyOworICAgICAgcmV0dXJuIDE7 CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBGaXggdXAgdGhlIHN0 YXRlIG9mIHJlZ2lzdGVycyBhbmQgbWVtb3J5IGFmdGVyIGhhdmluZyBzaW5n bGUtc3RlcHBlZAorICAgYSBkaXNwbGFjZWQgaW5zdHJ1Y3Rpb24uICAqLwor Cit2b2lkCithbWQ2NF9kaXNwbGFjZWRfc3RlcF9maXh1cCAoc3RydWN0IGdk YmFyY2ggKmdkYmFyY2gsCisJCQkgICAgc3RydWN0IGRpc3BsYWNlZF9zdGVw X2Nsb3N1cmUgKmRzYywKKwkJCSAgICBDT1JFX0FERFIgZnJvbSwgQ09SRV9B RERSIHRvLAorCQkJICAgIHN0cnVjdCByZWdjYWNoZSAqcmVncykKK3sKKyAg LyogVGhlIG9mZnNldCB3ZSBhcHBsaWVkIHRvIHRoZSBpbnN0cnVjdGlvbidz IGFkZHJlc3MuICAqLworICBVTE9OR0VTVCBpbnNuX29mZnNldCA9IHRvIC0g ZnJvbTsKKyAgZ2RiX2J5dGUgKmluc24gPSBkc2MtPmluc25fYnVmOworICBj b25zdCBzdHJ1Y3QgYW1kNjRfaW5zbiAqaW5zbl9kZXRhaWxzID0gJmRzYy0+ aW5zbl9kZXRhaWxzOworCisgIGlmIChkZWJ1Z19kaXNwbGFjZWQpCisgICAg ZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkbG9nLAorCQkJImRpc3BsYWNl ZDogZml4dXAgKDB4JXMsIDB4JXMpLCAiCisJCQkiaW5zbiA9IDB4JTAyeCAw eCUwMnggLi4uXG4iLAorCQkJcGFkZHJfbnogKGZyb20pLCBwYWRkcl9ueiAo dG8pLCBpbnNuWzBdLCBpbnNuWzFdKTsKKworICAvKiBJZiB3ZSB1c2VkIGEg dG1wIHJlZywgcmVzdG9yZSBpdC4JKi8KKworICBpZiAoZHNjLT50bXBfdXNl ZCkKKyAgICB7CisgICAgICBpZiAoZGVidWdfZGlzcGxhY2VkKQorCWZwcmlu dGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGxvZywgImRpc3BsYWNlZDogcmVzdG9y aW5nIHJlZyAlZCB0byAweCVzXG4iLAorCQkJICAgIGRzYy0+dG1wX3JlZ25v LCBwYWRkcl9ueiAoZHNjLT50bXBfc2F2ZSkpOworICAgICAgcmVnY2FjaGVf Y29va2VkX3dyaXRlX3Vuc2lnbmVkIChyZWdzLCBkc2MtPnRtcF9yZWdubywg ZHNjLT50bXBfc2F2ZSk7CisgICAgfQorCisgIC8qIFRoZSBsaXN0IG9mIGlz c3VlcyB0byBjb250ZW5kIHdpdGggaGVyZSBpcyB0YWtlbiBmcm9tCisgICAg IHJlc3VtZV9leGVjdXRpb24gaW4gYXJjaC94ODYva2VybmVsL2twcm9iZXMu YywgTGludXggMi42LjI4LgorICAgICBZYXkgZm9yIEZyZWUgU29mdHdhcmUh ICAqLworCisgIC8qIFJlbG9jYXRlIHRoZSAlcmlwIGJhY2sgdG8gdGhlIHBy b2dyYW0ncyBpbnN0cnVjdGlvbiBzdHJlYW0sCisgICAgIGlmIG5lY2Vzc2Fy eS4gICovCisKKyAgLyogRXhjZXB0IGluIHRoZSBjYXNlIG9mIGFic29sdXRl IG9yIGluZGlyZWN0IGp1bXAgb3IgY2FsbAorICAgICBpbnN0cnVjdGlvbnMs IG9yIGEgcmV0dXJuIGluc3RydWN0aW9uLCB0aGUgbmV3IHJpcCBpcyByZWxh dGl2ZSB0bworICAgICB0aGUgZGlzcGxhY2VkIGluc3RydWN0aW9uOyBtYWtl IGl0IHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbCBpbnNuLgorICAgICBXZWxs LCBzaWduYWwgaGFuZGxlciByZXR1cm5zIGRvbid0IG5lZWQgcmVsb2NhdGlv biBlaXRoZXIsIGJ1dCB3ZSB1c2UgdGhlCisgICAgIHZhbHVlIG9mICVyaXAg dG8gcmVjb2duaXplIHRob3NlOyBzZWUgYmVsb3cuICAqLworICBpZiAoISBh bWQ2NF9hYnNvbHV0ZV9qbXBfcCAoaW5zbl9kZXRhaWxzKQorICAgICAgJiYg ISBhbWQ2NF9hYnNvbHV0ZV9jYWxsX3AgKGluc25fZGV0YWlscykKKyAgICAg ICYmICEgYW1kNjRfcmV0X3AgKGluc25fZGV0YWlscykpCisgICAgeworICAg ICAgVUxPTkdFU1Qgb3JpZ19yaXA7CisgICAgICBpbnQgaW5zbl9sZW47CisK KyAgICAgIHJlZ2NhY2hlX2Nvb2tlZF9yZWFkX3Vuc2lnbmVkIChyZWdzLCBB TUQ2NF9SSVBfUkVHTlVNLCAmb3JpZ19yaXApOworCisgICAgICAvKiBBIHNp Z25hbCB0cmFtcG9saW5lIHN5c3RlbSBjYWxsIGNoYW5nZXMgdGhlICVyaXAs IHJlc3VtaW5nCisJIGV4ZWN1dGlvbiBvZiB0aGUgbWFpbiBwcm9ncmFtIGFm dGVyIHRoZSBzaWduYWwgaGFuZGxlciBoYXMKKwkgcmV0dXJuZWQuICBUaGF0 IG1ha2VzIHRoZW0gbGlrZSAncmV0dXJuJyBpbnN0cnVjdGlvbnM7IHdlCisJ IHNob3VsZG4ndCByZWxvY2F0ZSAlcmlwLgorCisJIEJ1dCBtb3N0IHN5c3Rl bSBjYWxscyBkb24ndCwgYW5kIHdlIGRvIG5lZWQgdG8gcmVsb2NhdGUgJXJp cC4KKworCSBPdXIgaGV1cmlzdGljIGZvciBkaXN0aW5ndWlzaGluZyB0aGVz ZSBjYXNlczogaWYgc3RlcHBpbmcKKwkgb3ZlciB0aGUgc3lzdGVtIGNhbGwg aW5zdHJ1Y3Rpb24gbGVmdCBjb250cm9sIGRpcmVjdGx5IGFmdGVyCisJIHRo ZSBpbnN0cnVjdGlvbiwgdGhlIHdlIHJlbG9jYXRlIC0tLSBjb250cm9sIGFs bW9zdCBjZXJ0YWlubHkKKwkgZG9lc24ndCBiZWxvbmcgaW4gdGhlIGRpc3Bs YWNlZCBjb3B5LglPdGhlcndpc2UsIHdlIGFzc3VtZQorCSB0aGUgaW5zdHJ1 Y3Rpb24gaGFzIHB1dCBjb250cm9sIHdoZXJlIGl0IGJlbG9uZ3MsIGFuZCBs ZWF2ZQorCSBpdCB1bnJlbG9jYXRlZC4gIEdvb2RuZXNzIGhlbHAgdXMgaWYg dGhlcmUgYXJlIFBDLXJlbGF0aXZlCisJIHN5c3RlbSBjYWxscy4JKi8KKyAg ICAgIGlmIChhbWQ2NF9zeXNjYWxsX3AgKGluc25fZGV0YWlscywgJmluc25f bGVuKQorCSAgJiYgb3JpZ19yaXAgIT0gdG8gKyBpbnNuX2xlbgorCSAgLyog R0RCIGNhbiBnZXQgY29udHJvbCBiYWNrIGFmdGVyIHRoZSBpbnNuIGFmdGVy IHRoZSBzeXNjYWxsLgorCSAgICAgUHJlc3VtYWJseSB0aGlzIGlzIGEga2Vy bmVsIGJ1Zy4KKwkgICAgIEZpeHVwIGVuc3VyZXMgaXRzIGEgbm9wLCB3ZSBh ZGQgb25lIHRvIHRoZSBsZW5ndGggZm9yIGl0LiAgKi8KKwkgICYmIG9yaWdf cmlwICE9IHRvICsgaW5zbl9sZW4gKyAxKQorCXsKKwkgIGlmIChkZWJ1Z19k aXNwbGFjZWQpCisJICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGxv ZywKKwkJCQkiZGlzcGxhY2VkOiBzeXNjYWxsIGNoYW5nZWQgJSVyaXA7ICIK KwkJCQkibm90IHJlbG9jYXRpbmdcbiIpOworCX0KKyAgICAgIGVsc2UKKwl7 CisJICBVTE9OR0VTVCByaXAgPSBvcmlnX3JpcCAtIGluc25fb2Zmc2V0Owor CisJICAvKiBJZiB3ZSBoYXZlIHN0ZXBwZWQgb3ZlciBhIGJyZWFrcG9pbnQs IHNldCAlcmlwIHRvCisJICAgICBwb2ludCBhdCB0aGUgYnJlYWtwb2ludCBp bnN0cnVjdGlvbiBpdHNlbGYuCisKKwkgICAgIChnZGJhcmNoX2RlY3JfcGNf YWZ0ZXJfYnJlYWsgd2FzIG5ldmVyIHNvbWV0aGluZyB0aGUgY29yZQorCSAg ICAgb2YgR0RCIHNob3VsZCBoYXZlIGJlZW4gY29uY2VybmVkIHdpdGg7IGFy Y2gtc3BlY2lmaWMKKwkgICAgIGNvZGUgc2hvdWxkIGJlIG1ha2luZyBQQyB2 YWx1ZXMgY29uc2lzdGVudCBiZWZvcmUKKwkgICAgIHByZXNlbnRpbmcgdGhl bSB0byBHREIuKSAgKi8KKwkgIGlmIChhbWQ2NF9icmVha3BvaW50X3AgKGlu c25fZGV0YWlscykpCisJICAgIHsKKwkgICAgICBpZiAoZGVidWdfZGlzcGxh Y2VkKQorCQlmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csCisJCQkJ ICAgICJkaXNwbGFjZWQ6IHN0ZXBwZWQgYnJlYWtwb2ludFxuIik7CisJICAg ICAgcmlwLS07CisJICAgIH0KKworCSAgcmVnY2FjaGVfY29va2VkX3dyaXRl X3Vuc2lnbmVkIChyZWdzLCBBTUQ2NF9SSVBfUkVHTlVNLCByaXApOworCisJ ICBpZiAoZGVidWdfZGlzcGxhY2VkKQorCSAgICBmcHJpbnRmX3VuZmlsdGVy ZWQgKGdkYl9zdGRsb2csCisJCQkJImRpc3BsYWNlZDogIgorCQkJCSJyZWxv Y2F0ZWQgJSVyaXAgZnJvbSAweCVzIHRvIDB4JXNcbiIsCisJCQkJcGFkZHJf bnogKG9yaWdfcmlwKSwgcGFkZHJfbnogKHJpcCkpOworCX0KKyAgICB9CisK KyAgLyogSWYgdGhlIGluc3RydWN0aW9uIHdhcyBQVVNIRkwsIHRoZW4gdGhl IFRGIGJpdCB3aWxsIGJlIHNldCBpbiB0aGUKKyAgICAgcHVzaGVkIHZhbHVl LCBhbmQgc2hvdWxkIGJlIGNsZWFyZWQuICBXZSdsbCBsZWF2ZSB0aGlzIGZv ciBsYXRlciwKKyAgICAgc2luY2UgR0RCIGFscmVhZHkgbWVzc2VzIHVwIHRo ZSBURiBmbGFnIHdoZW4gc3RlcHBpbmcgb3ZlciBhCisgICAgIHB1c2hmbC4g ICovCisKKyAgLyogSWYgdGhlIGluc3RydWN0aW9uIHdhcyBhIGNhbGwsIHRo ZSByZXR1cm4gYWRkcmVzcyBub3cgYXRvcCB0aGUKKyAgICAgc3RhY2sgaXMg dGhlIGFkZHJlc3MgZm9sbG93aW5nIHRoZSBjb3BpZWQgaW5zdHJ1Y3Rpb24u ICBXZSBuZWVkCisgICAgIHRvIG1ha2UgaXQgdGhlIGFkZHJlc3MgZm9sbG93 aW5nIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbi4JICovCisgIGlmIChhbWQ2 NF9jYWxsX3AgKGluc25fZGV0YWlscykpCisgICAgeworICAgICAgVUxPTkdF U1QgcnNwOworICAgICAgVUxPTkdFU1QgcmV0YWRkcjsKKyAgICAgIGNvbnN0 IFVMT05HRVNUIHJldGFkZHJfbGVuID0gODsKKworICAgICAgcmVnY2FjaGVf Y29va2VkX3JlYWRfdW5zaWduZWQgKHJlZ3MsIEFNRDY0X1JTUF9SRUdOVU0s ICZyc3ApOworICAgICAgcmV0YWRkciA9IHJlYWRfbWVtb3J5X3Vuc2lnbmVk X2ludGVnZXIgKHJzcCwgcmV0YWRkcl9sZW4pOworICAgICAgcmV0YWRkciA9 IChyZXRhZGRyIC0gaW5zbl9vZmZzZXQpICYgMHhmZmZmZmZmZlVMOworICAg ICAgd3JpdGVfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIgKHJzcCwgcmV0YWRk cl9sZW4sIHJldGFkZHIpOworCisgICAgICBpZiAoZGVidWdfZGlzcGxhY2Vk KQorCWZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGxvZywKKwkJCSAgICAi ZGlzcGxhY2VkOiByZWxvY2F0ZWQgcmV0dXJuIGFkZHIgYXQgMHglcyAiCisJ CQkgICAgInRvIDB4JXNcbiIsCisJCQkgICAgcGFkZHJfbnogKHJzcCksCisJ CQkgICAgcGFkZHJfbnogKHJldGFkZHIpKTsKKyAgICB9Cit9CisMCiAvKiBU aGUgbWF4aW11bSBudW1iZXIgb2Ygc2F2ZWQgcmVnaXN0ZXJzLiAgVGhpcyBz aG91bGQgaW5jbHVkZSAlcmlwLiAgKi8KICNkZWZpbmUgQU1ENjRfTlVNX1NB VkVEX1JFR1MJQU1ENjRfTlVNX0dSRUdTCiAKQEAgLTc1NiwyNCArMTQ2NSw2 IEBAIGFtZDY0X2FuYWx5emVfc3RhY2tfYWxpZ24gKENPUkVfQUREUiBwYywK ICAgZ2RiX2J5dGUgYnVmWzE4XTsKICAgaW50IHJlZywgcjsKICAgaW50IG9m ZnNldCwgb2Zmc2V0X2FuZDsKLSAgc3RhdGljIGludCByZWdudW1zWzE2XSA9 IHsKLSAgICBBTUQ2NF9SQVhfUkVHTlVNLAkJLyogJXJheCAqLwotICAgIEFN RDY0X1JDWF9SRUdOVU0sCQkvKiAlcmN4ICovCi0gICAgQU1ENjRfUkRYX1JF R05VTSwJCS8qICVyZHggKi8KLSAgICBBTUQ2NF9SQlhfUkVHTlVNLAkJLyog JXJieCAqLwotICAgIEFNRDY0X1JTUF9SRUdOVU0sCQkvKiAlcnNwICovCi0g ICAgQU1ENjRfUkJQX1JFR05VTSwJCS8qICVyYnAgKi8KLSAgICBBTUQ2NF9S U0lfUkVHTlVNLAkJLyogJXJzaSAqLwotICAgIEFNRDY0X1JESV9SRUdOVU0s CQkvKiAlcmRpICovCi0gICAgQU1ENjRfUjhfUkVHTlVNLAkJLyogJXI4ICov Ci0gICAgQU1ENjRfUjlfUkVHTlVNLAkJLyogJXI5ICovCi0gICAgQU1ENjRf UjEwX1JFR05VTSwJCS8qICVyMTAgKi8KLSAgICBBTUQ2NF9SMTFfUkVHTlVN LAkJLyogJXIxMSAqLwotICAgIEFNRDY0X1IxMl9SRUdOVU0sCQkvKiAlcjEy ICovCi0gICAgQU1ENjRfUjEzX1JFR05VTSwJCS8qICVyMTMgKi8KLSAgICBB TUQ2NF9SMTRfUkVHTlVNLAkJLyogJXIxNCAqLwotICAgIEFNRDY0X1IxNV9S RUdOVU0sCQkvKiAlcjE1ICovCi0gIH07CiAKICAgaWYgKHRhcmdldF9yZWFk X21lbW9yeSAocGMsIGJ1Ziwgc2l6ZW9mIGJ1ZikpCiAgICAgcmV0dXJuIHBj OwpAQCAtODg5LDcgKzE1ODAsNyBAQCBhbWQ2NF9hbmFseXplX3N0YWNrX2Fs aWduIChDT1JFX0FERFIgcGMsCiAgICAgcmV0dXJuIHBjOwogCiAgIGlmIChj dXJyZW50X3BjID4gcGMgKyBvZmZzZXRfYW5kKQotICAgIGNhY2hlLT5zYXZl ZF9zcF9yZWcgPSByZWdudW1zW3JlZ107CisgICAgY2FjaGUtPnNhdmVkX3Nw X3JlZyA9IGFtZDY0X2FyY2hfcmVnX3RvX3JlZ251bSAocmVnKTsKIAogICBy ZXR1cm4gbWluIChwYyArIG9mZnNldCArIDIsIGN1cnJlbnRfcGMpOwogfQpJ bmRleDogZ2RiL2FtZDY0LXRkZXAuaAo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 ClJDUyBmaWxlOiAvY3ZzL3NyYy9zcmMvZ2RiL2FtZDY0LXRkZXAuaCx2CnJl dHJpZXZpbmcgcmV2aXNpb24gMS4xMwpkaWZmIC11IC1wIC11IC1wIC1yMS4x MyBhbWQ2NC10ZGVwLmgKLS0tIGdkYi9hbWQ2NC10ZGVwLmgJMyBKYW4gMjAw OSAwNTo1Nzo1MCAtMDAwMAkxLjEzCisrKyBnZGIvYW1kNjQtdGRlcC5oCTI4 IEphbiAyMDA5IDA4OjMxOjM0IC0wMDAwCkBAIC02Nyw2ICs2NywxNCBAQCBl bnVtIGFtZDY0X3JlZ251bQogLyogTnVtYmVyIG9mIGdlbmVyYWwgcHVycG9z ZSByZWdpc3RlcnMuICAqLwogI2RlZmluZSBBTUQ2NF9OVU1fR1JFR1MJCTI0 CiAKK2V4dGVybiBzdHJ1Y3QgZGlzcGxhY2VkX3N0ZXBfY2xvc3VyZSAqYW1k NjRfZGlzcGxhY2VkX3N0ZXBfY29weV9pbnNuCisgIChzdHJ1Y3QgZ2RiYXJj aCAqZ2RiYXJjaCwgQ09SRV9BRERSIGZyb20sIENPUkVfQUREUiB0bywKKyAg IHN0cnVjdCByZWdjYWNoZSAqcmVncyk7CitleHRlcm4gdm9pZCBhbWQ2NF9k aXNwbGFjZWRfc3RlcF9maXh1cCAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gs CisJCQkJCXN0cnVjdCBkaXNwbGFjZWRfc3RlcF9jbG9zdXJlICpjbG9zdXJl LAorCQkJCQlDT1JFX0FERFIgZnJvbSwgQ09SRV9BRERSIHRvLAorCQkJCQlz dHJ1Y3QgcmVnY2FjaGUgKnJlZ3MpOworCiBleHRlcm4gdm9pZCBhbWQ2NF9p bml0X2FiaSAoc3RydWN0IGdkYmFyY2hfaW5mbyBpbmZvLCBzdHJ1Y3QgZ2Ri YXJjaCAqZ2RiYXJjaCk7CiAKIC8qIEZ1bmN0aW9ucyBmcm9tIGFtZDY0LXRk ZXAuYyB3aGljaCBtYXkgYmUgbmVlZGVkIG9uIGFyY2hpdGVjdHVyZXMKSW5k ZXg6IGdkYi90ZXN0c3VpdGUvZ2RiLmFyY2gvYW1kNjQtZGlzcC1zdGVwLlMK PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogZ2RiL3Rlc3RzdWl0 ZS9nZGIuYXJjaC9hbWQ2NC1kaXNwLXN0ZXAuUwpkaWZmIC1OIGdkYi90ZXN0 c3VpdGUvZ2RiLmFyY2gvYW1kNjQtZGlzcC1zdGVwLlMKLS0tIC9kZXYvbnVs bAkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwCisrKyBnZGIvdGVzdHN1aXRl L2dkYi5hcmNoL2FtZDY0LWRpc3Atc3RlcC5TCTI4IEphbiAyMDA5IDA4OjMx OjM1IC0wMDAwCkBAIC0wLDAgKzEsMTUzIEBACisvKiBDb3B5cmlnaHQgMjAw OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBw cm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl IGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5 CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVy c2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9u KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRp c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws CisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0 aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9y IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQor ICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls cy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGgg dGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9y Zy9saWNlbnNlcy8+LgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUg Z2RiIHRlc3RzdWl0ZS4KKyAgIEl0IHRlc3RzIGRpc3BsYWNlZCBzdGVwcGlu ZyBvdmVyIHZhcmlvdXMgaW5zbnMgdGhhdCByZXF1aXJlIHNwZWNpYWwKKyAg IGhhbmRsaW5nLiAgKi8KKworCS50ZXh0CisKKwkuZ2xvYmFsIG1haW4KK21h aW46CisJbm9wCisKKy8qIHRlc3QgY2FsbC9yZXQgKi8KKworCS5nbG9iYWwg dGVzdF9jYWxsCit0ZXN0X2NhbGw6CisJY2FsbCB0ZXN0X2NhbGxfc3Vicgor CW5vcAorCS5nbG9iYWwgdGVzdF9yZXRfZW5kCit0ZXN0X3JldF9lbmQ6CisJ bm9wCisKKy8qIHRlc3QgYWJzLWptcC9yZXAtcmV0ICovCisKK3Rlc3RfYWJz X2ptcF9zZXR1cDoKKwltb3YgJHRlc3RfYWJzX2ptcF9yZXR1cm4sJXJkeAor CXB1c2ggJXJkeAorCW1vdiAkdGVzdF9hYnNfam1wX3N1YnIsJXJkeAorCS5n bG9iYWwgdGVzdF9hYnNfam1wCit0ZXN0X2Fic19qbXA6CisJam1wIColcmR4 Cit0ZXN0X2Fic19qbXBfcmV0dXJuOgorCW5vcAorCS5nbG9iYWwgdGVzdF9y ZXBfcmV0X2VuZAordGVzdF9yZXBfcmV0X2VuZDoKKwlub3AKKworLyogdGVz dCBzeXNjYWxsICovCisKKwkuZ2xvYmFsIHRlc3Rfc3lzY2FsbAorCW1vdiAk MHgyNywlZWF4IC8qIGdldHBpZCAqLwordGVzdF9zeXNjYWxsOgorCXN5c2Nh bGwKKwlub3AKK3Rlc3Rfc3lzY2FsbF9lbmQ6CisJbm9wCisKKy8qIHRlc3Qg cmlwLXJlbGF0aXZlCisgICBHREIgcGlja3MgYSBzcGFyZSByZWdpc3RlciB0 byBob2xkIHRoZSByaXAtcmVsYXRpdmUgYWRkcmVzcy4KKyAgIEV4ZXJjaXNl IGFsbCB0aGUgcG9zc2liaWxpdGllcyAocmF4LXJkaSwgc2FucyByc3ApLiAg Ki8KKworCS5nbG9iYWwgdGVzdF9yaXBfcmF4Cit0ZXN0X3JpcF9yYXg6CisJ YWRkIGFuc3dlciglcmlwKSwlcmF4CisJLmdsb2JhbCB0ZXN0X3JpcF9yYXhf ZW5kCit0ZXN0X3JpcF9yYXhfZW5kOgorCW5vcAorCisJLmdsb2JhbCB0ZXN0 X3JpcF9yYngKK3Rlc3RfcmlwX3JieDoKKwlhZGQgYW5zd2VyKCVyaXApLCVy YngKKwkuZ2xvYmFsIHRlc3RfcmlwX3JieF9lbmQKK3Rlc3RfcmlwX3JieF9l bmQ6CisJbm9wCisKKwkuZ2xvYmFsIHRlc3RfcmlwX3JjeAordGVzdF9yaXBf cmN4OgorCWFkZCBhbnN3ZXIoJXJpcCksJXJjeAorCS5nbG9iYWwgdGVzdF9y aXBfcmN4X2VuZAordGVzdF9yaXBfcmN4X2VuZDoKKwlub3AKKworCS5nbG9i YWwgdGVzdF9yaXBfcmR4Cit0ZXN0X3JpcF9yZHg6CisJYWRkIGFuc3dlcigl cmlwKSwlcmR4CisJLmdsb2JhbCB0ZXN0X3JpcF9yZHhfZW5kCit0ZXN0X3Jp cF9yZHhfZW5kOgorCW5vcAorCisJLmdsb2JhbCB0ZXN0X3JpcF9yYnAKK3Rl c3RfcmlwX3JicDoKKwlhZGQgYW5zd2VyKCVyaXApLCVyYnAKKwkuZ2xvYmFs IHRlc3RfcmlwX3JicF9lbmQKK3Rlc3RfcmlwX3JicF9lbmQ6CisJbm9wCisK KwkuZ2xvYmFsIHRlc3RfcmlwX3JzaQordGVzdF9yaXBfcnNpOgorCWFkZCBh bnN3ZXIoJXJpcCksJXJzaQorCS5nbG9iYWwgdGVzdF9yaXBfcnNpX2VuZAor dGVzdF9yaXBfcnNpX2VuZDoKKwlub3AKKworCS5nbG9iYWwgdGVzdF9yaXBf cmRpCit0ZXN0X3JpcF9yZGk6CisJYWRkIGFuc3dlciglcmlwKSwlcmRpCisJ Lmdsb2JhbCB0ZXN0X3JpcF9yZGlfZW5kCit0ZXN0X3JpcF9yZGlfZW5kOgor CW5vcAorCisJLyogc2tpcCBvdmVyIHRlc3QgZGF0YSAqLworCWptcCBkb25l CisKKy8qIHRlc3QgcmlwLXJlbGF0aXZlIGRhdGEgKi8KKworYW5zd2VyOgku OGJ5dGUgNDIKKworLyogYWxsIGRvbmUgKi8KKworZG9uZToKKwltb3YgJDAs JXJkaQorCWNhbGwgZXhpdAorCWhsdAorCisvKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHN1YnJvdXRp bmUgdG8gaGVscCB0ZXN0IGNhbGwvcmV0ICovCisKK3Rlc3RfY2FsbF9zdWJy OgorCW5vcAorCS5nbG9iYWwgdGVzdF9jYWxsX2VuZAordGVzdF9jYWxsX2Vu ZDoKKwlub3AKKworCS5nbG9iYWwgdGVzdF9yZXQKK3Rlc3RfcmV0OgorCXJl dAorCisvKiBzdWJyb3V0aW5lIHRvIGhlbHAgdGVzdCBhYnMtam1wL3JlcC1y ZXQgKi8KKwordGVzdF9hYnNfam1wX3N1YnI6CisJbm9wCisJLmdsb2JhbCB0 ZXN0X2Fic19qbXBfZW5kCit0ZXN0X2Fic19qbXBfZW5kOgorCW5vcAorCisJ Lmdsb2JhbCB0ZXN0X3JlcF9yZXQKK3Rlc3RfcmVwX3JldDoKKwlyZXB6CisJ cmV0CkluZGV4OiBnZGIvdGVzdHN1aXRlL2dkYi5hcmNoL2FtZDY0LWRpc3At c3RlcC5leHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogZ2Ri L3Rlc3RzdWl0ZS9nZGIuYXJjaC9hbWQ2NC1kaXNwLXN0ZXAuZXhwCmRpZmYg LU4gZ2RiL3Rlc3RzdWl0ZS9nZGIuYXJjaC9hbWQ2NC1kaXNwLXN0ZXAuZXhw Ci0tLSAvZGV2L251bGwJMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMAorKysg Z2RiL3Rlc3RzdWl0ZS9nZGIuYXJjaC9hbWQ2NC1kaXNwLXN0ZXAuZXhwCTI4 IEphbiAyMDA5IDA4OjMxOjM1IC0wMDAwCkBAIC0wLDAgKzEsMjE5IEBACisj IENvcHlyaWdodCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j LgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMg cHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247 IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5 b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJv Z3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg YmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFC SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT ZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl IGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv cHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25n IHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cu Z251Lm9yZy9saWNlbnNlcy8+LgorCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9m IHRoZSBnZGIgdGVzdHN1aXRlLgorCisjIFRlc3QgYW1kNjQgZGlzcGxhY2Vk IHN0ZXBwaW5nLgorCitpZiAkdHJhY2VsZXZlbCB7CisgICAgc3RyYWNlICR0 cmFjZWxldmVsCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAor CitpZiAhW2lzdGFyZ2V0ICJ4ODZfNjQtKi1saW51eCoiXSB0aGVuIHsKKyAg ICB2ZXJib3NlICJTa2lwcGluZyB4ODZfNjQgZGlzcGxhY2VkIHN0ZXBwaW5n IHRlc3RzLiIKKyAgICByZXR1cm4KK30KKworc2V0IG5ld2xpbmUgIlxbXHJc blxdKiIKKworc2V0IHRlc3RmaWxlICJhbWQ2NC1kaXNwLXN0ZXAiCitzZXQg c3JjZmlsZSAke3Rlc3RmaWxlfS5TCitzZXQgYmluZmlsZSAke29iamRpcn0v JHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK3NldCBhZGRpdGlvbmFsX2ZsYWdz ICItV2EsLWciCisKK2lmIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtz dWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIFts aXN0IGRlYnVnICRhZGRpdGlvbmFsX2ZsYWdzXV0gIT0gIiIgfSB7CisgICAg dW50ZXN0ZWQgYW1kNjQtZGlzcC1zdGVwLmV4cAorICAgIHJldHVybiAtMQor fQorCisjIEdldCB0aGluZ3Mgc3RhcnRlZC4KKworZ2RiX2V4aXQKK2dkYl9z dGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitn ZGJfbG9hZCAke2JpbmZpbGV9CisKK2dkYl90ZXN0ICJzZXQgZGlzcGxhY2Vk LXN0ZXBwaW5nIG9uIiAiIgorZ2RiX3Rlc3QgInNob3cgZGlzcGxhY2VkLXN0 ZXBwaW5nIiAiLiogZGlzcGxhY2VkIHN0ZXBwaW5nIC4qIGlzIG9uLioiCisK K2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgZmFpbCAiQ2FuJ3QgcnVu IHRvIG1haW4iCisgICAgcmV0dXJuIDAKK30KKworIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGVzdCBjYWxsL3Jl dC4KKworZ2RiX3Rlc3QgImJyZWFrIHRlc3RfY2FsbCIgXAorICAgICJCcmVh a3BvaW50LiphdC4qIGZpbGUgLiokc3JjZmlsZSwgbGluZS4qIiBcCisgICAg ImJyZWFrIHRlc3RfY2FsbCIKK2dkYl90ZXN0ICJicmVhayB0ZXN0X2NhbGxf ZW5kIiBcCisgICAgIkJyZWFrcG9pbnQuKmF0LiogZmlsZSAuKiRzcmNmaWxl LCBsaW5lLioiIFwKKyAgICAiYnJlYWsgdGVzdF9jYWxsX2VuZCIKKworZ2Ri X3Rlc3QgImJyZWFrIHRlc3RfcmV0IiBcCisgICAgIkJyZWFrcG9pbnQuKmF0 LiogZmlsZSAuKiRzcmNmaWxlLCBsaW5lLioiIFwKKyAgICAiYnJlYWsgdGVz dF9yZXQiCitnZGJfdGVzdCAiYnJlYWsgdGVzdF9yZXRfZW5kIiBcCisgICAg IkJyZWFrcG9pbnQuKmF0LiogZmlsZSAuKiRzcmNmaWxlLCBsaW5lLioiIFwK KyAgICAiYnJlYWsgdGVzdF9yZXRfZW5kIgorCitnZGJfdGVzdCAiY29udGlu dWUiIFwKKyAgICAiQ29udGludWluZy4qQnJlYWtwb2ludC4qLCB0ZXN0X2Nh bGwgKCkuKiIgXAorICAgICJjb250aW51ZSB0byB0ZXN0X2NhbGwiCitnZGJf dGVzdCAiY29udGludWUiIFwKKyAgICAiQ29udGludWluZy4qQnJlYWtwb2lu dC4qLCB0ZXN0X2NhbGxfZW5kICgpLioiIFwKKyAgICAiY29udGludWUgdG8g dGVzdF9jYWxsX2VuZCIKKworZ2RiX3Rlc3QgImNvbnRpbnVlIiBcCisgICAg IkNvbnRpbnVpbmcuKkJyZWFrcG9pbnQuKiwgdGVzdF9yZXQgKCkuKiIgXAor ICAgICJjb250aW51ZSB0byB0ZXN0X3JldCIKK2dkYl90ZXN0ICJjb250aW51 ZSIgXAorICAgICJDb250aW51aW5nLipCcmVha3BvaW50LiosIHRlc3RfcmV0 X2VuZCAoKS4qIiBcCisgICAgImNvbnRpbnVlIHRvIHRlc3RfcmV0X2VuZCIK KworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj CisKKyMgVGVzdCBhYnMtam1wL3JlcC1yZXQuCisKK2dkYl90ZXN0ICJicmVh ayB0ZXN0X2Fic19qbXAiIFwKKyAgICAiQnJlYWtwb2ludC4qYXQuKiBmaWxl IC4qJHNyY2ZpbGUsIGxpbmUuKiIgXAorICAgICJicmVhayB0ZXN0X2Fic19q bXAiCitnZGJfdGVzdCAiYnJlYWsgdGVzdF9hYnNfam1wX2VuZCIgXAorICAg ICJCcmVha3BvaW50LiphdC4qIGZpbGUgLiokc3JjZmlsZSwgbGluZS4qIiBc CisgICAgImJyZWFrIHRlc3RfYWJzX2ptcF9lbmQiCisKK2dkYl90ZXN0ICJi cmVhayB0ZXN0X3JlcF9yZXQiIFwKKyAgICAiQnJlYWtwb2ludC4qYXQuKiBm aWxlIC4qJHNyY2ZpbGUsIGxpbmUuKiIgXAorICAgICJicmVhayB0ZXN0X3Jl cF9yZXQiCitnZGJfdGVzdCAiYnJlYWsgdGVzdF9yZXBfcmV0X2VuZCIgXAor ICAgICJCcmVha3BvaW50LiphdC4qIGZpbGUgLiokc3JjZmlsZSwgbGluZS4q IiBcCisgICAgImJyZWFrIHRlc3RfcmVwX3JldF9lbmQiCisKK2dkYl90ZXN0 ICJjb250aW51ZSIgXAorICAgICJDb250aW51aW5nLipCcmVha3BvaW50Lios IHRlc3RfYWJzX2ptcCAoKS4qIiBcCisgICAgImNvbnRpbnVlIHRvIHRlc3Rf YWJzX2ptcCIKK2dkYl90ZXN0ICJjb250aW51ZSIgXAorICAgICJDb250aW51 aW5nLipCcmVha3BvaW50LiosIHRlc3RfYWJzX2ptcF9lbmQgKCkuKiIgXAor ICAgICJjb250aW51ZSB0byB0ZXN0X2Fic19qbXBfZW5kIgorCitnZGJfdGVz dCAiY29udGludWUiIFwKKyAgICAiQ29udGludWluZy4qQnJlYWtwb2ludC4q LCB0ZXN0X3JlcF9yZXQgKCkuKiIgXAorICAgICJjb250aW51ZSB0byB0ZXN0 X3JlcF9yZXQiCitnZGJfdGVzdCAiY29udGludWUiIFwKKyAgICAiQ29udGlu dWluZy4qQnJlYWtwb2ludC4qLCB0ZXN0X3JlcF9yZXRfZW5kICgpLioiIFwK KyAgICAiY29udGludWUgdG8gdGVzdF9yZXBfcmV0X2VuZCIKKworIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGVz dCBzeXNjYWxsLgorCitnZGJfdGVzdCAiYnJlYWsgdGVzdF9zeXNjYWxsIiBc CisgICAgIkJyZWFrcG9pbnQuKmF0LiogZmlsZSAuKiRzcmNmaWxlLCBsaW5l LioiIFwKKyAgICAiYnJlYWsgdGVzdF9zeXNjYWxsIgorZ2RiX3Rlc3QgImJy ZWFrIHRlc3Rfc3lzY2FsbF9lbmQiIFwKKyAgICAiQnJlYWtwb2ludC4qYXQu KiBmaWxlIC4qJHNyY2ZpbGUsIGxpbmUuKiIgXAorICAgICJicmVhayB0ZXN0 X3N5c2NhbGxfZW5kIgorCitnZGJfdGVzdCAiY29udGludWUiIFwKKyAgICAi Q29udGludWluZy4qQnJlYWtwb2ludC4qLCB0ZXN0X3N5c2NhbGwgKCkuKiIg XAorICAgICJjb250aW51ZSB0byB0ZXN0X3N5c2NhbGwiCitnZGJfdGVzdCAi Y29udGludWUiIFwKKyAgICAiQ29udGludWluZy4qQnJlYWtwb2ludC4qLCB0 ZXN0X3N5c2NhbGxfZW5kICgpLioiIFwKKyAgICAiY29udGludWUgdG8gdGVz dF9zeXNjYWxsX2VuZCIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjCisKKyMgVGVzdCByaXAtcmVsYXRpdmUuCisjIEdE QiBwaWNrcyBhIHNwYXJlIHJlZ2lzdGVyIHRvIGhvbGQgdGhlIHJpcC1yZWxh dGl2ZSBhZGRyZXNzLgorIyBFeGVyY2lzZSBhbGwgdGhlIHBvc3NpYmlsaXRp ZXMgKHJheC1yZGksIHNhbnMgcnNwKS4KKworIyBUaGUgb3JkZXIgbXVzdCBt dWNoIHRoZSBvcmRlciBpbiBzcmNmaWxlLgorc2V0IHJpcF9yZWdzIHsgInJh eCIgInJieCIgInJjeCIgInJkeCIgInJicCIgInJzaSIgInJkaSIgfQorCisj IEFzc2lnbiB2YWwgdG8gYWxsIHNwZWNpZmllZCByZWdzLgorCitwcm9jIHNl dF9yZWdzIHsgcmVncyB2YWwgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQK KworICAgIGZvcmVhY2ggcmVnICR7cmVnc30geworCSMgVXNlIHNlbmRfZ2Ri L2dkYl9leHBlY3Qgc28gdGhhdCB0aGVzZSBhcmVuJ3QgbG9nZ2VkIGFzIHBh c3MvZmFpbC4KKwlzZW5kX2dkYiAic2V0IFwkJHtyZWd9ID0gJHt2YWx9XG4i CisJZ2RiX2V4cGVjdCAxMCB7CisJICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIg eyAKKwkJdmVyYm9zZSAiU2V0dGluZyAke3JlZ30gdG8gJHt2YWx9LiIgMgor CSAgICB9CisJICAgIHRpbWVvdXQgeworCQl3YXJuaW5nICJDb3VsZG4ndCBz ZXQgJHtyZWd9IHRvICR7dmFsfS4iCisJICAgIH0KKwl9CisgICAgfQorfQor CisjIFZlcmlmeSBhbGwgUkVHUyBlcXVhbCBWQUwsIGV4Y2VwdCBSRUcgd2hp Y2ggZXF1YWxzIFJFR19WQUwuCisKK3Byb2MgdmVyaWZ5X3JlZ3MgeyB0ZXN0 X25hbWUgcmVncyB2YWwgZXhjZXB0X3JlZyBleGNlcHRfcmVnX3ZhbCB9IHsK KyAgICBnbG9iYWwgbmV3bGluZQorCisgICAgZm9yZWFjaCByZWcgJHtyZWdz fSB7CisJc2V0IGV4cGVjdGVkICR7dmFsfQorCWlmIHsgIiR7cmVnfSIgPT0g IiR7ZXhjZXB0X3JlZ30iIH0geworCSAgICBzZXQgZXhwZWN0ZWQgJHtleGNl cHRfcmVnX3ZhbH0KKwl9CisJIyBUaGUgY2FzdCB0byAoaW50KSBpcyBiZWNh dXNlIFJCUCBpcyBwcmludGVkIGFzIGEgcG9pbnRlci4KKwlnZGJfdGVzdCAi cCAoaW50KSBcJCR7cmVnfSIgIiA9ICR7ZXhwZWN0ZWR9JHtuZXdsaW5lfSIg IiR7dGVzdF9uYW1lfSAke3JlZ30gZXhwZWN0ZWQgdmFsdWUiCisgICAgfQor fQorCitwcm9jIHJpcF90ZXN0IHsgcmVnIH0geworICAgIGdsb2JhbCBzcmNm aWxlIHJpcF9yZWdzCisKKyAgICBzZXQgdGVzdF9zdGFydF9sYWJlbCAidGVz dF9yaXBfJHtyZWd9IgorICAgIHNldCB0ZXN0X2VuZF9sYWJlbCAidGVzdF9y aXBfJHtyZWd9X2VuZCIKKworICAgIGdkYl90ZXN0ICJicmVhayAke3Rlc3Rf c3RhcnRfbGFiZWx9IiBcCisJIkJyZWFrcG9pbnQuKmF0LiogZmlsZSAuKiRz cmNmaWxlLCBsaW5lLioiIFwKKwkiYnJlYWsgJHt0ZXN0X3N0YXJ0X2xhYmVs fSIKKyAgICBnZGJfdGVzdCAiYnJlYWsgJHt0ZXN0X2VuZF9sYWJlbH0iIFwK KwkiQnJlYWtwb2ludC4qYXQuKiBmaWxlIC4qJHNyY2ZpbGUsIGxpbmUuKiIg XAorCSJicmVhayAke3Rlc3RfZW5kX2xhYmVsfSIKKworICAgIGdkYl90ZXN0 ICJjb250aW51ZSIgXAorCSJDb250aW51aW5nLipCcmVha3BvaW50LiosICR7 dGVzdF9zdGFydF9sYWJlbH0gKCkuKiIgXAorCSJjb250aW51ZSB0byAke3Rl c3Rfc3RhcnRfbGFiZWx9IgorCisgICAgc2V0X3JlZ3MgJHtyaXBfcmVnc30g MAorCisgICAgZ2RiX3Rlc3QgImNvbnRpbnVlIiBcCisJIkNvbnRpbnVpbmcu KkJyZWFrcG9pbnQuKiwgJHt0ZXN0X2VuZF9sYWJlbH0gKCkuKiIgXAorCSJj b250aW51ZSB0byAke3Rlc3RfZW5kX2xhYmVsfSIKKworICAgIHZlcmlmeV9y ZWdzICJ0ZXN0IHJpcCB3LyR7cmVnfSIgJHtyaXBfcmVnc30gMCAke3JlZ30g NDIKK30KKworZm9yZWFjaCByZWcgJHtyaXBfcmVnc30geworICAgIHJpcF90 ZXN0ICRyZWcKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjCisKKyMgRG9uZSwgcnVuIHByb2dyYW0gdG8gZXhpdC4K KworZ2RiX2NvbnRpbnVlX3RvX2VuZCAiYW1kNjQtZGlzcC1zdGVwIgpJbmRl eDogZ2RiL3Rlc3RzdWl0ZS9nZGIuYXJjaC9pMzg2LWRpc3Atc3RlcC5TCj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IGdkYi90ZXN0c3VpdGUv Z2RiLmFyY2gvaTM4Ni1kaXNwLXN0ZXAuUwpkaWZmIC1OIGdkYi90ZXN0c3Vp dGUvZ2RiLmFyY2gvaTM4Ni1kaXNwLXN0ZXAuUwotLS0gL2Rldi9udWxsCTEg SmFuIDE5NzAgMDA6MDA6MDAgLTAwMDAKKysrIGdkYi90ZXN0c3VpdGUvZ2Ri LmFyY2gvaTM4Ni1kaXNwLXN0ZXAuUwkyOCBKYW4gMjAwOSAwODozMTozNSAt MDAwMApAQCAtMCwwICsxLDY0IEBACisvKiBDb3B5cmlnaHQgMjAwOSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFt IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu ZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0 aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAz IG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkg bGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1 dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBi dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w bGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKwor ICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBw cm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNl bnNlcy8+LgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZ2RiIHRl c3RzdWl0ZS4KKyAgIEl0IHRlc3RzIGRpc3BsYWNlZCBzdGVwcGluZyBvdmVy IHZhcmlvdXMgaW5zbnMgdGhhdCByZXF1aXJlIHNwZWNpYWwKKyAgIGhhbmRs aW5nLiAgKi8KKworCS50ZXh0CisKKwkuZ2xvYmFsIG1haW4KK21haW46CisJ bm9wCisKKy8qIHRlc3QgY2FsbC9yZXQgKi8KKworCS5nbG9iYWwgdGVzdF9j YWxsCit0ZXN0X2NhbGw6CisJY2FsbCB0ZXN0X2NhbGxfc3VicgorCW5vcAor CS5nbG9iYWwgdGVzdF9yZXRfZW5kCit0ZXN0X3JldF9lbmQ6CisJbm9wCisK Ky8qIHRlc3Qgc3lzY2FsbCAqLworCisJLmdsb2JhbCB0ZXN0X3N5c2NhbGwK Kwltb3YgJDB4MTQsJWVheCAvKiBnZXRwaWQgKi8KK3Rlc3Rfc3lzY2FsbDoK KwlpbnQgJDB4ODAKKwlub3AKK3Rlc3Rfc3lzY2FsbF9lbmQ6CisJbm9wCisK Ky8qIGFsbCBkb25lICovCisKKwlwdXNobCAkMAorCWNhbGwgZXhpdAorCWhs dAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKiovCisKKy8qIHN1YnJvdXRpbmUgdG8gaGVscCB0ZXN0IGNhbGwv cmV0ICovCisKK3Rlc3RfY2FsbF9zdWJyOgorCW5vcAorCS5nbG9iYWwgdGVz dF9jYWxsX2VuZAordGVzdF9jYWxsX2VuZDoKKwlub3AKKworCS5nbG9iYWwg dGVzdF9yZXQKK3Rlc3RfcmV0OgorCXJldApJbmRleDogZ2RiL3Rlc3RzdWl0 ZS9nZGIuYXJjaC9pMzg2LWRpc3Atc3RlcC5leHAKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQpSQ1MgZmlsZTogZ2RiL3Rlc3RzdWl0ZS9nZGIuYXJjaC9pMzg2 LWRpc3Atc3RlcC5leHAKZGlmZiAtTiBnZGIvdGVzdHN1aXRlL2dkYi5hcmNo L2kzODYtZGlzcC1zdGVwLmV4cAotLS0gL2Rldi9udWxsCTEgSmFuIDE5NzAg MDA6MDA6MDAgLTAwMDAKKysrIGdkYi90ZXN0c3VpdGUvZ2RiLmFyY2gvaTM4 Ni1kaXNwLXN0ZXAuZXhwCTI4IEphbiAyMDA5IDA4OjMxOjM1IC0wMDAwCkBA IC0wLDAgKzEsMTEyIEBACisjIENvcHlyaWdodCAyMDA5IEZyZWUgU29mdHdh cmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVl IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9k aWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExp Y2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp b24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBB TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50 eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQg aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90 LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjIFRo aXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBnZGIgdGVzdHN1aXRlLgorCisjIFRl c3QgaTM4NiBkaXNwbGFjZWQgc3RlcHBpbmcuCisKK2lmICR0cmFjZWxldmVs IHsKKyAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHBybXNfaWQg MAorc2V0IGJ1Z19pZCAwCisKK2lmICFbaXN0YXJnZXQgImk/ODYtKi1saW51 eCoiXSB0aGVuIHsKKyAgICB2ZXJib3NlICJTa2lwcGluZyB4ODYgZGlzcGxh Y2VkIHN0ZXBwaW5nIHRlc3RzLiIKKyAgICByZXR1cm4KK30KKworc2V0IHRl c3RmaWxlICJpMzg2LWRpc3Atc3RlcCIKK3NldCBzcmNmaWxlICR7dGVzdGZp bGV9LlMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0 ZmlsZX0KKworc2V0IGFkZGl0aW9uYWxfZmxhZ3MgIi1XYSwtZyIKKworaWYg eyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxl fSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUgW2xpc3QgZGVidWcgJGFkZGl0 aW9uYWxfZmxhZ3NdXSAhPSAiIiB9IHsKKyAgICB1bnRlc3RlZCBpMzg2LWRp c3Atc3RlcC5leHAKKyAgICByZXR1cm4gLTEKK30KKworIyBHZXQgdGhpbmdz IHN0YXJ0ZWQuCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRp YWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxl fQorCitnZGJfdGVzdCAic2V0IGRpc3BsYWNlZC1zdGVwcGluZyBvbiIgIiIK K2dkYl90ZXN0ICJzaG93IGRpc3BsYWNlZC1zdGVwcGluZyIgIi4qIGRpc3Bs YWNlZCBzdGVwcGluZyAuKiBpcyBvbi4qIgorCitpZiAhW3J1bnRvX21haW5d IHRoZW4geworICAgIGZhaWwgIkNhbid0IHJ1biB0byBtYWluIgorICAgIHJl dHVybiAwCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIworCisjIFRlc3QgY2FsbC9yZXQuCisKK2dkYl90ZXN0ICJi cmVhayB0ZXN0X2NhbGwiIFwKKyAgICAiQnJlYWtwb2ludC4qYXQuKiBmaWxl IC4qJHNyY2ZpbGUsIGxpbmUuKiIgXAorICAgICJicmVhayB0ZXN0X2NhbGwi CitnZGJfdGVzdCAiYnJlYWsgdGVzdF9jYWxsX2VuZCIgXAorICAgICJCcmVh a3BvaW50LiphdC4qIGZpbGUgLiokc3JjZmlsZSwgbGluZS4qIiBcCisgICAg ImJyZWFrIHRlc3RfY2FsbF9lbmQiCisKK2dkYl90ZXN0ICJicmVhayB0ZXN0 X3JldCIgXAorICAgICJCcmVha3BvaW50LiphdC4qIGZpbGUgLiokc3JjZmls ZSwgbGluZS4qIiBcCisgICAgImJyZWFrIHRlc3RfcmV0IgorZ2RiX3Rlc3Qg ImJyZWFrIHRlc3RfcmV0X2VuZCIgXAorICAgICJCcmVha3BvaW50LiphdC4q IGZpbGUgLiokc3JjZmlsZSwgbGluZS4qIiBcCisgICAgImJyZWFrIHRlc3Rf cmV0X2VuZCIKKworZ2RiX3Rlc3QgImNvbnRpbnVlIiBcCisgICAgIkNvbnRp bnVpbmcuKkJyZWFrcG9pbnQuKiwgdGVzdF9jYWxsICgpLioiIFwKKyAgICAi Y29udGludWUgdG8gdGVzdF9jYWxsIgorZ2RiX3Rlc3QgImNvbnRpbnVlIiBc CisgICAgIkNvbnRpbnVpbmcuKkJyZWFrcG9pbnQuKiwgdGVzdF9jYWxsX2Vu ZCAoKS4qIiBcCisgICAgImNvbnRpbnVlIHRvIHRlc3RfY2FsbF9lbmQiCisK K2dkYl90ZXN0ICJjb250aW51ZSIgXAorICAgICJDb250aW51aW5nLipCcmVh a3BvaW50LiosIHRlc3RfcmV0ICgpLioiIFwKKyAgICAiY29udGludWUgdG8g dGVzdF9yZXQiCitnZGJfdGVzdCAiY29udGludWUiIFwKKyAgICAiQ29udGlu dWluZy4qQnJlYWtwb2ludC4qLCB0ZXN0X3JldF9lbmQgKCkuKiIgXAorICAg ICJjb250aW51ZSB0byB0ZXN0X3JldF9lbmQiCisKKyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFRlc3Qgc3lzY2Fs bC4KKworZ2RiX3Rlc3QgImJyZWFrIHRlc3Rfc3lzY2FsbCIgXAorICAgICJC cmVha3BvaW50LiphdC4qIGZpbGUgLiokc3JjZmlsZSwgbGluZS4qIiBcCisg ICAgImJyZWFrIHRlc3Rfc3lzY2FsbCIKK2dkYl90ZXN0ICJicmVhayB0ZXN0 X3N5c2NhbGxfZW5kIiBcCisgICAgIkJyZWFrcG9pbnQuKmF0LiogZmlsZSAu KiRzcmNmaWxlLCBsaW5lLioiIFwKKyAgICAiYnJlYWsgdGVzdF9zeXNjYWxs X2VuZCIKKworZ2RiX3Rlc3QgImNvbnRpbnVlIiBcCisgICAgIkNvbnRpbnVp bmcuKkJyZWFrcG9pbnQuKiwgdGVzdF9zeXNjYWxsICgpLioiIFwKKyAgICAi Y29udGludWUgdG8gdGVzdF9zeXNjYWxsIgorZ2RiX3Rlc3QgImNvbnRpbnVl IiBcCisgICAgIkNvbnRpbnVpbmcuKkJyZWFrcG9pbnQuKiwgdGVzdF9zeXNj YWxsX2VuZCAoKS4qIiBcCisgICAgImNvbnRpbnVlIHRvIHRlc3Rfc3lzY2Fs bF9lbmQiCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIworCisjIERvbmUsIHJ1biBwcm9ncmFtIHRvIGV4aXQuCisKK2dk Yl9jb250aW51ZV90b19lbmQgImkzODYtZGlzcC1zdGVwIgo= --000e0cd1b57a110078046186ea16--