namespace boost {
  typedef unspecified char16;
  typedef unspecified char32;
}
 
namespace boost {
  namespace unicode {
    template<typename Range1, typename Range2> 
      tuple< sub_range< Range1 >, sub_range< Range1 >, sub_range< Range2 >, sub_range< Range2 > > 
      cat_limits(Range1 &&, Range2 &&);
    template<typename Range1, typename Range2, typename OutputIterator, 
             typename... T> 
      OutputIterator 
      composed_concat(const Range1 &, const Range2 &, OutputIterator, 
                      const T &...);
    template<typename Range1, typename Range2, typename OutputIterator, 
             typename... T> 
      OutputIterator 
      decomposed_concat(const Range1 &, const Range2 &, OutputIterator, 
                        const T &...);
    namespace adaptors {
      template<typename Range1, typename Range2, typename... T> 
        result_of::composed_concat< Range1, Range2 >::type 
        composed_concat(Range1 &&, Range2 &&, const T &...);
      template<typename Range1, typename Range2, typename... T> 
        result_of::decomposed_concat< Range1, Range2 >::type 
        decomposed_concat(Range1 &&, Range2 &&, const T &...);
    }
  }
}
 
namespace boost {
  namespace unicode {
    typedef converter_codecvt< wchar_t, utf_boundary, utf_transcoder< char >, utf_combine_boundary, multi_converter< converted_converter< utf_decoder, normalizer >, utf_encoder< wchar_t > >> utf_u8_normalize_codecvt;
    typedef converter_codecvt< wchar_t, utf_boundary, utf_transcoder< char >, utf_boundary, utf_transcoder< wchar_t >> utf_u8_codecvt;
  }
}
 
namespace boost {
  namespace unicode {
    struct combine_boundary;
    struct combine_sorter;
    typedef mpl::int_< 31 > combining_max;
    typedef unspecified combine_segmenter;
    typedef unspecified u8_combine_boundary;
    typedef unspecified u8_combine_segmenter;
    typedef unspecified u16_combine_boundary;
    typedef unspecified u16_combine_segmenter;
    typedef unspecified utf_combine_boundary;
    typedef unspecified utf_combine_segmenter;
    template<typename Range, typename OutputIterator, typename... T> 
      OutputIterator combine_sort(const Range &, OutputIterator, const T &);
    namespace adaptors {
      template<typename Range, typename... T> 
        boost::segmented_range< Range, boost::unicode::combine_segmenter > 
        combine_segment(Range &&, const T &);
      template<typename Range, typename... T> 
        boost::segmented_range< Range, boost::unicode::u8_combine_segmenter > 
        u8_combine_segment(Range &&, const T &);
      template<typename Range, typename... T> 
        boost::segmented_range< Range, boost::unicode::u16_combine_segmenter > 
        u16_combine_segment(Range &&, const T &);
      template<typename Range, typename... T> 
        boost::segmented_range< Range, boost::unicode::utf_combine_segmenter > 
        utf_combine_segment(Range &&, const T &);
      template<typename Range, typename... T> 
        boost::converted_range< Range, boost::unicode::combine_sorter > 
        combine_sort(Range &&, const T &);
    }
  }
}
 
namespace boost {
  namespace unicode {
    template<typename Range, typename OutputIterator, typename... T> 
      OutputIterator compose(const Range &, OutputIterator, const T &);
    template<typename Range, typename OutputIterator, typename... T> 
      OutputIterator decompose(const Range &, OutputIterator, const T &);
    template<typename Range, typename OutputIterator, typename... T> 
      OutputIterator normalize(const Range &, OutputIterator, const T &);
    namespace adaptors {
      template<typename Range, typename... T> 
        boost::converted_range< Range, boost::unicode::composer > 
        compose(Range &&, const T &);
      template<typename Range, typename... T> 
        boost::converted_range< Range, boost::unicode::decomposer > 
        decompose(Range &&, const T &);
      template<typename Range, typename... T> 
        boost::converted_range< Range, boost::unicode::normalizer > 
        normalize(Range &&, const T &);
    }
  }
}
 
