From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S262050AbUD3Hgr (ORCPT ); Fri, 30 Apr 2004 03:36:47 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S265098AbUD3Hgr (ORCPT ); Fri, 30 Apr 2004 03:36:47 -0400 Received: from cpe-24-221-190-179.ca.sprintbbd.net ([24.221.190.179]:14307 "EHLO myware.akkadia.org") by vger.kernel.org with ESMTP id S262050AbUD3HgY (ORCPT ); Fri, 30 Apr 2004 03:36:24 -0400 Message-ID: <409201BE.9000909@redhat.com> Date: Fri, 30 Apr 2004 00:35:26 -0700 From: Ulrich Drepper Organization: Red Hat, Inc. User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8a) Gecko/20040422 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Linux Kernel Subject: NUMA API X-Enigmail-Version: 0.83.5.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: multipart/mixed; boundary="------------090506010803030105020407" Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org This is a multi-part message in MIME format. --------------090506010803030105020407 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 In the last weeks I have been working on designing a new API for a NUMA support library. I am aware of the code in libnuma by ak but this code has many shortcomings: ~ inadequate topology discovery ~ fixed cpu set size ~ no clear separation of memory nodes ~ no inclusion of SMT/multicore in the cpu hierarchy ~ awkward (at best) memory allocation interface ~ etc etc and last but not least ~ a completely unacceptable library interface (e.g., global variables as part of the API, WTF?) At the end of the attached document is a comparison of the two APIs. I'm only posting now about this since I wanted to get some sanity checks of the API first. Some of our (i.e., Red Hat's) partners provided this. They might identify themselves, or not. This is not because other parties are meant to be excluded. The API described here is meant to be a minimal which can be wrapped for use in any kind of higher-level language (or even in another C library using the interface). For this reason the CPU and memory node sets are not handled by an abstract data type but instead as bitmap. Using an abstract data types (in C) means restricting the way wrapper libraries can be designed. In a C++ wrapper, for instance, the bit sets certainly should be abstract. A later version of the attached document might try provide higher-level interfaces. The text of the API proposal is not yet polished. In fact, most descriptions are fairly short. I want o get some more assurance that the API is received well before spending significantly more time on it. As specified, the implementation of the interface is designed with only the requirements of a program on NUMA hardware in mind. I have paid no attention to the currently proposed kernel extensions. If the latter do not really allow implementing the functionality programmers need then it is wasted efforts. For instance, I think the way memory allocated in interleaved fashion is not "ideal". Interleaved allocation is a property of a specific allocation. Global states for processes (or threads) are a terrible way to handle this and other properties since it requires the programmer to constantly switch the mode back and forth since any part of the runtime might be NUMA aware and reset the mode. Also, the concept of hard/soft sets for CPUs is useful. Likewise "spilling" over to other memory nodes. Usually using NUMA means hinting the desired configuration to the system. It'll be used whenever possible. If it is not possible (for instance, if a given processor is not available) it is mostly no good idea to completely fail the execution. Instead a less optimal resource should be used. For memory it is hard to know how much memory on which node is in use etc. Another missing feature in libnuma and the current kernel design is support for changes in the configuration. CPUs might be added or removed, likewise memory. Additional interconnects between NUMA blocks might be added etc. Overall I think the proposed API provides a architecture-independent, future-safe NUMA API. If no program uses the kernel functionality directly (which is possible with the API) the kernel interface can be changed and adopted for each architecture or even specific machine without the program noticing it. The selection of names for the functions is by no means fixed. These are proposals. I'm open for constructive criticism. In case you find interfaces to be missing or wrong or not optimal, please let me know as well. Once the API is regarded useful we can start thinking about the kernel interface so keep these two things separated. Please direct comments to me. In case there is interest I can set up a separate mailing list since lkml is probably not the best venue. - -- ➧ Ulrich Drepper ➧ Red Hat, Inc. ➧ 444 Castro St ➧ Mountain View, CA ❖ -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAkgG92ijCOnn/RHQRAqgUAJ9bJ83LxSZ43TW5+5I1VhXV+zRPNACgnjmQ SnFjDhA7v+5CGaZO5/jOxhw= =93mp -----END PGP SIGNATURE----- --------------090506010803030105020407 Content-Type: text/plain; name="numa-if" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="numa-if" CQkgICAgICBUaG91Z2h0cyBhYm91dCBhIE5VTUEgQVBJCgpVbHJpY2ggRHJlcHBlcgpSZWQg SGF0LCBJbmMuClRpbWUtc3RhbXA6IDwyMDA0LTA0LTI5IDAxOjE4OjMyIGRyZXBwZXI+Cgoq KiogVmVyeSBlYXJseSBkcmFmdC4gIEknbGwgY2xlYW4gdXAgdGhlIGludGVyZmFjZSB3aGVu IEkgZ2V0IHNvbWUgcG9zaXRpdmUKKioqIGZlZWRiYWNrLgoKClRoZSB0ZWNobm9sb2d5IHVz ZWQgaW4gTlVNQSBtYWNoaW5lcyBpcyBzdGlsbCBldm9sdmluZyB3aGljaCBtZWFucwp0aGF0 IGFueSBwcm9wb3NlZCBpbnRlcmZhY2Ugd2lsbCBmYWxsIHNob3J0IG92ZXIgdGltZS4gIFdl IGNhbm5vdAp0aGluayBhYm91dCBldmVyeSBwb3NzaWJpbGl0eSBhbmQgbnVhbmNlIHRoZSBo YXJkd2FyZSBkZXNpZ25lcnMgY29tZQp1cCB3aXRoLiAgVGhlIGZvbGxvd2luZyBpcyBhIGxp c3Qgb2YgYXNzdW1wdGlvbnMgbWFkZSBmb3IgdGhpcwpkb2N1bWVudC4gIFNvbWUgYXNzdW1w dGlvbnMgd2lsbCBiZSB0b28gZ2VuZXJhbCBmb3Igc29tZQppbXBsZW1lbnRhdGlvbnMgd2hp Y2ggYWxsb3dzIHNpbXBsaWNhdGlvbi4gIEJ1dCB0aGUgaW50ZXJmYWNlcyBzaG91bGQKY292 ZXIgbW9yZSBkZXNpZ25zLgoKMS4gIE5vbi11bmlmb3JtIHJlc291cmNlcyBhcmUgcHJvY2Vz c29ycyBhbmQgbWVtb3J5CgoyLiAgVGhlIGFkZHJlc3Mgc3BhY2VzIG9mIHByb2Nlc3NvcnMg b3ZlcmxhcAoKMy4gIFBvc3NpYmxlIG1lYXN1cmU6IGRpc3RhbmNlIG9mIHByb2Nlc3NvcnMK CiAgICBUaGUgZGlzdGFuY2UgaXMgbWVhc3VyZWQgYnkgdGhlIG1pbmltYWwgZGlmZmVyZW5j ZSBvZiBjb3N0IG9mCiAgICBhY2Nlc3NpbmcgbWVtb3J5LgoKICAgIH4gU01UIGFuZCBtdWx0 aS1jb3JlIChNQykgcHJvY2Vzc29ycyBzaGFyZSBzb21lIHByb2Nlc3NvciBjYWNoZTsKCiAg ICB+IHByb2Nlc3NvcnMgb24gdGhlIHNhbWUgU01QIG5vZGUgKHdoaWNoIG1pZ2h0IGp1c3Qg YmUgb25lCiAgICAgIHByb2Nlc29yIGluIHNpemUpIGhhdmUgdGhlIHNhbWUgZGlzdGFuY2Us IHdoaWNoIGlzIGxhcmdlcgogICAgICB0aGFuIFNNVC9NQyBkaXN0YW5jZQoKICAgIH4gcHJv Y2Vzc29ycyBvbiBkaWZmZXJlbnQgTlVNQSBub2RlcyBpbmNyZWFzZXMgaW4gZGlzdGFuY2Ug d2l0aCBlYWNoCiAgICAgIGludGVyY29ubmVjdCB3aGljaCBoYXMgdG8gYmUgdXNlZC4KCjQu ICBUaGUgbWFjaGluZSdzIGFyY2hpdGVjdHVyZSBjYW4gY2hhbmdlIG92ZXIgdGltZS4KCiAg ICB+IGhvdHBsdWcgQ1BVcy9SQU0KCiAgICB+IGR5bmFtaWNhbGx5IGVuYWJsaW5nL2Rpc2Fi bGluZyBwYXJ0cyBvZiB0aGUgbWFjaGluZSBiYXNlZCBvbgogICAgICByZXNvdXJjZSByZXF1 aXJlbWVudHMKCgpFeGFtcGxlCj09PT09PT0KCiAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0rCiAgfCArLS0tLS0tLS0tLS0tLS0rICAgICAgKy0tLS0tLS0t LS0tLS0tKyB8CiAgfCB8ICstLSsgICAgKy0tKyB8ICAgICAgfCArLS0rICAgICstLSsgfCB8 CiAgfCB8IHxUMXwgICAgfFQxfCB8ICAgICAgfCB8VDF8ICAgIHxUMXwgfCB8CiAgfCB8ICst LSsgICAgKy0tKyB8ICAgICAgfCArLS0rICAgICstLSsgfCB8CiAgfCB8IHxUMnwgICAgfFQy fCB8ICAgICAgfCB8VDJ8ICAgIHxUMnwgfCB8CiAgfCB8ICstLSsgICAgKy0tKyB8ICAgICAg fCArLS0rICAgICstLSsgfCB8CiAgfCB8ICBDMSAgICAgIEMyICB8ICAgICAgfCAgQzEgICAg ICBDMiAgfCB8CiAgfCArLS0tLS0tUDEtLS0tLS0rICAgICAgKy0tLS0tLVAyLS0tLS0tKyB8 CiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgfCArLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyB8CiAgfCB8ICAgICAgICAgICAg ICAgICBNMSAgICAgICAgICAgICAgICAgfCB8CiAgfCArLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tKyB8CiAgKy0tLS0tLS0tLS0tLS0tLS0tLS1OMS0tLS0tLS0tLS0t LS0tLS0tLS0rCgogICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t KwogIHwgKy0tLS0tLS0tLS0tLS0tKyAgICAgICstLS0tLS0tLS0tLS0tLSsgfAogIHwgfCAr LS0rICAgICstLSsgfCAgICAgIHwgKy0tKyAgICArLS0rIHwgfAogIHwgfCB8VDF8ICAgIHxU MXwgfCAgICAgIHwgfFQxfCAgICB8VDF8IHwgfAogIHwgfCArLS0rICAgICstLSsgfCAgICAg IHwgKy0tKyAgICArLS0rIHwgfAogIHwgfCB8VDJ8ICAgIHxUMnwgfCAgICAgIHwgfFQyfCAg ICB8VDJ8IHwgfAogIHwgfCArLS0rICAgICstLSsgfCAgICAgIHwgKy0tKyAgICArLS0rIHwg fAogIHwgfCAgQzEgICAgICBDMiAgfCAgICAgIHwgIEMxICAgICAgQzIgIHwgfAogIHwgKy0t LS0tLVAxLS0tLS0tKyAgICAgICstLS0tLS1QMi0tLS0tLSsgfAogIHwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogIHwgKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLSsgfAogIHwgfCAgICAgICAgICAgICAgICAgTTIgICAgICAgICAg ICAgICAgIHwgfAogIHwgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsg fAogICstLS0tLS0tLS0tLS0tLS0tLS0tTjItLS0tLS0tLS0tLS0tLS0tLS0tKwoKICArLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICB8ICstLS0tLS0tLS0t LS0tLSsgICAgICArLS0tLS0tLS0tLS0tLS0rIHwKICB8IHwgKy0tKyAgICArLS0rIHwgICAg ICB8ICstLSsgICAgKy0tKyB8IHwKICB8IHwgfFQxfCAgICB8VDF8IHwgICAgICB8IHxUMXwg ICAgfFQxfCB8IHwKICB8IHwgKy0tKyAgICArLS0rIHwgICAgICB8ICstLSsgICAgKy0tKyB8 IHwKICB8IHwgfFQyfCAgICB8VDJ8IHwgICAgICB8IHxUMnwgICAgfFQyfCB8IHwKICB8IHwg Ky0tKyAgICArLS0rIHwgICAgICB8ICstLSsgICAgKy0tKyB8IHwKICB8IHwgIEMxICAgICAg QzIgIHwgICAgICB8ICBDMSAgICAgIEMyICB8IHwKICB8ICstLS0tLS1QMS0tLS0tLSsgICAg ICArLS0tLS0tUDItLS0tLS0rIHwKICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwKICB8ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0r IHwKICB8IHwgICAgICAgICAgICAgICAgIE0zICAgICAgICAgICAgICAgICB8IHwKICB8ICst LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIHwKICArLS0tLS0tLS0tLS0t LS0tLS0tLU4zLS0tLS0tLS0tLS0tLS0tLS0tLSsKClRoZXNlIGFyZSB0aHJlZSBOVU1BIGJs b2NrcywgZWFjaCBjb25zaXN0aW5nIG9mIHR3byBTTVAgcHJvY2Vzc29ycywKZWFjaCBvZiB3 aGljaCBoYXMgdHdvIGNvcmVzIHdoaWNoIGJ5IGl0c2VsZiBoYXZlIHR3byB0aHJlYWRzLiAg V2UgdXNlCnRoZSBub3RhdGlvbiBUMTpDMjpQMjpOMyBmb3IgdGhlIGZpcnN0IHRocmVhZCwg aW4gdGhlIHNlY29uZCBjb3JlLCBpbgp0aGUgc2Vjb25kIHByb2Nlc3Nvciwgb24gdGhlIHRo aXJkIG5vZGUuICBUaGUgbWFpbiBtZW1vcnkgaW4gdGhlIG5vZGVzCmlzIHJlcHJlc2VudGVk IGJ5IE0xLCBNMiwgTTMuCgpBIHNpbXBsaXN0aWNzIG1lYXN1cmUgaW4gdGhpcyBjYXNlIGNv dWxkIGJlOiByZXF1aXJpbmcgdG8gYWNjZXNzIHRoZQpuZXh0IGxldmVsIG9mIG1lbW9yeSBk b3VibGVzIHRoZSBjb3N0LiAgU28gd2UgbWlnaHQgaGF2ZSB0aGUgZm9sbG93aW5nCmNvc3Rz OgoKICBUMTpDMTpQMTpOMSA8LT4gVDI6QzE6UDE6TjEgICA9PSAgMQogIFQxOkMxOlAxOk4x IDwtPiBUMTpDMjpQMTpOMSAgID09ICAyCiAgVDE6QzE6UDE6TjEgPC0+IFQxOkMxOlAyOk4x ICAgPT0gIDQKICBUMTpDMTpQMTpOMSA8LT4gVDE6QzE6UDE6TjIgICA9PSAgOAogIFQxOkMx OlAxOk4xIDwtPiBUMTpDMTpQMTpOMyAgID09ICAxNiAoaS5lLiwgMiAqIDggc2luY2UgdHdv IGludGVyY29ubmVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg YXJlIHVzZWQpCgpJdCBtaWdodCBiZSBiZXR0ZXIgdG8gY29tcHV0ZSB0aGUgZGlzdGFuY2Ug YmFzZWQgb24gcmVhbCBtZW1vcnkgYWNjZXNzCmNvc3RzLiAgVGhlIGFib3ZlIGlzIGp1c3Qg YW4gZXhhbXBsZS4KClRoZSBhYm92ZSBjb3N0cyBhdXRvbWF0aWNhbGx5IHRha2UgaW50byBh Y2NvdW50IHdoZW4gdGhlIG1haW4gbWVtb3J5Cm9mIGEgbm9kZSBoYXMgdG8gYmUgdXNlZCBv ciB3aGVuIGRhdGEgaXMgc2hhcmVkIGluIGNhY2hlcy4KCkEgc2Vjb25kIGNvc3QgZG9lcyBu b3QgdGFrZSB0aGUgc2hhcmluZyBvZiBkYXRhIGJldHdlZW4gcHJvY2Vzc29ycwppbnRvIGFj Y291bnQgYnV0IGluc3RlYWQgbWVhc3VyZXMgYWNjZXNzIHRvIGRhdGEgc3RvcmVkIGluIGEg c3BlY2lmaWMKbWVtb3J5IG5vZGUuCgogIFQxOkMxOlAxOk4xIC0+ICBNMSAgICAgICAgICAg ID09IDQKICBUMTpDMTpQMTpOMSAtPiAgTTIgICAgICAgICAgICA9PSA4CiAgVDE6QzE6UDE6 TjEgLT4gIE0zICAgICAgICAgICAgPT0gMTYKClRoaXMgY29zdCBjYW4gYmUgZGVyaXZlZCBm cm9tIHRoZSBtb3JlIGRldGFpbGVkIENQVS10by1DUFUgY29zdCBidXQKc2luY2UgdGhlcmUg Y2FuIGJlIG1lbW9yeSBub2RlcyB3aXRob3V0IENQVXMgYW5kIG9mdGVuIGl0IGlzIG5vdApz aGFyaW5nIGRhdGEgYmV0d2VlbiBDUFVzIChidXQgaW5zdGVhZCBhY2Nlc3MgdG8gc3RvcmVk IG1lbW9yeSkgd2hpY2gKaXMgaW1wb3J0YW50LCB0aGlzIHNpbXBsaWZpZWQgY29zdCBpcyB1 c2VmdWwsIHRvby4KCgpJbnRlcmZhY2VzCj09PT09PT09PT0KClRoZSBpbnRlcmZhY2VzIGNh biBiZSBncm91cGVkOgoKMS4gVG9wb2xvZ3kuICBQcm9ncmFtcyBuZWVkIHRvIGtub3cgYWJv dXQgdGhlIG1hY2hpbmUncyBsYXlvdXQuCgoyLiBQbGFjZW1lbnQvYWZmaW5pdHkKCiAgIH4g b2YgZXhlY3V0aW9uCiAgIH4gb2YgbWVtb3J5IGFsbG9jYXRpb24KCjMuIFJlYWxpZ25tZW50 OiBhZGp1c3QgcGxhY2VtZW50L2FmZmluaXR5IHRvIG5ldyBzaXR1YXRpb24KCjQ6IFRlbXBv cmFsIGNoYW5nZXMKCgoKVG9wb2xvZ3kgSW50ZXJmYWNlcwotLS0tLS0tLS0tLS0tLS0tLS0t CgpUd28gZGlmZmVyZW50IHR5cGVzIG9mIGluZm9ybWF0aW9uIG11c3QgYmUgYWNjZXNzaWJs ZToKCjEuICBlbnVtZXJhdGlvbiBvZiB0aGUgbWVtb3J5IGhpZXJhcmNoaWVzCgogICAgVGhp cyBpbmNsdWRlcyBTTVQvTUMKCjIuICBkaXN0YW5jZQoKClRoZSBmdW5kYW1lbnRhbCBkYXRh IHR5cGUgaXMgYSBiaXRzZXQgd2l0aCBlYWNoIGJpdCByZXByZXNlbnRpbmcgYQpwcm9jZXNz b3IuICBnbGliYyBkZWZpbmVzIGNwdV9zZXRfdC4gIFRoZSBzaXplIGlzIGFyYml0cmFyaWx5 IGxhcmdlLgpXZSBtaWdodCBpbnRyb2R1Y2UgaW50ZXJmYWNlcyB0byBkeW5hbWljYWxseSBh bGxvY2F0ZSB0aGVtLiAgRm9yIG5vdywKY3B1X3NldF90IGlzIGEgZml4ZWQtc2l6ZSB0eXBl LgoKQ1BVX1NFVFNJWkUgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgcHJvY2Vz c29ycyBpbiBjcHVfc2V0X3QKCkNQVV9TRVRfUyhjcHUsIHNldHNpemUsIGNwdXNldCkgICAg c2V0IGJpdCBjb3JyZXNwb25kaW5nIHRvIENQVSBpbiBDUFVTRVQKQ1BVX0NMUl9TKGNwdSwg c2V0c2l6ZSwgY3B1c2V0KSAgICBjbGVhciBiaXQgY29ycmVzcG9uZGluZyB0byBDUFUgaW4g Q1BVU0VUCkNQVV9JU1NFVF9TKGNwdSwgc2V0c2l6ZSwgY3B1c2V0KSAgY2hlY2sgd2hldGhl ciBiaXQgY29ycmVzcG9uZGluZyB0byBDUFUgaXMgc2V0CkNQVV9aRVJPX1Moc2V0c2l6ZSwg Y3B1c2V0KSAgICAgICAgY2xlYXIgc2V0CgpDUFVfRVFVQUxfUyhzZXRzaXplMSwgY3B1c2V0 MSwgc2V0c2l6ZTIsIGNwdXNldDIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgQ2hlY2sgd2hldGhlciB0aGUgc2V0IGJpdHMgaW4gdGhlIHR3bwogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHNldHMgbWF0Y2guCkNQVV9FUVVBTChjcHVzZXQxLCBj cHVzZXQyKSAgQ1BVX0VRVUFMX1Moc2l6ZW9mKGNwdV9zZXRfdCksIGNwdXNldDEsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNwdV9zZXRfdCks IGNwdXNldDIpCgoKQ1BVX1NFVChjcHUsIGNwdXNldCkgICAgICAgICBDUFVfU0VUX1MoY3B1 LCBzaXplb2YoY3B1X3NldF90KSwgY3B1c2V0KQpDUFVfQ0xSKGNwdSwgY3B1c2V0KSAgICAg ICAgIENQVV9DTFJfUyhjcHUsIHNpemVvZihjcHVfc2V0X3QpLCBjcHVzZXQpCkNQVV9JU1NF VChjcHUsIGNwdXNldCkgICAgICAgQ1BVX0lTU0VUX1MoY3B1LCBzaXplb2YoY3B1X3NldF90 KSwgY3B1c2V0KQpDUFVfWkVSTyhjcHVzZXQpICAgICAgICAgICAgIENQVV9aRVJPX1Moc2l6 ZW9mKGNwdV9zZXRfdCksIGNwdXNldCkKCgpXZSBwcm9iYWJseSBuZWVkIHRoZSBmb2xsb3dp bmc6CgpDUFVfQU5EX1MoZGVzdHNpemUsIGRlc3RzZXQsIHNldHNpemUsIHNyY3NldDEsIHNl dDJzaXplLCBzcmNzZXQyKQoKICAgbG9naWNhbCBBTkQgb2Ygc3Jjc2V0MSBhbmQgc3Jjc2V0 MiwgcGxhY2UgcmVzdWx0IGluIGRlc3RzcmMuICBNaWdodCBiZQogICBvbmUgb2YgdGhlIHNv dXJjZSBzZXRzCgpDUFVfT1JfUyhkZXN0c2l6ZSwgZGVzdHNldCwgc2V0MXNpemUsIHNyY3Nl dDEsIHNldDJzaXplLCBzcmNzZXQyKQogICBsb2dpY2FsIE9SIG9mIHNyY3NldDEgYW5kIHNy Y3NldDIsIHBsYWNlIHJlc3VsdCBpbiBkZXN0c3JjLiAgTWlnaHQgYmUKICAgb25lIG9mIHRo ZSBzb3VyY2Ugc2V0cwoKQ1BVX1hPUl9TKGRlc3RzaXplLCBkZXN0c2V0LCBzZXQxc2l6ZSwg c3Jjc2V0MSwgc2V0MnNpemUsIHNyY3NldDIpCiAgIGxvZ2ljYWwgWE9SIG9mIHNyY3NldDEg YW5kIHNyY3NldDIsIHBsYWNlIHJlc3VsdCBpbiBkZXN0c3JjLiAgTWlnaHQgYmUKICAgb25l IG9mIHRoZSBzb3VyY2Ugc2V0cwoKRm9yIGR5bmFtaWMgYWxsb2NhdGlvbjoKCl9fY3B1X21h c2sgICAgICAgICAgICAgdHlwZSBmb3IgYXJyYXkgZWxlbWVudCBpbiBjcHVfc2V0X3QKCkNQ VV9BTExPQ19TSVpFKGNvdW50KSAgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byByZXByZXNl bnQgY3B1X3NldF90CiAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggY2FuIGF0IGxlYXN0 IHJlcHJlc2VudCBDUFUgbnVtYmVyIENPVU5UCgpDUFVfQUxMT0MoY291bnQpICAgICAgIGFs bG9jYXRlIGNwdV9zZXRfdCB3aGljaCBjYW4gcmVwcmVzZW50IGF0IGxlYXN0CiAgICAgICAg ICAgICAgICAgICAgICAgcmVwcmVzZW50IENQVSBudW1iZXIgQ09VTlQKCkNQVV9GUkVFKGNw dXNldCkgICAgICAgZnJlZSBDUFUgc2V0IHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGggQ1BV X0FMTE9DKCkKCgpNYXliZSBpbnRlcmZhY2VzIHRvIGl0ZXJhdGUgb3ZlciBzZXQgYXJlIHVz ZWZ1bCAoQysrIGludGVyZmFjZSkuCgoKQSBzaW1pbGFyIHR5cGUgaXMgZGVmaW5lZCBmb3Ig dGhlIHJlcHJlc2VudGF0aW9uIG9mIG1lbW9yeSBub2Rlcy4KRWFjaCBwcm9jZXNzb3IgaXMg YXNzb2NpYXRlZCB3aXRoIG9uZSBtZW1vcnkgbm9kZSBhbmQgZWFjaCBtZW1vcnkgbm9kZQpj YW4gaGF2ZSB6ZXJvIG9yIG1vcmUgcHJvY2Vzc29ycyBhc3NvY2lhdGVkLgoKbWVtbm9kZV9z ZXRfdCAgICAgICAgYmFzaWMgdHlwZQoKTUVNTk9ERV9TRVRfUyhub2RlLCBtZW1ub2Rlc2l6 ZSwgbWVtbm9kZXNldCkKICAgICAgICAgICAgICAgICAgICBzZXQgYml0IGNvcnJlc3BvbmRp bmcgYml0IHRvIE5PREUgaW4gTUVNTk9ERVNFVApNRU1OT0RFX0NMUl9TKG5vZGUsIG1lbW5v ZGVzaXplLCBtZW1ub2Rlc2V0KQogICAgICAgICAgICAgICAgICAgIGNsZWFyIGJpdCBjb3Jy ZXNwb25kaW5nIHRvIE5PREUgaW4gTUVNTk9ERVNFVApNRU1OT0RFX0lTU0VUX1Mobm9kZSwg bWVtbm9kZXNpemUsIG1lbW5vZGVzZXQpCiAgICAgICAgICAgICAgICAgICAgY2hlY2sgd2hl dGhlciBiaXQgY29ycmVzcG9uZGluZyB0byBOT0RFIGlzIHNldApNRU1OT0RFX1pFUk9fUyht ZW1ub2Rlc2l6ZSwgbWVtbm9kZXNldCkgICAgICAgIGNsZWFyIHNldAoKTUVNTk9ERV9FUVVB TF9TKHNldHNpemUxLCBtZW1ub2Rlc2V0MSwgc2V0c2l6ZTIsIG1lbW5vZGVzZXQyKQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHdoZXRoZXIgdGhlIHNldCBi aXRzIGluIHRoZSB0d28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRz IG1hdGNoLgpXZSBwcm9iYWJseSBuZWVkIHRoZSBmb2xsb3dpbmc6CgpNRU1OT0RFX0FORF9T KGRlc3RzaXplLCBkZXN0c2V0LCBzZXRzaXplLCBzcmNzZXQxLCBzZXQyc2l6ZSwgc3Jjc2V0 MikKCiAgIGxvZ2ljYWwgQU5EIG9mIHNyY3NldDEgYW5kIHNyY3NldDIsIHBsYWNlIHJlc3Vs dCBpbiBkZXN0c3JjLiAgTWlnaHQgYmUKICAgb25lIG9mIHRoZSBzb3VyY2Ugc2V0cwoKTUVN Tk9ERV9PUl9TKGRlc3RzaXplLCBkZXN0c2V0LCBzZXQxc2l6ZSwgc3Jjc2V0MSwgc2V0MnNp emUsIHNyY3NldDIpCiAgIGxvZ2ljYWwgT1Igb2Ygc3Jjc2V0MSBhbmQgc3Jjc2V0MiwgcGxh Y2UgcmVzdWx0IGluIGRlc3RzcmMuICBNaWdodCBiZQogICBvbmUgb2YgdGhlIHNvdXJjZSBz ZXRzCgpNRU1OT0RFX1hPUl9TKGRlc3RzaXplLCBkZXN0c2V0LCBzZXQxc2l6ZSwgc3Jjc2V0 MSwgc2V0MnNpemUsIHNyY3NldDIpCiAgIGxvZ2ljYWwgWE9SIG9mIHNyY3NldDEgYW5kIHNy Y3NldDIsIHBsYWNlIHJlc3VsdCBpbiBkZXN0c3JjLiAgTWlnaHQgYmUKICAgb25lIG9mIHRo ZSBzb3VyY2Ugc2V0cwoKRm9yIGR5bmFtaWMgYWxsb2NhdGlvbjoKCl9fbWVtbm9kZV9tYXNr ICAgICAgICAgdHlwZSBmb3IgYXJyYXkgZWxlbWVudCBpbiBtZW1ub2RlX3NldF90CgpNRU1O T0RFX0FMTE9DX1NJWkUoY291bnQpICBzZWUgQ1BVX0FMTE9DX1NJWkUoKQoKTUVNTk9ERV9B TExPQyhjb3VudCkgICAgICAgc2VlIENQVV9BTExPQygpCgpNRU1OT0RFX0ZSRUUoY3B1c2V0 KSAgICAgICBzZWUgQ1BVX0ZSRUUoKQoKClRvIGRldGVybWluZSB0aGUgdG9wb2xvZ3k6CgoK aW50IE5VTUFfY3B1X2NvdW50KHVuc2lnbmVkIGludCAqY291bnRwKQoKICBSZXR1cm4gaW4g KkNPVU5UUCB0aGUgbnVtYmVyIG9mIG9ubGluZSBDUFVzLiAgVGhlCiAgc3lzY29uZihfU0Nf TlBST0NFU1NPUlNfT05MTikgaW5mb3JtYXRpb24gbWlnaHQgYmUgc3VmZmljaWVudCwgdGhv dWdoLgogIFJldHVybmluZyBhbiBlcnJvciBjYW4gc2lnbmFsIHRoYXQgdGhlIE5VTUEgc3Vw cG9ydCBpcyBub3QgcHJlc2VudC4KCgppbnQgTlVNQV9jcHVfYWxsKHNpemVfdCBkZXN0c2l6 ZSwgY3B1X3NldF90IGRlc3QpCgogIFNldCBiaXRzIGZvciBhbGwgKGN1cnJlbnRseSkgYXZh aWxhYmxlIENQVXMuCgoKaW50IE5VTUFfY3B1X3NlbGYoc2l6ZV90IGRlc3RzaXplLCBjcHVf c2V0X3QgZGVzdCkKCiAgU2V0IGJpdCBmb3IgY3VycmVudCBwcm9jZXNzb3IKCmludCBOVU1B X2NwdV9zZWxmX2lkeCh2b2lkKQoKICBSZXR1cm4gaW5kZXggaW4gY3B1X3NldF90IGZvciBj dXJyZW50IHByb2Nlc3Nvci4KCgppbnQgTlVNQV9jcHVfYXRfbGV2ZWwoc2l6ZV90IGRlc3Rz aXplLCBjcHVfc2V0X3QgZGVzdCwgc2l6ZV90IHNyY3NpemUsCiAgICAgICAgICAgICAgICAg ICAgICBjb25zdCBjcHVfc2V0X3Qgc3JjLCBpbnQgbGV2ZWwpCgogIEZpbGwgREVTVCB3aXRo IHRoZSBiaXRtYXAgd2hpY2ggaGFzIGFsbCB0aGUgYml0cyBjb3JyZXNwb25kaW5nIHRvCiAg cHJvY2Vzc29ycyB3aGljaCBhcmUgKGN1cnJlbnRseSkgTEVWRUwgb3IgbGVzcyBsZXZlbHMg YXdheSBmcm9tIGFueQogIHByb2Nlc3NvciBpbiBTUkMuCgogIEluIHRoZSBzaW1wbGVzdCBj YXNlIG9uIGJpdCBpcyBzZXQgaW4gU1JDLiAgTGV2ZWwgMSBtaWdodCBiZSB1c2VkCiAgdG8g ZmluZCBvdXQgYWxsIFNNVCBzaWJsaW5ncy4gIElmIG1vcmUgdGhhbiBvbmUgYml0IGlzIHNl dCBtb3JlIHRoZQogIHNlYXJjaCBpcyBzdGFydGVkIGZyb20gYWxsIG9mIHRoZW0uCgogIE5C OiB0aGUgaXMgImxldmVsIiwgbm90ICJkaXN0YW5jZSIuICBTaW5jZSB0aGUgZGlzdGFuY2Ug Y291bGQgYmUKICByZWxhdGl2ZSB0byB0aGUgYWNjZXNzIGNvc3QgdGhlcmUgbmVlZCBub3Qg YmUgc2VxdWVudGlhbCB2YWx1ZXMgd2hpY2gKICBjYW4gYmUgdXNlZCBpbiBpdGVyYXRpb24u ICBXaXRoIHRoaXMgaW50ZXJmYWNlIHdlIGNhbiBnbyBvbiBpbmNyZW1lbnRpbmcKICBsZXZl bCB1bnRpbCBubyBmdXJ0aGVyIHByb2Nlc3NvcnMgaXMgZm91bmQgd2hpY2ggY291bGQgYmUg c2lnbmFsbGVkCiAgYnkgYW4gcmV0dXJuIHZhbHVlLgoKCmludCBOVU1BX2NwdV9kaXN0YW5j ZShpbnQgKm1pbnAsIGludCAqbWF4cCwgc2l6ZV90IHNldHNpemUsCiAgICAgICAgICAgICAg ICAgICAgICBjb25zdCBjcHVfc2V0X3Qgc2V0KQoKICBEZXRlcm1pbmUgdGhlIG1pbmltdW0g YW5kIG1heGltdW0gZGlzdGFuY2UgYmV0d2VlbiBub2RlcyBpbiBTRVQuCgogIFRoaXMgaXMg dGhlIGRpc3RhbmNlIHdoaWNoIGlzIGEgbWVhc3VyZSBmb3IgdGhlIGNvc3Qgb2Ygc2hhcmlu ZwogIG1lbW9yeS4KCiAgVXN1YWxseSB0d28gYml0cyBhcmUgc2V0LiAgSWYgbW9yZSBiaXRz IGFyZSBzZXQgdGhlIHNwcmVhZCBiZXR3ZWVuIG1pbgogIGFuZCBtYXggaXMgdXNlZnVsLgoK CmludCBOVU1BX21lbV9tYWluX2xldmVsKGludCBjcHVpZHgsIGludCAqbGV2ZWxwKQoKICBS ZXR1cm4gaW4gKkxFVkVMUCB0aGUgbGV2ZWwgd2hlcmUgdGhlIGxvY2FsIG1haW4gbWVtb3J5 IGZvciBwcm9jZXNzb3IKICBDUFVJRFggaXMuCgoKaW50IE5VTUFfbWVtbm9kZV9jb3VudCh1 bnNpZ25lZCBpbnQgKmNvdW50cCkKCiAgUmV0dXJuIGluICpDT1VOVFAgdGhlIG51bWJlciBv ZiBvbmxpbmUgbWVtbm9kZXMuCgoKaW50IE5VTUFfbWVtbm9kZV9hbGwoc2l6ZV90IGRlc3Rz aXplLCBtZW1ub2RlX3NldF90IGRlc3QpCgogIFNldCBiaXRzIGZvciBhbGwgKGN1cnJlbnRs eSkgYXZhaWxhYmxlIG1lbW5vZGVzLgoKCmludCBOVU1BX2NwdV90b19tZW1ub2RlKHNpemVf dCBjcHVzZXRzaXplLCBjb25zdCBjcHVfc2V0X3QgY3B1c2V0LAogICAgICAgICAgICAgICAg ICAgICAgICBzaXplX3QgbWVtbm9kZXNpemUsIG1lbW5vZGVfc2V0X3QgbWVtbm9kZXNldCkK CiAgU2V0IGJpdHMgaW4gTUVNTk9ERVNFVCB3aGljaCBjb3JyZXNwb25kIHRvIG1lbW9yeSBu b2RlIHdoaWNoIGFyZSBsb2NhbAogIHRvIGFueSBvZiB0aGUgQ1BVcyByZXByZXNlbnRlZCBi eSBiaXRzIHNldCBpbiBDUFVTRVQuCgoKaW50IE5VTUFfbWVtbm9kZV90b19jcHUoc2l6ZV90 IG1lbW5vZGVzaXplLCBjb25zdCBtZW1ub2RlX3NldF90IG1lbW5vZGVzZXQsCiAgICAgICAg ICAgICAgICAgICAgICAgIHNpemVfdCBjcHVzZXRzaXplLCBjcHVfc2V0X3QgY3B1c2V0KQoK ICBTZXQgYml0cyBpbiBDUFVTRVQgd2hpY2ggY29ycmVzcG9uZCB0byBDUFVzIHdoaWNoIGFy ZSBsb2NhbAogIHRvIGFueSBvZiB0aGUgbWVtb3J5IG5vZGVzIHJlcHJlc2VudGVkIGJ5IGJp dHMgc2V0IGluIE1FTU5PREVTRVQuCgoKaW50IE5VTUFfbWVtX2Rpc3RhbmNlKGludCAqbWlu cCwgaW50ICptYXhwLCB2b2lkICpwdHIsIHNpemVfdCBzZXRzaXplLAogICAgICAgICAgICAg ICAgICAgICAgY29uc3QgbWVtbm9kZV9zZXRfdCBzZXQpCgogIERldGVybWluZSB0aGUgbWlu aW11bSBhbmQgbWF4aW11bSBsZXZlbCBkaWZmZXJlbmNlIHRvIHRoZSBtZW1vcnkgcG9pbnRl ZAogIHRvIGJ5IFB0ciBmcm9tIGFueSBvZiB0aGUgQ1BVcyBpbiBTRVQuCgogIFVzdWFsbHkg b25lIGJpdCBpcyBzZXQgaW4gU0VULgoKICBJZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICpN SU5QIGFuZCB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbQogIE5VTUFfbWVtX21haW5fbGV2ZWwo KSBpcyB6ZXJvLCB0aGUgbWVtb3J5IGlzIGxvY2FsIHRvIGF0IGxlYXN0IG9uZSBDUFUKICBp biBzZXQuICBJZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICpNQVhQIGFuZCB0aGUgTlVNQV9t ZW1fbWFpbl9sZXZlbCgpCiAgdmFsdWUgaXMgemVybywgdGhlIG1lbW9yeSBpcyBsb2NhbCB0 byBhbGwgQ1BVcy4KCgppbnQgTlVNQV9jcHVfbWVtX2Nvc3QoaW50ICptaW5wLCBpbnQgKm1h eHAsIHNpemVfdCBjcHVzZXRzaXplLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3B1 X3NldF90IGNwdXNldCwgc2l6ZV90IG1lbXNldHNpemUsCiAgICAgICAgICAgICAgICAgICAg ICBjb25zdCBtZW1ub2RlX3NldF90IG1lbW5vZGVzZXQpCgogIENvbXB1dGUgbWluaW11bSBh bmQgbWF4aW11bSBhY2Nlc3MgY29zdHMgb2YgcHJvY2Vzc29ycyBpbiBDUFVTRVQgdG8KICBh bnkgb2YgdGhlIG1lbW9yeSBub2RlcyBpbiBNRU1OT0RFU0VULgoKCkV4YW1wbGU6IERldGVy bWluZSBDUFVzIG9uIG5laWdoYm9yICJub2RlcyIKCiAgY3B1X3NldF90IGxldmVsMDsKICBD UFVfU0VUKGxldmVsMCwgdGhlX2NwdSk7CgogIGNwdV9zZXRfdCBsZXZlbE47CiAgTlVNQV9j cHVfYXRfbGV2ZWwobGV2ZWxOLCBsZXZlbDAsIE4pOwoKICBjcHVfc2V0X3QgbGV2ZWxOcDE7 CiAgTlVNQV9jcHVfYXRfbGV2ZWwobGV2ZWxOcDEsIGxldmVsMCwgTiArIDEpOwoKICBDUFVf WE9SKGxldmVsTnAxLCBsZXZlbE5wMSwgbGV2ZWxOKTsKCkdpdmVuIGEgQ1BVIGluZGV4LCB0 aGUgQ1BVcyBhdCBsZWF2ZWwgTiBhcmUgZGV0ZXJtaW5lZCwgdGhlbiB0aG9zZSBhdApsZXZl bCBOKzEuICBUaGUgZGlmZmVyZW5jZSAoWE9SKSBpcyB0aGUgc2V0IG9mIHByb2Nlc3NvcnMg YXQgbGV2ZWwgTisxCmZyb20gdGhlIGdpdmVuIENQVS4KCgoKTWVtb3J5IEluZm9ybWF0aW9u Ci0tLS0tLS0tLS0tLS0tLS0tLQoKCkl0IGlzIG5lY2Vzc2FyeSB0byBrbm93IHNvbWV0aGlu ZyBhYm91dCB0aGUgbWVtb3J5IGF0IGEgZ2l2ZW4gbGV2ZWwuCkZvciBpbnN0YW5jZSwgbGV2 ZWwgMSBtaWdodCBiZSAibGV2ZWwgMSBDUFUgY2FjaGUiLCBsZXZlbCA0IG1pZ2h0IGJlCiJt YWluIG1lbW9yeSIuCgppbnQgTlVNQV9tZW1faW5mb19zaXplKGludCBsZXZlbCwgaW50IGNw dWlkeCwgTlVNQV9zaXplX3QgKnNpemUpCmludCBOVU1BX21lbV9pbmZvX2Fzc29jaWF0aXZp dHkoaW50IGxldmVsLCBpbnQgY3B1aWR4LCBOVU1BX3NpemVfdCAqc2l6ZSkKaW50IE5VTUFf bWVtX2luZm9fbGluZXNpemUoaW50IGxldmVsLCBpbnQgY3B1aWR4LCBOVU1BX3NpemVfdCAq c2l6ZSkKCipfc2l6ZSBhcHBsaWVzIHRvIGFsbCBraW5kcyBvZiBtZW1vcnkuICBfYXNzb2Np YXRpdml0eSBhbmQgX2xpbmVzaXplCm1haW5seSBhcHBseSB0byBjYWNoZXMuICBNYXliZSBp dCdzIHVzZWZ1bCBmb3IgbWFpbiBtZW1vcnksIHRvby4gIElmIG5vdAphbiBlcnJvciBjb3Vs ZCBiZSByZXR1cm5lZC4KCgppbnQgTlVNQV9tZW1fdG90YWwoaW50IG1lbW5vZGVpZHgsIE5V TUFfc2l6ZV90ICpzaXplKQppbnQgTlVNQV9tZW1fYXZhaWwoaW50IG1lbW5vZGVpZHgsIE5V TUFfc2l6ZV90ICpzaXplKQoKVGhlIHRvdGFsIG1lbW9yeSBhbmQgYXZhaWxhYmxlIG1lbW9y eSBvbiBtZW1vcnkgbm9kZSBNRU1OT0RFSURYLgoKClBsYWNlbWVudC9BZmZpbml0eSBJbnRl cmZhY2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppbnQgTlVNQV9tZW1fc2V0 X2hvbWUocGlkX3QgcGlkLCBzaXplX3Qgc2V0c2l6ZSwgbWVtbm9kZV9zZXRfdCBzZXQpCgog IEluc3RhbGwgU0VUIGFzIG1hc2sgb2YgcHJlZmVycmVkIG5vZGVzIGZvciBtZW1vcnkgYWxs b2NhdGlvbiBmb3IgcHJvY2VzcwogIFBJRC4gIFRoaXMgYXBwbGllcyBvbmx5IHRvIGRpcmVj dGx5IGF0dGFjaGVkIG1lbW9yeSAoTlVNQV9tZW1fbWFpbl9sZXZlbCgpKS4KICBJZiBtb3Jl IHRoYW4gb25lIGJpdCBpcyBzZXQgaW4gU0VUIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBjYW4g YmUgYnJlYWQKICBhY2Nyb3NzIGFsbCB0aGUgbG9jYWwgbWVtb3J5IGZvciB0aGUgQ1BVcyBp biB0aGUgc2V0LgoKaW50IE5VTUFfbWVtX2dldF9ob21lKHBpZF90IHBpZCwgc2l6ZV90IHNl dHNpemUsIG1lbW5vZGVfc2V0X3Qgc2V0KQoKICBSZXR1cm4gY3VycmVudGx5IGluc3RhbGxl ZCBwcmVmZmVycmVkIG5vZGUgc2V0LgoKCmludCBOVU1BX21lbV9zZXRfaG9tZV90aHJlYWQo cHRocmVhZF90IHRoLCBzaXplX3Qgc2V0c2l6ZSwgbWVtbm9kZV9zZXRfdCBzZXQpCgogIFNp bWlsYXIsIGJ1dCBsaW1pdGVkIHRvIHRoZSBnaXZlbiB0aHJlYWQuCgppbnQgTlVNQV9tZW1f Z2V0X2hvbWVfdGhyZWFkKHB0aHJlYWRfdCB0aCwgc2l6ZV90IHNldHNpemUsIG1lbW5vZGVf c2V0X3Qgc2V0KQoKICBMaWtld2lzZSB0byByZXRyaWV2ZSB0aGUgaW5mb3JtYXRpb24uCgoK aW50IE5VTUFfYWZmX3NldF9jcHUocGlkX3QgcGlkLCBzaXplX3Qgc2V0c2l6ZSwgY3B1X3Nl dF90IHNldCwgaW50IGhhcmQpCgogIFNldCBhZmZpbml0eSBtYXNrIGZvciBwcm9jZXNzIFBJ RCB0byB0aGUgcHJvY2Vzc29ycyBpbiBTRVQuICBUaGVyZSBhcmUKICB0d28gbWFza3M6IHRo ZSBoYXJkIGFuZCB0aGUgc29mdC4gIE5vIHByb2Nlc3NvciBub3QgaW4gdGhlIGhhcmQgbWFz awogIGNhbiBldmVyIGJlIHVzZWQuICBUaGUgc29mdCBtYXNrIGlzIGEgcmVjb21tZW5kYXRp b24uCgppbnQgTlVNQV9hZmZfZ2V0X2NwdShwaWRfdCBwaWQsIHNpemVfdCBzZXRzaXplLCBj cHVfc2V0X3Qgc2V0LCBpbnQgaGFyZCkKCiAgVGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJmYWNl IHRvIGdldCB0aGUgZGF0YS4KCmludCBOVU1BX2FmZl9zZXRfY3B1X3RocmVhZChwdGhyZWFk X3QgdGgsIHNpemVfdCBzZXRzaXplLCBjcHVfc2V0X3Qgc2V0LAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgaW50IGhhcmQpCgogIFNpbWlsYXIgdG8gTlVNQV9hZmZfc2V0X2NwdSgp IGJ1dCBmb3IgdGhlIGdpdmVuIHRocmVhZC4KCmludCBOVU1BX2FmZl9nZXRfY3B1X3RocmVh ZChwdGhyZWFkX3QgdGgsIHNpemVfdCBzZXRzaXplLCBjcHVfc2V0X3Qgc2V0LAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgaW50IGhhcmQpCgogIEdldCB0aGUgZGF0YS4KCgpUaGUg ImhhcmQiIHZhcmlhbnRzIGFyZSBiYXNpY2FsbHkgdGhlIGV4aXN0aW5nIHNjaGVkX3NldGFm ZmluaXR5IGFuZApwdGhyZWFkX3NldGFmZmluaXR5LiAgVGhlIHNvZnQgYW5kIGhhcmQgbWFw cyBhcmUgbWFpbnRhaW5lZCBzZXBhcmF0ZWx5LgoKCnZvaWQgKk5VTUFfbWVtX2FsbG9jX2xv Y2FsKE5VTUFfc2l6ZV90IHNpemUsIGludCBzcGlsbCwgaW50IGludGVybGVhdmUpCgogIEFs bG9jYXRlIFNJWkUgYnl0ZXMgbG9jYWwgdG8gdGhlIGN1cnJlbnQgcHJvY2VzcywgcmVnYXJk bGVzcyBvZiB0aGUKICByZWdpc3RlcmVkIHByZWZlcnJlZCBtZW1vcnkgbm9kZSBtYXNrLiAg VW5sZXNzIFNQSUxMIGlzIG5vbnplcm8gdGhlCiAgYWxsb2NhdGlvbiBmYWlscyBpZiBubyBt ZW1vcnkgYXZhaWxhYmxlIGxvY2FsbHkuICBJZiBTUElMTCBpcyBub256ZXJvCiAgbWVtb3J5 IGF0IGdyZWF0ZXIgZGlzdGFuY2VzIGlzIGNvbnNpZGVycy4gIFRoaXMgaXMgYSBjb252ZW5p ZW5jZQogIGludGVyZmFjZSwgaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgdXNpbmcgTlVNQV9t ZW1fYWxsb2MoKSBiZWxvdy4KCiAgUG9zc2libGUgZXh0ZW5zaW9uOiBTUElMTCBjb3VsZCBz cGVjaWZ5IGhvdyBmYXIgYXdheSB0aGUgbWVtb3J5IGNhbgogIGJlIHNwaWxsZWQuICBGb3Ig aW5zdGFuY2UsIHRoZSB2YWx1ZSAxIGNvdWxkIG1lYW4gb25lIE5VTUEgbm9kZSB3YXksCiAg MiBmb3IgdXAgdG8gMiBOVU1BIG5vZGVzIGF3YXkgZXRjLgoKICBJZiBJTlRFUkxFQVZFIGlz IG5vbnplcm8gdGhlIG1lbW9yeSBpcyBhbGxvY2F0ZWQgaW4gaW50ZXJsZWF2ZWQgZm9ybQog IGZyb20gYWxsIHRoZSBub2RlcyBzcGVjaWZpZWQuICBPdGhlcndpc2UgYWxsIG1lbW9yeSBj b21lcyBmcm9tIG9uZSBub2RlLgoKCnZvaWQgKk5VTUFfbWVtX2FsbG9jX3ByZWZlcnJlZChO VU1BX3NpemVfdCBzaXplLCBpbnQgc3BpbGwsIGludCBpbnRlcmxlYXZlKQoKICBBbGxvY2F0 ZSBtZW1vcnkgYWNjb3JkaW5nIHRvIHRoZSBtYXNrIHJlZ2lzdGVyZWQgd2l0aCBOVU1BX2Fm Zl9tZW1faG9tZQogIG9yIE5VTUFfYWZmX21lbV9ob21lX3RocmVhZC4gIFNQSUxMIGFuZCBJ TlRFUkxFQVZFIGFyZSBoYW5kbGVkIGFzIGluCiAgTlVNQV9tZW1fYWxsb2NfbG9jYWwuCgoK dm9pZCAqTlVNQV9tZW1fYWxsb2MoTlVNQV9zaXplX3Qgc2l6ZSwgc2l6ZV90IHNldHNpemUs IG1lbW5vZGVfc2V0X3Qgc2V0LAogICAgICAgICAgICAgICAgICAgICBpbnQgc3BpbGwsIGlu dCBpbnRlcmxlYXZlKQoKICBBbGxvY2F0ZSBtZW1vcnkgb24gYW55IG9mIHRoZSBub2RlcyBp biBTRVQKCgpXaGF0IGNodW5rcyBvZiBtZW1vcnkgY2FuIGJlIGFsbG9jYXRlZCBpcyBkZWJh dGVibGUuICBJdCBtaWdodCBtYWtlIHNlbnNlCnRvIHJlc3RyaWN0IGFsbCBzaXplcyB0byBw YWdlIHNpemUgZ3JhbnVsYXJpdHkuICBPciBhdCBsZWFzdCByb3VuZCBhbGwKdmFsdWVzIHVw LgoKPz8/IFNob3VsZCB0aGUgZ3JhbnVsYXJpdHkgYmUgY29uZmlndXJhYmxlID8/PwoKCnZv aWQgTlVNQV9tZW1fZnJlZSh2b2lkICopCgogIE9idmlvdXNseSwgZnJlZSB0aGUgbWVtb3J5 LgoKCmludCBOVU1BX21lbV9nZXRfbm9kZXModm9pZCAqYWRkciwgc2l6ZV90IGRlc3RzaXpl LCBtZW1ub2RlX3NldF90IGRlc3QpCgogIFRoZSBmdW5jdGlvbiB3aWxsIHNldCB0aGUgYml0 cyBpbiBERVNUIHdoaWNoIHJlcHJlc2VudCBwcm9jZXNzb3JzCiAgd2hpY2ggYXJlIGxvY2Fs IHRvIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSBBRERSLgoKCmludCBOVU1BX21lbV9iaW5k KHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBzaXplX3Qgc2V0c2l6ZSwgbWVtbm9kZV9zZXRf dCBzZXQsCiAgICAgICAgICAgICAgICAgIGludCBzcGlsbCkKCiAgVGhlIG1lbW9yeSBpbiB0 aGUgcmFuZ2Ugb2YgW2FkZHIsYWRkcitzaXplKSBpbiB0aGUgY3VycmVudCBwcm9jZXNzIGlz IGJvdW5kCiAgdG8gb25lIG9mIHRoZSBub2RlcyByZXByZXNlbnRlZCBpbiBTRVQuICBVbmxl c3MgU1BJTEwgaXMgbm9uemVybyAgdGhlCiAgY2FsbCB3aWxsIGZhaWwgaWYgbm8gbWVtb3J5 IGlzIGF2YWlsYWJsZSBvbiB0aGUgbm9kZXMuCgoKaW50IE5VTUFfbWVtX2dldF9ub2Rlcyh2 b2lkICphZGRyLCBzaXplX3Qgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qg ZGVzdHNpemUsIG1lbW5vZGVfc2V0X3QgZGVzdCkKCiAgVGhlIGZ1bmN0aW9uIHJldHVybnMg aW5mb3JtYXRpb24gYWJvdXQgdGhlIG5vZGVzIG9uIHdoaWNoIHRoZSBtZW1vcnkKICBpbiB0 aGUgcmFuZ2UgW2FkZHIsYWRkcitzaXplKSBpcyBhbGxvY2F0ZWQuICBJZiB0aGUgbWVtb3J5 IGlzIG5vdCBjb250aW5vdXNseQogIGFsbG9jYXRlZCAob3IgaW4gY2FzZSBvZiBtdWx0aS10 aHJlYWRlZCBvciBtdWx0aS1jb3JlIHByb2Nlc3NvcnMpIHRoaXMgY2FuCiAgbWVhbiBtb3Jl IHRoYW4gb25lIGJpdCBpcyBzZXQgaW4gdGhlIHJlc3VsdCBzZXQuCgoKUmVhbGlnbm1lbnQK LS0tLS0tLS0tLS0KCkNQVSBzZXRzIGNhbiBiZSByZWFsbGlnbmVkIGF0IGFueSB0aW1lIHVz aW5nIE5VTUFfYWZmX2NwdSgpIGV0Yy4KCgp2b2lkICpOVU1BX21lbV9yZWxvY2F0ZSh2b2lk ICpwdHIsIHNpemVfdCBzZXRzaXplLCBtZW1ub2RlX3NldF90IHNldCkKCiAgcmVsb2NhdGUg dGhlIGNvbnRlbnQgb2YgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJlIFBUUiB0byBhIG5vZGUg aW4gU0VULgogIFJldHVybiB0aGUgbmV3IGFkZHJlc3MuCgoKVGVtcG9yYWwgQ2hhbmdlcwot LS0tLS0tLS0tLS0tLS0tCgpUaGUgbWFjaGluZSBjb25maWd1cmF0aW9uIGNhbiBjaGFuZ2Ug b3ZlciB0aW1lLiAgTmV3IHByb2Nlc3NvcnMgY2FuCmNvbWUgb25saW5lLCBvdGhlcnMgZ28g b2ZmbGluZSwgbWVtb3J5IGJhbmtzIGFyZSBzd2l0Y2hlZCBvbiBvciBvZmYuClRoZSBhYm92 ZSBpbnRlcmZhY2VzIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudGx5IGFj dGl2ZQpjb25maWd1cmFpdG9uLiAgVGhlcmUgaXMgcG9zc2libHkgdGhlIGRhbmdlciB0aGF0 IGRhdGEgc2V0cyBmcm9tCmRpZmZlcmVudCBjb25maWd1cmF0aW9ucyBhcmUgdXNlZC4KCk9u ZSBzb2x1dGlvbiB3b3VsZCBiZSB0byByZXF1aXJlIGFuIG9wZW4oKS1saWtlIGZ1bmN0aW9u IHdoaWNoCnJldHJpZXZlcyBhbGwgdGhlIGluZm9ybWF0aW9uIGluIG9uZSBzdGVwIGFuZCBh bGwgdGhlIGludGVyZmFjZXMKbWVudGlvbmVkIGFib3ZlIHdpbGwgdXNlIHRoYXQgY2FjaGVk IGRhdGEuICBUaGUgcHJvYmxlbSB3aXRoIHRoaXMgaXMKdGhhdCBpZiB0aGUgY29uZmlndXJh dGlvbiBjaGFuZ2VzIHRoZSBkZWNpc2lvbiBtYWRlIHVzaW5nIHRoZSBjYWNoZWQKZGF0YSBp cyBvdXRkYXRlZC4gIFNlY29uZCwgdGhlIGFtb3VudCBvZiBkYXRhIHdoaWNoIGlzIG5lZWRl ZCBjYW4gYmUKYmlnIG9yLCBtb3JlIGxpa2VseSwgZXhwZW5zaXZlIHRvIGdldCBldmVuIHRo b3VnaCBvbmx5IHBhcnRzIG9mIHRoZQppbmZvcm1hdGlvbiBhcmUgdXNlZC4KCkEgZGlmZmVy ZW50IHBvc3NpYmlsaXR5IHdvdWxkIGJlIHRvIHByb3ZpZGUgYSBzaW1wbGUgY2FsbGJhY2sg d2hpY2gKcmV0dXJucyBhIHVuaXF1ZSBJRCBmb3IgZWFjaCBjb25maWd1cmF0aW9uLiAgQW55 IHVzZSBvZiB0aGUgdG9wb2xvZ3kKaW50ZXJmYWNlcyB3b3VsZCB0aGVuIHN0YXJ0IGFuZCBl bmQgd2l0aCBhIGNhbGwgdG8gZnVuY3Rpb24gdG8gZ2V0IHRoZQpJRC4gIElmIHRoZSB0d28g dmFsdWVzIGRpZmZlciwgdGhlIGNvbGxlY3RlZCBkYXRhIGlzIGluY29uc2lzdGVudC4KVGhp cyB3b3VsZCBlbGltaW5hdGUgdGhlIHNlY29uZCBwcm9ibGVtIG1lbnRpb25lZCBhYm92ZSwg YnV0IG5vdCB0aGUKZmlyc3QuCgpBIHRoaXJkIHBvc3NpYmlsaXR5IGlzIHRvIHJlZ2lzdGVy IGEgc2lnbmFsIGhhbmRsZXIgd2l0aCB0aGUga2VybmVsIHNvCnRoYXQgdGhlIGtlcm5lbCBj YW4gc2VuZCBhIHNpZ25hbCB3aGVuZXZlciB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzLgpB bHRlcm5hdGl2ZWx5LCBhIC9wcm9jL2ZpbGUgb3IgbmV0bGluayBzb2NrZXQgY291bGQgYmUg dXNlZCB0byBzaWduYWwKaW50ZXJlc3RlZCBwYXJ0aWVzICh3aG8gdGhlbiBjb3VsZCBzZW5k IGEgc2lnbmFsIGlmIG5lY2Vzc2FyeSkuICBVc2luZwpkLWJ1cyBpcyBwb3Nzc2libGUsIHRv by4gIFRoaXMgbm90aWZpY2F0aW9uIGNvdWxkIG5vdCBvbmx5IGJlIHVzZWQgdG8Kbm90aWNl IGNoYW5nZXMgd2hpbGUgcmVhZGluZyB0aGUgdG9wb2xvZ3ksIGl0IGNvdWxkIGFsc28gZ2V0 IGEgcHJvY2VzcwphdCBhbnkgdGltZSB0byByZWNvbnNpZGVyIHRoZSBjdXJyZW50IGRlY2lz aW9uIGFuZCByZW9yZ2FuaXplIHRoZQpwcm9jZXNzb3IvbWVtb3J5IHVzYWdlLgoKRnJvbSB0 aGVzZSBwb3NzaWJpbGl0aWVzIHRoZSBkLWJ1cyByb3V0ZSBzZWVtcyB0byBiZSB0aGUgbW9z dAphcHBlYWxpbmcgc2luY2UgZC1idXMgYWxyZWFkeSByZWNlaXZlcyB0aGlzIGtpbmQgb2Yg aW5mb3JtYXRpb24gZnJvbQp0aGUga2VybmVsIGFuZCBhbnkgbnVtYmVyIG9mIHByb2Nlc3Nl cyBjYW4gcmVjZWl2ZSB0aGVtLgoKCkNvbXBhcmlzb24gd2l0aCBsaWJudW1hCj09PT09PT09 PT09PT09PT09PT09PT09Cgpub2RlbWFza190OgoKICBVbmxpa2Ugbm9kZW1hc2tfdCwgY3B1 X3NldF90IGlzIGFscmVhZHkgaW4gdXNlIGluIGdsaWJjLiAgVGhlIGFmZmluaXR5CiAgaW50 ZXJmYWNlcyB1c2UgaXQgc28gdGhlcmUgaXMgbm90IG5lZWQgdG8gZHVwbGljYXRlIHRoZSBm dW5jdGlvbmFsaXR5CiAgYW5kIG5vIG5lZWQgdG8gZGVmaW5lIG90aGVyIHZlcnNpb25zIG9m IHRoZSBhZmZpbml0eSBpbnRlcmZhY2VzLgoKICBGdXJ0aGVybW9yZSwgdGhlIG5vZGVtYXNr X3QgdHlwZSBpcyBvZiBmaXhlZCBzaXplLiAgVGhlIGNwdV9zZXRfdAogIGhhcyBhIGNvbnZl bmllbmNlIHZlcnNpb24gd2hpY2ggaXMgb2YgZml4ZWQgc2l6ZSBidXQgY2FuIGJlIG9mCiAg YXJiaXRyYXJ5IHNpemUuICBUaGlzIGlzIGltcG9ydGFudCBoYXMgYSBiaXQgb2YgbWF0aCBz aG93czoKCiAgICBBc3N1bWUgYSBwcm9jZXNzb3Igd2l0aCBmb3VyIGNvcmVzIGFuZCA0IHRo cmVhZHMgZWFjaAoKICAgIEZvdXIgc3VjaCBwcm9jZXNzb3JzIG9uIGEgc2luZ2xlIE5VTUEg bm9kZQoKICAgIFRoYXQncyBhIHRvdGFsIG9mIDY0IHZpcnR1YWwgcHJvY2Vzc29ycyBmb3Ig b25lIG5vZGUuICBXaXRoIDMyIHN1Y2gKICAgIG5vZGVzIHRoZSAxMDI0IHByb2Nlc3NvcnMg b2YgY3B1X3NldF90IHdvdWxkIGJlIGZpbGxlZC4gIEFuZCB3ZSBkbwogICAgbm90IHdhbnQg dG8gbWVudGlvbiB0aGUgdG90YWwgb2YgNjQgc3VwcG9ydGVkIHByb2Nlc3NvcnMgaW4gbGli bnVtYSdzCiAgICBub2RlbWFza190LiAgVG8gYmUgZnV0dXJlIHNhZmUgdGhlIGJpdHNldCBz aXplIG11c3QgYmUgdmFyaWFibGUuCgoKICBJbiBhZGRpdGlvbiB0aGVyZSBpcyB0aGUgdHlw ZSBtZW1ub2RlX3NldF90IHdoaWNoIHJlcHJlc2VudHMgbWVtb3J5IG5vZGUuCiAgSXQgaXMg cG9zc2libGUgdG8gaGF2ZSBtZW1vcnkgbm9kZXMgd2l0aG91dCBwcm9jZXNzb3JzIHNvIG9u bHkgYSBjcHVfc2V0X3QKICBpcyBub3Qgc3VmZmljaWVudC4KCgpub2RlbWFza196ZXJvKCkg IC0tPiAgQ1BVX1pFUk8oKSB3aGljaCBpcyBhbHJlYWR5IGluIGdsaWJjCm5vZGVtYXNrX3Nl dCgpICAgLS0+ICBDUFVfU0VUKCkgZGl0dG8Kbm9kZW1hc2tfY2xyKCkgICAtLT4gIENQVV9D TFIoKSBkaXR0bwpub2RlbWFza19pc3NldCgpIC0tPiAgQ1BVX0lTU0VUKCkgZGl0dG8KCm5v ZGVtYXNrX2VxdWFsKCkgLS0+ICBDUFVfRVFVQUwoKQoKUGx1cyB0aGUgYXBwcm9wcmlhdGUg bWFjcm9zIHRvIGhhbmRsZSBtZW1ub2RlX3QuCgoKbnVtYV9hdmFpbGFibGUoKSAtLT4gIE5V TUFfY3B1X2NvdW50KCkgIGZvciBpbnN0YW5jZQoKbnVtYV9tYXhfbm9kZSgpICAtLT4gIGVp dGhlciBOVU1BX2NwdV9jb3VudCgpCiAgICAgICAgICAgICAgICAgICAgICBvciBOVU1BX0NQ VV9hbGwoKQoKbnVtYV9ob21lbm9kZSgpICAtLT4gIE5VTUFfbWVtX2dldF9ob21lKCkgb3Ig TlVNQV9hZmZfZ2V0X2NwdSgpCiAgICAgICAgICAgICAgICAgICAgICBvciBOVU1BX2FmZl9n ZXRfY3B1X3RocmVhZCgpIG9yIE5VTUFfY3B1X3NlbGYoKQoKICBUaGUgY29uY2VwdCBvZiBh IG5ldmVyLWNoYW5naW5nIGhvbWUgbm9kZSBzdHJpa2VzIG1lIGFzIG9kZC4gIEVzcGVjaWFs bHkKICB3aXRoIGhvdC1zd2FwIENQVXMuICBEZWNsYXJpbmcgb25lIG9yIG1vcmUgQ1BVcyB0 aGUgaG9tZSBub2RlcyBpcyBmaW5lLgogIFRoZSBkZWZhdWx0IGNhbiBiZSBjcHUgdGhlIHRo cmVhZCBzdGFydGVkIG9uLgoKCm51bWFfbm9kZV9zaXplKCkgLS0+IE5VTUFfbWVtX2F2YWls KCkKCiAgVGhlIG1haW4gbWVtb3J5IGlzIGF0IGxldmVsIE5VTUFfbWVtX21haW5fbGV2ZWwo KQoKbnVtYV9wYWdlc2l6ZSgpICAtLT4gIG5vdGhpbmcgeWV0IHNpbmNlIHVzZWxlc3MKCiAg SXQgaXMgbm90IGNsZWFyIHRvIG1lIHdoYXQgdGhpcyByZWFsbHkgc2hvdWxkIHRvLiAgSS5l LiwgdGhlIGludGVyZmFjZQogIG9mIG51bWFfcGFnZXNpemUoKSBzZWVtcyB1c2VsZXNzLiAg V2l0aCBubyBhcmd1bWVudCwgdGhlIHBhZ2VzaXplIHdoaWNoCiAgY2FuIGJlIGRldGVybWlu ZSBpcyB0aGUgcGFnZXNpemUgb2YgdGhlIHN5c3RlbS4gIFdoZW4gaHVnZXBhZ2VzIGV0Ywog IGNvbWUgaW50byBwbGF5IGl0IGlzIG5lY2Vzc2FyeSB0byBwcm92aWRlIGEgcG9pbnRlciB0 byBhIG1lbW9yeSBhZGRyZXNzCiAgc28gaXQgY2FuIGJlIGRldGVybWluZWQgd2hpY2gga2lu ZCBvZiBtZW1vcnkgaXQgaXMuCgo/Pz8gU2hvdWxkIHdlIGFkZCBOVU1BX3NpemVfdCBOVU1B X3BhZ2VzaXplKHZvaWQgKmFkZHIpID8/PwoKCm51bWFfYWxsX25vZGVzIC0tPiBnbG9iYWwg dmFyaWFibGVzIGFyZSAqRVZJTCoKCiAgVXNlIE5VTUFfY3B1X2FsbCgpCgpudW1hX25vX25v ZGVzICAtLT4gZ2xvYmFsIHZhcmlhYmxlcyBhcmUgKkVWSUwqCgogIGNwdV9zZXRfdCBzOwog IENQVV9aRVJPKHMpOwoKbnVtYV9iaW5kKCkgICAgLS0+IE5VTUFfbWVtX3NldF9ob21lKCkg b3IgTlVNQV9tZW1fc2V0X2hvbWVfdGhyZWFkKCkKICAgICAgICAgICAgICAgICAgIG9yIE5V TUFfYWZmX3NldF9jcHUoKCkgb3IgTlVNQV9hZmZfc2V0X2NwdV90aHJlYWQoKQoKICBudW1h X2JpbmQoKSBtaXNzZXMgQSBMT1Qgb2YgZmxleGliaWxpdHkuICBGaXJzdCwgbWVtb3J5IGFu ZCBDUFUgbmVlZAogIG5vZGUgYmUgdGhlIHNhbWUgbm9kZXMuIFNlY29uZCwgdGhyZWFkIGhh bmRsaW5nIGlzIG1pc3NpbmcuICBUaGlyZCwKICBoYXJkIHZlcnN1cyBzb2Z0IHJlcXVpcmVt ZW50cyBhcmUgbm90IGhhbmRsZWQgZm9yIENQVSB1c2FnZS4KCgpudW1hX3NldF9pbnRlcmxl YXZlX21hc2soKSAtLT4gc2VlIGNvbW1lbnQKbnVtYV9nZXRfaW50ZXJsZWF2ZV9tYXNrKCkg LS0+IHNlZSBjb21tZW50Cm51bWFfZ2V0X2ludGVybGVhdmVfbm9kZSgpIC0tPiBzZWUgY29t bWVudApudW1hX2FsbG9jX2ludGVybGVhdmVkX3N1YnNldCgpIC0tPiBzZWUgY29tbWVudApu dW1hX2FsbG9jX2ludGVybGVhdmVkKCkgLS0+IHNlZSBjb21tZW50Cm51bWFfaW50ZXJsZWF2 ZV9tZW1vcnkoKSAtLT4gc2VlIGNvbW1lbnQKCiAgSSBkbyBub3QgdGhpbmsgdGhhdCBpbnRl cmxlYXZpbmcgc2hvdWxkIGJlIGEgY29tcGxldGVseSBzZXBhcmF0ZSBtZWNoYW5pc20KICBu ZXh0IHRvIG5vcm1hbCBtZW1vcnkgYWxsb2NhdGlvbi4gIEluc3RlYWQgaXQgaXMgYSBsb2dp Y2FsIGV4dGVuc2lvbiBvZgogIG1lbW9yeSBhbGxvY2F0aW9uLiAgSW50ZXJsZWF2aW5nIGlz IGEgcGFyYW1ldGVyIGZvciB0aGUgbWVtb3J5IGFsbG9jYXRpb24KICBmdW5jdGlvbnMgbGlr ZSBOVU1BX21lbV9hbGxvYygpLgoKCm51bWFfc2V0X2hvbWVub2RlKCkgIC0tPiAgTlVNQV9t ZW1fc2V0X2hvbWUoKSBvciBOVU1BX2FmZl9zZXRfY3B1KCkKICAgICAgICAgICAgICAgICAg ICAgICAgICBvciBOVU1BX2FmZl9zZXRfY3B1X3RocmVhZCgpIG9yIE5VTUFfY3B1X3NlbGYo KQoKbnVtYV9zZXRfbG9jYWxhbGxvYygpIC0tPiBOVU1BX21lbV9zZXRfaG9tZSgpIG9yIE5V TUFfbWVtX3NldF9ob21lX3RocmVhZCgpCgoKbnVtYV9zZXRfbWVtYmluZCgpICAgLS0+IE5V TUFfbWVtX2JpbmQoKQoKbnVtYV9nZXRfbWVtYmluZCgpICAgLS0+IE5VTUFfZ2V0X25vZGVz KCkKCgpudW1hX2FsbG9jX29ubm9kZSgpICAtLT4gIE5VTUFfbWVtX2FsbG9jKCkKCm51bWFf YWxsb2NfbG9jYWwoKSAgIC0tPiAgTlVNQV9tZW1fYWxsb2NfbG9jYWwoKQoKbnVtYV9hbGxv YygpICAgICAgICAgLS0+ICBOVU1BX21lbV9hbGxvY19wcmVmZXJyZWQoKQoKbnVtYV9mcmVl KCkgICAgICAgICAgLS0+ICBOVU1BX21lbV9mcmVlKCkKCm51bWFfdG9ub2RlX21lbW9yeSgp IC0tPiAgTlVNQV9tZW1fcmVsb2NhdGUoKQoKbnVtYV9zZXRsb2NhbF9tZW1vcnkoKSAtLT4g IE5VTUFfbWVtX3JlbG9jYXRlKCkKCm51bWFfcG9saWNlX21lbW9yeSgpICAtLT4gIG5vdGhp bmcgeWV0CgogIEkgZG9uJ3Qgc2VlIHdoeSB0aGlzIGlzIG5lY2Vzc2FyeS4gIFllcywgYWRk cmVzcyBzcGFjZSBhbGxvY2F0aW9uIGFuZAogIHRoZSBhY3R1YWwgYWxsb2NhdGlvbiBvZiBt ZW1vcnkgYXJlIHR3byBzdGVwcy4gIEJ1dCB0aGlzIHNob3VsZCBiZQogIHRha2VuIGNhc2Ug b2YgYnkgdGhlIGFsbG9jYXRpb24gZnVuY3Rpb25zIChpZiBuZWNlc3NhcnkpLiAgVG8gc3Vw cG9ydAogIG1lbW9yeSBhbGxvY2F0aW9uIHdpdGggb3RoZXIgaW50ZXJmYWNlcyB0aGVuIHRo b3NlIGRlc2NyaWJlZCBoZXJlIGFuZAogIG1hZ2ljYWxseSB0cmVhdCB0aGVtIGluIHRoZSAi TlVNQS13YXkiIHNlZW1zIGR1bWIuCgoKbnVtYV9ydW5fb25fbm9kZV9tYXNrKCkgLS0+IE5V TUFfYWZmX3NldF9jcHUoKSBvciBOVU1BX2FmZl9zZXRfY3B1X3RocmVhZCgpCgpudW1hX3J1 bl9vbl9ub2RlKCkgLS0+IE5VTUFfYWZmX3NldF9jcHUoKSBvciBOVU1BX2FmZl9zZXRfY3B1 X3RocmVhZCgpCgoKbnVtYV9zZXRfYmluZF9wb2xpY3koKSAtLT4gdG9vIGNvYXJzZSBncmFp bmVkCgogIFRoaXMgY2Fubm90IGJlIGEgcHJvY2VzcyBwcm9wZXJ0eS4gIEFuZCBpdCBtdXN0 IGJlIHBvc3NpYmxlIHRvIGNoYW5nZQogIGl0IGZyb20gYW5vdGhlciB0aHJlYWQsIHNvIHRo ZSBpbnRlcmZhY2UgaXMgY29tcGxldGVseSBicm9rZW4uICBCZXNpZGUsCiAgaXQgc2VlbXMg bXVjaCBtb3JlIHVzZWZ1bCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gaGFyZCBhbmQgc29m dCBtYXNrcwogIHNpbmNlIHRoaXMgYWxsb3dzLCBpZiBuZWNlc3NhcnksIHRvIHNwaWxsIG92 ZXIgdG8gb3RoZXIgbm9kZXMuICBUaGUKICBOVU1BX2FmZl9zZXRfY3B1KCkgYW5kIE5VTUFf YWZmX3NldF9jcHVfdGhyZWFkKCkgYWxsb3cgc3BlY2lmeWluZwogIHR3byBtYXNrcy4K --------------090506010803030105020407--