Re: PEP 489: Multi-phase extension module initialization; version 6
Eric Snow <[email protected]> Wed, 20 May 2015 15:47:29 -0600
| Newsgroups | gmane.comp.python.import |
|---|---|
| Message-ID | <CALFfu7CtRhX4bQUBWKRsjOWkn3hiPbnmd6S_VRqPg4VJw9kK-A@mail.gmail.com> |
RllJLCBOaWNrIGFza2VkIGlmIEkgd291bGQgYmUgd2lsbGluZyB0byBiZSBCREZMLURlbGVnYXRl IGZvciB0aGlzIFBFUAphbmQgR3VpZG8gaGFzIGdpdmVuIHRoZSBva2F5LiAgSSd2ZSBhZGRlZCBt eXNlbGYgdG8gdGhlIFBFUCdzIGhlYWRlci4KSSdsbCB0cnkgdG8gbWFrZSBhIGRlY2lzaW9uIHNv b24gKGluIHRpbWUgdG8gbGFuZCB0aGUgcGF0Y2ggYmVmb3JlIHRoZQpmZWF0dXJlIGZyZWV6ZSks IGJ1dCBJIGFsc28gbXVzdCBiZSBjb25maWRlbnQgYWJvdXQgdGhlIHByb25vdW5jZW1lbnQuCgot ZXJpYwoKT24gV2VkLCBNYXkgMjAsIDIwMTUgYXQgNTozNCBBTSwgUGV0ciBWaWt0b3JpbiA8ZW5j dWtvdUBnbWFpbC5jb20+IHdyb3RlOgo+IEhlbGxvLAo+IEJhc2VkIG1haW5seSBvbiBjb21tZW50 cyBieSBFcmljIFNub3csIEkndmUgc2VudCBhbm90aGVyIHVwZGF0ZSB0byBQRVAgNDg5Lgo+Cj4g U2VlIHRoZSBkaWZmIGF0IGh0dHBzOi8vaGcucHl0aG9uLm9yZy9wZXBzL3Jldi9hYWQ3YTM5YTY5 NWIKPgo+IEhlcmUgaXMgYSBjb3B5IGZvciB5b3VyIGNvbnZlbmllbmNlOgo+Cj4gUEVQOiA0ODkK PiBUaXRsZTogTXVsdGktcGhhc2UgZXh0ZW5zaW9uIG1vZHVsZSBpbml0aWFsaXphdGlvbgo+IFZl cnNpb246ICRSZXZpc2lvbiQKPiBMYXN0LU1vZGlmaWVkOiAkRGF0ZSQKPiBBdXRob3I6IFBldHIg VmlrdG9yaW4gPGVuY3Vrb3VAZ21haWwuY29tPiwKPiAgICAgICAgIFN0ZWZhbiBCZWhuZWwgPHN0 ZWZhbl9tbEBiZWhuZWwuZGU+LAo+ICAgICAgICAgTmljayBDb2dobGFuIDxuY29naGxhbkBnbWFp bC5jb20+Cj4gRGlzY3Vzc2lvbnMtVG86IGltcG9ydC1zaWdAcHl0aG9uLm9yZwo+IFN0YXR1czog RHJhZnQKPiBUeXBlOiBTdGFuZGFyZHMgVHJhY2sKPiBDb250ZW50LVR5cGU6IHRleHQveC1yc3QK PiBDcmVhdGVkOiAxMS1BdWctMjAxMwo+IFB5dGhvbi1WZXJzaW9uOiAzLjUKPiBQb3N0LUhpc3Rv cnk6IDIzLUF1Zy0yMDEzLCAyMC1GZWItMjAxNSwgMTYtQXByLTIwMTUKPiBSZXNvbHV0aW9uOgo+ Cj4KPiBBYnN0cmFjdAo+ID09PT09PT09Cj4KPiBUaGlzIFBFUCBwcm9wb3NlcyBhIHJlZGVzaWdu IG9mIHRoZSB3YXkgaW4gd2hpY2ggYnVpbHQtaW4gYW5kIGV4dGVuc2lvbiBtb2R1bGVzCj4gaW50 ZXJhY3Qgd2l0aCB0aGUgaW1wb3J0IG1hY2hpbmVyeS4gVGhpcyB3YXMgbGFzdCByZXZpc2VkIGZv ciBQeXRob24gMy4wIGluIFBFUAo+IDMxMjEsIGJ1dCBkaWQgbm90IHNvbHZlIGFsbCBwcm9ibGVt cyBhdCB0aGUgdGltZS4gVGhlIGdvYWwgaXMgdG8gc29sdmUKPiBpbXBvcnQtcmVsYXRlZCBwcm9i bGVtcyBieSBicmluZ2luZyBleHRlbnNpb24gbW9kdWxlcyBjbG9zZXIgdG8gdGhlIHdheSBQeXRo b24KPiBtb2R1bGVzIGJlaGF2ZTsgc3BlY2lmaWNhbGx5IHRvIGhvb2sgaW50byB0aGUgTW9kdWxl U3BlYy1iYXNlZCBsb2FkaW5nCj4gbWVjaGFuaXNtIGludHJvZHVjZWQgaW4gUEVQIDQ1MS4KPgo+ IFRoaXMgcHJvcG9zYWwgZHJhd3MgaW5zcGlyYXRpb24gZnJvbSBQeVR5cGVfU3BlYyBvZiBQRVAg Mzg0IHRvIGFsbG93IGV4dGVuc2lvbgo+IGF1dGhvcnMgdG8gb25seSBkZWZpbmUgZmVhdHVyZXMg dGhleSBuZWVkLCBhbmQgdG8gYWxsb3cgZnV0dXJlIGFkZGl0aW9ucwo+IHRvIGV4dGVuc2lvbiBt b2R1bGUgZGVjbGFyYXRpb25zLgo+Cj4gRXh0ZW5zaW9ucyBtb2R1bGVzIGFyZSBjcmVhdGVkIGlu IGEgdHdvLXN0ZXAgcHJvY2VzcywgZml0dGluZyBiZXR0ZXIgaW50bwo+IHRoZSBNb2R1bGVTcGVj IGFyY2hpdGVjdHVyZSwgd2l0aCBwYXJhbGxlbHMgdG8gX19uZXdfXyBhbmQgX19pbml0X18gb2Yg Y2xhc3Nlcy4KPgo+IEV4dGVuc2lvbiBtb2R1bGVzIGNhbiBzYWZlbHkgc3RvcmUgYXJiaXRyYXJ5 IEMtbGV2ZWwgcGVyLW1vZHVsZSBzdGF0ZSBpbgo+IHRoZSBtb2R1bGUgdGhhdCBpcyBjb3ZlcmVk IGJ5IG5vcm1hbCBnYXJiYWdlIGNvbGxlY3Rpb24gYW5kIHN1cHBvcnRzCj4gcmVsb2FkaW5nIGFu ZCBzdWItaW50ZXJwcmV0ZXJzLgo+IEV4dGVuc2lvbiBhdXRob3JzIGFyZSBlbmNvdXJhZ2VkIHRv IHRha2UgdGhlc2UgaXNzdWVzIGludG8gYWNjb3VudAo+IHdoZW4gdXNpbmcgdGhlIG5ldyBBUEku Cj4KPiBUaGUgcHJvcG9zYWwgYWxzbyBhbGxvd3MgZXh0ZW5zaW9uIG1vZHVsZXMgd2l0aCBub24t QVNDSUkgbmFtZXMuCj4KPiBOb3QgYWxsIHByb2JsZW1zIHRhY2tsZWQgaW4gUEVQIDMxMjEgYXJl IHNvbHZlZCBpbiB0aGlzIHByb3Bvc2FsLgo+IEluIHBhcnRpY3VsYXIsIHByb2JsZW1zIHdpdGgg cnVuLXRpbWUgbW9kdWxlIGxvb2t1cCAoUHlTdGF0ZV9GaW5kTW9kdWxlKQo+IGFyZSBsZWZ0IHRv IGEgZnV0dXJlIFBFUC4KPgo+Cj4gTW90aXZhdGlvbgo+ID09PT09PT09PT0KPgo+IFB5dGhvbiBt b2R1bGVzIGFuZCBleHRlbnNpb24gbW9kdWxlcyBhcmUgbm90IGJlaW5nIHNldCB1cCBpbiB0aGUg c2FtZSB3YXkuCj4gRm9yIFB5dGhvbiBtb2R1bGVzLCB0aGUgbW9kdWxlIG9iamVjdCBpcyBjcmVh dGVkIGFuZCBzZXQgdXAgZmlyc3QsIHRoZW4gdGhlCj4gbW9kdWxlIGNvZGUgaXMgYmVpbmcgZXhl Y3V0ZWQgKFBFUCAzMDIpLgo+IEEgTW9kdWxlU3BlYyBvYmplY3QgKFBFUCA0NTEpIGlzIHVzZWQg dG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbW9kdWxlLAo+IGFuZCBwYXNzZWQgdG8gdGhl IHJlbGV2YW50IGhvb2tzLgo+Cj4gRm9yIGV4dGVuc2lvbnMgKGkuZS4gc2hhcmVkIGxpYnJhcmll cykgYW5kIGJ1aWx0LWluIG1vZHVsZXMsIHRoZSBtb2R1bGUKPiBpbml0IGZ1bmN0aW9uIGlzIGV4 ZWN1dGVkIHN0cmFpZ2h0IGF3YXkgYW5kIGRvZXMgYm90aCB0aGUgY3JlYXRpb24gYW5kCj4gaW5p dGlhbGl6YXRpb24uIFRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyBub3QgcGFzc2VkIHRo ZSBNb2R1bGVTcGVjLAo+IG9yIGFueSBpbmZvcm1hdGlvbiBpdCBjb250YWlucywgc3VjaCBhcyB0 aGUgX19maWxlX18gb3IgZnVsbHktcXVhbGlmaWVkCj4gbmFtZS4gVGhpcyBoaW5kZXJzIHJlbGF0 aXZlIGltcG9ydHMgYW5kIHJlc291cmNlIGxvYWRpbmcuCj4KPiBJbiBQeTMsIG1vZHVsZXMgYXJl IGFsc28gbm90IGJlaW5nIGFkZGVkIHRvIHN5cy5tb2R1bGVzLCB3aGljaCBtZWFucyB0aGF0IGEK PiAocG90ZW50aWFsbHkgdHJhbnNpdGl2ZSkgcmUtaW1wb3J0IG9mIHRoZSBtb2R1bGUgd2lsbCBy ZWFsbHkgdHJ5IHRvIHJlLWltcG9ydAo+IGl0IGFuZCB0aHVzIHJ1biBpbnRvIGFuIGluZmluaXRl IGxvb3Agd2hlbiBpdCBleGVjdXRlcyB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24KPiBhZ2Fpbi4g V2l0aG91dCBhY2Nlc3MgdG8gdGhlIGZ1bGx5LXF1YWxpZmllZCBtb2R1bGUgbmFtZSwgaXQgaXMg bm90IHRyaXZpYWwgdG8KPiBjb3JyZWN0bHkgYWRkIHRoZSBtb2R1bGUgdG8gc3lzLm1vZHVsZXMg ZWl0aGVyLgo+IFRoaXMgaXMgc3BlY2lmaWNhbGx5IGEgcHJvYmxlbSBmb3IgQ3l0aG9uIGdlbmVy YXRlZCBtb2R1bGVzLCBmb3Igd2hpY2ggaXQncwo+IG5vdCB1bmNvbW1vbiB0aGF0IHRoZSBtb2R1 bGUgaW5pdCBjb2RlIGhhcyB0aGUgc2FtZSBsZXZlbCBvZiBjb21wbGV4aXR5IGFzCj4gdGhhdCBv ZiBhbnkgJ3JlZ3VsYXInIFB5dGhvbiBtb2R1bGUuIEFsc28sIHRoZSBsYWNrIG9mIF9fZmlsZV9f IGFuZCBfX25hbWVfXwo+IGluZm9ybWF0aW9uIGhpbmRlcnMgdGhlIGNvbXBpbGF0aW9uIG9mICJf X2luaXRfXy5weSIgbW9kdWxlcywgaS5lLiBwYWNrYWdlcywKPiBlc3BlY2lhbGx5IHdoZW4gcmVs YXRpdmUgaW1wb3J0cyBhcmUgYmVpbmcgdXNlZCBhdCBtb2R1bGUgaW5pdCB0aW1lLgo+Cj4gRnVy dGhlcm1vcmUsIHRoZSBtYWpvcml0eSBvZiBjdXJyZW50bHkgZXhpc3RpbmcgZXh0ZW5zaW9uIG1v ZHVsZXMgaGFzCj4gcHJvYmxlbXMgd2l0aCBzdWItaW50ZXJwcmV0ZXIgc3VwcG9ydCBhbmQvb3Ig aW50ZXJwcmV0ZXIgcmVsb2FkaW5nLCBhbmQsIHdoaWxlCj4gaXQgaXMgcG9zc2libGUgd2l0aCB0 aGUgY3VycmVudCBpbmZyYXN0cnVjdHVyZSB0byBzdXBwb3J0IHRoZXNlCj4gZmVhdHVyZXMsIGl0 IGlzIG5laXRoZXIgZWFzeSBub3IgZWZmaWNpZW50Lgo+IEFkZHJlc3NpbmcgdGhlc2UgaXNzdWVz IHdhcyB0aGUgZ29hbCBvZiBQRVAgMzEyMSwgYnV0IG1hbnkgZXh0ZW5zaW9ucywKPiBpbmNsdWRp bmcgc29tZSBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeSwgdG9vayB0aGUgbGVhc3QtZWZmb3J0IGFw cHJvYWNoCj4gdG8gcG9ydGluZyB0byBQeXRob24gMywgbGVhdmluZyB0aGVzZSBpc3N1ZXMgdW5y ZXNvbHZlZC4KPiBUaGlzIFBFUCBrZWVwcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2hpY2gg c2hvdWxkIHJlZHVjZSBwcmVzc3VyZSBhbmQgZ2l2ZQo+IGV4dGVuc2lvbiBhdXRob3JzIGFkZXF1 YXRlIHRpbWUgdG8gY29uc2lkZXIgdGhlc2UgaXNzdWVzIHdoZW4gcG9ydGluZy4KPgo+Cj4gVGhl IGN1cnJlbnQgcHJvY2Vzcwo+ID09PT09PT09PT09PT09PT09PT0KPgo+IEN1cnJlbnRseSwgZXh0 ZW5zaW9uIGFuZCBidWlsdC1pbiBtb2R1bGVzIGV4cG9ydCBhbiBpbml0aWFsaXphdGlvbiBmdW5j dGlvbgo+IG5hbWVkICJQeUluaXRfbW9kdWxlbmFtZSIsIG5hbWVkIGFmdGVyIHRoZSBmaWxlIG5h bWUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5Lgo+IFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYnkg dGhlIGltcG9ydCBtYWNoaW5lcnkgYW5kIG11c3QgcmV0dXJuIGEgZnVsbHkKPiBpbml0aWFsaXpl ZCBtb2R1bGUgb2JqZWN0Lgo+IFRoZSBmdW5jdGlvbiByZWNlaXZlcyBubyBhcmd1bWVudHMsIHNv IGl0IGhhcyBubyB3YXkgb2Yga25vd2luZyBhYm91dCBpdHMKPiBpbXBvcnQgY29udGV4dC4KPgo+ IER1cmluZyBpdHMgZXhlY3V0aW9uLCB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24gY3JlYXRlcyBh IG1vZHVsZSBvYmplY3QKPiBiYXNlZCBvbiBhIFB5TW9kdWxlRGVmIG9iamVjdC4gSXQgdGhlbiBj b250aW51ZXMgdG8gaW5pdGlhbGl6ZSBpdCBieSBhZGRpbmcKPiBhdHRyaWJ1dGVzIHRvIHRoZSBt b2R1bGUgZGljdCwgY3JlYXRpbmcgdHlwZXMsIGV0Yy4KPgo+IEluIHRoZSBiYWNrLCB0aGUgc2hh cmVkIGxpYnJhcnkgbG9hZGVyIGtlZXBzIGEgbm90ZSBvZiB0aGUgZnVsbHkgcXVhbGlmaWVkCj4g bW9kdWxlIG5hbWUgb2YgdGhlIGxhc3QgbW9kdWxlIHRoYXQgaXQgbG9hZGVkLCBhbmQgd2hlbiBh IG1vZHVsZSBnZXRzCj4gY3JlYXRlZCB0aGF0IGhhcyBhIG1hdGNoaW5nIG5hbWUsIHRoaXMgZ2xv YmFsIHZhcmlhYmxlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lCj4gdGhlIGZ1bGx5IHF1YWxpZmllZCBu YW1lIG9mIHRoZSBtb2R1bGUgb2JqZWN0LiBUaGlzIGlzIG5vdCBlbnRpcmVseSBzYWZlIGFzIGl0 Cj4gcmVsaWVzIG9uIHRoZSBtb2R1bGUgaW5pdCBmdW5jdGlvbiBjcmVhdGluZyBpdHMgb3duIG1v ZHVsZSBvYmplY3QgZmlyc3QsCj4gYnV0IHRoaXMgYXNzdW1wdGlvbiB1c3VhbGx5IGhvbGRzIGlu IHByYWN0aWNlLgo+Cj4KPiBUaGUgcHJvcG9zYWwKPiA9PT09PT09PT09PT0KPgo+IFRoZSBpbml0 aWFsaXphdGlvbiBmdW5jdGlvbiAoUHlJbml0X21vZHVsZW5hbWUpIHdpbGwgYmUgYWxsb3dlZCB0 byByZXR1cm4KPiBhIHBvaW50ZXIgdG8gYSBQeU1vZHVsZURlZiBvYmplY3QuIFRoZSBpbXBvcnQg bWFjaGluZXJ5IHdpbGwgYmUgaW4gY2hhcmdlCj4gb2YgY29uc3RydWN0aW5nIHRoZSBtb2R1bGUg b2JqZWN0LCBjYWxsaW5nIGhvb2tzIHByb3ZpZGVkIGluIHRoZSBQeU1vZHVsZURlZgo+IGluIHRo ZSByZWxldmFudCBwaGFzZXMgb2YgaW5pdGlhbGl6YXRpb24gKGFzIGRlc2NyaWJlZCBiZWxvdyku Cj4KPiBUaGlzIG11bHRpLXBoYXNlIGluaXRpYWxpemF0aW9uIGlzIGFuIGFkZGl0aW9uYWwgcG9z c2liaWxpdHkuIFNpbmdsZS1waGFzZQo+IGluaXRpYWxpemF0aW9uLCB0aGUgY3VycmVudCBwcmFj dGljZSBvZiByZXR1cm5pbmcgYSBmdWxseSBpbml0aWFsaXplZCBtb2R1bGUKPiBvYmplY3QsIHdp bGwgc3RpbGwgYmUgYWNjZXB0ZWQsIHNvIGV4aXN0aW5nIGNvZGUgd2lsbCB3b3JrIHVuY2hhbmdl ZCwKPiBpbmNsdWRpbmcgYmluYXJ5IGNvbXBhdGliaWxpdHkuCj4KPiBUaGUgUHlNb2R1bGVEZWYg c3RydWN0dXJlIHdpbGwgYmUgY2hhbmdlZCB0byBjb250YWluIGEgbGlzdCBvZiBzbG90cywKPiBz aW1pbGFybHkgdG8gUEVQIDM4NCdzIFB5VHlwZV9TcGVjIGZvciB0eXBlcy4KPiBUbyBrZWVwIGJp bmFyeSBjb21wYXRpYmlsaXR5LCBhbmQgYXZvaWQgbmVlZGluZyB0byBpbnRyb2R1Y2UgYSBuZXcg c3RydWN0dXJlCj4gKHdoaWNoIHdvdWxkIGludHJvZHVjZSBhZGRpdGlvbmFsIHN1cHBvcnRpbmcg ZnVuY3Rpb25zIGFuZCBwZXItbW9kdWxlIHN0b3JhZ2UpLAo+IHRoZSBjdXJyZW50bHkgdW51c2Vk IG1fcmVsb2FkIHBvaW50ZXIgb2YgUHlNb2R1bGVEZWYgd2lsbCBiZSBjaGFuZ2VkIHRvCj4gaG9s ZCB0aGUgc2xvdHMuIFRoZSBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkIGFzOjoKPgo+ICAgICB0eXBl ZGVmIHN0cnVjdCB7Cj4gICAgICAgICBpbnQgc2xvdDsKPiAgICAgICAgIHZvaWQgKnZhbHVlOwo+ ICAgICB9IFB5TW9kdWxlRGVmX1Nsb3Q7Cj4KPiAgICAgdHlwZWRlZiBzdHJ1Y3QgUHlNb2R1bGVE ZWYgewo+ICAgICAgICAgUHlNb2R1bGVEZWZfQmFzZSBtX2Jhc2U7Cj4gICAgICAgICBjb25zdCBj aGFyKiBtX25hbWU7Cj4gICAgICAgICBjb25zdCBjaGFyKiBtX2RvYzsKPiAgICAgICAgIFB5X3Nz aXplX3QgbV9zaXplOwo+ICAgICAgICAgUHlNZXRob2REZWYgKm1fbWV0aG9kczsKPiAgICAgICAg IFB5TW9kdWxlRGVmX1Nsb3QgKm1fc2xvdHM7ICAvKiBjaGFuZ2VkIGZyb20gYGlucXVpcnkgbV9y ZWxvYWQ7YCAqLwo+ICAgICAgICAgdHJhdmVyc2Vwcm9jIG1fdHJhdmVyc2U7Cj4gICAgICAgICBp bnF1aXJ5IG1fY2xlYXI7Cj4gICAgICAgICBmcmVlZnVuYyBtX2ZyZWU7Cj4gICAgIH0gUHlNb2R1 bGVEZWY7Cj4KPiBUaGUgKm1fc2xvdHMqIG1lbWJlciBtdXN0IGJlIGVpdGhlciBOVUxMLCBvciBw b2ludCB0byBhbiBhcnJheSBvZgo+IFB5TW9kdWxlRGVmX1Nsb3Qgc3RydWN0dXJlcywgdGVybWlu YXRlZCBieSBhIHNsb3Qgd2l0aCBpZCBzZXQgdG8gMAo+IChpLmUuIGBgezAsIE5VTEx9YGApLgo+ Cj4gVG8gc3BlY2lmeSBhIHNsb3QsIGEgdW5pcXVlIHNsb3QgSUQgbXVzdCBiZSBwcm92aWRlZC4K PiBOZXcgUHl0aG9uIHZlcnNpb25zIG1heSBpbnRyb2R1Y2UgbmV3IHNsb3QgSURzLCBidXQgc2xv dCBJRHMgd2lsbCBuZXZlciBiZQo+IHJlY3ljbGVkLiBTbG90cyBtYXkgZ2V0IGRlcHJlY2F0ZWQs IGJ1dCB3aWxsIGNvbnRpbnVlIHRvIGJlIHN1cHBvcnRlZAo+IHRocm91Z2hvdXQgUHl0aG9uIDMu eC4KPgo+IEEgc2xvdCdzIHZhbHVlIHBvaW50ZXIgbWF5IG5vdCBiZSBOVUxMLCB1bmxlc3Mgc3Bl Y2lmaWVkIG90aGVyd2lzZSBpbiB0aGUKPiBzbG90J3MgZG9jdW1lbnRhdGlvbi4KPgo+IFRoZSBm b2xsb3dpbmcgc2xvdHMgYXJlIGN1cnJlbnRseSBhdmFpbGFibGUsIGFuZCBkZXNjcmliZWQgbGF0 ZXI6Cj4KPiAqIFB5X21vZF9jcmVhdGUKPiAqIFB5X21vZF9leGVjCj4KPiBVbmtub3duIHNsb3Qg SURzIHdpbGwgY2F1c2UgdGhlIGltcG9ydCB0byBmYWlsIHdpdGggU3lzdGVtRXJyb3IuCj4KPiBX aGVuIHVzaW5nIG11bHRpLXBoYXNlIGluaXRpYWxpemF0aW9uLCB0aGUgKm1fbmFtZSogZmllbGQg b2YgUHlNb2R1bGVEZWYgd2lsbAo+IG5vdCBiZSB1c2VkIGR1cmluZyBpbXBvcnRpbmc7IHRoZSBt b2R1bGUgbmFtZSB3aWxsIGJlIHRha2VuIGZyb20gdGhlIE1vZHVsZVNwZWMuCj4KPiBUbyBwcmV2 ZW50IGNyYXNoZXMgd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZCBpbiBvbGRlciB2ZXJzaW9ucyBv ZiBQeXRob24sCj4gdGhlIFB5TW9kdWxlRGVmIG9iamVjdCBtdXN0IGJlIGluaXRpYWxpemVkIHVz aW5nIHRoZSBuZXdseSBhZGRlZAo+IFB5TW9kdWxlRGVmX0luaXQgZnVuY3Rpb24uIFRoaXMgc2V0 cyB0aGUgb2JqZWN0IHR5cGUgKHdoaWNoIGNhbm5vdCBiZSBkb25lCj4gc3RhdGljYWxseSBvbiBj ZXJ0YWluIGNvbXBpbGVycyksIHJlZmNvdW50LCBhbmQgaW50ZXJuYWwgYm9va2tlZXBpbmcgZGF0 YQo+IChtX2luZGV4KS4KPiBGb3IgZXhhbXBsZSwgYW4gZXh0ZW5zaW9uIG1vZHVsZSAiZXhhbXBs ZSIgd291bGQgYmUgZXhwb3J0ZWQgYXM6Ogo+Cj4gICAgIHN0YXRpYyBQeU1vZHVsZURlZiBleGFt cGxlX2RlZiA9IHsuLi59Cj4KPiAgICAgUHlNT0RJTklUX0ZVTkMKPiAgICAgUHlJbml0X2V4YW1w bGUodm9pZCkKPiAgICAgewo+ICAgICAgICAgcmV0dXJuIFB5TW9kdWxlRGVmX0luaXQoJmV4YW1w bGVfZGVmKTsKPiAgICAgfQo+Cj4gVGhlIFB5TW9kdWxlRGVmIG9iamVjdCBtdXN0IGJlIGF2YWls YWJsZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBtb2R1bGUgY3JlYXRlZAo+IGZyb20gaXQg4oCT IHVzdWFsbHksIGl0IHdpbGwgYmUgZGVjbGFyZWQgc3RhdGljYWxseS4KPgo+IFBzZXVkby1jb2Rl IE92ZXJ2aWV3Cj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0KPgo+IEhlcmUgaXMgYW4gb3ZlcnZpZXcg b2YgaG93IHRoZSBtb2RpZmllZCBpbXBvcnRlcnMgd2lsbCBvcGVyYXRlLgo+IERldGFpbHMgc3Vj aCBhcyBsb2dnaW5nIG9yIGhhbmRsaW5nIG9mIGVycm9ycyBhbmQgaW52YWxpZCBzdGF0ZXMKPiBh cmUgbGVmdCBvdXQsIGFuZCBDIGNvZGUgaXMgcHJlc2VudGVkIHdpdGggYSBjb25jaXNlIFB5dGhv bi1saWtlIHN5bnRheC4KPgo+IFRoZSBmcmFtZXdvcmsgdGhhdCBjYWxscyB0aGUgaW1wb3J0ZXJz IGlzIGV4cGxhaW5lZCBpbiBQRVAgNDUxCj4gWyNwZXAtMDQ1MS1sb2FkaW5nXV8uCj4KPiA6Ogo+ Cj4gICAgIGltcG9ydGxpYi9fYm9vdHN0cmFwLnB5Ogo+Cj4gICAgICAgICBjbGFzcyBCdWlsdGlu SW1wb3J0ZXI6Cj4gICAgICAgICAgICAgZGVmIGNyZWF0ZV9tb2R1bGUoc2VsZiwgc3BlYyk6Cj4g ICAgICAgICAgICAgICAgIG1vZHVsZSA9IF9pbXAuY3JlYXRlX2J1aWx0aW4oc3BlYykKPgo+ICAg ICAgICAgICAgIGRlZiBleGVjX21vZHVsZShzZWxmLCBtb2R1bGUpOgo+ICAgICAgICAgICAgICAg ICBfaW1wLmV4ZWNfZHluYW1pYyhtb2R1bGUpCj4KPiAgICAgICAgICAgICBkZWYgbG9hZF9tb2R1 bGUoc2VsZiwgbmFtZSk6Cj4gICAgICAgICAgICAgICAgICMgdXNlIGEgYmFja3dhcmRzIGNvbXBh dGliaWxpdHkgc2hpbQo+ICAgICAgICAgICAgICAgICBfbG9hZF9tb2R1bGVfc2hpbShzZWxmLCBu YW1lKQo+Cj4gICAgIGltcG9ydGxpYi9fYm9vdHN0cmFwX2V4dGVybmFsLnB5Ogo+Cj4gICAgICAg ICBjbGFzcyBFeHRlbnNpb25GaWxlTG9hZGVyOgo+ICAgICAgICAgICAgIGRlZiBjcmVhdGVfbW9k dWxlKHNlbGYsIHNwZWMpOgo+ICAgICAgICAgICAgICAgICBtb2R1bGUgPSBfaW1wLmNyZWF0ZV9k eW5hbWljKHNwZWMpCj4KPiAgICAgICAgICAgICBkZWYgZXhlY19tb2R1bGUoc2VsZiwgbW9kdWxl KToKPiAgICAgICAgICAgICAgICAgX2ltcC5leGVjX2R5bmFtaWMobW9kdWxlKQo+Cj4gICAgICAg ICAgICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIG5hbWUpOgo+ICAgICAgICAgICAgICAgICAjIHVz ZSBhIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHNoaW0KPiAgICAgICAgICAgICAgICAgX2xvYWRf bW9kdWxlX3NoaW0oc2VsZiwgbmFtZSkKPgo+ICAgICBQeXRob24vaW1wb3J0LmMgKHRoZSBfaW1w IG1vZHVsZSk6Cj4KPiAgICAgICAgIGRlZiBjcmVhdGVfZHluYW1pYyhzcGVjKToKPiAgICAgICAg ICAgICBuYW1lID0gc3BlYy5uYW1lCj4gICAgICAgICAgICAgcGF0aCA9IHNwZWMub3JpZ2luCj4K PiAgICAgICAgICAgICAjIEZpbmQgYW4gYWxyZWFkeSBsb2FkZWQgbW9kdWxlIHRoYXQgdXNlZCBz aW5nbGUtcGhhc2UgaW5pdC4KPiAgICAgICAgICAgICAjIEZvciBtdWx0aS1waGFzZSBpbml0aWFs aXphdGlvbiwgbW9kIGlzIE5VTEwsIHNvIGEgbmV3IG1vZHVsZQo+ICAgICAgICAgICAgICMgaXMg YWx3YXlzIGNyZWF0ZWQuCj4gICAgICAgICAgICAgbW9kID0gX1B5SW1wb3J0X0ZpbmRFeHRlbnNp b25PYmplY3QobmFtZSwgbmFtZSkKPiAgICAgICAgICAgICBpZiBtb2Q6Cj4gICAgICAgICAgICAg ICAgIHJldHVybiBtb2QKPgo+ICAgICAgICAgICAgIHJldHVybiBfUHlJbXBvcnRfTG9hZER5bmFt aWNNb2R1bGVXaXRoU3BlYyhzcGVjKQo+Cj4gICAgICAgICBkZWYgZXhlY19keW5hbWljKG1vZHVs ZSk6Cj4gICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobW9kdWxlLCB0eXBlcy5Nb2R1bGVU eXBlKToKPiAgICAgICAgICAgICAgICAgIyBub24tbW9kdWxlcyBhcmUgc2tpcHBlZCAtLSBQeU1v ZHVsZV9HZXREZWYgZmFpbHMgb24gdGhlbQo+ICAgICAgICAgICAgICAgICByZXR1cm4KPgo+ICAg ICAgICAgICAgIGRlZiA9IFB5TW9kdWxlX0dldERlZihtb2R1bGUpCj4gICAgICAgICAgICAgc3Rh dGUgPSBQeU1vZHVsZV9HZXRTdGF0ZShtb2R1bGUpCj4gICAgICAgICAgICAgaWYgc3RhdGUgaXMg TlVMTDoKPiAgICAgICAgICAgICAgICAgUHlNb2R1bGVfRXhlY0RlZihtb2R1bGUsIGRlZikKPgo+ ICAgICAgICAgZGVmIGNyZWF0ZV9idWlsdGluKHNwZWMpOgo+ICAgICAgICAgICAgIG5hbWUgPSBz cGVjLm5hbWUKPgo+ICAgICAgICAgICAgICMgRmluZCBhbiBhbHJlYWR5IGxvYWRlZCBtb2R1bGUg dGhhdCB1c2VkIHNpbmdsZS1waGFzZSBpbml0Lgo+ICAgICAgICAgICAgICMgRm9yIG11bHRpLXBo YXNlIGluaXRpYWxpemF0aW9uLCBtb2QgaXMgTlVMTCwgc28gYSBuZXcgbW9kdWxlCj4gICAgICAg ICAgICAgIyBpcyBhbHdheXMgY3JlYXRlZC4KPiAgICAgICAgICAgICBtb2QgPSBfUHlJbXBvcnRf RmluZEV4dGVuc2lvbk9iamVjdChuYW1lLCBuYW1lKQo+ICAgICAgICAgICAgIGlmIG1vZDoKPiAg ICAgICAgICAgICAgICAgcmV0dXJuIG1vZAo+Cj4gICAgICAgICAgICAgZm9yIGluaXRuYW1lLCBp bml0ZnVuYyBpbiBQeUltcG9ydF9Jbml0dGFiOgo+ICAgICAgICAgICAgICAgICBpZiBuYW1lID09 IGluaXRuYW1lOgo+ICAgICAgICAgICAgICAgICAgICAgbSA9IGluaXRmdW5jKCkKPiAgICAgICAg ICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobSwgUHlNb2R1bGVEZWYpOgo+ICAgICAgICAgICAg ICAgICAgICAgICAgIGRlZiA9IG0KPiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHlN b2R1bGVfRnJvbURlZkFuZFNwZWMoZGVmLCBzcGVjKQo+ICAgICAgICAgICAgICAgICAgICAgZWxz ZToKPiAgICAgICAgICAgICAgICAgICAgICAgICAjIGZhbGwgYmFjayB0byBzaW5nbGUtcGhhc2Ug aW5pdGlhbGl6YXRpb24KPiAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgPSBtCj4gICAg ICAgICAgICAgICAgICAgICAgICAgX1B5SW1wb3J0X0ZpeHVwRXh0ZW5zaW9uT2JqZWN0KG1vZHVs ZSwgbmFtZSwgbmFtZSkKPiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlCj4K PiAgICAgUHl0aG9uL2ltcG9ydGRsLmM6Cj4KPiAgICAgICAgIGRlZiBfUHlJbXBvcnRfTG9hZER5 bmFtaWNNb2R1bGVXaXRoU3BlYyhzcGVjKToKPiAgICAgICAgICAgICBwYXRoID0gc3BlYy5vcmln aW4KPiAgICAgICAgICAgICBwYWNrYWdlLCBkb3QsIG5hbWUgPSBzcGVjLm5hbWUucnBhcnRpdGlv bignLicpCj4KPiAgICAgICAgICAgICAjIHNlZSB0aGUgIk5vbi1BU0NJSSBtb2R1bGUgbmFtZXMi IHNlY3Rpb24gZm9yIGV4cG9ydF9ob29rX25hbWUKPiAgICAgICAgICAgICBob29rX25hbWUgPSBl eHBvcnRfaG9va19uYW1lKG5hbWUpCj4KPiAgICAgICAgICAgICAjIGNhbGwgcGxhdGZvcm0tc3Bl Y2lmaWMgZnVuY3Rpb24gZm9yIGxvYWRpbmcgZXhwb3J0ZWQgZnVuY3Rpb24KPiAgICAgICAgICAg ICAjIGZyb20gc2hhcmVkIGxpYnJhcnkKPiAgICAgICAgICAgICBleHBvcnRmdW5jID0gX2ZpbmRf c2hhcmVkX2Z1bmNwdHIoaG9va19uYW1lLCBwYXRoKQo+Cj4gICAgICAgICAgICAgbSA9IGV4cG9y dGZ1bmMoKQo+ICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobSwgUHlNb2R1bGVEZWYpOgo+ICAg ICAgICAgICAgICAgICBkZWYgPSBtCj4gICAgICAgICAgICAgICAgIHJldHVybiBQeU1vZHVsZV9G cm9tRGVmQW5kU3BlYyhkZWYsIHNwZWMpCj4KPiAgICAgICAgICAgICBtb2R1bGUgPSBtCj4KPiAg ICAgICAgICAgICAjIGZhbGwgYmFjayB0byBzaW5nbGUtcGhhc2UgaW5pdGlhbGl6YXRpb24KPiAg ICAgICAgICAgICAuLi4uCj4KPiAgICAgT2JqZWN0cy9tb2R1bGVvYmplY3QuYzoKPgo+ICAgICAg ICAgZGVmIFB5TW9kdWxlX0Zyb21EZWZBbmRTcGVjKGRlZiwgc3BlYyk6Cj4gICAgICAgICAgICAg bmFtZSA9IHNwZWMubmFtZQo+ICAgICAgICAgICAgIGNyZWF0ZSA9IE5vbmUKPiAgICAgICAgICAg ICBmb3Igc2xvdCwgdmFsdWUgaW4gZGVmLm1fc2xvdHM6Cj4gICAgICAgICAgICAgICAgIGlmIHNs b3QgPT0gUHlfbW9kX2NyZWF0ZToKPiAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZSA9IHZhbHVl Cj4gICAgICAgICAgICAgaWYgY3JlYXRlOgo+ICAgICAgICAgICAgICAgICBtID0gY3JlYXRlKHNw ZWMsIGRlZikKPiAgICAgICAgICAgICBlbHNlOgo+ICAgICAgICAgICAgICAgICBtID0gUHlNb2R1 bGVfTmV3KG5hbWUpCj4KPiAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG0sIHR5cGVzLk1vZHVs ZVR5cGUpOgo+ICAgICAgICAgICAgICAgICBtLm1kX3N0YXRlID0gTm9uZQo+ICAgICAgICAgICAg ICAgICBtLm1kX2RlZiA9IGRlZgo+Cj4gICAgICAgICAgICAgaWYgZGVmLm1fbWV0aG9kczoKPiAg ICAgICAgICAgICAgICAgUHlNb2R1bGVfQWRkRnVuY3Rpb25zKG0sIGRlZi5tX21ldGhvZHMpCj4g ICAgICAgICAgICAgaWYgZGVmLm1fZG9jOgo+ICAgICAgICAgICAgICAgICBQeU1vZHVsZV9TZXRE b2NTdHJpbmcobSwgZGVmLm1fZG9jKQo+Cj4gICAgICAgICBkZWYgUHlNb2R1bGVfRXhlY0RlZiht b2R1bGUsIGRlZik6Cj4gICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShtb2R1bGUsIHR5cGVzLm1v ZHVsZV90eXBlKToKPiAgICAgICAgICAgICAgICAgaWYgbW9kdWxlLm1kX3N0YXRlIGlzIE5VTEw6 Cj4gICAgICAgICAgICAgICAgICAgICAjIGFsbG9jYXRlIGEgYmxvY2sgb2YgemVyb2VkLW91dCBt ZW1vcnkKPiAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5tZF9zdGF0ZSA9IF9hbGxvYyhtb2R1 bGUubWRfc2l6ZSkKPgo+ICAgICAgICAgICAgIGlmIGRlZi5tX3Nsb3RzIGlzIE5VTEw6Cj4gICAg ICAgICAgICAgICAgIHJldHVybgo+Cj4gICAgICAgICAgICAgZm9yIHNsb3QsIHZhbHVlIGluIGRl Zi5tX3Nsb3RzOgo+ICAgICAgICAgICAgICAgICBpZiBzbG90ID09IFB5X21vZF9leGVjOgo+ICAg ICAgICAgICAgICAgICAgICAgdmFsdWUobW9kdWxlKQo+Cj4KPiBNb2R1bGUgQ3JlYXRpb24gUGhh c2UKPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KPgo+IENyZWF0aW9uIG9mIHRoZSBtb2R1bGUgb2Jq ZWN0IOKAkyB0aGF0IGlzLCB0aGUgaW1wbGVtZW50YXRpb24gb2YKPiBFeGVjdXRpb25Mb2FkZXIu Y3JlYXRlX21vZHVsZSDigJMgaXMgZ292ZXJuZWQgYnkgdGhlIFB5X21vZF9jcmVhdGUgc2xvdC4K Pgo+IFRoZSBQeV9tb2RfY3JlYXRlIHNsb3QKPiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uCj4KPiBU aGUgUHlfbW9kX2NyZWF0ZSBzbG90IGlzIHVzZWQgdG8gc3VwcG9ydCBjdXN0b20gbW9kdWxlIHN1 YmNsYXNzZXMuCj4gVGhlIHZhbHVlIHBvaW50ZXIgbXVzdCBwb2ludCB0byBhIGZ1bmN0aW9uIHdp dGggdGhlIGZvbGxvd2luZyBzaWduYXR1cmU6Ogo+Cj4gICAgIFB5T2JqZWN0KiAoKlB5TW9kdWxl Q3JlYXRlRnVuY3Rpb24pKFB5T2JqZWN0ICpzcGVjLCBQeU1vZHVsZURlZiAqZGVmKQo+Cj4gVGhl IGZ1bmN0aW9uIHJlY2VpdmVzIGEgTW9kdWxlU3BlYyBpbnN0YW5jZSwgYXMgZGVmaW5lZCBpbiBQ RVAgNDUxLAo+IGFuZCB0aGUgUHlNb2R1bGVEZWYgc3RydWN0dXJlLgo+IEl0IHNob3VsZCByZXR1 cm4gYSBuZXcgbW9kdWxlIG9iamVjdCwgb3Igc2V0IGFuIGVycm9yCj4gYW5kIHJldHVybiBOVUxM Lgo+Cj4gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgaW1wb3J0 LXJlbGF0ZWQgYXR0cmlidXRlcwo+IHNwZWNpZmllZCBpbiBQRVAgNDUxIFsjcGVwLTA0NTEtYXR0 cmlidXRlc11fIChzdWNoIGFzIGBgX19uYW1lX19gYCBvcgo+IGBgX19sb2FkZXJfX2BgKSBvbiB0 aGUgbmV3IG1vZHVsZS4KPgo+IFRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IGZvciB0aGUgcmV0dXJu ZWQgb2JqZWN0IHRvIGJlIGFuIGluc3RhbmNlIG9mCj4gdHlwZXMuTW9kdWxlVHlwZS4gQW55IHR5 cGUgY2FuIGJlIHVzZWQsIGFzIGxvbmcgYXMgaXQgc3VwcG9ydHMgc2V0dGluZyBhbmQKPiBnZXR0 aW5nIGF0dHJpYnV0ZXMsIGluY2x1ZGluZyBhdCBsZWFzdCB0aGUgaW1wb3J0LXJlbGF0ZWQgYXR0 cmlidXRlcy4KPiBIb3dldmVyLCBvbmx5IE1vZHVsZVR5cGUgaW5zdGFuY2VzIHN1cHBvcnQgbW9k dWxlLXNwZWNpZmljIGZ1bmN0aW9uYWxpdHkKPiBzdWNoIGFzIHBlci1tb2R1bGUgc3RhdGUuCj4K PiBOb3RlIHRoYXQgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIG1vZHVsZSdzIGVu dHJ5IGluIHN5cy5tb2R1bGVzCj4gaXMgbm90IHBvcHVsYXRlZCB5ZXQuIEF0dGVtcHRpbmcgdG8g aW1wb3J0IHRoZSBzYW1lIG1vZHVsZSBhZ2Fpbgo+IChwb3NzaWJseSB0cmFuc2l0aXZlbHkpLCBt YXkgbGVhZCB0byBhbiBpbmZpbml0ZSBsb29wLgo+IEV4dGVuc2lvbiBhdXRob3JzIGFyZSBhZHZp c2VkIHRvIGtlZXAgUHlfbW9kX2NyZWF0ZSBtaW5pbWFsLCBhbiBpbiBwYXJ0aWN1bGFyCj4gdG8g bm90IGNhbGwgdXNlciBjb2RlIGZyb20gaXQuCj4KPiBNdWx0aXBsZSBQeV9tb2RfY3JlYXRlIHNs b3RzIG1heSBub3QgYmUgc3BlY2lmaWVkLiBJZiB0aGV5IGFyZSwgaW1wb3J0Cj4gd2lsbCBmYWls IHdpdGggU3lzdGVtRXJyb3IuCj4KPiBJZiBQeV9tb2RfY3JlYXRlIGlzIG5vdCBzcGVjaWZpZWQs IHRoZSBpbXBvcnQgbWFjaGluZXJ5IHdpbGwgY3JlYXRlIGEgbm9ybWFsCj4gbW9kdWxlIG9iamVj dCB1c2luZyBQeU1vZHVsZV9OZXcuIFRoZSBuYW1lIGlzIHRha2VuIGZyb20gKnNwZWMqLgo+Cj4K PiBQb3N0LWNyZWF0aW9uIHN0ZXBzCj4gLi4uLi4uLi4uLi4uLi4uLi4uLgo+Cj4gSWYgdGhlIFB5 X21vZF9jcmVhdGUgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0eXBlcy5Nb2R1bGVU eXBlCj4gb3IgYSBzdWJjbGFzcyAob3IgaWYgYSBQeV9tb2RfY3JlYXRlIHNsb3QgaXMgbm90IHBy ZXNlbnQpLCB0aGUgaW1wb3J0Cj4gbWFjaGluZXJ5IHdpbGwgYXNzb2NpYXRlIHRoZSBQeU1vZHVs ZURlZiB3aXRoIHRoZSBtb2R1bGUuCj4gVGhpcyBhbHNvIG1ha2VzIHRoZSBQeU1vZHVsZURlZiBh Y2Nlc3NpYmxlIHRvIGV4ZWN1dGlvbiBwaGFzZSwgdGhlCj4gUHlNb2R1bGVfR2V0RGVmIGZ1bmN0 aW9uLCBhbmQgZ2FyYmFnZSBjb2xsZWN0aW9uIHJvdXRpbmVzICh0cmF2ZXJzZSwKPiBjbGVhciwg ZnJlZSkuCj4KPiBJZiB0aGUgUHlfbW9kX2NyZWF0ZSBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4g YSBtb2R1bGUgc3ViY2xhc3MsIHRoZW4gbV9zaXplCj4gbXVzdCBiZSAwLCBhbmQgbV90cmF2ZXJz ZSwgbV9jbGVhciBhbmQgbV9mcmVlIG11c3QgYWxsIGJlIE5VTEwuCj4gT3RoZXJ3aXNlLCBTeXN0 ZW1FcnJvciBpcyByYWlzZWQuCj4KPiBBZGRpdGlvbmFsbHksIGluaXRpYWwgYXR0cmlidXRlcyBz cGVjaWZpZWQgaW4gdGhlIFB5TW9kdWxlRGVmIGFyZSBzZXQgb24gdGhlCj4gbW9kdWxlIG9iamVj dCwgcmVnYXJkbGVzcyBvZiBpdHMgdHlwZToKPgo+ICogVGhlIGRvY3N0cmluZyBpcyBzZXQgZnJv bSBtX2RvYywgaWYgbm9uLU5VTEwuCj4gKiBUaGUgbW9kdWxlJ3MgZnVuY3Rpb25zIGFyZSBpbml0 aWFsaXplZCBmcm9tIG1fbWV0aG9kcywgaWYgYW55Lgo+Cj4KPiBNb2R1bGUgRXhlY3V0aW9uIFBo YXNlCj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+Cj4gTW9kdWxlIGV4ZWN1dGlvbiAtLSB0aGF0 IGlzLCB0aGUgaW1wbGVtZW50YXRpb24gb2YKPiBFeGVjdXRpb25Mb2FkZXIuZXhlY19tb2R1bGUg LS0gaXMgZ292ZXJuZWQgYnkgImV4ZWN1dGlvbiBzbG90cyIuCj4gVGhpcyBQRVAgb25seSBhZGRz IG9uZSwgUHlfbW9kX2V4ZWMsIGJ1dCBvdGhlcnMgbWF5IGJlIGFkZGVkIGluIHRoZSBmdXR1cmUu Cj4KPiBUaGUgZXhlY3V0aW9uIHBoYXNlIGlzIGRvbmUgb24gdGhlIFB5TW9kdWxlRGVmIGFzc29j aWF0ZWQgd2l0aCB0aGUgbW9kdWxlCj4gb2JqZWN0LiBGb3Igb2JqZWN0cyB0aGF0IGFyZSBub3Qg YSBzdWJjbGFzcyBvZiBQeU1vZHVsZV9UeXBlIChmb3Igd2hpY2gKPiBQeU1vZHVsZV9HZXREZWYg d291bGQgZmFpbCksIHRoZSBleGVjdXRpb24gcGhhc2UgaXMgc2tpcHBlZC4KPgo+IEV4ZWN1dGlv biBzbG90cyBtYXkgYmUgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLCBhbmQgYXJlIHByb2Nlc3Nl ZCBpbiB0aGUgb3JkZXIKPiB0aGV5IGFwcGVhciBpbiB0aGUgc2xvdHMgYXJyYXkuCj4gV2hlbiB1 c2luZyB0aGUgZGVmYXVsdCBpbXBvcnQgbWFjaGluZXJ5LCB0aGV5IGFyZSBwcm9jZXNzZWQgYWZ0 ZXIKPiBpbXBvcnQtcmVsYXRlZCBhdHRyaWJ1dGVzIHNwZWNpZmllZCBpbiBQRVAgNDUxIFsjcGVw LTA0NTEtYXR0cmlidXRlc11fCj4gKHN1Y2ggYXMgYGBfX25hbWVfX2BgIG9yIGBgX19sb2FkZXJf X2BgKSBhcmUgc2V0IGFuZCB0aGUgbW9kdWxlIGlzIGFkZGVkCj4gdG8gc3lzLm1vZHVsZXMuCj4K Pgo+IFByZS1FeGVjdXRpb24gc3RlcHMKPiAtLS0tLS0tLS0tLS0tLS0tLS0tCj4KPiBCZWZvcmUg cHJvY2Vzc2luZyB0aGUgZXhlY3V0aW9uIHNsb3RzLCBwZXItbW9kdWxlIHN0YXRlIGlzIGFsbG9j YXRlZCBmb3IgdGhlCj4gbW9kdWxlLiBGcm9tIHRoaXMgcG9pbnQgb24sIHBlci1tb2R1bGUgc3Rh dGUgaXMgYWNjZXNzaWJsZSB0aHJvdWdoCj4gUHlNb2R1bGVfR2V0U3RhdGUuCj4KPgo+IFRoZSBQ eV9tb2RfZXhlYyBzbG90Cj4gLi4uLi4uLi4uLi4uLi4uLi4uLi4KPgo+IFRoZSBlbnRyeSBpbiB0 aGlzIHNsb3QgbXVzdCBwb2ludCB0byBhIGZ1bmN0aW9uIHdpdGggdGhlIGZvbGxvd2luZyBzaWdu YXR1cmU6Ogo+Cj4gICAgIGludCAoKlB5TW9kdWxlRXhlY0Z1bmN0aW9uKShQeU9iamVjdCogbW9k dWxlKQo+Cj4gSXQgd2lsbCBiZSBjYWxsZWQgdG8gaW5pdGlhbGl6ZSBhIG1vZHVsZS4gVXN1YWxs eSwgdGhpcyBhbW91bnRzIHRvCj4gc2V0dGluZyB0aGUgbW9kdWxlJ3MgaW5pdGlhbCBhdHRyaWJ1 dGVzLgo+IFRoZSAibW9kdWxlIiBhcmd1bWVudCByZWNlaXZlcyB0aGUgbW9kdWxlIG9iamVjdCB0 byBpbml0aWFsaXplLgo+Cj4gSWYgUHlNb2R1bGVFeGVjIHJlcGxhY2VzIHRoZSBtb2R1bGUncyBl bnRyeSBpbiBzeXMubW9kdWxlcywKPiB0aGUgbmV3IG9iamVjdCB3aWxsIGJlIHVzZWQgYW5kIHJl dHVybmVkIGJ5IGltcG9ydGxpYiBtYWNoaW5lcnkuCj4gKFRoaXMgbWlycm9ycyB0aGUgYmVoYXZp b3Igb2YgUHl0aG9uIG1vZHVsZXMuIE5vdGUgdGhhdCBpbXBsZW1lbnRpbmcKPiBQeV9tb2RfY3Jl YXRlIGlzIHVzdWFsbHkgYSBiZXR0ZXIgc29sdXRpb24gZm9yIHRoZSB1c2UgY2FzZXMgdGhpcyBz ZXJ2ZXMuKQo+Cj4gVGhlIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGBgMGBgIG9uIHN1Y2Nlc3MsIG9y LCBvbiBlcnJvciwgc2V0IGFuIGV4Y2VwdGlvbiBhbmQKPiByZXR1cm4gYGAtMWBgLgo+Cj4KPiBM ZWdhY3kgSW5pdAo+IC0tLS0tLS0tLS0tCj4KPiBUaGUgYmFja3dhcmRzLWNvbXBhdGlibGUgc2lu Z2xlLXBoYXNlIGluaXRpYWxpemF0aW9uIGNvbnRpbnVlcyB0byBiZSBzdXBwb3J0ZWQuCj4gSW4g dGhpcyBzY2hlbWUsIHRoZSBQeUluaXQgZnVuY3Rpb24gcmV0dXJucyBhIGZ1bGx5IGluaXRpYWxp emVkIG1vZHVsZSByYXRoZXIKPiB0aGFuIGEgUHlNb2R1bGVEZWYgb2JqZWN0Lgo+IEluIHRoaXMg Y2FzZSwgdGhlIFB5SW5pdCBob29rIGltcGxlbWVudHMgdGhlIGNyZWF0aW9uIHBoYXNlLCBhbmQg dGhlIGV4ZWN1dGlvbgo+IHBoYXNlIGlzIGEgbm8tb3AuCj4KPiBNb2R1bGVzIHRoYXQgbmVlZCB0 byB3b3JrIHVuY2hhbmdlZCBvbiBvbGRlciB2ZXJzaW9ucyBvZiBQeXRob24gc2hvdWxkIHN0aWNr IHRvCj4gc2luZ2xlLXBoYXNlIGluaXRpYWxpemF0aW9uLCBiZWNhdXNlIHRoZSBiZW5lZml0cyBp dCBicmluZ3MgY2FuJ3QgYmUKPiBiYWNrLXBvcnRlZC4KPiBIZXJlIGlzIGFuIGV4YW1wbGUgb2Yg YSBtb2R1bGUgdGhhdCBzdXBwb3J0cyBtdWx0aS1waGFzZSBpbml0aWFsaXphdGlvbiwKPiBhbmQg ZmFsbHMgYmFjayB0byBzaW5nbGUtcGhhc2Ugd2hlbiBjb21waWxlZCBmb3IgYW4gb2xkZXIgdmVy c2lvbiBvZiBDUHl0aG9uLgo+IEl0IGlzIGluY2x1ZGVkIG1haW5seSBhcyBhbiBpbGx1c3RyYXRp b24gb2YgdGhlIGNoYW5nZXMgbmVlZGVkIHRvIGVuYWJsZQo+IG11bHRpLXBoYXNlIGluaXQ6Ogo+ Cj4gICAgICNpbmNsdWRlIDxQeXRob24uaD4KPgo+ICAgICBzdGF0aWMgaW50IHNwYW1fZXhlYyhQ eU9iamVjdCAqbW9kdWxlKSB7Cj4gICAgICAgICBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudCht b2R1bGUsICJmb29kIiwgInNwYW0iKTsKPiAgICAgICAgIHJldHVybiAwOwo+ICAgICB9Cj4KPiAg ICAgI2lmZGVmIFB5X21vZF9leGVjCj4gICAgIHN0YXRpYyBQeU1vZHVsZURlZl9TbG90IHNwYW1f c2xvdHNbXSA9IHsKPiAgICAgICAgIHtQeV9tb2RfZXhlYywgc3BhbV9leGVjfSwKPiAgICAgICAg IHswLCBOVUxMfQo+ICAgICB9Owo+ICAgICAjZW5kaWYKPgo+ICAgICBzdGF0aWMgUHlNb2R1bGVE ZWYgc3BhbV9kZWYgPSB7Cj4gICAgICAgICBQeU1vZHVsZURlZl9IRUFEX0lOSVQsICAgICAgICAg ICAgICAgICAgICAgIC8qIG1fYmFzZSAqLwo+ICAgICAgICAgInNwYW0iLCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAvKiBtX25hbWUgKi8KPiAgICAgICAgIFB5RG9jX1NUUigi VXRpbGl0aWVzIGZvciBjb29raW5nIHNwYW0iKSwgICAgLyogbV9kb2MgKi8KPiAgICAgICAgIDAs ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbV9zaXplICovCj4g ICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1f bWV0aG9kcyAqLwo+ICAgICAjaWZkZWYgUHlfbW9kX2V4ZWMKPiAgICAgICAgIHNwYW1fc2xvdHMs ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbV9zbG90cyAqLwo+ICAgICAjZWxz ZQo+ICAgICAgICAgTlVMTCwKPiAgICAgI2VuZGlmCj4gICAgICAgICBOVUxMLCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1fdHJhdmVyc2UgKi8KPiAgICAgICAgIE5V TEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbV9jbGVhciAqLwo+ ICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBt X2ZyZWUgKi8KPiAgICAgfTsKPgo+ICAgICBQeU1PRElOSVRfRlVOQwo+ICAgICBQeUluaXRfc3Bh bSh2b2lkKSB7Cj4gICAgICNpZmRlZiBQeV9tb2RfZXhlYwo+ICAgICAgICAgcmV0dXJuIFB5TW9k dWxlRGVmX0luaXQoJnNwYW1fZGVmKTsKPiAgICAgI2Vsc2UKPiAgICAgICAgIFB5T2JqZWN0ICpt b2R1bGU7Cj4gICAgICAgICBtb2R1bGUgPSBQeU1vZHVsZV9DcmVhdGUoJnNwYW1fZGVmKTsKPiAg ICAgICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Cj4gICAgICAgICBpZiAoc3Bh bV9leGVjKG1vZHVsZSkgIT0gMCkgewo+ICAgICAgICAgICAgIFB5X0RFQ1JFRihtb2R1bGUpOwo+ ICAgICAgICAgICAgIHJldHVybiBOVUxMOwo+ICAgICAgICAgfQo+ICAgICAgICAgcmV0dXJuIG1v ZHVsZTsKPiAgICAgI2VuZGlmCj4gICAgIH0KPgo+Cj4gQnVpbHQtSW4gbW9kdWxlcwo+IC0tLS0t LS0tLS0tLS0tLS0KPgo+IEFueSBleHRlbnNpb24gbW9kdWxlIGNhbiBiZSB1c2VkIGFzIGEgYnVp bHQtaW4gbW9kdWxlIGJ5IGxpbmtpbmcgaXQgaW50bwo+IHRoZSBleGVjdXRhYmxlLCBhbmQgaW5j bHVkaW5nIGl0IGluIHRoZSBpbml0dGFiIChlaXRoZXIgYXQgcnVudGltZSB3aXRoCj4gUHlJbXBv cnRfQXBwZW5kSW5pdHRhYiwgb3IgYXQgY29uZmlndXJhdGlvbiB0aW1lLCB1c2luZyB0b29scyBs aWtlICpmcmVlemUqKS4KPgo+IFRvIGtlZXAgdGhpcyBwb3NzaWJpbGl0eSwgYWxsIGNoYW5nZXMg dG8gZXh0ZW5zaW9uIG1vZHVsZSBsb2FkaW5nIGludHJvZHVjZWQKPiBpbiB0aGlzIFBFUCB3aWxs IGFsc28gYXBwbHkgdG8gYnVpbHQtaW4gbW9kdWxlcy4KPiBUaGUgb25seSBleGNlcHRpb24gaXMg bm9uLUFTQ0lJIG1vZHVsZSBuYW1lcywgZXhwbGFpbmVkIGJlbG93Lgo+Cj4KPiBTdWJpbnRlcnBy ZXRlcnMgYW5kIEludGVycHJldGVyIFJlbG9hZGluZwo+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCj4KPiBFeHRlbnNpb25zIHVzaW5nIHRoZSBuZXcgaW5pdGlhbGl6 YXRpb24gc2NoZW1lIGFyZSBleHBlY3RlZCB0byBzdXBwb3J0Cj4gc3ViaW50ZXJwcmV0ZXJzIGFu ZCBtdWx0aXBsZSBQeV9Jbml0aWFsaXplL1B5X0ZpbmFsaXplIGN5Y2xlcyBjb3JyZWN0bHksCj4g YXZvaWRpbmcgdGhlIGlzc3VlcyBtZW50aW9uZWQgaW4gUHl0aG9uIGRvY3VtZW50YXRpb24gWyNz dWJpbnRlcnByZXRlci1kb2NzXV8uCj4gVGhlIG1lY2hhbmlzbSBpcyBkZXNpZ25lZCB0byBtYWtl IHRoaXMgZWFzeSwgYnV0IGNhcmUgaXMgc3RpbGwgcmVxdWlyZWQKPiBvbiB0aGUgcGFydCBvZiB0 aGUgZXh0ZW5zaW9uIGF1dGhvci4KPiBObyB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLCBtZXRob2Rz LCBvciBpbnN0YW5jZXMgbWF5IGxlYWsgdG8gZGlmZmVyZW50Cj4gaW50ZXJwcmV0ZXJzLgo+IFRv IGFjaGlldmUgdGhpcywgYWxsIG1vZHVsZS1sZXZlbCBzdGF0ZSBzaG91bGQgYmUga2VwdCBpbiBl aXRoZXIgdGhlIG1vZHVsZQo+IGRpY3QsIG9yIGluIHRoZSBtb2R1bGUgb2JqZWN0J3Mgc3RvcmFn ZSByZWFjaGFibGUgYnkgUHlNb2R1bGVfR2V0U3RhdGUuCj4gQSBzaW1wbGUgcnVsZSBvZiB0aHVt YiBpczogRG8gbm90IGRlZmluZSBhbnkgc3RhdGljIGRhdGEsIGV4Y2VwdCBidWlsdC1pbiB0eXBl cwo+IHdpdGggbm8gbXV0YWJsZSBvciB1c2VyLXNldHRhYmxlIGNsYXNzIGF0dHJpYnV0ZXMuCj4K Pgo+IEZ1bmN0aW9ucyBpbmNvbXBhdGlibGUgd2l0aCBtdWx0aS1waGFzZSBpbml0aWFsaXphdGlv bgo+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQo+Cj4gVGhlIFB5TW9kdWxlX0NyZWF0ZSBmdW5jdGlvbiB3aWxsIGZhaWwgd2hlbiB1c2VkIG9u IGEgUHlNb2R1bGVEZWYgc3RydWN0dXJlCj4gd2l0aCBhIG5vbi1OVUxMICptX3Nsb3RzKiBwb2lu dGVyLgo+IFRoZSBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBNb2R1bGVTcGVj IG9iamVjdCBuZWNlc3NhcnkgZm9yCj4gbXVsdGktcGhhc2UgaW5pdGlhbGl6YXRpb24uCj4KPiBU aGUgUHlTdGF0ZV9GaW5kTW9kdWxlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIE5VTEwsIGFuZCBQeVN0 YXRlX0FkZE1vZHVsZQo+IGFuZCBQeVN0YXRlX1JlbW92ZU1vZHVsZSB3aWxsIGFsc28gZmFpbCBv biBtb2R1bGVzIHdpdGggbm9uLU5VTEwgKm1fc2xvdHMqLgo+IFB5U3RhdGUgcmVnaXN0cmF0aW9u IGlzIGRpc2FibGVkIGJlY2F1c2UgbXVsdGlwbGUgbW9kdWxlIG9iamVjdHMgbWF5IGJlIGNyZWF0 ZWQKPiBmcm9tIHRoZSBzYW1lIFB5TW9kdWxlRGVmLgo+Cj4KPiBNb2R1bGUgc3RhdGUgYW5kIEMt bGV2ZWwgY2FsbGJhY2tzCj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+Cj4g RHVlIHRvIHRoZSB1bmF2YWlsYWJpbGl0eSBvZiBQeVN0YXRlX0ZpbmRNb2R1bGUsIGFueSBmdW5j dGlvbiB0aGF0IG5lZWRzIGFjY2Vzcwo+IHRvIG1vZHVsZS1sZXZlbCBzdGF0ZSAoaW5jbHVkaW5n IGZ1bmN0aW9ucywgY2xhc3NlcyBvciBleGNlcHRpb25zIGRlZmluZWQgYXQKPiB0aGUgbW9kdWxl IGxldmVsKSBtdXN0IHJlY2VpdmUgYSByZWZlcmVuY2UgdG8gdGhlIG1vZHVsZSBvYmplY3QgKG9y IHRoZQo+IHBhcnRpY3VsYXIgb2JqZWN0IGl0IG5lZWRzKSwgZWl0aGVyIGRpcmVjdGx5IG9yIGlu ZGlyZWN0bHkuCj4gVGhpcyBpcyBjdXJyZW50bHkgZGlmZmljdWx0IGluIHR3byBzaXR1YXRpb25z Ogo+Cj4gKiBNZXRob2RzIG9mIGNsYXNzZXMsIHdoaWNoIHJlY2VpdmUgYSByZWZlcmVuY2UgdG8g dGhlIGNsYXNzLCBidXQgbm90IHRvCj4gICB0aGUgY2xhc3MncyBtb2R1bGUKPiAqIExpYnJhcmll cyB3aXRoIEMtbGV2ZWwgY2FsbGJhY2tzLCB1bmxlc3MgdGhlIGNhbGxiYWNrcyBjYW4gcmVjZWl2 ZSBjdXN0b20KPiAgIGRhdGEgc2V0IGF0IGNhbGxiYWNrIHJlZ2lzdHJhdGlvbgo+Cj4gRml4aW5n IHRoZXNlIGNhc2VzIGlzIG91dHNpZGUgb2YgdGhlIHNjb3BlIG9mIHRoaXMgUEVQLCBidXQgd2ls bCBiZSBuZWVkZWQgZm9yCj4gdGhlIG5ldyBtZWNoYW5pc20gdG8gYmUgdXNlZnVsIHRvIGFsbCBt b2R1bGVzLiBQcm9wZXIgZml4ZXMgaGF2ZSBiZWVuIGRpc2N1c3NlZAo+IG9uIHRoZSBpbXBvcnQt c2lnIG1haWxpbmcgbGlzdCBbI2ZpbmRtb2R1bGUtZGlzY3Vzc2lvbl1fLgo+Cj4gQXMgYSBydWxl IG9mIHRodW1iLCBtb2R1bGVzIHRoYXQgcmVseSBvbiBQeVN0YXRlX0ZpbmRNb2R1bGUgYXJlLCBh dCB0aGUgbW9tZW50LAo+IG5vdCBnb29kIGNhbmRpZGF0ZXMgZm9yIHBvcnRpbmcgdG8gdGhlIG5l dyBtZWNoYW5pc20uCj4KPgo+IE5ldyBGdW5jdGlvbnMKPiAtLS0tLS0tLS0tLS0tCj4KPiBBIG5l dyBmdW5jdGlvbiBhbmQgbWFjcm8gaW1wbGVtZW50aW5nIHRoZSBtb2R1bGUgY3JlYXRpb24gcGhh c2Ugd2lsbCBiZSBhZGRlZC4KPiBUaGVzZSBhcmUgc2ltaWxhciB0byBQeU1vZHVsZV9DcmVhdGUg YW5kIFB5TW9kdWxlX0NyZWF0ZTIsIGV4Y2VwdCB0aGV5Cj4gdGFrZSBhbiBhZGRpdGlvbmFsIE1v ZHVsZVNwZWMgYXJndW1lbnQsIGFuZCBoYW5kbGUgbW9kdWxlIGRlZmluaXRpb25zIHdpdGgKPiBu b24tTlVMTCBzbG90czo6Cj4KPiAgICAgUHlPYmplY3QgKiBQeU1vZHVsZV9Gcm9tRGVmQW5kU3Bl YyhQeU1vZHVsZURlZiAqZGVmLCBQeU9iamVjdCAqc3BlYykKPiAgICAgUHlPYmplY3QgKiBQeU1v ZHVsZV9Gcm9tRGVmQW5kU3BlYzIoUHlNb2R1bGVEZWYgKmRlZiwgUHlPYmplY3QgKnNwZWMsCj4g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2R1bGVfYXBpX3Zl cnNpb24pCj4KPiBBIG5ldyBmdW5jdGlvbiBpbXBsZW1lbnRpbmcgdGhlIG1vZHVsZSBleGVjdXRp b24gcGhhc2Ugd2lsbCBiZSBhZGRlZC4KPiBUaGlzIGFsbG9jYXRlcyBwZXItbW9kdWxlIHN0YXRl IChpZiBub3QgYWxsb2NhdGVkIGFscmVhZHkpLCBhbmQgKmFsd2F5cyoKPiBwcm9jZXNzZXMgZXhl Y3V0aW9uIHNsb3RzLiBUaGUgaW1wb3J0IG1hY2hpbmVyeSBjYWxscyB0aGlzIG1ldGhvZCB3aGVu Cj4gYSBtb2R1bGUgaXMgZXhlY3V0ZWQsIHVubGVzcyB0aGUgbW9kdWxlIGlzIGJlaW5nIHJlbG9h ZGVkOjoKPgo+ICAgICBQeUFQSV9GVU5DKGludCkgUHlNb2R1bGVfRXhlY0RlZihQeU9iamVjdCAq bW9kdWxlLCBQeU1vZHVsZURlZiAqZGVmKQo+Cj4gQW5vdGhlciBmdW5jdGlvbiB3aWxsIGJlIGlu dHJvZHVjZWQgdG8gaW5pdGlhbGl6ZSBhIFB5TW9kdWxlRGVmIG9iamVjdC4KPiBUaGlzIGlkZW1w b3RlbnQgZnVuY3Rpb24gZmlsbHMgaW4gdGhlIHR5cGUsIHJlZmNvdW50LCBhbmQgbW9kdWxlIGlu ZGV4Lgo+IEl0IHJldHVybnMgaXRzIGFyZ3VtZW50IGNhc3QgdG8gUHlPYmplY3QqLCBzbyBpdCBj YW4gYmUgcmV0dXJuZWQgZGlyZWN0bHkKPiBmcm9tIGEgUHlJbml0IGZ1bmN0aW9uOjoKPgo+ICAg ICBQeU9iamVjdCAqIFB5TW9kdWxlRGVmX0luaXQoUHlNb2R1bGVEZWYgKik7Cj4KPiBBZGRpdGlv bmFsbHksIHR3byBoZWxwZXJzIHdpbGwgYmUgYWRkZWQgZm9yIHNldHRpbmcgdGhlIGRvY3N0cmlu ZyBhbmQKPiBtZXRob2RzIG9uIGEgbW9kdWxlOjoKPgo+ICAgICBpbnQgUHlNb2R1bGVfU2V0RG9j U3RyaW5nKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKikKPiAgICAgaW50IFB5TW9kdWxlX0FkZEZ1 bmN0aW9ucyhQeU9iamVjdCAqLCBQeU1ldGhvZERlZiAqKQo+Cj4KPiBFeHBvcnQgSG9vayBOYW1l Cj4gLS0tLS0tLS0tLS0tLS0tLQo+Cj4gQXMgcG9ydGFibGUgQyBpZGVudGlmaWVycyBhcmUgbGlt aXRlZCB0byBBU0NJSSwgbW9kdWxlIG5hbWVzCj4gbXVzdCBiZSBlbmNvZGVkIHRvIGZvcm0gdGhl IFB5SW5pdCBob29rIG5hbWUuCj4KPiBGb3IgQVNDSUkgbW9kdWxlIG5hbWVzLCB0aGUgaW1wb3J0 IGhvb2sgaXMgbmFtZWQKPiBQeUluaXRfPG1vZHVsZW5hbWU+LCB3aGVyZSA8bW9kdWxlbmFtZT4g aXMgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4KPgo+IEZvciBtb2R1bGUgbmFtZXMgY29udGFpbmlu ZyBub24tQVNDSUkgY2hhcmFjdGVycywgdGhlIGltcG9ydCBob29rIGlzIG5hbWVkCj4gUHlJbml0 VV88ZW5jb2RlZG5hbWU+LCB3aGVyZSB0aGUgbmFtZSBpcyBlbmNvZGVkIHVzaW5nIENQeXRob24n cwo+ICJwdW55Y29kZSIgZW5jb2RpbmcgKFB1bnljb2RlIFsjcmZjLTM0OTJdXyB3aXRoIGEgbG93 ZXJjYXNlIHN1ZmZpeCksCj4gd2l0aCBoeXBoZW5zICgiLSIpIHJlcGxhY2VkIGJ5IHVuZGVyc2Nv cmVzICgiXyIpLgo+Cj4KPiBJbiBQeXRob246Ogo+Cj4gICAgIGRlZiBleHBvcnRfaG9va19uYW1l KG5hbWUpOgo+ICAgICAgICAgdHJ5Ogo+ICAgICAgICAgICAgIHN1ZmZpeCA9IGInXycgKyBuYW1l LmVuY29kZSgnYXNjaWknKQo+ICAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKPiAg ICAgICAgICAgICBzdWZmaXggPSBiJ1VfJyArIG5hbWUuZW5jb2RlKCdwdW55Y29kZScpLnJlcGxh Y2UoYictJywgYidfJykKPiAgICAgICAgIHJldHVybiBiJ1B5SW5pdCcgKyBzdWZmaXgKPgo+IEV4 YW1wbGVzOgo+Cj4gPT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PQo+IE1vZHVsZSBu YW1lICAgIEluaXQgaG9vayBuYW1lCj4gPT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09 PQo+IHNwYW0gICAgICAgICAgIFB5SW5pdF9zcGFtCj4gbGFuxI1tw610ICAgICAgICBQeUluaXRV X2xhbm10XzJzYTZ0Cj4g44K544OR44OgICAgICAgICAgIFB5SW5pdFVfemNrNWIyYgo+ID09PT09 PT09PT09PT0gID09PT09PT09PT09PT09PT09PT0KPgo+IEZvciBtb2R1bGVzIHdpdGggbm9uLUFT Q0lJIG5hbWVzLCBzaW5nbGUtcGhhc2UgaW5pdGlhbGl6YXRpb24gaXMgbm90IHN1cHBvcnRlZC4K Pgo+IEluIHRoZSBpbml0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgUEVQLCBidWlsdC1pbiBt b2R1bGVzIHdpdGggbm9uLUFTQ0lJCj4gbmFtZXMgd2lsbCBub3QgYmUgc3VwcG9ydGVkLgo+Cj4K PiBNb2R1bGUgUmVsb2FkaW5nCj4gLS0tLS0tLS0tLS0tLS0tLQo+Cj4gUmVsb2FkaW5nIGFuIGV4 dGVuc2lvbiBtb2R1bGUgdXNpbmcgaW1wb3J0bGliLnJlbG9hZCgpIHdpbGwgY29udGludWUgdG8K PiBoYXZlIG5vIGVmZmVjdCwgZXhjZXB0IHJlLXNldHRpbmcgaW1wb3J0LXJlbGF0ZWQgYXR0cmli dXRlcy4KPgo+IER1ZSB0byBsaW1pdGF0aW9ucyBpbiBzaGFyZWQgbGlicmFyeSBsb2FkaW5nIChi b3RoIGRsb3BlbiBvbiBQT1NJWCBhbmQKPiBMb2FkTW9kdWxlRXggb24gV2luZG93cyksIGl0IGlz IG5vdCBnZW5lcmFsbHkgcG9zc2libGUgdG8gbG9hZAo+IGEgbW9kaWZpZWQgbGlicmFyeSBhZnRl ciBpdCBoYXMgY2hhbmdlZCBvbiBkaXNrLgo+Cj4gVXNlIGNhc2VzIGZvciByZWxvYWRpbmcgb3Ro ZXIgdGhhbiB0cnlpbmcgb3V0IGEgbmV3IHZlcnNpb24gb2YgdGhlIG1vZHVsZQo+IGFyZSB0b28g cmFyZSB0byByZXF1aXJlIGFsbCBtb2R1bGUgYXV0aG9ycyB0byBrZWVwIHJlbG9hZGluZyBpbiBt aW5kLgo+IElmIHJlbG9hZC1saWtlIGZ1bmN0aW9uYWxpdHkgaXMgbmVlZGVkLCBhdXRob3JzIGNh biBleHBvcnQgYSBkZWRpY2F0ZWQKPiBmdW5jdGlvbiBmb3IgaXQuCj4KPgo+IE11bHRpcGxlIG1v ZHVsZXMgaW4gb25lIGxpYnJhcnkKPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4K PiBUbyBzdXBwb3J0IG11bHRpcGxlIFB5dGhvbiBtb2R1bGVzIGluIG9uZSBzaGFyZWQgbGlicmFy eSwgdGhlIGxpYnJhcnkgY2FuCj4gZXhwb3J0IGFkZGl0aW9uYWwgUHlJbml0KiBzeW1ib2xzIGJl c2lkZXMgdGhlIG9uZSB0aGF0IGNvcnJlc3BvbmRzCj4gdG8gdGhlIGxpYnJhcnkncyBmaWxlbmFt ZS4KPgo+IE5vdGUgdGhhdCB0aGlzIG1lY2hhbmlzbSBjYW4gY3VycmVudGx5IG9ubHkgYmUgdXNl ZCB0byAqbG9hZCogZXh0cmEgbW9kdWxlcywKPiBidXQgbm90IHRvICpmaW5kKiB0aGVtLiAoVGhp cyBpcyBhIGxpbWl0YXRpb24gb2YgdGhlIGxvYWRlciBtZWNoYW5pc20sCj4gd2hpY2ggdGhpcyBQ RVAgZG9lcyBub3QgdHJ5IHRvIG1vZGlmeS4pCj4gVG8gd29yayBhcm91bmQgdGhlIGxhY2sgb2Yg YSBzdWl0YWJsZSBmaW5kZXIsIGNvZGUgbGlrZSB0aGUgZm9sbG93aW5nCj4gY2FuIGJlIHVzZWQ6 Ogo+Cj4gICAgIGltcG9ydCBpbXBvcnRsaWIubWFjaGluZXJ5Cj4gICAgIGltcG9ydCBpbXBvcnRs aWIudXRpbAo+ICAgICBsb2FkZXIgPSBpbXBvcnRsaWIubWFjaGluZXJ5LkV4dGVuc2lvbkZpbGVM b2FkZXIobmFtZSwgcGF0aCkKPiAgICAgc3BlYyA9IGltcG9ydGxpYi51dGlsLnNwZWNfZnJvbV9s b2FkZXIobmFtZSwgbG9hZGVyKQo+ICAgICBtb2R1bGUgPSBpbXBvcnRsaWIudXRpbC5tb2R1bGVf ZnJvbV9zcGVjKHNwZWMpCj4gICAgIGxvYWRlci5leGVjX21vZHVsZShtb2R1bGUpCj4gICAgIHJl dHVybiBtb2R1bGUKPgo+IE9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgc3ltYm9saWMgbGlua3Ms IHRoZXNlIG1heSBiZSB1c2VkIHRvIGluc3RhbGwgb25lCj4gbGlicmFyeSB1bmRlciBtdWx0aXBs ZSBuYW1lcywgZXhwb3NpbmcgYWxsIGV4cG9ydGVkIG1vZHVsZXMgdG8gbm9ybWFsCj4gaW1wb3J0 IG1hY2hpbmVyeS4KPgo+Cj4gVGVzdGluZyBhbmQgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbnMKPiAt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+Cj4gRm9yIHRlc3RpbmcsIGEgbmV3 IGJ1aWx0LWluIG1vZHVsZSBgYF90ZXN0bXVsdGlwaGFzZWBgIHdpbGwgYmUgY3JlYXRlZC4KPiBU aGUgbGlicmFyeSB3aWxsIGV4cG9ydCBzZXZlcmFsIGFkZGl0aW9uYWwgbW9kdWxlcyB1c2luZyB0 aGUgbWVjaGFuaXNtCj4gZGVzY3JpYmVkIGluICJNdWx0aXBsZSBtb2R1bGVzIGluIG9uZSBsaWJy YXJ5Ii4KPgo+IFRoZSBgYF90ZXN0Y2FwaWBgIG1vZHVsZSB3aWxsIGJlIHVuY2hhbmdlZCwgYW5k IHdpbGwgdXNlIHNpbmdsZS1waGFzZQo+IGluaXRpYWxpemF0aW9uIGluZGVmaW5pdGVseSAob3Ig dW50aWwgaXQgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCkuCj4KPiBUaGUgYGBhcnJheWBgIGFuZCBg YHh4KmBgIG1vZHVsZXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdXNlIG11bHRpLXBoYXNlCj4gaW5p dGlhbGl6YXRpb24gYXMgcGFydCBvZiB0aGUgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KPgo+Cj4g U3VtbWFyeSBvZiBBUEkgQ2hhbmdlcyBhbmQgQWRkaXRpb25zCj4gLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCj4KPiBOZXcgZnVuY3Rpb25zOgo+Cj4gKiBQeU1vZHVsZV9Gcm9t RGVmQW5kU3BlYyAobWFjcm8pCj4gKiBQeU1vZHVsZV9Gcm9tRGVmQW5kU3BlYzIKPiAqIFB5TW9k dWxlX0V4ZWNEZWYKPiAqIFB5TW9kdWxlX1NldERvY1N0cmluZwo+ICogUHlNb2R1bGVfQWRkRnVu Y3Rpb25zCj4gKiBQeU1vZHVsZURlZl9Jbml0Cj4KPiBOZXcgbWFjcm9zOgo+Cj4gKiBQeV9tb2Rf Y3JlYXRlCj4gKiBQeV9tb2RfZXhlYwo+Cj4gTmV3IHR5cGVzOgo+Cj4gKiBQeU1vZHVsZURlZl9U eXBlIHdpbGwgYmUgZXhwb3NlZAo+Cj4gTmV3IHN0cnVjdHVyZXM6Cj4KPiAqIFB5TW9kdWxlRGVm X1Nsb3QKPgo+IFB5TW9kdWxlRGVmLm1fcmVsb2FkIGNoYW5nZXMgdG8gUHlNb2R1bGVEZWYubV9z bG90cy4KPgo+IFRoZSBpbnRlcm5hbCBgYF9pbXBgYCBtb2R1bGUgd2lsbCBoYXZlIGJhY2t3YXJk cyBpbmNvbXBhdGlibGUgY2hhbmdlczoKPiBgYGNyZWF0ZV9idWlsdGluYGAsIGBgY3JlYXRlX2R5 bmFtaWNgYCwgYW5kIGBgZXhlY19keW5hbWljYGAgd2lsbCBiZSBhZGRlZDsKPiBgYGluaXRfYnVp bHRpbmBgLCBgYGxvYWRfZHluYW1pY2BgIHdpbGwgYmUgcmVtb3ZlZC4KPgo+IFRoZSB1bmRvY3Vt ZW50ZWQgZnVuY3Rpb25zIGBgaW1wLmxvYWRfZHluYW1pY2BgIGFuZCBgYGltcC5pbml0X2J1aWx0 aW5gYCB3aWxsCj4gYmUgcmVwbGFjZWQgYnkgYmFja3dhcmRzLWNvbXBhdGlibGUgc2hpbXMuCj4K Pgo+IFBvc3NpYmxlIEZ1dHVyZSBFeHRlbnNpb25zCj4gPT09PT09PT09PT09PT09PT09PT09PT09 PT0KPgo+IFRoZSBzbG90cyBtZWNoYW5pc20sIGluc3BpcmVkIGJ5IFB5VHlwZV9TbG90IGZyb20g UEVQIDM4NCwKPiBhbGxvd3MgbGF0ZXIgZXh0ZW5zaW9ucy4KPgo+IFNvbWUgZXh0ZW5zaW9uIG1v ZHVsZXMgZXhwb3J0cyBtYW55IGNvbnN0YW50czsgZm9yIGV4YW1wbGUgX3NzbCBoYXMKPiBhIGxv bmcgbGlzdCBvZiBjYWxscyBpbiB0aGUgZm9ybTo6Cj4KPiAgICAgUHlNb2R1bGVfQWRkSW50Q29u c3RhbnQobSwgIlNTTF9FUlJPUl9aRVJPX1JFVFVSTiIsCj4gICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFBZX1NTTF9FUlJPUl9aRVJPX1JFVFVSTik7Cj4KPiBDb252ZXJ0aW5nIHRoaXMgdG8g YSBkZWNsYXJhdGl2ZSBsaXN0LCBzaW1pbGFyIHRvIFB5TWV0aG9kRGVmLAo+IHdvdWxkIHJlZHVj ZSBib2lsZXJwbGF0ZSwgYW5kIHByb3ZpZGUgZnJlZSBlcnJvci1jaGVja2luZyB3aGljaAo+IGlz IG9mdGVuIG1pc3NpbmcuCj4KPiBTdHJpbmcgY29uc3RhbnRzIGFuZCB0eXBlcyBjYW4gYmUgaGFu ZGxlZCBzaW1pbGFybHkuCj4gKE5vdGUgdGhhdCBub24tZGVmYXVsdCBiYXNlcyBmb3IgdHlwZXMg Y2Fubm90IGJlIHBvcnRhYmx5IHNwZWNpZmllZAo+IHN0YXRpY2FsbHk7IHRoaXMgY2FzZSB3b3Vs ZCBuZWVkIGEgUHlfbW9kX2V4ZWMgZnVuY3Rpb24gdGhhdCBydW5zCj4gYmVmb3JlIHRoZSBzbG90 cyBhcmUgYWRkZWQuIFRoZSBmcmVlIGVycm9yLWNoZWNraW5nIHdvdWxkIHN0aWxsIGJlCj4gYmVu ZWZpY2lhbCwgdGhvdWdoLikKPgo+IEFub3RoZXIgcG9zc2liaWxpdHkgaXMgcHJvdmlkaW5nIGEg Im1haW4iIGZ1bmN0aW9uIHRoYXQgd291bGQgYmUgcnVuCj4gd2hlbiB0aGUgbW9kdWxlIGlzIGdp dmVuIHRvIFB5dGhvbidzIC1tIHN3aXRjaC4KPiBGb3IgdGhpcyB0byB3b3JrLCB0aGUgcnVucHkg bW9kdWxlIHdpbGwgbmVlZCB0byBiZSBtb2RpZmllZCB0byB0YWtlCj4gYWR2YW50YWdlIG9mIE1v ZHVsZVNwZWMtYmFzZWQgbG9hZGluZyBpbnRyb2R1Y2VkIGluIFBFUCA0NTEuCj4gQWxzbywgaXQg d2lsbCBiZSBuZWNlc3NhcnkgdG8gYWRkIGEgbWVjaGFuaXNtIGZvciBzZXR0aW5nIHVwIGEgbW9k dWxlCj4gYWNjb3JkaW5nIHRvIHNsb3RzIGl0IHdhc24ndCBvcmlnaW5hbGx5IGRlZmluZWQgd2l0 aC4KPgo+Cj4gSW1wbGVtZW50YXRpb24KPiA9PT09PT09PT09PT09PQo+Cj4gV29yay1pbi1wcm9n cmVzcyBpbXBsZW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgaW4gYSBHaXRodWIgcmVwb3NpdG9yeSBb I2doLXJlcG9dXzsKPiBhIHBhdGNoc2V0IGlzIGF0IFsjZ2gtcGF0Y2hdXy4KPgo+Cj4gUHJldmlv dXMgQXBwcm9hY2hlcwo+ID09PT09PT09PT09PT09PT09PT0KPgo+IFN0ZWZhbiBCZWhuZWwncyBp bml0aWFsIHByb3RvLVBFUCBbI3N0ZWZhbnNfcHJvdG9wZXBdXwo+IGhhZCBhICJQeUluaXRfbW9k dWxlbmFtZSIgaG9vayB0aGF0IHdvdWxkIGNyZWF0ZSBhIG1vZHVsZSBjbGFzcywKPiB3aG9zZSBg YF9faW5pdF9fYGAgd291bGQgYmUgdGhlbiBjYWxsZWQgdG8gY3JlYXRlIHRoZSBtb2R1bGUuCj4g VGhpcyBwcm9wb3NhbCBkaWQgbm90IGNvcnJlc3BvbmQgdG8gdGhlICh0aGVuIG5vbmV4aXN0ZW50 KSBQRVAgNDUxLAo+IHdoZXJlIG1vZHVsZSBjcmVhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gaXMg YnJva2VuIGludG8gZGlzdGluY3Qgc3RlcHMuCj4gSXQgYWxzbyBkaWQgbm90IHN1cHBvcnQgbG9h ZGluZyBhbiBleHRlbnNpb24gaW50byBwcmUtZXhpc3RpbmcgbW9kdWxlIG9iamVjdHMuCj4KPiBO aWNrIENvZ2hsYW4gcHJvcG9zZWQgIkNyZWF0ZSIgYW5kICJFeGVjIiBob29rcywgYW5kIHdyb3Rl IGEgcHJvdG90eXBlCj4gaW1wbGVtZW50YXRpb24gWyNuaWNrcy1wcm90b3R5cGVdXy4KPiBBdCB0 aGlzIHRpbWUgUEVQIDQ1MSB3YXMgc3RpbGwgbm90IGltcGxlbWVudGVkLCBzbyB0aGUgcHJvdG90 eXBlCj4gZG9lcyBub3QgdXNlIE1vZHVsZVNwZWMuCj4KPiBUaGUgb3JpZ2luYWwgdmVyc2lvbiBv ZiB0aGlzIFBFUCB1c2VkIENyZWF0ZSBhbmQgRXhlYyBob29rcywgYW5kIGFsbG93ZWQKPiBsb2Fk aW5nIGludG8gYXJiaXRyYXJ5IHByZS1jb25zdHJ1Y3RlZCBvYmplY3RzIHdpdGggRXhlYyBob29r Lgo+IFRoZSBwcm9wb3NhbCBtYWRlIGV4dGVuc2lvbiBtb2R1bGUgaW5pdGlhbGl6YXRpb24gY2xv c2VyIHRvIGhvdyBQeXRob24gbW9kdWxlcwo+IGFyZSBpbml0aWFsaXplZCwgYnV0IGl0IHdhcyBs YXRlciByZWNvZ25pemVkIHRoYXQgdGhpcyBpc24ndCBhbiBpbXBvcnRhbnQgZ29hbC4KPiBUaGUg Y3VycmVudCBQRVAgZGVzY3JpYmVzIGEgc2ltcGxlciBzb2x1dGlvbi4KPgo+IEEgZnVydGhlciBp dGVyYXRpb24gdXNlZCBhICJQeU1vZHVsZUV4cG9ydCIgaG9vayBhcyBhbiBhbHRlcm5hdGl2ZSB0 byBQeUluaXQsCj4gd2hlcmUgUHlJbml0IHdhcyB1c2VkIGZvciBleGlzdGluZyBzY2hlbWUsIGFu ZCBQeU1vZHVsZUV4cG9ydCBmb3IgbXVsdGktcGhhc2UuCj4gSG93ZXZlciwgbm90IGJlaW5nIGFi bGUgdG8gZGV0ZXJtaW5lIHRoZSBob29rIG5hbWUgYmFzZWQgb24gbW9kdWxlIG5hbWUKPiBjb21w bGljYXRlZCBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBvZiBQeUltcG9ydF9Jbml0dGFiIGJ5IHRvb2xz IGxpa2UgZnJlZXplLgo+IEtlZXBpbmcgb25seSB0aGUgUHlJbml0IGhvb2sgbmFtZSwgZXZlbiBp ZiBpdCdzIG5vdCBlbnRpcmVseSBhcHByb3ByaWF0ZSBmb3IKPiBleHBvcnRpbmcgYSBkZWZpbml0 aW9uLCB5aWVsZGVkIGEgbXVjaCBzaW1wbGVyIHNvbHV0aW9uLgo+Cj4KPiBSZWZlcmVuY2VzCj4g PT09PT09PT09PQo+Cj4gLi4gWyNwZXAtMDQ1MS1hdHRyaWJ1dGVzXQo+ICAgIGh0dHBzOi8vd3d3 LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0NTEvI2F0dHJpYnV0ZXMKPgo+IC4uIFsjc3RlZmFu c19wcm90b3BlcF0KPiAgICBodHRwczovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvcHl0aG9u LWRldi8yMDEzLUF1Z3VzdC8xMjgwODcuaHRtbAo+Cj4gLi4gWyNuaWNrcy1wcm90b3R5cGVdCj4g ICAgaHR0cHM6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL3B5dGhvbi1kZXYvMjAxMy1BdWd1 c3QvMTI4MTAxLmh0bWwKPgo+IC4uIFsjcmZjLTM0OTJdCj4gICAgaHR0cDovL3Rvb2xzLmlldGYu b3JnL2h0bWwvcmZjMzQ5Mgo+Cj4gLi4gWyNnaC1yZXBvXQo+ICAgIGh0dHBzOi8vZ2l0aHViLmNv bS9lbmN1a291L2NweXRob24vY29tbWl0cy9wZXA0ODkKPgo+IC4uIFsjZ2gtcGF0Y2hdCj4gICAg aHR0cHM6Ly9naXRodWIuY29tL2VuY3Vrb3UvY3B5dGhvbi9jb21wYXJlL21hc3Rlci4uLmVuY3Vr b3U6cGVwNDg5LnBhdGNoCj4KPiAuLiBbI2ZpbmRtb2R1bGUtZGlzY3Vzc2lvbl0KPiAgICBodHRw czovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvaW1wb3J0LXNpZy8yMDE1LUFwcmlsLzAwMDk1 OS5odG1sCj4KPiAuLiBbI3BlcC0wNDUxLWxvYWRpbmddCj4gICAgaHR0cHM6Ly93d3cucHl0aG9u Lm9yZy9kZXYvcGVwcy9wZXAtMDQ1MS8jaG93LWxvYWRpbmctd2lsbC13b3JrXQo+Cj4gLi4gWyNz dWJpbnRlcnByZXRlci1kb2NzXQo+ICAgIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzMvYy1hcGkv aW5pdC5odG1sI3N1Yi1pbnRlcnByZXRlci1zdXBwb3J0Cj4KPgo+IENvcHlyaWdodAo+ID09PT09 PT09PQo+Cj4gVGhpcyBkb2N1bWVudCBoYXMgYmVlbiBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21h aW4uCj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiBJ bXBvcnQtU0lHIG1haWxpbmcgbGlzdAo+IEltcG9ydC1TSUdAcHl0aG9uLm9yZwo+IGh0dHBzOi8v bWFpbC5weXRob24ub3JnL21haWxtYW4vbGlzdGluZm8vaW1wb3J0LXNpZwpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbXBvcnQtU0lHIG1haWxpbmcgbGlz dApJbXBvcnQtU0lHQHB5dGhvbi5vcmcKaHR0cHM6Ly9tYWlsLnB5dGhvbi5vcmcvbWFpbG1hbi9s aXN0aW5mby9pbXBvcnQtc2lnCg==