Caml1999I0311Y #&"R.Stdlib__String!t8@@@A&stringO@@@g@@@@*string.mliRR@@@@@A@$make@#intA@@@h@$charB@@@i @@@j@@k@@l@UU@@/A@$init@@@@m@@%@@@n!@@@o@@p?@@@q@@r@@s@=[||>[|@@NB@%emptyL@@@t@JbKb@@[C@(of_bytes@%bytesC@@@ua@@@v@@w@_h`h@@pD@(to_bytes@p@@@x@@@y@@z@roNNsoNl@@E@&length@@@@{u@@@|@@}.%string_lengthAA @@@vv @@F@#get@@@@~@@@@@@@@@@@0%string_safe_getBA@@@@yRRyR@@G@&concat@@@@@$listI@@@@@@@@@@@@@@@@H@#cat@@@@@@@@@@@@@@@@@@I@%equal@@@@@@@@$boolE@@@@@@@@@@ J@'compare@@@@@@@@@@@@@@@@:::U@@#K@+starts_with&prefix%@@@@+@@@4@@@@@@@@-.P@@>L@)ends_with&suffix@@@@@F@@@O@@@@@@@@HI@@YM@-contains_from@Y@@@@M@@@@K@@@n@@@@@@@@@@gh@@xN@.rcontains_from@x@@@@l@@@@j@@@@@@@@@@@@@eee@@O@(contains@@@@@@@@@@@@@@@@___@@P@#sub@@@@@@@@@@@@@@@@@@@@@@@@Q@-split_on_char@@@@@@@@@@@@@@@@@@@4@@R@#map@@@@@@@@@@@@@@@@@@@@@@VVV@@ S@$mapi@@@@@@@@@@@@@@@@@@@@"@@@@@@@@ !<@@1T@)fold_left@@!a@@@@@ @@@@@ @A@@@@@@@@@@?@@@PU@*fold_right@@8@@@@!a@@@@@@^@@@@  @@@@@@@^ v v_ v @@oV@'for_all@@W@@@z@@@@@@{@@@@@@@@@@@}!C!C~!C!q@@W@&exists@@v@@@@@@@@@@@@@@@@@@@@!!!"@@X@$trim@@@@@@@@@@"s"s"s"@@Y@'escaped@@@@@@@@@@#;#;#;#Y@@Z@/uppercase_ascii@@@@@@@@@@ %l%l %l%@@[@/lowercase_ascii@@@@@@@@@@&<&<&<&b@@\@0capitalize_ascii@@@@@@@@@@' ' ' '3@@ ]@2uncapitalize_ascii@ @@@@@@@@@''''@@^@$iter@@@@@$unitF@@@@@@-@@@ @@@@@@@@/#((0#((@@@_@%iteri@@0@@@ @.@@@ '@@@ @@ @@ @R@@@1@@@@@@@@T'))U'))@@e`@*index_from@e@@@@Y@@@@W@@@c@@@@@@@@@@s/*U*Ut/*U*@@a@.index_from_opt @@@@@x@@@@v@@@&optionJ@@@@@@@@@@@@ @7+t+t7+t+@@b@+rindex_from @@@@!@@@@"@@@@#@@@$@@%@@&@@'@>,t,t>,t,@@c@/rindex_from_opt @@@@(@@@@)@@@@*E@@@+@@@,@@-@@.@@/@E--E--@@d@%index @@@@0@@@@1@@@2@@3@@4@L..L..@@e@)index_opt @@@@5@@@@6|@@@7@@@8@@9@@:@O..O./$@@$f@&rindex@$@@@;@@@@<@@@=@@>@@?@,T/s/s-T/s/@@=g@*rindex_opt@=@@@@@)@@@A9@@@B@@@C@@D@@E@JW//KW/0@@[h@&to_seq@i@@@F&Stdlib#Seq!tN@@@G@@@H@@I@g^00h^00@@xi@'to_seqi@@@@J#Seq!ts@@@Lp@@@K@@M@@@N@@O@e1~1~e1~1@@j@&of_seq@<#Seq!t@@@P@@@Q@@@R@@S@j22j22 @@k@/get_utf_8_uchar@@@@T@@@@U_%Uchar*utf_decode@@@V@@W@@X@u22u22@@l@.is_valid_utf_8@@@@Y@@@Z@@[@y3O3Oy3O3m@@m@2get_utf_16be_uchar@@@@\@@@@]%Uchar*utf_decode@@@^@@_@@`@3334@@n@1is_valid_utf_16be@ @@@a@@@b@@c@4q4q4q4@@o@2get_utf_16le_uchar@@@@d@@@@e%Uchar*utf_decode@@@f@@g@@h@5555C@@)p@1is_valid_utf_16le@7@@@i1@@@j@@k@*55+55@@;q@&create@)@@@l@@@m@@n2caml_create_stringAA@@@A6G6GB6}6@0ocaml.deprecatedH6}6I6}6@ ,Use Bytes.create/BytesLabels.create instead.S6}6T6}6@@V6}6W6}6@@@@@Y6}6@@ir@#set@@@@o@]@@@p@[@@@qT@@@r@@s@@t@@u0%string_safe_setCA@@@@@}77~8(8g@0ocaml.deprecated8(8-8(8=@ &Use Bytes.set/BytesLabels.set instead.8(8?8(8e@@8(8>8(8f@@@@@8(8*@@s@$blit@@@@v@@@@w@V@@@x@@@@y@@@@z@@@{@@|@@}@@~@@@@@9999@@t@$copy@@@@@@@@@@;;;;;W;@0ocaml.deprecated;W;\;W;l@ &Strings now immutable: no need to copy;W;n;W;@@;W;m;W;@@@@@;W;Y@@u@$fill@@@@@@@@@@@@@@@@@@@@@@@@@@@@<3<3>K@0ocaml.deprecated?==@=>@ @Use String.uppercase_ascii/StringLabels.uppercase_ascii instead.J>> K>>I@@M>>N>>J@@@@@P==@@`w@)lowercase@`@@@d@@@@@@b?C?Cc?z?@0ocaml.deprecatedi?d?ij?d?y@ @Use String.lowercase_ascii/StringLabels.lowercase_ascii instead.t?z?u?z?@@w?z?~x?z?@@@@@z?d?f@@x@*capitalize @@@@@@@@@@@@@A:@0ocaml.deprecated@@@@@ BUse String.capitalize_ascii/StringLabels.capitalize_ascii instead.@@@A8@@@@@A9@@@@@@@@@y@,uncapitalize!@@@@@@@@@@BBBHB@0ocaml.deprecatedB2B7B2BG@ FUse String.uncapitalize_ascii/StringLabels.uncapitalize_ascii instead.BHBMBHB@@BHBLBHB@@@@@B2B4@@z@)get_uint8"@@@@@@@@@@@@@@@@GGGG<@@{@(get_int8#@@@@@@@@@@@@@@@@GGGG@@|@-get_uint16_ne$@@@@@@@@@@@@@@@@H>H>H>Hf@@)}@-get_uint16_be%@)@@@@@@@!@@@@@@@@1HH2HI@@B~@-get_uint16_le&@B@@@@6@@@:@@@@@@@@JIIKII@@[@,get_int16_ne'@[@@@@O@@@S@@@@@@@@cJ?J?dJ?Jf@@t@@,get_int16_be(@t@@@@h@@@l@@@@@@@@|#JJ}#JK@@A@,get_int16_le)@@@@@@@@@@@@@@@@*KK*KK@@B@,get_int32_ne*@@@@@@@@%int32L@@@@@@@@1L4L41L4L]@@C@,get_int32_be+@@@@@@@@@@@@@@@@8LL8LM@@D@,get_int32_le,@@@@@@@@4@@@@@@@@?MwMw?MwM@@E@,get_int64_ne-@@@@@@@@%int64M@@@@@@@@FNNFNNC@@F@,get_int64_be.@@@@@@@@@@@@@@@@MNNMNN@@'G@,get_int64_le/@'@@@@@@@4@@@@@@@@/TO]O]0TO]O@@@H@*unsafe_get0@@@@@@4@@@0@@@@@@@2%string_unsafe_getBAà@@@@M_PLPLN_PLP@@^I@*unsafe_set1@@@@@R@@@@P@@@I@@@@@@@@@2%string_unsafe_setCA@@@@@r`PPsaPP@0ocaml.deprecatedyaPPzaPP@@}aPP @@J@+unsafe_blit2@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@0caml_blit_stringE@"@@@@@@@bPPdQ1QZ@'noallocdQ1QRdQ1QY@@dQ1QO @@K@+unsafe_fill3@o@@@@@@@@@@@@@@@@@@@@@@@@@@0caml_fill_stringD@Y@@@@@@eQ[Q[gQQ@'noallocfQrQfQrQ@@fQrQfQrQ@0ocaml.deprecatedgQQgQQ@@gQQ@@ L@@r[.Stdlib__String0L%BWx:6-Stdlib__Uchar0 |K?bޣ ˠ+Stdlib__Seq0yt\eǟ&Q,}.Stdlib__Either0 }rCT0J){9)&Stdlib0>,W:(8CamlinternalFormatBasics0cEXy= 0] and [start], [start+len] are positions of [s]. {b Unicode text.} Strings being arbitrary sequences of bytes, they can hold any kind of textual encoding. However the recommended encoding for storing Unicode text in OCaml strings is UTF-8. This is the encoding used by Unicode escapes in string literals. For example the string ["\u{1F42B}"] is the UTF-8 encoding of the Unicode character U+1F42B. {b Past mutability.} OCaml strings used to be modifiable in place, for instance via the {!String.set} and {!String.blit} functions. This use is nowadays only possible when the compiler is put in "unsafe-string" mode by giving the [-unsafe-string] command-line option. This compatibility mode makes the types [string] and [bytes] (see {!Bytes.t}) interchangeable so that functions expecting byte sequences can also accept strings as arguments and modify them. The distinction between [bytes] and [string] was introduced in OCaml 4.02, and the "unsafe-string" compatibility mode was the default until OCaml 4.05. Starting with 4.06, the compatibility mode is opt-in; we intend to remove the option in the future. The labeled version of this module can be used as described in the {!StdLabels} module. *string.mliXNfh@@@@@@0@@@@@@%arrayH8@@M@A@A@@@@@@8@@@$boolE8@@%false^@@B@$true_@@H@@@A@@@@@I@A@$charB8@@@A@@@@@M@A@#exnG8@@AA@@@@@Q@@@5extension_constructorP8@@@A@@@@@U@@@%floatD8@@@A@@@@@Y@@@*floatarrayQ8@@@A@@@@@]@@@#intA8@@@A@@@@@a@A@%int32L8@@@A@@@@@e@@@%int64M8@@@A@@@@@i@@@&lazy_tN8@@O@A@A@Y@@@@@r@@@$listI8@@P@A"[]a@@@"::b@@@Q@@@ @@A@Y@@@@@@@@)nativeintK8@@@A@@@@@@@@&optionJ8@@S@A$Nonec@@@$Somed@@@@@A@Y@@@@@@@@&stringO8@@@A@@@@@@@@$unitF8@@"()`@@@@@A@@@@@@A@ .Assert_failure\ p@@@@Jm@@@@@@V@@A͠=ocaml.warn_on_literal_patternѐ@@0Division_by_zeroY @@@Aנ  @+End_of_fileX !@@@Aߠ@'FailureU )@%@@A蠰@0Invalid_argumentT 2@.@@A񠰠$#@-Match_failureR ;@:67@@\@@A21@ )Not_foundV I@@@A: 9 @-Out_of_memoryS Q@@@ABA@.Stack_overflowZ Y@@@AJI@.Sys_blocked_io[ a@@@AR"Q"@)Sys_errorW i@e@@A([+Z+@:Undefined_recursive_module] r@qmn@@c@@A6i9h9@ %bytesC8@@@A@@@@@=@@@&Stdlib@A6G5 {1:strings Strings} BPjjCPj@@@@@@AA(!t AMRNR@@8@@@A@@@@@@@VRWR@)ocaml.doch7 The type for strings. eSfS@@@@@@@@@}@@@Aг&stringoR@@0mllmmmmm@l)8@@@A0@@B@B@@@@@%"@@@A $@@&#@x&%@$make UU@б@г9#intUU@@ @@@0@MG@A@@б@г^$charUU@@ @@@@@г &stringUU@@ @@@@@@@@!@@@'@@$* @@@U@d [make n c] is a string of length [n] with each index holding the character [c]. @raise Invalid_argument if [n < 0] or [n > ]{!Sys.max_string_length}. VY.z@@@@@@@A@@7$init [|[|@б@г#int[|[|@@ @@@0@Pe,@A@@б@б@г#int[|[|@@ @@@@@г$char[|[|@@ @@@ @@@@@#@@гk&string[|[|@@ @@@0@@@@@3[| @@@:@@7= @@@[||@Ɛ [init n f] is a string of length [n] with index [i] holding the character [f i] (called in increasing index order). @raise Invalid_argument if [n < 0] or [n > ]{!Sys.max_string_length}. @since 4.02.0 )\*`m@@@@@@@AB@@J%empty 5b6b@г&string>b?b@@ @@@0@??@@@@@@av*@A@@@Hb @񐠠 & The empty string. @since 4.13.0 TcUf@@@@@@@lC@@(of_bytes`hah@б@г9%byteskhlh@@ @@@0mllmmmmm@.A,@A@@гנ&stringzh{h@@ @@@@@@@@@@@h @. e Return a new string that contains the same bytes as the given byte sequence. @since 4.13.0 imJL@@@@@@@D@@%(to_bytesoNRoNZ@б@г&stringoN]oNc@@ @@@0@>S,@A@@г%bytesoNgoNl@@ @@@@@@@@@@@oNN @k e Return a new byte sequence that contains the same bytes as the given string. @since 4.13.0 pmmt@@@@@@@E@@%&lengthvv@б@гB&stringvv@@ @@@0@>S,@A@@г#intvv@@ @@@@@@@@@@.%string_lengthAA @@@vv @ ? [length s] is the length (number of bytes/characters) of [s]. w  w P@@@@@@@)F@@,#getyR[yR^@б@г&string)yRa*yRg@@ @@@0+**+++++@EZ3@A@@б@г䠐#int:yRk;yRn@@ @@@@@г$charGyRrHyRv@@ @@@@@@@@!@@@'@@$* @@0%string_safe_getBAV@@@@ZyRR[yR@ [get s i] is the character at index [i] in [s]. This is the same as writing [s.[i]]. @raise Invalid_argument if [i] not an index of [s]. gzh}$@@@@@@@G@@>~ k {1:concat Concatenating} {b Note.} The {!Stdlib.( ^ )} binary operator concatenates two strings. y&&z@@@@@@0xwwxxxxx@Nc*@A&concat@б@г&string@@ @@@@@б@г4$list@г&string@@ @@@3@@@@@@8 @@г&string@@ @@@E@@@@@H@@@4@@K7 @@@@r [concat sep ss] concatenates the list of strings [ss], inserting the separator string [sep] between each. @raise Invalid_argument if the result is longer than {!Sys.max_string_length} bytes. q@@@@@@@H@@^#cat@б@гI&string@@ @@@0@wr,@A@@б@гZ&string@@ @@@@@гg&string  @@ @@@@@@@@!@@@'@@$* @@@@ [cat s1 s2] concatenates s1 and s2 ([s1 ^ s2]). @raise Invalid_argument if the result is longer than {!Sys.max_string_length} bytes. @since 4.13.0 $%ce@@@@@@@:E@б@гL!t:H:I@@ @@@0@hc,@A@@б@г]!t:M:N@@ @@@@@гa#int:R:U@@ @@@@@@@@!@@@'@@$* @@@::@n [compare s0 s1] sorts [s0] and [s1] in lexicographical order. [compare] behaves like {!Stdlib.compare} on strings but may be more efficient. VV@@@@@@@K@@7+starts_with@б&prefixгG&string8>@@ @@@0@Rg.@A@@б@гX&stringBH@@ @@@@@гנ$boolL P@@ @@@@@@@@!@@2'@@$ @@@@ e [starts_with ][~prefix s] is [true] if and only if [s] starts with [prefix]. @since 4.13.0 #QQ$@@@@@@@;L@@8)ends_with/0@б&suffixг&string<= @@ @@@0>==>>>>>@Sj.@A@@б@г&stringMN@@ @@@@@г)$boolZ[@@ @@@@@@@@!@@2'@@$f @@@i@ ] [ends_with ][~suffix s] is [true] if and only if [s] ends with [suffix]. @since 4.13.0 uvk@@@@@@@M@@8-contains_from@б@г預&string@@ @@@0@Qh,@A@@б@гG#int@@ @@@@@б@гj$char@@ @@@ @@г$bool@@ @@@-@@@@@0@@@%@@3( @@@9@@6<@@@@s [contains_from s start c] is [true] if and only if [c] appears in [s] after position [start]. @raise Invalid_argument if [start] is not a valid position in [s]. c@@@@@@@N@ @I.rcontains_fromeiew@б@гJ&stringeze@@ @@@0@bw,@A@@б@г#intee@@ @@@@@б@гˠ$char ee@@ @@@ @@г預$boolee@@ @@@-@@@@@0@@@%@@3( @@@9@@6<@@@+ee@Ԑ [rcontains_from s stop c] is [true] if and only if [c] appears in [s] before position [stop+1]. @raise Invalid_argument if [stop < 0] or [stop+1] is not a valid position in [s]. 78F]@@@@@@@OO@ @I(containsC_cD_k@б@г&stringN_nO_t@@ @@@0POOPPPPP@bw,@A@@б@г$char__x`_|@@ @@@@@г;$booll_m_@@ @@@@@@@@!@@@'@@$* @@@z__@# 4 [contains s c] is {!String.contains_from}[ s 0 c]. @@@@@@@P@@7 # {1:extract Extracting substrings} @@@@@@0@G\#@A#sub@б@г &string@@ @@@@@б@гg#int@@ @@@)@@б@гv#int@@ @@@8@@г6&string @@ @@@E@@@@@H@@@%@@K( @@@7@@N:@@@@ [sub s pos len] is a string of length [len], containing the substring of [s] that starts at position [pos] and has length [len]. @raise Invalid_argument if [pos] and [len] do not designate a valid substring of [s]. @@@@@@@Q@ @a-split_on_char@б@гˠ$char @@ @@@0@zu,@A@@б@г{&string%@@ @@@@@г$list+0,4@г&string5)6/@@ @@@(@@@@@@- @@@"@@0%@@@6@@39@@@H@񐠠  [split_on_char sep s] is the list of all (possibly empty) substrings of [s] that are delimited by the character [sep]. The function's result is specified by the following invariants: {ul {- The list is not empty.} {- Concatenating its elements using [sep] as a separator returns a string equal to the input ([concat (make 1 sep) (split_on_char sep s) = s]).} {- No string in the result contains the [sep] character.}} @since 4.04.0 (4.05.0 in StringLabels) T55U.@@@@@@@lR@,@Fj? {1:transforming Transforming} e00f0T@@@@@@0dccddddd@Vk#@A#mapqVZrV]@б@б@г<$char~VaVe@@ @@@@@гI$charViVm@@ @@@)@@@@@,@@б@г&stringVrVx@@ @@@;@@г&stringV|V@@ @@@H@@@@@ K@@@$@@ NV` @@@VV@b ~ [map f s] is the string resulting from applying [f] to all the characters of [s] in increasing order. @since 4.00.0 @@@@@@@S@@b$mapi @б@б@г#int@@ @@@ 0@}x.@A@@б@г$char@@ @@@ @@г$char#'@@ @@@ @@@@@!@@@'@@$* @@б@гn&string,2@@ @@@3@@г{&string6<@@ @@@@@@@@@C@@@$@@F* @@@-@֐ h [mapi f s] is like {!map} but the index of the character is also passed to [f]. @since 4.02.0 9==:@@@@@@@QT@@Z)fold_leftEF@б@б@А!a@B@0POOPPPPP@q*@AVW@@б@г$charab@@ @@@@@А!akl@@@ !@@@@@$@@@@б@А!a*%yz@@б@г᠐&string@@ @@@6@@А!a?:@@@ D@@?@@@G@@B@@@(@@E @@@@E [fold_left f x s] computes [f (... (f (f x s.[0]) s.[1]) ...) s.[n-1]], where [n] is the length of the string [s]. @since 4.13.0  ` t@@@@@@@U@@Y*fold_right  v z v @б@б@г$char v  v @@ @@@0@t.@A@@б@А!a@'B@  v  v @@А!a  v  v @@@@@  @@@@@!!@@б@гH&string v  v @@ @@@"*@@б@А!a(0 v  v @@А!a.6 v  v @@@33@@#; @@@@@$>@@@(@@%A  v  @@@  v v@ [fold_right f s x] computes [f s.[0] (f s.[1] ( ... (f s.[n-1] x) ...))], where [n] is the length of the string [s]. @since 4.13.0     !-!A@@@@@@@ /V@@U'for_all! #!C!G $!C!N@б@б@г$char 0!C!R 1!C!V@@ @@@(0 2 1 1 2 2 2 2 2@p.@A@@г $bool ?!C!Z @!C!^@@ @@@)@@@@@*@@б@г&string Q!C!c R!C!i@@ @@@+!@@г -$bool ^!C!m _!C!q@@ @@@,.@@@@@-1@@@$@@.4 j!C!Q @@@ m!C!C@ \ [for_all p s] checks if all characters in [s] satisfy the predicate [p]. @since 4.13.0  y!r!r z!!@@@@@@@ W@@H&exists" !! !!@б@б@г P$char !! !!@@ @@@/0        @cz.@A@@г p$bool !! !!@@ @@@0@@@@@1@@б@г &string !! !!@@ @@@2!@@г $bool !! !"@@ @@@3.@@@@@41@@@$@@54 !! @@@ !!@x i [exists p s] checks if at least one character of [s] satisfies the predicate [p]. @since 4.13.0  "" "]"q@@@@@@@ X@@H$trim# "s"w "s"{@б@г O&string "s"~ "s"@@ @@@60        @ax,@A@@г ^&string "s" "s"@@ @@@7@@@@@8@@@ "s"s @ [trim s] is [s] without leading and trailing whitespace. Whitespace characters are: [' '], ['\x0C'] (form feed), ['\n'], ['\r'], and ['\t']. @since 4.00.0  "" #%#9@@@@@@@ 0Y@@%'escaped$ $#;#? %#;#F@б@г &string /#;#I 0#;#O@@ @@@90 1 0 0 1 1 1 1 1@>S,@A@@г &string >#;#S ?#;#Y@@ @@@:@@@@@;@@@ I#;#; @򐠠  [escaped s] is [s] with special characters represented by escape sequences, following the lexical conventions of OCaml. All characters outside the US-ASCII printable range \[0x20;0x7E\] are escaped, as well as backslash (0x2F) and double-quote (0x22). The function {!Scanf.unescaped} is a left inverse of [escaped], i.e. [Scanf.unescaped (escaped s) = s] for any string [s] (unless [escaped s] fails). @raise Invalid_argument if the result is longer than {!Sys.max_string_length} bytes.  U#Z#Z V%D%j@@@@@@@ mZ@@%/uppercase_ascii% a %l%p b %l%@б@г ɠ&string l %l% m %l%@@ @@@<0 n m m n n n n n@>S,@A@@г ؠ&string { %l% | %l%@@ @@@=@@@@@>@@@  %l%l @ / [uppercase_ascii s] is [s] with all lowercase letters translated to uppercase, using the US-ASCII character set. @since 4.03.0 (4.05.0 in StringLabels)   %%  & &:@@@@@@@ [@@%/lowercase_ascii& &<&@ &<&O@б@г &string &<&R &<&X@@ @@@?0        @>S,@A@@г &string &<&\ &<&b@@ @@@@@@@@@A@@@ &<&< @ l [lowercase_ascii s] is [s] with all uppercase letters translated to lowercase, using the US-ASCII character set. @since 4.03.0 (4.05.0 in StringLabels)  &c&c &' @@@@@@@ \@@%0capitalize_ascii' ' ' ' ' @б@г C&string ' '# ' ')@@ @@@B0        @>S,@A@@г R&string ' '- ' '3@@ @@@C@@@@@D@@@ ' '  @ [capitalize_ascii s] is [s] with the first character set to uppercase, using the US-ASCII character set. @since 4.03.0 (4.05.0 in StringLabels)  '4'4 ''@@@@@@@ $]@@%2uncapitalize_ascii( '' ''@б@г &string #'' $''@@ @@@E0 % $ $ % % % % %@>S,@A@@г &string 2'' 3''@@ @@@F@@@@@G@@@ ='' @ 搠 [uncapitalize_ascii s] is [s] with the first character set to lowercase, using the US-ASCII character set. @since 4.03.0 (4.05.0 in StringLabels)  I'' J(s(@@@@@@@ a^@@% _; {1:traversing Traversing}  Z!(( [!((@@@@@@0 Y X X Y Y Y Y Y@5J#@A$iter) f#(( g#((@б@б@г 1$char s#(( t#((@@ @@@H@@г ٠$unit #(( #((@@ @@@I)@@@@@J,@@б@г &string #(( #((@@ @@@K;@@г $unit #(( #((@@ @@@LH@@@@@MK@@@$@@NN #(( @@@ #((@ W [iter f s] applies function [f] in turn to all the characters of [s]. It is equivalent to [f s.[0]; f s.[1]; ...; f s.[length s - 1]; ()].  $(( %):)@@@@@@@ _@@b%iteri* ')) '))@б@б@г }#int ')) '))@@ @@@O0        @}x.@A@@б@г $char ')) '))@@ @@@P@@г J$unit ')) '))@@ @@@Q@@@@@R!@@@'@@S$* @@б@г c&string ')) '))@@ @@@T3@@г l$unit ')) '))@@ @@@U@@@@@@VC@@@$@@WF ')) @@@ "'))@ ː s [iteri] is like {!iter}, but the function is also given the corresponding character index. @since 4.00.0  .()) /+**3@@@@@@@ F`@@Z D9 {1:searching Searching}  ?-*5*5 @-*5*S@@@@@@0 > = = > > > > >@j#@A*index_from+ K/*U*Y L/*U*c@б@г &string V/*U*f W/*U*l@@ @@@X@@б@г #int e/*U*p f/*U*s@@ @@@Y)@@б@г 2$char t/*U*w u/*U*{@@ @@@Z8@@г +#int /*U* /*U*@@ @@@[E@@@@@\H@@@%@@]K( @@@7@@^N:@@@ /*U*U@ ; [index_from s i c] is the index of the first occurrence of [c] in [s] after position [i]. @raise Not_found if [c] does not occur in [s] after position [i]. @raise Invalid_argument if [i] is not a valid position in [s].  0** 4+,+q@@@@@@@ a@ @a.index_from_opt, 7+t+x 7+t+@б@г &string 7+t+ 7+t+@@ @@@_0        @zu,@A@@б@г p#int 7+t+ 7+t+@@ @@@`@@б@г $char 7+t+ 7+t+@@ @@@a @@г V&option 7+t+ 7+t+@г #int 7+t+ 7+t+@@ @@@b7@@@@@@d< @@@"@@e?%@@@4@@fB7@@@H@@gEK@@@ 7+t+t @ [index_from_opt s i c] is the index of the first occurrence of [c] in [s] after position [i] (if any). @raise Invalid_argument if [i] is not a valid position in [s]. @since 4.05  8++ <,`,r@@@@@@@ &b@/@X+rindex_from- >,t,x >,t,@б@г &string %>,t, &>,t,@@ @@@h0 ' & & ' ' ' ' '@q,@A@@б@г ࠐ#int 6>,t, 7>,t,@@ @@@i@@б@г $char E>,t, F>,t,@@ @@@j @@г #int R>,t, S>,t,@@ @@@k-@@@@@l0@@@%@@m3( @@@9@@n6<@@@ c>,t,t@ [rindex_from s i c] is the index of the last occurrence of [c] in [s] before position [i+1]. @raise Not_found if [c] does not occur in [s] before position [i+1]. @raise Invalid_argument if [i+1] is not a valid position in [s].  o?,, pC-R-@@@@@@@ c@ @I/rindex_from_opt. {E-- |E--@б@г 㠐&string E-- E--@@ @@@o0        @bw,@A@@б@г A#int E-- E--@@ @@@p@@б@г d$char E-- E--@@ @@@q @@г '&option E-- E--@г g#int E-- E--@@ @@@r7@@@@@@t< @@@"@@u?%@@@4@@vB7@@@H@@wEK@@@ E-- @ | [rindex_from_opt s i c] is the index of the last occurrence of [c] in [s] before position [i+1] (if any). @raise Invalid_argument if [i+1] is not a valid position in [s]. @since 4.05  F-- J..@@@@@@@ d@/@X%index/ L.. L..@б@г S&string L.. L..@@ @@@x0        @q,@A@@б@г Š$charL..L..@@ @@@y@@г #intL..L..@@ @@@z@@@@@{!@@@'@@|$* @@@"L..@ ː . [index s c] is {!String.index_from}[ s 0 c]. .M../M..@@@@@@@Fe@@7)index_opt0:O..;O./@б@г &stringEO./FO./@@ @@@}0GFFGGGGG@Pe,@A@@б@г$charVO./WO./@@ @@@~@@г נ&optioncO./dO./$@г#intmO./nO./@@ @@@(@@@@@@- @@@"@@0%@@@6@@39@@@O..@ ) G [index_opt s c] is {!String.index_from_opt}[ s 0 c]. @since 4.05 P/%/%R/_/q@@@@@@@f@,@F&rindex1T/s/wT/s/}@б@г&stringT/s/T/s/@@ @@@0@_t,@A@@б@гr$charT/s/T/s/@@ @@@@@гk#intT/s/T/s/@@ @@@@@@@@!@@@'@@$* @@@T/s/s@ x = [rindex s c] is {!String.rindex_from}[ s (length s - 1) c]. U//U//@@@@@@@g@@7*rindex_opt2W//W//@б@гO&stringW//W//@@ @@@0@Pe,@A@@б@г$charW//W//@@ @@@@@г&optionW/0W/0@гĠ#intW//W/0@@ @@@(@@@@@@- @@@"@@0%@@@6@@39@@@-W//@ ֐ V [rindex_opt s c] is {!String.rindex_from_opt}[ s (length s - 1) c]. @since 4.05 9X00:Z0Q0c@@@@@@@Qh@,@FO; {1 Strings and Sequences} J\0e0eK\0e0@@@@@@0IHHIIIII@Vk#@A&to_seqnV^00W^00@б@г!ta^00b^00@@ @@@@@г9#Seq!tq^00r^00@г9$char{^00|^00@@ @@@ }4@@@@@@ 9 @@@%@@ <(@@@^00@4 [to_seq s] is a sequence made of the string's characters in increasing order. In ["unsafe-string"] mode, modifications of the string during iteration will be reflected in the sequence. @since 4.07 _00c1j1|@@@@@@@i@)@O'to_seqioe1~1e1~1@б@гa!te1~1e1~1@@ @@@ 0@hc,@A@@г#Seq!te1~1e1~1@Вгw#inte1~1e1~1@@ @@@ @@г$chare1~1e1~1@@ @@@ -@@@@@ 2 @@@0@@@ 7e1~1+@@@>@@ ;A.@@@e1~1~1@ Y [to_seqi s] is like {!to_seq} but also tuples the corresponding index. @since 4.07 f11h12@@@@@@@j@@@N&of_seqp j22 j22@б@г#Seq!tj22j22@гߠ$char!j22"j22@@ @@@ 0#""#####@t9@A@@@ @@@  @@г蠐!t5j226j22 @@ @@@ @@@@@ @@@@j22 @鐠 L [of_seq s] is a string made of the sequence's characters. @since 4.07 Lk2!2!Mm2`2r@@@@@@@dk@@*b 7 {1:utf UTF decoding and validations} @since 4.14 ]o2t2t^q22@@@@@@0\[[\\\\\@:\#@As1 {2:utf_8 UTF-8} ns22os22@@@@@@/get_utf_8_ucharxu22yu22@б@г6!tu22u22@@ @@@ )@@б@г<#intu22u22@@ @@@ 8@@гj%Uchar*utf_decodeu22u22@@ @@@ H@@@@@ K@@@(@@ !N+ @@@u22@Y K [get_utf_8_uchar b i] decodes an UTF-8 character at index [i] in [b]. v22w3B3M@@@@@@@l@@a.is_valid_utf_8y3O3Sy3O3a@б@г!ty3O3dy3O3e@@ @@@ "0@zf,@A@@г$booly3O3iy3O3m@@ @@@ #@@@@@ $@@@y3O3O @ P [is_valid_utf_8 b] is [true] if and only if [b] contains valid UTF-8 data. z3n3n{33@@@@@@@m@@%7 {2:utf_16be UTF-16BE}  }33 }33@@@@@@0      @5J#@A2get_utf_16be_uchar3333@б@гԠ!t!33"33@@ @@@ %@@б@гڠ#int034134@@ @@@ &)@@г%Uchar*utf_decode@34A34@@ @@@ '9@@@@@ (<@@@(@@ )?+ @@@N33@ Q [get_utf_16be_uchar b i] decodes an UTF-16BE character at index [i] in [b]. Z44[4]4o@@@@@@@rn@@R1is_valid_utf_16bef4q4ug4q4@б@г$!tq4q4r4q4@@ @@@ *0srrsssss@kf,@A@@гO$bool4q44q4@@ @@@ +@@@@@ ,@@@4q4q @4 V [is_valid_utf_16be b] is [true] if and only if [b] contains valid UTF-16BE data. 4444@@@@@@@o@@%7 {2:utf_16le UTF-16LE} 4445 @@@@@@0@5J#@A2get_utf_16le_uchar5555$@б@гr!t55'55(@@ @@@ -@@б@гx#int55,55/@@ @@@ .)@@г%Uchar*utf_decode55355C@@ @@@ /9@@@@@ 0<@@@(@@ 1?+ @@@55@ Q [get_utf_16le_uchar b i] decodes an UTF-16LE character at index [i] in [b]. 5D5D55@@@@@@@p@@R1is_valid_utf_16le5555@б@г !t5555@@ @@@ 20@kf,@A@@г$bool5555@@ @@@ 3@@@@@ 4@@@)55 @Ґ V [is_valid_utf_16le b] is [true] if and only if [b] contains valid UTF-16LE data. 555666@@@@@@@Mq@@%K % {1:deprecated Deprecated functions} F66G66E@@@@@@0EDDEEEEE@5J#@A&createR6G6PS6G6V@б@г#int]6G6Y^6G6\@@ @@@ 5@@г8%bytesj6G6`k6G6e@@ @@@ 6'@@@@@ 7*@@2caml_create_stringAAv@@@y6G6Gz6}6@0ocaml.deprecated6}66}6@ ,Use Bytes.create/BytesLabels.create instead.6}66}6@@6}66}6@@@@@6}6@:  [create n] returns a fresh byte sequence of length [n]. The sequence is uninitialized and contains arbitrary bytes. @raise Invalid_argument if [n < 0] or [n > ]{!Sys.max_string_length}. @deprecated This is a deprecated alias of {!Bytes.create}/{!BytesLabels.create}. 6677@@@@@@@r+@)(@'Z*#set7777@б@г%bytes7777@@ @@@ 80@snI@A@@б@гp#int7778@@ @@@ 9@@б@г$char7878 @@ @@@ : @@г;$unit7878@@ @@@ ;-@@@@@ <0@@@%@@ =3( @@@9@@ >6<@@0%string_safe_setCA@@@@@778(8g@0ocaml.deprecated8(8-8(8=@ &Use Bytes.set/BytesLabels.set instead. 8(8? 8(8e@@8(8>8(8f@@@@@8(8*@ 0 [set s n c] modifies byte sequence [s] in place, replacing the byte at index [n] with [c]. You can also write [s.[n] <- c] instead of [set s n c]. @raise Invalid_argument if [n] is not a valid index in [s]. @deprecated This is a deprecated alias of {!Bytes.set}/{!BytesLabels.set}. 8h8h9v9@@@@@@@5s-@)(@'h*$blit*99+99@б@г&string599699@@ @@@ ?076677777@K@A@@б@г#intF99G99@@ @@@ @@@б@г#%bytesU99V99@@ @@@ A @@б@г#intd99e99@@ @@@ B/@@б@г#ints99t99@@ @@@ C>@@г٠$unit9999@@ @@@ DK@@@@@ EN@@@%@@ FQ( @@@7@@ GT:@@@I@@ HWL@@@]@@ IZ`@@@99@@ [ [blit src src_pos dst dst_pos len] copies [len] bytes from the string [src], starting at index [src_pos], to byte sequence [dst], starting at character number [dst_pos]. @raise Invalid_argument if [src_pos] and [len] do not designate a valid range of [src], or if [dst_pos] and [len] do not designate a valid range of [dst]. 99; ;9@@@@@@@t@&@m$copy;;;?;;;C@б@г&string;;;F;;;L@@ @@@ J0@,@A@@г&&string;;;P;;;V@@ @@@ K@@@@@ L@@@;;;;;W;@0ocaml.deprecated;W;\;W;l@ &Strings now immutable: no need to copy;W;n;W;@@;W;m;W;@@@@@;W;Y@ Return a copy of the given string. @deprecated Because strings are immutable, it doesn't make much sense to make identical copies of them. ;;<<1@@@@@@@u@('@&=)$fill<3<7<3<;@б@гݠ%bytes<3<><3<3>K@0ocaml.deprecated===>@ @Use String.uppercase_ascii/StringLabels.uppercase_ascii instead.>> >>I@@>>>>J@@@@@==@u Return a copy of the argument, with all lowercase letters translated to uppercase, including accented letters of the ISO Latin-1 (8859-1) character set. @deprecated Functions operating on Latin-1 character set are deprecated. >L>L>?A@@@@@@@w@('@&=))lowercase?C?G?C?P@б@гL&string?C?S?C?Y@@ @@@ Y0@VkD@A@@г[&string?C?]?C?c@@ @@@ Z@@@@@ [@@@ ?C?C ?z?@0ocaml.deprecated?d?i?d?y@ @Use String.lowercase_ascii/StringLabels.lowercase_ascii instead.?z??z?@@?z?~?z?@@@@@!?d?f@ʐ Return a copy of the argument, with all uppercase letters translated to lowercase, including accented letters of the ISO Latin-1 (8859-1) character set. @deprecated Functions operating on Latin-1 character set are deprecated. -??.@h@@@@@@@@Ex@('@&=)*capitalize9@@:@@@б@г&stringD@@E@@@@ @@@ \0FEEFFFFF@VkD@A@@г&stringS@@T@@@@ @@@ ]@@@@@ ^@@@^@@_@A:@0ocaml.deprecatede@@f@@@ BUse String.capitalize_ascii/StringLabels.capitalize_ascii instead.p@@q@A8@@s@@t@A9@@@@@v@@@ Return a copy of the argument, with the first character set to uppercase, using the ISO Latin-1 (8859-1) character set.. @deprecated Functions operating on Latin-1 character set are deprecated. A;A;AB @@@@@@@y@('@&=),uncapitalizeBBBB@б@г&stringBB!BB'@@ @@@ _0@VkD@A@@г&stringBB+BB1@@ @@@ `@@@@@ a@@@BBBHB@0ocaml.deprecatedB2B7B2BG@ FUse String.uncapitalize_ascii/StringLabels.uncapitalize_ascii instead.BHBMBHB@@BHBLBHB@@@@@B2B4@t Return a copy of the argument, with the first character set to lowercase, using the ISO Latin-1 (8859-1) character set. @deprecated Functions operating on Latin-1 character set are deprecated. BBCCf@@@@@@@z@('@&=)퐠 ! {1 Binary decoding of integers} ChChChC@@@@@@0@Mb;@A  The functions in this section binary decode integers from strings. All following functions raise [Invalid_argument] if the characters needed at index [i] to decode the integer are not available. Little-endian (resp. big-endian) encoding means that least (resp. most) significant bytes are stored first. Big-endian is also known as network byte order. Native-endian encoding is either little-endian or big-endian depending on {!Sys.big_endian}. 32-bit and 64-bit integers are represented by the [int32] and [int64] types, which can be interpreted either as signed or unsigned numbers. 8-bit and 16-bit integers are represented by the [int] type, which has more bits than the binary encoding. These extra bits are sign-extended (or zero-extended) for functions which decode 8-bit or 16-bit integers and represented them with [int] values. CCGG@@@@@@)get_uint8GGGG%@б@гk&stringGG(GG.@@ @@@ b)@@б@гǠ#intGG2GG5@@ @@@ c8@@гԠ#int*GG9+GG<@@ @@@ dE@@@@@ eH@@@%@@ fK( @@@8GG@ᐠ i [get_uint8 b i] is [b]'s unsigned 8-bit integer starting at character index [i]. @since 4.13.0 DG=G=EGG@@@@@@@\{@@^(get_int8PGGQGG@б@г&string[GG\GG@@ @@@ g0]\\]]]]]@wc,@A@@б@г#intlGGmGG@@ @@@ h@@г##intyGGzGG@@ @@@ i@@@@@ j!@@@'@@ k$* @@@GG@0 f [get_int8 b i] is [b]'s signed 8-bit integer starting at character index [i]. @since 4.13.0 GGH:H<@@@@@@@|@@7-get_uint16_neH>HBH>HO@б@г&stringH>HRH>HX@@ @@@ l0@Pe,@A@@б@гe#intH>H\H>H_@@ @@@ m@@гr#intH>HcH>Hf@@ @@@ n@@@@@ o!@@@'@@ p$* @@@H>H>@ | [get_uint16_ne b i] is [b]'s native-endian unsigned 16-bit integer starting at character index [i]. @since 4.13.0 HgHg HH@@@@@@@}@@7-get_uint16_beHHHH@б@гV&stringHHHI@@ @@@ q0@Pe,@A@@б@г#int HI HI @@ @@@ r@@г#intHIHI@@ @@@ s@@@@@ t!@@@'@@ u$* @@@%HH@ΐ y [get_uint16_be b i] is [b]'s big-endian unsigned 16-bit integer starting at character index [i]. @since 4.13.0 1II2II@@@@@@@I~@@7-get_uint16_le=II>II@б@г&stringHIIIII@@ @@@ v0JIIJJJJJ@Pe,@A@@б@г#intYIIZII@@ @@@ w@@г#intfIIgII@@ @@@ x@@@@@ y!@@@'@@ z$* @@@tII@ | [get_uint16_le b i] is [b]'s little-endian unsigned 16-bit integer starting at character index [i]. @since 4.13.0 IIJ;J=@@@@@@@@@7,get_int16_neJ?JCJ?JO@б@г&stringJ?JRJ?JX@@ @@@ {0@Pe,@A@@б@гR#intJ?J\J?J_@@ @@@ |@@г_#intJ?JcJ?Jf@@ @@@ }@@@@@ ~!@@@'@@ $* @@@J?J?@l y [get_int16_ne b i] is [b]'s native-endian signed 16-bit integer starting at character index [i]. @since 4.13.0 JgJg!JJ@@@@@@@@@@7,get_int16_be#JJ#JJ@б@гC&string#JJ#JK@@ @@@ 0@Pe,@A@@б@г#int#JK#JK@@ @@@ @@г#int#JK #JK@@ @@@ @@@@@ !@@@'@@ $* @@@#JJ@ v [get_int16_be b i] is [b]'s big-endian signed 16-bit integer starting at character index [i]. @since 4.13.0 $KK(KK@@@@@@@6A@@7,get_int16_le**KK+*KK@б@г&string5*KK6*KK@@ @@@ 076677777@Pe,@A@@б@г#intF*KKG*KK@@ @@@ @@г#intS*KKT*KK@@ @@@ @@@@@ !@@@'@@ $* @@@a*KK@ y [get_int16_le b i] is [b]'s little-endian signed 16-bit integer starting at character index [i]. @since 4.13.0 m+KKn/L0L2@@@@@@@B@@7,get_int32_ney1L4L8z1L4LD@б@г᠐&string1L4LG1L4LM@@ @@@ 0@Pe,@A@@б@г?#int1L4LQ1L4LT@@ @@@ @@гH%int321L4LX1L4L]@@ @@@ @@@@@ !@@@'@@ $* @@@1L4L4@Y r [get_int32_ne b i] is [b]'s native-endian 32-bit integer starting at character index [i]. @since 4.13.0 2L^L^6LL@@@@@@@C@@7,get_int32_be8LL8LL@б@г0&string8LL8LL@@ @@@ 0@Pe,@A@@б@г#int8LL8LL@@ @@@ @@г%int328LL8LM@@ @@@ @@@@@ !@@@'@@ $* @@@8LL@ o [get_int32_be b i] is [b]'s big-endian 32-bit integer starting at character index [i]. @since 4.13.0  9MM =MsMu@@@@@@@#D@@7,get_int32_le?MwM{?MwM@б@г&string"?MwM#?MwM@@ @@@ 0$##$$$$$@Pe,@A@@б@гݠ#int3?MwM4?MwM@@ @@@ @@г栐%int32@?MwMA?MwM@@ @@@ @@@@@ !@@@'@@ $* @@@N?MwMw@ r [get_int32_le b i] is [b]'s little-endian 32-bit integer starting at character index [i]. @since 4.13.0 Z@MM[DNN@@@@@@@rE@@7,get_int64_nefFNNgFNN*@б@гΠ&stringqFNN-rFNN3@@ @@@ 0srrsssss@Pe,@A@@б@г,#intFNN7FNN:@@ @@@ @@г1%int64FNN>FNNC@@ @@@ @@@@@ !@@@'@@ $* @@@FNN@F r [get_int64_ne b i] is [b]'s native-endian 64-bit integer starting at character index [i]. @since 4.13.0 GNDNDKNN@@@@@@@F@@7,get_int64_beMNNMNN@б@г&stringMNNMNN@@ @@@ 0@Pe,@A@@б@г{#intMNNMNN@@ @@@ @@г%int64MNNMNN@@ @@@ @@@@@ !@@@'@@ $* @@@MNN@ o [get_int64_be b i] is [b]'s big-endian 64-bit integer starting at character index [i]. @since 4.13.0 NNNROYO[@@@@@@@G@@7,get_int64_leTO]OaTO]Om@б@гl&stringTO]OpTO]Ov@@ @@@ 0@Pe,@A@@б@гʠ#int TO]Oz!TO]O}@@ @@@ @@гϠ%int64-TO]O.TO]O@@ @@@ @@@@@ !@@@'@@ $* @@@;TO]O]@䐠 r [get_int64_le b i] is [b]'s little-endian 64-bit integer starting at character index [i]. @since 4.13.0 GUOOHYOO@@@@@@@_H@@7]"/*X[PPY[PP@@@@@@0WVVWWWWW@G\#@A*unsafe_getd_PLPUe_PLP_@б@г̠&stringo_PLPbp_PLPh@@ @@@ @@б@г(#int~_PLPl_PLPo@@ @@@ )@@гI$char_PLPs_PLPw@@ @@@ 6@@@@@ 9@@@%@@ <( @@2%string_unsafe_getBA@@@@_PLPL_PLP@@I@@@I*unsafe_set`PP`PP@б@г%bytes`PP`PP@@ @@@ 0@b]&@A@@б@гq#int`PP`PP@@ @@@ @@б@г$char`PP`PP@@ @@@  @@г<$unit`PP`PP@@ @@@ -@@@@@ 0@@@%@@ 3( @@@9@@ 6<@@2%string_unsafe_setCA@@@@@`PPaPP@0ocaml.deprecatedaPPaPP@@aPP @@J@@ N+unsafe_blitbPPbPQ@б@гy&stringcQQ cQQ@@ @@@ 0@g|1@A@@б@гנ#int-cQQ.cQQ@@ @@@ @@б@г %bytes<cQQ=cQQ@@ @@@  @@б@г#intKcQQ#LcQQ&@@ @@@ /@@б@г#intZcQQ*[cQQ-@@ @@@ >@@г$unitgdQ1Q5hdQ1Q9@@ @@@ K@@@@@ N@@@%@@ Q( @@@7@@ T:@@@I@@ WL@@@]@@ Z`@@0caml_blit_stringE@@@@@@@@bPPdQ1QZ@'noallocdQ1QRdQ1QY@@dQ1QO @@K@@ t+unsafe_filleQ[QdeQ[Qo@б@гv%bytesfQrQtfQrQy@@ @@@ 0@3@A@@б@гc#intfQrQ}fQrQ@@ @@@ @@б@гr#intfQrQfQrQ@@ @@@  @@б@г$charfQrQfQrQ@@ @@@ /@@г=$unitfQrQfQrQ@@ @@@ <@@@@@ ?@@@%@@ B( @@@7@@ E:@@@K@@ HN@@0caml_fill_stringD@@@@@@@eQ[Q[gQQ@'noallocfQrQfQrQ@@ fQrQ fQrQ@0ocaml.deprecatedgQQgQQ@@gQQ@@,L@@l@A@d@P@@@e@Q*@@d@P@@n@Z@ @o@[@@U@A@@v@@>@*@~@jC@/@@@~W@C@@;@@_@K@@~E@1 @  @  @@  @  @ l 3@  @  @ e +@  @  @ } V@ 1 @  @ ]@@*@@@X1@@[@G@@t@`'@@@y@@,@@Y@E @@r@M@@5@@@0@@A@ H************************************************************************A@@A@L@ H BMMBM@ H OCaml CC@ H DD3@ H Xavier Leroy, projet Cristal, INRIA Rocquencourt E44E4@ H FF@ H Copyright 1996 Institut National de Recherche en Informatique et GG@ H en Automatique. HHg@ H IhhIh@ H All rights reserved. This file is distributed under the terms of JJ@ H the GNU Lesser General Public License version 2.1, with the KKN@ H special exception on linking described in the file LICENSE. LOOLO@ H MM@ H************************************************************************NN5@ NOTE: If this file is stringLabels.mli, run tools/sync_stdlib_docs after editing it to generate string.mli. If this file is string.mli, do not edit it directly -- edit stringLabels.mli instead.  P77V  @ V* Strings. A string [s] of length [n] is an indexable and immutable sequence of [n] bytes. For historical reasons these bytes are referred to as characters. The semantics of string functions is defined in terms of indices and positions. These are depicted and described as follows. {v positions 0 1 2 3 4 n-1 n +---+---+---+---+ +-----+ indices | 0 | 1 | 2 | 3 | ... | n-1 | +---+---+---+---+ +-----+ v} {ul {- An {e index} [i] of [s] is an integer in the range \[[0];[n-1]\]. It represents the [i]th byte (character) of [s] which can be accessed using the constant time string indexing operator [s.[i]].} {- A {e position} [i] of [s] is an integer in the range \[[0];[n]\]. It represents either the point at the beginning of the string, or the point between two indices, or the point at the end of the string. The [i]th byte index is between position [i] and [i+1].}} Two integers [start] and [len] are said to define a {e valid substring} of [s] if [len >= 0] and [start], [start+len] are positions of [s]. {b Unicode text.} Strings being arbitrary sequences of bytes, they can hold any kind of textual encoding. However the recommended encoding for storing Unicode text in OCaml strings is UTF-8. This is the encoding used by Unicode escapes in string literals. For example the string ["\u{1F42B}"] is the UTF-8 encoding of the Unicode character U+1F42B. {b Past mutability.} OCaml strings used to be modifiable in place, for instance via the {!String.set} and {!String.blit} functions. This use is nowadays only possible when the compiler is put in "unsafe-string" mode by giving the [-unsafe-string] command-line option. This compatibility mode makes the types [string] and [bytes] (see {!Bytes.t}) interchangeable so that functions expecting byte sequences can also accept strings as arguments and modify them. The distinction between [bytes] and [string] was introduced in OCaml 4.02, and the "unsafe-string" compatibility mode was the default until OCaml 4.05. Starting with 4.06, the compatibility mode is opt-in; we intend to remove the option in the future. The labeled version of this module can be used as described in the {!StdLabels} module. 6* {1:strings Strings} Ԡ8* The type for strings.  * [make n c] is a string of length [n] with each index holding the character [c]. @raise Invalid_argument if [n < 0] or [n > ]{!Sys.max_string_length}. U * [init n f] is a string of length [n] with index [i] holding the character [f i] (called in increasing index order). @raise Invalid_argument if [n < 0] or [n > ]{!Sys.max_string_length}. @since 4.02.0  '* The empty string. @since 4.13.0 Π f* Return a new string that contains the same bytes as the given byte sequence. @since 4.13.0  f* Return a new byte sequence that contains the same bytes as the given string. @since 4.13.0 Z @* [length s] is the length (number of bytes/characters) of [s].  * [get s i] is the character at index [i] in [s]. This is the same as writing [s.[i]]. @raise Invalid_argument if [i] not an index of [s]. Ǡ l* {1:concat Concatenating} {b Note.} The {!Stdlib.( ^ )} binary operator concatenates two strings.  * [concat sep ss] concatenates the list of strings [ss], inserting the separator string [sep] between each. @raise Invalid_argument if the result is longer than {!Sys.max_string_length} bytes. _ * [cat s1 s2] concatenates s1 and s2 ([s1 ^ s2]). @raise Invalid_argument if the result is longer than {!Sys.max_string_length} bytes. @since 4.13.0  ,* {1:predicates Predicates and comparisons}  * [equal s0 s1] is [true] if and only if [s0] and [s1] are character-wise equal. @since 4.03.0 (4.05.0 in StringLabels)  * [compare s0 s1] sorts [s0] and [s1] in lexicographical order. [compare] behaves like {!Stdlib.compare} on strings but may be more efficient. o ( comment thwarts tools/sync_stdlib_docs C D6@ f* [starts_with ][~prefix s] is [true] if and only if [s] starts with [prefix]. @since 4.13.0 & ( comment thwarts tools/sync_stdlib_docs LM@ ^* [ends_with ][~suffix s] is [true] if and only if [s] ends with [suffix]. @since 4.13.0 ݠ * [contains_from s start c] is [true] if and only if [c] appears in [s] after position [start]. @raise Invalid_argument if [start] is not a valid position in [s].  * [rcontains_from s stop c] is [true] if and only if [c] appears in [s] before position [stop+1]. @raise Invalid_argument if [stop < 0] or [stop+1] is not a valid position in [s]. ! 5* [contains s c] is {!String.contains_from}[ s 0 c]. ՠ $* {1:extract Extracting substrings} Ǡ * [sub s pos len] is a string of length [len], containing the substring of [s] that starts at position [pos] and has length [len]. @raise Invalid_argument if [pos] and [len] do not designate a valid substring of [s]. k * [split_on_char sep s] is the list of all (possibly empty) substrings of [s] that are delimited by the character [sep]. The function's result is specified by the following invariants: {ul {- The list is not empty.} {- Concatenating its elements using [sep] as a separator returns a string equal to the input ([concat (make 1 sep) (split_on_char sep s) = s]).} {- No string in the result contains the [sep] character.}} @since 4.04.0 (4.05.0 in StringLabels)  * {1:transforming Transforming}  * [map f s] is the string resulting from applying [f] to all the characters of [s] in increasing order. @since 4.00.0  i* [mapi f s] is like {!map} but the index of the character is also passed to [f]. @since 4.02.0 4 * [fold_left f x s] computes [f (... (f (f x s.[0]) s.[1]) ...) s.[n-1]], where [n] is the length of the string [s]. @since 4.13.0 Ƞ * [fold_right f s x] computes [f s.[0] (f s.[1] ( ... (f s.[n-1] x) ...))], where [n] is the length of the string [s]. @since 4.13.0 \ ]* [for_all p s] checks if all characters in [s] satisfy the predicate [p]. @since 4.13.0  j* [exists p s] checks if at least one character of [s] satisfies the predicate [p]. @since 4.13.0  * [trim s] is [s] without leading and trailing whitespace. Whitespace characters are: [' '], ['\x0C'] (form feed), ['\n'], ['\r'], and ['\t']. @since 4.00.0 d  * [escaped s] is [s] with special characters represented by escape sequences, following the lexical conventions of OCaml. All characters outside the US-ASCII printable range \[0x20;0x7E\] are escaped, as well as backslash (0x2F) and double-quote (0x22). The function {!Scanf.unescaped} is a left inverse of [escaped], i.e. [Scanf.unescaped (escaped s) = s] for any string [s] (unless [escaped s] fails). @raise Invalid_argument if the result is longer than {!Sys.max_string_length} bytes. * * [uppercase_ascii s] is [s] with all lowercase letters translated to uppercase, using the US-ASCII character set. @since 4.03.0 (4.05.0 in StringLabels)  * [lowercase_ascii s] is [s] with all uppercase letters translated to lowercase, using the US-ASCII character set. @since 4.03.0 (4.05.0 in StringLabels)  * [capitalize_ascii s] is [s] with the first character set to uppercase, using the US-ASCII character set. @since 4.03.0 (4.05.0 in StringLabels) | * [uncapitalize_ascii s] is [s] with the first character set to lowercase, using the US-ASCII character set. @since 4.03.0 (4.05.0 in StringLabels) B<* {1:traversing Traversing} 4 * [iter f s] applies function [f] in turn to all the characters of [s]. It is equivalent to [f s.[0]; f s.[1]; ...; f s.[length s - 1]; ()]. נ t* [iteri] is like {!iter}, but the function is also given the corresponding character index. @since 4.00.0 f:* {1:searching Searching} X * [index_from s i c] is the index of the first occurrence of [c] in [s] after position [i]. @raise Not_found if [c] does not occur in [s] after position [i]. @raise Invalid_argument if [i] is not a valid position in [s].  * [index_from_opt s i c] is the index of the first occurrence of [c] in [s] after position [i] (if any). @raise Invalid_argument if [i] is not a valid position in [s]. @since 4.05  * [rindex_from s i c] is the index of the last occurrence of [c] in [s] before position [i+1]. @raise Not_found if [c] does not occur in [s] before position [i+1]. @raise Invalid_argument if [i+1] is not a valid position in [s]. 1 * [rindex_from_opt s i c] is the index of the last occurrence of [c] in [s] before position [i+1] (if any). @raise Invalid_argument if [i+1] is not a valid position in [s]. @since 4.05 Ġ /* [index s c] is {!String.index_from}[ s 0 c]. x H* [index_opt s c] is {!String.index_from_opt}[ s 0 c]. @since 4.05  >* [rindex s c] is {!String.rindex_from}[ s (length s - 1) c]. Ѡ W* [rindex_opt s c] is {!String.rindex_from_opt}[ s (length s - 1) c]. @since 4.05 v<* {1 Strings and Sequences} h * [to_seq s] is a sequence made of the string's characters in increasing order. In ["unsafe-string"] mode, modifications of the string during iteration will be reflected in the sequence. @since 4.07  Z* [to_seqi s] is like {!to_seq} but also tuples the corresponding index. @since 4.07  M* [of_seq s] is a string made of the sequence's characters. @since 4.07  o 8* {1:utf UTF decoding and validations} @since 4.14  a2* {2:utf_8 UTF-8}  S L* [get_utf_8_uchar b i] decodes an UTF-8 character at index [i] in [b].   Q* [is_valid_utf_8 b] is [true] if and only if [b] contains valid UTF-8 data.  Π8* {2:utf_16be UTF-16BE}  R* [get_utf_16be_uchar b i] decodes an UTF-16BE character at index [i] in [b].  s W* [is_valid_utf_16be b] is [true] if and only if [b] contains valid UTF-16BE data.  98* {2:utf_16le UTF-16LE}  + R* [get_utf_16le_uchar b i] decodes an UTF-16LE character at index [i] in [b].  ޠ W* [is_valid_utf_16le b] is [true] if and only if [b] contains valid UTF-16LE data.  &* {1:deprecated Deprecated functions}  * [create n] returns a fresh byte sequence of length [n]. The sequence is uninitialized and contains arbitrary bytes. @raise Invalid_argument if [n < 0] or [n > ]{!Sys.max_string_length}. @deprecated This is a deprecated alias of {!Bytes.create}/{!BytesLabels.create}.  B 1* [set s n c] modifies byte sequence [s] in place, replacing the byte at index [n] with [c]. You can also write [s.[n] <- c] instead of [set s n c]. @raise Invalid_argument if [n] is not a valid index in [s]. @deprecated This is a deprecated alias of {!Bytes.set}/{!BytesLabels.set}.  Š \* [blit src src_pos dst dst_pos len] copies [len] bytes from the string [src], starting at index [src_pos], to byte sequence [dst], starting at character number [dst_pos]. @raise Invalid_argument if [src_pos] and [len] do not designate a valid range of [src], or if [dst_pos] and [len] do not designate a valid range of [dst].  B * Return a copy of the given string. @deprecated Because strings are immutable, it doesn't make much sense to make identical copies of them.  #* [fill s pos len c] modifies byte sequence [s] in place, replacing [len] bytes by [c], starting at [pos]. @raise Invalid_argument if [pos] and [len] do not designate a valid substring of [s]. @deprecated This is a deprecated alias of {!Bytes.fill}/{!BytesLabels.fill}.  h * Return a copy of the argument, with all lowercase letters translated to uppercase, including accented letters of the ISO Latin-1 (8859-1) character set. @deprecated Functions operating on Latin-1 character set are deprecated.   * Return a copy of the argument, with all uppercase letters translated to lowercase, including accented letters of the ISO Latin-1 (8859-1) character set. @deprecated Functions operating on Latin-1 character set are deprecated. Ġ * Return a copy of the argument, with the first character set to uppercase, using the ISO Latin-1 (8859-1) character set.. @deprecated Functions operating on Latin-1 character set are deprecated. r * Return a copy of the argument, with the first character set to lowercase, using the ISO Latin-1 (8859-1) character set. @deprecated Functions operating on Latin-1 character set are deprecated.  "* {1 Binary decoding of integers}  * The functions in this section binary decode integers from strings. All following functions raise [Invalid_argument] if the characters needed at index [i] to decode the integer are not available. Little-endian (resp. big-endian) encoding means that least (resp. most) significant bytes are stored first. Big-endian is also known as network byte order. Native-endian encoding is either little-endian or big-endian depending on {!Sys.big_endian}. 32-bit and 64-bit integers are represented by the [int32] and [int64] types, which can be interpreted either as signed or unsigned numbers. 8-bit and 16-bit integers are represented by the [int] type, which has more bits than the binary encoding. These extra bits are sign-extended (or zero-extended) for functions which decode 8-bit or 16-bit integers and represented them with [int] values.  j* [get_uint8 b i] is [b]'s unsigned 8-bit integer starting at character index [i]. @since 4.13.0  g* [get_int8 b i] is [b]'s signed 8-bit integer starting at character index [i]. @since 4.13.0 p }* [get_uint16_ne b i] is [b]'s native-endian unsigned 16-bit integer starting at character index [i]. @since 4.13.0 $ z* [get_uint16_be b i] is [b]'s big-endian unsigned 16-bit integer starting at character index [i]. @since 4.13.0 ؠ }* [get_uint16_le b i] is [b]'s little-endian unsigned 16-bit integer starting at character index [i]. @since 4.13.0  z* [get_int16_ne b i] is [b]'s native-endian signed 16-bit integer starting at character index [i]. @since 4.13.0 @ w* [get_int16_be b i] is [b]'s big-endian signed 16-bit integer starting at character index [i]. @since 4.13.0  z* [get_int16_le b i] is [b]'s little-endian signed 16-bit integer starting at character index [i]. @since 4.13.0  s* [get_int32_ne b i] is [b]'s native-endian 32-bit integer starting at character index [i]. @since 4.13.0 \ p* [get_int32_be b i] is [b]'s big-endian 32-bit integer starting at character index [i]. @since 4.13.0  s* [get_int32_le b i] is [b]'s little-endian 32-bit integer starting at character index [i]. @since 4.13.0 Ġ s* [get_int64_ne b i] is [b]'s native-endian 64-bit integer starting at character index [i]. @since 4.13.0 x p* [get_int64_be b i] is [b]'s big-endian 64-bit integer starting at character index [i]. @since 4.13.0 , s* [get_int64_le b i] is [b]'s little-endian 64-bit integer starting at character index [i]. @since 4.13.0 ࠠ#*/*Ҡ = The following is for system use only. Do not call directly. -]P P .]P PJ@@D)../ocamlc0-strict-sequence(-absname"-w8+a-4-9-41-42-44-45-48-70"-g+-warn-error"+A*-bin-annot)-nostdlib*-principal,-safe-string/-strict-formats"-o2stdlib__String.cmi"-c?@ 1/home/barsac/ci/builds/workspace/bootstrap/stdlib @0Jy3+-Kb=0CBBCCCCC@A@@8CamlinternalFormatBasics0cEXy,W:(.Stdlib__Either0 }rCT0J){9)+Stdlib__Seq0yt\eǟ&Q,}r0L%BWx:6-Stdlib__Uchar0 |K?bޣ @0L%BWx:6AM@ϰ@]\@@87_]@@@@@@ z y@ON@@@*)@@@ C B@@@@$#@ ^ \po@  @  @@'&@@@@@A@  @43@65@@   _ ^  ed@ @@@@  @ZY@|{@@~@@QP@@ A @SR@edȰ;M@po@@@@ " !  @  @{zڰ@ܰ  @@@@@  Ѱ@10@@P@