namespace boost {
  namespace unicode {
    struct grapheme_boundary;
    typedef unspecified grapheme_segmenter;
    typedef unspecified u8_grapheme_boundary;
    typedef unspecified u8_grapheme_segmenter;
    typedef unspecified u16_grapheme_boundary;
    typedef unspecified u16_grapheme_segmenter;
    typedef unspecified utf_grapheme_boundary;
    typedef unspecified utf_grapheme_segmenter;
    namespace adaptors {
      template<typename Range, typename... T> 
        boost::segmented_range< Range, boost::unicode::grapheme_segmenter > 
        grapheme_segment(Range &&, const T &);
      template<typename Range, typename... T> 
        boost::segmented_range< Range, boost::unicode::u8_grapheme_segmenter > 
        u8_grapheme_segment(Range &&, const T &);
      template<typename Range, typename... T> 
        boost::segmented_range< Range, boost::unicode::u16_grapheme_segmenter > 
        u16_grapheme_segment(Range &&, const T &);
      template<typename Range, typename... T> 
        boost::segmented_range< Range, boost::unicode::utf_grapheme_segmenter > 
        utf_grapheme_segment(Range &&, const T &);
    }
  }
}
 
namespace boost {
  namespace algorithm {
    template<typename F, typename B> struct boundary_finder;
    template<typename F, typename B> 
      boundary_finder< F, B > make_boundary_finder(F f, B b);
  }
  namespace unicode {
    template<typename Match, typename Comp = is_equal> struct simple_finder;
    template<typename F, typename B> struct boundary_finder;
    template<typename Match, typename Comp> 
      simple_finder< Match, Comp > 
      make_simple_finder(const Match & match, Comp comp = Comp());
    template<typename Match> 
      simple_finder< Match > make_simple_finder(const Match & match);
    template<typename F, typename B> 
      boundary_finder< F, B > make_boundary_finder(F f, B b);
  }
}
 
namespace boost {
  namespace unicode {
    template<char32 I> struct string_cp;
  }
}
 
namespace boost {
  namespace unicode {
    bool is_high_surrogate(char32 v);
    bool is_low_surrogate(char32 v);
    bool is_surrogate(char32 v);
  }
}
 
namespace boost {
  namespace unicode {
    namespace ucd {
      struct block;
      const char * as_string(block::type);
    }
  }
}
 
namespace boost {
  namespace unicode {
    namespace ucd {
      struct category;
      struct bidi_class;
      struct line_break;
      struct decomposition_type;
      struct grapheme_cluster_break;
      struct word_break;
      struct sentence_break;
      const char * as_string(category::type);
      const char * as_string(bidi_class::type);
      const char * as_string(line_break::type);
      const char * as_string(decomposition_type::type);
      const char * as_string(grapheme_cluster_break::type);
      const char * as_string(word_break::type);
      const char * as_string(sentence_break::type);
    }
  }
}
 
