From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32125 invoked by alias); 19 Dec 2008 07:20:57 -0000 Received: (qmail 32091 invoked by uid 22791); 19 Dec 2008 07:20:50 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL,BAYES_00,SARE_MSGID_LONG40,SPF_PASS X-Spam-Check-By: sourceware.org Received: from ti-out-0910.google.com (HELO ti-out-0910.google.com) (209.85.142.185) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 19 Dec 2008 07:19:48 +0000 Received: by ti-out-0910.google.com with SMTP id d10so579527tib.12 for ; Thu, 18 Dec 2008 23:19:44 -0800 (PST) Received: by 10.110.17.6 with SMTP id 6mr4228749tiq.27.1229671184442; Thu, 18 Dec 2008 23:19:44 -0800 (PST) Received: by 10.110.68.20 with HTTP; Thu, 18 Dec 2008 23:19:44 -0800 (PST) Message-ID: Date: Fri, 19 Dec 2008 07:20:00 -0000 From: teawater To: "gdb-patches@sourceware.org" , "Michael Snyder" Subject: Re: [RFA] Resubmit process record and replay, 3/10 In-Reply-To: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_38552_2099283.1229671184417" References: 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: 2008-12/txt/msg00337.txt.bz2 ------=_Part_38552_2099283.1229671184417 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 16078 This is the new version patch. On Sun, Nov 16, 2008 at 16:18, teawater wrote: > This patch add the process record and replay target. This is the core > part of process record and replay. > > 2008-11-16 Hui Zhu > > Process record and replay target. > > * Makefile.in (record.c): New file. > * record.c, record.h: New file. > > Makefile.in | 4 > b/record.c | 1156 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > b/record.h | 99 +++++ > 3 files changed, 1257 insertions(+), 2 deletions(-) > > Following is the diff with the previous patch: > @@ -1,6 +1,6 @@ > --- a/Makefile.in > +++ b/Makefile.in > -@@ -657,7 +657,7 @@ SFILES = ada-exp.y ada-lang.c ada-typepr > +@@ -657,7 +657,7 @@ > valarith.c valops.c valprint.c value.c varobj.c vec.c \ > wrapper.c \ > xml-tdesc.c xml-support.c \ > @@ -9,7 +9,7 @@ > > LINTFILES = $(SFILES) $(YYFILES) $(CONFIG_SRCS) init.c > > -@@ -808,7 +808,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $ > +@@ -808,7 +808,7 @@ > solib.o solib-null.o \ > prologue-value.o memory-map.o xml-support.o \ > target-descriptions.o target-memory.o xml-tdesc.o xml-builtin.o \ > @@ -18,9 +18,9 @@ > > TSOBS = inflow.o > > ---- a/record.c > +--- a//dev/null > +++ b/record.c > -@@ -0,0 +1,1143 @@ > +@@ -0,0 +1,1156 @@ > +/* Process record and replay target for GDB, the GNU debugger. > + > + Copyright (C) 2008 Free Software Foundation, Inc. > @@ -29,7 +29,7 @@ > + > + 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 > ++ the Free Software Foundation; either version 3 of the License, or > + (at your option) any later version. > + > + This program is distributed in the hope that it will be useful, > @@ -265,9 +265,12 @@ > + > + if (target_read_memory (addr, rec->u.mem.val, len)) > + { > -+ fprintf_unfiltered (gdb_stdlog, > -+ "Process record: read memory addr = 0x%s len = %d error.\n", > -+ paddr_nz (addr), len); > ++ if (record_debug) > ++ { > ++ fprintf_unfiltered (gdb_stdlog, > ++ "Process record: error reading memory at addr = 0x%s len = %d.\n", > ++ paddr_nz (addr), len); > ++ } > + xfree (rec->u.mem.val); > + xfree (rec); > + return (-1); > @@ -311,13 +314,13 @@ > + gdb_assert (record_insn_num <= record_insn_max_num); > + if (record_insn_num == record_insn_max_num) > + { > -+ /* Ask user how to do */ > ++ /* Ask user what to do */ > + if (record_stop_at_limit) > + { > + int q; > + if (set_terminal) > + target_terminal_ours (); > -+ q = yquery (_("The record instruction number > (record-insn-number) is equal to record-insn-number-max. Do you want > to close record/replay stop when record/replay buffer becomes > full(record-stop-at-limit) then auto delete first record_t?")); > ++ q = yquery (_("Do you want to auto delete previous execute > log entries when record/replay buffer becomes full > (record-stop-at-limit)?")); > + if (set_terminal) > + target_terminal_inferior (); > + if (q) > @@ -326,7 +329,7 @@ > + } > + else > + { > -+ error (_("Process record: record stop the program.")); > ++ error (_("Process record: inferior program stopped.")); > + } > + } > + } > @@ -363,9 +366,9 @@ > + ret = gdbarch_process_record (gdbarch, > + regcache_read_pc (record_regcache)); > + if (ret > 0) > -+ error (_("Process record pause the program.")); > ++ error (_("Process record: inferior program stopped.")); > + if (ret < 0) > -+ error (_("Process record record message error.")); > ++ error (_("Process record: failed to record execution log.")); > + > + discard_cleanups (old_cleanups); > + > @@ -417,7 +420,7 @@ > + } > + if (target_async_permitted) > + { > -+ error (_("Process record target can't debug the GNU/Linux > inferior in asynchronous mode (linux-async).")); > ++ error (_("Process record target can't debug inferior in > asynchronous mode (target-async).")); > + } > + > + if (!gdbarch_process_record_p (current_gdbarch)) > @@ -429,7 +432,7 @@ > + if (RECORD_IS_USED) > + { > + if (!nquery > -+ (_("Process record target already running, do you want delete the > old record log?"))) > ++ (_("Process record target already running, do you want to delete > the old record log?"))) > + { > + return; > + } > @@ -554,10 +557,10 @@ > + act.sa_flags = SA_RESTART; > + if (sigaction (SIGINT, &act, &old_act)) > + { > -+ perror_with_name (_("Process record: sigaction")); > ++ perror_with_name (_("Process record: sigaction failed")); > + } > + /* If GDB is in terminal_inferior, it will not get the signal. > -+ And in GDB replay mode, GDB don't need to in terminal_inferior > ++ And in GDB replay mode, GDB doesn't need to in terminal_inferior > + because inferior will not executed. > + Then set it to terminal_ours to make GDB get the signal. */ > + target_terminal_ours (); > @@ -620,7 +623,7 @@ > + if (target_read_memory > + (record_list->u.mem.addr, mem, record_list->u.mem.len)) > + { > -+ error (_("Process record: read memory addr = 0x%s len = %d error."), > ++ error (_("Process record: error reading memory at addr = 0x%s len = %d."), > + paddr_nz (record_list->u.mem.addr), > + record_list->u.mem.len); > + } > @@ -629,7 +632,7 @@ > + record_list->u.mem.len)) > + { > + error (_ > -+ ("Process record: write memory addr = 0x%s len = %d error."), > ++ ("Process record: error writing memory at addr = 0x%s len = %d."), > + paddr_nz (record_list->u.mem.addr), > + record_list->u.mem.len); > + } > @@ -657,7 +660,7 @@ > + if (first_record_end && execution_direction == EXEC_REVERSE) > + { > + /* When reverse excute, the first record_end is the part of > -+ current instruction. */ > ++ current instruction. */ > + first_record_end = 0; > + } > + else > @@ -723,7 +726,7 @@ > + > + if (sigaction (SIGALRM, &old_act, NULL)) > + { > -+ perror_with_name (_("Process record: sigaction")); > ++ perror_with_name (_("Process record: sigaction failed")); > + } > + > +replay_out: > @@ -754,7 +757,7 @@ > +} > + > +static void > -+record_detach (char *args, int from_tty) > ++record_detach (struct target_ops *ops, char *args, int from_tty) > +{ > + if (record_debug) > + { > @@ -765,7 +768,7 @@ > +} > + > +static void > -+record_mourn_inferior (void) > ++record_mourn_inferior (struct target_ops *ops) > +{ > + if (record_debug) > + { > @@ -807,7 +810,7 @@ > + if (record_arch_list_add_reg (i)) > + { > + record_list_release (record_arch_list_tail); > -+ error (_("Process record: record message error.")); > ++ error (_("Process record: failed to record execution log.")); > + } > + } > + } > @@ -816,13 +819,13 @@ > + if (record_arch_list_add_reg (regnum)) > + { > + record_list_release (record_arch_list_tail); > -+ error (_("Process record: record message error.")); > ++ error (_("Process record: failed to record execution log.")); > + } > + } > + if (record_arch_list_add_end (0)) > + { > + record_list_release (record_arch_list_tail); > -+ error (_("Process record: record message error.")); > ++ error (_("Process record: failed to record execution log.")); > + } > + record_list->next = record_arch_list_head; > + record_arch_list_head->prev = record_list; > @@ -853,13 +856,13 @@ > + { > + n = > + nquery (_ > -+ ("Becuse GDB is in replay mode, changing the value of a register > will destroy the record from this point forward. Change all > register?")); > ++ ("Becuse GDB is in replay mode, changing the value of a register > will make the execute log unusable from this point onward. Change all > register?")); > + } > + else > + { > + n = > + nquery (_ > -+ ("Becuse GDB is in replay mode, changing the value of a register > will destroy the record from this point forward. Change register > %s?"), > ++ ("Becuse GDB is in replay mode, changing the value of a register > will make the execute log unusable from this point onward. Change > register %s?"), > + gdbarch_register_name (get_regcache_arch (regcache), > + regno)); > + } > @@ -867,7 +870,7 @@ > + if (!n) > + { > + /* Invalidate the value of regcache that set in function > -+ "regcache_raw_write". */ > ++ "regcache_raw_write". */ > + if (regno < 0) > + { > + int i; > @@ -883,7 +886,7 @@ > + regcache_invalidate (regcache, regno); > + } > + > -+ error (_("Process record cancel the operation.")); > ++ error (_("Process record canceled the operation.")); > + } > + > + /* Destroy the record from here forward. */ > @@ -911,7 +914,7 @@ > + if (RECORD_IS_REPLAY) > + { > + /* Let user choice if he want to write memory or not. */ > -+ if (!nquery (_("Because GDB is in replay mode, writing to memory > will destroy the record from this point forward. Write memory at > address 0x%s?"), > ++ if (!nquery (_("Because GDB is in replay mode, writing to memory > will make the execute log unusable from this point onward. Write > memory at address 0x%s?"), > + paddr_nz (offset))) > + { > + return -1; > @@ -930,13 +933,23 @@ > + if (record_arch_list_add_mem (offset, len)) > + { > + record_list_release (record_arch_list_tail); > -+ fprintf_unfiltered (gdb_stdlog, _("Process record: record message > error.")); > ++ if (record_debug) > ++ { > ++ fprintf_unfiltered (gdb_stdlog, > ++ _ > ++ ("Process record: failed to record execution log.")); > ++ } > + return -1; > + } > + if (record_arch_list_add_end (0)) > + { > + record_list_release (record_arch_list_tail); > -+ fprintf_unfiltered (gdb_stdlog, _("Process record: record message > error.")); > ++ if (record_debug) > ++ { > ++ fprintf_unfiltered (gdb_stdlog, > ++ _ > ++ ("Process record: failed to record execution log.")); > ++ } > + return -1; > + } > + record_list->next = record_arch_list_head; > @@ -1040,14 +1053,14 @@ > + { > + if (RECORD_IS_REPLAY) > + { > -+ if (!from_tty || query (_("Process record: delete the log from > this point forward and begin to record the running message at current > PC?"))) > ++ if (!from_tty || query (_("Delete the log from this point forward > and begin to record the running message at current PC?"))) > + { > + record_list_release_next (); > + } > + } > + else > + { > -+ printf_unfiltered (_("Process record: already at end of record list.\n")); > ++ printf_unfiltered (_("Already at end of record list.\n")); > + } > + > + } > @@ -1064,7 +1077,7 @@ > +{ > + if (RECORD_IS_USED) > + { > -+ if (!record_list || !from_tty || query (_("Process record: > delete recorded log and stop recording?"))) > ++ if (!record_list || !from_tty || query (_("Delete recorded log > and stop recording?"))) > + { > + unpush_target (&record_ops); > + } > @@ -1082,7 +1095,7 @@ > +{ > + if (record_insn_num > record_insn_max_num && record_insn_max_num) > + { > -+ printf_unfiltered (_("Process record: record instructions > number is bigger than record instructions max number. Auto delete the > first ones.\n")); > ++ printf_unfiltered (_("Record instructions number is bigger > than record instructions max number. Auto delete the first > ones?\n")); > + > + while (record_insn_num > record_insn_max_num) > + { > @@ -1107,7 +1120,7 @@ > + /* Init record_maskall. */ > + if (sigfillset (&record_maskall) == -1) > + { > -+ perror_with_name (_("Process record: sigfillset")); > ++ perror_with_name (_("Process record: sigfillset failed")); > + } > + > + /* Init record_first. */ > @@ -1137,7 +1150,7 @@ > + other affect to GDB such as call function "no_shared_libraries". > + So I add special commands to GDB. */ > + add_com ("delrecord", class_obscure, cmd_record_delete, > -+ _("When process record target running in replay mode, delete the > next running messages and begin to record the running message at > current address.")); > ++ _("Delete the rest of execution log and start recording it anew.")); > + add_com_alias ("dr", "delrecord", class_obscure, 1); > + add_com ("stoprecord", class_obscure, cmd_record_stop, > + _("Stop the record/replay target.")); > @@ -1146,12 +1159,12 @@ > + /* Record instructions number limit command. */ > + add_setshow_boolean_cmd ("record-stop-at-limit", no_class, > + &record_stop_at_limit, > -+ _("Set record/replay stop when record/replay buffer becomes full."), > -+ _("Show record/replay stop when record/replay buffer becomes > full."), _("\ > ++ _("Set whether record/replay stop when record/replay buffer > becomes full."), > ++ _("Show whether record/replay stop when record/replay buffer > becomes full."), _("\ > +Enable is default value.\n\ > -+When enable, if the record/replay buffer becomes full,\n\ > -+ask user how to do.\n\ > -+When disable, if the record/replay buffer becomes full,\n\ > ++When enabled, if the record/replay buffer becomes full,\n\ > ++ask user what to do.\n\ > ++When disabled, if the record/replay buffer becomes full,\n\ > +delete it and start new recording."), NULL, NULL, &setlist, &showlist); > + add_setshow_zinteger_cmd ("record-insn-number-max", no_class, > + &record_insn_max_num, > @@ -1164,7 +1177,7 @@ > + add_info ("record-insn-number", show_record_insn_number, _("\ > +Show the current number of instructions in the record/replay buffer.")); > +} > ---- a/record.h > +--- a//dev/null > +++ b/record.h > @@ -0,0 +1,99 @@ > +/* Process record and replay target for GDB, the GNU debugger. > @@ -1175,7 +1188,7 @@ > + > + 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 > ++ the Free Software Foundation; either version 3 of the License, or > + (at your option) any later version. > + > + This program is distributed in the hope that it will be useful, > ------=_Part_38552_2099283.1229671184417 Content-Type: text/plain; name=3-record_target.txt Content-Transfer-Encoding: base64 X-Attachment-Id: f_fowipedd1 Content-Disposition: attachment; filename=3-record_target.txt Content-length: 49715 LS0tIGEvTWFrZWZpbGUuaW4KKysrIGIvTWFrZWZpbGUuaW4KQEAgLTY1Nyw3 ICs2NTcsNyBAQAogCXZhbGFyaXRoLmMgdmFsb3BzLmMgdmFscHJpbnQuYyB2 YWx1ZS5jIHZhcm9iai5jIHZlYy5jIFwKIAl3cmFwcGVyLmMgXAogCXhtbC10 ZGVzYy5jIHhtbC1zdXBwb3J0LmMgXAotCWluZmVyaW9yLmMKKwlpbmZlcmlv ci5jIHJlY29yZC5jCiAKIExJTlRGSUxFUyA9ICQoU0ZJTEVTKSAkKFlZRklM RVMpICQoQ09ORklHX1NSQ1MpIGluaXQuYwogCkBAIC04MDgsNyArODA4LDcg QEAKIAlzb2xpYi5vIHNvbGliLW51bGwubyBcCiAJcHJvbG9ndWUtdmFsdWUu byBtZW1vcnktbWFwLm8geG1sLXN1cHBvcnQubyBcCiAJdGFyZ2V0LWRlc2Ny aXB0aW9ucy5vIHRhcmdldC1tZW1vcnkubyB4bWwtdGRlc2MubyB4bWwtYnVp bHRpbi5vIFwKLQlpbmZlcmlvci5vIG9zZGF0YS5vCisJaW5mZXJpb3IubyBv c2RhdGEubyByZWNvcmQubwogCiBUU09CUyA9IGluZmxvdy5vCiAKLS0tIGEv L2Rldi9udWxsCisrKyBiL3JlY29yZC5jCkBAIC0wLDAgKzEsMTI3MiBAQAor LyogUHJvY2VzcyByZWNvcmQgYW5kIHJlcGxheSB0YXJnZXQgZm9yIEdEQiwg dGhlIEdOVSBkZWJ1Z2dlci4KKworICAgQ29weXJpZ2h0IChDKSAyMDA4IEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUg aXMgcGFydCBvZiBHREIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNv ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5 CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGlj ZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp b24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQg QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu dHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91 bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElm IG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICov CisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisj aW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAicmVnY2FjaGUuaCIKKyNp bmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgImdkYnRocmVhZC5oIgor I2luY2x1ZGUgInJlY29yZC5oIgorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisK KyNkZWZpbmUgREVGQVVMVF9SRUNPUkRfSU5TTl9NQVhfTlVNCTIwMDAwMAor CitpbnQgcmVjb3JkX2RlYnVnID0gMDsKKworcmVjb3JkX3QgcmVjb3JkX2Zp cnN0OworcmVjb3JkX3QgKnJlY29yZF9saXN0ID0gJnJlY29yZF9maXJzdDsK K3JlY29yZF90ICpyZWNvcmRfYXJjaF9saXN0X2hlYWQgPSBOVUxMOworcmVj b3JkX3QgKnJlY29yZF9hcmNoX2xpc3RfdGFpbCA9IE5VTEw7CitzdHJ1Y3Qg cmVnY2FjaGUgKnJlY29yZF9yZWdjYWNoZSA9IE5VTEw7CisKKy8qIDEgYXNr IHVzZXIuIDAgYXV0byBkZWxldGUgdGhlIGxhc3QgcmVjb3JkX3QuICAqLwor c3RhdGljIGludCByZWNvcmRfc3RvcF9hdF9saW1pdCA9IDE7CitzdGF0aWMg aW50IHJlY29yZF9pbnNuX21heF9udW0gPSBERUZBVUxUX1JFQ09SRF9JTlNO X01BWF9OVU07CitzdGF0aWMgaW50IHJlY29yZF9pbnNuX251bSA9IDA7CisK K3N0cnVjdCB0YXJnZXRfb3BzIHJlY29yZF9vcHM7CitzdGF0aWMgaW50IHJl Y29yZF9yZXN1bWVfc3RlcCA9IDA7CitzdGF0aWMgZW51bSB0YXJnZXRfc2ln bmFsIHJlY29yZF9yZXN1bWVfc2lnZ25hbDsKK3N0YXRpYyBpbnQgcmVjb3Jk X2dldF9zaWcgPSAwOworc3RhdGljIHNpZ3NldF90IHJlY29yZF9tYXNrYWxs Oworc3RhdGljIGludCByZWNvcmRfbm90X3JlY29yZCA9IDA7CitpbnQgcmVj b3JkX3dpbGxfc3RvcmVfcmVnaXN0ZXJzID0gMDsKKworZXh0ZXJuIHN0cnVj dCBicF9sb2NhdGlvbiAqYnBfbG9jYXRpb25fY2hhaW47CisKKy8qIFRoZSBy ZWFsIGJlbmVhdGggZnVuY3Rpb24gcG9pbnRlcnMuICAqLwordm9pZCAoKnJl Y29yZF9iZW5lYXRoX3RvX3Jlc3VtZSkgKHB0aWRfdCwgaW50LCBlbnVtIHRh cmdldF9zaWduYWwpOworcHRpZF90ICgqcmVjb3JkX2JlbmVhdGhfdG9fd2Fp dCkgKHB0aWRfdCwgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICopOwordm9p ZCAoKnJlY29yZF9iZW5lYXRoX3RvX3N0b3JlX3JlZ2lzdGVycykgKHN0cnVj dCByZWdjYWNoZSAqLCBpbnQgcmVnbm8pOworTE9OR0VTVCAoKnJlY29yZF9i ZW5lYXRoX3RvX3hmZXJfcGFydGlhbCkgKHN0cnVjdCB0YXJnZXRfb3BzICog b3BzLAorCQkJCQkgICBlbnVtIHRhcmdldF9vYmplY3Qgb2JqZWN0LAorCQkJ CQkgICBjb25zdCBjaGFyICphbm5leCwKKwkJCQkJICAgZ2RiX2J5dGUgKiBy ZWFkYnVmLAorCQkJCQkgICBjb25zdCBnZGJfYnl0ZSAqIHdyaXRlYnVmLAor CQkJCQkgICBVTE9OR0VTVCBvZmZzZXQsIExPTkdFU1QgbGVuKTsKK2ludCAo KnJlY29yZF9iZW5lYXRoX3RvX2luc2VydF9icmVha3BvaW50KSAoc3RydWN0 IGJwX3RhcmdldF9pbmZvICopOworaW50ICgqcmVjb3JkX2JlbmVhdGhfdG9f cmVtb3ZlX2JyZWFrcG9pbnQpIChzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKik7 CisKK3N0YXRpYyB2b2lkCityZWNvcmRfbGlzdF9yZWxlYXNlIChyZWNvcmRf dCAqIHJlYykKK3sKKyAgcmVjb3JkX3QgKnRtcDsKKworICBpZiAoIXJlYykK KyAgICByZXR1cm47CisKKyAgd2hpbGUgKHJlYy0+bmV4dCkKKyAgICB7Cisg ICAgICByZWMgPSByZWMtPm5leHQ7CisgICAgfQorCisgIHdoaWxlIChyZWMt PnByZXYpCisgICAgeworICAgICAgdG1wID0gcmVjOworICAgICAgcmVjID0g cmVjLT5wcmV2OworICAgICAgaWYgKHRtcC0+dHlwZSA9PSByZWNvcmRfcmVn KQorCXsKKwkgIHhmcmVlICh0bXAtPnUucmVnLnZhbCk7CisJfQorICAgICAg ZWxzZSBpZiAodG1wLT50eXBlID09IHJlY29yZF9tZW0pCisJeworCSAgeGZy ZWUgKHRtcC0+dS5tZW0udmFsKTsKKwl9CisgICAgICB4ZnJlZSAodG1wKTsK KyAgICB9CisKKyAgaWYgKHJlYyAhPSAmcmVjb3JkX2ZpcnN0KQorICAgIHsK KyAgICAgIHhmcmVlIChyZWMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQK K3JlY29yZF9saXN0X3JlbGVhc2VfbmV4dCAodm9pZCkKK3sKKyAgcmVjb3Jk X3QgKnJlYyA9IHJlY29yZF9saXN0OworICByZWNvcmRfdCAqdG1wID0gcmVj LT5uZXh0OworICByZWMtPm5leHQgPSBOVUxMOworICB3aGlsZSAodG1wKQor ICAgIHsKKyAgICAgIHJlYyA9IHRtcC0+bmV4dDsKKyAgICAgIGlmICh0bXAt PnR5cGUgPT0gcmVjb3JkX3JlZykKKwl7CisJICByZWNvcmRfaW5zbl9udW0t LTsKKwl9CisgICAgICBlbHNlIGlmICh0bXAtPnR5cGUgPT0gcmVjb3JkX3Jl ZykKKwl7CisJICB4ZnJlZSAodG1wLT51LnJlZy52YWwpOworCX0KKyAgICAg IGVsc2UgaWYgKHRtcC0+dHlwZSA9PSByZWNvcmRfbWVtKQorCXsKKwkgIHhm cmVlICh0bXAtPnUubWVtLnZhbCk7CisJfQorICAgICAgeGZyZWUgKHRtcCk7 CisgICAgICB0bXAgPSByZWM7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAor cmVjb3JkX2xpc3RfcmVsZWFzZV9maXJzdCAodm9pZCkKK3sKKyAgcmVjb3Jk X3QgKnRtcCA9IE5VTEw7CisgIGVudW0gcmVjb3JkX3R5cGUgdHlwZTsKKwor ICBpZiAoIXJlY29yZF9maXJzdC5uZXh0KQorICAgIHsKKyAgICAgIHJldHVy bjsKKyAgICB9CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgdHlwZSA9 IHJlY29yZF9maXJzdC5uZXh0LT50eXBlOworCisgICAgICBpZiAodHlwZSA9 PSByZWNvcmRfcmVnKQorCXsKKwkgIHhmcmVlIChyZWNvcmRfZmlyc3QubmV4 dC0+dS5yZWcudmFsKTsKKwl9CisgICAgICBlbHNlIGlmICh0eXBlID09IHJl Y29yZF9tZW0pCisJeworCSAgeGZyZWUgKHJlY29yZF9maXJzdC5uZXh0LT51 Lm1lbS52YWwpOworCX0KKyAgICAgIHRtcCA9IHJlY29yZF9maXJzdC5uZXh0 OworICAgICAgcmVjb3JkX2ZpcnN0Lm5leHQgPSB0bXAtPm5leHQ7CisgICAg ICB4ZnJlZSAodG1wKTsKKworICAgICAgaWYgKCFyZWNvcmRfZmlyc3QubmV4 dCkKKwl7CisJICBnZGJfYXNzZXJ0IChyZWNvcmRfaW5zbl9udW0gPT0gMSk7 CisJICBicmVhazsKKwl9CisKKyAgICAgIHJlY29yZF9maXJzdC5uZXh0LT5w cmV2ID0gJnJlY29yZF9maXJzdDsKKworICAgICAgaWYgKHR5cGUgPT0gcmVj b3JkX2VuZCkKKwl7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIHJlY29y ZF9pbnNuX251bS0tOworfQorCisvKiBBZGQgYSByZWNvcmRfdCB0byByZWNv cmRfYXJjaF9saXN0LiAgKi8KK3N0YXRpYyB2b2lkCityZWNvcmRfYXJjaF9s aXN0X2FkZCAocmVjb3JkX3QgKiByZWMpCit7CisgIGlmIChyZWNvcmRfYXJj aF9saXN0X3RhaWwpCisgICAgeworICAgICAgcmVjb3JkX2FyY2hfbGlzdF90 YWlsLT5uZXh0ID0gcmVjOworICAgICAgcmVjLT5wcmV2ID0gcmVjb3JkX2Fy Y2hfbGlzdF90YWlsOworICAgICAgcmVjb3JkX2FyY2hfbGlzdF90YWlsID0g cmVjOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJlY29yZF9hcmNo X2xpc3RfaGVhZCA9IHJlYzsKKyAgICAgIHJlY29yZF9hcmNoX2xpc3RfdGFp bCA9IHJlYzsKKyAgICB9Cit9CisKKy8qIFJlY29yZCB0aGUgdmFsdWUgb2Yg YSByZWdpc3RlciAoIm51bSIpIHRvIHJlY29yZF9hcmNoX2xpc3QuICAqLwor aW50CityZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGludCBudW0pCit7Cisg IHJlY29yZF90ICpyZWM7CisKKyAgaWYgKHJlY29yZF9kZWJ1ZyA+IDEpCisg ICAgeworICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkbG9nLAor CQkJICAiUHJvY2VzcyByZWNvcmQ6IGFkZCByZWdpc3RlciBudW0gPSAlZCB0 byByZWNvcmQgbGlzdC5cbiIsCisJCQkgIG51bSk7CisgICAgfQorCisgIHJl YyA9IChyZWNvcmRfdCAqKSB4bWFsbG9jIChzaXplb2YgKHJlY29yZF90KSk7 CisgIHJlYy0+dS5yZWcudmFsID0gKGdkYl9ieXRlICopIHhtYWxsb2MgKE1B WF9SRUdJU1RFUl9TSVpFKTsKKyAgcmVjLT5wcmV2ID0gTlVMTDsKKyAgcmVj LT5uZXh0ID0gTlVMTDsKKyAgcmVjLT50eXBlID0gcmVjb3JkX3JlZzsKKyAg cmVjLT51LnJlZy5udW0gPSBudW07CisKKyAgcmVnY2FjaGVfcmF3X3JlYWQg KHJlY29yZF9yZWdjYWNoZSwgbnVtLCByZWMtPnUucmVnLnZhbCk7CisKKyAg cmVjb3JkX2FyY2hfbGlzdF9hZGQgKHJlYyk7CisKKyAgcmV0dXJuICgwKTsK K30KKworLyogUmVjb3JkIHRoZSB2YWx1ZSBvZiBhIHJlZ2lvbiBvZiBtZW1v cnkgd2hvc2UgYWRkcmVzcyBpcyAiYWRkciIgYW5kCisgICBsZW5ndGggaXMg ImxlbiIgdG8gcmVjb3JkX2FyY2hfbGlzdC4gICovCisKK2ludAorcmVjb3Jk X2FyY2hfbGlzdF9hZGRfbWVtIChDT1JFX0FERFIgYWRkciwgaW50IGxlbikK K3sKKyAgcmVjb3JkX3QgKnJlYzsKKworICBpZiAocmVjb3JkX2RlYnVnID4g MSkKKyAgICB7CisgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRs b2csCisJCQkgICJQcm9jZXNzIHJlY29yZDogYWRkIG1lbSBhZGRyID0gMHgl cyBsZW4gPSAlZCB0byByZWNvcmQgbGlzdC5cbiIsCisJCQkgIHBhZGRyX256 IChhZGRyKSwgbGVuKTsKKyAgICB9CisKKyAgaWYgKCFhZGRyKQorICAgIHsK KyAgICAgIHJldHVybiAoMCk7CisgICAgfQorCisgIHJlYyA9IChyZWNvcmRf dCAqKSB4bWFsbG9jIChzaXplb2YgKHJlY29yZF90KSk7CisgIHJlYy0+dS5t ZW0udmFsID0gKGdkYl9ieXRlICopIHhtYWxsb2MgKGxlbik7CisgIHJlYy0+ cHJldiA9IE5VTEw7CisgIHJlYy0+bmV4dCA9IE5VTEw7CisgIHJlYy0+dHlw ZSA9IHJlY29yZF9tZW07CisgIHJlYy0+dS5tZW0uYWRkciA9IGFkZHI7Cisg IHJlYy0+dS5tZW0ubGVuID0gbGVuOworCisgIGlmICh0YXJnZXRfcmVhZF9t ZW1vcnkgKGFkZHIsIHJlYy0+dS5tZW0udmFsLCBsZW4pKQorICAgIHsKKyAg ICAgIGlmIChyZWNvcmRfZGVidWcpCisJeworCSAgZnByaW50Zl91bmZpbHRl cmVkIChnZGJfc3RkbG9nLAorCQkJICAgICAgIlByb2Nlc3MgcmVjb3JkOiBl cnJvciByZWFkaW5nIG1lbW9yeSBhdCBhZGRyID0gMHglcyBsZW4gPSAlZC5c biIsCisJCQkgICAgICBwYWRkcl9ueiAoYWRkciksIGxlbik7CisJfQorICAg ICAgeGZyZWUgKHJlYy0+dS5tZW0udmFsKTsKKyAgICAgIHhmcmVlIChyZWMp OworICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorCisgIHJlY29yZF9hcmNo X2xpc3RfYWRkIChyZWMpOworCisgIHJldHVybiAoMCk7Cit9CisKKy8qIEFk ZCBhIHJlY29yZF9lbmQgdHlwZSByZWNvcmRfdCB0byByZWNvcmRfYXJjaF9s aXN0LiAgKi8KK2ludAorcmVjb3JkX2FyY2hfbGlzdF9hZGRfZW5kIChpbnQg bmVlZF9kYXNtKQoreworICByZWNvcmRfdCAqcmVjOworCisgIGlmIChyZWNv cmRfZGVidWcgPiAxKQorICAgIHsKKyAgICAgIGZwcmludGZfdW5maWx0ZXJl ZCAoZ2RiX3N0ZGxvZywKKwkJCSAgIlByb2Nlc3MgcmVjb3JkOiBhZGQgZW5k IG5lZWRfZGFzbSA9ICVkIHRvIGFyY2ggbGlzdC5cbiIsCisJCQkgIG5lZWRf ZGFzbSk7CisgICAgfQorCisgIHJlYyA9IChyZWNvcmRfdCAqKSB4bWFsbG9j IChzaXplb2YgKHJlY29yZF90KSk7CisgIHJlYy0+cHJldiA9IE5VTEw7Cisg IHJlYy0+bmV4dCA9IE5VTEw7CisgIHJlYy0+dHlwZSA9IHJlY29yZF9lbmQ7 CisKKyAgcmVjLT51Lm5lZWRfZGFzbSA9IG5lZWRfZGFzbTsKKworICByZWNv cmRfYXJjaF9saXN0X2FkZCAocmVjKTsKKworICByZXR1cm4gKDApOworfQor CitzdGF0aWMgdm9pZAorcmVjb3JkX2NoZWNrX2luc25fbnVtIChpbnQgc2V0 X3Rlcm1pbmFsKQoreworICBpZiAocmVjb3JkX2luc25fbWF4X251bSkKKyAg ICB7CisgICAgICBnZGJfYXNzZXJ0IChyZWNvcmRfaW5zbl9udW0gPD0gcmVj b3JkX2luc25fbWF4X251bSk7CisgICAgICBpZiAocmVjb3JkX2luc25fbnVt ID09IHJlY29yZF9pbnNuX21heF9udW0pCisJeworCSAgLyogQXNrIHVzZXIg d2hhdCB0byBkbyAqLworCSAgaWYgKHJlY29yZF9zdG9wX2F0X2xpbWl0KQor CSAgICB7CisJICAgICAgaW50IHE7CisJICAgICAgaWYgKHNldF90ZXJtaW5h bCkKKwkJdGFyZ2V0X3Rlcm1pbmFsX291cnMgKCk7CisJICAgICAgcSA9IHlx dWVyeSAoXygiRG8geW91IHdhbnQgdG8gYXV0byBkZWxldGUgcHJldmlvdXMg ZXhlY3V0ZSBsb2cgZW50cmllcyB3aGVuIHJlY29yZC9yZXBsYXkgYnVmZmVy IGJlY29tZXMgZnVsbCAocmVjb3JkLXN0b3AtYXQtbGltaXQpPyIpKTsKKwkg ICAgICBpZiAoc2V0X3Rlcm1pbmFsKQorCQl0YXJnZXRfdGVybWluYWxfaW5m ZXJpb3IgKCk7CisJICAgICAgaWYgKHEpCisJCXsKKwkJICByZWNvcmRfc3Rv cF9hdF9saW1pdCA9IDA7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBl cnJvciAoXygiUHJvY2VzcyByZWNvcmQ6IGluZmVyaW9yIHByb2dyYW0gc3Rv cHBlZC4iKSk7CisJCX0KKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qIEJl Zm9yZSBpbmZlcmlvciBzdGVwICh3aGVuIEdEQiByZWNvcmQgdGhlIHJ1bm5p bmcgbWVzc2FnZSwgaW5mZXJpb3IKKyAgIG9ubHkgY2FuIHN0ZXApLCBHREIg d2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gcmVjb3JkIHRoZSB2YWx1ZXMg dG8KKyAgIHJlY29yZF9saXN0LiAgVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGwg Z2RiYXJjaF9wcm9jZXNzX3JlY29yZCB0bworICAgcmVjb3JkIHRoZSBydW5u aW5nIG1lc3NhZ2Ugb2YgaW5mZXJpb3IgYW5kIHNldCB0aGVtIHRvCisgICBy ZWNvcmRfYXJjaF9saXN0LCBhbmQgYWRkIGl0IHRvIHJlY29yZF9saXN0LiAg Ki8KKworc3RhdGljIHZvaWQKK3JlY29yZF9tZXNzYWdlX2NsZWFudXBzICh2 b2lkICppZ25vcmUpCit7CisgIHJlY29yZF9saXN0X3JlbGVhc2UgKHJlY29y ZF9hcmNoX2xpc3RfdGFpbCk7CisgIHNldF9leGVjdXRpbmcgKGluZmVyaW9y X3B0aWQsIDApOworICBub3JtYWxfc3RvcCAoKTsKK30KKwordm9pZAorcmVj b3JkX21lc3NhZ2UgKHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoKQoreworICBp bnQgcmV0OworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NsZWFudXBzID0gbWFr ZV9jbGVhbnVwIChyZWNvcmRfbWVzc2FnZV9jbGVhbnVwcywgMCk7CisKKyAg LyogQ2hlY2sgcmVjb3JkX2luc25fbnVtLiAgKi8KKyAgcmVjb3JkX2NoZWNr X2luc25fbnVtICgxKTsKKworICByZWNvcmRfYXJjaF9saXN0X2hlYWQgPSBO VUxMOworICByZWNvcmRfYXJjaF9saXN0X3RhaWwgPSBOVUxMOworICByZWNv cmRfcmVnY2FjaGUgPSBnZXRfY3VycmVudF9yZWdjYWNoZSAoKTsKKworICBy ZXQgPSBnZGJhcmNoX3Byb2Nlc3NfcmVjb3JkIChnZGJhcmNoLAorCQkJCXJl Z2NhY2hlX3JlYWRfcGMgKHJlY29yZF9yZWdjYWNoZSkpOworICBpZiAocmV0 ID4gMCkKKyAgICBlcnJvciAoXygiUHJvY2VzcyByZWNvcmQ6IGluZmVyaW9y IHByb2dyYW0gc3RvcHBlZC4iKSk7CisgIGlmIChyZXQgPCAwKQorICAgIGVy cm9yIChfKCJQcm9jZXNzIHJlY29yZDogZmFpbGVkIHRvIHJlY29yZCBleGVj dXRpb24gbG9nLiIpKTsKKworICBkaXNjYXJkX2NsZWFudXBzIChvbGRfY2xl YW51cHMpOworCisgIHJlY29yZF9saXN0LT5uZXh0ID0gcmVjb3JkX2FyY2hf bGlzdF9oZWFkOworICByZWNvcmRfYXJjaF9saXN0X2hlYWQtPnByZXYgPSBy ZWNvcmRfbGlzdDsKKyAgcmVjb3JkX2xpc3QgPSByZWNvcmRfYXJjaF9saXN0 X3RhaWw7CisKKyAgaWYgKHJlY29yZF9pbnNuX251bSA9PSByZWNvcmRfaW5z bl9tYXhfbnVtICYmIHJlY29yZF9pbnNuX21heF9udW0pCisgICAgeworICAg ICAgcmVjb3JkX2xpc3RfcmVsZWFzZV9maXJzdCAoKTsKKyAgICB9CisgIGVs c2UKKyAgICB7CisgICAgICByZWNvcmRfaW5zbl9udW0rKzsKKyAgICB9Cit9 CisKKy8qIFRoaW5ncyB0byBjbGVhbiB1cCBpZiB3ZSBRVUlUIG91dCBvZiBm dW5jdGlvbiB0aGF0IHNldAorICAgcmVjb3JkX25vdF9yZWNvcmQuICAqLwor c3RhdGljIHZvaWQKK3JlY29yZF9ub3RfcmVjb3JkX2NsZWFudXBzICh2b2lk ICppZ25vcmUpCit7CisgIHJlY29yZF9ub3RfcmVjb3JkID0gMDsKK30KKwor dm9pZAorcmVjb3JkX25vdF9yZWNvcmRfc2V0ICh2b2lkKQoreworICBzdHJ1 Y3QgY2xlYW51cCAqb2xkX2NsZWFudXBzID0gbWFrZV9jbGVhbnVwIChyZWNv cmRfbm90X3JlY29yZF9jbGVhbnVwcywgMCk7CisgIHJlY29yZF9ub3RfcmVj b3JkID0gMTsKK30KKworc3RhdGljIHZvaWQKK3JlY29yZF9vcGVuIChjaGFy ICpuYW1lLCBpbnQgZnJvbV90dHkpCit7CisgIGlmIChyZWNvcmRfZGVidWcp CisgICAgeworICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkbG9n LCAiUHJvY2VzcyByZWNvcmQ6IHJlY29yZF9vcGVuXG4iKTsKKyAgICB9CisK KyAgLyogY2hlY2sgZXhlYyAqLworICBpZiAoIXRhcmdldF9oYXNfZXhlY3V0 aW9uKQorICAgIHsKKyAgICAgIGVycm9yIChfKCJQcm9jZXNzIHJlY29yZDog dGhlIHByb2dyYW0gaXMgbm90IGJlaW5nIHJ1bi4iKSk7CisgICAgfQorICBp ZiAobm9uX3N0b3ApCisgICAgeworICAgICAgZXJyb3IgKF8oIlByb2Nlc3Mg cmVjb3JkIHRhcmdldCBjYW4ndCBkZWJ1ZyBpbmZlcmlvciBpbiBub24tc3Rv cCBtb2RlIChub24tc3RvcCkuIikpOworICAgIH0KKyAgaWYgKHRhcmdldF9h c3luY19wZXJtaXR0ZWQpCisgICAgeworICAgICAgZXJyb3IgKF8oIlByb2Nl c3MgcmVjb3JkIHRhcmdldCBjYW4ndCBkZWJ1ZyBpbmZlcmlvciBpbiBhc3lu Y2hyb25vdXMgbW9kZSAodGFyZ2V0LWFzeW5jKS4iKSk7CisgICAgfQorCisg IGlmICghZ2RiYXJjaF9wcm9jZXNzX3JlY29yZF9wIChjdXJyZW50X2dkYmFy Y2gpKQorICAgIHsKKyAgICAgIGVycm9yIChfKCJQcm9jZXNzIHJlY29yZDog dGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlIGRvZXNuJ3Qgc3VwcG9ydCByZWNv cmQgZnVuY3Rpb24uIikpOworICAgIH0KKworICAvKiBDaGVjayBpZiByZWNv cmQgdGFyZ2V0IGlzIGFscmVhZHkgcnVubmluZyAqLworICBpZiAoUkVDT1JE X0lTX1VTRUQpCisgICAgeworICAgICAgaWYgKCFucXVlcnkKKwkgIChfKCJQ cm9jZXNzIHJlY29yZCB0YXJnZXQgYWxyZWFkeSBydW5uaW5nLCBkbyB5b3Ug d2FudCB0byBkZWxldGUgdGhlIG9sZCByZWNvcmQgbG9nPyIpKSkKKwl7CisJ ICByZXR1cm47CisJfQorICAgIH0KKworICBwdXNoX3RhcmdldCAoJnJlY29y ZF9vcHMpOworCisgIC8qIFJlc2V0ICovCisgIHJlY29yZF9pbnNuX251bSA9 IDA7CisgIHJlY29yZF9saXN0ID0gJnJlY29yZF9maXJzdDsKKyAgcmVjb3Jk X2xpc3QtPm5leHQgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorcmVjb3Jk X2Nsb3NlIChpbnQgcXVpdHRpbmcpCit7CisgIGlmIChyZWNvcmRfZGVidWcp CisgICAgeworICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkbG9n LCAiUHJvY2VzcyByZWNvcmQ6IHJlY29yZF9jbG9zZVxuIik7CisgICAgfQor ICByZWNvcmRfbGlzdF9yZWxlYXNlIChyZWNvcmRfbGlzdCk7Cit9CisKK3N0 YXRpYyB2b2lkCityZWNvcmRfcmVzdW1lIChwdGlkX3QgcHRpZCwgaW50IHN0 ZXAsIGVudW0gdGFyZ2V0X3NpZ25hbCBzaWdnbmFsKQoreworICByZWNvcmRf cmVzdW1lX3N0ZXAgPSBzdGVwOworICByZWNvcmRfcmVzdW1lX3NpZ2duYWwg PSBzaWdnbmFsOworCisgIGlmICghUkVDT1JEX0lTX1JFUExBWSkKKyAgICB7 CisgICAgICByZWNvcmRfbWVzc2FnZSAoY3VycmVudF9nZGJhcmNoKTsKKyAg ICAgIHJlY29yZF9iZW5lYXRoX3RvX3Jlc3VtZSAocHRpZCwgMSwgc2lnZ25h bCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcmVjb3JkX3NpZ19oYW5k bGVyIChpbnQgc2lnbm8pCit7CisgIGlmIChyZWNvcmRfZGVidWcpCisgICAg eworICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkbG9nLCAiUHJv Y2VzcyByZWNvcmQ6IGdldCBhIHNpZ25hbFxuIik7CisgICAgfQorICByZWNv cmRfcmVzdW1lX3N0ZXAgPSAxOworICByZWNvcmRfZ2V0X3NpZyA9IDE7Cit9 CisKK3N0YXRpYyB2b2lkCityZWNvcmRfd2FpdF9jbGVhbnVwcyAodm9pZCAq aWdub3JlKQoreworICBpZiAoZXhlY3V0aW9uX2RpcmVjdGlvbiA9PSBFWEVD X1JFVkVSU0UpCisgICAgeworICAgICAgaWYgKHJlY29yZF9saXN0LT5uZXh0 KQorCXsKKwkgIHJlY29yZF9saXN0ID0gcmVjb3JkX2xpc3QtPm5leHQ7CisJ fQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJlY29yZF9saXN0ID0g cmVjb3JkX2xpc3QtPnByZXY7CisgICAgfQorICBzZXRfZXhlY3V0aW5nIChp bmZlcmlvcl9wdGlkLCAwKTsKKyAgbm9ybWFsX3N0b3AgKCk7Cit9CisKKy8q IHJlY29yZF93YWl0CisgICBJbiByZXBsYXkgbW9kZSwgdGhpcyBmdW5jdGlv biBleGFtaW5lcyB0aGUgcmVjb3JkZWQgbG9nIGFuZAorICAgZGV0ZXJtaW5l cyB3aGVyZSB0byBzdG9wLiAgKi8KKworc3RhdGljIHB0aWRfdAorcmVjb3Jk X3dhaXQgKHB0aWRfdCBwdGlkLCBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMg KnN0YXR1cykKK3sKKyAgaWYgKHJlY29yZF9kZWJ1ZykKKyAgICB7CisgICAg ICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRsb2csCisJCQkgICJQcm9j ZXNzIHJlY29yZDogcmVjb3JkX3dhaXQgcmVjb3JkX3Jlc3VtZV9zdGVwID0g JWRcbiIsCisJCQkgIHJlY29yZF9yZXN1bWVfc3RlcCk7CisgICAgfQorCisg IGlmICghUkVDT1JEX0lTX1JFUExBWSkKKyAgICB7CisgICAgICBpZiAocmVj b3JkX3Jlc3VtZV9zdGVwKQorCXsKKwkgIC8qIFRoaXMgaXMgYSBzaW5nbGUg c3RlcC4gICovCisJICByZXR1cm4gcmVjb3JkX2JlbmVhdGhfdG9fd2FpdCAo cHRpZCwgc3RhdHVzKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKHJl Y29yZF9yZXN1bWVfc3RlcCkKKwkgICAgeworCSAgICAgIC8qIFRoaXMgaXMg YSBzaW5nbGUgc3RlcC4gICovCisJICAgICAgcmV0dXJuIHJlY29yZF9iZW5l YXRoX3RvX3dhaXQgKHB0aWQsIHN0YXR1cyk7CisJICAgIH0KKwkgIGVsc2UK KwkgICAgeworCSAgICAgIC8qIFRoaXMgaXMgbm90IGEgc2luZ2xlIHN0ZXAu ICAqLworCSAgICAgIHB0aWRfdCByZXQ7CisJICAgICAgaW50IGlzX2JyZWFr cG9pbnQgPSAxOworCSAgICAgIENPUkVfQUREUiBwYzsKKwkgICAgICBpbnQg cGNfaXNfcmVhZCA9IDA7CisJICAgICAgc3RydWN0IGJwX2xvY2F0aW9uICpi bDsKKwkgICAgICBzdHJ1Y3QgYnJlYWtwb2ludCAqYjsKKworCSAgICAgIGRv CisJCXsKKwkJICByZXQgPSByZWNvcmRfYmVuZWF0aF90b193YWl0IChwdGlk LCBzdGF0dXMpOworCisJCSAgaWYgKHN0YXR1cy0+a2luZCA9PSBUQVJHRVRf V0FJVEtJTkRfU1RPUFBFRAorCQkgICAgICAmJiBzdGF0dXMtPnZhbHVlLnNp ZyA9PSBUQVJHRVRfU0lHTkFMX1RSQVApCisJCSAgICB7CisJCSAgICAgIC8q IENoZWNrIGlmIHRoZXJlIGlzIGEgYnJlYWtwb2ludC4gICovCisJCSAgICAg IHBjX2lzX3JlYWQgPSAwOworCQkgICAgICByZWdpc3RlcnNfY2hhbmdlZCAo KTsKKwkJICAgICAgZm9yIChibCA9IGJwX2xvY2F0aW9uX2NoYWluOyBibDsg YmwgPSBibC0+Z2xvYmFsX25leHQpCisJCQl7CisJCQkgIGIgPSBibC0+b3du ZXI7CisJCQkgIGdkYl9hc3NlcnQgKGIpOworCQkJICBpZiAoYi0+ZW5hYmxl X3N0YXRlICE9IGJwX2VuYWJsZWQKKwkJCSAgICAgICYmIGItPmVuYWJsZV9z dGF0ZSAhPSBicF9wZXJtYW5lbnQpCisJCQkgICAgY29udGludWU7CisJCQkg IGlmICghcGNfaXNfcmVhZCkKKwkJCSAgICB7CisJCQkgICAgICBwYyA9CisJ CQkJcmVnY2FjaGVfcmVhZF9wYyAoZ2V0X3RocmVhZF9yZWdjYWNoZSAocmV0 KSk7CisJCQkgICAgICBwY19pc19yZWFkID0gMTsKKwkJCSAgICB9CisJCQkg IHN3aXRjaCAoYi0+dHlwZSkKKwkJCSAgICB7CisJCQkgICAgZGVmYXVsdDoK KwkJCSAgICAgIGlmIChibC0+YWRkcmVzcyA9PSBwYykKKwkJCQl7CisJCQkJ ICBnb3RvIGJyZWFrcG9pbnQ7CisJCQkJfQorCQkJICAgICAgYnJlYWs7CisK KwkJCSAgICBjYXNlIGJwX3dhdGNocG9pbnQ6CisJCQkgICAgICAvKlhYWCB0 ZWF3YXRlcjogSSBzdGlsbCBub3QgdmVyeSBjbGVhciBob3cgdG8gZGVhbCB3 aXRoIGl0LiAgKi8KKwkJCSAgICAgIGdvdG8gYnJlYWtwb2ludDsKKwkJCSAg ICAgIGJyZWFrOworCisJCQkgICAgY2FzZSBicF9jYXRjaHBvaW50OgorCQkJ ICAgICAgZ2RiX2Fzc2VydCAoYi0+b3BzICE9IE5VTEwKKwkJCQkJICAmJiBi LT5vcHMtPmJyZWFrcG9pbnRfaGl0ICE9IE5VTEwpOworCQkJICAgICAgaWYg KGItPm9wcy0+YnJlYWtwb2ludF9oaXQgKGIpKQorCQkJCXsKKwkJCQkgIGdv dG8gYnJlYWtwb2ludDsKKwkJCQl9CisJCQkgICAgICBicmVhazsKKworCQkJ ICAgIGNhc2UgYnBfaGFyZHdhcmVfd2F0Y2hwb2ludDoKKwkJCSAgICBjYXNl IGJwX3JlYWRfd2F0Y2hwb2ludDoKKwkJCSAgICBjYXNlIGJwX2FjY2Vzc193 YXRjaHBvaW50OgorCQkJICAgICAgaWYgKFNUT1BQRURfQllfV0FUQ0hQT0lO VCAoMCkpCisJCQkJeworCQkJCSAgZ290byBicmVha3BvaW50OworCQkJCX0K KwkJCSAgICAgIGJyZWFrOworCQkJICAgIH0KKwkJCX0KKworCQkgICAgICAv KiBUaGVyZSBpcyBub3QgYSBicmVha3BvaW50LiAgKi8KKwkJICAgICAgcmVj b3JkX21lc3NhZ2UgKGN1cnJlbnRfZ2RiYXJjaCk7CisJCSAgICAgIHJlY29y ZF9iZW5lYXRoX3RvX3Jlc3VtZSAocHRpZCwgMSwKKwkJCQkJCXJlY29yZF9y ZXN1bWVfc2lnZ25hbCk7CisJCSAgICAgIGNvbnRpbnVlOworCQkgICAgfQor CisJCSAgaXNfYnJlYWtwb2ludCA9IDA7CisKKwkJYnJlYWtwb2ludDoKKwkJ ICAvKiBBZGQgZ2RiYXJjaF9kZWNyX3BjX2FmdGVyX2JyZWFrIHRvIHBjIGJl Y2F1c2UgcGMgd2lsbAorCQkgICAgIGJlIGJyZWFrIGF0IGFkZHJlc3MgYWRk IGdkYmFyY2hfZGVjcl9wY19hZnRlcl9icmVhaworCQkgICAgIHdoZW4gaW5m ZXJpb3Igbm9uLXN0ZXAgZXhlY3V0ZS4gICovCisJCSAgaWYgKGlzX2JyZWFr cG9pbnQpCisJCSAgICB7CisJCSAgICAgIENPUkVfQUREUiBkZWNyX3BjX2Fm dGVyX2JyZWFrID0KKwkJCWdkYmFyY2hfZGVjcl9wY19hZnRlcl9icmVhayAo Y3VycmVudF9nZGJhcmNoKTsKKwkJICAgICAgaWYgKGRlY3JfcGNfYWZ0ZXJf YnJlYWspCisJCQl7CisJCQkgIGlmICghcGNfaXNfcmVhZCkKKwkJCSAgICB7 CisJCQkgICAgICBwYyA9CisJCQkJcmVnY2FjaGVfcmVhZF9wYyAoZ2V0X3Ro cmVhZF9yZWdjYWNoZSAocmV0KSk7CisJCQkgICAgfQorCQkJICByZWdjYWNo ZV93cml0ZV9wYyAoZ2V0X3RocmVhZF9yZWdjYWNoZSAocmV0KSwKKwkJCQkJ ICAgICBwYyArIGRlY3JfcGNfYWZ0ZXJfYnJlYWspOworCQkJfQorCQkgICAg fQorCisJCSAgYnJlYWs7CisJCX0KKwkgICAgICB3aGlsZSAoMSk7CisKKwkg ICAgICByZXR1cm4gcmV0OworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQor ICAgIHsKKyAgICAgIHN0cnVjdCBzaWdhY3Rpb24gYWN0LCBvbGRfYWN0Owor ICAgICAgaW50IG5lZWRfZGFzbSA9IDA7CisgICAgICBzdHJ1Y3QgcmVnY2Fj aGUgKnJlZ2NhY2hlID0gZ2V0X2N1cnJlbnRfcmVnY2FjaGUgKCk7CisgICAg ICBpbnQgY29udGludWVfZmxhZyA9IDE7CisgICAgICBpbnQgZmlyc3RfcmVj b3JkX2VuZCA9IDE7CisgICAgICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NsZWFu dXBzID0gbWFrZV9jbGVhbnVwIChyZWNvcmRfd2FpdF9jbGVhbnVwcywgMCk7 CisgICAgICBDT1JFX0FERFIgdG1wX3BjOworCisgICAgICBzdGF0dXMtPmtp bmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKworICAgICAgLyogQ2hl Y2sgYnJlYWtwb2ludCB3aGVuIGZvcndhcmQgZXhlY3V0ZS4gICovCisgICAg ICBpZiAoZXhlY3V0aW9uX2RpcmVjdGlvbiA9PSBFWEVDX0ZPUldBUkQpCisJ eworCSAgdG1wX3BjID0gcmVnY2FjaGVfcmVhZF9wYyAocmVnY2FjaGUpOwor CSAgaWYgKGJyZWFrcG9pbnRfaW5zZXJ0ZWRfaGVyZV9wICh0bXBfcGMpKQor CSAgICB7CisJICAgICAgaWYgKHJlY29yZF9kZWJ1ZykKKwkJeworCQkgIGZw cmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGxvZywKKwkJCQkgICAgICAiUHJv Y2VzcyByZWNvcmQ6IGJyZWFrIGF0IDB4JXMuXG4iLAorCQkJCSAgICAgIHBh ZGRyX256ICh0bXBfcGMpKTsKKwkJfQorCSAgICAgIGlmIChnZGJhcmNoX2Rl Y3JfcGNfYWZ0ZXJfYnJlYWsgKGdldF9yZWdjYWNoZV9hcmNoIChyZWdjYWNo ZSkpCisJCSAgJiYgIXJlY29yZF9yZXN1bWVfc3RlcCkKKwkJeworCQkgIHJl Z2NhY2hlX3dyaXRlX3BjIChyZWdjYWNoZSwKKwkJCQkgICAgIHRtcF9wYyAr CisJCQkJICAgICBnZGJhcmNoX2RlY3JfcGNfYWZ0ZXJfYnJlYWsKKwkJCQkg ICAgIChnZXRfcmVnY2FjaGVfYXJjaCAocmVnY2FjaGUpKSk7CisJCX0KKwkg ICAgICBnb3RvIHJlcGxheV9vdXQ7CisJICAgIH0KKwl9CisKKyAgICAgIHJl Y29yZF9nZXRfc2lnID0gMDsKKyAgICAgIGFjdC5zYV9oYW5kbGVyID0gcmVj b3JkX3NpZ19oYW5kbGVyOworICAgICAgYWN0LnNhX21hc2sgPSByZWNvcmRf bWFza2FsbDsKKyAgICAgIGFjdC5zYV9mbGFncyA9IFNBX1JFU1RBUlQ7Cisg ICAgICBpZiAoc2lnYWN0aW9uIChTSUdJTlQsICZhY3QsICZvbGRfYWN0KSkK Kwl7CisJICBwZXJyb3Jfd2l0aF9uYW1lIChfKCJQcm9jZXNzIHJlY29yZDog c2lnYWN0aW9uIGZhaWxlZCIpKTsKKwl9CisgICAgICAvKiBJZiBHREIgaXMg aW4gdGVybWluYWxfaW5mZXJpb3IsIGl0IHdpbGwgbm90IGdldCB0aGUgc2ln bmFsLgorICAgICAgICAgQW5kIGluIEdEQiByZXBsYXkgbW9kZSwgR0RCIGRv ZXNuJ3QgbmVlZCB0byBpbiB0ZXJtaW5hbF9pbmZlcmlvcgorICAgICAgICAg YmVjYXVzZSBpbmZlcmlvciB3aWxsIG5vdCBleGVjdXRlZC4KKyAgICAgICAg IFRoZW4gc2V0IGl0IHRvIHRlcm1pbmFsX291cnMgdG8gbWFrZSBHREIgZ2V0 IHRoZSBzaWduYWwuICAqLworICAgICAgdGFyZ2V0X3Rlcm1pbmFsX291cnMg KCk7CisKKyAgICAgIC8qIEluIEVYRUNfRk9SV0FSRCBtb2RlLCByZWNvcmRf bGlzdCBwb2ludCB0byB0aGUgdGFpbCBvZiBwcmV2CisgICAgICAgICBpbnN0 cnVjdGlvbi4gICovCisgICAgICBpZiAoZXhlY3V0aW9uX2RpcmVjdGlvbiA9 PSBFWEVDX0ZPUldBUkQgJiYgcmVjb3JkX2xpc3QtPm5leHQpCisgICAgICAg IHsKKwkgIHJlY29yZF9saXN0ID0gcmVjb3JkX2xpc3QtPm5leHQ7CisJfQor CisgICAgICAvKiBMb29wIG92ZXIgdGhlIHJlY29yZF9saXN0LCBsb29raW5n IGZvciB0aGUgbmV4dCBwbGFjZSB0bworCSBzdG9wLiAgKi8KKyAgICAgIGRv CisJeworCSAgLyogQ2hlY2sgZm9yIGJlZ2lubmluZyBhbmQgZW5kIG9mIGxv Zy4gICovCisJICBpZiAoZXhlY3V0aW9uX2RpcmVjdGlvbiA9PSBFWEVDX1JF VkVSU0UKKwkgICAgICAmJiByZWNvcmRfbGlzdCA9PSAmcmVjb3JkX2ZpcnN0 KQorCSAgICB7CisJICAgICAgLyogSGl0IGJlZ2lubmluZyBvZiByZWNvcmQg bG9nIGluIHJldmVyc2UuICAqLworCSAgICAgIHN0YXR1cy0+a2luZCA9IFRB UkdFVF9XQUlUS0lORF9OT19ISVNUT1JZOworCSAgICAgIGJyZWFrOworCSAg ICB9CisJICBpZiAoZXhlY3V0aW9uX2RpcmVjdGlvbiAhPSBFWEVDX1JFVkVS U0UgJiYgIXJlY29yZF9saXN0LT5uZXh0KQorCSAgICB7CisJICAgICAgLyog SGl0IGVuZCBvZiByZWNvcmQgbG9nIGdvaW5nIGZvcndhcmQuICAqLworCSAg ICAgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9OT19ISVNUT1JZ OworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIC8qIHNldCBwdGlkLCBy ZWdpc3RlciBhbmQgbWVtb3J5IGFjY29yZGluZyB0byByZWNvcmRfbGlzdCAq LworCSAgaWYgKHJlY29yZF9saXN0LT50eXBlID09IHJlY29yZF9yZWcpCisJ ICAgIHsKKwkgICAgICAvKiByZWcgKi8KKwkgICAgICBnZGJfYnl0ZSByZWdb TUFYX1JFR0lTVEVSX1NJWkVdOworCSAgICAgIGlmIChyZWNvcmRfZGVidWcg PiAxKQorCQl7CisJCSAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkbG9n LAorCQkJCSAgICAgICJQcm9jZXNzIHJlY29yZDogcmVjb3JkX3JlZyAweCVz IHRvIGluZmVyaW9yIG51bSA9ICVkLlxuIiwKKwkJCQkgICAgICBwYWRkcl9u eiAoKENPUkVfQUREUilyZWNvcmRfbGlzdCksCisJCQkJICAgICAgcmVjb3Jk X2xpc3QtPnUucmVnLm51bSk7CisJCX0KKwkgICAgICByZWdjYWNoZV9jb29r ZWRfcmVhZCAocmVnY2FjaGUsIHJlY29yZF9saXN0LT51LnJlZy5udW0sIHJl Zyk7CisJICAgICAgcmVnY2FjaGVfY29va2VkX3dyaXRlIChyZWdjYWNoZSwg cmVjb3JkX2xpc3QtPnUucmVnLm51bSwKKwkJCQkgICAgIHJlY29yZF9saXN0 LT51LnJlZy52YWwpOworCSAgICAgIG1lbWNweSAocmVjb3JkX2xpc3QtPnUu cmVnLnZhbCwgcmVnLCBNQVhfUkVHSVNURVJfU0laRSk7CisJICAgIH0KKwkg IGVsc2UgaWYgKHJlY29yZF9saXN0LT50eXBlID09IHJlY29yZF9tZW0pCisJ ICAgIHsKKwkgICAgICAvKiBtZW0gKi8KKwkgICAgICBnZGJfYnl0ZSAqbWVt ID0gYWxsb2NhIChyZWNvcmRfbGlzdC0+dS5tZW0ubGVuKTsKKwkgICAgICBp ZiAocmVjb3JkX2RlYnVnID4gMSkKKwkJeworCQkgIGZwcmludGZfdW5maWx0 ZXJlZCAoZ2RiX3N0ZGxvZywKKwkJCQkgICAgICAiUHJvY2VzcyByZWNvcmQ6 IHJlY29yZF9tZW0gMHglcyB0byBpbmZlcmlvciBhZGRyID0gMHglcyBsZW4g PSAlZC5cbiIsCisJCQkJICAgICAgcGFkZHJfbnogKChDT1JFX0FERFIpcmVj b3JkX2xpc3QpLAorCQkJCSAgICAgIHBhZGRyX256IChyZWNvcmRfbGlzdC0+ dS5tZW0uYWRkciksCisJCQkJICAgICAgcmVjb3JkX2xpc3QtPnUubWVtLmxl bik7CisJCX0KKwkgICAgICBpZiAodGFyZ2V0X3JlYWRfbWVtb3J5CisJCSAg KHJlY29yZF9saXN0LT51Lm1lbS5hZGRyLCBtZW0sIHJlY29yZF9saXN0LT51 Lm1lbS5sZW4pKQorCQl7CisJCSAgZXJyb3IgKF8oIlByb2Nlc3MgcmVjb3Jk OiBlcnJvciByZWFkaW5nIG1lbW9yeSBhdCBhZGRyID0gMHglcyBsZW4gPSAl ZC4iKSwKKwkJCSBwYWRkcl9ueiAocmVjb3JkX2xpc3QtPnUubWVtLmFkZHIp LAorCQkJIHJlY29yZF9saXN0LT51Lm1lbS5sZW4pOworCQl9CisJICAgICAg aWYgKHRhcmdldF93cml0ZV9tZW1vcnkKKwkJICAocmVjb3JkX2xpc3QtPnUu bWVtLmFkZHIsIHJlY29yZF9saXN0LT51Lm1lbS52YWwsCisJCSAgIHJlY29y ZF9saXN0LT51Lm1lbS5sZW4pKQorCQl7CisJCSAgZXJyb3IgKF8KKwkJCSAo IlByb2Nlc3MgcmVjb3JkOiBlcnJvciB3cml0aW5nIG1lbW9yeSBhdCBhZGRy ID0gMHglcyBsZW4gPSAlZC4iKSwKKwkJCSBwYWRkcl9ueiAocmVjb3JkX2xp c3QtPnUubWVtLmFkZHIpLAorCQkJIHJlY29yZF9saXN0LT51Lm1lbS5sZW4p OworCQl9CisJICAgICAgbWVtY3B5IChyZWNvcmRfbGlzdC0+dS5tZW0udmFs LCBtZW0sIHJlY29yZF9saXN0LT51Lm1lbS5sZW4pOworCSAgICB9CisJICBl bHNlCisJICAgIHsKKwkgICAgICBpZiAocmVjb3JkX2RlYnVnID4gMSkKKwkJ eworCQkgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGxvZywKKwkJCQkg ICAgICAiUHJvY2VzcyByZWNvcmQ6IHJlY29yZF9lbmQgMHglcyB0byBpbmZl cmlvciBuZWVkX2Rhc20gPSAlZC5cbiIsCisJCQkJICAgICAgcGFkZHJfbnog KChDT1JFX0FERFIpcmVjb3JkX2xpc3QpLAorCQkJCSAgICAgIHJlY29yZF9s aXN0LT51Lm5lZWRfZGFzbSk7CisJCX0KKworCSAgICAgIGlmIChleGVjdXRp b25fZGlyZWN0aW9uID09IEVYRUNfRk9SV0FSRCkKKwkJeworCQkgIG5lZWRf ZGFzbSA9IHJlY29yZF9saXN0LT51Lm5lZWRfZGFzbTsKKwkJfQorCSAgICAg IGlmIChuZWVkX2Rhc20pCisJCXsKKwkJICBnZGJhcmNoX3Byb2Nlc3NfcmVj b3JkX2Rhc20gKGN1cnJlbnRfZ2RiYXJjaCk7CisJCX0KKworCSAgICAgIGlm IChmaXJzdF9yZWNvcmRfZW5kICYmIGV4ZWN1dGlvbl9kaXJlY3Rpb24gPT0g RVhFQ19SRVZFUlNFKQorCQl7CisJCSAgLyogV2hlbiByZXZlcnNlIGV4Y3V0 ZSwgdGhlIGZpcnN0IHJlY29yZF9lbmQgaXMgdGhlIHBhcnQgb2YKKwkJICAg ICBjdXJyZW50IGluc3RydWN0aW9uLiAgKi8KKwkJICBmaXJzdF9yZWNvcmRf ZW5kID0gMDsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIEluIEVY RUNfUkVWRVJTRSBtb2RlLCB0aGlzIGlzIHRoZSByZWNvcmRfZW5kIG9mIHBy ZXYKKwkJICAgICBpbnN0cnVjdGlvbi4KKwkJICAgICBJbiBFWEVDX0ZPUldB UkQgbW9kZSwgdGhpcyBpcyB0aGUgcmVjb3JkX2VuZCBvZiBjdXJyZW50CisJ CSAgICAgaW5zdHJ1Y3Rpb24uICAqLworCQkgIC8qIHN0ZXAgKi8KKwkJICBp ZiAocmVjb3JkX3Jlc3VtZV9zdGVwKQorCQkgICAgeworCQkgICAgICBpZiAo cmVjb3JkX2RlYnVnID4gMSkKKwkJCXsKKwkJCSAgZnByaW50Zl91bmZpbHRl cmVkIChnZGJfc3RkbG9nLCAiUHJvY2VzcyByZWNvcmQ6IHN0ZXAuXG4iKTsK KwkJCX0KKwkJICAgICAgY29udGludWVfZmxhZyA9IDA7CisJCSAgICB9CisK KwkJICAvKiBjaGVjayBicmVha3BvaW50ICovCisJCSAgdG1wX3BjID0gcmVn Y2FjaGVfcmVhZF9wYyAocmVnY2FjaGUpOworCQkgIGlmIChicmVha3BvaW50 X2luc2VydGVkX2hlcmVfcCAodG1wX3BjKSkKKwkJICAgIHsKKwkJICAgICAg aWYgKHJlY29yZF9kZWJ1ZykKKwkJCXsKKwkJCSAgZnByaW50Zl91bmZpbHRl cmVkIChnZGJfc3RkbG9nLAorCQkJCQkgICAgICAiUHJvY2VzcyByZWNvcmQ6 IGJyZWFrIGF0IDB4JXMuXG4iLAorCQkJCQkgICAgICBwYWRkcl9ueiAodG1w X3BjKSk7CisJCQl9CisJCSAgICAgIGlmIChnZGJhcmNoX2RlY3JfcGNfYWZ0 ZXJfYnJlYWsgKGdldF9yZWdjYWNoZV9hcmNoIChyZWdjYWNoZSkpCisJCQkg ICYmIGV4ZWN1dGlvbl9kaXJlY3Rpb24gPT0gRVhFQ19GT1JXQVJECisJCQkg ICYmICFyZWNvcmRfcmVzdW1lX3N0ZXApCisgCQkJeworCQkJICByZWdjYWNo ZV93cml0ZV9wYyAocmVnY2FjaGUsCisJCQkJCSAgICAgdG1wX3BjICsKKwkJ CQkJICAgICBnZGJhcmNoX2RlY3JfcGNfYWZ0ZXJfYnJlYWsKKwkJCQkJICAg ICAoZ2V0X3JlZ2NhY2hlX2FyY2ggKHJlZ2NhY2hlKSkpOworIAkJCX0KKwkJ ICAgICAgY29udGludWVfZmxhZyA9IDA7CisJCSAgICB9CisJCX0KKwkgICAg ICBpZiAoZXhlY3V0aW9uX2RpcmVjdGlvbiA9PSBFWEVDX1JFVkVSU0UpCisJ CXsKKwkJICBuZWVkX2Rhc20gPSByZWNvcmRfbGlzdC0+dS5uZWVkX2Rhc207 CisJCX0KKwkgICAgfQorCituZXh0OgorCSAgaWYgKGNvbnRpbnVlX2ZsYWcp CisJICAgIHsKKwkgICAgICBpZiAoZXhlY3V0aW9uX2RpcmVjdGlvbiA9PSBF WEVDX1JFVkVSU0UpCisJCXsKKwkJICBpZiAocmVjb3JkX2xpc3QtPnByZXYp CisJCSAgICByZWNvcmRfbGlzdCA9IHJlY29yZF9saXN0LT5wcmV2OworCQl9 CisJICAgICAgZWxzZQorCQl7CisJCSAgaWYgKHJlY29yZF9saXN0LT5uZXh0 KQorCQkgICAgcmVjb3JkX2xpc3QgPSByZWNvcmRfbGlzdC0+bmV4dDsKKwkJ fQorCSAgICB9CisJfQorICAgICAgd2hpbGUgKGNvbnRpbnVlX2ZsYWcpOwor CisgICAgICBpZiAoc2lnYWN0aW9uIChTSUdBTFJNLCAmb2xkX2FjdCwgTlVM TCkpCisJeworCSAgcGVycm9yX3dpdGhfbmFtZSAoXygiUHJvY2VzcyByZWNv cmQ6IHNpZ2FjdGlvbiBmYWlsZWQiKSk7CisJfQorCityZXBsYXlfb3V0Ogor ICAgICAgaWYgKHJlY29yZF9nZXRfc2lnKQorCXsKKwkgIHN0YXR1cy0+dmFs dWUuc2lnID0gVEFSR0VUX1NJR05BTF9JTlQ7CisJfQorICAgICAgZWxzZQor CXsKKwkgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9UUkFQ OworCX0KKworICAgICAgZGlzY2FyZF9jbGVhbnVwcyAob2xkX2NsZWFudXBz KTsKKyAgICB9CisKKyAgcmV0dXJuIGluZmVyaW9yX3B0aWQ7Cit9CisKK3N0 YXRpYyB2b2lkCityZWNvcmRfZGlzY29ubmVjdCAoc3RydWN0IHRhcmdldF9v cHMgKnRhcmdldCwgY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBp ZiAocmVjb3JkX2RlYnVnKQorICAgIHsKKyAgICAgIGZwcmludGZfdW5maWx0 ZXJlZCAoZ2RiX3N0ZGxvZywgIlByb2Nlc3MgcmVjb3JkOiByZWNvcmRfZGlz Y29ubmVjdFxuIik7CisgICAgfQorICB1bnB1c2hfdGFyZ2V0ICgmcmVjb3Jk X29wcyk7CisgIHRhcmdldF9kaXNjb25uZWN0IChhcmdzLCBmcm9tX3R0eSk7 Cit9CisKK3N0YXRpYyB2b2lkCityZWNvcmRfZGV0YWNoIChzdHJ1Y3QgdGFy Z2V0X29wcyAqb3BzLCBjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpCit7Cisg IGlmIChyZWNvcmRfZGVidWcpCisgICAgeworICAgICAgZnByaW50Zl91bmZp bHRlcmVkIChnZGJfc3RkbG9nLCAiUHJvY2VzcyByZWNvcmQ6IHJlY29yZF9k ZXRhY2hcbiIpOworICAgIH0KKyAgdW5wdXNoX3RhcmdldCAoJnJlY29yZF9v cHMpOworICB0YXJnZXRfZGV0YWNoIChhcmdzLCBmcm9tX3R0eSk7Cit9CisK K3N0YXRpYyB2b2lkCityZWNvcmRfbW91cm5faW5mZXJpb3IgKHN0cnVjdCB0 YXJnZXRfb3BzICpvcHMpCit7CisgIGlmIChyZWNvcmRfZGVidWcpCisgICAg eworICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkbG9nLCAiUHJv Y2VzcyByZWNvcmQ6IHJlY29yZF9tb3Vybl9pbmZlcmlvclxuIik7CisgICAg fQorICB1bnB1c2hfdGFyZ2V0ICgmcmVjb3JkX29wcyk7CisgIHRhcmdldF9t b3Vybl9pbmZlcmlvciAoKTsKK30KKworLyogQ2xvc2UgcHJvY2VzcyByZWNv cmQgdGFyZ2V0IGJlZm9yZSBraWxsIHRoZSBpbmZlcmlvciBwcm9jZXNzLiAg Ki8KK3N0YXRpYyB2b2lkCityZWNvcmRfa2lsbCAodm9pZCkKK3sKKyAgaWYg KHJlY29yZF9kZWJ1ZykKKyAgICB7CisgICAgICBmcHJpbnRmX3VuZmlsdGVy ZWQgKGdkYl9zdGRsb2csICJQcm9jZXNzIHJlY29yZDogcmVjb3JkX2tpbGxc biIpOworICAgIH0KKyAgdW5wdXNoX3RhcmdldCAoJnJlY29yZF9vcHMpOwor ICB0YXJnZXRfa2lsbCAoKTsKK30KKworLyogUmVjb3JkIHJlZ2lzdGVycyBj aGFuZ2UgKGJ5IHVzZXIgb3IgYnkgR0RCKSB0byBsaXN0IGFzIGFuIGluc3Ry dWN0aW9uLiAgKi8KK3N0YXRpYyB2b2lkCityZWNvcmRfcmVnaXN0ZXJzX2No YW5nZSAoc3RydWN0IHJlZ2NhY2hlICpyZWdjYWNoZSwgaW50IHJlZ251bSkK K3sKKyAgLyogQ2hlY2sgcmVjb3JkX2luc25fbnVtLiAgKi8KKyAgcmVjb3Jk X2NoZWNrX2luc25fbnVtICgwKTsKKworICByZWNvcmRfYXJjaF9saXN0X2hl YWQgPSBOVUxMOworICByZWNvcmRfYXJjaF9saXN0X3RhaWwgPSBOVUxMOwor CisgIHJlY29yZF9yZWdjYWNoZSA9IGdldF9jdXJyZW50X3JlZ2NhY2hlICgp OworCisgIGlmIChyZWdudW0gPCAwKQorICAgIHsKKyAgICAgIGludCBpOwor ICAgICAgZm9yIChpID0gMDsgaSA8IGdkYmFyY2hfbnVtX3JlZ3MgKGdldF9y ZWdjYWNoZV9hcmNoIChyZWdjYWNoZSkpOyBpKyspCisJeworCSAgaWYgKHJl Y29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaSkpCisJICAgIHsKKwkgICAgICBy ZWNvcmRfbGlzdF9yZWxlYXNlIChyZWNvcmRfYXJjaF9saXN0X3RhaWwpOwor CSAgICAgIGVycm9yIChfKCJQcm9jZXNzIHJlY29yZDogZmFpbGVkIHRvIHJl Y29yZCBleGVjdXRpb24gbG9nLiIpKTsKKwkgICAgfQorCX0KKyAgICB9Cisg IGVsc2UKKyAgICB7CisgICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRf cmVnIChyZWdudW0pKQorCXsKKwkgIHJlY29yZF9saXN0X3JlbGVhc2UgKHJl Y29yZF9hcmNoX2xpc3RfdGFpbCk7CisJICBlcnJvciAoXygiUHJvY2VzcyBy ZWNvcmQ6IGZhaWxlZCB0byByZWNvcmQgZXhlY3V0aW9uIGxvZy4iKSk7CisJ fQorICAgIH0KKyAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX2VuZCAoMCkp CisgICAgeworICAgICAgcmVjb3JkX2xpc3RfcmVsZWFzZSAocmVjb3JkX2Fy Y2hfbGlzdF90YWlsKTsKKyAgICAgIGVycm9yIChfKCJQcm9jZXNzIHJlY29y ZDogZmFpbGVkIHRvIHJlY29yZCBleGVjdXRpb24gbG9nLiIpKTsKKyAgICB9 CisgIHJlY29yZF9saXN0LT5uZXh0ID0gcmVjb3JkX2FyY2hfbGlzdF9oZWFk OworICByZWNvcmRfYXJjaF9saXN0X2hlYWQtPnByZXYgPSByZWNvcmRfbGlz dDsKKyAgcmVjb3JkX2xpc3QgPSByZWNvcmRfYXJjaF9saXN0X3RhaWw7CisK KyAgaWYgKHJlY29yZF9pbnNuX251bSA9PSByZWNvcmRfaW5zbl9tYXhfbnVt ICYmIHJlY29yZF9pbnNuX21heF9udW0pCisgICAgeworICAgICAgcmVjb3Jk X2xpc3RfcmVsZWFzZV9maXJzdCAoKTsKKyAgICB9CisgIGVsc2UKKyAgICB7 CisgICAgICByZWNvcmRfaW5zbl9udW0rKzsKKyAgICB9Cit9CisKK3N0YXRp YyB2b2lkCityZWNvcmRfc3RvcmVfcmVnaXN0ZXJzIChzdHJ1Y3QgcmVnY2Fj aGUgKnJlZ2NhY2hlLCBpbnQgcmVnbm8pCit7CisgIGlmICghcmVjb3JkX25v dF9yZWNvcmQpCisgICAgeworICAgICAgaWYgKFJFQ09SRF9JU19SRVBMQVkp CisJeworCSAgaW50IG47CisJICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NsZWFu dXBzOworCisJICAvKiBMZXQgdXNlciBjaG9pY2UgaWYgaGUgd2FudCB0byB3 cml0ZSByZWdpc3RlciBvciBub3QuICAqLworCSAgaWYgKHJlZ25vIDwgMCkK KwkgICAgeworCSAgICAgIG4gPQorCQlucXVlcnkgKF8KKwkJCSgiQmVjdXNl IEdEQiBpcyBpbiByZXBsYXkgbW9kZSwgY2hhbmdpbmcgdGhlIHZhbHVlIG9m IGEgcmVnaXN0ZXIgd2lsbCBtYWtlIHRoZSBleGVjdXRlIGxvZyB1bnVzYWJs ZSBmcm9tIHRoaXMgcG9pbnQgb253YXJkLiAgQ2hhbmdlIGFsbCByZWdpc3Rl cj8iKSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG4gPQor CQlucXVlcnkgKF8KKwkJCSgiQmVjdXNlIEdEQiBpcyBpbiByZXBsYXkgbW9k ZSwgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIGEgcmVnaXN0ZXIgd2lsbCBtYWtl IHRoZSBleGVjdXRlIGxvZyB1bnVzYWJsZSBmcm9tIHRoaXMgcG9pbnQgb253 YXJkLiAgQ2hhbmdlIHJlZ2lzdGVyICVzPyIpLAorCQkJZ2RiYXJjaF9yZWdp c3Rlcl9uYW1lIChnZXRfcmVnY2FjaGVfYXJjaCAocmVnY2FjaGUpLAorCQkJ CQkgICAgICAgcmVnbm8pKTsKKwkgICAgfQorCisJICBpZiAoIW4pCisJICAg IHsKKwkgICAgICAvKiBJbnZhbGlkYXRlIHRoZSB2YWx1ZSBvZiByZWdjYWNo ZSB0aGF0IHNldCBpbiBmdW5jdGlvbgorCSAgICAgICAgICJyZWdjYWNoZV9y YXdfd3JpdGUiLiAgKi8KKwkgICAgICBpZiAocmVnbm8gPCAwKQorCQl7CisJ CSAgaW50IGk7CisJCSAgZm9yIChpID0gMDsKKwkJICAgICAgIGkgPCBnZGJh cmNoX251bV9yZWdzIChnZXRfcmVnY2FjaGVfYXJjaCAocmVnY2FjaGUpKTsK KwkJICAgICAgIGkrKykKKwkJICAgIHsKKwkJICAgICAgcmVnY2FjaGVfaW52 YWxpZGF0ZSAocmVnY2FjaGUsIGkpOworCQkgICAgfQorCQl9CisJICAgICAg ZWxzZQorCQl7CisJCSAgcmVnY2FjaGVfaW52YWxpZGF0ZSAocmVnY2FjaGUs IHJlZ25vKTsKKwkJfQorCisJICAgICAgZXJyb3IgKF8oIlByb2Nlc3MgcmVj b3JkIGNhbmNlbGVkIHRoZSBvcGVyYXRpb24uIikpOworCSAgICB9CisKKwkg IC8qIERlc3Ryb3kgdGhlIHJlY29yZCBmcm9tIGhlcmUgZm9yd2FyZC4gICov CisJICByZWNvcmRfbGlzdF9yZWxlYXNlX25leHQgKCk7CisJfQorCisgICAg ICByZWNvcmRfcmVnaXN0ZXJzX2NoYW5nZSAocmVnY2FjaGUsIHJlZ25vKTsK KyAgICB9CisgIHJlY29yZF9iZW5lYXRoX3RvX3N0b3JlX3JlZ2lzdGVycyAo cmVnY2FjaGUsIHJlZ25vKTsKK30KKworLyogcmVjb3JkX3hmZXJfcGFydGlh bCAtLSBiZWhhdmlvciBpcyBjb25kaXRpb25hbCBvbiBSRUNPUkRfSVNfUkVQ TEFZLgorICAgSW4gcmVwbGF5IG1vZGUsIHdlIGNhbm5vdCB3cml0ZSBtZW1v cnkgdW5sZXMgd2UgYXJlIHdpbGxpbmcgdG8KKyAgIGludmFsaWRhdGUgdGhl IHJlY29yZC9yZXBsYXkgbG9nIGZyb20gdGhpcyBwb2ludCBmb3J3YXJkLiAg Ki8KKworc3RhdGljIExPTkdFU1QKK3JlY29yZF94ZmVyX3BhcnRpYWwgKHN0 cnVjdCB0YXJnZXRfb3BzICpvcHMsIGVudW0gdGFyZ2V0X29iamVjdCBvYmpl Y3QsCisJCSAgICAgY29uc3QgY2hhciAqYW5uZXgsIGdkYl9ieXRlICogcmVh ZGJ1ZiwKKwkJICAgICBjb25zdCBnZGJfYnl0ZSAqIHdyaXRlYnVmLCBVTE9O R0VTVCBvZmZzZXQsIExPTkdFU1QgbGVuKQoreworICBpZiAoIXJlY29yZF9u b3RfcmVjb3JkCisgICAgICAmJiAob2JqZWN0ID09IFRBUkdFVF9PQkpFQ1Rf TUVNT1JZCisJICB8fCBvYmplY3QgPT0gVEFSR0VUX09CSkVDVF9SQVdfTUVN T1JZKSAmJiB3cml0ZWJ1ZikKKyAgICB7CisgICAgICBpZiAoUkVDT1JEX0lT X1JFUExBWSkKKwl7CisJICAvKiBMZXQgdXNlciBjaG9pY2UgaWYgaGUgd2Fu dCB0byB3cml0ZSBtZW1vcnkgb3Igbm90LiAgKi8KKwkgIGlmICghbnF1ZXJ5 IChfKCJCZWNhdXNlIEdEQiBpcyBpbiByZXBsYXkgbW9kZSwgd3JpdGluZyB0 byBtZW1vcnkgd2lsbCBtYWtlIHRoZSBleGVjdXRlIGxvZyB1bnVzYWJsZSBm cm9tIHRoaXMgcG9pbnQgb253YXJkLiAgV3JpdGUgbWVtb3J5IGF0IGFkZHJl c3MgMHglcz8iKSwKKwkJICAgICAgIHBhZGRyX256IChvZmZzZXQpKSkKKwkg ICAgeworCSAgICAgIHJldHVybiAtMTsKKwkgICAgfQorCisJICAvKiBEZXN0 cm95IHRoZSByZWNvcmQgZnJvbSBoZXJlIGZvcndhcmQuICAqLworCSAgcmVj b3JkX2xpc3RfcmVsZWFzZV9uZXh0ICgpOworCX0KKworICAgICAgLyogQ2hl Y2sgcmVjb3JkX2luc25fbnVtICovCisgICAgICByZWNvcmRfY2hlY2tfaW5z bl9udW0gKDApOworCisgICAgICAvKiBSZWNvcmQgcmVnaXN0ZXJzIGNoYW5n ZSB0byBsaXN0IGFzIGFuIGluc3RydWN0aW9uLiAgKi8KKyAgICAgIHJlY29y ZF9hcmNoX2xpc3RfaGVhZCA9IE5VTEw7CisgICAgICByZWNvcmRfYXJjaF9s aXN0X3RhaWwgPSBOVUxMOworICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3Rf YWRkX21lbSAob2Zmc2V0LCBsZW4pKQorCXsKKwkgIHJlY29yZF9saXN0X3Jl bGVhc2UgKHJlY29yZF9hcmNoX2xpc3RfdGFpbCk7CisJICBpZiAocmVjb3Jk X2RlYnVnKQorCSAgICB7CisJICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChn ZGJfc3RkbG9nLAorCQkJCSAgXworCQkJCSAgKCJQcm9jZXNzIHJlY29yZDog ZmFpbGVkIHRvIHJlY29yZCBleGVjdXRpb24gbG9nLiIpKTsKKwkgICAgfQor CSAgcmV0dXJuIC0xOworCX0KKyAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0 X2FkZF9lbmQgKDApKQorCXsKKwkgIHJlY29yZF9saXN0X3JlbGVhc2UgKHJl Y29yZF9hcmNoX2xpc3RfdGFpbCk7CisJICBpZiAocmVjb3JkX2RlYnVnKQor CSAgICB7CisJICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkbG9n LAorCQkJCSAgXworCQkJCSAgKCJQcm9jZXNzIHJlY29yZDogZmFpbGVkIHRv IHJlY29yZCBleGVjdXRpb24gbG9nLiIpKTsKKwkgICAgfQorCSAgcmV0dXJu IC0xOworCX0KKyAgICAgIHJlY29yZF9saXN0LT5uZXh0ID0gcmVjb3JkX2Fy Y2hfbGlzdF9oZWFkOworICAgICAgcmVjb3JkX2FyY2hfbGlzdF9oZWFkLT5w cmV2ID0gcmVjb3JkX2xpc3Q7CisgICAgICByZWNvcmRfbGlzdCA9IHJlY29y ZF9hcmNoX2xpc3RfdGFpbDsKKworICAgICAgaWYgKHJlY29yZF9pbnNuX251 bSA9PSByZWNvcmRfaW5zbl9tYXhfbnVtICYmIHJlY29yZF9pbnNuX21heF9u dW0pCisJeworCSAgcmVjb3JkX2xpc3RfcmVsZWFzZV9maXJzdCAoKTsKKwl9 CisgICAgICBlbHNlCisJeworCSAgcmVjb3JkX2luc25fbnVtKys7CisJfQor ICAgIH0KKworICByZXR1cm4gcmVjb3JkX2JlbmVhdGhfdG9feGZlcl9wYXJ0 aWFsIChvcHMsIG9iamVjdCwgYW5uZXgsIHJlYWRidWYsCisJCQkJCSB3cml0 ZWJ1Ziwgb2Zmc2V0LCBsZW4pOworfQorCisvKiByZWNvcmRfaW5zZXJ0X2Jy ZWFrcG9pbnQKKyAgIHJlY29yZF9yZW1vdmVfYnJlYWtwb2ludAorICAgQmVo YXZpb3IgaXMgY29uZGl0aW9uYWwgb24gUkVDT1JEX0lTX1JFUExBWS4KKyAg IFdlIHdpbGwgbm90IGFjdHVhbGx5IGluc2VydCBvciByZW1vdmUgYnJlYWtw b2ludHMgd2hlbiByZXBsYXlpbmcuICAqLworCitzdGF0aWMgaW50CityZWNv cmRfaW5zZXJ0X2JyZWFrcG9pbnQgKHN0cnVjdCBicF90YXJnZXRfaW5mbyAq YnBfdGd0KQoreworICBpZiAoIVJFQ09SRF9JU19SRVBMQVkpCisgICAgewor ICAgICAgcmV0dXJuIHJlY29yZF9iZW5lYXRoX3RvX2luc2VydF9icmVha3Bv aW50IChicF90Z3QpOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworc3Rh dGljIGludAorcmVjb3JkX3JlbW92ZV9icmVha3BvaW50IChzdHJ1Y3QgYnBf dGFyZ2V0X2luZm8gKmJwX3RndCkKK3sKKyAgaWYgKCFSRUNPUkRfSVNfUkVQ TEFZKQorICAgIHsKKyAgICAgIHJldHVybiByZWNvcmRfYmVuZWF0aF90b19y ZW1vdmVfYnJlYWtwb2ludCAoYnBfdGd0KTsKKyAgICB9CisKKyAgcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBpbnQKK3JlY29yZF9jYW5fZXhlY3V0ZV9yZXZl cnNlICh2b2lkKQoreworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQK K2luaXRfcmVjb3JkX29wcyAodm9pZCkKK3sKKyAgcmVjb3JkX29wcy50b19z aG9ydG5hbWUgPSAicmVjb3JkIjsKKyAgcmVjb3JkX29wcy50b19sb25nbmFt ZSA9ICJQcm9jZXNzIHJlY29yZCBhbmQgcmVwbGF5IHRhcmdldCI7CisgIHJl Y29yZF9vcHMudG9fZG9jID0KKyAgICAiTG9nIHByb2dyYW0gd2hpbGUgZXhl Y3V0aW5nIGFuZCByZXBsYXkgZXhlY3V0aW9uIGZyb20gbG9nLiI7CisgIHJl Y29yZF9vcHMudG9fb3BlbiA9IHJlY29yZF9vcGVuOworICByZWNvcmRfb3Bz LnRvX2Nsb3NlID0gcmVjb3JkX2Nsb3NlOworICByZWNvcmRfb3BzLnRvX3Jl c3VtZSA9IHJlY29yZF9yZXN1bWU7CisgIHJlY29yZF9vcHMudG9fd2FpdCA9 IHJlY29yZF93YWl0OworICByZWNvcmRfb3BzLnRvX2Rpc2Nvbm5lY3QgPSBy ZWNvcmRfZGlzY29ubmVjdDsKKyAgcmVjb3JkX29wcy50b19kZXRhY2ggPSBy ZWNvcmRfZGV0YWNoOworICByZWNvcmRfb3BzLnRvX21vdXJuX2luZmVyaW9y ID0gcmVjb3JkX21vdXJuX2luZmVyaW9yOworICByZWNvcmRfb3BzLnRvX2tp bGwgPSByZWNvcmRfa2lsbDsKKyAgcmVjb3JkX29wcy50b19jcmVhdGVfaW5m ZXJpb3IgPSBmaW5kX2RlZmF1bHRfY3JlYXRlX2luZmVyaW9yOwkvKiBNYWtl IHJlY29yZCBzdXBwcG9ydCBjb21tYW5kICJydW4iLiAgKi8KKyAgcmVjb3Jk X29wcy50b19zdG9yZV9yZWdpc3RlcnMgPSByZWNvcmRfc3RvcmVfcmVnaXN0 ZXJzOworICByZWNvcmRfb3BzLnRvX3hmZXJfcGFydGlhbCA9IHJlY29yZF94 ZmVyX3BhcnRpYWw7CisgIHJlY29yZF9vcHMudG9faW5zZXJ0X2JyZWFrcG9p bnQgPSByZWNvcmRfaW5zZXJ0X2JyZWFrcG9pbnQ7CisgIHJlY29yZF9vcHMu dG9fcmVtb3ZlX2JyZWFrcG9pbnQgPSByZWNvcmRfcmVtb3ZlX2JyZWFrcG9p bnQ7CisgIHJlY29yZF9vcHMudG9fY2FuX2V4ZWN1dGVfcmV2ZXJzZSA9IHJl Y29yZF9jYW5fZXhlY3V0ZV9yZXZlcnNlOworICByZWNvcmRfb3BzLnRvX3N0 cmF0dW0gPSByZWNvcmRfc3RyYXR1bTsKKyAgcmVjb3JkX29wcy50b19tYWdp YyA9IE9QU19NQUdJQzsKK30KKworc3RhdGljIHZvaWQKK3Nob3dfcmVjb3Jk X2RlYnVnIChzdHJ1Y3QgdWlfZmlsZSAqZmlsZSwgaW50IGZyb21fdHR5LAor CQkgICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqYywgY29uc3QgY2hhciAq dmFsdWUpCit7CisgIGZwcmludGZfZmlsdGVyZWQgKGZpbGUsIF8oIkRlYnVn Z2luZyBvZiBwcm9jZXNzIHJlY29yZCB0YXJnZXQgaXMgJXMuXG4iKSwgdmFs dWUpOworfQorCisvKiBjbWRfcmVjb3JkX3N0YXJ0IC0tIGFsaWFzIGZvciAi dGFyZ2V0IHJlY29yZCIuICAqLworCitzdGF0aWMgdm9pZAorY21kX3JlY29y ZF9zdGFydCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBleGVj dXRlX2NvbW1hbmQgKCJ0YXJnZXQgcmVjb3JkIiwgZnJvbV90dHkpOworfQor CisvKiBjbWRfcmVjb3JkX2RlbGV0ZSAtLSB0cnVuY2F0ZSB0aGUgcmVjb3Jk IGxvZyBmcm9tIHRoZSBwcmVzZW50IHBvaW50CisgICBvZiByZXBsYXkgdW50 aWwgdGhlIGVuZC4gICovCisKK3N0YXRpYyB2b2lkCitjbWRfcmVjb3JkX2Rl bGV0ZSAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBpZiAoUkVD T1JEX0lTX1VTRUQpCisgICAgeworICAgICAgaWYgKFJFQ09SRF9JU19SRVBM QVkpCisJeworCSAgaWYgKCFmcm9tX3R0eSB8fCBxdWVyeSAoXygiRGVsZXRl IHRoZSBsb2cgZnJvbSB0aGlzIHBvaW50IGZvcndhcmQgYW5kIGJlZ2luIHRv IHJlY29yZCB0aGUgcnVubmluZyBtZXNzYWdlIGF0IGN1cnJlbnQgUEM/Iikp KQorCSAgICB7CisJICAgICAgcmVjb3JkX2xpc3RfcmVsZWFzZV9uZXh0ICgp OworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIHByaW50Zl91bmZp bHRlcmVkIChfKCJBbHJlYWR5IGF0IGVuZCBvZiByZWNvcmQgbGlzdC5cbiIp KTsKKwl9CisKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludGZf dW5maWx0ZXJlZCAoXygiUHJvY2VzcyByZWNvcmQgaXMgbm90IHN0YXJ0ZWQu XG4iKSk7CisgICAgfQorfQorCisvKiBjbWRfcmVjb3JkX3N0b3AgLS0gaW1w bGVtZW50IHRoZSAic3RvcHJlY29yZCIgY29tbWFuZC4gICovCisKK3N0YXRp YyB2b2lkCitjbWRfcmVjb3JkX3N0b3AgKGNoYXIgKmFyZ3MsIGludCBmcm9t X3R0eSkKK3sKKyAgaWYgKFJFQ09SRF9JU19VU0VEKQorICAgIHsKKyAgICAg IGlmICghcmVjb3JkX2xpc3QgfHwgIWZyb21fdHR5IHx8IHF1ZXJ5IChfKCJE ZWxldGUgcmVjb3JkZWQgbG9nIGFuZCBzdG9wIHJlY29yZGluZz8iKSkpCisJ eworCSAgdW5wdXNoX3RhcmdldCAoJnJlY29yZF9vcHMpOworCX0KKyAgICB9 CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoXygi UHJvY2VzcyByZWNvcmQgaXMgbm90IHN0YXJ0ZWQuXG4iKSk7CisgICAgfQor fQorCisvKiBzZXRfcmVjb3JkX2luc25fbWF4X251bSAtLSBzZXQgdXBwZXIg bGltaXQgb2YgcmVjb3JkIGxvZyBzaXplLiAgKi8KKworc3RhdGljIHZvaWQK K3NldF9yZWNvcmRfaW5zbl9tYXhfbnVtIChjaGFyICphcmdzLCBpbnQgZnJv bV90dHksIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjKQoreworICBpZiAo cmVjb3JkX2luc25fbnVtID4gcmVjb3JkX2luc25fbWF4X251bSAmJiByZWNv cmRfaW5zbl9tYXhfbnVtKQorICAgIHsKKyAgICAgIHByaW50Zl91bmZpbHRl cmVkIChfKCJSZWNvcmQgaW5zdHJ1Y3Rpb25zIG51bWJlciBpcyBiaWdnZXIg dGhhbiByZWNvcmQgaW5zdHJ1Y3Rpb25zIG1heCBudW1iZXIuICBBdXRvIGRl bGV0ZSB0aGUgZmlyc3Qgb25lcz9cbiIpKTsKKworICAgICAgd2hpbGUgKHJl Y29yZF9pbnNuX251bSA+IHJlY29yZF9pbnNuX21heF9udW0pCisJeworCSAg cmVjb3JkX2xpc3RfcmVsZWFzZV9maXJzdCAoKTsKKwl9CisgICAgfQorfQor CisvKiBzaG93X3JlY29yZF9pbnNuX251bWJlciAtLSBwcmludCB0aGUgY3Vy cmVudCBpbmRleAorICAgaW50byB0aGUgcmVjb3JkIGxvZyAobnVtYmVyIG9m IGluc25zIHJlY29yZGVkIHNvIGZhcikuICAqLworCitzdGF0aWMgdm9pZAor c2hvd19yZWNvcmRfaW5zbl9udW1iZXIgKGNoYXIgKmlnbm9yZSwgaW50IGZy b21fdHR5KQoreworICBwcmludGZfdW5maWx0ZXJlZCAoXygiUmVjb3JkIGlu c3RydWN0aW9uIG51bWJlciBpcyAlZC5cbiIpLAorCQkgICAgIHJlY29yZF9p bnNuX251bSk7Cit9CisKK3ZvaWQKK19pbml0aWFsaXplX3JlY29yZCAodm9p ZCkKK3sKKyAgLyogSW5pdCByZWNvcmRfbWFza2FsbC4gICovCisgIGlmIChz aWdmaWxsc2V0ICgmcmVjb3JkX21hc2thbGwpID09IC0xKQorICAgIHsKKyAg ICAgIHBlcnJvcl93aXRoX25hbWUgKF8oIlByb2Nlc3MgcmVjb3JkOiBzaWdm aWxsc2V0IGZhaWxlZCIpKTsKKyAgICB9CisKKyAgLyogSW5pdCByZWNvcmRf Zmlyc3QuICAqLworICByZWNvcmRfZmlyc3QucHJldiA9IE5VTEw7CisgIHJl Y29yZF9maXJzdC5uZXh0ID0gTlVMTDsKKyAgcmVjb3JkX2ZpcnN0LnR5cGUg PSByZWNvcmRfZW5kOworICByZWNvcmRfZmlyc3QudS5uZWVkX2Rhc20gPSAw OworCisgIGluaXRfcmVjb3JkX29wcyAoKTsKKyAgYWRkX3RhcmdldCAoJnJl Y29yZF9vcHMpOworCisgIGFkZF9zZXRzaG93X3ppbnRlZ2VyX2NtZCAoInJl Y29yZCIsIG5vX2NsYXNzLCAmcmVjb3JkX2RlYnVnLAorCQkJICAgIF8oIlNl dCBkZWJ1Z2dpbmcgb2YgcmVjb3JkL3JlcGxheSBmZWF0dXJlLiIpLAorCQkJ ICAgIF8oIlNob3cgZGVidWdnaW5nIG9mIHJlY29yZC9yZXBsYXkgZmVhdHVy ZS4iKSwKKwkJCSAgICBfCisJCQkgICAgKCJXaGVuIGVuYWJsZWQsIGRlYnVn Z2luZyBvdXRwdXQgZm9yIHJlY29yZC9yZXBsYXkgZmVhdHVyZSBpcyBkaXNw bGF5ZWQuIiksCisJCQkgICAgTlVMTCwgc2hvd19yZWNvcmRfZGVidWcsICZz ZXRkZWJ1Z2xpc3QsCisJCQkgICAgJnNob3dkZWJ1Z2xpc3QpOworCisgIGFk ZF9jb20gKCJyZWNvcmQiLCBjbGFzc19vYnNjdXJlLCBjbWRfcmVjb3JkX3N0 YXJ0LAorCSAgIF8oIkFiYnJldmlhdGVkIGZvcm0gb2YgXCJ0YXJnZXQgcmVj b3JkXCIgY29tbWFuZC4iKSk7CisKKyAgYWRkX2NvbV9hbGlhcyAoInJlYyIs ICJyZWNvcmQiLCBjbGFzc19vYnNjdXJlLCAxKTsKKworICAvKiBYWFg6IEkg dHJ5IHRvIHVzZSBzb21lIHNpbXBsZSBjb21tYW5kcyBzdWNoIGFzICJkaXNj b25uZWN0IiBhbmQKKyAgICAgImRldGFjaCIgdG8gc3VwcG9ydCB0aGlzIGZ1 bmN0aW9ucy4gIEJ1dCB0aGVzZSBjb21tYW5kcyBhbGwgaGF2ZQorICAgICBv dGhlciBhZmZlY3QgdG8gR0RCIHN1Y2ggYXMgY2FsbCBmdW5jdGlvbiAibm9f c2hhcmVkX2xpYnJhcmllcyIuCisgICAgIFNvIEkgYWRkIHNwZWNpYWwgY29t bWFuZHMgdG8gR0RCLiAgKi8KKyAgYWRkX2NvbSAoImRlbHJlY29yZCIsIGNs YXNzX29ic2N1cmUsIGNtZF9yZWNvcmRfZGVsZXRlLAorCSAgIF8oIkRlbGV0 ZSB0aGUgcmVzdCBvZiBleGVjdXRpb24gbG9nIGFuZCBzdGFydCByZWNvcmRp bmcgaXQgYW5ldy4iKSk7CisgIGFkZF9jb21fYWxpYXMgKCJkciIsICJkZWxy ZWNvcmQiLCBjbGFzc19vYnNjdXJlLCAxKTsKKyAgYWRkX2NvbSAoInN0b3By ZWNvcmQiLCBjbGFzc19vYnNjdXJlLCBjbWRfcmVjb3JkX3N0b3AsCisJICAg XygiU3RvcCB0aGUgcmVjb3JkL3JlcGxheSB0YXJnZXQuIikpOworICBhZGRf Y29tX2FsaWFzICgic3IiLCAic3RvcHJlY29yZCIsIGNsYXNzX29ic2N1cmUs IDEpOworCisgIC8qIFJlY29yZCBpbnN0cnVjdGlvbnMgbnVtYmVyIGxpbWl0 IGNvbW1hbmQuICAqLworICBhZGRfc2V0c2hvd19ib29sZWFuX2NtZCAoInJl Y29yZC1zdG9wLWF0LWxpbWl0Iiwgbm9fY2xhc3MsCisJCQkgICAgJnJlY29y ZF9zdG9wX2F0X2xpbWl0LAorCQkJICAgIF8oIlNldCB3aGV0aGVyIHJlY29y ZC9yZXBsYXkgc3RvcCB3aGVuIHJlY29yZC9yZXBsYXkgYnVmZmVyIGJlY29t ZXMgZnVsbC4iKSwKKwkJCSAgICBfKCJTaG93IHdoZXRoZXIgcmVjb3JkL3Jl cGxheSBzdG9wIHdoZW4gcmVjb3JkL3JlcGxheSBidWZmZXIgYmVjb21lcyBm dWxsLiIpLCBfKCJcCitFbmFibGUgaXMgZGVmYXVsdCB2YWx1ZS5cblwKK1do ZW4gZW5hYmxlZCwgaWYgdGhlIHJlY29yZC9yZXBsYXkgYnVmZmVyIGJlY29t ZXMgZnVsbCxcblwKK2FzayB1c2VyIHdoYXQgdG8gZG8uXG5cCitXaGVuIGRp c2FibGVkLCBpZiB0aGUgcmVjb3JkL3JlcGxheSBidWZmZXIgYmVjb21lcyBm dWxsLFxuXAorZGVsZXRlIGl0IGFuZCBzdGFydCBuZXcgcmVjb3JkaW5nLiIp LCBOVUxMLCBOVUxMLCAmc2V0bGlzdCwgJnNob3dsaXN0KTsKKyAgYWRkX3Nl dHNob3dfemludGVnZXJfY21kICgicmVjb3JkLWluc24tbnVtYmVyLW1heCIs IG5vX2NsYXNzLAorCQkJICAgICZyZWNvcmRfaW5zbl9tYXhfbnVtLAorCQkJ ICAgIF8oIlNldCByZWNvcmQvcmVwbGF5IGJ1ZmZlciBsaW1pdC4iKSwKKwkJ CSAgICBfKCJTaG93IHJlY29yZC9yZXBsYXkgYnVmZmVyIGxpbWl0LiIpLCBf KCJcCitTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGluc3RydWN0aW9ucyB0 byBiZSBzdG9yZWQgaW4gdGhlXG5cCityZWNvcmQvcmVwbGF5IGJ1ZmZlci4g IFplcm8gbWVhbnMgdW5saW1pdGVkIChkZWZhdWx0IDIwMDAwMCkuIiksCisJ CQkgICAgc2V0X3JlY29yZF9pbnNuX21heF9udW0sCisJCQkgICAgTlVMTCwg JnNldGxpc3QsICZzaG93bGlzdCk7CisgIGFkZF9pbmZvICgicmVjb3JkLWlu c24tbnVtYmVyIiwgc2hvd19yZWNvcmRfaW5zbl9udW1iZXIsIF8oIlwKK1No b3cgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbiB0aGUg cmVjb3JkL3JlcGxheSBidWZmZXIuIikpOworfQotLS0gYS8vZGV2L251bGwK KysrIGIvcmVjb3JkLmgKQEAgLTAsMCArMSw5OCBAQAorLyogUHJvY2VzcyBy ZWNvcmQgYW5kIHJlcGxheSB0YXJnZXQgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1 Z2dlci4KKworICAgQ29weXJpZ2h0IChDKSAyMDA4IEZyZWUgU29mdHdhcmUg Rm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBH REIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRl ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAg IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRo aXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0 IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1F UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS UE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNl aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl CisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxo dHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYg X1JFQ09SRF9IXworI2RlZmluZSBfUkVDT1JEX0hfCisKKyNkZWZpbmUgUkVD T1JEX0lTX1VTRUQgICBcCisgICAgIChjdXJyZW50X3RhcmdldC5iZW5lYXRo ID09ICZyZWNvcmRfb3BzKQorI2RlZmluZSBSRUNPUkRfSVNfUkVQTEFZIFwK KyAgICAgKHJlY29yZF9saXN0LT5uZXh0IHx8IGV4ZWN1dGlvbl9kaXJlY3Rp b24gPT0gRVhFQ19SRVZFUlNFKQorCit0eXBlZGVmIHN0cnVjdCByZWNvcmRf cmVnX3MKK3sKKyAgaW50IG51bTsKKyAgZ2RiX2J5dGUgKnZhbDsKK30gcmVj b3JkX3JlZ190OworCit0eXBlZGVmIHN0cnVjdCByZWNvcmRfbWVtX3MKK3sK KyAgQ09SRV9BRERSIGFkZHI7CisgIGludCBsZW47CisgIGdkYl9ieXRlICp2 YWw7Cit9IHJlY29yZF9tZW1fdDsKKworZW51bSByZWNvcmRfdHlwZQorewor ICByZWNvcmRfZW5kID0gMCwKKyAgcmVjb3JkX3JlZywKKyAgcmVjb3JkX21l bQorfTsKKworLyogVGhpcyBpcyB0aGUgY29yZSBzdHJ1Y3Qgb2YgcmVjb3Jk IGZ1bmN0aW9uLgorICAgQW4gZW50aXR5IG9mIHJlY29yZF90IGlzIGEgcmVj b3JkIG9mIHRoZSB2YWx1ZSBjaGFuZ2Ugb2YgYSByZWdpc3RlcgorICAgKCJy ZWNvcmRfcmVnIikgb3IgYSBwYXJ0IG9mIG1lbW9yeSAoInJlY29yZF9tZW0i KS4gQW5kIEVhY2ggaW5zdHJ1Y3Rpb24gbXVzdAorICAgaGFzIGEgcmVjb3Jk X3QgKCJyZWNvcmRfZW5kIikgdGhhdCBwb2ludCBvdXQgdGhpcyBpcyB0aGUg bGFzdCByZWNvcmRfdCBvZgorICAgdGhpcyBpbnN0cnVjdGlvbi4KKyAgIEVh Y2ggcmVjb3JkX3QgaXMgbGlua2VkIHRvICJyZWNvcmRfbGlzdCIgYnkgInBy ZXYiIGFuZCAibmV4dCIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHJlY29yZF9z Cit7CisgIHN0cnVjdCByZWNvcmRfcyAqcHJldjsKKyAgc3RydWN0IHJlY29y ZF9zICpuZXh0OworICBlbnVtIHJlY29yZF90eXBlIHR5cGU7CisgIHVuaW9u CisgIHsKKyAgICAvKiByZWcgKi8KKyAgICByZWNvcmRfcmVnX3QgcmVnOwor ICAgIC8qIG1lbSAqLworICAgIHJlY29yZF9tZW1fdCBtZW07CisgICAgLyog ZW5kICovCisgICAgaW50IG5lZWRfZGFzbTsKKyAgfSB1OworfSByZWNvcmRf dDsKKworZXh0ZXJuIGludCByZWNvcmRfZGVidWc7CitleHRlcm4gcmVjb3Jk X3QgKnJlY29yZF9saXN0OworZXh0ZXJuIHJlY29yZF90ICpyZWNvcmRfYXJj aF9saXN0X2hlYWQ7CitleHRlcm4gcmVjb3JkX3QgKnJlY29yZF9hcmNoX2xp c3RfdGFpbDsKK2V4dGVybiBzdHJ1Y3QgcmVnY2FjaGUgKnJlY29yZF9yZWdj YWNoZTsKKworZXh0ZXJuIHN0cnVjdCB0YXJnZXRfb3BzIHJlY29yZF9vcHM7 CisKK2V4dGVybiBpbnQgcmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpbnQg bnVtKTsKK2V4dGVybiBpbnQgcmVjb3JkX2FyY2hfbGlzdF9hZGRfbWVtIChD T1JFX0FERFIgYWRkciwgaW50IGxlbik7CitleHRlcm4gaW50IHJlY29yZF9h cmNoX2xpc3RfYWRkX2VuZCAoaW50IG5lZWRfZGFzbSk7CitleHRlcm4gdm9p ZCByZWNvcmRfbWVzc2FnZSAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gpOwor ZXh0ZXJuIHZvaWQgcmVjb3JkX25vdF9yZWNvcmRfc2V0ICh2b2lkKTsKKwor ZXh0ZXJuIHZvaWQgKCpyZWNvcmRfYmVuZWF0aF90b19yZXN1bWUpIChwdGlk X3QsIGludCwgZW51bSB0YXJnZXRfc2lnbmFsKTsKK2V4dGVybiBwdGlkX3Qg KCpyZWNvcmRfYmVuZWF0aF90b193YWl0KSAocHRpZF90LCBzdHJ1Y3QgdGFy Z2V0X3dhaXRzdGF0dXMgKik7CitleHRlcm4gdm9pZCAoKnJlY29yZF9iZW5l YXRoX3RvX3N0b3JlX3JlZ2lzdGVycykgKHN0cnVjdCByZWdjYWNoZSAqLCBp bnQgcmVnbm8pOworZXh0ZXJuIExPTkdFU1QgKCpyZWNvcmRfYmVuZWF0aF90 b194ZmVyX3BhcnRpYWwpIChzdHJ1Y3QgdGFyZ2V0X29wcyAqIG9wcywKKwkJ CQkJCSAgZW51bSB0YXJnZXRfb2JqZWN0IG9iamVjdCwKKwkJCQkJCSAgY29u c3QgY2hhciAqYW5uZXgsCisJCQkJCQkgIGdkYl9ieXRlICogcmVhZGJ1ZiwK KwkJCQkJCSAgY29uc3QgZ2RiX2J5dGUgKiB3cml0ZWJ1ZiwKKwkJCQkJCSAg VUxPTkdFU1Qgb2Zmc2V0LAorCQkJCQkJICBMT05HRVNUIGxlbik7CitleHRl cm4gaW50ICgqcmVjb3JkX2JlbmVhdGhfdG9faW5zZXJ0X2JyZWFrcG9pbnQp IChzdHJ1Y3QgYnBfdGFyZ2V0X2luZm8gKik7CitleHRlcm4gaW50ICgqcmVj b3JkX2JlbmVhdGhfdG9fcmVtb3ZlX2JyZWFrcG9pbnQpIChzdHJ1Y3QgYnBf dGFyZ2V0X2luZm8gKik7CisKKyNlbmRpZiAvKiBfUkVDT1JEX0hfICovCg== ------=_Part_38552_2099283.1229671184417--