[#105450] [Ruby master Feature#18228] Add a `timeout` option to `IO.copy_stream` — "byroot (Jean Boussier)" <noreply@...>
SXNzdWUgIzE4MjI4IGhhcyBiZWVuIHJlcG9ydGVkIGJ5IGJ5cm9vdCAoSmVhbiBCb3Vzc2llciku
11 messages
2021/09/27
[ruby-core:105440] [Ruby master Feature#18020] Introduce `IO::Buffer` for fiber scheduler.
From:
"ioquatix (Samuel Williams)" <noreply@...>
Date:
2021-09-27 06:16:58 UTC
List:
ruby-core #105440
SXNzdWUgIzE4MDIwIGhhcyBiZWVuIHVwZGF0ZWQgYnkgaW9xdWF0aXggKFNhbXVlbCBXaWxsaWFt cykuCgoKQGRzaXNuZXJvIHdvdWxkIHlvdSBoYXZlIHRpbWUgc29tZXRpbWUgdGhpcyB3ZWVrIHRv IGhhdmUgYSBxdWljayBmYWNlIHRvIGZhY2UgY2hhdD8gSXQgd291bGQgYmUgZ29vZCB0byBkaXNj dXNzIHRoZSBwcm9wb3NhbCB3aXRoIHlvdSBhbmQgZmlndXJlIG91dCBhIGNvbnNpc3RlbnQgYW5k IGNvaGVzaXZlIHdheSBmb3J3YXJkLiBCYXNlZCBvbiB3aGF0IEkgY2FuIHNlZSwgaXQgc2VlbXMg bGlrZSB5b3UgaGF2ZSBhIGxvdCBvZiBleHBlcmllbmNlIGluIHRoaXMgYXJlYS4KCi0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KRmVhdHVyZSAjMTgwMjA6IEludHJvZHVj ZSBgSU86OkJ1ZmZlcmAgZm9yIGZpYmVyIHNjaGVkdWxlci4KaHR0cHM6Ly9idWdzLnJ1YnktbGFu Zy5vcmcvaXNzdWVzLzE4MDIwI2NoYW5nZS05Mzg4NwoKKiBBdXRob3I6IGlvcXVhdGl4IChTYW11 ZWwgV2lsbGlhbXMpCiogU3RhdHVzOiBPcGVuCiogUHJpb3JpdHk6IE5vcm1hbAotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkFmdGVyIGNvbnRpbnVpbmcgdG8gYnVpbGQg b3V0IHRoZSBmaWJlciBzY2hlZHVsZXIgaW50ZXJmYWNlIGFuZCB0aGUgc3BlY2lmaWMgaG9va3Mg cmVxdWlyZWQgZm9yIGBpb191cmluZ2AsIEkgZm91bmQgc29tZSB0cm91YmxlIHdpdGhpbiB0aGUg aW1wbGVtZW50YXRpb24gb2YgYElPYC4KCkkgZm91bmQgdGhhdCBpbiBzb21lIGNhc2VzLCB3ZSBu ZWVkIHRvIHJlYWQgaW50byB0aGUgaW50ZXJuYWwgSU8gYnVmZmVycyBkaXJlY3RseS4gSSB0cmll ZCBjcmVhdGluZyBhICJmYWtlIHN0cmluZyIgaW4gb3JkZXIgdG8gdHJhbnNpdCBiYWNrIGludG8g dGhlIFJ1YnkgZmliZXIgc2NoZWR1bGVyIGludGVyZmFjZSBhbmQgdGhpcyBkaWQgd29yayB0byBh IGNlcnRhaW4gZXh0ZW50LCBidXQgSSB3YXMgdG9sZCB3ZSBjYW5ub3QgZXhwb3NlIGZha2Ugc3Ry aW5nIHRvIFJ1Ynkgc2NoZWR1bGVyIGludGVyZmFjZS4KClNvLCBhZnRlciB0aGlzLCBhbmQgbWFu eSBvdGhlciBmcnVzdHJhdGlvbnMgd2l0aCB1c2luZyBgU3RyaW5nYCBhcyBhIElPIGJ1ZmZlciwg SSBkZWNpZGVkIHRvIGltcGxlbWVudCBhIGxvdyBsZXZlbCBgSU86OkJ1ZmZlcmAgYmFzZWQgb24g bXkgbmVlZHMgZm9yIGhpZ2ggcGVyZm9ybWFuY2UgSU8sIGFuZCBhcyBwYXJ0IG9mIHRoZSBmaWJl ciBzY2hlZHVsZXIgaW50ZXJmYWNlLgoKSGVyZSBpcyByb3VnaGx5IHRoZSBpbnRlcmZhY2UgaW1w bGVtZW50ZWQgYnkgdGhlIHNjaGVkdWxlciB3LnIudC4gdGhlIGJ1ZmZlcjoKCmBgYHJ1YnkKY2xh c3MgU2NoZWR1bGVyCiAgIyBAcGFyYW1ldGVyIGJ1ZmZlciBbSU86OkJ1ZmZlcl0gQnVmZmVyIGZv ciByZWFkaW5nIGludG8uCiAgZGVmIGlvX3JlYWQoaW8sIGJ1ZmZlciwgbGVuZ3RoKQogICAgIyBp bXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBgcmVhZGAgc3lzdGVtIGNhbGwsIElPX1VSSU5HX1JF QURWLCBldGMuCiAgZW5kCgogICMgQHBhcmFtZXRlciBidWZmZXIgW0lPOjpCdWZmZXJdIEJ1ZmZl ciBmb3Igd3JpdGluZyBmcm9tLgogIGRlZiBpb193cml0ZShpbywgYnVmZmVyLCBsZW5ndGgpCiAg ICAjIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IGB3cml0ZWAgc3lzdGVtIGNhbGwsIElPX1VS SU5HX1dSSVRFViwgZXRjLgogIGVuZAoKICAjIFBvdGVudGlhbCBuZXcgaG9va3MgKFNvY2tldCNy ZWN2bXNnLCBzZW5kbXNnLCBldGMpOgogIGRlZiBpb19yZWN2bXNnKGlvLCBidWZmZXIsIGxlbmd0 aCkKICBlbmQKZW5kCmBgYAoKSW4gcmV2aWV3aW5nIG90aGVyIGxhbmd1YWdlIGRlc2lnbnMsIEkg Zm91bmQgdGhhdCB0aGlzIGRlc2lnbiBpcyB2ZXJ5IHNpbWlsYXIgdG8gQ3J5c3RhbCdzIElPIGJ1 ZmZlcmluZyBzdHJhdGVneS4KClRoZSBwcm9wb3NlZCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBl bm91Z2ggb2YgYW4gaW50ZXJmYWNlIHRvIGltcGxlbWVudCBib3RoIG5hdGl2ZSBzY2hlZHVsZXJz IGFzIHdlbGwgYXMgcHVyZSBSdWJ5IHNjaGVkdWxlcnMuIEl0IGFsc28gcHJvdmlkZXMgc29tZSBl eHRyYSBmdW5jdGlvbmFsaXR5IGZvciBpbnRlcnByZXRpbmcgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZl ci4gVGhpcyBpcyBtb3N0bHkgZm9yIHRlc3RpbmcgYW5kIGV4cGVyaW1lbnRhdGlvbiwgYWx0aG91 Z2ggaXQgbWlnaHQgbWFrZSBzZW5zZSB0byBleHBvc2UgdGhpcyBpbnRlcmZhY2UgZm9yIGJpbmFy eSBwcm90b2NvbHMgbGlrZSBIVFRQLzIsIFFVSUMsIFdlYlNvY2tldHMsIGV0Yy4KCiMjIFByb3Bv c2VkIFNvbHV0aW9uCgpXZSBpbnRyb2R1Y2UgbmV3IGNsYXNzIGBJTzo6QnVmZmVyYC4KCmBgYHJ1 YnkKY2xhc3MgSU86OkJ1ZmZlcgogICMgQHJldHVybnMgW0lPOjpCdWZmZXJdIEEgYnVmZmVyIHdp dGggdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgZGF0YS4KICBkZWYgc2VsZi5mb3Ioc3RyaW5n KQogIGVuZAoKICBQQUdFX1NJWkUgPSAjIC4uLiBvcGVyYXRpbmcgc3lzdGVtIHBhZ2Ugc2l6ZQoK ICAjIEByZXR1cm5zIFtJTzo6QnVmZmVyXSBBIGJ1ZmZlciB3aXRoIHRoZSBjb250ZW50cyBvZiB0 aGUgZmlsZSBtYXBwZWQgdG8gbWVtb3J5LgogIGRlZiBzZWxmLm1hcChmaWxlKQogIGVuZAoKICAj IEZsYWdzIGZvciBidWZmZXIgc3RhdGUuCiAgRVhURVJOQUwgPSAjIFRoZSBidWZmZXIgaXMgZnJv bSBleHRlcm5hbCBtZW1vcnkuCiAgSU5URVJOQUwgPSAjIFRoZSBidWZmZXIgaXMgZnJvbSBpbnRl cm5hbCBtZW1vcnkgKG1hbGxvYykuCiAgTUFQUEVEID0gIyBUaGUgYnVmZmVyIGlzIGZyb20gbWFw cGVkIG1lbW9yeSAobW1hcCwgVmlydHVhbEFsbG9jLCBldGMpCiAgTE9DS0VEID0gIyBUaGUgYnVm ZmVyIGlzIGxvY2tlZCBmb3IgdXNhZ2UgKGNhbm5vdCBiZSByZXNpemVkKQogIFBSSVZBVEUgPSAj IFRoZSBidWZmZXIgaXMgbWFwcGVkIGFzIGNvcHktb24td3JpdGUuCiAgSU1NVVRBQkxFID0gIyBU aGUgYnVmZmVyIGNhbm5vdCBiZSBtb2RpZmllZC4KCiAgIyBAcmV0dXJucyBbSU86OkJ1ZmZlcl0g QSBidWZmZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHNpemUsIGFsbG9jYXRlZCBhY2NvcmRpbmcgdG8g dGhlIGdpdmVuIGZsYWdzLgogIGRlZiBpbml0aWFsaXplKHNpemUsIGZsYWdzKQogIGVuZAoKICAj IEByZXR1cm5zIFtJbnRlZ3JhbF0gVGhlIHNpemUgb2YgdGhlIGJ1ZmZlcgogIGF0dHIgOnNpemUK CiAgIyBAcmV0dXJucyBbU3RyaW5nXSBBIGJyaWVmIHN1bW1hcnkgYW5kIGhleCBkdW1wIG9mIHRo ZSBidWZmZXIuCiAgZGVmIGluc3BlY3QKICBlbmQKCiAgIyBAcmV0dXJucyBbU3RyaW5nXSBBIGJy aWVmIHN1bW1hcnkgb2YgdGhlIGJ1ZmZlci4KICBkZWYgdG9fcwogIGVuZAoKICAjIEZsYWcgcHJl ZGljYXRlczoKICBkZWYgZXh0ZXJuYWw/CiAgZW5kCgogIGRlZiBpbnRlcm5hbD8KICBlbmQKCiAg ZGVmIG1hcHBlZD8KICBlbmQKCiAgZGVmIGxvY2tlZD8KICBlbmQKCiAgZGVmIGltbXV0YWJsZT8K ICBlbmQKCiAgIyBGbGFncyBmb3IgZW5kaWFuL2J5dGUgb3JkZXI6CiAgTElUVExFX0VORElBTiA9 ICMgLi4uCiAgQklHX0VORElBTiA9ICMgLi4uCiAgSE9TVF9FTkRJQU4gPSAjIC4uLgogIE5FVFdP UktfRU5ESUFOPSAjIC4uLgoKICAjIExvY2sgdGhlIGJ1ZmZlciAocHJldmVudCByZXNpemUsIHVu bWFwLCBjaGFuZ2VzIHRvIGJhc2UgYW5kIHNpemUpLgogIGRlZiBsb2NrCiAgICByYWlzZSAiQWxy ZWFkeSBsb2NrZWQhIiBpZiBmbGFncyAmIExPQ0tFRAogICAgCiAgICBmbGFncyB8PSBMT0NLRUQK ICBlbmQKCiAgIyBVbmxvY2sgdGhlIGJ1ZmZlci4KICBkZWYgdW5sb2NrCiAgICByYWlzZSAiTm90 IGxvY2tlZCEiIHVubGVzcyBmbGFncyAmIExPQ0tFRAogICAgCiAgICBmbGFncyB8PSB+TE9DS0VE CiAgZW5kCgogIC8vIE1hbmlwdWxhdGlvbjoKICAjIEByZXR1cm5zIFtJTzo6QnVmZmVyXSBBIHNs aWNlIG9mIHRoZSBidWZmZXIncyBkYXRhLiBEb2VzIG5vdCBjb3B5LgogIGRlZiBzbGljZShvZmZz ZXQsIGxlbmd0aCkKICBlbmQKCiAgIyBAcmV0dXJucyBbU3RyaW5nXSBBIGJpbmFyeSBzdHJpbmcg c3RhcnRpbmcgYXQgb2Zmc2V0LCBsZW5ndGggYnl0ZXMuCiAgZGVmIHRvX3N0cihvZmZzZXQsIGxl bmd0aCkKICBlbmQKCiAgIyBDb3B5IHRoZSBzcGVjaWZpZWQgc3RyaW5nIGludG8gdGhlIGJ1ZmZl ciBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LgogIGRlZiBjb3B5KHN0cmluZywgb2Zmc2V0KQogIGVuZAoK ICAjIENvbXBhcmUgdHdvIGJ1ZmZlcnMuCiAgZGVmIDw9PihvdGhlcikKICBlbmQKCiAgaW5jbHVk ZSBDb21wYXJhYmxlCgogICMgUmVzaXplIHRoZSBidWZmZXIsIHByZXNlcnZpbmcgdGhlIGdpdmVu IGxlbmd0aCAoaWYgbm9uLXplcm8pLgogIGRlZiByZXNpemUoc2l6ZSwgcHJlc2VydmUgPSAwKQog IGVuZAoKICAjIENsZWFyIHRoZSBidWZmZXIgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KICBkZWYg Y2xlYXIodmFsdWUgPSAwLCBvZmZzZXQgPSAwLCBsZW5ndGggPSAoQHNpemUgLSBvZmZzZXQpKQog IGVuZAoKICAjIERhdGEgVHlwZXM6CiAgIyBMb3dlciBjYXNlOiBsaXR0bGUgZW5kaWFuLgogICMg VXBwZXIgY2FzZTogYmlnIGVuZGlhbiAobmV0d29yayBlbmRpYW4pLgogICMKICAjIDpVOCAgICAg ICAgfCB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VyLgogICMgOlM4ICAgICAgICB8IHNpZ25lZCA4LWJp dCBpbnRlZ2VyLgogICMKICAjIDp1MTYsIDpVMTYgfCB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlci4K ICAjIDpzMTYsIDpTMTYgfCBzaWduZWQgMTYtYml0IGludGVnZXIuCiAgIwogICMgOnUzMiwgOlUz MiB8IHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLgogICMgOnMzMiwgOlMzMiB8IHNpZ25lZCAzMi1i aXQgaW50ZWdlci4KICAjCiAgIyA6dTY0LCA6VTY0IHwgdW5zaWduZWQgNjQtYml0IGludGVnZXIu CiAgIyA6czY0LCA6UzY0IHwgc2lnbmVkIDY0LWJpdCBpbnRlZ2VyLgogICMKICAjIDpmMzIsIDpG MzIgfCAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgogICMgOmY2NCwgOkY2NCB8IDY0LWJp dCBmbG9hdGluZyBwb2ludCBudW1iZXIuCgogICMgR2V0IHRoZSBnaXZlbiBkYXRhIHR5cGUgYXQg dGhlIHNwZWNpZmllZCBvZmZzZXQuCiAgZGVmIGdldCh0eXBlLCBvZmZzZXQpCiAgZW5kCgogICMg U2V0IHRoZSBnaXZlbiB2YWx1ZSBhcyB0aGUgc3BlY2lmaWVkIGRhdGEgdHlwZSBhdCB0aGUgc3Bl Y2lmaWVkIG9mZnNldC4KICBkZWYgc2V0KHR5cGUsIG9mZnNldCwgdmFsdWUpCiAgZW5kCmVuZApg YGAKClRoZSBDIGludGVyZmFjZSBwcm92aWRlcyBhIGZldyBjb252ZW5pZW50IG1ldGhvZHMgZm9y IGFjY2Vzc2luZyB0aGUgdW5kZXJseWluZyBkYXRhIGJ1ZmZlcjoKCmBgYGMKdm9pZCByYl9pb19i dWZmZXJfZ2V0X211dGFibGUoVkFMVUUgc2VsZiwgdm9pZCAqKmJhc2UsIHNpemVfdCAqc2l6ZSk7 CnZvaWQgcmJfaW9fYnVmZmVyX2dldF9pbW11dGFibGUoVkFMVUUgc2VsZiwgY29uc3Qgdm9pZCAq KmJhc2UsIHNpemVfdCAqc2l6ZSk7CmBgYAoKSW4gdGhlIGZpYmVyIHNjaGVkdWxlciwgaXQgaXMg dXNlZCBsaWtlIHRoaXM6CgpgYGBjClZBTFVFCnJiX2ZpYmVyX3NjaGVkdWxlcl9pb19yZWFkX21l bW9yeShWQUxVRSBzY2hlZHVsZXIsIFZBTFVFIGlvLCB2b2lkICpiYXNlLCBzaXplX3Qgc2l6ZSwg c2l6ZV90IGxlbmd0aCkKewogICAgVkFMVUUgYnVmZmVyID0gcmJfaW9fYnVmZmVyX25ldyhiYXNl LCBzaXplLCBSQl9JT19CVUZGRVJfTE9DS0VEKTsKCiAgICBWQUxVRSByZXN1bHQgPSByYl9maWJl cl9zY2hlZHVsZXJfaW9fcmVhZChzY2hlZHVsZXIsIGlvLCBidWZmZXIsIGxlbmd0aCk7CgogICAg cmJfaW9fYnVmZmVyX2ZyZWUoYnVmZmVyKTsKCiAgICByZXR1cm4gcmVzdWx0Owp9CmBgYAoKVGhp cyBmdW5jdGlvbiBpcyBpbnZva2VkIGZyb20gYGlvLmNgIGF0IHZhcmlvdXMgcGxhY2VzIHRvIGZp bGwgdGhlIGJ1ZmZlci4gV2Ugc3BlY2lmaWNhbGx5IHRoZSBgKGJhc2UsIHNpemUpYCB0dXBsZSwg YWxvbmcgd2l0aCBgbGVuZ3RoYCB3aGljaCBpcyB0aGUgKm1pbmltdW0qIGxlbmd0aCByZXF1aXJl ZCBhbmQgYXNzaXN0cyB3aXRoIGVmZmljaWVudCBub24tYmxvY2tpbmcgaW1wbGVtZW50YXRpb24u CgpUaGUgYHVyaW5nLmNgIGltcGxlbWVudGF0aW9uIGluIHRoZSBldmVudCBnZW0gdXNlcyB0aGlz IGludGVyZmFjZSBsaWtlIHNvOgoKYGBgYwpWQUxVRSBFdmVudF9CYWNrZW5kX1VSaW5nX2lvX3Jl YWQoVkFMVUUgc2VsZiwgVkFMVUUgZmliZXIsIFZBTFVFIGlvLCBWQUxVRSBidWZmZXIsIFZBTFVF IF9sZW5ndGgpIHsKCXN0cnVjdCBFdmVudF9CYWNrZW5kX1VSaW5nICpkYXRhID0gTlVMTDsKCVR5 cGVkRGF0YV9HZXRfU3RydWN0KHNlbGYsIHN0cnVjdCBFdmVudF9CYWNrZW5kX1VSaW5nLCAmRXZl bnRfQmFja2VuZF9VUmluZ19UeXBlLCBkYXRhKTsKCQoJaW50IGRlc2NyaXB0b3IgPSBSQl9OVU0y SU5UKHJiX2Z1bmNhbGwoaW8sIGlkX2ZpbGVubywgMCkpOwoJCgl2b2lkICpiYXNlOwoJc2l6ZV90 IHNpemU7CglyYl9pb19idWZmZXJfZ2V0X211dGFibGUoYnVmZmVyLCAmYmFzZSwgJnNpemUpOwoJ CglzaXplX3Qgb2Zmc2V0ID0gMDsKCXNpemVfdCBsZW5ndGggPSBOVU0yU0laRVQoX2xlbmd0aCk7 CgkKCXdoaWxlIChsZW5ndGggPiAwKSB7CgkJc2l6ZV90IG1heGltdW1fc2l6ZSA9IHNpemUgLSBv ZmZzZXQ7CgkJaW50IHJlc3VsdCA9IGlvX3JlYWQoZGF0YSwgZmliZXIsIGRlc2NyaXB0b3IsIChj aGFyKiliYXNlK29mZnNldCwgbWF4aW11bV9zaXplKTsKCQkKCQlpZiAocmVzdWx0ID09IDApIHsK CQkJYnJlYWs7CgkJfSBlbHNlIGlmIChyZXN1bHQgPiAwKSB7CgkJCW9mZnNldCArPSByZXN1bHQ7 CgkJCWlmICgoc2l6ZV90KXJlc3VsdCA+IGxlbmd0aCkgYnJlYWs7CgkJCWxlbmd0aCAtPSByZXN1 bHQ7CgkJfSBlbHNlIGlmICgtcmVzdWx0ID09IEVBR0FJTiB8fCAtcmVzdWx0ID09IEVXT1VMREJM T0NLKSB7CgkJCUV2ZW50X0JhY2tlbmRfVVJpbmdfaW9fd2FpdChzZWxmLCBmaWJlciwgaW8sIFJC X0lOVDJOVU0oUkVBREFCTEUpKTsKCQl9IGVsc2UgewoJCQlyYl9zeXNlcnJfZmFpbCgtcmVzdWx0 LCBzdHJlcnJvcigtcmVzdWx0KSk7CgkJfQoJfQoJCglyZXR1cm4gU0laRVQyTlVNKG9mZnNldCk7 Cn0KYGBgCgojIyBCdWZmZXIgQWxsb2NhdGlvbgoKVGhlIExpbnV4IGtlcm5lbCBwcm92aWRlcyBz b21lIGFkdmFuY2VkIG1lY2hhbmlzbXMgZm9yIHJlZ2lzdGVyaW5nIGJ1ZmZlcnMgZm9yIGFzeW5j aHJvbm91cyBJL08gdG8gcmVkdWNlIHBlci1vcGVyYXRpb24gb3ZlcmhlYWQuCgo+IFRoZSBpb191 cmluZ19yZWdpc3RlcigpIHN5c3RlbSBjYWxsIHJlZ2lzdGVycyB1c2VyIGJ1ZmZlcnMgb3IgZmls ZXMgZm9yIHVzZSBpbiBhbiBpb191cmluZyg3KSBpbnN0YW5jZSByZWZlcmVuY2VkIGJ5IGZkLiBS ZWdpc3RlcmluZyBmaWxlcyBvciB1c2VyIGJ1ZmZlcnMgYWxsb3dzIHRoZSBrZXJuZWwgdG8gdGFr ZSBsb25nIHRlcm0gcmVmZXJlbmNlcyB0byBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgb3IgY3Jl YXRlIGxvbmcgdGVybSBtYXBwaW5ncyBvZiBhcHBsaWNhdGlvbiBtZW1vcnksIGdyZWF0bHkgcmVk dWNpbmcgcGVyLUkvTyBvdmVyaGVhZC4KCldpdGggYXBwcm9wcmlhdGUgc3VwcG9ydCwgd2UgY2Fu IHVzZSBgSU9SSU5HX09QX1BST1ZJREVfQlVGRkVSU2AgdG8gZWZmaWNpZW50bHkgbWFuYWdlIGJ1 ZmZlcnMgaW4gYXBwbGljYXRpb25zIHdoaWNoIGFyZSBkZWFsaW5nIHdpdGggbG90cyBvZiBzb2Nr ZXRzLiBTZWUgPGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2lvLXVyaW5nLzIwMjAwMjI4MjAzMDUz LjI1MDIzLTEtYXhib2VAa2VybmVsLmRrL1QvPiBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IGhvdyBp dCB3b3Jrcy4gSSdtIHN0aWxsIGV4cGxvcmluZyB0aGUgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25z IG9mIHRoaXMsIGJ1dCB0aGUgcHJvcG9zZWQgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgc3VmZmlj aWVudCBtZXRhLWRhdGEgZm9yIHVzIHRvIGV4cGxvcmUgdGhpcyBpbiByZWFsIHdvcmxkIHNjaGVk dWxlcnMuCgoKCgotLSAKaHR0cHM6Ly9idWdzLnJ1YnktbGFuZy5vcmcvCgpVbnN1YnNjcmliZTog PG1haWx0bzpydWJ5LWNvcmUtcmVxdWVzdEBydWJ5LWxhbmcub3JnP3N1YmplY3Q9dW5zdWJzY3Jp YmU+CjxodHRwOi8vbGlzdHMucnVieS1sYW5nLm9yZy9jZ2ktYmluL21haWxtYW4vb3B0aW9ucy9y dWJ5LWNvcmU+Cg==