From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Wiles, Keith" Subject: [RFC] New CLI for DPDK Date: Fri, 10 Mar 2017 15:25:31 +0000 Message-ID: Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 To: DPDK Return-path: Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by dpdk.org (Postfix) with ESMTP id E33CB5A98 for ; Fri, 10 Mar 2017 16:25:38 +0100 (CET) Content-Language: en-US Content-ID: List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" SSB3b3VsZCBsaWtlIHRvIHJlcXVlc3QgZm9yIGNvbW1lbnRzIG9uIGEgbmV3IENMSSBkZXNpZ24g YW5kIGdldCBhbnkgZmVlZGJhY2suIEkgaGF2ZSBhdHRhY2hlZCB0aGUgY2xpLnJzdCB0ZXh0LCB3 aGljaCBpcyBzdGlsbCBhIHdvcmsgaW4gcHJvZ3Jlc3MgZm9yIHlvdSByZXZpZXcuDQoNCkkgaGF2 ZSBhbHNvIHBvcnRlZCB0aGUgQ0xJIHRvIGEgdmVyc2lvbiBvZiBQa3RnZW4gb24gdGhlIOKAmGRl duKAmSBicmFuY2ggb2YgdGhlIHJlcG8gaW4gRFBESy5vcmcuDQoNCmh0dHA6Ly9kcGRrLm9yZy9i cm93c2UvYXBwcy9wa3RnZW4tZHBkay9yZWZzLz9oPWRldg0KDQpJIHdvdWxkIGxpa2UgdG8gc3Vi bWl0IHRoZSBDTEkgbGlicmFyeSB0byBiZSB1c2VkIGluIERQREssIGlmIHRoYXQgc2VlbXMgcmVh c29uYWJsZSB0byBldmVyeW9uZS4gSSBuZWVkIG1vcmUgdGVzdGluZyBvZiB0aGUgQVBJIGFuZCBQ a3RnZW4sIGJ1dCBJIGZlZWwgaXQgaGFzIGEgc2ltcGxlciBkZXNpZ24sIGVhc2llciB0byB1bmRl cnN0YW5kIGFuZCBob3BlZnVsbHkgbWFrZSBpdCBlYXNpZXIgZm9yIGRldmVsb3BlcnMgdG8gYWRk IGNvbW1hbmRzLg0KDQpBcyBhbiBleGFtcGxlIEkgcXVpY2tseSBjb252ZXJ0ZWQgb3ZlciB0ZXN0 cG1kIGZyb20gQ01ETElORSB0byBDTEkgKEkganVzdCBhZGQgYSAtSSBvcHRpb24gdG8gc2VsZWN0 IENMSSBpbnN0ZWFkKSBhbmQgcmVkdWNlZCB0aGUgdGVzdC1wbWQvY21kbGluZS5jIGZpbGUgZnJv bSAxMi42SyBsaW5lcyB0byBhYm91dCA0LjVLIGxpbmVzLiBJIGRpZCBub3QgZnVsbHkgdGVzdCB0 aGUgY29kZSwgYnV0IHRoZSBvbmVzIEkgZGlkIHRlc3Qgc2VlbSB0byB3b3JrLg0KDQpJIGRvIG5v dCBleHBlY3QgRFBESyB0byBjb252ZXJ0IHRvIHRoZSBuZXcgQ0xJIG9ubHkgaWYgaXQgbWFrZXMg c2Vuc2UgYW5kIEkgYW0gbm90IHN1Z2dlc3RpbmcgdG8gcmVwbGFjZSBDTURMSU5FIGxpYnJhcnku DQoNCklmIHlvdSBwbGF5IHdpdGggdGhlIG5ldyBDTEkgaW4gcGt0Z2VuIGFuZCBzZWUgYW55IHBy b2JsZW1zIG9yIHdhbnQgdG8gc3VnZ2VzdCBuZXcgZmVhdHVyZXMgb3IgY2hhbmdlcyBwbGVhc2Ug bGV0IG1lIGtub3cuDQoNCkNvbW1lbnRzIG9uIHRoZSBjbGkucnN0IHRleHQgaXMgYWxzbyB3ZWxj b21lLCBidXQgdGhlIGNsaS5yc3QgaXMgbm90IGNvbXBsZXRlLiBJIHRoaW5rIHRoaXMgZmlsZSBu ZWVkcyB0byBiZSBicm9rZW4gaW50byB0d28gb25lIHRvIGV4cGxhaW4gdGhlIGV4YW1wbGUgYW5k IGFub3RoZXIgdG8gZXhwbGFpbiBDTEkgaW50ZXJuYWxzLg0KDQotLS0tLS0tDQoNCi4uICBCU0Qg TElDRU5TRQ0KICAgQ29weXJpZ2h0KGMpIDIwMTcgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdo dHMgcmVzZXJ2ZWQuDQogICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KDQogICBSZWRpc3RyaWJ1dGlv biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCiAg IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg Y29uZGl0aW9ucw0KICAgYXJlIG1ldDoNCg0KICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KICAgbm90aWNlLCB0aGlzIGxp c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KICAgKiBSZWRp c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly aWdodA0KICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu ZyBkaXNjbGFpbWVyIGluDQogICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp YWxzIHByb3ZpZGVkIHdpdGggdGhlDQogICBkaXN0cmlidXRpb24uDQogICAqIE5laXRoZXIgdGhl IG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCiAgIGNvbnRy aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl ZA0KICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw ZXJtaXNzaW9uLg0KDQogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklH SFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQogICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBP UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KICAgTElNSVRFRCBUTywg VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S DQogICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB TEwgVEhFIENPUFlSSUdIVA0KICAgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQogICBTUEVDSUFMLCBFWEVNUExBUlks IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQogICBMSU1JVEVE IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G IFVTRSwNCiAgIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X RVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KICAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KICAgKElOQ0xVRElORyBORUdM SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQog ICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G IFNVQ0ggREFNQUdFLg0KDQpDTEkgU2FtcGxlIEFwcGxpY2F0aW9uDQo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09DQoNCkNMSSBzdGFuZHMgZm9yICJDb21tYW5kIExpbmUgSW50ZXJmYWNl Ii4NCg0KVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyB0aGUgQ0xJIHNhbXBsZSBhcHBsaWNhdGlvbiB0 aGF0IGlzIHBhcnQgb2YgdGhlDQpEYXRhIFBsYW5lIERldmVsb3BtZW50IEtpdCAoRFBESykuIFRo ZSBDTEkgaXMgYSB3b3JrYWxpa2UgcmVwbGFjZW1lbnQgZm9yDQpjbWRsaW5lIGxpYnJhcnkgaW4g RFBESyBhbmQgaGFzIGEgc2ltcGxlciBpbnRlcmZhY2UgYW5kIHByb2dyYW1taW5nIG1vZGVsLg0K DQpUaGUgcHJpbWFyeSBnb2FsIG9mIENMSSBpcyB0byBhbGxvdyB0aGUgZGV2ZWxvcGVyIHRvIGNy ZWF0ZSBjb21tYW5kcyBxdWlja2x5DQphbmQgd2l0aCB2ZXJ5IGxpdHRsZSBjb21waWxlIG9yIHJ1 bnRpbWUgY29uZmlndXJhdGlvbi4gVXNpbmcgc3RhbmRhcmQgVW5peCoNCmxpa2UgY29uc3RydWN0 cyB3aGljaCBhcmUgdmVyeSBmYW1pbGFyIHRvIHRoZSBkZXZlbG9wZXIuIEFsbG93aW5nIHRoZSBk ZXZlbG9wZXINCnRvIGNvbnN0cnVjdCBhIHNldCBvZiBjb21tYW5kcyBmb3IgZGV2ZWxvcG1lbnQg b3IgZGVwbG95bWVudCBvZiB0aGUgYXBwbGljYXRpb24uDQoNClRoZSBDTEkgZGVzaWduIHVzZXMg YSBkaXJlY3RvcnkgbGlrZSBkZXNpZ24gaW5zdGVhZCBvZiBhIHNpbmdsZSBsZXZlbCBjb21tYW5k DQpsaW5lIGludGVyZmFjZS4gQWxsb3dpbmcgdGhlIGRldmVsb3BlciB0byB1c2UgYSBkaXJlY3Rv cnkgc3R5bGUgc29sdXRpb24gdG8NCmNvbnRyb2xsaW5nIGEgRFBESyBhcHBsaWNhdGlvbi4gVGhl IGRpcmVjdG9yeSBzdHlsZSBkZXNpZ24gaXMgbm90aGluZyBuZXcsIGJ1dA0KaXQgZG9lcyBoYXZl IHNvbWUgYWR2YW50YWdlcy4NCg0KT3ZlcnZpZXcNCi0tLS0tLS0tDQoNClRoZSBDTEkgc2FtcGxl IGFwcGxpY2F0aW9uIGlzIGEgc2ltcGxlIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIHRo ZQ0KdXNlIG9mIHRoZSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlIGluIHRoZSBEUERLLiBUaGlzIGFw cGxpY2F0aW9uIGlzIGENCnJlYWRsaW5lLWxpa2UgaW50ZXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQg dG8gY29udHJvbCBhIERQREsgYXBwbGljYXRpb24uDQoNCk9uZSBvZiB0aGUgYmlnIGFkdmFudGFn ZXMgb2YgQ0xJIG92ZXIgQ21kbGluZSBpcyBpdCBpcyBkeW5hbWljLCB3aGljaCBtZWFucw0Kbm9k ZXMgb3IgaXRlbXMgY2FuIGJlIGFkZGVkIGFuZCByZW1vdmVkIG9uIHRoZSBmbHkuIFdoaWNoIGFs bG93cyBhZGRpbmcNCm5ldyBkaXJlY3RvcmllcywgZmlsZSBvciBjb21tYW5kcyBhcyBuZWVkZWQg b3IgcmVtb3ZpbmcgdGhlc2UgaXRlbXMgYXQgcnVudGltZS4NClRoZSBDTEkgaGFzIG5vIGdsb2Jh bCBtb2RpZmlhYmxlIHZhcmlhYmxlIGFzIHRoZSBvbmUgZ2xvYmFsIHBvaW50ZXIgaXMgYQ0KdGhy ZWFkIGJhc2VkIHZhcmlhYmxlLiBXaGljaCBhbGxvd3MgdGhlIGRldmVsb3BlciB0byBoYXZlIG11 bHRpcGxlIENMSQ0KY29tbWFuZHMgcGVyIHRocmVhZCBpZiBuZWVkZWQuDQoNCkFub3RoZXIgYmln IGFkdmFudGFnZSBpcyB0aGUgY2FsbGluZyBvZiB0aGUgYmFja2VuZCBmdW5jdGlvbiB0byBzdXBw b3J0IGENCmNvbW1hbmQgaXMgdmVyeSBmYW1pbGFyIHRvIGRldmVsb3BlcnMgYXMgaXQgaXMgYmFz aWNhbGx5IGp1c3QgYSBhcmdjL2FyZ3YNCnN0eWxlIGNvbW1hbmQgYW5kIHRoZSBkZXZlbG9wZXIg Z2V0cyB0aGUgY29tcGxldGUgY29tbWFuZCBsaW5lLg0KDQpPbmUgb3RoZXIgYmlnIGFkdmFudGFn ZSBpcyB0aGUgdXNlIG9mIE1BUCBzdHJ1Y3R1cmVzLCB0byBoZWxwIGlkZW50aWZ5IGNvbW1hbmRz DQpxdWlja2x5IHBsdXMgYWxsb3dpbmcgdGhlIGRldmVsb3BlciB0byBkZWZpbmUgbmV3IHZlcnNp b25zIG9mIGNvbW1hbmRzIGFuZA0KYmUgYWJsZSB0byBpZGVudGlmeSB0aGVzZSBuZXcgdmVyc2lv bnMgdXNpbmcgYSBzaW1wbGUgaWRlbnRpZmllciB2YWx1ZS4gTG9vayBhdA0KdGhlIHNhbXBsZSBh cHBsaWNhdGlvbiB0byBzZWUgYSBzaW1wbGUgdXNhZ2UuDQoNCkFub3RoZXIgYWR2YW50YWdlIG9m IENMSSBpcyBob3cgc2ltcGxlIGl0IGlzIHRvIGFkZCBuZXcgZGlyZWN0cm9pZXMsIGZpbGVzIGFu ZA0KY29tbWFuZHMgZm9yIHVzZXIgZGV2ZWxvcG1lbnQuIFRoZSBiYXNpYyBjb25jZXB0IGlzIGZv ciB0aGUgZGV2ZWxvcGVyIHRvIHVzZQ0Kc3RhbmRhcmQgVW5peCBsaWtlIGRlc2lnbnMuIFRvIGFk ZCBhIGNvbW1hbmQgYSBkZXZlbG9wZXIgbmVlZHMgdG8gYWRkIGFuIGVudHJ5DQp0byB0aGUgY2xp X3RyZWVfdCBzdHJ1Y3R1cmUgYW5kIGNyZWF0ZSBhIGZ1bmN0aW9uIHVzaW5nIHRoZSBmb2xsb3dp bmcgcHJvdG90eXBlOg0KDQoJLi4gY29kZS1ibG9jazo6IGNvbnNvbGUNCg0KCWludCB1c2VyX2Nt ZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpOw0KDQpUaGUgYXJnYy9hcmd2IGlzIGV4YWN0bHkgbGlr ZSB0aGUgc3RhbmRhcmQgdXNhZ2UgaW4gYSBVbml4KiBzeXN0ZW0sIHdoaWNoIGFsbG93cw0KZm9y IHVzaW5nIGdldG9wdCgpIGFuZCBvdGhlciBzdGFuZGFyZCBmdW5jdGlvbnMuIFRoZSBDbWRsaW5l IHN0cnVjdHVyZXMgYW5kDQp0ZXh0IGNvbnZlcnNpb25zIHdlcmUgZGVmaW5lZCBhdCBjb21waWxl IHRpbWUgaW4gbW9zdCBjYXNlcy4gSW4gQ0xJIHRoZSByb3V0aW5lDQppcyBwYXNzZWQgdGhlIGFy Z2MvYXJndiBpbmZvcm1hdGlvbiB0byBjb252ZXJ0IHRoZXNlIG9wdGlvbnMgYXMgbmVlZGVkLiBU aGUgY2xpDQp2YXJpYWJsZSBiZWluZyBhIHRocmVhZCBMb2NhbCBTdG9yYWdlIChUTFMpIGFsbCB1 c2VyIHJvdXRpbmVzIGEgQ0xJIHJvdXRpbmUgb25seQ0KbmVlZCB0byBhY2Nlc3MgdGhlIHRocmVh ZCB2YXJpYWJsZSB0byBlbGltaW5hdGUgbmVlZGluZyBhIGdsb2JhbCB2YXJpYWJsZSB0bw0KcmVm ZXJlbmNlIHRoZSBzcGVjaWZpYyBDTEkgaW5zdGFuY2UgYW5kIHBhc3NpbmcgdGhlIHZhbHVlIGlu IHRoZSBBUEkuDQoNClRoZSB1c2VyIGNhbiBhbHNvIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMg dXNpbmcgdGhlICoqZW52KiogY29tbWFuZC4gVGhlc2UNCnZhcmlhYmxlcyBhcmUgYWxzbyBwYXJz ZWQgaW4gdGhlIGNvbW1hbmQgbGluZSBhIGRpcmVjdCBzdWJzdGl0dXRpb24gaXMgZG9uZS4NCg0K VGhlIENMSSBzeXN0ZW0gYWxzbyBoYXMgc3VwcG9ydCBmb3Igc2ltcGxlIGZpbGVzIGFsb25nIHdp dGggYWxpYXMgbGlrZSBjb21tYW5kcy4NClRoZXNlIGFsaWFzIGNvbW1hbmRzIGFyZSBmaXhlZCBz dHJpbmdzIHdoaWNoIGFyZSBleGVjdXRlZCBpbnN0ZWFkIG9mIGEgZnVuY3Rpb24NCnByb3ZpZGVk IGJ5IHRoZSBkZXZlbG9wZXIuIElmIHRoZSB1c2VyIGhhcyBtb3JlIGFyZ3VtZW50cyB0aGVzZSBh cmUgYXBwZW5kZWQNCnRvIHRoZSBhbGlhcyBzdHJpbmcgYW5kIHByb2Nlc3NlZCBhcyBpZiB0eXBl ZCBvbiB0aGUgY29tbWFuZCBsaW5lLg0KDQouLiBub3RlOjoNCg0KICAgVGhlIENMSSBsaWJyYXJ5 IHdhcyBkZXNpZ25lZCB0byBiZSB1c2VkIGluIHByb2R1Y3Rpb24gY29kZSBhbmQgdGhlIENtZGxp bmUNCiAgIHdhcyBub3QgdmFsaWRhdGVkIHRvIHRoZSBzYW1lIHN0YW5kYXJkIGFzIG90aGVyIERQ REsgbGlicmFyaWVzLiBUaGUgZ29hbA0KICAgaXMgdG8gcHJvdmlkZSBhIHByb2R1Y3Rpb24gQ0xJ IGRlc2lnbi4NCg0KVGhlIENMSSBzYW1wbGUgYXBwbGljYXRpb24gc3VwcG9ydHMgc29tZSBvZiB0 aGUgZmVhdHVyZXMgb2YgdGhlIENtZGxpbmUNCmxpYnJhcnkgc3VjaCBhcywgY29tcGxldGlvbiwg Y3V0L3Bhc3RlIGFuZCBzb21lIG90aGVyIHNwZWNpYWwgYmluZGluZ3MgdGhhdA0KbWFrZSBjb25m aWd1cmF0aW9uIGFuZCBkZWJ1ZyBmYXN0ZXIgYW5kIGVhc2llci4NCg0KVGhlIENMSSBkZXNpbiB1 c2VzIHNvbWUgdmVyeSBzaW1wbGUgVlQxMDAgY29udHJvbCBzdHJpbmdzIGZvciBkaXNwbGF5aW5n IGRhdGENCmFuZCBhY2NlcHRpbmcgaW5wdXQgZnJvbSB0aGUgdXNlci4gU29tZSBvZiB0aGUgY29u dHJvbCBzdHJpbmdzIGFyZSB1c2VkIHRvDQpjbGVhciB0aGUgc2NyZWVuIG9yIGxpbmUgYW5kIHBv c2l0aW9uIHRoZSBjdXJzb3Igb24gYSBWVDEwMCBjb21wYXRpYmxlIHRlcm1pbmFsLg0KVGhlIENM SSBzY3JlZW4gY29kZSBhbHNvIHN1cHBvcnRzIGJhc2ljIGNvbG9yIGFuZCBtYW55IG90aGVyIFZU MTAwIGNvbW1hbmRzLg0KDQpUaGUgYXBwbGljYXRpb24gYWxzbyBzaG93cyBob3cgdGhlIENMSSBh cHBsaWNhdGlvbiBjYW4gYmUgZXh0ZW5kZWQgdG8gaGFuZGxlDQphIGxpc3Qgb2YgY29tbWFuZHMg YW5kIHVzZXIgaW5wdXQuDQoNClRoZSBleGFtcGxlIHByZXNlbnRzIGEgc2ltcGxlIGNvbW1hbmQg cHJvbXB0ICJEUEtELWNsaTovPiIgc2ltaWxhciB0byBhIFVuaXgqDQpzaGVsbCBjb21tYW5kIGFs b25nIHdpdGggYSBkaXJlY3RvcnkgbGlrZSBmaWxlIHN5c3RlbS4NCg0KU29tZSBvZiB0aGUgYmFz aWMgY29tbWFuZHMgY29udGFpbmVkIHVuZGVyIC9zYmluIGRpcmVjdG9yeSBhcmU6DQoNCiogICBs czogbGlzdCB0aGUgY3VycmVudCBvciBwcm92aWRlZCBkaXJlY3RvcnkgZmlsZXMvY29tbWFuZHMu DQoNCiogICBjZDogQ2hhbmdlIGRpcmVjdG9yeSBjb21tYW5kLg0KDQoqICAgcHdkOiBwcmludCBv dXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuDQoNCiogICBoaXN0b3J5OiBMaXN0IHRo ZSBjdXJyZW50IGNvbW1hbmQgbGluZSBoaXN0b3J5IGlmIGVuYWJsZWQuDQoNCiogICBtb3JlOiBB IHNpbXBsZSBjb21tYW5kIHRvIHBhZ2UgY29udGVudHMgb2YgZmlsZXMuDQoNCiogICBoZWxwOiBk aXNwbGF5IGEgdGhlIGhlbHAgc2NyZWVuLg0KDQoqICAgcXVpdDogZXhpdCB0aGUgQ0xJIGFwcGxp Y2F0aW9uLCBhbHNvICoqQ3RybC14Kiogd2lsbCBleGl0IGFzIHdlbGwuDQoNCiogICBta2Rpcjog YWRkIGEgZGlyZWN0b3J5IHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4NCg0KKiAgIGRlbGF5OiB3 YWl0IGZvciBhIGdpdmVuIG51bWJlciBvZiBtaWNyb3NlY29uZHMuDQoNCiogICBzbGVlcDogd2Fp dCBmb3IgYSBnaXZlbiBudW1iZXIgb2Ygc2Vjb25kcy4NCg0KKiAgIHJtOiByZW1vdmUgYSBkaXJl Y3RvcnksIGZpbGUgb3IgY29tbWFuZC4gUmVtb3ZpbmcgYSBmaWxlIHdpbGwgZGVsZXRlIHRoZSBk YXRhLg0KDQoqICAgY2xzOiBjbGVhciB0aGUgc2NyZWVuIGFuZCByZWRpc3BsYXkgdGhlIHByb21w dC4NCg0KKiAgIHZlcnNpb246IERpc3BsYXkgdGhlIGN1cnJlbnQgRFBESyB2ZXJzaW9uIGJlaW5n IHVzZWQuDQoNCiogICBwYXRoOiBkaXNwbGF5IHRoZSBjdXJyZW50IHNlYXJjaCBwYXRoIGZvciBl eGVjdXRhYmxlIGNvbW1hbmRzLg0KDQoqICAgY21hcDogRGlzcGxheSB0aGUgY3VycmVudCBzeXN0 ZW0gY29yZSBhbmQgc29ja2V0IGluZm9ybWF0aW9uLg0KDQoqICAgaHVnZXBhZ2VzOiBEaXNwbGF5 IHRoZSBjdXJyZW50IGh1Z2VwYWdlIGluZm9ybWF0aW9uLg0KDQoqICAgc2l6ZXM6IGEgY29sbGVj dGlvbiBzeXN0ZW0gc3RydWN0dXJlIGFuZCBidWZmZXIgc2l6ZXMgZm9yIGRlYnVnZ2luZy4NCg0K KiAgIGNvcHlyaWdodDogYSBmaWxlIGNvbnRhaW5pbmcgRFBESyBjb3B5cmlnaHQgaW5mb3JtYXRp b24uDQoNCiogICBlbnY6IGEgY29tbWFuZCBzaG93L3NldC9tb2RpZnkgdGhlIGVudmlyb25tZW50 IHZhcmlhYmxlcy4NCg0KU29tZSBleGFtcGxlIGNvbW1hbmRzIHVuZGVyIC9iaW4gZGlyZWN0b3J5 IGFyZToNCg0KKiAgIGxsOiBhbiBhbGlhcyBjb21tYW5kIHRvIGRpc3BsYXkgbG9uZyBscyBsaXN0 aW5nICoqbHMgLWwqKg0KDQoqICAgaDogYWxpYXMgY29tbWFuZCBmb3IgKipoaXN0b3J5KioNCg0K KiAgIGhlbGxvOiBhIHNpbXBsZSBIZWxsbyBXb3JsZCEgY29tbWFuZC4NCg0KKiAgIHNob3c6IGhh cyBhIG51bWJlciBvZiBjb21tYW5kcyB1c2luZyB0aGUgbWFwIGZlYXR1cmUuDQoNClVuZGVyIHRo ZSAvZGF0YSBkaXJlY3RvcnkgaXM6DQoNCiogICBwY2k6IGEgc2ltcGxlIGV4YW1wbGUgZmlsZSBm b3IgZGlzcGxheWluZyB0aGUgKipsc3BjaSoqIGNvbW1hbmQgaW4gQ0xJLg0KDQouLiBub3RlOjoN Cg0KICAgVG8gdGVybWluYXRlIHRoZSBhcHBsaWNhdGlvbiwgdXNlICoqQ3RybC14Kiogb3IgdGhl IGNvbW1hbmQgKipxdWl0KiouDQoNCkF1dG8gY29tcGxldGlvbg0KLS0tLS0tLS0tLS0tLS0tDQoN CkNMSSBkb2VzIHN1cHBvcnQgYXV0byBjb21wbGV0aW9uIGF0IHRoZSBmaWxlIG9yIGRpcmVjdG9y eSBsZXZlbCwgbWVhbmluZyB0aGUNCmFyZ3VtZW50cyB0byBjb21tYW5kcyBhcmUgbm90IGV4cGFu ZGVkIGFzIHdhcyBkb25lIGluIENtZGxpbmUgY29kZS4gVGhlIENMSQ0KYXV0byBjb21wbGV0aW9u IHdvcmtzIHNpbWlsYXIgdG8gdGhlIHN0YW5kYXJkIFVuaXgqIHN5c3RlbSBieSBleHBhbmRpbmcN CmNvbW1hbmRzIGFuZCBkaXJlY3RvcnkgcGF0aHMuIEluIG5vcm1hbCBVbml4KiBsaWtlIGNvbW1h bmRzIHRoZSB1c2VyIG5lZWRzIHRvDQpleGVjdXRlIHRoZSBjb21tYW5kIGFza2luZyBmb3IgdGhl IGhlbHAgaW5mb3JtYXRpb24gYW5kIENMSSB1c2VzIHRoaXMgbWV0aG9kLg0KDQpTcGVjaWFsIGNv bW1hbmQgZmVhdHVyZXMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpVc2luZyB0aGUgJyEn IGZvbGxvd2VkIGJ5IGEgbnVtYmVyIGZyb20gdGhlIGhpc3RvcnkgbGlzdCBvZiBjb21tYW5kcyB5 b3UgY2FuDQpleGVjdXRlIHRoYXQgY29tbWFuZCBhZ2Fpbi4gVXNpbmcgdGhlIFVQL0Rvd24gYXJy b3dzIHRoZSB1c2VyIGNhbiBxdWlja2x5IGZpbmQNCmFuZCBleGVjdXRlIG9yIG1vZGlmeSBhIHBy ZXZpb3VzIGNvbW1hbmQgaW4gaGlzdG9yeS4NCg0KVGhlIHVzZXIgY2FuIGFsc28gZXhlY3V0ZSBo b3N0IGxldmVsIGNvbW1hbmRzIGlmIGVuYWJsZWQgdXNpbmcgdGhlICdAJyBwcmVmaXgNCnRvIGEg Y29tbWFuZCBsaW5lIGUuZy4gQGxzIG9yIEBsc3BjaSBvciAuLi4gbGluZSBpcyBwYXNzZWQgdG8g cG9wZW4gb3Igc3lzdGVtDQpmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhbmQgdGhlIG91dHB1dCBk aXNwbGF5ZWQgb24gdGhlIGNvbnNvbGUgaWYgYW55IG91dHB1dC4NClRvIGRpc2FibGUgc2V0IENP TkZJR19SVEVfQ0xJX0hPU1RfQ09NTUFORFM9biBpbiBjb25maWd1cmF0aW9uIGZpbGUuDQoNCkNv bXBpbGluZyB0aGUgQXBwbGljYXRpb24NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIy4g IEdvIHRvIGV4YW1wbGUgZGlyZWN0b3J5Og0KDQogICAuLiBjb2RlLWJsb2NrOjogY29uc29sZQ0K DQogICAgICAgZXhwb3J0IFJURV9TREs9L3BhdGgvdG8vcnRlX3Nkaw0KICAgICAgIGNkICR7UlRF X1NES30vZXhhbXBsZXMvY2xpDQoNCiMuICBTZXQgdGhlIHRhcmdldCAoYSBkZWZhdWx0IHRhcmdl dCBpcyB1c2VkIGlmIG5vdCBzcGVjaWZpZWQpLiBGb3IgZXhhbXBsZToNCg0KICAgLi4gY29kZS1i bG9jazo6IGNvbnNvbGUNCg0KICAgICAgIGV4cG9ydCBSVEVfVEFSR0VUPXg4Nl82NC1uYXRpdmUt bGludXhhcHAtZ2NjDQoNCiAgIFJlZmVyIHRvIHRoZSAqRFBESyBHZXR0aW5nIFN0YXJ0ZWQgR3Vp ZGUqIGZvciBwb3NzaWJsZSBSVEVfVEFSR0VUIHZhbHVlcy4NCg0KIy4gIEJ1aWxkIHRoZSBhcHBs aWNhdGlvbjoNCg0KICAgLi4gY29kZS1ibG9jazo6IGNvbnNvbGUNCg0KICAgICAgIG1ha2UNCg0K UnVubmluZyB0aGUgQXBwbGljYXRpb24NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClRvIHJ1 biB0aGUgYXBwbGljYXRpb24gaW4gbGludXhhcHAgZW52aXJvbm1lbnQsIGlzc3VlIHRoZSBmb2xs b3dpbmcgY29tbWFuZDoNCg0KLi4gY29kZS1ibG9jazo6IGNvbnNvbGUNCg0KICAgJCAuL2J1aWxk L2NsaQ0KDQouLiBub3RlOjoNCiAgIFRoZSBleGFtcGxlIGNsaSBhcHBsaWNhdGlvbiBkb2VzIG5v dCByZXF1aXJlIHRvIGJlIHJ1biBhcyBzdXBlcnVzZXINCiAgIGFzIGl0IGRvZXMgbm90IHN0YXJ0 dXAgRFBESyBieSBjYWxsaW5nIHJ0ZV9lYWxfaW5pdCgpIHJvdXRpbmUuIFdoaWNoIG1lYW5zDQog ICBpdCBhbHNvIGRvZXMgbm90IHVzZSBEUERLIGZlYXR1cmVzIGV4Y2VwdCBmb3IgYSBmZXcgcm91 dGluZXMgbm90IHJlcXVpcmluZw0KICAgRUFMIGluaXRpYWxpemF0aW9uLg0KDQpSZWZlciB0byB0 aGUgKkRQREsgR2V0dGluZyBTdGFydGVkIEd1aWRlKiBmb3IgZ2VuZXJhbCBpbmZvcm1hdGlvbiBv biBydW5uaW5nIGFwcGxpY2F0aW9ucw0KYW5kIHRoZSBFbnZpcm9ubWVudCBBYnN0cmFjdGlvbiBM YXllciAoRUFMKSBvcHRpb25zLg0KDQpFeHBsYW5hdGlvbg0KLS0tLS0tLS0tLS0NCg0KVGhlIGZv bGxvd2luZyBzZWN0aW9ucyBwcm92aWRlIHNvbWUgZXhwbGFuYXRpb24gb2YgdGhlIGNvZGUuDQoN CkVBTCBJbml0aWFsaXphdGlvbiBhbmQgY21kbGluZSBTdGFydA0Kfn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+DQoNClRoZSBmaXJzdCB0YXNrIGlzIHRoZSBpbml0aWFsaXphdGlv biBvZiB0aGUgRW52aXJvbm1lbnQgQWJzdHJhY3Rpb24gTGF5ZXIgKEVBTCksDQppZiByZXF1aXJl ZCBmb3IgdGhlIGFwcGxpY2F0aW9uLg0KDQouLiBjb2RlLWJsb2NrOjogYw0KDQogICBpbnQNCiAg IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQ0KICAgew0KICAgICAgIGlmIChjbGlfY3JlYXRl X3dpdGhfdHJlZShpbml0X3RyZWUpID09MCkgew0KICAgICAgICAgICBjbGlfc3RhcnQoTlVMTCwg MCk7IC8qIE5VTEwgaXMgc29tZSBpbml0IG1lc3NhZ2UgZG9uZSBvbmx5IG9uY2UgKi8NCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwIG1lYW5zIGRvIG5vdCB1c2UgY29sb3IgdGhl bWVzICovDQogICAgICAgICAgIGNsaV9kZXN0cm95KCk7DQogICAgICAgfQ0KDQpUaGUgY2xpX3N0 YXJ0KCkgZnVuY3Rpb24gcmV0dXJucyB3aGVuIHRoZSB1c2VyIHR5cGVzICoqQ3RybC14Kiogb3Ig dXNlcyB0aGUNCnF1aXQgY29tbWFuZCBpbiB0aGlzIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBleGl0 cy4gVGhlIGNsaV9jcmVhdGUoKSBjYWxsIHRha2VzDQpmb3VyIGFyZ3VtZW50cyBhbmQgZWFjaCBo YXMgYSBkZWZhdWx0IHZhbHVlIGlmIG5vdCBwcm92aWRlZC4gVGhlIEFQSSB1c2VkIGhlcmUNCmlz IHRoZSBjbGlfY3JlYXRlX3dpdGhfdHJlZSgpLCB3aGljaCB1c2VzIGRlZmF1bHRzIGZvciB0aHJl ZSBvZiB0aGUgYXJndW1lbnRzLg0KDQouLiBjb2RlLWJsb2NrOjogYw0KDQogICAvKioNCiAgICog Q3JlYXRlIHRoZSBDTEkgZW5naW5lDQogICAqDQogICAqIEBwYXJhbSBwcm9tcHRfZnVuYw0KICAg KiAgIEZ1bmN0aW9uIHBvaW50ZXIgdG8gY2FsbCBmb3IgZGlzcGxheWluZyB0aGUgcHJvbXB0Lg0K ICAgKiBAcGFyYW0gdHJlZV9mdW5jDQogICAqICAgVGhlIHVzZXIgc3VwcGxpZWQgZnVuY3Rpb24g dG8gaW5pdCB0aGUgdHJlZSBvciBjYW4gYmUgTlVMTC4gSWYgTlVMTCB0aGVuDQogICAqICAgYSBk ZWZhdWx0IHRyZWUgaXMgaW5pdGlhbGl6ZWQgd2l0aCBiYXNpYyBjb21tYW5kcy4NCiAgICogQHBh cmFtIG5iX2VudHJpZXMNCiAgICogICBUb3RhbCBudW1iZXIgb2YgY29tbWFuZHMsIGZpbGVzLCBh bGlhc2VzIGFuZCBkaXJlY3Rvcmllcy4gSWYgMCB0aGVuIHVzZQ0KICAgKiAgIHRoZSBkZWZhdWx0 IG51bWJlciBvZiBub2Rlcy4gSWYgLTEgdGhlbiB1bmxpbWl0ZWQgbnVtYmVyIG9mIG5vZGVzLg0K ICAgKiBAcGFyYW0gbmJfaGlzdA0KICAgKiAgIFRoZSBudW1iZXIgb2YgbGluZXMgdG8ga2VlcCBp biBoaXN0b3J5LiBJZiB6ZXJvIHRoZW4gdHVybiBvZmYgaGlzdG9yeS4NCiAgICogICBJZiB0aGUg dmFsdWUgaXMgQ0xJX0RFRkFVTFRfSElTVE9SWSB1c2UgQ0xJX0RFRkFVTFRfSElTVF9MSU5FUw0K ICAgKiBAcmV0dXJuDQogICAqICAgMCBvbiBzdWNjZXNzIG9yIC0xDQogICAqLw0KICAgaW50IGNs aV9jcmVhdGUoY2xpX3Byb21wdF90IHByb21wdF9mdW5jLCBjbGlfdHJlZV90IHRyZWVfZnVuYywN CiAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX2VudHJpZXMsIHVpbnQzMl90IG5iX2hpc3Qp Ow0KDQpUaGUgY2xpX2NyZWF0ZV93aXRoX3RyZWUoKSBoYXMgb25seSBvbmUgYXJndW1lbnQgd2hp Y2ggaXMgdGhlIHN0cnVjdHVyZSB0byB1c2UNCmluIG9yZGVyIHRvIHNldHVwIHRoZSBpbml0aWFs IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuIEFsc28gdGhlIHdyYXBwZXIgZnVuY3Rpb24NCmludCBjbGlf Y3JlYXRlX3dpdGhfZGVmYXVsdHModm9pZCkgY2FuIGJlIHVzZWQgYXMgd2VsbC4NCg0KQ29uc3Vs dCB0aGUgY2xpLmggaGVhZGVyIGZpbGUgZm9yIHRoZSBkZWZhdWx0IHZhbHVlcy4gQWxzbyB0aGUg YWxpYXMgbm9kZSBpcyBhDQpzcGVjaWFsIGFsaWFzIGZpbGUgdG8gYWxsb3cgZm9yIGFsaWFzaW5n IGEgY29tbWFuZCB0byBhbm90aGVyIGNvbW1hbmQuDQoNClRoZSB0cmVlIGluaXQgcm91dGluZSBp cyBkZWZpbmVkIGxpa2U6DQoNCi4uIGNvZGUtYmxvY2s6OiBjDQoNCglzdGF0aWMgc3RydWN0IGNs aV90cmVlIG15X3RyZWVbXSA9IHsNCgkgICAgY19kaXIoIi9kYXRhIiksDQoJICAgIGNfZmlsZSgi cGNpIiwgcGNpX2ZpbGUsICJkaXNwbGF5IGxzcGNpIGluZm9ybWF0aW9uIiksDQoJICAgIGNfZGly KCIvYmluIiksDQoJICAgIGNfY21kKCJoZWxsbyIsIGhlbGxvX2NtZCwgIkhlbGxvLVdvcmxkISEi KSwNCgkgICAgY19hbGlhcygiaCIsICJoaXN0b3J5IiwgImRpc3BsYXkgaGlzdG9yeSBjb21tYW5k cyIpLA0KCSAgICBjX2FsaWFzKCJsbCIsICJscyAtbCIsICJsb25nIGRpcmVjdG9yeSBsaXN0aW5n IGFsaWFzIiksDQoJICAgIGNfZW5kKCkNCgl9Ow0KDQoJc3RhdGljIGludA0KCWluaXRfdHJlZSh2 b2lkKQ0KCXsNCgkgICAgLyoNCgkgICAgICogUm9vdCBpcyBjcmVhdGVkIGFscmVhZHkgYW5kIHVz aW5nIHN5c3RlbSBkZWZhdWx0IGNtZHMgYW5kIGRpcnMsIHRoZQ0KCSAgICAgKiBkZXZlbG9wZXIg aXMgbm90IHJlcXVpcmVkIHRvIHVzZSB0aGUgc3lzdGVtIGRlZmF1bHQgY21kcy9kaXJzLg0KCSAg ICAgKi8NCgkgICAgaWYgKGNsaV9kZWZhdWx0X3RyZWVfaW5pdCgpKQ0KCSAgICAgICAgcmV0dXJu IC0xOw0KDQoJCS8qIFVzaW5nIE5VTEwgaGVyZSB0byBzdGFydCBhdCByb290IGRpcmVjdG9yeSAq Lw0KCSAgICBpZiAoY2xpX2FkZF90cmVlKE5VTEwsIG15X3RyZWUpKQ0KCSAgICAgICAgcmV0dXJu IC0xOw0KDQoJCXJldHVybiBjbGlfYWRkX2Jpbl9wYXRoKCIvYmluIik7DQoJfQ0KDQoNClRoZSBh Ym92ZSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBjcmVhdGUgdGhlIHRyZWUgc3RydWN0dXJlIGF0IGlu aXRpYWxpemF0aW9uDQp0aW1lLiBUaGUgc3RydWN0IGNsaV90cmVlIG9yIGNsaV90cmVlX3QgdHlw ZWRlZiBjYW4gYmUgdXNlZCB0byBzZXR1cCBhIG5ldw0KZGlyZWN0b3J5IHRyZWUgb3IgYWd1bWVu dCB0aGUgZGVmYXVsdCB0cmVlLg0KDQpUaGUgZWxlbWVudHMgYXJlIHVzaW5nIGEgc2V0IG9mIG1h Y3JvcyBjX2RpciwgY19maWxlLCBjX2NtZCwgY19hbGlhcyBhbmQgY19lbmQuDQpUaGVzZSBtYWNy b3MgaGVscCBmaWxsIG91dCB0aGUgY2xpX3RyZWVfdCBzdHJ1Y3R1cmUgZm9yIHRoZSBnaXZlbiB0 eXBlIG9mIGl0ZW0uDQoNClRoZSBkZXZlbG9wZXIgY2FuIGNyZWF0ZSBoaXMgb3duIHRyZWUgc3Ry dWN0dXJlIHdpdGggYW55IGNvbW1hbmRzIHRoYXQgYXJlDQpuZWVkZWQgYW5kL29yIGNhbGwgdGhl IGNsaV9kZWZhdWx0X3RyZWVfaW5pdCgpIHJvdXRpbmUgdG8gZ2V0IHRoZSBkZWZhdWx0DQpzdHJ1 Y3R1cmUgb2YgY29tbWFuZHMuIElmIHRoZSBkZXZlbG9wZXIgZG9lcyBub3Qgd2lzaCB0byBjYWxs IHRoZSBkZWZhdWx0DQpDTEkgcm91dGluZSwgdGhlbiBoZSBtdXN0IGNhbGwgdGhlIGNsaV9jcmVh dGVfcm9vdCgpIGZ1bmN0aW9uIGZpcnN0IGJlZm9yZQ0KYWRkaW5nIG90aGVyIG5vZGVzLiBPdGhl ciBub2RlcyBjYW4gYmUgYWRkZWQgYW5kIHJlbW92ZWQgYXQgYW55dGltZS4NCg0KQ0xJIE1hcCBj b21tYW5kIHN1cHBvcnQNCn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+DQoNClRoZSBDTEkgY29tbWFu ZCBoYXMgdHdvIHR5cGVzIG9mIHN1cHBvcnQgdG8gaGFuZGxlIGFyZ3VtZW50cyBub3JtYWwgYXJn Yy9hcmd2DQphbmQgdGhlIG1hcCBzeXN0ZW0uIEFzIHNob3duIGFib3ZlIHRoZSBkZXZlbG9wZXIg Y3JlYXRlcyBhIGRpcmVjdG9yeSB0cmVlIGFuZA0KYXR0YWNoZXMgYSBmdW5jdGlvbiB0byBhIGNv bW1hbmQuIFRoZSBmdW5jdGlvbiB0YWtlcyB0aGUgQ0xJIHBvaW50ZXIgcGx1cyB0aGUNCmFyZ2Mv YXJndiBhcmd1bWVudHMgYW5kIHRoZSBkZXZlbG9wZXIgY2FuIGp1c3QgcGFyc2UgdGhlIGFyZ3Vt ZW50cyB0byBkZWNvZGUNCnRoZSBjb21tYW5kIGFyZ3VtZW50cy4gU29tZXRpbWVzIHlvdSBoYXZl IG11bHRpcGxlIGNvbW1hbmRzIG9yIGRpZmZlcmVudCB2ZXJzaW9ucw0Kb2YgYSBjb21tYW5kIGJl aW5nIGhhbmRsZWQgYnkgYSBzaW5nbGUgcm91dGluZSwgdGhpcyBpcyB3ZXJlIHRoZSBtYXAgc3Vw cG9ydA0KY29tZXMgaW50byBwbGF5Lg0KDQpUaGUgbWFwIHN1cHBvcnQgZGVmaW5lcyBhIHNldCBv ZiBzdHJ1Y3QgY2xpX21hcCBtYXBbXTsgdG8gaGVscCBkZXRlY3QgdGhlDQpjb3JyZWN0IGNvbW1h bmQgZnJvbSB0aGUgdXNlci4gSW4gdGhlIGxpc3Qgb2YgY2xpX21hcCBzdHJ1Y3R1cmVzIGEgc2lu Z2xlDQpzdHJ1Y3R1cmUgY29udGFpbnMgdHdvIGl0ZW1zIGEgZGV2ZWxvcGVyIGRlZmluZWQgaW5k ZXggdmFsdWUgYW5kIGEgY29tbWFuZA0Kc3RyaW5ncy4gVGhlIGluZGV4IHZhbHVlIGlzIHVzZWQg b24gdGhlIGZ1bmN0aW9uIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyB0eXBlDQpvZiBjb21tYW5k IGZvdW5kIGluIHRoZSBsaXN0LiBUaGUgc3RyaW5nIGlzIGEgc3BlY2lhbCBwcmludGYgbGlrZSBz dHJpbmcgdG8NCmhlbHAgaWRlbnRpZnkgdGhlIGNvbW1hbmQgdHlwZWQgYnkgdGhlIHVzZXIuIE9u ZSBvZiB0aGUgZmlyc3QgdGhpbmdzIHRvZG8gaW4NCnRoZSBjb21tYW5kIHJvdXRpbmUgaXMgdG8g Y2FsbCB0aGUgY2xpX21hcHBpbmcoKSBmdW5jdGlvbiBwYXNzaW5nIGluIHRoZSBDTEkNCnBvaW50 ZXIgYW5kIHRoZSBhcmdjL2FyZ3YgdmFsdWVzLlRoZSB0d28gbWV0aG9kIGNhbiBiZSB1c2VkIGF0 IHRoZSBzYW1lIHRpbWUuDQoNClRoZSBjbGlfbWFwcGluZygpIGNvbW1hbmQgbWF0Y2hlcyB1cCB0 aGUgc3BlY2lhbCBmb3JtYXQgc3RyaW5nIHdpdGggdGhlIHZhbHVlcw0KaW4gdGhlIGFyZ2MvYXJn diBhcnJheSBhbmQgcmV0dXJucyB0aGUgZGV2ZWxvcGVyIHN1cHBsaWVkIGluZGV4IHZhbHVlIG9y IHJlYWxseQ0KdGhlIHBvaW50ZXIgdGhlIHN0cnVjdCBjbGlfbWFwIGluc3RhbmNlLg0KDQpOb3cg dGhlIGRldmVsb3BlciBjYW4gdXNlIHRoZSBjbGlfbWFwLmluZGV4IHZhbHVlIGluIGEgc3dpdGNo KCkgc3RhdGVtZW50IHRvDQpsb2NhdGUgdGhlIGNvbW1hbmQgdGhlIHVzZXIgdHlwZWQgb3IgaWYg bm90IGZvdW5kIGEgcmV0dXJuIG9mIC0xLg0KDQpFeGFtcGxlOg0KDQouLiBjb2RlLWJsb2NrOjog Yw0KDQoJc3RhdGljIGludA0KCWhlbGxvX2NtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpDQoJew0K CSAgICBpbnQgaSwgb3B0Ow0KDQoJICAgIG9wdGluZCA9IDE7DQoJICAgIHdoaWxlKChvcHQgPSBn ZXRvcHQoYXJnYywgYXJndiwgIj8iKSkgIT0gLTEpIHsNCgkgICAgICAgIHN3aXRjaChvcHQpIHsN CgkgICAgICAgICAgICBjYXNlICc/JzogY2xpX3VzYWdlKCk7IHJldHVybiAwOw0KCSAgICAgICAg ICAgIGRlZmF1bHQ6DQoJICAgICAgICAgICAgICAgIGJyZWFrOw0KCSAgICAgICAgfQ0KCSAgICB9 DQoNCgkgICAgY2xpX3ByaW50ZigiSGVsbG8gY29tbWFuZCBzYWlkOiBIZWxsbyBXb3JsZCEhICIp Ow0KCSAgICBmb3IoaSA9IDE7IGkgPCBhcmdjOyBpKyspDQoJICAgICAgICBjbGlfcHJpbnRmKCIl cyAiLCBhcmd2W2ldKTsNCgkgICAgY2xpX3ByaW50ZigiXG4iKTsNCg0KCSAgICByZXR1cm4gMDsN Cgl9DQoNCglzdGF0aWMgaW50DQoJcGNpX2ZpbGUoc3RydWN0IGNsaV9ub2RlICpub2RlLCBjaGFy ICpidWZmLCBpbnQgbGVuLCB1aW50MzJfdCBvcHQpDQoJew0KCQlpZiAoaXNfZmlsZV9vcGVuKG9w dCkpIHsNCgkJCUZJTEUgKmY7DQoNCgkJCWlmIChub2RlLT5maWxlX2RhdGEgJiYgKG5vZGUtPmZm bGFncyAmIENMSV9GUkVFX0RBVEEpKQ0KCQkJCWZyZWUobm9kZS0+ZmlsZV9kYXRhKTsNCg0KCSAg ICAgICAgbm9kZS0+ZmlsZV9kYXRhID0gbWFsbG9jKDMyICogMTAyNCk7DQoJCQlpZiAoIW5vZGUt PmZpbGVfZGF0YSkNCgkJCQlyZXR1cm4gLTE7DQoJICAgICAgICBub2RlLT5maWxlX3NpemUgPSAz MiAqIDEwMjQ7DQoJICAgICAgICBub2RlLT5mZmxhZ3MgPSBDTElfREFUQV9SRE9OTFkgfCBDTElf RlJFRV9EQVRBOw0KDQoJCQlmID0gcG9wZW4oImxzcGNpIiwgInIiKTsNCgkJCWlmICghZikNCgkJ CQlyZXR1cm4gLTE7DQoNCgkJCW5vZGUtPmZpbGVfc2l6ZSA9IGZyZWFkKG5vZGUtPmZpbGVfZGF0 YSwgMSwgbm9kZS0+ZmlsZV9zaXplLCBmKTsNCg0KCQkJcGNsb3NlKGYpOw0KCSAgICAgICAgcmV0 dXJuIDA7DQoJICAgIH0NCgkgICAgcmV0dXJuIGNsaV9maWxlX2hhbmRsZXIobm9kZSwgYnVmZiwg bGVuLCBvcHQpOw0KCX0NCg0KCXN0YXRpYyBzdHJ1Y3QgY2xpX21hcCBzaG93X21hcFtdID0gew0K CQl7IDEwLCAic2hvdyAlUCIgfSwNCgkJeyAyMCwgInNob3cgJVAgbWFjICVtIiB9LA0KCQl7IDMw LCAic2hvdyAlUCB2bGFuICVkIG1hYyAlbSIgfSwNCgkJeyA0MCwgInNob3cgJVAgJXx2bGFufG1h YyIgfSwNCgkJeyAtMSwgTlVMTCB9DQoJfTsNCg0KCXN0YXRpYyBjb25zdCBjaGFyICpzaG93X2hl bHBbXSA9IHsNCgkJInNob3cgPHBvcnRsaXN0PiIsDQoJCSJzaG93IDxwb3J0bGlzdD4gbWFjIDxl dGhlcl9hZGRyPiIsDQoJCSJzaG93IDxwb3J0bGlzdD4gdmxhbiA8dmxhbmlkPiBtYWMgPGV0aGVy X2FkZHI+IiwNCgkJInNob3cgPHBvcnRsaXN0PiBbdmxhbnxtYWNdIiwNCgkJTlVMTA0KCX07DQoN CglDTElfSU5GTyhTaG93LCBzaG93X21hcCwgc2hvd19oZWxwKTsNCg0KCXN0YXRpYyBpbnQNCglz aG93X2NtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpDQoJew0KCQlzdHJ1Y3QgY2xpX21hcCAqbTsN CgkJdWludDMyX3QgcG9ydGxpc3Q7DQoJCXN0cnVjdCBldGhlcl9hZGRyIG1hYzsNCg0KCQltID0g Y2xpX21hcHBpbmcoU2hvd19pbmZvLm1hcCwgYXJnYywgYXJndik7DQoJCWlmICghbSkNCgkJCXJl dHVybiAtMTsNCg0KCQlzd2l0Y2gobS0+aW5kZXgpIHsNCgkJCWNhc2UgMTA6DQoJCQkJcnRlX3Bh cnNlX3BvcnRsaXN0KGFyZ3ZbMV0sICZwb3J0bGlzdCk7DQoJCQkJY2xpX3ByaW50ZigiICAgU2hv dyBQb3J0bGlzdDogJTA4eFxuIiwgcG9ydGxpc3QpOw0KCQkJCWJyZWFrOw0KCQkJY2FzZSAyMDoN CgkJCQlydGVfcGFyc2VfcG9ydGxpc3QoYXJndlsxXSwgJnBvcnRsaXN0KTsNCgkJCQlydGVfZXRo ZXJfYXRvbihhcmd2WzNdLCAmbWFjKTsNCgkJCQljbGlfcHJpbnRmKCIgICBTaG93IFBvcnRsaXN0 OiAlMDh4LCBNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLA0KCQkJCQkJICAg cG9ydGxpc3QsDQoJCQkJCQkgICBtYWMuYWRkcl9ieXRlc1swXSwNCgkJCQkJCSAgIG1hYy5hZGRy X2J5dGVzWzFdLA0KCQkJCQkJICAgbWFjLmFkZHJfYnl0ZXNbMl0sDQoJCQkJCQkgICBtYWMuYWRk cl9ieXRlc1szXSwNCgkJCQkJCSAgIG1hYy5hZGRyX2J5dGVzWzRdLA0KCQkJCQkJICAgbWFjLmFk ZHJfYnl0ZXNbNV0pOw0KCQkJCWJyZWFrOw0KCQkJY2FzZSAzMDoNCgkJCQlydGVfcGFyc2VfcG9y dGxpc3QoYXJndlsxXSwgJnBvcnRsaXN0KTsNCgkJCQlydGVfZXRoZXJfYXRvbihhcmd2WzVdLCAm bWFjKTsNCgkJCQljbGlfcHJpbnRmKCIgICBTaG93IFBvcnRsaXN0OiAlMDh4IHZsYW4gJWQgTUFD OiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwNCgkJCQkJCSAgIHBvcnRsaXN0LA0K CQkJCQkJICAgYXRvaShhcmd2WzNdKSwNCgkJCQkJCSAgIG1hYy5hZGRyX2J5dGVzWzBdLA0KCQkJ CQkJICAgbWFjLmFkZHJfYnl0ZXNbMV0sDQoJCQkJCQkgICBtYWMuYWRkcl9ieXRlc1syXSwNCgkJ CQkJCSAgIG1hYy5hZGRyX2J5dGVzWzNdLA0KCQkJCQkJICAgbWFjLmFkZHJfYnl0ZXNbNF0sDQoJ CQkJCQkgICBtYWMuYWRkcl9ieXRlc1s1XSk7DQoJCQkJYnJlYWs7DQoJCQljYXNlIDQwOg0KCQkJ CXJ0ZV9wYXJzZV9wb3J0bGlzdChhcmd2WzFdLCAmcG9ydGxpc3QpOw0KCQkJCXJ0ZV9ldGhlcl9h dG9uKCIxMjM0OjQ1Njc6ODkwMSIsICZtYWMpOw0KCQkJCWNsaV9wcmludGYoIiAgIFNob3cgUG9y dGxpc3Q6ICUwOHggJXM6ICIsDQoJCQkJCQkgICBwb3J0bGlzdCwgYXJndlsyXSk7DQoJCQkJaWYg KGFyZ3ZbMl1bMF0gPT0gJ20nKQ0KCQkJCQljbGlfcHJpbnRmKCIlMDJ4OiUwMng6JTAyeDolMDJ4 OiUwMng6JTAyeFxuIiwNCgkJCQkJCSAgIG1hYy5hZGRyX2J5dGVzWzBdLA0KCQkJCQkJICAgbWFj LmFkZHJfYnl0ZXNbMV0sDQoJCQkJCQkgICBtYWMuYWRkcl9ieXRlc1syXSwNCgkJCQkJCSAgIG1h Yy5hZGRyX2J5dGVzWzNdLA0KCQkJCQkJICAgbWFjLmFkZHJfYnl0ZXNbNF0sDQoJCQkJCQkgICBt YWMuYWRkcl9ieXRlc1s1XSk7DQoJCQkJZWxzZQ0KCQkJCQljbGlfcHJpbnRmKCIlZFxuIiwgMTAx KTsNCgkJCQlicmVhazsNCgkJCWRlZmF1bHQ6DQoJCQkJY2xpX2hlbHBfc2hvdyhTaG93X2luZm8u aGVscCk7DQoJCQkJcmV0dXJuIC0xOw0KCQl9DQoJCXJldHVybiAwOw0KCX0NCg0KCXN0YXRpYyBz dHJ1Y3QgY2xpX3RyZWUgbXlfdHJlZVtdID0gew0KCQljX2RpcigiL2RhdGEiKSwNCgkgICAgY19m aWxlKCJwY2kiLAlwY2lfZmlsZSwgCSJkaXNwbGF5IGxzcGNpIGluZm9ybWF0aW9uIiksDQoJICAg IGNfZGlyKCIvYmluIiksDQoJICAgIGNfY21kKCJzaG93IiwJc2hvd19jbWQsIAkic2hvdyBtYXBw aW5nIG9wdGlvbnMiKSwNCgkgICAgY19jbWQoImhlbGxvIiwJaGVsbG9fY21kLCAJIkhlbGxvLVdv cmxkISEiKSwNCgkgICAgY19hbGlhcygiaCIsIAkiaGlzdG9yeSIsIAkiZGlzcGxheSBoaXN0b3J5 IGNvbW1hbmRzIiksDQoJICAgIGNfYWxpYXMoImxsIiwgCSJscyAtbCIsIAkibG9uZyBkaXJlY3Rv cnkgbGlzdGluZyBhbGlhcyIpLA0KCSAgICBjX2VuZCgpDQoJfTsNCg0KSGVyZSBpcyB0aGUgY2xp X3RyZWUgZm9yIHRoaXMgZXhhbXBsZSwgbm90ZSBpdCBoYXMgYSBsb3QgbW9yZSBjb21tYW5kcy4g VGhlIHNob3dfY21kDQpvciBzaG93IGNvbW1hbmQgaXMgbG9jYXRlZCBhIG51bWJlciBvZiBsaW5l cyBkb3duLiBUaGlzIGNsaV90cmVlIGNyZWF0ZXMgaW4gdGhlDQovYmluIGRpcmVjdG9yeSBhIG51 bWJlciBvZiBjb21tYW5kcywgd2hpY2ggb25lIGlzIHRoZSBzaG93IGNvbW1hbmQuIFRoZQ0Kc2hv dyBjb21tYW5kIGhhcyBmb3VyIGRpZmZlcmVudCBmb3JtYXRzIGlmIHlvdSBsb29rIGF0IHRoZSBz aG93X21hcFtdLg0KDQpUaGUgdXNlciB0eXBlcyBvbmUgb2YgdGhlc2UgY29tbWFuZHMgYW5kIGNs aV9tYXBwaW5nKCkgYXR0ZW1wdHMgdG8gbG9jYXRlIHRoZQ0KY29ycmVjdCBlbnRyeSBpbiB0aGUg bGlzdC4gWW91IHdpbGwgYWxzbyBub3RpY2UgYW5vdGhlciBzdHJ1Y3R1cmUgY2FsbGVkIHBjYXBf aGVscCwNCndoaWNoIGlzIGFuIGFycmF5IG9mIHN0cmluZ3MgZ2l2aW5nIGEgY2xlYW5lciBhbmQg bG9uZ2VyIGhlbHAgZGVzY3JpcHRpb24gb2YNCmVhY2ggb2YgdGhlIGNvbW1hbmRzLg0KDQpUaGVz ZSB0d28gc3RydWN0dXJlIHNob3dfbWFwL3Nob3dfaGVscCBjYW4gYmUgaW5jbHVkZWQgaW50byBh bm90aGVyIHN0cnVjdHVyZQ0KY2FsbGVkIGNsaV9pbmZvLiBUaGUgY2xpX2luZm8gc3RydWN0dXJl IGNvbnRhaW5zIHBvaW50ZXJzIHRvIGVhY2ggb2YgdGhlIHN0cnVjdHVyZXMNCmFuZCBhIGdyb3Vw IG5hbWUgc3RyaW5nLiBUaGUgQ0xJX0lORk8oKSBtYWNybyBpcyB1c2VkIHRvIGhlbHAgY3JlYXRl IHRoZQ0KY2xpX2luZm8gc3RydWN0dXJlIGNhbGxlZCBTaG93X2luZm8uIE5vdGUgdGhlIGZpcnN0 IGFyZ3VtZW50IGluIHRoZSBtYWNybyBpcw0KdGhlIG5hbWUgb2YgdGhlIGdyb3VwIGFuZCBpcyB1 c2VkIHRvIGNyZWF0ZSB0aGUgU2hvd19pbmZvIHN0cnVjdHVyZSBuYW1lLiBUaGUNCnNlY29uZCBh bmQgdGhpcmQgYXJndW1lbnRzIHRvIHRoZSBtYWNybyBhcmUgdGhlIG1hcCBhbmQgaGVscCBzdHJ1 Y3R1cmVzLg0KDQpUaGUgcmVhc29uIGZvciB0aGUgY2xpX2luZm8gc3RydWN0dXJlIGNhbGxlZCBT aG93X2luZm8gaXMgdG8gYmUgdXNlZCB3aXRoIHRoZQ0KY2xpX21hcF9oZWxwX2FsbChzdHJ1Y3Qg Y2xpX2luZm8gKippbmZvKTsgcm91dGluZSB0byB1c2UgdG8gZGlzcGxheQ0KaGVscCBpbmZvcm1h dGlvbiBmb3IgYXV0b2NvbXBsZXRlIGFuZCB0aGUgaGVscCBjb21tYW5kLiBUaGUgaGVscF9kYXRh W10gaXMgdXNlZA0KaW4gdGhlIGhlbHAgY29tbWFuZCB0byBkdW1wIG91dCB0aGUgaGVscCBzdHJp bmdzLiBJbiB0aGlzIGFycmF5IG9mIHN0cnVjdHVyZQ0KcG9pbnRlcnMgSSBoYXZlIGluY2x1ZGVk IGEgbnVtYmVyIG9mIGNsaV9pbmZvIHN0cnVjdHVyZXMgbm90IHNob3duIGluIHRoaXMgZG9jDQph cyBhbiBleGFtcGxlLiBUaGUgb25seSBzdHJ1Y3R1cmUgcmVxdWlyZWQgaXMgdGhlIHN0cnVjdCBj bGlfbWFwIHNob3dfbWFwW10uIFRoZQ0KU2hvd19pbmZvIGhlbHBfZGF0ZVtdIHN0cnVjdHVyZSBh bmQgY29uc3QgY2hhciAqKnNob3dfaGVscCBhcmUgbm90IHJlcXVpcmVkLg0KDQpUaGUgZm9sbG93 aW5nIGlzIGZyb20gUGt0Z2VuIHNvdXJjZSBjb2RlIHRvIHNob3cgYWRkIG1vcmUgaGVscCB0byB0 aGUgZ2xvYmFsDQpoZWxwIGZvciB0aGUgc3lzdGVtLg0KDQouLiBjb2RlLWJsb2NrOjogYw0KDQoJ c3RhdGljIHN0cnVjdCBjbGlfaW5mbyAqaGVscF9kYXRhW10gPSB7DQoJCSZUaXRsZV9pbmZvLA0K CQkmUGFnZV9pbmZvLA0KCQkmRW5hYmxlX2luZm8sDQoJCSZTZXRfaW5mbywNCgkJJlJhbmdlX2lu Zm8sDQoJCSZTZXFfaW5mbywNCgkJJlBDQVBfaW5mbywNCgkJJlN0YXJ0X2luZm8sDQoJCSZEZWJ1 Z19pbmZvLA0KCQkmTWlzY19pbmZvLA0KCQkmVGhlbWVfaW5mbywNCgkJJlN0YXR1c19pbmZvLA0K CQlOVUxMDQoJfTsNCg0KVW5kZXJzdGFuZGluZyB0aGUgQ0xJIHN5c3RlbQ0Kfn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fg0KDQpUaGUgY29tbWFuZCBsaW5lIGludGVyZmFjZSBpcyBkZWZpbmVk IGFzIGEgZmFrZSBkaXJlY3RvcnkgdHJlZSB3aXRoIGV4ZWN1dGFibGVzLA0KZGlyZWN0b3J5cyBh bmQgZmlsZXMuIFRoZSB1c2VyIHVzZXMgc2hlbGwgbGlrZSBzdGFuZGFyZCBjb21tYW5kcyB0byBt b3ZlIGFib3V0DQp0aGUgZGlyZWN0b3J5IGFuZCBleGVjdXRlIGNvbW1hbmRzLiBUaGUgQ0xJIGlz IG5vdCBhIHBvd2VyZnVsIGFzIHRoZQ0KQmFzaCBzaGVsbCwgYnV0IGhhcyBhIG51bWJlciBvZiBz aW1pbGFyIGNvbmNlcHRzLg0KDQpPdXIgZmFrZSBkaXJlY3RvcnkgdHJlZSBoYXMgYSAnLycgb3Ig cm9vdCBkaXJlY3Rvcnkgd2hpY2ggaXMgY3JlYXRlZCB3aGVuDQpjbGlfY3JlYXRlKCkgaXMgY2Fs bGVkIGFsb25nIHdpdGggdGhlIGRlZmF1bHQgc2JpbiBkaXJlY3RvcnkuIFRoZSB1c2VyIHN0YXJ0 cyBvdXQNCmF0IHRoZSByb290IGRpcmVjdG9yeSAnLycgYW5kIGlzIGFsbG93ZWQgdG8gY2QgdG8g b3RoZXIgZGlyZWN0b3JpZXMsIHdoaWNoIGNvdWxkDQpjb250YWluIG1vcmUgZXhlY3V0YWJsZXMs IGFsaWFzZXMgb3IgZGlyZWN0b3JpZXMuIFRoZSBtYXggbnVtYmVyIG9mIGRpcmVjdG9yeQ0KbGV2 ZWxzIGlzIGxpbWl0ZWQgdG8gdGhlIG51bWJlciBvZiBub2RlcyBnaXZlbiBhdCBzdGFydHVwLg0K DQpUaGUgZGVmYXVsdCBkaXJlY3RvcnkgdHJlZSBzdGFydHMgb3V0IGFzIGp1c3Qgcm9vdCAoLykg YW5kIGEgc2JpbiBkaXJlY3RvcnkuDQpBbHNvIGl0IGNvbnRhaW5zIGEgZmlsZSBjYWxsZWQgY29w eXJpZ2h0IGluIHJvb3QsIHdoaWNoIGNhbiBiZSBkaXNwbGF5ZWQNCnVzaW5nIHRoZSBkZWZhdWx0 ICdtb3JlIGNvcHlyaWdodCcgY29tbWFuZC4NCg0KQSBudW1iZXIgb2YgZGVmYXVsdCBjb21tYW5k cyBhcmUgcHJlZGVmaW5lZCBpbiB0aGUgL3NiaW4gZGlyZWN0b3J5IGFuZCBhcmUNCmRlZmluZWQg YWJvdmUuIE90aGVyIGJpbiBkaXJlY3RvcmllcyBjYW4gYmUgYWRkZWQgdG8gdGhlIHN5c3RlbSBp ZiBuZWVkZWQsDQpidXQgYSBsaW1pdCBvZiBDTElfTUFYX0JJTlMgaXMgZGVmaW5lZCBpbiB0aGUg Y2xpLmggaGVhZGVyIGZpbGUuDQoNClRoZSBDTEkgc3RydWN0dXJlIGlzIGNyZWF0ZWQgYXQgcnVu IHRpbWUgYWRkaW5nIGRpcmVjdG9yaWVzLCBjb21tYW5kcyBhbmQNCmFsaWFzZXMgYXMgbmVlZGVk LCB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgY21kbGluZSBpbnRlcmZhY2UgaW4gRFBESyB0 b2RheS4NCg0KVGhlIGJhc2ljIGNvbmNlcHQgZm9yIGEgY29tbWFuZCBpcyBzaW1pbGFyIHRvIGEg c3RhbmRhcmQgTGludXggZXhlY3V0YWJsZSwNCm1lYW5pbmcgdGhlIGNvbW1hbmQgd2hlbiBleGVj dXRlZCBpdCBpcyBwYXNzZWQgdGhlIGNvbW1hbmQgbGluZSBpbiBhIGFyZ2MvYXJndg0KZm9ybWF0 IHRvIGJlIHBhcnNlZCBieSB0aGUgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiBpcyBhdHRhY2hlZCB0 byBhIGNvbW1hbmQgZmlsZQ0KaW4gdGhlIGRpcmVjdG9yeSB0cmVlIGFuZCBpcyBleGVjdXRlZCB3 aGVuIHRoZSB1c2VyIHR5cGVzIHRoZSBuYW1lIG9mIHRoZQ0KZnVuY3Rpb24gYWxvbmcgd2l0aCBp dCBhcmd1bWVudHMuIFNvbWUgZXhhbXBsZXMgb2YgdGhlIGRlZmF1bHQgY29tbWFuZHMgY2FuIGJl DQpzZWVuIGluIHRoZSBsaWIvbGlicnRlX2NsaS9jbGlfY21kcy5jIGZpbGUuDQoNCg0K