From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8660 invoked by alias); 10 Jul 2013 09:15:58 -0000 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 Received: (qmail 8616 invoked by uid 89); 10 Jul 2013 09:15:52 -0000 X-Spam-SWARE-Status: No, score=-4.1 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_MED,RCVD_IN_HOSTKARMA_W,RP_MATCHES_RCVD,SPF_PASS,TW_EG autolearn=ham version=3.3.1 Received: from e28smtp08.in.ibm.com (HELO e28smtp08.in.ibm.com) (122.248.162.8) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Wed, 10 Jul 2013 09:15:51 +0000 Received: from /spool/local by e28smtp08.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 10 Jul 2013 14:36:25 +0530 Received: from d28dlp02.in.ibm.com (9.184.220.127) by e28smtp08.in.ibm.com (192.168.1.138) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 10 Jul 2013 14:36:23 +0530 Received: from d28relay04.in.ibm.com (d28relay04.in.ibm.com [9.184.220.61]) by d28dlp02.in.ibm.com (Postfix) with ESMTP id 0A940394004E for ; Wed, 10 Jul 2013 14:45:36 +0530 (IST) Received: from d28av01.in.ibm.com (d28av01.in.ibm.com [9.184.220.63]) by d28relay04.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r6A9FU2611993140 for ; Wed, 10 Jul 2013 14:45:30 +0530 Received: from d28av01.in.ibm.com (loopback [127.0.0.1]) by d28av01.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r6A9FVq1022331 for ; Wed, 10 Jul 2013 09:15:32 GMT Received: from d23ml188.in.ibm.com (d23ml188.in.ibm.com [9.182.8.144]) by d28av01.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r6A9FQ3Q021867; Wed, 10 Jul 2013 09:15:27 GMT Subject: [PATCH 3/5] powerpc64-aix inf-ptrace patch X-KeepSent: E3A164F2:0E58AFE9-65257BA4:003110DC; type=4; name=$KeepSent To: gdb-patches@sourceware.org Cc: brobecker@adacore.com Message-ID: From: Raunaq 12 Date: Wed, 10 Jul 2013 09:15:00 -0000 MIME-Version: 1.0 Content-type: multipart/mixed; Boundary="0__=EABBF137DFA2964C8f9e8a93df938690918cEABBF137DFA2964C" Content-Disposition: inline X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13071009-2000-0000-0000-00000CD436E7 X-Virus-Found: No X-SW-Source: 2013-07/txt/msg00267.txt.bz2 --0__=EABBF137DFA2964C8f9e8a93df938690918cEABBF137DFA2964C Content-type: text/plain; charset=US-ASCII Content-length: 12985 powerpc64-ibm-aix - Make appropiate ptrace calls in inf-ptrace.c in 64 BIT mode Macro for 64 bit ptrace call defined. i.e '#define ptrace64(request, pid, addr, data) ptrace64 (request, pid, addr, data, 0)' if we are in 64 bit mode, then ptrace64 should be called instead of ptrace. i.e. #ifdef BFD64 int ret = ptrace64 (req, (long long) id, (long long) addr, data, buf); inf-ptrace.c has many ptrace calls like - 'ptrace (PT_WRITE_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, buf[i])' in 64 bit this has to be changed to - 'ptrace64 (PT_WRITE_U, (long long) pid, (long long)addr, buf[i])' There are many similar changes to be made through out inf-ptrace.c. These changes are as seen below :- --- inf-ptrace.c 2013-05-30 23:04:03 +0600 +++ inf-ptrace64.c 2013-06-18 16:07:35 +0600 @@ -36,7 +36,6 @@ #include "gdbthread.h" - #ifdef PT_GET_PROCESS_STATE static int @@ -47,8 +46,8 @@ inf_ptrace_follow_fork (struct target_op pid = ptid_get_pid (inferior_ptid); - if (ptrace (PT_GET_PROCESS_STATE, pid, - (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1) + if (ptrace (PT_GET_PROCESS_STATE, (long long) pid, + (long long)&pe, sizeof pe) == -1) perror_with_name (("ptrace")); gdb_assert (pe.pe_report_event == PTRACE_FORK); @@ -72,7 +71,7 @@ inf_ptrace_follow_fork (struct target_op it. */ remove_breakpoints (); - if (ptrace (PT_DETACH, pid, (PTRACE_TYPE_ARG3)1, 0) == -1) + if (ptrace64 (PT_DETACH, (long long) pid, (long long)1, 0) == -1) perror_with_name (("ptrace")); /* Switch inferior_ptid out of the parent's way. */ @@ -88,7 +87,7 @@ inf_ptrace_follow_fork (struct target_op /* Breakpoints have already been detached from the child by infrun.c. */ - if (ptrace (PT_DETACH, fpid, (PTRACE_TYPE_ARG3)1, 0) == -1) + if (ptrace64 (PT_DETACH, (long long) fpid, (long long)1, 0) == -1) perror_with_name (("ptrace")); } @@ -104,7 +103,7 @@ static void inf_ptrace_me (void) { /* "Trace me, Dr. Memory!" */ - ptrace (PT_TRACE_ME, 0, (PTRACE_TYPE_ARG3)0, 0); + ptrace64 (PT_TRACE_ME, (long long) 0, (long long)0, 0); } /* Start a new inferior Unix child process. EXEC_FILE is the file to @@ -122,18 +121,19 @@ inf_ptrace_create_inferior (struct targe /* Do not change either targets above or the same target if already present. The reason is the target stack is shared across multiple inferiors. */ int ops_already_pushed = target_is_pushed (ops); - struct cleanup *back_to = make_cleanup (null_cleanup, NULL); + struct cleanup *back_to = NULL; if (! ops_already_pushed) { /* Clear possible core file with its process_stratum. */ push_target (ops); - make_cleanup_unpush_target (ops); + back_to = make_cleanup_unpush_target (ops); } pid = fork_inferior (exec_file, allargs, env, inf_ptrace_me, NULL, NULL, NULL, NULL); + if (! ops_already_pushed) discard_cleanups (back_to); /* START_INFERIOR_TRAPS_EXPECTED is defined in inferior.h, and will @@ -156,8 +156,8 @@ inf_ptrace_post_startup_inferior (ptid_t /* Set the initial event mask. */ memset (&pe, 0, sizeof pe); pe.pe_set_event |= PTRACE_FORK; - if (ptrace (PT_SET_EVENT_MASK, ptid_get_pid (pid), - (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1) + if (ptrace64 (PT_SET_EVENT_MASK, (long long) ptid_get_pid (pid), + (long long)&pe, sizeof pe) == -1) perror_with_name (("ptrace")); } @@ -195,7 +195,7 @@ inf_ptrace_attach (struct target_ops *op /* Do not change either targets above or the same target if already present. The reason is the target stack is shared across multiple inferiors. */ int ops_already_pushed = target_is_pushed (ops); - struct cleanup *back_to = make_cleanup (null_cleanup, NULL); + struct cleanup *back_to = NULL; pid = parse_pid_to_attach (args); @@ -207,7 +207,7 @@ inf_ptrace_attach (struct target_ops *op /* target_pid_to_str already uses the target. Also clear possible core file with its process_stratum. */ push_target (ops); - make_cleanup_unpush_target (ops); + back_to = make_cleanup_unpush_target (ops); } if (from_tty) @@ -226,7 +226,7 @@ inf_ptrace_attach (struct target_ops *op #ifdef PT_ATTACH errno = 0; - ptrace (PT_ATTACH, pid, (PTRACE_TYPE_ARG3)0, 0); + ptrace64 (PT_ATTACH, (long long) pid, (long long)0, 0); if (errno != 0) perror_with_name (("ptrace")); #else @@ -242,6 +242,7 @@ inf_ptrace_attach (struct target_ops *op target, it should decorate the ptid later with more info. */ add_thread_silent (inferior_ptid); + if (! ops_already_pushed) discard_cleanups (back_to); } @@ -255,8 +256,8 @@ inf_ptrace_post_attach (int pid) /* Set the initial event mask. */ memset (&pe, 0, sizeof pe); pe.pe_set_event |= PTRACE_FORK; - if (ptrace (PT_SET_EVENT_MASK, pid, - (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1) + if (ptrace64 (PT_SET_EVENT_MASK, (long long) pid, + (long long)&pe, sizeof pe) == -1) perror_with_name (("ptrace")); } @@ -289,7 +290,7 @@ inf_ptrace_detach (struct target_ops *op previously attached to the inferior. It *might* work if we started the process ourselves. */ errno = 0; - ptrace (PT_DETACH, pid, (PTRACE_TYPE_ARG3)1, sig); + ptrace64 (PT_DETACH, (long long) pid, (long long) 1, sig); if (errno != 0) perror_with_name (("ptrace")); #else @@ -314,7 +315,7 @@ inf_ptrace_kill (struct target_ops *ops) if (pid == 0) return; - ptrace (PT_KILL, pid, (PTRACE_TYPE_ARG3)0, 0); + ptrace64 (PT_KILL, (long long) pid, (long long) 0, 0); waitpid (pid, &status, 0); target_mourn_inferior (); @@ -368,7 +369,7 @@ inf_ptrace_resume (struct target_ops *op where it was. If GDB wanted it to start some other way, we have already written a new program counter value to the child. */ errno = 0; - ptrace (request, pid, (PTRACE_TYPE_ARG3)1, gdb_signal_to_host (signal)); + ptrace64 (request, (long long) pid, (long long)1, gdb_signal_to_host (signal)); if (errno != 0) perror_with_name (("ptrace")); } @@ -421,8 +422,8 @@ inf_ptrace_wait (struct target_ops *ops, ptrace_state_t pe; pid_t fpid; - if (ptrace (PT_GET_PROCESS_STATE, pid, - (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1) + if (ptrace64 (PT_GET_PROCESS_STATE, (long long) pid, + (long long)&pe, sizeof pe) == -1) perror_with_name (("ptrace")); switch (pe.pe_report_event) @@ -436,8 +437,8 @@ inf_ptrace_wait (struct target_ops *ops, if (fpid == -1) perror_with_name (("waitpid")); - if (ptrace (PT_GET_PROCESS_STATE, fpid, - (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1) + if (ptrace64 (PT_GET_PROCESS_STATE, (long long) fpid, + (long long)&pe, sizeof pe) == -1) perror_with_name (("ptrace")); gdb_assert (pe.pe_report_event == PTRACE_FORK); @@ -491,7 +492,7 @@ inf_ptrace_xfer_partial (struct target_o piod.piod_len = len; errno = 0; - if (ptrace (PT_IO, pid, (caddr_t)&piod, 0) == 0) + if (ptrace64 (PT_IO, (long long) pid, (long long)&piod, 0) == 0) /* Return the actual number of bytes read or written. */ return piod.piod_len; /* If the PT_IO request is somehow not supported, fallback on @@ -532,8 +533,8 @@ inf_ptrace_xfer_partial (struct target_o || (offset + partial_len < rounded_offset + sizeof (PTRACE_TYPE_RET))) /* Need part of initial word -- fetch it. */ - buffer.word = ptrace (PT_READ_I, pid, - (PTRACE_TYPE_ARG3)(uintptr_t) + buffer.word = ptrace64 (PT_READ_I, (long long) pid, + (long long) rounded_offset, 0); /* Copy data to be written over corresponding part of @@ -542,16 +543,16 @@ inf_ptrace_xfer_partial (struct target_o writebuf, partial_len); errno = 0; - ptrace (PT_WRITE_D, pid, - (PTRACE_TYPE_ARG3)(uintptr_t)rounded_offset, + ptrace64 (PT_WRITE_D, (long long) pid, + (long long)rounded_offset, buffer.word); if (errno) { /* Using the appropriate one (I or D) is necessary for Gould NP1, at least. */ errno = 0; - ptrace (PT_WRITE_I, pid, - (PTRACE_TYPE_ARG3)(uintptr_t)rounded_offset, + ptrace64 (PT_WRITE_I, (long long) pid, + (long long)rounded_offset, buffer.word); if (errno) return 0; @@ -561,8 +562,8 @@ inf_ptrace_xfer_partial (struct target_o if (readbuf) { errno = 0; - buffer.word = ptrace (PT_READ_I, pid, - (PTRACE_TYPE_ARG3)(uintptr_t)rounded_offset, + buffer.word = ptrace64 (PT_READ_I, (long long) pid, + (long long)rounded_offset, 0); if (errno) return 0; @@ -593,7 +594,7 @@ inf_ptrace_xfer_partial (struct target_o piod.piod_len = len; errno = 0; - if (ptrace (PT_IO, pid, (caddr_t)&piod, 0) == 0) + if (ptrace64 (PT_IO, (long long) pid, (long long)&piod, 0) == 0) /* Return the actual number of bytes read or written. */ return piod.piod_len; } @@ -741,7 +742,7 @@ inf_ptrace_fetch_register (struct regcac for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++) { errno = 0; - buf[i] = ptrace (PT_READ_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, 0); + buf[i] = ptrace64 (PT_READ_U, (long long) pid, (long long)addr, 0); if (errno != 0) error (_("Couldn't read register %s (#%d): %s."), gdbarch_register_name (gdbarch, regnum), @@ -800,7 +801,7 @@ inf_ptrace_store_register (const struct for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++) { errno = 0; - ptrace (PT_WRITE_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, buf[i]); + ptrace64 (PT_WRITE_U, (long long) pid, (long long)addr, buf[i]); if (errno != 0) error (_("Couldn't write register %s (#%d): %s."), gdbarch_register_name (gdbarch, regnum), Note - Initially, I had used multiple ' #ifdef BFD64 ' checks to insert these changes. Since that is not the right way to go about it, I thought it would be better to create a new file called 'inf-ptrace64.c' derived from inf-ptrace instead, This new file contains all these above mentioned changes. inf-ptrace64 will be compiled only if the host is detected as powerpc64-ibm-aix. SO, it will not interfere with the original inf-ptrace that is used if host is powerpc-ibm-aix Since the patch that creates inf-ptrace64.c is very large as it contains the full file. I have attached it as a text file below. But the above mentioned changes is the only difference between inf-ptrace.c and inf-ptrace64.c --- Patch1 : Index: ./gdb/gdb_ptrace.h =================================================================== --- ./gdb.orig/gdb_ptrace.h +++ ./gdb/gdb_ptrace.h @@ -136,6 +136,8 @@ extern PTRACE_TYPE_RET ptrace(); #ifdef PTRACE_TYPE_ARG5 # define ptrace(request, pid, addr, data) ptrace (request, pid, addr, data, 0) +# define ptrace64(request, pid, addr, data) ptrace64 (request, pid, addr, data, 0) + #endif #endif /* gdb_ptrace.h */ Index: ./gdb/rs6000-nat.c =================================================================== --- ./gdb.orig/rs6000-nat.c +++ ./gdb/rs6000-nat.c @@ -66,7 +66,7 @@ /* In 32-bit compilation mode (which is the only mode from which ptrace() works on 4.3), __ld_info32 is #defined as equivalent to ld_info. */ -#ifdef __ld_info32 +#if defined (__ld_info32) || defined (__ld_info64) # define ARCH3264 #endif @@ -181,7 +181,11 @@ regmap (struct gdbarch *gdbarch, int reg static int rs6000_ptrace32 (int req, int id, int *addr, int data, int *buf) { + #ifdef BFD64 + int ret = ptrace64 (req, (long long) id, (long long) addr, data, buf); + #else int ret = ptrace (req, id, (int *)addr, data, buf); + #endif #if 0 printf ("rs6000_ptrace32 (%d, %d, 0x%x, %08x, 0x%x) = 0x%x\n", req, id, (unsigned int)addr, data, (unsigned int)buf, ret); @@ -195,7 +199,11 @@ static int rs6000_ptrace64 (int req, int id, long long addr, int data, void *buf) { #ifdef ARCH3264 + #ifdef BFD64 + int ret = ptrace64 (req, (long long) id, addr, data, (int *)buf); + #else int ret = ptracex (req, id, addr, data, buf); + #endif #else int ret = 0; #endif --- The patch to create the file inf-ptrace64.c is attached below (See attached file: gdb-7.6-infptrace64.patch) --0__=EABBF137DFA2964C8f9e8a93df938690918cEABBF137DFA2964C Content-type: application/octet-stream; name="gdb-7.6-infptrace64.patch" Content-Disposition: attachment; filename="gdb-7.6-infptrace64.patch" Content-transfer-encoding: base64 Content-length: 36763 cG93ZXJwYzY0LWFpeDogQWRkIHN1cHBvcnQgZm9yIDY0IGJpdC4KCmluZi1w dHJhY2UuYyBoYXMgbWFueSBwdHJhY2UgY2FsbHMgbGlrZSAtCidwdHJhY2Ug KFBUX1dSSVRFX1UsIHBpZCwgKFBUUkFDRV9UWVBFX0FSRzMpKHVpbnRwdHJf dClhZGRyLCBidWZbaV0pJwoKaW4gNjQgYml0IG1vZGUgdGhpcyBoYXMgdG8g YmUgY2hhbmdlZCB0byAtCidwdHJhY2U2NCAoUFRfV1JJVEVfVSwgKGxvbmcg bG9uZykgcGlkLCAobG9uZyBsb25nKWFkZHIsIGJ1ZltpXSknCgpUaGVyZSBh cmUgbWFueSBzaW1pbGlhciBjaGFuZ2VzIHRvIGJlIG1hZGUgdGhyb3VnaCBv dXQgaW5mLXB0cmFjZS5jCkluIHN0ZWFkLCB3ZSBjcmVhdGUgYSBuZXcgZmls ZSBpbmYtcHRyYWNlNjQuYyB3aGljaCBoYXMgYWxsIHRoZXNlIGNoYW5nZXMu ClRoaXMgZmlsZSB3aWxsIGJlIGNvbXBpbGVkIG9ubHkgaWYgd2UgY29uZmln dXJlIGhvc3QgYXMgcG93ZXJwYzY0LWFpeC4KClNpZ25lZC1vZmYtYnk6IFJh dW5hcSBNLiBCYXRoaWphIDxyYXVuYXExMkBpbi5pYm0uY29tPgoKSW5kZXg6 IC4vZ2RiL2luZi1wdHJhY2U2NC5jCj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K LS0tIC9kZXYvbnVsbAorKysgLi9nZGIvaW5mLXB0cmFjZTY0LmMKQEAgLTAs MCArMSw4NDYgQEAKKy8qIExvdy1sZXZlbCBjaGlsZCBpbnRlcmZhY2UgdG8g cHRyYWNlLgorCisgICBDb3B5cmlnaHQgKEMpIDE5ODgtMjAxMyBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBh cnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAg aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2Us IG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor CisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBX QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m CisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV TEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhh dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3Qs IHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisj aW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNs dWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgImluZmxvdy5oIgorI2luY2x1 ZGUgInRlcm1pbmFsLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1 ZGUgInJlZ2NhY2hlLmgiCisKKyNpbmNsdWRlICJnZGJfYXNzZXJ0LmgiCisj aW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgImdkYl9wdHJhY2Uu aCIKKyNpbmNsdWRlICJnZGJfd2FpdC5oIgorI2luY2x1ZGUgPHNpZ25hbC5o PgorCisjaW5jbHVkZSAiaW5mLXB0cmFjZS5oIgorI2luY2x1ZGUgImluZi1j aGlsZC5oIgorI2luY2x1ZGUgImdkYnRocmVhZC5oIgorCisKKyNpZmRlZiBQ VF9HRVRfUFJPQ0VTU19TVEFURQorCitzdGF0aWMgaW50CitpbmZfcHRyYWNl X2ZvbGxvd19mb3JrIChzdHJ1Y3QgdGFyZ2V0X29wcyAqb3BzLCBpbnQgZm9s bG93X2NoaWxkKQoreworICBwaWRfdCBwaWQsIGZwaWQ7CisgIHB0cmFjZV9z dGF0ZV90IHBlOworCisgIHBpZCA9IHB0aWRfZ2V0X3BpZCAoaW5mZXJpb3Jf cHRpZCk7CisKKyAgaWYgKHB0cmFjZSAoUFRfR0VUX1BST0NFU1NfU1RBVEUs IChsb25nIGxvbmcpIHBpZCwKKyAgICAgICAgICAgICAgIChsb25nIGxvbmcp JnBlLCBzaXplb2YgcGUpID09IC0xKQorICAgIHBlcnJvcl93aXRoX25hbWUg KCgicHRyYWNlIikpOworCisgIGdkYl9hc3NlcnQgKHBlLnBlX3JlcG9ydF9l dmVudCA9PSBQVFJBQ0VfRk9SSyk7CisgIGZwaWQgPSBwZS5wZV9vdGhlcl9w aWQ7CisKKyAgaWYgKGZvbGxvd19jaGlsZCkKKyAgICB7CisgICAgICBzdHJ1 Y3QgaW5mZXJpb3IgKnBhcmVudF9pbmYsICpjaGlsZF9pbmY7CisgICAgICBz dHJ1Y3QgdGhyZWFkX2luZm8gKnRwOworCisgICAgICBwYXJlbnRfaW5mID0g ZmluZF9pbmZlcmlvcl9waWQgKHBpZCk7CisKKyAgICAgIC8qIEFkZCB0aGUg Y2hpbGQuICAqLworICAgICAgY2hpbGRfaW5mID0gYWRkX2luZmVyaW9yIChm cGlkKTsKKyAgICAgIGNoaWxkX2luZi0+YXR0YWNoX2ZsYWcgPSBwYXJlbnRf aW5mLT5hdHRhY2hfZmxhZzsKKyAgICAgIGNvcHlfdGVybWluYWxfaW5mbyAo Y2hpbGRfaW5mLCBwYXJlbnRfaW5mKTsKKyAgICAgIGNoaWxkX2luZi0+cHNw YWNlID0gcGFyZW50X2luZi0+cHNwYWNlOworICAgICAgY2hpbGRfaW5mLT5h c3BhY2UgPSBwYXJlbnRfaW5mLT5hc3BhY2U7CisKKyAgICAgIC8qIEJlZm9y ZSBkZXRhY2hpbmcgZnJvbSB0aGUgcGFyZW50LCByZW1vdmUgYWxsIGJyZWFr cG9pbnRzIGZyb20KKyAgICAgICAgIGl0LiAgKi8KKyAgICAgIHJlbW92ZV9i cmVha3BvaW50cyAoKTsKKworICAgICAgaWYgKHB0cmFjZTY0IChQVF9ERVRB Q0gsIChsb25nIGxvbmcpIHBpZCwgKGxvbmcgbG9uZykxLCAwKSA9PSAtMSkK KyAgICAgICAgcGVycm9yX3dpdGhfbmFtZSAoKCJwdHJhY2UiKSk7CisKKyAg ICAgIC8qIFN3aXRjaCBpbmZlcmlvcl9wdGlkIG91dCBvZiB0aGUgcGFyZW50 J3Mgd2F5LiAgKi8KKyAgICAgIGluZmVyaW9yX3B0aWQgPSBwaWRfdG9fcHRp ZCAoZnBpZCk7CisKKyAgICAgIC8qIERlbGV0ZSB0aGUgcGFyZW50LiAgKi8K KyAgICAgIGRldGFjaF9pbmZlcmlvciAocGlkKTsKKworICAgICAgYWRkX3Ro cmVhZF9zaWxlbnQgKGluZmVyaW9yX3B0aWQpOworICAgIH0KKyAgZWxzZQor ICAgIHsKKyAgICAgIC8qIEJyZWFrcG9pbnRzIGhhdmUgYWxyZWFkeSBiZWVu IGRldGFjaGVkIGZyb20gdGhlIGNoaWxkIGJ5CisgICAgICAgICBpbmZydW4u Yy4gICovCisKKyAgICAgIGlmIChwdHJhY2U2NCAoUFRfREVUQUNILCAobG9u ZyBsb25nKSBmcGlkLCAobG9uZyBsb25nKTEsIDApID09IC0xKQorICAgICAg ICBwZXJyb3Jfd2l0aF9uYW1lICgoInB0cmFjZSIpKTsKKyAgICB9CisKKyAg cmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBQVF9HRVRfUFJPQ0VTU19TVEFU RSAqLworCisKKy8qIFByZXBhcmUgdG8gYmUgdHJhY2VkLiAgKi8KKworc3Rh dGljIHZvaWQKK2luZl9wdHJhY2VfbWUgKHZvaWQpCit7CisgIC8qICJUcmFj ZSBtZSwgRHIuIE1lbW9yeSEiICAqLworICBwdHJhY2U2NCAoUFRfVFJBQ0Vf TUUsIChsb25nIGxvbmcpIDAsIChsb25nIGxvbmcpMCwgMCk7Cit9CisKKy8q IFN0YXJ0IGEgbmV3IGluZmVyaW9yIFVuaXggY2hpbGQgcHJvY2Vzcy4gIEVY RUNfRklMRSBpcyB0aGUgZmlsZSB0bworICAgcnVuLCBBTExBUkdTIGlzIGEg c3RyaW5nIGNvbnRhaW5pbmcgdGhlIGFyZ3VtZW50cyB0byB0aGUgcHJvZ3Jh bS4KKyAgIEVOViBpcyB0aGUgZW52aXJvbm1lbnQgdmVjdG9yIHRvIHBhc3Mu ICBJZiBGUk9NX1RUWSBpcyBub24temVybywgYmUKKyAgIGNoYXR0eSBhYm91 dCBpdC4gICovCisKK3N0YXRpYyB2b2lkCitpbmZfcHRyYWNlX2NyZWF0ZV9p bmZlcmlvciAoc3RydWN0IHRhcmdldF9vcHMgKm9wcywKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjaGFyICpleGVjX2ZpbGUsIGNoYXIgKmFsbGFy Z3MsIGNoYXIgKiplbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg aW50IGZyb21fdHR5KQoreworICBpbnQgcGlkOworCisgIC8qIERvIG5vdCBj aGFuZ2UgZWl0aGVyIHRhcmdldHMgYWJvdmUgb3IgdGhlIHNhbWUgdGFyZ2V0 IGlmIGFscmVhZHkgcHJlc2VudC4KKyAgICAgVGhlIHJlYXNvbiBpcyB0aGUg dGFyZ2V0IHN0YWNrIGlzIHNoYXJlZCBhY3Jvc3MgbXVsdGlwbGUgaW5mZXJp b3JzLiAgKi8KKyAgaW50IG9wc19hbHJlYWR5X3B1c2hlZCA9IHRhcmdldF9p c19wdXNoZWQgKG9wcyk7CisgIHN0cnVjdCBjbGVhbnVwICpiYWNrX3RvID0g TlVMTDsKKworICBpZiAoISBvcHNfYWxyZWFkeV9wdXNoZWQpCisgICAgewor ICAgICAgLyogQ2xlYXIgcG9zc2libGUgY29yZSBmaWxlIHdpdGggaXRzIHBy b2Nlc3Nfc3RyYXR1bS4gICovCisgICAgICBwdXNoX3RhcmdldCAob3BzKTsK KyAgICAgIGJhY2tfdG8gPSBtYWtlX2NsZWFudXBfdW5wdXNoX3RhcmdldCAo b3BzKTsKKyAgICB9CisKKyAgcGlkID0gZm9ya19pbmZlcmlvciAoZXhlY19m aWxlLCBhbGxhcmdzLCBlbnYsIGluZl9wdHJhY2VfbWUsIE5VTEwsCisgICAg ICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworCisgIGlm ICghIG9wc19hbHJlYWR5X3B1c2hlZCkKKyAgICBkaXNjYXJkX2NsZWFudXBz IChiYWNrX3RvKTsKKworICAvKiBTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBF Q1RFRCBpcyBkZWZpbmVkIGluIGluZmVyaW9yLmgsIGFuZCB3aWxsCisgICAg IGJlIDEgb3IgMiBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSdyZSBzdGFydGlu ZyB3aXRob3V0IG9yIHdpdGggYQorICAgICBzaGVsbC4gICovCisgIHN0YXJ0 dXBfaW5mZXJpb3IgKFNUQVJUX0lORkVSSU9SX1RSQVBTX0VYUEVDVEVEKTsK KworICAvKiBPbiBzb21lIHRhcmdldHMsIHRoZXJlIG11c3QgYmUgc29tZSBl eHBsaWNpdCBhY3Rpb25zIHRha2VuIGFmdGVyCisgICAgIHRoZSBpbmZlcmlv ciBoYXMgYmVlbiBzdGFydGVkIHVwLiAgKi8KKyAgdGFyZ2V0X3Bvc3Rfc3Rh cnR1cF9pbmZlcmlvciAocGlkX3RvX3B0aWQgKHBpZCkpOworfQorCisjaWZk ZWYgUFRfR0VUX1BST0NFU1NfU1RBVEUKKworc3RhdGljIHZvaWQKK2luZl9w dHJhY2VfcG9zdF9zdGFydHVwX2luZmVyaW9yIChwdGlkX3QgcGlkKQorewor ICBwdHJhY2VfZXZlbnRfdCBwZTsKKworICAvKiBTZXQgdGhlIGluaXRpYWwg ZXZlbnQgbWFzay4gICovCisgIG1lbXNldCAoJnBlLCAwLCBzaXplb2YgcGUp OworICBwZS5wZV9zZXRfZXZlbnQgfD0gUFRSQUNFX0ZPUks7CisgIGlmIChw dHJhY2U2NCAoUFRfU0VUX0VWRU5UX01BU0ssIChsb25nIGxvbmcpIHB0aWRf Z2V0X3BpZCAocGlkKSwKKyAgICAgICAgICAgICAgKGxvbmcgbG9uZykmcGUs IHNpemVvZiBwZSkgPT0gLTEpCisgICAgcGVycm9yX3dpdGhfbmFtZSAoKCJw dHJhY2UiKSk7Cit9CisKKyNlbmRpZgorCisvKiBDbGVhbiB1cCBhIHJvdHRp bmcgY29ycHNlIG9mIGFuIGluZmVyaW9yIGFmdGVyIGl0IGRpZWQuICAqLwor CitzdGF0aWMgdm9pZAoraW5mX3B0cmFjZV9tb3Vybl9pbmZlcmlvciAoc3Ry dWN0IHRhcmdldF9vcHMgKm9wcykKK3sKKyAgaW50IHN0YXR1czsKKworICAv KiBXYWl0IGp1c3Qgb25lIG1vcmUgdGltZSB0byBjb2xsZWN0IHRoZSBpbmZl cmlvcidzIGV4aXQgc3RhdHVzLgorICAgICBEbyBub3QgY2hlY2sgd2hldGhl ciB0aGlzIHN1Y2NlZWRzIHRob3VnaCwgc2luY2Ugd2UgbWF5IGJlCisgICAg IGRlYWxpbmcgd2l0aCBhIHByb2Nlc3MgdGhhdCB3ZSBhdHRhY2hlZCB0by4g IFN1Y2ggYSBwcm9jZXNzIHdpbGwKKyAgICAgb25seSByZXBvcnQgaXRzIGV4 aXQgc3RhdHVzIHRvIGl0cyBvcmlnaW5hbCBwYXJlbnQuICAqLworICB3YWl0 cGlkIChwdGlkX2dldF9waWQgKGluZmVyaW9yX3B0aWQpLCAmc3RhdHVzLCAw KTsKKworICBnZW5lcmljX21vdXJuX2luZmVyaW9yICgpOworCisgIGlmICgh aGF2ZV9pbmZlcmlvcnMgKCkpCisgICAgdW5wdXNoX3RhcmdldCAob3BzKTsK K30KKworLyogQXR0YWNoIHRvIHRoZSBwcm9jZXNzIHNwZWNpZmllZCBieSBB UkdTLiAgSWYgRlJPTV9UVFkgaXMgbm9uLXplcm8sCisgICBiZSBjaGF0dHkg YWJvdXQgaXQuICAqLworCitzdGF0aWMgdm9pZAoraW5mX3B0cmFjZV9hdHRh Y2ggKHN0cnVjdCB0YXJnZXRfb3BzICpvcHMsIGNoYXIgKmFyZ3MsIGludCBm cm9tX3R0eSkKK3sKKyAgY2hhciAqZXhlY19maWxlOworICBwaWRfdCBwaWQ7 CisgIHN0cnVjdCBpbmZlcmlvciAqaW5mOworCisgIC8qIERvIG5vdCBjaGFu Z2UgZWl0aGVyIHRhcmdldHMgYWJvdmUgb3IgdGhlIHNhbWUgdGFyZ2V0IGlm IGFscmVhZHkgcHJlc2VudC4KKyAgICAgVGhlIHJlYXNvbiBpcyB0aGUgdGFy Z2V0IHN0YWNrIGlzIHNoYXJlZCBhY3Jvc3MgbXVsdGlwbGUgaW5mZXJpb3Jz LiAgKi8KKyAgaW50IG9wc19hbHJlYWR5X3B1c2hlZCA9IHRhcmdldF9pc19w dXNoZWQgKG9wcyk7CisgIHN0cnVjdCBjbGVhbnVwICpiYWNrX3RvID0gTlVM TDsKKworICBwaWQgPSBwYXJzZV9waWRfdG9fYXR0YWNoIChhcmdzKTsKKwor ICBpZiAocGlkID09IGdldHBpZCAoKSkgICAgICAgICAvKiBUcnlpbmcgdG8g bWFzdHVyYmF0ZT8gICovCisgICAgZXJyb3IgKF8oIkkgcmVmdXNlIHRvIGRl YnVnIG15c2VsZiEiKSk7CisKKyAgaWYgKCEgb3BzX2FscmVhZHlfcHVzaGVk KQorICAgIHsKKyAgICAgIC8qIHRhcmdldF9waWRfdG9fc3RyIGFscmVhZHkg dXNlcyB0aGUgdGFyZ2V0LiAgQWxzbyBjbGVhciBwb3NzaWJsZSBjb3JlCisg ICAgICAgICBmaWxlIHdpdGggaXRzIHByb2Nlc3Nfc3RyYXR1bS4gICovCisg ICAgICBwdXNoX3RhcmdldCAob3BzKTsKKyAgICAgIGJhY2tfdG8gPSBtYWtl X2NsZWFudXBfdW5wdXNoX3RhcmdldCAob3BzKTsKKyAgICB9CisKKyAgaWYg KGZyb21fdHR5KQorICAgIHsKKyAgICAgIGV4ZWNfZmlsZSA9IGdldF9leGVj X2ZpbGUgKDApOworCisgICAgICBpZiAoZXhlY19maWxlKQorICAgICAgICBw cmludGZfdW5maWx0ZXJlZCAoXygiQXR0YWNoaW5nIHRvIHByb2dyYW06ICVz LCAlc1xuIiksIGV4ZWNfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgIHRhcmdldF9waWRfdG9fc3RyIChwaWRfdG9fcHRpZCAocGlkKSkpOwor ICAgICAgZWxzZQorICAgICAgICBwcmludGZfdW5maWx0ZXJlZCAoXygiQXR0 YWNoaW5nIHRvICVzXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg IHRhcmdldF9waWRfdG9fc3RyIChwaWRfdG9fcHRpZCAocGlkKSkpOworCisg ICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworICAgIH0KKworI2lmZGVm IFBUX0FUVEFDSAorICBlcnJubyA9IDA7CisgIHB0cmFjZTY0IChQVF9BVFRB Q0gsIChsb25nIGxvbmcpIHBpZCwgKGxvbmcgbG9uZykwLCAwKTsKKyAgaWYg KGVycm5vICE9IDApCisgICAgcGVycm9yX3dpdGhfbmFtZSAoKCJwdHJhY2Ui KSk7CisjZWxzZQorICBlcnJvciAoXygiVGhpcyBzeXN0ZW0gZG9lcyBub3Qg c3VwcG9ydCBhdHRhY2hpbmcgdG8gYSBwcm9jZXNzIikpOworI2VuZGlmCisK KyAgaW5mID0gY3VycmVudF9pbmZlcmlvciAoKTsKKyAgaW5mZXJpb3JfYXBw ZWFyZWQgKGluZiwgcGlkKTsKKyAgaW5mLT5hdHRhY2hfZmxhZyA9IDE7Cisg IGluZmVyaW9yX3B0aWQgPSBwaWRfdG9fcHRpZCAocGlkKTsKKworICAvKiBB bHdheXMgYWRkIGEgbWFpbiB0aHJlYWQuICBJZiBzb21lIHRhcmdldCBleHRl bmRzIHRoZSBwdHJhY2UKKyAgICAgdGFyZ2V0LCBpdCBzaG91bGQgZGVjb3Jh dGUgdGhlIHB0aWQgbGF0ZXIgd2l0aCBtb3JlIGluZm8uICAqLworICBhZGRf dGhyZWFkX3NpbGVudCAoaW5mZXJpb3JfcHRpZCk7CisKKyAgaWYgKCEgb3Bz X2FscmVhZHlfcHVzaGVkKQorICAgIGRpc2NhcmRfY2xlYW51cHMgKGJhY2tf dG8pOworfQorCisjaWZkZWYgUFRfR0VUX1BST0NFU1NfU1RBVEUKKworc3Rh dGljIHZvaWQKK2luZl9wdHJhY2VfcG9zdF9hdHRhY2ggKGludCBwaWQpCit7 CisgIHB0cmFjZV9ldmVudF90IHBlOworCisgIC8qIFNldCB0aGUgaW5pdGlh bCBldmVudCBtYXNrLiAgKi8KKyAgbWVtc2V0ICgmcGUsIDAsIHNpemVvZiBw ZSk7CisgIHBlLnBlX3NldF9ldmVudCB8PSBQVFJBQ0VfRk9SSzsKKyAgaWYg KHB0cmFjZTY0IChQVF9TRVRfRVZFTlRfTUFTSywgKGxvbmcgbG9uZykgcGlk LAorICAgICAgICAgICAgICAobG9uZyBsb25nKSZwZSwgc2l6ZW9mIHBlKSA9 PSAtMSkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lICgoInB0cmFjZSIpKTsKK30K KworI2VuZGlmCisKKy8qIERldGFjaCBmcm9tIHRoZSBpbmZlcmlvciwgb3B0 aW9uYWxseSBwYXNzaW5nIGl0IHRoZSBzaWduYWwKKyAgIHNwZWNpZmllZCBi eSBBUkdTLiAgSWYgRlJPTV9UVFkgaXMgbm9uLXplcm8sIGJlIGNoYXR0eSBh Ym91dCBpdC4gICovCisKK3N0YXRpYyB2b2lkCitpbmZfcHRyYWNlX2RldGFj aCAoc3RydWN0IHRhcmdldF9vcHMgKm9wcywgY2hhciAqYXJncywgaW50IGZy b21fdHR5KQoreworICBwaWRfdCBwaWQgPSBwdGlkX2dldF9waWQgKGluZmVy aW9yX3B0aWQpOworICBpbnQgc2lnID0gMDsKKworICBpZiAoZnJvbV90dHkp CisgICAgeworICAgICAgY2hhciAqZXhlY19maWxlID0gZ2V0X2V4ZWNfZmls ZSAoMCk7CisgICAgICBpZiAoZXhlY19maWxlID09IDApCisgICAgICAgIGV4 ZWNfZmlsZSA9ICIiOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKF8oIkRl dGFjaGluZyBmcm9tIHByb2dyYW06ICVzLCAlc1xuIiksIGV4ZWNfZmlsZSwK KyAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfcGlkX3RvX3N0ciAo cGlkX3RvX3B0aWQgKHBpZCkpKTsKKyAgICAgIGdkYl9mbHVzaCAoZ2RiX3N0 ZG91dCk7CisgICAgfQorICBpZiAoYXJncykKKyAgICBzaWcgPSBhdG9pIChh cmdzKTsKKworI2lmZGVmIFBUX0RFVEFDSAorICAvKiBXZSdkIGJldHRlciBu b3QgaGF2ZSBsZWZ0IGFueSBicmVha3BvaW50cyBpbiB0aGUgcHJvZ3JhbSBv ciBpdCdsbAorICAgICBkaWUgd2hlbiBpdCBoaXRzIG9uZS4gIEFsc28gbm90 ZSB0aGF0IHRoaXMgbWF5IG9ubHkgd29yayBpZiB3ZQorICAgICBwcmV2aW91 c2x5IGF0dGFjaGVkIHRvIHRoZSBpbmZlcmlvci4gIEl0ICptaWdodCogd29y ayBpZiB3ZQorICAgICBzdGFydGVkIHRoZSBwcm9jZXNzIG91cnNlbHZlcy4g ICovCisgIGVycm5vID0gMDsKKyAgcHRyYWNlNjQgKFBUX0RFVEFDSCwgKGxv bmcgbG9uZykgcGlkLCAobG9uZyBsb25nKSAxLCBzaWcpOworICBpZiAoZXJy bm8gIT0gMCkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lICgoInB0cmFjZSIpKTsK KyNlbHNlCisgIGVycm9yIChfKCJUaGlzIHN5c3RlbSBkb2VzIG5vdCBzdXBw b3J0IGRldGFjaGluZyBmcm9tIGEgcHJvY2VzcyIpKTsKKyNlbmRpZgorCisg IGluZmVyaW9yX3B0aWQgPSBudWxsX3B0aWQ7CisgIGRldGFjaF9pbmZlcmlv ciAocGlkKTsKKworICBpZiAoIWhhdmVfaW5mZXJpb3JzICgpKQorICAgIHVu cHVzaF90YXJnZXQgKG9wcyk7Cit9CisKKy8qIEtpbGwgdGhlIGluZmVyaW9y LiAgKi8KKworc3RhdGljIHZvaWQKK2luZl9wdHJhY2Vfa2lsbCAoc3RydWN0 IHRhcmdldF9vcHMgKm9wcykKK3sKKyAgcGlkX3QgcGlkID0gcHRpZF9nZXRf cGlkIChpbmZlcmlvcl9wdGlkKTsKKyAgaW50IHN0YXR1czsKKworICBpZiAo cGlkID09IDApCisgICAgcmV0dXJuOworCisgIHB0cmFjZTY0IChQVF9LSUxM LCAobG9uZyBsb25nKSBwaWQsIChsb25nIGxvbmcpIDAsIDApOworICB3YWl0 cGlkIChwaWQsICZzdGF0dXMsIDApOworCisgIHRhcmdldF9tb3Vybl9pbmZl cmlvciAoKTsKK30KKworLyogU3RvcCB0aGUgaW5mZXJpb3IuICAqLworCitz dGF0aWMgdm9pZAoraW5mX3B0cmFjZV9zdG9wIChwdGlkX3QgcHRpZCkKK3sK KyAgLyogU2VuZCBhIFNJR0lOVCB0byB0aGUgcHJvY2VzcyBncm91cC4gIFRo aXMgYWN0cyBqdXN0IGxpa2UgdGhlIHVzZXIKKyAgICAgdHlwZWQgYSBeQyBv biB0aGUgY29udHJvbGxpbmcgdGVybWluYWwuICBOb3RlIHRoYXQgdXNpbmcg YQorICAgICBuZWdhdGl2ZSBwcm9jZXNzIG51bWJlciBpbiBraWxsKCkgaXMg YSBTeXN0ZW0gVi1pc20uICBUaGUgcHJvcGVyCisgICAgIEJTRCBpbnRlcmZh Y2UgaXMga2lsbHBnKCkuICBIb3dldmVyLCBhbGwgbW9kZXJuIEJTRHMgc3Vw cG9ydCB0aGUKKyAgICAgU3lzdGVtIFYgaW50ZXJmYWNlIHRvby4gICovCisg IGtpbGwgKC1pbmZlcmlvcl9wcm9jZXNzX2dyb3VwICgpLCBTSUdJTlQpOwor fQorCisvKiBSZXN1bWUgZXhlY3V0aW9uIG9mIHRocmVhZCBQVElELCBvciBh bGwgdGhyZWFkcyBpZiBQVElEIGlzIC0xLiAgSWYKKyAgIFNURVAgaXMgbm9u emVybywgc2luZ2xlLXN0ZXAgaXQuICBJZiBTSUdOQUwgaXMgbm9uemVybywg Z2l2ZSBpdAorICAgdGhhdCBzaWduYWwuICAqLworCitzdGF0aWMgdm9pZAor aW5mX3B0cmFjZV9yZXN1bWUgKHN0cnVjdCB0YXJnZXRfb3BzICpvcHMsCisg ICAgICAgICAgICAgICAgICAgcHRpZF90IHB0aWQsIGludCBzdGVwLCBlbnVt IGdkYl9zaWduYWwgc2lnbmFsKQoreworICBwaWRfdCBwaWQgPSBwdGlkX2dl dF9waWQgKHB0aWQpOworICBpbnQgcmVxdWVzdDsKKworICBpZiAocGlkID09 IC0xKQorICAgIC8qIFJlc3VtZSBhbGwgdGhyZWFkcy4gIFRyYWRpdGlvbmFs bHkgcHRyYWNlKCkgb25seSBzdXBwb3J0cworICAgICAgIHNpbmdsZS10aHJl YWRlZCBwcm9jZXNzZXMsIHNvIHNpbXBseSByZXN1bWUgdGhlIGluZmVyaW9y LiAgKi8KKyAgICBwaWQgPSBwdGlkX2dldF9waWQgKGluZmVyaW9yX3B0aWQp OworCisgIGlmIChjYXRjaF9zeXNjYWxsX2VuYWJsZWQgKCkgPiAwKQorICAg IHJlcXVlc3QgPSBQVF9TWVNDQUxMOworICBlbHNlCisgICAgcmVxdWVzdCA9 IFBUX0NPTlRJTlVFOworCisgIGlmIChzdGVwKQorICAgIHsKKyAgICAgIC8q IElmIHRoaXMgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgUFRfU1RFUCwgYSBo aWdoZXIgbGV2ZWwKKyAgICAgICAgIGZ1bmN0aW9uIHdpbGwgaGF2ZSBjYWxs ZWQgc2luZ2xlX3N0ZXAoKSB0byB0cmFuc211dGUgdGhlIHN0ZXAKKyAgICAg ICAgIHJlcXVlc3QgaW50byBhIGNvbnRpbnVlIHJlcXVlc3QgKGJ5IHNldHRp bmcgYnJlYWtwb2ludHMgb24KKyAgICAgICAgIGFsbCBwb3NzaWJsZSBzdWNj ZXNzb3IgaW5zdHJ1Y3Rpb25zKSwgc28gd2UgZG9uJ3QgaGF2ZSB0bworICAg ICAgICAgd29ycnkgYWJvdXQgdGhhdCBoZXJlLiAgKi8KKyAgICAgIHJlcXVl c3QgPSBQVF9TVEVQOworICAgIH0KKworICAvKiBBbiBhZGRyZXNzIG9mIChQ VFJBQ0VfVFlQRV9BUkczKTEgdGVsbHMgcHRyYWNlIHRvIGNvbnRpbnVlIGZy b20KKyAgICAgd2hlcmUgaXQgd2FzLiAgSWYgR0RCIHdhbnRlZCBpdCB0byBz dGFydCBzb21lIG90aGVyIHdheSwgd2UgaGF2ZQorICAgICBhbHJlYWR5IHdy aXR0ZW4gYSBuZXcgcHJvZ3JhbSBjb3VudGVyIHZhbHVlIHRvIHRoZSBjaGls ZC4gICovCisgIGVycm5vID0gMDsKKyAgcHRyYWNlNjQgKHJlcXVlc3QsIChs b25nIGxvbmcpIHBpZCwgKGxvbmcgbG9uZykxLCBnZGJfc2lnbmFsX3RvX2hv c3QgKHNpZ25hbCkpOworICBpZiAoZXJybm8gIT0gMCkKKyAgICBwZXJyb3Jf d2l0aF9uYW1lICgoInB0cmFjZSIpKTsKK30KKworLyogV2FpdCBmb3IgdGhl IGNoaWxkIHNwZWNpZmllZCBieSBQVElEIHRvIGRvIHNvbWV0aGluZy4gIFJl dHVybiB0aGUKKyAgIHByb2Nlc3MgSUQgb2YgdGhlIGNoaWxkLCBvciBNSU5V U19PTkVfUFRJRCBpbiBjYXNlIG9mIGVycm9yOyBzdG9yZQorICAgdGhlIHN0 YXR1cyBpbiAqT1VSU1RBVFVTLiAgKi8KKworc3RhdGljIHB0aWRfdAoraW5m X3B0cmFjZV93YWl0IChzdHJ1Y3QgdGFyZ2V0X29wcyAqb3BzLAorICAgICAg ICAgICAgICAgICBwdGlkX3QgcHRpZCwgc3RydWN0IHRhcmdldF93YWl0c3Rh dHVzICpvdXJzdGF0dXMsIGludCBvcHRpb25zKQoreworICBwaWRfdCBwaWQ7 CisgIGludCBzdGF0dXMsIHNhdmVfZXJybm87CisKKyAgZG8KKyAgICB7Cisg ICAgICBzZXRfc2lnaW50X3RyYXAgKCk7CisKKyAgICAgIGRvCisgICAgICAg IHsKKyAgICAgICAgICBwaWQgPSB3YWl0cGlkIChwdGlkX2dldF9waWQgKHB0 aWQpLCAmc3RhdHVzLCAwKTsKKyAgICAgICAgICBzYXZlX2Vycm5vID0gZXJy bm87CisgICAgICAgIH0KKyAgICAgIHdoaWxlIChwaWQgPT0gLTEgJiYgZXJy bm8gPT0gRUlOVFIpOworCisgICAgICBjbGVhcl9zaWdpbnRfdHJhcCAoKTsK KworICAgICAgaWYgKHBpZCA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAg IGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIF8oIkNoaWxkIHByb2Nlc3MgdW5leHBlY3Rl ZGx5IG1pc3Npbmc6ICVzLlxuIiksCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzYWZlX3N0cmVycm9yIChzYXZlX2Vycm5vKSk7CisKKyAgICAg ICAgICAvKiBDbGFpbSBpdCBleGl0ZWQgd2l0aCB1bmtub3duIHNpZ25hbC4g ICovCisgICAgICAgICAgb3Vyc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRL SU5EX1NJR05BTExFRDsKKyAgICAgICAgICBvdXJzdGF0dXMtPnZhbHVlLnNp ZyA9IEdEQl9TSUdOQUxfVU5LTk9XTjsKKyAgICAgICAgICByZXR1cm4gaW5m ZXJpb3JfcHRpZDsKKyAgICAgICAgfQorCisgICAgICAvKiBJZ25vcmUgdGVy bWluYXRlZCBkZXRhY2hlZCBjaGlsZCBwcm9jZXNzZXMuICAqLworICAgICAg aWYgKCFXSUZTVE9QUEVEIChzdGF0dXMpICYmIHBpZCAhPSBwdGlkX2dldF9w aWQgKGluZmVyaW9yX3B0aWQpKQorICAgICAgICBwaWQgPSAtMTsKKyAgICB9 CisgIHdoaWxlIChwaWQgPT0gLTEpOworCisjaWZkZWYgUFRfR0VUX1BST0NF U1NfU1RBVEUKKyAgaWYgKFdJRlNUT1BQRUQgKHN0YXR1cykpCisgICAgewor ICAgICAgcHRyYWNlX3N0YXRlX3QgcGU7CisgICAgICBwaWRfdCBmcGlkOwor CisgICAgICBpZiAocHRyYWNlNjQgKFBUX0dFVF9QUk9DRVNTX1NUQVRFLCAo bG9uZyBsb25nKSBwaWQsCisgICAgICAgICAgICAgICAgICAobG9uZyBsb25n KSZwZSwgc2l6ZW9mIHBlKSA9PSAtMSkKKyAgICAgICAgcGVycm9yX3dpdGhf bmFtZSAoKCJwdHJhY2UiKSk7CisKKyAgICAgIHN3aXRjaCAocGUucGVfcmVw b3J0X2V2ZW50KQorICAgICAgICB7CisgICAgICAgIGNhc2UgUFRSQUNFX0ZP Uks6CisgICAgICAgICAgb3Vyc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRL SU5EX0ZPUktFRDsKKyAgICAgICAgICBvdXJzdGF0dXMtPnZhbHVlLnJlbGF0 ZWRfcGlkID0gcGlkX3RvX3B0aWQgKHBlLnBlX290aGVyX3BpZCk7CisKKyAg ICAgICAgICAvKiBNYWtlIHN1cmUgdGhlIG90aGVyIGVuZCBvZiB0aGUgZm9y ayBpcyBzdG9wcGVkIHRvby4gICovCisgICAgICAgICAgZnBpZCA9IHdhaXRw aWQgKHBlLnBlX290aGVyX3BpZCwgJnN0YXR1cywgMCk7CisgICAgICAgICAg aWYgKGZwaWQgPT0gLTEpCisgICAgICAgICAgICBwZXJyb3Jfd2l0aF9uYW1l ICgoIndhaXRwaWQiKSk7CisKKyAgICAgICAgICBpZiAocHRyYWNlNjQgKFBU X0dFVF9QUk9DRVNTX1NUQVRFLCAobG9uZyBsb25nKSBmcGlkLAorICAgICAg ICAgICAgICAgICAgICAgIChsb25nIGxvbmcpJnBlLCBzaXplb2YgcGUpID09 IC0xKQorICAgICAgICAgICAgcGVycm9yX3dpdGhfbmFtZSAoKCJwdHJhY2Ui KSk7CisKKyAgICAgICAgICBnZGJfYXNzZXJ0IChwZS5wZV9yZXBvcnRfZXZl bnQgPT0gUFRSQUNFX0ZPUkspOworICAgICAgICAgIGdkYl9hc3NlcnQgKHBl LnBlX290aGVyX3BpZCA9PSBwaWQpOworICAgICAgICAgIGlmIChmcGlkID09 IHB0aWRfZ2V0X3BpZCAoaW5mZXJpb3JfcHRpZCkpCisgICAgICAgICAgICB7 CisgICAgICAgICAgICAgIG91cnN0YXR1cy0+dmFsdWUucmVsYXRlZF9waWQg PSBwaWRfdG9fcHRpZCAocGUucGVfb3RoZXJfcGlkKTsKKyAgICAgICAgICAg ICAgcmV0dXJuIHBpZF90b19wdGlkIChmcGlkKTsKKyAgICAgICAgICAgIH0K KworICAgICAgICAgIHJldHVybiBwaWRfdG9fcHRpZCAocGlkKTsKKyAgICAg ICAgfQorICAgIH0KKyNlbmRpZgorCisgIHN0b3JlX3dhaXRzdGF0dXMgKG91 cnN0YXR1cywgc3RhdHVzKTsKKyAgcmV0dXJuIHBpZF90b19wdGlkIChwaWQp OworfQorCisvKiBBdHRlbXB0IGEgdHJhbnNmZXIgYWxsIExFTiBieXRlcyBz dGFydGluZyBhdCBPRkZTRVQgYmV0d2VlbiB0aGUKKyAgIGluZmVyaW9yJ3Mg T0JKRUNUOkFOTkVYIHNwYWNlIGFuZCBHREIncyBSRUFEQlVGL1dSSVRFQlVG IGJ1ZmZlci4KKyAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVh bGx5IHRyYW5zZmVycmVkLiAgKi8KKworc3RhdGljIExPTkdFU1QKK2luZl9w dHJhY2VfeGZlcl9wYXJ0aWFsIChzdHJ1Y3QgdGFyZ2V0X29wcyAqb3BzLCBl bnVtIHRhcmdldF9vYmplY3Qgb2JqZWN0LAorICAgICAgICAgICAgICAgICAg ICAgICAgIGNvbnN0IGNoYXIgKmFubmV4LCBnZGJfYnl0ZSAqcmVhZGJ1ZiwK KyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZGJfYnl0ZSAqd3Jp dGVidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkdFU1Qgb2Zm c2V0LCBMT05HRVNUIGxlbikKK3sKKyAgcGlkX3QgcGlkID0gcHRpZF9nZXRf cGlkIChpbmZlcmlvcl9wdGlkKTsKKworICBzd2l0Y2ggKG9iamVjdCkKKyAg ICB7CisgICAgY2FzZSBUQVJHRVRfT0JKRUNUX01FTU9SWToKKyNpZmRlZiBQ VF9JTworICAgICAgLyogT3BlbkJTRCAzLjEsIE5ldEJTRCAxLjYgYW5kIEZy ZWVCU0QgNS4wIGhhdmUgYSBuZXcgUFRfSU8KKyAgICAgICAgIHJlcXVlc3Qg dGhhdCBwcm9taXNlcyB0byBiZSBtdWNoIG1vcmUgZWZmaWNpZW50IGluIHJl YWRpbmcKKyAgICAgICAgIGFuZCB3cml0aW5nIGRhdGEgaW4gdGhlIHRyYWNl ZCBwcm9jZXNzJ3MgYWRkcmVzcyBzcGFjZS4gICovCisgICAgICB7CisgICAg ICAgIHN0cnVjdCBwdHJhY2VfaW9fZGVzYyBwaW9kOworCisgICAgICAgIC8q IE5PVEU6IFdlIGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBubyBkaXN0aW5jdCBh ZGRyZXNzIHNwYWNlcworICAgICAgICAgICBmb3IgaW5zdHJ1Y3Rpb24gYW5k IGRhdGEuICBIb3dldmVyLCBvbiBPcGVuQlNEIDMuOSBhbmQKKyAgICAgICAg ICAgbGF0ZXIsIFBJT0RfV1JJVEVfRCBkb2Vzbid0IGFsbG93IGNoYW5naW5n IG1lbW9yeSB0aGF0J3MKKyAgICAgICAgICAgbWFwcGVkIHJlYWQtb25seS4g IFNpbmNlIG1vc3QgY29kZSBzZWdtZW50cyB3aWxsIGJlCisgICAgICAgICAg IHJlYWQtb25seSwgdXNpbmcgUElPRF9XUklURV9EIHdpbGwgcHJldmVudCB1 cyBmcm9tCisgICAgICAgICAgIGluc2VydGluZyBicmVha3BvaW50cywgc28g d2UgdXNlIFBJT0RfV1JJVEVfSSBpbnN0ZWFkLiAgKi8KKyAgICAgICAgcGlv ZC5waW9kX29wID0gd3JpdGVidWYgPyBQSU9EX1dSSVRFX0kgOiBQSU9EX1JF QURfRDsKKyAgICAgICAgcGlvZC5waW9kX2FkZHIgPSB3cml0ZWJ1ZiA/ICh2 b2lkICopIHdyaXRlYnVmIDogcmVhZGJ1ZjsKKyAgICAgICAgcGlvZC5waW9k X29mZnMgPSAodm9pZCAqKSAobG9uZykgb2Zmc2V0OworICAgICAgICBwaW9k LnBpb2RfbGVuID0gbGVuOworCisgICAgICAgIGVycm5vID0gMDsKKyAgICAg ICAgaWYgKHB0cmFjZTY0IChQVF9JTywgKGxvbmcgbG9uZykgcGlkLCAobG9u ZyBsb25nKSZwaW9kLCAwKSA9PSAwKQorICAgICAgICAgIC8qIFJldHVybiB0 aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyByZWFkIG9yIHdyaXR0ZW4uICAq LworICAgICAgICAgIHJldHVybiBwaW9kLnBpb2RfbGVuOworICAgICAgICAv KiBJZiB0aGUgUFRfSU8gcmVxdWVzdCBpcyBzb21laG93IG5vdCBzdXBwb3J0 ZWQsIGZhbGxiYWNrIG9uCisgICAgICAgICAgIHVzaW5nIFBUX1dSSVRFX0Qv UFRfUkVBRF9ELiAgT3RoZXJ3aXNlIHdlIHdpbGwgcmV0dXJuIHplcm8KKyAg ICAgICAgICAgdG8gaW5kaWNhdGUgZmFpbHVyZS4gICovCisgICAgICAgIGlm IChlcnJubyAhPSBFSU5WQUwpCisgICAgICAgICAgcmV0dXJuIDA7CisgICAg ICB9CisjZW5kaWYKKyAgICAgIHsKKyAgICAgICAgdW5pb24KKyAgICAgICAg eworICAgICAgICAgIFBUUkFDRV9UWVBFX1JFVCB3b3JkOworICAgICAgICAg IGdkYl9ieXRlIGJ5dGVbc2l6ZW9mIChQVFJBQ0VfVFlQRV9SRVQpXTsKKyAg ICAgICAgfSBidWZmZXI7CisgICAgICAgIFVMT05HRVNUIHJvdW5kZWRfb2Zm c2V0OworICAgICAgICBMT05HRVNUIHBhcnRpYWxfbGVuOworCisgICAgICAg IC8qIFJvdW5kIHRoZSBzdGFydCBvZmZzZXQgZG93biB0byB0aGUgbmV4dCBs b25nIHdvcmQKKyAgICAgICAgICAgYm91bmRhcnkuICAqLworICAgICAgICBy b3VuZGVkX29mZnNldCA9IG9mZnNldCAmIC0oVUxPTkdFU1QpIHNpemVvZiAo UFRSQUNFX1RZUEVfUkVUKTsKKworICAgICAgICAvKiBTaW5jZSBwdHJhY2Ug d2lsbCB0cmFuc2ZlciBhIHNpbmdsZSB3b3JkIHN0YXJ0aW5nIGF0IHRoYXQK KyAgICAgICAgICAgcm91bmRlZF9vZmZzZXQgdGhlIHBhcnRpYWxfbGVuIG5l ZWRzIHRvIGJlIGFkanVzdGVkIGRvd24gdG8KKyAgICAgICAgICAgdGhhdCAo cmVtZW1iZXIgdGhpcyBmdW5jdGlvbiBvbmx5IGRvZXMgYSBzaW5nbGUgdHJh bnNmZXIpLgorICAgICAgICAgICBTaG91bGQgdGhlIHJlcXVpcmVkIGxlbmd0 aCBiZSBldmVuIGxlc3MsIGFkanVzdCBpdCBkb3duCisgICAgICAgICAgIGFn YWluLiAgKi8KKyAgICAgICAgcGFydGlhbF9sZW4gPSAocm91bmRlZF9vZmZz ZXQgKyBzaXplb2YgKFBUUkFDRV9UWVBFX1JFVCkpIC0gb2Zmc2V0OworICAg ICAgICBpZiAocGFydGlhbF9sZW4gPiBsZW4pCisgICAgICAgICAgcGFydGlh bF9sZW4gPSBsZW47CisKKyAgICAgICAgaWYgKHdyaXRlYnVmKQorICAgICAg ICAgIHsKKyAgICAgICAgICAgIC8qIElmIE9GRlNFVDpQQVJUSUFMX0xFTiBp cyBzbWFsbGVyIHRoYW4KKyAgICAgICAgICAgICAgIFJPVU5ERURfT0ZGU0VU OldPUkRTSVpFIHRoZW4gYSByZWFkL21vZGlmeSB3cml0ZSB3aWxsCisgICAg ICAgICAgICAgICBiZSBuZWVkZWQuICBSZWFkIGluIHRoZSBlbnRpcmUgd29y ZC4gICovCisgICAgICAgICAgICBpZiAocm91bmRlZF9vZmZzZXQgPCBvZmZz ZXQKKyAgICAgICAgICAgICAgICB8fCAob2Zmc2V0ICsgcGFydGlhbF9sZW4K KyAgICAgICAgICAgICAgICAgICAgPCByb3VuZGVkX29mZnNldCArIHNpemVv ZiAoUFRSQUNFX1RZUEVfUkVUKSkpCisgICAgICAgICAgICAgIC8qIE5lZWQg cGFydCBvZiBpbml0aWFsIHdvcmQgLS0gZmV0Y2ggaXQuICAqLworICAgICAg ICAgICAgICBidWZmZXIud29yZCA9IHB0cmFjZTY0IChQVF9SRUFEX0ksIChs b25nIGxvbmcpIHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIChsb25nIGxvbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICByb3VuZGVkX29mZnNldCwgMCk7CisKKyAgICAgICAgICAg IC8qIENvcHkgZGF0YSB0byBiZSB3cml0dGVuIG92ZXIgY29ycmVzcG9uZGlu ZyBwYXJ0IG9mCisgICAgICAgICAgICAgICBidWZmZXIuICAqLworICAgICAg ICAgICAgbWVtY3B5IChidWZmZXIuYnl0ZSArIChvZmZzZXQgLSByb3VuZGVk X29mZnNldCksCisgICAgICAgICAgICAgICAgICAgIHdyaXRlYnVmLCBwYXJ0 aWFsX2xlbik7CisKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAg ICAgIHB0cmFjZTY0IChQVF9XUklURV9ELCAobG9uZyBsb25nKSBwaWQsCisg ICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpcm91bmRlZF9vZmZzZXQs CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci53b3JkKTsKKyAgICAgICAg ICAgIGlmIChlcnJubykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAg ICAgIC8qIFVzaW5nIHRoZSBhcHByb3ByaWF0ZSBvbmUgKEkgb3IgRCkgaXMg bmVjZXNzYXJ5IGZvcgorICAgICAgICAgICAgICAgICAgIEdvdWxkIE5QMSwg YXQgbGVhc3QuICAqLworICAgICAgICAgICAgICAgIGVycm5vID0gMDsKKyAg ICAgICAgICAgICAgICBwdHJhY2U2NCAoUFRfV1JJVEVfSSwgKGxvbmcgbG9u ZykgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyly b3VuZGVkX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZl ci53b3JkKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJybm8pCisgICAgICAg ICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgfQorICAgICAg ICAgIH0KKworICAgICAgICBpZiAocmVhZGJ1ZikKKyAgICAgICAgICB7Cisg ICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICAgICBidWZmZXIud29y ZCA9IHB0cmFjZTY0IChQVF9SRUFEX0ksIChsb25nIGxvbmcpIHBpZCwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXJv dW5kZWRfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDApOworICAgICAgICAgICAgaWYgKGVycm5vKQorICAgICAgICAgICAg ICByZXR1cm4gMDsKKyAgICAgICAgICAgIC8qIENvcHkgYXBwcm9wcmlhdGUg Ynl0ZXMgb3V0IG9mIHRoZSBidWZmZXIuICAqLworICAgICAgICAgICAgbWVt Y3B5IChyZWFkYnVmLCBidWZmZXIuYnl0ZSArIChvZmZzZXQgLSByb3VuZGVk X29mZnNldCksCisgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxfbGVuKTsK KyAgICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBhcnRpYWxfbGVuOwor ICAgICAgfQorCisgICAgY2FzZSBUQVJHRVRfT0JKRUNUX1VOV0lORF9UQUJM RToKKyAgICAgIHJldHVybiAtMTsKKworICAgIGNhc2UgVEFSR0VUX09CSkVD VF9BVVhWOgorI2lmIGRlZmluZWQgKFBUX0lPKSAmJiBkZWZpbmVkIChQSU9E X1JFQURfQVVYVikKKyAgICAgIC8qIE9wZW5CU0QgNC41IGhhcyBhIG5ldyBQ SU9EX1JFQURfQVVYViBvcGVyYXRpb24gZm9yIHRoZSBQVF9JTworICAgICAg ICAgcmVxdWVzdCB0aGF0IGFsbG93cyB1cyB0byByZWFkIHRoZSBhdXhpbGxp YXJ5IHZlY3Rvci4gIE90aGVyCisgICAgICAgICBCU0QncyBtYXkgZm9sbG93 IGlmIHRoZXkgZmVlbCB0aGUgbmVlZCB0byBzdXBwb3J0IFBJRS4gICovCisg ICAgICB7CisgICAgICAgIHN0cnVjdCBwdHJhY2VfaW9fZGVzYyBwaW9kOwor CisgICAgICAgIGlmICh3cml0ZWJ1ZikKKyAgICAgICAgICByZXR1cm4gLTE7 CisgICAgICAgIHBpb2QucGlvZF9vcCA9IFBJT0RfUkVBRF9BVVhWOworICAg ICAgICBwaW9kLnBpb2RfYWRkciA9IHJlYWRidWY7CisgICAgICAgIHBpb2Qu cGlvZF9vZmZzID0gKHZvaWQgKikgKGxvbmcpIG9mZnNldDsKKyAgICAgICAg cGlvZC5waW9kX2xlbiA9IGxlbjsKKworICAgICAgICBlcnJubyA9IDA7Cisg ICAgICAgIGlmIChwdHJhY2U2NCAoUFRfSU8sIChsb25nIGxvbmcpIHBpZCwg KGxvbmcgbG9uZykmcGlvZCwgMCkgPT0gMCkKKyAgICAgICAgICAvKiBSZXR1 cm4gdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciB3cml0dGVu LiAgKi8KKyAgICAgICAgICByZXR1cm4gcGlvZC5waW9kX2xlbjsKKyAgICAg IH0KKyNlbmRpZgorICAgICAgcmV0dXJuIC0xOworCisgICAgY2FzZSBUQVJH RVRfT0JKRUNUX1dDT09LSUU6CisgICAgICByZXR1cm4gLTE7CisKKyAgICBk ZWZhdWx0OgorICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworLyogUmV0 dXJuIG5vbi16ZXJvIGlmIHRoZSB0aHJlYWQgc3BlY2lmaWVkIGJ5IFBUSUQg aXMgYWxpdmUuICAqLworCitzdGF0aWMgaW50CitpbmZfcHRyYWNlX3RocmVh ZF9hbGl2ZSAoc3RydWN0IHRhcmdldF9vcHMgKm9wcywgcHRpZF90IHB0aWQp Cit7CisgIC8qID8/PyBJcyBraWxsIHRoZSByaWdodCB3YXkgdG8gZG8gdGhp cz8gICovCisgIHJldHVybiAoa2lsbCAocHRpZF9nZXRfcGlkIChwdGlkKSwg MCkgIT0gLTEpOworfQorCisvKiBQcmludCBzdGF0dXMgaW5mb3JtYXRpb24g YWJvdXQgd2hhdCB3ZSdyZSBhY2Nlc3NpbmcuICAqLworCitzdGF0aWMgdm9p ZAoraW5mX3B0cmFjZV9maWxlc19pbmZvIChzdHJ1Y3QgdGFyZ2V0X29wcyAq aWdub3JlKQoreworICBzdHJ1Y3QgaW5mZXJpb3IgKmluZiA9IGN1cnJlbnRf aW5mZXJpb3IgKCk7CisKKyAgcHJpbnRmX2ZpbHRlcmVkIChfKCJcdFVzaW5n IHRoZSBydW5uaW5nIGltYWdlIG9mICVzICVzLlxuIiksCisgICAgICAgICAg ICAgICAgICAgaW5mLT5hdHRhY2hfZmxhZyA/ICJhdHRhY2hlZCIgOiAiY2hp bGQiLAorICAgICAgICAgICAgICAgICAgIHRhcmdldF9waWRfdG9fc3RyIChp bmZlcmlvcl9wdGlkKSk7Cit9CisKK3N0YXRpYyBjaGFyICoKK2luZl9wdHJh Y2VfcGlkX3RvX3N0ciAoc3RydWN0IHRhcmdldF9vcHMgKm9wcywgcHRpZF90 IHB0aWQpCit7CisgIHJldHVybiBub3JtYWxfcGlkX3RvX3N0ciAocHRpZCk7 Cit9CisKKyNpZiBkZWZpbmVkIChQVF9JTykgJiYgZGVmaW5lZCAoUElPRF9S RUFEX0FVWFYpCisKKy8qIFJlYWQgb25lIGF1eHYgZW50cnkgZnJvbSAqUkVB RFBUUiwgbm90IHJlYWRpbmcgbG9jYXRpb25zID49IEVORFBUUi4KKyAgIFJl dHVybiAwIGlmICpSRUFEUFRSIGlzIGFscmVhZHkgYXQgdGhlIGVuZCBvZiB0 aGUgYnVmZmVyLgorICAgUmV0dXJuIC0xIGlmIHRoZXJlIGlzIGluc3VmZmlj aWVudCBidWZmZXIgZm9yIGEgd2hvbGUgZW50cnkuCisgICBSZXR1cm4gMSBp ZiBhbiBlbnRyeSB3YXMgcmVhZCBpbnRvICpUWVBFUCBhbmQgKlZBTFAuICAq LworCitzdGF0aWMgaW50CitpbmZfcHRyYWNlX2F1eHZfcGFyc2UgKHN0cnVj dCB0YXJnZXRfb3BzICpvcHMsIGdkYl9ieXRlICoqcmVhZHB0ciwKKyAgICAg ICAgICAgICAgICAgICAgICAgZ2RiX2J5dGUgKmVuZHB0ciwgQ09SRV9BRERS ICp0eXBlcCwgQ09SRV9BRERSICp2YWxwKQoreworICBzdHJ1Y3QgdHlwZSAq aW50X3R5cGUgPSBidWlsdGluX3R5cGUgKHRhcmdldF9nZGJhcmNoICgpKS0+ YnVpbHRpbl9pbnQ7CisgIHN0cnVjdCB0eXBlICpwdHJfdHlwZSA9IGJ1aWx0 aW5fdHlwZSAodGFyZ2V0X2dkYmFyY2ggKCkpLT5idWlsdGluX2RhdGFfcHRy OworICBjb25zdCBpbnQgc2l6ZW9mX2F1eHZfdHlwZSA9IFRZUEVfTEVOR1RI IChpbnRfdHlwZSk7CisgIGNvbnN0IGludCBzaXplb2ZfYXV4dl92YWwgPSBU WVBFX0xFTkdUSCAocHRyX3R5cGUpOworICBlbnVtIGJmZF9lbmRpYW4gYnl0 ZV9vcmRlciA9IGdkYmFyY2hfYnl0ZV9vcmRlciAodGFyZ2V0X2dkYmFyY2gg KCkpOworICBnZGJfYnl0ZSAqcHRyID0gKnJlYWRwdHI7CisKKyAgaWYgKGVu ZHB0ciA9PSBwdHIpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKGVuZHB0ciAt IHB0ciA8IDIgKiBzaXplb2ZfYXV4dl92YWwpCisgICAgcmV0dXJuIC0xOwor CisgICp0eXBlcCA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAocHRyLCBz aXplb2ZfYXV4dl90eXBlLCBieXRlX29yZGVyKTsKKyAgcHRyICs9IHNpemVv Zl9hdXh2X3ZhbDsgICAgICAgLyogQWxpZ25tZW50LiAgKi8KKyAgKnZhbHAg PSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKHB0ciwgc2l6ZW9mX2F1eHZf dmFsLCBieXRlX29yZGVyKTsKKyAgcHRyICs9IHNpemVvZl9hdXh2X3ZhbDsK KworICAqcmVhZHB0ciA9IHB0cjsKKyAgcmV0dXJuIDE7Cit9CisKKyNlbmRp ZgorCisvKiBDcmVhdGUgYSBwcm90b3R5cGUgcHRyYWNlIHRhcmdldC4gIFRo ZSBjbGllbnQgY2FuIG92ZXJyaWRlIGl0IHdpdGgKKyAgIGxvY2FsIG1ldGhv ZHMuICAqLworCitzdHJ1Y3QgdGFyZ2V0X29wcyAqCitpbmZfcHRyYWNlX3Rh cmdldCAodm9pZCkKK3sKKyAgc3RydWN0IHRhcmdldF9vcHMgKnQgPSBpbmZf Y2hpbGRfdGFyZ2V0ICgpOworCisgIHQtPnRvX2F0dGFjaCA9IGluZl9wdHJh Y2VfYXR0YWNoOworICB0LT50b19kZXRhY2ggPSBpbmZfcHRyYWNlX2RldGFj aDsKKyAgdC0+dG9fcmVzdW1lID0gaW5mX3B0cmFjZV9yZXN1bWU7CisgIHQt PnRvX3dhaXQgPSBpbmZfcHRyYWNlX3dhaXQ7CisgIHQtPnRvX2ZpbGVzX2lu Zm8gPSBpbmZfcHRyYWNlX2ZpbGVzX2luZm87CisgIHQtPnRvX2tpbGwgPSBp bmZfcHRyYWNlX2tpbGw7CisgIHQtPnRvX2NyZWF0ZV9pbmZlcmlvciA9IGlu Zl9wdHJhY2VfY3JlYXRlX2luZmVyaW9yOworI2lmZGVmIFBUX0dFVF9QUk9D RVNTX1NUQVRFCisgIHQtPnRvX2ZvbGxvd19mb3JrID0gaW5mX3B0cmFjZV9m b2xsb3dfZm9yazsKKyAgdC0+dG9fcG9zdF9zdGFydHVwX2luZmVyaW9yID0g aW5mX3B0cmFjZV9wb3N0X3N0YXJ0dXBfaW5mZXJpb3I7CisgIHQtPnRvX3Bv c3RfYXR0YWNoID0gaW5mX3B0cmFjZV9wb3N0X2F0dGFjaDsKKyNlbmRpZgor ICB0LT50b19tb3Vybl9pbmZlcmlvciA9IGluZl9wdHJhY2VfbW91cm5faW5m ZXJpb3I7CisgIHQtPnRvX3RocmVhZF9hbGl2ZSA9IGluZl9wdHJhY2VfdGhy ZWFkX2FsaXZlOworICB0LT50b19waWRfdG9fc3RyID0gaW5mX3B0cmFjZV9w aWRfdG9fc3RyOworICB0LT50b19zdG9wID0gaW5mX3B0cmFjZV9zdG9wOwor ICB0LT50b194ZmVyX3BhcnRpYWwgPSBpbmZfcHRyYWNlX3hmZXJfcGFydGlh bDsKKyNpZiBkZWZpbmVkIChQVF9JTykgJiYgZGVmaW5lZCAoUElPRF9SRUFE X0FVWFYpCisgIHQtPnRvX2F1eHZfcGFyc2UgPSBpbmZfcHRyYWNlX2F1eHZf cGFyc2U7CisjZW5kaWYKKworICByZXR1cm4gdDsKK30KKworCisvKiBQb2lu dGVyIHRvIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBvZmZzZXQgd2l0 aGluIHRoZSB1c2VyIGFyZWEKKyAgIHdoZXJlIGEgcGFydGljdWxhciByZWdp c3RlciBpcyBzdG9yZWQuICAqLworc3RhdGljIENPUkVfQUREUiAoKmluZl9w dHJhY2VfcmVnaXN0ZXJfdV9vZmZzZXQpKHN0cnVjdCBnZGJhcmNoICosIGlu dCwgaW50KTsKKworLyogRmV0Y2ggcmVnaXN0ZXIgUkVHTlVNIGZyb20gdGhl IGluZmVyaW9yLiAgKi8KKworc3RhdGljIHZvaWQKK2luZl9wdHJhY2VfZmV0 Y2hfcmVnaXN0ZXIgKHN0cnVjdCByZWdjYWNoZSAqcmVnY2FjaGUsIGludCBy ZWdudW0pCit7CisgIHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoID0gZ2V0X3Jl Z2NhY2hlX2FyY2ggKHJlZ2NhY2hlKTsKKyAgQ09SRV9BRERSIGFkZHI7Cisg IHNpemVfdCBzaXplOworICBQVFJBQ0VfVFlQRV9SRVQgKmJ1ZjsKKyAgaW50 IHBpZCwgaTsKKworICAvKiBUaGlzIGlzbid0IHJlYWxseSBhbiBhZGRyZXNz LCBidXQgcHRyYWNlIHRoaW5rcyBvZiBpdCBhcyBvbmUuICAqLworICBhZGRy ID0gaW5mX3B0cmFjZV9yZWdpc3Rlcl91X29mZnNldCAoZ2RiYXJjaCwgcmVn bnVtLCAwKTsKKyAgaWYgKGFkZHIgPT0gKENPUkVfQUREUiktMQorICAgICAg fHwgZ2RiYXJjaF9jYW5ub3RfZmV0Y2hfcmVnaXN0ZXIgKGdkYmFyY2gsIHJl Z251bSkpCisgICAgeworICAgICAgcmVnY2FjaGVfcmF3X3N1cHBseSAocmVn Y2FjaGUsIHJlZ251bSwgTlVMTCk7CisgICAgICByZXR1cm47CisgICAgfQor CisgIC8qIENhdGVyIGZvciBzeXN0ZW1zIGxpa2UgR05VL0xpbnV4LCB0aGF0 IGltcGxlbWVudCB0aHJlYWRzIGFzCisgICAgIHNlcGFyYXRlIHByb2Nlc3Nl cy4gICovCisgIHBpZCA9IHB0aWRfZ2V0X2x3cCAoaW5mZXJpb3JfcHRpZCk7 CisgIGlmIChwaWQgPT0gMCkKKyAgICBwaWQgPSBwdGlkX2dldF9waWQgKGlu ZmVyaW9yX3B0aWQpOworCisgIHNpemUgPSByZWdpc3Rlcl9zaXplIChnZGJh cmNoLCByZWdudW0pOworICBnZGJfYXNzZXJ0ICgoc2l6ZSAlIHNpemVvZiAo UFRSQUNFX1RZUEVfUkVUKSkgPT0gMCk7CisgIGJ1ZiA9IGFsbG9jYSAoc2l6 ZSk7CisKKyAgLyogUmVhZCB0aGUgcmVnaXN0ZXIgY29udGVudHMgZnJvbSB0 aGUgaW5mZXJpb3IgYSBjaHVuayBhdCBhIHRpbWUuICAqLworICBmb3IgKGkg PSAwOyBpIDwgc2l6ZSAvIHNpemVvZiAoUFRSQUNFX1RZUEVfUkVUKTsgaSsr KQorICAgIHsKKyAgICAgIGVycm5vID0gMDsKKyAgICAgIGJ1ZltpXSA9IHB0 cmFjZTY0IChQVF9SRUFEX1UsIChsb25nIGxvbmcpIHBpZCwgKGxvbmcgbG9u ZylhZGRyLCAwKTsKKyAgICAgIGlmIChlcnJubyAhPSAwKQorICAgICAgICBl cnJvciAoXygiQ291bGRuJ3QgcmVhZCByZWdpc3RlciAlcyAoIyVkKTogJXMu IiksCisgICAgICAgICAgICAgICBnZGJhcmNoX3JlZ2lzdGVyX25hbWUgKGdk YmFyY2gsIHJlZ251bSksCisgICAgICAgICAgICAgICByZWdudW0sIHNhZmVf c3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgIGFkZHIgKz0gc2l6ZW9mIChQ VFJBQ0VfVFlQRV9SRVQpOworICAgIH0KKyAgcmVnY2FjaGVfcmF3X3N1cHBs eSAocmVnY2FjaGUsIHJlZ251bSwgYnVmKTsKK30KKworLyogRmV0Y2ggcmVn aXN0ZXIgUkVHTlVNIGZyb20gdGhlIGluZmVyaW9yLiAgSWYgUkVHTlVNIGlz IC0xLCBkbyB0aGlzCisgICBmb3IgYWxsIHJlZ2lzdGVycy4gICovCisKK3N0 YXRpYyB2b2lkCitpbmZfcHRyYWNlX2ZldGNoX3JlZ2lzdGVycyAoc3RydWN0 IHRhcmdldF9vcHMgKm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICBzdHJ1Y3QgcmVnY2FjaGUgKnJlZ2NhY2hlLCBpbnQgcmVnbnVtKQorewor ICBpZiAocmVnbnVtID09IC0xKQorICAgIGZvciAocmVnbnVtID0gMDsKKyAg ICAgICAgIHJlZ251bSA8IGdkYmFyY2hfbnVtX3JlZ3MgKGdldF9yZWdjYWNo ZV9hcmNoIChyZWdjYWNoZSkpOworICAgICAgICAgcmVnbnVtKyspCisgICAg ICBpbmZfcHRyYWNlX2ZldGNoX3JlZ2lzdGVyIChyZWdjYWNoZSwgcmVnbnVt KTsKKyAgZWxzZQorICAgIGluZl9wdHJhY2VfZmV0Y2hfcmVnaXN0ZXIgKHJl Z2NhY2hlLCByZWdudW0pOworfQorCisvKiBTdG9yZSByZWdpc3RlciBSRUdO VU0gaW50byB0aGUgaW5mZXJpb3IuICAqLworCitzdGF0aWMgdm9pZAoraW5m X3B0cmFjZV9zdG9yZV9yZWdpc3RlciAoY29uc3Qgc3RydWN0IHJlZ2NhY2hl ICpyZWdjYWNoZSwgaW50IHJlZ251bSkKK3sKKyAgc3RydWN0IGdkYmFyY2gg KmdkYmFyY2ggPSBnZXRfcmVnY2FjaGVfYXJjaCAocmVnY2FjaGUpOworICBD T1JFX0FERFIgYWRkcjsKKyAgc2l6ZV90IHNpemU7CisgIFBUUkFDRV9UWVBF X1JFVCAqYnVmOworICBpbnQgcGlkLCBpOworCisgIC8qIFRoaXMgaXNuJ3Qg cmVhbGx5IGFuIGFkZHJlc3MsIGJ1dCBwdHJhY2UgdGhpbmtzIG9mIGl0IGFz IG9uZS4gICovCisgIGFkZHIgPSBpbmZfcHRyYWNlX3JlZ2lzdGVyX3Vfb2Zm c2V0IChnZGJhcmNoLCByZWdudW0sIDEpOworICBpZiAoYWRkciA9PSAoQ09S RV9BRERSKS0xCisgICAgICB8fCBnZGJhcmNoX2Nhbm5vdF9zdG9yZV9yZWdp c3RlciAoZ2RiYXJjaCwgcmVnbnVtKSkKKyAgICByZXR1cm47CisKKyAgLyog Q2F0ZXIgZm9yIHN5c3RlbXMgbGlrZSBHTlUvTGludXgsIHRoYXQgaW1wbGVt ZW50IHRocmVhZHMgYXMKKyAgICAgc2VwYXJhdGUgcHJvY2Vzc2VzLiAgKi8K KyAgcGlkID0gcHRpZF9nZXRfbHdwIChpbmZlcmlvcl9wdGlkKTsKKyAgaWYg KHBpZCA9PSAwKQorICAgIHBpZCA9IHB0aWRfZ2V0X3BpZCAoaW5mZXJpb3Jf cHRpZCk7CisKKyAgc2l6ZSA9IHJlZ2lzdGVyX3NpemUgKGdkYmFyY2gsIHJl Z251bSk7CisgIGdkYl9hc3NlcnQgKChzaXplICUgc2l6ZW9mIChQVFJBQ0Vf VFlQRV9SRVQpKSA9PSAwKTsKKyAgYnVmID0gYWxsb2NhIChzaXplKTsKKwor ICAvKiBXcml0ZSB0aGUgcmVnaXN0ZXIgY29udGVudHMgaW50byB0aGUgaW5m ZXJpb3IgYSBjaHVuayBhdCBhIHRpbWUuICAqLworICByZWdjYWNoZV9yYXdf Y29sbGVjdCAocmVnY2FjaGUsIHJlZ251bSwgYnVmKTsKKyAgZm9yIChpID0g MDsgaSA8IHNpemUgLyBzaXplb2YgKFBUUkFDRV9UWVBFX1JFVCk7IGkrKykK KyAgICB7CisgICAgICBlcnJubyA9IDA7CisgICAgICBwdHJhY2U2NCAoUFRf V1JJVEVfVSwgKGxvbmcgbG9uZykgcGlkLCAobG9uZyBsb25nKWFkZHIsIGJ1 ZltpXSk7CisgICAgICBpZiAoZXJybm8gIT0gMCkKKyAgICAgICAgZXJyb3Ig KF8oIkNvdWxkbid0IHdyaXRlIHJlZ2lzdGVyICVzICgjJWQpOiAlcy4iKSwK KyAgICAgICAgICAgICAgIGdkYmFyY2hfcmVnaXN0ZXJfbmFtZSAoZ2RiYXJj aCwgcmVnbnVtKSwKKyAgICAgICAgICAgICAgIHJlZ251bSwgc2FmZV9zdHJl cnJvciAoZXJybm8pKTsKKworICAgICAgYWRkciArPSBzaXplb2YgKFBUUkFD RV9UWVBFX1JFVCk7CisgICAgfQorfQorCisvKiBTdG9yZSByZWdpc3RlciBS RUdOVU0gYmFjayBpbnRvIHRoZSBpbmZlcmlvci4gIElmIFJFR05VTSBpcyAt MSwgZG8KKyAgIHRoaXMgZm9yIGFsbCByZWdpc3RlcnMuICAqLworCitzdGF0 aWMgdm9pZAoraW5mX3B0cmFjZV9zdG9yZV9yZWdpc3RlcnMgKHN0cnVjdCB0 YXJnZXRfb3BzICpvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg c3RydWN0IHJlZ2NhY2hlICpyZWdjYWNoZSwgaW50IHJlZ251bSkKK3sKKyAg aWYgKHJlZ251bSA9PSAtMSkKKyAgICBmb3IgKHJlZ251bSA9IDA7CisgICAg ICAgICByZWdudW0gPCBnZGJhcmNoX251bV9yZWdzIChnZXRfcmVnY2FjaGVf YXJjaCAocmVnY2FjaGUpKTsKKyAgICAgICAgIHJlZ251bSsrKQorICAgICAg aW5mX3B0cmFjZV9zdG9yZV9yZWdpc3RlciAocmVnY2FjaGUsIHJlZ251bSk7 CisgIGVsc2UKKyAgICBpbmZfcHRyYWNlX3N0b3JlX3JlZ2lzdGVyIChyZWdj YWNoZSwgcmVnbnVtKTsKK30KKworLyogQ3JlYXRlIGEgInRyYWRpdGlvbmFs IiBwdHJhY2UgdGFyZ2V0LiAgUkVHSVNURVJfVV9PRkZTRVQgc2hvdWxkIGJl CisgICBhIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgb2Zmc2V0IHdpdGhpbiB0 aGUgdXNlciBhcmVhIHdoZXJlIGEKKyAgIHBhcnRpY3VsYXIgcmVnaXN0ZXIg aXMgc3RvcmVkLiAgKi8KKworc3RydWN0IHRhcmdldF9vcHMgKgoraW5mX3B0 cmFjZV90cmFkX3RhcmdldCAoQ09SRV9BRERSICgqcmVnaXN0ZXJfdV9vZmZz ZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KHN0cnVjdCBnZGJhcmNoICosIGludCwgaW50KSkKK3sKKyAgc3RydWN0IHRh cmdldF9vcHMgKnQgPSBpbmZfcHRyYWNlX3RhcmdldCgpOworCisgIGdkYl9h c3NlcnQgKHJlZ2lzdGVyX3Vfb2Zmc2V0KTsKKyAgaW5mX3B0cmFjZV9yZWdp c3Rlcl91X29mZnNldCA9IHJlZ2lzdGVyX3Vfb2Zmc2V0OworICB0LT50b19m ZXRjaF9yZWdpc3RlcnMgPSBpbmZfcHRyYWNlX2ZldGNoX3JlZ2lzdGVyczsK KyAgdC0+dG9fc3RvcmVfcmVnaXN0ZXJzID0gaW5mX3B0cmFjZV9zdG9yZV9y ZWdpc3RlcnM7CisKKyAgcmV0dXJuIHQ7Cit9Cg== --0__=EABBF137DFA2964C8f9e8a93df938690918cEABBF137DFA2964C--