From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@sympa.inria.fr Delivered-To: caml-list@sympa.inria.fr Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id E1D397EE5B for ; Fri, 16 May 2014 09:54:48 +0200 (CEST) Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of bmillwood@janestreet.com) identity=pra; client-ip=38.105.200.115; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="bmillwood@janestreet.com"; x-sender="bmillwood@janestreet.com"; x-conformance=sidf_compatible Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of bmillwood@janestreet.com designates 38.105.200.115 as permitted sender) identity=mailfrom; client-ip=38.105.200.115; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="bmillwood@janestreet.com"; x-sender="bmillwood@janestreet.com"; x-conformance=sidf_compatible; x-record-type="v=spf1" Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@mxout1.mail.janestreet.com) identity=helo; client-ip=38.105.200.115; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="bmillwood@janestreet.com"; x-sender="postmaster@mxout1.mail.janestreet.com"; x-conformance=sidf_compatible X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AukAAO3DdVMmachznGdsb2JhbABZg1VYgmnBK1EacR4OAQEBAQEGFgk8gk8EGQEBMAgYDTcCBCASAQUBI4hTAwIIkGOQD4sad4NeAQWgUBECBI4CCz6DAIFLmVyRKBgphGhsAYEBAR4 X-IPAS-Result: AukAAO3DdVMmachznGdsb2JhbABZg1VYgmnBK1EacR4OAQEBAQEGFgk8gk8EGQEBMAgYDTcCBCASAQUBI4hTAwIIkGOQD4sad4NeAQWgUBECBI4CCz6DAIFLmVyRKBgphGhsAYEBAR4 X-IronPort-AV: E=Sophos;i="4.97,1065,1389740400"; d="scan'208";a="73999925" Received: from mxout2.mail.janestreet.com (HELO mxout1.mail.janestreet.com) ([38.105.200.115]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-SHA; 16 May 2014 09:54:47 +0200 Received: from tot-smtp.delacy.com ([172.27.22.15] helo=tot-smtp) by mxout1.mail.janestreet.com with esmtps (TLSv1.2:DHE-RSA-AES256-GCM-SHA384:256) (Exim 4.82) (envelope-from ) id 1WlCyc-0007Ac-6w for caml-list@inria.fr; Fri, 16 May 2014 03:54:46 -0400 Received: from tot-dmz-mxgoog1.delacy.com ([172.27.224.14] helo=mxgoog2.janestreet.com) by tot-smtp with esmtps (TLSv1:AES256-SHA:256) (Exim 4.72) (envelope-from ) id 1WlCyc-0006zh-3k for caml-list@inria.fr; Fri, 16 May 2014 03:54:46 -0400 Received: from mail-qg0-f49.google.com ([209.85.192.49]) by mxgoog2.janestreet.com with esmtp (Exim 4.76) (envelope-from ) id 1WlCyc-0007d0-1T for caml-list@inria.fr; Fri, 16 May 2014 03:54:46 -0400 Received: by mail-qg0-f49.google.com with SMTP id a108so3559461qge.22 for ; Fri, 16 May 2014 00:54:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=janestreet.com; s=google; h=mime-version:date:message-id:subject:from:to:content-type; bh=E0TpFfJMebOhUNIJJpPUf4C9nRE3K4fu6+hHGcay14s=; b=LWAxv87SJ+YPt6sU5S+gOW8KkhqxyNXzzy+WhvKBi0cACMzpokoVECJja0fAtYYEP2 eVP78mj7hr/I4DQag5HT+T2MMbjtJWQQ9Qi7ap1v564fX2+CblJ5xKDCscEFoQWkE9YG QvF029wpeXPDcCKVVr/Lw1PjwHaoMmZrrZAIg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to :content-type; bh=E0TpFfJMebOhUNIJJpPUf4C9nRE3K4fu6+hHGcay14s=; b=jesuECEVtoTZuewxaTj+p2QXaCIazmp7rQ7fs6mlT6Rg/S6yD2NV+/0uSUkx6L3rmC 0gUkhTj6OEZdyCL1W8g0nJ6MBuT+wNlgtTvg49ZKAaZnlMIN/rfZ+EvhHlXrjgNAHmwE ogen2UPvItQ4T5Wvrq/qK8yKMtFC1yVTce645Tw5KYjVZd/+E/Bkyrzf+OawDOW2kyWR RTLT+3I74nN3TihIcy5QtnzxLur80RxEycPejAA0LDUcEtOkFNODVV10hdmf/UROuaS+ k9Cef9Temg0aFOX+NdVdBhGbT/XvT1r8+NgFRDT6+GMM92LAvCA2U+U771iXnE69BO62 5O0g== X-Gm-Message-State: ALoCoQmWmWgvn1ZsKOr101TZbnL0lbC79sghSWu8bohcr3eTQYuyYYT4bP+p+4RWAvP7RalvQD4yZiAoNRB89Ra8lf8PZjR56w3RnBDcRzTFvL2FEaamTqW+LrFg6l1L0ezSPFjUZrJ8 X-Received: by 10.140.80.40 with SMTP id b37mr21548608qgd.98.1400226885899; Fri, 16 May 2014 00:54:45 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.140.80.40 with SMTP id b37mr21548595qgd.98.1400226885812; Fri, 16 May 2014 00:54:45 -0700 (PDT) Received: by 10.140.108.182 with HTTP; Fri, 16 May 2014 00:54:45 -0700 (PDT) Date: Fri, 16 May 2014 08:54:45 +0100 Message-ID: From: Ben Millwood To: ocaml-core@googlegroups.com, caml-list@inria.fr Content-Type: multipart/alternative; boundary=001a11c12ddc2254f904f97fba0a Subject: [Caml-list] [ANN] Core Suite 111.13.00 --001a11c12ddc2254f904f97fba0a Content-Type: text/plain; charset=UTF-8 I am delighted to announce the 111.13.00 release of the Core suite. The following packages were upgraded: - async - async_extra - async_unix - bignum - core - core_extended - core_kernel - patdiff - sexplib - type_conv With this release, we are also including a new package, patience_diff. There's no new code here, but it's been extracted from core_extended since it only really requires core_kernel, and can now be compiled to JavaScript, cf. https://github.com/samoht/irminsule/issues/39 Files and documentation for this release are available on our website and all packages are in opam: https://ocaml.janestreet.com/ocaml-core/111.13.00/individual/ https://ocaml.janestreet.com/ocaml-core/111.13.00/doc/ Here is the list of changes for this version: ## async_extra - For `Typed_tcp.create`, added a `Client_id.t` argument to the `auth` callback. ## async_unix - Added `Scheduler.yield_every`, which returns a function that calls `Scheduler.yield` every n-th call. This is useful in circumstances where you don't have strict control over where a deferred is examined, as in a `Deferred.List.iter`. ## bignum - Eliminated the dependence of `Bignum` on `Re2`, and reduced dependence from `Core` to `Core_kernel`. - Extended the rounding interface to bring it in line with int and float rounding. - Improved the performance of `Bignum`'s binprot. `Bignum`'s binprot had been to just binprot the decimal string representation. This is both slow to do and unnecessarily big in the majority of cases. Did something better in the majority of cases and fell back to this representation in the exceptional case. $ ./inline_benchmarks_runner Estimated testing time 20s (2 benchmarks x 10s). Change using -quota SECS. | Name | Time/Run | mWd/Run | Percentage | |------------------------------------------------------|----------|-----------|------------| | bignum0.ml:Stable:Bignum binprot roundtrip compact | 7.87us | 490.00w | 32.88% | | bignum0.ml:Stable:Bignum binprot roundtrip classic | 23.94us | 1_079.00w | 100.00% | ## core_extended - Moved `Patience_diff` out of `Core_extended` into its own library. ## core_kernel - Added a `Sequence` module that implements polymorphic, on-demand sequences. Also implemented conversion to `Sequence.t` from various containers. - Improved the explicitness and expressiveness of `Binary_searchable.binary_search`. `binary_search` now takes an additional (polymorphic variant) argument describing the relationship of the returned position to the element being searched for. val binary_search : ?pos:int -> ?len:int -> t -> compare:(elt -> elt -> int) -> [ `Last_strictly_less_than (** {v | < elt X | v} *) | `Last_less_than_or_equal_to (** {v | <= elt X | v} *) | `Last_equal_to (** {v | = elt X | v} *) | `First_equal_to (** {v | X = elt | v} *) | `First_greater_than_or_equal_to (** {v | X >= elt | v} *) | `First_strictly_greater_than (** {v | X > elt | v} *) ] -> elt -> int option - Added a new function, `Binary_searchable.binary_search_segmented`, that can search an array consisting of two segments, rather than ordered by `compare`. (** [binary_search_segmented ?pos ?len t ~segment_of which] takes an [segment_of] function that divides [t] into two (possibly empty) segments: {v | segment_of elt = `Left | segment_of elt = `Right | v} [binary_search_segmented] returns the index of the element on the boundary of the segments as specified by [which]: [`Last_on_left] yields the index of the last element of the left segment, while [`First_on_right] yields the index of the first element of the right segment. It returns [None] if the segment is empty. By default, [binary_search] searches the entire [t]. One can supply [?pos] or [?len] to search a slice of [t]. [binary_search_segmented] does not check that [segment_of] segments [t] as in the diagram, and behavior is unspecified if [segment_of] doesn't segment [t]. Behavior is also unspecified if [segment_of] mutates [t]. *) val binary_search_segmented : ?pos:int -> ?len:int -> t -> segment_of:(elt -> [ `Left | `Right ]) -> [ `Last_on_left | `First_on_right ] -> int option - Made `Queue` match `Binary_searchable.S1`. - Made `Gc.Stat` and `Gc.Control` match `Comparable`. - Fixed some unit tests in `Type_immediacy` that were fragile due to GC. ## sexplib - In `Sexplib.Std`, renamed `Macro` as `Sexp_macro`. ## type_conv - Removed some unused-value warnings when `with` is used in signatures. Removed warnings in cases like: include (module_expr : sig type t with bin_io end) --- We hope you find it useful! -- Ben Millwood, on behalf of the Core team --001a11c12ddc2254f904f97fba0a Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdj48ZGl2PjxkaXY+PGRpdj48ZGl2PjxkaXY+ PGRpdj48ZGl2PjxkaXY+PGRpdj48ZGl2PkkgYW0gZGVsaWdodGVkIHRvIGFu bm91bmNlIHRoZSAxMTEuMTMuMDAgcmVsZWFzZSBvZiB0aGUgQ29yZSBzdWl0 ZS48YnI+PGJyPjwvZGl2PlRoZSBmb2xsb3dpbmcgcGFja2FnZXMgd2VyZSB1 cGdyYWRlZDo8YnI+PGJyPjwvZGl2PjxkaXY+LSBhc3luYzxicj48L2Rpdj4N Cg0KLSBhc3luY19leHRyYTxicj48L2Rpdj4tIGFzeW5jX3VuaXg8YnI+PC9k aXY+LSBiaWdudW08YnI+PC9kaXY+LSBjb3JlPGJyPjwvZGl2Pi0gY29yZV9l eHRlbmRlZDxicj48L2Rpdj4tIGNvcmVfa2VybmVsPGJyPjwvZGl2Pi0gcGF0 ZGlmZjxicj48L2Rpdj4tIHNleHBsaWI8YnI+PC9kaXY+LSB0eXBlX2NvbnY8 YnI+PGJyPjwvZGl2PldpdGggdGhpcyByZWxlYXNlLCB3ZSBhcmUgYWxzbyBp bmNsdWRpbmcgYSBuZXcgcGFja2FnZSwgcGF0aWVuY2VfZGlmZi4gVGhlcmUm IzM5O3Mgbm8gbmV3IGNvZGUgaGVyZSwgYnV0IGl0JiMzOTtzIGJlZW4gZXh0 cmFjdGVkIGZyb20gY29yZV9leHRlbmRlZCBzaW5jZSBpdCBvbmx5IHJlYWxs eSByZXF1aXJlcyBjb3JlX2tlcm5lbCwgYW5kIGNhbiBub3cgYmUgY29tcGls ZWQgdG8gSmF2YVNjcmlwdCwgY2YuIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9zYW1vaHQvaXJtaW5zdWxlL2lzc3Vlcy8zOSIgdGFyZ2V0PSJfYmxh bmsiPmh0dHBzOi8vZ2l0aHViLmNvbS9zYW1vaHQvaXJtaW5zdWxlL2lzc3Vl cy8zOTwvYT48YnI+DQoNCjxicj48ZGl2PjxkaXY+RmlsZXMgYW5kIGRvY3Vt ZW50YXRpb24gZm9yIHRoaXMgcmVsZWFzZSBhcmUgYXZhaWxhYmxlIG9uIG91 ciB3ZWJzaXRlIGFuZCBhbGwgcGFja2FnZXMgYXJlIGluIG9wYW06PC9kaXY+ PGRpdj48YnI+PC9kaXY+PGRpdj7CoCA8YSBocmVmPSJodHRwczovL29jYW1s LmphbmVzdHJlZXQuY29tL29jYW1sLWNvcmUvMTExLjEzLjAwL2luZGl2aWR1 YWwvIiB0YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9vY2FtbC5qYW5lc3RyZWV0 LmNvbS9vY2FtbC1jb3JlLzExMS4xMy4wMC9pbmRpdmlkdWFsLzwvYT48L2Rp dj4NCg0KDQoNCg0KPGRpdj7CoCA8YSBocmVmPSJodHRwczovL29jYW1sLmph bmVzdHJlZXQuY29tL29jYW1sLWNvcmUvMTExLjEzLjAwL2RvYy8iIHRhcmdl dD0iX2JsYW5rIj5odHRwczovL29jYW1sLmphbmVzdHJlZXQuY29tL29jYW1s LWNvcmUvMTExLjEzLjAwL2RvYy88L2E+PC9kaXY+PGRpdj48YnI+PC9kaXY+ PGRpdj5IZXJlIGlzIHRoZSBsaXN0IG9mIGNoYW5nZXMgZm9yIHRoaXMgdmVy c2lvbjo8YnI+DQoNCjxicj4jIyBhc3luY19leHRyYTxicj48YnI+LSBGb3Ig YFR5cGVkX3RjcC5jcmVhdGVgLCBhZGRlZCBhIGBDbGllbnRfaWQudGAgYXJn dW1lbnQgdG8gdGhlIGBhdXRoYDxicj7CoCBjYWxsYmFjay48YnI+PGJyPiMj IGFzeW5jX3VuaXg8YnI+PGJyPi0gQWRkZWQgYFNjaGVkdWxlci55aWVsZF9l dmVyeWAsIHdoaWNoIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNhbGxzIGBT Y2hlZHVsZXIueWllbGRgIGV2ZXJ5IG4tdGggY2FsbC48YnI+DQoNCjxicj7C oMKgwqAgVGhpcyBpcyB1c2VmdWwgaW4gY2lyY3Vtc3RhbmNlcyB3aGVyZSB5 b3UgZG9uJiMzOTt0IGhhdmUgc3RyaWN0IGNvbnRyb2wgb3ZlciB3aGVyZSBh IGRlZmVycmVkIGlzIGV4YW1pbmVkLCBhcyBpbiBhIGBEZWZlcnJlZC5MaXN0 Lml0ZXJgLjxicj48YnI+IyMgYmlnbnVtPGJyPjxicj4tIEVsaW1pbmF0ZWQg dGhlIGRlcGVuZGVuY2Ugb2YgYEJpZ251bWAgb24gYFJlMmAsIGFuZCByZWR1 Y2VkIGRlcGVuZGVuY2UgZnJvbSBgQ29yZWAgdG8gYENvcmVfa2VybmVsYC48 YnI+DQoNCi0gRXh0ZW5kZWQgdGhlIHJvdW5kaW5nIGludGVyZmFjZSB0byBi cmluZyBpdCBpbiBsaW5lIHdpdGggaW50IGFuZCBmbG9hdCByb3VuZGluZy48 YnI+LSBJbXByb3ZlZCB0aGUgcGVyZm9ybWFuY2Ugb2YgYEJpZ251bWAmIzM5 O3MgYmlucHJvdC48YnI+PGJyPsKgwqDCoCBgQmlnbnVtYCYjMzk7cyBiaW5w cm90IGhhZCBiZWVuIHRvIGp1c3QgYmlucHJvdCB0aGUgZGVjaW1hbCBzdHJp bmcgcmVwcmVzZW50YXRpb24uwqAgVGhpcyBpcyBib3RoIHNsb3cgdG8gZG8g YW5kIHVubmVjZXNzYXJpbHkgYmlnIGluIHRoZSBtYWpvcml0eSBvZiBjYXNl cy7CoCBEaWQgc29tZXRoaW5nIGJldHRlciBpbiB0aGUgbWFqb3JpdHkgb2Yg Y2FzZXMgYW5kIGZlbGwgYmFjayB0byB0aGlzIHJlcHJlc2VudGF0aW9uIGlu IHRoZSBleGNlcHRpb25hbCBjYXNlLjxicj4NCg0KPGJyPsKgwqDCoMKgwqDC oMKgICQgLi9pbmxpbmVfYmVuY2htYXJrc19ydW5uZXI8YnI+wqDCoMKgwqDC oMKgwqAgRXN0aW1hdGVkIHRlc3RpbmcgdGltZSAyMHMgKDIgYmVuY2htYXJr cyB4IDEwcykuIENoYW5nZSB1c2luZyAtcXVvdGEgU0VDUy48YnI+PGJyPsKg wqDCoCB8IE5hbWXCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgfCBUaW1lL1J1biB8wqDCoCBtV2QvUnVuIHwg UGVyY2VudGFnZSB8PGJyPg0KDQrCoMKgwqAgfC0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0t LS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLXw8YnI+wqDCoMKgIHwgYmln bnVtMC5tbDpTdGFibGU6QmlnbnVtIGJpbnByb3Qgcm91bmR0cmlwIGNvbXBh Y3TCoMKgIHzCoMKgIDcuODd1cyB8wqDCoCA0OTAuMDB3IHzCoMKgwqDCoCAz Mi44OCUgfDxicj7CoMKgwqAgfCBiaWdudW0wLm1sOlN0YWJsZTpCaWdudW0g YmlucHJvdCByb3VuZHRyaXAgY2xhc3NpY8KgwqAgfMKgIDIzLjk0dXMgfCAx XzA3OS4wMHcgfMKgwqDCoCAxMDAuMDAlIHw8YnI+DQoNCjxicj4jIyBjb3Jl X2V4dGVuZGVkPGJyPjxicj4tIE1vdmVkIGBQYXRpZW5jZV9kaWZmYCBvdXQg b2YgYENvcmVfZXh0ZW5kZWRgIGludG8gaXRzIG93biBsaWJyYXJ5Ljxicj48 YnI+IyMgY29yZV9rZXJuZWw8YnI+PGJyPi0gQWRkZWQgYSBgU2VxdWVuY2Vg IG1vZHVsZSB0aGF0IGltcGxlbWVudHMgcG9seW1vcnBoaWMsIG9uLWRlbWFu ZCBzZXF1ZW5jZXMuPGJyPjxicj7CoMKgwqAgQWxzbyBpbXBsZW1lbnRlZCBj b252ZXJzaW9uIHRvIGBTZXF1ZW5jZS50YCBmcm9tIHZhcmlvdXMgY29udGFp bmVycy48YnI+DQoNCjxicj4tIEltcHJvdmVkIHRoZSBleHBsaWNpdG5lc3Mg YW5kIGV4cHJlc3NpdmVuZXNzIG9mIGBCaW5hcnlfc2VhcmNoYWJsZS5iaW5h cnlfc2VhcmNoYC48YnI+PGJyPsKgwqDCoCBgYmluYXJ5X3NlYXJjaGAgbm93 IHRha2VzIGFuIGFkZGl0aW9uYWwgKHBvbHltb3JwaGljIHZhcmlhbnQpIGFy Z3VtZW50IGRlc2NyaWJpbmcgdGhlIHJlbGF0aW9uc2hpcCBvZiB0aGUgcmV0 dXJuZWQgcG9zaXRpb24gdG8gdGhlIGVsZW1lbnQgYmVpbmcgc2VhcmNoZWQg Zm9yLjxicj4NCg0KPGJyPsKgwqDCoMKgwqDCoMKgIHZhbCBiaW5hcnlfc2Vh cmNoPGJyPsKgwqDCoMKgwqDCoMKgwqDCoCA6wqAgP3BvczppbnQ8YnI+wqDC oMKgwqDCoMKgwqDCoMKgIC0mZ3Q7ID9sZW46aW50PGJyPsKgwqDCoMKgwqDC oMKgwqDCoCAtJmd0OyB0PGJyPsKgwqDCoMKgwqDCoMKgwqDCoCAtJmd0OyBj b21wYXJlOihlbHQgLSZndDsgZWx0IC0mZ3Q7IGludCk8YnI+wqDCoMKgwqDC oMKgwqDCoMKgIC0mZ3Q7IFsgYExhc3Rfc3RyaWN0bHlfbGVzc190aGFuwqDC oMKgwqDCoMKgwqDCoCAoKioge3YgfCAmbHQ7IGVsdCBYIHzCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2fSAqKTxicj4N Cg0KwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwgYExhc3RfbGVzc190aGFu X29yX2VxdWFsX3RvwqDCoMKgwqDCoCAoKioge3YgfMKgwqDCoMKgwqAgJmx0 Oz0gZWx0wqDCoMKgwqDCoMKgIFggfMKgwqDCoMKgwqDCoMKgwqDCoMKgIHZ9 ICopPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8IGBMYXN0X2VxdWFs X3RvwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICgqKiB7 dsKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoMKgID0gZWx0IFggfMKgwqDCoMKg wqDCoMKgwqDCoMKgIHZ9ICopPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB8IGBGaXJzdF9lcXVhbF90b8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgKCoqIHt2wqDCoMKgwqDCoMKgwqDCoMKgwqAgfCBYID0gZWx0 wqDCoCB8wqDCoMKgwqDCoMKgwqDCoMKgwqAgdn0gKik8YnI+DQoNCsKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCB8IGBGaXJzdF9ncmVhdGVyX3RoYW5fb3Jf ZXF1YWxfdG/CoCAoKioge3bCoMKgwqDCoMKgwqDCoMKgwqDCoCB8IFjCoMKg wqDCoMKgwqAgJmd0Oz0gZWx0wqDCoMKgwqDCoCB8IHZ9ICopPGJyPsKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCB8IGBGaXJzdF9zdHJpY3RseV9ncmVhdGVy X3RoYW7CoMKgwqDCoCAoKioge3bCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCB8IFggJmd0OyBlbHQgfCB2fSAqKTxicj7C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXTxicj4NCsKgwqDCoMKgwqDCoMKg wqDCoCAtJmd0OyBlbHQ8YnI+DQrCoMKgwqDCoMKgwqDCoMKgwqAgLSZndDsg aW50IG9wdGlvbjxicj48YnI+LSBBZGRlZCBhIG5ldyBmdW5jdGlvbiwgYEJp bmFyeV9zZWFyY2hhYmxlLmJpbmFyeV9zZWFyY2hfc2VnbWVudGVkYCwgdGhh dCBjYW4gc2VhcmNoIGFuIGFycmF5IGNvbnNpc3Rpbmcgb2YgdHdvIHNlZ21l bnRzLCByYXRoZXIgdGhhbiBvcmRlcmVkIGJ5IGBjb21wYXJlYC48YnI+PGJy PsKgwqDCoMKgwqDCoMKgICgqKiBbYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQg P3BvcyA/bGVuIHQgfnNlZ21lbnRfb2Ygd2hpY2hdIHRha2VzIGFuIFtzZWdt ZW50X29mXTxicj4NCg0KwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmdW5jdGlv biB0aGF0IGRpdmlkZXMgW3RdIGludG8gdHdvIChwb3NzaWJseSBlbXB0eSkg c2VnbWVudHM6PGJyPjxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHt2PGJy PsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwgc2VnbWVudF9vZiBlbHQg PSBgTGVmdCB8IHNlZ21lbnRfb2YgZWx0ID0gYFJpZ2h0IHw8YnI+wqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB2fTxicj48YnI+wqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBbYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRdIHJldHVybnMgdGhlIGlu ZGV4IG9mIHRoZSBlbGVtZW50IG9uIHRoZSBib3VuZGFyeSBvZiB0aGU8YnI+ DQoNCsKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2VnbWVudHMgYXMgc3BlY2lm aWVkIGJ5IFt3aGljaF06IFtgTGFzdF9vbl9sZWZ0XSB5aWVsZHMgdGhlIGlu ZGV4IG9mIHRoZSBsYXN0PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZWxl bWVudCBvZiB0aGUgbGVmdCBzZWdtZW50LCB3aGlsZSBbYEZpcnN0X29uX3Jp Z2h0XSB5aWVsZHMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdDxicj7CoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGVsZW1lbnQgb2YgdGhlIHJpZ2h0IHNlZ21lbnQu wqAgSXQgcmV0dXJucyBbTm9uZV0gaWYgdGhlIHNlZ21lbnQgaXMgZW1wdHku PGJyPg0KDQo8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBCeSBkZWZhdWx0 LCBbYmluYXJ5X3NlYXJjaF0gc2VhcmNoZXMgdGhlIGVudGlyZSBbdF0uwqAg T25lIGNhbiBzdXBwbHkgWz9wb3NdIG9yPGJyPsKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgWz9sZW5dIHRvIHNlYXJjaCBhIHNsaWNlIG9mIFt0XS48YnI+PGJy PsKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgW2JpbmFyeV9zZWFyY2hfc2VnbWVu dGVkXSBkb2VzIG5vdCBjaGVjayB0aGF0IFtzZWdtZW50X29mXSBzZWdtZW50 cyBbdF0gYXMgaW4gdGhlPGJyPg0KDQrCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGRpYWdyYW0sIGFuZCBiZWhhdmlvciBpcyB1bnNwZWNpZmllZCBpZiBbc2Vn bWVudF9vZl0gZG9lc24mIzM5O3Qgc2VnbWVudCBbdF0uwqAgQmVoYXZpb3I8 YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpcyBhbHNvIHVuc3BlY2lmaWVk IGlmIFtzZWdtZW50X29mXSBtdXRhdGVzIFt0XS4gKik8YnI+wqDCoMKgwqDC oMKgwqAgdmFsIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkPGJyPsKgwqDCoMKg wqDCoMKgwqDCoCA6wqAgP3BvczppbnQ8YnI+DQoNCsKgwqDCoMKgwqDCoMKg wqDCoCAtJmd0OyA/bGVuOmludDxicj7CoMKgwqDCoMKgwqDCoMKgwqAgLSZn dDsgdDxicj7CoMKgwqDCoMKgwqDCoMKgwqAgLSZndDsgc2VnbWVudF9vZjoo ZWx0IC0mZ3Q7IFsgYExlZnQgfCBgUmlnaHQgXSk8YnI+wqDCoMKgwqDCoMKg wqDCoMKgIC0mZ3Q7IFsgYExhc3Rfb25fbGVmdCB8IGBGaXJzdF9vbl9yaWdo dCBdPGJyPsKgwqDCoMKgwqDCoMKgwqDCoCAtJmd0OyBpbnQgb3B0aW9uPGJy Pjxicj4tIE1hZGUgYFF1ZXVlYCBtYXRjaCBgQmluYXJ5X3NlYXJjaGFibGUu UzFgLjxicj4NCg0KLSBNYWRlIGBHYy5TdGF0YCBhbmQgYEdjLkNvbnRyb2xg IG1hdGNoIGBDb21wYXJhYmxlYC48YnI+LSBGaXhlZCBzb21lIHVuaXQgdGVz dHMgaW4gYFR5cGVfaW1tZWRpYWN5YCB0aGF0IHdlcmUgZnJhZ2lsZSBkdWUg dG8gR0MuPGJyPjxicj4jIyBzZXhwbGliPGJyPjxicj4tIEluIGBTZXhwbGli LlN0ZGAsIHJlbmFtZWQgYE1hY3JvYCBhcyBgU2V4cF9tYWNyb2AuPGJyPjxi cj4jIyB0eXBlX2NvbnY8YnI+DQoNCjxicj4tIFJlbW92ZWQgc29tZSB1bnVz ZWQtdmFsdWUgd2FybmluZ3Mgd2hlbiBgd2l0aGAgaXMgdXNlZCBpbiBzaWdu YXR1cmVzLjxicj48YnI+wqDCoMKgIFJlbW92ZWQgd2FybmluZ3MgaW4gY2Fz ZXMgbGlrZTo8YnI+PGJyPsKgwqDCoMKgwqDCoMKgIGluY2x1ZGUgKG1vZHVs ZV9leHByIDogc2lnIHR5cGUgdCB3aXRoIGJpbl9pbyBlbmQpPGJyPjxicj4t LS08YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+DQo8ZGl2Pg0KV2UgaG9wZSB5 b3UgZmluZCBpdCB1c2VmdWwhPGJyPjxicj48L2Rpdj48ZGl2Pi0tIEJlbiBN aWxsd29vZCwgb24gYmVoYWxmIG9mIHRoZSBDb3JlIHRlYW08YnI+PC9kaXY+ DQoNCjwvZGl2Pjxicj48L2Rpdj4NCg== --001a11c12ddc2254f904f97fba0a--