text: // Warning! This file is autogenerated.
  #include <boost/text/normalize_string.hpp>
  #include <boost/text/utility.hpp>
  #include <boost/text/string_utility.hpp>
  
  #include <gtest/gtest.h>
  
  #include <algorithm>
  
  
  
  TEST(normalization, nfkd_002_000)
  {
      // 03B0;03B0;03C5 0308 0301;03B0;03C5 0308 0301; 
      // (ΰ; ΰ; υ◌̈◌́; ΰ; υ◌̈◌́; ) GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x03B0 }};
          std::array<uint32_t, 1> const c2 = {{ 0x03B0 }};
          std::array<uint32_t, 3> const c3 = {{ 0x03C5, 0x0308, 0x0301 }};
          std::array<uint32_t, 1> const c4 = {{ 0x03B0 }};
          std::array<uint32_t, 3> const c5 = {{ 0x03C5, 0x0308, 0x0301 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_001)
  {
      // 03CA;03CA;03B9 0308;03CA;03B9 0308; 
      // (ϊ; ϊ; ι◌̈; ϊ; ι◌̈; ) GREEK SMALL LETTER IOTA WITH DIALYTIKA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x03CA }};
          std::array<uint32_t, 1> const c2 = {{ 0x03CA }};
          std::array<uint32_t, 2> const c3 = {{ 0x03B9, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x03CA }};
          std::array<uint32_t, 2> const c5 = {{ 0x03B9, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_002)
  {
      // 03CB;03CB;03C5 0308;03CB;03C5 0308; 
      // (ϋ; ϋ; υ◌̈; ϋ; υ◌̈; ) GREEK SMALL LETTER UPSILON WITH DIALYTIKA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x03CB }};
          std::array<uint32_t, 1> const c2 = {{ 0x03CB }};
          std::array<uint32_t, 2> const c3 = {{ 0x03C5, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x03CB }};
          std::array<uint32_t, 2> const c5 = {{ 0x03C5, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_003)
  {
      // 03CC;03CC;03BF 0301;03CC;03BF 0301; 
      // (ό; ό; ο◌́; ό; ο◌́; ) GREEK SMALL LETTER OMICRON WITH TONOS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x03CC }};
          std::array<uint32_t, 1> const c2 = {{ 0x03CC }};
          std::array<uint32_t, 2> const c3 = {{ 0x03BF, 0x0301 }};
          std::array<uint32_t, 1> const c4 = {{ 0x03CC }};
          std::array<uint32_t, 2> const c5 = {{ 0x03BF, 0x0301 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_004)
  {
      // 03CD;03CD;03C5 0301;03CD;03C5 0301; 
      // (ύ; ύ; υ◌́; ύ; υ◌́; ) GREEK SMALL LETTER UPSILON WITH TONOS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x03CD }};
          std::array<uint32_t, 1> const c2 = {{ 0x03CD }};
          std::array<uint32_t, 2> const c3 = {{ 0x03C5, 0x0301 }};
          std::array<uint32_t, 1> const c4 = {{ 0x03CD }};
          std::array<uint32_t, 2> const c5 = {{ 0x03C5, 0x0301 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_005)
  {
      // 03CE;03CE;03C9 0301;03CE;03C9 0301; 
      // (ώ; ώ; ω◌́; ώ; ω◌́; ) GREEK SMALL LETTER OMEGA WITH TONOS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x03CE }};
          std::array<uint32_t, 1> const c2 = {{ 0x03CE }};
          std::array<uint32_t, 2> const c3 = {{ 0x03C9, 0x0301 }};
          std::array<uint32_t, 1> const c4 = {{ 0x03CE }};
          std::array<uint32_t, 2> const c5 = {{ 0x03C9, 0x0301 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_006)
  {
      // 03D0;03D0;03D0;03B2;03B2; 
      // (ϐ; ϐ; ϐ; β; β; ) GREEK BETA SYMBOL
      {
          std::array<uint32_t, 1> const c1 = {{ 0x03D0 }};
          std::array<uint32_t, 1> const c2 = {{ 0x03D0 }};
          std::array<uint32_t, 1> const c3 = {{ 0x03D0 }};
          std::array<uint32_t, 1> const c4 = {{ 0x03B2 }};
          std::array<uint32_t, 1> const c5 = {{ 0x03B2 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_007)
  {
      // 03D1;03D1;03D1;03B8;03B8; 
      // (ϑ; ϑ; ϑ; θ; θ; ) GREEK THETA SYMBOL
      {
          std::array<uint32_t, 1> const c1 = {{ 0x03D1 }};
          std::array<uint32_t, 1> const c2 = {{ 0x03D1 }};
          std::array<uint32_t, 1> const c3 = {{ 0x03D1 }};
          std::array<uint32_t, 1> const c4 = {{ 0x03B8 }};
          std::array<uint32_t, 1> const c5 = {{ 0x03B8 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_008)
  {
      // 03D2;03D2;03D2;03A5;03A5; 
      // (ϒ; ϒ; ϒ; Υ; Υ; ) GREEK UPSILON WITH HOOK SYMBOL
      {
          std::array<uint32_t, 1> const c1 = {{ 0x03D2 }};
          std::array<uint32_t, 1> const c2 = {{ 0x03D2 }};
          std::array<uint32_t, 1> const c3 = {{ 0x03D2 }};
          std::array<uint32_t, 1> const c4 = {{ 0x03A5 }};
          std::array<uint32_t, 1> const c5 = {{ 0x03A5 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_009)
  {
      // 03D3;03D3;03D2 0301;038E;03A5 0301; 
      // (ϓ; ϓ; ϒ◌́; Ύ; Υ◌́; ) GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
      {
          std::array<uint32_t, 1> const c1 = {{ 0x03D3 }};
          std::array<uint32_t, 1> const c2 = {{ 0x03D3 }};
          std::array<uint32_t, 2> const c3 = {{ 0x03D2, 0x0301 }};
          std::array<uint32_t, 1> const c4 = {{ 0x038E }};
          std::array<uint32_t, 2> const c5 = {{ 0x03A5, 0x0301 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_010)
  {
      // 03D4;03D4;03D2 0308;03AB;03A5 0308; 
      // (ϔ; ϔ; ϒ◌̈; Ϋ; Υ◌̈; ) GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
      {
          std::array<uint32_t, 1> const c1 = {{ 0x03D4 }};
          std::array<uint32_t, 1> const c2 = {{ 0x03D4 }};
          std::array<uint32_t, 2> const c3 = {{ 0x03D2, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x03AB }};
          std::array<uint32_t, 2> const c5 = {{ 0x03A5, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_011)
  {
      // 03D5;03D5;03D5;03C6;03C6; 
      // (ϕ; ϕ; ϕ; φ; φ; ) GREEK PHI SYMBOL
      {
          std::array<uint32_t, 1> const c1 = {{ 0x03D5 }};
          std::array<uint32_t, 1> const c2 = {{ 0x03D5 }};
          std::array<uint32_t, 1> const c3 = {{ 0x03D5 }};
          std::array<uint32_t, 1> const c4 = {{ 0x03C6 }};
          std::array<uint32_t, 1> const c5 = {{ 0x03C6 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_012)
  {
      // 03D6;03D6;03D6;03C0;03C0; 
      // (ϖ; ϖ; ϖ; π; π; ) GREEK PI SYMBOL
      {
          std::array<uint32_t, 1> const c1 = {{ 0x03D6 }};
          std::array<uint32_t, 1> const c2 = {{ 0x03D6 }};
          std::array<uint32_t, 1> const c3 = {{ 0x03D6 }};
          std::array<uint32_t, 1> const c4 = {{ 0x03C0 }};
          std::array<uint32_t, 1> const c5 = {{ 0x03C0 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_013)
  {
      // 03F0;03F0;03F0;03BA;03BA; 
      // (ϰ; ϰ; ϰ; κ; κ; ) GREEK KAPPA SYMBOL
      {
          std::array<uint32_t, 1> const c1 = {{ 0x03F0 }};
          std::array<uint32_t, 1> const c2 = {{ 0x03F0 }};
          std::array<uint32_t, 1> const c3 = {{ 0x03F0 }};
          std::array<uint32_t, 1> const c4 = {{ 0x03BA }};
          std::array<uint32_t, 1> const c5 = {{ 0x03BA }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_014)
  {
      // 03F1;03F1;03F1;03C1;03C1; 
      // (ϱ; ϱ; ϱ; ρ; ρ; ) GREEK RHO SYMBOL
      {
          std::array<uint32_t, 1> const c1 = {{ 0x03F1 }};
          std::array<uint32_t, 1> const c2 = {{ 0x03F1 }};
          std::array<uint32_t, 1> const c3 = {{ 0x03F1 }};
          std::array<uint32_t, 1> const c4 = {{ 0x03C1 }};
          std::array<uint32_t, 1> const c5 = {{ 0x03C1 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_015)
  {
      // 03F2;03F2;03F2;03C2;03C2; 
      // (ϲ; ϲ; ϲ; ς; ς; ) GREEK LUNATE SIGMA SYMBOL
      {
          std::array<uint32_t, 1> const c1 = {{ 0x03F2 }};
          std::array<uint32_t, 1> const c2 = {{ 0x03F2 }};
          std::array<uint32_t, 1> const c3 = {{ 0x03F2 }};
          std::array<uint32_t, 1> const c4 = {{ 0x03C2 }};
          std::array<uint32_t, 1> const c5 = {{ 0x03C2 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_016)
  {
      // 03F4;03F4;03F4;0398;0398; 
      // (ϴ; ϴ; ϴ; Θ; Θ; ) GREEK CAPITAL THETA SYMBOL
      {
          std::array<uint32_t, 1> const c1 = {{ 0x03F4 }};
          std::array<uint32_t, 1> const c2 = {{ 0x03F4 }};
          std::array<uint32_t, 1> const c3 = {{ 0x03F4 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0398 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0398 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_017)
  {
      // 03F5;03F5;03F5;03B5;03B5; 
      // (ϵ; ϵ; ϵ; ε; ε; ) GREEK LUNATE EPSILON SYMBOL
      {
          std::array<uint32_t, 1> const c1 = {{ 0x03F5 }};
          std::array<uint32_t, 1> const c2 = {{ 0x03F5 }};
          std::array<uint32_t, 1> const c3 = {{ 0x03F5 }};
          std::array<uint32_t, 1> const c4 = {{ 0x03B5 }};
          std::array<uint32_t, 1> const c5 = {{ 0x03B5 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_018)
  {
      // 03F9;03F9;03F9;03A3;03A3; 
      // (Ϲ; Ϲ; Ϲ; Σ; Σ; ) GREEK CAPITAL LUNATE SIGMA SYMBOL
      {
          std::array<uint32_t, 1> const c1 = {{ 0x03F9 }};
          std::array<uint32_t, 1> const c2 = {{ 0x03F9 }};
          std::array<uint32_t, 1> const c3 = {{ 0x03F9 }};
          std::array<uint32_t, 1> const c4 = {{ 0x03A3 }};
          std::array<uint32_t, 1> const c5 = {{ 0x03A3 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_019)
  {
      // 0400;0400;0415 0300;0400;0415 0300; 
      // (Ѐ; Ѐ; Е◌̀; Ѐ; Е◌̀; ) CYRILLIC CAPITAL LETTER IE WITH GRAVE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0400 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0400 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0415, 0x0300 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0400 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0415, 0x0300 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_020)
  {
      // 0401;0401;0415 0308;0401;0415 0308; 
      // (Ё; Ё; Е◌̈; Ё; Е◌̈; ) CYRILLIC CAPITAL LETTER IO
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0401 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0401 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0415, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0401 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0415, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_021)
  {
      // 0403;0403;0413 0301;0403;0413 0301; 
      // (Ѓ; Ѓ; Г◌́; Ѓ; Г◌́; ) CYRILLIC CAPITAL LETTER GJE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0403 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0403 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0413, 0x0301 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0403 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0413, 0x0301 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_022)
  {
      // 0407;0407;0406 0308;0407;0406 0308; 
      // (Ї; Ї; І◌̈; Ї; І◌̈; ) CYRILLIC CAPITAL LETTER YI
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0407 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0407 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0406, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0407 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0406, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_023)
  {
      // 040C;040C;041A 0301;040C;041A 0301; 
      // (Ќ; Ќ; К◌́; Ќ; К◌́; ) CYRILLIC CAPITAL LETTER KJE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x040C }};
          std::array<uint32_t, 1> const c2 = {{ 0x040C }};
          std::array<uint32_t, 2> const c3 = {{ 0x041A, 0x0301 }};
          std::array<uint32_t, 1> const c4 = {{ 0x040C }};
          std::array<uint32_t, 2> const c5 = {{ 0x041A, 0x0301 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_024)
  {
      // 040D;040D;0418 0300;040D;0418 0300; 
      // (Ѝ; Ѝ; И◌̀; Ѝ; И◌̀; ) CYRILLIC CAPITAL LETTER I WITH GRAVE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x040D }};
          std::array<uint32_t, 1> const c2 = {{ 0x040D }};
          std::array<uint32_t, 2> const c3 = {{ 0x0418, 0x0300 }};
          std::array<uint32_t, 1> const c4 = {{ 0x040D }};
          std::array<uint32_t, 2> const c5 = {{ 0x0418, 0x0300 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_025)
  {
      // 040E;040E;0423 0306;040E;0423 0306; 
      // (Ў; Ў; У◌̆; Ў; У◌̆; ) CYRILLIC CAPITAL LETTER SHORT U
      {
          std::array<uint32_t, 1> const c1 = {{ 0x040E }};
          std::array<uint32_t, 1> const c2 = {{ 0x040E }};
          std::array<uint32_t, 2> const c3 = {{ 0x0423, 0x0306 }};
          std::array<uint32_t, 1> const c4 = {{ 0x040E }};
          std::array<uint32_t, 2> const c5 = {{ 0x0423, 0x0306 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_026)
  {
      // 0419;0419;0418 0306;0419;0418 0306; 
      // (Й; Й; И◌̆; Й; И◌̆; ) CYRILLIC CAPITAL LETTER SHORT I
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0419 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0419 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0418, 0x0306 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0419 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0418, 0x0306 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_027)
  {
      // 0439;0439;0438 0306;0439;0438 0306; 
      // (й; й; и◌̆; й; и◌̆; ) CYRILLIC SMALL LETTER SHORT I
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0439 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0439 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0438, 0x0306 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0439 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0438, 0x0306 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_028)
  {
      // 0450;0450;0435 0300;0450;0435 0300; 
      // (ѐ; ѐ; е◌̀; ѐ; е◌̀; ) CYRILLIC SMALL LETTER IE WITH GRAVE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0450 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0450 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0435, 0x0300 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0450 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0435, 0x0300 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_029)
  {
      // 0451;0451;0435 0308;0451;0435 0308; 
      // (ё; ё; е◌̈; ё; е◌̈; ) CYRILLIC SMALL LETTER IO
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0451 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0451 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0435, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0451 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0435, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_030)
  {
      // 0453;0453;0433 0301;0453;0433 0301; 
      // (ѓ; ѓ; г◌́; ѓ; г◌́; ) CYRILLIC SMALL LETTER GJE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0453 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0453 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0433, 0x0301 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0453 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0433, 0x0301 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_031)
  {
      // 0457;0457;0456 0308;0457;0456 0308; 
      // (ї; ї; і◌̈; ї; і◌̈; ) CYRILLIC SMALL LETTER YI
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0457 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0457 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0456, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0457 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0456, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_032)
  {
      // 045C;045C;043A 0301;045C;043A 0301; 
      // (ќ; ќ; к◌́; ќ; к◌́; ) CYRILLIC SMALL LETTER KJE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x045C }};
          std::array<uint32_t, 1> const c2 = {{ 0x045C }};
          std::array<uint32_t, 2> const c3 = {{ 0x043A, 0x0301 }};
          std::array<uint32_t, 1> const c4 = {{ 0x045C }};
          std::array<uint32_t, 2> const c5 = {{ 0x043A, 0x0301 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_033)
  {
      // 045D;045D;0438 0300;045D;0438 0300; 
      // (ѝ; ѝ; и◌̀; ѝ; и◌̀; ) CYRILLIC SMALL LETTER I WITH GRAVE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x045D }};
          std::array<uint32_t, 1> const c2 = {{ 0x045D }};
          std::array<uint32_t, 2> const c3 = {{ 0x0438, 0x0300 }};
          std::array<uint32_t, 1> const c4 = {{ 0x045D }};
          std::array<uint32_t, 2> const c5 = {{ 0x0438, 0x0300 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_034)
  {
      // 045E;045E;0443 0306;045E;0443 0306; 
      // (ў; ў; у◌̆; ў; у◌̆; ) CYRILLIC SMALL LETTER SHORT U
      {
          std::array<uint32_t, 1> const c1 = {{ 0x045E }};
          std::array<uint32_t, 1> const c2 = {{ 0x045E }};
          std::array<uint32_t, 2> const c3 = {{ 0x0443, 0x0306 }};
          std::array<uint32_t, 1> const c4 = {{ 0x045E }};
          std::array<uint32_t, 2> const c5 = {{ 0x0443, 0x0306 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_035)
  {
      // 0476;0476;0474 030F;0476;0474 030F; 
      // (Ѷ; Ѷ; Ѵ◌̏; Ѷ; Ѵ◌̏; ) CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0476 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0476 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0474, 0x030F }};
          std::array<uint32_t, 1> const c4 = {{ 0x0476 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0474, 0x030F }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_036)
  {
      // 0477;0477;0475 030F;0477;0475 030F; 
      // (ѷ; ѷ; ѵ◌̏; ѷ; ѵ◌̏; ) CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0477 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0477 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0475, 0x030F }};
          std::array<uint32_t, 1> const c4 = {{ 0x0477 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0475, 0x030F }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_037)
  {
      // 04C1;04C1;0416 0306;04C1;0416 0306; 
      // (Ӂ; Ӂ; Ж◌̆; Ӂ; Ж◌̆; ) CYRILLIC CAPITAL LETTER ZHE WITH BREVE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04C1 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04C1 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0416, 0x0306 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04C1 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0416, 0x0306 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_038)
  {
      // 04C2;04C2;0436 0306;04C2;0436 0306; 
      // (ӂ; ӂ; ж◌̆; ӂ; ж◌̆; ) CYRILLIC SMALL LETTER ZHE WITH BREVE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04C2 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04C2 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0436, 0x0306 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04C2 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0436, 0x0306 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_039)
  {
      // 04D0;04D0;0410 0306;04D0;0410 0306; 
      // (Ӑ; Ӑ; А◌̆; Ӑ; А◌̆; ) CYRILLIC CAPITAL LETTER A WITH BREVE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04D0 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04D0 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0410, 0x0306 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04D0 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0410, 0x0306 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_040)
  {
      // 04D1;04D1;0430 0306;04D1;0430 0306; 
      // (ӑ; ӑ; а◌̆; ӑ; а◌̆; ) CYRILLIC SMALL LETTER A WITH BREVE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04D1 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04D1 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0430, 0x0306 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04D1 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0430, 0x0306 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_041)
  {
      // 04D2;04D2;0410 0308;04D2;0410 0308; 
      // (Ӓ; Ӓ; А◌̈; Ӓ; А◌̈; ) CYRILLIC CAPITAL LETTER A WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04D2 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04D2 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0410, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04D2 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0410, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_042)
  {
      // 04D3;04D3;0430 0308;04D3;0430 0308; 
      // (ӓ; ӓ; а◌̈; ӓ; а◌̈; ) CYRILLIC SMALL LETTER A WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04D3 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04D3 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0430, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04D3 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0430, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_043)
  {
      // 04D6;04D6;0415 0306;04D6;0415 0306; 
      // (Ӗ; Ӗ; Е◌̆; Ӗ; Е◌̆; ) CYRILLIC CAPITAL LETTER IE WITH BREVE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04D6 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04D6 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0415, 0x0306 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04D6 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0415, 0x0306 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_044)
  {
      // 04D7;04D7;0435 0306;04D7;0435 0306; 
      // (ӗ; ӗ; е◌̆; ӗ; е◌̆; ) CYRILLIC SMALL LETTER IE WITH BREVE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04D7 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04D7 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0435, 0x0306 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04D7 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0435, 0x0306 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_045)
  {
      // 04DA;04DA;04D8 0308;04DA;04D8 0308; 
      // (Ӛ; Ӛ; Ә◌̈; Ӛ; Ә◌̈; ) CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04DA }};
          std::array<uint32_t, 1> const c2 = {{ 0x04DA }};
          std::array<uint32_t, 2> const c3 = {{ 0x04D8, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04DA }};
          std::array<uint32_t, 2> const c5 = {{ 0x04D8, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_046)
  {
      // 04DB;04DB;04D9 0308;04DB;04D9 0308; 
      // (ӛ; ӛ; ә◌̈; ӛ; ә◌̈; ) CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04DB }};
          std::array<uint32_t, 1> const c2 = {{ 0x04DB }};
          std::array<uint32_t, 2> const c3 = {{ 0x04D9, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04DB }};
          std::array<uint32_t, 2> const c5 = {{ 0x04D9, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_047)
  {
      // 04DC;04DC;0416 0308;04DC;0416 0308; 
      // (Ӝ; Ӝ; Ж◌̈; Ӝ; Ж◌̈; ) CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04DC }};
          std::array<uint32_t, 1> const c2 = {{ 0x04DC }};
          std::array<uint32_t, 2> const c3 = {{ 0x0416, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04DC }};
          std::array<uint32_t, 2> const c5 = {{ 0x0416, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_048)
  {
      // 04DD;04DD;0436 0308;04DD;0436 0308; 
      // (ӝ; ӝ; ж◌̈; ӝ; ж◌̈; ) CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04DD }};
          std::array<uint32_t, 1> const c2 = {{ 0x04DD }};
          std::array<uint32_t, 2> const c3 = {{ 0x0436, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04DD }};
          std::array<uint32_t, 2> const c5 = {{ 0x0436, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_049)
  {
      // 04DE;04DE;0417 0308;04DE;0417 0308; 
      // (Ӟ; Ӟ; З◌̈; Ӟ; З◌̈; ) CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04DE }};
          std::array<uint32_t, 1> const c2 = {{ 0x04DE }};
          std::array<uint32_t, 2> const c3 = {{ 0x0417, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04DE }};
          std::array<uint32_t, 2> const c5 = {{ 0x0417, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_050)
  {
      // 04DF;04DF;0437 0308;04DF;0437 0308; 
      // (ӟ; ӟ; з◌̈; ӟ; з◌̈; ) CYRILLIC SMALL LETTER ZE WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04DF }};
          std::array<uint32_t, 1> const c2 = {{ 0x04DF }};
          std::array<uint32_t, 2> const c3 = {{ 0x0437, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04DF }};
          std::array<uint32_t, 2> const c5 = {{ 0x0437, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_051)
  {
      // 04E2;04E2;0418 0304;04E2;0418 0304; 
      // (Ӣ; Ӣ; И◌̄; Ӣ; И◌̄; ) CYRILLIC CAPITAL LETTER I WITH MACRON
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04E2 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04E2 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0418, 0x0304 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04E2 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0418, 0x0304 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_052)
  {
      // 04E3;04E3;0438 0304;04E3;0438 0304; 
      // (ӣ; ӣ; и◌̄; ӣ; и◌̄; ) CYRILLIC SMALL LETTER I WITH MACRON
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04E3 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04E3 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0438, 0x0304 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04E3 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0438, 0x0304 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_053)
  {
      // 04E4;04E4;0418 0308;04E4;0418 0308; 
      // (Ӥ; Ӥ; И◌̈; Ӥ; И◌̈; ) CYRILLIC CAPITAL LETTER I WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04E4 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04E4 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0418, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04E4 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0418, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_054)
  {
      // 04E5;04E5;0438 0308;04E5;0438 0308; 
      // (ӥ; ӥ; и◌̈; ӥ; и◌̈; ) CYRILLIC SMALL LETTER I WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04E5 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04E5 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0438, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04E5 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0438, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_055)
  {
      // 04E6;04E6;041E 0308;04E6;041E 0308; 
      // (Ӧ; Ӧ; О◌̈; Ӧ; О◌̈; ) CYRILLIC CAPITAL LETTER O WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04E6 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04E6 }};
          std::array<uint32_t, 2> const c3 = {{ 0x041E, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04E6 }};
          std::array<uint32_t, 2> const c5 = {{ 0x041E, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_056)
  {
      // 04E7;04E7;043E 0308;04E7;043E 0308; 
      // (ӧ; ӧ; о◌̈; ӧ; о◌̈; ) CYRILLIC SMALL LETTER O WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04E7 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04E7 }};
          std::array<uint32_t, 2> const c3 = {{ 0x043E, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04E7 }};
          std::array<uint32_t, 2> const c5 = {{ 0x043E, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_057)
  {
      // 04EA;04EA;04E8 0308;04EA;04E8 0308; 
      // (Ӫ; Ӫ; Ө◌̈; Ӫ; Ө◌̈; ) CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04EA }};
          std::array<uint32_t, 1> const c2 = {{ 0x04EA }};
          std::array<uint32_t, 2> const c3 = {{ 0x04E8, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04EA }};
          std::array<uint32_t, 2> const c5 = {{ 0x04E8, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_058)
  {
      // 04EB;04EB;04E9 0308;04EB;04E9 0308; 
      // (ӫ; ӫ; ө◌̈; ӫ; ө◌̈; ) CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04EB }};
          std::array<uint32_t, 1> const c2 = {{ 0x04EB }};
          std::array<uint32_t, 2> const c3 = {{ 0x04E9, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04EB }};
          std::array<uint32_t, 2> const c5 = {{ 0x04E9, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_059)
  {
      // 04EC;04EC;042D 0308;04EC;042D 0308; 
      // (Ӭ; Ӭ; Э◌̈; Ӭ; Э◌̈; ) CYRILLIC CAPITAL LETTER E WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04EC }};
          std::array<uint32_t, 1> const c2 = {{ 0x04EC }};
          std::array<uint32_t, 2> const c3 = {{ 0x042D, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04EC }};
          std::array<uint32_t, 2> const c5 = {{ 0x042D, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_060)
  {
      // 04ED;04ED;044D 0308;04ED;044D 0308; 
      // (ӭ; ӭ; э◌̈; ӭ; э◌̈; ) CYRILLIC SMALL LETTER E WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04ED }};
          std::array<uint32_t, 1> const c2 = {{ 0x04ED }};
          std::array<uint32_t, 2> const c3 = {{ 0x044D, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04ED }};
          std::array<uint32_t, 2> const c5 = {{ 0x044D, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_061)
  {
      // 04EE;04EE;0423 0304;04EE;0423 0304; 
      // (Ӯ; Ӯ; У◌̄; Ӯ; У◌̄; ) CYRILLIC CAPITAL LETTER U WITH MACRON
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04EE }};
          std::array<uint32_t, 1> const c2 = {{ 0x04EE }};
          std::array<uint32_t, 2> const c3 = {{ 0x0423, 0x0304 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04EE }};
          std::array<uint32_t, 2> const c5 = {{ 0x0423, 0x0304 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_062)
  {
      // 04EF;04EF;0443 0304;04EF;0443 0304; 
      // (ӯ; ӯ; у◌̄; ӯ; у◌̄; ) CYRILLIC SMALL LETTER U WITH MACRON
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04EF }};
          std::array<uint32_t, 1> const c2 = {{ 0x04EF }};
          std::array<uint32_t, 2> const c3 = {{ 0x0443, 0x0304 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04EF }};
          std::array<uint32_t, 2> const c5 = {{ 0x0443, 0x0304 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_063)
  {
      // 04F0;04F0;0423 0308;04F0;0423 0308; 
      // (Ӱ; Ӱ; У◌̈; Ӱ; У◌̈; ) CYRILLIC CAPITAL LETTER U WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04F0 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04F0 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0423, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04F0 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0423, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_064)
  {
      // 04F1;04F1;0443 0308;04F1;0443 0308; 
      // (ӱ; ӱ; у◌̈; ӱ; у◌̈; ) CYRILLIC SMALL LETTER U WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04F1 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04F1 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0443, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04F1 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0443, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_065)
  {
      // 04F2;04F2;0423 030B;04F2;0423 030B; 
      // (Ӳ; Ӳ; У◌̋; Ӳ; У◌̋; ) CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04F2 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04F2 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0423, 0x030B }};
          std::array<uint32_t, 1> const c4 = {{ 0x04F2 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0423, 0x030B }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_066)
  {
      // 04F3;04F3;0443 030B;04F3;0443 030B; 
      // (ӳ; ӳ; у◌̋; ӳ; у◌̋; ) CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04F3 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04F3 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0443, 0x030B }};
          std::array<uint32_t, 1> const c4 = {{ 0x04F3 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0443, 0x030B }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_067)
  {
      // 04F4;04F4;0427 0308;04F4;0427 0308; 
      // (Ӵ; Ӵ; Ч◌̈; Ӵ; Ч◌̈; ) CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04F4 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04F4 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0427, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04F4 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0427, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_068)
  {
      // 04F5;04F5;0447 0308;04F5;0447 0308; 
      // (ӵ; ӵ; ч◌̈; ӵ; ч◌̈; ) CYRILLIC SMALL LETTER CHE WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04F5 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04F5 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0447, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04F5 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0447, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_069)
  {
      // 04F8;04F8;042B 0308;04F8;042B 0308; 
      // (Ӹ; Ӹ; Ы◌̈; Ӹ; Ы◌̈; ) CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04F8 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04F8 }};
          std::array<uint32_t, 2> const c3 = {{ 0x042B, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04F8 }};
          std::array<uint32_t, 2> const c5 = {{ 0x042B, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_070)
  {
      // 04F9;04F9;044B 0308;04F9;044B 0308; 
      // (ӹ; ӹ; ы◌̈; ӹ; ы◌̈; ) CYRILLIC SMALL LETTER YERU WITH DIAERESIS
      {
          std::array<uint32_t, 1> const c1 = {{ 0x04F9 }};
          std::array<uint32_t, 1> const c2 = {{ 0x04F9 }};
          std::array<uint32_t, 2> const c3 = {{ 0x044B, 0x0308 }};
          std::array<uint32_t, 1> const c4 = {{ 0x04F9 }};
          std::array<uint32_t, 2> const c5 = {{ 0x044B, 0x0308 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_071)
  {
      // 0587;0587;0587;0565 0582;0565 0582; 
      // (և; և; և; եւ; եւ; ) ARMENIAN SMALL LIGATURE ECH YIWN
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0587 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0587 }};
          std::array<uint32_t, 1> const c3 = {{ 0x0587 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0565, 0x0582 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0565, 0x0582 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_072)
  {
      // 0622;0622;0627 0653;0622;0627 0653; 
      // (آ; آ; ا◌ٓ; آ; ا◌ٓ; ) ARABIC LETTER ALEF WITH MADDA ABOVE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0622 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0622 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0627, 0x0653 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0622 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0627, 0x0653 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_073)
  {
      // 0623;0623;0627 0654;0623;0627 0654; 
      // (أ; أ; ا◌ٔ; أ; ا◌ٔ; ) ARABIC LETTER ALEF WITH HAMZA ABOVE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0623 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0623 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0627, 0x0654 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0623 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0627, 0x0654 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_074)
  {
      // 0624;0624;0648 0654;0624;0648 0654; 
      // (ؤ; ؤ; و◌ٔ; ؤ; و◌ٔ; ) ARABIC LETTER WAW WITH HAMZA ABOVE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0624 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0624 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0648, 0x0654 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0624 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0648, 0x0654 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_075)
  {
      // 0625;0625;0627 0655;0625;0627 0655; 
      // (إ; إ; ا◌ٕ; إ; ا◌ٕ; ) ARABIC LETTER ALEF WITH HAMZA BELOW
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0625 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0625 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0627, 0x0655 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0625 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0627, 0x0655 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_076)
  {
      // 0626;0626;064A 0654;0626;064A 0654; 
      // (ئ; ئ; ي◌ٔ; ئ; ي◌ٔ; ) ARABIC LETTER YEH WITH HAMZA ABOVE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0626 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0626 }};
          std::array<uint32_t, 2> const c3 = {{ 0x064A, 0x0654 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0626 }};
          std::array<uint32_t, 2> const c5 = {{ 0x064A, 0x0654 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_077)
  {
      // 0675;0675;0675;0627 0674;0627 0674; 
      // (ٵ; ٵ; ٵ; اٴ; اٴ; ) ARABIC LETTER HIGH HAMZA ALEF
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0675 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0675 }};
          std::array<uint32_t, 1> const c3 = {{ 0x0675 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0627, 0x0674 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0627, 0x0674 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_078)
  {
      // 0676;0676;0676;0648 0674;0648 0674; 
      // (ٶ; ٶ; ٶ; وٴ; وٴ; ) ARABIC LETTER HIGH HAMZA WAW
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0676 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0676 }};
          std::array<uint32_t, 1> const c3 = {{ 0x0676 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0648, 0x0674 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0648, 0x0674 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_079)
  {
      // 0677;0677;0677;06C7 0674;06C7 0674; 
      // (ٷ; ٷ; ٷ; ۇٴ; ۇٴ; ) ARABIC LETTER U WITH HAMZA ABOVE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0677 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0677 }};
          std::array<uint32_t, 1> const c3 = {{ 0x0677 }};
          std::array<uint32_t, 2> const c4 = {{ 0x06C7, 0x0674 }};
          std::array<uint32_t, 2> const c5 = {{ 0x06C7, 0x0674 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_080)
  {
      // 0678;0678;0678;064A 0674;064A 0674; 
      // (ٸ; ٸ; ٸ; يٴ; يٴ; ) ARABIC LETTER HIGH HAMZA YEH
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0678 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0678 }};
          std::array<uint32_t, 1> const c3 = {{ 0x0678 }};
          std::array<uint32_t, 2> const c4 = {{ 0x064A, 0x0674 }};
          std::array<uint32_t, 2> const c5 = {{ 0x064A, 0x0674 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_081)
  {
      // 06C0;06C0;06D5 0654;06C0;06D5 0654; 
      // (ۀ; ۀ; ە◌ٔ; ۀ; ە◌ٔ; ) ARABIC LETTER HEH WITH YEH ABOVE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x06C0 }};
          std::array<uint32_t, 1> const c2 = {{ 0x06C0 }};
          std::array<uint32_t, 2> const c3 = {{ 0x06D5, 0x0654 }};
          std::array<uint32_t, 1> const c4 = {{ 0x06C0 }};
          std::array<uint32_t, 2> const c5 = {{ 0x06D5, 0x0654 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_082)
  {
      // 06C2;06C2;06C1 0654;06C2;06C1 0654; 
      // (ۂ; ۂ; ہ◌ٔ; ۂ; ہ◌ٔ; ) ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x06C2 }};
          std::array<uint32_t, 1> const c2 = {{ 0x06C2 }};
          std::array<uint32_t, 2> const c3 = {{ 0x06C1, 0x0654 }};
          std::array<uint32_t, 1> const c4 = {{ 0x06C2 }};
          std::array<uint32_t, 2> const c5 = {{ 0x06C1, 0x0654 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_083)
  {
      // 06D3;06D3;06D2 0654;06D3;06D2 0654; 
      // (ۓ; ۓ; ے◌ٔ; ۓ; ے◌ٔ; ) ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x06D3 }};
          std::array<uint32_t, 1> const c2 = {{ 0x06D3 }};
          std::array<uint32_t, 2> const c3 = {{ 0x06D2, 0x0654 }};
          std::array<uint32_t, 1> const c4 = {{ 0x06D3 }};
          std::array<uint32_t, 2> const c5 = {{ 0x06D2, 0x0654 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_084)
  {
      // 0929;0929;0928 093C;0929;0928 093C; 
      // (ऩ; ऩ; न◌़; ऩ; न◌़; ) DEVANAGARI LETTER NNNA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0929 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0929 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0928, 0x093C }};
          std::array<uint32_t, 1> const c4 = {{ 0x0929 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0928, 0x093C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_085)
  {
      // 0931;0931;0930 093C;0931;0930 093C; 
      // (ऱ; ऱ; र◌़; ऱ; र◌़; ) DEVANAGARI LETTER RRA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0931 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0931 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0930, 0x093C }};
          std::array<uint32_t, 1> const c4 = {{ 0x0931 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0930, 0x093C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_086)
  {
      // 0934;0934;0933 093C;0934;0933 093C; 
      // (ऴ; ऴ; ळ◌़; ऴ; ळ◌़; ) DEVANAGARI LETTER LLLA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0934 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0934 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0933, 0x093C }};
          std::array<uint32_t, 1> const c4 = {{ 0x0934 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0933, 0x093C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_087)
  {
      // 0958;0915 093C;0915 093C;0915 093C;0915 093C; 
      // (क़; क◌़; क◌़; क◌़; क◌़; ) DEVANAGARI LETTER QA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0958 }};
          std::array<uint32_t, 2> const c2 = {{ 0x0915, 0x093C }};
          std::array<uint32_t, 2> const c3 = {{ 0x0915, 0x093C }};
          std::array<uint32_t, 2> const c4 = {{ 0x0915, 0x093C }};
          std::array<uint32_t, 2> const c5 = {{ 0x0915, 0x093C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_088)
  {
      // 0959;0916 093C;0916 093C;0916 093C;0916 093C; 
      // (ख़; ख◌़; ख◌़; ख◌़; ख◌़; ) DEVANAGARI LETTER KHHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0959 }};
          std::array<uint32_t, 2> const c2 = {{ 0x0916, 0x093C }};
          std::array<uint32_t, 2> const c3 = {{ 0x0916, 0x093C }};
          std::array<uint32_t, 2> const c4 = {{ 0x0916, 0x093C }};
          std::array<uint32_t, 2> const c5 = {{ 0x0916, 0x093C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_089)
  {
      // 095A;0917 093C;0917 093C;0917 093C;0917 093C; 
      // (ग़; ग◌़; ग◌़; ग◌़; ग◌़; ) DEVANAGARI LETTER GHHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x095A }};
          std::array<uint32_t, 2> const c2 = {{ 0x0917, 0x093C }};
          std::array<uint32_t, 2> const c3 = {{ 0x0917, 0x093C }};
          std::array<uint32_t, 2> const c4 = {{ 0x0917, 0x093C }};
          std::array<uint32_t, 2> const c5 = {{ 0x0917, 0x093C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_090)
  {
      // 095B;091C 093C;091C 093C;091C 093C;091C 093C; 
      // (ज़; ज◌़; ज◌़; ज◌़; ज◌़; ) DEVANAGARI LETTER ZA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x095B }};
          std::array<uint32_t, 2> const c2 = {{ 0x091C, 0x093C }};
          std::array<uint32_t, 2> const c3 = {{ 0x091C, 0x093C }};
          std::array<uint32_t, 2> const c4 = {{ 0x091C, 0x093C }};
          std::array<uint32_t, 2> const c5 = {{ 0x091C, 0x093C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_091)
  {
      // 095C;0921 093C;0921 093C;0921 093C;0921 093C; 
      // (ड़; ड◌़; ड◌़; ड◌़; ड◌़; ) DEVANAGARI LETTER DDDHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x095C }};
          std::array<uint32_t, 2> const c2 = {{ 0x0921, 0x093C }};
          std::array<uint32_t, 2> const c3 = {{ 0x0921, 0x093C }};
          std::array<uint32_t, 2> const c4 = {{ 0x0921, 0x093C }};
          std::array<uint32_t, 2> const c5 = {{ 0x0921, 0x093C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_092)
  {
      // 095D;0922 093C;0922 093C;0922 093C;0922 093C; 
      // (ढ़; ढ◌़; ढ◌़; ढ◌़; ढ◌़; ) DEVANAGARI LETTER RHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x095D }};
          std::array<uint32_t, 2> const c2 = {{ 0x0922, 0x093C }};
          std::array<uint32_t, 2> const c3 = {{ 0x0922, 0x093C }};
          std::array<uint32_t, 2> const c4 = {{ 0x0922, 0x093C }};
          std::array<uint32_t, 2> const c5 = {{ 0x0922, 0x093C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_093)
  {
      // 095E;092B 093C;092B 093C;092B 093C;092B 093C; 
      // (फ़; फ◌़; फ◌़; फ◌़; फ◌़; ) DEVANAGARI LETTER FA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x095E }};
          std::array<uint32_t, 2> const c2 = {{ 0x092B, 0x093C }};
          std::array<uint32_t, 2> const c3 = {{ 0x092B, 0x093C }};
          std::array<uint32_t, 2> const c4 = {{ 0x092B, 0x093C }};
          std::array<uint32_t, 2> const c5 = {{ 0x092B, 0x093C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_094)
  {
      // 095F;092F 093C;092F 093C;092F 093C;092F 093C; 
      // (य़; य◌़; य◌़; य◌़; य◌़; ) DEVANAGARI LETTER YYA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x095F }};
          std::array<uint32_t, 2> const c2 = {{ 0x092F, 0x093C }};
          std::array<uint32_t, 2> const c3 = {{ 0x092F, 0x093C }};
          std::array<uint32_t, 2> const c4 = {{ 0x092F, 0x093C }};
          std::array<uint32_t, 2> const c5 = {{ 0x092F, 0x093C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_095)
  {
      // 09CB;09CB;09C7 09BE;09CB;09C7 09BE; 
      // (ো; ো; ো; ো; ো; ) BENGALI VOWEL SIGN O
      {
          std::array<uint32_t, 1> const c1 = {{ 0x09CB }};
          std::array<uint32_t, 1> const c2 = {{ 0x09CB }};
          std::array<uint32_t, 2> const c3 = {{ 0x09C7, 0x09BE }};
          std::array<uint32_t, 1> const c4 = {{ 0x09CB }};
          std::array<uint32_t, 2> const c5 = {{ 0x09C7, 0x09BE }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_096)
  {
      // 09CC;09CC;09C7 09D7;09CC;09C7 09D7; 
      // (ৌ; ৌ; ৌ; ৌ; ৌ; ) BENGALI VOWEL SIGN AU
      {
          std::array<uint32_t, 1> const c1 = {{ 0x09CC }};
          std::array<uint32_t, 1> const c2 = {{ 0x09CC }};
          std::array<uint32_t, 2> const c3 = {{ 0x09C7, 0x09D7 }};
          std::array<uint32_t, 1> const c4 = {{ 0x09CC }};
          std::array<uint32_t, 2> const c5 = {{ 0x09C7, 0x09D7 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_097)
  {
      // 09DC;09A1 09BC;09A1 09BC;09A1 09BC;09A1 09BC; 
      // (ড়; ড◌়; ড◌়; ড◌়; ড◌়; ) BENGALI LETTER RRA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x09DC }};
          std::array<uint32_t, 2> const c2 = {{ 0x09A1, 0x09BC }};
          std::array<uint32_t, 2> const c3 = {{ 0x09A1, 0x09BC }};
          std::array<uint32_t, 2> const c4 = {{ 0x09A1, 0x09BC }};
          std::array<uint32_t, 2> const c5 = {{ 0x09A1, 0x09BC }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_098)
  {
      // 09DD;09A2 09BC;09A2 09BC;09A2 09BC;09A2 09BC; 
      // (ঢ়; ঢ◌়; ঢ◌়; ঢ◌়; ঢ◌়; ) BENGALI LETTER RHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x09DD }};
          std::array<uint32_t, 2> const c2 = {{ 0x09A2, 0x09BC }};
          std::array<uint32_t, 2> const c3 = {{ 0x09A2, 0x09BC }};
          std::array<uint32_t, 2> const c4 = {{ 0x09A2, 0x09BC }};
          std::array<uint32_t, 2> const c5 = {{ 0x09A2, 0x09BC }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_099)
  {
      // 09DF;09AF 09BC;09AF 09BC;09AF 09BC;09AF 09BC; 
      // (য়; য◌়; য◌়; য◌়; য◌়; ) BENGALI LETTER YYA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x09DF }};
          std::array<uint32_t, 2> const c2 = {{ 0x09AF, 0x09BC }};
          std::array<uint32_t, 2> const c3 = {{ 0x09AF, 0x09BC }};
          std::array<uint32_t, 2> const c4 = {{ 0x09AF, 0x09BC }};
          std::array<uint32_t, 2> const c5 = {{ 0x09AF, 0x09BC }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_100)
  {
      // 0A33;0A32 0A3C;0A32 0A3C;0A32 0A3C;0A32 0A3C; 
      // (ਲ਼; ਲ◌਼; ਲ◌਼; ਲ◌਼; ਲ◌਼; ) GURMUKHI LETTER LLA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0A33 }};
          std::array<uint32_t, 2> const c2 = {{ 0x0A32, 0x0A3C }};
          std::array<uint32_t, 2> const c3 = {{ 0x0A32, 0x0A3C }};
          std::array<uint32_t, 2> const c4 = {{ 0x0A32, 0x0A3C }};
          std::array<uint32_t, 2> const c5 = {{ 0x0A32, 0x0A3C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_101)
  {
      // 0A36;0A38 0A3C;0A38 0A3C;0A38 0A3C;0A38 0A3C; 
      // (ਸ਼; ਸ◌਼; ਸ◌਼; ਸ◌਼; ਸ◌਼; ) GURMUKHI LETTER SHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0A36 }};
          std::array<uint32_t, 2> const c2 = {{ 0x0A38, 0x0A3C }};
          std::array<uint32_t, 2> const c3 = {{ 0x0A38, 0x0A3C }};
          std::array<uint32_t, 2> const c4 = {{ 0x0A38, 0x0A3C }};
          std::array<uint32_t, 2> const c5 = {{ 0x0A38, 0x0A3C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_102)
  {
      // 0A59;0A16 0A3C;0A16 0A3C;0A16 0A3C;0A16 0A3C; 
      // (ਖ਼; ਖ◌਼; ਖ◌਼; ਖ◌਼; ਖ◌਼; ) GURMUKHI LETTER KHHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0A59 }};
          std::array<uint32_t, 2> const c2 = {{ 0x0A16, 0x0A3C }};
          std::array<uint32_t, 2> const c3 = {{ 0x0A16, 0x0A3C }};
          std::array<uint32_t, 2> const c4 = {{ 0x0A16, 0x0A3C }};
          std::array<uint32_t, 2> const c5 = {{ 0x0A16, 0x0A3C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_103)
  {
      // 0A5A;0A17 0A3C;0A17 0A3C;0A17 0A3C;0A17 0A3C; 
      // (ਗ਼; ਗ◌਼; ਗ◌਼; ਗ◌਼; ਗ◌਼; ) GURMUKHI LETTER GHHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0A5A }};
          std::array<uint32_t, 2> const c2 = {{ 0x0A17, 0x0A3C }};
          std::array<uint32_t, 2> const c3 = {{ 0x0A17, 0x0A3C }};
          std::array<uint32_t, 2> const c4 = {{ 0x0A17, 0x0A3C }};
          std::array<uint32_t, 2> const c5 = {{ 0x0A17, 0x0A3C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_104)
  {
      // 0A5B;0A1C 0A3C;0A1C 0A3C;0A1C 0A3C;0A1C 0A3C; 
      // (ਜ਼; ਜ◌਼; ਜ◌਼; ਜ◌਼; ਜ◌਼; ) GURMUKHI LETTER ZA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0A5B }};
          std::array<uint32_t, 2> const c2 = {{ 0x0A1C, 0x0A3C }};
          std::array<uint32_t, 2> const c3 = {{ 0x0A1C, 0x0A3C }};
          std::array<uint32_t, 2> const c4 = {{ 0x0A1C, 0x0A3C }};
          std::array<uint32_t, 2> const c5 = {{ 0x0A1C, 0x0A3C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_105)
  {
      // 0A5E;0A2B 0A3C;0A2B 0A3C;0A2B 0A3C;0A2B 0A3C; 
      // (ਫ਼; ਫ◌਼; ਫ◌਼; ਫ◌਼; ਫ◌਼; ) GURMUKHI LETTER FA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0A5E }};
          std::array<uint32_t, 2> const c2 = {{ 0x0A2B, 0x0A3C }};
          std::array<uint32_t, 2> const c3 = {{ 0x0A2B, 0x0A3C }};
          std::array<uint32_t, 2> const c4 = {{ 0x0A2B, 0x0A3C }};
          std::array<uint32_t, 2> const c5 = {{ 0x0A2B, 0x0A3C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_106)
  {
      // 0B48;0B48;0B47 0B56;0B48;0B47 0B56; 
      // (ୈ; ୈ; େ◌ୖ; ୈ; େ◌ୖ; ) ORIYA VOWEL SIGN AI
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0B48 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0B48 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0B47, 0x0B56 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0B48 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0B47, 0x0B56 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_107)
  {
      // 0B4B;0B4B;0B47 0B3E;0B4B;0B47 0B3E; 
      // (ୋ; ୋ; ୋ; ୋ; ୋ; ) ORIYA VOWEL SIGN O
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0B4B }};
          std::array<uint32_t, 1> const c2 = {{ 0x0B4B }};
          std::array<uint32_t, 2> const c3 = {{ 0x0B47, 0x0B3E }};
          std::array<uint32_t, 1> const c4 = {{ 0x0B4B }};
          std::array<uint32_t, 2> const c5 = {{ 0x0B47, 0x0B3E }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_108)
  {
      // 0B4C;0B4C;0B47 0B57;0B4C;0B47 0B57; 
      // (ୌ; ୌ; ୌ; ୌ; ୌ; ) ORIYA VOWEL SIGN AU
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0B4C }};
          std::array<uint32_t, 1> const c2 = {{ 0x0B4C }};
          std::array<uint32_t, 2> const c3 = {{ 0x0B47, 0x0B57 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0B4C }};
          std::array<uint32_t, 2> const c5 = {{ 0x0B47, 0x0B57 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_109)
  {
      // 0B5C;0B21 0B3C;0B21 0B3C;0B21 0B3C;0B21 0B3C; 
      // (ଡ଼; ଡ◌଼; ଡ◌଼; ଡ◌଼; ଡ◌଼; ) ORIYA LETTER RRA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0B5C }};
          std::array<uint32_t, 2> const c2 = {{ 0x0B21, 0x0B3C }};
          std::array<uint32_t, 2> const c3 = {{ 0x0B21, 0x0B3C }};
          std::array<uint32_t, 2> const c4 = {{ 0x0B21, 0x0B3C }};
          std::array<uint32_t, 2> const c5 = {{ 0x0B21, 0x0B3C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_110)
  {
      // 0B5D;0B22 0B3C;0B22 0B3C;0B22 0B3C;0B22 0B3C; 
      // (ଢ଼; ଢ◌଼; ଢ◌଼; ଢ◌଼; ଢ◌଼; ) ORIYA LETTER RHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0B5D }};
          std::array<uint32_t, 2> const c2 = {{ 0x0B22, 0x0B3C }};
          std::array<uint32_t, 2> const c3 = {{ 0x0B22, 0x0B3C }};
          std::array<uint32_t, 2> const c4 = {{ 0x0B22, 0x0B3C }};
          std::array<uint32_t, 2> const c5 = {{ 0x0B22, 0x0B3C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_111)
  {
      // 0B94;0B94;0B92 0BD7;0B94;0B92 0BD7; 
      // (ஔ; ஔ; ஔ; ஔ; ஔ; ) TAMIL LETTER AU
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0B94 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0B94 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0B92, 0x0BD7 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0B94 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0B92, 0x0BD7 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_112)
  {
      // 0BCA;0BCA;0BC6 0BBE;0BCA;0BC6 0BBE; 
      // (ொ; ொ; ொ; ொ; ொ; ) TAMIL VOWEL SIGN O
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0BCA }};
          std::array<uint32_t, 1> const c2 = {{ 0x0BCA }};
          std::array<uint32_t, 2> const c3 = {{ 0x0BC6, 0x0BBE }};
          std::array<uint32_t, 1> const c4 = {{ 0x0BCA }};
          std::array<uint32_t, 2> const c5 = {{ 0x0BC6, 0x0BBE }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_113)
  {
      // 0BCB;0BCB;0BC7 0BBE;0BCB;0BC7 0BBE; 
      // (ோ; ோ; ோ; ோ; ோ; ) TAMIL VOWEL SIGN OO
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0BCB }};
          std::array<uint32_t, 1> const c2 = {{ 0x0BCB }};
          std::array<uint32_t, 2> const c3 = {{ 0x0BC7, 0x0BBE }};
          std::array<uint32_t, 1> const c4 = {{ 0x0BCB }};
          std::array<uint32_t, 2> const c5 = {{ 0x0BC7, 0x0BBE }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_114)
  {
      // 0BCC;0BCC;0BC6 0BD7;0BCC;0BC6 0BD7; 
      // (ௌ; ௌ; ௌ; ௌ; ௌ; ) TAMIL VOWEL SIGN AU
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0BCC }};
          std::array<uint32_t, 1> const c2 = {{ 0x0BCC }};
          std::array<uint32_t, 2> const c3 = {{ 0x0BC6, 0x0BD7 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0BCC }};
          std::array<uint32_t, 2> const c5 = {{ 0x0BC6, 0x0BD7 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_115)
  {
      // 0C48;0C48;0C46 0C56;0C48;0C46 0C56; 
      // (◌ై; ◌ై; ◌ె◌ౖ; ◌ై; ◌ె◌ౖ; ) TELUGU VOWEL SIGN AI
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0C48 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0C48 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0C46, 0x0C56 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0C48 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0C46, 0x0C56 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_116)
  {
      // 0CC0;0CC0;0CBF 0CD5;0CC0;0CBF 0CD5; 
      // (ೀ; ೀ; ◌ೀ; ೀ; ◌ೀ; ) KANNADA VOWEL SIGN II
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0CC0 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0CC0 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0CBF, 0x0CD5 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0CC0 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0CBF, 0x0CD5 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_117)
  {
      // 0CC7;0CC7;0CC6 0CD5;0CC7;0CC6 0CD5; 
      // (ೇ; ೇ; ◌ೇ; ೇ; ◌ೇ; ) KANNADA VOWEL SIGN EE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0CC7 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0CC7 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0CC6, 0x0CD5 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0CC7 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0CC6, 0x0CD5 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_118)
  {
      // 0CC8;0CC8;0CC6 0CD6;0CC8;0CC6 0CD6; 
      // (ೈ; ೈ; ◌ೈ; ೈ; ◌ೈ; ) KANNADA VOWEL SIGN AI
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0CC8 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0CC8 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0CC6, 0x0CD6 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0CC8 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0CC6, 0x0CD6 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_119)
  {
      // 0CCA;0CCA;0CC6 0CC2;0CCA;0CC6 0CC2; 
      // (ೊ; ೊ; ◌ೊ; ೊ; ◌ೊ; ) KANNADA VOWEL SIGN O
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0CCA }};
          std::array<uint32_t, 1> const c2 = {{ 0x0CCA }};
          std::array<uint32_t, 2> const c3 = {{ 0x0CC6, 0x0CC2 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0CCA }};
          std::array<uint32_t, 2> const c5 = {{ 0x0CC6, 0x0CC2 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_120)
  {
      // 0CCB;0CCB;0CC6 0CC2 0CD5;0CCB;0CC6 0CC2 0CD5; 
      // (ೋ; ೋ; ◌ೋ; ೋ; ◌ೋ; ) KANNADA VOWEL SIGN OO
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0CCB }};
          std::array<uint32_t, 1> const c2 = {{ 0x0CCB }};
          std::array<uint32_t, 3> const c3 = {{ 0x0CC6, 0x0CC2, 0x0CD5 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0CCB }};
          std::array<uint32_t, 3> const c5 = {{ 0x0CC6, 0x0CC2, 0x0CD5 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_121)
  {
      // 0D4A;0D4A;0D46 0D3E;0D4A;0D46 0D3E; 
      // (ൊ; ൊ; ൊ; ൊ; ൊ; ) MALAYALAM VOWEL SIGN O
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0D4A }};
          std::array<uint32_t, 1> const c2 = {{ 0x0D4A }};
          std::array<uint32_t, 2> const c3 = {{ 0x0D46, 0x0D3E }};
          std::array<uint32_t, 1> const c4 = {{ 0x0D4A }};
          std::array<uint32_t, 2> const c5 = {{ 0x0D46, 0x0D3E }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_122)
  {
      // 0D4B;0D4B;0D47 0D3E;0D4B;0D47 0D3E; 
      // (ോ; ോ; ോ; ോ; ോ; ) MALAYALAM VOWEL SIGN OO
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0D4B }};
          std::array<uint32_t, 1> const c2 = {{ 0x0D4B }};
          std::array<uint32_t, 2> const c3 = {{ 0x0D47, 0x0D3E }};
          std::array<uint32_t, 1> const c4 = {{ 0x0D4B }};
          std::array<uint32_t, 2> const c5 = {{ 0x0D47, 0x0D3E }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_123)
  {
      // 0D4C;0D4C;0D46 0D57;0D4C;0D46 0D57; 
      // (ൌ; ൌ; ൌ; ൌ; ൌ; ) MALAYALAM VOWEL SIGN AU
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0D4C }};
          std::array<uint32_t, 1> const c2 = {{ 0x0D4C }};
          std::array<uint32_t, 2> const c3 = {{ 0x0D46, 0x0D57 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0D4C }};
          std::array<uint32_t, 2> const c5 = {{ 0x0D46, 0x0D57 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_124)
  {
      // 0DDA;0DDA;0DD9 0DCA;0DDA;0DD9 0DCA; 
      // (ේ; ේ; ෙ◌්; ේ; ෙ◌්; ) SINHALA VOWEL SIGN DIGA KOMBUVA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0DDA }};
          std::array<uint32_t, 1> const c2 = {{ 0x0DDA }};
          std::array<uint32_t, 2> const c3 = {{ 0x0DD9, 0x0DCA }};
          std::array<uint32_t, 1> const c4 = {{ 0x0DDA }};
          std::array<uint32_t, 2> const c5 = {{ 0x0DD9, 0x0DCA }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_125)
  {
      // 0DDC;0DDC;0DD9 0DCF;0DDC;0DD9 0DCF; 
      // (ො; ො; ො; ො; ො; ) SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0DDC }};
          std::array<uint32_t, 1> const c2 = {{ 0x0DDC }};
          std::array<uint32_t, 2> const c3 = {{ 0x0DD9, 0x0DCF }};
          std::array<uint32_t, 1> const c4 = {{ 0x0DDC }};
          std::array<uint32_t, 2> const c5 = {{ 0x0DD9, 0x0DCF }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_126)
  {
      // 0DDD;0DDD;0DD9 0DCF 0DCA;0DDD;0DD9 0DCF 0DCA; 
      // (ෝ; ෝ; ො◌්; ෝ; ො◌්; ) SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0DDD }};
          std::array<uint32_t, 1> const c2 = {{ 0x0DDD }};
          std::array<uint32_t, 3> const c3 = {{ 0x0DD9, 0x0DCF, 0x0DCA }};
          std::array<uint32_t, 1> const c4 = {{ 0x0DDD }};
          std::array<uint32_t, 3> const c5 = {{ 0x0DD9, 0x0DCF, 0x0DCA }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_127)
  {
      // 0DDE;0DDE;0DD9 0DDF;0DDE;0DD9 0DDF; 
      // (ෞ; ෞ; ෞ; ෞ; ෞ; ) SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0DDE }};
          std::array<uint32_t, 1> const c2 = {{ 0x0DDE }};
          std::array<uint32_t, 2> const c3 = {{ 0x0DD9, 0x0DDF }};
          std::array<uint32_t, 1> const c4 = {{ 0x0DDE }};
          std::array<uint32_t, 2> const c5 = {{ 0x0DD9, 0x0DDF }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_128)
  {
      // 0E33;0E33;0E33;0E4D 0E32;0E4D 0E32; 
      // (ำ; ำ; ำ; ◌ํา; ◌ํา; ) THAI CHARACTER SARA AM
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0E33 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0E33 }};
          std::array<uint32_t, 1> const c3 = {{ 0x0E33 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0E4D, 0x0E32 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0E4D, 0x0E32 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_129)
  {
      // 0EB3;0EB3;0EB3;0ECD 0EB2;0ECD 0EB2; 
      // (ຳ; ຳ; ຳ; ◌ໍາ; ◌ໍາ; ) LAO VOWEL SIGN AM
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0EB3 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0EB3 }};
          std::array<uint32_t, 1> const c3 = {{ 0x0EB3 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0ECD, 0x0EB2 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0ECD, 0x0EB2 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_130)
  {
      // 0EDC;0EDC;0EDC;0EAB 0E99;0EAB 0E99; 
      // (ໜ; ໜ; ໜ; ຫນ; ຫນ; ) LAO HO NO
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0EDC }};
          std::array<uint32_t, 1> const c2 = {{ 0x0EDC }};
          std::array<uint32_t, 1> const c3 = {{ 0x0EDC }};
          std::array<uint32_t, 2> const c4 = {{ 0x0EAB, 0x0E99 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0EAB, 0x0E99 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_131)
  {
      // 0EDD;0EDD;0EDD;0EAB 0EA1;0EAB 0EA1; 
      // (ໝ; ໝ; ໝ; ຫມ; ຫມ; ) LAO HO MO
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0EDD }};
          std::array<uint32_t, 1> const c2 = {{ 0x0EDD }};
          std::array<uint32_t, 1> const c3 = {{ 0x0EDD }};
          std::array<uint32_t, 2> const c4 = {{ 0x0EAB, 0x0EA1 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0EAB, 0x0EA1 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_132)
  {
      // 0F0C;0F0C;0F0C;0F0B;0F0B; 
      // (༌; ༌; ༌; ་; ་; ) TIBETAN MARK DELIMITER TSHEG BSTAR
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0F0C }};
          std::array<uint32_t, 1> const c2 = {{ 0x0F0C }};
          std::array<uint32_t, 1> const c3 = {{ 0x0F0C }};
          std::array<uint32_t, 1> const c4 = {{ 0x0F0B }};
          std::array<uint32_t, 1> const c5 = {{ 0x0F0B }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_133)
  {
      // 0F43;0F42 0FB7;0F42 0FB7;0F42 0FB7;0F42 0FB7; 
      // (གྷ; ག◌ྷ; ག◌ྷ; ག◌ྷ; ག◌ྷ; ) TIBETAN LETTER GHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0F43 }};
          std::array<uint32_t, 2> const c2 = {{ 0x0F42, 0x0FB7 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0F42, 0x0FB7 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0F42, 0x0FB7 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0F42, 0x0FB7 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_134)
  {
      // 0F4D;0F4C 0FB7;0F4C 0FB7;0F4C 0FB7;0F4C 0FB7; 
      // (ཌྷ; ཌ◌ྷ; ཌ◌ྷ; ཌ◌ྷ; ཌ◌ྷ; ) TIBETAN LETTER DDHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0F4D }};
          std::array<uint32_t, 2> const c2 = {{ 0x0F4C, 0x0FB7 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0F4C, 0x0FB7 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0F4C, 0x0FB7 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0F4C, 0x0FB7 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_135)
  {
      // 0F52;0F51 0FB7;0F51 0FB7;0F51 0FB7;0F51 0FB7; 
      // (དྷ; ད◌ྷ; ད◌ྷ; ད◌ྷ; ད◌ྷ; ) TIBETAN LETTER DHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0F52 }};
          std::array<uint32_t, 2> const c2 = {{ 0x0F51, 0x0FB7 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0F51, 0x0FB7 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0F51, 0x0FB7 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0F51, 0x0FB7 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_136)
  {
      // 0F57;0F56 0FB7;0F56 0FB7;0F56 0FB7;0F56 0FB7; 
      // (བྷ; བ◌ྷ; བ◌ྷ; བ◌ྷ; བ◌ྷ; ) TIBETAN LETTER BHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0F57 }};
          std::array<uint32_t, 2> const c2 = {{ 0x0F56, 0x0FB7 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0F56, 0x0FB7 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0F56, 0x0FB7 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0F56, 0x0FB7 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_137)
  {
      // 0F5C;0F5B 0FB7;0F5B 0FB7;0F5B 0FB7;0F5B 0FB7; 
      // (ཛྷ; ཛ◌ྷ; ཛ◌ྷ; ཛ◌ྷ; ཛ◌ྷ; ) TIBETAN LETTER DZHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0F5C }};
          std::array<uint32_t, 2> const c2 = {{ 0x0F5B, 0x0FB7 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0F5B, 0x0FB7 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0F5B, 0x0FB7 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0F5B, 0x0FB7 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_138)
  {
      // 0F69;0F40 0FB5;0F40 0FB5;0F40 0FB5;0F40 0FB5; 
      // (ཀྵ; ཀ◌ྵ; ཀ◌ྵ; ཀ◌ྵ; ཀ◌ྵ; ) TIBETAN LETTER KSSA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0F69 }};
          std::array<uint32_t, 2> const c2 = {{ 0x0F40, 0x0FB5 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0F40, 0x0FB5 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0F40, 0x0FB5 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0F40, 0x0FB5 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_139)
  {
      // 0F73;0F71 0F72;0F71 0F72;0F71 0F72;0F71 0F72; 
      // (◌ཱི; ◌ཱ◌ི; ◌ཱ◌ི; ◌ཱ◌ི; ◌ཱ◌ི; ) TIBETAN VOWEL SIGN II
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0F73 }};
          std::array<uint32_t, 2> const c2 = {{ 0x0F71, 0x0F72 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0F71, 0x0F72 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0F71, 0x0F72 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0F71, 0x0F72 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_140)
  {
      // 0F75;0F71 0F74;0F71 0F74;0F71 0F74;0F71 0F74; 
      // (◌ཱུ; ◌ཱ◌ུ; ◌ཱ◌ུ; ◌ཱ◌ུ; ◌ཱ◌ུ; ) TIBETAN VOWEL SIGN UU
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0F75 }};
          std::array<uint32_t, 2> const c2 = {{ 0x0F71, 0x0F74 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0F71, 0x0F74 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0F71, 0x0F74 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0F71, 0x0F74 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_141)
  {
      // 0F76;0FB2 0F80;0FB2 0F80;0FB2 0F80;0FB2 0F80; 
      // (◌ྲྀ; ◌ྲ◌ྀ; ◌ྲ◌ྀ; ◌ྲ◌ྀ; ◌ྲ◌ྀ; ) TIBETAN VOWEL SIGN VOCALIC R
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0F76 }};
          std::array<uint32_t, 2> const c2 = {{ 0x0FB2, 0x0F80 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0FB2, 0x0F80 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0FB2, 0x0F80 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0FB2, 0x0F80 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_142)
  {
      // 0F77;0F77;0F77;0FB2 0F71 0F80;0FB2 0F71 0F80; 
      // (◌ཷ; ◌ཷ; ◌ཷ; ◌ྲ◌ཱ◌ྀ; ◌ྲ◌ཱ◌ྀ; ) TIBETAN VOWEL SIGN VOCALIC RR
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0F77 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0F77 }};
          std::array<uint32_t, 1> const c3 = {{ 0x0F77 }};
          std::array<uint32_t, 3> const c4 = {{ 0x0FB2, 0x0F71, 0x0F80 }};
          std::array<uint32_t, 3> const c5 = {{ 0x0FB2, 0x0F71, 0x0F80 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_143)
  {
      // 0F78;0FB3 0F80;0FB3 0F80;0FB3 0F80;0FB3 0F80; 
      // (◌ླྀ; ◌ླ◌ྀ; ◌ླ◌ྀ; ◌ླ◌ྀ; ◌ླ◌ྀ; ) TIBETAN VOWEL SIGN VOCALIC L
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0F78 }};
          std::array<uint32_t, 2> const c2 = {{ 0x0FB3, 0x0F80 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0FB3, 0x0F80 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0FB3, 0x0F80 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0FB3, 0x0F80 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_144)
  {
      // 0F79;0F79;0F79;0FB3 0F71 0F80;0FB3 0F71 0F80; 
      // (◌ཹ; ◌ཹ; ◌ཹ; ◌ླ◌ཱ◌ྀ; ◌ླ◌ཱ◌ྀ; ) TIBETAN VOWEL SIGN VOCALIC LL
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0F79 }};
          std::array<uint32_t, 1> const c2 = {{ 0x0F79 }};
          std::array<uint32_t, 1> const c3 = {{ 0x0F79 }};
          std::array<uint32_t, 3> const c4 = {{ 0x0FB3, 0x0F71, 0x0F80 }};
          std::array<uint32_t, 3> const c5 = {{ 0x0FB3, 0x0F71, 0x0F80 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_145)
  {
      // 0F81;0F71 0F80;0F71 0F80;0F71 0F80;0F71 0F80; 
      // (◌ཱྀ; ◌ཱ◌ྀ; ◌ཱ◌ྀ; ◌ཱ◌ྀ; ◌ཱ◌ྀ; ) TIBETAN VOWEL SIGN REVERSED II
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0F81 }};
          std::array<uint32_t, 2> const c2 = {{ 0x0F71, 0x0F80 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0F71, 0x0F80 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0F71, 0x0F80 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0F71, 0x0F80 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_146)
  {
      // 0F93;0F92 0FB7;0F92 0FB7;0F92 0FB7;0F92 0FB7; 
      // (◌ྒྷ; ◌ྒ◌ྷ; ◌ྒ◌ྷ; ◌ྒ◌ྷ; ◌ྒ◌ྷ; ) TIBETAN SUBJOINED LETTER GHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0F93 }};
          std::array<uint32_t, 2> const c2 = {{ 0x0F92, 0x0FB7 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0F92, 0x0FB7 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0F92, 0x0FB7 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0F92, 0x0FB7 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_147)
  {
      // 0F9D;0F9C 0FB7;0F9C 0FB7;0F9C 0FB7;0F9C 0FB7; 
      // (◌ྜྷ; ◌ྜ◌ྷ; ◌ྜ◌ྷ; ◌ྜ◌ྷ; ◌ྜ◌ྷ; ) TIBETAN SUBJOINED LETTER DDHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0F9D }};
          std::array<uint32_t, 2> const c2 = {{ 0x0F9C, 0x0FB7 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0F9C, 0x0FB7 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0F9C, 0x0FB7 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0F9C, 0x0FB7 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_148)
  {
      // 0FA2;0FA1 0FB7;0FA1 0FB7;0FA1 0FB7;0FA1 0FB7; 
      // (◌ྡྷ; ◌ྡ◌ྷ; ◌ྡ◌ྷ; ◌ྡ◌ྷ; ◌ྡ◌ྷ; ) TIBETAN SUBJOINED LETTER DHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0FA2 }};
          std::array<uint32_t, 2> const c2 = {{ 0x0FA1, 0x0FB7 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0FA1, 0x0FB7 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0FA1, 0x0FB7 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0FA1, 0x0FB7 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_149)
  {
      // 0FA7;0FA6 0FB7;0FA6 0FB7;0FA6 0FB7;0FA6 0FB7; 
      // (◌ྦྷ; ◌ྦ◌ྷ; ◌ྦ◌ྷ; ◌ྦ◌ྷ; ◌ྦ◌ྷ; ) TIBETAN SUBJOINED LETTER BHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0FA7 }};
          std::array<uint32_t, 2> const c2 = {{ 0x0FA6, 0x0FB7 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0FA6, 0x0FB7 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0FA6, 0x0FB7 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0FA6, 0x0FB7 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_150)
  {
      // 0FAC;0FAB 0FB7;0FAB 0FB7;0FAB 0FB7;0FAB 0FB7; 
      // (◌ྫྷ; ◌ྫ◌ྷ; ◌ྫ◌ྷ; ◌ྫ◌ྷ; ◌ྫ◌ྷ; ) TIBETAN SUBJOINED LETTER DZHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0FAC }};
          std::array<uint32_t, 2> const c2 = {{ 0x0FAB, 0x0FB7 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0FAB, 0x0FB7 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0FAB, 0x0FB7 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0FAB, 0x0FB7 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_151)
  {
      // 0FB9;0F90 0FB5;0F90 0FB5;0F90 0FB5;0F90 0FB5; 
      // (◌ྐྵ; ◌ྐ◌ྵ; ◌ྐ◌ྵ; ◌ྐ◌ྵ; ◌ྐ◌ྵ; ) TIBETAN SUBJOINED LETTER KSSA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x0FB9 }};
          std::array<uint32_t, 2> const c2 = {{ 0x0F90, 0x0FB5 }};
          std::array<uint32_t, 2> const c3 = {{ 0x0F90, 0x0FB5 }};
          std::array<uint32_t, 2> const c4 = {{ 0x0F90, 0x0FB5 }};
          std::array<uint32_t, 2> const c5 = {{ 0x0F90, 0x0FB5 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_152)
  {
      // 1026;1026;1025 102E;1026;1025 102E; 
      // (ဦ; ဦ; ဥ◌ီ; ဦ; ဥ◌ီ; ) MYANMAR LETTER UU
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1026 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1026 }};
          std::array<uint32_t, 2> const c3 = {{ 0x1025, 0x102E }};
          std::array<uint32_t, 1> const c4 = {{ 0x1026 }};
          std::array<uint32_t, 2> const c5 = {{ 0x1025, 0x102E }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_153)
  {
      // 10FC;10FC;10FC;10DC;10DC; 
      // (ჼ; ჼ; ჼ; ნ; ნ; ) MODIFIER LETTER GEORGIAN NAR
      {
          std::array<uint32_t, 1> const c1 = {{ 0x10FC }};
          std::array<uint32_t, 1> const c2 = {{ 0x10FC }};
          std::array<uint32_t, 1> const c3 = {{ 0x10FC }};
          std::array<uint32_t, 1> const c4 = {{ 0x10DC }};
          std::array<uint32_t, 1> const c5 = {{ 0x10DC }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_154)
  {
      // 1B06;1B06;1B05 1B35;1B06;1B05 1B35; 
      // (ᬆ; ᬆ; ᬆ; ᬆ; ᬆ; ) BALINESE LETTER AKARA TEDUNG
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1B06 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1B06 }};
          std::array<uint32_t, 2> const c3 = {{ 0x1B05, 0x1B35 }};
          std::array<uint32_t, 1> const c4 = {{ 0x1B06 }};
          std::array<uint32_t, 2> const c5 = {{ 0x1B05, 0x1B35 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_155)
  {
      // 1B08;1B08;1B07 1B35;1B08;1B07 1B35; 
      // (ᬈ; ᬈ; ᬈ; ᬈ; ᬈ; ) BALINESE LETTER IKARA TEDUNG
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1B08 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1B08 }};
          std::array<uint32_t, 2> const c3 = {{ 0x1B07, 0x1B35 }};
          std::array<uint32_t, 1> const c4 = {{ 0x1B08 }};
          std::array<uint32_t, 2> const c5 = {{ 0x1B07, 0x1B35 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_156)
  {
      // 1B0A;1B0A;1B09 1B35;1B0A;1B09 1B35; 
      // (ᬊ; ᬊ; ᬊ; ᬊ; ᬊ; ) BALINESE LETTER UKARA TEDUNG
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1B0A }};
          std::array<uint32_t, 1> const c2 = {{ 0x1B0A }};
          std::array<uint32_t, 2> const c3 = {{ 0x1B09, 0x1B35 }};
          std::array<uint32_t, 1> const c4 = {{ 0x1B0A }};
          std::array<uint32_t, 2> const c5 = {{ 0x1B09, 0x1B35 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_157)
  {
      // 1B0C;1B0C;1B0B 1B35;1B0C;1B0B 1B35; 
      // (ᬌ; ᬌ; ᬌ; ᬌ; ᬌ; ) BALINESE LETTER RA REPA TEDUNG
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1B0C }};
          std::array<uint32_t, 1> const c2 = {{ 0x1B0C }};
          std::array<uint32_t, 2> const c3 = {{ 0x1B0B, 0x1B35 }};
          std::array<uint32_t, 1> const c4 = {{ 0x1B0C }};
          std::array<uint32_t, 2> const c5 = {{ 0x1B0B, 0x1B35 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_158)
  {
      // 1B0E;1B0E;1B0D 1B35;1B0E;1B0D 1B35; 
      // (ᬎ; ᬎ; ᬎ; ᬎ; ᬎ; ) BALINESE LETTER LA LENGA TEDUNG
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1B0E }};
          std::array<uint32_t, 1> const c2 = {{ 0x1B0E }};
          std::array<uint32_t, 2> const c3 = {{ 0x1B0D, 0x1B35 }};
          std::array<uint32_t, 1> const c4 = {{ 0x1B0E }};
          std::array<uint32_t, 2> const c5 = {{ 0x1B0D, 0x1B35 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_159)
  {
      // 1B12;1B12;1B11 1B35;1B12;1B11 1B35; 
      // (ᬒ; ᬒ; ᬒ; ᬒ; ᬒ; ) BALINESE LETTER OKARA TEDUNG
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1B12 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1B12 }};
          std::array<uint32_t, 2> const c3 = {{ 0x1B11, 0x1B35 }};
          std::array<uint32_t, 1> const c4 = {{ 0x1B12 }};
          std::array<uint32_t, 2> const c5 = {{ 0x1B11, 0x1B35 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_160)
  {
      // 1B3B;1B3B;1B3A 1B35;1B3B;1B3A 1B35; 
      // (ᬻ; ᬻ; ◌ᬻ; ᬻ; ◌ᬻ; ) BALINESE VOWEL SIGN RA REPA TEDUNG
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1B3B }};
          std::array<uint32_t, 1> const c2 = {{ 0x1B3B }};
          std::array<uint32_t, 2> const c3 = {{ 0x1B3A, 0x1B35 }};
          std::array<uint32_t, 1> const c4 = {{ 0x1B3B }};
          std::array<uint32_t, 2> const c5 = {{ 0x1B3A, 0x1B35 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_161)
  {
      // 1B3D;1B3D;1B3C 1B35;1B3D;1B3C 1B35; 
      // (ᬽ; ᬽ; ◌ᬽ; ᬽ; ◌ᬽ; ) BALINESE VOWEL SIGN LA LENGA TEDUNG
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1B3D }};
          std::array<uint32_t, 1> const c2 = {{ 0x1B3D }};
          std::array<uint32_t, 2> const c3 = {{ 0x1B3C, 0x1B35 }};
          std::array<uint32_t, 1> const c4 = {{ 0x1B3D }};
          std::array<uint32_t, 2> const c5 = {{ 0x1B3C, 0x1B35 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_162)
  {
      // 1B40;1B40;1B3E 1B35;1B40;1B3E 1B35; 
      // (ᭀ; ᭀ; ᭀ; ᭀ; ᭀ; ) BALINESE VOWEL SIGN TALING TEDUNG
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1B40 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1B40 }};
          std::array<uint32_t, 2> const c3 = {{ 0x1B3E, 0x1B35 }};
          std::array<uint32_t, 1> const c4 = {{ 0x1B40 }};
          std::array<uint32_t, 2> const c5 = {{ 0x1B3E, 0x1B35 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_163)
  {
      // 1B41;1B41;1B3F 1B35;1B41;1B3F 1B35; 
      // (ᭁ; ᭁ; ᭁ; ᭁ; ᭁ; ) BALINESE VOWEL SIGN TALING REPA TEDUNG
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1B41 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1B41 }};
          std::array<uint32_t, 2> const c3 = {{ 0x1B3F, 0x1B35 }};
          std::array<uint32_t, 1> const c4 = {{ 0x1B41 }};
          std::array<uint32_t, 2> const c5 = {{ 0x1B3F, 0x1B35 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_164)
  {
      // 1B43;1B43;1B42 1B35;1B43;1B42 1B35; 
      // (ᭃ; ᭃ; ◌ᭃ; ᭃ; ◌ᭃ; ) BALINESE VOWEL SIGN PEPET TEDUNG
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1B43 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1B43 }};
          std::array<uint32_t, 2> const c3 = {{ 0x1B42, 0x1B35 }};
          std::array<uint32_t, 1> const c4 = {{ 0x1B43 }};
          std::array<uint32_t, 2> const c5 = {{ 0x1B42, 0x1B35 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfd(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_165)
  {
      // 1D2C;1D2C;1D2C;0041;0041; 
      // (ᴬ; ᴬ; ᴬ; A; A; ) MODIFIER LETTER CAPITAL A
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D2C }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D2C }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D2C }};
          std::array<uint32_t, 1> const c4 = {{ 0x0041 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0041 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_166)
  {
      // 1D2D;1D2D;1D2D;00C6;00C6; 
      // (ᴭ; ᴭ; ᴭ; Æ; Æ; ) MODIFIER LETTER CAPITAL AE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D2D }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D2D }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D2D }};
          std::array<uint32_t, 1> const c4 = {{ 0x00C6 }};
          std::array<uint32_t, 1> const c5 = {{ 0x00C6 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_167)
  {
      // 1D2E;1D2E;1D2E;0042;0042; 
      // (ᴮ; ᴮ; ᴮ; B; B; ) MODIFIER LETTER CAPITAL B
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D2E }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D2E }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D2E }};
          std::array<uint32_t, 1> const c4 = {{ 0x0042 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0042 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_168)
  {
      // 1D30;1D30;1D30;0044;0044; 
      // (ᴰ; ᴰ; ᴰ; D; D; ) MODIFIER LETTER CAPITAL D
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D30 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D30 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D30 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0044 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0044 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_169)
  {
      // 1D31;1D31;1D31;0045;0045; 
      // (ᴱ; ᴱ; ᴱ; E; E; ) MODIFIER LETTER CAPITAL E
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D31 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D31 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D31 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0045 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0045 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_170)
  {
      // 1D32;1D32;1D32;018E;018E; 
      // (ᴲ; ᴲ; ᴲ; Ǝ; Ǝ; ) MODIFIER LETTER CAPITAL REVERSED E
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D32 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D32 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D32 }};
          std::array<uint32_t, 1> const c4 = {{ 0x018E }};
          std::array<uint32_t, 1> const c5 = {{ 0x018E }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_171)
  {
      // 1D33;1D33;1D33;0047;0047; 
      // (ᴳ; ᴳ; ᴳ; G; G; ) MODIFIER LETTER CAPITAL G
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D33 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D33 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D33 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0047 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0047 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_172)
  {
      // 1D34;1D34;1D34;0048;0048; 
      // (ᴴ; ᴴ; ᴴ; H; H; ) MODIFIER LETTER CAPITAL H
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D34 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D34 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D34 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0048 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0048 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_173)
  {
      // 1D35;1D35;1D35;0049;0049; 
      // (ᴵ; ᴵ; ᴵ; I; I; ) MODIFIER LETTER CAPITAL I
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D35 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D35 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D35 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0049 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0049 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_174)
  {
      // 1D36;1D36;1D36;004A;004A; 
      // (ᴶ; ᴶ; ᴶ; J; J; ) MODIFIER LETTER CAPITAL J
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D36 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D36 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D36 }};
          std::array<uint32_t, 1> const c4 = {{ 0x004A }};
          std::array<uint32_t, 1> const c5 = {{ 0x004A }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_175)
  {
      // 1D37;1D37;1D37;004B;004B; 
      // (ᴷ; ᴷ; ᴷ; K; K; ) MODIFIER LETTER CAPITAL K
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D37 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D37 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D37 }};
          std::array<uint32_t, 1> const c4 = {{ 0x004B }};
          std::array<uint32_t, 1> const c5 = {{ 0x004B }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_176)
  {
      // 1D38;1D38;1D38;004C;004C; 
      // (ᴸ; ᴸ; ᴸ; L; L; ) MODIFIER LETTER CAPITAL L
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D38 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D38 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D38 }};
          std::array<uint32_t, 1> const c4 = {{ 0x004C }};
          std::array<uint32_t, 1> const c5 = {{ 0x004C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_177)
  {
      // 1D39;1D39;1D39;004D;004D; 
      // (ᴹ; ᴹ; ᴹ; M; M; ) MODIFIER LETTER CAPITAL M
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D39 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D39 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D39 }};
          std::array<uint32_t, 1> const c4 = {{ 0x004D }};
          std::array<uint32_t, 1> const c5 = {{ 0x004D }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_178)
  {
      // 1D3A;1D3A;1D3A;004E;004E; 
      // (ᴺ; ᴺ; ᴺ; N; N; ) MODIFIER LETTER CAPITAL N
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D3A }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D3A }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D3A }};
          std::array<uint32_t, 1> const c4 = {{ 0x004E }};
          std::array<uint32_t, 1> const c5 = {{ 0x004E }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_179)
  {
      // 1D3C;1D3C;1D3C;004F;004F; 
      // (ᴼ; ᴼ; ᴼ; O; O; ) MODIFIER LETTER CAPITAL O
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D3C }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D3C }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D3C }};
          std::array<uint32_t, 1> const c4 = {{ 0x004F }};
          std::array<uint32_t, 1> const c5 = {{ 0x004F }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_180)
  {
      // 1D3D;1D3D;1D3D;0222;0222; 
      // (ᴽ; ᴽ; ᴽ; Ȣ; Ȣ; ) MODIFIER LETTER CAPITAL OU
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D3D }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D3D }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D3D }};
          std::array<uint32_t, 1> const c4 = {{ 0x0222 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0222 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_181)
  {
      // 1D3E;1D3E;1D3E;0050;0050; 
      // (ᴾ; ᴾ; ᴾ; P; P; ) MODIFIER LETTER CAPITAL P
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D3E }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D3E }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D3E }};
          std::array<uint32_t, 1> const c4 = {{ 0x0050 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0050 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_182)
  {
      // 1D3F;1D3F;1D3F;0052;0052; 
      // (ᴿ; ᴿ; ᴿ; R; R; ) MODIFIER LETTER CAPITAL R
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D3F }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D3F }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D3F }};
          std::array<uint32_t, 1> const c4 = {{ 0x0052 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0052 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_183)
  {
      // 1D40;1D40;1D40;0054;0054; 
      // (ᵀ; ᵀ; ᵀ; T; T; ) MODIFIER LETTER CAPITAL T
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D40 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D40 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D40 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0054 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0054 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_184)
  {
      // 1D41;1D41;1D41;0055;0055; 
      // (ᵁ; ᵁ; ᵁ; U; U; ) MODIFIER LETTER CAPITAL U
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D41 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D41 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D41 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0055 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0055 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_185)
  {
      // 1D42;1D42;1D42;0057;0057; 
      // (ᵂ; ᵂ; ᵂ; W; W; ) MODIFIER LETTER CAPITAL W
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D42 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D42 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D42 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0057 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0057 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_186)
  {
      // 1D43;1D43;1D43;0061;0061; 
      // (ᵃ; ᵃ; ᵃ; a; a; ) MODIFIER LETTER SMALL A
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D43 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D43 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D43 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0061 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0061 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_187)
  {
      // 1D44;1D44;1D44;0250;0250; 
      // (ᵄ; ᵄ; ᵄ; ɐ; ɐ; ) MODIFIER LETTER SMALL TURNED A
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D44 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D44 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D44 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0250 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0250 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_188)
  {
      // 1D45;1D45;1D45;0251;0251; 
      // (ᵅ; ᵅ; ᵅ; ɑ; ɑ; ) MODIFIER LETTER SMALL ALPHA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D45 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D45 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D45 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0251 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0251 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_189)
  {
      // 1D46;1D46;1D46;1D02;1D02; 
      // (ᵆ; ᵆ; ᵆ; ᴂ; ᴂ; ) MODIFIER LETTER SMALL TURNED AE
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D46 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D46 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D46 }};
          std::array<uint32_t, 1> const c4 = {{ 0x1D02 }};
          std::array<uint32_t, 1> const c5 = {{ 0x1D02 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_190)
  {
      // 1D47;1D47;1D47;0062;0062; 
      // (ᵇ; ᵇ; ᵇ; b; b; ) MODIFIER LETTER SMALL B
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D47 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D47 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D47 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0062 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0062 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_191)
  {
      // 1D48;1D48;1D48;0064;0064; 
      // (ᵈ; ᵈ; ᵈ; d; d; ) MODIFIER LETTER SMALL D
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D48 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D48 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D48 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0064 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0064 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_192)
  {
      // 1D49;1D49;1D49;0065;0065; 
      // (ᵉ; ᵉ; ᵉ; e; e; ) MODIFIER LETTER SMALL E
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D49 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D49 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D49 }};
          std::array<uint32_t, 1> const c4 = {{ 0x0065 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0065 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_193)
  {
      // 1D4A;1D4A;1D4A;0259;0259; 
      // (ᵊ; ᵊ; ᵊ; ə; ə; ) MODIFIER LETTER SMALL SCHWA
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D4A }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D4A }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D4A }};
          std::array<uint32_t, 1> const c4 = {{ 0x0259 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0259 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_194)
  {
      // 1D4B;1D4B;1D4B;025B;025B; 
      // (ᵋ; ᵋ; ᵋ; ɛ; ɛ; ) MODIFIER LETTER SMALL OPEN E
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D4B }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D4B }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D4B }};
          std::array<uint32_t, 1> const c4 = {{ 0x025B }};
          std::array<uint32_t, 1> const c5 = {{ 0x025B }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_195)
  {
      // 1D4C;1D4C;1D4C;025C;025C; 
      // (ᵌ; ᵌ; ᵌ; ɜ; ɜ; ) MODIFIER LETTER SMALL TURNED OPEN E
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D4C }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D4C }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D4C }};
          std::array<uint32_t, 1> const c4 = {{ 0x025C }};
          std::array<uint32_t, 1> const c5 = {{ 0x025C }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_196)
  {
      // 1D4D;1D4D;1D4D;0067;0067; 
      // (ᵍ; ᵍ; ᵍ; g; g; ) MODIFIER LETTER SMALL G
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D4D }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D4D }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D4D }};
          std::array<uint32_t, 1> const c4 = {{ 0x0067 }};
          std::array<uint32_t, 1> const c5 = {{ 0x0067 }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_197)
  {
      // 1D4F;1D4F;1D4F;006B;006B; 
      // (ᵏ; ᵏ; ᵏ; k; k; ) MODIFIER LETTER SMALL K
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D4F }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D4F }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D4F }};
          std::array<uint32_t, 1> const c4 = {{ 0x006B }};
          std::array<uint32_t, 1> const c5 = {{ 0x006B }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_198)
  {
      // 1D50;1D50;1D50;006D;006D; 
      // (ᵐ; ᵐ; ᵐ; m; m; ) MODIFIER LETTER SMALL M
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D50 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D50 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D50 }};
          std::array<uint32_t, 1> const c4 = {{ 0x006D }};
          std::array<uint32_t, 1> const c5 = {{ 0x006D }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  TEST(normalization, nfkd_002_199)
  {
      // 1D51;1D51;1D51;014B;014B; 
      // (ᵑ; ᵑ; ᵑ; ŋ; ŋ; ) MODIFIER LETTER SMALL ENG
      {
          std::array<uint32_t, 1> const c1 = {{ 0x1D51 }};
          std::array<uint32_t, 1> const c2 = {{ 0x1D51 }};
          std::array<uint32_t, 1> const c3 = {{ 0x1D51 }};
          std::array<uint32_t, 1> const c4 = {{ 0x014B }};
          std::array<uint32_t, 1> const c5 = {{ 0x014B }};
  
          EXPECT_TRUE(boost::text::normalized_nfc(c2.begin(), c2.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c2.begin(), c2.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfc(c3.begin(), c3.end()));
          EXPECT_TRUE(boost::text::normalized_nfd(c3.begin(), c3.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c4.begin(), c4.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c4.begin(), c4.end()));
  
          EXPECT_TRUE(boost::text::normalized_nfkc(c5.begin(), c5.end()));
          EXPECT_TRUE(boost::text::normalized_nfkd(c5.begin(), c5.end()));
  
  
  
          {
              boost::text::string str = boost::text::to_string(c1.begin(), c1.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c2.begin(), c2.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c3.begin(), c3.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c4.begin(), c4.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
          {
              boost::text::string str = boost::text::to_string(c5.begin(), c5.end());
              boost::text::normalize_to_nfkd(str);
              boost::text::utf32_range utf32_range(str);
              EXPECT_EQ(std::distance(utf32_range.begin(), utf32_range.end()), (std::ptrdiff_t)c5.size());
              auto c5_it = c5.begin();
              int i = 0;
              for (auto x : utf32_range) {
                  EXPECT_EQ(x, *c5_it) << "iteration " << i;
                  ++c5_it;
                  ++i;
              }
          }
  
      }
  }
  
  
  