Merge branch 'master' into master
diff --git a/c/common/constants.h b/c/common/constants.h
index 31e5bd3..637ad74 100644
--- a/c/common/constants.h
+++ b/c/common/constants.h
@@ -12,9 +12,6 @@
 #ifndef BROTLI_COMMON_CONSTANTS_H_
 #define BROTLI_COMMON_CONSTANTS_H_
 
-#include <brotli/port.h>
-#include <brotli/types.h>
-
 #include "platform.h"
 
 /* Specification: 7.3. Encoding of the context map */
diff --git a/c/common/context.c b/c/common/context.c
index 7f9c958..2a4cd68 100644
--- a/c/common/context.c
+++ b/c/common/context.c
@@ -1,6 +1,6 @@
 #include "context.h"
 
-#include <brotli/types.h>
+#include "platform.h"
 
 /* Common context lookup table for all context modes. */
 const uint8_t _kBrotliContextLookupTable[2048] = {
diff --git a/c/common/context.h b/c/common/context.h
index 685a279..45b57d8 100644
--- a/c/common/context.h
+++ b/c/common/context.h
@@ -88,8 +88,7 @@
 #ifndef BROTLI_COMMON_CONTEXT_H_
 #define BROTLI_COMMON_CONTEXT_H_
 
-#include <brotli/port.h>
-#include <brotli/types.h>
+#include "platform.h"
 
 typedef enum ContextType {
   CONTEXT_LSB6 = 0,
diff --git a/c/common/dictionary.h b/c/common/dictionary.h
index b1c6f7f..ed683b0 100644
--- a/c/common/dictionary.h
+++ b/c/common/dictionary.h
@@ -9,8 +9,7 @@
 #ifndef BROTLI_COMMON_DICTIONARY_H_
 #define BROTLI_COMMON_DICTIONARY_H_
 
-#include <brotli/port.h>
-#include <brotli/types.h>
+#include "platform.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
 extern "C" {
diff --git a/c/common/platform.c b/c/common/platform.c
index 25d84a9..1e047ce 100644
--- a/c/common/platform.c
+++ b/c/common/platform.c
@@ -4,10 +4,6 @@
    See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
 */
 
-#include <stdlib.h>
-
-#include <brotli/types.h>
-
 #include "platform.h"
 
 /* Default brotli_alloc_func */
diff --git a/c/common/platform.h b/c/common/platform.h
index 713119e..b238218 100644
--- a/c/common/platform.h
+++ b/c/common/platform.h
@@ -24,13 +24,13 @@
 #ifndef BROTLI_COMMON_PLATFORM_H_
 #define BROTLI_COMMON_PLATFORM_H_
 
-#include <string.h>  /* memcpy */
-
-#include <brotli/port.h>
-#include <brotli/types.h>
-
+#include <string.h>  /* IWYU pragma: export memcmp, memcpy, memset */
+#include <stdlib.h>  /* IWYU pragma: export exit, free, malloc */
 #include <sys/types.h>  /* should include endian.h for us */
 
+#include <brotli/port.h>  /* IWYU pragma: export */
+#include <brotli/types.h>  /* IWYU pragma: export */
+
 #if BROTLI_MSVC_VERSION_CHECK(18, 0, 0)
 #include <intrin.h>
 #endif
@@ -546,19 +546,36 @@
   BROTLI_UNUSED(&BrotliDump);
 #endif
 
-#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86)) && !defined(_M_ARM64EC)  /* _mm_prefetch() is not defined outside of x86/x64 */
-#  include <mmintrin.h>   /* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */
-#  define PREFETCH_L1(ptr)  _mm_prefetch((const char*)(ptr), _MM_HINT_T0)
-#  define PREFETCH_L2(ptr)  _mm_prefetch((const char*)(ptr), _MM_HINT_T1)
+#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86)) && \
+    !defined(_M_ARM64EC)
+/* _mm_prefetch() is not defined outside of x86/x64 */
+/* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */
+#include <mmintrin.h>
+#define PREFETCH_L1(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0)
+#define PREFETCH_L2(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T1)
 #elif BROTLI_GNUC_HAS_BUILTIN(__builtin_prefetch, 3, 1, 0)
-#  define PREFETCH_L1(ptr)  __builtin_prefetch((ptr), 0 /* rw==read */, 3 /* locality */)
-#  define PREFETCH_L2(ptr)  __builtin_prefetch((ptr), 0 /* rw==read */, 2 /* locality */)
+#define PREFETCH_L1(ptr) \
+  __builtin_prefetch((ptr), 0 /* rw==read */, 3 /* locality */)
+#define PREFETCH_L2(ptr) \
+  __builtin_prefetch((ptr), 0 /* rw==read */, 2 /* locality */)
 #elif defined(__aarch64__)
-#  define PREFETCH_L1(ptr)  do { __asm__ __volatile__("prfm pldl1keep, %0" ::"Q"(*(ptr))); } while (0)
-#  define PREFETCH_L2(ptr)  do { __asm__ __volatile__("prfm pldl2keep, %0" ::"Q"(*(ptr))); } while (0)
+#define PREFETCH_L1(ptr)                                      \
+  do {                                                        \
+    __asm__ __volatile__("prfm pldl1keep, %0" ::"Q"(*(ptr))); \
+  } while (0)
+#define PREFETCH_L2(ptr)                                      \
+  do {                                                        \
+    __asm__ __volatile__("prfm pldl2keep, %0" ::"Q"(*(ptr))); \
+  } while (0)
 #else
-#  define PREFETCH_L1(ptr) do { (void)(ptr); } while (0)  /* disabled */
-#  define PREFETCH_L2(ptr) do { (void)(ptr); } while (0)  /* disabled */
+#define PREFETCH_L1(ptr) \
+  do {                   \
+    (void)(ptr);         \
+  } while (0) /* disabled */
+#define PREFETCH_L2(ptr) \
+  do {                   \
+    (void)(ptr);         \
+  } while (0) /* disabled */
 #endif
 
 /* The SIMD matchers are only faster at certain quality levels. */
diff --git a/c/common/shared_dictionary.c b/c/common/shared_dictionary.c
index 49f1c9b..b8ebc68 100644
--- a/c/common/shared_dictionary.c
+++ b/c/common/shared_dictionary.c
@@ -8,10 +8,6 @@
 
 #include <brotli/shared_dictionary.h>
 
-#include <memory.h>
-#include <stdlib.h>  /* malloc, free */
-#include <stdio.h>
-
 #include "dictionary.h"
 #include "platform.h"
 #include "shared_dictionary_internal.h"
diff --git a/c/common/shared_dictionary_internal.h b/c/common/shared_dictionary_internal.h
index 963762e..c6a90fa 100644
--- a/c/common/shared_dictionary_internal.h
+++ b/c/common/shared_dictionary_internal.h
@@ -10,9 +10,9 @@
 #define BROTLI_COMMON_SHARED_DICTIONARY_INTERNAL_H_
 
 #include <brotli/shared_dictionary.h>
-#include <brotli/types.h>
 
 #include "dictionary.h"
+#include "platform.h"
 #include "transform.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/c/common/transform.h b/c/common/transform.h
index b6f86cc..c6176d8 100644
--- a/c/common/transform.h
+++ b/c/common/transform.h
@@ -8,8 +8,7 @@
 #ifndef BROTLI_COMMON_TRANSFORM_H_
 #define BROTLI_COMMON_TRANSFORM_H_
 
-#include <brotli/port.h>
-#include <brotli/types.h>
+#include "platform.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
 extern "C" {
diff --git a/c/dec/bit_reader.c b/c/dec/bit_reader.c
index 35101dd..d4ac6c5 100644
--- a/c/dec/bit_reader.c
+++ b/c/dec/bit_reader.c
@@ -8,8 +8,6 @@
 
 #include "bit_reader.h"
 
-#include <brotli/types.h>
-
 #include "../common/platform.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/c/dec/bit_reader.h b/c/dec/bit_reader.h
index 930dc60..ef6b047 100644
--- a/c/dec/bit_reader.h
+++ b/c/dec/bit_reader.h
@@ -9,10 +9,6 @@
 #ifndef BROTLI_DEC_BIT_READER_H_
 #define BROTLI_DEC_BIT_READER_H_
 
-#include <string.h>  /* memcpy */
-
-#include <brotli/types.h>
-
 #include "../common/constants.h"
 #include "../common/platform.h"
 
diff --git a/c/dec/decode.c b/c/dec/decode.c
index 70d594b..c53cbb8 100644
--- a/c/dec/decode.c
+++ b/c/dec/decode.c
@@ -6,9 +6,6 @@
 
 #include <brotli/decode.h>
 
-#include <stdlib.h>  /* free, malloc */
-#include <string.h>  /* memcpy, memset */
-
 #include "../common/constants.h"
 #include "../common/context.h"
 #include "../common/dictionary.h"
diff --git a/c/dec/huffman.c b/c/dec/huffman.c
index 3806454..5f084a1 100644
--- a/c/dec/huffman.c
+++ b/c/dec/huffman.c
@@ -8,10 +8,6 @@
 
 #include "huffman.h"
 
-#include <string.h>  /* memcpy, memset */
-
-#include <brotli/types.h>
-
 #include "../common/constants.h"
 #include "../common/platform.h"
 
diff --git a/c/dec/huffman.h b/c/dec/huffman.h
index 5036096..53daf60 100644
--- a/c/dec/huffman.h
+++ b/c/dec/huffman.h
@@ -9,8 +9,6 @@
 #ifndef BROTLI_DEC_HUFFMAN_H_
 #define BROTLI_DEC_HUFFMAN_H_
 
-#include <brotli/types.h>
-
 #include "../common/platform.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/c/dec/prefix.h b/c/dec/prefix.h
index e8acf07..78cb402 100644
--- a/c/dec/prefix.h
+++ b/c/dec/prefix.h
@@ -10,9 +10,8 @@
 #ifndef BROTLI_DEC_PREFIX_H_
 #define BROTLI_DEC_PREFIX_H_
 
-#include <brotli/types.h>
-
 #include "../common/constants.h"
+#include "../common/platform.h"
 
 typedef struct CmdLutElement {
   uint8_t insert_len_extra_bits;
diff --git a/c/dec/state.c b/c/dec/state.c
index 8b15459..dcf61b9 100644
--- a/c/dec/state.c
+++ b/c/dec/state.c
@@ -6,11 +6,8 @@
 
 #include "state.h"
 
-#include <stdlib.h>  /* free, malloc */
-
-#include <brotli/types.h>
-
 #include "../common/dictionary.h"
+#include "../common/platform.h"
 #include "huffman.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/c/dec/state.h b/c/dec/state.h
index fd250b6..caefef0 100644
--- a/c/dec/state.h
+++ b/c/dec/state.h
@@ -11,7 +11,6 @@
 
 #include <brotli/decode.h>
 #include <brotli/shared_dictionary.h>
-#include <brotli/types.h>
 
 #include "../common/constants.h"
 #include "../common/dictionary.h"
diff --git a/c/enc/backward_references.c b/c/enc/backward_references.c
index 94fd704..5d1c0ed 100644
--- a/c/enc/backward_references.c
+++ b/c/enc/backward_references.c
@@ -8,17 +8,15 @@
 
 #include "backward_references.h"
 
-#include <brotli/types.h>
-
 #include "../common/constants.h"
-#include "../common/dictionary.h"
+#include "../common/context.h"
 #include "../common/platform.h"
 #include "command.h"
 #include "compound_dictionary.h"
-#include "dictionary_hash.h"
 #include "encoder_dict.h"
-#include "memory.h"
-#include "quality.h"
+#include "hash.h"
+#include "params.h"
+#include "quality.h"  /* IWYU pragma: keep for inc */
 
 #if defined(__cplusplus) || defined(c_plusplus)
 extern "C" {
diff --git a/c/enc/backward_references.h b/c/enc/backward_references.h
index 20fb98a..17f0c84 100644
--- a/c/enc/backward_references.h
+++ b/c/enc/backward_references.h
@@ -9,15 +9,11 @@
 #ifndef BROTLI_ENC_BACKWARD_REFERENCES_H_
 #define BROTLI_ENC_BACKWARD_REFERENCES_H_
 
-#include <brotli/types.h>
-
-#include "../common/constants.h"
 #include "../common/context.h"
-#include "../common/dictionary.h"
 #include "../common/platform.h"
 #include "command.h"
 #include "hash.h"
-#include "quality.h"
+#include "params.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
 extern "C" {
diff --git a/c/enc/backward_references_hq.c b/c/enc/backward_references_hq.c
index f8b506e..02ccb88 100644
--- a/c/enc/backward_references_hq.c
+++ b/c/enc/backward_references_hq.c
@@ -8,17 +8,15 @@
 
 #include "backward_references_hq.h"
 
-#include <string.h>  /* memcpy, memset */
-
-#include <brotli/types.h>
-
 #include "../common/constants.h"
+#include "../common/context.h"
 #include "../common/platform.h"
 #include "command.h"
 #include "compound_dictionary.h"
 #include "encoder_dict.h"
 #include "fast_log.h"
 #include "find_match_length.h"
+#include "hash.h"
 #include "literal_cost.h"
 #include "memory.h"
 #include "params.h"
diff --git a/c/enc/backward_references_hq.h b/c/enc/backward_references_hq.h
index 8acf975..4aa2706 100644
--- a/c/enc/backward_references_hq.h
+++ b/c/enc/backward_references_hq.h
@@ -9,16 +9,12 @@
 #ifndef BROTLI_ENC_BACKWARD_REFERENCES_HQ_H_
 #define BROTLI_ENC_BACKWARD_REFERENCES_HQ_H_
 
-#include <brotli/types.h>
-
-#include "../common/constants.h"
 #include "../common/context.h"
-#include "../common/dictionary.h"
 #include "../common/platform.h"
 #include "command.h"
 #include "hash.h"
 #include "memory.h"
-#include "quality.h"
+#include "params.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
 extern "C" {
diff --git a/c/enc/bit_cost.c b/c/enc/bit_cost.c
index 6b7c904..e0ba2b0 100644
--- a/c/enc/bit_cost.c
+++ b/c/enc/bit_cost.c
@@ -8,12 +8,7 @@
 
 #include "bit_cost.h"
 
-#include <brotli/types.h>
-
-#include "../common/constants.h"
-#include "../common/platform.h"
-#include "fast_log.h"
-#include "histogram.h"
+// #include "../common/platform.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
 extern "C" {
diff --git a/c/enc/bit_cost.h b/c/enc/bit_cost.h
index f6f2773..230b533 100644
--- a/c/enc/bit_cost.h
+++ b/c/enc/bit_cost.h
@@ -9,8 +9,6 @@
 #ifndef BROTLI_ENC_BIT_COST_H_
 #define BROTLI_ENC_BIT_COST_H_
 
-#include <brotli/types.h>
-
 #include "../common/platform.h"
 #include "fast_log.h"
 #include "histogram.h"
diff --git a/c/enc/block_splitter.c b/c/enc/block_splitter.c
index 5a131f5..470fabb 100644
--- a/c/enc/block_splitter.c
+++ b/c/enc/block_splitter.c
@@ -8,8 +8,6 @@
 
 #include "block_splitter.h"
 
-#include <string.h>  /* memcpy, memset */
-
 #include "../common/platform.h"
 #include "bit_cost.h"
 #include "cluster.h"
diff --git a/c/enc/block_splitter.h b/c/enc/block_splitter.h
index 6046b90..c927794 100644
--- a/c/enc/block_splitter.h
+++ b/c/enc/block_splitter.h
@@ -9,12 +9,9 @@
 #ifndef BROTLI_ENC_BLOCK_SPLITTER_H_
 #define BROTLI_ENC_BLOCK_SPLITTER_H_
 
-#include <brotli/types.h>
-
 #include "../common/platform.h"
 #include "command.h"
 #include "memory.h"
-#include "quality.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
 extern "C" {
diff --git a/c/enc/brotli_bit_stream.c b/c/enc/brotli_bit_stream.c
index 5fa0c69..779c843 100644
--- a/c/enc/brotli_bit_stream.c
+++ b/c/enc/brotli_bit_stream.c
@@ -10,10 +10,6 @@
 
 #include "brotli_bit_stream.h"
 
-#include <string.h>  /* memcpy, memset */
-
-#include <brotli/types.h>
-
 #include "../common/constants.h"
 #include "../common/context.h"
 #include "../common/platform.h"
diff --git a/c/enc/brotli_bit_stream.h b/c/enc/brotli_bit_stream.h
index a289509..9ca493d 100644
--- a/c/enc/brotli_bit_stream.h
+++ b/c/enc/brotli_bit_stream.h
@@ -16,8 +16,6 @@
 #ifndef BROTLI_ENC_BROTLI_BIT_STREAM_H_
 #define BROTLI_ENC_BROTLI_BIT_STREAM_H_
 
-#include <brotli/types.h>
-
 #include "../common/context.h"
 #include "../common/platform.h"
 #include "command.h"
diff --git a/c/enc/cluster.c b/c/enc/cluster.c
index b0faf81..4bf94ab 100644
--- a/c/enc/cluster.c
+++ b/c/enc/cluster.c
@@ -8,8 +8,6 @@
 
 #include "cluster.h"
 
-#include <brotli/types.h>
-
 #include "../common/platform.h"
 #include "bit_cost.h"  /* BrotliPopulationCost */
 #include "fast_log.h"
diff --git a/c/enc/cluster.h b/c/enc/cluster.h
index 013629c..6519116 100644
--- a/c/enc/cluster.h
+++ b/c/enc/cluster.h
@@ -9,8 +9,6 @@
 #ifndef BROTLI_ENC_CLUSTER_H_
 #define BROTLI_ENC_CLUSTER_H_
 
-#include <brotli/types.h>
-
 #include "../common/platform.h"
 #include "histogram.h"
 #include "memory.h"
diff --git a/c/enc/command.c b/c/enc/command.c
index bf80561..699fa80 100644
--- a/c/enc/command.c
+++ b/c/enc/command.c
@@ -6,7 +6,7 @@
 
 #include "command.h"
 
-#include <brotli/types.h>
+#include "../common/platform.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
 extern "C" {
diff --git a/c/enc/command.h b/c/enc/command.h
index ba4de7e..ba58f14 100644
--- a/c/enc/command.h
+++ b/c/enc/command.h
@@ -9,8 +9,6 @@
 #ifndef BROTLI_ENC_COMMAND_H_
 #define BROTLI_ENC_COMMAND_H_
 
-#include <brotli/types.h>
-
 #include "../common/constants.h"
 #include "../common/platform.h"
 #include "fast_log.h"
diff --git a/c/enc/compound_dictionary.c b/c/enc/compound_dictionary.c
index 59ec864..6a79510 100644
--- a/c/enc/compound_dictionary.c
+++ b/c/enc/compound_dictionary.c
@@ -6,11 +6,10 @@
 
 #include "compound_dictionary.h"
 
-#include <brotli/types.h>
+#include <brotli/shared_dictionary.h>
 
 #include "../common/platform.h"
 #include "memory.h"
-#include "quality.h"
 
 static PreparedDictionary* CreatePreparedDictionaryWithParams(MemoryManager* m,
     const uint8_t* source, size_t source_size, uint32_t bucket_bits,
diff --git a/c/enc/compound_dictionary.h b/c/enc/compound_dictionary.h
index 9c531d5..6f5a13a 100644
--- a/c/enc/compound_dictionary.h
+++ b/c/enc/compound_dictionary.h
@@ -8,10 +8,8 @@
 #define BROTLI_ENC_PREPARED_DICTIONARY_H_
 
 #include <brotli/shared_dictionary.h>
-#include <brotli/types.h>
 
 #include "../common/platform.h"
-#include "../common/constants.h"
 #include "memory.h"
 
 /* "Fat" prepared dictionary, could be cooked outside of C implementation,
diff --git a/c/enc/compress_fragment.c b/c/enc/compress_fragment.c
index 13890ea..1d9ae99 100644
--- a/c/enc/compress_fragment.c
+++ b/c/enc/compress_fragment.c
@@ -14,15 +14,13 @@
 
 #include "compress_fragment.h"
 
-#include <string.h>  /* memcmp, memcpy, memset */
-
-#include <brotli/types.h>
-
+#include "../common/constants.h"
 #include "../common/platform.h"
 #include "brotli_bit_stream.h"
 #include "entropy_encode.h"
 #include "fast_log.h"
 #include "find_match_length.h"
+#include "hash_base.h"
 #include "write_bits.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
@@ -31,14 +29,6 @@
 
 #define MAX_DISTANCE (long)BROTLI_MAX_BACKWARD_LIMIT(18)
 
-/* kHashMul32 multiplier has these properties:
-   * The multiplier must be odd. Otherwise we may lose the highest bit.
-   * No long streaks of ones or zeros.
-   * There is no effort to ensure that it is a prime, the oddity is enough
-     for this use.
-   * The number has been tuned heuristically against compression benchmarks. */
-static const uint32_t kHashMul32 = 0x1E35A7BD;
-
 static BROTLI_INLINE uint32_t Hash(const uint8_t* p, size_t shift) {
   const uint64_t h = (BROTLI_UNALIGNED_LOAD64LE(p) << 24) * kHashMul32;
   return (uint32_t)(h >> shift);
diff --git a/c/enc/compress_fragment.h b/c/enc/compress_fragment.h
index 9c0780f..462f366 100644
--- a/c/enc/compress_fragment.h
+++ b/c/enc/compress_fragment.h
@@ -12,8 +12,6 @@
 #ifndef BROTLI_ENC_COMPRESS_FRAGMENT_H_
 #define BROTLI_ENC_COMPRESS_FRAGMENT_H_
 
-#include <brotli/types.h>
-
 #include "../common/constants.h"
 #include "../common/platform.h"
 #include "entropy_encode.h"
diff --git a/c/enc/compress_fragment_two_pass.c b/c/enc/compress_fragment_two_pass.c
index a762679..1b7d1b1 100644
--- a/c/enc/compress_fragment_two_pass.c
+++ b/c/enc/compress_fragment_two_pass.c
@@ -12,10 +12,6 @@
 
 #include "compress_fragment_two_pass.h"
 
-#include <string.h>  /* memcmp, memcpy, memset */
-
-#include <brotli/types.h>
-
 #include "../common/constants.h"
 #include "../common/platform.h"
 #include "bit_cost.h"
@@ -23,6 +19,7 @@
 #include "entropy_encode.h"
 #include "fast_log.h"
 #include "find_match_length.h"
+#include "hash_base.h"
 #include "write_bits.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
@@ -31,14 +28,6 @@
 
 #define MAX_DISTANCE (long)BROTLI_MAX_BACKWARD_LIMIT(18)
 
-/* kHashMul32 multiplier has these properties:
-   * The multiplier must be odd. Otherwise we may lose the highest bit.
-   * No long streaks of ones or zeros.
-   * There is no effort to ensure that it is a prime, the oddity is enough
-     for this use.
-   * The number has been tuned heuristically against compression benchmarks. */
-static const uint32_t kHashMul32 = 0x1E35A7BD;
-
 static BROTLI_INLINE uint32_t Hash(const uint8_t* p,
     size_t shift, size_t length) {
   const uint64_t h =
diff --git a/c/enc/compress_fragment_two_pass.h b/c/enc/compress_fragment_two_pass.h
index 6d28d9b..e98b5e0 100644
--- a/c/enc/compress_fragment_two_pass.h
+++ b/c/enc/compress_fragment_two_pass.h
@@ -13,8 +13,6 @@
 #ifndef BROTLI_ENC_COMPRESS_FRAGMENT_TWO_PASS_H_
 #define BROTLI_ENC_COMPRESS_FRAGMENT_TWO_PASS_H_
 
-#include <brotli/types.h>
-
 #include "../common/constants.h"
 #include "../common/platform.h"
 #include "entropy_encode.h"
diff --git a/c/enc/dictionary_hash.h b/c/enc/dictionary_hash.h
index e553ea5..bbfceed 100644
--- a/c/enc/dictionary_hash.h
+++ b/c/enc/dictionary_hash.h
@@ -9,7 +9,7 @@
 #ifndef BROTLI_ENC_DICTIONARY_HASH_H_
 #define BROTLI_ENC_DICTIONARY_HASH_H_
 
-#include <brotli/types.h>
+#include "../common/platform.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
 extern "C" {
diff --git a/c/enc/encode.c b/c/enc/encode.c
index fb2c0ce..9417d8f 100644
--- a/c/enc/encode.c
+++ b/c/enc/encode.c
@@ -8,33 +8,30 @@
 
 #include <brotli/encode.h>
 #include <brotli/shared_dictionary.h>
-#include <brotli/types.h>
-
-#include <stdlib.h>  /* free, malloc */
-#include <string.h>  /* memcpy, memset */
 
 #include "../common/constants.h"
 #include "../common/context.h"
 #include "../common/platform.h"
 #include "../common/version.h"
-#include "backward_references.h"
 #include "backward_references_hq.h"
+#include "backward_references.h"
 #include "bit_cost.h"
 #include "brotli_bit_stream.h"
-#include "compress_fragment.h"
+#include "command.h"
+#include "compound_dictionary.h"
 #include "compress_fragment_two_pass.h"
+#include "compress_fragment.h"
 #include "dictionary_hash.h"
 #include "encoder_dict.h"
-#include "entropy_encode.h"
 #include "fast_log.h"
 #include "hash.h"
 #include "histogram.h"
 #include "memory.h"
 #include "metablock.h"
-#include "prefix.h"
-#include "state.h"
+#include "params.h"
 #include "quality.h"
 #include "ringbuffer.h"
+#include "state.h"
 #include "utf8_util.h"
 #include "write_bits.h"
 
diff --git a/c/enc/encoder_dict.c b/c/enc/encoder_dict.c
index 0984281..26ffda8 100644
--- a/c/enc/encoder_dict.c
+++ b/c/enc/encoder_dict.c
@@ -6,7 +6,8 @@
 
 #include "encoder_dict.h"
 
-#include <stdlib.h>  /* malloc, free */
+#include <brotli/encode.h>
+#include <brotli/shared_dictionary.h>
 
 #include "../common/dictionary.h"
 #include "../common/platform.h"
@@ -14,9 +15,11 @@
 #include "../common/transform.h"
 #include "compound_dictionary.h"
 #include "dictionary_hash.h"
+#include "hash_base.h"
+#include "hash.h"
 #include "memory.h"
 #include "quality.h"
-#include "hash.h"
+#include "static_dict_lut.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
 extern "C" {
diff --git a/c/enc/encoder_dict.h b/c/enc/encoder_dict.h
index 81bb942..dcb6aef 100644
--- a/c/enc/encoder_dict.h
+++ b/c/enc/encoder_dict.h
@@ -8,7 +8,6 @@
 #define BROTLI_ENC_ENCODER_DICT_H_
 
 #include <brotli/shared_dictionary.h>
-#include <brotli/types.h>
 
 #include "../common/dictionary.h"
 #include "../common/platform.h"
diff --git a/c/enc/entropy_encode.c b/c/enc/entropy_encode.c
index 9aed43b..aad2993 100644
--- a/c/enc/entropy_encode.c
+++ b/c/enc/entropy_encode.c
@@ -8,10 +8,6 @@
 
 #include "entropy_encode.h"
 
-#include <string.h>  /* memset */
-
-#include <brotli/types.h>
-
 #include "../common/constants.h"
 #include "../common/platform.h"
 
diff --git a/c/enc/entropy_encode.h b/c/enc/entropy_encode.h
index e1c779c..7bd3d3b 100644
--- a/c/enc/entropy_encode.h
+++ b/c/enc/entropy_encode.h
@@ -9,8 +9,6 @@
 #ifndef BROTLI_ENC_ENTROPY_ENCODE_H_
 #define BROTLI_ENC_ENTROPY_ENCODE_H_
 
-#include <brotli/types.h>
-
 #include "../common/platform.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
@@ -67,7 +65,7 @@
    of a Huffman tree. The generated Huffman tree is to be compressed once
    more using a Huffman tree */
 BROTLI_INTERNAL void BrotliWriteHuffmanTree(const uint8_t* depth,
-                                            size_t num,
+                                            size_t length,
                                             size_t* tree_size,
                                             uint8_t* tree,
                                             uint8_t* extra_bits_data);
diff --git a/c/enc/entropy_encode_static.h b/c/enc/entropy_encode_static.h
index ecff1fe..168b473 100644
--- a/c/enc/entropy_encode_static.h
+++ b/c/enc/entropy_encode_static.h
@@ -9,8 +9,6 @@
 #ifndef BROTLI_ENC_ENTROPY_ENCODE_STATIC_H_
 #define BROTLI_ENC_ENTROPY_ENCODE_STATIC_H_
 
-#include <brotli/types.h>
-
 #include "../common/constants.h"
 #include "../common/platform.h"
 #include "write_bits.h"
diff --git a/c/enc/fast_log.h b/c/enc/fast_log.h
index f82f4cf..3a1a3f6 100644
--- a/c/enc/fast_log.h
+++ b/c/enc/fast_log.h
@@ -11,8 +11,6 @@
 
 #include <math.h>
 
-#include <brotli/types.h>
-
 #include "../common/platform.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/c/enc/find_match_length.h b/c/enc/find_match_length.h
index f3de0bd..096be93 100644
--- a/c/enc/find_match_length.h
+++ b/c/enc/find_match_length.h
@@ -9,8 +9,6 @@
 #ifndef BROTLI_ENC_FIND_MATCH_LENGTH_H_
 #define BROTLI_ENC_FIND_MATCH_LENGTH_H_
 
-#include <brotli/types.h>
-
 #include "../common/platform.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/c/enc/hash.h b/c/enc/hash.h
index f210246..d86fa18 100644
--- a/c/enc/hash.h
+++ b/c/enc/hash.h
@@ -10,11 +10,6 @@
 #ifndef BROTLI_ENC_HASH_H_
 #define BROTLI_ENC_HASH_H_
 
-#include <stdlib.h>  /* exit */
-#include <string.h>  /* memcmp, memset */
-
-#include <brotli/types.h>
-
 #include "../common/constants.h"
 #include "../common/dictionary.h"
 #include "../common/platform.h"
@@ -22,8 +17,10 @@
 #include "encoder_dict.h"
 #include "fast_log.h"
 #include "find_match_length.h"
+#include "hash_base.h"
 #include "matching_tag_mask.h"
 #include "memory.h"
+#include "params.h"
 #include "quality.h"
 #include "static_dict.h"
 
@@ -72,23 +69,6 @@
   int len_code_delta; /* == len_code - len */
 } HasherSearchResult;
 
-/* kHashMul32 multiplier has these properties:
-   * The multiplier must be odd. Otherwise we may lose the highest bit.
-   * No long streaks of ones or zeros.
-   * There is no effort to ensure that it is a prime, the oddity is enough
-     for this use.
-   * The number has been tuned heuristically against compression benchmarks. */
-static const uint32_t kHashMul32 = 0x1E35A7BD;
-static const uint64_t kHashMul64 =
-    BROTLI_MAKE_UINT64_T(0x1FE35A7Bu, 0xD3579BD3u);
-
-static BROTLI_INLINE uint32_t Hash14(const uint8_t* data) {
-  uint32_t h = BROTLI_UNALIGNED_LOAD32LE(data) * kHashMul32;
-  /* The higher bits contain more mixture from the multiplication,
-     so we take our results from there. */
-  return h >> (32 - 14);
-}
-
 static BROTLI_INLINE void PrepareDistanceCache(
     int* BROTLI_RESTRICT distance_cache, const int num_distances) {
   if (num_distances > 4) {
diff --git a/c/enc/hash_base.h b/c/enc/hash_base.h
new file mode 100644
index 0000000..edf1ef0
--- /dev/null
+++ b/c/enc/hash_base.h
@@ -0,0 +1,38 @@
+/* Copyright 2025 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Basic common hash functions / constants. */
+
+#ifndef THIRD_PARTY_BROTLI_ENC_HASH_BASE_H_
+#define THIRD_PARTY_BROTLI_ENC_HASH_BASE_H_
+
+#include "../common/platform.h"
+
+/* kHashMul32 multiplier has these properties:
+   * The multiplier must be odd. Otherwise we may lose the highest bit.
+   * No long streaks of ones or zeros.
+   * There is no effort to ensure that it is a prime, the oddity is enough
+     for this use.
+   * The number has been tuned heuristically against compression benchmarks. */
+static const uint32_t kHashMul32 = 0x1E35A7BD;
+static const uint64_t kHashMul64 =
+    BROTLI_MAKE_UINT64_T(0x1FE35A7Bu, 0xD3579BD3u);
+
+static BROTLI_INLINE uint32_t Hash14(const uint8_t* data) {
+  uint32_t h = BROTLI_UNALIGNED_LOAD32LE(data) * kHashMul32;
+  /* The higher bits contain more mixture from the multiplication,
+     so we take our results from there. */
+  return h >> (32 - 14);
+}
+
+static BROTLI_INLINE uint32_t Hash15(const uint8_t* data) {
+  uint32_t h = BROTLI_UNALIGNED_LOAD32LE(data) * kHashMul32;
+  /* The higher bits contain more mixture from the multiplication,
+     so we take our results from there. */
+  return h >> (32 - 15);
+}
+
+#endif  // THIRD_PARTY_BROTLI_ENC_HASH_BASE_H_
diff --git a/c/enc/histogram.c b/c/enc/histogram.c
index 4dbb87f..43e4b38 100644
--- a/c/enc/histogram.c
+++ b/c/enc/histogram.c
@@ -9,6 +9,7 @@
 #include "histogram.h"
 
 #include "../common/context.h"
+#include "../common/platform.h"
 #include "block_splitter.h"
 #include "command.h"
 
diff --git a/c/enc/histogram.h b/c/enc/histogram.h
index d1abd97..a2accc3 100644
--- a/c/enc/histogram.h
+++ b/c/enc/histogram.h
@@ -9,10 +9,6 @@
 #ifndef BROTLI_ENC_HISTOGRAM_H_
 #define BROTLI_ENC_HISTOGRAM_H_
 
-#include <string.h>  /* memset */
-
-#include <brotli/types.h>
-
 #include "../common/constants.h"
 #include "../common/context.h"
 #include "../common/platform.h"
diff --git a/c/enc/literal_cost.c b/c/enc/literal_cost.c
index a129657..c4e207d 100644
--- a/c/enc/literal_cost.c
+++ b/c/enc/literal_cost.c
@@ -9,10 +9,6 @@
 
 #include "literal_cost.h"
 
-#include <string.h>  /* memset */
-
-#include <brotli/types.h>
-
 #include "../common/platform.h"
 #include "fast_log.h"
 #include "utf8_util.h"
diff --git a/c/enc/literal_cost.h b/c/enc/literal_cost.h
index 284a8e5..eb3f338 100644
--- a/c/enc/literal_cost.h
+++ b/c/enc/literal_cost.h
@@ -10,8 +10,6 @@
 #ifndef BROTLI_ENC_LITERAL_COST_H_
 #define BROTLI_ENC_LITERAL_COST_H_
 
-#include <brotli/types.h>
-
 #include "../common/platform.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/c/enc/matching_tag_mask.h b/c/enc/matching_tag_mask.h
index c166255..8a1be1d 100644
--- a/c/enc/matching_tag_mask.h
+++ b/c/enc/matching_tag_mask.h
@@ -3,7 +3,8 @@
 
 #include "../common/platform.h"
 
-#if defined(__SSE2__) || defined(_M_AMD64) || (defined (_M_IX86) && defined(_M_IX86_FP) && (_M_IX86_FP >= 2))
+#if defined(__SSE2__) || defined(_M_AMD64) || \
+    (defined(_M_IX86) && defined(_M_IX86_FP) && (_M_IX86_FP >= 2))
 #define SUPPORTS_SSE_2
 #endif
 
diff --git a/c/enc/memory.c b/c/enc/memory.c
index bb5e364..67f81ff 100644
--- a/c/enc/memory.c
+++ b/c/enc/memory.c
@@ -9,11 +9,6 @@
 
 #include "memory.h"
 
-#include <stdlib.h>  /* exit, free, malloc */
-#include <string.h>  /* memcpy */
-
-#include <brotli/types.h>
-
 #include "../common/platform.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/c/enc/memory.h b/c/enc/memory.h
index a4417df..d837481 100644
--- a/c/enc/memory.h
+++ b/c/enc/memory.h
@@ -9,10 +9,6 @@
 #ifndef BROTLI_ENC_MEMORY_H_
 #define BROTLI_ENC_MEMORY_H_
 
-#include <string.h>  /* memcpy */
-
-#include <brotli/types.h>
-
 #include "../common/platform.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/c/enc/metablock.c b/c/enc/metablock.c
index 5fe43a5..c9bed76 100644
--- a/c/enc/metablock.c
+++ b/c/enc/metablock.c
@@ -9,18 +9,18 @@
 
 #include "metablock.h"
 
-#include <brotli/types.h>
-
 #include "../common/constants.h"
 #include "../common/context.h"
 #include "../common/platform.h"
 #include "bit_cost.h"
 #include "block_splitter.h"
 #include "cluster.h"
+#include "command.h"
 #include "entropy_encode.h"
 #include "histogram.h"
 #include "memory.h"
-#include "quality.h"
+#include "params.h"
+#include "prefix.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
 extern "C" {
diff --git a/c/enc/metablock.h b/c/enc/metablock.h
index e574bae..e7d1052 100644
--- a/c/enc/metablock.h
+++ b/c/enc/metablock.h
@@ -10,15 +10,13 @@
 #ifndef BROTLI_ENC_METABLOCK_H_
 #define BROTLI_ENC_METABLOCK_H_
 
-#include <brotli/types.h>
-
 #include "../common/context.h"
 #include "../common/platform.h"
 #include "block_splitter.h"
 #include "command.h"
 #include "histogram.h"
 #include "memory.h"
-#include "quality.h"
+#include "params.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
 extern "C" {
diff --git a/c/enc/prefix.h b/c/enc/prefix.h
index 0f006f1..24c0afc 100644
--- a/c/enc/prefix.h
+++ b/c/enc/prefix.h
@@ -10,8 +10,6 @@
 #ifndef BROTLI_ENC_PREFIX_H_
 #define BROTLI_ENC_PREFIX_H_
 
-#include <brotli/types.h>
-
 #include "../common/constants.h"
 #include "../common/platform.h"
 #include "fast_log.h"
diff --git a/c/enc/ringbuffer.h b/c/enc/ringbuffer.h
index 27245b7..5bb75ed 100644
--- a/c/enc/ringbuffer.h
+++ b/c/enc/ringbuffer.h
@@ -9,12 +9,9 @@
 #ifndef BROTLI_ENC_RINGBUFFER_H_
 #define BROTLI_ENC_RINGBUFFER_H_
 
-#include <string.h>  /* memcpy */
-
-#include <brotli/types.h>
-
 #include "../common/platform.h"
 #include "memory.h"
+#include "params.h"
 #include "quality.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/c/enc/state.h b/c/enc/state.h
index cb82987..325f9f3 100644
--- a/c/enc/state.h
+++ b/c/enc/state.h
@@ -9,8 +9,8 @@
 #ifndef BROTLI_ENC_STATE_H_
 #define BROTLI_ENC_STATE_H_
 
-#include <brotli/types.h>
-
+#include "../common/constants.h"
+#include "../common/platform.h"
 #include "command.h"
 #include "compress_fragment.h"
 #include "compress_fragment_two_pass.h"
diff --git a/c/enc/static_dict.c b/c/enc/static_dict.c
index 291d283..8546746 100644
--- a/c/enc/static_dict.c
+++ b/c/enc/static_dict.c
@@ -11,18 +11,12 @@
 #include "../common/transform.h"
 #include "encoder_dict.h"
 #include "find_match_length.h"
+#include "hash_base.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
 extern "C" {
 #endif
 
-static BROTLI_INLINE uint32_t Hash(const uint8_t* data) {
-  uint32_t h = BROTLI_UNALIGNED_LOAD32LE(data) * kDictHashMul32;
-  /* The higher bits contain more mixture from the multiplication,
-     so we take our results from there. */
-  return h >> (32 - kDictNumBits);
-}
-
 static BROTLI_INLINE void AddMatch(size_t distance, size_t len, size_t len_code,
                                    uint32_t* matches) {
   uint32_t match = (uint32_t)((distance << 5) + len_code);
@@ -96,7 +90,7 @@
   }
 #endif  /* BROTLI_EXPERIMENTAL */
   {
-    size_t offset = dictionary->buckets[Hash(data)];
+    size_t offset = dictionary->buckets[Hash15(data)];
     BROTLI_BOOL end = !offset;
     while (!end) {
       DictWord w = dictionary->dict_words[offset++];
@@ -341,7 +335,7 @@
   /* Transforms with prefixes " " and "." */
   if (max_length >= 5 && (data[0] == ' ' || data[0] == '.')) {
     BROTLI_BOOL is_space = TO_BROTLI_BOOL(data[0] == ' ');
-    size_t offset = dictionary->buckets[Hash(&data[1])];
+    size_t offset = dictionary->buckets[Hash15(&data[1])];
     BROTLI_BOOL end = !offset;
     while (!end) {
       DictWord w = dictionary->dict_words[offset++];
@@ -436,7 +430,7 @@
     if ((data[1] == ' ' &&
          (data[0] == 'e' || data[0] == 's' || data[0] == ',')) ||
         (data[0] == 0xC2 && data[1] == 0xA0)) {
-      size_t offset = dictionary->buckets[Hash(&data[2])];
+      size_t offset = dictionary->buckets[Hash15(&data[2])];
       BROTLI_BOOL end = !offset;
       while (!end) {
         DictWord w = dictionary->dict_words[offset++];
@@ -465,7 +459,7 @@
          data[3] == 'e' && data[4] == ' ') ||
         (data[0] == '.' && data[1] == 'c' && data[2] == 'o' &&
          data[3] == 'm' && data[4] == '/')) {
-      size_t offset = dictionary->buckets[Hash(&data[5])];
+      size_t offset = dictionary->buckets[Hash15(&data[5])];
       BROTLI_BOOL end = !offset;
       while (!end) {
         DictWord w = dictionary->dict_words[offset++];
diff --git a/c/enc/static_dict.h b/c/enc/static_dict.h
index ab83220..bc69b15 100644
--- a/c/enc/static_dict.h
+++ b/c/enc/static_dict.h
@@ -9,10 +9,8 @@
 #ifndef BROTLI_ENC_STATIC_DICT_H_
 #define BROTLI_ENC_STATIC_DICT_H_
 
-#include <brotli/types.h>
-
-#include "../common/dictionary.h"
 #include "../common/platform.h"
+
 #include "encoder_dict.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/c/enc/static_dict_lut.h b/c/enc/static_dict_lut.h
index a465ffd..0fef6dd 100644
--- a/c/enc/static_dict_lut.h
+++ b/c/enc/static_dict_lut.h
@@ -9,7 +9,7 @@
 #ifndef BROTLI_ENC_STATIC_DICT_LUT_H_
 #define BROTLI_ENC_STATIC_DICT_LUT_H_
 
-#include <brotli/types.h>
+#include "../common/platform.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
 extern "C" {
@@ -23,9 +23,6 @@
 } DictWord;
 
 /* GENERATED CODE START */
-static const int kDictNumBits = 15;
-static const uint32_t kDictHashMul32 = 0x1E35A7BD;
-
 static const uint16_t kStaticDictionaryBuckets[32768] = {
 1,0,0,0,0,0,0,0,0,3,6,0,0,0,0,0,20,0,0,0,21,0,22,0,0,0,0,0,0,0,0,23,0,0,25,0,29,
 0,53,0,0,0,0,0,0,55,0,0,0,0,0,0,61,76,0,0,0,94,0,0,0,0,0,0,96,0,97,0,98,0,0,0,0,
diff --git a/c/enc/utf8_util.c b/c/enc/utf8_util.c
index 65ec3f5..d46c364 100644
--- a/c/enc/utf8_util.c
+++ b/c/enc/utf8_util.c
@@ -8,7 +8,7 @@
 
 #include "utf8_util.h"
 
-#include <brotli/types.h>
+#include "../common/platform.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
 extern "C" {
diff --git a/c/enc/utf8_util.h b/c/enc/utf8_util.h
index a38a953..cae3dba 100644
--- a/c/enc/utf8_util.h
+++ b/c/enc/utf8_util.h
@@ -9,8 +9,6 @@
 #ifndef BROTLI_ENC_UTF8_UTIL_H_
 #define BROTLI_ENC_UTF8_UTIL_H_
 
-#include <brotli/types.h>
-
 #include "../common/platform.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/c/enc/write_bits.h b/c/enc/write_bits.h
index 242754b..0cdc337 100644
--- a/c/enc/write_bits.h
+++ b/c/enc/write_bits.h
@@ -9,8 +9,6 @@
 #ifndef BROTLI_ENC_WRITE_BITS_H_
 #define BROTLI_ENC_WRITE_BITS_H_
 
-#include <brotli/types.h>
-
 #include "../common/platform.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/c/include/brotli/decode.h b/c/include/brotli/decode.h
index af1aa23..8d436db 100644
--- a/c/include/brotli/decode.h
+++ b/c/include/brotli/decode.h
@@ -14,7 +14,7 @@
 
 #include <brotli/port.h>
 #include <brotli/shared_dictionary.h>
-#include <brotli/types.h>
+#include <brotli/types.h>  /* IWYU pragma: export */
 
 #if defined(__cplusplus) || defined(c_plusplus)
 extern "C" {
diff --git a/c/include/brotli/encode.h b/c/include/brotli/encode.h
index dea9931..6267749 100644
--- a/c/include/brotli/encode.h
+++ b/c/include/brotli/encode.h
@@ -14,7 +14,7 @@
 
 #include <brotli/port.h>
 #include <brotli/shared_dictionary.h>
-#include <brotli/types.h>
+#include <brotli/types.h>  /* IWYU pragma: export */
 
 #if defined(__cplusplus) || defined(c_plusplus)
 extern "C" {
diff --git a/c/include/brotli/types.h b/c/include/brotli/types.h
index eff1a3c..2dc61ff 100644
--- a/c/include/brotli/types.h
+++ b/c/include/brotli/types.h
@@ -12,7 +12,7 @@
 #ifndef BROTLI_COMMON_TYPES_H_
 #define BROTLI_COMMON_TYPES_H_
 
-#include <stddef.h>  /* for size_t */
+#include <stddef.h>  /* IWYU pragma: export */
 
 #if defined(_MSC_VER) && (_MSC_VER < 1600)
 typedef __int8 int8_t;
@@ -24,7 +24,7 @@
 typedef unsigned __int64 uint64_t;
 typedef __int64 int64_t;
 #else
-#include <stdint.h>
+#include <stdint.h>  /* IWYU pragma: export */
 #endif  /* defined(_MSC_VER) && (_MSC_VER < 1600) */
 
 /**