[#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:105443] [Ruby master Feature#18020] Introduce `IO::Buffer` for fiber scheduler.
From:
"Eregon (Benoit Daloze)" <noreply@...>
Date:
2021-09-27 09:44:00 UTC
List:
ruby-core #105443
SXNzdWUgIzE4MDIwIGhhcyBiZWVuIHVwZGF0ZWQgYnkgRXJlZ29uIChCZW5vaXQgRGFsb3plKS4K Cgppb3F1YXRpeCAoU2FtdWVsIFdpbGxpYW1zKSB3cm90ZSBpbiAjbm90ZS0yMDoKPiBAZXJlZ29u IEkgcmV2aXNpdGVkIHRoaXMgY29kZS4KPiAKPiA+IGRlZiB0b19zdHIob2Zmc2V0LCBsZW5ndGgp Cj4gCj4gSSdtIG5vdCBzdXJlIGlmIHRoZXJlIGlzIGFueSBwcm9ibGVtIG1ha2luZyBhbiBJTyBi dWZmZXIgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBhIHN0cmluZy4gSXQgbWVhbnMgeW91IGNh biBzZW5kIGEgYnVmZmVyIHRvIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHN0cmluZywgYW5kIGl0 IHdpbGwgaW1wbGljaXRseSBjb252ZXJ0IGl0IHRvIHRoZSBmdWxsIGJ1ZmZlci4KClNob3VsZCBp dCB0YWtlIG5vIGFyZ3VtZW50cyB0aGVuPwpBRkFJSyBpbXBsaWNpdCBjb252ZXJzaW9uIG1ldGhv ZHMgbmV2ZXIgdGFrZXMgYXJndW1lbnRzLgpJJ20gbm90IHN1cmUgaWYgaXQncyBhIGdvb2QgaWRl YSB0byBtYWtlIGEgZnVsbCBjb3B5IG9mIHRoZSBieXRlcyBpbXBsaWNpdC4KCi0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KRmVhdHVyZSAjMTgwMjA6IEludHJvZHVjZSBg SU86OkJ1ZmZlcmAgZm9yIGZpYmVyIHNjaGVkdWxlci4KaHR0cHM6Ly9idWdzLnJ1YnktbGFuZy5v cmcvaXNzdWVzLzE4MDIwI2NoYW5nZS05Mzg5MAoKKiBBdXRob3I6IGlvcXVhdGl4IChTYW11ZWwg V2lsbGlhbXMpCiogU3RhdHVzOiBPcGVuCiogUHJpb3JpdHk6IE5vcm1hbAotLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkFmdGVyIGNvbnRpbnVpbmcgdG8gYnVpbGQgb3V0 IHRoZSBmaWJlciBzY2hlZHVsZXIgaW50ZXJmYWNlIGFuZCB0aGUgc3BlY2lmaWMgaG9va3MgcmVx dWlyZWQgZm9yIGBpb191cmluZ2AsIEkgZm91bmQgc29tZSB0cm91YmxlIHdpdGhpbiB0aGUgaW1w bGVtZW50YXRpb24gb2YgYElPYC4KCkkgZm91bmQgdGhhdCBpbiBzb21lIGNhc2VzLCB3ZSBuZWVk IHRvIHJlYWQgaW50byB0aGUgaW50ZXJuYWwgSU8gYnVmZmVycyBkaXJlY3RseS4gSSB0cmllZCBj cmVhdGluZyBhICJmYWtlIHN0cmluZyIgaW4gb3JkZXIgdG8gdHJhbnNpdCBiYWNrIGludG8gdGhl IFJ1YnkgZmliZXIgc2NoZWR1bGVyIGludGVyZmFjZSBhbmQgdGhpcyBkaWQgd29yayB0byBhIGNl cnRhaW4gZXh0ZW50LCBidXQgSSB3YXMgdG9sZCB3ZSBjYW5ub3QgZXhwb3NlIGZha2Ugc3RyaW5n IHRvIFJ1Ynkgc2NoZWR1bGVyIGludGVyZmFjZS4KClNvLCBhZnRlciB0aGlzLCBhbmQgbWFueSBv dGhlciBmcnVzdHJhdGlvbnMgd2l0aCB1c2luZyBgU3RyaW5nYCBhcyBhIElPIGJ1ZmZlciwgSSBk ZWNpZGVkIHRvIGltcGxlbWVudCBhIGxvdyBsZXZlbCBgSU86OkJ1ZmZlcmAgYmFzZWQgb24gbXkg bmVlZHMgZm9yIGhpZ2ggcGVyZm9ybWFuY2UgSU8sIGFuZCBhcyBwYXJ0IG9mIHRoZSBmaWJlciBz Y2hlZHVsZXIgaW50ZXJmYWNlLgoKSGVyZSBpcyByb3VnaGx5IHRoZSBpbnRlcmZhY2UgaW1wbGVt ZW50ZWQgYnkgdGhlIHNjaGVkdWxlciB3LnIudC4gdGhlIGJ1ZmZlcjoKCmBgYHJ1YnkKY2xhc3Mg U2NoZWR1bGVyCiAgIyBAcGFyYW1ldGVyIGJ1ZmZlciBbSU86OkJ1ZmZlcl0gQnVmZmVyIGZvciBy ZWFkaW5nIGludG8uCiAgZGVmIGlvX3JlYWQoaW8sIGJ1ZmZlciwgbGVuZ3RoKQogICAgIyBpbXBs ZW1lbnRhdGlvbiBwcm92aWRlZCBieSBgcmVhZGAgc3lzdGVtIGNhbGwsIElPX1VSSU5HX1JFQURW LCBldGMuCiAgZW5kCgogICMgQHBhcmFtZXRlciBidWZmZXIgW0lPOjpCdWZmZXJdIEJ1ZmZlciBm b3Igd3JpdGluZyBmcm9tLgogIGRlZiBpb193cml0ZShpbywgYnVmZmVyLCBsZW5ndGgpCiAgICAj IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IGB3cml0ZWAgc3lzdGVtIGNhbGwsIElPX1VSSU5H X1dSSVRFViwgZXRjLgogIGVuZAoKICAjIFBvdGVudGlhbCBuZXcgaG9va3MgKFNvY2tldCNyZWN2 bXNnLCBzZW5kbXNnLCBldGMpOgogIGRlZiBpb19yZWN2bXNnKGlvLCBidWZmZXIsIGxlbmd0aCkK ICBlbmQKZW5kCmBgYAoKSW4gcmV2aWV3aW5nIG90aGVyIGxhbmd1YWdlIGRlc2lnbnMsIEkgZm91 bmQgdGhhdCB0aGlzIGRlc2lnbiBpcyB2ZXJ5IHNpbWlsYXIgdG8gQ3J5c3RhbCdzIElPIGJ1ZmZl cmluZyBzdHJhdGVneS4KClRoZSBwcm9wb3NlZCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBlbm91 Z2ggb2YgYW4gaW50ZXJmYWNlIHRvIGltcGxlbWVudCBib3RoIG5hdGl2ZSBzY2hlZHVsZXJzIGFz IHdlbGwgYXMgcHVyZSBSdWJ5IHNjaGVkdWxlcnMuIEl0IGFsc28gcHJvdmlkZXMgc29tZSBleHRy YSBmdW5jdGlvbmFsaXR5IGZvciBpbnRlcnByZXRpbmcgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlci4g VGhpcyBpcyBtb3N0bHkgZm9yIHRlc3RpbmcgYW5kIGV4cGVyaW1lbnRhdGlvbiwgYWx0aG91Z2gg aXQgbWlnaHQgbWFrZSBzZW5zZSB0byBleHBvc2UgdGhpcyBpbnRlcmZhY2UgZm9yIGJpbmFyeSBw cm90b2NvbHMgbGlrZSBIVFRQLzIsIFFVSUMsIFdlYlNvY2tldHMsIGV0Yy4KCiMjIFByb3Bvc2Vk IFNvbHV0aW9uCgpXZSBpbnRyb2R1Y2UgbmV3IGNsYXNzIGBJTzo6QnVmZmVyYC4KCmBgYHJ1YnkK Y2xhc3MgSU86OkJ1ZmZlcgogICMgQHJldHVybnMgW0lPOjpCdWZmZXJdIEEgYnVmZmVyIHdpdGgg dGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgZGF0YS4KICBkZWYgc2VsZi5mb3Ioc3RyaW5nKQog IGVuZAoKICBQQUdFX1NJWkUgPSAjIC4uLiBvcGVyYXRpbmcgc3lzdGVtIHBhZ2Ugc2l6ZQoKICAj IEByZXR1cm5zIFtJTzo6QnVmZmVyXSBBIGJ1ZmZlciB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUg ZmlsZSBtYXBwZWQgdG8gbWVtb3J5LgogIGRlZiBzZWxmLm1hcChmaWxlKQogIGVuZAoKICAjIEZs YWdzIGZvciBidWZmZXIgc3RhdGUuCiAgRVhURVJOQUwgPSAjIFRoZSBidWZmZXIgaXMgZnJvbSBl eHRlcm5hbCBtZW1vcnkuCiAgSU5URVJOQUwgPSAjIFRoZSBidWZmZXIgaXMgZnJvbSBpbnRlcm5h bCBtZW1vcnkgKG1hbGxvYykuCiAgTUFQUEVEID0gIyBUaGUgYnVmZmVyIGlzIGZyb20gbWFwcGVk IG1lbW9yeSAobW1hcCwgVmlydHVhbEFsbG9jLCBldGMpCiAgTE9DS0VEID0gIyBUaGUgYnVmZmVy IGlzIGxvY2tlZCBmb3IgdXNhZ2UgKGNhbm5vdCBiZSByZXNpemVkKQogIFBSSVZBVEUgPSAjIFRo ZSBidWZmZXIgaXMgbWFwcGVkIGFzIGNvcHktb24td3JpdGUuCiAgSU1NVVRBQkxFID0gIyBUaGUg YnVmZmVyIGNhbm5vdCBiZSBtb2RpZmllZC4KCiAgIyBAcmV0dXJucyBbSU86OkJ1ZmZlcl0gQSBi dWZmZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHNpemUsIGFsbG9jYXRlZCBhY2NvcmRpbmcgdG8gdGhl IGdpdmVuIGZsYWdzLgogIGRlZiBpbml0aWFsaXplKHNpemUsIGZsYWdzKQogIGVuZAoKICAjIEBy ZXR1cm5zIFtJbnRlZ3JhbF0gVGhlIHNpemUgb2YgdGhlIGJ1ZmZlcgogIGF0dHIgOnNpemUKCiAg IyBAcmV0dXJucyBbU3RyaW5nXSBBIGJyaWVmIHN1bW1hcnkgYW5kIGhleCBkdW1wIG9mIHRoZSBi dWZmZXIuCiAgZGVmIGluc3BlY3QKICBlbmQKCiAgIyBAcmV0dXJucyBbU3RyaW5nXSBBIGJyaWVm IHN1bW1hcnkgb2YgdGhlIGJ1ZmZlci4KICBkZWYgdG9fcwogIGVuZAoKICAjIEZsYWcgcHJlZGlj YXRlczoKICBkZWYgZXh0ZXJuYWw/CiAgZW5kCgogIGRlZiBpbnRlcm5hbD8KICBlbmQKCiAgZGVm IG1hcHBlZD8KICBlbmQKCiAgZGVmIGxvY2tlZD8KICBlbmQKCiAgZGVmIGltbXV0YWJsZT8KICBl bmQKCiAgIyBGbGFncyBmb3IgZW5kaWFuL2J5dGUgb3JkZXI6CiAgTElUVExFX0VORElBTiA9ICMg Li4uCiAgQklHX0VORElBTiA9ICMgLi4uCiAgSE9TVF9FTkRJQU4gPSAjIC4uLgogIE5FVFdPUktf RU5ESUFOPSAjIC4uLgoKICAjIExvY2sgdGhlIGJ1ZmZlciAocHJldmVudCByZXNpemUsIHVubWFw LCBjaGFuZ2VzIHRvIGJhc2UgYW5kIHNpemUpLgogIGRlZiBsb2NrCiAgICByYWlzZSAiQWxyZWFk eSBsb2NrZWQhIiBpZiBmbGFncyAmIExPQ0tFRAogICAgCiAgICBmbGFncyB8PSBMT0NLRUQKICBl bmQKCiAgIyBVbmxvY2sgdGhlIGJ1ZmZlci4KICBkZWYgdW5sb2NrCiAgICByYWlzZSAiTm90IGxv Y2tlZCEiIHVubGVzcyBmbGFncyAmIExPQ0tFRAogICAgCiAgICBmbGFncyB8PSB+TE9DS0VECiAg ZW5kCgogIC8vIE1hbmlwdWxhdGlvbjoKICAjIEByZXR1cm5zIFtJTzo6QnVmZmVyXSBBIHNsaWNl IG9mIHRoZSBidWZmZXIncyBkYXRhLiBEb2VzIG5vdCBjb3B5LgogIGRlZiBzbGljZShvZmZzZXQs IGxlbmd0aCkKICBlbmQKCiAgIyBAcmV0dXJucyBbU3RyaW5nXSBBIGJpbmFyeSBzdHJpbmcgc3Rh cnRpbmcgYXQgb2Zmc2V0LCBsZW5ndGggYnl0ZXMuCiAgZGVmIHRvX3N0cihvZmZzZXQsIGxlbmd0 aCkKICBlbmQKCiAgIyBDb3B5IHRoZSBzcGVjaWZpZWQgc3RyaW5nIGludG8gdGhlIGJ1ZmZlciBh dCB0aGUgZ2l2ZW4gb2Zmc2V0LgogIGRlZiBjb3B5KHN0cmluZywgb2Zmc2V0KQogIGVuZAoKICAj IENvbXBhcmUgdHdvIGJ1ZmZlcnMuCiAgZGVmIDw9PihvdGhlcikKICBlbmQKCiAgaW5jbHVkZSBD b21wYXJhYmxlCgogICMgUmVzaXplIHRoZSBidWZmZXIsIHByZXNlcnZpbmcgdGhlIGdpdmVuIGxl bmd0aCAoaWYgbm9uLXplcm8pLgogIGRlZiByZXNpemUoc2l6ZSwgcHJlc2VydmUgPSAwKQogIGVu ZAoKICAjIENsZWFyIHRoZSBidWZmZXIgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KICBkZWYgY2xl YXIodmFsdWUgPSAwLCBvZmZzZXQgPSAwLCBsZW5ndGggPSAoQHNpemUgLSBvZmZzZXQpKQogIGVu ZAoKICAjIERhdGEgVHlwZXM6CiAgIyBMb3dlciBjYXNlOiBsaXR0bGUgZW5kaWFuLgogICMgVXBw ZXIgY2FzZTogYmlnIGVuZGlhbiAobmV0d29yayBlbmRpYW4pLgogICMKICAjIDpVOCAgICAgICAg fCB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VyLgogICMgOlM4ICAgICAgICB8IHNpZ25lZCA4LWJpdCBp bnRlZ2VyLgogICMKICAjIDp1MTYsIDpVMTYgfCB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlci4KICAj IDpzMTYsIDpTMTYgfCBzaWduZWQgMTYtYml0IGludGVnZXIuCiAgIwogICMgOnUzMiwgOlUzMiB8 IHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLgogICMgOnMzMiwgOlMzMiB8IHNpZ25lZCAzMi1iaXQg aW50ZWdlci4KICAjCiAgIyA6dTY0LCA6VTY0IHwgdW5zaWduZWQgNjQtYml0IGludGVnZXIuCiAg IyA6czY0LCA6UzY0IHwgc2lnbmVkIDY0LWJpdCBpbnRlZ2VyLgogICMKICAjIDpmMzIsIDpGMzIg fCAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgogICMgOmY2NCwgOkY2NCB8IDY0LWJpdCBm bG9hdGluZyBwb2ludCBudW1iZXIuCgogICMgR2V0IHRoZSBnaXZlbiBkYXRhIHR5cGUgYXQgdGhl IHNwZWNpZmllZCBvZmZzZXQuCiAgZGVmIGdldCh0eXBlLCBvZmZzZXQpCiAgZW5kCgogICMgU2V0 IHRoZSBnaXZlbiB2YWx1ZSBhcyB0aGUgc3BlY2lmaWVkIGRhdGEgdHlwZSBhdCB0aGUgc3BlY2lm aWVkIG9mZnNldC4KICBkZWYgc2V0KHR5cGUsIG9mZnNldCwgdmFsdWUpCiAgZW5kCmVuZApgYGAK ClRoZSBDIGludGVyZmFjZSBwcm92aWRlcyBhIGZldyBjb252ZW5pZW50IG1ldGhvZHMgZm9yIGFj Y2Vzc2luZyB0aGUgdW5kZXJseWluZyBkYXRhIGJ1ZmZlcjoKCmBgYGMKdm9pZCByYl9pb19idWZm ZXJfZ2V0X211dGFibGUoVkFMVUUgc2VsZiwgdm9pZCAqKmJhc2UsIHNpemVfdCAqc2l6ZSk7CnZv aWQgcmJfaW9fYnVmZmVyX2dldF9pbW11dGFibGUoVkFMVUUgc2VsZiwgY29uc3Qgdm9pZCAqKmJh c2UsIHNpemVfdCAqc2l6ZSk7CmBgYAoKSW4gdGhlIGZpYmVyIHNjaGVkdWxlciwgaXQgaXMgdXNl ZCBsaWtlIHRoaXM6CgpgYGBjClZBTFVFCnJiX2ZpYmVyX3NjaGVkdWxlcl9pb19yZWFkX21lbW9y eShWQUxVRSBzY2hlZHVsZXIsIFZBTFVFIGlvLCB2b2lkICpiYXNlLCBzaXplX3Qgc2l6ZSwgc2l6 ZV90IGxlbmd0aCkKewogICAgVkFMVUUgYnVmZmVyID0gcmJfaW9fYnVmZmVyX25ldyhiYXNlLCBz aXplLCBSQl9JT19CVUZGRVJfTE9DS0VEKTsKCiAgICBWQUxVRSByZXN1bHQgPSByYl9maWJlcl9z Y2hlZHVsZXJfaW9fcmVhZChzY2hlZHVsZXIsIGlvLCBidWZmZXIsIGxlbmd0aCk7CgogICAgcmJf aW9fYnVmZmVyX2ZyZWUoYnVmZmVyKTsKCiAgICByZXR1cm4gcmVzdWx0Owp9CmBgYAoKVGhpcyBm dW5jdGlvbiBpcyBpbnZva2VkIGZyb20gYGlvLmNgIGF0IHZhcmlvdXMgcGxhY2VzIHRvIGZpbGwg dGhlIGJ1ZmZlci4gV2Ugc3BlY2lmaWNhbGx5IHRoZSBgKGJhc2UsIHNpemUpYCB0dXBsZSwgYWxv bmcgd2l0aCBgbGVuZ3RoYCB3aGljaCBpcyB0aGUgKm1pbmltdW0qIGxlbmd0aCByZXF1aXJlZCBh bmQgYXNzaXN0cyB3aXRoIGVmZmljaWVudCBub24tYmxvY2tpbmcgaW1wbGVtZW50YXRpb24uCgpU aGUgYHVyaW5nLmNgIGltcGxlbWVudGF0aW9uIGluIHRoZSBldmVudCBnZW0gdXNlcyB0aGlzIGlu dGVyZmFjZSBsaWtlIHNvOgoKYGBgYwpWQUxVRSBFdmVudF9CYWNrZW5kX1VSaW5nX2lvX3JlYWQo VkFMVUUgc2VsZiwgVkFMVUUgZmliZXIsIFZBTFVFIGlvLCBWQUxVRSBidWZmZXIsIFZBTFVFIF9s ZW5ndGgpIHsKCXN0cnVjdCBFdmVudF9CYWNrZW5kX1VSaW5nICpkYXRhID0gTlVMTDsKCVR5cGVk RGF0YV9HZXRfU3RydWN0KHNlbGYsIHN0cnVjdCBFdmVudF9CYWNrZW5kX1VSaW5nLCAmRXZlbnRf QmFja2VuZF9VUmluZ19UeXBlLCBkYXRhKTsKCQoJaW50IGRlc2NyaXB0b3IgPSBSQl9OVU0ySU5U KHJiX2Z1bmNhbGwoaW8sIGlkX2ZpbGVubywgMCkpOwoJCgl2b2lkICpiYXNlOwoJc2l6ZV90IHNp emU7CglyYl9pb19idWZmZXJfZ2V0X211dGFibGUoYnVmZmVyLCAmYmFzZSwgJnNpemUpOwoJCglz aXplX3Qgb2Zmc2V0ID0gMDsKCXNpemVfdCBsZW5ndGggPSBOVU0yU0laRVQoX2xlbmd0aCk7CgkK CXdoaWxlIChsZW5ndGggPiAwKSB7CgkJc2l6ZV90IG1heGltdW1fc2l6ZSA9IHNpemUgLSBvZmZz ZXQ7CgkJaW50IHJlc3VsdCA9IGlvX3JlYWQoZGF0YSwgZmliZXIsIGRlc2NyaXB0b3IsIChjaGFy KiliYXNlK29mZnNldCwgbWF4aW11bV9zaXplKTsKCQkKCQlpZiAocmVzdWx0ID09IDApIHsKCQkJ YnJlYWs7CgkJfSBlbHNlIGlmIChyZXN1bHQgPiAwKSB7CgkJCW9mZnNldCArPSByZXN1bHQ7CgkJ CWlmICgoc2l6ZV90KXJlc3VsdCA+IGxlbmd0aCkgYnJlYWs7CgkJCWxlbmd0aCAtPSByZXN1bHQ7 CgkJfSBlbHNlIGlmICgtcmVzdWx0ID09IEVBR0FJTiB8fCAtcmVzdWx0ID09IEVXT1VMREJMT0NL KSB7CgkJCUV2ZW50X0JhY2tlbmRfVVJpbmdfaW9fd2FpdChzZWxmLCBmaWJlciwgaW8sIFJCX0lO VDJOVU0oUkVBREFCTEUpKTsKCQl9IGVsc2UgewoJCQlyYl9zeXNlcnJfZmFpbCgtcmVzdWx0LCBz dHJlcnJvcigtcmVzdWx0KSk7CgkJfQoJfQoJCglyZXR1cm4gU0laRVQyTlVNKG9mZnNldCk7Cn0K YGBgCgojIyBCdWZmZXIgQWxsb2NhdGlvbgoKVGhlIExpbnV4IGtlcm5lbCBwcm92aWRlcyBzb21l IGFkdmFuY2VkIG1lY2hhbmlzbXMgZm9yIHJlZ2lzdGVyaW5nIGJ1ZmZlcnMgZm9yIGFzeW5jaHJv bm91cyBJL08gdG8gcmVkdWNlIHBlci1vcGVyYXRpb24gb3ZlcmhlYWQuCgo+IFRoZSBpb191cmlu Z19yZWdpc3RlcigpIHN5c3RlbSBjYWxsIHJlZ2lzdGVycyB1c2VyIGJ1ZmZlcnMgb3IgZmlsZXMg Zm9yIHVzZSBpbiBhbiBpb191cmluZyg3KSBpbnN0YW5jZSByZWZlcmVuY2VkIGJ5IGZkLiBSZWdp c3RlcmluZyBmaWxlcyBvciB1c2VyIGJ1ZmZlcnMgYWxsb3dzIHRoZSBrZXJuZWwgdG8gdGFrZSBs b25nIHRlcm0gcmVmZXJlbmNlcyB0byBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgb3IgY3JlYXRl IGxvbmcgdGVybSBtYXBwaW5ncyBvZiBhcHBsaWNhdGlvbiBtZW1vcnksIGdyZWF0bHkgcmVkdWNp bmcgcGVyLUkvTyBvdmVyaGVhZC4KCldpdGggYXBwcm9wcmlhdGUgc3VwcG9ydCwgd2UgY2FuIHVz ZSBgSU9SSU5HX09QX1BST1ZJREVfQlVGRkVSU2AgdG8gZWZmaWNpZW50bHkgbWFuYWdlIGJ1ZmZl cnMgaW4gYXBwbGljYXRpb25zIHdoaWNoIGFyZSBkZWFsaW5nIHdpdGggbG90cyBvZiBzb2NrZXRz LiBTZWUgPGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2lvLXVyaW5nLzIwMjAwMjI4MjAzMDUzLjI1 MDIzLTEtYXhib2VAa2VybmVsLmRrL1QvPiBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IGhvdyBpdCB3 b3Jrcy4gSSdtIHN0aWxsIGV4cGxvcmluZyB0aGUgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zIG9m IHRoaXMsIGJ1dCB0aGUgcHJvcG9zZWQgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgc3VmZmljaWVu dCBtZXRhLWRhdGEgZm9yIHVzIHRvIGV4cGxvcmUgdGhpcyBpbiByZWFsIHdvcmxkIHNjaGVkdWxl cnMuCgoKCgotLSAKaHR0cHM6Ly9idWdzLnJ1YnktbGFuZy5vcmcvCgpVbnN1YnNjcmliZTogPG1h aWx0bzpydWJ5LWNvcmUtcmVxdWVzdEBydWJ5LWxhbmcub3JnP3N1YmplY3Q9dW5zdWJzY3JpYmU+ CjxodHRwOi8vbGlzdHMucnVieS1sYW5nLm9yZy9jZ2ktYmluL21haWxtYW4vb3B0aW9ucy9ydWJ5 LWNvcmU+Cg==