[ruby-core:121640] [Ruby Feature#21262] Proposal: `Ractor::Port`
From:
"tenderlovemaking (Aaron Patterson) via ruby-core" <ruby-core@...>
Date:
2025-04-12 17:39:00 UTC
List:
ruby-core #121640
SXNzdWUgIzIxMjYyIGhhcyBiZWVuIHVwZGF0ZWQgYnkgdGVuZGVybG92ZW1ha2luZyAoQWFyb24g UGF0dGVyc29uKS4NCg0KDQprbzEgKEtvaWNoaSBTYXNhZGEpIHdyb3RlIGluICNub3RlLTg6DQo+ IFRoZSBpbXBvcnRhbnQgcG9pbnQgaXMgdGhhdCB3ZSBoYXZlIGxpbWl0ZWQgImJsb2NraW5nIiBz eW5jaHJvbml6YXRpb24gKGludHJvZHVjZWQgYnkgY3Jvc3MtUmFjdG9yIGNvbW11bmljYXRpb24p IHRvIGByZWNlaXZlYCwgYW5kIHdlIGNhbiB3YWl0IGZvciBtdWx0aXBsZSBzdWNoIGV2ZW50cyB1 c2luZyBgUmFjdG9yLnNlbGVjdGAuDQo+IElmIHdlIGludHJvZHVjZSBhIENoYW5uZWwgYXMgYW5v dGhlciBwcmltaXRpdmUsIGl0IGFkZHMgYW5vdGhlciBibG9ja2luZyBtZWNoYW5pc20gYW5kIG1h a2VzIGBSYWN0b3Iuc2VsZWN0YCBtb3JlIGNvbXBsZXggYWdhaW4uDQoNCkdyZWF0LCB5ZXMuICBJ dCBtYWtlcyBzZW5zZS4gIFRoYW5rIHlvdSBmb3IgZXhwbGFpbmluZyENCg0KLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KRmVhdHVyZSAjMjEyNjI6IFByb3Bvc2FsOiBg UmFjdG9yOjpQb3J0YA0KaHR0cHM6Ly9idWdzLnJ1YnktbGFuZy5vcmcvaXNzdWVzLzIxMjYyI2No YW5nZS0xMTI2OTQNCg0KKiBBdXRob3I6IGtvMSAoS29pY2hpIFNhc2FkYSkNCiogU3RhdHVzOiBB c3NpZ25lZA0KKiBBc3NpZ25lZToga28xIChLb2ljaGkgU2FzYWRhKQ0KKiBUYXJnZXQgdmVyc2lv bjogMy41DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIFByb3Bv c2FsOiBgUmFjdG9yOjpQb3J0YA0KDQpJbiBjb25jdXJyZW50IFJ1YnkgYXBwbGljYXRpb25zIHVz aW5nIFJhY3RvcnMsIHNhZmVseSBhbmQgZWZmaWNpZW50bHkgY29tbXVuaWNhdGluZyByZXN1bHRz IGJldHdlZW4gUmFjdG9ycyBpcyBhIGNvbW1vbiBjaGFsbGVuZ2UuIFdlIHByb3Bvc2UgYFJhY3Rv cjo6UG9ydGAgYXMgYSBsaWdodHdlaWdodCwgc2FmZSwgYW5kIGVyZ29ub21pYyBhYnN0cmFjdGlv biB0byBzaW1wbGlmeSBjb21tdW5pY2F0aW9uIHBhdHRlcm5zLCBlc3BlY2lhbGx5IGluIHJlcXVl c3QtcmVzcG9uc2UgbW9kZWxzLg0KDQpgYGBydWJ5DQojIHVzYWdlIGV4YW1wbGUNCg0KcG9ydCA9 IFJhY3Rvcjo6UG9ydC5uZXcNCg0KUmFjdG9yLm5ldyBwb3J0IGRvIHxwb3J0fA0KICBwb3J0IDw8 IDQyDQogIHBvcnQgPDwgNDMNCmVuZA0KDQojIFN1Y2Nlc3M6IHdhaXQgZm9yIHNlbmRpbmcNCnBv cnQucmVjZWl2ZSAjPT4gNDINCg0KUmFjdG9yLm5ldyBwb3J0IGRvIHxwb3J0fA0KICBwb3J0LnJl Y2VpdmUgIyBFcnJvcjogb25seSB0aGUgY3JlYXRvciBSYWN0b3IgY2FuIHJlY2VpdmUgZnJvbSB0 aGlzIHBvcnQuDQplbmQNCg0KcG9ydC5yZWNlaXZlICM9PiA0Mw0KYGBgDQoNClRoaXMgaXMgYSBz aW1pbGFyIGNvbmNlcHQgdG8gWyJDaGFubmVsIl0oaHR0cHM6Ly9idWdzLnJ1YnktbGFuZy5vcmcv aXNzdWVzLzIxMTIxKSwgYnV0IGl0IGlzIHRpZ2h0bHkgY291cGxlZCB3aXRoIHRoZSBjcmVhdG9y IFJhY3RvciBhbmQgbm8gb3RoZXIgUmFjdG9ycyBjYW4gcmVjZWl2ZSBhbnl0aGluZyBmcm9tIHRo YXQgcG9ydC4NCg0KSW4gdGhhdCBzZW5zZSwgaXQgaXMgY29uY2VwdHVhbGx5IGNsb3NlciB0byBh IHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKGUuZy4sIGEgZGVzdGluYXRpb24gYW5kIHBvcnQgbnVt YmVyIHBhaXIgaW4gVENQL0lQKS4NCg0KV2UgY2FuIGltcGxlbWVudCBgUG9ydGAgd2l0aCBgUmFj dG9yLnJlY2VpdmVfaWZgIGxpa2UgdGhpczoNCg0KYGBgcnVieQ0KY2xhc3MgUmFjdG9yOjpQb3J0 DQogIGRlZiBpbml0aWFsaXplDQogICAgQHIgPSBSYWN0b3IuY3VycmVudA0KICAgIEB0YWcgPSBn ZW5pZCgpDQogIGVuZA0KDQogIGRlZiBzZW5kIG9iag0KICAgIEByIDw8IFtAdGFnLCBvYmpdDQog IGVuZA0KDQogIGRlZiByZWNlaXZlDQogICAgcmFpc2UgdW5sZXNzIEByID09IFJhY3Rvci5jdXJy ZW50DQoNCiAgICBSYWN0b3IucmVjZWl2ZV9pZiBkbyB8KHRhZywgcmVzdWx0KQ0KICAgICAgaWYg dGFnID09IEB0YWcNCiAgICAgICAgcmV0dXJuIHJlc3VsdA0KICAgICAgZW5kDQogICAgZW5kDQog IGVuZA0KZW5kDQpgYGANCg0KV2l0aCBgUmFjdG9yOjpQb3J0YCwgd2UgY2FuIGRlcHJlY2F0ZSBg UmFjdG9yLnJlY2VpdmVfaWZgLCBgUmFjdG9yLnlpZWxkYCwgYW5kIGBSYWN0b3IjdGFrZWAuIFBv cnRzIGFjdCBhcyBjbGVhciwgc2VsZi1jb250YWluZWQgZW5kcG9pbnRzIGZvciBtZXNzYWdlIHBh c3NpbmcsIHdoaWNoIG1ha2VzIHRoZXNlIG9sZGVyIHByaW1pdGl2ZXMgcmVkdW5kYW50LiBGdXJ0 aGVybW9yZSwgUG9ydC1iYXNlZCBjb21tdW5pY2F0aW9uIGlzIHNpZ25pZmljYW50bHkgZWFzaWVy IHRvIGltcGxlbWVudCBhbmQgcmVhc29uIGFib3V04oCUZXNwZWNpYWxseSB3aGVuIGNvbnNpZGVy aW5nIHN5bmNocm9uaXphdGlvbiBjaGFsbGVuZ2VzIGFyb3VuZCBgUmFjdG9yLnNlbGVjdGAgYW5k IHJlbmRlenZvdXMgc2VtYW50aWNzLg0KDQojIyBCYWNrZ3JvdW5kOiBMaW1pdGF0aW9ucyBvZiBj dXJyZW50IGNvbW11bmljYXRpb24gcGF0dGVybnMNCg0KTGV0J3MgZGlzY3VzcyBob3cgdG8gbWFr ZSBzZXJ2ZXItbGlrZSBzZXJ2aWNlIHJhY3RvcnMuDQoNCiMjIyBObyByZXNwb25zZSBzZXJ2ZXIN Cg0KV2UgY2FuIG1ha2Ugc2VydmVyLWxpa2UgUmFjdG9ycyBsaWtlIHRoaXM6DQoNCmBgYHJ1YnkN CiMgRVgxDQoNCmRlZiBmaWIobikgPSBuID4gMSA6IGZpYihuLTIpICsgZmliKG4tMSkgOiAxDQoN CiMgQSByYWN0b3IgY2FsY3VsYXRlIGZpYihuKQ0KZmliX3NydiA9IFJhY3Rvci5uZXcgZG8NCiAg d2hpbGUgdHJ1ZQ0KICAgIHBhcmFtID0gUmFjdG9yLnJlY2VpdmUNCiAgICByZXN1bHQgPSBmaWIo cGFyYW0pDQogIGVuZA0KZW5kDQoNCmZpYl9zcnYgPDwgMTANCmBgYA0KDQpJbiB0aGlzIGNhc2Us IHRoZSBtYWluIFJhY3RvciByZXF1ZXN0cyBgZmliX3NydmAgdG8gY2FsY3VsYXRlIGBmaWIoMTAp YC4NCkhvd2V2ZXIsIGN1cnJlbnRseSwgdGhlcmUgaXMgbm8gd2F5IHRvIHJldHJpZXZlIHRoZSBy ZXN1bHQuDQoNCiMjIyBSZXR1cm4gdmFsdWUgdG8gdGhlIHNlbmRlciByYWN0b3INCg0KVGhlcmUg YXJlIHNldmVyYWwgcG9zc2libGUgYXBwcm9hY2hlcy4NCg0KRmlyc3QsIHdlIGNhbiBzZW5kIHRo ZSBzZW5kZXIgUmFjdG9yIGFsb25nIHdpdGggdGhlIHBhcmFtZXRlciwgYW5kIGFzayB0aGUgc2Vy dmVyIHRvIHNlbmQgdGhlIHJlc3VsdCBiYWNrIHRvIHRoZSBzZW5kZXIuDQoNCmBgYHJ1YnkNCiMg RVgyDQoNCmZpYl9zcnYgPSBSYWN0b3IubmV3IGRvDQogIHdoaWxlIHRydWUNCiAgICBwYXJhbSwg c2VuZGVyID0gUmFjdG9yLnJlY2VpdmUNCiAgICByZXN1bHQgPSBmaWIocGFyYW0pDQogICAgc2Vu ZGVyIDw8IHJlc3VsdA0KICBlbmQNCmVuZA0KDQpmaWJfc3J2IDw8IFsxMCwgUmFjdG9yLmN1cnJl bnRdDQoNCmRvX3NvbWVfd29yaygpDQoNClJhY3Rvci5yZWNlaXZlICM9PiBmaWIoMTApDQpgYGAN Cg0KVGhpcyBhcHByb2FjaCB3b3JrcyB3ZWxsIGluIHNpbXBsZSBjYXNlcy4NCg0KSG93ZXZlciwg d2l0aCBFWDIsIGhhbmRsaW5nIG11bHRpcGxlIGNvbmN1cnJlbnQgcmVzcG9uc2VzIGJlY29tZXMg ZGlmZmljdWx0LiBUaGUgcmVzdWx0cyBhcmUgcHVzaGVkIGludG8gdGhlIHNhbWUgbWFpbGJveCwg YW5kIHNpbmNlIGBSYWN0b3IucmVjZWl2ZWAgcmV0cmlldmVzIG1lc3NhZ2VzIHdpdGhvdXQgZGlz Y3JpbWluYXRpbmcgdGhlIHNvdXJjZSwgaXQncyB1bmNsZWFyIHdoaWNoIHNlcnZlciByZXR1cm5l ZCB3aGljaCByZXN1bHQuDQoNCmBgYHJ1YnkNCiMgRVgzDQoNCmRlZiBmYWN0KG4pID0gbiA+IDEg OiBmYWN0KG4tMSkgKiBuDQoNCmZpYl9zcnYgPSBSYWN0b3IubmV3IGRvDQogIHdoaWxlIHRydWUN CiAgICBwYXJhbSwgc2VuZGVyID0gUmFjdG9yLnJlY2VpdmUNCiAgICByZXN1bHQgPSBmaWIocGFy YW0pDQogICAgc2VuZGVyIDw8IHJlc3VsdA0KICBlbmQNCmVuZA0KDQpmYWN0X3NydiA9IFJhY3Rv ci5uZXcgZG8NCiAgd2hpbGUgdHJ1ZQ0KICAgIHBhcmFtLCBzZW5kZXIgPSBSYWN0b3IucmVjZWl2 ZQ0KICAgIHJlc3VsdCA9IGZhY3QocGFyYW0pDQogICAgc2VuZGVyIDw8IHJlc3VsdA0KICBlbmQN CmVuZA0KDQoNCmZpYl9zcnYgPDwgWzEwLCBSYWN0b3IuY3VycmVudF0NCmZpYl9zcnYgPDwgWzIw LCBSYWN0b3IuY3VycmVudF0NCmZhY3Rfc3J2IDw8IFsxMCwgUmFjdG9yLmN1cnJlbnRdDQpmYWN0 X3NydiA8PCBbMjAsIFJhY3Rvci5jdXJyZW50XQ0KDQpkb19zb21lX3dvcmsoKQ0KDQpSYWN0b3Iu cmVjZWl2ZQ0KIz0+IGZpYigxMCkgb3IgZmFjdCgxMCksIHdoaWNoPw0KIyAgIElmIHRoZSBzZXJ2 ZXJzIHVzZXMgUmFjdG9ycyBtb3JlIChjYWxjdWxhdGUgdGhlbSBpbiBwYXJhbGxlbCksDQojICAg ZmliKDIwKSBhbmQgZmFjdCgyMCkgY2FuIGJlIHJldHVybmVkLg0KYGBgDQoNCkJlY2F1c2UgYFJh Y3Rvci5yZWNlaXZlYCByZXRyaWV2ZXMgYWxsIG1lc3NhZ2VzIGluZGlzY3JpbWluYXRlbHksIGRl dmVsb3BlcnMgbXVzdCBhZGQgdGhlaXIgb3duIHRhZ2dpbmcgbG9naWMgdG8gZGlzdGluZ3Vpc2gg cmVzdWx0cy4gV2hpbGUgdGFnZ2luZyAoYXMgc2hvd24gaW4gRVg0KSBoZWxwcywgaXQgaW50cm9k dWNlcyBhZGRpdGlvbmFsIGNvbXBsZXhpdHkgYW5kIGJyaXR0bGVuZXNzLg0KDQojIyMgUmVzcG9u c2VzIHdpdGggcmVxdWVzdCBJRA0KDQpUaGUgZm9sbG93aW5nIGNvZGUgcmV0dXJucyBhIHJlc3Vs dCB3aXRoIHJlcXVlc3QgaWQgKGEgcGFpciBvZiB0aGUgbmFtZSBvZiBzZXJ2ZXIgYW5kIGEgcGFy YW1ldGVyKS4NCg0KYGBgcnVieQ0KIyBFWDQNCg0KZmliX3NydiA9IFJhY3Rvci5uZXcgZG8NCiAg d2hpbGUgdHJ1ZQ0KICAgIHBhcmFtLCBzZW5kZXIgPSBSYWN0b3IucmVjZWl2ZQ0KICAgIHJlc3Vs dCA9IGZpYihwYXJhbSkNCiAgICBzZW5kZXIgPDwgW1s6ZmliLCBwYXJhbV0sIHJlc3VsdF0NCiAg ZW5kDQplbmQNCg0KZmFjdF9zcnYgPSBSYWN0b3IubmV3IGRvDQogIHdoaWxlIHRydWUNCiAgICBw YXJhbSwgc2VuZGVyID0gUmFjdG9yLnJlY2VpdmUNCiAgICByZXN1bHQgPSBmYWN0KHBhcmFtKQ0K ICAgIHNlbmRlciA8PCBbWzpmYWN0LCBwYXJhbV0sIHJlc3VsdF0NCiAgZW5kDQplbmQNCg0KZmli X3NydiA8PCBbMTAsIFJhY3Rvci5jdXJyZW50XQ0KZmliX3NydiA8PCBbMjAsIFJhY3Rvci5jdXJy ZW50XQ0KZmFjdF9zcnYgPDwgWzEwLCBSYWN0b3IuY3VycmVudF0NCmZhY3Rfc3J2IDw8IFsyMCwg UmFjdG9yLmN1cnJlbnRdDQoNCmRvX3NvbWVfd29yaygpDQoNClJhY3Rvci5yZWNlaXZlX2lmIGRv IHxpZCwgcmVzdWx0fA0KICBjYXNlIGlkDQogIGluIFs6ZmliLCBuXQ0KICAgIHAgImZpYigje259 KSA9ICN7cmVzdWx0fSINCiAgaW4gWzpmYWN0LCBuXQ0KICAgIHAgImZhY3QoI3tufSkgPSAje3Jl c3VsdH0iDQogIGVuZA0KZW5kDQoNCiMgb3IgaWYgeW91IHdhbnQgdG8gdXNlIHNwZWNpZmljIHJl c3VsdHMsIGxpa2U6DQoNCnAgZmliMjA6ICBSYWN0b3IucmVjZWl2ZV9pZnt8aWQsIHJlc3VsdHwg aWQgPT4gWzpmaWIsIDIwXTsgIHJlc3VsdH0NCnAgZmFjdDEwOiBSYWN0b3IucmVjZWl2ZV9pZnt8 aWQsIHJlc3VsdHwgaWQgPT4gWzpmYWN0LCAxMF07IHJlc3VsdH0NCnAgZmFjdDIwOiBSYWN0b3Iu cmVjZWl2ZV9pZnt8aWQsIHJlc3VsdHwgaWQgPT4gWzpmYWN0LCAyMF07IHJlc3VsdH0NCnAgZmli MTA6ICBSYWN0b3IucmVjZWl2ZV9pZnt8aWQsIHJlc3VsdHwgaWQgPT4gWzpmaWIsIDEwXTsgIHJl c3VsdH0NCmBgYA0KDQpUaGlzIGFwcHJvYWNoIGNsb3NlbHkgcmVzZW1ibGVzIHBhdHRlcm4gbWF0 Y2hpbmcgaW4gRXJsYW5nIG9yIEVsaXhpciwgd2hlcmUgcmVzcG9uc2VzIGFyZSB0YWdnZWQgYW5k IG1hdGNoZWQgc3RydWN0dXJhbGx5Lg0KDQpIb3dldmVyLCB0aGlzIHNvbHV0aW9uIHN0aWxsIGhh cyBhbiBpc3N1ZTogaWYgYGRvX3NvbWVfd29yaygpYCB1c2VzIGBSYWN0b3IucmVjZWl2ZWAsIGl0 IG1heSBhY2NpZGVudGFsbHkgY29uc3VtZSBhbnkgbWVzc2FnZS4gSW4gb3RoZXIgd29yZHMsIGBS YWN0b3IucmVjZWl2ZWAgY2FuIG9ubHkgYmUgc2FmZWx5IHVzZWQgd2hlbiB5b3UncmUgY2VydGFp biB0aGF0IG5vIG90aGVyIGNvZGUgaXMgdXNpbmcgaXQuDQoNCihBbm90aGVyIHRyaXZpYWwgaXNz dWUgaXMsIGRpZmZlcmVudCBzZXJ2ZXJzIGNhbiByZXR1cm4gc2FtZSBpZGVudGl0eSwgbGlrZSBg WzpmYWN0LCBudW1dYCByZXR1cm5lZCBieSBOZXdzUGFwZXIgc2VydmVyLiBJdCBpcyBjb25mdXNp bmcpLg0KDQoNCiMjIyBVc2luZyBjaGFubmVscw0KDQpUbyBzb2x2ZSB0aGlzIGlzc3VlLCB3ZSBj YW4gbWFrZSBhIGNoYW5uZWwgd2l0aCBkaWZmZXJlbnQgUmFjdG9ycy4NCg0KQ2hhbm5lbHMgY2Fu IGJlIGltcGxlbWVudGVkIHVzaW5nIFJhY3RvcnMsIGFzIGlsbHVzdHJhdGVkIGJlbG93Lg0KDQpg YGBydWJ5DQojIEVYNQ0KDQojIFNlcnZlcnMgYXJlIGNvbXBsZXRlbHkgc2FtZSB0byBFWDMNCg0K ZmliX3NydiA9IFJhY3Rvci5uZXcgZG8NCiAgd2hpbGUgdHJ1ZQ0KICAgIHBhcmFtLCBzZW5kZXIg PSBSYWN0b3IucmVjZWl2ZQ0KICAgIHJlc3VsdCA9IGZpYihwYXJhbSkNCiAgICBzZW5kZXIgPDwg cmVzdWx0DQogIGVuZA0KZW5kDQoNCmZhY3Rfc3J2ID0gUmFjdG9yLm5ldyBkbw0KICB3aGlsZSB0 cnVlDQogICAgcGFyYW0sIHNlbmRlciA9IFJhY3Rvci5yZWNlaXZlDQogICAgcmVzdWx0ID0gZmFj dChwYXJhbSkNCiAgICBzZW5kZXIgPDwgcmVzdWx0DQogIGVuZA0KZW5kDQoNCiMgQ3JlYXRlIGEg bmV3IGNoYW5uZWwgdXNpbmcgYSBSYWN0b3INCmRlZiBuZXdfY2hhbm5lbA0KICBSYWN0b3IubmV3 IGRvDQogICAgd2hpbGUgdHJ1ZQ0KICAgICAgUmFjdG9yLnlpZWxkIFJhY3Rvci5yZWNlaXZlDQog ICAgZW5kDQogIGVuZA0KZW5kDQoNCg0KZmliX3NydiA8PCBbMTAsIGZpYjEwX2NoID0gbmV3X2No YW5uZWxdDQpmaWJfc3J2IDw8IFsyMCwgZmliMjBfY2ggPSBuZXdfY2hhbm5lbF0NCmZhY3Rfc3J2 IDw8IFsxMCwgZmFjdDEwX2NoID0gbmV3X2NoYW5uZWxdDQpmYWN0X3NydiA8PCBbMjAsIGZhY3Qy MF9jaCA9IG5ld19jaGFubmVsXQ0KDQpkb19zb21lX3dvcmsoKQ0KDQpwIGZpYjIwOiBmaWIyMF9j aC50YWtlICAgIyB3YWl0IGZvciBmaWIoMjApDQpwIGZhY3QxMDogZmFjdDEwX2NoLnRha2UgIyB3 YWl0IGZvciBmYWN0KDEwKQ0KcCBmaWIxMDogZmliMTBfY2gudGFrZSAgICMgd2FpdCBmb3IgZmli KDEwKQ0KcCBmYWN0MjA6IGZhY3QxMF9jaC50YWtlICMgd2FpdCBmb3IgZmFjdCgyMCkNCg0KIyBv ciANCmNocyA9IFtmaWIxMF9jaCwgZmliMjBfY2gsIGZhY3QxMF9jaCwgZmFjdDIwX2NoXQ0KDQp3 aGlsZSAhY2hzLmVtcHR5Pw0KICBjaCwgcmVzdWx0ID0gUmFjdG9yLnNlbGVjdCgqY2hzKSAjIHdh aXQgZm9yIG11bHRpcGxlIGNoYW5uZWxzDQogIHAgY2gsIHJlc3VsdA0KICBjaHMuZGVsZXRlIGNo DQplbmQNCmBgYA0KDQpDaGFubmVsIGFwcHJvYWNoIHNvbHZlcyB0aGUgaXNzdWUgb2YgRVg0LiBU aGUgYWJvdmUgaW1wbGVtZW50YXRpb24gaW50cm9kdWNlIHNvbWUgb3ZlcmhlYWQgdG8gY3JlYXRl IGNoYW5uZWwgcmFjdG9ycywgYnV0IHdlIGNhbiBpbnRyb2R1Y2Ugc3BlY2lhbCBpbXBsZW1lbnRh dGlvbiB0byByZWR1Y2UgdGhpcyBSYWN0b3IgY3JlYXRpb24gb3ZlcmhlYWQuDQoNCkhvd2V2ZXIs IGluIHRoZSBBY3RvciBtb2RlbCwgdGhlIGNvbW11bmljYXRpb24gcGF0dGVybiBpcyB0byBzZW5k IGEgbWVzc2FnZSB0byBhIHNwZWNpZmljIGFjdG9yLiBJbiBjb250cmFzdCwgY2hhbm5lbHMgYXJl IHVzZWQgdG8gc2VuZCBtZXNzYWdlcyB0aHJvdWdoIGEgc2hhcmVkIGNvbmR1aXQsIHdpdGhvdXQg Y2FyaW5nIHdoaWNoIHJlY2VpdmVyIChpZiBhbnkpIGhhbmRsZXMgdGhlIG1lc3NhZ2UuIEFsc28s IGNoYW5uZWxzIGNhbiBoYXZlIHNvbWUgb3ZlcmhlYWQsIGFzIGRpc2N1c3NlZCBiZWxvdy4NCg0K IyMjIFN1bW1hcnkgb2YgYmFja2dyb3VuZA0KDQpDdXJyZW50bHksIHdoZW4gaW1wbGVtZW50aW5n IHJlcXVlc3QtcmVzcG9uc2UgcGF0dGVybnMgd2l0aCBSYWN0b3JzLCBkZXZlbG9wZXJzIGZhY2Ug Y2hhbGxlbmdlcyBpbiB0cmFja2luZyByZXN1bHRzLCBtYW5hZ2luZyBpZGVudGlmaWVycywgYW5k IGF2b2lkaW5nIG1lc3NhZ2UgY29uZmxpY3RzLiBFeGlzdGluZyBwcmltaXRpdmVzIGxpa2UgYHJl Y2VpdmVfaWZgLCBgdGFrZWAsIG9yIGNoYW5uZWxzIGltcGxlbWVudGVkIHdpdGggUmFjdG9ycyBh cmUgZWl0aGVyIGVycm9yLXByb25lIG9yIGluZWZmaWNpZW50Lg0KDQojIyBQcm9wb3NhbA0KDQpJ bnRyb2R1Y2UgYFJhY3Rvcjo6UG9ydGAgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gY2hhbm5lbHMuIEl0 IGlzIGEgbmF0dXJhbCBleHRlbnNpb24gb2YgdGhlIEFjdG9yIG1vZGVsLiBJbiBmYWN0LCBpdCBp cyB0aGluIHdyYXBwZXIgb2YgY3VycmVudCBzZW5kL3JlY2VpdmUgbW9kZWwgYXMgaWxsdXN0cmF0 ZWQgYXQgdGhlIHRvcCBvZiB0aGlzIHByb3Bvc2FsLg0KDQpXaXRoIHRoZSBgUmFjdG9yOjpQb3J0 YCwgd2UgY2FuIHJld3JpdGUgYWJvdmUgZXhhbXBsZXMgd2l0aCBpdC4NCg0KYGBgcnVieQ0KIyBF WDYNCg0KIyBDb21wbGV0ZWx5IHNhbWUgYXMgRVgzJ3Mgc2VydmVycw0KDQpmaWJfc3J2ID0gUmFj dG9yLm5ldyBkbw0KICB3aGlsZSB0cnVlDQogICAgcGFyYW0sIHNlbmRlciA9IFJhY3Rvci5yZWNl aXZlDQogICAgcmVzdWx0ID0gZmliKHBhcmFtKQ0KICAgIHNlbmRlciA8PCByZXN1bHQNCiAgZW5k DQplbmQNCg0KZmFjdF9zcnYgPSBSYWN0b3IubmV3IGRvDQogIHdoaWxlIHRydWUNCiAgICBwYXJh bSwgc2VuZGVyID0gUmFjdG9yLnJlY2VpdmUNCiAgICByZXN1bHQgPSBmYWN0KHBhcmFtKQ0KICAg IHNlbmRlciA8PCByZXN1bHQNCiAgZW5kDQplbmQNCg0KZmliX3NydiA8PCBbMTAsIGZpYjEwX3Bv cnQgPSBSYWN0b3I6OlBvcnQubmV3XQ0KZmliX3NydiA8PCBbMjAsIGZpYjIwX3BvcnQgPSBSYWN0 b3I6OlBvcnQubmV3XQ0KZmFjdF9zcnYgPDwgWzEwLCBmYWN0MTBfcG9ydCA9IFJhY3Rvcjo6UG9y dC5uZXddDQpmYWN0X3NydiA8PCBbMjAsIGZhY3QyMF9wb3J0ID0gUmFjdG9yOjpQb3J0Lm5ld10N Cg0KZG9fc29tZV93b3JrKCkNCg0KcCBmaWIxMF9wb3J0LnJlY2VpdmUgIz0+IGZpYigxMCkNCnAg ZmliMjBfcG9ydC5yZWNlaXZlICM9PiBmaWIoMjApDQpwIGZhY3QxMF9wb3J0LnJlY2VpdmUgIz0+ IGZhY3QoMTApDQpwIGZhY3QyMF9wb3J0LnJlY2VpdmUgIz0+IGZhY3QoMjApDQoNCiMgb3INCg0K cG9ydHMgPSBbZmliMTBfcG9ydCwgZmliMjBfcG9ydCwgZmFjdDEwX3BvcnQsIGZhY3QyMF9wb3J0 XQ0KDQp3aGlsZSAhcG9ydHMuZW1wdHk/DQogIHBvcnQsIHJlc3VsdCA9IFJhY3Rvci5zZWxlY3Qo KnBvcnRzKQ0KICBjYXNlIHBvcnQNCiAgd2hlbiBmaWIxMF9wb3J0DQogICAgcCBmaWIxMDogcmVz dWx0DQogIC4uLg0KICBlbHNlDQogICAgcmFpc2UgIlRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKEJV RykuIg0KICBlbmQNCg0KICBwb3J0cy5kZWxldGUocG9ydCkNCmVuZA0KYGBgDQoNCmBSYWN0b3I6 OlBvcnRgIHJlc29sdmVzIGtleSBwYWluIHBvaW50cyBpbiBtZXNzYWdlIHBhc3NpbmcgYmV0d2Vl biBSYWN0b3JzOg0KDQoqIEl0IGd1YXJhbnRlZXMgdGhhdCBpbmNvbWluZyBtZXNzYWdlcyBhcmUg b25seSBkZWxpdmVyZWQgdG8gdGhlIGludGVuZGVkIFJhY3RvciwgcHJldmVudGluZyB0YWcgY29s bGlzaW9ucy4NCiogSXQgZW5hYmxlcyBtZXNzYWdlIHJvdXRpbmcgd2l0aG91dCByZWx5aW5nIG9u IGdsb2JhbCByZWNlaXZlIGJsb2NrcyAoYFJhY3Rvci5yZWNlaXZlYCksIHdoaWNoIGFyZSBwcm9u ZSB0byB1bmludGVuZGVkIGNvbnN1bXB0aW9uLg0KKiBJdCByZXBsYWNlcyBtb3JlIGNvbXBsZXgg cHJpbWl0aXZlcyBsaWtlIGAucmVjZWl2ZV9pZmAsIGAueWllbGRgLCBhbmQgYCN0YWtlYCB3aXRo IGEgc2ltcGxlciwgY29tcG9zYWJsZSBhYnN0cmFjdGlvbi4NCiogSXQgbWFwcyBjbGVhbmx5IHRv IHRoZSBBY3RvciBtb2RlbCBzZW1hbnRpY3MgUnVieSBpbnRlbmRzIHRvIHN1cHBvcnQgd2l0aCBS YWN0b3JzLg0KDQpXaGlsZSB0aGUgcGF0dGVybiBsb29rcyBzaW1pbGFyIHRvIHVzaW5nIGNoYW5u ZWxzLCB0aGUgc2VtYW50aWNzIGFuZCBndWFyYW50ZWVzIGFyZSBkaWZmZXJlbnQgaW4gbWVhbmlu Z2Z1bCB3YXlzLg0KDQpUaGUgYWR2YW50YWdlcyBvZiB1c2luZyBQb3J0cyBpbmNsdWRlOg0KDQoq IFNhZmVyIHRoYW4gY2hhbm5lbHMgaW4gcHJhY3RpY2UNCiAgKiBXaGVuIHVzaW5nIGEgUG9ydCwg aWYgYCNzZW5kYCBzdWNjZWVkcywgaXQgbWVhbnMgdGhlIGRlc3RpbmF0aW9uIFJhY3RvciBpcyBz dGlsbCBhbGl2ZSAoaS5lLiwgaXQncyBydW5uaW5nKS4NCiAgKiBJbiBjb250cmFzdCwgd2l0aCBh IGNoYW5uZWwsIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgYW55IFJhY3RvciBpcyBzdGlsbCBh dmFpbGFibGUgdG8gcmVjZWl2ZSBmcm9tIGl0Lg0KICAqIE9mIGNvdXJzZSwgZXZlbiB3aXRoIGEg cG9ydCwgdGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCB0aGUgZGVzdGluYXRpb24gUmFjdG9yIHdp bGwgYWN0dWFsbHkgcHJvY2VzcyB0aGUgbWVzc2FnZSDigJQgaXQgbWlnaHQgaWdub3JlIGl0Lg0K ICAqIEJ1dCBhdCBsZWFzdCB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgUmFjdG9y IGhhdmluZyBhbHJlYWR5IHRlcm1pbmF0ZWQgdW5leHBlY3RlZGx5Lg0KICAqIEluIG90aGVyIHdv cmRzLCB1c2luZyBhIHBvcnQgZWxpbWluYXRlcyBvbmUgbWFqb3IgZmFpbHVyZSBjYXNlLCBtYWtp bmcgdGhlIGNvbW11bmljYXRpb24gbW9kZWwgbW9yZSBwcmVkaWN0YWJsZS4NCiAgKiBUaGlzIGlz IG9uZSBvZiB0aGUgcmVhc29ucyB3aHkgUnVieSB3ZW50IHdpdGggdGhlICJBY3RvciIgbW9kZWwg KGhlbmNlIHRoZSBuYW1lIFJhY3RvciksIGluc3RlYWQgb2YgdGhlICJDU1AiIG1vZGVsLg0KKiBG YXN0ZXIgdGhhbiBjaGFubmVscyBpbiBib3RoIGNyZWF0aW9uIGFuZCBtZXNzYWdlIHRyYW5zbWlz c2lvbg0KICAqIFdoZW4gY3JlYXRpbmcgYSBjaGFubmVsLCB3ZSBuZWVkIHRvIHByZXBhcmUgYSBj b250YWluZXIgZGF0YSBzdHJ1Y3R1cmUuIFdoZW4gY3JlYXRpbmcgYSBwb3J0LCBpdCBpcyBsaWdo dHdlaWdodCBkYXRhIChhIHBhaXIgb2YgUmFjdG9yIGFuZCBuZXdseSBjcmVhdGVkIElEKS4NCiAg KiBPbiB0aGUgY2hhbm5lbCB0cmFuc21pc3Npb24sIHdlIG5lZWQgY29weWluZyBhIGRhdGEgdG8g Y2hhbm5lbCBhbmQgYSBjb3B5aW5nIHRvIHRoZSByZWNlaXZpbmcgcmFjdG9yLiBPbiB0aGUgcG9y dCwgaXQgb25seSBuZWVkcyB0byBjb3B5IGZyb20gdGhlIHNyYyByYWN0b3IgdG8gdGhlIGRzdCBy YWN0b3IuIFRoaXMgaXNzdWUgYmVjb21lcyBtb3JlIHNpZ25pZmljYW50IGR1ZSB0byBSYWN0b3It bG9jYWwgZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZCBpc29sYXRpb24gb2Ygb2JqZWN0IHNwYWNlcy4N CiogRWFzeSB0byBpbXBsZW1lbnQuIFdlIG9ubHkgbmVlZCB0byBpbXBsZW1lbnQgYFBvcnQjcmVj ZWl2ZWAgdG8gc3luY2hyb25pemUgd2l0aCBvdGhlciByYWN0b3JzLg0KICAqIGAjc2VuZC8ucmVj ZWl2ZWAgaXMgZWFzeSB0byBpbXBsZW1lbnQgYmVjYXVzZSB3ZSBvbmx5IG5lZWQgdG8gbG9jayB0 aGUgcmVjZWl2aW5nIHJhY3Rvci4NCiAgKiBgLnlpZWxkLyN0YWtlYCBpcyBub3QgZWFzeSB0byBp bXBsZW1lbnQgYmVjYXVzZSB3ZSBuZWVkIHRvIGxvY2sgdGFraW5nIGFuZCByZWNlaXZpbmcgcmFj dG9ycyBiZWNhdXNlIGl0IGlzIHJlbmRlenZvdXMgc3R5bGUgc3luY2hyb25pemF0aW9uLg0KICAq IGAuc2VsZWN0YCBpcyBESUZGSUNVTFQgdG8gc3VwcG9ydCBjdXJyZW50IHNwZWMuIE5vdyBDSSBp c24ndCBzdGFibGUgeWV0Lg0KICAqIEEgc2ltcGxlciBzcGVjIHJlZHVjZXMgYnVncywgYW5kIG1h eWJlIGxlYWRzIHRvIGZhc3RlciBpbXBsZW1lbnRhdGlvbi4NCg0KRGlzYWR2YW50YWdlczoNCg0K MS4gSXQgaXMgbm90IGEgd2VsbC1rbm93biBjb25jZXB0LCBlc3BlY2lhbGx5IGZvciBHbyBsYW5n dWFnZSB1c2Vycy4NCjIuIFdlIG5lZWQgYWRkaXRpb25hbCBhYnN0cmFjdGlvbiBsaWtlIHByb2R1 Y2VyKHMpLWNvbnN1bWVyKHMpIGNvbmN1cnJlbnQgYXBwbGljYXRpb25zLg0KDQpGb3IgKDIpLCBJ IHdhbnQgdG8gaW50cm9kdWNlIGFuIGV4YW1wbGUgY29kZS4gV2UgY2FuIHdyaXRlIGEgMS1wcm9k dWNlciwgbXVsdGlwbGUtY29uc3VtZXIgcGF0dGVybiB3aXRoIGEgY2hhbm5lbC4NCg0KYGBgcnVi eQ0KIyBjaGFubmVsIHZlcnNpb24gb2YgMSBwcm9kdWNlciAmIGNvbnN1bWVycw0KDQpjaCA9IG5l d19jaGFubmVsDQoNClJOID0gMTAgIyBtYWtlIDEwIGNvbnN1bWVycw0KDQpjb25zdW1lcnMgPSBS Ti50aW1lcy5tYXAgZG8NCiAgUmFjdG9yLm5ldyBjaCBkbw0KICAgIHdoaWxlIHBhcmFtID0gY2gu cmVjZWl2ZQ0KICAgICAgdGFzayhwYXJhbSkNCiAgICBlbmQNCiAgZW5kDQplbmQNCg0KdGFza3Mu ZWFjaCBkbyB8dGFza3wNCiAgY2ggPDwgdGFzaw0KZW5kDQpgYGANCg0KV2l0aCBQb3J0LCB3ZSBu ZWVkIHRvIGludHJvZHVjZSBhIGxvYWQgYmFsYW5jaW5nIG1lY2hhbmlzbToNCg0KYGBgcnVieQ0K IyBQb3J0IHZlcnNpb24gb2YgMSBwcm9kdWNlciAmIGNvbnN1bWVycw0KDQpjb250cm9sX3BvcnQg PSBSYWN0b3I6OlBvcnQubmV3DQpjb25zdW1lcnMgPSBSTi50aW1lcy5tYXAgZG8NCiAgUmFjdG9y Lm5ldyBjb250cm9sX3BvcnQgY29udHJvbF9wb3J0IGRvIHxjb250cm9sX3BvcnR8DQogICAgd2hp bGUgdHJ1ZQ0KICAgICAgY29udHJvbF9wb3J0IDw8IFs6cmVhZHksIFJhY3Rvci5jdXJyZW50XSAj IHJlZ2lzdGVyIC0gcmVhZHkNCiAgICAgIHBhcmFtID0gUmFjdG9yLnJlY2VpdmUgIyBpdCBhc3N1 bWVzIHRhc2sgZG9lc24ndCB1c2UgUmFjdG9yLnJlY2VpdmUNCiAgICAgIHRhc2socGFyYW0pDQog ICAgZW5kDQogIGVuZA0KZW5kDQoNCnRhc2tzLmVhY2ggZG8gfHRhc2t8DQogIGNvbnRyb2xfcG9y dC5yZWNlaXZlID0+IFs6cmVhZHksIGNvbnN1bWVyXQ0KICANCiAgIyBzZW5kIGEgdGFzayB0byBh IHJlYWR5IGNvbnN1bWVyDQogIGNvbnN1bWVyIDw8IHRhc2sNCmVuZA0KYGBgDQoNCk9mIGNvdXJz ZSB3ZSBjYW4gbWFrZSBhIGxpYnJhcnkgZm9yIHRoYXQgKGxpa2UgT1RQIG9uIEVybGFuZykuDQoN CiMjIyBEZWZhdWx0IHBvcnQgb2YgUmFjdG9ycw0KDQpFYWNoIFJhY3RvciBoYXMgYSBkZWZhdWx0 IHBvcnQgYW5kIGBSYWN0b3Ijc2VuZGAgaXMgZXF1YWwgdG8gYFJhY3Rvci5jdXJyZW50LmRlZmF1 bHRfcG9ydCNzZW5kYC4gT2YgY291cnNlLCBgUmFjdG9yLnJlY2VpdmVgIGlzIGVxdWFsIHRvIGBS YWN0b3IuY3VycmVudC5kZWZhdWx0X3BvcnQucmVjZWl2ZWAuDQoNCkZvciB0aGUgc2ltcGxlIGNh c2UsIHdlIGNhbiBrZWVwIHRvIHVzZSBgUmFjdG9yI3NlbmRgIGFuZCBgUmFjdG9yLnJlY2VpdmVg DQoNCiMjIyBEZXByZWNhdGlvbiBvZiBSYWN0b3IjdGFrZSBhbmQgUmFjdG9yLnlpZWxkDQoNCldp dGggdGhlIFBvcnQgY29uY2VwdCwgd2UgY2FuIGZvY3VzIHNvbGVseSBvbiBzZW5kIGFuZCByZWNl aXZl4oCUdGhhdCBpcywgZGlyZWN0IG1hbmlwdWxhdGlvbiBvZiBhIFJhY3RvcuKAmXMgbWFpbGJv eC4gUG9ydHMgcHJvdmlkZSBhIGNsZWFuIGFuZCBmdW5jdGlvbmFsIGFsdGVybmF0aXZlIHRvIGBS YWN0b3IjdGFrZWAgYW5kIGBSYWN0b3IueWllbGRgLCBtYWtpbmcgdGhlbSB1bm5lY2Vzc2FyeSBp biBtb3N0IHVzZSBjYXNlcy4NCg0KTW9yZW92ZXIsIFBvcnRzIGFyZSBzaWduaWZpY2FudGx5IGVh c2llciB0byBpbXBsZW1lbnQsIGFzIHRoZXkgcmVxdWlyZSBvbmx5IGxvY2tpbmcgdGhlIHJlY2Vp dmluZyBSYWN0b3IsIHdoaWxlIHlpZWxkL3Rha2UgaW52b2x2ZSBjb21wbGV4IHJlbmRlenZvdXMt c3R5bGUgc3luY2hyb25pemF0aW9uLiBCeSByZW1vdmluZyB0aGVzZSBwcmltaXRpdmVzLCB3ZSBj YW4gc2ltcGxpZnkgdGhlIHNwZWNpZmljYXRpb24gYW5kIHJlZHVjZSBpbXBsZW1lbnRhdGlvbiBj b21wbGV4aXR54oCUZXNwZWNpYWxseSBhcm91bmQgZmVhdHVyZXMgbGlrZSBgUmFjdG9yLnNlbGVj dGAsIHdoaWNoIGFyZSBub3RvcmlvdXNseSBoYXJkIHRvIGdldCByaWdodC4NCg0KIyMjIGBSYWN0 b3Iuc2VsZWN0YCB3aXRoIHBvcnRzDQoNCldlIHNob3VsZCB3YWl0IGZvciBtdWx0aXBsZSBwb3J0 IHNpbXVsdGFuZW91c2x5IHNvIGBSYWN0b3Iuc2VsZWN0KClgIHNob3VsZCBhY2NlcHQgcG9ydHMu IE5vdyBgUmFjdG9yLnNlbGVjdCgpYCBjYW4gYWxzbyByZWNlaXZpbmcgYW5kIHlpZWxkaW5nIHRo ZSB2YWx1ZSwgYnV0IGlmIHdlIHJlbW92ZSB0aGUgYCN0YWtlYCBmdW5jdGlvbmFsaXR5LCBgUmFj dG9yLnNlbGVjdGAgb25seSBuZWVkIHRvIHN1cHBvcnQgcG9ydHMuDQoNCiMjIyBXYWl0IGZvciB0 ZXJtaW5hdGlvbg0KDQpgUmFjdG9yI3Rha2VgIGlzIGRlc2lnbmVkIGZyb20gYW4gaWRlYSBvZiBn ZXR0aW5nIHRlcm1pbmF0aW9uIHJlc3VsdCAobGlrZSBgVGhyZWFkI3ZhbHVlYCkuIEZvciB0aGlz IHB1cnBvc2UsIHdlIGNhbiBpbnRyb2R1Y2UgYFJhY3RvciNqb2luYCBvciBgUmFjdG9yI3ZhbHVl YCBsaWtlIFRocmVhZHMgb3Igd2UgY2FuIGtlZXAgdGhlIG5hbWUgYFJhY3RvciN0YWtlYCBmb3Ig dGhpcyBwdXJwb3NlLg0KDQpXZSBjYW4gbWFrZSBgUmFjdG9yI2pvaW5gIGFzIGEgZm9sbG93aW5n IHBzZXVkby1jb2RlOg0KDQpgYGBydWJ5DQpjbGFzcyBSYWN0b3INCiAgZGVmIGpvaW4gIyB3YWl0 IGZvciB0aGUgdGVybWluYXRpb24NCiAgICBtb25pdG9yIHBvcnQgPSBQb3J0Lm5ldw0KICAgIHBv cnQucmVjZWl2ZQ0KICBlbnN1cmUNCiAgICBtb25pdG9yIG5pbCAjIHVucmVnaXN0ZXIgLyBpdCBz aG91bGQgYmUgZGlzY3Vzc2VkDQogIGVuZA0KICANCiAgIyB3aGVuIHRoaXMgcmFjdG9yIHRlcm1p bmF0ZXMsIHNlbmQgYSBtZXNzYWdlIHRvIHRoZSByZWdpc3RlcmVkIHBvcnQNCiAgZGVmIG1vbml0 b3IgcG9ydA0KICAgIEBtb25pdG9yX3BvcnQgPSBwb3J0DQogIGVuZA0KICANCiAgcHJpdmF0ZSBk ZWYgYXRleGl0DQogICAgQG1vbml0b3JfcG9ydCA8PCB0ZXJtaW5hdGlvbl9tZXNzYWdlDQogIGVu ZA0KZW5kDQoNCiMgdGhlcmUgYXJlIHNvbWUgcXVlc3Rpb25zLg0KIyAqIGNhbiB3ZSByZWdpc3Rl ciBtdWx0aXBsZSBwb3J0cz8NCiMgKiBzaG91bGQgd2Ugc3VwcG9ydCBgI2pvaW5gIGFuZCBgI3Zh bHVlYCBsaWtlIHRocmVhZHM/DQojICAgb3Igc2hvdWxkIHdlIHN1cHBvcnQgb25seSBgI2pvaW5g IHRvIHJldHVybiB0aGUgdmFsdWU/DQojICogb3Iga2VlcCB0aGlzIG5hbWUgYXMgYCN0YWtlYD8N Cg0KDQpSYWN0b3IubmV3IGRvDQogIDQyDQplbmQuam9pbiAjPT4gNDIgKG9yIHRydWU/KQ0KYGBg DQoNCkl0IGlzIHZlcnkgc2ltaWxhciB0byBgbW9uaXRvcmAgaW4gRXJsYW5nIG9yIEVsaXhpci4N CldlIGNhbiBhbHNvIG1ha2UgYSBzdXBlcnZpc29yIGluIEVybGFuZyBsaWtlIHRoYXQ6DQoNCmBg YHJ1YnkNCnN2X3BvcnQgPSBSYWN0b3I6OlBvcnQubmV3DQoNCnJzID0gTi50aW1lcy5tYXAgZG8N CiAgUmFjdG9yLm5ldyBkbw0KICAgIGRvX3NvbWV0aGluZygpDQogIGVuZC5tb25pdG9yIHN2X3Bv cnQNCmVuZA0KDQp3aGlsZSB0ZXJtaW5hdGlvbl9ub3RpY2UgPSBzdl9wb3J0LnJlY2VpdmUNCiAg cCB0ZXJtaW5hdGlvbl9ub3RpY2UNCmVuZA0KDQojIFdpdGggUmFjdG9yI3Rha2UsIHdlIGNhbiB3 cml0ZSBzaW1pbGFyIGNvZGUgaWYgdGhlcmUgaXMgbm8gUmFjdG9yLnlpZWxkDQoNCnJzID0gTi50 aW1lcy5tYXAgZG8NCiAgUmFjdG9yLm5ldyBkbw0KICAgIGRvX3NvbWV0aGluZygpDQogIGVuZA0K ZW5kDQoNCndoaWxlIHIsIG1zZyA9IFJhY3Rvci5zZWxlY3QoKnJzKQ0KICBwIFtyLCBtc2ddDQpl bmQNCmBgYA0KDQojIyBEaXNjdXNzaW9uDQoNCiMjIyBgc2VuZGAgd2l0aCB0YWcgKHN5bWJvbHMp DQoNCklmIHdlIGZvcmNlIHVzZXJzIHRvIHNlbmQgYSB0YWdnZWQgbWVzc2FnZSBldmVyeSB0aW1l LCB3ZSBjYW4gYWNoaWV2ZSB0aGUgc2FtZSBlZmZlY3QgYXMgUG9ydCBjb25jZXB0LCBiZWNhdXNl IGEgUG9ydCBjYW4gYmUgdGhvdWdodCBvZiBhcyBhIGNvbWJpbmF0aW9uIG9mIGEgdGFnIGFuZCBh IGRlc3RpbmF0aW9uIFJhY3Rvci4NCg0KYGBgcnVieQ0KciA9IFJhY3Rvci5uZXcgZG8NCiAgbG9v cCBkbw0KICAgIHRhZywgbXNnID0gUmFjdG9yLnJlY2VpdmUgIyByZXR1cm4gMiB2YWx1ZXMNCiAg ICBjYXNlIHRhZw0KICAgIHdoZW4gOlRBRw0KICAgICAgcCBbdGFnLCBtc2ddDQogICAgZWxzZQ0K ICAgICAgIyBpZ25vcmUNCiAgICBlbmQNCiAgZW5kDQplbmQNCg0Kci5zZW5kIDpUQUcsIDQyDQpy LnNlbmQgOlRBR0UsIDg0ICMgdGhpcyB0eXBvIGFuZCB0aGUgbWVzc2FnZSBpcyBzaWxlbnRseSBp Z25vcmVkDQpgYGANCg0KSG93ZXZlciBpdCBoYXMgdHdvIGlzc3VlczoNCg0KKiBJZiB3ZSBtYWtl IGEgdHlwbyBpbiB0YWcgbmFtZSwgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBzaWxlbnRseSBpZ25vcmVk Lg0KKiBUaGUgdGFnIG5hbWUgbWF5IGNvbmZsaWN0IHdpdGggdW5yZWxhdGVkIGNvZGVzIChsaWJy YXJpZXMpDQoNCiMjIyBgUmFjdG9yLnlpZWxkYCBhbmQgYFJhY3RvciN0YWtlYCB3aXRoIGNoYW5u ZWwgcmFjdG9yDQoNCklmIHdlIHdhbnQgdG8gbGVhdmUgdGhlIGAueWllbGRgIGFuZCBgI3Rha2Vg LCB3ZSBjYW4gZW11bGF0ZSB0aGVtIHdpdGggY2hhbm5lbCByYWN0b3IuDQoNCmBgYHJ1YnkNCmNs YXNzIFJhY3Rvcg0KICBkZWYgaW5pdGlhbGl6ZQ0KICAgIEB5aWVsZF9yYWN0b3IgPSBSYWN0b3Iu bmV3IGRvDQogICAgICB0YWtlcnMgPSBbXQ0KICAgICAgd2hpbGUgdGFnLCBtc2cgPSBSYWN0b3Iu cmVjZWl2ZQ0KICAgICAgICBjYXNlIHRhZw0KICAgICAgICB3aGVuIDpyZWdpc3Rlcg0KICAgICAg ICAgIEB0YWtlcnMgPDwgbXNnDQogICAgICAgIHdoZW4gOnVucmVnaXN0ZXINCiAgICAgICAgICBA dGFrZXJzLmRlbGV0ZSBtc2cNCiAgICAgICAgd2hlbiA6eWllbGQNCiAgICAgICAgICBAdGFrZXJz LnBvcCA8PCBtc2cNCiAgICAgICAgZW5kDQogICAgICBlbmQNCiAgICBlbmQNCiAgZW5kDQoNCiAg ZGVmIHNlbGYueWllbGQgb2JqDQogICAgQHlpZWxkX3JhY3RvciA8PCBbOnlpZWxkLCBvYmpdDQog IGVuZA0KDQogIGRlZiB0YWtlDQogICAgQHlpZWxkX3JhY3RvciA8PCBbOnJlZ2lzdGVyLCBwb3J0 ID0gUmFjdG9yOjpQb3J0Lm5ld10NCiAgICBwb3J0LnJlY2VpdmUNCiAgZW5zdXJlDQogICAgQHlp ZWxkX3JhY3RvciA8PCBbOnVucmVnaXN0ZXIsIHBvcnRdDQogIGVuZA0KZW5kDQpgYGANCg0KIyMj IE9wZW5pbmcgYW5kIGNsb3NpbmcgdGhlIHBvcnQNCg0KVGhpcyBwcm9wb3NhbCBkb2Vzbid0IGNv bnRhaW4gb3BlbmluZyBhbmQgY2xvc2luZyB0aGUgcG9ydCwgYnV0IHdlIGNhbiBkaXNjdXNzIGFi b3V0IGl0LiBUbyBpbnRyb2R1Y2UgdGhpcyBhdHRyaWJ1dGUsIHdlIG5lZWQgdG8gbWFuYWdlIHdo aWNoIHBvcnRzICh0YWdzKSBhcmUgb3BlbmluZy4NCg0KIyMgSW1wbGVtZW50YXRpb24NCg0KTm93 IHRoZSBuYXRpdmUgaW1wbGVtZW50YXRpb24gaXMgbm90IGZpbmlzaGVkLCBidXQgd2UgY2FuIGlt cGxlbWVudCBpdCB1c2luZyB0aGUgYFJhY3Rvci5yZWNlaXZlX2lmYCBtZWNoYW5pc20sIHNvIHdl IGVzdGltYXRlIHRoYXQgb25seSBhIGZldyB3ZWVrcyBvZiB3b3JrIGFyZSBuZWVkZWQgdG8gY29t cGxldGUgaXQuDQoNCiMjIFN1bW1hcnkNCg0KVGhpcyBwcm9wb3NhbCBpbnRyb2R1Y2VzIHRoZSBm b2xsb3dpbmcgZmVhdHVyZXMgYW5kIGRlcHJlY2F0aW9ucy4NCg0KKiBgUmFjdG9yOjpQb3J0YA0K ICAqIGBQb3J0I3NlbmQobXNnKWAg4oCTIHNlbmRzIGEgbWVzc2FnZSB0byB0aGUgY3JlYXRvciBv ZiB0aGUgcG9ydC4NCiAgKiBgUG9ydCNyZWNlaXZlYCDigJMgcmVjZWl2ZXMgYSBtZXNzYWdlIGZy b20gdGhlIHBvcnQuDQogICogQSBwb3J0IGlzIGEgbGlnaHR3ZWlnaHQgZGF0YSBzdHJ1Y3R1cmUg KGEgcGFpciBvZiBhIFJhY3RvciBhbmQgYSB0YWcpLg0KKiBgUmFjdG9yI2pvaW5gIG9yIGBSYWN0 b3IjdmFsdWVgIOKAkyB0byB3YWl0IGZvciBSYWN0b3IgdGVybWluYXRpb24gKGxpa2UgYFRocmVh ZCNqb2luYCkNCiogYFJhY3RvciNtb25pdG9yYCDigJMgdG8gb2JzZXJ2ZSB3aGVuIGFub3RoZXIg UmFjdG9yIHRlcm1pbmF0ZXMNCiogRGVwcmVjYXRpb25zOg0KICAqIGBSYWN0b3IjdGFrZWANCiAg KiBgUmFjdG9yLnlpZWxkYA0KICAqIGBSYWN0b3IucmVjZWl2ZV9pZmANCg0KVGhhbmsgeW91IGZv ciByZWFkaW5nIHRoaXMgbG9uZyBwcm9wb3NhbC4gSWYgeW91IGhhdmUgYW55IHVzZSBjYXNlcyB0 aGF0IGNhbm5vdCBiZSBhZGRyZXNzZWQgd2l0aCBgUmFjdG9yOjpQb3J0YCwgSSdkIGxvdmUgdG8g aGVhciB0aGVtLg0KDQoNClAuUy4gVGhhbmtzIHRvIG1hbWUgZm9yIHJldmlld2luZyB0aGlzIHBy b3Bvc2FsIGFuZCBzdWdnZXN0aW5nIHRoYXQgSSB1c2UgQ2hhdEdQVCB0byBpbXByb3ZlIHRoZSB3 cml0aW5nLg0KDQoNCg0KLS0gDQpodHRwczovL2J1Z3MucnVieS1sYW5nLm9yZy8NCiBfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiBydWJ5LWNvcmUgbWFpbGlu ZyBsaXN0IC0tIHJ1YnktY29yZUBtbC5ydWJ5LWxhbmcub3JnCiBUbyB1bnN1YnNjcmliZSBzZW5k IGFuIGVtYWlsIHRvIHJ1YnktY29yZS1sZWF2ZUBtbC5ydWJ5LWxhbmcub3JnCiBydWJ5LWNvcmUg aW5mbyAtLSBodHRwczovL21sLnJ1YnktbGFuZy5vcmcvbWFpbG1hbjMvbGlzdHMvcnVieS1jb3Jl Lm1sLnJ1YnktbGFuZy5vcmcv