rust #rustc 1.76.0 (07dca489a 2024-02-04) @A}}-62a9b4d83244cb2br#3JIb'' @-4010f8e9d1f7f9aarustc_std_workspace_core< B< < G< < < < < < K< < O< < < < < < < <!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<!<"<"<"<"<"<"<"<"<"<"<"<"<"<"<"<"<"<"<"<"<"<#<#<#<#<#<#<#<#<#<#Q<#V<#Z<#^<#<#<#<#<#<#<#<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$ <$<$<$<$<$<%<%<%<%<%<%<%<%<%<%<%<%<%b<%d<%h<%l<%p<%t<%(<%v<%z<&~<&<&<&<&<&<&<&<&<&<&<&+<&<&<&<&<&<&<&<&<&<'<'<'<'<'<'<'<'<'<'<'<'<'<'<'<'<'<'<'<'<(<(<(<(<(<(<(<(<(<(<(<(<(<(<(<(<(<(<(<(<)2<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<)<*C<*<*<*<*<*<*<*<*<*<*<*<*<*<*<*<*<*<*<*<*<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<+<,<,<,<,<,<,<,<,<,<,<,<,<,<,<,<,<,<,<,<,<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.</</</</</</</</</</</</</</</</</</</</<0<0<0<0<0<0<0<0<0R<0<0<0<0<0<0<0<0<0<0<0<1<1<1<1<1<1<1<1<1<1<1<1<1<1<1<1<1<1<1<1<1<2<2<2<2<2<2<2<2<2<2<2<2<2<2<2<2<2<2<2<2<3<3<3<3<3<3<3<3<3<3<3<3<3<3<3<3<3<3<3<3<3<4<4<4<4<4<4<4<4<4<4<4<4<4<4<4<4<4<4<4<4<5<5<5<5<5<5<5<5<5<5<5<5<5<5<5<5<5<5<5<5<5<6<6<6<6<6<6<6<6<6<6<6<6<6<6<6<6<6<6<6<6<7<7<7<7<7<7<7<7<7<7<7<7<7<7<7<7<7<7<7<7<7<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<:<:<:<:<:<:<:<:<:<:<:<:<:<:<:<:<:<:<:<:<;<;<;<;<;<;<;<;<;<;<;<;<;<;<;<;<;<;<;<;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=<=<=<=<=<=<=<=<=<=<=<=<=<=<=<=<=<=<=<=<><><><><><><><><><><><><><><><><><><><><><?<?<?<?<?<?<?<?<?<?<?<?<?<?<?<?<?<?<?<?<?<@<@<@<@<@<@<@<@<@<@<@<@<@<@<@<@<@<@<@<@<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<B<B<B<B<B<B<B<B<B<B<B<B<B<B<B<B<B<B<B<B<B<C<C<C<C<C<C<C<C<C<C<C<C<C<C<C<C<C<C<C<C<C<D<D<D<D<D<D<D<D<D<D<D<D<D<D<D<D<D<D<D<D<E<E<E<E<E<E<E<E<E<E<E<E<E<E<E<E<E<E<E<E<F<F<F<F<F<F<F<F<F<F<F<F<F<F<F<F<F<F<F<F<F<G<G<G<G<G<G<G<G<G<G<G<G<G<G<G<G<G<G<G<G<G<H<H<H<H<H<H<H<H<H<H<H<H<H<H<H<H<H<H<H<H<I<I<I<I<I<I<I<I<I<I<I<I<I<I<I<I<I<I<I<I<J<J<J<J<J<J<J<J<J<J<J<J<J<J<J<J<J<J<J<J<J<K<K<K<K<K<K<K<K<K<K<K<K<K<K<K<K<K<K<K<K<L<L<L<L<L<L<L<L<L<L<L<L<L<L<L<L<L<L<L<L<L<M<M<M<M<M<M<M<M<M<M<M<M<M<M<M<M<M<M<M<M<N<N<N<N<N<N<N<N<N<N<N<N<N<N<N<N<N<N<N<N<N<O<O<O<O<O<O<O<O<O<O<O<O<O<O<O<O<O<O<O<O<P<P<P<P<P<P<P<P<P<P<P<P<P<P<P<P<P<P<P<P<P<Q<Q<Q<Q<Q<Q<Q<Q<Q<Q<Q<Q<Q<Q<Q<Q<Q<Q<Q<Q<R<R<R<R<R<R<R<R<R<R<R<R<R<R<R<R<R<R<R<R<R<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<S<T<T<T<T<T<T<T<T<T<T<T<T<T<T<T<T<T<T<T<T<T<U<U<U<U<U<U<U<U<U<U<U<U<U<U<U<U<U<U<U<U<V<V<V<V<V<V<V<V<V<V<V<V<V<V<V<V<V<V<V<V<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<Y<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<[<[<[<[<[<[<[<[<[<[<[<[<[<[<[<[<[<[<[<[<[<\<\<\<\<\<\<\<\<\<\<\<\<\<\<\<\<\<\<\<\<\<]<]<]<]<]<]<]<]<]<]<]<]<]<]<]<]<]<]<]<]<^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<^<_<_<_<_<_<_<_<_<_<_<_<_<_<_<_<_<_<_<_<_<_<`<`<`<`<`<`<`<`<`<`<`<`<`<`<`<`<`<`<`<`<`<a<a<a<a<a<a<a<a<a<a<a<a<a<a<a<a<a<a<a<a<b<b<b<b<b<b<b<b<b<b<b<b<b<b<b<b<b<b<b<b<c<c<c<c<c<c<c<c<c<c<c<c<c<c<c<c<c<c<c<c<c<d<d<d<d<d<d<d<d<d<d<d<d<d<d<d<d<d<d<d<d<e<e<e<e<e<e<e<e<e<e<e<e<e<e<e<e<e<e<e<e<e<f<f<f<f<f<f<f<f<f<f<f<f<f<f<f<f<f<f<f<f<g<g<g<g<g<g<g<g<g<g<g<g<g<g<g<g<g<g<g<g<g<h<h<h<h<h<h<h<h<h<h<h<h<h<h<h<h<h<h<h<h<i<i<i<i<i<i<i<i<i<i<i<i<i<i<i<i<i<i<i<i<i<j<j<j<j<j<j<j<j<j<j<j<j<j<j<j<j<j<j<j<j<k<k<k<k<k<k<k<k<k<k<k<k<k<k<k<k<k<k<k<k<k<l<l<l<l<l<l<l<l<l<l<l<l<l<l<l<l<l<l<l<l<m<m<m<m<m<m<m<m<m<m<m<m<m<m<m<m<m<m<m<m<m<n<n<n<n<n<n<n<n<n<n<n<n<n<n<n<n<n<n<n<n<o<o<o<o<o<o<o<o<o<o<o<o<o<o<o<o<o<o<o<o<p<p<p<p<p<p<p<p<p<p<p<p<p<p<p<p<p<p<p<p<p<q<q<q<q<q<q<q<q<q<q<q<q<q<q<q<q<q<q<q<q<q<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<s<s<s<s<s<s<s<s<s<s<s<s<s<s<s<s<s<s<s<s<t<t<t<t<t<t<t<t<t<t<t<t<t<t<t<t<t<t<t<t<t<u<u<u<u<u<u<u<u<u<u<u<u<u<u<u<u<u<u<u<u<u<v<v<v<v<v<v<v<v<v<v<v<v<v<v<v<v<v<v<v<v<W <wX  ·p 1793w <;w<w<w<w<w<w<w<w<w<w<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<x<y<y<y<y<y<y<y<y<y<y<y<y<y<y<y<y<y<y<y<y<z<z<z<z<z<z<z<z<z<z<z<z<z<z<z<z<z<z<z<z<{<{<{<{<{<{<{<{<{<{<{<{<{<{<{<{<{<{<{<{<{<|<|<|<|<|<|<|?<|?<|<|<|<|<|?<|?<|<|<|<|<|<|?<}<}<}<}<}<}<}<}_<}<}<}<}<}<}<}<}<}<}<}<}<}<~<~<~<~<~<~<~<~<~<~<~<~<~<~<~<~<~<~ <~<~<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<€<Ȁ<΀<Ԁ<ڀ<<<<<<<<<<<<<<<<<ā<ʁ<Ё<ځ<<<<<<<<<<<<<<<<<Ă<ʂ<Ђ<ւ<܂<<<<<<<<<<<<<<<<<ƃ<̃<҃<؃<ރ<<<<<<<<<<<<<<<<„<Ȅ<΄<Ԅ<ڄ<<<<<<<<<<<<<<<<<ą<΅<ԅ<څ<<<<<<<<<<<<<<<<<Ć<ʆ<І<ֆ<܆<<<<<<<<<<<<<<<<<Ƈ<̇<҇<؇<އ<<<<<<<<<<<<<<<<ˆ<Ȉ<Έ<Ԉ<ވ<<<<<<<<<<<<<<<<‰<ȉ<Ή<ԉ<ډ<<<<<<<<<P<<<<<<<<Ċ<ʊ<Њ<֊<܊<<<<<<<@<<<<<<<<<<Ƌ<̋<ҋ<؋<ދ<<<<<<<<<<<<<<<<Œ<Ȍ<Ҍ<،<ތ<<<<<<<<<<<P<<<<<<ȍ<΍<ԍ<ڍ<<<<<<<<<<<<<<<<<Ď<ʎ<Ў<֎<܎<<<<<<<<<<<<<<<<<Ə<̏<ҏ<؏<<<<<<<<<<<<<<<<<Ɛ<̐<Ґ<ؐ<ސ<<<<<<<<<<<<<<<<‘<ȑ<Α<ԑ<ڑ<<<<<<<<<<<<<<<<<Ē<ʒ<В<֒<ܒ<<<<<<<<<<<<<<<<<Ɠ<̓<֓<ܓ<<<<<<<<<<<<<<<<<Ɣ<̔<Ҕ<ؔ<ޔ<<<<<<<<<<<<<<<<•<ȕ<Ε<ԕ<ڕ<<<<<<<<<<<<<<<</<Ė<ʖ`<Ж<֖<ܖ<<<<<<<<<<<<<<<<<ʗ<З<֗<ܗ<?<<<<<<<<<<0<<<<<<Ƙ<̘<Ҙ<ؘ<ޘ<<<<<<<<<<<<<<<<™<ș<Ι<ԙ<ڙ<<<<<<<<<<<<<<<<<Ě<ʚ<К<ښ<<<<<<<<<<<<<<?<$<<ě<ʛ?<Л<֛<ܛ<<<<<<<<<<<<~<<<<<Ɯ<̜<Ҝ<؜<ޜ<<<<<<<<<<<<<#<<<<ȝ<Ν<ԝ<ڝ<<<<<<<<<#<<@<<<<<<Ğ<Ξ<Ԟ<ڞ<<<?<<<<<<<<<<<<~<<ğ<ʟ<П<֟<ܟ<<<<<<<<<<<<<<<<<Ơ<̠<Ҡ<ؠ<ޠ<<<<<<<<<<<<<y<<<¡<ȡ<Ρ<ԡP<ޡ<<<<<<m<<<<<^<<<<<¢<Ȣ<΢<Ԣ<ڢ<<<#<<<<<<<<<<<<<<ģ<ʣ<У#<֣<ܣ<<<<<<<<<=<<<<<<<<Ƥ<̤<Ҥ<ؤ<ޤ<<<<<<<<m<<<9<<^<<<¥?<ȥ<ҥ<إ<ޥ<<<<<<<;<<<<<<<<<¦<Ȧ<Φ<Ԧ<ڦ<<<9<<<<<<<<<=<<<<<ħ<ʧ<Ч=<֧<ܧ<<<<<<<<<<<<#<<<<'<ƨ<̨<Ҩ<ب<<<<<<<<#<<<<`<<<<<Ʃ<̩<ҩ<ة<ީ<<<'<<@<p<<<<<<<<<<ª<Ȫ<Ϊ<Ԫ/<ڪ<<<<<<<<<<<<<<<<<ī=<ʫ`<Ы'<֫<ܫ<<<<<<<<<<<<=<`<`<<<Ƭ<̬<֬<ܬ<<<<<<<<}<<<<<<<<<ƭ<̭<ҭ<ح<ޭ</<<<_<<<< <<<<<<<<®<Ȯ<ή<Ԯ<ڮ<<<<<<<<<<<<< <_<<<į<ʯ<Я<֯<ܯ<<<<<<<<<<<<<<<<<ʰ<а<ְ<ܰ<<<<<<<<<<<<<<<<<Ʊ<̱<ұ<ر<ޱ<<<<<<<<<<<<<<<?<²_<Ȳ<β<Բ<ڲ<<<<<<<<<<<<<<<<<ij<ʳ<г<ڳ<<<<<<<<@<<<<<<<<<Ĵ<ʴ<д<ִ<ܴ<<<<<?<<<b<<<<<@<<<<<Ƶ<̵<ҵ<ص <޵<<<<<<<<<<<<<<<<¶<ȶ<ζ<Զ<ڶ<<<<<<<<<<<<<<<<<ķ<η<Է<ڷ<<<<<<<<?<<<<<<<<<ĸ<ʸ<и<ָ<ܸ<<<<<<<<<<<<<<<<<ƹ<̹<ҹ<ع<޹<<<<<<<?<<<<<< <<<º<Ⱥ<κ<Ժ<޺<<<<<<<<<<<<<<<<»<Ȼ<λ<Ի<ڻ<<<<<<<<<<<<<<<<<ļ<ʼ<м<ּ<ܼ<<<<<<<<<<<<<<<<<ƽ<̽<ҽ<ؽ<޽<<<<<<<<<<<=<<=<<<¾<Ⱦ<Ҿ<ؾ=<޾<<<<=<<=<<<<<<<<<<¿=<ȿ<ο<Կ<ڿ<<<<<<<<<<<<<<<<<<<<<<<<?<?<<<<<<<<<<=<<=<<<<<<=<<<<<=<<=<<<<<<<<<<=<<<<<<<<<<<<<<<<<<<<<<<<<<<<?<?<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<?<<<<<<<<<<<< <<<<<<<<<<<<<0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<?<<<<<<<<<<<<<<<?<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<?<<<<<<<<<<<<<<<?<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<?<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<?<<<<<<<<<<<<<<<o<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<?<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<</<?<P<<<<<C<<<<<<<<<<<<<<<<<<<<<<<<0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<</<?<P<<<<<C<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<x< <<<<<<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<?<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<?<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ƀ<̀<Ҁ<؀<ހ<<<<<<<<<<<<<<<<<ȁ<΁<ԁ<ځ<<<<<<<<<<<<<<<<<Ăh<΂<Ԃ<ڂ<<?<<<<<<<<<<<<<<<ă<ʃ<Ѓ<փ<܃<<<<<<<<|<<<<<<<<<Ƅ<̄<҄<؄<ބ<<<<<<<<<<<<?<<<<…<ȅ<΅<ԅ<ޅ<<<<<?<<<<<<<<<<<†<Ȇ<Ά<Ԇ<چ<<<<<<<<<<<<<<<<<ć<ʇ<Ї<և<܇<<<<<<<<<<<<<b<><<<ƈ<̈8<҈<؈<ވ<<~<~<~<<<<<<<<<<<<‰<ȉ<҉<؉<މ<<<<<<<<<<<<<<<<Š<Ȋ<Ί<Ԋ<ڊ<<<?<<<<<<<<<<<<<<ċ<ʋ<Ћ<֋<܋8<<<|<<~<~<~<<<<<<<<<<ƌ<̌<Ҍ<،<<<<<<<<<<<<<<7<<<ƍ<̍<ҍ<؍<ލ<<<<<<<<<?<<<<<<<Ž<Ȏ<Ύ<Ԏ<ڎ<<<<<<<<<<<<<<<_<<ď<ʏ<Џ<֏<܏<<<<<<<<<<<<<<<<<Ɛ<̐<֐<ܐ<<<<<<<<<<<<?<<<<<Ƒ<̑<ґ<ؑ<ޑ<<<<<<<<<<<<<<<<’<Ȓ_<Β<Ԓ<ڒ<<<<<<<<<<<<<<<<<ē<ʓ<Г<֓<ܓ<<<<<<<<<<<<?<<<<<ʔ<Д<֔<ܔ<<<<<<<<<<<<<<<<<ƕ<̕<ҕ<ؕ?<ޕ<<<<<<<<<<<<<<<<–<Ȗ<Ζ<Ԗ<ږ<<<<<<<<<<<<<<<<<ė<ʗ<З<ڗ<<<<<<<<<<<<<<<<<Ę<ʘ<И<֘<ܘ<<<<<<<<<<<<<<?<<<ƙ<̙<ҙ<ؙ<ޙ<<<<<<<<<<<<<<<<š<Ț<Κ<Ԛ<ښ<<<<<<<<<<<<<<<<<ě<Λ<ԛ<ڛ<<<<<<<<<<<<<<<<<Ĝ<ʜ<М<֜<ܜ<<<<<<<<<<<<<<<<<Ɲ<̝?<ҝ<؝?<ޝ<<<<<<<<<<<<<<<<ž<Ȟ<Ξ<Ԟ<ޞ<<<<<<<<<<<<<<<<Ÿ<ȟ<Ο<ԟ<ڟ<<<<<<<<<<<<<<<<<Ġ<ʠ<Р<֠<ܠ?<<?<<<<<<<<<<<<<<<ơ<̡<ҡ<ء<ޡ<<<<<<<<<<<<<<<<¢<Ȣ<Ң<آ<ޢ<<<<<<<<<<<<< <<<£<ȣ<Σ<ԣ<ڣ<<<<<<<<<<<<<<<<<Ĥ<ʤ<Ф<֤<ܤ<<<<<<<<<<<<<<<<<ƥ<̥<ҥ?<إ<<<<?<<<<<<<><<<<<<Ʀ<̦<Ҧ<ئ<ަ<<<<<<<<<<<<<<<<§<ȧ<Χ<ԧ<ڧ<<<<<<<<<<<<<<<<<Ĩ<ʨ<Ш<֨<ܨ<<<<<<?<<<<<<<><<<<Ʃ<̩<֩<ܩ<<<<<<<<<<<<<<<<<ƪ<̪?<Ҫ<ت<ު<<<<<<<<<<<<<<<<«<ȫ<Ϋ<ԫ<ګ<<<<<<<<<<<<<<<<<Ĭ<ʬ<Ь<֬<ܬ<<<<<<<<<<<<<<<<<ʭ<Э<֭<ܭ?<<<<<<<<<<<<<<<<<Ʈ<̮<Ү<خ<ޮ<<<<<<<<<<<<<<<<¯<ȯ<ί<ԯ<گ<<<<?<<<<<<<<<<?<<<İ<ʰ<а<ڰ<<<<<<<<<<<<<<7<<<ı<ʱ?<б<ֱ<ܱ<<<<<<<<<<<<<<<<<Ʋ<̲<Ҳ<ز<޲<<<<<<<<<<<<?<<<<³<ȳ<γ<Գ<ڳ<<<<<<<<<<<<<<<<<Ĵ<δ<Դ<ڴ<<<<?<<<<?<<<<<<<<<ĵ<ʵ<е<ֵ<ܵ<<<<<<<<<o<<<<<<?<<ƶ<̶<Ҷ<ض<޶<<<<<<<<<<<<<<<<·<ȷ<η<Է<޷<<<<<<?<<<<?<<<<<<¸<ȸ<θ<Ը<ڸ<<<<<<<<<<<<<<<<<Ĺ<ʹ<й<ֹ<ܹ<<<<<<<<<<<<<<<<<ƺ<̺<Һ<غ<޺<<<<<<<<<<<<<<<<»<Ȼ<һ<ػ<޻<<<<<<<<<<<<<<<<¼<ȼ<μ<Լ<ڼ<<<<<<<<<<<<<<<<<Ľ<ʽ<н<ֽ<ܽ<<<<<<<<<<<<<<<<<ƾ<̾<Ҿ<ؾ<<<<<<<<<<<<<<<<<ƿ<̿<ҿ<ؿ<޿<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<?<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<?<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<&<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<G<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<?<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<O<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<?<<<<<?<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<o<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<o<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<o<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Ā<ʀ<Ѐ<ր<܀<<<<<<<<<<<<<<?<<<Ɓ<́<ҁ<؁<ށ<<<<<<<<<<<<<<<<‚<Ȃ<΂<Ԃ<ނ<<<<<<<<<<?<<<<<<ƒ<ȃ<΃<ԃ<ڃ<<<<<<<<<<<<<<<<<Ą<ʄ<Є<ք<܄<<<<<<<<<<<<<<<<<ƅ<̅<҅<؅<ޅ<<<<<<<<<<<<<<<<†<Ȇ<҆<؆<ކ<<<<<<<<<<<<<<<<<‡<ȇ<·<ԇ<ڇ<<<<<<<<<<<<<<<<<Ĉ<ʈ<Ј<ֈ<܈<<<<<<<<<<<<<<<<<Ɖ<̉<҉<؉<<<<<<<<<<<<<<<<<Ɗ<̊<Ҋ<؊<ފ<<<<<<<<<<<<<<<<‹<ȋ<΋<ԋ<ڋ<<<<<<<<<<<<<<<<<Č<ʌ<Ќ<֌<܌<<<<<<<<<<<<<<<<?<ƍ<̍<֍<܍<<<<<<<<<<<<<<<<<Ǝ<̎<Ҏ<؎<ގ<<<<<<<<<<<<<<<<<ȏ<Ώ<ԏ<ڏ<<<<<<<<<<<<<<<<<Đ<ʐ<А?<֐<ܐ<<<<<<<<<<<<<<<<<ʑ<Б<֑<ܑ<<<<<<<<<<<<<<<<<ƒ<̒<Ғ<ؒ<ޒ<<<<<<<<<<<<<<<<“<ȓ<Γ<ԓ<ړ<<<<<<<<<<<<<<<<<Ĕ<ʔ<Д<ڔ<<<<<<<<<<<< <<<<<ĕ<ʕ<Е<֕<ܕ<<<<<<<<<<<<<<<<<Ɩ<̖<Җ<ؖ<ޖ<<<<<<<<<<<<<<<<—<ȗ<Η<ԗ<ڗ<<<<<<<<<<<<<<<<<Ę<Θ<Ԙ<ژ<<<<<<<<<<<<<<<<<ę<ʙ<Й<֙<ܙ<<<?<<<<<<<<<<<<<<ƚ<̚<Қ<ؚ<ޚ<<<<<<<<<<<<<<<<›<ț<Λ<ԛ<ޛ<<<<<<<<<<<<<<<<œ<Ȝ<Μ<Ԝ<ڜ<<<<<<<<<<<<<<<<<ĝ<ʝ<Н<֝<ܝ<<<<<<<<<<<<<<<<<ƞ<̞<Ҟ<؞<ޞ<<<<<<<<<<<<<<<<Ÿ<ȟ<ҟ<؟<ޟ<<<<<<<<<<<o<<<<< <Ƞ<Π<Ԡ<ڠ<<<<<<<<<<<<<<<<<ġ<ʡ<С<֡<ܡ<<<<<<<<<<<<<<<<<Ƣ<̢<Ң<آ<<<<<<<<<<<<<<<<<ƣ<̣<ң<أ<ޣ<<<<<<<<<<<<<<<<¤<Ȥ<Τ<Ԥ<ڤ<<<<<<<<<<<<<<<<<ĥ<ʥ<Х<֥<ܥ<<<<<<c<<<<<<<<<<<Ʀ<̦<֦<ܦ<<<<<<<<<<<<<<<<<Ƨ<̧<ҧ<ا<ާ<<<<<<<<<<<<<<<<¨<Ȩ<Ψ<Ԩ<ڨ<<<<<<<<<<<<<<<<<ĩ<ʩ<Щ<֩<ܩ<<<<<<<<<<<<<<<<<ʪ<Ъ<֪<ܪ<<<<<<<<<<<<<<<<<ƫ<̫<ҫ<ث<ޫ<<<<<<<<<<<<<<<<¬<Ȭ<ά<Ԭ<ڬ<<<<<<<<<<<<<<<<<ĭ<ʭ<Э<ڭ<<<<d<<<<<<<<<<<<<Į<ʮ<Ю<֮<ܮ<<{<_<<<<<<<<<<<<<<Ư<̯<ү<د<ޯ<<<<<<<<<<<<<<<<°<Ȱ<ΰ<԰<ڰ<<<<<<?<<<<<<<<<<<ı<α<Ա<ڱ<<<<<<<<<<<<<<<<<IJ<ʲ<в<ֲ<ܲ<<<<<<<<<<<<<<<<<Ƴ<̳<ҳ<س<޳<<<<<<<<?<<<<<<<<´<ȴ<δ<Դ<޴<<<<<<<<<<<<<<<<µ<ȵ<ε<Ե<ڵ<<<<<<<<<<<<<<<<<Ķ<ʶ<ж<ֶ<ܶ<<<<< <<<<<<<<<<<<Ʒ<̷<ҷ<ط<޷<<<<<<<<<<<<<<<<¸<ȸ<Ҹ<ظ<޸<<<<<<<<<<<<<<<<¹<ȹ<ι<Թ<ڹ<<<<<<<?<<<<<<<<<<ĺ<ʺ<к<ֺ<ܺ<<<<<<<<<<<<?<<@<<<ƻ<̻<һ<ػ<<<<<<<<<<<<<<<<<Ƽ<̼<Ҽ<ؼ<޼<<<<<<<<<?<<<<<<<½<Ƚ<ν<Խ<ڽ<<<<<<<<<<<<<<<?<<ľC<ʾ<о<־<ܾ<<<<<<<<<<<<<<<<<ƿ<̿<ֿ<ܿ<<<<<<<<<<<<<<<<<<<<?<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<?<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<?<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<?<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<w <w!   ύU w  w  "  7584     ·              ύU          \\ \ \!\  \  b [![github]](https://github.com/dtolnay/unicode-ident) [![crates-io]](https://crates.io/crates/unicode-ident) [![docs-rs]](https://docs.rs/unicode-ident)g [github]: https://img.shields.io/badge/github-8da0cb?style=for-the-badge&labelColor=555555&logo=githubjk [crates-io]: https://img.shields.io/badge/crates.io-fc8d62?style=for-the-badge&labelColor=555555&logo=rustnj [docs-rs]: https://img.shields.io/badge/docs.rs-66c2a5?style=for-the-badge&labelColor=555555&logo=docs.rsm
K Implementation of [Unicode Standard Annex #31][tr31] for determining whichN= `char` values are valid in programming language identifiers.@. [tr31]: https://www.unicode.org/reports/tr31/1K This crate is a better optimized implementation of the older `unicode-xid`NI crate. This crate uses less static storage, and is able to classify bothLJ ASCII and non-ASCII codepoints with better performance, 2–10×M faster than `unicode-xid`.  ## Comparison of performance G The following table shows a comparison between five Unicode identifierJ implementations.! - `unicode-ident` is this crate;$F - [`unicode-xid`] is a widely used crate run by the "unicode-rs" org; I@ - `ucd-trie` and `fst` are two data structures supported by the C [`ucd-generate`] tool; : - [`roaring`] is a Rust implementation of Roaring bitmap. = M The *static storage* column shows the total size of `static` tables that the P: crate bakes into your binary, measured in 1000s of bytes. = G The remaining columns show the **cost per call** to evaluate whether a JD single `char` has the XID\_Start or XID\_Continue Unicode property, GJ comparing across different ratios of ASCII to non-ASCII codepoints in the M input data. ; [`unicode-xid`]: https://github.com/unicode-rs/unicode-xid>= [`ucd-generate`]: https://github.com/BurntSushi/ucd-generate@9 [`roaring`]: https://github.com/RoaringBitmap/roaring-rs<> | | static storage | 0% nonascii | 1% | 10% | 100% nonascii |A |---|---|---|---|---|---|I | **`unicode-ident`** | 10.1 K | 0.96 ns | 0.95 ns | 1.09 ns | 1.55 ns |LH | **`unicode-xid`** | 11.5 K | 1.88 ns | 2.14 ns | 3.48 ns | 15.63 ns |KD | **`ucd-trie`** | 10.2 K | 1.29 ns | 1.28 ns | 1.36 ns | 2.15 ns |G> | **`fst`** | 139 K | 55.1 ns | 54.9 ns | 53.2 ns | 28.5 ns |AC | **`roaring`** | 66.1 K | 2.78 ns | 3.09 ns | 3.37 ns | 4.70 ns |FK Source code for the benchmark is provided in the *bench* directory of thisN7 repo and may be repeated by running `cargo criterion`.: ! ## Comparison of data structures$ #### unicode-xidL They use a sorted array of character ranges, and do a binary search to lookO? up whether a given character lands inside one of those ranges.B ```rust  # const _: &str = stringify! {"3 static XID_Continue_table: [(char, char); 763] = [6" ('\u{30}', '\u{39}'), // 0-9%" ('\u{41}', '\u{5a}'), // A-Z% # " …   ('\u{e0100}', '\u{e01ef}'),# ]; # }; ```I The static storage used by this data structure scales with the number ofLI contiguous ranges of identifier codepoints in Unicode. Every table entryLI consumes 8 bytes, because it consists of a pair of 32-bit `char` values.LF In some ranges of the Unicode codepoint space, this is quite a sparseIH representation – there are some ranges where tens of thousands ofKJ adjacent codepoints are all valid identifier characters. In other places,MI the representation is quite inefficient. A characater like `µ` (U+00B5)LI which is surrounded by non-identifier codepoints consumes 64 bits in theL7 table, while it would be just 1 bit in a dense bitmap.:K On a system with 64-byte cache lines, binary searching the table touches 7NC cache lines on average. Each cache line fits only 8 table entries.FK Additionally, the branching performed during the binary search is probablyN. mostly unpredictable to the branch predictor.1K Overall, the crate ends up being about 10× slower on non-ASCII inputN compared to the fastest crate. " K A potential improvement would be to pack the table entries more compactly. NL Rust's `char` type is a 21-bit integer padded to 32 bits, which means every!OI table entry is holding 22 bits of wasted space, adding up to 3.9 K. They!LJ could instead fit every table entry into 6 bytes, leaving out some of the"MM padding, for a 25% improvement in space used. With some cleverness it may be#PH possible to fit in 5 bytes or even 4 bytes by storing a low char and an#KK extent, instead of low char and high char. I don't expect that performance$NM would improve much but this could be the most efficient for space across all$P0 the libraries, needing only about 7 K to store.%3& #### ucd-trie&&H Their data structure is a compressed trie set specifically tailored for&K= Unicode codepoints. The design is credited to Raph Levien in&@ [rust-lang/rust#33098].''E [rust-lang/rust#33098]: https://github.com/rust-lang/rust/pull/33098'H( (  pub struct TrieSet {(& tree1_level1: &'static [u64; 32],()& tree2_level1: &'static [u8; 992],()" tree2_level2: &'static [u64],)%& tree3_level1: &'static [u8; 256],))! tree3_level2: &'static [u8],)$" tree3_level3: &'static [u64],*% }* **M It represents codepoint sets using a trie to achieve prefix compression. The*PH final states of the trie are embedded in leaves or "chunks", where each+KK chunk is a 64-bit integer. Each bit position of the integer corresponds to+NJ whether a particular codepoint is in the set or not. These chunks are not,ML just a compact representation of the final states of the trie, but are also,OF a form of suffix compression. In particular, if multiple ranges of 64-IM contiguous codepoints have the same Unicode properties, then they all map to.P/ the same chunk in the final level of the trie..2/K Being tailored for Unicode codepoints, this trie is partitioned into three/NL disjoint sets: tree1, tree2, tree3. The first set corresponds to codepoints/OC \[0, 0x800), the second \[0x800, 0x10000) and the third \[0x10000,0FK 0x110000). These partitions conveniently correspond to the space of 1 or 20NJ byte UTF-8 encoded codepoints, 3 byte UTF-8 encoded codepoints and 4 byte1M( UTF-8 encoded codepoints, respectively.2+2L Lookups in this data structure are significantly more efficient than binary2OM search. A lookup touches either 1, 2, or 3 cache lines based on which of the3P# trie partitions is being accessed.3&4M One possible performance improvement would be for this crate to expose a way4PI to query based on a UTF-8 encoded string, returning the Unicode property4LM corresponding to the first character in the string. Without such an API, the5PK caller is required to tokenize their UTF-8 encoded input data into `char`,6NJ hand the `char` into `ucd-trie`, only for `ucd-trie` to undo that work by6ML converting back into the variable-length representation for trie traversal.7O7 #### fst7 8I Uses a [finite state transducer][fst]. This representation is built into8LG [ucd-generate] but I am not aware of any advantage over the `ucd-trie`8JJ representation. In particular `ucd-trie` is optimized for storing Unicode9M properties while `fst` is not.9":) [fst]: https://github.com/BurntSushi/fst:,; [ucd-generate]: https://github.com/BurntSushi/ucd-generate:>:J As far as I can tell, the main thing that causes `fst` to have large size;MJ and slow lookups for this use case relative to `ucd-trie` is that it does;MH not specialize for the fact that only 21 of the 32 bits in a `char` areD?3 [Roaring Bitmap]: https://roaringbitmap.org/about/?6?M Roaring bitmaps are compressed bitmaps which tend to outperform conventional?PM compressed bitmaps such as WAH, EWAH or Concise. In some instances, they can@PF be hundreds of times faster and they often offer significantly better@I compression.AAF In this use case the performance was reasonably competitive but stillAIF substantially slower than the Unicode-optimized crates. Meanwhile theBIL compression was significantly worse, requiring 6× as much storage forBO the data structure.CCM I also benchmarked the [`croaring`] crate which is an FFI wrapper around theCPJ C reference implementation of Roaring Bitmap. This crate was consistentlyDMM about 15% slower than pure-Rust `roaring`, which could just be FFI overhead.DP I did not investigate further.E"E0 [`croaring`]: https://crates.io/crates/croaringE3F #### unicode-identFFL This crate is most similar to the `ucd-trie` library, in that it's based onFOL bitmaps stored in the leafs of a trie representation, achieving both prefixGO$ compression and suffix compression.G'G The key differences are:GHM - Uses a single 2-level trie, rather than 3 disjoint partitions of differentHP depth each.HB - Uses significantly larger chunks: 512 bits rather than 64 bits.IEB - Compresses the XID\_Start and XID\_Continue properties togetherIEL simultaneously, rather than duplicating identical trie leaf chunks acrossJO the two.JJL The following diagram show the XID\_Start and XID\_Continue Unicode booleanJO5 properties in uncompressed form, in row-major order:K8K K 1 L4 L L M O 
XID_StartXID_Continue
XID_Start bitmapXID_Continue bitmap
O OM Uncompressed, these would take 140 K to store, which is beyond what would beOPJ reasonable. However, as you can see there is a large degree of similarityOMA between the two bitmaps and across the rows, which lends well toPDҔ QQK This crate stores one 512-bit "row" of the above bitmaps in the leaf levelQNK of a trie, and a single additional level to index into the leafs. It turnsQNM out there are 124 unique 512-bit chunks across the two bitmaps so 7 bits areRP sufficient to index them.SSL The chunk size of 512 bits is selected as the size that minimizes the totalSOI size of the data structure. A smaller chunk, like 256 or 128 bits, wouldTLH achieve better deduplication but require a larger index. A larger chunkTKF would increase redundancy in the leaf bitmaps. 512 bit chunks are theUI7 optimum for total size of the index plus leaf bitmaps.U:VJ In fact since there are only 124 unique chunks, we can use an 8-bit indexVMD with a spare bit to index at the half-chunk level. This achieves anVGK additional 8.5% compression by eliminating redundancies between the secondWNK half of any chunk and the first half of any other chunk. Note that this isXNJ not the same as using chunks which are half the size, because it does notXM8 necessitate raising the size of the trie's first level.Y;YL In contrast to binary search or the `ucd-trie` crate, performing lookups inYOF this data structure is straight-line code with no need for branching.ZI[в [ [ [[ [ [$https://docs.rs/unicode-ident/1.0.12[&[?       !     \T ]%]  ch]_(_  _\ \  \ \\\!      ·  ҷ        ύU       3 6:   / oo3 w+w BUnicode Standard Annex #31Roaring Bitmap crates-iocroaring ucd-generatefinite state transducer&https://crates.io/crates/unicode-ident,https://github.com/rust-lang/rust/pull/33098https://docs.rs/unicode-ident!https://github.com/BurntSushi/fst%https://www.unicode.org/reports/tr31/+https://github.com/RoaringBitmap/roaring-rs roaring rust-lang/rust#33098  )https://github.com/unicode-rs/unicode-xid !https://crates.io/crates/croaring (https://github.com/dtolnay/unicode-identѿ  unicode-xid ɽ ֽ     ѿ https://roaringbitmap.org/about/github  ɽ docs-rs ߾ *https://github.com/BurntSushi/ucd-generate                 ֽ   ߾   fUH @)fUH?D\fUH?]$pfUH9Y @fUHxZ2fUHJUfUH9*)!fUH>)F4fUHP dfUHC}MfUH̤zfUHVQrfUH!x81fUH1pfUH,pfUHx[IfUH9'~ffUH(WafUH~b fUHm]efUH8IJaR?\U !     +CCq1jK-fx&8U~?Nx1j*?\U:Zu5Nz:Js3Qn.Es 3Cl|<^R|<Lu,E,"F5c#\w7AKơ.*7 8֨3šJ-)7 8ը2@?#v8'5D({8,:@ "/6>KOV]kov}  \<\<D <R<R<   fUH'R$k rustfmt::skip fUHYZR' 5%Y ODHT #@fUHC}MfUHVQrfUHxZ2fUHx[IfUH!x81fUH~iH~M fUH`E >dfUH9'~ffUH栤=H 6fUH(WafUH̀oÎL fUH$GL_AfUHJUfUHhVpfUH{sܗ.F fUH,pfUH9Y @fUH9^?fUH?]$pfUHm]e!fUHMq!~0fUH &Hb[cfUH~b fUHSez fUH?D\fUH @)fUH9*)!fUHyc)ԛfUHU'fUH| cllG fUH8IJa"fUHP <fUH1pfUH̤zfUH>)F4&Vb]2Q V qSp` `8]ObRoQJAovX&Vb]2Q Ve/Users/thiago/.cargo/registry/src/index.crates.io-6f17d22bba15001f/unicode-ident-1.0.12/src/tables.rs F0/)-QC3+,@ddddCdddd$;ddddddddddddddddddddddddd?dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd 8dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd7Jꚬ!_*b/Users/thiago/.cargo/registry/src/index.crates.io-6f17d22bba15001f/unicode-ident-1.0.12/src/lib.rs JmO"bkon OA2OMN !K%JD>Q>KHN?A=BMLHBGO; %PC #7&& $ MMMJLNMM;OGO2O#OPMNQLOQ4LAI **&*%&QLONPJQ3OPGON,PQ'QMQONP MKN#-?NNLO'IE7QQJJJPQNQ#4PP(QFFPP9 5 QNEOOQPMLJ;NHOON<PJ @< Z(+JGQ+.MGQhmN_]g~"aarch64-apple-darwinẠwh|:G5! unicode_ident-8c0673ce5c824490fUH  #"F#i"##f"if##ii#in"BfE#BiB#i##i i A??#?F?