[ruby-core:105862] [Ruby master Feature#18020] Introduce `IO::Buffer` for fiber scheduler.
From:
"ioquatix (Samuel Williams)" <noreply@...>
Date:
2021-10-29 01:26:16 UTC
List:
ruby-core #105862
SXNzdWUgIzE4MDIwIGhhcyBiZWVuIHVwZGF0ZWQgYnkgaW9xdWF0aXggKFNhbXVlbCBXaWxsaWFt cykuCgoKQG1hdHogeW91IHNhaWQgeW91IGFyZSBwb3NpdGl2ZSBvbiB0aGlzIGZlYXR1cmUuIENh biB5b3UgY29uZmlybSB0aGF0IHdlIGNhbiBtZXJnZSB0aGlzIFBSPyBFdmVuIHdlIGNhbiBtYXJr IGl0IGFzIGV4cGVyaW1lbnRhbCwgYnV0IGl0IHdvdWxkIGJlIGdyZWF0IHRvIHN0YXJ0IHRlc3Rp bmcgd2l0aCAzLjEgcHJldmlldyByZWxlYXNlLgoKQGFrciBJIGJlbGlldmUgd2UgYWRkcmVzc2Vk IHlvdXIgY29uY2VybnMgcHJldmVudGluZyBtb2RpZnlpbmcgYnVmZmVyIHdoaWxlIGl0J3MgaW4g dXNlIGJ5IE9TIGJ5IHByZXZlbnRpbmcgUnVieSBmcm9tIGNhbGxpbmcgIiN1bmxvY2siLiBEbyB5 b3UgaGF2ZSBhbnkgb3RoZXIgY29uY2VybnM/IEV2ZW4gaWYgeW91IGNhbid0IGVudW1lcmF0ZSBp dCBhbGwgbm93LCB3ZSBjYW4gdHJ5IHdpdGggUnVieSAzLjEgcHJldmlldyByZWxlYXNlIGFuZCBh ZGRyZXNzIGFueSBmdXJ0aGVyIGNvbmNlcm5zIG92ZXIgdGhlIG5leHQgZmV3IG1vbnRocy4KClRo YW5rcyBldmVyeW9uZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K RmVhdHVyZSAjMTgwMjA6IEludHJvZHVjZSBgSU86OkJ1ZmZlcmAgZm9yIGZpYmVyIHNjaGVkdWxl ci4KaHR0cHM6Ly9idWdzLnJ1YnktbGFuZy5vcmcvaXNzdWVzLzE4MDIwI2NoYW5nZS05NDQwMAoK KiBBdXRob3I6IGlvcXVhdGl4IChTYW11ZWwgV2lsbGlhbXMpCiogU3RhdHVzOiBPcGVuCiogUHJp b3JpdHk6IE5vcm1hbAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkFm dGVyIGNvbnRpbnVpbmcgdG8gYnVpbGQgb3V0IHRoZSBmaWJlciBzY2hlZHVsZXIgaW50ZXJmYWNl IGFuZCB0aGUgc3BlY2lmaWMgaG9va3MgcmVxdWlyZWQgZm9yIGBpb191cmluZ2AsIEkgZm91bmQg c29tZSB0cm91YmxlIHdpdGhpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgYElPYC4KCkkgZm91bmQg dGhhdCBpbiBzb21lIGNhc2VzLCB3ZSBuZWVkIHRvIHJlYWQgaW50byB0aGUgaW50ZXJuYWwgSU8g YnVmZmVycyBkaXJlY3RseS4gSSB0cmllZCBjcmVhdGluZyBhICJmYWtlIHN0cmluZyIgaW4gb3Jk ZXIgdG8gdHJhbnNpdCBiYWNrIGludG8gdGhlIFJ1YnkgZmliZXIgc2NoZWR1bGVyIGludGVyZmFj ZSBhbmQgdGhpcyBkaWQgd29yayB0byBhIGNlcnRhaW4gZXh0ZW50LCBidXQgSSB3YXMgdG9sZCB3 ZSBjYW5ub3QgZXhwb3NlIGZha2Ugc3RyaW5nIHRvIFJ1Ynkgc2NoZWR1bGVyIGludGVyZmFjZS4K ClNvLCBhZnRlciB0aGlzLCBhbmQgbWFueSBvdGhlciBmcnVzdHJhdGlvbnMgd2l0aCB1c2luZyBg U3RyaW5nYCBhcyBhIElPIGJ1ZmZlciwgSSBkZWNpZGVkIHRvIGltcGxlbWVudCBhIGxvdyBsZXZl bCBgSU86OkJ1ZmZlcmAgYmFzZWQgb24gbXkgbmVlZHMgZm9yIGhpZ2ggcGVyZm9ybWFuY2UgSU8s IGFuZCBhcyBwYXJ0IG9mIHRoZSBmaWJlciBzY2hlZHVsZXIgaW50ZXJmYWNlLgoKSGVyZSBpcyBy b3VnaGx5IHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhlIHNjaGVkdWxlciB3LnIudC4g dGhlIGJ1ZmZlcjoKCmBgYHJ1YnkKY2xhc3MgU2NoZWR1bGVyCiAgIyBAcGFyYW1ldGVyIGJ1ZmZl ciBbSU86OkJ1ZmZlcl0gQnVmZmVyIGZvciByZWFkaW5nIGludG8uCiAgZGVmIGlvX3JlYWQoaW8s IGJ1ZmZlciwgbGVuZ3RoKQogICAgIyBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBgcmVhZGAg c3lzdGVtIGNhbGwsIElPX1VSSU5HX1JFQURWLCBldGMuCiAgZW5kCgogICMgQHBhcmFtZXRlciBi dWZmZXIgW0lPOjpCdWZmZXJdIEJ1ZmZlciBmb3Igd3JpdGluZyBmcm9tLgogIGRlZiBpb193cml0 ZShpbywgYnVmZmVyLCBsZW5ndGgpCiAgICAjIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IGB3 cml0ZWAgc3lzdGVtIGNhbGwsIElPX1VSSU5HX1dSSVRFViwgZXRjLgogIGVuZAoKICAjIFBvdGVu dGlhbCBuZXcgaG9va3MgKFNvY2tldCNyZWN2bXNnLCBzZW5kbXNnLCBldGMpOgogIGRlZiBpb19y ZWN2bXNnKGlvLCBidWZmZXIsIGxlbmd0aCkKICBlbmQKZW5kCmBgYAoKSW4gcmV2aWV3aW5nIG90 aGVyIGxhbmd1YWdlIGRlc2lnbnMsIEkgZm91bmQgdGhhdCB0aGlzIGRlc2lnbiBpcyB2ZXJ5IHNp bWlsYXIgdG8gQ3J5c3RhbCdzIElPIGJ1ZmZlcmluZyBzdHJhdGVneS4KClRoZSBwcm9wb3NlZCBp bXBsZW1lbnRhdGlvbiBwcm92aWRlcyBlbm91Z2ggb2YgYW4gaW50ZXJmYWNlIHRvIGltcGxlbWVu dCBib3RoIG5hdGl2ZSBzY2hlZHVsZXJzIGFzIHdlbGwgYXMgcHVyZSBSdWJ5IHNjaGVkdWxlcnMu IEl0IGFsc28gcHJvdmlkZXMgc29tZSBleHRyYSBmdW5jdGlvbmFsaXR5IGZvciBpbnRlcnByZXRp bmcgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlci4gVGhpcyBpcyBtb3N0bHkgZm9yIHRlc3RpbmcgYW5k IGV4cGVyaW1lbnRhdGlvbiwgYWx0aG91Z2ggaXQgbWlnaHQgbWFrZSBzZW5zZSB0byBleHBvc2Ug dGhpcyBpbnRlcmZhY2UgZm9yIGJpbmFyeSBwcm90b2NvbHMgbGlrZSBIVFRQLzIsIFFVSUMsIFdl YlNvY2tldHMsIGV0Yy4KCiMjIFByb3Bvc2VkIFNvbHV0aW9uCgpXZSBpbnRyb2R1Y2UgbmV3IGNs YXNzIGBJTzo6QnVmZmVyYC4KCmBgYHJ1YnkKY2xhc3MgSU86OkJ1ZmZlcgogICMgQHJldHVybnMg W0lPOjpCdWZmZXJdIEEgYnVmZmVyIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgZGF0 YS4KICBkZWYgc2VsZi5mb3Ioc3RyaW5nKQogIGVuZAoKICBQQUdFX1NJWkUgPSAjIC4uLiBvcGVy YXRpbmcgc3lzdGVtIHBhZ2Ugc2l6ZQoKICAjIEByZXR1cm5zIFtJTzo6QnVmZmVyXSBBIGJ1ZmZl ciB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBtYXBwZWQgdG8gbWVtb3J5LgogIGRlZiBz ZWxmLm1hcChmaWxlKQogIGVuZAoKICAjIEZsYWdzIGZvciBidWZmZXIgc3RhdGUuCiAgRVhURVJO QUwgPSAjIFRoZSBidWZmZXIgaXMgZnJvbSBleHRlcm5hbCBtZW1vcnkuCiAgSU5URVJOQUwgPSAj IFRoZSBidWZmZXIgaXMgZnJvbSBpbnRlcm5hbCBtZW1vcnkgKG1hbGxvYykuCiAgTUFQUEVEID0g IyBUaGUgYnVmZmVyIGlzIGZyb20gbWFwcGVkIG1lbW9yeSAobW1hcCwgVmlydHVhbEFsbG9jLCBl dGMpCiAgTE9DS0VEID0gIyBUaGUgYnVmZmVyIGlzIGxvY2tlZCBmb3IgdXNhZ2UgKGNhbm5vdCBi ZSByZXNpemVkKQogIFBSSVZBVEUgPSAjIFRoZSBidWZmZXIgaXMgbWFwcGVkIGFzIGNvcHktb24t d3JpdGUuCiAgSU1NVVRBQkxFID0gIyBUaGUgYnVmZmVyIGNhbm5vdCBiZSBtb2RpZmllZC4KCiAg IyBAcmV0dXJucyBbSU86OkJ1ZmZlcl0gQSBidWZmZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHNpemUs IGFsbG9jYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGZsYWdzLgogIGRlZiBpbml0aWFsaXpl KHNpemUsIGZsYWdzKQogIGVuZAoKICAjIEByZXR1cm5zIFtJbnRlZ3JhbF0gVGhlIHNpemUgb2Yg dGhlIGJ1ZmZlcgogIGF0dHIgOnNpemUKCiAgIyBAcmV0dXJucyBbU3RyaW5nXSBBIGJyaWVmIHN1 bW1hcnkgYW5kIGhleCBkdW1wIG9mIHRoZSBidWZmZXIuCiAgZGVmIGluc3BlY3QKICBlbmQKCiAg IyBAcmV0dXJucyBbU3RyaW5nXSBBIGJyaWVmIHN1bW1hcnkgb2YgdGhlIGJ1ZmZlci4KICBkZWYg dG9fcwogIGVuZAoKICAjIEZsYWcgcHJlZGljYXRlczoKICBkZWYgZXh0ZXJuYWw/CiAgZW5kCgog IGRlZiBpbnRlcm5hbD8KICBlbmQKCiAgZGVmIG1hcHBlZD8KICBlbmQKCiAgZGVmIGxvY2tlZD8K ICBlbmQKCiAgZGVmIGltbXV0YWJsZT8KICBlbmQKCiAgIyBGbGFncyBmb3IgZW5kaWFuL2J5dGUg b3JkZXI6CiAgTElUVExFX0VORElBTiA9ICMgLi4uCiAgQklHX0VORElBTiA9ICMgLi4uCiAgSE9T VF9FTkRJQU4gPSAjIC4uLgogIE5FVFdPUktfRU5ESUFOPSAjIC4uLgoKICAjIExvY2sgdGhlIGJ1 ZmZlciAocHJldmVudCByZXNpemUsIHVubWFwLCBjaGFuZ2VzIHRvIGJhc2UgYW5kIHNpemUpLgog IGRlZiBsb2NrCiAgICByYWlzZSAiQWxyZWFkeSBsb2NrZWQhIiBpZiBmbGFncyAmIExPQ0tFRAog ICAgCiAgICBmbGFncyB8PSBMT0NLRUQKICBlbmQKCiAgIyBVbmxvY2sgdGhlIGJ1ZmZlci4KICBk ZWYgdW5sb2NrCiAgICByYWlzZSAiTm90IGxvY2tlZCEiIHVubGVzcyBmbGFncyAmIExPQ0tFRAog ICAgCiAgICBmbGFncyB8PSB+TE9DS0VECiAgZW5kCgogIC8vIE1hbmlwdWxhdGlvbjoKICAjIEBy ZXR1cm5zIFtJTzo6QnVmZmVyXSBBIHNsaWNlIG9mIHRoZSBidWZmZXIncyBkYXRhLiBEb2VzIG5v dCBjb3B5LgogIGRlZiBzbGljZShvZmZzZXQsIGxlbmd0aCkKICBlbmQKCiAgIyBAcmV0dXJucyBb U3RyaW5nXSBBIGJpbmFyeSBzdHJpbmcgc3RhcnRpbmcgYXQgb2Zmc2V0LCBsZW5ndGggYnl0ZXMu CiAgZGVmIHRvX3N0cihvZmZzZXQsIGxlbmd0aCkKICBlbmQKCiAgIyBDb3B5IHRoZSBzcGVjaWZp ZWQgc3RyaW5nIGludG8gdGhlIGJ1ZmZlciBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LgogIGRlZiBjb3B5 KHN0cmluZywgb2Zmc2V0KQogIGVuZAoKICAjIENvbXBhcmUgdHdvIGJ1ZmZlcnMuCiAgZGVmIDw9 PihvdGhlcikKICBlbmQKCiAgaW5jbHVkZSBDb21wYXJhYmxlCgogICMgUmVzaXplIHRoZSBidWZm ZXIsIHByZXNlcnZpbmcgdGhlIGdpdmVuIGxlbmd0aCAoaWYgbm9uLXplcm8pLgogIGRlZiByZXNp emUoc2l6ZSwgcHJlc2VydmUgPSAwKQogIGVuZAoKICAjIENsZWFyIHRoZSBidWZmZXIgdG8gdGhl IHNwZWNpZmllZCB2YWx1ZS4KICBkZWYgY2xlYXIodmFsdWUgPSAwLCBvZmZzZXQgPSAwLCBsZW5n dGggPSAoQHNpemUgLSBvZmZzZXQpKQogIGVuZAoKICAjIERhdGEgVHlwZXM6CiAgIyBMb3dlciBj YXNlOiBsaXR0bGUgZW5kaWFuLgogICMgVXBwZXIgY2FzZTogYmlnIGVuZGlhbiAobmV0d29yayBl bmRpYW4pLgogICMKICAjIDpVOCAgICAgICAgfCB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VyLgogICMg OlM4ICAgICAgICB8IHNpZ25lZCA4LWJpdCBpbnRlZ2VyLgogICMKICAjIDp1MTYsIDpVMTYgfCB1 bnNpZ25lZCAxNi1iaXQgaW50ZWdlci4KICAjIDpzMTYsIDpTMTYgfCBzaWduZWQgMTYtYml0IGlu dGVnZXIuCiAgIwogICMgOnUzMiwgOlUzMiB8IHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLgogICMg OnMzMiwgOlMzMiB8IHNpZ25lZCAzMi1iaXQgaW50ZWdlci4KICAjCiAgIyA6dTY0LCA6VTY0IHwg dW5zaWduZWQgNjQtYml0IGludGVnZXIuCiAgIyA6czY0LCA6UzY0IHwgc2lnbmVkIDY0LWJpdCBp bnRlZ2VyLgogICMKICAjIDpmMzIsIDpGMzIgfCAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVy LgogICMgOmY2NCwgOkY2NCB8IDY0LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuCgogICMgR2V0 IHRoZSBnaXZlbiBkYXRhIHR5cGUgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuCiAgZGVmIGdldCh0 eXBlLCBvZmZzZXQpCiAgZW5kCgogICMgU2V0IHRoZSBnaXZlbiB2YWx1ZSBhcyB0aGUgc3BlY2lm aWVkIGRhdGEgdHlwZSBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4KICBkZWYgc2V0KHR5cGUsIG9m ZnNldCwgdmFsdWUpCiAgZW5kCmVuZApgYGAKClRoZSBDIGludGVyZmFjZSBwcm92aWRlcyBhIGZl dyBjb252ZW5pZW50IG1ldGhvZHMgZm9yIGFjY2Vzc2luZyB0aGUgdW5kZXJseWluZyBkYXRhIGJ1 ZmZlcjoKCmBgYGMKdm9pZCByYl9pb19idWZmZXJfZ2V0X211dGFibGUoVkFMVUUgc2VsZiwgdm9p ZCAqKmJhc2UsIHNpemVfdCAqc2l6ZSk7CnZvaWQgcmJfaW9fYnVmZmVyX2dldF9pbW11dGFibGUo VkFMVUUgc2VsZiwgY29uc3Qgdm9pZCAqKmJhc2UsIHNpemVfdCAqc2l6ZSk7CmBgYAoKSW4gdGhl IGZpYmVyIHNjaGVkdWxlciwgaXQgaXMgdXNlZCBsaWtlIHRoaXM6CgpgYGBjClZBTFVFCnJiX2Zp YmVyX3NjaGVkdWxlcl9pb19yZWFkX21lbW9yeShWQUxVRSBzY2hlZHVsZXIsIFZBTFVFIGlvLCB2 b2lkICpiYXNlLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGxlbmd0aCkKewogICAgVkFMVUUgYnVmZmVy ID0gcmJfaW9fYnVmZmVyX25ldyhiYXNlLCBzaXplLCBSQl9JT19CVUZGRVJfTE9DS0VEKTsKCiAg ICBWQUxVRSByZXN1bHQgPSByYl9maWJlcl9zY2hlZHVsZXJfaW9fcmVhZChzY2hlZHVsZXIsIGlv LCBidWZmZXIsIGxlbmd0aCk7CgogICAgcmJfaW9fYnVmZmVyX2ZyZWUoYnVmZmVyKTsKCiAgICBy ZXR1cm4gcmVzdWx0Owp9CmBgYAoKVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGZyb20gYGlvLmNg IGF0IHZhcmlvdXMgcGxhY2VzIHRvIGZpbGwgdGhlIGJ1ZmZlci4gV2Ugc3BlY2lmaWNhbGx5IHRo ZSBgKGJhc2UsIHNpemUpYCB0dXBsZSwgYWxvbmcgd2l0aCBgbGVuZ3RoYCB3aGljaCBpcyB0aGUg Km1pbmltdW0qIGxlbmd0aCByZXF1aXJlZCBhbmQgYXNzaXN0cyB3aXRoIGVmZmljaWVudCBub24t YmxvY2tpbmcgaW1wbGVtZW50YXRpb24uCgpUaGUgYHVyaW5nLmNgIGltcGxlbWVudGF0aW9uIGlu IHRoZSBldmVudCBnZW0gdXNlcyB0aGlzIGludGVyZmFjZSBsaWtlIHNvOgoKYGBgYwpWQUxVRSBF dmVudF9CYWNrZW5kX1VSaW5nX2lvX3JlYWQoVkFMVUUgc2VsZiwgVkFMVUUgZmliZXIsIFZBTFVF IGlvLCBWQUxVRSBidWZmZXIsIFZBTFVFIF9sZW5ndGgpIHsKCXN0cnVjdCBFdmVudF9CYWNrZW5k X1VSaW5nICpkYXRhID0gTlVMTDsKCVR5cGVkRGF0YV9HZXRfU3RydWN0KHNlbGYsIHN0cnVjdCBF dmVudF9CYWNrZW5kX1VSaW5nLCAmRXZlbnRfQmFja2VuZF9VUmluZ19UeXBlLCBkYXRhKTsKCQoJ aW50IGRlc2NyaXB0b3IgPSBSQl9OVU0ySU5UKHJiX2Z1bmNhbGwoaW8sIGlkX2ZpbGVubywgMCkp OwoJCgl2b2lkICpiYXNlOwoJc2l6ZV90IHNpemU7CglyYl9pb19idWZmZXJfZ2V0X211dGFibGUo YnVmZmVyLCAmYmFzZSwgJnNpemUpOwoJCglzaXplX3Qgb2Zmc2V0ID0gMDsKCXNpemVfdCBsZW5n dGggPSBOVU0yU0laRVQoX2xlbmd0aCk7CgkKCXdoaWxlIChsZW5ndGggPiAwKSB7CgkJc2l6ZV90 IG1heGltdW1fc2l6ZSA9IHNpemUgLSBvZmZzZXQ7CgkJaW50IHJlc3VsdCA9IGlvX3JlYWQoZGF0 YSwgZmliZXIsIGRlc2NyaXB0b3IsIChjaGFyKiliYXNlK29mZnNldCwgbWF4aW11bV9zaXplKTsK CQkKCQlpZiAocmVzdWx0ID09IDApIHsKCQkJYnJlYWs7CgkJfSBlbHNlIGlmIChyZXN1bHQgPiAw KSB7CgkJCW9mZnNldCArPSByZXN1bHQ7CgkJCWlmICgoc2l6ZV90KXJlc3VsdCA+IGxlbmd0aCkg YnJlYWs7CgkJCWxlbmd0aCAtPSByZXN1bHQ7CgkJfSBlbHNlIGlmICgtcmVzdWx0ID09IEVBR0FJ TiB8fCAtcmVzdWx0ID09IEVXT1VMREJMT0NLKSB7CgkJCUV2ZW50X0JhY2tlbmRfVVJpbmdfaW9f d2FpdChzZWxmLCBmaWJlciwgaW8sIFJCX0lOVDJOVU0oUkVBREFCTEUpKTsKCQl9IGVsc2UgewoJ CQlyYl9zeXNlcnJfZmFpbCgtcmVzdWx0LCBzdHJlcnJvcigtcmVzdWx0KSk7CgkJfQoJfQoJCgly ZXR1cm4gU0laRVQyTlVNKG9mZnNldCk7Cn0KYGBgCgojIyBCdWZmZXIgQWxsb2NhdGlvbgoKVGhl IExpbnV4IGtlcm5lbCBwcm92aWRlcyBzb21lIGFkdmFuY2VkIG1lY2hhbmlzbXMgZm9yIHJlZ2lz dGVyaW5nIGJ1ZmZlcnMgZm9yIGFzeW5jaHJvbm91cyBJL08gdG8gcmVkdWNlIHBlci1vcGVyYXRp b24gb3ZlcmhlYWQuCgo+IFRoZSBpb191cmluZ19yZWdpc3RlcigpIHN5c3RlbSBjYWxsIHJlZ2lz dGVycyB1c2VyIGJ1ZmZlcnMgb3IgZmlsZXMgZm9yIHVzZSBpbiBhbiBpb191cmluZyg3KSBpbnN0 YW5jZSByZWZlcmVuY2VkIGJ5IGZkLiBSZWdpc3RlcmluZyBmaWxlcyBvciB1c2VyIGJ1ZmZlcnMg YWxsb3dzIHRoZSBrZXJuZWwgdG8gdGFrZSBsb25nIHRlcm0gcmVmZXJlbmNlcyB0byBpbnRlcm5h bCBkYXRhIHN0cnVjdHVyZXMgb3IgY3JlYXRlIGxvbmcgdGVybSBtYXBwaW5ncyBvZiBhcHBsaWNh dGlvbiBtZW1vcnksIGdyZWF0bHkgcmVkdWNpbmcgcGVyLUkvTyBvdmVyaGVhZC4KCldpdGggYXBw cm9wcmlhdGUgc3VwcG9ydCwgd2UgY2FuIHVzZSBgSU9SSU5HX09QX1BST1ZJREVfQlVGRkVSU2Ag dG8gZWZmaWNpZW50bHkgbWFuYWdlIGJ1ZmZlcnMgaW4gYXBwbGljYXRpb25zIHdoaWNoIGFyZSBk ZWFsaW5nIHdpdGggbG90cyBvZiBzb2NrZXRzLiBTZWUgPGh0dHBzOi8vbG9yZS5rZXJuZWwub3Jn L2lvLXVyaW5nLzIwMjAwMjI4MjAzMDUzLjI1MDIzLTEtYXhib2VAa2VybmVsLmRrL1QvPiBmb3Ig bW9yZSBkZXRhaWxzIGFib3V0IGhvdyBpdCB3b3Jrcy4gSSdtIHN0aWxsIGV4cGxvcmluZyB0aGUg cGVyZm9ybWFuY2UgaW1wbGljYXRpb25zIG9mIHRoaXMsIGJ1dCB0aGUgcHJvcG9zZWQgaW1wbGVt ZW50YXRpb24gcHJvdmlkZXMgc3VmZmljaWVudCBtZXRhLWRhdGEgZm9yIHVzIHRvIGV4cGxvcmUg dGhpcyBpbiByZWFsIHdvcmxkIHNjaGVkdWxlcnMuCgpQUjogaHR0cHM6Ly9naXRodWIuY29tL3J1 YnkvcnVieS9wdWxsLzQ2MjEKCgoKLS0gCmh0dHBzOi8vYnVncy5ydWJ5LWxhbmcub3JnLwoKVW5z dWJzY3JpYmU6IDxtYWlsdG86cnVieS1jb3JlLXJlcXVlc3RAcnVieS1sYW5nLm9yZz9zdWJqZWN0 PXVuc3Vic2NyaWJlPgo8aHR0cDovL2xpc3RzLnJ1YnktbGFuZy5vcmcvY2dpLWJpbi9tYWlsbWFu L29wdGlvbnMvcnVieS1jb3JlPgo=