namespace boost {
  namespace unicode {
    typedef unspecified u8_segmenter;
    typedef unspecified u16_segmenter;
    typedef unspecified utf_segmenter;
    template<typename Range, typename OutputIterator, typename... T> 
      OutputIterator u8_encode(const Range &, OutputIterator, const T &);
    template<typename Range, typename OutputIterator, typename... T> 
      OutputIterator u16_encode(const Range &, OutputIterator, const T &);
    template<typename Range, typename OutputIterator, typename... T> 
      OutputIterator latin1_encode(const Range &, OutputIterator, const T &);
    template<typename Range, typename OutputIterator, typename... T> 
      OutputIterator u8_decode(const Range &, OutputIterator, const T &);
    template<typename Range, typename OutputIterator, typename... T> 
      OutputIterator u16_decode(const Range &, OutputIterator, const T &);
    template<typename Range, typename OutputIterator, typename... T> 
      OutputIterator utf_decode(const Range &, OutputIterator, const T &);
    template<typename ValueType, typename Range, typename OutputIterator, 
             typename... T> 
      OutputIterator utf_encode(const Range &, OutputIterator, const T &);
    template<typename ValueType, typename Range, typename OutputIterator, 
             typename... T> 
      OutputIterator utf_transcode(const Range &, OutputIterator, const T &);
    template<typename Range, typename OutputIterator, typename... T> 
      OutputIterator 
      locale_utf_transcode(const Range &, OutputIterator, const T &);
    template<typename Range, typename OutputIterator, typename... T> 
      OutputIterator 
      utf_locale_transcode(const Range &, OutputIterator, const T &);
    template<typename Range, typename OutputIterator, typename... T> 
      OutputIterator locale_decode(const Range &, OutputIterator, const T &);
    template<typename Range, typename OutputIterator, typename... T> 
      OutputIterator locale_encode(const Range &, OutputIterator, const T &);
    namespace adaptors {
      template<typename Range, typename... T> 
        boost::converted_range< Range, boost::unicode::u8_encoder > 
        u8_encode(Range &&, const T &);
      template<typename OutputIterator, typename... T> 
        boost::convert_output_iterator< OutputIterator, boost::unicode::u8_encoder > 
        u8_encode_output(OutputIterator, const T &);
      template<typename Range, typename... T> 
        boost::converted_range< Range, boost::unicode::u16_encoder > 
        u16_encode(Range &&, const T &);
      template<typename OutputIterator, typename... T> 
        boost::convert_output_iterator< OutputIterator, boost::unicode::u16_encoder > 
        u16_encode_output(OutputIterator, const T &);
      template<typename Range, typename... T> 
        boost::converted_range< Range, boost::unicode::latin1_encoder > 
        latin1_encode(Range &&, const T &);
      template<typename OutputIterator, typename... T> 
        boost::convert_output_iterator< OutputIterator, boost::unicode::latin1_encoder > 
        latin1_encode_output(OutputIterator, const T &);
      template<typename Range, typename... T> 
        boost::converted_range< Range, boost::unicode::u8_decoder > 
        u8_decode(Range &&, const T &);
      template<typename Range, typename... T> 
        boost::segmented_range< Range, boost::unicode::u8_segmenter > 
        u8_segment(Range &&, const T &);
      template<typename Range, typename... T> 
        boost::converted_range< Range, boost::unicode::u16_decoder > 
        u16_decode(Range &&, const T &);
      template<typename Range, typename... T> 
        boost::segmented_range< Range, boost::unicode::u16_segmenter > 
        u16_segment(Range &&, const T &);
      template<typename Range, typename... T> 
        boost::converted_range< Range, boost::unicode::utf_decoder > 
        utf_decode(Range &&, const T &);
      template<typename Range, typename... T> 
        boost::segmented_range< Range, boost::unicode::utf_segmenter > 
        utf_segment(Range &&, const T &);
      template<typename ValueType, typename Range, typename... T> 
        boost::converted_range< Range, boost::unicode::utf_encoder< ValueType > > 
        utf_encode(Range &&, const T &);
      template<typename ValueType, typename OutputIterator, typename... T> 
        boost::convert_output_iterator< OutputIterator, boost::unicode::utf_encoder< ValueType > > 
        utf_encode_output(OutputIterator, const T &);
      template<typename ValueType, typename Range, typename... T> 
        boost::converted_range< Range, boost::unicode::utf_transcoder< ValueType > > 
        utf_transcode(Range &&, const T &);
      template<typename Range, typename... T> 
        boost::converted_range< Range, boost::unicode::locale_utf_transcoder > 
        locale_utf_transcode(Range &&, const T &);
      template<typename Range, typename... T> 
        boost::converted_range< Range, boost::unicode::utf_locale_transcoder > 
        utf_locale_transcode(Range &&, const T &);
      template<typename Range, typename... T> 
        boost::converted_range< Range, boost::unicode::locale_decoder > 
        locale_decode(Range &&, const T &);
      template<typename Range, typename... T> 
        boost::converted_range< Range, boost::unicode::locale_encoder > 
        locale_encode(Range &&, const T &);
    }
  }
}