[ruby-core:121635] [Ruby Feature#21262] Proposal: `Ractor::Port`
From:
"ko1 (Koichi Sasada) via ruby-core" <ruby-core@...>
Date:
2025-04-11 18:14:10 UTC
List:
ruby-core #121635
SXNzdWUgIzIxMjYyIGhhcyBiZWVuIHVwZGF0ZWQgYnkga28xIChLb2ljaGkgU2FzYWRhKS4NCg0K DQo+IFRoZSBwcm9ibGVtIHdpdGggdGhlIGFib3ZlIGNvZGUgaXMgdGhhdCB0aGUgY29uc3VtZXIg UmFjdG9yIHdpbGwgc3RhcnZlIHVudGlsIGZpbmRfd29yayByZXR1cm5zLg0KDQpJIHRoaW5rIGl0 IGlzIHNhbWUgb24geW91ciB0aHJlYWQrcXVldWUgZXhhbXBsZS4gQW0gSSBtaXNzaW5nIHNvbWV0 aGluZz8NCg0KPiBBZGRpdGlvbmFsbHksIHdlJ3JlIG5vdCBhYmxlIHRvICJmaW5kIHdvcmsiIGlu IHBhcmFsbGVsIHdpdGggdGhlIGNvbnN1bWVyIHRocmVhZHMuDQoNCldoeSBkb24ndCB5b3UgdXNl IHJhY3RvciB0byBydW4gImZpbmQgd29yayIgaWYgeW91IHdhbnQgdG8gcnVuIGluIHBhcmFsbGVs IHdpdGggdGhlIG1haW4gUmFjdG9yPw0KDQpNYXliZSBpdCBpcyBlYXN5IHRvIGRpc2N1c3Mgd2l0 aCBnb29kIGV4YW1wbGVzLg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tDQpGZWF0dXJlICMyMTI2MjogUHJvcG9zYWw6IGBSYWN0b3I6OlBvcnRgDQpodHRwczovL2J1 Z3MucnVieS1sYW5nLm9yZy9pc3N1ZXMvMjEyNjIjY2hhbmdlLTExMjY4OQ0KDQoqIEF1dGhvcjog a28xIChLb2ljaGkgU2FzYWRhKQ0KKiBTdGF0dXM6IEFzc2lnbmVkDQoqIEFzc2lnbmVlOiBrbzEg KEtvaWNoaSBTYXNhZGEpDQoqIFRhcmdldCB2ZXJzaW9uOiAzLjUNCi0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgUHJvcG9zYWw6IGBSYWN0b3I6OlBvcnRgDQoNCklu IGNvbmN1cnJlbnQgUnVieSBhcHBsaWNhdGlvbnMgdXNpbmcgUmFjdG9ycywgc2FmZWx5IGFuZCBl ZmZpY2llbnRseSBjb21tdW5pY2F0aW5nIHJlc3VsdHMgYmV0d2VlbiBSYWN0b3JzIGlzIGEgY29t bW9uIGNoYWxsZW5nZS4gV2UgcHJvcG9zZSBgUmFjdG9yOjpQb3J0YCBhcyBhIGxpZ2h0d2VpZ2h0 LCBzYWZlLCBhbmQgZXJnb25vbWljIGFic3RyYWN0aW9uIHRvIHNpbXBsaWZ5IGNvbW11bmljYXRp b24gcGF0dGVybnMsIGVzcGVjaWFsbHkgaW4gcmVxdWVzdC1yZXNwb25zZSBtb2RlbHMuDQoNCmBg YHJ1YnkNCiMgdXNhZ2UgZXhhbXBsZQ0KDQpwb3J0ID0gUmFjdG9yOjpQb3J0Lm5ldw0KDQpSYWN0 b3IubmV3IHBvcnQgZG8gfHBvcnR8DQogIHBvcnQgPDwgNDINCiAgcG9ydCA8PCA0Mw0KZW5kDQoN CiMgU3VjY2Vzczogd2FpdCBmb3Igc2VuZGluZw0KcG9ydC5yZWNlaXZlICM9PiA0Mg0KDQpSYWN0 b3IubmV3IHBvcnQgZG8gfHBvcnR8DQogIHBvcnQucmVjZWl2ZSAjIEVycm9yOiBvbmx5IHRoZSBj cmVhdG9yIFJhY3RvciBjYW4gcmVjZWl2ZSBmcm9tIHRoaXMgcG9ydC4NCmVuZA0KDQpwb3J0LnJl Y2VpdmUgIz0+IDQzDQpgYGANCg0KVGhpcyBpcyBhIHNpbWlsYXIgY29uY2VwdCB0byBbIkNoYW5u ZWwiXShodHRwczovL2J1Z3MucnVieS1sYW5nLm9yZy9pc3N1ZXMvMjExMjEpLCBidXQgaXQgaXMg dGlnaHRseSBjb3VwbGVkIHdpdGggdGhlIGNyZWF0b3IgUmFjdG9yIGFuZCBubyBvdGhlciBSYWN0 b3JzIGNhbiByZWNlaXZlIGFueXRoaW5nIGZyb20gdGhhdCBwb3J0Lg0KDQpJbiB0aGF0IHNlbnNl LCBpdCBpcyBjb25jZXB0dWFsbHkgY2xvc2VyIHRvIGEgc29ja2V0IGZpbGUgZGVzY3JpcHRvciAo ZS5nLiwgYSBkZXN0aW5hdGlvbiBhbmQgcG9ydCBudW1iZXIgcGFpciBpbiBUQ1AvSVApLg0KDQpX ZSBjYW4gaW1wbGVtZW50IGBQb3J0YCB3aXRoIGBSYWN0b3IucmVjZWl2ZV9pZmAgbGlrZSB0aGlz Og0KDQpgYGBydWJ5DQpjbGFzcyBSYWN0b3I6OlBvcnQNCiAgZGVmIGluaXRpYWxpemUNCiAgICBA ciA9IFJhY3Rvci5jdXJyZW50DQogICAgQHRhZyA9IGdlbmlkKCkNCiAgZW5kDQoNCiAgZGVmIHNl bmQgb2JqDQogICAgQHIgPDwgW0B0YWcsIG9ial0NCiAgZW5kDQoNCiAgZGVmIHJlY2VpdmUNCiAg ICByYWlzZSB1bmxlc3MgQHIgPT0gUmFjdG9yLmN1cnJlbnQNCg0KICAgIFJhY3Rvci5yZWNlaXZl X2lmIGRvIHwodGFnLCByZXN1bHQpDQogICAgICBpZiB0YWcgPT0gQHRhZw0KICAgICAgICByZXR1 cm4gcmVzdWx0DQogICAgICBlbmQNCiAgICBlbmQNCiAgZW5kDQplbmQNCmBgYA0KDQpXaXRoIGBS YWN0b3I6OlBvcnRgLCB3ZSBjYW4gZGVwcmVjYXRlIGBSYWN0b3IucmVjZWl2ZV9pZmAsIGBSYWN0 b3IueWllbGRgLCBhbmQgYFJhY3RvciN0YWtlYC4gUG9ydHMgYWN0IGFzIGNsZWFyLCBzZWxmLWNv bnRhaW5lZCBlbmRwb2ludHMgZm9yIG1lc3NhZ2UgcGFzc2luZywgd2hpY2ggbWFrZXMgdGhlc2Ug b2xkZXIgcHJpbWl0aXZlcyByZWR1bmRhbnQuIEZ1cnRoZXJtb3JlLCBQb3J0LWJhc2VkIGNvbW11 bmljYXRpb24gaXMgc2lnbmlmaWNhbnRseSBlYXNpZXIgdG8gaW1wbGVtZW50IGFuZCByZWFzb24g YWJvdXTigJRlc3BlY2lhbGx5IHdoZW4gY29uc2lkZXJpbmcgc3luY2hyb25pemF0aW9uIGNoYWxs ZW5nZXMgYXJvdW5kIGBSYWN0b3Iuc2VsZWN0YCBhbmQgcmVuZGV6dm91cyBzZW1hbnRpY3MuDQoN CiMjIEJhY2tncm91bmQ6IExpbWl0YXRpb25zIG9mIGN1cnJlbnQgY29tbXVuaWNhdGlvbiBwYXR0 ZXJucw0KDQpMZXQncyBkaXNjdXNzIGhvdyB0byBtYWtlIHNlcnZlci1saWtlIHNlcnZpY2UgcmFj dG9ycy4NCg0KIyMjIE5vIHJlc3BvbnNlIHNlcnZlcg0KDQpXZSBjYW4gbWFrZSBzZXJ2ZXItbGlr ZSBSYWN0b3JzIGxpa2UgdGhpczoNCg0KYGBgcnVieQ0KIyBFWDENCg0KZGVmIGZpYihuKSA9IG4g PiAxIDogZmliKG4tMikgKyBmaWIobi0xKSA6IDENCg0KIyBBIHJhY3RvciBjYWxjdWxhdGUgZmli KG4pDQpmaWJfc3J2ID0gUmFjdG9yLm5ldyBkbw0KICB3aGlsZSB0cnVlDQogICAgcGFyYW0gPSBS YWN0b3IucmVjZWl2ZQ0KICAgIHJlc3VsdCA9IGZpYihwYXJhbSkNCiAgZW5kDQplbmQNCg0KZmli X3NydiA8PCAxMA0KYGBgDQoNCkluIHRoaXMgY2FzZSwgdGhlIG1haW4gUmFjdG9yIHJlcXVlc3Rz IGBmaWJfc3J2YCB0byBjYWxjdWxhdGUgYGZpYigxMClgLg0KSG93ZXZlciwgY3VycmVudGx5LCB0 aGVyZSBpcyBubyB3YXkgdG8gcmV0cmlldmUgdGhlIHJlc3VsdC4NCg0KIyMjIFJldHVybiB2YWx1 ZSB0byB0aGUgc2VuZGVyIHJhY3Rvcg0KDQpUaGVyZSBhcmUgc2V2ZXJhbCBwb3NzaWJsZSBhcHBy b2FjaGVzLg0KDQpGaXJzdCwgd2UgY2FuIHNlbmQgdGhlIHNlbmRlciBSYWN0b3IgYWxvbmcgd2l0 aCB0aGUgcGFyYW1ldGVyLCBhbmQgYXNrIHRoZSBzZXJ2ZXIgdG8gc2VuZCB0aGUgcmVzdWx0IGJh Y2sgdG8gdGhlIHNlbmRlci4NCg0KYGBgcnVieQ0KIyBFWDINCg0KZmliX3NydiA9IFJhY3Rvci5u ZXcgZG8NCiAgd2hpbGUgdHJ1ZQ0KICAgIHBhcmFtLCBzZW5kZXIgPSBSYWN0b3IucmVjZWl2ZQ0K ICAgIHJlc3VsdCA9IGZpYihwYXJhbSkNCiAgICBzZW5kZXIgPDwgcmVzdWx0DQogIGVuZA0KZW5k DQoNCmZpYl9zcnYgPDwgWzEwLCBSYWN0b3IuY3VycmVudF0NCg0KZG9fc29tZV93b3JrKCkNCg0K UmFjdG9yLnJlY2VpdmUgIz0+IGZpYigxMCkNCmBgYA0KDQpUaGlzIGFwcHJvYWNoIHdvcmtzIHdl bGwgaW4gc2ltcGxlIGNhc2VzLg0KDQpIb3dldmVyLCB3aXRoIEVYMiwgaGFuZGxpbmcgbXVsdGlw bGUgY29uY3VycmVudCByZXNwb25zZXMgYmVjb21lcyBkaWZmaWN1bHQuIFRoZSByZXN1bHRzIGFy ZSBwdXNoZWQgaW50byB0aGUgc2FtZSBtYWlsYm94LCBhbmQgc2luY2UgYFJhY3Rvci5yZWNlaXZl YCByZXRyaWV2ZXMgbWVzc2FnZXMgd2l0aG91dCBkaXNjcmltaW5hdGluZyB0aGUgc291cmNlLCBp dCdzIHVuY2xlYXIgd2hpY2ggc2VydmVyIHJldHVybmVkIHdoaWNoIHJlc3VsdC4NCg0KYGBgcnVi eQ0KIyBFWDMNCg0KZGVmIGZhY3QobikgPSBuID4gMSA6IGZhY3Qobi0xKSAqIG4NCg0KZmliX3Ny diA9IFJhY3Rvci5uZXcgZG8NCiAgd2hpbGUgdHJ1ZQ0KICAgIHBhcmFtLCBzZW5kZXIgPSBSYWN0 b3IucmVjZWl2ZQ0KICAgIHJlc3VsdCA9IGZpYihwYXJhbSkNCiAgICBzZW5kZXIgPDwgcmVzdWx0 DQogIGVuZA0KZW5kDQoNCmZhY3Rfc3J2ID0gUmFjdG9yLm5ldyBkbw0KICB3aGlsZSB0cnVlDQog ICAgcGFyYW0sIHNlbmRlciA9IFJhY3Rvci5yZWNlaXZlDQogICAgcmVzdWx0ID0gZmFjdChwYXJh bSkNCiAgICBzZW5kZXIgPDwgcmVzdWx0DQogIGVuZA0KZW5kDQoNCg0KZmliX3NydiA8PCBbMTAs IFJhY3Rvci5jdXJyZW50XQ0KZmliX3NydiA8PCBbMjAsIFJhY3Rvci5jdXJyZW50XQ0KZmFjdF9z cnYgPDwgWzEwLCBSYWN0b3IuY3VycmVudF0NCmZhY3Rfc3J2IDw8IFsyMCwgUmFjdG9yLmN1cnJl bnRdDQoNCmRvX3NvbWVfd29yaygpDQoNClJhY3Rvci5yZWNlaXZlDQojPT4gZmliKDEwKSBvciBm YWN0KDEwKSwgd2hpY2g/DQojICAgSWYgdGhlIHNlcnZlcnMgdXNlcyBSYWN0b3JzIG1vcmUgKGNh bGN1bGF0ZSB0aGVtIGluIHBhcmFsbGVsKSwNCiMgICBmaWIoMjApIGFuZCBmYWN0KDIwKSBjYW4g YmUgcmV0dXJuZWQuDQpgYGANCg0KQmVjYXVzZSBgUmFjdG9yLnJlY2VpdmVgIHJldHJpZXZlcyBh bGwgbWVzc2FnZXMgaW5kaXNjcmltaW5hdGVseSwgZGV2ZWxvcGVycyBtdXN0IGFkZCB0aGVpciBv d24gdGFnZ2luZyBsb2dpYyB0byBkaXN0aW5ndWlzaCByZXN1bHRzLiBXaGlsZSB0YWdnaW5nIChh cyBzaG93biBpbiBFWDQpIGhlbHBzLCBpdCBpbnRyb2R1Y2VzIGFkZGl0aW9uYWwgY29tcGxleGl0 eSBhbmQgYnJpdHRsZW5lc3MuDQoNCiMjIyBSZXNwb25zZXMgd2l0aCByZXF1ZXN0IElEDQoNClRo ZSBmb2xsb3dpbmcgY29kZSByZXR1cm5zIGEgcmVzdWx0IHdpdGggcmVxdWVzdCBpZCAoYSBwYWly IG9mIHRoZSBuYW1lIG9mIHNlcnZlciBhbmQgYSBwYXJhbWV0ZXIpLg0KDQpgYGBydWJ5DQojIEVY NA0KDQpmaWJfc3J2ID0gUmFjdG9yLm5ldyBkbw0KICB3aGlsZSB0cnVlDQogICAgcGFyYW0sIHNl bmRlciA9IFJhY3Rvci5yZWNlaXZlDQogICAgcmVzdWx0ID0gZmliKHBhcmFtKQ0KICAgIHNlbmRl ciA8PCBbWzpmaWIsIHBhcmFtXSwgcmVzdWx0XQ0KICBlbmQNCmVuZA0KDQpmYWN0X3NydiA9IFJh Y3Rvci5uZXcgZG8NCiAgd2hpbGUgdHJ1ZQ0KICAgIHBhcmFtLCBzZW5kZXIgPSBSYWN0b3IucmVj ZWl2ZQ0KICAgIHJlc3VsdCA9IGZhY3QocGFyYW0pDQogICAgc2VuZGVyIDw8IFtbOmZhY3QsIHBh cmFtXSwgcmVzdWx0XQ0KICBlbmQNCmVuZA0KDQpmaWJfc3J2IDw8IFsxMCwgUmFjdG9yLmN1cnJl bnRdDQpmaWJfc3J2IDw8IFsyMCwgUmFjdG9yLmN1cnJlbnRdDQpmYWN0X3NydiA8PCBbMTAsIFJh Y3Rvci5jdXJyZW50XQ0KZmFjdF9zcnYgPDwgWzIwLCBSYWN0b3IuY3VycmVudF0NCg0KZG9fc29t ZV93b3JrKCkNCg0KUmFjdG9yLnJlY2VpdmVfaWYgZG8gfGlkLCByZXN1bHR8DQogIGNhc2UgaWQN CiAgaW4gWzpmaWIsIG5dDQogICAgcCAiZmliKCN7bn0pID0gI3tyZXN1bHR9Ig0KICBpbiBbOmZh Y3QsIG5dDQogICAgcCAiZmFjdCgje259KSA9ICN7cmVzdWx0fSINCiAgZW5kDQplbmQNCg0KIyBv ciBpZiB5b3Ugd2FudCB0byB1c2Ugc3BlY2lmaWMgcmVzdWx0cywgbGlrZToNCg0KcCBmaWIyMDog IFJhY3Rvci5yZWNlaXZlX2lme3xpZCwgcmVzdWx0fCBpZCA9PiBbOmZpYiwgMjBdOyAgcmVzdWx0 fQ0KcCBmYWN0MTA6IFJhY3Rvci5yZWNlaXZlX2lme3xpZCwgcmVzdWx0fCBpZCA9PiBbOmZhY3Qs IDEwXTsgcmVzdWx0fQ0KcCBmYWN0MjA6IFJhY3Rvci5yZWNlaXZlX2lme3xpZCwgcmVzdWx0fCBp ZCA9PiBbOmZhY3QsIDIwXTsgcmVzdWx0fQ0KcCBmaWIxMDogIFJhY3Rvci5yZWNlaXZlX2lme3xp ZCwgcmVzdWx0fCBpZCA9PiBbOmZpYiwgMTBdOyAgcmVzdWx0fQ0KYGBgDQoNClRoaXMgYXBwcm9h Y2ggY2xvc2VseSByZXNlbWJsZXMgcGF0dGVybiBtYXRjaGluZyBpbiBFcmxhbmcgb3IgRWxpeGly LCB3aGVyZSByZXNwb25zZXMgYXJlIHRhZ2dlZCBhbmQgbWF0Y2hlZCBzdHJ1Y3R1cmFsbHkuDQoN Ckhvd2V2ZXIsIHRoaXMgc29sdXRpb24gc3RpbGwgaGFzIGFuIGlzc3VlOiBpZiBgZG9fc29tZV93 b3JrKClgIHVzZXMgYFJhY3Rvci5yZWNlaXZlYCwgaXQgbWF5IGFjY2lkZW50YWxseSBjb25zdW1l IGFueSBtZXNzYWdlLiBJbiBvdGhlciB3b3JkcywgYFJhY3Rvci5yZWNlaXZlYCBjYW4gb25seSBi ZSBzYWZlbHkgdXNlZCB3aGVuIHlvdSdyZSBjZXJ0YWluIHRoYXQgbm8gb3RoZXIgY29kZSBpcyB1 c2luZyBpdC4NCg0KKEFub3RoZXIgdHJpdmlhbCBpc3N1ZSBpcywgZGlmZmVyZW50IHNlcnZlcnMg Y2FuIHJldHVybiBzYW1lIGlkZW50aXR5LCBsaWtlIGBbOmZhY3QsIG51bV1gIHJldHVybmVkIGJ5 IE5ld3NQYXBlciBzZXJ2ZXIuIEl0IGlzIGNvbmZ1c2luZykuDQoNCg0KIyMjIFVzaW5nIGNoYW5u ZWxzDQoNClRvIHNvbHZlIHRoaXMgaXNzdWUsIHdlIGNhbiBtYWtlIGEgY2hhbm5lbCB3aXRoIGRp ZmZlcmVudCBSYWN0b3JzLg0KDQpDaGFubmVscyBjYW4gYmUgaW1wbGVtZW50ZWQgdXNpbmcgUmFj dG9ycywgYXMgaWxsdXN0cmF0ZWQgYmVsb3cuDQoNCmBgYHJ1YnkNCiMgRVg1DQoNCiMgU2VydmVy cyBhcmUgY29tcGxldGVseSBzYW1lIHRvIEVYMw0KDQpmaWJfc3J2ID0gUmFjdG9yLm5ldyBkbw0K ICB3aGlsZSB0cnVlDQogICAgcGFyYW0sIHNlbmRlciA9IFJhY3Rvci5yZWNlaXZlDQogICAgcmVz dWx0ID0gZmliKHBhcmFtKQ0KICAgIHNlbmRlciA8PCByZXN1bHQNCiAgZW5kDQplbmQNCg0KZmFj dF9zcnYgPSBSYWN0b3IubmV3IGRvDQogIHdoaWxlIHRydWUNCiAgICBwYXJhbSwgc2VuZGVyID0g UmFjdG9yLnJlY2VpdmUNCiAgICByZXN1bHQgPSBmYWN0KHBhcmFtKQ0KICAgIHNlbmRlciA8PCBy ZXN1bHQNCiAgZW5kDQplbmQNCg0KIyBDcmVhdGUgYSBuZXcgY2hhbm5lbCB1c2luZyBhIFJhY3Rv cg0KZGVmIG5ld19jaGFubmVsDQogIFJhY3Rvci5uZXcgZG8NCiAgICB3aGlsZSB0cnVlDQogICAg ICBSYWN0b3IueWllbGQgUmFjdG9yLnJlY2VpdmUNCiAgICBlbmQNCiAgZW5kDQplbmQNCg0KDQpm aWJfc3J2IDw8IFsxMCwgZmliMTBfY2ggPSBuZXdfY2hhbm5lbF0NCmZpYl9zcnYgPDwgWzIwLCBm aWIyMF9jaCA9IG5ld19jaGFubmVsXQ0KZmFjdF9zcnYgPDwgWzEwLCBmYWN0MTBfY2ggPSBuZXdf Y2hhbm5lbF0NCmZhY3Rfc3J2IDw8IFsyMCwgZmFjdDIwX2NoID0gbmV3X2NoYW5uZWxdDQoNCmRv X3NvbWVfd29yaygpDQoNCnAgZmliMjA6IGZpYjIwX2NoLnRha2UgICAjIHdhaXQgZm9yIGZpYigy MCkNCnAgZmFjdDEwOiBmYWN0MTBfY2gudGFrZSAjIHdhaXQgZm9yIGZhY3QoMTApDQpwIGZpYjEw OiBmaWIxMF9jaC50YWtlICAgIyB3YWl0IGZvciBmaWIoMTApDQpwIGZhY3QyMDogZmFjdDEwX2No LnRha2UgIyB3YWl0IGZvciBmYWN0KDIwKQ0KDQojIG9yIA0KY2hzID0gW2ZpYjEwX2NoLCBmaWIy MF9jaCwgZmFjdDEwX2NoLCBmYWN0MjBfY2hdDQoNCndoaWxlICFjaHMuZW1wdHk/DQogIGNoLCBy ZXN1bHQgPSBSYWN0b3Iuc2VsZWN0KCpjaHMpICMgd2FpdCBmb3IgbXVsdGlwbGUgY2hhbm5lbHMN CiAgcCBjaCwgcmVzdWx0DQogIGNocy5kZWxldGUgY2gNCmVuZA0KYGBgDQoNCkNoYW5uZWwgYXBw cm9hY2ggc29sdmVzIHRoZSBpc3N1ZSBvZiBFWDQuIFRoZSBhYm92ZSBpbXBsZW1lbnRhdGlvbiBp bnRyb2R1Y2Ugc29tZSBvdmVyaGVhZCB0byBjcmVhdGUgY2hhbm5lbCByYWN0b3JzLCBidXQgd2Ug Y2FuIGludHJvZHVjZSBzcGVjaWFsIGltcGxlbWVudGF0aW9uIHRvIHJlZHVjZSB0aGlzIFJhY3Rv ciBjcmVhdGlvbiBvdmVyaGVhZC4NCg0KSG93ZXZlciwgaW4gdGhlIEFjdG9yIG1vZGVsLCB0aGUg Y29tbXVuaWNhdGlvbiBwYXR0ZXJuIGlzIHRvIHNlbmQgYSBtZXNzYWdlIHRvIGEgc3BlY2lmaWMg YWN0b3IuIEluIGNvbnRyYXN0LCBjaGFubmVscyBhcmUgdXNlZCB0byBzZW5kIG1lc3NhZ2VzIHRo cm91Z2ggYSBzaGFyZWQgY29uZHVpdCwgd2l0aG91dCBjYXJpbmcgd2hpY2ggcmVjZWl2ZXIgKGlm IGFueSkgaGFuZGxlcyB0aGUgbWVzc2FnZS4gQWxzbywgY2hhbm5lbHMgY2FuIGhhdmUgc29tZSBv dmVyaGVhZCwgYXMgZGlzY3Vzc2VkIGJlbG93Lg0KDQojIyMgU3VtbWFyeSBvZiBiYWNrZ3JvdW5k DQoNCkN1cnJlbnRseSwgd2hlbiBpbXBsZW1lbnRpbmcgcmVxdWVzdC1yZXNwb25zZSBwYXR0ZXJu cyB3aXRoIFJhY3RvcnMsIGRldmVsb3BlcnMgZmFjZSBjaGFsbGVuZ2VzIGluIHRyYWNraW5nIHJl c3VsdHMsIG1hbmFnaW5nIGlkZW50aWZpZXJzLCBhbmQgYXZvaWRpbmcgbWVzc2FnZSBjb25mbGlj dHMuIEV4aXN0aW5nIHByaW1pdGl2ZXMgbGlrZSBgcmVjZWl2ZV9pZmAsIGB0YWtlYCwgb3IgY2hh bm5lbHMgaW1wbGVtZW50ZWQgd2l0aCBSYWN0b3JzIGFyZSBlaXRoZXIgZXJyb3ItcHJvbmUgb3Ig aW5lZmZpY2llbnQuDQoNCiMjIFByb3Bvc2FsDQoNCkludHJvZHVjZSBgUmFjdG9yOjpQb3J0YCBh cyBhbiBhbHRlcm5hdGl2ZSB0byBjaGFubmVscy4gSXQgaXMgYSBuYXR1cmFsIGV4dGVuc2lvbiBv ZiB0aGUgQWN0b3IgbW9kZWwuIEluIGZhY3QsIGl0IGlzIHRoaW4gd3JhcHBlciBvZiBjdXJyZW50 IHNlbmQvcmVjZWl2ZSBtb2RlbCBhcyBpbGx1c3RyYXRlZCBhdCB0aGUgdG9wIG9mIHRoaXMgcHJv cG9zYWwuDQoNCldpdGggdGhlIGBSYWN0b3I6OlBvcnRgLCB3ZSBjYW4gcmV3cml0ZSBhYm92ZSBl eGFtcGxlcyB3aXRoIGl0Lg0KDQpgYGBydWJ5DQojIEVYNg0KDQojIENvbXBsZXRlbHkgc2FtZSBh cyBFWDMncyBzZXJ2ZXJzDQoNCmZpYl9zcnYgPSBSYWN0b3IubmV3IGRvDQogIHdoaWxlIHRydWUN CiAgICBwYXJhbSwgc2VuZGVyID0gUmFjdG9yLnJlY2VpdmUNCiAgICByZXN1bHQgPSBmaWIocGFy YW0pDQogICAgc2VuZGVyIDw8IHJlc3VsdA0KICBlbmQNCmVuZA0KDQpmYWN0X3NydiA9IFJhY3Rv ci5uZXcgZG8NCiAgd2hpbGUgdHJ1ZQ0KICAgIHBhcmFtLCBzZW5kZXIgPSBSYWN0b3IucmVjZWl2 ZQ0KICAgIHJlc3VsdCA9IGZhY3QocGFyYW0pDQogICAgc2VuZGVyIDw8IHJlc3VsdA0KICBlbmQN CmVuZA0KDQpmaWJfc3J2IDw8IFsxMCwgZmliMTBfcG9ydCA9IFJhY3Rvcjo6UG9ydC5uZXddDQpm aWJfc3J2IDw8IFsyMCwgZmliMjBfcG9ydCA9IFJhY3Rvcjo6UG9ydC5uZXddDQpmYWN0X3NydiA8 PCBbMTAsIGZhY3QxMF9wb3J0ID0gUmFjdG9yOjpQb3J0Lm5ld10NCmZhY3Rfc3J2IDw8IFsyMCwg ZmFjdDIwX3BvcnQgPSBSYWN0b3I6OlBvcnQubmV3XQ0KDQpkb19zb21lX3dvcmsoKQ0KDQpwIGZp YjEwX3BvcnQucmVjZWl2ZSAjPT4gZmliKDEwKQ0KcCBmaWIyMF9wb3J0LnJlY2VpdmUgIz0+IGZp YigyMCkNCnAgZmFjdDEwX3BvcnQucmVjZWl2ZSAjPT4gZmFjdCgxMCkNCnAgZmFjdDIwX3BvcnQu cmVjZWl2ZSAjPT4gZmFjdCgyMCkNCg0KIyBvcg0KDQpwb3J0cyA9IFtmaWIxMF9wb3J0LCBmaWIy MF9wb3J0LCBmYWN0MTBfcG9ydCwgZmFjdDIwX3BvcnRdDQoNCndoaWxlICFwb3J0cy5lbXB0eT8N CiAgcG9ydCwgcmVzdWx0ID0gUmFjdG9yLnNlbGVjdCgqcG9ydHMpDQogIGNhc2UgcG9ydA0KICB3 aGVuIGZpYjEwX3BvcnQNCiAgICBwIGZpYjEwOiByZXN1bHQNCiAgLi4uDQogIGVsc2UNCiAgICBy YWlzZSAiVGhpcyBzaG91bGQgbm90IGhhcHBlbiAoQlVHKS4iDQogIGVuZA0KDQogIHBvcnRzLmRl bGV0ZShwb3J0KQ0KZW5kDQpgYGANCg0KYFJhY3Rvcjo6UG9ydGAgcmVzb2x2ZXMga2V5IHBhaW4g cG9pbnRzIGluIG1lc3NhZ2UgcGFzc2luZyBiZXR3ZWVuIFJhY3RvcnM6DQoNCiogSXQgZ3VhcmFu dGVlcyB0aGF0IGluY29taW5nIG1lc3NhZ2VzIGFyZSBvbmx5IGRlbGl2ZXJlZCB0byB0aGUgaW50 ZW5kZWQgUmFjdG9yLCBwcmV2ZW50aW5nIHRhZyBjb2xsaXNpb25zLg0KKiBJdCBlbmFibGVzIG1l c3NhZ2Ugcm91dGluZyB3aXRob3V0IHJlbHlpbmcgb24gZ2xvYmFsIHJlY2VpdmUgYmxvY2tzIChg UmFjdG9yLnJlY2VpdmVgKSwgd2hpY2ggYXJlIHByb25lIHRvIHVuaW50ZW5kZWQgY29uc3VtcHRp b24uDQoqIEl0IHJlcGxhY2VzIG1vcmUgY29tcGxleCBwcmltaXRpdmVzIGxpa2UgYC5yZWNlaXZl X2lmYCwgYC55aWVsZGAsIGFuZCBgI3Rha2VgIHdpdGggYSBzaW1wbGVyLCBjb21wb3NhYmxlIGFi c3RyYWN0aW9uLg0KKiBJdCBtYXBzIGNsZWFubHkgdG8gdGhlIEFjdG9yIG1vZGVsIHNlbWFudGlj cyBSdWJ5IGludGVuZHMgdG8gc3VwcG9ydCB3aXRoIFJhY3RvcnMuDQoNCldoaWxlIHRoZSBwYXR0 ZXJuIGxvb2tzIHNpbWlsYXIgdG8gdXNpbmcgY2hhbm5lbHMsIHRoZSBzZW1hbnRpY3MgYW5kIGd1 YXJhbnRlZXMgYXJlIGRpZmZlcmVudCBpbiBtZWFuaW5nZnVsIHdheXMuDQoNClRoZSBhZHZhbnRh Z2VzIG9mIHVzaW5nIFBvcnRzIGluY2x1ZGU6DQoNCiogU2FmZXIgdGhhbiBjaGFubmVscyBpbiBw cmFjdGljZQ0KICAqIFdoZW4gdXNpbmcgYSBQb3J0LCBpZiBgI3NlbmRgIHN1Y2NlZWRzLCBpdCBt ZWFucyB0aGUgZGVzdGluYXRpb24gUmFjdG9yIGlzIHN0aWxsIGFsaXZlIChpLmUuLCBpdCdzIHJ1 bm5pbmcpLg0KICAqIEluIGNvbnRyYXN0LCB3aXRoIGEgY2hhbm5lbCwgdGhlcmUncyBubyBndWFy YW50ZWUgdGhhdCBhbnkgUmFjdG9yIGlzIHN0aWxsIGF2YWlsYWJsZSB0byByZWNlaXZlIGZyb20g aXQuDQogICogT2YgY291cnNlLCBldmVuIHdpdGggYSBwb3J0LCB0aGVyZSdzIG5vIGd1YXJhbnRl ZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBSYWN0b3Igd2lsbCBhY3R1YWxseSBwcm9jZXNzIHRoZSBt ZXNzYWdlIOKAlCBpdCBtaWdodCBpZ25vcmUgaXQuDQogICogQnV0IGF0IGxlYXN0IHlvdSBkb24n dCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZSBSYWN0b3IgaGF2aW5nIGFscmVhZHkgdGVybWluYXRl ZCB1bmV4cGVjdGVkbHkuDQogICogSW4gb3RoZXIgd29yZHMsIHVzaW5nIGEgcG9ydCBlbGltaW5h dGVzIG9uZSBtYWpvciBmYWlsdXJlIGNhc2UsIG1ha2luZyB0aGUgY29tbXVuaWNhdGlvbiBtb2Rl bCBtb3JlIHByZWRpY3RhYmxlLg0KICAqIFRoaXMgaXMgb25lIG9mIHRoZSByZWFzb25zIHdoeSBS dWJ5IHdlbnQgd2l0aCB0aGUgIkFjdG9yIiBtb2RlbCAoaGVuY2UgdGhlIG5hbWUgUmFjdG9yKSwg aW5zdGVhZCBvZiB0aGUgIkNTUCIgbW9kZWwuDQoqIEZhc3RlciB0aGFuIGNoYW5uZWxzIGluIGJv dGggY3JlYXRpb24gYW5kIG1lc3NhZ2UgdHJhbnNtaXNzaW9uDQogICogV2hlbiBjcmVhdGluZyBh IGNoYW5uZWwsIHdlIG5lZWQgdG8gcHJlcGFyZSBhIGNvbnRhaW5lciBkYXRhIHN0cnVjdHVyZS4g V2hlbiBjcmVhdGluZyBhIHBvcnQsIGl0IGlzIGxpZ2h0d2VpZ2h0IGRhdGEgKGEgcGFpciBvZiBS YWN0b3IgYW5kIG5ld2x5IGNyZWF0ZWQgSUQpLg0KICAqIE9uIHRoZSBjaGFubmVsIHRyYW5zbWlz c2lvbiwgd2UgbmVlZCBjb3B5aW5nIGEgZGF0YSB0byBjaGFubmVsIGFuZCBhIGNvcHlpbmcgdG8g dGhlIHJlY2VpdmluZyByYWN0b3IuIE9uIHRoZSBwb3J0LCBpdCBvbmx5IG5lZWRzIHRvIGNvcHkg ZnJvbSB0aGUgc3JjIHJhY3RvciB0byB0aGUgZHN0IHJhY3Rvci4gVGhpcyBpc3N1ZSBiZWNvbWVz IG1vcmUgc2lnbmlmaWNhbnQgZHVlIHRvIFJhY3Rvci1sb2NhbCBnYXJiYWdlIGNvbGxlY3Rpb24g YW5kIGlzb2xhdGlvbiBvZiBvYmplY3Qgc3BhY2VzLg0KKiBFYXN5IHRvIGltcGxlbWVudC4gV2Ug b25seSBuZWVkIHRvIGltcGxlbWVudCBgUG9ydCNyZWNlaXZlYCB0byBzeW5jaHJvbml6ZSB3aXRo IG90aGVyIHJhY3RvcnMuDQogICogYCNzZW5kLy5yZWNlaXZlYCBpcyBlYXN5IHRvIGltcGxlbWVu dCBiZWNhdXNlIHdlIG9ubHkgbmVlZCB0byBsb2NrIHRoZSByZWNlaXZpbmcgcmFjdG9yLg0KICAq IGAueWllbGQvI3Rha2VgIGlzIG5vdCBlYXN5IHRvIGltcGxlbWVudCBiZWNhdXNlIHdlIG5lZWQg dG8gbG9jayB0YWtpbmcgYW5kIHJlY2VpdmluZyByYWN0b3JzIGJlY2F1c2UgaXQgaXMgcmVuZGV6 dm91cyBzdHlsZSBzeW5jaHJvbml6YXRpb24uDQogICogYC5zZWxlY3RgIGlzIERJRkZJQ1VMVCB0 byBzdXBwb3J0IGN1cnJlbnQgc3BlYy4gTm93IENJIGlzbid0IHN0YWJsZSB5ZXQuDQogICogQSBz aW1wbGVyIHNwZWMgcmVkdWNlcyBidWdzLCBhbmQgbWF5YmUgbGVhZHMgdG8gZmFzdGVyIGltcGxl bWVudGF0aW9uLg0KDQpEaXNhZHZhbnRhZ2VzOg0KDQoxLiBJdCBpcyBub3QgYSB3ZWxsLWtub3du IGNvbmNlcHQsIGVzcGVjaWFsbHkgZm9yIEdvIGxhbmd1YWdlIHVzZXJzLg0KMi4gV2UgbmVlZCBh ZGRpdGlvbmFsIGFic3RyYWN0aW9uIGxpa2UgcHJvZHVjZXIocyktY29uc3VtZXIocykgY29uY3Vy cmVudCBhcHBsaWNhdGlvbnMuDQoNCkZvciAoMiksIEkgd2FudCB0byBpbnRyb2R1Y2UgYW4gZXhh bXBsZSBjb2RlLiBXZSBjYW4gd3JpdGUgYSAxLXByb2R1Y2VyLCBtdWx0aXBsZS1jb25zdW1lciBw YXR0ZXJuIHdpdGggYSBjaGFubmVsLg0KDQpgYGBydWJ5DQojIGNoYW5uZWwgdmVyc2lvbiBvZiAx IHByb2R1Y2VyICYgY29uc3VtZXJzDQoNCmNoID0gbmV3X2NoYW5uZWwNCg0KUk4gPSAxMCAjIG1h a2UgMTAgY29uc3VtZXJzDQoNCmNvbnN1bWVycyA9IFJOLnRpbWVzLm1hcCBkbw0KICBSYWN0b3Iu bmV3IGNoIGRvDQogICAgd2hpbGUgcGFyYW0gPSBjaC5yZWNlaXZlDQogICAgICB0YXNrKHBhcmFt KQ0KICAgIGVuZA0KICBlbmQNCmVuZA0KDQp0YXNrcy5lYWNoIGRvIHx0YXNrfA0KICBjaCA8PCB0 YXNrDQplbmQNCmBgYA0KDQpXaXRoIFBvcnQsIHdlIG5lZWQgdG8gaW50cm9kdWNlIGEgbG9hZCBi YWxhbmNpbmcgbWVjaGFuaXNtOg0KDQpgYGBydWJ5DQojIFBvcnQgdmVyc2lvbiBvZiAxIHByb2R1 Y2VyICYgY29uc3VtZXJzDQoNCmNvbnRyb2xfcG9ydCA9IFJhY3Rvcjo6UG9ydC5uZXcNCmNvbnN1 bWVycyA9IFJOLnRpbWVzLm1hcCBkbw0KICBSYWN0b3IubmV3IGNvbnRyb2xfcG9ydCBjb250cm9s X3BvcnQgZG8gfGNvbnRyb2xfcG9ydHwNCiAgICB3aGlsZSB0cnVlDQogICAgICBjb250cm9sX3Bv cnQgPDwgWzpyZWFkeSwgUmFjdG9yLmN1cnJlbnRdICMgcmVnaXN0ZXIgLSByZWFkeQ0KICAgICAg cGFyYW0gPSBSYWN0b3IucmVjZWl2ZSAjIGl0IGFzc3VtZXMgdGFzayBkb2Vzbid0IHVzZSBSYWN0 b3IucmVjZWl2ZQ0KICAgICAgdGFzayhwYXJhbSkNCiAgICBlbmQNCiAgZW5kDQplbmQNCg0KdGFz a3MuZWFjaCBkbyB8dGFza3wNCiAgY29udHJvbF9wb3J0LnJlY2VpdmUgPT4gWzpyZWFkeSwgY29u c3VtZXJdDQogIA0KICAjIHNlbmQgYSB0YXNrIHRvIGEgcmVhZHkgY29uc3VtZXINCiAgY29uc3Vt ZXIgPDwgdGFzaw0KZW5kDQpgYGANCg0KT2YgY291cnNlIHdlIGNhbiBtYWtlIGEgbGlicmFyeSBm b3IgdGhhdCAobGlrZSBPVFAgb24gRXJsYW5nKS4NCg0KIyMjIERlZmF1bHQgcG9ydCBvZiBSYWN0 b3JzDQoNCkVhY2ggUmFjdG9yIGhhcyBhIGRlZmF1bHQgcG9ydCBhbmQgYFJhY3RvciNzZW5kYCBp cyBlcXVhbCB0byBgUmFjdG9yLmN1cnJlbnQuZGVmYXVsdF9wb3J0I3NlbmRgLiBPZiBjb3Vyc2Us IGBSYWN0b3IucmVjZWl2ZWAgaXMgZXF1YWwgdG8gYFJhY3Rvci5jdXJyZW50LmRlZmF1bHRfcG9y dC5yZWNlaXZlYC4NCg0KRm9yIHRoZSBzaW1wbGUgY2FzZSwgd2UgY2FuIGtlZXAgdG8gdXNlIGBS YWN0b3Ijc2VuZGAgYW5kIGBSYWN0b3IucmVjZWl2ZWANCg0KIyMjIERlcHJlY2F0aW9uIG9mIFJh Y3RvciN0YWtlIGFuZCBSYWN0b3IueWllbGQNCg0KV2l0aCB0aGUgUG9ydCBjb25jZXB0LCB3ZSBj YW4gZm9jdXMgc29sZWx5IG9uIHNlbmQgYW5kIHJlY2VpdmXigJR0aGF0IGlzLCBkaXJlY3QgbWFu aXB1bGF0aW9uIG9mIGEgUmFjdG9y4oCZcyBtYWlsYm94LiBQb3J0cyBwcm92aWRlIGEgY2xlYW4g YW5kIGZ1bmN0aW9uYWwgYWx0ZXJuYXRpdmUgdG8gYFJhY3RvciN0YWtlYCBhbmQgYFJhY3Rvci55 aWVsZGAsIG1ha2luZyB0aGVtIHVubmVjZXNzYXJ5IGluIG1vc3QgdXNlIGNhc2VzLg0KDQpNb3Jl b3ZlciwgUG9ydHMgYXJlIHNpZ25pZmljYW50bHkgZWFzaWVyIHRvIGltcGxlbWVudCwgYXMgdGhl eSByZXF1aXJlIG9ubHkgbG9ja2luZyB0aGUgcmVjZWl2aW5nIFJhY3Rvciwgd2hpbGUgeWllbGQv dGFrZSBpbnZvbHZlIGNvbXBsZXggcmVuZGV6dm91cy1zdHlsZSBzeW5jaHJvbml6YXRpb24uIEJ5 IHJlbW92aW5nIHRoZXNlIHByaW1pdGl2ZXMsIHdlIGNhbiBzaW1wbGlmeSB0aGUgc3BlY2lmaWNh dGlvbiBhbmQgcmVkdWNlIGltcGxlbWVudGF0aW9uIGNvbXBsZXhpdHnigJRlc3BlY2lhbGx5IGFy b3VuZCBmZWF0dXJlcyBsaWtlIGBSYWN0b3Iuc2VsZWN0YCwgd2hpY2ggYXJlIG5vdG9yaW91c2x5 IGhhcmQgdG8gZ2V0IHJpZ2h0Lg0KDQojIyMgYFJhY3Rvci5zZWxlY3RgIHdpdGggcG9ydHMNCg0K V2Ugc2hvdWxkIHdhaXQgZm9yIG11bHRpcGxlIHBvcnQgc2ltdWx0YW5lb3VzbHkgc28gYFJhY3Rv ci5zZWxlY3QoKWAgc2hvdWxkIGFjY2VwdCBwb3J0cy4gTm93IGBSYWN0b3Iuc2VsZWN0KClgIGNh biBhbHNvIHJlY2VpdmluZyBhbmQgeWllbGRpbmcgdGhlIHZhbHVlLCBidXQgaWYgd2UgcmVtb3Zl IHRoZSBgI3Rha2VgIGZ1bmN0aW9uYWxpdHksIGBSYWN0b3Iuc2VsZWN0YCBvbmx5IG5lZWQgdG8g c3VwcG9ydCBwb3J0cy4NCg0KIyMjIFdhaXQgZm9yIHRlcm1pbmF0aW9uDQoNCmBSYWN0b3IjdGFr ZWAgaXMgZGVzaWduZWQgZnJvbSBhbiBpZGVhIG9mIGdldHRpbmcgdGVybWluYXRpb24gcmVzdWx0 IChsaWtlIGBUaHJlYWQjdmFsdWVgKS4gRm9yIHRoaXMgcHVycG9zZSwgd2UgY2FuIGludHJvZHVj ZSBgUmFjdG9yI2pvaW5gIG9yIGBSYWN0b3IjdmFsdWVgIGxpa2UgVGhyZWFkcyBvciB3ZSBjYW4g a2VlcCB0aGUgbmFtZSBgUmFjdG9yI3Rha2VgIGZvciB0aGlzIHB1cnBvc2UuDQoNCldlIGNhbiBt YWtlIGBSYWN0b3Ijam9pbmAgYXMgYSBmb2xsb3dpbmcgcHNldWRvLWNvZGU6DQoNCmBgYHJ1YnkN CmNsYXNzIFJhY3Rvcg0KICBkZWYgam9pbiAjIHdhaXQgZm9yIHRoZSB0ZXJtaW5hdGlvbg0KICAg IG1vbml0b3IgcG9ydCA9IFBvcnQubmV3DQogICAgcG9ydC5yZWNlaXZlDQogIGVuc3VyZQ0KICAg IG1vbml0b3IgbmlsICMgdW5yZWdpc3RlciAvIGl0IHNob3VsZCBiZSBkaXNjdXNzZWQNCiAgZW5k DQogIA0KICAjIHdoZW4gdGhpcyByYWN0b3IgdGVybWluYXRlcywgc2VuZCBhIG1lc3NhZ2UgdG8g dGhlIHJlZ2lzdGVyZWQgcG9ydA0KICBkZWYgbW9uaXRvciBwb3J0DQogICAgQG1vbml0b3JfcG9y dCA9IHBvcnQNCiAgZW5kDQogIA0KICBwcml2YXRlIGRlZiBhdGV4aXQNCiAgICBAbW9uaXRvcl9w b3J0IDw8IHRlcm1pbmF0aW9uX21lc3NhZ2UNCiAgZW5kDQplbmQNCg0KIyB0aGVyZSBhcmUgc29t ZSBxdWVzdGlvbnMuDQojICogY2FuIHdlIHJlZ2lzdGVyIG11bHRpcGxlIHBvcnRzPw0KIyAqIHNo b3VsZCB3ZSBzdXBwb3J0IGAjam9pbmAgYW5kIGAjdmFsdWVgIGxpa2UgdGhyZWFkcz8NCiMgICBv ciBzaG91bGQgd2Ugc3VwcG9ydCBvbmx5IGAjam9pbmAgdG8gcmV0dXJuIHRoZSB2YWx1ZT8NCiMg KiBvciBrZWVwIHRoaXMgbmFtZSBhcyBgI3Rha2VgPw0KDQoNClJhY3Rvci5uZXcgZG8NCiAgNDIN CmVuZC5qb2luICM9PiA0MiAob3IgdHJ1ZT8pDQpgYGANCg0KSXQgaXMgdmVyeSBzaW1pbGFyIHRv IGBtb25pdG9yYCBpbiBFcmxhbmcgb3IgRWxpeGlyLg0KV2UgY2FuIGFsc28gbWFrZSBhIHN1cGVy dmlzb3IgaW4gRXJsYW5nIGxpa2UgdGhhdDoNCg0KYGBgcnVieQ0Kc3ZfcG9ydCA9IFJhY3Rvcjo6 UG9ydC5uZXcNCg0KcnMgPSBOLnRpbWVzLm1hcCBkbw0KICBSYWN0b3IubmV3IGRvDQogICAgZG9f c29tZXRoaW5nKCkNCiAgZW5kLm1vbml0b3Igc3ZfcG9ydA0KZW5kDQoNCndoaWxlIHRlcm1pbmF0 aW9uX25vdGljZSA9IHN2X3BvcnQucmVjZWl2ZQ0KICBwIHRlcm1pbmF0aW9uX25vdGljZQ0KZW5k DQoNCiMgV2l0aCBSYWN0b3IjdGFrZSwgd2UgY2FuIHdyaXRlIHNpbWlsYXIgY29kZSBpZiB0aGVy ZSBpcyBubyBSYWN0b3IueWllbGQNCg0KcnMgPSBOLnRpbWVzLm1hcCBkbw0KICBSYWN0b3IubmV3 IGRvDQogICAgZG9fc29tZXRoaW5nKCkNCiAgZW5kDQplbmQNCg0Kd2hpbGUgciwgbXNnID0gUmFj dG9yLnNlbGVjdCgqcnMpDQogIHAgW3IsIG1zZ10NCmVuZA0KYGBgDQoNCiMjIERpc2N1c3Npb24N Cg0KIyMjIGBzZW5kYCB3aXRoIHRhZyAoc3ltYm9scykNCg0KSWYgd2UgZm9yY2UgdXNlcnMgdG8g c2VuZCBhIHRhZ2dlZCBtZXNzYWdlIGV2ZXJ5IHRpbWUsIHdlIGNhbiBhY2hpZXZlIHRoZSBzYW1l IGVmZmVjdCBhcyBQb3J0IGNvbmNlcHQsIGJlY2F1c2UgYSBQb3J0IGNhbiBiZSB0aG91Z2h0IG9m IGFzIGEgY29tYmluYXRpb24gb2YgYSB0YWcgYW5kIGEgZGVzdGluYXRpb24gUmFjdG9yLg0KDQpg YGBydWJ5DQpyID0gUmFjdG9yLm5ldyBkbw0KICBsb29wIGRvDQogICAgdGFnLCBtc2cgPSBSYWN0 b3IucmVjZWl2ZSAjIHJldHVybiAyIHZhbHVlcw0KICAgIGNhc2UgdGFnDQogICAgd2hlbiA6VEFH DQogICAgICBwIFt0YWcsIG1zZ10NCiAgICBlbHNlDQogICAgICAjIGlnbm9yZQ0KICAgIGVuZA0K ICBlbmQNCmVuZA0KDQpyLnNlbmQgOlRBRywgNDINCnIuc2VuZCA6VEFHRSwgODQgIyB0aGlzIHR5 cG8gYW5kIHRoZSBtZXNzYWdlIGlzIHNpbGVudGx5IGlnbm9yZWQNCmBgYA0KDQpIb3dldmVyIGl0 IGhhcyB0d28gaXNzdWVzOg0KDQoqIElmIHdlIG1ha2UgYSB0eXBvIGluIHRhZyBuYW1lLCB0aGUg bWVzc2FnZSB3aWxsIGJlIHNpbGVudGx5IGlnbm9yZWQuDQoqIFRoZSB0YWcgbmFtZSBtYXkgY29u ZmxpY3Qgd2l0aCB1bnJlbGF0ZWQgY29kZXMgKGxpYnJhcmllcykNCg0KIyMjIGBSYWN0b3IueWll bGRgIGFuZCBgUmFjdG9yI3Rha2VgIHdpdGggY2hhbm5lbCByYWN0b3INCg0KSWYgd2Ugd2FudCB0 byBsZWF2ZSB0aGUgYC55aWVsZGAgYW5kIGAjdGFrZWAsIHdlIGNhbiBlbXVsYXRlIHRoZW0gd2l0 aCBjaGFubmVsIHJhY3Rvci4NCg0KYGBgcnVieQ0KY2xhc3MgUmFjdG9yDQogIGRlZiBpbml0aWFs aXplDQogICAgQHlpZWxkX3JhY3RvciA9IFJhY3Rvci5uZXcgZG8NCiAgICAgIHRha2VycyA9IFtd DQogICAgICB3aGlsZSB0YWcsIG1zZyA9IFJhY3Rvci5yZWNlaXZlDQogICAgICAgIGNhc2UgdGFn DQogICAgICAgIHdoZW4gOnJlZ2lzdGVyDQogICAgICAgICAgQHRha2VycyA8PCBtc2cNCiAgICAg ICAgd2hlbiA6dW5yZWdpc3Rlcg0KICAgICAgICAgIEB0YWtlcnMuZGVsZXRlIG1zZw0KICAgICAg ICB3aGVuIDp5aWVsZA0KICAgICAgICAgIEB0YWtlcnMucG9wIDw8IG1zZw0KICAgICAgICBlbmQN CiAgICAgIGVuZA0KICAgIGVuZA0KICBlbmQNCg0KICBkZWYgc2VsZi55aWVsZCBvYmoNCiAgICBA eWllbGRfcmFjdG9yIDw8IFs6eWllbGQsIG9ial0NCiAgZW5kDQoNCiAgZGVmIHRha2UNCiAgICBA eWllbGRfcmFjdG9yIDw8IFs6cmVnaXN0ZXIsIHBvcnQgPSBSYWN0b3I6OlBvcnQubmV3XQ0KICAg IHBvcnQucmVjZWl2ZQ0KICBlbnN1cmUNCiAgICBAeWllbGRfcmFjdG9yIDw8IFs6dW5yZWdpc3Rl ciwgcG9ydF0NCiAgZW5kDQplbmQNCmBgYA0KDQojIyMgT3BlbmluZyBhbmQgY2xvc2luZyB0aGUg cG9ydA0KDQpUaGlzIHByb3Bvc2FsIGRvZXNuJ3QgY29udGFpbiBvcGVuaW5nIGFuZCBjbG9zaW5n IHRoZSBwb3J0LCBidXQgd2UgY2FuIGRpc2N1c3MgYWJvdXQgaXQuIFRvIGludHJvZHVjZSB0aGlz IGF0dHJpYnV0ZSwgd2UgbmVlZCB0byBtYW5hZ2Ugd2hpY2ggcG9ydHMgKHRhZ3MpIGFyZSBvcGVu aW5nLg0KDQojIyBJbXBsZW1lbnRhdGlvbg0KDQpOb3cgdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlv biBpcyBub3QgZmluaXNoZWQsIGJ1dCB3ZSBjYW4gaW1wbGVtZW50IGl0IHVzaW5nIHRoZSBgUmFj dG9yLnJlY2VpdmVfaWZgIG1lY2hhbmlzbSwgc28gd2UgZXN0aW1hdGUgdGhhdCBvbmx5IGEgZmV3 IHdlZWtzIG9mIHdvcmsgYXJlIG5lZWRlZCB0byBjb21wbGV0ZSBpdC4NCg0KIyMgU3VtbWFyeQ0K DQpUaGlzIHByb3Bvc2FsIGludHJvZHVjZXMgdGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhbmQgZGVw cmVjYXRpb25zLg0KDQoqIGBSYWN0b3I6OlBvcnRgDQogICogYFBvcnQjc2VuZChtc2cpYCDigJMg c2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBjcmVhdG9yIG9mIHRoZSBwb3J0Lg0KICAqIGBQb3J0I3Jl Y2VpdmVgIOKAkyByZWNlaXZlcyBhIG1lc3NhZ2UgZnJvbSB0aGUgcG9ydC4NCiAgKiBBIHBvcnQg aXMgYSBsaWdodHdlaWdodCBkYXRhIHN0cnVjdHVyZSAoYSBwYWlyIG9mIGEgUmFjdG9yIGFuZCBh IHRhZykuDQoqIGBSYWN0b3Ijam9pbmAgb3IgYFJhY3RvciN2YWx1ZWAg4oCTIHRvIHdhaXQgZm9y IFJhY3RvciB0ZXJtaW5hdGlvbiAobGlrZSBgVGhyZWFkI2pvaW5gKQ0KKiBgUmFjdG9yI21vbml0 b3JgIOKAkyB0byBvYnNlcnZlIHdoZW4gYW5vdGhlciBSYWN0b3IgdGVybWluYXRlcw0KKiBEZXBy ZWNhdGlvbnM6DQogICogYFJhY3RvciN0YWtlYA0KICAqIGBSYWN0b3IueWllbGRgDQogICogYFJh Y3Rvci5yZWNlaXZlX2lmYA0KDQpUaGFuayB5b3UgZm9yIHJlYWRpbmcgdGhpcyBsb25nIHByb3Bv c2FsLiBJZiB5b3UgaGF2ZSBhbnkgdXNlIGNhc2VzIHRoYXQgY2Fubm90IGJlIGFkZHJlc3NlZCB3 aXRoIGBSYWN0b3I6OlBvcnRgLCBJJ2QgbG92ZSB0byBoZWFyIHRoZW0uDQoNCg0KUC5TLiBUaGFu a3MgdG8gbWFtZSBmb3IgcmV2aWV3aW5nIHRoaXMgcHJvcG9zYWwgYW5kIHN1Z2dlc3RpbmcgdGhh dCBJIHVzZSBDaGF0R1BUIHRvIGltcHJvdmUgdGhlIHdyaXRpbmcuDQoNCg0KDQotLSANCmh0dHBz Oi8vYnVncy5ydWJ5LWxhbmcub3JnLw0KIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KIHJ1YnktY29yZSBtYWlsaW5nIGxpc3QgLS0gcnVieS1jb3JlQG1sLnJ1 YnktbGFuZy5vcmcKIFRvIHVuc3Vic2NyaWJlIHNlbmQgYW4gZW1haWwgdG8gcnVieS1jb3JlLWxl YXZlQG1sLnJ1YnktbGFuZy5vcmcKIHJ1YnktY29yZSBpbmZvIC0tIGh0dHBzOi8vbWwucnVieS1s YW5nLm9yZy9tYWlsbWFuMy9saXN0cy9ydWJ5LWNvcmUubWwucnVieS1sYW5nLm9yZy8=