[ruby-core:121621] [Ruby Feature#21262] Proposal: `Ractor::Port`
From:
"ko1 (Koichi Sasada) via ruby-core" <ruby-core@...>
Date:
2025-04-10 14:43:57 UTC
List:
ruby-core #121621
SXNzdWUgIzIxMjYyIGhhcyBiZWVuIHJlcG9ydGVkIGJ5IGtvMSAoS29pY2hpIFNhc2FkYSkuDQoN Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkZlYXR1cmUgIzIxMjYy OiBQcm9wb3NhbDogYFJhY3Rvcjo6UG9ydGANCmh0dHBzOi8vYnVncy5ydWJ5LWxhbmcub3JnL2lz c3Vlcy8yMTI2Mg0KDQoqIEF1dGhvcjoga28xIChLb2ljaGkgU2FzYWRhKQ0KKiBTdGF0dXM6IEFz c2lnbmVkDQoqIEFzc2lnbmVlOiBrbzEgKEtvaWNoaSBTYXNhZGEpDQoqIFRhcmdldCB2ZXJzaW9u OiAzLjUNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgUHJvcG9z YWw6IGBSYWN0b3I6OlBvcnRgDQoNCkluIGNvbmN1cnJlbnQgUnVieSBhcHBsaWNhdGlvbnMgdXNp bmcgUmFjdG9ycywgc2FmZWx5IGFuZCBlZmZpY2llbnRseSBjb21tdW5pY2F0aW5nIHJlc3VsdHMg YmV0d2VlbiBSYWN0b3JzIGlzIGEgY29tbW9uIGNoYWxsZW5nZS4gV2UgcHJvcG9zZSBgUmFjdG9y OjpQb3J0YCBhcyBhIGxpZ2h0d2VpZ2h0LCBzYWZlLCBhbmQgZXJnb25vbWljIGFic3RyYWN0aW9u IHRvIHNpbXBsaWZ5IGNvbW11bmljYXRpb24gcGF0dGVybnMsIGVzcGVjaWFsbHkgaW4gcmVxdWVz dC1yZXNwb25zZSBtb2RlbHMuDQoNCmBgYHJ1YnkNCiMgdXNhZ2UgZXhhbXBsZQ0KDQpwb3J0ID0g UmFjdG9yOjpQb3J0Lm5ldw0KDQpSYWN0b3IubmV3IHBvcnQgZG8gfHBvcnR8DQogIHBvcnQgPDwg NDINCiAgcG9ydCA8PCA0Mw0KZW5kDQoNCiMgU3VjY2Vzczogd2FpdCBmb3Igc2VuZGluZw0KcG9y dC5yZWNlaXZlICM9PiA0Mg0KDQpSYWN0b3IubmV3IHBvcnQgZG8gfHBvcnR8DQogIHBvcnQucmVj ZWl2ZSAjIEVycm9yOiBvbmx5IHRoZSBjcmVhdG9yIFJhY3RvciBjYW4gcmVjZWl2ZSBmcm9tIHRo aXMgcG9ydC4NCmVuZA0KDQpwb3J0LnJlY2VpdmUgIz0+IDQzDQpgYGANCg0KVGhpcyBpcyBhIHNp bWlsYXIgY29uY2VwdCB0byBbIkNoYW5uZWwiXShodHRwczovL2J1Z3MucnVieS1sYW5nLm9yZy9p c3N1ZXMvMjExMjEpLCBidXQgaXQgaXMgdGlnaHRseSBjb3VwbGVkIHdpdGggdGhlIGNyZWF0b3Ig UmFjdG9yIGFuZCBubyBvdGhlciBSYWN0b3JzIGNhbiByZWNlaXZlIGFueXRoaW5nIGZyb20gdGhh dCBwb3J0Lg0KDQpJbiB0aGF0IHNlbnNlLCBpdCBpcyBjb25jZXB0dWFsbHkgY2xvc2VyIHRvIGEg c29ja2V0IGZpbGUgZGVzY3JpcHRvciAoZS5nLiwgYSBkZXN0aW5hdGlvbiBhbmQgcG9ydCBudW1i ZXIgcGFpciBpbiBUQ1AvSVApLg0KDQpXZSBjYW4gaW1wbGVtZW50IGBQb3J0YCB3aXRoIGBSYWN0 b3IucmVjZWl2ZV9pZmAgbGlrZSB0aGlzOg0KDQpgYGBydWJ5DQpjbGFzcyBSYWN0b3I6OlBvcnQN CiAgZGVmIGluaXRpYWxpemUNCiAgICBAciA9IFJhY3Rvci5jdXJyZW50DQogICAgQHRhZyA9IGdl bmlkKCkNCiAgZW5kDQoNCiAgZGVmIHNlbmQgb2JqDQogICAgQHIgPDwgW0B0YWcsIG9ial0NCiAg ZW5kDQoNCiAgZGVmIHJlY2VpdmUNCiAgICByYWlzZSB1bmxlc3MgQHIgPT0gUmFjdG9yLmN1cnJl bnQNCg0KICAgIFJhY3Rvci5yZWNlaXZlX2lmIGRvIHwodGFnLCByZXN1bHQpDQogICAgICBpZiB0 YWcgPT0gQHRhZw0KICAgICAgICByZXR1cm4gcmVzdWx0DQogICAgICBlbmQNCiAgICBlbmQNCiAg ZW5kDQplbmQNCmBgYA0KDQpXaXRoIGBSYWN0b3I6OlBvcnRgLCB3ZSBjYW4gZGVwcmVjYXRlIGBS YWN0b3IucmVjZWl2ZV9pZmAsIGBSYWN0b3IueWllbGRgLCBhbmQgYFJhY3RvciN0YWtlYC4gUG9y dHMgYWN0IGFzIGNsZWFyLCBzZWxmLWNvbnRhaW5lZCBlbmRwb2ludHMgZm9yIG1lc3NhZ2UgcGFz c2luZywgd2hpY2ggbWFrZXMgdGhlc2Ugb2xkZXIgcHJpbWl0aXZlcyByZWR1bmRhbnQuIEZ1cnRo ZXJtb3JlLCBQb3J0LWJhc2VkIGNvbW11bmljYXRpb24gaXMgc2lnbmlmaWNhbnRseSBlYXNpZXIg dG8gaW1wbGVtZW50IGFuZCByZWFzb24gYWJvdXTigJRlc3BlY2lhbGx5IHdoZW4gY29uc2lkZXJp bmcgc3luY2hyb25pemF0aW9uIGNoYWxsZW5nZXMgYXJvdW5kIGBSYWN0b3Iuc2VsZWN0YCBhbmQg cmVuZGV6dm91cyBzZW1hbnRpY3MuDQoNCiMjIEJhY2tncm91bmQ6IExpbWl0YXRpb25zIG9mIGN1 cnJlbnQgY29tbXVuaWNhdGlvbiBwYXR0ZXJucw0KDQpMZXQncyBkaXNjdXNzIGhvdyB0byBtYWtl IHNlcnZlci1saWtlIHNlcnZpY2UgcmFjdG9ycy4NCg0KIyMjIE5vIHJlc3BvbnNlIHNlcnZlcg0K DQpXZSBjYW4gbWFrZSBzZXJ2ZXItbGlrZSBSYWN0b3JzIGxpa2UgdGhpczoNCg0KYGBgcnVieQ0K IyBFWDENCg0KZGVmIGZpYihuKSA9IG4gPiAxIDogZmliKG4tMikgKyBmaWIobi0xKSA6IDENCg0K IyBBIHJhY3RvciBjYWxjdWxhdGUgZmliKG4pDQpmaWJfc3J2ID0gUmFjdG9yLm5ldyBkbw0KICB3 aGlsZSB0cnVlDQogICAgcGFyYW0gPSBSYWN0b3IucmVjZWl2ZQ0KICAgIHJlc3VsdCA9IGZpYihw YXJhbSkNCiAgZW5kDQplbmQNCg0KZmliX3NydiA8PCAxMA0KYGBgDQoNCkluIHRoaXMgY2FzZSwg dGhlIG1haW4gUmFjdG9yIHJlcXVlc3RzIGBmaWJfc3J2YCB0byBjYWxjdWxhdGUgYGZpYigxMClg Lg0KSG93ZXZlciwgY3VycmVudGx5LCB0aGVyZSBpcyBubyB3YXkgdG8gcmV0cmlldmUgdGhlIHJl c3VsdC4NCg0KIyMjIFJldHVybiB2YWx1ZSB0byB0aGUgc2VuZGVyIHJhY3Rvcg0KDQpUaGVyZSBh cmUgc2V2ZXJhbCBwb3NzaWJsZSBhcHByb2FjaGVzLg0KDQpGaXJzdCwgd2UgY2FuIHNlbmQgdGhl IHNlbmRlciBSYWN0b3IgYWxvbmcgd2l0aCB0aGUgcGFyYW1ldGVyLCBhbmQgYXNrIHRoZSBzZXJ2 ZXIgdG8gc2VuZCB0aGUgcmVzdWx0IGJhY2sgdG8gdGhlIHNlbmRlci4NCg0KYGBgcnVieQ0KIyBF WDINCg0KZmliX3NydiA9IFJhY3Rvci5uZXcgZG8NCiAgd2hpbGUgdHJ1ZQ0KICAgIHBhcmFtLCBz ZW5kZXIgPSBSYWN0b3IucmVjZWl2ZQ0KICAgIHJlc3VsdCA9IGZpYihwYXJhbSkNCiAgICBzZW5k ZXIgPDwgcmVzdWx0DQogIGVuZA0KZW5kDQoNCmZpYl9zcnYgPDwgWzEwLCBSYWN0b3IuY3VycmVu dF0NCg0KZG9fc29tZV93b3JrKCkNCg0KUmFjdG9yLnJlY2VpdmUgIz0+IGZpYigxMCkNCmBgYA0K DQpUaGlzIGFwcHJvYWNoIHdvcmtzIHdlbGwgaW4gc2ltcGxlIGNhc2VzLg0KDQpIb3dldmVyLCB3 aXRoIEVYMiwgaGFuZGxpbmcgbXVsdGlwbGUgY29uY3VycmVudCByZXNwb25zZXMgYmVjb21lcyBk aWZmaWN1bHQuIFRoZSByZXN1bHRzIGFyZSBwdXNoZWQgaW50byB0aGUgc2FtZSBtYWlsYm94LCBh bmQgc2luY2UgYFJhY3Rvci5yZWNlaXZlYCByZXRyaWV2ZXMgbWVzc2FnZXMgd2l0aG91dCBkaXNj cmltaW5hdGluZyB0aGUgc291cmNlLCBpdCdzIHVuY2xlYXIgd2hpY2ggc2VydmVyIHJldHVybmVk IHdoaWNoIHJlc3VsdC4NCg0KYGBgcnVieQ0KIyBFWDMNCg0KZGVmIGZhY3QobikgPSBuID4gMSA6 IGZhY3Qobi0xKSAqIG4NCg0KZmliX3NydiA9IFJhY3Rvci5uZXcgZG8NCiAgd2hpbGUgdHJ1ZQ0K ICAgIHBhcmFtLCBzZW5kZXIgPSBSYWN0b3IucmVjZWl2ZQ0KICAgIHJlc3VsdCA9IGZpYihwYXJh bSkNCiAgICBzZW5kZXIgPDwgcmVzdWx0DQogIGVuZA0KZW5kDQoNCmZhY3Rfc3J2ID0gUmFjdG9y Lm5ldyBkbw0KICB3aGlsZSB0cnVlDQogICAgcGFyYW0sIHNlbmRlciA9IFJhY3Rvci5yZWNlaXZl DQogICAgcmVzdWx0ID0gZmFjdChwYXJhbSkNCiAgICBzZW5kZXIgPDwgcmVzdWx0DQogIGVuZA0K ZW5kDQoNCg0KZmliX3NydiA8PCBbMTAsIFJhY3Rvci5jdXJyZW50XQ0KZmliX3NydiA8PCBbMjAs IFJhY3Rvci5jdXJyZW50XQ0KZmFjdF9zcnYgPDwgWzEwLCBSYWN0b3IuY3VycmVudF0NCmZhY3Rf c3J2IDw8IFsyMCwgUmFjdG9yLmN1cnJlbnRdDQoNCmRvX3NvbWVfd29yaygpDQoNClJhY3Rvci5y ZWNlaXZlDQojPT4gZmliKDEwKSBvciBmYWN0KDEwKSwgd2hpY2g/DQojICAgSWYgdGhlIHNlcnZl cnMgdXNlcyBSYWN0b3JzIG1vcmUgKGNhbGN1bGF0ZSB0aGVtIGluIHBhcmFsbGVsKSwNCiMgICBm aWIoMjApIGFuZCBmYWN0KDIwKSBjYW4gYmUgcmV0dXJuZWQuDQpgYGANCg0KQmVjYXVzZSBgUmFj dG9yLnJlY2VpdmVgIHJldHJpZXZlcyBhbGwgbWVzc2FnZXMgaW5kaXNjcmltaW5hdGVseSwgZGV2 ZWxvcGVycyBtdXN0IGFkZCB0aGVpciBvd24gdGFnZ2luZyBsb2dpYyB0byBkaXN0aW5ndWlzaCBy ZXN1bHRzLiBXaGlsZSB0YWdnaW5nIChhcyBzaG93biBpbiBFWDQpIGhlbHBzLCBpdCBpbnRyb2R1 Y2VzIGFkZGl0aW9uYWwgY29tcGxleGl0eSBhbmQgYnJpdHRsZW5lc3MuDQoNCiMjIyBSZXNwb25z ZXMgd2l0aCByZXF1ZXN0IElEDQoNClRoZSBmb2xsb3dpbmcgY29kZSByZXR1cm5zIGEgcmVzdWx0 IHdpdGggcmVxdWVzdCBpZCAoYSBwYWlyIG9mIHRoZSBuYW1lIG9mIHNlcnZlciBhbmQgYSBwYXJh bWV0ZXIpLg0KDQpgYGBydWJ5DQojIEVYNA0KDQpmaWJfc3J2ID0gUmFjdG9yLm5ldyBkbw0KICB3 aGlsZSB0cnVlDQogICAgcGFyYW0sIHNlbmRlciA9IFJhY3Rvci5yZWNlaXZlDQogICAgcmVzdWx0 ID0gZmliKHBhcmFtKQ0KICAgIHNlbmRlciA8PCBbWzpmaWIsIHBhcmFtXSwgcmVzdWx0XQ0KICBl bmQNCmVuZA0KDQpmYWN0X3NydiA9IFJhY3Rvci5uZXcgZG8NCiAgd2hpbGUgdHJ1ZQ0KICAgIHBh cmFtLCBzZW5kZXIgPSBSYWN0b3IucmVjZWl2ZQ0KICAgIHJlc3VsdCA9IGZhY3QocGFyYW0pDQog ICAgc2VuZGVyIDw8IFtbOmZhY3QsIHBhcmFtXSwgcmVzdWx0XQ0KICBlbmQNCmVuZA0KDQpkb19z b21lX3dvcmsoKQ0KDQpmaWJfc3J2IDw8IFsxMCwgUmFjdG9yLmN1cnJlbnRdDQpmaWJfc3J2IDw8 IFsyMCwgUmFjdG9yLmN1cnJlbnRdDQpmYWN0X3NydiA8PCBbMTAsIFJhY3Rvci5jdXJyZW50XQ0K ZmFjdF9zcnYgPDwgWzIwLCBSYWN0b3IuY3VycmVudF0NCg0KUmFjdG9yLnJlY2VpdmVfaWYgZG8g fGlkLCByZXN1bHR8DQogIGNhc2UgaWQNCiAgaW4gWzpmaWIsIG5dDQogICAgcCAiZmliKCN7bn0p ID0gI3tyZXN1bHR9Ig0KICBpbiBbOmZhY3QsIG5dDQogICAgcCAiZmFjdCgje259KSA9ICN7cmVz dWx0fSINCiAgZW5kDQplbmQNCg0KIyBvciBpZiB5b3Ugd2FudCB0byB1c2Ugc3BlY2lmaWMgcmVz dWx0cywgbGlrZToNCg0KcCBmaWIyMDogIFJhY3Rvci5yZWNlaXZlX2lme3xpZCwgcmVzdWx0fCBp ZCA9PiBbOmZpYiwgMjBdOyAgcmVzdWx0fQ0KcCBmYWN0MTA6IFJhY3Rvci5yZWNlaXZlX2lme3xp ZCwgcmVzdWx0fCBpZCA9PiBbOmZhY3QsIDEwXTsgcmVzdWx0fQ0KcCBmYWN0MjA6IFJhY3Rvci5y ZWNlaXZlX2lme3xpZCwgcmVzdWx0fCBpZCA9PiBbOmZhY3QsIDIwXTsgcmVzdWx0fQ0KcCBmaWIx MDogIFJhY3Rvci5yZWNlaXZlX2lme3xpZCwgcmVzdWx0fCBpZCA9PiBbOmZpYiwgMTBdOyAgcmVz dWx0fQ0KYGBgDQoNClRoaXMgYXBwcm9hY2ggY2xvc2VseSByZXNlbWJsZXMgcGF0dGVybiBtYXRj aGluZyBpbiBFcmxhbmcgb3IgRWxpeGlyLCB3aGVyZSByZXNwb25zZXMgYXJlIHRhZ2dlZCBhbmQg bWF0Y2hlZCBzdHJ1Y3R1cmFsbHkuDQoNCkhvd2V2ZXIsIHRoaXMgc29sdXRpb24gc3RpbGwgaGFz IGFuIGlzc3VlOiBpZiBgZG9fc29tZV93b3JrKClgIHVzZXMgYFJhY3Rvci5yZWNlaXZlYCwgaXQg bWF5IGFjY2lkZW50YWxseSBjb25zdW1lIGFueSBtZXNzYWdlLiBJbiBvdGhlciB3b3JkcywgYFJh Y3Rvci5yZWNlaXZlYCBjYW4gb25seSBiZSBzYWZlbHkgdXNlZCB3aGVuIHlvdSdyZSBjZXJ0YWlu IHRoYXQgbm8gb3RoZXIgY29kZSBpcyB1c2luZyBpdC4NCg0KKEFub3RoZXIgdHJpdmlhbCBpc3N1 ZSBpcywgZGlmZmVyZW50IHNlcnZlcnMgY2FuIHJldHVybiBzYW1lIGlkZW50aXR5LCBsaWtlIGBb OmZhY3QsIG51bV1gIHJldHVybmVkIGJ5IE5ld3NQYXBlciBzZXJ2ZXIuIEl0IGlzIGNvbmZ1c2lu ZykuDQoNCg0KIyMjIFVzaW5nIGNoYW5uZWxzDQoNClRvIHNvbHZlIHRoaXMgaXNzdWUsIHdlIGNh biBtYWtlIGEgY2hhbm5lbCB3aXRoIGRpZmZlcmVudCBSYWN0b3JzLg0KDQpDaGFubmVscyBjYW4g YmUgaW1wbGVtZW50ZWQgdXNpbmcgUmFjdG9ycywgYXMgaWxsdXN0cmF0ZWQgYmVsb3cuDQoNCmBg YHJ1YnkNCiMgRVg1DQoNCiMgU2VydmVycyBhcmUgY29tcGxldGVseSBzYW1lIHRvIEVYMw0KDQpm aWJfc3J2ID0gUmFjdG9yLm5ldyBkbw0KICB3aGlsZSB0cnVlDQogICAgcGFyYW0sIHNlbmRlciA9 IFJhY3Rvci5yZWNlaXZlDQogICAgcmVzdWx0ID0gZmliKHBhcmFtKQ0KICAgIHNlbmRlciA8PCBy ZXN1bHQNCiAgZW5kDQplbmQNCg0KZmFjdF9zcnYgPSBSYWN0b3IubmV3IGRvDQogIHdoaWxlIHRy dWUNCiAgICBwYXJhbSwgc2VuZGVyID0gUmFjdG9yLnJlY2VpdmUNCiAgICByZXN1bHQgPSBmYWN0 KHBhcmFtKQ0KICAgIHNlbmRlciA8PCByZXN1bHQNCiAgZW5kDQplbmQNCg0KIyBDcmVhdGUgYSBu ZXcgY2hhbm5lbCB1c2luZyBhIFJhY3Rvcg0KZGVmIG5ld19jaGFubmVsDQogIFJhY3Rvci5uZXcg ZG8NCiAgICB3aGlsZSB0cnVlDQogICAgICBSYWN0b3IueWllbGQgUmFjdG9yLnJlY2VpdmUNCiAg ICBlbmQNCiAgZW5kDQplbmQNCg0KDQpmaWJfc3J2IDw8IFsxMCwgZmliMTBfY2ggPSBuZXdfY2hh bm5lbF0NCmZpYl9zcnYgPDwgWzIwLCBmaWIyMF9jaCA9IG5ld19jaGFubmVsXQ0KZmFjdF9zcnYg PDwgWzEwLCBmYWN0MTBfY2ggPSBuZXdfY2hhbm5lbF0NCmZhY3Rfc3J2IDw8IFsyMCwgZmFjdDIw X2NoID0gbmV3X2NoYW5uZWxdDQoNCmRvX3NvbWV0aGluZygpDQoNCnAgZmliMjA6IGZpYjIwX2No LnRha2UgICAjIHdhaXQgZm9yIGZpYigyMCkNCnAgZmFjdDEwOiBmYWN0MTBfY2gudGFrZSAjIHdh aXQgZm9yIGZhY3QoMTApDQpwIGZpYjEwOiBmaWIxMF9jaC50YWtlICAgIyB3YWl0IGZvciBmaWIo MTApDQpwIGZhY3QyMDogZmFjdDEwX2NoLnRha2UgIyB3YWl0IGZvciBmYWN0KDIwKQ0KDQojIG9y IA0KY2hzID0gW2ZpYjEwX2NoLCBmaWIyMF9jaCwgZmFjdDEwX2NoLCBmYWN0MjBfY2hdDQoNCndo aWxlICFjaHMuZW1wdHk/DQogIGNoLCByZXN1bHQgPSBSYWN0b3Iuc2VsZWN0KCpjaHMpICMgd2Fp dCBmb3IgbXVsdGlwbGUgY2hhbm5lbHMNCiAgcCBjaCwgcmVzdWx0DQogIGNocy5kZWxldGUgY2gN CmVuZA0KYGBgDQoNCkNoYW5uZWwgYXBwcm9hY2ggc29sdmVzIHRoZSBpc3N1ZSBvZiBFWDQuIFRo ZSBhYm92ZSBpbXBsZW1lbnRhdGlvbiBpbnRyb2R1Y2Ugc29tZSBvdmVyaGVhZCB0byBjcmVhdGUg Y2hhbm5lbCByYWN0b3JzLCBidXQgd2UgY2FuIGludHJvZHVjZSBzcGVjaWFsIGltcGxlbWVudGF0 aW9uIHRvIHJlZHVjZSB0aGlzIFJhY3RvciBjcmVhdGlvbiBvdmVyaGVhZC4NCg0KSG93ZXZlciwg aW4gdGhlIEFjdG9yIG1vZGVsLCB0aGUgY29tbXVuaWNhdGlvbiBwYXR0ZXJuIGlzIHRvIHNlbmQg YSBtZXNzYWdlIHRvIGEgc3BlY2lmaWMgYWN0b3IuIEluIGNvbnRyYXN0LCBjaGFubmVscyBhcmUg dXNlZCB0byBzZW5kIG1lc3NhZ2VzIHRocm91Z2ggYSBzaGFyZWQgY29uZHVpdCwgd2l0aG91dCBj YXJpbmcgd2hpY2ggcmVjZWl2ZXIgKGlmIGFueSkgaGFuZGxlcyB0aGUgbWVzc2FnZS4gQWxzbywg Y2hhbm5lbHMgY2FuIGhhdmUgc29tZSBvdmVyaGVhZCwgYXMgZGlzY3Vzc2VkIGJlbG93Lg0KDQoj IyMgU3VtbWFyeSBvZiBiYWNrZ3JvdW5kDQoNCkN1cnJlbnRseSwgd2hlbiBpbXBsZW1lbnRpbmcg cmVxdWVzdC1yZXNwb25zZSBwYXR0ZXJucyB3aXRoIFJhY3RvcnMsIGRldmVsb3BlcnMgZmFjZSBj aGFsbGVuZ2VzIGluIHRyYWNraW5nIHJlc3VsdHMsIG1hbmFnaW5nIGlkZW50aWZpZXJzLCBhbmQg YXZvaWRpbmcgbWVzc2FnZSBjb25mbGljdHMuIEV4aXN0aW5nIHByaW1pdGl2ZXMgbGlrZSBgcmVj ZWl2ZV9pZmAsIGB0YWtlYCwgb3IgY2hhbm5lbHMgaW1wbGVtZW50ZWQgd2l0aCBSYWN0b3JzIGFy ZSBlaXRoZXIgZXJyb3ItcHJvbmUgb3IgaW5lZmZpY2llbnQuDQoNCiMjIFByb3Bvc2FsDQoNCklu dHJvZHVjZSBgUmFjdG9yOjpQb3J0YCBhcyBhbiBhbHRlcm5hdGl2ZSB0byBjaGFubmVscy4gSXQg aXMgYSBuYXR1cmFsIGV4dGVuc2lvbiBvZiB0aGUgQWN0b3IgbW9kZWwuIEluIGZhY3QsIGl0IGlz IHRoaW4gd3JhcHBlciBvZiBjdXJyZW50IHNlbmQvcmVjZWl2ZSBtb2RlbCBhcyBpbGx1c3RyYXRl ZCBhdCB0aGUgdG9wIG9mIHRoaXMgcHJvcG9zYWwuDQoNCldpdGggdGhlIGBSYWN0b3I6OlBvcnRg LCB3ZSBjYW4gcmV3cml0ZSBhYm92ZSBleGFtcGxlcyB3aXRoIGl0Lg0KDQpgYGBydWJ5DQojIEVY Ng0KDQojIENvbXBsZXRlbHkgc2FtZSBhcyBFWDMncyBzZXJ2ZXJzDQoNCmZpYl9zcnYgPSBSYWN0 b3IubmV3IGRvDQogIHdoaWxlIHRydWUNCiAgICBwYXJhbSwgc2VuZGVyID0gUmFjdG9yLnJlY2Vp dmUNCiAgICByZXN1bHQgPSBmaWIocGFyYW0pDQogICAgc2VuZGVyIDw8IHJlc3VsdA0KICBlbmQN CmVuZA0KDQpmYWN0X3NydiA9IFJhY3Rvci5uZXcgZG8NCiAgd2hpbGUgdHJ1ZQ0KICAgIHBhcmFt LCBzZW5kZXIgPSBSYWN0b3IucmVjZWl2ZQ0KICAgIHJlc3VsdCA9IGZhY3QocGFyYW0pDQogICAg c2VuZGVyIDw8IHJlc3VsdA0KICBlbmQNCmVuZA0KDQpmaWJfc3J2IDw8IFsxMCwgZmliMTBfcG9y dCA9IFJhY3Rvcjo6UG9ydC5uZXddDQpmaWJfc3J2IDw8IFsyMCwgZmliMjBfcG9ydCA9IFJhY3Rv cjo6UG9ydC5uZXddDQpmYWN0X3NydiA8PCBbMTAsIGZhY3QxMF9wb3J0ID0gUmFjdG9yOjpQb3J0 Lm5ld10NCmZhY3Rfc3J2IDw8IFsyMCwgZmFjdDIwX3BvcnQgPSBSYWN0b3I6OlBvcnQubmV3XQ0K DQpkb19zb21ldGhpbmcNCg0KcCBmaWIxMF9wb3J0LnJlY2VpdmUgIz0+IGZpYigxMCkNCnAgZmli MjBfcG9ydC5yZWNlaXZlICM9PiBmaWIoMjApDQpwIGZhY3QxMF9wb3J0LnJlY2VpdmUgIz0+IGZh Y3QoMTApDQpwIGZhY3QyMF9wb3J0LnJlY2VpdmUgIz0+IGZhY3QoMjApDQoNCiMgb3INCg0KcG9y dHMgPSBbZmliMTBfcG9ydCwgZmliMjBfcG9ydCwgZmFjdDEwX3BvcnQsIGZhY3QyMF9wb3J0XQ0K DQp3aGlsZSAhcG9ydHMuZW1wdHk/DQogIHBvcnQsIHJlc3VsdCA9IFJhY3Rvci5zZWxlY3QoKnBv cnRzKQ0KICBjYXNlIHBvcnQNCiAgd2hlbiBmaWIxMF9wb3J0DQogICAgcCBmaWIxMDogcmVzdWx0 DQogIC4uLg0KICBlbHNlDQogICAgcmFpc2UgIlRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKEJVRyku Ig0KICBlbmQNCg0KICBwb3J0cy5kZWxldGUocG9ydCkNCmVuZA0KYGBgDQoNCmBSYWN0b3I6OlBv cnRgIHJlc29sdmVzIGtleSBwYWluIHBvaW50cyBpbiBtZXNzYWdlIHBhc3NpbmcgYmV0d2VlbiBS YWN0b3JzOg0KDQoqIEl0IGd1YXJhbnRlZXMgdGhhdCBpbmNvbWluZyBtZXNzYWdlcyBhcmUgb25s eSBkZWxpdmVyZWQgdG8gdGhlIGludGVuZGVkIFJhY3RvciwgcHJldmVudGluZyB0YWcgY29sbGlz aW9ucy4NCiogSXQgZW5hYmxlcyBtZXNzYWdlIHJvdXRpbmcgd2l0aG91dCByZWx5aW5nIG9uIGds b2JhbCByZWNlaXZlIGJsb2NrcyAoYFJhY3Rvci5yZWNlaXZlYCksIHdoaWNoIGFyZSBwcm9uZSB0 byB1bmludGVuZGVkIGNvbnN1bXB0aW9uLg0KKiBJdCByZXBsYWNlcyBtb3JlIGNvbXBsZXggcHJp bWl0aXZlcyBsaWtlIGAucmVjZWl2ZV9pZmAsIGAueWllbGRgLCBhbmQgYCN0YWtlYCB3aXRoIGEg c2ltcGxlciwgY29tcG9zYWJsZSBhYnN0cmFjdGlvbi4NCiogSXQgbWFwcyBjbGVhbmx5IHRvIHRo ZSBBY3RvciBtb2RlbCBzZW1hbnRpY3MgUnVieSBpbnRlbmRzIHRvIHN1cHBvcnQgd2l0aCBSYWN0 b3JzLg0KDQpXaGlsZSB0aGUgcGF0dGVybiBsb29rcyBzaW1pbGFyIHRvIHVzaW5nIGNoYW5uZWxz LCB0aGUgc2VtYW50aWNzIGFuZCBndWFyYW50ZWVzIGFyZSBkaWZmZXJlbnQgaW4gbWVhbmluZ2Z1 bCB3YXlzLg0KDQpUaGUgYWR2YW50YWdlcyBvZiB1c2luZyBQb3J0cyBpbmNsdWRlOg0KDQoqIFNh ZmVyIHRoYW4gY2hhbm5lbHMgaW4gcHJhY3RpY2UNCiAgKiBXaGVuIHVzaW5nIGEgUG9ydCwgaWYg YCNzZW5kYCBzdWNjZWVkcywgaXQgbWVhbnMgdGhlIGRlc3RpbmF0aW9uIFJhY3RvciBpcyBzdGls bCBhbGl2ZSAoaS5lLiwgaXQncyBydW5uaW5nKS4NCiAgKiBJbiBjb250cmFzdCwgd2l0aCBhIGNo YW5uZWwsIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgYW55IFJhY3RvciBpcyBzdGlsbCBhdmFp bGFibGUgdG8gcmVjZWl2ZSBmcm9tIGl0Lg0KICAqIE9mIGNvdXJzZSwgZXZlbiB3aXRoIGEgcG9y dCwgdGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCB0aGUgZGVzdGluYXRpb24gUmFjdG9yIHdpbGwg YWN0dWFsbHkgcHJvY2VzcyB0aGUgbWVzc2FnZSDigJQgaXQgbWlnaHQgaWdub3JlIGl0Lg0KICAq IEJ1dCBhdCBsZWFzdCB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgUmFjdG9yIGhh dmluZyBhbHJlYWR5IHRlcm1pbmF0ZWQgdW5leHBlY3RlZGx5Lg0KICAqIEluIG90aGVyIHdvcmRz LCB1c2luZyBhIHBvcnQgZWxpbWluYXRlcyBvbmUgbWFqb3IgZmFpbHVyZSBjYXNlLCBtYWtpbmcg dGhlIGNvbW11bmljYXRpb24gbW9kZWwgbW9yZSBwcmVkaWN0YWJsZS4NCiAgKiBUaGlzIGlzIG9u ZSBvZiB0aGUgcmVhc29ucyB3aHkgUnVieSB3ZW50IHdpdGggdGhlICJBY3RvciIgbW9kZWwgKGhl bmNlIHRoZSBuYW1lIFJhY3RvciksIGluc3RlYWQgb2YgdGhlICJDU1AiIG1vZGVsLg0KKiBGYXN0 ZXIgdGhhbiBjaGFubmVscyBpbiBib3RoIGNyZWF0aW9uIGFuZCBtZXNzYWdlIHRyYW5zbWlzc2lv bg0KICAqIFdoZW4gY3JlYXRpbmcgYSBjaGFubmVsLCB3ZSBuZWVkIHRvIHByZXBhcmUgYSBjb250 YWluZXIgZGF0YSBzdHJ1Y3R1cmUuIFdoZW4gY3JlYXRpbmcgYSBwb3J0LCBpdCBpcyBsaWdodHdl aWdodCBkYXRhIChhIHBhaXIgb2YgUmFjdG9yIGFuZCBuZXdseSBjcmVhdGVkIElEKS4NCiAgKiBP biB0aGUgY2hhbm5lbCB0cmFuc21pc3Npb24sIHdlIG5lZWQgY29weWluZyBhIGRhdGEgdG8gY2hh bm5lbCBhbmQgYSBjb3B5aW5nIHRvIHRoZSByZWNlaXZpbmcgcmFjdG9yLiBPbiB0aGUgcG9ydCwg aXQgb25seSBuZWVkcyB0byBjb3B5IGZyb20gdGhlIHNyYyByYWN0b3IgdG8gdGhlIGRzdCByYWN0 b3IuIFRoaXMgaXNzdWUgYmVjb21lcyBtb3JlIHNpZ25pZmljYW50IGR1ZSB0byBSYWN0b3ItbG9j YWwgZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZCBpc29sYXRpb24gb2Ygb2JqZWN0IHNwYWNlcy4NCiog RWFzeSB0byBpbXBsZW1lbnQuIFdlIG9ubHkgbmVlZCB0byBpbXBsZW1lbnQgYFBvcnQjcmVjZWl2 ZWAgdG8gc3luY2hyb25pemUgd2l0aCBvdGhlciByYWN0b3JzLg0KICAqIGAjc2VuZC8ucmVjZWl2 ZWAgaXMgZWFzeSB0byBpbXBsZW1lbnQgYmVjYXVzZSB3ZSBvbmx5IG5lZWQgdG8gbG9jayB0aGUg cmVjZWl2aW5nIHJhY3Rvci4NCiAgKiBgLnlpZWxkLyN0YWtlYCBpcyBub3QgZWFzeSB0byBpbXBs ZW1lbnQgYmVjYXVzZSB3ZSBuZWVkIHRvIGxvY2sgdGFraW5nIGFuZCByZWNlaXZpbmcgcmFjdG9y cyBiZWNhdXNlIGl0IGlzIHJlbmRlenZvdXMgc3R5bGUgc3luY2hyb25pemF0aW9uLg0KICAqIGAu c2VsZWN0YCBpcyBESUZGSUNVTFQgdG8gc3VwcG9ydCBjdXJyZW50IHNwZWMuIE5vdyBDSSBkb2Vz bid0IHN0YWJsZSB5ZXQuDQogICogQSBzaW1wbGVyIHNwZWMgcmVkdWNlcyBidWdzLCBhbmQgbWF5 YmUgbGVhZHMgdG8gZmFzdGVyIGltcGxlbWVudGF0aW9uLg0KDQpEaXNhZHZhbnRhZ2VzOg0KDQox LiBJdCBpcyBub3QgYSB3ZWxsLWtub3duIGNvbmNlcHQsIGVzcGVjaWFsbHkgZm9yIEdvIGxhbmd1 YWdlIHVzZXJzLg0KMi4gV2UgbmVlZCBhZGRpdGlvbmFsIGFic3RyYWN0aW9uIGxpa2UgcHJvZHVj ZXIocyktY29uc3VtZXIocykgY29uY3VycmVudCBhcHBsaWNhdGlvbnMuDQoNCkZvciAoMiksIEkg d2FudCB0byBpbnRyb2R1Y2UgYW4gZXhhbXBsZSBjb2RlLiBXZSBjYW4gd3JpdGUgYSAxLXByb2R1 Y2VyLCBtdWx0aXBsZS1jb25zdW1lciBwYXR0ZXJuIHdpdGggYSBjaGFubmVsLg0KDQpgYGBydWJ5 DQojIGNoYW5uZWwgdmVyc2lvbiBvZiAxIHByb2R1Y2VyICYgY29uc3VtZXJzDQoNCmNoID0gbmV3 X2NoYW5uZWwNCg0KUk4gPSAxMCAjIG1ha2UgMTAgY29uc3VtZXJzDQoNCmNvbnN1bWVycyA9IFJO LnRpbWVzLm1hcCBkbw0KICBSYWN0b3IubmV3IGNoIGRvDQogICAgd2hpbGUgcGFyYW0gPSBjaC5y ZWNlaXZlDQogICAgICB0YXNrKHBhcmFtKQ0KICAgIGVuZA0KICBlbmQNCmVuZA0KDQp0YXNrcy5l YWNoIGRvIHx0YXNrfA0KICBjaCA8PCB0YXNrDQplbmQNCmBgYA0KDQpXaXRoIFBvcnQsIHdlIG5l ZWQgdG8gaW50cm9kdWNlIGEgbG9hZCBiYWxhbmNpbmcgbWVjaGFuaXNtOg0KDQpgYGBydWJ5DQoj IFBvcnQgdmVyc2lvbiBvZiAxIHByb2R1Y2VyICYgY29uc3VtZXJzDQoNCmNvbnRyb2xfcG9ydCA9 IFJhY3Rvcjo6UG9ydC5uZXcNCmNvbnN1bWVycyA9IFJOLnRpbWVzLm1hcCBkbw0KICBSYWN0b3Iu bmV3IGNvbnRyb2xfcG9ydCBjb250cm9sX3BvcnQgZG8gfGNvbnRyb2xfcG9ydHwNCiAgICB3aGls ZSB0cnVlDQogICAgICBjb250cm9sX3BvcnQgPDwgWzpyZWFkeSwgUmFjdG9yLmN1cnJlbnRdICMg cmVnaXN0ZXIgLSByZWFkeQ0KICAgICAgcGFyYW0gPSBSYWN0b3IucmVjZWl2ZSAjIGl0IGFzc3Vt ZXMgdGFzayBkb2Vzbid0IHVzZSBSYWN0b3IucmVjZWl2ZQ0KICAgICAgdGFzayhwYXJhbSkNCiAg ICBlbmQNCiAgZW5kDQplbmQNCg0KdGFza3MuZWFjaCBkbyB8dGFza3wNCiAgY29udHJvbF9wb3J0 LnJlY2VpdmUgPT4gWzpyZWFkeSwgY29uc3VtZXJdDQogIA0KICAjIHNlbmQgYSB0YXNrIHRvIGEg cmVhZHkgY29uc3VtZXINCiAgY29uc3VtZXIgPDwgdGFzaw0KZW5kDQpgYGANCg0KT2YgY291cnNl IHdlIGNhbiBtYWtlIGEgbGlicmFyeSBmb3IgdGhhdCAobGlrZSBPVFAgb24gRXJsYW5nKS4NCg0K IyMjIERlZmF1bHQgcG9ydCBvZiBSYWN0b3JzDQoNCkVhY2ggUmFjdG9yIGhhcyBhIGRlZmF1bHQg cG9ydCBhbmQgYFJhY3RvciNzZW5kYCBpcyBlcXVhbCB0byBgUmFjdG9yLmN1cnJlbnQuZGVmYXVs dF9wb3J0I3NlbmRgLiBPZiBjb3Vyc2UsIGBSYWN0b3IucmVjZWl2ZWAgaXMgZXF1YWwgdG8gYFJh Y3Rvci5jdXJyZW50LmRlZmF1bHRfcG9ydC5yZWNlaXZlYC4NCg0KRm9yIHRoZSBzaW1wbGUgY2Fz ZSwgd2UgY2FuIGtlZXAgdG8gdXNlIGBSYWN0b3Ijc2VuZGAgYW5kIGBSYWN0b3IucmVjZWl2ZWAN Cg0KIyMjIERlcHJlY2F0aW9uIG9mIFJhY3RvciN0YWtlIGFuZCBSYWN0b3IueWllbGQNCg0KV2l0 aCB0aGUgUG9ydCBjb25jZXB0LCB3ZSBjYW4gZm9jdXMgc29sZWx5IG9uIHNlbmQgYW5kIHJlY2Vp dmXigJR0aGF0IGlzLCBkaXJlY3QgbWFuaXB1bGF0aW9uIG9mIGEgUmFjdG9y4oCZcyBtYWlsYm94 LiBQb3J0cyBwcm92aWRlIGEgY2xlYW4gYW5kIGZ1bmN0aW9uYWwgYWx0ZXJuYXRpdmUgdG8gYFJh Y3RvciN0YWtlYCBhbmQgYFJhY3Rvci55aWVsZGAsIG1ha2luZyB0aGVtIHVubmVjZXNzYXJ5IGlu IG1vc3QgdXNlIGNhc2VzLg0KDQpNb3Jlb3ZlciwgUG9ydHMgYXJlIHNpZ25pZmljYW50bHkgZWFz aWVyIHRvIGltcGxlbWVudCwgYXMgdGhleSByZXF1aXJlIG9ubHkgbG9ja2luZyB0aGUgcmVjZWl2 aW5nIFJhY3Rvciwgd2hpbGUgeWllbGQvdGFrZSBpbnZvbHZlIGNvbXBsZXggcmVuZGV6dm91cy1z dHlsZSBzeW5jaHJvbml6YXRpb24uIEJ5IHJlbW92aW5nIHRoZXNlIHByaW1pdGl2ZXMsIHdlIGNh biBzaW1wbGlmeSB0aGUgc3BlY2lmaWNhdGlvbiBhbmQgcmVkdWNlIGltcGxlbWVudGF0aW9uIGNv bXBsZXhpdHnigJRlc3BlY2lhbGx5IGFyb3VuZCBmZWF0dXJlcyBsaWtlIGBSYWN0b3Iuc2VsZWN0 YCwgd2hpY2ggYXJlIG5vdG9yaW91c2x5IGhhcmQgdG8gZ2V0IHJpZ2h0Lg0KDQojIyMgYFJhY3Rv ci5zZWxlY3RgIHdpdGggcG9ydHMNCg0KV2Ugc2hvdWxkIHdhaXQgZm9yIG11bHRpcGxlIHBvcnQg c2ltdWx0YW5lb3VzbHkgc28gYFJhY3Rvci5zZWxlY3QoKWAgc2hvdWxkIGFjY2VwdCBwb3J0cy4g Tm93IGBSYWN0b3Iuc2VsZWN0KClgIGNhbiBhbHNvIHJlY2VpdmluZyBhbmQgeWllbGRpbmcgdGhl IHZhbHVlLCBidXQgaWYgd2UgcmVtb3ZlIHRoZSBgI3Rha2VgIGZ1bmN0aW9uYWxpdHksIGBSYWN0 b3Iuc2VsZWN0YCBvbmx5IG5lZWQgdG8gc3VwcG9ydCBwb3J0cy4NCg0KIyMjIFdhaXQgZm9yIHRl cm1pbmF0aW9uDQoNCmBSYWN0b3IjdGFrZWAgaXMgZGVzaWduZWQgZnJvbSBhbiBpZGVhIG9mIGdl dHRpbmcgdGVybWluYXRpb24gcmVzdWx0IChsaWtlIGBUaHJlYWQjdmFsdWVgKS4gRm9yIHRoaXMg cHVycG9zZSwgd2UgY2FuIGludHJvZHVjZSBgUmFjdG9yI2pvaW5gIG9yIGBSYWN0b3IjdmFsdWVg IGxpa2UgVGhyZWFkcyBvciB3ZSBjYW4ga2VlcCB0aGUgbmFtZSBgUmFjdG9yI3Rha2VgIGZvciB0 aGlzIHB1cnBvc2UuDQoNCldlIGNhbiBtYWtlIGBSYWN0b3Ijam9pbmAgYXMgYSBmb2xsb3dpbmcg cHNldWRvLWNvZGU6DQoNCmBgYHJ1YnkNCmNsYXNzIFJhY3Rvcg0KICBkZWYgam9pbiAjIHdhaXQg Zm9yIHRoZSB0ZXJtaW5hdGlvbg0KICAgIHJlZ2lzdGVyX3Rlcm1pbmF0aW9uX3BvcnQgcG9ydCA9 IFBvcnQubmV3DQogICAgcG9ydC5yZWNlaXZlDQogIGVuZA0KICANCiAgIyB3aGVuIHRoaXMgcmFj dG9yIHRlcm1pbmF0ZXMsIHNlbmQgYSBtZXNzYWdlIHRvIHRoZSByZWdpc3RlcmVkIHBvcnQNCiAg ZGVmIG1vbml0b3IgcG9ydA0KICAgIEBtb25pdG9yX3BvcnQgPSBwb3J0DQogIGVuZA0KICANCiAg cHJpdmF0ZSBkZWYgYXRleGl0DQogICAgQG1vbml0b3JfcG9ydCA8PCB0ZXJtaW5hdGlvbl9tZXNz YWdlDQogIGVuZA0KZW5kDQoNCiMgdGhlcmUgYXJlIHNvbWUgcXVlc3Rpb25zLg0KIyAqIGNhbiB3 ZSByZWdpc3RlciBtdWx0aXBsZSBwb3J0cz8NCiMgKiBzaG91bGQgd2Ugc3VwcG9ydCBgI2pvaW5g IGFuZCBgI3ZhbHVlYCBsaWtlIHRocmVhZHM/DQojICAgb3Igc2hvdWxkIHdlIHN1cHBvcnQgb25s eSBgI2pvaW5gIHRvIHJldHVybiB0aGUgdmFsdWU/DQojICogb3Iga2VlcCB0aGlzIG5hbWUgYXMg YCN0YWtlYD8NCg0KDQpSYWN0b3IubmV3IGRvDQogIDQyDQplbmQuam9pbiAjPT4gNDIgKG9yIHRy dWU/KQ0KYGBgDQoNCkl0IGlzIHZlcnkgc2ltaWxhciB0byBgbW9uaXRvcmAgaW4gRXJsYW5nIG9y IEVsaXhpci4NCldlIGNhbiBhbHNvIG1ha2UgYSBzdXBlcnZpc29yIGluIEVybGFuZyBsaWtlIHRo YXQ6DQoNCmBgYHJ1YnkNCnN2X3BvcnQgPSBSYWN0b3I6OlBvcnQubmV3DQoNCnJzID0gTi50aW1l cy5tYXAgZG8NCiAgUmFjdG9yLm5ldyBkbw0KICAgIGRvX3NvbWV0aGluZygpDQogIGVuZC5tb25p dG9yIHN2X3BvcnQNCmVuZA0KDQp3aGlsZSB0ZXJtaW5hdGlvbl9ub3RpY2UgPSBzdl9wb3J0LnJl Y2VpdmUNCiAgcCB0ZXJtaW5hdGlvbl9ub3RpY2UNCmVuZA0KDQojIFdpdGggUmFjdG9yI3Rha2Us IHdlIGNhbiB3cml0ZSBzaW1pbGFyIGNvZGUgaWYgdGhlcmUgaXMgbm8gUmFjdG9yLnlpZWxkDQoN CnJzID0gTi50aW1lcy5tYXAgZG8NCiAgUmFjdG9yLm5ldyBkbw0KICAgIGRvX3NvbWV0aGluZygp DQogIGVuZA0KZW5kDQoNCndoaWxlIHIsIG1zZyA9IFJhY3Rvci5zZWxlY3QoKnJzKQ0KICBwIFty LCBtc2ddDQplbmQNCmBgYA0KDQojIyBEaXNjdXNzaW9uDQoNCiMjIyBgc2VuZGAgd2l0aCB0YWcg KHN5bWJvbHMpDQoNCklmIHdlIGZvcmNlIHVzZXJzIHRvIHNlbmQgYSB0YWdnZWQgbWVzc2FnZSBl dmVyeSB0aW1lLCB3ZSBjYW4gYWNoaWV2ZSB0aGUgc2FtZSBlZmZlY3QgYXMgUG9ydCBjb25jZXB0 LCBiZWNhdXNlIGEgUG9ydCBjYW4gYmUgdGhvdWdodCBvZiBhcyBhIGNvbWJpbmF0aW9uIG9mIGEg dGFnIGFuZCBhIGRlc3RpbmF0aW9uIFJhY3Rvci4NCg0KYGBgcnVieQ0KciA9IFJhY3Rvci5uZXcg ZG8NCiAgbG9vcCBkbw0KICAgIHRhZywgbXNnID0gUmFjdG9yLnJlY2VpdmUgIyByZXR1cm4gMiB2 YWx1ZXMNCiAgICBjYXNlIHRhZw0KICAgIHdoZW4gOlRBRw0KICAgICAgcCBbdGFnLCBtc2ddDQog ICAgZWxzZQ0KICAgICAgIyBpZ25vcmUNCiAgICBlbmQNCiAgZW5kDQplbmQNCg0Kci5zZW5kIDpU QUcsIDQyDQpyLnNlbmQgOlRBR0UsIDg0ICMgdGhpcyB0eXBvIGFuZCB0aGUgbWVzc2FnZSBpcyBz aWxlbnRseSBpZ25vcmVkDQpgYGANCg0KSG93ZXZlciBpdCBoYXMgdHdvIGlzc3VlczoNCg0KKiBJ ZiB3ZSBtYWtlIGEgdHlwbyBpbiB0YWcgbmFtZSwgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBzaWxlbnRs eSBpZ25vcmVkLg0KKiBUaGUgdGFnIG5hbWUgbWF5IGNvbmZsaWN0IHdpdGggdW5yZWxhdGVkIGNv ZGVzIChsaWJyYXJpZXMpDQoNCiMjIyBgUmFjdG9yLnlpZWxkYCBhbmQgYFJhY3RvciN0YWtlYCB3 aXRoIGNoYW5uZWwgcmFjdG9yDQoNCklmIHdlIHdhbnQgdG8gbGVhdmUgdGhlIGAueWllbGRgIGFu ZCBgI3Rha2VgLCB3ZSBjYW4gZW11bGF0ZSB0aGVtIHdpdGggY2hhbm5lbCByYWN0b3IuDQoNCmBg YHJ1YnkNCmNsYXNzIFJhY3Rvcg0KICBkZWYgaW5pdGlhbGl6ZQ0KICAgIEB5aWVsZF9yYWN0b3Ig PSBSYWN0b3IubmV3IGRvDQogICAgICB0YWtlcnMgPSBbXQ0KICAgICAgd2hpbGUgdGFnLCBtc2cg PSBSYWN0b3IucmVjZWl2ZQ0KICAgICAgICBjYXNlIHRhZw0KICAgICAgICB3aGVuIDpyZWdpc3Rl cg0KICAgICAgICAgIEB0YWtlcnMgPDwgbXNnDQogICAgICAgIHdoZW4gOnVucmVnaXN0ZXINCiAg ICAgICAgICBAdGFrZXJzLmRlbGV0ZSBtc2cNCiAgICAgICAgd2hlbiA6eWllbGQNCiAgICAgICAg ICBAdGFrZXJzLnBvcCA8PCBtc2cNCiAgICAgICAgZW5kDQogICAgICBlbmQNCiAgICBlbmQNCiAg ZW5kDQoNCiAgZGVmIHNlbGYueWllbGQgb2JqDQogICAgQHlpZWxkX3JhY3RvciA8PCBbOnlpZWxk LCBvYmpdDQogIGVuZA0KDQogIGRlZiB0YWtlDQogICAgQHlpZWxkX3JhY3RvciA8PCBbOnJlZ2lz dGVyLCBwb3J0ID0gUmFjdG9yOjpQb3J0Lm5ld10NCiAgICBwb3J0LnJlY2VpdmUNCiAgZW5zdXJl DQogICAgQHlpZWxkX3JhY3RvciA8PCBbOnVucmVnaXN0ZXIsIHBvcnRdDQogIGVuZA0KZW5kDQpg YGANCg0KIyMjIE9wZW5pbmcgYW5kIGNsb3NpbmcgdGhlIHBvcnQNCg0KVGhpcyBwcm9wb3NhbCBk b2Vzbid0IGNvbnRhaW4gb3BlbmluZyBhbmQgY2xvc2luZyB0aGUgcG9ydCwgYnV0IHdlIGNhbiBk aXNjdXNzIGFib3V0IGl0LiBUbyBpbnRyb2R1Y2UgdGhpcyBhdHRyaWJ1dGUsIHdlIG5lZWQgdG8g bWFuYWdlIHdoaWNoIHBvcnRzICh0YWdzKSBhcmUgb3BlbmluZy4NCg0KIyMgSW1wbGVtZW50YXRp b24NCg0KTm93IHRoZSBuYXRpdmUgaW1wbGVtZW50YXRpb24gaXMgbm90IGZpbmlzaGVkLCBidXQg d2UgY2FuIGltcGxlbWVudCBpdCB1c2luZyB0aGUgYFJhY3Rvci5yZWNlaXZlX2lmYCBtZWNoYW5p c20sIHNvIHdlIGVzdGltYXRlIHRoYXQgb25seSBhIGZldyB3ZWVrcyBvZiB3b3JrIGFyZSBuZWVk ZWQgdG8gY29tcGxldGUgaXQuDQoNCiMjIFN1bW1hcnkNCg0KVGhpcyBwcm9wb3NhbCBpbnRyb2R1 Y2VzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYW5kIGRlcHJlY2F0aW9ucy4NCg0KKiBgUmFjdG9y OjpQb3J0YA0KICAqIGBQb3J0I3NlbmQobXNnKWAg4oCTIHNlbmRzIGEgbWVzc2FnZSB0byB0aGUg Y3JlYXRvciBvZiB0aGUgcG9ydC4NCiAgKiBgUG9ydCNyZWNlaXZlYCDigJMgcmVjZWl2ZXMgYSBt ZXNzYWdlIGZyb20gdGhlIHBvcnQuDQogICogQSBwb3J0IGlzIGEgbGlnaHR3ZWlnaHQgZGF0YSBz dHJ1Y3R1cmUgKGEgcGFpciBvZiBhIFJhY3RvciBhbmQgYSB0YWcpLg0KKiBgUmFjdG9yI2pvaW5g IG9yIGBSYWN0b3IjdmFsdWVgIOKAkyB0byB3YWl0IGZvciBSYWN0b3IgdGVybWluYXRpb24gKGxp a2UgYFRocmVhZCNqb2luYCkNCiogYFJhY3RvciNtb25pdG9yYCDigJMgdG8gb2JzZXJ2ZSB3aGVu IGFub3RoZXIgUmFjdG9yIHRlcm1pbmF0ZXMNCiogRGVwcmVjYXRpb25zOg0KICAqIGBSYWN0b3Ij dGFrZWANCiAgKiBgUmFjdG9yLnlpZWxkYA0KICAqIGBSYWN0b3IucmVjZWl2ZV9pZmANCg0KVGhh bmsgeW91IGZvciByZWFkaW5nIHRoaXMgbG9uZyBwcm9wb3NhbC4gSWYgeW91IGhhdmUgYW55IHVz ZSBjYXNlcyB0aGF0IGNhbm5vdCBiZSBhZGRyZXNzZWQgd2l0aCBgUmFjdG9yOjpQb3J0YCwgSSdk IGxvdmUgdG8gaGVhciB0aGVtLg0KDQoNClAuUy4gVGhhbmtzIHRvIG1hbWUgZm9yIHJldmlld2lu ZyB0aGlzIHByb3Bvc2FsIGFuZCBzdWdnZXN0aW5nIHRoYXQgSSB1c2UgQ2hhdEdQVCB0byBpbXBy b3ZlIHRoZSB3cml0aW5nLg0KDQoNCg0KLS0gDQpodHRwczovL2J1Z3MucnVieS1sYW5nLm9yZy8N CiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiBydWJ5LWNv cmUgbWFpbGluZyBsaXN0IC0tIHJ1YnktY29yZUBtbC5ydWJ5LWxhbmcub3JnCiBUbyB1bnN1YnNj cmliZSBzZW5kIGFuIGVtYWlsIHRvIHJ1YnktY29yZS1sZWF2ZUBtbC5ydWJ5LWxhbmcub3JnCiBy dWJ5LWNvcmUgaW5mbyAtLSBodHRwczovL21sLnJ1YnktbGFuZy5vcmcvbWFpbG1hbjMvbGlzdHMv cnVieS1jb3JlLm1sLnJ1YnktbGFuZy5vcmcv