From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17913 invoked by alias); 9 Dec 2011 13:28:58 -0000 Received: (qmail 17896 invoked by uid 22791); 9 Dec 2011 13:28:51 -0000 X-SWARE-Spam-Status: No, hits=-2.1 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,TW_BJ X-Spam-Check-By: sourceware.org Received: from mail-vw0-f41.google.com (HELO mail-vw0-f41.google.com) (209.85.212.41) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 09 Dec 2011 13:28:31 +0000 Received: by vbbfn1 with SMTP id fn1so2652535vbb.0 for ; Fri, 09 Dec 2011 05:28:30 -0800 (PST) Received: by 10.52.20.147 with SMTP id n19mr4236412vde.77.1323437310220; Fri, 09 Dec 2011 05:28:30 -0800 (PST) MIME-Version: 1.0 Received: by 10.220.4.210 with HTTP; Fri, 9 Dec 2011 05:28:09 -0800 (PST) In-Reply-To: References: From: Kevin Pouget Date: Fri, 09 Dec 2011 13:49:00 -0000 Message-ID: Subject: Re: [PATCH] Add bp_location to Python interface To: pmuldoon@redhat.com Cc: gdb-patches@sourceware.org Content-Type: multipart/mixed; boundary=20cf307c9fecc21a9104b3a8c2ec 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: 2011-12/txt/msg00285.txt.bz2 --20cf307c9fecc21a9104b3a8c2ec Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-length: 15588 On Thu, Dec 8, 2011 at 3:28 PM, Phil Muldoon wrote: Thanks for taking a look at the patch, I reply inline >> + =A0 =A0 py-bploc.o \ > > Nit, alphabetically ordered please. > >> + =A0 =A0 python/py-bploc.c \ > > Ditto. > >> +py-bploc.o: $(srcdir)/python/py-bploc.c >> + =A0 =A0 $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/py-bploc.c >> + =A0 =A0 $(POSTCOMPILE) > > Could you me the order of this to correspond with the order above. fixed >> + =A0** A new method "gdb.Breakpoint.locations" has been added, as well = as >> + =A0 =A0 the class gdb.BpLocation to provide further details about brea= kpoint >> + =A0 =A0 locations. >> + > > Not sure if this will make it for 7.4. =A0If not you would have to start a > new section for Python in NEWS. I'm not sure either, I changed it to 7.4 for now, we'll change it later if we can make it in time >> +@findex gdb.locations >> +@defun gdb.locations () >> +Return a tuple containing the @code{gdb.BpLocation} objects (see below) >> +associated with this breakpoint. >> +@end defun > > Perhaps a "containing a sequence of @code{gdb.BpLocation} objects". 'tuple' and 'sequence' sound a bit redundant to me but I'll trust your English and Python skills on that! >> +A breakpoint location is represented with a @code{gdb.BpLocation} objec= t, >> +which offers the following attributes (all read only) and methods. >> +Please note that breakpoint locations are very transient entities in >> +@value{GDBN}, so one should avoid keeping references to them. > > While it is good to note that, I'm not sure =A0what we are explaining here > other than when the breakpoint is deleted, all location objects that are > associated with that object are invalid too. =A0Or, are you noting we > should allow the user to interact after the fact? If that is the case, > what is "is_valid" for? =A0Why note the transient nature of the object? > I'm not sure what we are explaining here other than when the breakpoint i= s deleted that's what I wanted to emphasize here, bp_locations are cleaned/reset more often than 'high-level' breakpoints are removed. My knowledge about that is quite limited, but for instance this (cleaned up) stack: #0 gdbpy_bplocation_free py-bploc.c:60 #1 free_bp_location (loc=3D) breakpoint.c:5685 #2 decref_bp_location (blp=3D) breakpoint.c:5707 #3 update_global_location_list (should_insert=3D1) breakpoint.c:10575 #4 update_breakpoint_locations (b=3D, sals=3D..., sals_end=3D...) breakpoint.c:11787 #5 breakpoint_re_set_default (b=3D) breakpoint.c:11937 #6 breakpoint_re_set_one (bint=3D) breakpoint.c:11968 #8 breakpoint_re_set () breakpoint.c:11992 #9 solib_add (pattern=3D0x0, from_tty=3D0, target=3D, readsyms=3D1) solib= .c:926 #10 bpstat_what (bs_head=3D) breakpoint.c:4487 #11 handle_inferior_event (ecs=3D) infrun.c:4394 #12 wait_for_inferior () shows that bplocations might be removed when a shared library is loaded > If the breakpoint is deleted and the user still has reference to a > location object, I think we should just run a validation routine and > refuse to do anything but raise an exception at that point (like > is_valid, but triggered for all function/attribute calls). hum, I think that's what I already do in the code :) I've updated the gdb.BpLocation.is_valid documentation, maybe it's clearer? > @defun BpLocation.is_valid () > Returns @code{True} if the @code{gdb.BpLocation} object is valid, > @code{False} if not. A @code{gdb.BpLocation} object may be invalidated by > GDB at any moment for internal reasons. All other @code{gdb.BpLocation} m= ethods > and attributes will throw an exception if the object is invalid. > @end defun >> + >> +@defvar BpLocation.owner >> +This attribute holds a reference to the @code{gdb.Breakpoint} object wh= ich >> +owns this location. >> +@end defvar > Note which attributes are read only/writable. This and others. I specify a few lines above that all the attributes are read only, but I've noted it on each attribute as well. > Also many different breakpoints can be at one location. =A0I'm not sure i= f it > is worth pointing out here that "this breakpoint" only owns the > location insofar as the scope of that breakpoint (there could be other > breakpoints set to that location). from an implementation point of view, the is a BP <1--------n> BpLocation relation, even if two locations have the same address. Also, I think that the end-users won't have problems to understand these BpLocations, as they're already exposed with "info breakpoints": (gdb) info breakpoints Num Type Disp Enb Address What 2 breakpoint keep y 2.1 y 0x08049074 in main at src/host/matrix/main.c:223 inf 2 2.2 y 0x00118125 in main at src/entry.c:38 inf 2 2.3 y 0x08049074 in main at src/host/matrix/main.c:223 inf 1 2.4 y 0x00118125 in main at src/entry.c:38 inf 1 py print "\n".join(["%s -> inf =3D %d, addr =3D %s" % (loc, loc.inferior.num, loc.address) for loc in gdb.breakpoints()[0].locations()]) -> inf =3D 2, addr =3D 0x8049074 -> inf =3D 2, addr =3D 0x118125 -> inf =3D 1, addr =3D 0x8049074 -> inf =3D 1, addr =3D 0x118125 >> +@defvar BpLocation.address >> +This attribute holds a @code{gdb.Value} object corresponding to the add= ress >> +at which the breakpoint has been inserted. >> +@end defvar > > To make sure I have the logic correctly, if a breakpoint has multiple > addresses then there will be on =A0BpLocation, for each =A0address? yes, as described above >> +@defun BpLocation.is_valid () >> +Returns @code{True} if the @code{gdb.BpLocation} object is valid, >> +@code{False} if not. =A0A @code{gdb.BpLocation} object will become inva= lid >> +if breakpoint to which is belong is deleted. >> +@end defun > > Typo, last sentence. sentence rephrased >> +struct bploc_object >> +{ >> + =A0PyObject_HEAD >> + >> + =A0/* The location corresponding to this py object. =A0NULL is the loc= ation >> + =A0 =A0 has been deleted. =A0*/ >> + =A0struct bp_location *loc; > > Typo in the comment "NULL is the location has been deleted.". =A0Also nit > pick shouldn't it be "The location corresponding to a gdb.Breakpoint > object"? typo fixed, but not the nit: it's the same idea as breakpoint, if the 'backend' breakpoint is deleted, 'struct breakpoint_object . bp' is = NULL, if the 'backend' location is deleted, 'struct bploc_object . loc' is NULL >> + >> + =A0/* 1 if the owner BP has been deleted, 0 otherwise. =A0*/ >> + =A0int invalid_owner; >> + >> + =A0/* Cache for the gdb.Value object corresponding to loc->address. = =A0*/ >> + =A0PyObject *py_address; >> +}; > > I'm not sure if breakpoint locations can change. =A0I do not think so, but > why do we need to cache loc->address? I assumed that it can't change, but didn't actually investigate all the implementation. My feeling is "caching is easy, creating a Py object has a cost, so let's cache!", but I've got no idea about the actual cost, so I'll change it if someone insists [and convinces me] :) >> + >> +/* Require that LOCATION be a valid bp_location; throw a Python >> + =A0 exception if it is invalid. =A0*/ >> +#define BPLOCPY_REQUIRE_VALID(Location) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ >> + =A0 =A0do { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0\ >> + =A0 =A0 =A0if ((Location)->loc =3D=3D NULL) =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0\ >> + =A0 =A0 =A0 =A0return PyErr_Format (PyExc_RuntimeError, =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0\ >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 _("BpLocation = invalid.")); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 \ >> + =A0 =A0} while (0) > > I prefer error messages a little more descriptive. =A0That is just a > personal thing of mine, but "BpLocation invalid" would seem cryptic when > thrown in the context of a script. I'm not sure how I could improve it, at this point (checking validity at the beginning of all the attributes), we just know that the backend location has been freed, but we don't know why. >> +static PyTypeObject bploc_object_type; >> + >> +/* Call by free_bp_location when loc is about to be freed. =A0*/ >> + >> +void >> +gdbpy_bplocation_free (struct bp_location *loc) >> +{ >> + =A0if (loc->py_bploc_obj) >> + =A0 =A0{ >> + =A0 =A0 =A0loc->py_bploc_obj->loc =3D NULL; >> + =A0 =A0 =A0Py_DECREF (loc->py_bploc_obj); >> + =A0 =A0} >> +} >> + >> +/* Dissociate the bp_location from the Python object. =A0*/ >> + >> +static void >> +bplocpy_dealloc (PyObject *self) >> +{ >> + =A0bploc_object *self_bploc =3D (bploc_object *) self; >> + >> + =A0if (self_bploc->loc !=3D NULL) >> + =A0 =A0self_bploc->loc->py_bploc_obj =3D NULL; >> + >> + =A0Py_XDECREF (self_bploc->py_address); >> + >> + =A0self->ob_type->tp_free (self); >> +} >> + >> +/* Create or acquire a ref to the bp_location object (gdb.BpLocation) >> + =A0 that encapsulates the struct bp_location from GDB. =A0*/ >> + >> +PyObject * >> +bplocation_to_bplocation_object (struct bp_location *loc) >> +{ >> + =A0bploc_object *bploc_obj; >> + >> + =A0gdb_assert (loc !=3D NULL); > > Is this a fatal error that we need to shutdown GDB for? =A0gdb_assert > seems pretty strong from an API point of view. hum, I'm not sure here, I wrote this line to actually shutdown GDB instead of segfaulting on the next line, for instance 'py-pspace.c::pspace_to_pspace_object' and 'py-objfile.c::objfile_to_objfile_object" will just segfault if there're called with a NULL parameter. throwing an Python/GDB exception wouldn't make much sense to me either, as there end-user won't be able to deal with it >> + =A0if (loc->py_bploc_obj) >> + =A0 =A0{ >> + =A0 =A0 =A0Py_INCREF (loc->py_bploc_obj); >> + =A0 =A0 =A0return (PyObject *) loc->py_bploc_obj; >> + =A0 =A0} >> + >> + =A0bploc_obj =3D PyObject_New (bploc_object, &bploc_object_type); >> + =A0if (!bploc_obj) >> + =A0 =A0{ >> + =A0 =A0 =A0PyErr_SetString (PyExc_MemoryError, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 _("Could not allocate BpLo= cation object.")); >> + =A0 =A0 =A0return NULL; >> + =A0 =A0} > > Remove the error setting here. =A0If a new object cannot be allocated, the > exception will already be set by Python. =A0So we would be overwriting > that with a more generic message. =A0So just return NULL. fine >> +/* Python function to get the BP owning this location, is any. =A0*/ > > Typo, "is". fixed >> +/* Python function to get the address of this breakpoint location. The >> + =A0 gdb.Value object will be cached if this is the first access. Retur= ns >> + =A0 NULL in case of failure, with a python exception set. =A0*/ > > Two spaces after ".". > Nit, Python not python. fixed >> +static PyObject * >> +bplocpy_get_address (PyObject *self, void *closure) >> +{ >> + =A0bploc_object *self_bploc =3D (bploc_object *) self; >> + >> + =A0BPLOCPY_REQUIRE_VALID (self_bploc); >> + >> + =A0if (!self_bploc->py_address) >> + =A0 =A0{ >> + =A0 =A0 =A0/* Get the address Value object as a void *. =A0*/ >> + =A0 =A0 =A0volatile struct gdb_exception except; >> + =A0 =A0 =A0struct type *void_ptr_type; >> + =A0 =A0 =A0struct value *val =3D NULL ; /* Initialize to appease gcc w= arning. =A0*/ >> + >> + =A0 =A0 =A0TRY_CATCH (except, RETURN_MASK_ALL) >> + =A0 =A0 =A0 =A0{ >> + =A0 =A0 =A0 =A0 =A0void_ptr_type =3D lookup_pointer_type ( >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0builtin_type (python_gdbarch)->builtin_void= ); >> + =A0 =A0 =A0 =A0 =A0val =3D value_from_pointer (void_ptr_type, self_bpl= oc->loc->address); >> + =A0 =A0 =A0 =A0} >> + =A0 =A0 =A0GDB_PY_HANDLE_EXCEPTION (except); >> + >> + =A0 =A0 =A0self_bploc->py_address =3D value_to_value_object (val); >> + =A0 =A0 =A0Py_XINCREF (self_bploc->py_address); >> + =A0 =A0} >> + =A0Py_XINCREF (self_bploc->py_address); > > I don't really mind it, but I prefer explicit return NULL when dealing > with cases of exceptions. =A0I find the other logic hard to read. =A0This= is > not a request for a change. Is there a case where py_address will be > NULL? =A0Yes, there is, value_to_value_object can return NULL. =A0If it > returns NULL, then there is an exception set. =A0I much prefer to exit > then and there, other the conditional XINCREF step, and returning at the > function exit. =A0Still, this is just a stylistic thing, and probably > personal thing. =A0The second XINCREF can just be a plain old INCREF as we > already tested for NULL. makes sense to me, my "single return point" idea doesn't stand against error handling > This brings me to the address cache argument. =A0Is it worthwhile managing > the cache increment counts instead of just returning the address each > time? =A0I ask as I am not sure if you have done any metrics that indicate > this is a slow operation. no, I didn't run any measurement so far; I'll wait for a maintainer point of view about that >> + >> +/* Python function which returns the BpLocation objects associated >> + =A0 with this breakpoint. =A0*/ >> + >> +static PyObject * >> +bppy_locations (PyObject *self, PyObject *args) >> +{ >> + =A0breakpoint_object *self_bp =3D (breakpoint_object *) self; >> + =A0PyObject *list; >> + =A0struct bp_location *loc; >> + =A0int err; >> + >> + =A0BPPY_REQUIRE_VALID (self_bp); >> + >> + =A0list =3D PyList_New (0); >> + =A0if (!list) >> + =A0 =A0return NULL; >> + >> + =A0err =3D 0; >> + =A0for (loc =3D self_bp->bp->loc; loc; loc =3D loc->next) >> + =A0 =A0{ >> + =A0 =A0 =A0PyObject *loc_obj =3D =A0bplocation_to_bplocation_object (l= oc); >> + =A0 =A0 =A0err =3D PyList_Append (list, loc_obj); >> + =A0 =A0 =A0if (err =3D=3D -1) >> + =A0 =A0 =A0 =A0{ >> + =A0 =A0 =A0 =A0 =A0Py_DECREF (list); >> + =A0 =A0 =A0 =A0 =A0return NULL; >> + =A0 =A0 =A0 =A0} >> + =A0 =A0 =A0Py_DECREF (loc_obj); >> + =A0 =A0} >> + >> + =A0return PyList_AsTuple (list); >> +} > > We need to make sure that the this is not a watchpoint. why not? I don't know much about watchpoints, but as per my quick investigations, they share the same high-level structure (struct breakpoint), and they seem to use bp_location the same way ? > Cheers, > > Phil Thanks for your review, I hope I addressed or discussed everything cordially, Kevin -- 2011-12-09 Kevin Pouget Add bp_location to Python interface * Makefile.in (SUBDIR_PYTHON_OBS): Add py-bploc.o (SUBDIR_PYTHON_SRCS): Add python/py-bploc.c Add build rule for this file. * breakpoint.h (struct bploc_object): Forward declaration. (struct bp_location): Add py_bploc_obj. * breakpoint.c (free_bp_location): Call gdbpy_bplocation_free. * python/py-bploc.c: New file. * python/py-breakpoint.c (bppy_locations): New function. (breakpoint_object_methods): New method binding: locations(). * python/python-internal.h (bploc_object): New typedef. (bplocation_to_bplocation_object): New prototype. (gdbpy_initialize_bplocation): Likewise. * python/python.c (gdbpy_bplocation_free): New empty stub. (_initialize_python): Call gdbpy_initialize_bplocation. * python/python.h (gdbpy_bplocation_free): New prototype. =09 doc/ Add bp_location to Python interface * gdb.texinfo (Breakpoints In Python): Document gdb.Breakpoint.locations and gdb.BpLocation. testsuite/ Add bp_location to Python interface * gdb.python/py-breakpoint.exp: Test gdb.BpLocation. --20cf307c9fecc21a9104b3a8c2ec Content-Type: text/x-patch; charset=US-ASCII; name="0001-Add-bp_location-to-Python-interface.patch" Content-Disposition: attachment; filename="0001-Add-bp_location-to-Python-interface.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gvz8dywt1 Content-length: 30561 RnJvbSBjM2E3ZTU5MWE0NWI2MDFhYTliMjQwNDE1Nzk4MTA2ZTRhOThjMDhj IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBLZXZpbiBQb3VnZXQg PGtldmluLnBvdWdldEBzdC5jb20+CkRhdGU6IFdlZCwgMTggTWF5IDIwMTEg MTA6MDI6MjMgLTA0MDAKU3ViamVjdDogW1BBVENIXSBBZGQgYnBfbG9jYXRp b24gdG8gUHl0aG9uIGludGVyZmFjZQoKLS0tCiBnZGIvTWFrZWZpbGUuaW4g ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA2ICsKIGdkYi9ORVdT ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDggKwog Z2RiL2JyZWFrcG9pbnQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgMyArCiBnZGIvYnJlYWtwb2ludC5oICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgICA2ICsKIGdkYi9kb2MvZ2RiLnRleGluZm8gICAgICAgICAg ICAgICAgICAgICAgICB8ICAgNDEgKysrKwogZ2RiL3B5dGhvbi9weS1icGxv Yy5jICAgICAgICAgICAgICAgICAgICAgIHwgIDMxMyArKysrKysrKysrKysr KysrKysrKysrKysrKysrCiBnZGIvcHl0aG9uL3B5LWJyZWFrcG9pbnQuYyAg ICAgICAgICAgICAgICAgfCAgIDM5ICsrKysKIGdkYi9weXRob24vcHl0aG9u LWludGVybmFsLmggICAgICAgICAgICAgICB8ICAgIDYgKwogZ2RiL3B5dGhv bi9weXRob24uYyAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNyArCiBn ZGIvcHl0aG9uL3B5dGhvbi5oICAgICAgICAgICAgICAgICAgICAgICAgfCAg ICAyICsKIGdkYi90ZXN0c3VpdGUvZ2RiLnB5dGhvbi9weS1icmVha3BvaW50 LmV4cCB8ICAgNTIgKysrKysKIDExIGZpbGVzIGNoYW5nZWQsIDQ4MyBpbnNl cnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0 IGdkYi9weXRob24vcHktYnBsb2MuYwoKZGlmZiAtLWdpdCBhL2dkYi9NYWtl ZmlsZS5pbiBiL2dkYi9NYWtlZmlsZS5pbgppbmRleCBiNzFkYjMzLi41OGI0 OTEwIDEwMDY0NAotLS0gYS9nZGIvTWFrZWZpbGUuaW4KKysrIGIvZ2RiL01h a2VmaWxlLmluCkBAIC0yODAsNiArMjgwLDcgQEAgU1VCRElSX1BZVEhPTl9P QlMgPSBcCiAJcHktYXV0by1sb2FkLm8gXAogCXB5LWJsb2NrLm8gXAogCXB5 LWJwZXZlbnQubyBcCisJcHktYnBsb2MubyBcCiAJcHktYnJlYWtwb2ludC5v IFwKIAlweS1jbWQubyBcCiAJcHktY29udGludWVldmVudC5vIFwKQEAgLTMx MSw2ICszMTIsNyBAQCBTVUJESVJfUFlUSE9OX1NSQ1MgPSBcCiAJcHl0aG9u L3B5LWF1dG8tbG9hZC5jIFwKIAlweXRob24vcHktYmxvY2suYyBcCiAJcHl0 aG9uL3B5LWJwZXZlbnQuYyBcCisJcHl0aG9uL3B5LWJwbG9jLmMgXAogCXB5 dGhvbi9weS1icmVha3BvaW50LmMgXAogCXB5dGhvbi9weS1jbWQuYyBcCiAJ cHl0aG9uL3B5LWNvbnRpbnVlZXZlbnQuYyBcCkBAIC0yMDgxLDYgKzIwODMs MTAgQEAgcHktYnBldmVudC5vOiAkKHNyY2RpcikvcHl0aG9uL3B5LWJwZXZl bnQuYwogCSQoQ09NUElMRSkgJChQWVRIT05fQ0ZMQUdTKSAkKHNyY2Rpcikv cHl0aG9uL3B5LWJwZXZlbnQuYwogCSQoUE9TVENPTVBJTEUpCiAKK3B5LWJw bG9jLm86ICQoc3JjZGlyKS9weXRob24vcHktYnBsb2MuYworCSQoQ09NUElM RSkgJChQWVRIT05fQ0ZMQUdTKSAkKHNyY2RpcikvcHl0aG9uL3B5LWJwbG9j LmMKKwkkKFBPU1RDT01QSUxFKQorCiBweS1icmVha3BvaW50Lm86ICQoc3Jj ZGlyKS9weXRob24vcHktYnJlYWtwb2ludC5jCiAJJChDT01QSUxFKSAkKFBZ VEhPTl9DRkxBR1MpICQoc3JjZGlyKS9weXRob24vcHktYnJlYWtwb2ludC5j CiAJJChQT1NUQ09NUElMRSkKZGlmZiAtLWdpdCBhL2dkYi9ORVdTIGIvZ2Ri L05FV1MKaW5kZXggNDI3ODJjZS4uNDM0NGZjOSAxMDA2NDQKLS0tIGEvZ2Ri L05FV1MKKysrIGIvZ2RiL05FV1MKQEAgLTEsNiArMSwxNCBAQAogCQlXaGF0 IGhhcyBjaGFuZ2VkIGluIEdEQj8KIAkgICAgIChPcmdhbml6ZWQgcmVsZWFz ZSBieSByZWxlYXNlKQogCisqKiogQ2hhbmdlcyBzaW5jZSBHREIgNy40CisK KyogUHl0aG9uIHNjcmlwdGluZworCisgICoqIEEgbmV3IG1ldGhvZCAiZ2Ri LkJyZWFrcG9pbnQubG9jYXRpb25zIiBoYXMgYmVlbiBhZGRlZCwgYXMgd2Vs bCBhcworICAgICB0aGUgY2xhc3MgZ2RiLkJwTG9jYXRpb24gdG8gcHJvdmlk ZSBmdXJ0aGVyIGRldGFpbHMgYWJvdXQgYnJlYWtwb2ludAorICAgICBsb2Nh dGlvbnMuCisKICoqKiBDaGFuZ2VzIHNpbmNlIEdEQiA3LjMuMQogCiAqIEdE QiBub3cgaGFuZGxlcyBhbWJpZ3VvdXMgbGluZXNwZWNzIG1vcmUgY29uc2lz dGVudGx5OyB0aGUgZXhpc3RpbmcKZGlmZiAtLWdpdCBhL2dkYi9icmVha3Bv aW50LmMgYi9nZGIvYnJlYWtwb2ludC5jCmluZGV4IGQ5ZDViYmUuLjAyNmRj YjQ4IDEwMDY0NAotLS0gYS9nZGIvYnJlYWtwb2ludC5jCisrKyBiL2dkYi9i cmVha3BvaW50LmMKQEAgLTU2ODEsNiArNTY4MSw5IEBAIHN0YXRpYyB2b2lk CiBmcmVlX2JwX2xvY2F0aW9uIChzdHJ1Y3QgYnBfbG9jYXRpb24gKmxvYykK IHsKICAgbG9jLT5vcHMtPmR0b3IgKGxvYyk7CisKKyAgZ2RicHlfYnBsb2Nh dGlvbl9mcmVlIChsb2MpOworCiAgIHhmcmVlIChsb2MpOwogfQogCmRpZmYg LS1naXQgYS9nZGIvYnJlYWtwb2ludC5oIGIvZ2RiL2JyZWFrcG9pbnQuaApp bmRleCBkZGYxODgxLi41YThhMWFmIDEwMDY0NAotLS0gYS9nZGIvYnJlYWtw b2ludC5oCisrKyBiL2dkYi9icmVha3BvaW50LmgKQEAgLTI4LDYgKzI4LDcg QEAKIHN0cnVjdCB2YWx1ZTsKIHN0cnVjdCBibG9jazsKIHN0cnVjdCBicmVh a3BvaW50X29iamVjdDsKK3N0cnVjdCBicGxvY19vYmplY3Q7CiBzdHJ1Y3Qg Z2V0X251bWJlcl9vcl9yYW5nZV9zdGF0ZTsKIHN0cnVjdCB0aHJlYWRfaW5m bzsKIHN0cnVjdCBicHN0YXRzOwpAQCAtNDA1LDYgKzQwNiwxMSBAQCBzdHJ1 Y3QgYnBfbG9jYXRpb24KICAgLyogU291cmNlIGZpbGUgbmFtZSBvZiB0aGlz IGFkZHJlc3MuICAqLwogCiAgIGNoYXIgKnNvdXJjZV9maWxlOworCisgIC8q IFB5dGhvbiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbG9jYXRpb24u ICBNYXkgYmUgTlVMTCBpZiB0aGUgbG9jYXRpb24KKyAgICAgaXMgbm90IHll dCBleHBvcnRlZCB0byBQeXRob24uICAqLworCisgIHN0cnVjdCBicGxvY19v YmplY3QgKnB5X2JwbG9jX29iajsKIH07CiAKIC8qIFRoaXMgc3RydWN0dXJl IGlzIGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVycyB0aGF0LCBp ZiBhdmFpbGFibGUsCmRpZmYgLS1naXQgYS9nZGIvZG9jL2dkYi50ZXhpbmZv IGIvZ2RiL2RvYy9nZGIudGV4aW5mbwppbmRleCA1MGMyOTllLi4xZjBhYzdm IDEwMDY0NAotLS0gYS9nZGIvZG9jL2dkYi50ZXhpbmZvCisrKyBiL2dkYi9k b2MvZ2RiLnRleGluZm8KQEAgLTI0MzM1LDYgKzI0MzM1LDQ3IEBAIGNvbW1h bmRzLCBzZXBhcmF0ZWQgYnkgbmV3bGluZXMuICBJZiB0aGVyZSBhcmUgbm8g Y29tbWFuZHMsIHRoaXMKIGF0dHJpYnV0ZSBpcyBAY29kZXtOb25lfS4gIFRo aXMgYXR0cmlidXRlIGlzIG5vdCB3cml0YWJsZS4KIEBlbmQgZGVmdmFyCiAK K0BmaW5kZXggZ2RiLmxvY2F0aW9ucworQGRlZnVuIGdkYi5sb2NhdGlvbnMg KCkKK1JldHVybiBhIHR1cGxlIGNvbnRhaW5pbmcgYSBzZXF1ZW5jZSBvZiBA Y29kZXtnZGIuQnBMb2NhdGlvbn0gb2JqZWN0cyAKKyhzZWUgYmVsb3cpIGFz c29jaWF0ZWQgd2l0aCB0aGlzIGJyZWFrcG9pbnQuICBBIGJyZWFrcG9pbnQg d2l0aCBubyBsb2NhdGlvbgoraXMgYSBwZW5kaW5nIGJyZWFrcG9pbnQgKEB4 cmVme1NldCBCcmVha3MsICwgcGVuZGluZyBicmVha3BvaW50c30pLgorQGVu ZCBkZWZ1bgorCitBIGJyZWFrcG9pbnQgbG9jYXRpb24gaXMgcmVwcmVzZW50 ZWQgd2l0aCBhIEBjb2Rle2dkYi5CcExvY2F0aW9ufSBvYmplY3QsCit3aGlj aCBvZmZlcnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIChhbGwgcmVhZCBv bmx5KSBhbmQgbWV0aG9kcy4KK1BsZWFzZSBub3RlIHRoYXQgYnJlYWtwb2lu dCBsb2NhdGlvbnMgYXJlIHZlcnkgdHJhbnNpZW50IGVudGl0aWVzIGluCitA dmFsdWV7R0RCTn0sIHNvIG9uZSBzaG91bGQgYXZvaWQga2VlcGluZyByZWZl cmVuY2VzIHRvIHRoZW0uCisKK0BkZWZ2YXIgQnBMb2NhdGlvbi5vd25lcgor VGhpcyBhdHRyaWJ1dGUgaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIEBjb2Rl e2dkYi5CcmVha3BvaW50fSBvYmplY3Qgd2hpY2gKK293bnMgdGhpcyBsb2Nh dGlvbi4gIFRoaXMgYXR0cmlidXRlIGlzIG5vdCB3cml0YWJsZS4gCitAZW5k IGRlZnZhcgorCitAZGVmdmFyIEJwTG9jYXRpb24uZW5hYmxlZAorVGhpcyBh dHRyaWJ1dGUgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBsb2NhdGlvbiBpcyBj dXJyZW50bHkgZW5hYmxlZCBvciBub3QuCitUaGlzIGF0dHJpYnV0ZSBpcyBu b3Qgd3JpdGFibGUuCitAZW5kIGRlZnZhcgorCitAZGVmdmFyIEJwTG9jYXRp b24uaW5mZXJpb3IKK1RoaXMgYXR0cmlidXRlIGhvbGRzIGEgcmVmZXJlbmNl IHRvIHRoZSBAY29kZXtnZGIuSW5mZXJpb3J9IGluZmVyaW9yIG9iamVjdAor aW4gd2hpY2ggdGhpcyBicmVha3BvaW50IGxvY2F0aW9uIGhhcyBiZWVuIGlu c2VydGVkLiAgVGhlIHZhbHVlIHdpbGwgYmUgCitAY29kZXtOb25lfSBpZiB0 aGVyZSBpcyBubyBpbmZlcmlvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBsb2Nh dGlvbi4gICBUaGlzIAorYXR0cmlidXRlIGlzIG5vdCB3cml0YWJsZS4KK0Bl bmQgZGVmdmFyCisKK0BkZWZ2YXIgQnBMb2NhdGlvbi5hZGRyZXNzCitUaGlz IGF0dHJpYnV0ZSBob2xkcyBhIEBjb2Rle2dkYi5WYWx1ZX0gb2JqZWN0IGNv cnJlc3BvbmRpbmcgdG8gdGhlIGFkZHJlc3MgCithdCB3aGljaCB0aGUgYnJl YWtwb2ludCBoYXMgYmVlbiBpbnNlcnRlZC4gICBUaGlzIGF0dHJpYnV0ZSBp cyBub3Qgd3JpdGFibGUuCitAZW5kIGRlZnZhcgorCitAZGVmdW4gQnBMb2Nh dGlvbi5pc192YWxpZCAoKQorUmV0dXJucyBAY29kZXtUcnVlfSBpZiB0aGUg QGNvZGV7Z2RiLkJwTG9jYXRpb259IG9iamVjdCBpcyB2YWxpZCwKK0Bjb2Rl e0ZhbHNlfSBpZiBub3QuICBBIEBjb2Rle2dkYi5CcExvY2F0aW9ufSBvYmpl Y3QgbWF5IGJlIGludmFsaWRhdGVkIGJ5CitHREIgYXQgYW55IG1vbWVudCBm b3IgaW50ZXJuYWwgcmVhc29ucy4gIEFsbCBvdGhlciBAY29kZXtnZGIuQnBM b2NhdGlvbn0KK21ldGhvZHMgYW5kIGF0dHJpYnV0ZXMgd2lsbCB0aHJvdyBh biBleGNlcHRpb24gaWYgdGhlIG9iamVjdCBpcyBpbnZhbGlkLgorQGVuZCBk ZWZ1bgorCiBAbm9kZSBMYXp5IFN0cmluZ3MgSW4gUHl0aG9uCiBAc3Vic3Vi c2VjdGlvbiBQeXRob24gcmVwcmVzZW50YXRpb24gb2YgbGF6eSBzdHJpbmdz LgogCmRpZmYgLS1naXQgYS9nZGIvcHl0aG9uL3B5LWJwbG9jLmMgYi9nZGIv cHl0aG9uL3B5LWJwbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMC4uMjcxYTQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9weXRo b24vcHktYnBsb2MuYwpAQCAtMCwwICsxLDMxMyBAQAorLyogUHl0aG9uIGlu dGVyZmFjZSB0byBicmVha3BvaW50IGxvY2F0aW9ucy4KKworICAgQ29weXJp Z2h0IChDKSAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgor CisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKKyAgIFRoaXMgcHJv Z3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQor ICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp b24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikg YW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0 cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAor ICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl IGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAg IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu CisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRo aXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcv bGljZW5zZXMvPi4gICovCisKKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNs dWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgInB5dGhvbi1pbnRlcm5hbC5o IgorI2luY2x1ZGUgIm9ic2VydmVyLmgiCisjaW5jbHVkZSAiZ2RiYXJjaC5o IgorCitzdHJ1Y3QgYnBsb2Nfb2JqZWN0Cit7CisgIFB5T2JqZWN0X0hFQUQK KworICAvKiBUaGUgbG9jYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGlzIHB5 IG9iamVjdC4gIE5VTEwgaWYgdGhlIGxvY2F0aW9uCisgICAgIGhhcyBiZWVu IGRlbGV0ZWQuICAqLworICBzdHJ1Y3QgYnBfbG9jYXRpb24gKmxvYzsKKwor ICAvKiAxIGlmIHRoZSBvd25lciBCUCBoYXMgYmVlbiBkZWxldGVkLCAwIG90 aGVyd2lzZS4gICovCisgIGludCBpbnZhbGlkX293bmVyOworCisgIC8qIENh Y2hlIGZvciB0aGUgZ2RiLlZhbHVlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRv IGxvYy0+YWRkcmVzcy4gICovCisgIFB5T2JqZWN0ICpweV9hZGRyZXNzOwor fTsKKworLyogUmVxdWlyZSB0aGF0IExPQ0FUSU9OIGJlIGEgdmFsaWQgYnBf bG9jYXRpb247IHRocm93IGEgUHl0aG9uCisgICBleGNlcHRpb24gaWYgaXQg aXMgaW52YWxpZC4gICovCisjZGVmaW5lIEJQTE9DUFlfUkVRVUlSRV9WQUxJ RChMb2NhdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc CisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoKExv Y2F0aW9uKS0+bG9jID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBQeUVycl9Gb3JtYXQg KFB5RXhjX1J1bnRpbWVFcnJvciwgICAgICAgICAgICAgICAgICAgICAgICBc CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8oIkJwTG9jYXRpb24g aW52YWxpZC4iKSk7ICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAo MCkKKworc3RhdGljIFB5VHlwZU9iamVjdCBicGxvY19vYmplY3RfdHlwZTsK KworLyogQ2FsbCBieSBmcmVlX2JwX2xvY2F0aW9uIHdoZW4gbG9jIGlzIGFi b3V0IHRvIGJlIGZyZWVkLiAgKi8KKwordm9pZAorZ2RicHlfYnBsb2NhdGlv bl9mcmVlIChzdHJ1Y3QgYnBfbG9jYXRpb24gKmxvYykKK3sKKyAgaWYgKGxv Yy0+cHlfYnBsb2Nfb2JqKQorICAgIHsKKyAgICAgIGxvYy0+cHlfYnBsb2Nf b2JqLT5sb2MgPSBOVUxMOworICAgICAgUHlfREVDUkVGIChsb2MtPnB5X2Jw bG9jX29iaik7CisgICAgfQorfQorCisvKiBEaXNzb2NpYXRlIHRoZSBicF9s b2NhdGlvbiBmcm9tIHRoZSBQeXRob24gb2JqZWN0LiAgKi8KKworc3RhdGlj IHZvaWQKK2JwbG9jcHlfZGVhbGxvYyAoUHlPYmplY3QgKnNlbGYpCit7Cisg IGJwbG9jX29iamVjdCAqc2VsZl9icGxvYyA9IChicGxvY19vYmplY3QgKikg c2VsZjsKKworICBpZiAoc2VsZl9icGxvYy0+bG9jICE9IE5VTEwpCisgICAg c2VsZl9icGxvYy0+bG9jLT5weV9icGxvY19vYmogPSBOVUxMOworCisgIFB5 X1hERUNSRUYgKHNlbGZfYnBsb2MtPnB5X2FkZHJlc3MpOworCisgIHNlbGYt Pm9iX3R5cGUtPnRwX2ZyZWUgKHNlbGYpOworfQorCisvKiBDcmVhdGUgb3Ig YWNxdWlyZSBhIHJlZiB0byB0aGUgYnBfbG9jYXRpb24gb2JqZWN0IChnZGIu QnBMb2NhdGlvbikKKyAgIHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBzdHJ1Y3Qg YnBfbG9jYXRpb24gZnJvbSBHREIuICAqLworCitQeU9iamVjdCAqCiticGxv Y2F0aW9uX3RvX2JwbG9jYXRpb25fb2JqZWN0IChzdHJ1Y3QgYnBfbG9jYXRp b24gKmxvYykKK3sKKyAgYnBsb2Nfb2JqZWN0ICpicGxvY19vYmo7CisKKyAg Z2RiX2Fzc2VydCAobG9jICE9IE5VTEwpOworICBpZiAobG9jLT5weV9icGxv Y19vYmopCisgICAgeworICAgICAgUHlfSU5DUkVGIChsb2MtPnB5X2JwbG9j X29iaik7CisgICAgICByZXR1cm4gKFB5T2JqZWN0ICopIGxvYy0+cHlfYnBs b2Nfb2JqOworICAgIH0KKworICBicGxvY19vYmogPSBQeU9iamVjdF9OZXcg KGJwbG9jX29iamVjdCwgJmJwbG9jX29iamVjdF90eXBlKTsKKyAgaWYgKCFi cGxvY19vYmopCisgICAgcmV0dXJuIE5VTEw7CisKKyAgYnBsb2Nfb2JqLT5s b2MgPSBsb2M7CisgIGJwbG9jX29iai0+aW52YWxpZF9vd25lciA9IDA7Cisg IGJwbG9jX29iai0+cHlfYWRkcmVzcyA9IE5VTEw7CisgIFB5X0lOQ1JFRiAo YnBsb2Nfb2JqKTsKKyAgbG9jLT5weV9icGxvY19vYmogPSBicGxvY19vYmo7 CisKKyAgcmV0dXJuIChQeU9iamVjdCAqKSBicGxvY19vYmo7Cit9CisKKy8q IFB5dGhvbiBmdW5jdGlvbiB0byBnZXQgdGhlIEJQIG93bmluZyB0aGlzIGxv Y2F0aW9uLCBpZiBhbnkuICAqLworCitzdGF0aWMgUHlPYmplY3QgKgorYnBs b2NweV9nZXRfb3duZXIgKFB5T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJl KQoreworICBicGxvY19vYmplY3QgKnNlbGZfYnBsb2MgPSAoYnBsb2Nfb2Jq ZWN0ICopIHNlbGY7CisKKyAgQlBMT0NQWV9SRVFVSVJFX1ZBTElEIChzZWxm X2JwbG9jKTsKKworICBpZiAoc2VsZl9icGxvYy0+aW52YWxpZF9vd25lcikK KyAgICBQeV9SRVRVUk5fTk9ORTsKKworICBpZiAoc2VsZl9icGxvYy0+bG9j LT5vd25lcgorICAgICAgJiYgc2VsZl9icGxvYy0+bG9jLT5vd25lci0+cHlf YnBfb2JqZWN0KQorICAgIHsKKyAgICAgIFB5X0lOQ1JFRiAoc2VsZl9icGxv Yy0+bG9jLT5vd25lci0+cHlfYnBfb2JqZWN0KTsKKyAgICAgIHJldHVybiAo UHlPYmplY3QgKikgc2VsZl9icGxvYy0+bG9jLT5vd25lci0+cHlfYnBfb2Jq ZWN0OworICAgIH0KKworICBQeV9SRVRVUk5fTk9ORTsKK30KKworLyogUHl0 aG9uIGZ1bmN0aW9uIHRvIHRlc3Qgd2hldGhlciBvciBub3QgdGhpcyBicmVh a3BvaW50IGxvY2F0aW9uIGlzCisgICBlbmFibGVkLiAgKi8KKworc3RhdGlj IFB5T2JqZWN0ICoKK2JwbG9jcHlfZ2V0X2VuYWJsZWQgKFB5T2JqZWN0ICpz ZWxmLCB2b2lkICpjbG9zdXJlKQoreworICBicGxvY19vYmplY3QgKnNlbGZf YnBsb2MgPSAoYnBsb2Nfb2JqZWN0ICopIHNlbGY7CisKKyAgQlBMT0NQWV9S RVFVSVJFX1ZBTElEIChzZWxmX2JwbG9jKTsKKworICBpZiAoc2VsZl9icGxv Yy0+bG9jLT5lbmFibGVkKQorICAgIFB5X1JFVFVSTl9UUlVFOworCisgIFB5 X1JFVFVSTl9GQUxTRTsKK30KKworLyogUHl0aG9uIGZ1bmN0aW9uIHRvIGdl dCB0aGUgYWRkcmVzcyBvZiB0aGlzIGJyZWFrcG9pbnQgbG9jYXRpb24uICBU aGUKKyAgIGdkYi5WYWx1ZSBvYmplY3Qgd2lsbCBiZSBjYWNoZWQgaWYgdGhp cyBpcyB0aGUgZmlyc3QgYWNjZXNzLiAgUmV0dXJucworICAgTlVMTCBpbiBj YXNlIG9mIGZhaWx1cmUsIHdpdGggYSBQeXRob24gZXhjZXB0aW9uIHNldC4g ICovCisKK3N0YXRpYyBQeU9iamVjdCAqCiticGxvY3B5X2dldF9hZGRyZXNz IChQeU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKK3sKKyAgYnBsb2Nf b2JqZWN0ICpzZWxmX2JwbG9jID0gKGJwbG9jX29iamVjdCAqKSBzZWxmOwor CisgIEJQTE9DUFlfUkVRVUlSRV9WQUxJRCAoc2VsZl9icGxvYyk7CisKKyAg aWYgKCFzZWxmX2JwbG9jLT5weV9hZGRyZXNzKQorICAgIHsKKyAgICAgIC8q IEdldCB0aGUgYWRkcmVzcyBWYWx1ZSBvYmplY3QgYXMgYSB2b2lkICouICAq LworICAgICAgdm9sYXRpbGUgc3RydWN0IGdkYl9leGNlcHRpb24gZXhjZXB0 OworICAgICAgc3RydWN0IHR5cGUgKnZvaWRfcHRyX3R5cGU7CisgICAgICBz dHJ1Y3QgdmFsdWUgKnZhbCA9IE5VTEw7IC8qIEluaXRpYWxpemUgdG8gYXBw ZWFzZSBnY2Mgd2FybmluZy4gICovCisKKyAgICAgIFRSWV9DQVRDSCAoZXhj ZXB0LCBSRVRVUk5fTUFTS19BTEwpCisgICAgICAgIHsKKyAgICAgICAgICB2 b2lkX3B0cl90eXBlID0gbG9va3VwX3BvaW50ZXJfdHlwZSAoCisgICAgICAg ICAgICAgIGJ1aWx0aW5fdHlwZSAocHl0aG9uX2dkYmFyY2gpLT5idWlsdGlu X3ZvaWQpOworICAgICAgICAgIHZhbCA9IHZhbHVlX2Zyb21fcG9pbnRlciAo dm9pZF9wdHJfdHlwZSwgc2VsZl9icGxvYy0+bG9jLT5hZGRyZXNzKTsKKyAg ICAgICAgfQorICAgICAgR0RCX1BZX0hBTkRMRV9FWENFUFRJT04gKGV4Y2Vw dCk7CisKKyAgICAgIHNlbGZfYnBsb2MtPnB5X2FkZHJlc3MgPSB2YWx1ZV90 b192YWx1ZV9vYmplY3QgKHZhbCk7CisgICAgICBpZiAoIXNlbGZfYnBsb2Mt PnB5X2FkZHJlc3MpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICBQ eV9JTkNSRUYgKHNlbGZfYnBsb2MtPnB5X2FkZHJlc3MpOworICAgIH0KKwor ICBQeV9JTkNSRUYgKHNlbGZfYnBsb2MtPnB5X2FkZHJlc3MpOworCisgIHJl dHVybiBzZWxmX2JwbG9jLT5weV9hZGRyZXNzOworfQorCisvKiBQeXRob24g ZnVuY3Rpb24gdG8gZ2V0IHRoZSBpbmZlcmlvciBob3N0aW5nIHRoaXMgYnJl YWtwb2ludCBsb2NhdGlvbi4KKyAgIFJldHVybiBQeV9Ob25lIGlmIHRoZXJl IGlzIG5vIGluZmVyaW9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvZ3JhbSBz cGFjZSBvZgorICAgdGhpcyBsb2NhdGlvbiwgb3IgTlVMTCBpbiBjYXNlIG9m IGZhaWx1cmUsIHdpdGggYSBweXRob24gZXhjZXB0aW9uIHNldC4gICovCisK K3N0YXRpYyBQeU9iamVjdCAqCiticGxvY3B5X2dldF9pbmZlcmlvciAoUHlP YmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCit7CisgIGJwbG9jX29iamVj dCAqc2VsZl9icGxvYyA9IChicGxvY19vYmplY3QgKikgc2VsZjsKKyAgc3Ry dWN0IGluZmVyaW9yICppbmY7CisgIFB5T2JqZWN0ICppbmZvYmo7CisKKyAg QlBMT0NQWV9SRVFVSVJFX1ZBTElEIChzZWxmX2JwbG9jKTsKKworICBpbmYg PSBmaW5kX2luZmVyaW9yX2Zvcl9wcm9ncmFtX3NwYWNlIChzZWxmX2JwbG9j LT5sb2MtPnBzcGFjZSk7CisgIGlmICghaW5mKQorICAgIFB5X1JFVFVSTl9O T05FOworCisgIGluZm9iaiA9IGluZmVyaW9yX3RvX2luZmVyaW9yX29iamVj dCAoaW5mKTsKKyAgUHlfWElOQ1JFRiAoaW5mb2JqKTsKKworICByZXR1cm4g aW5mb2JqOworfQorCisvKiBQeXRob24gZnVuY3Rpb24gd2hpY2ggY2hlY2tz IHRoZSB2YWxpZGl0eSBvZiBhIGJwIGxvY2F0aW9uIG9iamVjdC4gICovCisK K3N0YXRpYyBQeU9iamVjdCAqCiticGxvY3B5X2lzX3ZhbGlkIChQeU9iamVj dCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgIGJwbG9jX29iamVjdCAq c2VsZl9icGxvYyA9IChicGxvY19vYmplY3QgKikgc2VsZjsKKworICBpZiAo c2VsZl9icGxvYy0+bG9jKQorICAgIFB5X1JFVFVSTl9UUlVFOworICBQeV9S RVRVUk5fRkFMU0U7Cit9CisKKy8qIENhbGxiYWNrIHRyaWdnZXJlZCB3aGVu IGEgYnJlYWtwb2ludCBpcyBkZWxldGVkLiAgVGhpcyB3aWxsIGludmFsaWRh dGUKKyAgIHRoZSBjb3JyZXNwb25kaW5nIGJwX2xvY2F0aW9uIFB5dGhvbiBv YmplY3Qgb3duZXJzLiAgKi8KKworc3RhdGljIHZvaWQKK2JwbG9jcHlfYnJl YWtwb2ludF9kZWxldGVkIChzdHJ1Y3QgYnJlYWtwb2ludCAqYikgeworICBz dHJ1Y3QgYnBfbG9jYXRpb24gKmxvYzsKKworICBmb3IgKGxvYyA9IGItPmxv YzsgbG9jOyBsb2MgPSBsb2MtPm5leHQpCisgICAgeworICAgICAgaWYgKGxv Yy0+cHlfYnBsb2Nfb2JqKQorICAgICAgICBsb2MtPnB5X2JwbG9jX29iai0+ aW52YWxpZF9vd25lciA9IDE7CisgICAgfQorfQorCisvKiBJbml0aWFsaXpl IHRoZSBQeXRob24gYnBfbG9jYXRpb24gY29kZS4gICovCisKK3ZvaWQKK2dk YnB5X2luaXRpYWxpemVfYnBsb2NhdGlvbiAodm9pZCkKK3sKKyAgaWYgKFB5 VHlwZV9SZWFkeSAoJmJwbG9jX29iamVjdF90eXBlKSA8IDApCisgICAgcmV0 dXJuOworCisgIFB5X0lOQ1JFRiAoJmJwbG9jX29iamVjdF90eXBlKTsKKyAg aWYgKFB5TW9kdWxlX0FkZE9iamVjdCAoZ2RiX21vZHVsZSwgIkJwTG9jYXRp b24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKikg JmJwbG9jX29iamVjdF90eXBlKSA8IDApCisgICAgcmV0dXJuOworCisgIG9i c2VydmVyX2F0dGFjaF9icmVha3BvaW50X2RlbGV0ZWQgKGJwbG9jcHlfYnJl YWtwb2ludF9kZWxldGVkKTsKK30KKworc3RhdGljIFB5R2V0U2V0RGVmIGJw bG9jX29iamVjdF9nZXRzZXRbXSA9Cit7CisgIHsgIm93bmVyIiwgYnBsb2Nw eV9nZXRfb3duZXIsIE5VTEwsCisgICAgIkVhY2ggYnJlYWtwb2ludCBsb2Nh dGlvbiBtdXN0IGJlbG9uZyB0byBleGFjdGx5IG9uZSBoaWdoZXItbGV2ZWwg XAorYnJlYWtwb2ludC4gIFRoaXMgcG9pbnRlciBpcyBOVUxMIGlmZiB0aGlz IGJwX2xvY2F0aW9uIGlzIG5vIFwKK2xvbmdlciBhdHRhY2hlZCB0byBhIGJy ZWFrcG9pbnQgKHJlYWQtb25seSkuIiwKKyAgICBOVUxMIH0sCisgIHsgImVu YWJsZWQiLCBicGxvY3B5X2dldF9lbmFibGVkLCBOVUxMLAorICAgICJJcyB0 aGlzIHBhcnRpY3VsYXIgbG9jYXRpb24gZW5hYmxlZC4iLCBOVUxMIH0sCisg IHsgImFkZHJlc3MiLCBicGxvY3B5X2dldF9hZGRyZXNzLCBOVUxMLAorICAg ICJUaGUgYWRkcmVzcyBhdCB3aGljaCB0aGUgYnJlYWtwb2ludCBoYXMgYmVl biBzZXQuIiwgTlVMTCB9LAorICB7ICJpbmZlcmlvciIsIGJwbG9jcHlfZ2V0 X2luZmVyaW9yLCBOVUxMLAorICAgICJUaGUgaW5mZXJpb3IgaW4gd2hpY2gg dGhpcyBicmVha3BvaW50IGxvY2F0aW9uIGhhcyBiZWVuIHNldC4iLCBOVUxM IH0sCisgIHsgTlVMTCB9ICAvKiBTZW50aW5lbC4gICovCit9OworCisKK3N0 YXRpYyBQeU1ldGhvZERlZiBicGxvY19vYmplY3RfbWV0aG9kc1tdID0KK3sK KyAgeyAiaXNfdmFsaWQiLCBicGxvY3B5X2lzX3ZhbGlkLCBNRVRIX05PQVJH UywKKyAgICAiUmV0dXJuIHRydWUgaWYgdGhpcyBicmVha3BvaW50IGxvY2F0 aW9uIGlzIHZhbGlkLCBmYWxzZSBpZiBub3QuIiB9LAorICB7IE5VTEwgfSAv KiBTZW50aW5lbC4gICovCit9OworCitzdGF0aWMgUHlUeXBlT2JqZWN0IGJw bG9jX29iamVjdF90eXBlID0KK3sKKyAgUHlPYmplY3RfSEVBRF9JTklUIChO VUxMKQorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIC8qIG9iX3NpemUgKi8KKyAgImdkYi5CcExvY2F0aW9uIiwgICAg ICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgIHNpemVv ZiAoYnBsb2Nfb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgLyogdHBf YmFzaWNzaXplICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgYnBsb2NweV9k ZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFs bG9jICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgMCwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisg IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg LyogdHBfc2V0YXR0ciAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgMCwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9y ZXByICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgIDAsICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVu Y2UgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgIDAsICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAgKi8K KyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAvKiB0cF9jYWxsICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgIDAsICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0 cm8gKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAwLCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAq LworICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBF LCAgIC8qIHRwX2ZsYWdzICovCisgICJHREIgYnJlYWtwb2ludCBsb2NhdGlv biBvYmplY3QiLCAgICAgICAgICAgLyogdHBfZG9jICovCisgIDAsICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJh dmVyc2UgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAwLCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJl ICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgMCwgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICov CisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgLyogdHBfaXRlcm5leHQgKi8KKyAgYnBsb2Nfb2JqZWN0X21ldGhvZHMs ICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgIDAs ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyog dHBfbWVtYmVycyAqLworICBicGxvY19vYmplY3RfZ2V0c2V0LCAgICAgICAg ICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAwLCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2Ug Ki8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAvKiB0cF9kaWN0ICovCisgIDAsICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgIDAs ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyog dHBfZGVzY3Jfc2V0ICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAwLCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRw X2luaXQgKi8KKyAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworfTsKZGlmZiAtLWdpdCBhL2dk Yi9weXRob24vcHktYnJlYWtwb2ludC5jIGIvZ2RiL3B5dGhvbi9weS1icmVh a3BvaW50LmMKaW5kZXggMTFkNjBmZS4uY2NjYmYwZSAxMDA2NDQKLS0tIGEv Z2RiL3B5dGhvbi9weS1icmVha3BvaW50LmMKKysrIGIvZ2RiL3B5dGhvbi9w eS1icmVha3BvaW50LmMKQEAgLTYyMCw2ICs2MjAsNDMgQEAgYnBweV9nZXRf aWdub3JlX2NvdW50IChQeU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkK ICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nIChzZWxmX2JwLT5icC0+aWdub3Jl X2NvdW50KTsKIH0KIAorCisvKiBQeXRob24gZnVuY3Rpb24gd2hpY2ggcmV0 dXJucyB0aGUgQnBMb2NhdGlvbiBvYmplY3RzIGFzc29jaWF0ZWQKKyAgIHdp dGggdGhpcyBicmVha3BvaW50LiAgKi8KKworc3RhdGljIFB5T2JqZWN0ICoK K2JwcHlfbG9jYXRpb25zIChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFy Z3MpCit7CisgIGJyZWFrcG9pbnRfb2JqZWN0ICpzZWxmX2JwID0gKGJyZWFr cG9pbnRfb2JqZWN0ICopIHNlbGY7CisgIFB5T2JqZWN0ICpsaXN0LCAqdHVw bGU7CisgIHN0cnVjdCBicF9sb2NhdGlvbiAqbG9jOworICBpbnQgZXJyOwor CisgIEJQUFlfUkVRVUlSRV9WQUxJRCAoc2VsZl9icCk7CisKKyAgbGlzdCA9 IFB5TGlzdF9OZXcgKDApOworICBpZiAoIWxpc3QpCisgICAgcmV0dXJuIE5V TEw7CisKKyAgZXJyID0gMDsKKyAgZm9yIChsb2MgPSBzZWxmX2JwLT5icC0+ bG9jOyBsb2M7IGxvYyA9IGxvYy0+bmV4dCkKKyAgICB7CisgICAgICBQeU9i amVjdCAqbG9jX29iaiA9ICBicGxvY2F0aW9uX3RvX2JwbG9jYXRpb25fb2Jq ZWN0IChsb2MpOworICAgICAgZXJyID0gUHlMaXN0X0FwcGVuZCAobGlzdCwg bG9jX29iaik7CisgICAgICBpZiAoZXJyID09IC0xKQorICAgICAgICB7Cisg ICAgICAgICAgUHlfREVDUkVGIChsaXN0KTsKKyAgICAgICAgICByZXR1cm4g TlVMTDsKKyAgICAgICAgfQorICAgICAgUHlfREVDUkVGIChsb2Nfb2JqKTsK KyAgICB9CisKKyAgdHVwbGUgPSBQeUxpc3RfQXNUdXBsZSAobGlzdCk7Cisg IFB5X0RFQ1JFRiAobGlzdCk7CisKKyAgcmV0dXJuIHR1cGxlOworfQorCiAv KiBQeXRob24gZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IGJyZWFrcG9pbnQu ICAqLwogc3RhdGljIGludAogYnBweV9pbml0IChQeU9iamVjdCAqc2VsZiwg UHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCkBAIC0xMDAzLDYg KzEwNDAsOCBAQCBzdGF0aWMgUHlNZXRob2REZWYgYnJlYWtwb2ludF9vYmpl Y3RfbWV0aG9kc1tdID0KICAgICAiUmV0dXJuIHRydWUgaWYgdGhpcyBicmVh a3BvaW50IGlzIHZhbGlkLCBmYWxzZSBpZiBub3QuIiB9LAogICB7ICJkZWxl dGUiLCBicHB5X2RlbGV0ZV9icmVha3BvaW50LCBNRVRIX05PQVJHUywKICAg ICAiRGVsZXRlIHRoZSB1bmRlcmx5aW5nIEdEQiBicmVha3BvaW50LiIgfSwK KyAgeyAibG9jYXRpb25zIiwgYnBweV9sb2NhdGlvbnMsIE1FVEhfTk9BUkdT LAorICAgICJHZXQgYSBsaXN0IG9mIGdkYi5CcExvY2F0aW9uIG9iamVjdHMg YXNzb2NpYXRlZCB3aXRoIHRoaXMgYnJlYWtwb2ludC4iIH0sCiAgIHsgTlVM TCB9IC8qIFNlbnRpbmVsLiAgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2dkYi9w eXRob24vcHl0aG9uLWludGVybmFsLmggYi9nZGIvcHl0aG9uL3B5dGhvbi1p bnRlcm5hbC5oCmluZGV4IGVmMzlkNWQuLjQ5YmIzMmUgMTAwNjQ0Ci0tLSBh L2dkYi9weXRob24vcHl0aG9uLWludGVybmFsLmgKKysrIGIvZ2RiL3B5dGhv bi9weXRob24taW50ZXJuYWwuaApAQCAtMTI0LDYgKzEyNCw5IEBAIGV4dGVy biBQeVR5cGVPYmplY3Qgc3RvcF9ldmVudF9vYmplY3RfdHlwZTsKIC8qIERl ZmluZWQgaW4gcHktYnJlYWtwb2ludC5jICovCiB0eXBlZGVmIHN0cnVjdCBi cmVha3BvaW50X29iamVjdCBicmVha3BvaW50X29iamVjdDsKIAorLyogRGVm aW5lZCBpbiBweS1icGxvYy5jICovCit0eXBlZGVmIHN0cnVjdCBicGxvY19v YmplY3QgYnBsb2Nfb2JqZWN0OworCiB0eXBlZGVmIHN0cnVjdAogewogICBQ eU9iamVjdF9IRUFECkBAIC0xNzYsNiArMTc5LDggQEAgUHlPYmplY3QgKnBz cHlfZ2V0X3ByaW50ZXJzIChQeU9iamVjdCAqLCB2b2lkICopOwogUHlPYmpl Y3QgKm9iamZpbGVfdG9fb2JqZmlsZV9vYmplY3QgKHN0cnVjdCBvYmpmaWxl ICopOwogUHlPYmplY3QgKm9iamZweV9nZXRfcHJpbnRlcnMgKFB5T2JqZWN0 ICosIHZvaWQgKik7CiAKK1B5T2JqZWN0ICpicGxvY2F0aW9uX3RvX2JwbG9j YXRpb25fb2JqZWN0IChzdHJ1Y3QgYnBfbG9jYXRpb24gKmxvYyk7CisKIHRo cmVhZF9vYmplY3QgKmNyZWF0ZV90aHJlYWRfb2JqZWN0IChzdHJ1Y3QgdGhy ZWFkX2luZm8gKnRwKTsKIHRocmVhZF9vYmplY3QgKmZpbmRfdGhyZWFkX29i amVjdCAocHRpZF90IHB0aWQpOwogUHlPYmplY3QgKmZpbmRfaW5mZXJpb3Jf b2JqZWN0IChpbnQgcGlkKTsKQEAgLTIwMiw2ICsyMDcsNyBAQCB2b2lkIGdk YnB5X2luaXRpYWxpemVfZnVuY3Rpb25zICh2b2lkKTsKIHZvaWQgZ2RicHlf aW5pdGlhbGl6ZV9wc3BhY2UgKHZvaWQpOwogdm9pZCBnZGJweV9pbml0aWFs aXplX29iamZpbGUgKHZvaWQpOwogdm9pZCBnZGJweV9pbml0aWFsaXplX2Jy ZWFrcG9pbnRzICh2b2lkKTsKK3ZvaWQgZ2RicHlfaW5pdGlhbGl6ZV9icGxv Y2F0aW9uICh2b2lkKTsKIHZvaWQgZ2RicHlfaW5pdGlhbGl6ZV9sYXp5X3N0 cmluZyAodm9pZCk7CiB2b2lkIGdkYnB5X2luaXRpYWxpemVfcGFyYW1ldGVy cyAodm9pZCk7CiB2b2lkIGdkYnB5X2luaXRpYWxpemVfdGhyZWFkICh2b2lk KTsKZGlmZiAtLWdpdCBhL2dkYi9weXRob24vcHl0aG9uLmMgYi9nZGIvcHl0 aG9uL3B5dGhvbi5jCmluZGV4IGIwYjlhOWMuLmRlNmI1MWYgMTAwNjQ0Ci0t LSBhL2dkYi9weXRob24vcHl0aG9uLmMKKysrIGIvZ2RiL3B5dGhvbi9weXRo b24uYwpAQCAtMTA1OCw2ICsxMDU4LDEyIEBAIGdkYnB5X2JyZWFrcG9pbnRf aGFzX3B5X2NvbmQgKHN0cnVjdCBicmVha3BvaW50X29iamVjdCAqYnBfb2Jq KQogCQkgICAgInNjcmlwdGluZyBpcyBub3Qgc3VwcG9ydGVkLiIpKTsKIH0K IAordm9pZAorZ2RicHlfYnBsb2NhdGlvbl9mcmVlIChzdHJ1Y3QgYnJlYWtw b2ludF9vYmplY3QgKmJwX29iaikKK3sKKyAgcmV0dXJuOworfQorCiAjZW5k aWYgLyogSEFWRV9QWVRIT04gKi8KIAogDApAQCAtMTI0Nyw2ICsxMjUzLDcg QEAgRW5hYmxlcyBvciBkaXNhYmxlcyBwcmludGluZyBvZiBQeXRob24gc3Rh Y2sgdHJhY2VzLiIpLAogICBnZGJweV9pbml0aWFsaXplX3BzcGFjZSAoKTsK ICAgZ2RicHlfaW5pdGlhbGl6ZV9vYmpmaWxlICgpOwogICBnZGJweV9pbml0 aWFsaXplX2JyZWFrcG9pbnRzICgpOworICBnZGJweV9pbml0aWFsaXplX2Jw bG9jYXRpb24gKCk7CiAgIGdkYnB5X2luaXRpYWxpemVfbGF6eV9zdHJpbmcg KCk7CiAgIGdkYnB5X2luaXRpYWxpemVfdGhyZWFkICgpOwogICBnZGJweV9p bml0aWFsaXplX2luZmVyaW9yICgpOwpkaWZmIC0tZ2l0IGEvZ2RiL3B5dGhv bi9weXRob24uaCBiL2dkYi9weXRob24vcHl0aG9uLmgKaW5kZXggYWU1NWNj Mi4uY2VlOGE2YiAxMDA2NDQKLS0tIGEvZ2RiL3B5dGhvbi9weXRob24uaAor KysgYi9nZGIvcHl0aG9uL3B5dGhvbi5oCkBAIC00Nyw0ICs0Nyw2IEBAIGlu dCBnZGJweV9zaG91bGRfc3RvcCAoc3RydWN0IGJyZWFrcG9pbnRfb2JqZWN0 ICpicF9vYmopOwogCiBpbnQgZ2RicHlfYnJlYWtwb2ludF9oYXNfcHlfY29u ZCAoc3RydWN0IGJyZWFrcG9pbnRfb2JqZWN0ICpicF9vYmopOwogCit2b2lk IGdkYnB5X2JwbG9jYXRpb25fZnJlZSAoc3RydWN0IGJwX2xvY2F0aW9uICps b2MpOworCiAjZW5kaWYgLyogR0RCX1BZVEhPTl9IICovCmRpZmYgLS1naXQg YS9nZGIvdGVzdHN1aXRlL2dkYi5weXRob24vcHktYnJlYWtwb2ludC5leHAg Yi9nZGIvdGVzdHN1aXRlL2dkYi5weXRob24vcHktYnJlYWtwb2ludC5leHAK aW5kZXggZTBkZDA4Ny4uZDk0NmQ3YiAxMDA2NDQKLS0tIGEvZ2RiL3Rlc3Rz dWl0ZS9nZGIucHl0aG9uL3B5LWJyZWFrcG9pbnQuZXhwCisrKyBiL2dkYi90 ZXN0c3VpdGUvZ2RiLnB5dGhvbi9weS1icmVha3BvaW50LmV4cApAQCAtMzAx LDMgKzMwMSw1NSBAQCBnZGJfcHlfdGVzdF9zaWxlbnRfY21kICAicHl0aG9u IHdwMSA9IHdwX2V2YWwgKFwicmVzdWx0XCIsIHR5cGU9Z2RiLkJQX1dBVENI UE9JTgogZ2RiX3Rlc3QgImNvbnRpbnVlIiAiLipcW1d3XF1hdGNocG9pbnQu KnJlc3VsdC4qT2xkIHZhbHVlID0uKk5ldyB2YWx1ZSA9IDc4OC4qIiAiVGVz dCB3YXRjaHBvaW50IHdyaXRlIgogZ2RiX3Rlc3QgInB5dGhvbiBwcmludCBu ZXZlcl9ldmFsX2JwMS5jb3VudCIgIjAiIFwKICAgICAiQ2hlY2sgdGhhdCB0 aGlzIHVucmVsYXRlZCBicmVha3BvaW50cyBldmFsIGZ1bmN0aW9uIHdhcyBu ZXZlciBjYWxsZWQuIgorCisjIGdkYi5CcExvY2F0aW9uCisKKyMgU3RhcnQg d2l0aCBhIGZyZXNoIGdkYi4KK2NsZWFuX3Jlc3RhcnQgJHt0ZXN0ZmlsZX0K KworaWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgICBmYWlsICJDYW5ub3Qg cnVuIHRvIG1haW4uIgorICAgIHJldHVybiAwCit9CitkZWxldGVfYnJlYWtw b2ludHMKK2dkYl90ZXN0X25vX291dHB1dCAic2V0IGRldGFjaC1vbi1mb3Jr IG9mZiIgImRvbid0IGRldGFjaCBvbiBmb3JrIgorZ2RiX3Rlc3QgImNhbGwg Zm9yaygpIiAiTmV3IHByb2Nlc3MgLioiICJjcmVhdGUgYSBzZWNvbmQgaW5m ZXJpb3IiCisKK2dkYl9icmVha3BvaW50ICJtYWluIgorZ2RiX3Rlc3QgInB5 IHByaW50IGxlbihnZGIuYnJlYWtwb2ludHMoKSkiICIxIiAiZW5zdXJlIHRo YXQgdGhyZXJlIGlzIG9ubHkgb25lIEJQIgorZ2RiX3Rlc3Rfbm9fb3V0cHV0 IHtweSBicDAgPSBnZGIuYnJlYWtwb2ludHMoKVswXX0gInNhdmUgYnJlYWtw b2ludCAwIgorZ2RiX3Rlc3QgInB5IHByaW50IGxlbihicDAubG9jYXRpb25z KCkpIiAiMiIgImVuc3VyZSB0aGF0IHRocmVyZSBhcmUgMiBsb2NhdGlvbnMi CisKK2dkYl90ZXN0X25vX291dHB1dCB7cHkgbG9jMCA9IGJwMC5sb2NhdGlv bnMoKVswXX0gInNhdmUgbG9jYXRpb24gMCIKK2dkYl90ZXN0X25vX291dHB1 dCB7cHkgbG9jMSA9IGJwMC5sb2NhdGlvbnMoKVsxXX0gInNhdmUgbG9jYXRp b24gMSIKKworZ2RiX3Rlc3QgInB5IHByaW50IGxvYzAub3duZXIgPT0gbG9j MS5vd25lciA9PSBicDAiICJUcnVlIiAidmVyaWZ5IG93bmVyc2hpcCIKK2dk Yl90ZXN0ICJweSBwcmludCBsb2MwLmFkZHJlc3MgPT0gbG9jMS5hZGRyZXNz ICIgIlRydWUiICJ2ZXJpZnkgYWRkcmVzc2VzIGFyZSBpZGVudGljYWwiCisj IGhvdyB0byBjaGVjayBhZGRyZXNzIGxvY2F0aW9uID8gIT0gYWRkcmVzcyht YWluKQorCitnZGJfdGVzdCB7cHkgcHJpbnQgbG9jMC5pbmZlcmlvciA9PSBn ZGIuaW5mZXJpb3JzKClbMF19ICJUcnVlIiAidmVyaWZ5IGluZmVyaW9yIGZv ciBsb2MgMCIgI2luZiAyCitnZGJfdGVzdCB7cHkgcHJpbnQgbG9jMS5pbmZl cmlvciA9PSBnZGIuaW5mZXJpb3JzKClbMV19ICJUcnVlIiAidmVyaWZ5IGlu ZmVyaW9yIGZvciBsb2MgMSIgI2luZiAxCisKK2dkYl90ZXN0ICJweSBwcmlu dCBsb2MwLmVuYWJsZWQgPT0gbG9jMS5lbmFibGVkID09IFRydWUiICJUcnVl IiAidmVyaWZ5IHRoYXQgbG9jYXRpb25zIGFyZSBlbmFibGVkIgorCitnZGJf dGVzdCAicHkgcHJpbnQgbG9jMC5pbmZlcmlvci5udW0iICIyIiAiZW5zdXJl IHRoYXQgbG9jMCBpcyBvbiBpbmZlcmlvciAyIgorCitnZGJfdGVzdCAiZGV0 YWNoIGluZmVyaW9yIDIiICJEZXRhY2hpbmcgZnJvbSBwcm9ncmFtOi4qIiAi ZGV0YWNoIGluZmVyaW9yIDIiCitnZGJfdGVzdCAiaW5mZXJpb3IgMSIgIlN3 aXRjaGluZyB0byBpbmZlcmlvciAuKiIgInN3aXRjaCB0byBpbmZlcmlvciAx IgorZ2RiX3Rlc3Rfbm9fb3V0cHV0ICJyZW1vdmUtaW5mZXJpb3JzIDIiICJy ZW1vdmUgaW5mZXJpb3IgMiIKK2dkYl90ZXN0ICJweSBwcmludCBsb2MwLmlu ZmVyaW9yIiAiTm9uZSIgInJlbW92ZWQgaW5mZXJpb3Igc2V0IHRvIE5vbmUi CisKK2RlbGV0ZV9icmVha3BvaW50cworZ2RiX3Rlc3QgInB5IHByaW50IGJw MC5pc192YWxpZCgpIiAiRmFsc2UiICJ2ZXJpZnkgdGhhdCBCUCBoYXMgYmVl biBpbnZhbGlkYXRlZCIKK2dkYl90ZXN0ICJweSBicDAubG9jYXRpb25zKCki ICIuKlJ1bnRpbWVFcnJvcjogQnJlYWtwb2ludCAuKiBpcyBpbnZhbGlkLioi XAorICAgICAgICAgInZlcmlmeSB0aGF0IGxvY2F0aW9ucyBjYW4ndCBhY2Nl c3NlZCBvbiBhbiBpbnZhbGlkIGJyZWFrcG9pbnQiCisgICAgICAgICAKK2dk Yl90ZXN0ICJweSBwcmludCBsb2MwLmlzX3ZhbGlkKCkiICJGYWxzZSIgInZl cmlmeSB0aGF0IGxvY2F0aW9uIGlzIGludmFsaWQiCitnZGJfdGVzdCAicHkg cHJpbnQgbG9jMC5vd25lciIgIi4qUnVudGltZUVycm9yOiBCcExvY2F0aW9u IGludmFsaWQuKiJcCisgICAgICAgICAidmVyaWZ5IHRoYXQgb3duZXIgY2Fu J3QgYmUgYWNjZXNzZWQiCitnZGJfdGVzdCAicHkgcHJpbnQgbG9jMC5lbmFi bGVkIiAiLipSdW50aW1lRXJyb3I6IEJwTG9jYXRpb24gaW52YWxpZC4qIlwK KyAgICAgICAgICJ2ZXJpZnkgdGhhdCBsb2NhdGlvbiBjYW4ndCBiZSBhY2Nl c3NlZCIKK2dkYl90ZXN0ICJweSBwcmludCBsb2MwLmFkZHJlc3MiICIuKlJ1 bnRpbWVFcnJvcjogQnBMb2NhdGlvbiBpbnZhbGlkLioiXAorICAgICAgICAg InZlcmlmeSB0aGF0IGxvY2F0aW9uIGNhbid0IGJlIGFjY2Vzc2VkIgorZ2Ri X3Rlc3QgInB5IHByaW50IGxvYzAuaW5mZXJpb3IiICIuKlJ1bnRpbWVFcnJv cjogQnBMb2NhdGlvbiBpbnZhbGlkLioiXAorICAgICAgICAgInZlcmlmeSB0 aGF0IGluZmVyaW9yIGNhbid0IGJlIGFjY2Vzc2VkIgotLSAKMS43LjYuNAoK --20cf307c9fecc21a9104b3a8c2ec--