aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTao Bao <tbao@google.com>2018-09-11 03:21:35 +0000
committerTao Bao <tbao@google.com>2018-09-10 20:25:06 -0700
commitc4af2b09ada22257ff12967537264627a3936822 (patch)
treebbbd0739556711089201e0448c444e8cf8bc547f
parent885730d69b5f844f1c59f6de809495726290ae22 (diff)
downloadbrotli-c4af2b09ada22257ff12967537264627a3936822.tar.gz
Revert "Merge tag 'v1.0.5' into HEAD"
This reverts commit 885730d69b5f844f1c59f6de809495726290ae22. Reason for revert: b/114832768 (32-bit recovery_component_test.UpdaterTest#brotli_new_data on marlin is broken). Bug: 114832768 Test: The above test passes w/ the revert. Change-Id: I9d6ad3ce44069a94bc78020ed28c5aa1a6d10ce8
-rw-r--r--.gitignore1
-rw-r--r--.gitmodules3
-rw-r--r--.travis.yml64
-rw-r--r--BUILD127
-rw-r--r--CMakeLists.txt192
-rw-r--r--METADATA18
-rw-r--r--Makefile.am38
-rw-r--r--README15
-rw-r--r--README.md2
-rw-r--r--WORKSPACE63
-rwxr-xr-xbootstrap31
-rw-r--r--c/common/constants.h19
-rwxr-xr-x[-rw-r--r--]c/common/dictionary.bin0
-rwxr-xr-xc/common/dictionary.bin.brbin51687 -> 0 bytes
-rw-r--r--c/common/dictionary.c2
-rw-r--r--c/common/dictionary.h8
-rwxr-xr-xc/common/platform.h509
-rwxr-xr-xc/common/transform.c235
-rwxr-xr-xc/common/transform.h80
-rwxr-xr-x[-rw-r--r--]c/common/version.h9
-rw-r--r--c/dec/bit_reader.c2
-rw-r--r--c/dec/bit_reader.h121
-rw-r--r--[-rwxr-xr-x]c/dec/context.h (renamed from c/common/context.h)354
-rw-r--r--c/dec/decode.c527
-rw-r--r--c/dec/huffman.c72
-rw-r--r--c/dec/huffman.h22
-rw-r--r--c/dec/port.h168
-rw-r--r--c/dec/prefix.h7
-rw-r--r--c/dec/state.c60
-rw-r--r--c/dec/state.h57
-rw-r--r--c/dec/transform.h300
-rw-r--r--c/enc/backward_references.c40
-rw-r--r--c/enc/backward_references.h11
-rwxr-xr-x[-rw-r--r--]c/enc/backward_references_hq.c162
-rwxr-xr-x[-rw-r--r--]c/enc/backward_references_hq.h47
-rw-r--r--c/enc/backward_references_inc.h20
-rw-r--r--c/enc/bit_cost.c2
-rw-r--r--c/enc/bit_cost.h10
-rw-r--r--c/enc/block_encoder_inc.h13
-rw-r--r--c/enc/block_splitter.c5
-rw-r--r--c/enc/block_splitter.h2
-rw-r--r--c/enc/block_splitter_inc.h22
-rw-r--r--c/enc/brotli_bit_stream.c203
-rw-r--r--c/enc/brotli_bit_stream.h57
-rw-r--r--c/enc/cluster.c2
-rw-r--r--c/enc/cluster.h2
-rw-r--r--c/enc/command.h70
-rw-r--r--c/enc/compress_fragment.c43
-rw-r--r--c/enc/compress_fragment.h2
-rw-r--r--c/enc/compress_fragment_two_pass.c169
-rw-r--r--c/enc/compress_fragment_two_pass.h2
-rw-r--r--c/enc/context.h184
-rwxr-xr-x[-rw-r--r--]c/enc/dictionary_hash.c2
-rw-r--r--c/enc/encode.c424
-rwxr-xr-xc/enc/encoder_dict.c32
-rwxr-xr-xc/enc/encoder_dict.h41
-rw-r--r--c/enc/entropy_encode.c28
-rw-r--r--c/enc/entropy_encode.h10
-rw-r--r--c/enc/entropy_encode_static.h6
-rw-r--r--c/enc/fast_log.h6
-rw-r--r--c/enc/find_match_length.h6
-rw-r--r--c/enc/hash.h99
-rwxr-xr-xc/enc/hash_composite_inc.h133
-rwxr-xr-x[-rw-r--r--]c/enc/hash_forgetful_chain_inc.h17
-rwxr-xr-x[-rw-r--r--]c/enc/hash_longest_match64_inc.h16
-rw-r--r--c/enc/hash_longest_match_inc.h16
-rw-r--r--c/enc/hash_longest_match_quickly_inc.h19
-rwxr-xr-xc/enc/hash_rolling_inc.h215
-rwxr-xr-x[-rw-r--r--]c/enc/hash_to_binary_tree_inc.h17
-rw-r--r--c/enc/histogram.c15
-rw-r--r--c/enc/histogram.h9
-rw-r--r--c/enc/histogram_inc.h2
-rw-r--r--c/enc/literal_cost.c10
-rw-r--r--c/enc/literal_cost.h4
-rw-r--r--c/enc/memory.c21
-rw-r--r--c/enc/memory.h41
-rw-r--r--c/enc/metablock.c188
-rw-r--r--c/enc/metablock.h21
-rw-r--r--c/enc/metablock_inc.h2
-rwxr-xr-xc/enc/params.h44
-rw-r--r--c/enc/port.h184
-rw-r--r--c/enc/prefix.h7
-rwxr-xr-x[-rw-r--r--]c/enc/quality.h53
-rw-r--r--c/enc/ringbuffer.h26
-rw-r--r--c/enc/static_dict.c94
-rw-r--r--c/enc/static_dict.h7
-rw-r--r--c/enc/static_dict_lut.h2
-rw-r--r--c/enc/utf8_util.c40
-rw-r--r--c/enc/utf8_util.h2
-rw-r--r--c/enc/write_bits.h37
-rw-r--r--c/fuzz/decode_fuzzer.cc (renamed from c/fuzz/decode_fuzzer.c)11
-rw-r--r--c/fuzz/run_decode_fuzzer.cc (renamed from c/fuzz/run_decode_fuzzer.c)2
-rwxr-xr-xc/fuzz/test_fuzzer.sh20
-rwxr-xr-x[-rw-r--r--]c/include/brotli/decode.h21
-rwxr-xr-x[-rw-r--r--]c/include/brotli/encode.h41
-rwxr-xr-x[-rw-r--r--]c/include/brotli/port.h294
-rwxr-xr-x[-rw-r--r--]c/include/brotli/types.h7
-rwxr-xr-x[-rw-r--r--]c/tools/brotli.c419
-rwxr-xr-x[-rw-r--r--]c/tools/brotli.md0
-rwxr-xr-xconfigure4
-rw-r--r--configure.ac14
-rwxr-xr-x[-rw-r--r--]docs/brotli.12
-rwxr-xr-x[-rw-r--r--]docs/decode.h.39
-rwxr-xr-x[-rw-r--r--]docs/encode.h.327
-rwxr-xr-x[-rw-r--r--]docs/types.h.32
-rw-r--r--fetch-spec/shared-brotli-fetch-spec.txt116
-rw-r--r--go/BUILD2
-rw-r--r--go/WORKSPACE16
-rwxr-xr-x[-rw-r--r--]go/cbrotli/BUILD14
-rwxr-xr-x[-rw-r--r--]go/cbrotli/cbrotli_test.go0
-rwxr-xr-x[-rw-r--r--]go/cbrotli/cgo.go0
-rwxr-xr-x[-rw-r--r--]go/cbrotli/reader.go0
-rwxr-xr-x[-rw-r--r--]go/cbrotli/writer.go0
-rw-r--r--java/BUILD86
-rw-r--r--java/WORKSPACE69
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/BUILD6
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/BitReader.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/BitReaderTest.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/BrotliInputStream.java12
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/BrotliRuntimeException.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/Context.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/Decode.java84
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/DecodeTest.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/Dictionary.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/DictionaryData.java30
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/DictionaryTest.java0
-rwxr-xr-xjava/org/brotli/dec/EagerStreamTest.java386
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/Huffman.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/SetDictionaryTest.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/State.java6
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/SynthTest.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/Transform.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/TransformTest.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/Utils.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/pom.xml0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/dec/proguard.cfg0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/integration/BUILD24
-rw-r--r--java/org/brotli/integration/BrotliJniTestBase.java13
-rwxr-xr-x[-rw-r--r--]java/org/brotli/integration/BundleChecker.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/integration/BundleHelper.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/integration/fuzz_data.zipbin23854 -> 23854 bytes
-rwxr-xr-x[-rw-r--r--]java/org/brotli/integration/pom.xml0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/integration/test_corpus.zipbin3587214 -> 3587214 bytes
-rwxr-xr-x[-rw-r--r--]java/org/brotli/integration/test_data.zipbin2859607 -> 2859607 bytes
-rwxr-xr-x[-rw-r--r--]java/org/brotli/pom.xml0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/common/BUILD59
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/common/BrotliCommon.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/common/CommonJNI.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/common/SetRfcDictionaryTest.java46
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/common/SetZeroDictionaryTest.java9
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/common/common_jni.cc0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/dec/BUILD62
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/dec/BrotliDecoderChannel.java4
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/dec/BrotliDecoderChannelTest.java9
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/dec/BrotliInputStream.java15
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/dec/BrotliInputStreamTest.java9
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/dec/Decoder.java16
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/dec/DecoderJNI.java26
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/dec/DecoderTest.java9
-rwxr-xr-xjava/org/brotli/wrapper/dec/EagerStreamTest.java75
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/dec/decoder_jni.cc31
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/enc/BUILD72
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/enc/BrotliEncoderChannel.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/enc/BrotliEncoderChannelTest.java9
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/enc/BrotliOutputStream.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/enc/BrotliOutputStreamTest.java9
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/enc/Encoder.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/enc/EncoderJNI.java0
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/enc/EncoderTest.java10
-rwxr-xr-x[-rw-r--r--]java/org/brotli/wrapper/enc/encoder_jni.cc0
-rwxr-xr-x[-rw-r--r--]js/BUILD16
-rw-r--r--js/WORKSPACE14
-rwxr-xr-x[-rw-r--r--]js/decode.js65
-rwxr-xr-xjs/decode.min.js2
-rwxr-xr-x[-rw-r--r--]js/decode_test.js11
-rwxr-xr-x[-rw-r--r--]js/polyfill.js0
-rw-r--r--python/tests/compressor_test.py3
-rw-r--r--python/tests/decompressor_test.py3
-rwxr-xr-xresearch/BUILD44
-rw-r--r--research/BUILD.libdivsufsort55
-rw-r--r--research/WORKSPACE12
-rw-r--r--research/brotli_decoder.c93
-rw-r--r--research/brotlidump.py7
-rwxr-xr-x[-rw-r--r--]research/deorummolae.cc200
-rwxr-xr-x[-rw-r--r--]research/deorummolae.h21
-rwxr-xr-xresearch/dictionary_generator.cc232
-rw-r--r--research/draw_diff.cc23
-rwxr-xr-xresearch/durchschlag.cc726
-rwxr-xr-xresearch/durchschlag.h99
m---------research/libdivsufsort0
-rw-r--r--research/read_dist.h2
-rwxr-xr-xresearch/sieve.cc259
-rwxr-xr-xresearch/sieve.h21
-rwxr-xr-xscripts/.travis.sh14
-rw-r--r--scripts/appveyor.yml45
-rw-r--r--scripts/dictionary/README.md3
-rw-r--r--scripts/dictionary/step-01-download-rfc.py16
-rw-r--r--scripts/dictionary/step-02-rfc-to-bin.py34
-rw-r--r--scripts/dictionary/step-03-validate-bin.py38
-rw-r--r--scripts/dictionary/step-04-generate-java-literals.py79
-rw-r--r--scripts/fix-win-bazel-build.py36
-rw-r--r--scripts/libbrotlicommon.pc.in11
-rw-r--r--scripts/libbrotlidec.pc.in12
-rw-r--r--scripts/libbrotlienc.pc.in12
-rw-r--r--scripts/sources.lst97
-rw-r--r--setup.py12
206 files changed, 3277 insertions, 7317 deletions
diff --git a/.gitignore b/.gitignore
index e3a69e6..a6d1d90 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,7 +4,6 @@ bin/
buildfiles/
**/obj/
dist/
-**/bazel-*
# Python
__pycache__/
diff --git a/.gitmodules b/.gitmodules
index 3ec8760..af7df38 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,6 +1,3 @@
[submodule "research/esaxx"]
path = research/esaxx
url = https://github.com/hillbig/esaxx
-[submodule "research/libdivsufsort"]
- path = research/libdivsufsort
- url = https://github.com/y-256/libdivsufsort.git
diff --git a/.travis.yml b/.travis.yml
index 6ec786c..95589a6 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -18,20 +18,16 @@ matrix:
- gcc-7
- g++-7
- os: linux
- env: BUILD_SYSTEM=cmake C_COMPILER=gcc-4.4 CXX_COMPILER=g++-4.4
+ env: BUILD_SYSTEM=cmake C_COMPILER=gcc-6 CXX_COMPILER=g++-6
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- - gcc-4.4
- - g++-4.4
-
- ###
- ## Test that Autotools build works.
- ###
+ - gcc-6
+ - g++-6
- os: linux
- env: BUILD_SYSTEM=autotools C_COMPILER=gcc-5 CXX_COMPILER=g++-5
+ env: BUILD_SYSTEM=cmake C_COMPILER=gcc-5 CXX_COMPILER=g++-5
addons:
apt:
sources:
@@ -39,32 +35,28 @@ matrix:
packages:
- gcc-5
- g++-5
-
- ###
- ## Test that fuzzer is compiling / working.
- ###
- os: linux
- env: BUILD_SYSTEM=fuzz C_COMPILER=clang-5.0 CXX_COMPILER=clang++-5.0 ASAN_OPTIONS=detect_leaks=0
+ env: BUILD_SYSTEM=cmake C_COMPILER=gcc-4.4 CXX_COMPILER=g++-4.4
addons:
apt:
sources:
- ubuntu-toolchain-r-test
- - llvm-toolchain-trusty-5.0
packages:
- - clang-5.0
+ - gcc-4.4
+ - g++-4.4
###
## clang on Linux
###
- os: linux
- env: BUILD_SYSTEM=cmake C_COMPILER=clang-5.0 CXX_COMPILER=clang++-5.0
+ env: BUILD_SYSTEM=cmake C_COMPILER=clang-4.0 CXX_COMPILER=clang++-4.0
addons:
apt:
sources:
- - llvm-toolchain-trusty-5.0
+ - llvm-toolchain-trusty-4.0
- ubuntu-toolchain-r-test
packages:
- - clang-5.0
+ - clang-4.0
- os: linux
env: BUILD_SYSTEM=cmake C_COMPILER=clang-3.5 CXX_COMPILER=clang++-3.5
addons:
@@ -87,25 +79,25 @@ matrix:
- os: linux
language: python
python: 2.7
- env: BUILD_SYSTEM=python C_COMPILER=gcc-5 CXX_COMPILER=g++-5
+ env: BUILD_SYSTEM=python C_COMPILER=gcc-6 CXX_COMPILER=g++-6
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- - gcc-5
- - g++-5
+ - gcc-6
+ - g++-6
- os: linux
language: python
python: 3.6
- env: BUILD_SYSTEM=python C_COMPILER=gcc-5 CXX_COMPILER=g++-5
+ env: BUILD_SYSTEM=python C_COMPILER=gcc-6 CXX_COMPILER=g++-6
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- - gcc-5
- - g++-5
+ - gcc-6
+ - g++-6
###
## CMake on OS X
@@ -117,10 +109,10 @@ matrix:
- os: osx
env: BUILD_SYSTEM=cmake C_COMPILER=gcc-6 CXX_COMPILER=g++-6
- os: osx
- env: BUILD_SYSTEM=cmake C_COMPILER=gcc-4.9 CXX_COMPILER=g++-4.9
+ env: BUILD_SYSTEM=cmake C_COMPILER=gcc-5 CXX_COMPILER=g++-5
- os: osx
- osx_image: xcode9.3
- env: BUILD_SYSTEM=cmake
+ osx_image: beta-xcode6.2
+ env: BUILD_SYSTEM=cmake C_COMPILER=gcc-4.4 CXX_COMPILER=g++-4.4
###
## Python 2.7 OS X build (using the system /usr/bin/python)
@@ -132,32 +124,32 @@ matrix:
## Sanitizers
###
- os: linux
- env: BUILD_SYSTEM=cmake C_COMPILER=clang-5.0 CXX_COMPILER=clang++-5.0 SANITIZER=address ASAN_OPTIONS=detect_leaks=0
+ env: BUILD_SYSTEM=cmake C_COMPILER=clang-4.0 CXX_COMPILER=clang++-4.0 SANITIZER=address
addons:
apt:
sources:
- ubuntu-toolchain-r-test
- - llvm-toolchain-trusty-5.0
+ - llvm-toolchain-trusty-4.0
packages:
- - clang-5.0
+ - clang-4.0
- os: linux
- env: BUILD_SYSTEM=cmake C_COMPILER=clang-5.0 CXX_COMPILER=clang++-5.0 SANITIZER=thread
+ env: BUILD_SYSTEM=cmake C_COMPILER=clang-4.0 CXX_COMPILER=clang++-4.0 SANITIZER=thread
addons:
apt:
sources:
- ubuntu-toolchain-r-test
- - llvm-toolchain-trusty-5.0
+ - llvm-toolchain-trusty-4.0
packages:
- - clang-5.0
+ - clang-4.0
- os: linux
- env: BUILD_SYSTEM=cmake C_COMPILER=clang-5.0 CXX_COMPILER=clang++-5.0 SANITIZER=undefined CFLAGS="-fno-sanitize-recover=undefined,integer"
+ env: BUILD_SYSTEM=cmake C_COMPILER=clang-4.0 CXX_COMPILER=clang++-4.0 SANITIZER=undefined CFLAGS="-fno-sanitize-recover=undefined,integer"
addons:
apt:
sources:
- ubuntu-toolchain-r-test
- - llvm-toolchain-trusty-5.0
+ - llvm-toolchain-trusty-4.0
packages:
- - clang-5.0
+ - clang-4.0
- os: linux
env: BUILD_SYSTEM=maven
diff --git a/BUILD b/BUILD
index 4ce4ad4..d25a5db 100644
--- a/BUILD
+++ b/BUILD
@@ -9,6 +9,8 @@ licenses(["notice"]) # MIT
exports_files(["LICENSE"])
+# >>> JNI headers
+
config_setting(
name = "darwin",
values = {"cpu": "darwin"},
@@ -21,46 +23,48 @@ config_setting(
visibility = ["//visibility:public"],
)
-config_setting(
- name = "windows",
- values = {"cpu": "x64_windows"},
- visibility = ["//visibility:public"],
+genrule(
+ name = "copy_link_jni_header",
+ srcs = ["@openjdk_linux//:jni_h"],
+ outs = ["jni/jni.h"],
+ cmd = "cp -f $< $@",
)
-config_setting(
- name = "windows_msvc",
- values = {"cpu": "x64_windows_msvc"},
- visibility = ["//visibility:public"],
+genrule(
+ name = "copy_link_jni_md_header",
+ srcs = select({
+ ":darwin": ["@openjdk_macos//:jni_md_h"],
+ ":darwin_x86_64": ["@openjdk_macos//:jni_md_h"],
+ "//conditions:default": ["@openjdk_linux//:jni_md_h"],
+ }),
+ outs = ["jni/jni_md.h"],
+ cmd = "cp -f $< $@",
)
-config_setting(
- name = "windows_msys",
- values = {"cpu": "x64_windows_msys"},
- visibility = ["//visibility:public"],
+cc_library(
+ name = "jni_inc",
+ hdrs = [
+ ":jni/jni.h",
+ ":jni/jni_md.h",
+ ],
+ includes = ["jni"],
)
-config_setting(
- name = "msvc",
- values = {"compiler": "msvc-cl"},
- visibility = ["//visibility:public"],
-)
+# <<< JNI headers
-STRICT_C_OPTIONS = select({
- ":msvc": [],
- "//conditions:default": [
- "--pedantic-errors",
- "-Wall",
- "-Wconversion",
- "-Werror",
- "-Wextra",
- "-Wlong-long",
- "-Wmissing-declarations",
- "-Wmissing-prototypes",
- "-Wno-strict-aliasing",
- "-Wshadow",
- "-Wsign-compare",
- ],
-})
+STRICT_C_OPTIONS = [
+ "--pedantic-errors",
+ "-Wall",
+ "-Wconversion",
+ "-Werror",
+ "-Wextra",
+ "-Wlong-long",
+ "-Wmissing-declarations",
+ "-Wmissing-prototypes",
+ "-Wno-strict-aliasing",
+ "-Wshadow",
+ "-Wsign-compare",
+]
filegroup(
name = "public_headers",
@@ -140,7 +144,64 @@ cc_binary(
],
)
+########################################################
+# WARNING: do not (transitively) depend on this target!
+########################################################
+cc_library(
+ name = "jni",
+ srcs = [
+ ":common_sources",
+ ":dec_sources",
+ ":enc_sources",
+ "//java/org/brotli/wrapper/common:jni_src",
+ "//java/org/brotli/wrapper/dec:jni_src",
+ "//java/org/brotli/wrapper/enc:jni_src",
+ ],
+ hdrs = [
+ ":common_headers",
+ ":dec_headers",
+ ":enc_headers",
+ ],
+ deps = [
+ ":brotli_inc",
+ ":jni_inc",
+ ],
+ alwayslink = 1,
+)
+
+########################################################
+# WARNING: do not (transitively) depend on this target!
+########################################################
+cc_library(
+ name = "jni_no_dictionary_data",
+ srcs = [
+ ":common_sources",
+ ":dec_sources",
+ ":enc_sources",
+ "//java/org/brotli/wrapper/common:jni_src",
+ "//java/org/brotli/wrapper/dec:jni_src",
+ "//java/org/brotli/wrapper/enc:jni_src",
+ ],
+ hdrs = [
+ ":common_headers",
+ ":dec_headers",
+ ":enc_headers",
+ ],
+ defines = [
+ "BROTLI_EXTERNAL_DICTIONARY_DATA=",
+ ],
+ deps = [
+ ":brotli_inc",
+ ":jni_inc",
+ ],
+ alwayslink = 1,
+)
+
filegroup(
name = "dictionary",
srcs = ["c/common/dictionary.bin"],
)
+
+load("@io_bazel_rules_go//go:def.bzl", "go_prefix")
+
+go_prefix("github.com/google/brotli")
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 99b9258..fcd0e96 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,7 +4,7 @@
# support 2.8.7.
cmake_minimum_required(VERSION 2.8.6)
-project(brotli C)
+project(brotli)
# If Brotli is being bundled in another project, we don't want to
# install anything. However, we want to let people override this, so
@@ -24,6 +24,16 @@ mark_as_advanced(BROTLI_BUNDLED_MODE)
include(GNUInstallDirs)
+# When building shared libraries it is important to set the correct rpath.
+# See https://cmake.org/Wiki/CMake_RPATH_handling#Always_full_RPATH
+set(CMAKE_SKIP_BUILD_RPATH FALSE)
+set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
+set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
+list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_LIBDIR}" isSystemDir)
+if ("${isSystemDir}" STREQUAL "-1")
+ set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_LIBDIR}")
+endif()
+
# Parse version information from common/version.h. Normally we would
# define these values here and write them out to configuration file(s)
# (i.e., config.h), but in this case we parse them from
@@ -62,19 +72,8 @@ string(REGEX REPLACE "^#define BROTLI_VERSION 0x([0-9a-fA-F]+)$" "\\1" _brotli_v
hex_to_dec("${_brotli_version_hex}" _brotli_version)
math(EXPR BROTLI_VERSION_MAJOR "${_brotli_version} >> 24")
math(EXPR BROTLI_VERSION_MINOR "(${_brotli_version} >> 12) & 4095")
-math(EXPR BROTLI_VERSION_PATCH "${_brotli_version} & 4095")
-set(BROTLI_VERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_PATCH}")
-mark_as_advanced(BROTLI_VERSION BROTLI_VERSION_MAJOR BROTLI_VERSION_MINOR BROTLI_VERSION_PATCH)
-
-# ABI Version information
-file(STRINGS "c/common/version.h" _brotli_abi_info_line REGEX "^#define BROTLI_ABI_VERSION (0x[0-9a-fA-F]+)$")
-string(REGEX REPLACE "^#define BROTLI_ABI_VERSION 0x([0-9a-fA-F]+)$" "\\1" _brotli_abi_info_hex "${_brotli_abi_info_line}")
-hex_to_dec("${_brotli_abi_info_hex}" _brotli_abi_info)
-math(EXPR BROTLI_ABI_CURRENT "${_brotli_abi_info} >> 24")
-math(EXPR BROTLI_ABI_REVISION "(${_brotli_abi_info} >> 12) & 4095")
-math(EXPR BROTLI_ABI_AGE "${_brotli_abi_info} & 4095")
-math(EXPR BROTLI_ABI_COMPATIBILITY "${BROTLI_ABI_CURRENT} - ${BROTLI_ABI_AGE}")
-mark_as_advanced(BROTLI_ABI_CURRENT BROTLI_ABI_REVISION BROTLI_ABI_AGE BROTLI_ABI_COMPATIBILITY)
+math(EXPR BROTLI_VERSION_REVISION "${_brotli_version} & 4095")
+mark_as_advanced(BROTLI_VERSION_MAJOR BROTLI_VERSION_MINOR BROTLI_VERSION_REVISION)
if (ENABLE_SANITIZER)
set(CMAKE_C_FLAGS " ${CMAKE_C_FLAGS} -fsanitize=${ENABLE_SANITIZER}")
@@ -126,24 +125,39 @@ elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
add_definitions(-DOS_MACOSX)
endif()
-function(transform_sources_list INPUT_FILE OUTPUT_FILE)
- file(READ ${INPUT_FILE} TEXT)
- string(REGEX REPLACE "\\\\\n" "~continuation~" TEXT ${TEXT})
- string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*)" "SET(\\1 \\2)" TEXT ${TEXT})
- string(REPLACE "~continuation~" "\n" TEXT ${TEXT})
- file(WRITE ${OUTPUT_FILE} ${TEXT})
-endfunction()
-
-transform_sources_list("scripts/sources.lst" "${CMAKE_CURRENT_BINARY_DIR}/sources.lst.cmake")
-include("${CMAKE_CURRENT_BINARY_DIR}/sources.lst.cmake")
-
-add_library(brotlicommon SHARED ${BROTLI_COMMON_C})
-add_library(brotlidec SHARED ${BROTLI_DEC_C})
-add_library(brotlienc SHARED ${BROTLI_ENC_C})
-
-add_library(brotlicommon-static STATIC ${BROTLI_COMMON_C})
-add_library(brotlidec-static STATIC ${BROTLI_DEC_C})
-add_library(brotlienc-static STATIC ${BROTLI_ENC_C})
+set(BROTLICOMMON_SOURCES
+ c/common/dictionary.c)
+set(BROTLIDEC_SOURCES
+ c/dec/bit_reader.c
+ c/dec/decode.c
+ c/dec/huffman.c
+ c/dec/state.c)
+set(BROTLIENC_SOURCES
+ c/enc/backward_references.c
+ c/enc/backward_references_hq.c
+ c/enc/bit_cost.c
+ c/enc/block_splitter.c
+ c/enc/brotli_bit_stream.c
+ c/enc/cluster.c
+ c/enc/compress_fragment.c
+ c/enc/compress_fragment_two_pass.c
+ c/enc/dictionary_hash.c
+ c/enc/encode.c
+ c/enc/entropy_encode.c
+ c/enc/histogram.c
+ c/enc/literal_cost.c
+ c/enc/memory.c
+ c/enc/metablock.c
+ c/enc/static_dict.c
+ c/enc/utf8_util.c)
+
+add_library(brotlicommon SHARED ${BROTLICOMMON_SOURCES})
+add_library(brotlidec SHARED ${BROTLIDEC_SOURCES})
+add_library(brotlienc SHARED ${BROTLIENC_SOURCES})
+
+add_library(brotlicommon-static STATIC ${BROTLICOMMON_SOURCES})
+add_library(brotlidec-static STATIC ${BROTLIDEC_SOURCES})
+add_library(brotlienc-static STATIC ${BROTLIENC_SOURCES})
# Older CMake versions does not understand INCLUDE_DIRECTORIES property.
include_directories(${BROTLI_INCLUDE_DIRS})
@@ -158,8 +172,8 @@ foreach(lib brotlicommon brotlidec brotlienc brotlicommon-static brotlidec-stati
target_link_libraries(${lib} ${LIBM_LIBRARY})
set_property(TARGET ${lib} APPEND PROPERTY INCLUDE_DIRECTORIES ${BROTLI_INCLUDE_DIRS})
set_target_properties(${lib} PROPERTIES
- VERSION "${BROTLI_ABI_COMPATIBILITY}.${BROTLI_ABI_AGE}.${BROTLI_ABI_REVISION}"
- SOVERSION "${BROTLI_ABI_COMPATIBILITY}"
+ SOVERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_REVISION}"
+ VERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_REVISION}"
POSITION_INDEPENDENT_CODE TRUE)
set_property(TARGET ${lib} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${BROTLI_INCLUDE_DIRS}")
endforeach()
@@ -182,7 +196,7 @@ if(BROTLI_PARENT_DIRECTORY)
endif()
# Build the brotli executable
-add_executable(brotli ${BROTLI_CLI_C})
+add_executable(brotli c/tools/brotli.c)
target_link_libraries(brotli ${BROTLI_LIBRARIES_STATIC})
# Installation
@@ -273,7 +287,9 @@ if(NOT BROTLI_DISABLE_TESTS)
endforeach()
endif()
-# Generate a pkg-config files
+# Generate a pkg-config file
+
+include(CMakeParseArguments)
function(generate_pkg_config_path outvar path)
string(LENGTH "${path}" path_length)
@@ -318,29 +334,103 @@ function(generate_pkg_config_path outvar path)
set("${outvar}" "${${outvar}}" PARENT_SCOPE)
endfunction(generate_pkg_config_path)
-function(transform_pc_file INPUT_FILE OUTPUT_FILE VERSION)
- file(READ ${INPUT_FILE} TEXT)
+function(generate_pkg_config output_file)
+ set (options)
+ set (oneValueArgs NAME DESCRIPTION URL VERSION PREFIX LIBDIR INCLUDEDIR)
+ set (multiValueArgs DEPENDS_PRIVATE CFLAGS LIBRARIES)
+ cmake_parse_arguments(GEN_PKG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+ unset (options)
+ unset (oneValueArgs)
+ unset (multiValueArgs)
+
+ if(NOT GEN_PKG_PREFIX)
+ set(GEN_PKG_PREFIX "${CMAKE_INSTALL_PREFIX}")
+ endif()
- set(PREFIX "${CMAKE_INSTALL_PREFIX}")
- string(REGEX REPLACE "@prefix@" "${PREFIX}" TEXT ${TEXT})
- string(REGEX REPLACE "@exec_prefix@" "${PREFIX}" TEXT ${TEXT})
+ if(NOT GEN_PKG_LIBDIR)
+ set(GEN_PKG_LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}")
+ endif()
+ generate_pkg_config_path(GEN_PKG_LIBDIR "${GEN_PKG_LIBDIR}"
+ prefix "${GEN_PKG_PREFIX}")
- generate_pkg_config_path(LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}" prefix "${PREFIX}")
- string(REGEX REPLACE "@libdir@" "${LIBDIR}" TEXT ${TEXT})
+ if(NOT GEN_PKG_INCLUDEDIR)
+ set(GEN_PKG_INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
+ endif()
+ generate_pkg_config_path(GEN_PKG_INCLUDEDIR "${GEN_PKG_INCLUDEDIR}"
+ prefix "${GEN_PKG_PREFIX}")
- generate_pkg_config_path(INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}" prefix "${PREFIX}")
- string(REGEX REPLACE "@includedir@" "${INCLUDEDIR}" TEXT ${TEXT})
+ file(WRITE "${output_file}" "prefix=${GEN_PKG_PREFIX}\n")
+ file(APPEND "${output_file}" "libdir=${GEN_PKG_LIBDIR}\n")
+ file(APPEND "${output_file}" "includedir=${GEN_PKG_INCLUDEDIR}\n")
+ file(APPEND "${output_file}" "\n")
- string(REGEX REPLACE "@PACKAGE_VERSION@" "${VERSION}" TEXT ${TEXT})
+ if(GEN_PKG_NAME)
+ file(APPEND "${output_file}" "Name: ${GEN_PKG_NAME}\n")
+ else()
+ file(APPEND "${output_file}" "Name: ${CMAKE_PROJECT_NAME}\n")
+ endif()
- file(WRITE ${OUTPUT_FILE} ${TEXT})
-endfunction()
+ if(GEN_PKG_DESCRIPTION)
+ file(APPEND "${output_file}" "Description: ${GEN_PKG_DESCRIPTION}\n")
+ endif()
-transform_pc_file("scripts/libbrotlicommon.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libbrotlicommon.pc" "${BROTLI_VERSION}")
+ if(GEN_PKG_URL)
+ file(APPEND "${output_file}" "URL: ${GEN_PKG_URL}\n")
+ endif()
+
+ if(GEN_PKG_VERSION)
+ file(APPEND "${output_file}" "Version: ${GEN_PKG_VERSION}\n")
+ endif()
+
+ if(GEN_PKG_DEPENDS_PRIVATE)
+ file(APPEND "${output_file}" "Requires.private:")
+ foreach(lib ${GEN_PKG_DEPENDS_PRIVATE})
+ file(APPEND "${output_file}" " ${lib}")
+ endforeach()
+ file(APPEND "${output_file}" "\n")
+ endif()
-transform_pc_file("scripts/libbrotlidec.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libbrotlidec.pc" "${BROTLI_VERSION}")
+ if(GEN_PKG_LIBRARIES)
+ set(libs)
-transform_pc_file("scripts/libbrotlienc.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libbrotlienc.pc" "${BROTLI_VERSION}")
+ file(APPEND "${output_file}" "Libs: -L\${libdir}")
+ foreach(lib ${GEN_PKG_LIBRARIES})
+ file(APPEND "${output_file}" " -l${lib}")
+ endforeach()
+ file(APPEND "${output_file}" "\n")
+ endif()
+
+ file(APPEND "${output_file}" "Cflags: -I\${includedir}")
+ if(GEN_PKG_CFLAGS)
+ foreach(cflag ${GEN_PKG_CFLAGS})
+ file(APPEND "${output_file}" " ${cflag}")
+ endforeach()
+ endif()
+ file(APPEND "${output_file}" "\n")
+endfunction(generate_pkg_config)
+
+generate_pkg_config ("${CMAKE_CURRENT_BINARY_DIR}/libbrotlicommon.pc"
+ NAME libbrotlicommon
+ DESCRIPTION "Shared data used by libbrotlienc and libbrotlidec libraries"
+ URL "https://github.com/google/brotli"
+ VERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_REVISION}"
+ LIBRARIES brotlicommon)
+
+generate_pkg_config ("${CMAKE_CURRENT_BINARY_DIR}/libbrotlidec.pc"
+ NAME libbrotlidec
+ DESCRIPTION "Brotli decoder library"
+ VERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_REVISION}"
+ URL "https://github.com/google/brotli"
+ DEPENDS_PRIVATE libbrotlicommon
+ LIBRARIES brotlidec)
+
+generate_pkg_config ("${CMAKE_CURRENT_BINARY_DIR}/libbrotlienc.pc"
+ NAME libbrotlienc
+ DESCRIPTION "Brotli encoder library"
+ VERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_REVISION}"
+ URL "https://github.com/google/brotli"
+ DEPENDS_PRIVATE libbrotlicommon
+ LIBRARIES brotlienc)
if(NOT BROTLI_BUNDLED_MODE)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libbrotlicommon.pc"
diff --git a/METADATA b/METADATA
deleted file mode 100644
index 5306903..0000000
--- a/METADATA
+++ /dev/null
@@ -1,18 +0,0 @@
-name: "brotli"
-description: "Brotli is a generic-purpose lossless compression algorithm."
-third_party {
- url {
- type: HOMEPAGE
- value: "https://github.com/google/brotli"
- }
- url {
- type: GIT
- value: "https://github.com/google/brotli.git"
- }
- version: "v1.0.5"
- last_upgrade_date {
- year: 2018
- month: 9
- day: 7
- }
-}
diff --git a/Makefile.am b/Makefile.am
deleted file mode 100644
index ace7a85..0000000
--- a/Makefile.am
+++ /dev/null
@@ -1,38 +0,0 @@
-AUTOMAKE_OPTIONS = foreign nostdinc subdir-objects
-
-ACLOCAL_AMFLAGS = -I m4
-
-# Actual ABI version is substituted by bootstrap
-LIBBROTLI_VERSION_INFO = -version-info 0:0:0
-
-bin_PROGRAMS = brotli
-lib_LTLIBRARIES = libbrotlicommon.la libbrotlidec.la libbrotlienc.la
-
-include scripts/sources.lst
-
-brotliincludedir = $(includedir)/brotli
-brotliinclude_HEADERS = $(BROTLI_INCLUDE)
-
-AM_CFLAGS = -I$(top_srcdir)/c/include
-
-brotli_SOURCES = $(BROTLI_CLI_C)
-brotli_LDADD = libbrotlidec.la libbrotlienc.la libbrotlicommon.la -lm
-#brotli_LDFLAGS = -static
-
-libbrotlicommon_la_SOURCES = $(BROTLI_COMMON_C) $(BROTLI_COMMON_H)
-libbrotlicommon_la_LDFLAGS = $(AM_LDFLAGS) $(LIBBROTLI_VERSION_INFO) $(LDFLAGS)
-libbrotlidec_la_SOURCES = $(BROTLI_DEC_C) $(BROTLI_DEC_H)
-libbrotlidec_la_LDFLAGS = $(AM_LDFLAGS) $(LIBBROTLI_VERSION_INFO) $(LDFLAGS)
-libbrotlidec_la_LIBADD = libbrotlicommon.la -lm
-libbrotlienc_la_SOURCES = $(BROTLI_ENC_C) $(BROTLI_ENC_H)
-libbrotlienc_la_LDFLAGS = $(AM_LDFLAGS) $(LIBBROTLI_VERSION_INFO) $(LDFLAGS)
-libbrotlienc_la_LIBADD = libbrotlicommon.la -lm
-
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = \
- scripts/libbrotlicommon.pc \
- scripts/libbrotlidec.pc \
- scripts/libbrotlienc.pc
-pkgincludedir= $(brotliincludedir)
-
-dist_doc_DATA = README
diff --git a/README b/README
deleted file mode 100644
index 3fb3f22..0000000
--- a/README
+++ /dev/null
@@ -1,15 +0,0 @@
-BROTLI DATA COMPRESSIOM LIBRARY
-
-Brotli is a generic-purpose lossless compression algorithm that compresses data
-using a combination of a modern variant of the LZ77 algorithm, Huffman coding
-and 2nd order context modeling, with a compression ratio comparable to the best
-currently available general-purpose compression methods. It is similar in speed
-with deflate but offers more dense compression.
-
-The specification of the Brotli Compressed Data Format is defined in RFC 7932
-https://tools.ietf.org/html/rfc7932
-
-Brotli is open-sourced under the MIT License, see the LICENSE file.
-
-Brotli mailing list:
-https://groups.google.com/forum/#!forum/brotli
diff --git a/README.md b/README.md
index f832bd4..6b9b0cf 100644
--- a/README.md
+++ b/README.md
@@ -81,5 +81,3 @@ JavaScript port of brotli [decoder](https://github.com/devongovett/brotli.js). C
Hand ported [decoder / encoder](https://github.com/dominikhlbg/BrotliHaxe) in haxe by Dominik Homberger. Output source code: JavaScript, PHP, Python, Java and C#
7Zip [plugin](https://github.com/mcmilk/7-Zip-Zstd)
-
-Dart [native bindings](https://github.com/thosakwe/brotli)
diff --git a/WORKSPACE b/WORKSPACE
index 75f3768..6b8cba4 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -1,21 +1,60 @@
+# Description:
+# Bazel workspace file for Brotli.
+
workspace(name = "org_brotli")
-local_repository(
- name = "ignore_org_brotli_go",
- path = "go",
+maven_jar(
+ name = "junit_junit",
+ artifact = "junit:junit:4.12",
+)
+
+git_repository(
+ name = "io_bazel_rules_go",
+ remote = "https://github.com/bazelbuild/rules_go.git",
+ tag = "0.4.4",
)
-local_repository(
- name = "ignore_org_brotli_java",
- path = "java",
+http_archive(
+ name = "io_bazel_rules_closure",
+ strip_prefix = "rules_closure-0.4.1",
+ sha256 = "ba5e2e10cdc4027702f96e9bdc536c6595decafa94847d08ae28c6cb48225124",
+ url = "http://mirror.bazel.build/github.com/bazelbuild/rules_closure/archive/0.4.1.tar.gz",
)
-local_repository(
- name = "ignore_org_brotli_js",
- path = "js",
+new_http_archive(
+ name = "openjdk_linux",
+ url = "https://bazel-mirror.storage.googleapis.com/openjdk/azul-zulu-8.20.0.5-jdk8.0.121/zulu8.20.0.5-jdk8.0.121-linux_x64.tar.gz",
+ sha256 = "7fdfb17d890406470b2303d749d3138e7f353749e67a0a22f542e1ab3e482745",
+ build_file_content = """
+package(
+ default_visibility = ["//visibility:public"],
+)
+filegroup(
+ name = "jni_h",
+ srcs = ["zulu8.20.0.5-jdk8.0.121-linux_x64/include/jni.h"],
+)
+filegroup(
+ name = "jni_md_h",
+ srcs = ["zulu8.20.0.5-jdk8.0.121-linux_x64/include/linux/jni_md.h"],
+)""",
)
-local_repository(
- name = "ignore_org_brotli_research",
- path = "research",
+new_http_archive(
+ name = "openjdk_macos",
+ url = "https://bazel-mirror.storage.googleapis.com/openjdk/azul-zulu-8.20.0.5-jdk8.0.121/zulu8.20.0.5-jdk8.0.121-macosx_x64.zip",
+ sha256 = "2a58bd1d9b0cbf0b3d8d1bcdd117c407e3d5a0ec01e2f53565c9bec5cf9ea78b",
+ build_file_content = """
+package(
+ default_visibility = ["//visibility:public"],
+)
+filegroup(
+ name = "jni_md_h",
+ srcs = ["zulu8.20.0.5-jdk8.0.121-macosx_x64/include/darwin/jni_md.h"],
+)""",
)
+
+load("@io_bazel_rules_go//go:def.bzl", "go_repositories")
+go_repositories()
+
+load("@io_bazel_rules_closure//closure:defs.bzl", "closure_repositories")
+closure_repositories()
diff --git a/bootstrap b/bootstrap
deleted file mode 100755
index 64aca2c..0000000
--- a/bootstrap
+++ /dev/null
@@ -1,31 +0,0 @@
-# !/bin/sh -e
-
-REQUIRED='is required, but not installed.'
-bc -v >/dev/null 2>&1 || { echo >&2 "'bc' $REQUIRED"; exit 1; }
-if [ `uname -s` != "FreeBSD" ]; then
-sed --version >/dev/null 2>&1 || { echo >&2 "'sed' $REQUIRED"; exit 1; }
-fi
-autoreconf --version >/dev/null 2>&1 || { echo >&2 "'autoconf' $REQUIRED"; exit 1; }
-
-# If libtool is not installed -> "error: Libtool library used but 'LIBTOOL' is undefined"
-
-mkdir m4 2>/dev/null
-
-BROTLI_ABI_HEX=`sed -n 's/#define BROTLI_ABI_VERSION 0x//p' c/common/version.h`
-BROTLI_ABI_INT=`echo "ibase=16;$BROTLI_ABI_HEX" | bc`
-BROTLI_ABI_CURRENT=`expr $BROTLI_ABI_INT / 16777216`
-BROTLI_ABI_REVISION=`expr $BROTLI_ABI_INT / 4096 % 4096`
-BROTLI_ABI_AGE=`expr $BROTLI_ABI_INT % 4096`
-BROTLI_ABI_INFO="$BROTLI_ABI_CURRENT:$BROTLI_ABI_REVISION:$BROTLI_ABI_AGE"
-
-BROTLI_VERSION_HEX=`sed -n 's/#define BROTLI_VERSION 0x//p' c/common/version.h`
-BROTLI_VERSION_INT=`echo "ibase=16;$BROTLI_VERSION_HEX" | bc`
-BROTLI_VERSION_MAJOR=`expr $BROTLI_VERSION_INT / 16777216`
-BROTLI_VERSION_MINOR=`expr $BROTLI_VERSION_INT / 4096 % 4096`
-BROTLI_VERSION_PATCH=`expr $BROTLI_VERSION_INT % 4096`
-BROTLI_VERSION="$BROTLI_VERSION_MAJOR.$BROTLI_VERSION_MINOR.$BROTLI_VERSION_PATCH"
-
-sed -i.bak -r "s/[0-9]+:[0-9]+:[0-9]+/$BROTLI_ABI_INFO/" Makefile.am
-sed -i.bak -r "s/\[[0-9]+\.[0-9]+\.[0-9]+\]/[$BROTLI_VERSION]/" configure.ac
-
-autoreconf --install --force --symlink || exit $
diff --git a/c/common/constants.h b/c/common/constants.h
index d1b88d1..416ec55 100644
--- a/c/common/constants.h
+++ b/c/common/constants.h
@@ -28,25 +28,18 @@
/* "code length of 8 is repeated" */
#define BROTLI_INITIAL_REPEATED_CODE_LENGTH 8
-/* "Large Window Brotli" */
-#define BROTLI_LARGE_MAX_DISTANCE_BITS 62U
-#define BROTLI_LARGE_MIN_WBITS 10
-#define BROTLI_LARGE_MAX_WBITS 30
-
/* Specification: 4. Encoding of distances */
#define BROTLI_NUM_DISTANCE_SHORT_CODES 16
#define BROTLI_MAX_NPOSTFIX 3
#define BROTLI_MAX_NDIRECT 120
#define BROTLI_MAX_DISTANCE_BITS 24U
-#define BROTLI_DISTANCE_ALPHABET_SIZE(NPOSTFIX, NDIRECT, MAXNBITS) ( \
- BROTLI_NUM_DISTANCE_SHORT_CODES + (NDIRECT) + \
- ((MAXNBITS) << ((NPOSTFIX) + 1)))
-/* BROTLI_NUM_DISTANCE_SYMBOLS == 1128 */
-#define BROTLI_NUM_DISTANCE_SYMBOLS \
- BROTLI_DISTANCE_ALPHABET_SIZE( \
- BROTLI_MAX_NDIRECT, BROTLI_MAX_NPOSTFIX, BROTLI_LARGE_MAX_DISTANCE_BITS)
+/* BROTLI_NUM_DISTANCE_SYMBOLS == 520 */
+#define BROTLI_NUM_DISTANCE_SYMBOLS (BROTLI_NUM_DISTANCE_SHORT_CODES + \
+ BROTLI_MAX_NDIRECT + \
+ (BROTLI_MAX_DISTANCE_BITS << \
+ (BROTLI_MAX_NPOSTFIX + 1)))
+/* Distance that is guaranteed to be representable in any stream. */
#define BROTLI_MAX_DISTANCE 0x3FFFFFC
-#define BROTLI_MAX_ALLOWED_DISTANCE 0x7FFFFFFC
/* 7.1. Context modes and context ID lookup for literals */
/* "context IDs for literals are in the range of 0..63" */
diff --git a/c/common/dictionary.bin b/c/common/dictionary.bin
index a585c0e..a585c0e 100644..100755
--- a/c/common/dictionary.bin
+++ b/c/common/dictionary.bin
diff --git a/c/common/dictionary.bin.br b/c/common/dictionary.bin.br
deleted file mode 100755
index 6a55d42..0000000
--- a/c/common/dictionary.bin.br
+++ /dev/null
Binary files differ
diff --git a/c/common/dictionary.c b/c/common/dictionary.c
index 64822a3..d0872bd 100644
--- a/c/common/dictionary.c
+++ b/c/common/dictionary.c
@@ -5883,7 +5883,7 @@ static BrotliDictionary kBrotliDictionary = {
122784,
/* data */
-#if defined(BROTLI_EXTERNAL_DICTIONARY_DATA)
+#ifdef BROTLI_EXTERNAL_DICTIONARY_DATA
NULL
#else
kBrotliDictionaryData
diff --git a/c/common/dictionary.h b/c/common/dictionary.h
index b1c6f7f..46fe533 100644
--- a/c/common/dictionary.h
+++ b/c/common/dictionary.h
@@ -27,13 +27,13 @@ typedef struct BrotliDictionary {
* Dictionary consists of words with length of [4..24] bytes.
* Values at [0..3] and [25..31] indices should not be addressed.
*/
- uint8_t size_bits_by_length[32];
+ const uint8_t size_bits_by_length[32];
/* assert(offset[i + 1] == offset[i] + (bits[i] ? (i << bits[i]) : 0)) */
- uint32_t offsets_by_length[32];
+ const uint32_t offsets_by_length[32];
/* assert(data_size == offsets_by_length[31]) */
- size_t data_size;
+ const size_t data_size;
/* Data array is not bound, and should obey to size_bits_by_length values.
Specified size matches default (RFC 7932) dictionary. Its size is
@@ -41,7 +41,7 @@ typedef struct BrotliDictionary {
const uint8_t* data;
} BrotliDictionary;
-BROTLI_COMMON_API const BrotliDictionary* BrotliGetDictionary(void);
+BROTLI_COMMON_API extern const BrotliDictionary* BrotliGetDictionary(void);
/**
* Sets dictionary data.
diff --git a/c/common/platform.h b/c/common/platform.h
deleted file mode 100755
index 9f303bc..0000000
--- a/c/common/platform.h
+++ /dev/null
@@ -1,509 +0,0 @@
-/* Copyright 2016 Google Inc. All Rights Reserved.
-
- Distributed under MIT license.
- See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
-*/
-
-/* Macros for compiler / platform specific features and build options.
-
- Build options are:
- * BROTLI_BUILD_32_BIT disables 64-bit optimizations
- * BROTLI_BUILD_64_BIT forces to use 64-bit optimizations
- * BROTLI_BUILD_BIG_ENDIAN forces to use big-endian optimizations
- * BROTLI_BUILD_ENDIAN_NEUTRAL disables endian-aware optimizations
- * BROTLI_BUILD_LITTLE_ENDIAN forces to use little-endian optimizations
- * BROTLI_BUILD_PORTABLE disables dangerous optimizations, like unaligned
- read and overlapping memcpy; this reduces decompression speed by 5%
- * BROTLI_BUILD_NO_RBIT disables "rbit" optimization for ARM CPUs
- * BROTLI_DEBUG dumps file name and line number when decoder detects stream
- or memory error
- * BROTLI_ENABLE_LOG enables asserts and dumps various state information
-*/
-
-#ifndef BROTLI_COMMON_PLATFORM_H_
-#define BROTLI_COMMON_PLATFORM_H_
-
-#include <string.h> /* memcpy */
-#include <stdlib.h> /* malloc, free */
-
-#include <brotli/port.h>
-#include <brotli/types.h>
-
-#if defined(OS_LINUX) || defined(OS_CYGWIN)
-#include <endian.h>
-#elif defined(OS_FREEBSD)
-#include <machine/endian.h>
-#elif defined(OS_MACOSX)
-#include <machine/endian.h>
-/* Let's try and follow the Linux convention */
-#define BROTLI_X_BYTE_ORDER BYTE_ORDER
-#define BROTLI_X_LITTLE_ENDIAN LITTLE_ENDIAN
-#define BROTLI_X_BIG_ENDIAN BIG_ENDIAN
-#endif
-
-#if defined(BROTLI_ENABLE_LOG) || defined(BROTLI_DEBUG)
-#include <assert.h>
-#include <stdio.h>
-#endif
-
-/* The following macros were borrowed from https://github.com/nemequ/hedley
- * with permission of original author - Evan Nemerson <evan@nemerson.com> */
-
-/* >>> >>> >>> hedley macros */
-
-/* Define "BROTLI_PREDICT_TRUE" and "BROTLI_PREDICT_FALSE" macros for capable
- compilers.
-
-To apply compiler hint, enclose the branching condition into macros, like this:
-
- if (BROTLI_PREDICT_TRUE(zero == 0)) {
- // main execution path
- } else {
- // compiler should place this code outside of main execution path
- }
-
-OR:
-
- if (BROTLI_PREDICT_FALSE(something_rare_or_unexpected_happens)) {
- // compiler should place this code outside of main execution path
- }
-
-*/
-#if BROTLI_GNUC_HAS_BUILTIN(__builtin_expect, 3, 0, 0) || \
- BROTLI_INTEL_VERSION_CHECK(16, 0, 0) || \
- BROTLI_SUNPRO_VERSION_CHECK(5, 12, 0) || \
- BROTLI_ARM_VERSION_CHECK(4, 1, 0) || \
- BROTLI_IBM_VERSION_CHECK(10, 1, 0) || \
- BROTLI_TI_VERSION_CHECK(7, 3, 0) || \
- BROTLI_TINYC_VERSION_CHECK(0, 9, 27)
-#define BROTLI_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1))
-#define BROTLI_PREDICT_FALSE(x) (__builtin_expect(x, 0))
-#else
-#define BROTLI_PREDICT_FALSE(x) (x)
-#define BROTLI_PREDICT_TRUE(x) (x)
-#endif
-
-#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
- !defined(__cplusplus)
-#define BROTLI_RESTRICT restrict
-#elif BROTLI_GNUC_VERSION_CHECK(3, 1, 0) || \
- BROTLI_MSVC_VERSION_CHECK(14, 0, 0) || \
- BROTLI_INTEL_VERSION_CHECK(16, 0, 0) || \
- BROTLI_ARM_VERSION_CHECK(4, 1, 0) || \
- BROTLI_IBM_VERSION_CHECK(10, 1, 0) || \
- BROTLI_PGI_VERSION_CHECK(17, 10, 0) || \
- BROTLI_TI_VERSION_CHECK(8, 0, 0) || \
- BROTLI_IAR_VERSION_CHECK(8, 0, 0) || \
- (BROTLI_SUNPRO_VERSION_CHECK(5, 14, 0) && defined(__cplusplus))
-#define BROTLI_RESTRICT __restrict
-#elif BROTLI_SUNPRO_VERSION_CHECK(5, 3, 0) && !defined(__cplusplus)
-#define BROTLI_RESTRICT _Restrict
-#else
-#define BROTLI_RESTRICT
-#endif
-
-#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \
- (defined(__cplusplus) && (__cplusplus >= 199711L))
-#define BROTLI_MAYBE_INLINE inline
-#elif defined(__GNUC_STDC_INLINE__) || defined(__GNUC_GNU_INLINE__) || \
- BROTLI_ARM_VERSION_CHECK(6, 2, 0)
-#define BROTLI_MAYBE_INLINE __inline__
-#elif BROTLI_MSVC_VERSION_CHECK(12, 0, 0) || \
- BROTLI_ARM_VERSION_CHECK(4, 1, 0) || BROTLI_TI_VERSION_CHECK(8, 0, 0)
-#define BROTLI_MAYBE_INLINE __inline
-#else
-#define BROTLI_MAYBE_INLINE
-#endif
-
-#if BROTLI_GNUC_HAS_ATTRIBUTE(always_inline, 4, 0, 0) || \
- BROTLI_INTEL_VERSION_CHECK(16, 0, 0) || \
- BROTLI_SUNPRO_VERSION_CHECK(5, 11, 0) || \
- BROTLI_ARM_VERSION_CHECK(4, 1, 0) || \
- BROTLI_IBM_VERSION_CHECK(10, 1, 0) || \
- BROTLI_TI_VERSION_CHECK(8, 0, 0) || \
- (BROTLI_TI_VERSION_CHECK(7, 3, 0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__))
-#define BROTLI_INLINE BROTLI_MAYBE_INLINE __attribute__((__always_inline__))
-#elif BROTLI_MSVC_VERSION_CHECK(12, 0, 0)
-#define BROTLI_INLINE BROTLI_MAYBE_INLINE __forceinline
-#elif BROTLI_TI_VERSION_CHECK(7, 0, 0) && defined(__cplusplus)
-#define BROTLI_INLINE BROTLI_MAYBE_INLINE _Pragma("FUNC_ALWAYS_INLINE;")
-#elif BROTLI_IAR_VERSION_CHECK(8, 0, 0)
-#define BROTLI_INLINE BROTLI_MAYBE_INLINE _Pragma("inline=forced")
-#else
-#define BROTLI_INLINE BROTLI_MAYBE_INLINE
-#endif
-
-#if BROTLI_GNUC_HAS_ATTRIBUTE(noinline, 4, 0, 0) || \
- BROTLI_INTEL_VERSION_CHECK(16, 0, 0) || \
- BROTLI_SUNPRO_VERSION_CHECK(5, 11, 0) || \
- BROTLI_ARM_VERSION_CHECK(4, 1, 0) || \
- BROTLI_IBM_VERSION_CHECK(10, 1, 0) || \
- BROTLI_TI_VERSION_CHECK(8, 0, 0) || \
- (BROTLI_TI_VERSION_CHECK(7, 3, 0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__))
-#define BROTLI_NOINLINE __attribute__((__noinline__))
-#elif BROTLI_MSVC_VERSION_CHECK(13, 10, 0)
-#define BROTLI_NOINLINE __declspec(noinline)
-#elif BROTLI_PGI_VERSION_CHECK(10, 2, 0)
-#define BROTLI_NOINLINE _Pragma("noinline")
-#elif BROTLI_TI_VERSION_CHECK(6, 0, 0) && defined(__cplusplus)
-#define BROTLI_NOINLINE _Pragma("FUNC_CANNOT_INLINE;")
-#elif BROTLI_IAR_VERSION_CHECK(8, 0, 0)
-#define BROTLI_NOINLINE _Pragma("inline=never")
-#else
-#define BROTLI_NOINLINE
-#endif
-
-/* BROTLI_INTERNAL could be defined to override visibility, e.g. for tests. */
-#if !defined(BROTLI_INTERNAL)
-#if defined(_WIN32) || defined(__CYGWIN__)
-#define BROTLI_INTERNAL
-#elif BROTLI_GNUC_VERSION_CHECK(3, 3, 0) || \
- BROTLI_TI_VERSION_CHECK(8, 0, 0) || \
- BROTLI_INTEL_VERSION_CHECK(16, 0, 0) || \
- BROTLI_ARM_VERSION_CHECK(4, 1, 0) || \
- BROTLI_IBM_VERSION_CHECK(13, 1, 0) || \
- BROTLI_SUNPRO_VERSION_CHECK(5, 11, 0) || \
- (BROTLI_TI_VERSION_CHECK(7, 3, 0) && \
- defined(__TI_GNU_ATTRIBUTE_SUPPORT__) && defined(__TI_EABI__))
-#define BROTLI_INTERNAL __attribute__ ((visibility ("hidden")))
-#else
-#define BROTLI_INTERNAL
-#endif
-#endif
-
-/* <<< <<< <<< end of hedley macros. */
-
-#if BROTLI_GNUC_HAS_ATTRIBUTE(unused, 2, 7, 0) || \
- BROTLI_INTEL_VERSION_CHECK(16, 0, 0)
-#define BROTLI_UNUSED_FUNCTION static BROTLI_INLINE __attribute__ ((unused))
-#else
-#define BROTLI_UNUSED_FUNCTION static BROTLI_INLINE
-#endif
-
-#if (defined(__ARM_ARCH) && (__ARM_ARCH == 7)) || \
- (defined(M_ARM) && (M_ARM == 7))
-#define BROTLI_TARGET_ARMV7
-#endif /* ARMv7 */
-
-#if (defined(__ARM_ARCH) && (__ARM_ARCH == 8)) || \
- defined(__aarch64__) || defined(__ARM64_ARCH_8__)
-#define BROTLI_TARGET_ARMV8
-#endif /* ARMv8 */
-
-#if defined(__i386) || defined(_M_IX86)
-#define BROTLI_TARGET_X86
-#endif
-
-#if defined(__x86_64__) || defined(_M_X64)
-#define BROTLI_TARGET_X64
-#endif
-
-#if defined(__PPC64__)
-#define BROTLI_TARGET_POWERPC64
-#endif
-
-#if defined(__riscv) && defined(__riscv_xlen) && __riscv_xlen == 64
-#define BROTLI_TARGET_RISCV64
-#endif
-
-#if defined(BROTLI_BUILD_64_BIT)
-#define BROTLI_64_BITS 1
-#elif defined(BROTLI_BUILD_32_BIT)
-#define BROTLI_64_BITS 0
-#elif defined(BROTLI_TARGET_X64) || defined(BROTLI_TARGET_ARMV8) || \
- defined(BROTLI_TARGET_POWERPC64) || defined(BROTLI_TARGET_RISCV64)
-#define BROTLI_64_BITS 1
-#else
-#define BROTLI_64_BITS 0
-#endif
-
-#if (BROTLI_64_BITS)
-#define brotli_reg_t uint64_t
-#else
-#define brotli_reg_t uint32_t
-#endif
-
-#if defined(BROTLI_BUILD_BIG_ENDIAN)
-#define BROTLI_BIG_ENDIAN 1
-#elif defined(BROTLI_BUILD_LITTLE_ENDIAN)
-#define BROTLI_LITTLE_ENDIAN 1
-#elif defined(BROTLI_BUILD_ENDIAN_NEUTRAL)
-/* Just break elif chain. */
-#elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
-#define BROTLI_LITTLE_ENDIAN 1
-#elif defined(_WIN32) || defined(BROTLI_TARGET_X64)
-/* Win32 & x64 can currently always be assumed to be little endian */
-#define BROTLI_LITTLE_ENDIAN 1
-#elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
-#define BROTLI_BIG_ENDIAN 1
-#elif defined(BROTLI_X_BYTE_ORDER)
-#if BROTLI_X_BYTE_ORDER == BROTLI_X_LITTLE_ENDIAN
-#define BROTLI_LITTLE_ENDIAN 1
-#elif BROTLI_X_BYTE_ORDER == BROTLI_X_BIG_ENDIAN
-#define BROTLI_BIG_ENDIAN 1
-#endif
-#endif /* BROTLI_X_BYTE_ORDER */
-
-#if !defined(BROTLI_LITTLE_ENDIAN)
-#define BROTLI_LITTLE_ENDIAN 0
-#endif
-
-#if !defined(BROTLI_BIG_ENDIAN)
-#define BROTLI_BIG_ENDIAN 0
-#endif
-
-#if defined(BROTLI_X_BYTE_ORDER)
-#undef BROTLI_X_BYTE_ORDER
-#undef BROTLI_X_LITTLE_ENDIAN
-#undef BROTLI_X_BIG_ENDIAN
-#endif
-
-#if defined(BROTLI_BUILD_PORTABLE)
-#define BROTLI_ALIGNED_READ (!!1)
-#elif defined(BROTLI_TARGET_X86) || defined(BROTLI_TARGET_X64) || \
- defined(BROTLI_TARGET_ARMV7) || defined(BROTLI_TARGET_ARMV8) || \
- defined(BROTLI_TARGET_RISCV64)
-/* Allow unaligned read only for white-listed CPUs. */
-#define BROTLI_ALIGNED_READ (!!0)
-#else
-#define BROTLI_ALIGNED_READ (!!1)
-#endif
-
-#if BROTLI_ALIGNED_READ
-/* Portable unaligned memory access: read / write values via memcpy. */
-static BROTLI_INLINE uint16_t BrotliUnalignedRead16(const void* p) {
- uint16_t t;
- memcpy(&t, p, sizeof t);
- return t;
-}
-static BROTLI_INLINE uint32_t BrotliUnalignedRead32(const void* p) {
- uint32_t t;
- memcpy(&t, p, sizeof t);
- return t;
-}
-static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) {
- uint64_t t;
- memcpy(&t, p, sizeof t);
- return t;
-}
-static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) {
- memcpy(p, &v, sizeof v);
-}
-#else /* BROTLI_ALIGNED_READ */
-/* Unaligned memory access is allowed: just cast pointer to requested type. */
-static BROTLI_INLINE uint16_t BrotliUnalignedRead16(const void* p) {
- return *(const uint16_t*)p;
-}
-static BROTLI_INLINE uint32_t BrotliUnalignedRead32(const void* p) {
- return *(const uint32_t*)p;
-}
-#if (BROTLI_64_BITS)
-static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) {
- return *(const uint64_t*)p;
-}
-static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) {
- *(uint64_t*)p = v;
-}
-#else /* BROTLI_64_BITS */
-/* Avoid emitting LDRD / STRD, which require properly aligned address. */
-static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) {
- const uint32_t* dwords = (const uint32_t*)p;
- return dwords[0] | ((uint64_t)dwords[1] << 32);
-}
-static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) {
- uint32_t* dwords = (uint32_t *)p;
- dwords[0] = (uint32_t)v;
- dwords[1] = (uint32_t)(v >> 32);
-}
-#endif /* BROTLI_64_BITS */
-#endif /* BROTLI_ALIGNED_READ */
-
-#if BROTLI_LITTLE_ENDIAN
-/* Straight endianness. Just read / write values. */
-#define BROTLI_UNALIGNED_LOAD16LE BrotliUnalignedRead16
-#define BROTLI_UNALIGNED_LOAD32LE BrotliUnalignedRead32
-#define BROTLI_UNALIGNED_LOAD64LE BrotliUnalignedRead64
-#define BROTLI_UNALIGNED_STORE64LE BrotliUnalignedWrite64
-#elif BROTLI_BIG_ENDIAN /* BROTLI_LITTLE_ENDIAN */
-/* Explain compiler to byte-swap values. */
-#define BROTLI_BSWAP16_(V) ((uint16_t)( \
- (((V) & 0xFFU) << 8) | \
- (((V) >> 8) & 0xFFU)))
-static BROTLI_INLINE uint16_t BROTLI_UNALIGNED_LOAD16LE(const void* p) {
- uint16_t value = BrotliUnalignedRead16(p);
- return BROTLI_BSWAP16_(value);
-}
-#define BROTLI_BSWAP32_(V) ( \
- (((V) & 0xFFU) << 24) | (((V) & 0xFF00U) << 8) | \
- (((V) >> 8) & 0xFF00U) | (((V) >> 24) & 0xFFU))
-static BROTLI_INLINE uint32_t BROTLI_UNALIGNED_LOAD32LE(const void* p) {
- uint32_t value = BrotliUnalignedRead32(p);
- return BROTLI_BSWAP32_(value);
-}
-#define BROTLI_BSWAP64_(V) ( \
- (((V) & 0xFFU) << 56) | (((V) & 0xFF00U) << 40) | \
- (((V) & 0xFF0000U) << 24) | (((V) & 0xFF000000U) << 8) | \
- (((V) >> 8) & 0xFF000000U) | (((V) >> 24) & 0xFF0000U) | \
- (((V) >> 40) & 0xFF00U) | (((V) >> 56) & 0xFFU))
-static BROTLI_INLINE uint64_t BROTLI_UNALIGNED_LOAD64LE(const void* p) {
- uint64_t value = BrotliUnalignedRead64(p);
- return BROTLI_BSWAP64_(value);
-}
-static BROTLI_INLINE void BROTLI_UNALIGNED_STORE64LE(void* p, uint64_t v) {
- uint64_t value = BROTLI_BSWAP64_(v);
- BrotliUnalignedWrite64(p, value);
-}
-#else /* BROTLI_LITTLE_ENDIAN */
-/* Read / store values byte-wise; hopefully compiler will understand. */
-static BROTLI_INLINE uint16_t BROTLI_UNALIGNED_LOAD16LE(const void* p) {
- const uint8_t* in = (const uint8_t*)p;
- return (uint16_t)(in[0] | (in[1] << 8));
-}
-static BROTLI_INLINE uint32_t BROTLI_UNALIGNED_LOAD32LE(const void* p) {
- const uint8_t* in = (const uint8_t*)p;
- uint32_t value = (uint32_t)(in[0]);
- value |= (uint32_t)(in[1]) << 8;
- value |= (uint32_t)(in[2]) << 16;
- value |= (uint32_t)(in[3]) << 24;
- return value;
-}
-static BROTLI_INLINE uint64_t BROTLI_UNALIGNED_LOAD64LE(const void* p) {
- const uint8_t* in = (const uint8_t*)p;
- uint64_t value = (uint64_t)(in[0]);
- value |= (uint64_t)(in[1]) << 8;
- value |= (uint64_t)(in[2]) << 16;
- value |= (uint64_t)(in[3]) << 24;
- value |= (uint64_t)(in[4]) << 32;
- value |= (uint64_t)(in[5]) << 40;
- value |= (uint64_t)(in[6]) << 48;
- value |= (uint64_t)(in[7]) << 56;
- return value;
-}
-static BROTLI_INLINE void BROTLI_UNALIGNED_STORE64LE(void* p, uint64_t v) {
- uint8_t* out = (uint8_t*)p;
- out[0] = (uint8_t)v;
- out[1] = (uint8_t)(v >> 8);
- out[2] = (uint8_t)(v >> 16);
- out[3] = (uint8_t)(v >> 24);
- out[4] = (uint8_t)(v >> 32);
- out[5] = (uint8_t)(v >> 40);
- out[6] = (uint8_t)(v >> 48);
- out[7] = (uint8_t)(v >> 56);
-}
-#endif /* BROTLI_LITTLE_ENDIAN */
-
-/* BROTLI_IS_CONSTANT macros returns true for compile-time constants. */
-#if BROTLI_GNUC_HAS_BUILTIN(__builtin_constant_p, 3, 0, 1) || \
- BROTLI_INTEL_VERSION_CHECK(16, 0, 0)
-#define BROTLI_IS_CONSTANT(x) (!!__builtin_constant_p(x))
-#else
-#define BROTLI_IS_CONSTANT(x) (!!0)
-#endif
-
-#if defined(BROTLI_TARGET_ARMV7) || defined(BROTLI_TARGET_ARMV8)
-#define BROTLI_HAS_UBFX (!!1)
-#else
-#define BROTLI_HAS_UBFX (!!0)
-#endif
-
-#if defined(BROTLI_ENABLE_LOG)
-#define BROTLI_DCHECK(x) assert(x)
-#define BROTLI_LOG(x) printf x
-#else
-#define BROTLI_DCHECK(x)
-#define BROTLI_LOG(x)
-#endif
-
-#if defined(BROTLI_DEBUG) || defined(BROTLI_ENABLE_LOG)
-static BROTLI_INLINE void BrotliDump(const char* f, int l, const char* fn) {
- fprintf(stderr, "%s:%d (%s)\n", f, l, fn);
- fflush(stderr);
-}
-#define BROTLI_DUMP() BrotliDump(__FILE__, __LINE__, __FUNCTION__)
-#else
-#define BROTLI_DUMP() (void)(0)
-#endif
-
-/* TODO: add appropriate icc/sunpro/arm/ibm/ti checks. */
-#if (BROTLI_GNUC_VERSION_CHECK(3, 0, 0) || defined(__llvm__)) && \
- !defined(BROTLI_BUILD_NO_RBIT)
-#if defined(BROTLI_TARGET_ARMV7) || defined(BROTLI_TARGET_ARMV8)
-/* TODO: detect ARMv6T2 and enable this code for it. */
-static BROTLI_INLINE brotli_reg_t BrotliRBit(brotli_reg_t input) {
- brotli_reg_t output;
- __asm__("rbit %0, %1\n" : "=r"(output) : "r"(input));
- return output;
-}
-#define BROTLI_RBIT(x) BrotliRBit(x)
-#endif /* armv7 / armv8 */
-#endif /* gcc || clang */
-#if !defined(BROTLI_RBIT)
-static BROTLI_INLINE void BrotliRBit(void) { /* Should break build if used. */ }
-#endif /* BROTLI_RBIT */
-
-#define BROTLI_REPEAT(N, X) { \
- if ((N & 1) != 0) {X;} \
- if ((N & 2) != 0) {X; X;} \
- if ((N & 4) != 0) {X; X; X; X;} \
-}
-
-#define BROTLI_UNUSED(X) (void)(X)
-
-#define BROTLI_MIN_MAX(T) \
- static BROTLI_INLINE T brotli_min_ ## T (T a, T b) { return a < b ? a : b; } \
- static BROTLI_INLINE T brotli_max_ ## T (T a, T b) { return a > b ? a : b; }
-BROTLI_MIN_MAX(double) BROTLI_MIN_MAX(float) BROTLI_MIN_MAX(int)
-BROTLI_MIN_MAX(size_t) BROTLI_MIN_MAX(uint32_t) BROTLI_MIN_MAX(uint8_t)
-#undef BROTLI_MIN_MAX
-#define BROTLI_MIN(T, A, B) (brotli_min_ ## T((A), (B)))
-#define BROTLI_MAX(T, A, B) (brotli_max_ ## T((A), (B)))
-
-#define BROTLI_SWAP(T, A, I, J) { \
- T __brotli_swap_tmp = (A)[(I)]; \
- (A)[(I)] = (A)[(J)]; \
- (A)[(J)] = __brotli_swap_tmp; \
-}
-
-/* Default brotli_alloc_func */
-static void* BrotliDefaultAllocFunc(void* opaque, size_t size) {
- BROTLI_UNUSED(opaque);
- return malloc(size);
-}
-
-/* Default brotli_free_func */
-static void BrotliDefaultFreeFunc(void* opaque, void* address) {
- BROTLI_UNUSED(opaque);
- free(address);
-}
-
-BROTLI_UNUSED_FUNCTION void BrotliSuppressUnusedFunctions(void) {
- BROTLI_UNUSED(&BrotliSuppressUnusedFunctions);
- BROTLI_UNUSED(&BrotliUnalignedRead16);
- BROTLI_UNUSED(&BrotliUnalignedRead32);
- BROTLI_UNUSED(&BrotliUnalignedRead64);
- BROTLI_UNUSED(&BrotliUnalignedWrite64);
- BROTLI_UNUSED(&BROTLI_UNALIGNED_LOAD16LE);
- BROTLI_UNUSED(&BROTLI_UNALIGNED_LOAD32LE);
- BROTLI_UNUSED(&BROTLI_UNALIGNED_LOAD64LE);
- BROTLI_UNUSED(&BROTLI_UNALIGNED_STORE64LE);
- BROTLI_UNUSED(&BrotliRBit);
- BROTLI_UNUSED(&brotli_min_double);
- BROTLI_UNUSED(&brotli_max_double);
- BROTLI_UNUSED(&brotli_min_float);
- BROTLI_UNUSED(&brotli_max_float);
- BROTLI_UNUSED(&brotli_min_int);
- BROTLI_UNUSED(&brotli_max_int);
- BROTLI_UNUSED(&brotli_min_size_t);
- BROTLI_UNUSED(&brotli_max_size_t);
- BROTLI_UNUSED(&brotli_min_uint32_t);
- BROTLI_UNUSED(&brotli_max_uint32_t);
- BROTLI_UNUSED(&brotli_min_uint8_t);
- BROTLI_UNUSED(&brotli_max_uint8_t);
- BROTLI_UNUSED(&BrotliDefaultAllocFunc);
- BROTLI_UNUSED(&BrotliDefaultFreeFunc);
-#if defined(BROTLI_DEBUG) || defined(BROTLI_ENABLE_LOG)
- BROTLI_UNUSED(&BrotliDump);
-#endif
-}
-
-#endif /* BROTLI_COMMON_PLATFORM_H_ */
diff --git a/c/common/transform.c b/c/common/transform.c
deleted file mode 100755
index 4184ae5..0000000
--- a/c/common/transform.c
+++ /dev/null
@@ -1,235 +0,0 @@
-/* Copyright 2013 Google Inc. All Rights Reserved.
-
- Distributed under MIT license.
- See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
-*/
-
-#include "./transform.h"
-
-#if defined(__cplusplus) || defined(c_plusplus)
-extern "C" {
-#endif
-
-/* RFC 7932 transforms string data */
-static const char kPrefixSuffix[217] =
- "\1 \2, \10 of the \4 of \2s \1.\5 and \4 "
-/* 0x _0 _2 __5 _E _3 _6 _8 _E */
- "in \1\"\4 to \2\">\1\n\2. \1]\5 for \3 a \6 "
-/* 2x _3_ _5 _A_ _D_ _F _2 _4 _A _E */
- "that \1\'\6 with \6 from \4 by \1(\6. T"
-/* 4x _5_ _7 _E _5 _A _C */
- "he \4 on \4 as \4 is \4ing \2\n\t\1:\3ed "
-/* 6x _3 _8 _D _2 _7_ _ _A _C */
- "\2=\"\4 at \3ly \1,\2=\'\5.com/\7. This \5"
-/* 8x _0 _ _3 _8 _C _E _ _1 _7 _F */
- " not \3er \3al \4ful \4ive \5less \4es"
-/* Ax _5 _9 _D _2 _7 _D */
- "t \4ize \2\xc2\xa0\4ous \5 the \2e \0";
-/* Cx _2 _7___ ___ _A _F _5 _8 */
-
-static const uint16_t kPrefixSuffixMap[50] = {
- 0x00, 0x02, 0x05, 0x0E, 0x13, 0x16, 0x18, 0x1E, 0x23, 0x25,
- 0x2A, 0x2D, 0x2F, 0x32, 0x34, 0x3A, 0x3E, 0x45, 0x47, 0x4E,
- 0x55, 0x5A, 0x5C, 0x63, 0x68, 0x6D, 0x72, 0x77, 0x7A, 0x7C,
- 0x80, 0x83, 0x88, 0x8C, 0x8E, 0x91, 0x97, 0x9F, 0xA5, 0xA9,
- 0xAD, 0xB2, 0xB7, 0xBD, 0xC2, 0xC7, 0xCA, 0xCF, 0xD5, 0xD8
-};
-
-/* RFC 7932 transforms */
-static const uint8_t kTransformsData[] = {
- 49, BROTLI_TRANSFORM_IDENTITY, 49,
- 49, BROTLI_TRANSFORM_IDENTITY, 0,
- 0, BROTLI_TRANSFORM_IDENTITY, 0,
- 49, BROTLI_TRANSFORM_OMIT_FIRST_1, 49,
- 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 0,
- 49, BROTLI_TRANSFORM_IDENTITY, 47,
- 0, BROTLI_TRANSFORM_IDENTITY, 49,
- 4, BROTLI_TRANSFORM_IDENTITY, 0,
- 49, BROTLI_TRANSFORM_IDENTITY, 3,
- 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 49,
- 49, BROTLI_TRANSFORM_IDENTITY, 6,
- 49, BROTLI_TRANSFORM_OMIT_FIRST_2, 49,
- 49, BROTLI_TRANSFORM_OMIT_LAST_1, 49,
- 1, BROTLI_TRANSFORM_IDENTITY, 0,
- 49, BROTLI_TRANSFORM_IDENTITY, 1,
- 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 0,
- 49, BROTLI_TRANSFORM_IDENTITY, 7,
- 49, BROTLI_TRANSFORM_IDENTITY, 9,
- 48, BROTLI_TRANSFORM_IDENTITY, 0,
- 49, BROTLI_TRANSFORM_IDENTITY, 8,
- 49, BROTLI_TRANSFORM_IDENTITY, 5,
- 49, BROTLI_TRANSFORM_IDENTITY, 10,
- 49, BROTLI_TRANSFORM_IDENTITY, 11,
- 49, BROTLI_TRANSFORM_OMIT_LAST_3, 49,
- 49, BROTLI_TRANSFORM_IDENTITY, 13,
- 49, BROTLI_TRANSFORM_IDENTITY, 14,
- 49, BROTLI_TRANSFORM_OMIT_FIRST_3, 49,
- 49, BROTLI_TRANSFORM_OMIT_LAST_2, 49,
- 49, BROTLI_TRANSFORM_IDENTITY, 15,
- 49, BROTLI_TRANSFORM_IDENTITY, 16,
- 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 49,
- 49, BROTLI_TRANSFORM_IDENTITY, 12,
- 5, BROTLI_TRANSFORM_IDENTITY, 49,
- 0, BROTLI_TRANSFORM_IDENTITY, 1,
- 49, BROTLI_TRANSFORM_OMIT_FIRST_4, 49,
- 49, BROTLI_TRANSFORM_IDENTITY, 18,
- 49, BROTLI_TRANSFORM_IDENTITY, 17,
- 49, BROTLI_TRANSFORM_IDENTITY, 19,
- 49, BROTLI_TRANSFORM_IDENTITY, 20,
- 49, BROTLI_TRANSFORM_OMIT_FIRST_5, 49,
- 49, BROTLI_TRANSFORM_OMIT_FIRST_6, 49,
- 47, BROTLI_TRANSFORM_IDENTITY, 49,
- 49, BROTLI_TRANSFORM_OMIT_LAST_4, 49,
- 49, BROTLI_TRANSFORM_IDENTITY, 22,
- 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 49,
- 49, BROTLI_TRANSFORM_IDENTITY, 23,
- 49, BROTLI_TRANSFORM_IDENTITY, 24,
- 49, BROTLI_TRANSFORM_IDENTITY, 25,
- 49, BROTLI_TRANSFORM_OMIT_LAST_7, 49,
- 49, BROTLI_TRANSFORM_OMIT_LAST_1, 26,
- 49, BROTLI_TRANSFORM_IDENTITY, 27,
- 49, BROTLI_TRANSFORM_IDENTITY, 28,
- 0, BROTLI_TRANSFORM_IDENTITY, 12,
- 49, BROTLI_TRANSFORM_IDENTITY, 29,
- 49, BROTLI_TRANSFORM_OMIT_FIRST_9, 49,
- 49, BROTLI_TRANSFORM_OMIT_FIRST_7, 49,
- 49, BROTLI_TRANSFORM_OMIT_LAST_6, 49,
- 49, BROTLI_TRANSFORM_IDENTITY, 21,
- 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 1,
- 49, BROTLI_TRANSFORM_OMIT_LAST_8, 49,
- 49, BROTLI_TRANSFORM_IDENTITY, 31,
- 49, BROTLI_TRANSFORM_IDENTITY, 32,
- 47, BROTLI_TRANSFORM_IDENTITY, 3,
- 49, BROTLI_TRANSFORM_OMIT_LAST_5, 49,
- 49, BROTLI_TRANSFORM_OMIT_LAST_9, 49,
- 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 1,
- 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 8,
- 5, BROTLI_TRANSFORM_IDENTITY, 21,
- 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 0,
- 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 10,
- 49, BROTLI_TRANSFORM_IDENTITY, 30,
- 0, BROTLI_TRANSFORM_IDENTITY, 5,
- 35, BROTLI_TRANSFORM_IDENTITY, 49,
- 47, BROTLI_TRANSFORM_IDENTITY, 2,
- 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 17,
- 49, BROTLI_TRANSFORM_IDENTITY, 36,
- 49, BROTLI_TRANSFORM_IDENTITY, 33,
- 5, BROTLI_TRANSFORM_IDENTITY, 0,
- 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 21,
- 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 5,
- 49, BROTLI_TRANSFORM_IDENTITY, 37,
- 0, BROTLI_TRANSFORM_IDENTITY, 30,
- 49, BROTLI_TRANSFORM_IDENTITY, 38,
- 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 0,
- 49, BROTLI_TRANSFORM_IDENTITY, 39,
- 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 49,
- 49, BROTLI_TRANSFORM_IDENTITY, 34,
- 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 8,
- 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 12,
- 0, BROTLI_TRANSFORM_IDENTITY, 21,
- 49, BROTLI_TRANSFORM_IDENTITY, 40,
- 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 12,
- 49, BROTLI_TRANSFORM_IDENTITY, 41,
- 49, BROTLI_TRANSFORM_IDENTITY, 42,
- 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 17,
- 49, BROTLI_TRANSFORM_IDENTITY, 43,
- 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 5,
- 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 10,
- 0, BROTLI_TRANSFORM_IDENTITY, 34,
- 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 33,
- 49, BROTLI_TRANSFORM_IDENTITY, 44,
- 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 5,
- 45, BROTLI_TRANSFORM_IDENTITY, 49,
- 0, BROTLI_TRANSFORM_IDENTITY, 33,
- 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 30,
- 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 30,
- 49, BROTLI_TRANSFORM_IDENTITY, 46,
- 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 1,
- 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 34,
- 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 33,
- 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 30,
- 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 1,
- 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 33,
- 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 21,
- 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 12,
- 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 5,
- 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 34,
- 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 12,
- 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 30,
- 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 34,
- 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 34,
-};
-
-static BrotliTransforms kBrotliTransforms = {
- sizeof(kPrefixSuffix),
- (const uint8_t*)kPrefixSuffix,
- kPrefixSuffixMap,
- sizeof(kTransformsData) / (3 * sizeof(kTransformsData[0])),
- kTransformsData,
- {0, 12, 27, 23, 42, 63, 56, 48, 59, 64}
-};
-
-const BrotliTransforms* BrotliGetTransforms(void) {
- return &kBrotliTransforms;
-}
-
-static int ToUpperCase(uint8_t* p) {
- if (p[0] < 0xC0) {
- if (p[0] >= 'a' && p[0] <= 'z') {
- p[0] ^= 32;
- }
- return 1;
- }
- /* An overly simplified uppercasing model for UTF-8. */
- if (p[0] < 0xE0) {
- p[1] ^= 32;
- return 2;
- }
- /* An arbitrary transform for three byte characters. */
- p[2] ^= 5;
- return 3;
-}
-
-int BrotliTransformDictionaryWord(uint8_t* dst, const uint8_t* word, int len,
- const BrotliTransforms* transforms, int transfom_idx) {
- int idx = 0;
- const uint8_t* prefix = BROTLI_TRANSFORM_PREFIX(transforms, transfom_idx);
- uint8_t type = BROTLI_TRANSFORM_TYPE(transforms, transfom_idx);
- const uint8_t* suffix = BROTLI_TRANSFORM_SUFFIX(transforms, transfom_idx);
- {
- int prefix_len = *prefix++;
- while (prefix_len--) { dst[idx++] = *prefix++; }
- }
- {
- const int t = type;
- int i = 0;
- if (t <= BROTLI_TRANSFORM_OMIT_LAST_9) {
- len -= t;
- } else if (t >= BROTLI_TRANSFORM_OMIT_FIRST_1
- && t <= BROTLI_TRANSFORM_OMIT_FIRST_9) {
- int skip = t - (BROTLI_TRANSFORM_OMIT_FIRST_1 - 1);
- word += skip;
- len -= skip;
- }
- while (i < len) { dst[idx++] = word[i++]; }
- if (t == BROTLI_TRANSFORM_UPPERCASE_FIRST) {
- ToUpperCase(&dst[idx - len]);
- } else if (t == BROTLI_TRANSFORM_UPPERCASE_ALL) {
- uint8_t* uppercase = &dst[idx - len];
- while (len > 0) {
- int step = ToUpperCase(uppercase);
- uppercase += step;
- len -= step;
- }
- }
- }
- {
- int suffix_len = *suffix++;
- while (suffix_len--) { dst[idx++] = *suffix++; }
- return idx;
- }
-}
-
-#if defined(__cplusplus) || defined(c_plusplus)
-} /* extern "C" */
-#endif
diff --git a/c/common/transform.h b/c/common/transform.h
deleted file mode 100755
index 456c12d..0000000
--- a/c/common/transform.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/* transforms is a part of ABI, but not API.
-
- It means that there are some functions that are supposed to be in "common"
- library, but header itself is not placed into include/brotli. This way,
- aforementioned functions will be available only to brotli internals.
- */
-
-#ifndef BROTLI_COMMON_TRANSFORM_H_
-#define BROTLI_COMMON_TRANSFORM_H_
-
-#include <brotli/port.h>
-#include <brotli/types.h>
-
-#if defined(__cplusplus) || defined(c_plusplus)
-extern "C" {
-#endif
-
-enum BrotliWordTransformType {
- BROTLI_TRANSFORM_IDENTITY = 0,
- BROTLI_TRANSFORM_OMIT_LAST_1 = 1,
- BROTLI_TRANSFORM_OMIT_LAST_2 = 2,
- BROTLI_TRANSFORM_OMIT_LAST_3 = 3,
- BROTLI_TRANSFORM_OMIT_LAST_4 = 4,
- BROTLI_TRANSFORM_OMIT_LAST_5 = 5,
- BROTLI_TRANSFORM_OMIT_LAST_6 = 6,
- BROTLI_TRANSFORM_OMIT_LAST_7 = 7,
- BROTLI_TRANSFORM_OMIT_LAST_8 = 8,
- BROTLI_TRANSFORM_OMIT_LAST_9 = 9,
- BROTLI_TRANSFORM_UPPERCASE_FIRST = 10,
- BROTLI_TRANSFORM_UPPERCASE_ALL = 11,
- BROTLI_TRANSFORM_OMIT_FIRST_1 = 12,
- BROTLI_TRANSFORM_OMIT_FIRST_2 = 13,
- BROTLI_TRANSFORM_OMIT_FIRST_3 = 14,
- BROTLI_TRANSFORM_OMIT_FIRST_4 = 15,
- BROTLI_TRANSFORM_OMIT_FIRST_5 = 16,
- BROTLI_TRANSFORM_OMIT_FIRST_6 = 17,
- BROTLI_TRANSFORM_OMIT_FIRST_7 = 18,
- BROTLI_TRANSFORM_OMIT_FIRST_8 = 19,
- BROTLI_TRANSFORM_OMIT_FIRST_9 = 20,
- BROTLI_NUM_TRANSFORM_TYPES /* Counts transforms, not a transform itself. */
-};
-
-#define BROTLI_TRANSFORMS_MAX_CUT_OFF BROTLI_TRANSFORM_OMIT_LAST_9
-
-typedef struct BrotliTransforms {
- uint16_t prefix_suffix_size;
- /* Last character must be null, so prefix_suffix_size must be at least 1. */
- const uint8_t* prefix_suffix;
- const uint16_t* prefix_suffix_map;
- uint32_t num_transforms;
- /* Each entry is a [prefix_id, transform, suffix_id] triplet. */
- const uint8_t* transforms;
- /* Indices of transforms like ["", BROTLI_TRANSFORM_OMIT_LAST_#, ""].
- 0-th element corresponds to ["", BROTLI_TRANSFORM_IDENTITY, ""].
- -1, if cut-off transform does not exist. */
- int16_t cutOffTransforms[BROTLI_TRANSFORMS_MAX_CUT_OFF + 1];
-} BrotliTransforms;
-
-/* T is BrotliTransforms*; result is uint8_t. */
-#define BROTLI_TRANSFORM_PREFIX_ID(T, I) ((T)->transforms[((I) * 3) + 0])
-#define BROTLI_TRANSFORM_TYPE(T, I) ((T)->transforms[((I) * 3) + 1])
-#define BROTLI_TRANSFORM_SUFFIX_ID(T, I) ((T)->transforms[((I) * 3) + 2])
-
-/* T is BrotliTransforms*; result is const uint8_t*. */
-#define BROTLI_TRANSFORM_PREFIX(T, I) (&(T)->prefix_suffix[ \
- (T)->prefix_suffix_map[BROTLI_TRANSFORM_PREFIX_ID(T, I)]])
-#define BROTLI_TRANSFORM_SUFFIX(T, I) (&(T)->prefix_suffix[ \
- (T)->prefix_suffix_map[BROTLI_TRANSFORM_SUFFIX_ID(T, I)]])
-
-BROTLI_COMMON_API const BrotliTransforms* BrotliGetTransforms(void);
-
-BROTLI_COMMON_API int BrotliTransformDictionaryWord(
- uint8_t* dst, const uint8_t* word, int len,
- const BrotliTransforms* transforms, int transform_idx);
-
-#if defined(__cplusplus) || defined(c_plusplus)
-} /* extern "C" */
-#endif
-
-#endif /* BROTLI_COMMON_TRANSFORM_H_ */
diff --git a/c/common/version.h b/c/common/version.h
index f787d06..c63f685 100644..100755
--- a/c/common/version.h
+++ b/c/common/version.h
@@ -14,13 +14,6 @@
BrotliEncoderVersion methods. */
/* Semantic version, calculated as (MAJOR << 24) | (MINOR << 12) | PATCH */
-#define BROTLI_VERSION 0x1000005
-
-/* This macro is used by build system to produce Libtool-friendly soname. See
- https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html
- */
-
-/* ABI version, calculated as (CURRENT << 24) | (REVISION << 12) | AGE */
-#define BROTLI_ABI_VERSION 0x1005000
+#define BROTLI_VERSION 0x1000001
#endif /* BROTLI_COMMON_VERSION_H_ */
diff --git a/c/dec/bit_reader.c b/c/dec/bit_reader.c
index 722fd90..9925ba4 100644
--- a/c/dec/bit_reader.c
+++ b/c/dec/bit_reader.c
@@ -8,8 +8,8 @@
#include "./bit_reader.h"
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
diff --git a/c/dec/bit_reader.h b/c/dec/bit_reader.h
index c06e914..30e6761 100644
--- a/c/dec/bit_reader.h
+++ b/c/dec/bit_reader.h
@@ -11,16 +11,16 @@
#include <string.h> /* memcpy */
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
-#define BROTLI_SHORT_FILL_BIT_WINDOW_READ (sizeof(brotli_reg_t) >> 1)
+#define BROTLI_SHORT_FILL_BIT_WINDOW_READ (sizeof(reg_t) >> 1)
-static const uint32_t kBitMask[33] = { 0x00000000,
+static const uint32_t kBitMask[33] = { 0x0000,
0x00000001, 0x00000003, 0x00000007, 0x0000000F,
0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,
0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF,
@@ -32,24 +32,24 @@ static const uint32_t kBitMask[33] = { 0x00000000,
};
static BROTLI_INLINE uint32_t BitMask(uint32_t n) {
- if (BROTLI_IS_CONSTANT(n) || BROTLI_HAS_UBFX) {
+ if (IS_CONSTANT(n) || BROTLI_HAS_UBFX) {
/* Masking with this expression turns to a single
"Unsigned Bit Field Extract" UBFX instruction on ARM. */
- return ~((0xFFFFFFFFu) << n);
+ return ~((0xffffffffU) << n);
} else {
return kBitMask[n];
}
}
typedef struct {
- brotli_reg_t val_; /* pre-fetched bits */
+ reg_t val_; /* pre-fetched bits */
uint32_t bit_pos_; /* current bit-reading position in val_ */
const uint8_t* next_in; /* the byte we're reading from */
size_t avail_in;
} BrotliBitReader;
typedef struct {
- brotli_reg_t val_;
+ reg_t val_;
uint32_t bit_pos_;
const uint8_t* next_in;
size_t avail_in;
@@ -58,9 +58,8 @@ typedef struct {
/* Initializes the BrotliBitReader fields. */
BROTLI_INTERNAL void BrotliInitBitReader(BrotliBitReader* const br);
-/* Ensures that accumulator is not empty.
- May consume up to sizeof(brotli_reg_t) - 1 bytes of input.
- Returns BROTLI_FALSE if data is required but there is no input available.
+/* Ensures that accumulator is not empty. May consume one byte of input.
+ Returns 0 if data is required but there is no input available.
For BROTLI_ALIGNED_READ this function also prepares bit reader for aligned
reading. */
BROTLI_INTERNAL BROTLI_BOOL BrotliWarmupBitReader(BrotliBitReader* const br);
@@ -99,27 +98,82 @@ static BROTLI_INLINE BROTLI_BOOL BrotliCheckInputAmount(
return TO_BROTLI_BOOL(br->avail_in >= num);
}
-/* Guarantees that there are at least |n_bits| + 1 bits in accumulator.
+static BROTLI_INLINE uint16_t BrotliLoad16LE(const uint8_t* in) {
+ if (BROTLI_LITTLE_ENDIAN) {
+ return *((const uint16_t*)in);
+ } else if (BROTLI_BIG_ENDIAN) {
+ uint16_t value = *((const uint16_t*)in);
+ return (uint16_t)(((value & 0xFFU) << 8) | ((value & 0xFF00U) >> 8));
+ } else {
+ return (uint16_t)(in[0] | (in[1] << 8));
+ }
+}
+
+static BROTLI_INLINE uint32_t BrotliLoad32LE(const uint8_t* in) {
+ if (BROTLI_LITTLE_ENDIAN) {
+ return *((const uint32_t*)in);
+ } else if (BROTLI_BIG_ENDIAN) {
+ uint32_t value = *((const uint32_t*)in);
+ return ((value & 0xFFU) << 24) | ((value & 0xFF00U) << 8) |
+ ((value & 0xFF0000U) >> 8) | ((value & 0xFF000000U) >> 24);
+ } else {
+ uint32_t value = (uint32_t)(*(in++));
+ value |= (uint32_t)(*(in++)) << 8;
+ value |= (uint32_t)(*(in++)) << 16;
+ value |= (uint32_t)(*(in++)) << 24;
+ return value;
+ }
+}
+
+#if (BROTLI_64_BITS)
+static BROTLI_INLINE uint64_t BrotliLoad64LE(const uint8_t* in) {
+ if (BROTLI_LITTLE_ENDIAN) {
+ return *((const uint64_t*)in);
+ } else if (BROTLI_BIG_ENDIAN) {
+ uint64_t value = *((const uint64_t*)in);
+ return
+ ((value & 0xFFU) << 56) |
+ ((value & 0xFF00U) << 40) |
+ ((value & 0xFF0000U) << 24) |
+ ((value & 0xFF000000U) << 8) |
+ ((value & 0xFF00000000U) >> 8) |
+ ((value & 0xFF0000000000U) >> 24) |
+ ((value & 0xFF000000000000U) >> 40) |
+ ((value & 0xFF00000000000000U) >> 56);
+ } else {
+ uint64_t value = (uint64_t)(*(in++));
+ value |= (uint64_t)(*(in++)) << 8;
+ value |= (uint64_t)(*(in++)) << 16;
+ value |= (uint64_t)(*(in++)) << 24;
+ value |= (uint64_t)(*(in++)) << 32;
+ value |= (uint64_t)(*(in++)) << 40;
+ value |= (uint64_t)(*(in++)) << 48;
+ value |= (uint64_t)(*(in++)) << 56;
+ return value;
+ }
+}
+#endif
+
+/* Guarantees that there are at least n_bits + 1 bits in accumulator.
Precondition: accumulator contains at least 1 bit.
- |n_bits| should be in the range [1..24] for regular build. For portable
+ n_bits should be in the range [1..24] for regular build. For portable
non-64-bit little-endian build only 16 bits are safe to request. */
static BROTLI_INLINE void BrotliFillBitWindow(
BrotliBitReader* const br, uint32_t n_bits) {
#if (BROTLI_64_BITS)
- if (!BROTLI_ALIGNED_READ && BROTLI_IS_CONSTANT(n_bits) && (n_bits <= 8)) {
+ if (!BROTLI_ALIGNED_READ && IS_CONSTANT(n_bits) && (n_bits <= 8)) {
if (br->bit_pos_ >= 56) {
br->val_ >>= 56;
br->bit_pos_ ^= 56; /* here same as -= 56 because of the if condition */
- br->val_ |= BROTLI_UNALIGNED_LOAD64LE(br->next_in) << 8;
+ br->val_ |= BrotliLoad64LE(br->next_in) << 8;
br->avail_in -= 7;
br->next_in += 7;
}
- } else if (
- !BROTLI_ALIGNED_READ && BROTLI_IS_CONSTANT(n_bits) && (n_bits <= 16)) {
+ } else if (!BROTLI_ALIGNED_READ && IS_CONSTANT(n_bits) && (n_bits <= 16)) {
if (br->bit_pos_ >= 48) {
br->val_ >>= 48;
br->bit_pos_ ^= 48; /* here same as -= 48 because of the if condition */
- br->val_ |= BROTLI_UNALIGNED_LOAD64LE(br->next_in) << 16;
+ br->val_ |= BrotliLoad64LE(br->next_in) << 16;
br->avail_in -= 6;
br->next_in += 6;
}
@@ -127,17 +181,17 @@ static BROTLI_INLINE void BrotliFillBitWindow(
if (br->bit_pos_ >= 32) {
br->val_ >>= 32;
br->bit_pos_ ^= 32; /* here same as -= 32 because of the if condition */
- br->val_ |= ((uint64_t)BROTLI_UNALIGNED_LOAD32LE(br->next_in)) << 32;
+ br->val_ |= ((uint64_t)BrotliLoad32LE(br->next_in)) << 32;
br->avail_in -= BROTLI_SHORT_FILL_BIT_WINDOW_READ;
br->next_in += BROTLI_SHORT_FILL_BIT_WINDOW_READ;
}
}
#else
- if (!BROTLI_ALIGNED_READ && BROTLI_IS_CONSTANT(n_bits) && (n_bits <= 8)) {
+ if (!BROTLI_ALIGNED_READ && IS_CONSTANT(n_bits) && (n_bits <= 8)) {
if (br->bit_pos_ >= 24) {
br->val_ >>= 24;
br->bit_pos_ ^= 24; /* here same as -= 24 because of the if condition */
- br->val_ |= BROTLI_UNALIGNED_LOAD32LE(br->next_in) << 8;
+ br->val_ |= BrotliLoad32LE(br->next_in) << 8;
br->avail_in -= 3;
br->next_in += 3;
}
@@ -145,7 +199,7 @@ static BROTLI_INLINE void BrotliFillBitWindow(
if (br->bit_pos_ >= 16) {
br->val_ >>= 16;
br->bit_pos_ ^= 16; /* here same as -= 16 because of the if condition */
- br->val_ |= ((uint32_t)BROTLI_UNALIGNED_LOAD16LE(br->next_in)) << 16;
+ br->val_ |= ((uint32_t)BrotliLoad16LE(br->next_in)) << 16;
br->avail_in -= BROTLI_SHORT_FILL_BIT_WINDOW_READ;
br->next_in += BROTLI_SHORT_FILL_BIT_WINDOW_READ;
}
@@ -159,8 +213,7 @@ static BROTLI_INLINE void BrotliFillBitWindow16(BrotliBitReader* const br) {
BrotliFillBitWindow(br, 17);
}
-/* Tries to pull one byte of input to accumulator.
- Returns BROTLI_FALSE if there is no input available. */
+/* Pulls one byte of input to accumulator. */
static BROTLI_INLINE BROTLI_BOOL BrotliPullByte(BrotliBitReader* const br) {
if (br->avail_in == 0) {
return BROTLI_FALSE;
@@ -179,8 +232,7 @@ static BROTLI_INLINE BROTLI_BOOL BrotliPullByte(BrotliBitReader* const br) {
/* Returns currently available bits.
The number of valid bits could be calculated by BrotliGetAvailableBits. */
-static BROTLI_INLINE brotli_reg_t BrotliGetBitsUnmasked(
- BrotliBitReader* const br) {
+static BROTLI_INLINE reg_t BrotliGetBitsUnmasked(BrotliBitReader* const br) {
return br->val_ >> br->bit_pos_;
}
@@ -192,16 +244,15 @@ static BROTLI_INLINE uint32_t BrotliGet16BitsUnmasked(
return (uint32_t)BrotliGetBitsUnmasked(br);
}
-/* Returns the specified number of bits from |br| without advancing bit
- position. */
+/* Returns the specified number of bits from |br| without advancing bit pos. */
static BROTLI_INLINE uint32_t BrotliGetBits(
BrotliBitReader* const br, uint32_t n_bits) {
BrotliFillBitWindow(br, n_bits);
return (uint32_t)BrotliGetBitsUnmasked(br) & BitMask(n_bits);
}
-/* Tries to peek the specified amount of bits. Returns BROTLI_FALSE, if there
- is not enough input. */
+/* Tries to peek the specified amount of bits. Returns 0, if there is not
+ enough input. */
static BROTLI_INLINE BROTLI_BOOL BrotliSafeGetBits(
BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) {
while (BrotliGetAvailableBits(br) < n_bits) {
@@ -213,7 +264,7 @@ static BROTLI_INLINE BROTLI_BOOL BrotliSafeGetBits(
return BROTLI_TRUE;
}
-/* Advances the bit pos by |n_bits|. */
+/* Advances the bit pos by n_bits. */
static BROTLI_INLINE void BrotliDropBits(
BrotliBitReader* const br, uint32_t n_bits) {
br->bit_pos_ += n_bits;
@@ -233,12 +284,12 @@ static BROTLI_INLINE void BrotliBitReaderUnload(BrotliBitReader* br) {
}
/* Reads the specified number of bits from |br| and advances the bit pos.
- Precondition: accumulator MUST contain at least |n_bits|. */
+ Precondition: accumulator MUST contain at least n_bits. */
static BROTLI_INLINE void BrotliTakeBits(
BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) {
*val = (uint32_t)BrotliGetBitsUnmasked(br) & BitMask(n_bits);
BROTLI_LOG(("[BrotliReadBits] %d %d %d val: %6x\n",
- (int)br->avail_in, (int)br->bit_pos_, (int)n_bits, (int)*val));
+ (int)br->avail_in, (int)br->bit_pos_, n_bits, (int)*val));
BrotliDropBits(br, n_bits);
}
@@ -262,8 +313,8 @@ static BROTLI_INLINE uint32_t BrotliReadBits(
}
}
-/* Tries to read the specified amount of bits. Returns BROTLI_FALSE, if there
- is not enough input. |n_bits| MUST be positive. */
+/* Tries to read the specified amount of bits. Returns 0, if there is not
+ enough input. n_bits MUST be positive. */
static BROTLI_INLINE BROTLI_BOOL BrotliSafeReadBits(
BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) {
while (BrotliGetAvailableBits(br) < n_bits) {
@@ -287,7 +338,7 @@ static BROTLI_INLINE BROTLI_BOOL BrotliJumpToByteBoundary(BrotliBitReader* br) {
}
/* Copies remaining input bytes stored in the bit reader to the output. Value
- |num| may not be larger than BrotliGetRemainingBytes. The bit reader must be
+ num may not be larger than BrotliGetRemainingBytes. The bit reader must be
warmed up again after this. */
static BROTLI_INLINE void BrotliCopyBytes(uint8_t* dest,
BrotliBitReader* br, size_t num) {
diff --git a/c/common/context.h b/c/dec/context.h
index 24b3eb4..9402cbe 100755..100644
--- a/c/common/context.h
+++ b/c/dec/context.h
@@ -6,171 +6,110 @@
/* Lookup table to map the previous two bytes to a context id.
- There are four different context modeling modes defined here:
- CONTEXT_LSB6: context id is the least significant 6 bits of the last byte,
- CONTEXT_MSB6: context id is the most significant 6 bits of the last byte,
- CONTEXT_UTF8: second-order context model tuned for UTF8-encoded text,
- CONTEXT_SIGNED: second-order context model tuned for signed integers.
-
- If |p1| and |p2| are the previous two bytes, and |mode| is current context
- mode, we calculate the context as:
-
- context = ContextLut(mode)[p1] | ContextLut(mode)[p2 + 256].
-
- For CONTEXT_UTF8 mode, if the previous two bytes are ASCII characters
- (i.e. < 128), this will be equivalent to
-
- context = 4 * context1(p1) + context2(p2),
-
- where context1 is based on the previous byte in the following way:
-
- 0 : non-ASCII control
- 1 : \t, \n, \r
- 2 : space
- 3 : other punctuation
- 4 : " '
- 5 : %
- 6 : ( < [ {
- 7 : ) > ] }
- 8 : , ; :
- 9 : .
- 10 : =
- 11 : number
- 12 : upper-case vowel
- 13 : upper-case consonant
- 14 : lower-case vowel
- 15 : lower-case consonant
-
- and context2 is based on the second last byte:
-
- 0 : control, space
- 1 : punctuation
- 2 : upper-case letter, number
- 3 : lower-case letter
-
- If the last byte is ASCII, and the second last byte is not (in a valid UTF8
- stream it will be a continuation byte, value between 128 and 191), the
- context is the same as if the second last byte was an ASCII control or space.
-
- If the last byte is a UTF8 lead byte (value >= 192), then the next byte will
- be a continuation byte and the context id is 2 or 3 depending on the LSB of
- the last byte and to a lesser extent on the second last byte if it is ASCII.
-
- If the last byte is a UTF8 continuation byte, the second last byte can be:
- - continuation byte: the next byte is probably ASCII or lead byte (assuming
- 4-byte UTF8 characters are rare) and the context id is 0 or 1.
- - lead byte (192 - 207): next byte is ASCII or lead byte, context is 0 or 1
- - lead byte (208 - 255): next byte is continuation byte, context is 2 or 3
-
- The possible value combinations of the previous two bytes, the range of
- context ids and the type of the next byte is summarized in the table below:
-
- |--------\-----------------------------------------------------------------|
- | \ Last byte |
- | Second \---------------------------------------------------------------|
- | last byte \ ASCII | cont. byte | lead byte |
- | \ (0-127) | (128-191) | (192-) |
- |=============|===================|=====================|==================|
- | ASCII | next: ASCII/lead | not valid | next: cont. |
- | (0-127) | context: 4 - 63 | | context: 2 - 3 |
- |-------------|-------------------|---------------------|------------------|
- | cont. byte | next: ASCII/lead | next: ASCII/lead | next: cont. |
- | (128-191) | context: 4 - 63 | context: 0 - 1 | context: 2 - 3 |
- |-------------|-------------------|---------------------|------------------|
- | lead byte | not valid | next: ASCII/lead | not valid |
- | (192-207) | | context: 0 - 1 | |
- |-------------|-------------------|---------------------|------------------|
- | lead byte | not valid | next: cont. | not valid |
- | (208-) | | context: 2 - 3 | |
- |-------------|-------------------|---------------------|------------------|
+ There are four different context modeling modes defined here:
+ CONTEXT_LSB6: context id is the least significant 6 bits of the last byte,
+ CONTEXT_MSB6: context id is the most significant 6 bits of the last byte,
+ CONTEXT_UTF8: second-order context model tuned for UTF8-encoded text,
+ CONTEXT_SIGNED: second-order context model tuned for signed integers.
+
+ The context id for the UTF8 context model is calculated as follows. If p1
+ and p2 are the previous two bytes, we calculate the context as
+
+ context = kContextLookup[p1] | kContextLookup[p2 + 256].
+
+ If the previous two bytes are ASCII characters (i.e. < 128), this will be
+ equivalent to
+
+ context = 4 * context1(p1) + context2(p2),
+
+ where context1 is based on the previous byte in the following way:
+
+ 0 : non-ASCII control
+ 1 : \t, \n, \r
+ 2 : space
+ 3 : other punctuation
+ 4 : " '
+ 5 : %
+ 6 : ( < [ {
+ 7 : ) > ] }
+ 8 : , ; :
+ 9 : .
+ 10 : =
+ 11 : number
+ 12 : upper-case vowel
+ 13 : upper-case consonant
+ 14 : lower-case vowel
+ 15 : lower-case consonant
+
+ and context2 is based on the second last byte:
+
+ 0 : control, space
+ 1 : punctuation
+ 2 : upper-case letter, number
+ 3 : lower-case letter
+
+ If the last byte is ASCII, and the second last byte is not (in a valid UTF8
+ stream it will be a continuation byte, value between 128 and 191), the
+ context is the same as if the second last byte was an ASCII control or space.
+
+ If the last byte is a UTF8 lead byte (value >= 192), then the next byte will
+ be a continuation byte and the context id is 2 or 3 depending on the LSB of
+ the last byte and to a lesser extent on the second last byte if it is ASCII.
+
+ If the last byte is a UTF8 continuation byte, the second last byte can be:
+ - continuation byte: the next byte is probably ASCII or lead byte (assuming
+ 4-byte UTF8 characters are rare) and the context id is 0 or 1.
+ - lead byte (192 - 207): next byte is ASCII or lead byte, context is 0 or 1
+ - lead byte (208 - 255): next byte is continuation byte, context is 2 or 3
+
+ The possible value combinations of the previous two bytes, the range of
+ context ids and the type of the next byte is summarized in the table below:
+
+ |--------\-----------------------------------------------------------------|
+ | \ Last byte |
+ | Second \---------------------------------------------------------------|
+ | last byte \ ASCII | cont. byte | lead byte |
+ | \ (0-127) | (128-191) | (192-) |
+ |=============|===================|=====================|==================|
+ | ASCII | next: ASCII/lead | not valid | next: cont. |
+ | (0-127) | context: 4 - 63 | | context: 2 - 3 |
+ |-------------|-------------------|---------------------|------------------|
+ | cont. byte | next: ASCII/lead | next: ASCII/lead | next: cont. |
+ | (128-191) | context: 4 - 63 | context: 0 - 1 | context: 2 - 3 |
+ |-------------|-------------------|---------------------|------------------|
+ | lead byte | not valid | next: ASCII/lead | not valid |
+ | (192-207) | | context: 0 - 1 | |
+ |-------------|-------------------|---------------------|------------------|
+ | lead byte | not valid | next: cont. | not valid |
+ | (208-) | | context: 2 - 3 | |
+ |-------------|-------------------|---------------------|------------------|
+
+ The context id for the signed context mode is calculated as:
+
+ context = (kContextLookup[512 + p1] << 3) | kContextLookup[512 + p2].
+
+ For any context modeling modes, the context ids can be calculated by |-ing
+ together two lookups from one table using context model dependent offsets:
+
+ context = kContextLookup[offset1 + p1] | kContextLookup[offset2 + p2].
+
+ where offset1 and offset2 are dependent on the context mode.
*/
-#ifndef BROTLI_COMMON_CONTEXT_H_
-#define BROTLI_COMMON_CONTEXT_H_
+#ifndef BROTLI_DEC_CONTEXT_H_
+#define BROTLI_DEC_CONTEXT_H_
#include <brotli/types.h>
-typedef enum ContextType {
+enum ContextType {
CONTEXT_LSB6 = 0,
CONTEXT_MSB6 = 1,
CONTEXT_UTF8 = 2,
CONTEXT_SIGNED = 3
-} ContextType;
+};
/* Common context lookup table for all context modes. */
-static const uint8_t kContextLookup[2048] = {
- /* CONTEXT_LSB6, last byte. */
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
-
- /* CONTEXT_LSB6, second last byte, */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
- /* CONTEXT_MSB6, last byte. */
- 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
- 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7,
- 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11,
- 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15,
- 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19,
- 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23,
- 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27,
- 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
- 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35,
- 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39,
- 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43,
- 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47,
- 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51,
- 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55,
- 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59,
- 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63,
-
- /* CONTEXT_MSB6, second last byte, */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
+static const uint8_t kContextLookup[1792] = {
/* CONTEXT_UTF8, last byte. */
/* ASCII range. */
0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 4, 0, 0,
@@ -191,7 +130,6 @@ static const uint8_t kContextLookup[2048] = {
2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
-
/* CONTEXT_UTF8 second last byte. */
/* ASCII range. */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -212,25 +150,6 @@ static const uint8_t kContextLookup[2048] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-
- /* CONTEXT_SIGNED, last byte, same as the above values shifted by 3 bits. */
- 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
- 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
- 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56,
-
/* CONTEXT_SIGNED, second last byte. */
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
@@ -248,14 +167,85 @@ static const uint8_t kContextLookup[2048] = {
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7,
+ /* CONTEXT_SIGNED, last byte, same as the above values shifted by 3 bits. */
+ 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56,
+ /* CONTEXT_LSB6, last byte. */
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+ /* CONTEXT_MSB6, last byte. */
+ 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
+ 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7,
+ 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11,
+ 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15,
+ 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19,
+ 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23,
+ 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27,
+ 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
+ 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35,
+ 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39,
+ 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43,
+ 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47,
+ 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51,
+ 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55,
+ 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59,
+ 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63,
+ /* CONTEXT_{M,L}SB6, second last byte, */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
-typedef const uint8_t* ContextLut;
-
-/* typeof(MODE) == ContextType; returns ContextLut */
-#define BROTLI_CONTEXT_LUT(MODE) (&kContextLookup[(MODE) << 9])
-
-/* typeof(LUT) == ContextLut */
-#define BROTLI_CONTEXT(P1, P2, LUT) ((LUT)[P1] | ((LUT) + 256)[P2])
+static const int kContextLookupOffsets[8] = {
+ /* CONTEXT_LSB6 */
+ 1024, 1536,
+ /* CONTEXT_MSB6 */
+ 1280, 1536,
+ /* CONTEXT_UTF8 */
+ 0, 256,
+ /* CONTEXT_SIGNED */
+ 768, 512,
+};
-#endif /* BROTLI_COMMON_CONTEXT_H_ */
+#endif /* BROTLI_DEC_CONTEXT_H_ */
diff --git a/c/dec/decode.c b/c/dec/decode.c
index 674b829..be8de42 100644
--- a/c/dec/decode.c
+++ b/c/dec/decode.c
@@ -6,7 +6,7 @@
#include <brotli/decode.h>
-#if defined(__ARM_NEON__)
+#ifdef __ARM_NEON__
#include <arm_neon.h>
#endif
@@ -14,15 +14,15 @@
#include <string.h> /* memcpy, memset */
#include "../common/constants.h"
-#include "../common/context.h"
#include "../common/dictionary.h"
-#include "../common/platform.h"
-#include "../common/transform.h"
#include "../common/version.h"
#include "./bit_reader.h"
+#include "./context.h"
#include "./huffman.h"
+#include "./port.h"
#include "./prefix.h"
#include "./state.h"
+#include "./transform.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -37,7 +37,7 @@ extern "C" {
(unsigned long)(idx), (unsigned long)array_name[idx]))
#define HUFFMAN_TABLE_BITS 8U
-#define HUFFMAN_TABLE_MASK 0xFF
+#define HUFFMAN_TABLE_MASK 0xff
/* We need the slack region for the following reasons:
- doing up to two 16-byte copies for fast backward copying
@@ -59,16 +59,11 @@ static const uint8_t kCodeLengthPrefixValue[16] = {
BROTLI_BOOL BrotliDecoderSetParameter(
BrotliDecoderState* state, BrotliDecoderParameter p, uint32_t value) {
- if (state->state != BROTLI_STATE_UNINITED) return BROTLI_FALSE;
switch (p) {
case BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:
state->canny_ringbuffer_allocation = !!value ? 0 : 1;
return BROTLI_TRUE;
- case BROTLI_DECODER_PARAM_LARGE_WINDOW:
- state->large_window = TO_BROTLI_BOOL(!!value);
- return BROTLI_TRUE;
-
default: return BROTLI_FALSE;
}
}
@@ -85,15 +80,8 @@ BrotliDecoderState* BrotliDecoderCreateInstance(
BROTLI_DUMP();
return 0;
}
- if (!BrotliDecoderStateInit(state, alloc_func, free_func, opaque)) {
- BROTLI_DUMP();
- if (!alloc_func && !free_func) {
- free(state);
- } else if (alloc_func && free_func) {
- free_func(opaque, state);
- }
- return 0;
- }
+ BrotliDecoderStateInitWithCustomAllocators(
+ state, alloc_func, free_func, opaque);
return state;
}
@@ -109,61 +97,39 @@ void BrotliDecoderDestroyInstance(BrotliDecoderState* state) {
}
}
-/* Saves error code and converts it to BrotliDecoderResult. */
+/* Saves error code and converts it to BrotliDecoderResult */
static BROTLI_NOINLINE BrotliDecoderResult SaveErrorCode(
BrotliDecoderState* s, BrotliDecoderErrorCode e) {
s->error_code = (int)e;
switch (e) {
case BROTLI_DECODER_SUCCESS:
return BROTLI_DECODER_RESULT_SUCCESS;
-
case BROTLI_DECODER_NEEDS_MORE_INPUT:
return BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT;
-
case BROTLI_DECODER_NEEDS_MORE_OUTPUT:
return BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT;
-
default:
return BROTLI_DECODER_RESULT_ERROR;
}
}
-/* Decodes WBITS by reading 1 - 7 bits, or 0x11 for "Large Window Brotli".
- Precondition: bit-reader accumulator has at least 8 bits. */
-static BrotliDecoderErrorCode DecodeWindowBits(BrotliDecoderState* s,
- BrotliBitReader* br) {
+/* Decodes a number in the range [9..24], by reading 1 - 7 bits.
+ Precondition: bit-reader accumulator has at least 7 bits. */
+static uint32_t DecodeWindowBits(BrotliBitReader* br) {
uint32_t n;
- BROTLI_BOOL large_window = s->large_window;
- s->large_window = BROTLI_FALSE;
BrotliTakeBits(br, 1, &n);
if (n == 0) {
- s->window_bits = 16;
- return BROTLI_DECODER_SUCCESS;
+ return 16;
}
BrotliTakeBits(br, 3, &n);
if (n != 0) {
- s->window_bits = 17 + n;
- return BROTLI_DECODER_SUCCESS;
+ return 17 + n;
}
BrotliTakeBits(br, 3, &n);
- if (n == 1) {
- if (large_window) {
- BrotliTakeBits(br, 1, &n);
- if (n == 1) {
- return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS);
- }
- s->large_window = BROTLI_TRUE;
- return BROTLI_DECODER_SUCCESS;
- } else {
- return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS);
- }
- }
if (n != 0) {
- s->window_bits = 8 + n;
- return BROTLI_DECODER_SUCCESS;
+ return 8 + n;
}
- s->window_bits = 17;
- return BROTLI_DECODER_SUCCESS;
+ return 17;
}
static BROTLI_INLINE void memmove16(uint8_t* dst, uint8_t* src) {
@@ -189,7 +155,7 @@ static BROTLI_NOINLINE BrotliDecoderErrorCode DecodeVarLenUint8(
*value = 0;
return BROTLI_DECODER_SUCCESS;
}
- /* Fall through. */
+ /* No break, transit to the next state. */
case BROTLI_STATE_DECODE_UINT8_SHORT:
if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 3, &bits))) {
@@ -203,7 +169,7 @@ static BROTLI_NOINLINE BrotliDecoderErrorCode DecodeVarLenUint8(
}
/* Use output value as a temporary storage. It MUST be persisted. */
*value = bits;
- /* Fall through. */
+ /* No break, transit to the next state. */
case BROTLI_STATE_DECODE_UINT8_LONG:
if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, *value, &bits))) {
@@ -240,7 +206,7 @@ static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
break;
}
s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_EMPTY;
- /* Fall through. */
+ /* No break, transit to the next state. */
case BROTLI_STATE_METABLOCK_HEADER_EMPTY:
if (!BrotliSafeReadBits(br, 1, &bits)) {
@@ -251,7 +217,7 @@ static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
return BROTLI_DECODER_SUCCESS;
}
s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
- /* Fall through. */
+ /* No break, transit to the next state. */
case BROTLI_STATE_METABLOCK_HEADER_NIBBLES:
if (!BrotliSafeReadBits(br, 2, &bits)) {
@@ -265,7 +231,7 @@ static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
break;
}
s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_SIZE;
- /* Fall through. */
+ /* No break, transit to the next state. */
case BROTLI_STATE_METABLOCK_HEADER_SIZE:
i = s->loop_counter;
@@ -281,7 +247,7 @@ static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
}
s->substate_metablock_header =
BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED;
- /* Fall through. */
+ /* No break, transit to the next state. */
case BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED:
if (!s->is_last_metablock) {
@@ -302,7 +268,7 @@ static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_RESERVED);
}
s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_BYTES;
- /* Fall through. */
+ /* No break, transit to the next state. */
case BROTLI_STATE_METABLOCK_HEADER_BYTES:
if (!BrotliSafeReadBits(br, 2, &bits)) {
@@ -314,7 +280,7 @@ static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
}
s->size_nibbles = (uint8_t)bits;
s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_METADATA;
- /* Fall through. */
+ /* No break, transit to the next state. */
case BROTLI_STATE_METABLOCK_HEADER_METADATA:
i = s->loop_counter;
@@ -376,7 +342,7 @@ static BROTLI_NOINLINE BROTLI_BOOL SafeDecodeSymbol(
*result = table->value;
return BROTLI_TRUE;
}
- return BROTLI_FALSE; /* No valid bits at all. */
+ return BROTLI_FALSE; /* No valid bits at all. */
}
val = (uint32_t)BrotliGetBitsUnmasked(br);
table += val & HUFFMAN_TABLE_MASK;
@@ -386,11 +352,11 @@ static BROTLI_NOINLINE BROTLI_BOOL SafeDecodeSymbol(
*result = table->value;
return BROTLI_TRUE;
} else {
- return BROTLI_FALSE; /* Not enough bits for the first level. */
+ return BROTLI_FALSE; /* Not enough bits for the first level. */
}
}
if (available_bits <= HUFFMAN_TABLE_BITS) {
- return BROTLI_FALSE; /* Not enough bits to move to the second level. */
+ return BROTLI_FALSE; /* Not enough bits to move to the second level. */
}
/* Speculatively drop HUFFMAN_TABLE_BITS. */
@@ -398,7 +364,7 @@ static BROTLI_NOINLINE BROTLI_BOOL SafeDecodeSymbol(
available_bits -= HUFFMAN_TABLE_BITS;
table += table->value + val;
if (available_bits < table->bits) {
- return BROTLI_FALSE; /* Not enough bits for the second level. */
+ return BROTLI_FALSE; /* Not enough bits for the second level. */
}
BrotliDropBits(br, HUFFMAN_TABLE_BITS + table->bits);
@@ -462,11 +428,12 @@ static BROTLI_INLINE uint32_t Log2Floor(uint32_t x) {
}
/* Reads (s->symbol + 1) symbols.
- Totally 1..4 symbols are read, 1..11 bits each.
- The list of symbols MUST NOT contain duplicates. */
+ Totally 1..4 symbols are read, 1..10 bits each.
+ The list of symbols MUST NOT contain duplicates.
+ */
static BrotliDecoderErrorCode ReadSimpleHuffmanSymbols(
- uint32_t alphabet_size, uint32_t max_symbol, BrotliDecoderState* s) {
- /* max_bits == 1..11; symbol == 0..3; 1..44 bits will be read. */
+ uint32_t alphabet_size, BrotliDecoderState* s) {
+ /* max_bits == 1..10; symbol == 0..3; 1..40 bits will be read. */
BrotliBitReader* br = &s->br;
uint32_t max_bits = Log2Floor(alphabet_size - 1);
uint32_t i = s->sub_loop_counter;
@@ -478,7 +445,7 @@ static BrotliDecoderErrorCode ReadSimpleHuffmanSymbols(
s->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_READ;
return BROTLI_DECODER_NEEDS_MORE_INPUT;
}
- if (v >= max_symbol) {
+ if (v >= alphabet_size) {
return
BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET);
}
@@ -504,20 +471,20 @@ static BrotliDecoderErrorCode ReadSimpleHuffmanSymbols(
B) remember code length (if it is not 0)
C) extend corresponding index-chain
D) reduce the Huffman space
- E) update the histogram */
+ E) update the histogram
+ */
static BROTLI_INLINE void ProcessSingleCodeLength(uint32_t code_len,
uint32_t* symbol, uint32_t* repeat, uint32_t* space,
uint32_t* prev_code_len, uint16_t* symbol_lists,
uint16_t* code_length_histo, int* next_symbol) {
*repeat = 0;
- if (code_len != 0) { /* code_len == 1..15 */
+ if (code_len != 0) { /* code_len == 1..15 */
symbol_lists[next_symbol[code_len]] = (uint16_t)(*symbol);
next_symbol[code_len] = (int)(*symbol);
*prev_code_len = code_len;
*space -= 32768U >> code_len;
code_length_histo[code_len]++;
- BROTLI_LOG(("[ReadHuffmanCode] code_length[%d] = %d\n",
- (int)*symbol, (int)code_len));
+ BROTLI_LOG(("[ReadHuffmanCode] code_length[%d] = %d\n", *symbol, code_len));
}
(*symbol)++;
}
@@ -531,7 +498,8 @@ static BROTLI_INLINE void ProcessSingleCodeLength(uint32_t code_len,
D) For each symbol do the same operations as in ProcessSingleCodeLength
PRECONDITION: code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH or
- code_len == BROTLI_REPEAT_ZERO_CODE_LENGTH */
+ code_len == BROTLI_REPEAT_ZERO_CODE_LENGTH
+ */
static BROTLI_INLINE void ProcessRepeatedCodeLength(uint32_t code_len,
uint32_t repeat_delta, uint32_t alphabet_size, uint32_t* symbol,
uint32_t* repeat, uint32_t* space, uint32_t* prev_code_len,
@@ -562,7 +530,7 @@ static BROTLI_INLINE void ProcessRepeatedCodeLength(uint32_t code_len,
return;
}
BROTLI_LOG(("[ReadHuffmanCode] code_length[%d..%d] = %d\n",
- (int)*symbol, (int)(*symbol + repeat_delta - 1), (int)*repeat_code_len));
+ *symbol, *symbol + repeat_delta - 1, *repeat_code_len));
if (*repeat_code_len != 0) {
unsigned last = *symbol + repeat_delta;
int next = next_symbol[*repeat_code_len];
@@ -608,12 +576,12 @@ static BrotliDecoderErrorCode ReadSymbolCodeLengths(
BrotliFillBitWindow16(br);
p += BrotliGetBitsUnmasked(br) &
BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH);
- BrotliDropBits(br, p->bits); /* Use 1..5 bits. */
+ BrotliDropBits(br, p->bits); /* Use 1..5 bits */
code_len = p->value; /* code_len == 0..17 */
if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
ProcessSingleCodeLength(code_len, &symbol, &repeat, &space,
&prev_code_len, symbol_lists, code_length_histo, next_symbol);
- } else { /* code_len == 16..17, extra_bits == 2..3 */
+ } else { /* code_len == 16..17, extra_bits == 2..3 */
uint32_t extra_bits =
(code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) ? 2 : 3;
uint32_t repeat_delta =
@@ -648,13 +616,13 @@ static BrotliDecoderErrorCode SafeReadSymbolCodeLengths(
get_byte = BROTLI_TRUE;
continue;
}
- code_len = p->value; /* code_len == 0..17 */
+ code_len = p->value; /* code_len == 0..17 */
if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
BrotliDropBits(br, p->bits);
ProcessSingleCodeLength(code_len, &s->symbol, &s->repeat, &s->space,
&s->prev_code_len, s->symbol_lists, s->code_length_histo,
s->next_symbol);
- } else { /* code_len == 16..17, extra_bits == 2..3 */
+ } else { /* code_len == 16..17, extra_bits == 2..3 */
uint32_t extra_bits = code_len - 14U;
uint32_t repeat_delta = (bits >> p->bits) & BitMask(extra_bits);
if (available_bits < p->bits + extra_bits) {
@@ -706,7 +674,7 @@ static BrotliDecoderErrorCode ReadCodeLengthCodeLengths(BrotliDecoderState* s) {
++num_codes;
++s->code_length_histo[v];
if (space - 1U >= 32U) {
- /* space is 0 or wrapped around. */
+ /* space is 0 or wrapped around */
break;
}
}
@@ -721,22 +689,22 @@ static BrotliDecoderErrorCode ReadCodeLengthCodeLengths(BrotliDecoderState* s) {
There are 2 scenarios:
A) Huffman code contains only few symbols (1..4). Those symbols are read
directly; their code lengths are defined by the number of symbols.
- For this scenario 4 - 49 bits will be read.
+ For this scenario 4 - 45 bits will be read.
B) 2-phase decoding:
B.1) Small Huffman table is decoded; it is specified with code lengths
encoded with predefined entropy code. 32 - 74 bits are used.
B.2) Decoded table is used to decode code lengths of symbols in resulting
- Huffman table. In worst case 3520 bits are read. */
+ Huffman table. In worst case 3520 bits are read.
+*/
static BrotliDecoderErrorCode ReadHuffmanCode(uint32_t alphabet_size,
- uint32_t max_symbol,
HuffmanCode* table,
uint32_t* opt_table_size,
BrotliDecoderState* s) {
BrotliBitReader* br = &s->br;
/* Unnecessary masking, but might be good for safety. */
- alphabet_size &= 0x7FF;
- /* State machine. */
+ alphabet_size &= 0x3ff;
+ /* State machine */
for (;;) {
switch (s->substate_huffman) {
case BROTLI_STATE_HUFFMAN_NONE:
@@ -749,7 +717,7 @@ static BrotliDecoderErrorCode ReadHuffmanCode(uint32_t alphabet_size,
0 for no skipping, 2 skips 2 code lengths, 3 skips 3 code lengths */
if (s->sub_loop_counter != 1) {
s->space = 32;
- s->repeat = 0; /* num_codes */
+ s->repeat = 0; /* num_codes */
memset(&s->code_length_histo[0], 0, sizeof(s->code_length_histo[0]) *
(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH + 1));
memset(&s->code_length_code_lengths[0], 0,
@@ -757,26 +725,24 @@ static BrotliDecoderErrorCode ReadHuffmanCode(uint32_t alphabet_size,
s->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
continue;
}
- /* Fall through. */
+ /* No break, transit to the next state. */
case BROTLI_STATE_HUFFMAN_SIMPLE_SIZE:
/* Read symbols, codes & code lengths directly. */
- if (!BrotliSafeReadBits(br, 2, &s->symbol)) { /* num_symbols */
+ if (!BrotliSafeReadBits(br, 2, &s->symbol)) { /* num_symbols */
s->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_SIZE;
return BROTLI_DECODER_NEEDS_MORE_INPUT;
}
s->sub_loop_counter = 0;
- /* Fall through. */
-
+ /* No break, transit to the next state. */
case BROTLI_STATE_HUFFMAN_SIMPLE_READ: {
BrotliDecoderErrorCode result =
- ReadSimpleHuffmanSymbols(alphabet_size, max_symbol, s);
+ ReadSimpleHuffmanSymbols(alphabet_size, s);
if (result != BROTLI_DECODER_SUCCESS) {
return result;
}
+ /* No break, transit to the next state. */
}
- /* Fall through. */
-
case BROTLI_STATE_HUFFMAN_SIMPLE_BUILD: {
uint32_t table_size;
if (s->symbol == 3) {
@@ -819,21 +785,20 @@ static BrotliDecoderErrorCode ReadHuffmanCode(uint32_t alphabet_size,
s->repeat_code_len = 0;
s->space = 32768;
s->substate_huffman = BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS;
+ /* No break, transit to the next state. */
}
- /* Fall through. */
-
case BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS: {
uint32_t table_size;
- BrotliDecoderErrorCode result = ReadSymbolCodeLengths(max_symbol, s);
+ BrotliDecoderErrorCode result = ReadSymbolCodeLengths(alphabet_size, s);
if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
- result = SafeReadSymbolCodeLengths(max_symbol, s);
+ result = SafeReadSymbolCodeLengths(alphabet_size, s);
}
if (result != BROTLI_DECODER_SUCCESS) {
return result;
}
if (s->space != 0) {
- BROTLI_LOG(("[ReadHuffmanCode] space = %d\n", (int)s->space));
+ BROTLI_LOG(("[ReadHuffmanCode] space = %d\n", s->space));
return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE);
}
table_size = BrotliBuildHuffmanTable(
@@ -858,7 +823,7 @@ static BROTLI_INLINE uint32_t ReadBlockLength(const HuffmanCode* table,
uint32_t code;
uint32_t nbits;
code = ReadSymbol(table, br);
- nbits = kBlockLengthPrefixCode[code].nbits; /* nbits == 2..24 */
+ nbits = kBlockLengthPrefixCode[code].nbits; /* nbits == 2..24 */
return kBlockLengthPrefixCode[code].offset + BrotliReadBits(br, nbits);
}
@@ -877,7 +842,7 @@ static BROTLI_INLINE BROTLI_BOOL SafeReadBlockLength(
}
{
uint32_t bits;
- uint32_t nbits = kBlockLengthPrefixCode[index].nbits; /* nbits == 2..24 */
+ uint32_t nbits = kBlockLengthPrefixCode[index].nbits; /* nbits == 2..24 */
if (!BrotliSafeReadBits(br, nbits, &bits)) {
s->block_length_index = index;
s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX;
@@ -902,7 +867,8 @@ static BROTLI_INLINE BROTLI_BOOL SafeReadBlockLength(
of Y values, and reinitialize only first elements in L.
Most of input values are 0 and 1. To reduce number of branches, we replace
- inner for loop with do-while. */
+ inner for loop with do-while.
+ */
static BROTLI_NOINLINE void InverseMoveToFrontTransform(
uint8_t* v, uint32_t v_len, BrotliDecoderState* state) {
/* Reinitialize elements that could have been changed. */
@@ -918,7 +884,7 @@ static BROTLI_NOINLINE void InverseMoveToFrontTransform(
/* Initialize list using 4 consequent values pattern. */
mtf[0] = pattern;
do {
- pattern += 0x04040404; /* Advance all 4 values by 4. */
+ pattern += 0x04040404; /* Advance all 4 values by 4. */
mtf[i] = pattern;
i++;
} while (i <= upper_bound);
@@ -951,8 +917,7 @@ static BrotliDecoderErrorCode HuffmanTreeGroupDecode(
while (s->htree_index < group->num_htrees) {
uint32_t table_size;
BrotliDecoderErrorCode result =
- ReadHuffmanCode(group->alphabet_size, group->max_symbol,
- s->next, &table_size, s);
+ ReadHuffmanCode(group->alphabet_size, s->next, &table_size, s);
if (result != BROTLI_DECODER_SUCCESS) return result;
group->htrees[s->htree_index] = s->next;
s->next += table_size;
@@ -969,7 +934,8 @@ static BrotliDecoderErrorCode HuffmanTreeGroupDecode(
2) Decode Huffman table using ReadHuffmanCode function.
This table will be used for reading context map items.
3) Read context map items; "0" values could be run-length encoded.
- 4) Optionally, apply InverseMoveToFront transform to the resulting map. */
+ 4) Optionally, apply InverseMoveToFront transform to the resulting map.
+ */
static BrotliDecoderErrorCode DecodeContextMap(uint32_t context_map_size,
uint32_t* num_htrees,
uint8_t** context_map_arg,
@@ -987,8 +953,7 @@ static BrotliDecoderErrorCode DecodeContextMap(uint32_t context_map_size,
s->context_index = 0;
BROTLI_LOG_UINT(context_map_size);
BROTLI_LOG_UINT(*num_htrees);
- *context_map_arg =
- (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)context_map_size);
+ *context_map_arg = (uint8_t*)BROTLI_ALLOC(s, (size_t)context_map_size);
if (*context_map_arg == 0) {
return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP);
}
@@ -997,8 +962,7 @@ static BrotliDecoderErrorCode DecodeContextMap(uint32_t context_map_size,
return BROTLI_DECODER_SUCCESS;
}
s->substate_context_map = BROTLI_STATE_CONTEXT_MAP_READ_PREFIX;
- /* Fall through. */
-
+ /* No break, continue to next state. */
case BROTLI_STATE_CONTEXT_MAP_READ_PREFIX: {
uint32_t bits;
/* In next stage ReadHuffmanCode uses at least 4 bits, so it is safe
@@ -1015,19 +979,15 @@ static BrotliDecoderErrorCode DecodeContextMap(uint32_t context_map_size,
}
BROTLI_LOG_UINT(s->max_run_length_prefix);
s->substate_context_map = BROTLI_STATE_CONTEXT_MAP_HUFFMAN;
+ /* No break, continue to next state. */
}
- /* Fall through. */
-
- case BROTLI_STATE_CONTEXT_MAP_HUFFMAN: {
- uint32_t alphabet_size = *num_htrees + s->max_run_length_prefix;
- result = ReadHuffmanCode(alphabet_size, alphabet_size,
+ case BROTLI_STATE_CONTEXT_MAP_HUFFMAN:
+ result = ReadHuffmanCode(*num_htrees + s->max_run_length_prefix,
s->context_map_table, NULL, s);
if (result != BROTLI_DECODER_SUCCESS) return result;
s->code = 0xFFFF;
s->substate_context_map = BROTLI_STATE_CONTEXT_MAP_DECODE;
- }
- /* Fall through. */
-
+ /* No break, continue to next state. */
case BROTLI_STATE_CONTEXT_MAP_DECODE: {
uint32_t context_index = s->context_index;
uint32_t max_run_length_prefix = s->max_run_length_prefix;
@@ -1074,9 +1034,8 @@ static BrotliDecoderErrorCode DecodeContextMap(uint32_t context_map_size,
} while (--reps);
}
}
+ /* No break, continue to next state. */
}
- /* Fall through. */
-
case BROTLI_STATE_CONTEXT_MAP_TRANSFORM: {
uint32_t bits;
if (!BrotliSafeReadBits(br, 1, &bits)) {
@@ -1089,7 +1048,6 @@ static BrotliDecoderErrorCode DecodeContextMap(uint32_t context_map_size,
s->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
return BROTLI_DECODER_SUCCESS;
}
-
default:
return
BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);
@@ -1108,11 +1066,8 @@ static BROTLI_INLINE BROTLI_BOOL DecodeBlockTypeAndLength(
BrotliBitReader* br = &s->br;
uint32_t* ringbuffer = &s->block_type_rb[tree_type * 2];
uint32_t block_type;
- if (max_block_type <= 1) {
- return BROTLI_FALSE;
- }
- /* Read 0..15 + 3..39 bits. */
+ /* Read 0..15 + 3..39 bits */
if (!safe) {
block_type = ReadSymbol(type_tree, br);
s->block_length[tree_type] = ReadBlockLength(len_tree, br);
@@ -1169,8 +1124,9 @@ static BROTLI_INLINE void PrepareLiteralDecoding(BrotliDecoderState* s) {
trivial = s->trivial_literal_contexts[block_type >> 5];
s->trivial_literal_context = (trivial >> (block_type & 31)) & 1;
s->literal_htree = s->literal_hgroup.htrees[s->context_map_slice[0]];
- context_mode = s->context_modes[block_type] & 3;
- s->context_lookup = BROTLI_CONTEXT_LUT(context_mode);
+ context_mode = s->context_modes[block_type];
+ s->context_lookup1 = &kContextLookup[kContextLookupOffsets[context_mode]];
+ s->context_lookup2 = &kContextLookup[kContextLookupOffsets[context_mode + 1]];
}
/* Decodes the block type and updates the state for literal context.
@@ -1207,7 +1163,6 @@ static BROTLI_INLINE BROTLI_BOOL DecodeCommandBlockSwitchInternal(
static void BROTLI_NOINLINE DecodeCommandBlockSwitch(BrotliDecoderState* s) {
DecodeCommandBlockSwitchInternal(0, s);
}
-
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeCommandBlockSwitch(
BrotliDecoderState* s) {
return DecodeCommandBlockSwitchInternal(1, s);
@@ -1244,7 +1199,8 @@ static size_t UnwrittenBytes(const BrotliDecoderState* s, BROTLI_BOOL wrap) {
/* Dumps output.
Returns BROTLI_DECODER_NEEDS_MORE_OUTPUT only if there is more output to push
- and either ring-buffer is as big as window size, or |force| is true. */
+ and either ring-buffer is as big as window size, or |force| is true.
+ */
static BrotliDecoderErrorCode BROTLI_NOINLINE WriteRingBuffer(
BrotliDecoderState* s, size_t* available_out, uint8_t** next_out,
size_t* total_out, BROTLI_BOOL force) {
@@ -1303,7 +1259,8 @@ static void BROTLI_NOINLINE WrapRingBuffer(BrotliDecoderState* s) {
this function is called.
Last two bytes of ring-buffer are initialized to 0, so context calculation
- could be done uniformly for the first two and all other positions. */
+ could be done uniformly for the first two and all other positions.
+*/
static BROTLI_BOOL BROTLI_NOINLINE BrotliEnsureRingBuffer(
BrotliDecoderState* s) {
uint8_t* old_ringbuffer = s->ringbuffer;
@@ -1311,8 +1268,8 @@ static BROTLI_BOOL BROTLI_NOINLINE BrotliEnsureRingBuffer(
return BROTLI_TRUE;
}
- s->ringbuffer = (uint8_t*)BROTLI_DECODER_ALLOC(s,
- (size_t)(s->new_ringbuffer_size) + kRingBufferWriteAheadSlack);
+ s->ringbuffer = (uint8_t*)BROTLI_ALLOC(s, (size_t)(s->new_ringbuffer_size) +
+ kRingBufferWriteAheadSlack);
if (s->ringbuffer == 0) {
/* Restore previous value. */
s->ringbuffer = old_ringbuffer;
@@ -1323,7 +1280,7 @@ static BROTLI_BOOL BROTLI_NOINLINE BrotliEnsureRingBuffer(
if (!!old_ringbuffer) {
memcpy(s->ringbuffer, old_ringbuffer, (size_t)s->pos);
- BROTLI_DECODER_FREE(s, old_ringbuffer);
+ BROTLI_FREE(s, old_ringbuffer);
}
s->ringbuffer_size = s->new_ringbuffer_size;
@@ -1363,9 +1320,8 @@ static BrotliDecoderErrorCode BROTLI_NOINLINE CopyUncompressedBlockToOutput(
return BROTLI_DECODER_NEEDS_MORE_INPUT;
}
s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_WRITE;
+ /* No break, continue to next state */
}
- /* Fall through. */
-
case BROTLI_STATE_UNCOMPRESSED_WRITE: {
BrotliDecoderErrorCode result;
result = WriteRingBuffer(
@@ -1389,7 +1345,8 @@ static BrotliDecoderErrorCode BROTLI_NOINLINE CopyUncompressedBlockToOutput(
If we know the data size is small, do not allocate more ring buffer
size than needed to reduce memory usage.
- When this method is called, metablock size and flags MUST be decoded. */
+ When this method is called, metablock size and flags MUST be decoded.
+*/
static void BROTLI_NOINLINE BrotliCalculateRingBufferSize(
BrotliDecoderState* s) {
int window_size = 1 << s->window_bits;
@@ -1420,7 +1377,7 @@ static void BROTLI_NOINLINE BrotliCalculateRingBufferSize(
if (!!s->canny_ringbuffer_allocation) {
/* Reduce ring buffer size to save memory when server is unscrupulous.
In worst case memory usage might be 1.5x bigger for a short period of
- ring buffer reallocation. */
+ ring buffer reallocation.*/
while ((new_ringbuffer_size >> 1) >= min_size) {
new_ringbuffer_size >>= 1;
}
@@ -1440,7 +1397,7 @@ static BrotliDecoderErrorCode ReadContextModes(BrotliDecoderState* s) {
s->loop_counter = i;
return BROTLI_DECODER_NEEDS_MORE_INPUT;
}
- s->context_modes[i] = (uint8_t)bits;
+ s->context_modes[i] = (uint8_t)(bits << 1);
BROTLI_LOG_ARRAY_INDEX(s->context_modes, i);
i++;
}
@@ -1455,12 +1412,12 @@ static BROTLI_INLINE void TakeDistanceFromRingBuffer(BrotliDecoderState* s) {
s->distance_context = 1;
} else {
int distance_code = s->distance_code << 1;
- /* kDistanceShortCodeIndexOffset has 2-bit values from LSB:
- 3, 2, 1, 0, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2 */
- const uint32_t kDistanceShortCodeIndexOffset = 0xAAAFFF1B;
- /* kDistanceShortCodeValueOffset has 2-bit values from LSB:
- -0, 0,-0, 0,-1, 1,-2, 2,-3, 3,-1, 1,-2, 2,-3, 3 */
- const uint32_t kDistanceShortCodeValueOffset = 0xFA5FA500;
+ /* kDistanceShortCodeIndexOffset has 2-bit values from LSB: */
+ /* 3, 2, 1, 0, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2 */
+ const uint32_t kDistanceShortCodeIndexOffset = 0xaaafff1b;
+ /* kDistanceShortCodeValueOffset has 2-bit values from LSB: */
+ /*-0, 0,-0, 0,-1, 1,-2, 2,-3, 3,-1, 1,-2, 2,-3, 3 */
+ const uint32_t kDistanceShortCodeValueOffset = 0xfa5fa500;
int v = (s->dist_rb_idx +
(int)(kDistanceShortCodeIndexOffset >> distance_code)) & 0x3;
s->distance_code = s->dist_rb[v];
@@ -1470,9 +1427,9 @@ static BROTLI_INLINE void TakeDistanceFromRingBuffer(BrotliDecoderState* s) {
} else {
s->distance_code -= v;
if (s->distance_code <= 0) {
- /* A huge distance will cause a BROTLI_FAILURE() soon.
- This is a little faster than failing here. */
- s->distance_code = 0x7FFFFFFF;
+ /* A huge distance will cause a BROTLI_FAILURE() soon. */
+ /* This is a little faster than failing here. */
+ s->distance_code = 0x0fffffff;
}
}
}
@@ -1488,7 +1445,7 @@ static BROTLI_INLINE BROTLI_BOOL SafeReadBits(
}
}
-/* Precondition: s->distance_code < 0. */
+/* Precondition: s->distance_code < 0 */
static BROTLI_INLINE BROTLI_BOOL ReadDistanceInternal(
int safe, BrotliDecoderState* s, BrotliBitReader* br) {
int distval;
@@ -1504,10 +1461,10 @@ static BROTLI_INLINE BROTLI_BOOL ReadDistanceInternal(
}
s->distance_code = (int)code;
}
- /* Convert the distance code to the actual distance by possibly
- looking up past distances from the s->ringbuffer. */
+ /* Convert the distance code to the actual distance by possibly */
+ /* looking up past distances from the s->ringbuffer. */
s->distance_context = 0;
- if ((s->distance_code & ~0xF) == 0) {
+ if ((s->distance_code & ~0xf) == 0) {
TakeDistanceFromRingBuffer(s);
--s->block_length[2];
return BROTLI_TRUE;
@@ -1523,14 +1480,14 @@ static BROTLI_INLINE BROTLI_BOOL ReadDistanceInternal(
s->distance_code = (int)s->num_direct_distance_codes + offset +
(int)BrotliReadBits(br, nbits);
} else {
- /* This branch also works well when s->distance_postfix_bits == 0. */
+ /* This branch also works well when s->distance_postfix_bits == 0 */
uint32_t bits;
postfix = distval & s->distance_postfix_mask;
distval >>= s->distance_postfix_bits;
nbits = ((uint32_t)distval >> 1) + 1;
if (safe) {
if (!SafeReadBits(br, nbits, &bits)) {
- s->distance_code = -1; /* Restore precondition. */
+ s->distance_code = -1; /* Restore precondition. */
BrotliBitReaderRestoreState(br, &memento);
return BROTLI_FALSE;
}
@@ -1657,7 +1614,7 @@ CommandBegin:
if (safe) {
s->state = BROTLI_STATE_COMMAND_BEGIN;
}
- if (!CheckInputAmount(safe, br, 28)) { /* 156 bits + 7 bytes */
+ if (!CheckInputAmount(safe, br, 28)) { /* 156 bits + 7 bytes */
s->state = BROTLI_STATE_COMMAND_BEGIN;
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
goto saveStateAndReturn;
@@ -1666,7 +1623,7 @@ CommandBegin:
BROTLI_SAFE(DecodeCommandBlockSwitch(s));
goto CommandBegin;
}
- /* Read the insert/copy length in the command. */
+ /* Read the insert/copy length in the command */
BROTLI_SAFE(ReadCommand(s, br, &i));
BROTLI_LOG(("[ProcessCommandsInternal] pos = %d insert = %d copy = %d\n",
pos, i, s->copy_length));
@@ -1679,13 +1636,13 @@ CommandInner:
if (safe) {
s->state = BROTLI_STATE_COMMAND_INNER;
}
- /* Read the literals in the command. */
+ /* Read the literals in the command */
if (s->trivial_literal_context) {
uint32_t bits;
uint32_t value;
PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
do {
- if (!CheckInputAmount(safe, br, 28)) { /* 162 bits + 7 bytes */
+ if (!CheckInputAmount(safe, br, 28)) { /* 162 bits + 7 bytes */
s->state = BROTLI_STATE_COMMAND_INNER;
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
goto saveStateAndReturn;
@@ -1721,7 +1678,7 @@ CommandInner:
do {
const HuffmanCode* hc;
uint8_t context;
- if (!CheckInputAmount(safe, br, 28)) { /* 162 bits + 7 bytes */
+ if (!CheckInputAmount(safe, br, 28)) { /* 162 bits + 7 bytes */
s->state = BROTLI_STATE_COMMAND_INNER;
result = BROTLI_DECODER_NEEDS_MORE_INPUT;
goto saveStateAndReturn;
@@ -1730,7 +1687,7 @@ CommandInner:
BROTLI_SAFE(DecodeLiteralBlockSwitch(s));
if (s->trivial_literal_context) goto CommandInner;
}
- context = BROTLI_CONTEXT(p1, p2, s->context_lookup);
+ context = s->context_lookup1[p1] | s->context_lookup2[p2];
BROTLI_LOG_UINT(context);
hc = s->literal_hgroup.htrees[s->context_map_slice[context]];
p2 = p1;
@@ -1786,44 +1743,32 @@ CommandPostDecodeLiterals:
}
i = s->copy_length;
/* Apply copy of LZ77 back-reference, or static dictionary reference if
- the distance is larger than the max LZ77 distance */
+ the distance is larger than the max LZ77 distance */
if (s->distance_code > s->max_distance) {
- /* The maximum allowed distance is BROTLI_MAX_ALLOWED_DISTANCE = 0x7FFFFFFC.
- With this choice, no signed overflow can occur after decoding
- a special distance code (e.g., after adding 3 to the last distance). */
- if (s->distance_code > BROTLI_MAX_ALLOWED_DISTANCE) {
- BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
- "len: %d bytes left: %d\n",
- pos, s->distance_code, i, s->meta_block_remaining_len));
- return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DISTANCE);
- }
+ int address = s->distance_code - s->max_distance - 1;
if (i >= BROTLI_MIN_DICTIONARY_WORD_LENGTH &&
i <= BROTLI_MAX_DICTIONARY_WORD_LENGTH) {
- int address = s->distance_code - s->max_distance - 1;
- const BrotliDictionary* words = s->dictionary;
- const BrotliTransforms* transforms = s->transforms;
int offset = (int)s->dictionary->offsets_by_length[i];
uint32_t shift = s->dictionary->size_bits_by_length[i];
-
int mask = (int)BitMask(shift);
int word_idx = address & mask;
int transform_idx = address >> shift;
/* Compensate double distance-ring-buffer roll. */
s->dist_rb_idx += s->distance_context;
offset += word_idx * i;
- if (BROTLI_PREDICT_FALSE(!words->data)) {
+ if (BROTLI_PREDICT_FALSE(!s->dictionary->data)) {
return BROTLI_FAILURE(BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET);
}
- if (transform_idx < (int)transforms->num_transforms) {
- const uint8_t* word = &words->data[offset];
+ if (transform_idx < kNumTransforms) {
+ const uint8_t* word = &s->dictionary->data[offset];
int len = i;
- if (transform_idx == transforms->cutOffTransforms[0]) {
+ if (transform_idx == 0) {
memcpy(&s->ringbuffer[pos], word, (size_t)len);
BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s]\n",
len, word));
} else {
- len = BrotliTransformDictionaryWord(&s->ringbuffer[pos], word, len,
- transforms, transform_idx);
+ len = TransformDictionaryWord(
+ &s->ringbuffer[pos], word, len, transform_idx);
BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s],"
" transform_idx = %d, transformed: [%.*s]\n",
i, word, transform_idx, len, &s->ringbuffer[pos]));
@@ -1831,6 +1776,7 @@ CommandPostDecodeLiterals:
pos += len;
s->meta_block_remaining_len -= len;
if (pos >= s->ringbuffer_size) {
+ /*s->partial_pos_rb += (size_t)s->ringbuffer_size;*/
s->state = BROTLI_STATE_COMMAND_POST_WRITE_1;
goto saveStateAndReturn;
}
@@ -1852,13 +1798,14 @@ CommandPostDecodeLiterals:
uint8_t* copy_src = &s->ringbuffer[src_start];
int dst_end = pos + i;
int src_end = src_start + i;
- /* Update the recent distances cache. */
+ /* update the recent distances cache */
s->dist_rb[s->dist_rb_idx & 3] = s->distance_code;
++s->dist_rb_idx;
s->meta_block_remaining_len -= i;
/* There are 32+ bytes of slack in the ring-buffer allocation.
Also, we have 16 short codes, that make these 16 bytes irrelevant
- in the ring-buffer. Let's copy over them as a first guess. */
+ in the ring-buffer. Let's copy over them as a first guess.
+ */
memmove16(copy_dst, copy_src);
if (src_end > pos && dst_end > src_start) {
/* Regions intersect. */
@@ -1881,7 +1828,7 @@ CommandPostDecodeLiterals:
}
BROTLI_LOG_UINT(s->meta_block_remaining_len);
if (s->meta_block_remaining_len <= 0) {
- /* Next metablock, if any. */
+ /* Next metablock, if any */
s->state = BROTLI_STATE_METABLOCK_DONE;
goto saveStateAndReturn;
} else {
@@ -1901,7 +1848,7 @@ CommandPostWrapCopy:
}
}
if (s->meta_block_remaining_len <= 0) {
- /* Next metablock, if any. */
+ /* Next metablock, if any */
s->state = BROTLI_STATE_METABLOCK_DONE;
goto saveStateAndReturn;
} else {
@@ -1926,21 +1873,6 @@ static BROTLI_NOINLINE BrotliDecoderErrorCode SafeProcessCommands(
return ProcessCommandsInternal(1, s);
}
-/* Returns the maximum number of distance symbols which can only represent
- distances not exceeding BROTLI_MAX_ALLOWED_DISTANCE. */
-static uint32_t BrotliMaxDistanceSymbol(uint32_t ndirect, uint32_t npostfix) {
- static const uint32_t bound[BROTLI_MAX_NPOSTFIX + 1] = {0, 4, 12, 28};
- static const uint32_t diff[BROTLI_MAX_NPOSTFIX + 1] = {73, 126, 228, 424};
- uint32_t postfix = 1U << npostfix;
- if (ndirect < bound[npostfix]) {
- return ndirect + diff[npostfix] + postfix;
- } else if (ndirect > bound[npostfix] + postfix) {
- return ndirect + diff[npostfix];
- } else {
- return bound[npostfix] + diff[npostfix] + postfix;
- }
-}
-
BrotliDecoderResult BrotliDecoderDecompress(
size_t encoded_size, const uint8_t* encoded_buffer, size_t* decoded_size,
uint8_t* decoded_buffer) {
@@ -1951,9 +1883,7 @@ BrotliDecoderResult BrotliDecoderDecompress(
const uint8_t* next_in = encoded_buffer;
size_t available_out = *decoded_size;
uint8_t* next_out = decoded_buffer;
- if (!BrotliDecoderStateInit(&s, 0, 0, 0)) {
- return BROTLI_DECODER_RESULT_ERROR;
- }
+ BrotliDecoderStateInit(&s);
result = BrotliDecoderDecompressStream(
&s, &available_in, &next_in, &available_out, &next_out, &total_out);
*decoded_size = total_out;
@@ -1965,25 +1895,22 @@ BrotliDecoderResult BrotliDecoderDecompress(
}
/* Invariant: input stream is never overconsumed:
- - invalid input implies that the whole stream is invalid -> any amount of
+ * invalid input implies that the whole stream is invalid -> any amount of
input could be read and discarded
- - when result is "needs more input", then at least one more byte is REQUIRED
+ * when result is "needs more input", then at least one more byte is REQUIRED
to complete decoding; all input data MUST be consumed by decoder, so
client could swap the input buffer
- - when result is "needs more output" decoder MUST ensure that it doesn't
+ * when result is "needs more output" decoder MUST ensure that it doesn't
hold more than 7 bits in bit reader; this saves client from swapping input
buffer ahead of time
- - when result is "success" decoder MUST return all unused data back to input
- buffer; this is possible because the invariant is held on enter */
+ * when result is "success" decoder MUST return all unused data back to input
+ buffer; this is possible because the invariant is hold on enter
+*/
BrotliDecoderResult BrotliDecoderDecompressStream(
BrotliDecoderState* s, size_t* available_in, const uint8_t** next_in,
size_t* available_out, uint8_t** next_out, size_t* total_out) {
BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
BrotliBitReader* br = &s->br;
- /* Ensure that |total_out| is set, even if no data will ever be pushed out. */
- if (total_out) {
- *total_out = s->partial_pos_out;
- }
/* Do not try to process further in a case of unrecoverable error. */
if ((int)s->error_code < 0) {
return BROTLI_DECODER_RESULT_ERROR;
@@ -1993,7 +1920,7 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
s, BROTLI_FAILURE(BROTLI_DECODER_ERROR_INVALID_ARGUMENTS));
}
if (!*available_out) next_out = 0;
- if (s->buffer_length == 0) { /* Just connect bit reader to input stream. */
+ if (s->buffer_length == 0) { /* Just connect bit reader to input stream. */
br->avail_in = *available_in;
br->next_in = *next_in;
} else {
@@ -2005,10 +1932,9 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
}
/* State machine */
for (;;) {
- if (result != BROTLI_DECODER_SUCCESS) {
- /* Error, needs more input/output. */
+ if (result != BROTLI_DECODER_SUCCESS) { /* Error, needs more input/output */
if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
- if (s->ringbuffer != 0) { /* Pro-actively push output. */
+ if (s->ringbuffer != 0) { /* Pro-actively push output. */
BrotliDecoderErrorCode intermediate_result = WriteRingBuffer(s,
available_out, next_out, total_out, BROTLI_TRUE);
/* WriteRingBuffer checks s->meta_block_remaining_len validity. */
@@ -2017,10 +1943,9 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
break;
}
}
- if (s->buffer_length != 0) { /* Used with internal buffer. */
- if (br->avail_in == 0) {
- /* Successfully finished read transaction.
- Accumulator contains less than 8 bits, because internal buffer
+ if (s->buffer_length != 0) { /* Used with internal buffer. */
+ if (br->avail_in == 0) { /* Successfully finished read transaction. */
+ /* Accumulator contains less than 8 bits, because internal buffer
is expanded byte-by-byte until it is enough to complete read. */
s->buffer_length = 0;
/* Switch to input stream and restart. */
@@ -2040,9 +1965,9 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
/* Retry with more data in buffer. */
continue;
}
- /* Can't finish reading and no more input. */
+ /* Can't finish reading and no more input.*/
break;
- } else { /* Input stream doesn't contain enough input. */
+ } else { /* Input stream doesn't contain enough input. */
/* Copy tail to internal buffer and return. */
*next_in = br->next_in;
*available_in = br->avail_in;
@@ -2061,7 +1986,7 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
if (s->buffer_length != 0) {
/* Just consumed the buffered input and produced some output. Otherwise
- it would result in "needs more input". Reset internal buffer. */
+ it would result in "needs more input". Reset internal buffer.*/
s->buffer_length = 0;
} else {
/* Using input stream in last iteration. When decoder switches to input
@@ -2081,37 +2006,18 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
break;
}
/* Decode window size. */
- result = DecodeWindowBits(s, br); /* Reads 1..8 bits. */
- if (result != BROTLI_DECODER_SUCCESS) {
- break;
- }
- if (s->large_window) {
- s->state = BROTLI_STATE_LARGE_WINDOW_BITS;
- break;
- }
- s->state = BROTLI_STATE_INITIALIZE;
- break;
-
- case BROTLI_STATE_LARGE_WINDOW_BITS:
- if (!BrotliSafeReadBits(br, 6, &s->window_bits)) {
- result = BROTLI_DECODER_NEEDS_MORE_INPUT;
- break;
- }
- if (s->window_bits < BROTLI_LARGE_MIN_WBITS ||
- s->window_bits > BROTLI_LARGE_MAX_WBITS) {
+ s->window_bits = DecodeWindowBits(br); /* Reads 1..7 bits. */
+ BROTLI_LOG_UINT(s->window_bits);
+ if (s->window_bits == 9) {
+ /* Value 9 is reserved for future use. */
result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS);
break;
}
- s->state = BROTLI_STATE_INITIALIZE;
- /* Fall through. */
-
- case BROTLI_STATE_INITIALIZE:
- BROTLI_LOG_UINT(s->window_bits);
/* Maximum distance, see section 9.1. of the spec. */
s->max_backward_distance = (1 << s->window_bits) - BROTLI_WINDOW_GAP;
/* Allocate memory for both block_type_trees and block_len_trees. */
- s->block_type_trees = (HuffmanCode*)BROTLI_DECODER_ALLOC(s,
+ s->block_type_trees = (HuffmanCode*)BROTLI_ALLOC(s,
sizeof(HuffmanCode) * 3 *
(BROTLI_HUFFMAN_MAX_SIZE_258 + BROTLI_HUFFMAN_MAX_SIZE_26));
if (s->block_type_trees == 0) {
@@ -2122,16 +2028,14 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
s->block_type_trees + 3 * BROTLI_HUFFMAN_MAX_SIZE_258;
s->state = BROTLI_STATE_METABLOCK_BEGIN;
- /* Fall through. */
-
+ /* No break, continue to next state */
case BROTLI_STATE_METABLOCK_BEGIN:
BrotliDecoderStateMetablockBegin(s);
BROTLI_LOG_UINT(s->pos);
s->state = BROTLI_STATE_METABLOCK_HEADER;
- /* Fall through. */
-
+ /* No break, continue to next state */
case BROTLI_STATE_METABLOCK_HEADER:
- result = DecodeMetaBlockLength(s, br); /* Reads 2 - 31 bits. */
+ result = DecodeMetaBlockLength(s, br); /* Reads 2 - 31 bits. */
if (result != BROTLI_DECODER_SUCCESS) {
break;
}
@@ -2161,7 +2065,6 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
s->loop_counter = 0;
s->state = BROTLI_STATE_HUFFMAN_CODE_0;
break;
-
case BROTLI_STATE_UNCOMPRESSED: {
result = CopyUncompressedBlockToOutput(
available_out, next_out, total_out, s);
@@ -2171,7 +2074,6 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
s->state = BROTLI_STATE_METABLOCK_DONE;
break;
}
-
case BROTLI_STATE_METADATA:
for (; s->meta_block_remaining_len > 0; --s->meta_block_remaining_len) {
uint32_t bits;
@@ -2185,7 +2087,6 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
s->state = BROTLI_STATE_METABLOCK_DONE;
}
break;
-
case BROTLI_STATE_HUFFMAN_CODE_0:
if (s->loop_counter >= 3) {
s->state = BROTLI_STATE_METABLOCK_HEADER_2;
@@ -2203,28 +2104,23 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
break;
}
s->state = BROTLI_STATE_HUFFMAN_CODE_1;
- /* Fall through. */
-
+ /* No break, continue to next state */
case BROTLI_STATE_HUFFMAN_CODE_1: {
- uint32_t alphabet_size = s->num_block_types[s->loop_counter] + 2;
int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_258;
- result = ReadHuffmanCode(alphabet_size, alphabet_size,
+ result = ReadHuffmanCode(s->num_block_types[s->loop_counter] + 2,
&s->block_type_trees[tree_offset], NULL, s);
if (result != BROTLI_DECODER_SUCCESS) break;
s->state = BROTLI_STATE_HUFFMAN_CODE_2;
+ /* No break, continue to next state */
}
- /* Fall through. */
-
case BROTLI_STATE_HUFFMAN_CODE_2: {
- uint32_t alphabet_size = BROTLI_NUM_BLOCK_LEN_SYMBOLS;
int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
- result = ReadHuffmanCode(alphabet_size, alphabet_size,
+ result = ReadHuffmanCode(BROTLI_NUM_BLOCK_LEN_SYMBOLS,
&s->block_len_trees[tree_offset], NULL, s);
if (result != BROTLI_DECODER_SUCCESS) break;
s->state = BROTLI_STATE_HUFFMAN_CODE_3;
+ /* No break, continue to next state */
}
- /* Fall through. */
-
case BROTLI_STATE_HUFFMAN_CODE_3: {
int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
if (!SafeReadBlockLength(s, &s->block_length[s->loop_counter],
@@ -2237,7 +2133,6 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
s->state = BROTLI_STATE_HUFFMAN_CODE_0;
break;
}
-
case BROTLI_STATE_METABLOCK_HEADER_2: {
uint32_t bits;
if (!BrotliSafeReadBits(br, 6, &bits)) {
@@ -2252,24 +2147,22 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
BROTLI_LOG_UINT(s->distance_postfix_bits);
s->distance_postfix_mask = (int)BitMask(s->distance_postfix_bits);
s->context_modes =
- (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)s->num_block_types[0]);
+ (uint8_t*)BROTLI_ALLOC(s, (size_t)s->num_block_types[0]);
if (s->context_modes == 0) {
result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES);
break;
}
s->loop_counter = 0;
s->state = BROTLI_STATE_CONTEXT_MODES;
+ /* No break, continue to next state */
}
- /* Fall through. */
-
case BROTLI_STATE_CONTEXT_MODES:
result = ReadContextModes(s);
if (result != BROTLI_DECODER_SUCCESS) {
break;
}
s->state = BROTLI_STATE_CONTEXT_MAP_1;
- /* Fall through. */
-
+ /* No break, continue to next state */
case BROTLI_STATE_CONTEXT_MAP_1:
result = DecodeContextMap(
s->num_block_types[0] << BROTLI_LITERAL_CONTEXT_BITS,
@@ -2279,54 +2172,54 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
}
DetectTrivialLiteralBlockTypes(s);
s->state = BROTLI_STATE_CONTEXT_MAP_2;
- /* Fall through. */
-
- case BROTLI_STATE_CONTEXT_MAP_2: {
- uint32_t num_direct_codes =
- s->num_direct_distance_codes - BROTLI_NUM_DISTANCE_SHORT_CODES;
- uint32_t num_distance_codes = BROTLI_DISTANCE_ALPHABET_SIZE(
- s->distance_postfix_bits, num_direct_codes,
- (s->large_window ? BROTLI_LARGE_MAX_DISTANCE_BITS :
- BROTLI_MAX_DISTANCE_BITS));
- uint32_t max_distance_symbol = (s->large_window ?
- BrotliMaxDistanceSymbol(
- num_direct_codes, s->distance_postfix_bits) :
- num_distance_codes);
- BROTLI_BOOL allocation_success = BROTLI_TRUE;
- result = DecodeContextMap(
- s->num_block_types[2] << BROTLI_DISTANCE_CONTEXT_BITS,
- &s->num_dist_htrees, &s->dist_context_map, s);
- if (result != BROTLI_DECODER_SUCCESS) {
- break;
- }
- allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
- s, &s->literal_hgroup, BROTLI_NUM_LITERAL_SYMBOLS,
- BROTLI_NUM_LITERAL_SYMBOLS, s->num_literal_htrees);
- allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
- s, &s->insert_copy_hgroup, BROTLI_NUM_COMMAND_SYMBOLS,
- BROTLI_NUM_COMMAND_SYMBOLS, s->num_block_types[1]);
- allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
- s, &s->distance_hgroup, num_distance_codes,
- max_distance_symbol, s->num_dist_htrees);
- if (!allocation_success) {
- return SaveErrorCode(s,
- BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS));
+ /* No break, continue to next state */
+ case BROTLI_STATE_CONTEXT_MAP_2:
+ {
+ uint32_t num_distance_codes = s->num_direct_distance_codes +
+ ((2 * BROTLI_MAX_DISTANCE_BITS) << s->distance_postfix_bits);
+ BROTLI_BOOL allocation_success = BROTLI_TRUE;
+ result = DecodeContextMap(
+ s->num_block_types[2] << BROTLI_DISTANCE_CONTEXT_BITS,
+ &s->num_dist_htrees, &s->dist_context_map, s);
+ if (result != BROTLI_DECODER_SUCCESS) {
+ break;
+ }
+ allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
+ s, &s->literal_hgroup, BROTLI_NUM_LITERAL_SYMBOLS,
+ s->num_literal_htrees);
+ allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
+ s, &s->insert_copy_hgroup, BROTLI_NUM_COMMAND_SYMBOLS,
+ s->num_block_types[1]);
+ allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
+ s, &s->distance_hgroup, num_distance_codes,
+ s->num_dist_htrees);
+ if (!allocation_success) {
+ return SaveErrorCode(s,
+ BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS));
+ }
}
s->loop_counter = 0;
s->state = BROTLI_STATE_TREE_GROUP;
- }
- /* Fall through. */
-
- case BROTLI_STATE_TREE_GROUP: {
- HuffmanTreeGroup* hgroup = NULL;
- switch (s->loop_counter) {
- case 0: hgroup = &s->literal_hgroup; break;
- case 1: hgroup = &s->insert_copy_hgroup; break;
- case 2: hgroup = &s->distance_hgroup; break;
- default: return SaveErrorCode(s, BROTLI_FAILURE(
- BROTLI_DECODER_ERROR_UNREACHABLE));
- }
- result = HuffmanTreeGroupDecode(hgroup, s);
+ /* No break, continue to next state */
+ case BROTLI_STATE_TREE_GROUP:
+ {
+ HuffmanTreeGroup* hgroup = NULL;
+ switch (s->loop_counter) {
+ case 0:
+ hgroup = &s->literal_hgroup;
+ break;
+ case 1:
+ hgroup = &s->insert_copy_hgroup;
+ break;
+ case 2:
+ hgroup = &s->distance_hgroup;
+ break;
+ default:
+ return SaveErrorCode(s, BROTLI_FAILURE(
+ BROTLI_DECODER_ERROR_UNREACHABLE));
+ }
+ result = HuffmanTreeGroupDecode(hgroup, s);
+ }
if (result != BROTLI_DECODER_SUCCESS) break;
s->loop_counter++;
if (s->loop_counter >= 3) {
@@ -2340,25 +2233,17 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
s->state = BROTLI_STATE_COMMAND_BEGIN;
}
break;
- }
-
case BROTLI_STATE_COMMAND_BEGIN:
- /* Fall through. */
case BROTLI_STATE_COMMAND_INNER:
- /* Fall through. */
case BROTLI_STATE_COMMAND_POST_DECODE_LITERALS:
- /* Fall through. */
case BROTLI_STATE_COMMAND_POST_WRAP_COPY:
result = ProcessCommands(s);
if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
result = SafeProcessCommands(s);
}
break;
-
case BROTLI_STATE_COMMAND_INNER_WRITE:
- /* Fall through. */
case BROTLI_STATE_COMMAND_POST_WRITE_1:
- /* Fall through. */
case BROTLI_STATE_COMMAND_POST_WRITE_2:
result = WriteRingBuffer(
s, available_out, next_out, total_out, BROTLI_FALSE);
@@ -2371,7 +2256,7 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
}
if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_1) {
if (s->meta_block_remaining_len == 0) {
- /* Next metablock, if any. */
+ /* Next metablock, if any */
s->state = BROTLI_STATE_METABLOCK_DONE;
} else {
s->state = BROTLI_STATE_COMMAND_BEGIN;
@@ -2391,7 +2276,6 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
s->state = BROTLI_STATE_COMMAND_INNER;
}
break;
-
case BROTLI_STATE_METABLOCK_DONE:
if (s->meta_block_remaining_len < 0) {
result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2);
@@ -2412,8 +2296,7 @@ BrotliDecoderResult BrotliDecoderDecompressStream(
*next_in = br->next_in;
}
s->state = BROTLI_STATE_DONE;
- /* Fall through. */
-
+ /* No break, continue to next state */
case BROTLI_STATE_DONE:
if (s->ringbuffer != 0) {
result = WriteRingBuffer(
diff --git a/c/dec/huffman.c b/c/dec/huffman.c
index c5eafad..37da2a5 100644
--- a/c/dec/huffman.c
+++ b/c/dec/huffman.c
@@ -11,8 +11,8 @@
#include <string.h> /* memcpy, memset */
#include "../common/constants.h"
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -20,9 +20,9 @@ extern "C" {
#define BROTLI_REVERSE_BITS_MAX 8
-#if defined(BROTLI_RBIT)
+#ifdef BROTLI_RBIT
#define BROTLI_REVERSE_BITS_BASE \
- ((sizeof(brotli_reg_t) << 3) - BROTLI_REVERSE_BITS_MAX)
+ ((sizeof(reg_t) << 3) - BROTLI_REVERSE_BITS_MAX)
#else
#define BROTLI_REVERSE_BITS_BASE 0
static uint8_t kReverseBits[1 << BROTLI_REVERSE_BITS_MAX] = {
@@ -62,13 +62,13 @@ static uint8_t kReverseBits[1 << BROTLI_REVERSE_BITS_MAX] = {
#endif /* BROTLI_RBIT */
#define BROTLI_REVERSE_BITS_LOWEST \
- ((brotli_reg_t)1 << (BROTLI_REVERSE_BITS_MAX - 1 + BROTLI_REVERSE_BITS_BASE))
+ ((reg_t)1 << (BROTLI_REVERSE_BITS_MAX - 1 + BROTLI_REVERSE_BITS_BASE))
/* Returns reverse(num >> BROTLI_REVERSE_BITS_BASE, BROTLI_REVERSE_BITS_MAX),
where reverse(value, len) is the bit-wise reversal of the len least
significant bits of value. */
-static BROTLI_INLINE brotli_reg_t BrotliReverseBits(brotli_reg_t num) {
-#if defined(BROTLI_RBIT)
+static BROTLI_INLINE reg_t BrotliReverseBits(reg_t num) {
+#ifdef BROTLI_RBIT
return BROTLI_RBIT(num);
#else
return kReverseBits[num];
@@ -86,9 +86,9 @@ static BROTLI_INLINE void ReplicateValue(HuffmanCode* table,
} while (end > 0);
}
-/* Returns the table width of the next 2nd level table. |count| is the histogram
- of bit lengths for the remaining symbols, |len| is the code length of the
- next processed symbol. */
+/* Returns the table width of the next 2nd level table. count is the histogram
+ of bit lengths for the remaining symbols, len is the code length of the next
+ processed symbol */
static BROTLI_INLINE int NextTableBitSize(const uint16_t* const count,
int len, int root_bits) {
int left = 1 << (len - root_bits);
@@ -104,12 +104,12 @@ static BROTLI_INLINE int NextTableBitSize(const uint16_t* const count,
void BrotliBuildCodeLengthsHuffmanTable(HuffmanCode* table,
const uint8_t* const code_lengths,
uint16_t* count) {
- HuffmanCode code; /* current table entry */
- int symbol; /* symbol index in original or sorted table */
- brotli_reg_t key; /* prefix code */
- brotli_reg_t key_step; /* prefix code addend */
- int step; /* step size to replicate values in current table */
- int table_size; /* size of current table */
+ HuffmanCode code; /* current table entry */
+ int symbol; /* symbol index in original or sorted table */
+ reg_t key; /* prefix code */
+ reg_t key_step; /* prefix code addend */
+ int step; /* step size to replicate values in current table */
+ int table_size; /* size of current table */
int sorted[BROTLI_CODE_LENGTH_CODES]; /* symbols sorted by code length */
/* offsets in sorted table for each length */
int offset[BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH + 1];
@@ -118,7 +118,7 @@ void BrotliBuildCodeLengthsHuffmanTable(HuffmanCode* table,
BROTLI_DCHECK(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH <=
BROTLI_REVERSE_BITS_MAX);
- /* Generate offsets into sorted symbol table by code length. */
+ /* generate offsets into sorted symbol table by code length */
symbol = -1;
bits = 1;
BROTLI_REPEAT(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH, {
@@ -129,7 +129,7 @@ void BrotliBuildCodeLengthsHuffmanTable(HuffmanCode* table,
/* Symbols with code length 0 are placed after all other symbols. */
offset[0] = BROTLI_CODE_LENGTH_CODES - 1;
- /* Sort symbols by length, by symbol order within each length. */
+ /* sort symbols by length, by symbol order within each length */
symbol = BROTLI_CODE_LENGTH_CODES;
do {
BROTLI_REPEAT(6, {
@@ -144,13 +144,13 @@ void BrotliBuildCodeLengthsHuffmanTable(HuffmanCode* table,
if (offset[0] == 0) {
code.bits = 0;
code.value = (uint16_t)sorted[0];
- for (key = 0; key < (brotli_reg_t)table_size; ++key) {
+ for (key = 0; key < (reg_t)table_size; ++key) {
table[key] = code;
}
return;
}
- /* Fill in table. */
+ /* fill in table */
key = 0;
key_step = BROTLI_REVERSE_BITS_LOWEST;
symbol = 0;
@@ -172,18 +172,18 @@ uint32_t BrotliBuildHuffmanTable(HuffmanCode* root_table,
int root_bits,
const uint16_t* const symbol_lists,
uint16_t* count) {
- HuffmanCode code; /* current table entry */
- HuffmanCode* table; /* next available space in table */
- int len; /* current code length */
- int symbol; /* symbol index in original or sorted table */
- brotli_reg_t key; /* prefix code */
- brotli_reg_t key_step; /* prefix code addend */
- brotli_reg_t sub_key; /* 2nd level table prefix code */
- brotli_reg_t sub_key_step; /* 2nd level table prefix code addend */
- int step; /* step size to replicate values in current table */
- int table_bits; /* key length of current table */
- int table_size; /* size of current table */
- int total_size; /* sum of root table size and 2nd level table sizes */
+ HuffmanCode code; /* current table entry */
+ HuffmanCode* table; /* next available space in table */
+ int len; /* current code length */
+ int symbol; /* symbol index in original or sorted table */
+ reg_t key; /* prefix code */
+ reg_t key_step; /* prefix code addend */
+ reg_t sub_key; /* 2nd level table prefix code */
+ reg_t sub_key_step; /* 2nd level table prefix code addend */
+ int step; /* step size to replicate values in current table */
+ int table_bits; /* key length of current table */
+ int table_size; /* size of current table */
+ int total_size; /* sum of root table size and 2nd level table sizes */
int max_length = -1;
int bits;
int bits_count;
@@ -200,8 +200,9 @@ uint32_t BrotliBuildHuffmanTable(HuffmanCode* root_table,
table_size = 1 << table_bits;
total_size = table_size;
- /* Fill in the root table. Reduce the table size to if possible,
- and create the repetitions by memcpy. */
+ /* fill in root table */
+ /* let's reduce the table size to a smaller size if possible, and */
+ /* create the repetitions by memcpy if possible in the coming loop */
if (table_bits > max_length) {
table_bits = max_length;
table_size = 1 << table_bits;
@@ -223,14 +224,15 @@ uint32_t BrotliBuildHuffmanTable(HuffmanCode* root_table,
key_step >>= 1;
} while (++bits <= table_bits);
- /* If root_bits != table_bits then replicate to fill the remaining slots. */
+ /* if root_bits != table_bits we only created one fraction of the */
+ /* table, and we need to replicate it now. */
while (total_size != table_size) {
memcpy(&table[table_size], &table[0],
(size_t)table_size * sizeof(table[0]));
table_size <<= 1;
}
- /* Fill in 2nd level tables and add pointers to root table. */
+ /* fill in 2nd level tables and add pointers to root table */
key_step = BROTLI_REVERSE_BITS_LOWEST >> (root_bits - 1);
sub_key = (BROTLI_REVERSE_BITS_LOWEST << 1);
sub_key_step = BROTLI_REVERSE_BITS_LOWEST;
diff --git a/c/dec/huffman.h b/c/dec/huffman.h
index 521ec6e..d3b4d53 100644
--- a/c/dec/huffman.h
+++ b/c/dec/huffman.h
@@ -9,8 +9,8 @@
#ifndef BROTLI_DEC_HUFFMAN_H_
#define BROTLI_DEC_HUFFMAN_H_
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -19,11 +19,10 @@ extern "C" {
#define BROTLI_HUFFMAN_MAX_CODE_LENGTH 15
/* Maximum possible Huffman table size for an alphabet size of (index * 32),
- max code length 15 and root table bits 8. */
+ * max code length 15 and root table bits 8. */
static const uint16_t kMaxHuffmanTableSize[] = {
256, 402, 436, 468, 500, 534, 566, 598, 630, 662, 694, 726, 758, 790, 822,
- 854, 886, 920, 952, 984, 1016, 1048, 1080, 1112, 1144, 1176, 1208, 1240, 1272,
- 1304, 1336, 1368, 1400, 1432, 1464, 1496, 1528};
+ 854, 886, 920, 952, 984, 1016, 1048, 1080};
/* BROTLI_NUM_BLOCK_LEN_SYMBOLS == 26 */
#define BROTLI_HUFFMAN_MAX_SIZE_26 396
/* BROTLI_MAX_BLOCK_TYPE_SYMBOLS == 258 */
@@ -42,26 +41,23 @@ typedef struct {
BROTLI_INTERNAL void BrotliBuildCodeLengthsHuffmanTable(HuffmanCode* root_table,
const uint8_t* const code_lengths, uint16_t* count);
-/* Builds Huffman lookup table assuming code lengths are in symbol order.
- Returns size of resulting table. */
+/* Builds Huffman lookup table assuming code lengths are in symbol order. */
+/* Returns size of resulting table. */
BROTLI_INTERNAL uint32_t BrotliBuildHuffmanTable(HuffmanCode* root_table,
int root_bits, const uint16_t* const symbol_lists, uint16_t* count_arg);
-/* Builds a simple Huffman table. The |num_symbols| parameter is to be
- interpreted as follows: 0 means 1 symbol, 1 means 2 symbols,
- 2 means 3 symbols, 3 means 4 symbols with lengths [2, 2, 2, 2],
- 4 means 4 symbols with lengths [1, 2, 3, 3]. */
+/* Builds a simple Huffman table. The num_symbols parameter is to be */
+/* interpreted as follows: 0 means 1 symbol, 1 means 2 symbols, 2 means 3 */
+/* symbols, 3 means 4 symbols with lengths 2,2,2,2, 4 means 4 symbols with */
+/* lengths 1,2,3,3. */
BROTLI_INTERNAL uint32_t BrotliBuildSimpleHuffmanTable(HuffmanCode* table,
int root_bits, uint16_t* symbols, uint32_t num_symbols);
/* Contains a collection of Huffman trees with the same alphabet size. */
-/* max_symbol is needed due to simple codes since log2(alphabet_size) could be
- greater than log2(max_symbol). */
typedef struct {
HuffmanCode** htrees;
HuffmanCode* codes;
uint16_t alphabet_size;
- uint16_t max_symbol;
uint16_t num_htrees;
} HuffmanTreeGroup;
diff --git a/c/dec/port.h b/c/dec/port.h
new file mode 100644
index 0000000..6b3d735
--- /dev/null
+++ b/c/dec/port.h
@@ -0,0 +1,168 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Macros for compiler / platform specific features and build options.
+
+ Build options are:
+ * BROTLI_BUILD_32_BIT disables 64-bit optimizations
+ * BROTLI_BUILD_64_BIT forces to use 64-bit optimizations
+ * BROTLI_BUILD_BIG_ENDIAN forces to use big-endian optimizations
+ * BROTLI_BUILD_ENDIAN_NEUTRAL disables endian-aware optimizations
+ * BROTLI_BUILD_LITTLE_ENDIAN forces to use little-endian optimizations
+ * BROTLI_BUILD_MODERN_COMPILER forces to use modern compilers built-ins,
+ features and attributes
+ * BROTLI_BUILD_PORTABLE disables dangerous optimizations, like unaligned
+ read and overlapping memcpy; this reduces decompression speed by 5%
+ * BROTLI_BUILD_NO_RBIT disables "rbit" optimization for ARM CPUs
+ * BROTLI_DEBUG dumps file name and line number when decoder detects stream
+ or memory error
+ * BROTLI_ENABLE_LOG enables asserts and dumps various state information
+ */
+
+#ifndef BROTLI_DEC_PORT_H_
+#define BROTLI_DEC_PORT_H_
+
+#if defined(BROTLI_ENABLE_LOG) || defined(BROTLI_DEBUG)
+#include <assert.h>
+#include <stdio.h>
+#endif
+
+#include <brotli/port.h>
+
+#if defined(__arm__) || defined(__thumb__) || \
+ defined(_M_ARM) || defined(_M_ARMT) || defined(__ARM64_ARCH_8__)
+#define BROTLI_TARGET_ARM
+#if (defined(__ARM_ARCH) && (__ARM_ARCH == 7)) || \
+ (defined(M_ARM) && (M_ARM == 7))
+#define BROTLI_TARGET_ARMV7
+#endif /* ARMv7 */
+#if defined(__aarch64__) || defined(__ARM64_ARCH_8__)
+#define BROTLI_TARGET_ARMV8
+#endif /* ARMv8 */
+#endif /* ARM */
+
+#if defined(__i386) || defined(_M_IX86)
+#define BROTLI_TARGET_X86
+#endif
+
+#if defined(__x86_64__) || defined(_M_X64)
+#define BROTLI_TARGET_X64
+#endif
+
+#if defined(__PPC64__)
+#define BROTLI_TARGET_POWERPC64
+#endif
+
+#ifdef BROTLI_BUILD_PORTABLE
+#define BROTLI_ALIGNED_READ (!!1)
+#elif defined(BROTLI_TARGET_X86) || defined(BROTLI_TARGET_X64) || \
+ defined(BROTLI_TARGET_ARMV7) || defined(BROTLI_TARGET_ARMV8)
+/* Allow unaligned read only for white-listed CPUs. */
+#define BROTLI_ALIGNED_READ (!!0)
+#else
+#define BROTLI_ALIGNED_READ (!!1)
+#endif
+
+/* IS_CONSTANT macros returns true for compile-time constant expressions. */
+#if BROTLI_MODERN_COMPILER || __has_builtin(__builtin_constant_p)
+#define IS_CONSTANT(x) (!!__builtin_constant_p(x))
+#else
+#define IS_CONSTANT(x) (!!0)
+#endif
+
+#ifdef BROTLI_ENABLE_LOG
+#define BROTLI_DCHECK(x) assert(x)
+#define BROTLI_LOG(x) printf x
+#else
+#define BROTLI_DCHECK(x)
+#define BROTLI_LOG(x)
+#endif
+
+#if defined(BROTLI_DEBUG) || defined(BROTLI_ENABLE_LOG)
+static BROTLI_INLINE void BrotliDump(const char* f, int l, const char* fn) {
+ fprintf(stderr, "%s:%d (%s)\n", f, l, fn);
+ fflush(stderr);
+}
+#define BROTLI_DUMP() BrotliDump(__FILE__, __LINE__, __FUNCTION__)
+#else
+#define BROTLI_DUMP() (void)(0)
+#endif
+
+#if defined(BROTLI_BUILD_64_BIT)
+#define BROTLI_64_BITS 1
+#elif defined(BROTLI_BUILD_32_BIT)
+#define BROTLI_64_BITS 0
+#elif defined(BROTLI_TARGET_X64) || defined(BROTLI_TARGET_ARMV8) || \
+ defined(BROTLI_TARGET_POWERPC64)
+#define BROTLI_64_BITS 1
+#else
+#define BROTLI_64_BITS 0
+#endif
+
+#if (BROTLI_64_BITS)
+#define reg_t uint64_t
+#else
+#define reg_t uint32_t
+#endif
+
+#if defined(BROTLI_BUILD_BIG_ENDIAN)
+#define BROTLI_LITTLE_ENDIAN 0
+#define BROTLI_BIG_ENDIAN 1
+#elif defined(BROTLI_BUILD_LITTLE_ENDIAN)
+#define BROTLI_LITTLE_ENDIAN 1
+#define BROTLI_BIG_ENDIAN 0
+#elif defined(BROTLI_BUILD_ENDIAN_NEUTRAL)
+#define BROTLI_LITTLE_ENDIAN 0
+#define BROTLI_BIG_ENDIAN 0
+#elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
+#define BROTLI_LITTLE_ENDIAN 1
+#define BROTLI_BIG_ENDIAN 0
+#elif defined(_WIN32)
+/* Win32 can currently always be assumed to be little endian */
+#define BROTLI_LITTLE_ENDIAN 1
+#define BROTLI_BIG_ENDIAN 0
+#else
+#if (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))
+#define BROTLI_BIG_ENDIAN 1
+#else
+#define BROTLI_BIG_ENDIAN 0
+#endif
+#define BROTLI_LITTLE_ENDIAN 0
+#endif
+
+#define BROTLI_REPEAT(N, X) { \
+ if ((N & 1) != 0) {X;} \
+ if ((N & 2) != 0) {X; X;} \
+ if ((N & 4) != 0) {X; X; X; X;} \
+}
+
+#if (BROTLI_MODERN_COMPILER || defined(__llvm__)) && \
+ !defined(BROTLI_BUILD_NO_RBIT)
+#if defined(BROTLI_TARGET_ARMV7) || defined(BROTLI_TARGET_ARMV8)
+/* TODO: detect ARMv6T2 and enable this code for it. */
+static BROTLI_INLINE reg_t BrotliRBit(reg_t input) {
+ reg_t output;
+ __asm__("rbit %0, %1\n" : "=r"(output) : "r"(input));
+ return output;
+}
+#define BROTLI_RBIT(x) BrotliRBit(x)
+#endif /* armv7 */
+#endif /* gcc || clang */
+
+#if defined(BROTLI_TARGET_ARM)
+#define BROTLI_HAS_UBFX (!!1)
+#else
+#define BROTLI_HAS_UBFX (!!0)
+#endif
+
+#define BROTLI_ALLOC(S, L) S->alloc_func(S->memory_manager_opaque, L)
+
+#define BROTLI_FREE(S, X) { \
+ S->free_func(S->memory_manager_opaque, X); \
+ X = NULL; \
+}
+
+#endif /* BROTLI_DEC_PORT_H_ */
diff --git a/c/dec/prefix.h b/c/dec/prefix.h
index 3ea062d..aa776c7 100644
--- a/c/dec/prefix.h
+++ b/c/dec/prefix.h
@@ -5,7 +5,8 @@
*/
/* Lookup tables to map prefix codes to value ranges. This is used during
- decoding of the block lengths, literal insertion lengths and copy lengths. */
+ decoding of the block lengths, literal insertion lengths and copy lengths.
+*/
#ifndef BROTLI_DEC_PREFIX_H_
#define BROTLI_DEC_PREFIX_H_
@@ -13,8 +14,8 @@
#include "../common/constants.h"
#include <brotli/types.h>
-/* Represents the range of values belonging to a prefix code:
- [offset, offset + 2^nbits) */
+/* Represents the range of values belonging to a prefix code: */
+/* [offset, offset + 2^nbits) */
struct PrefixCodeRange {
uint16_t offset;
uint8_t nbits;
diff --git a/c/dec/state.c b/c/dec/state.c
index e0b37c2..554313d 100644
--- a/c/dec/state.c
+++ b/c/dec/state.c
@@ -15,11 +15,25 @@
extern "C" {
#endif
-BROTLI_BOOL BrotliDecoderStateInit(BrotliDecoderState* s,
+static void* DefaultAllocFunc(void* opaque, size_t size) {
+ BROTLI_UNUSED(opaque);
+ return malloc(size);
+}
+
+static void DefaultFreeFunc(void* opaque, void* address) {
+ BROTLI_UNUSED(opaque);
+ free(address);
+}
+
+void BrotliDecoderStateInit(BrotliDecoderState* s) {
+ BrotliDecoderStateInitWithCustomAllocators(s, 0, 0, 0);
+}
+
+void BrotliDecoderStateInitWithCustomAllocators(BrotliDecoderState* s,
brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
if (!alloc_func) {
- s->alloc_func = BrotliDefaultAllocFunc;
- s->free_func = BrotliDefaultFreeFunc;
+ s->alloc_func = DefaultAllocFunc;
+ s->free_func = DefaultFreeFunc;
s->memory_manager_opaque = 0;
} else {
s->alloc_func = alloc_func;
@@ -31,7 +45,6 @@ BROTLI_BOOL BrotliDecoderStateInit(BrotliDecoderState* s,
BrotliInitBitReader(&s->br);
s->state = BROTLI_STATE_UNINITED;
- s->large_window = 0;
s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
s->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
s->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
@@ -40,6 +53,8 @@ BROTLI_BOOL BrotliDecoderStateInit(BrotliDecoderState* s,
s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
+ s->dictionary = BrotliGetDictionary();
+
s->buffer_length = 0;
s->loop_counter = 0;
s->pos = 0;
@@ -88,18 +103,13 @@ BROTLI_BOOL BrotliDecoderStateInit(BrotliDecoderState* s,
s->symbol_lists = &s->symbols_lists_array[BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1];
s->mtf_upper_bound = 63;
-
- s->dictionary = BrotliGetDictionary();
- s->transforms = BrotliGetTransforms();
-
- return BROTLI_TRUE;
}
void BrotliDecoderStateMetablockBegin(BrotliDecoderState* s) {
s->meta_block_remaining_len = 0;
- s->block_length[0] = 1U << 24;
- s->block_length[1] = 1U << 24;
- s->block_length[2] = 1U << 24;
+ s->block_length[0] = 1U << 28;
+ s->block_length[1] = 1U << 28;
+ s->block_length[2] = 1U << 28;
s->num_block_types[0] = 1;
s->num_block_types[1] = 1;
s->num_block_types[2] = 1;
@@ -116,7 +126,8 @@ void BrotliDecoderStateMetablockBegin(BrotliDecoderState* s) {
s->literal_htree = NULL;
s->dist_context_map_slice = NULL;
s->dist_htree_index = 0;
- s->context_lookup = NULL;
+ s->context_lookup1 = NULL;
+ s->context_lookup2 = NULL;
s->literal_hgroup.codes = NULL;
s->literal_hgroup.htrees = NULL;
s->insert_copy_hgroup.codes = NULL;
@@ -126,33 +137,30 @@ void BrotliDecoderStateMetablockBegin(BrotliDecoderState* s) {
}
void BrotliDecoderStateCleanupAfterMetablock(BrotliDecoderState* s) {
- BROTLI_DECODER_FREE(s, s->context_modes);
- BROTLI_DECODER_FREE(s, s->context_map);
- BROTLI_DECODER_FREE(s, s->dist_context_map);
- BROTLI_DECODER_FREE(s, s->literal_hgroup.htrees);
- BROTLI_DECODER_FREE(s, s->insert_copy_hgroup.htrees);
- BROTLI_DECODER_FREE(s, s->distance_hgroup.htrees);
+ BROTLI_FREE(s, s->context_modes);
+ BROTLI_FREE(s, s->context_map);
+ BROTLI_FREE(s, s->dist_context_map);
+ BROTLI_FREE(s, s->literal_hgroup.htrees);
+ BROTLI_FREE(s, s->insert_copy_hgroup.htrees);
+ BROTLI_FREE(s, s->distance_hgroup.htrees);
}
void BrotliDecoderStateCleanup(BrotliDecoderState* s) {
BrotliDecoderStateCleanupAfterMetablock(s);
- BROTLI_DECODER_FREE(s, s->ringbuffer);
- BROTLI_DECODER_FREE(s, s->block_type_trees);
+ BROTLI_FREE(s, s->ringbuffer);
+ BROTLI_FREE(s, s->block_type_trees);
}
BROTLI_BOOL BrotliDecoderHuffmanTreeGroupInit(BrotliDecoderState* s,
- HuffmanTreeGroup* group, uint32_t alphabet_size, uint32_t max_symbol,
- uint32_t ntrees) {
+ HuffmanTreeGroup* group, uint32_t alphabet_size, uint32_t ntrees) {
/* Pack two allocations into one */
const size_t max_table_size = kMaxHuffmanTableSize[(alphabet_size + 31) >> 5];
const size_t code_size = sizeof(HuffmanCode) * ntrees * max_table_size;
const size_t htree_size = sizeof(HuffmanCode*) * ntrees;
/* Pointer alignment is, hopefully, wider than sizeof(HuffmanCode). */
- HuffmanCode** p = (HuffmanCode**)BROTLI_DECODER_ALLOC(s,
- code_size + htree_size);
+ HuffmanCode** p = (HuffmanCode**)BROTLI_ALLOC(s, code_size + htree_size);
group->alphabet_size = (uint16_t)alphabet_size;
- group->max_symbol = (uint16_t)max_symbol;
group->num_htrees = (uint16_t)ntrees;
group->htrees = p;
group->codes = (HuffmanCode*)(&p[ntrees]);
diff --git a/c/dec/state.h b/c/dec/state.h
index d28b639..1d2773b 100644
--- a/c/dec/state.h
+++ b/c/dec/state.h
@@ -11,11 +11,10 @@
#include "../common/constants.h"
#include "../common/dictionary.h"
-#include "../common/platform.h"
-#include "../common/transform.h"
#include <brotli/types.h>
#include "./bit_reader.h"
#include "./huffman.h"
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -23,8 +22,6 @@ extern "C" {
typedef enum {
BROTLI_STATE_UNINITED,
- BROTLI_STATE_LARGE_WINDOW_BITS,
- BROTLI_STATE_INITIALIZE,
BROTLI_STATE_METABLOCK_BEGIN,
BROTLI_STATE_METABLOCK_HEADER,
BROTLI_STATE_METABLOCK_HEADER_2,
@@ -129,22 +126,23 @@ struct BrotliDecoderStateStruct {
uint8_t* ringbuffer;
uint8_t* ringbuffer_end;
HuffmanCode* htree_command;
- const uint8_t* context_lookup;
+ const uint8_t* context_lookup1;
+ const uint8_t* context_lookup2;
uint8_t* context_map_slice;
uint8_t* dist_context_map_slice;
- /* This ring buffer holds a few past copy distances that will be used by
- some special distance codes. */
+ /* This ring buffer holds a few past copy distances that will be used by */
+ /* some special distance codes. */
HuffmanTreeGroup literal_hgroup;
HuffmanTreeGroup insert_copy_hgroup;
HuffmanTreeGroup distance_hgroup;
HuffmanCode* block_type_trees;
HuffmanCode* block_len_trees;
/* This is true if the literal context map histogram type always matches the
- block type. It is then not needed to keep the context (faster decoding). */
+ block type. It is then not needed to keep the context (faster decoding). */
int trivial_literal_context;
- /* Distance context is actual after command is decoded and before distance is
- computed. After distance computation it is used as a temporary variable. */
+ /* Distance context is actual after command is decoded and before distance
+ is computed. After distance computation it is used as a temporary variable. */
int distance_context;
int meta_block_remaining_len;
uint32_t block_length_index;
@@ -164,11 +162,11 @@ struct BrotliDecoderStateStruct {
int copy_length;
int distance_code;
- /* For partial write operations. */
- size_t rb_roundtrips; /* how many times we went around the ring-buffer */
- size_t partial_pos_out; /* how much output to the user in total */
+ /* For partial write operations */
+ size_t rb_roundtrips; /* How many times we went around the ring-buffer */
+ size_t partial_pos_out; /* How much output to the user in total */
- /* For ReadHuffmanCode. */
+ /* For ReadHuffmanCode */
uint32_t symbol;
uint32_t repeat;
uint32_t space;
@@ -182,26 +180,25 @@ struct BrotliDecoderStateStruct {
/* Tails of symbol chains. */
int next_symbol[32];
uint8_t code_length_code_lengths[BROTLI_CODE_LENGTH_CODES];
- /* Population counts for the code lengths. */
+ /* Population counts for the code lengths */
uint16_t code_length_histo[16];
- /* For HuffmanTreeGroupDecode. */
+ /* For HuffmanTreeGroupDecode */
int htree_index;
HuffmanCode* next;
- /* For DecodeContextMap. */
+ /* For DecodeContextMap */
uint32_t context_index;
uint32_t max_run_length_prefix;
uint32_t code;
HuffmanCode context_map_table[BROTLI_HUFFMAN_MAX_SIZE_272];
- /* For InverseMoveToFrontTransform. */
+ /* For InverseMoveToFrontTransform */
uint32_t mtf_upper_bound;
uint32_t mtf[64 + 1];
- /* Less used attributes are at the end of this struct. */
-
- /* States inside function calls. */
+ /* less used attributes are in the end of this struct */
+ /* States inside function calls */
BrotliRunningMetablockHeaderState substate_metablock_header;
BrotliRunningTreeGroupState substate_tree_group;
BrotliRunningContextMapState substate_context_map;
@@ -215,7 +212,6 @@ struct BrotliDecoderStateStruct {
unsigned int is_metadata : 1;
unsigned int should_wrap_ringbuffer : 1;
unsigned int canny_ringbuffer_allocation : 1;
- unsigned int large_window : 1;
unsigned int size_nibbles : 8;
uint32_t window_bits;
@@ -224,9 +220,7 @@ struct BrotliDecoderStateStruct {
uint32_t num_literal_htrees;
uint8_t* context_map;
uint8_t* context_modes;
-
const BrotliDictionary* dictionary;
- const BrotliTransforms* transforms;
uint32_t trivial_literal_contexts[8]; /* 256 bits */
};
@@ -234,22 +228,17 @@ struct BrotliDecoderStateStruct {
typedef struct BrotliDecoderStateStruct BrotliDecoderStateInternal;
#define BrotliDecoderState BrotliDecoderStateInternal
-BROTLI_INTERNAL BROTLI_BOOL BrotliDecoderStateInit(BrotliDecoderState* s,
- brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque);
+BROTLI_INTERNAL void BrotliDecoderStateInit(BrotliDecoderState* s);
+BROTLI_INTERNAL void BrotliDecoderStateInitWithCustomAllocators(
+ BrotliDecoderState* s, brotli_alloc_func alloc_func,
+ brotli_free_func free_func, void* opaque);
BROTLI_INTERNAL void BrotliDecoderStateCleanup(BrotliDecoderState* s);
BROTLI_INTERNAL void BrotliDecoderStateMetablockBegin(BrotliDecoderState* s);
BROTLI_INTERNAL void BrotliDecoderStateCleanupAfterMetablock(
BrotliDecoderState* s);
BROTLI_INTERNAL BROTLI_BOOL BrotliDecoderHuffmanTreeGroupInit(
BrotliDecoderState* s, HuffmanTreeGroup* group, uint32_t alphabet_size,
- uint32_t max_symbol, uint32_t ntrees);
-
-#define BROTLI_DECODER_ALLOC(S, L) S->alloc_func(S->memory_manager_opaque, L)
-
-#define BROTLI_DECODER_FREE(S, X) { \
- S->free_func(S->memory_manager_opaque, X); \
- X = NULL; \
-}
+ uint32_t ntrees);
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
diff --git a/c/dec/transform.h b/c/dec/transform.h
new file mode 100644
index 0000000..fde3cdf
--- /dev/null
+++ b/c/dec/transform.h
@@ -0,0 +1,300 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Transformations on dictionary words. */
+
+#ifndef BROTLI_DEC_TRANSFORM_H_
+#define BROTLI_DEC_TRANSFORM_H_
+
+#include <brotli/types.h>
+#include "./port.h"
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+enum WordTransformType {
+ kIdentity = 0,
+ kOmitLast1 = 1,
+ kOmitLast2 = 2,
+ kOmitLast3 = 3,
+ kOmitLast4 = 4,
+ kOmitLast5 = 5,
+ kOmitLast6 = 6,
+ kOmitLast7 = 7,
+ kOmitLast8 = 8,
+ kOmitLast9 = 9,
+ kUppercaseFirst = 10,
+ kUppercaseAll = 11,
+ kOmitFirst1 = 12,
+ kOmitFirst2 = 13,
+ kOmitFirst3 = 14,
+ kOmitFirst4 = 15,
+ kOmitFirst5 = 16,
+ kOmitFirst6 = 17,
+ kOmitFirst7 = 18,
+ kOmitFirst8 = 19,
+ kOmitFirst9 = 20
+};
+
+typedef struct {
+ const uint8_t prefix_id;
+ const uint8_t transform;
+ const uint8_t suffix_id;
+} Transform;
+
+static const char kPrefixSuffix[208] =
+ "\0 \0, \0 of the \0 of \0s \0.\0 and \0 in \0\"\0 to \0\">\0\n\0. \0]\0"
+ " for \0 a \0 that \0\'\0 with \0 from \0 by \0(\0. The \0 on \0 as \0"
+ " is \0ing \0\n\t\0:\0ed \0=\"\0 at \0ly \0,\0=\'\0.com/\0. This \0"
+ " not \0er \0al \0ful \0ive \0less \0est \0ize \0\xc2\xa0\0ous ";
+
+enum {
+ /* EMPTY = ""
+ SP = " "
+ DQUOT = "\""
+ SQUOT = "'"
+ CLOSEBR = "]"
+ OPEN = "("
+ SLASH = "/"
+ NBSP = non-breaking space "\0xc2\xa0"
+ */
+ kPFix_EMPTY = 0,
+ kPFix_SP = 1,
+ kPFix_COMMASP = 3,
+ kPFix_SPofSPtheSP = 6,
+ kPFix_SPtheSP = 9,
+ kPFix_eSP = 12,
+ kPFix_SPofSP = 15,
+ kPFix_sSP = 20,
+ kPFix_DOT = 23,
+ kPFix_SPandSP = 25,
+ kPFix_SPinSP = 31,
+ kPFix_DQUOT = 36,
+ kPFix_SPtoSP = 38,
+ kPFix_DQUOTGT = 43,
+ kPFix_NEWLINE = 46,
+ kPFix_DOTSP = 48,
+ kPFix_CLOSEBR = 51,
+ kPFix_SPforSP = 53,
+ kPFix_SPaSP = 59,
+ kPFix_SPthatSP = 63,
+ kPFix_SQUOT = 70,
+ kPFix_SPwithSP = 72,
+ kPFix_SPfromSP = 79,
+ kPFix_SPbySP = 86,
+ kPFix_OPEN = 91,
+ kPFix_DOTSPTheSP = 93,
+ kPFix_SPonSP = 100,
+ kPFix_SPasSP = 105,
+ kPFix_SPisSP = 110,
+ kPFix_ingSP = 115,
+ kPFix_NEWLINETAB = 120,
+ kPFix_COLON = 123,
+ kPFix_edSP = 125,
+ kPFix_EQDQUOT = 129,
+ kPFix_SPatSP = 132,
+ kPFix_lySP = 137,
+ kPFix_COMMA = 141,
+ kPFix_EQSQUOT = 143,
+ kPFix_DOTcomSLASH = 146,
+ kPFix_DOTSPThisSP = 152,
+ kPFix_SPnotSP = 160,
+ kPFix_erSP = 166,
+ kPFix_alSP = 170,
+ kPFix_fulSP = 174,
+ kPFix_iveSP = 179,
+ kPFix_lessSP = 184,
+ kPFix_estSP = 190,
+ kPFix_izeSP = 195,
+ kPFix_NBSP = 200,
+ kPFix_ousSP = 203
+};
+
+static const Transform kTransforms[] = {
+ { kPFix_EMPTY, kIdentity, kPFix_EMPTY },
+ { kPFix_EMPTY, kIdentity, kPFix_SP },
+ { kPFix_SP, kIdentity, kPFix_SP },
+ { kPFix_EMPTY, kOmitFirst1, kPFix_EMPTY },
+ { kPFix_EMPTY, kUppercaseFirst, kPFix_SP },
+ { kPFix_EMPTY, kIdentity, kPFix_SPtheSP },
+ { kPFix_SP, kIdentity, kPFix_EMPTY },
+ { kPFix_sSP, kIdentity, kPFix_SP },
+ { kPFix_EMPTY, kIdentity, kPFix_SPofSP },
+ { kPFix_EMPTY, kUppercaseFirst, kPFix_EMPTY },
+ { kPFix_EMPTY, kIdentity, kPFix_SPandSP },
+ { kPFix_EMPTY, kOmitFirst2, kPFix_EMPTY },
+ { kPFix_EMPTY, kOmitLast1, kPFix_EMPTY },
+ { kPFix_COMMASP, kIdentity, kPFix_SP },
+ { kPFix_EMPTY, kIdentity, kPFix_COMMASP },
+ { kPFix_SP, kUppercaseFirst, kPFix_SP },
+ { kPFix_EMPTY, kIdentity, kPFix_SPinSP },
+ { kPFix_EMPTY, kIdentity, kPFix_SPtoSP },
+ { kPFix_eSP, kIdentity, kPFix_SP },
+ { kPFix_EMPTY, kIdentity, kPFix_DQUOT },
+ { kPFix_EMPTY, kIdentity, kPFix_DOT },
+ { kPFix_EMPTY, kIdentity, kPFix_DQUOTGT },
+ { kPFix_EMPTY, kIdentity, kPFix_NEWLINE },
+ { kPFix_EMPTY, kOmitLast3, kPFix_EMPTY },
+ { kPFix_EMPTY, kIdentity, kPFix_CLOSEBR },
+ { kPFix_EMPTY, kIdentity, kPFix_SPforSP },
+ { kPFix_EMPTY, kOmitFirst3, kPFix_EMPTY },
+ { kPFix_EMPTY, kOmitLast2, kPFix_EMPTY },
+ { kPFix_EMPTY, kIdentity, kPFix_SPaSP },
+ { kPFix_EMPTY, kIdentity, kPFix_SPthatSP },
+ { kPFix_SP, kUppercaseFirst, kPFix_EMPTY },
+ { kPFix_EMPTY, kIdentity, kPFix_DOTSP },
+ { kPFix_DOT, kIdentity, kPFix_EMPTY },
+ { kPFix_SP, kIdentity, kPFix_COMMASP },
+ { kPFix_EMPTY, kOmitFirst4, kPFix_EMPTY },
+ { kPFix_EMPTY, kIdentity, kPFix_SPwithSP },
+ { kPFix_EMPTY, kIdentity, kPFix_SQUOT },
+ { kPFix_EMPTY, kIdentity, kPFix_SPfromSP },
+ { kPFix_EMPTY, kIdentity, kPFix_SPbySP },
+ { kPFix_EMPTY, kOmitFirst5, kPFix_EMPTY },
+ { kPFix_EMPTY, kOmitFirst6, kPFix_EMPTY },
+ { kPFix_SPtheSP, kIdentity, kPFix_EMPTY },
+ { kPFix_EMPTY, kOmitLast4, kPFix_EMPTY },
+ { kPFix_EMPTY, kIdentity, kPFix_DOTSPTheSP },
+ { kPFix_EMPTY, kUppercaseAll, kPFix_EMPTY },
+ { kPFix_EMPTY, kIdentity, kPFix_SPonSP },
+ { kPFix_EMPTY, kIdentity, kPFix_SPasSP },
+ { kPFix_EMPTY, kIdentity, kPFix_SPisSP },
+ { kPFix_EMPTY, kOmitLast7, kPFix_EMPTY },
+ { kPFix_EMPTY, kOmitLast1, kPFix_ingSP },
+ { kPFix_EMPTY, kIdentity, kPFix_NEWLINETAB },
+ { kPFix_EMPTY, kIdentity, kPFix_COLON },
+ { kPFix_SP, kIdentity, kPFix_DOTSP },
+ { kPFix_EMPTY, kIdentity, kPFix_edSP },
+ { kPFix_EMPTY, kOmitFirst9, kPFix_EMPTY },
+ { kPFix_EMPTY, kOmitFirst7, kPFix_EMPTY },
+ { kPFix_EMPTY, kOmitLast6, kPFix_EMPTY },
+ { kPFix_EMPTY, kIdentity, kPFix_OPEN },
+ { kPFix_EMPTY, kUppercaseFirst, kPFix_COMMASP },
+ { kPFix_EMPTY, kOmitLast8, kPFix_EMPTY },
+ { kPFix_EMPTY, kIdentity, kPFix_SPatSP },
+ { kPFix_EMPTY, kIdentity, kPFix_lySP },
+ { kPFix_SPtheSP, kIdentity, kPFix_SPofSP },
+ { kPFix_EMPTY, kOmitLast5, kPFix_EMPTY },
+ { kPFix_EMPTY, kOmitLast9, kPFix_EMPTY },
+ { kPFix_SP, kUppercaseFirst, kPFix_COMMASP },
+ { kPFix_EMPTY, kUppercaseFirst, kPFix_DQUOT },
+ { kPFix_DOT, kIdentity, kPFix_OPEN },
+ { kPFix_EMPTY, kUppercaseAll, kPFix_SP },
+ { kPFix_EMPTY, kUppercaseFirst, kPFix_DQUOTGT },
+ { kPFix_EMPTY, kIdentity, kPFix_EQDQUOT },
+ { kPFix_SP, kIdentity, kPFix_DOT },
+ { kPFix_DOTcomSLASH, kIdentity, kPFix_EMPTY },
+ { kPFix_SPtheSP, kIdentity, kPFix_SPofSPtheSP },
+ { kPFix_EMPTY, kUppercaseFirst, kPFix_SQUOT },
+ { kPFix_EMPTY, kIdentity, kPFix_DOTSPThisSP },
+ { kPFix_EMPTY, kIdentity, kPFix_COMMA },
+ { kPFix_DOT, kIdentity, kPFix_SP },
+ { kPFix_EMPTY, kUppercaseFirst, kPFix_OPEN },
+ { kPFix_EMPTY, kUppercaseFirst, kPFix_DOT },
+ { kPFix_EMPTY, kIdentity, kPFix_SPnotSP },
+ { kPFix_SP, kIdentity, kPFix_EQDQUOT },
+ { kPFix_EMPTY, kIdentity, kPFix_erSP },
+ { kPFix_SP, kUppercaseAll, kPFix_SP },
+ { kPFix_EMPTY, kIdentity, kPFix_alSP },
+ { kPFix_SP, kUppercaseAll, kPFix_EMPTY },
+ { kPFix_EMPTY, kIdentity, kPFix_EQSQUOT },
+ { kPFix_EMPTY, kUppercaseAll, kPFix_DQUOT },
+ { kPFix_EMPTY, kUppercaseFirst, kPFix_DOTSP },
+ { kPFix_SP, kIdentity, kPFix_OPEN },
+ { kPFix_EMPTY, kIdentity, kPFix_fulSP },
+ { kPFix_SP, kUppercaseFirst, kPFix_DOTSP },
+ { kPFix_EMPTY, kIdentity, kPFix_iveSP },
+ { kPFix_EMPTY, kIdentity, kPFix_lessSP },
+ { kPFix_EMPTY, kUppercaseAll, kPFix_SQUOT },
+ { kPFix_EMPTY, kIdentity, kPFix_estSP },
+ { kPFix_SP, kUppercaseFirst, kPFix_DOT },
+ { kPFix_EMPTY, kUppercaseAll, kPFix_DQUOTGT },
+ { kPFix_SP, kIdentity, kPFix_EQSQUOT },
+ { kPFix_EMPTY, kUppercaseFirst, kPFix_COMMA },
+ { kPFix_EMPTY, kIdentity, kPFix_izeSP },
+ { kPFix_EMPTY, kUppercaseAll, kPFix_DOT },
+ { kPFix_NBSP, kIdentity, kPFix_EMPTY },
+ { kPFix_SP, kIdentity, kPFix_COMMA },
+ { kPFix_EMPTY, kUppercaseFirst, kPFix_EQDQUOT },
+ { kPFix_EMPTY, kUppercaseAll, kPFix_EQDQUOT },
+ { kPFix_EMPTY, kIdentity, kPFix_ousSP },
+ { kPFix_EMPTY, kUppercaseAll, kPFix_COMMASP },
+ { kPFix_EMPTY, kUppercaseFirst, kPFix_EQSQUOT },
+ { kPFix_SP, kUppercaseFirst, kPFix_COMMA },
+ { kPFix_SP, kUppercaseAll, kPFix_EQDQUOT },
+ { kPFix_SP, kUppercaseAll, kPFix_COMMASP },
+ { kPFix_EMPTY, kUppercaseAll, kPFix_COMMA },
+ { kPFix_EMPTY, kUppercaseAll, kPFix_OPEN },
+ { kPFix_EMPTY, kUppercaseAll, kPFix_DOTSP },
+ { kPFix_SP, kUppercaseAll, kPFix_DOT },
+ { kPFix_EMPTY, kUppercaseAll, kPFix_EQSQUOT },
+ { kPFix_SP, kUppercaseAll, kPFix_DOTSP },
+ { kPFix_SP, kUppercaseFirst, kPFix_EQDQUOT },
+ { kPFix_SP, kUppercaseAll, kPFix_EQSQUOT },
+ { kPFix_SP, kUppercaseFirst, kPFix_EQSQUOT },
+};
+
+static const int kNumTransforms = sizeof(kTransforms) / sizeof(kTransforms[0]);
+
+static int ToUpperCase(uint8_t* p) {
+ if (p[0] < 0xc0) {
+ if (p[0] >= 'a' && p[0] <= 'z') {
+ p[0] ^= 32;
+ }
+ return 1;
+ }
+ /* An overly simplified uppercasing model for UTF-8. */
+ if (p[0] < 0xe0) {
+ p[1] ^= 32;
+ return 2;
+ }
+ /* An arbitrary transform for three byte characters. */
+ p[2] ^= 5;
+ return 3;
+}
+
+static BROTLI_NOINLINE int TransformDictionaryWord(
+ uint8_t* dst, const uint8_t* word, int len, int transform) {
+ int idx = 0;
+ {
+ const char* prefix = &kPrefixSuffix[kTransforms[transform].prefix_id];
+ while (*prefix) { dst[idx++] = (uint8_t)*prefix++; }
+ }
+ {
+ const int t = kTransforms[transform].transform;
+ int i = 0;
+ int skip = t - (kOmitFirst1 - 1);
+ if (skip > 0) {
+ word += skip;
+ len -= skip;
+ } else if (t <= kOmitLast9) {
+ len -= t;
+ }
+ while (i < len) { dst[idx++] = word[i++]; }
+ if (t == kUppercaseFirst) {
+ ToUpperCase(&dst[idx - len]);
+ } else if (t == kUppercaseAll) {
+ uint8_t* uppercase = &dst[idx - len];
+ while (len > 0) {
+ int step = ToUpperCase(uppercase);
+ uppercase += step;
+ len -= step;
+ }
+ }
+ }
+ {
+ const char* suffix = &kPrefixSuffix[kTransforms[transform].suffix_id];
+ while (*suffix) { dst[idx++] = (uint8_t)*suffix++; }
+ return idx;
+ }
+}
+
+#if defined(__cplusplus) || defined(c_plusplus)
+} /* extern "C" */
+#endif
+
+#endif /* BROTLI_DEC_TRANSFORM_H_ */
diff --git a/c/enc/backward_references.c b/c/enc/backward_references.c
index cd023d9..3ac7f2f 100644
--- a/c/enc/backward_references.c
+++ b/c/enc/backward_references.c
@@ -10,11 +10,11 @@
#include "../common/constants.h"
#include "../common/dictionary.h"
-#include "../common/platform.h"
#include <brotli/types.h>
#include "./command.h"
#include "./dictionary_hash.h"
#include "./memory.h"
+#include "./port.h"
#include "./quality.h"
#if defined(__cplusplus) || defined(c_plusplus)
@@ -49,7 +49,6 @@ static BROTLI_INLINE size_t ComputeDistanceCode(size_t distance,
#define CAT(a, b) a ## b
#define FN(X) EXPAND_CAT(X, HASHER())
#define EXPORT_FN(X) EXPAND_CAT(X, EXPAND_CAT(PREFIX(), HASHER()))
-
#define PREFIX() N
#define HASHER() H2
@@ -97,38 +96,29 @@ static BROTLI_INLINE size_t ComputeDistanceCode(size_t distance,
#include "./backward_references_inc.h"
#undef HASHER
-#define HASHER() H35
-/* NOLINTNEXTLINE(build/include) */
-#include "./backward_references_inc.h"
-#undef HASHER
-
-#define HASHER() H55
-/* NOLINTNEXTLINE(build/include) */
-#include "./backward_references_inc.h"
-#undef HASHER
-
-#define HASHER() H65
-/* NOLINTNEXTLINE(build/include) */
-#include "./backward_references_inc.h"
-#undef HASHER
-
#undef PREFIX
-
#undef EXPORT_FN
#undef FN
#undef CAT
#undef EXPAND_CAT
-void BrotliCreateBackwardReferences(
- size_t num_bytes, size_t position, const uint8_t* ringbuffer,
- size_t ringbuffer_mask, const BrotliEncoderParams* params,
- HasherHandle hasher, int* dist_cache, size_t* last_insert_len,
- Command* commands, size_t* num_commands, size_t* num_literals) {
+void BrotliCreateBackwardReferences(const BrotliDictionary* dictionary,
+ size_t num_bytes,
+ size_t position,
+ const uint8_t* ringbuffer,
+ size_t ringbuffer_mask,
+ const BrotliEncoderParams* params,
+ HasherHandle hasher,
+ int* dist_cache,
+ size_t* last_insert_len,
+ Command* commands,
+ size_t* num_commands,
+ size_t* num_literals) {
switch (params->hasher.type) {
#define CASE_(N) \
case N: \
- CreateBackwardReferencesNH ## N( \
- num_bytes, position, ringbuffer, \
+ CreateBackwardReferencesNH ## N(dictionary, \
+ kStaticDictionaryHash, num_bytes, position, ringbuffer, \
ringbuffer_mask, params, hasher, dist_cache, \
last_insert_len, commands, num_commands, num_literals); \
return;
diff --git a/c/enc/backward_references.h b/c/enc/backward_references.h
index 3a41466..7ad9881 100644
--- a/c/enc/backward_references.h
+++ b/c/enc/backward_references.h
@@ -11,10 +11,10 @@
#include "../common/constants.h"
#include "../common/dictionary.h"
-#include "../common/platform.h"
#include <brotli/types.h>
#include "./command.h"
#include "./hash.h"
+#include "./port.h"
#include "./quality.h"
#if defined(__cplusplus) || defined(c_plusplus)
@@ -26,10 +26,11 @@ extern "C" {
CreateBackwardReferences calls, and must be incremented by the amount written
by this call. */
BROTLI_INTERNAL void BrotliCreateBackwardReferences(
- size_t num_bytes, size_t position, const uint8_t* ringbuffer,
- size_t ringbuffer_mask, const BrotliEncoderParams* params,
- HasherHandle hasher, int* dist_cache, size_t* last_insert_len,
- Command* commands, size_t* num_commands, size_t* num_literals);
+ const BrotliDictionary* dictionary, size_t num_bytes, size_t position,
+ const uint8_t* ringbuffer, size_t ringbuffer_mask,
+ const BrotliEncoderParams* params, HasherHandle hasher, int* dist_cache,
+ size_t* last_insert_len, Command* commands, size_t* num_commands,
+ size_t* num_literals);
#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 e7486c4..335b55c 100644..100755
--- a/c/enc/backward_references_hq.c
+++ b/c/enc/backward_references_hq.c
@@ -11,14 +11,13 @@
#include <string.h> /* memcpy, memset */
#include "../common/constants.h"
-#include "../common/platform.h"
#include <brotli/types.h>
#include "./command.h"
#include "./fast_log.h"
#include "./find_match_length.h"
#include "./literal_cost.h"
#include "./memory.h"
-#include "./params.h"
+#include "./port.h"
#include "./prefix.h"
#include "./quality.h"
@@ -26,8 +25,6 @@
extern "C" {
#endif
-#define BROTLI_MAX_EFFECTIVE_DISTANCE_ALPHABET_SIZE 544
-
static const float kInfinity = 1.7e38f; /* ~= 2 ^ 127 */
static const uint32_t kDistanceCacheIndex[] = {
@@ -42,41 +39,40 @@ void BrotliInitZopfliNodes(ZopfliNode* array, size_t length) {
size_t i;
stub.length = 1;
stub.distance = 0;
- stub.dcode_insert_length = 0;
+ stub.insert_length = 0;
stub.u.cost = kInfinity;
for (i = 0; i < length; ++i) array[i] = stub;
}
static BROTLI_INLINE uint32_t ZopfliNodeCopyLength(const ZopfliNode* self) {
- return self->length & 0x1FFFFFF;
+ return self->length & 0xffffff;
}
static BROTLI_INLINE uint32_t ZopfliNodeLengthCode(const ZopfliNode* self) {
- const uint32_t modifier = self->length >> 25;
+ const uint32_t modifier = self->length >> 24;
return ZopfliNodeCopyLength(self) + 9u - modifier;
}
static BROTLI_INLINE uint32_t ZopfliNodeCopyDistance(const ZopfliNode* self) {
- return self->distance;
+ return self->distance & 0x1ffffff;
}
static BROTLI_INLINE uint32_t ZopfliNodeDistanceCode(const ZopfliNode* self) {
- const uint32_t short_code = self->dcode_insert_length >> 27;
+ const uint32_t short_code = self->distance >> 25;
return short_code == 0 ?
ZopfliNodeCopyDistance(self) + BROTLI_NUM_DISTANCE_SHORT_CODES - 1 :
short_code - 1;
}
static BROTLI_INLINE uint32_t ZopfliNodeCommandLength(const ZopfliNode* self) {
- return ZopfliNodeCopyLength(self) + (self->dcode_insert_length & 0x7FFFFFF);
+ return ZopfliNodeCopyLength(self) + self->insert_length;
}
/* Histogram based cost model for zopflification. */
typedef struct ZopfliCostModel {
/* The insert and copy length symbols. */
float cost_cmd_[BROTLI_NUM_COMMAND_SYMBOLS];
- float* cost_dist_;
- uint32_t distance_histogram_size;
+ float cost_dist_[BROTLI_NUM_DISTANCE_SYMBOLS];
/* Cumulative costs of literals per position in the stream. */
float* literal_costs_;
float min_cost_cmd_;
@@ -84,45 +80,28 @@ typedef struct ZopfliCostModel {
} ZopfliCostModel;
static void InitZopfliCostModel(
- MemoryManager* m, ZopfliCostModel* self, const BrotliDistanceParams* dist,
- size_t num_bytes) {
- uint32_t distance_histogram_size = dist->alphabet_size;
- if (distance_histogram_size > BROTLI_MAX_EFFECTIVE_DISTANCE_ALPHABET_SIZE) {
- distance_histogram_size = BROTLI_MAX_EFFECTIVE_DISTANCE_ALPHABET_SIZE;
- }
+ MemoryManager* m, ZopfliCostModel* self, size_t num_bytes) {
self->num_bytes_ = num_bytes;
self->literal_costs_ = BROTLI_ALLOC(m, float, num_bytes + 2);
- self->cost_dist_ = BROTLI_ALLOC(m, float, dist->alphabet_size);
- self->distance_histogram_size = distance_histogram_size;
if (BROTLI_IS_OOM(m)) return;
}
static void CleanupZopfliCostModel(MemoryManager* m, ZopfliCostModel* self) {
BROTLI_FREE(m, self->literal_costs_);
- BROTLI_FREE(m, self->cost_dist_);
}
static void SetCost(const uint32_t* histogram, size_t histogram_size,
- BROTLI_BOOL literal_histogram, float* cost) {
+ float* cost) {
size_t sum = 0;
- size_t missing_symbol_sum;
float log2sum;
- float missing_symbol_cost;
size_t i;
for (i = 0; i < histogram_size; i++) {
sum += histogram[i];
}
log2sum = (float)FastLog2(sum);
- missing_symbol_sum = sum;
- if (!literal_histogram) {
- for (i = 0; i < histogram_size; i++) {
- if (histogram[i] == 0) missing_symbol_sum++;
- }
- }
- missing_symbol_cost = (float)FastLog2(missing_symbol_sum) + 2;
for (i = 0; i < histogram_size; i++) {
if (histogram[i] == 0) {
- cost[i] = missing_symbol_cost;
+ cost[i] = log2sum + 2;
continue;
}
@@ -143,7 +122,7 @@ static void ZopfliCostModelSetFromCommands(ZopfliCostModel* self,
size_t last_insert_len) {
uint32_t histogram_literal[BROTLI_NUM_LITERAL_SYMBOLS];
uint32_t histogram_cmd[BROTLI_NUM_COMMAND_SYMBOLS];
- uint32_t histogram_dist[BROTLI_MAX_EFFECTIVE_DISTANCE_ALPHABET_SIZE];
+ uint32_t histogram_dist[BROTLI_NUM_DISTANCE_SYMBOLS];
float cost_literal[BROTLI_NUM_LITERAL_SYMBOLS];
size_t pos = position - last_insert_len;
float min_cost_cmd = kInfinity;
@@ -157,7 +136,7 @@ static void ZopfliCostModelSetFromCommands(ZopfliCostModel* self,
for (i = 0; i < num_commands; i++) {
size_t inslength = commands[i].insert_len_;
size_t copylength = CommandCopyLen(&commands[i]);
- size_t distcode = commands[i].dist_prefix_ & 0x3FF;
+ size_t distcode = commands[i].dist_prefix_;
size_t cmdcode = commands[i].cmd_prefix_;
size_t j;
@@ -171,12 +150,9 @@ static void ZopfliCostModelSetFromCommands(ZopfliCostModel* self,
pos += inslength + copylength;
}
- SetCost(histogram_literal, BROTLI_NUM_LITERAL_SYMBOLS, BROTLI_TRUE,
- cost_literal);
- SetCost(histogram_cmd, BROTLI_NUM_COMMAND_SYMBOLS, BROTLI_FALSE,
- cost_cmd);
- SetCost(histogram_dist, self->distance_histogram_size, BROTLI_FALSE,
- self->cost_dist_);
+ SetCost(histogram_literal, BROTLI_NUM_LITERAL_SYMBOLS, cost_literal);
+ SetCost(histogram_cmd, BROTLI_NUM_COMMAND_SYMBOLS, cost_cmd);
+ SetCost(histogram_dist, BROTLI_NUM_DISTANCE_SYMBOLS, self->cost_dist_);
for (i = 0; i < BROTLI_NUM_COMMAND_SYMBOLS; ++i) {
min_cost_cmd = BROTLI_MIN(float, min_cost_cmd, cost_cmd[i]);
@@ -185,14 +161,11 @@ static void ZopfliCostModelSetFromCommands(ZopfliCostModel* self,
{
float* literal_costs = self->literal_costs_;
- float literal_carry = 0.0;
size_t num_bytes = self->num_bytes_;
literal_costs[0] = 0.0;
for (i = 0; i < num_bytes; ++i) {
- literal_carry +=
+ literal_costs[i + 1] = literal_costs[i] +
cost_literal[ringbuffer[(position + i) & ringbuffer_mask]];
- literal_costs[i + 1] = literal_costs[i] + literal_carry;
- literal_carry -= literal_costs[i + 1] - literal_costs[i];
}
}
}
@@ -202,7 +175,6 @@ static void ZopfliCostModelSetFromLiteralCosts(ZopfliCostModel* self,
const uint8_t* ringbuffer,
size_t ringbuffer_mask) {
float* literal_costs = self->literal_costs_;
- float literal_carry = 0.0;
float* cost_dist = self->cost_dist_;
float* cost_cmd = self->cost_cmd_;
size_t num_bytes = self->num_bytes_;
@@ -211,14 +183,12 @@ static void ZopfliCostModelSetFromLiteralCosts(ZopfliCostModel* self,
ringbuffer, &literal_costs[1]);
literal_costs[0] = 0.0;
for (i = 0; i < num_bytes; ++i) {
- literal_carry += literal_costs[i + 1];
- literal_costs[i + 1] = literal_costs[i] + literal_carry;
- literal_carry -= literal_costs[i + 1] - literal_costs[i];
+ literal_costs[i + 1] += literal_costs[i];
}
for (i = 0; i < BROTLI_NUM_COMMAND_SYMBOLS; ++i) {
cost_cmd[i] = (float)FastLog2(11 + (uint32_t)i);
}
- for (i = 0; i < self->distance_histogram_size; ++i) {
+ for (i = 0; i < BROTLI_NUM_DISTANCE_SYMBOLS; ++i) {
cost_dist[i] = (float)FastLog2(20 + (uint32_t)i);
}
self->min_cost_cmd_ = (float)FastLog2(11);
@@ -251,10 +221,9 @@ static BROTLI_INLINE void UpdateZopfliNode(ZopfliNode* nodes, size_t pos,
size_t start_pos, size_t len, size_t len_code, size_t dist,
size_t short_code, float cost) {
ZopfliNode* next = &nodes[pos + len];
- next->length = (uint32_t)(len | ((len + 9u - len_code) << 25));
- next->distance = (uint32_t)dist;
- next->dcode_insert_length = (uint32_t)(
- (short_code << 27) | (pos - start_pos));
+ next->length = (uint32_t)(len | ((len + 9u - len_code) << 24));
+ next->distance = (uint32_t)(dist | (short_code << 25));
+ next->insert_length = (uint32_t)(pos - start_pos);
next->u.cost = cost;
}
@@ -334,7 +303,7 @@ static uint32_t ComputeDistanceShortcut(const size_t block_start,
const size_t gap,
const ZopfliNode* nodes) {
const size_t clen = ZopfliNodeCopyLength(&nodes[pos]);
- const size_t ilen = nodes[pos].dcode_insert_length & 0x7FFFFFF;
+ const size_t ilen = nodes[pos].insert_length;
const size_t dist = ZopfliNodeCopyDistance(&nodes[pos]);
/* Since |block_start + pos| is the end position of the command, the copy part
starts from |block_start + pos - clen|. Distances that are greater than
@@ -366,7 +335,7 @@ static void ComputeDistanceCache(const size_t pos,
int idx = 0;
size_t p = nodes[pos].u.shortcut;
while (idx < 4 && p > 0) {
- const size_t ilen = nodes[p].dcode_insert_length & 0x7FFFFFF;
+ const size_t ilen = nodes[p].insert_length;
const size_t clen = ZopfliNodeCopyLength(&nodes[p]);
const size_t dist = ZopfliNodeCopyDistance(&nodes[p]);
dist_cache[idx++] = (int)dist;
@@ -513,12 +482,10 @@ static size_t UpdateNodes(
uint32_t distnumextra;
float dist_cost;
size_t max_match_len;
- PrefixEncodeCopyDistance(
- dist_code, params->dist.num_direct_distance_codes,
- params->dist.distance_postfix_bits, &dist_symbol, &distextra);
- distnumextra = dist_symbol >> 10;
+ PrefixEncodeCopyDistance(dist_code, 0, 0, &dist_symbol, &distextra);
+ distnumextra = distextra >> 24;
dist_cost = base_cost + (float)distnumextra +
- ZopfliCostModelGetDistanceCost(model, dist_symbol & 0x3FF);
+ ZopfliCostModelGetDistanceCost(model, dist_symbol);
/* Try all copy lengths up until the maximum copy length corresponding
to this distance. If the distance refers to the static dictionary, or
@@ -550,8 +517,7 @@ static size_t ComputeShortestPathFromNodes(size_t num_bytes,
ZopfliNode* nodes) {
size_t index = num_bytes;
size_t num_commands = 0;
- while ((nodes[index].dcode_insert_length & 0x7FFFFFF) == 0 &&
- nodes[index].length == 1) --index;
+ while (nodes[index].insert_length == 0 && nodes[index].length == 1) --index;
nodes[index].u.next = BROTLI_UINT32_MAX;
while (index != 0) {
size_t len = ZopfliNodeCommandLength(&nodes[index]);
@@ -576,10 +542,11 @@ void BrotliZopfliCreateCommands(const size_t num_bytes,
uint32_t offset = nodes[0].u.next;
size_t i;
size_t gap = 0;
+ BROTLI_UNUSED(params);
for (i = 0; offset != BROTLI_UINT32_MAX; i++) {
const ZopfliNode* next = &nodes[pos + offset];
size_t copy_length = ZopfliNodeCopyLength(next);
- size_t insert_length = next->dcode_insert_length & 0x7FFFFFF;
+ size_t insert_length = next->insert_length;
pos += insert_length;
offset = next->u.next;
if (i == 0) {
@@ -593,7 +560,8 @@ void BrotliZopfliCreateCommands(const size_t num_bytes,
BROTLI_MIN(size_t, block_start + pos, max_backward_limit);
BROTLI_BOOL is_dictionary = TO_BROTLI_BOOL(distance > max_distance + gap);
size_t dist_code = ZopfliNodeDistanceCode(next);
- InitCommand(&commands[i], &params->dist, insert_length,
+
+ InitCommand(&commands[i], insert_length,
copy_length, (int)len_code - (int)copy_length, dist_code);
if (!is_dictionary && dist_code > 0) {
@@ -657,22 +625,27 @@ static size_t ZopfliIterate(size_t num_bytes,
/* REQUIRES: nodes != NULL and len(nodes) >= num_bytes + 1 */
size_t BrotliZopfliComputeShortestPath(MemoryManager* m,
- size_t num_bytes, size_t position, const uint8_t* ringbuffer,
- size_t ringbuffer_mask, const BrotliEncoderParams* params,
- const size_t max_backward_limit, const int* dist_cache, HasherHandle hasher,
- ZopfliNode* nodes) {
+ const BrotliDictionary* dictionary,
+ size_t num_bytes,
+ size_t position,
+ const uint8_t* ringbuffer,
+ size_t ringbuffer_mask,
+ const BrotliEncoderParams* params,
+ const size_t max_backward_limit,
+ const int* dist_cache,
+ HasherHandle hasher,
+ ZopfliNode* nodes) {
const size_t max_zopfli_len = MaxZopfliLen(params);
ZopfliCostModel model;
StartPosQueue queue;
- BackwardMatch matches[2 * (MAX_NUM_MATCHES_H10 + 64)];
+ BackwardMatch matches[MAX_NUM_MATCHES_H10];
const size_t store_end = num_bytes >= StoreLookaheadH10() ?
position + num_bytes - StoreLookaheadH10() + 1 : position;
size_t i;
size_t gap = 0;
- size_t lz_matches_offset = 0;
nodes[0].length = 0;
nodes[0].u.cost = 0;
- InitZopfliCostModel(m, &model, &params->dist, num_bytes);
+ InitZopfliCostModel(m, &model, num_bytes);
if (BROTLI_IS_OOM(m)) return 0;
ZopfliCostModelSetFromLiteralCosts(
&model, position, ringbuffer, ringbuffer_mask);
@@ -680,10 +653,10 @@ size_t BrotliZopfliComputeShortestPath(MemoryManager* m,
for (i = 0; i + HashTypeLengthH10() - 1 < num_bytes; i++) {
const size_t pos = position + i;
const size_t max_distance = BROTLI_MIN(size_t, pos, max_backward_limit);
+ size_t num_matches = FindAllMatchesH10(hasher, dictionary, ringbuffer,
+ ringbuffer_mask, pos, num_bytes - i, max_distance, gap, params,
+ matches);
size_t skip;
- size_t num_matches = FindAllMatchesH10(hasher, &params->dictionary,
- ringbuffer, ringbuffer_mask, pos, num_bytes - i, max_distance, gap,
- params, &matches[lz_matches_offset]);
if (num_matches > 0 &&
BackwardMatchLength(&matches[num_matches - 1]) > max_zopfli_len) {
matches[0] = matches[num_matches - 1];
@@ -714,30 +687,32 @@ size_t BrotliZopfliComputeShortestPath(MemoryManager* m,
return ComputeShortestPathFromNodes(num_bytes, nodes);
}
-void BrotliCreateZopfliBackwardReferences(MemoryManager* m,
- size_t num_bytes, size_t position, const uint8_t* ringbuffer,
- size_t ringbuffer_mask, const BrotliEncoderParams* params,
- HasherHandle hasher, int* dist_cache, size_t* last_insert_len,
- Command* commands, size_t* num_commands, size_t* num_literals) {
+void BrotliCreateZopfliBackwardReferences(
+ MemoryManager* m, const BrotliDictionary* dictionary, size_t num_bytes,
+ size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask,
+ const BrotliEncoderParams* params, HasherHandle hasher, int* dist_cache,
+ size_t* last_insert_len, Command* commands, size_t* num_commands,
+ size_t* num_literals) {
const size_t max_backward_limit = BROTLI_MAX_BACKWARD_LIMIT(params->lgwin);
ZopfliNode* nodes;
nodes = BROTLI_ALLOC(m, ZopfliNode, num_bytes + 1);
if (BROTLI_IS_OOM(m)) return;
BrotliInitZopfliNodes(nodes, num_bytes + 1);
- *num_commands += BrotliZopfliComputeShortestPath(m,
- num_bytes, position, ringbuffer, ringbuffer_mask,
- params, max_backward_limit, dist_cache, hasher, nodes);
+ *num_commands += BrotliZopfliComputeShortestPath(m, dictionary, num_bytes,
+ position, ringbuffer, ringbuffer_mask, params, max_backward_limit,
+ dist_cache, hasher, nodes);
if (BROTLI_IS_OOM(m)) return;
BrotliZopfliCreateCommands(num_bytes, position, max_backward_limit, nodes,
dist_cache, last_insert_len, params, commands, num_literals);
BROTLI_FREE(m, nodes);
}
-void BrotliCreateHqZopfliBackwardReferences(MemoryManager* m,
- size_t num_bytes, size_t position, const uint8_t* ringbuffer,
- size_t ringbuffer_mask, const BrotliEncoderParams* params,
- HasherHandle hasher, int* dist_cache, size_t* last_insert_len,
- Command* commands, size_t* num_commands, size_t* num_literals) {
+void BrotliCreateHqZopfliBackwardReferences(
+ MemoryManager* m, const BrotliDictionary* dictionary, size_t num_bytes,
+ size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask,
+ const BrotliEncoderParams* params, HasherHandle hasher, int* dist_cache,
+ size_t* last_insert_len, Command* commands, size_t* num_commands,
+ size_t* num_literals) {
const size_t max_backward_limit = BROTLI_MAX_BACKWARD_LIMIT(params->lgwin);
uint32_t* num_matches = BROTLI_ALLOC(m, uint32_t, num_bytes);
size_t matches_size = 4 * num_bytes;
@@ -753,7 +728,6 @@ void BrotliCreateHqZopfliBackwardReferences(MemoryManager* m,
ZopfliNode* nodes;
BackwardMatch* matches = BROTLI_ALLOC(m, BackwardMatch, matches_size);
size_t gap = 0;
- size_t shadow_matches = 0;
if (BROTLI_IS_OOM(m)) return;
for (i = 0; i + HashTypeLengthH10() - 1 < num_bytes; ++i) {
const size_t pos = position + i;
@@ -764,14 +738,14 @@ void BrotliCreateHqZopfliBackwardReferences(MemoryManager* m,
size_t j;
/* Ensure that we have enough free slots. */
BROTLI_ENSURE_CAPACITY(m, BackwardMatch, matches, matches_size,
- cur_match_pos + MAX_NUM_MATCHES_H10 + shadow_matches);
+ cur_match_pos + MAX_NUM_MATCHES_H10);
if (BROTLI_IS_OOM(m)) return;
- num_found_matches = FindAllMatchesH10(hasher,
- &params->dictionary, ringbuffer, ringbuffer_mask, pos, max_length,
- max_distance, gap, params, &matches[cur_match_pos + shadow_matches]);
+ num_found_matches = FindAllMatchesH10(hasher, dictionary, ringbuffer,
+ ringbuffer_mask, pos, max_length, max_distance, gap, params,
+ &matches[cur_match_pos]);
cur_match_end = cur_match_pos + num_found_matches;
for (j = cur_match_pos; j + 1 < cur_match_end; ++j) {
- BROTLI_DCHECK(BackwardMatchLength(&matches[j]) <=
+ assert(BackwardMatchLength(&matches[j]) <=
BackwardMatchLength(&matches[j + 1]));
}
num_matches[i] = (uint32_t)num_found_matches;
@@ -797,7 +771,7 @@ void BrotliCreateHqZopfliBackwardReferences(MemoryManager* m,
orig_num_commands = *num_commands;
nodes = BROTLI_ALLOC(m, ZopfliNode, num_bytes + 1);
if (BROTLI_IS_OOM(m)) return;
- InitZopfliCostModel(m, &model, &params->dist, num_bytes);
+ InitZopfliCostModel(m, &model, num_bytes);
if (BROTLI_IS_OOM(m)) return;
for (i = 0; i < 2; i++) {
BrotliInitZopfliNodes(nodes, num_bytes + 1);
diff --git a/c/enc/backward_references_hq.h b/c/enc/backward_references_hq.h
index 7c38bd6..7e3bd7e 100644..100755
--- a/c/enc/backward_references_hq.h
+++ b/c/enc/backward_references_hq.h
@@ -11,38 +11,41 @@
#include "../common/constants.h"
#include "../common/dictionary.h"
-#include "../common/platform.h"
#include <brotli/types.h>
#include "./command.h"
#include "./hash.h"
#include "./memory.h"
+#include "./port.h"
#include "./quality.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
-BROTLI_INTERNAL void BrotliCreateZopfliBackwardReferences(MemoryManager* m,
- size_t num_bytes, size_t position, const uint8_t* ringbuffer,
- size_t ringbuffer_mask, const BrotliEncoderParams* params,
- HasherHandle hasher, int* dist_cache, size_t* last_insert_len,
- Command* commands, size_t* num_commands, size_t* num_literals);
+BROTLI_INTERNAL void BrotliCreateZopfliBackwardReferences(
+ MemoryManager* m, const BrotliDictionary* dictionary, size_t num_bytes,
+ size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask,
+ const BrotliEncoderParams* params, HasherHandle hasher, int* dist_cache,
+ size_t* last_insert_len, Command* commands, size_t* num_commands,
+ size_t* num_literals);
-BROTLI_INTERNAL void BrotliCreateHqZopfliBackwardReferences(MemoryManager* m,
- size_t num_bytes, size_t position, const uint8_t* ringbuffer,
- size_t ringbuffer_mask, const BrotliEncoderParams* params,
- HasherHandle hasher, int* dist_cache, size_t* last_insert_len,
- Command* commands, size_t* num_commands, size_t* num_literals);
+BROTLI_INTERNAL void BrotliCreateHqZopfliBackwardReferences(
+ MemoryManager* m, const BrotliDictionary* dictionary, size_t num_bytes,
+ size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask,
+ const BrotliEncoderParams* params, HasherHandle hasher, int* dist_cache,
+ size_t* last_insert_len, Command* commands, size_t* num_commands,
+ size_t* num_literals);
typedef struct ZopfliNode {
- /* Best length to get up to this byte (not including this byte itself)
- highest 7 bit is used to reconstruct the length code. */
+ /* best length to get up to this byte (not including this byte itself)
+ highest 8 bit is used to reconstruct the length code */
uint32_t length;
- /* Distance associated with the length. */
+ /* distance associated with the length
+ highest 7 bit contains distance short code + 1 (or zero if no short code)
+ */
uint32_t distance;
- /* Number of literal inserts before this copy; highest 5 bits contain
- distance short code + 1 (or zero if no short code). */
- uint32_t dcode_insert_length;
+ /* number of literal inserts before this copy */
+ uint32_t insert_length;
/* This union holds information used by dynamic-programming. During forward
pass |cost| it used to store the goal function. When node is processed its
@@ -74,11 +77,11 @@ BROTLI_INTERNAL void BrotliInitZopfliNodes(ZopfliNode* array, size_t length);
(1) nodes[i].copy_length() >= 2
(2) nodes[i].command_length() <= i and
(3) nodes[i - nodes[i].command_length()].cost < kInfinity */
-BROTLI_INTERNAL size_t BrotliZopfliComputeShortestPath(MemoryManager* m,
- size_t num_bytes, size_t position, const uint8_t* ringbuffer,
- size_t ringbuffer_mask, const BrotliEncoderParams* params,
- const size_t max_backward_limit, const int* dist_cache, HasherHandle hasher,
- ZopfliNode* nodes);
+BROTLI_INTERNAL size_t BrotliZopfliComputeShortestPath(
+ MemoryManager* m, const BrotliDictionary* dictionary, size_t num_bytes,
+ size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask,
+ const BrotliEncoderParams* params, const size_t max_backward_limit,
+ const int* dist_cache, HasherHandle hasher, ZopfliNode* nodes);
BROTLI_INTERNAL void BrotliZopfliCreateCommands(
const size_t num_bytes, const size_t block_start,
diff --git a/c/enc/backward_references_inc.h b/c/enc/backward_references_inc.h
index 38a48d3..81c783c 100644
--- a/c/enc/backward_references_inc.h
+++ b/c/enc/backward_references_inc.h
@@ -8,7 +8,8 @@
/* template parameters: EXPORT_FN, FN */
static BROTLI_NOINLINE void EXPORT_FN(CreateBackwardReferences)(
- size_t num_bytes, size_t position,
+ const BrotliDictionary* dictionary,
+ const uint16_t* dictionary_hash, size_t num_bytes, size_t position,
const uint8_t* ringbuffer, size_t ringbuffer_mask,
const BrotliEncoderParams* params, HasherHandle hasher, int* dist_cache,
size_t* last_insert_len, Command* commands, size_t* num_commands,
@@ -41,10 +42,9 @@ static BROTLI_NOINLINE void EXPORT_FN(CreateBackwardReferences)(
sr.len_code_delta = 0;
sr.distance = 0;
sr.score = kMinScore;
- FN(FindLongestMatch)(hasher, &params->dictionary,
- ringbuffer, ringbuffer_mask, dist_cache, position,
- max_length, max_distance, gap,
- params->dist.max_distance, &sr);
+ FN(FindLongestMatch)(hasher, dictionary, dictionary_hash, ringbuffer,
+ ringbuffer_mask, dist_cache, position,
+ max_length, max_distance, gap, &sr);
if (sr.score > kMinScore) {
/* Found a match. Let's look for something even better ahead. */
int delayed_backward_references_in_row = 0;
@@ -58,9 +58,9 @@ static BROTLI_NOINLINE void EXPORT_FN(CreateBackwardReferences)(
sr2.distance = 0;
sr2.score = kMinScore;
max_distance = BROTLI_MIN(size_t, position + 1, max_backward_limit);
- FN(FindLongestMatch)(hasher, &params->dictionary,
- ringbuffer, ringbuffer_mask, dist_cache, position + 1, max_length,
- max_distance, gap, params->dist.max_distance, &sr2);
+ FN(FindLongestMatch)(hasher, dictionary, dictionary_hash, ringbuffer,
+ ringbuffer_mask, dist_cache, position + 1,
+ max_length, max_distance, gap, &sr2);
if (sr2.score >= sr.score + cost_diff_lazy) {
/* Ok, let's just write one byte for now and start a match from the
next byte. */
@@ -89,8 +89,8 @@ static BROTLI_NOINLINE void EXPORT_FN(CreateBackwardReferences)(
dist_cache[0] = (int)sr.distance;
FN(PrepareDistanceCache)(hasher, dist_cache);
}
- InitCommand(commands++, &params->dist, insert_length,
- sr.len, sr.len_code_delta, distance_code);
+ InitCommand(commands++, insert_length, sr.len, sr.len_code_delta,
+ distance_code);
}
*num_literals += insert_length;
insert_length = 0;
diff --git a/c/enc/bit_cost.c b/c/enc/bit_cost.c
index 1f3f7ad..01e30f6 100644
--- a/c/enc/bit_cost.c
+++ b/c/enc/bit_cost.c
@@ -9,10 +9,10 @@
#include "./bit_cost.h"
#include "../common/constants.h"
-#include "../common/platform.h"
#include <brotli/types.h>
#include "./fast_log.h"
#include "./histogram.h"
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
diff --git a/c/enc/bit_cost.h b/c/enc/bit_cost.h
index 6586469..e69ee04 100644
--- a/c/enc/bit_cost.h
+++ b/c/enc/bit_cost.h
@@ -9,20 +9,20 @@
#ifndef BROTLI_ENC_BIT_COST_H_
#define BROTLI_ENC_BIT_COST_H_
-#include "../common/platform.h"
#include <brotli/types.h>
#include "./fast_log.h"
#include "./histogram.h"
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
-static BROTLI_INLINE double ShannonEntropy(
- const uint32_t* population, size_t size, size_t* total) {
+static BROTLI_INLINE double ShannonEntropy(const uint32_t *population,
+ size_t size, size_t *total) {
size_t sum = 0;
double retval = 0;
- const uint32_t* population_end = population + size;
+ const uint32_t *population_end = population + size;
size_t p;
if (size & 1) {
goto odd_number_of_elements_left;
@@ -42,7 +42,7 @@ static BROTLI_INLINE double ShannonEntropy(
}
static BROTLI_INLINE double BitsEntropy(
- const uint32_t* population, size_t size) {
+ const uint32_t *population, size_t size) {
size_t sum;
double retval = ShannonEntropy(population, size, &sum);
if (retval < sum) {
diff --git a/c/enc/block_encoder_inc.h b/c/enc/block_encoder_inc.h
index 8cbd5ea..2a08f90 100644
--- a/c/enc/block_encoder_inc.h
+++ b/c/enc/block_encoder_inc.h
@@ -13,9 +13,9 @@
stream. */
static void FN(BuildAndStoreEntropyCodes)(MemoryManager* m, BlockEncoder* self,
const HistogramType* histograms, const size_t histograms_size,
- const size_t alphabet_size, HuffmanTree* tree,
- size_t* storage_ix, uint8_t* storage) {
- const size_t table_size = histograms_size * self->histogram_length_;
+ HuffmanTree* tree, size_t* storage_ix, uint8_t* storage) {
+ const size_t alphabet_size = self->alphabet_size_;
+ const size_t table_size = histograms_size * alphabet_size;
self->depths_ = BROTLI_ALLOC(m, uint8_t, table_size);
self->bits_ = BROTLI_ALLOC(m, uint16_t, table_size);
if (BROTLI_IS_OOM(m)) return;
@@ -23,10 +23,9 @@ static void FN(BuildAndStoreEntropyCodes)(MemoryManager* m, BlockEncoder* self,
{
size_t i;
for (i = 0; i < histograms_size; ++i) {
- size_t ix = i * self->histogram_length_;
- BuildAndStoreHuffmanTree(&histograms[i].data_[0], self->histogram_length_,
- alphabet_size, tree, &self->depths_[ix], &self->bits_[ix],
- storage_ix, storage);
+ size_t ix = i * alphabet_size;
+ BuildAndStoreHuffmanTree(&histograms[i].data_[0], alphabet_size, tree,
+ &self->depths_[ix], &self->bits_[ix], storage_ix, storage);
}
}
}
diff --git a/c/enc/block_splitter.c b/c/enc/block_splitter.c
index d308eca..0331146 100644
--- a/c/enc/block_splitter.c
+++ b/c/enc/block_splitter.c
@@ -8,15 +8,16 @@
#include "./block_splitter.h"
+#include <assert.h>
#include <string.h> /* memcpy, memset */
-#include "../common/platform.h"
#include "./bit_cost.h"
#include "./cluster.h"
#include "./command.h"
#include "./fast_log.h"
#include "./histogram.h"
#include "./memory.h"
+#include "./port.h"
#include "./quality.h"
#if defined(__cplusplus) || defined(c_plusplus)
@@ -174,7 +175,7 @@ void BrotliSplitBlock(MemoryManager* m,
for (i = 0; i < num_commands; ++i) {
const Command* cmd = &cmds[i];
if (CommandCopyLen(cmd) && cmd->cmd_prefix_ >= 128) {
- distance_prefixes[j++] = cmd->dist_prefix_ & 0x3FF;
+ distance_prefixes[j++] = cmd->dist_prefix_;
}
}
/* Create the block split on the array of distance prefixes. */
diff --git a/c/enc/block_splitter.h b/c/enc/block_splitter.h
index a5e006c..6abac08 100644
--- a/c/enc/block_splitter.h
+++ b/c/enc/block_splitter.h
@@ -9,10 +9,10 @@
#ifndef BROTLI_ENC_BLOCK_SPLITTER_H_
#define BROTLI_ENC_BLOCK_SPLITTER_H_
-#include "../common/platform.h"
#include <brotli/types.h>
#include "./command.h"
#include "./memory.h"
+#include "./port.h"
#include "./quality.h"
#if defined(__cplusplus) || defined(c_plusplus)
diff --git a/c/enc/block_splitter_inc.h b/c/enc/block_splitter_inc.h
index 023712b..4884478 100644
--- a/c/enc/block_splitter_inc.h
+++ b/c/enc/block_splitter_inc.h
@@ -70,13 +70,13 @@ static size_t FN(FindBlocks)(const DataType* data, const size_t length,
double* insert_cost,
double* cost,
uint8_t* switch_signal,
- uint8_t* block_id) {
+ uint8_t *block_id) {
const size_t data_size = FN(HistogramDataSize)();
const size_t bitmaplen = (num_histograms + 7) >> 3;
size_t num_blocks = 1;
size_t i;
size_t j;
- BROTLI_DCHECK(num_histograms <= 256);
+ assert(num_histograms <= 256);
if (num_histograms <= 1) {
for (i = 0; i < length; ++i) {
block_id[i] = 0;
@@ -126,7 +126,7 @@ static size_t FN(FindBlocks)(const DataType* data, const size_t length,
if (cost[k] >= block_switch_cost) {
const uint8_t mask = (uint8_t)(1u << (k & 7));
cost[k] = block_switch_cost;
- BROTLI_DCHECK((k >> 3) < bitmaplen);
+ assert((k >> 3) < bitmaplen);
switch_signal[ix + (k >> 3)] |= mask;
}
}
@@ -137,7 +137,7 @@ static size_t FN(FindBlocks)(const DataType* data, const size_t length,
uint8_t cur_id = block_id[byte_ix];
while (byte_ix > 0) {
const uint8_t mask = (uint8_t)(1u << (cur_id & 7));
- BROTLI_DCHECK(((size_t)cur_id >> 3) < bitmaplen);
+ assert(((size_t)cur_id >> 3) < bitmaplen);
--byte_ix;
ix -= bitmaplen;
if (switch_signal[ix + (cur_id >> 3)] & mask) {
@@ -161,16 +161,16 @@ static size_t FN(RemapBlockIds)(uint8_t* block_ids, const size_t length,
new_id[i] = kInvalidId;
}
for (i = 0; i < length; ++i) {
- BROTLI_DCHECK(block_ids[i] < num_histograms);
+ assert(block_ids[i] < num_histograms);
if (new_id[block_ids[i]] == kInvalidId) {
new_id[block_ids[i]] = next_id++;
}
}
for (i = 0; i < length; ++i) {
block_ids[i] = (uint8_t)new_id[block_ids[i]];
- BROTLI_DCHECK(block_ids[i] < num_histograms);
+ assert(block_ids[i] < num_histograms);
}
- BROTLI_DCHECK(next_id <= num_histograms);
+ assert(next_id <= num_histograms);
return next_id;
}
@@ -226,13 +226,13 @@ static void FN(ClusterBlocks)(MemoryManager* m,
{
size_t block_idx = 0;
for (i = 0; i < length; ++i) {
- BROTLI_DCHECK(block_idx < num_blocks);
+ assert(block_idx < num_blocks);
++block_lengths[block_idx];
if (i + 1 == length || block_ids[i] != block_ids[i + 1]) {
++block_idx;
}
}
- BROTLI_DCHECK(block_idx == num_blocks);
+ assert(block_idx == num_blocks);
}
for (i = 0; i < num_blocks; i += HISTOGRAMS_PER_BATCH) {
@@ -268,8 +268,8 @@ static void FN(ClusterBlocks)(MemoryManager* m,
histogram_symbols[i + j] = (uint32_t)num_clusters + remap[symbols[j]];
}
num_clusters += num_new_clusters;
- BROTLI_DCHECK(num_clusters == cluster_size_size);
- BROTLI_DCHECK(num_clusters == all_histograms_size);
+ assert(num_clusters == cluster_size_size);
+ assert(num_clusters == all_histograms_size);
}
BROTLI_FREE(m, histograms);
diff --git a/c/enc/brotli_bit_stream.c b/c/enc/brotli_bit_stream.c
index aaf2dad..2907510 100644
--- a/c/enc/brotli_bit_stream.c
+++ b/c/enc/brotli_bit_stream.c
@@ -13,14 +13,13 @@
#include <string.h> /* memcpy, memset */
#include "../common/constants.h"
-#include "../common/context.h"
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "./context.h"
#include "./entropy_encode.h"
#include "./entropy_encode_static.h"
#include "./fast_log.h"
-#include "./histogram.h"
#include "./memory.h"
+#include "./port.h"
#include "./write_bits.h"
#if defined(__cplusplus) || defined(c_plusplus)
@@ -28,11 +27,12 @@ extern "C" {
#endif
#define MAX_HUFFMAN_TREE_SIZE (2 * BROTLI_NUM_COMMAND_SYMBOLS + 1)
-/* The maximum size of Huffman dictionary for distances assuming that
- NPOSTFIX = 0 and NDIRECT = 0. */
-#define MAX_SIMPLE_DISTANCE_ALPHABET_SIZE \
- BROTLI_DISTANCE_ALPHABET_SIZE(0, 0, BROTLI_LARGE_MAX_DISTANCE_BITS)
-/* MAX_SIMPLE_DISTANCE_ALPHABET_SIZE == 140 */
+/* The size of Huffman dictionary for distances assuming that NPOSTFIX = 0 and
+ NDIRECT = 0. */
+#define SIMPLE_DISTANCE_ALPHABET_SIZE (BROTLI_NUM_DISTANCE_SHORT_CODES + \
+ (2 * BROTLI_MAX_DISTANCE_BITS))
+/* SIMPLE_DISTANCE_ALPHABET_SIZE == 64 */
+#define SIMPLE_DISTANCE_ALPHABET_BITS 6
/* Represents the range of values belonging to a prefix code:
[offset, offset + 2^nbits) */
@@ -89,9 +89,9 @@ static void BrotliEncodeMlen(size_t length, uint64_t* bits,
size_t* numbits, uint64_t* nibblesbits) {
size_t lg = (length == 1) ? 1 : Log2FloorNonZero((uint32_t)(length - 1)) + 1;
size_t mnibbles = (lg < 16 ? 16 : (lg + 3)) / 4;
- BROTLI_DCHECK(length > 0);
- BROTLI_DCHECK(length <= (1 << 24));
- BROTLI_DCHECK(lg <= 24);
+ assert(length > 0);
+ assert(length <= (1 << 24));
+ assert(lg <= 24);
*nibblesbits = mnibbles - 4;
*numbits = mnibbles * 4;
*bits = length - 1;
@@ -258,7 +258,7 @@ static void StoreSimpleHuffmanTree(const uint8_t* depths,
size_t symbols[4],
size_t num_symbols,
size_t max_bits,
- size_t* storage_ix, uint8_t* storage) {
+ size_t *storage_ix, uint8_t *storage) {
/* value of 1 indicates a simple Huffman code */
BrotliWriteBits(2, 1, storage_ix, storage);
BrotliWriteBits(2, num_symbols - 1, storage_ix, storage); /* NSYM - 1 */
@@ -297,7 +297,7 @@ static void StoreSimpleHuffmanTree(const uint8_t* depths,
depths = symbol depths */
void BrotliStoreHuffmanTree(const uint8_t* depths, size_t num,
HuffmanTree* tree,
- size_t* storage_ix, uint8_t* storage) {
+ size_t *storage_ix, uint8_t *storage) {
/* Write the Huffman tree into the brotli-representation.
The command alphabet is the largest, so this allocation will fit all
alphabets. */
@@ -311,7 +311,7 @@ void BrotliStoreHuffmanTree(const uint8_t* depths, size_t num,
int num_codes = 0;
size_t code = 0;
- BROTLI_DCHECK(num <= BROTLI_NUM_COMMAND_SYMBOLS);
+ assert(num <= BROTLI_NUM_COMMAND_SYMBOLS);
BrotliWriteHuffmanTree(depths, num, &huffman_tree_size, huffman_tree,
huffman_tree_extra_bits);
@@ -360,9 +360,8 @@ void BrotliStoreHuffmanTree(const uint8_t* depths, size_t num,
/* Builds a Huffman tree from histogram[0:length] into depth[0:length] and
bits[0:length] and stores the encoded tree to the bit stream. */
-static void BuildAndStoreHuffmanTree(const uint32_t* histogram,
- const size_t histogram_length,
- const size_t alphabet_size,
+static void BuildAndStoreHuffmanTree(const uint32_t *histogram,
+ const size_t length,
HuffmanTree* tree,
uint8_t* depth,
uint16_t* bits,
@@ -372,7 +371,7 @@ static void BuildAndStoreHuffmanTree(const uint32_t* histogram,
size_t s4[4] = { 0 };
size_t i;
size_t max_bits = 0;
- for (i = 0; i < histogram_length; i++) {
+ for (i = 0; i < length; i++) {
if (histogram[i]) {
if (count < 4) {
s4[count] = i;
@@ -384,7 +383,7 @@ static void BuildAndStoreHuffmanTree(const uint32_t* histogram,
}
{
- size_t max_bits_counter = alphabet_size - 1;
+ size_t max_bits_counter = length - 1;
while (max_bits_counter) {
max_bits_counter >>= 1;
++max_bits;
@@ -399,14 +398,14 @@ static void BuildAndStoreHuffmanTree(const uint32_t* histogram,
return;
}
- memset(depth, 0, histogram_length * sizeof(depth[0]));
- BrotliCreateHuffmanTree(histogram, histogram_length, 15, tree, depth);
- BrotliConvertBitDepthsToSymbols(depth, histogram_length, bits);
+ memset(depth, 0, length * sizeof(depth[0]));
+ BrotliCreateHuffmanTree(histogram, length, 15, tree, depth);
+ BrotliConvertBitDepthsToSymbols(depth, length, bits);
if (count <= 4) {
StoreSimpleHuffmanTree(depth, s4, count, max_bits, storage_ix, storage);
} else {
- BrotliStoreHuffmanTree(depth, histogram_length, tree, storage_ix, storage);
+ BrotliStoreHuffmanTree(depth, length, tree, storage_ix, storage);
}
}
@@ -620,7 +619,7 @@ static void MoveToFrontTransform(const uint32_t* BROTLI_RESTRICT v_in,
for (i = 1; i < v_size; ++i) {
if (v_in[i] > max_value) max_value = v_in[i];
}
- BROTLI_DCHECK(max_value < 256u);
+ assert(max_value < 256u);
for (i = 0; i <= max_value; ++i) {
mtf[i] = (uint8_t)i;
}
@@ -628,7 +627,7 @@ static void MoveToFrontTransform(const uint32_t* BROTLI_RESTRICT v_in,
size_t mtf_size = max_value + 1;
for (i = 0; i < v_size; ++i) {
size_t index = IndexOf(mtf, mtf_size, (uint8_t)v_in[i]);
- BROTLI_DCHECK(index < mtf_size);
+ assert(index < mtf_size);
v_out[i] = (uint32_t)index;
MoveToFront(mtf, index);
}
@@ -660,7 +659,7 @@ static void RunLengthCodeZeros(const size_t in_size,
*max_run_length_prefix = max_prefix;
*out_size = 0;
for (i = 0; i < in_size;) {
- BROTLI_DCHECK(*out_size <= i);
+ assert(*out_size <= i);
if (v[i] != 0) {
v[*out_size] = v[i] + *max_run_length_prefix;
++i;
@@ -730,7 +729,6 @@ static void EncodeContextMap(MemoryManager* m,
}
}
BuildAndStoreHuffmanTree(histogram, num_clusters + max_run_length_prefix,
- num_clusters + max_run_length_prefix,
tree, depths, bits, storage_ix, storage);
for (i = 0; i < num_rle_symbols; ++i) {
const uint32_t rle_symbol = rle_symbols[i] & kSymbolMask;
@@ -790,11 +788,10 @@ static void BuildAndStoreBlockSplitCode(const uint8_t* types,
}
StoreVarLenUint8(num_types - 1, storage_ix, storage);
if (num_types > 1) { /* TODO: else? could StoreBlockSwitch occur? */
- BuildAndStoreHuffmanTree(&type_histo[0], num_types + 2, num_types + 2, tree,
+ BuildAndStoreHuffmanTree(&type_histo[0], num_types + 2, tree,
&code->type_depths[0], &code->type_bits[0],
storage_ix, storage);
BuildAndStoreHuffmanTree(&length_histo[0], BROTLI_NUM_BLOCK_LEN_SYMBOLS,
- BROTLI_NUM_BLOCK_LEN_SYMBOLS,
tree, &code->length_depths[0],
&code->length_bits[0], storage_ix, storage);
StoreBlockSwitch(code, lengths[0], types[0], 1, storage_ix, storage);
@@ -825,8 +822,8 @@ static void StoreTrivialContextMap(size_t num_types,
for (i = context_bits; i < alphabet_size; ++i) {
histogram[i] = 1;
}
- BuildAndStoreHuffmanTree(histogram, alphabet_size, alphabet_size,
- tree, depths, bits, storage_ix, storage);
+ BuildAndStoreHuffmanTree(histogram, alphabet_size, tree,
+ depths, bits, storage_ix, storage);
for (i = 0; i < num_types; ++i) {
size_t code = (i == 0 ? 0 : i + context_bits - 1);
BrotliWriteBits(depths[code], bits[code], storage_ix, storage);
@@ -841,7 +838,7 @@ static void StoreTrivialContextMap(size_t num_types,
/* Manages the encoding of one block category (literal, command or distance). */
typedef struct BlockEncoder {
- size_t histogram_length_;
+ size_t alphabet_size_;
size_t num_block_types_;
const uint8_t* block_types_; /* Not owned. */
const uint32_t* block_lengths_; /* Not owned. */
@@ -854,10 +851,10 @@ typedef struct BlockEncoder {
uint16_t* bits_;
} BlockEncoder;
-static void InitBlockEncoder(BlockEncoder* self, size_t histogram_length,
+static void InitBlockEncoder(BlockEncoder* self, size_t alphabet_size,
size_t num_block_types, const uint8_t* block_types,
const uint32_t* block_lengths, const size_t num_blocks) {
- self->histogram_length_ = histogram_length;
+ self->alphabet_size_ = alphabet_size;
self->num_block_types_ = num_block_types;
self->block_types_ = block_types;
self->block_lengths_ = block_lengths;
@@ -893,7 +890,7 @@ static void StoreSymbol(BlockEncoder* self, size_t symbol, size_t* storage_ix,
uint32_t block_len = self->block_lengths_[block_ix];
uint8_t block_type = self->block_types_[block_ix];
self->block_len_ = block_len;
- self->entropy_ix_ = block_type * self->histogram_length_;
+ self->entropy_ix_ = block_type * self->alphabet_size_;
StoreBlockSwitch(&self->block_split_code_, block_len, block_type, 0,
storage_ix, storage);
}
@@ -922,7 +919,7 @@ static void StoreSymbolWithContext(BlockEncoder* self, size_t symbol,
--self->block_len_;
{
size_t histo_ix = context_map[self->entropy_ix_ + context];
- size_t ix = histo_ix * self->histogram_length_ + symbol;
+ size_t ix = histo_ix * self->alphabet_size_ + symbol;
BrotliWriteBits(self->depths_[ix], self->bits_[ix], storage_ix, storage);
}
}
@@ -948,38 +945,42 @@ static void JumpToByteBoundary(size_t* storage_ix, uint8_t* storage) {
}
void BrotliStoreMetaBlock(MemoryManager* m,
- const uint8_t* input, size_t start_pos, size_t length, size_t mask,
- uint8_t prev_byte, uint8_t prev_byte2, BROTLI_BOOL is_last,
- const BrotliEncoderParams* params, ContextType literal_context_mode,
- const Command* commands, size_t n_commands, const MetaBlockSplit* mb,
- size_t* storage_ix, uint8_t* storage) {
-
+ const uint8_t* input,
+ size_t start_pos,
+ size_t length,
+ size_t mask,
+ uint8_t prev_byte,
+ uint8_t prev_byte2,
+ BROTLI_BOOL is_last,
+ uint32_t num_direct_distance_codes,
+ uint32_t distance_postfix_bits,
+ ContextType literal_context_mode,
+ const Command *commands,
+ size_t n_commands,
+ const MetaBlockSplit* mb,
+ size_t *storage_ix,
+ uint8_t *storage) {
size_t pos = start_pos;
size_t i;
- uint32_t num_distance_symbols = params->dist.alphabet_size;
- uint32_t num_effective_distance_symbols = num_distance_symbols;
+ size_t num_distance_codes =
+ BROTLI_NUM_DISTANCE_SHORT_CODES + num_direct_distance_codes +
+ (48u << distance_postfix_bits);
HuffmanTree* tree;
- ContextLut literal_context_lut = BROTLI_CONTEXT_LUT(literal_context_mode);
BlockEncoder literal_enc;
BlockEncoder command_enc;
BlockEncoder distance_enc;
- const BrotliDistanceParams* dist = &params->dist;
- if (params->large_window &&
- num_effective_distance_symbols > BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS) {
- num_effective_distance_symbols = BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS;
- }
StoreCompressedMetaBlockHeader(is_last, length, storage_ix, storage);
tree = BROTLI_ALLOC(m, HuffmanTree, MAX_HUFFMAN_TREE_SIZE);
if (BROTLI_IS_OOM(m)) return;
- InitBlockEncoder(&literal_enc, BROTLI_NUM_LITERAL_SYMBOLS,
- mb->literal_split.num_types, mb->literal_split.types,
- mb->literal_split.lengths, mb->literal_split.num_blocks);
+ InitBlockEncoder(&literal_enc, 256, mb->literal_split.num_types,
+ mb->literal_split.types, mb->literal_split.lengths,
+ mb->literal_split.num_blocks);
InitBlockEncoder(&command_enc, BROTLI_NUM_COMMAND_SYMBOLS,
mb->command_split.num_types, mb->command_split.types,
mb->command_split.lengths, mb->command_split.num_blocks);
- InitBlockEncoder(&distance_enc, num_effective_distance_symbols,
+ InitBlockEncoder(&distance_enc, num_distance_codes,
mb->distance_split.num_types, mb->distance_split.types,
mb->distance_split.lengths, mb->distance_split.num_blocks);
@@ -988,10 +989,9 @@ void BrotliStoreMetaBlock(MemoryManager* m,
BuildAndStoreBlockSwitchEntropyCodes(
&distance_enc, tree, storage_ix, storage);
- BrotliWriteBits(2, dist->distance_postfix_bits, storage_ix, storage);
- BrotliWriteBits(
- 4, dist->num_direct_distance_codes >> dist->distance_postfix_bits,
- storage_ix, storage);
+ BrotliWriteBits(2, distance_postfix_bits, storage_ix, storage);
+ BrotliWriteBits(4, num_direct_distance_codes >> distance_postfix_bits,
+ storage_ix, storage);
for (i = 0; i < mb->literal_split.num_types; ++i) {
BrotliWriteBits(2, literal_context_mode, storage_ix, storage);
}
@@ -1017,16 +1017,13 @@ void BrotliStoreMetaBlock(MemoryManager* m,
}
BuildAndStoreEntropyCodesLiteral(m, &literal_enc, mb->literal_histograms,
- mb->literal_histograms_size, BROTLI_NUM_LITERAL_SYMBOLS, tree,
- storage_ix, storage);
+ mb->literal_histograms_size, tree, storage_ix, storage);
if (BROTLI_IS_OOM(m)) return;
BuildAndStoreEntropyCodesCommand(m, &command_enc, mb->command_histograms,
- mb->command_histograms_size, BROTLI_NUM_COMMAND_SYMBOLS, tree,
- storage_ix, storage);
+ mb->command_histograms_size, tree, storage_ix, storage);
if (BROTLI_IS_OOM(m)) return;
BuildAndStoreEntropyCodesDistance(m, &distance_enc, mb->distance_histograms,
- mb->distance_histograms_size, num_distance_symbols, tree,
- storage_ix, storage);
+ mb->distance_histograms_size, tree, storage_ix, storage);
if (BROTLI_IS_OOM(m)) return;
BROTLI_FREE(m, tree);
@@ -1044,8 +1041,7 @@ void BrotliStoreMetaBlock(MemoryManager* m,
} else {
size_t j;
for (j = cmd.insert_len_; j != 0; --j) {
- size_t context =
- BROTLI_CONTEXT(prev_byte, prev_byte2, literal_context_lut);
+ size_t context = Context(prev_byte, prev_byte2, literal_context_mode);
uint8_t literal = input[pos & mask];
StoreSymbolWithContext(&literal_enc, literal, context,
mb->literal_context_map, storage_ix, storage,
@@ -1060,9 +1056,9 @@ void BrotliStoreMetaBlock(MemoryManager* m,
prev_byte2 = input[(pos - 2) & mask];
prev_byte = input[(pos - 1) & mask];
if (cmd.cmd_prefix_ >= 128) {
- size_t dist_code = cmd.dist_prefix_ & 0x3FF;
- uint32_t distnumextra = cmd.dist_prefix_ >> 10;
- uint64_t distextra = cmd.dist_extra_;
+ size_t dist_code = cmd.dist_prefix_;
+ uint32_t distnumextra = cmd.dist_extra_ >> 24;
+ uint64_t distextra = cmd.dist_extra_ & 0xffffff;
if (mb->distance_context_map_size == 0) {
StoreSymbol(&distance_enc, dist_code, storage_ix, storage);
} else {
@@ -1086,7 +1082,7 @@ void BrotliStoreMetaBlock(MemoryManager* m,
static void BuildHistograms(const uint8_t* input,
size_t start_pos,
size_t mask,
- const Command* commands,
+ const Command *commands,
size_t n_commands,
HistogramLiteral* lit_histo,
HistogramCommand* cmd_histo,
@@ -1103,7 +1099,7 @@ static void BuildHistograms(const uint8_t* input,
}
pos += CommandCopyLen(&cmd);
if (CommandCopyLen(&cmd) && cmd.cmd_prefix_ >= 128) {
- HistogramAddDistance(dist_histo, cmd.dist_prefix_ & 0x3FF);
+ HistogramAddDistance(dist_histo, cmd.dist_prefix_);
}
}
}
@@ -1111,7 +1107,7 @@ static void BuildHistograms(const uint8_t* input,
static void StoreDataWithHuffmanCodes(const uint8_t* input,
size_t start_pos,
size_t mask,
- const Command* commands,
+ const Command *commands,
size_t n_commands,
const uint8_t* lit_depth,
const uint16_t* lit_bits,
@@ -1138,9 +1134,9 @@ static void StoreDataWithHuffmanCodes(const uint8_t* input,
}
pos += CommandCopyLen(&cmd);
if (CommandCopyLen(&cmd) && cmd.cmd_prefix_ >= 128) {
- const size_t dist_code = cmd.dist_prefix_ & 0x3FF;
- const uint32_t distnumextra = cmd.dist_prefix_ >> 10;
- const uint32_t distextra = cmd.dist_extra_;
+ const size_t dist_code = cmd.dist_prefix_;
+ const uint32_t distnumextra = cmd.dist_extra_ >> 24;
+ const uint32_t distextra = cmd.dist_extra_ & 0xffffff;
BrotliWriteBits(dist_depth[dist_code], dist_bits[dist_code],
storage_ix, storage);
BrotliWriteBits(distnumextra, distextra, storage_ix, storage);
@@ -1149,10 +1145,15 @@ static void StoreDataWithHuffmanCodes(const uint8_t* input,
}
void BrotliStoreMetaBlockTrivial(MemoryManager* m,
- const uint8_t* input, size_t start_pos, size_t length, size_t mask,
- BROTLI_BOOL is_last, const BrotliEncoderParams* params,
- const Command* commands, size_t n_commands,
- size_t* storage_ix, uint8_t* storage) {
+ const uint8_t* input,
+ size_t start_pos,
+ size_t length,
+ size_t mask,
+ BROTLI_BOOL is_last,
+ const Command *commands,
+ size_t n_commands,
+ size_t *storage_ix,
+ uint8_t *storage) {
HistogramLiteral lit_histo;
HistogramCommand cmd_histo;
HistogramDistance dist_histo;
@@ -1160,10 +1161,9 @@ void BrotliStoreMetaBlockTrivial(MemoryManager* m,
uint16_t lit_bits[BROTLI_NUM_LITERAL_SYMBOLS];
uint8_t cmd_depth[BROTLI_NUM_COMMAND_SYMBOLS];
uint16_t cmd_bits[BROTLI_NUM_COMMAND_SYMBOLS];
- uint8_t dist_depth[MAX_SIMPLE_DISTANCE_ALPHABET_SIZE];
- uint16_t dist_bits[MAX_SIMPLE_DISTANCE_ALPHABET_SIZE];
+ uint8_t dist_depth[SIMPLE_DISTANCE_ALPHABET_SIZE];
+ uint16_t dist_bits[SIMPLE_DISTANCE_ALPHABET_SIZE];
HuffmanTree* tree;
- uint32_t num_distance_symbols = params->dist.alphabet_size;
StoreCompressedMetaBlockHeader(is_last, length, storage_ix, storage);
@@ -1178,16 +1178,14 @@ void BrotliStoreMetaBlockTrivial(MemoryManager* m,
tree = BROTLI_ALLOC(m, HuffmanTree, MAX_HUFFMAN_TREE_SIZE);
if (BROTLI_IS_OOM(m)) return;
- BuildAndStoreHuffmanTree(lit_histo.data_, BROTLI_NUM_LITERAL_SYMBOLS,
- BROTLI_NUM_LITERAL_SYMBOLS, tree,
+ BuildAndStoreHuffmanTree(lit_histo.data_, BROTLI_NUM_LITERAL_SYMBOLS, tree,
lit_depth, lit_bits,
storage_ix, storage);
- BuildAndStoreHuffmanTree(cmd_histo.data_, BROTLI_NUM_COMMAND_SYMBOLS,
- BROTLI_NUM_COMMAND_SYMBOLS, tree,
+ BuildAndStoreHuffmanTree(cmd_histo.data_, BROTLI_NUM_COMMAND_SYMBOLS, tree,
cmd_depth, cmd_bits,
storage_ix, storage);
- BuildAndStoreHuffmanTree(dist_histo.data_, MAX_SIMPLE_DISTANCE_ALPHABET_SIZE,
- num_distance_symbols, tree,
+ BuildAndStoreHuffmanTree(dist_histo.data_, SIMPLE_DISTANCE_ALPHABET_SIZE,
+ tree,
dist_depth, dist_bits,
storage_ix, storage);
BROTLI_FREE(m, tree);
@@ -1202,14 +1200,15 @@ void BrotliStoreMetaBlockTrivial(MemoryManager* m,
}
void BrotliStoreMetaBlockFast(MemoryManager* m,
- const uint8_t* input, size_t start_pos, size_t length, size_t mask,
- BROTLI_BOOL is_last, const BrotliEncoderParams* params,
- const Command* commands, size_t n_commands,
- size_t* storage_ix, uint8_t* storage) {
- uint32_t num_distance_symbols = params->dist.alphabet_size;
- uint32_t distance_alphabet_bits =
- Log2FloorNonZero(num_distance_symbols - 1) + 1;
-
+ const uint8_t* input,
+ size_t start_pos,
+ size_t length,
+ size_t mask,
+ BROTLI_BOOL is_last,
+ const Command *commands,
+ size_t n_commands,
+ size_t *storage_ix,
+ uint8_t *storage) {
StoreCompressedMetaBlockHeader(is_last, length, storage_ix, storage);
BrotliWriteBits(13, 0, storage_ix, storage);
@@ -1253,8 +1252,8 @@ void BrotliStoreMetaBlockFast(MemoryManager* m,
uint16_t lit_bits[BROTLI_NUM_LITERAL_SYMBOLS];
uint8_t cmd_depth[BROTLI_NUM_COMMAND_SYMBOLS];
uint16_t cmd_bits[BROTLI_NUM_COMMAND_SYMBOLS];
- uint8_t dist_depth[MAX_SIMPLE_DISTANCE_ALPHABET_SIZE];
- uint16_t dist_bits[MAX_SIMPLE_DISTANCE_ALPHABET_SIZE];
+ uint8_t dist_depth[SIMPLE_DISTANCE_ALPHABET_SIZE];
+ uint16_t dist_bits[SIMPLE_DISTANCE_ALPHABET_SIZE];
HistogramClearLiteral(&lit_histo);
HistogramClearCommand(&cmd_histo);
HistogramClearDistance(&dist_histo);
@@ -1275,7 +1274,7 @@ void BrotliStoreMetaBlockFast(MemoryManager* m,
BrotliBuildAndStoreHuffmanTreeFast(m, dist_histo.data_,
dist_histo.total_count_,
/* max_bits = */
- distance_alphabet_bits,
+ SIMPLE_DISTANCE_ALPHABET_BITS,
dist_depth, dist_bits,
storage_ix, storage);
if (BROTLI_IS_OOM(m)) return;
@@ -1294,11 +1293,11 @@ void BrotliStoreMetaBlockFast(MemoryManager* m,
/* This is for storing uncompressed blocks (simple raw storage of
bytes-as-bytes). */
void BrotliStoreUncompressedMetaBlock(BROTLI_BOOL is_final_block,
- const uint8_t* BROTLI_RESTRICT input,
+ const uint8_t * BROTLI_RESTRICT input,
size_t position, size_t mask,
size_t len,
- size_t* BROTLI_RESTRICT storage_ix,
- uint8_t* BROTLI_RESTRICT storage) {
+ size_t * BROTLI_RESTRICT storage_ix,
+ uint8_t * BROTLI_RESTRICT storage) {
size_t masked_pos = position & mask;
BrotliStoreUncompressedMetaBlockHeader(len, storage_ix, storage);
JumpToByteBoundary(storage_ix, storage);
diff --git a/c/enc/brotli_bit_stream.h b/c/enc/brotli_bit_stream.h
index 2ed703b..2c8bfed 100644
--- a/c/enc/brotli_bit_stream.h
+++ b/c/enc/brotli_bit_stream.h
@@ -16,13 +16,13 @@
#ifndef BROTLI_ENC_BROTLI_BIT_STREAM_H_
#define BROTLI_ENC_BROTLI_BIT_STREAM_H_
-#include "../common/context.h"
-#include "../common/platform.h"
#include <brotli/types.h>
#include "./command.h"
+#include "./context.h"
#include "./entropy_encode.h"
#include "./memory.h"
#include "./metablock.h"
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -32,7 +32,7 @@ extern "C" {
position for the current storage. */
BROTLI_INTERNAL void BrotliStoreHuffmanTree(const uint8_t* depths, size_t num,
- HuffmanTree* tree, size_t* storage_ix, uint8_t* storage);
+ HuffmanTree* tree, size_t *storage_ix, uint8_t *storage);
BROTLI_INTERNAL void BrotliBuildAndStoreHuffmanTreeFast(
MemoryManager* m, const uint32_t* histogram, const size_t histogram_total,
@@ -42,40 +42,59 @@ BROTLI_INTERNAL void BrotliBuildAndStoreHuffmanTreeFast(
/* REQUIRES: length > 0 */
/* REQUIRES: length <= (1 << 24) */
BROTLI_INTERNAL void BrotliStoreMetaBlock(MemoryManager* m,
- const uint8_t* input, size_t start_pos, size_t length, size_t mask,
- uint8_t prev_byte, uint8_t prev_byte2, BROTLI_BOOL is_last,
- const BrotliEncoderParams* params, ContextType literal_context_mode,
- const Command* commands, size_t n_commands, const MetaBlockSplit* mb,
- size_t* storage_ix, uint8_t* storage);
+ const uint8_t* input,
+ size_t start_pos,
+ size_t length,
+ size_t mask,
+ uint8_t prev_byte,
+ uint8_t prev_byte2,
+ BROTLI_BOOL is_final_block,
+ uint32_t num_direct_distance_codes,
+ uint32_t distance_postfix_bits,
+ ContextType literal_context_mode,
+ const Command* commands,
+ size_t n_commands,
+ const MetaBlockSplit* mb,
+ size_t* storage_ix,
+ uint8_t* storage);
/* Stores the meta-block without doing any block splitting, just collects
one histogram per block category and uses that for entropy coding.
REQUIRES: length > 0
REQUIRES: length <= (1 << 24) */
BROTLI_INTERNAL void BrotliStoreMetaBlockTrivial(MemoryManager* m,
- const uint8_t* input, size_t start_pos, size_t length, size_t mask,
- BROTLI_BOOL is_last, const BrotliEncoderParams* params,
- const Command* commands, size_t n_commands,
- size_t* storage_ix, uint8_t* storage);
+ const uint8_t* input,
+ size_t start_pos,
+ size_t length,
+ size_t mask,
+ BROTLI_BOOL is_last,
+ const Command *commands,
+ size_t n_commands,
+ size_t* storage_ix,
+ uint8_t* storage);
/* Same as above, but uses static prefix codes for histograms with a only a few
symbols, and uses static code length prefix codes for all other histograms.
REQUIRES: length > 0
REQUIRES: length <= (1 << 24) */
BROTLI_INTERNAL void BrotliStoreMetaBlockFast(MemoryManager* m,
- const uint8_t* input, size_t start_pos, size_t length, size_t mask,
- BROTLI_BOOL is_last, const BrotliEncoderParams* params,
- const Command* commands, size_t n_commands,
- size_t* storage_ix, uint8_t* storage);
+ const uint8_t* input,
+ size_t start_pos,
+ size_t length,
+ size_t mask,
+ BROTLI_BOOL is_last,
+ const Command *commands,
+ size_t n_commands,
+ size_t* storage_ix,
+ uint8_t* storage);
/* This is for storing uncompressed blocks (simple raw storage of
bytes-as-bytes).
REQUIRES: length > 0
REQUIRES: length <= (1 << 24) */
BROTLI_INTERNAL void BrotliStoreUncompressedMetaBlock(
- BROTLI_BOOL is_final_block, const uint8_t* BROTLI_RESTRICT input,
- size_t position, size_t mask, size_t len,
- size_t* BROTLI_RESTRICT storage_ix, uint8_t* BROTLI_RESTRICT storage);
+ BROTLI_BOOL is_final_block, const uint8_t* input, size_t position,
+ size_t mask, size_t len, size_t* storage_ix, uint8_t* storage);
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
diff --git a/c/enc/cluster.c b/c/enc/cluster.c
index a20dfd3..bb66327 100644
--- a/c/enc/cluster.c
+++ b/c/enc/cluster.c
@@ -8,12 +8,12 @@
#include "./cluster.h"
-#include "../common/platform.h"
#include <brotli/types.h>
#include "./bit_cost.h" /* BrotliPopulationCost */
#include "./fast_log.h"
#include "./histogram.h"
#include "./memory.h"
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
diff --git a/c/enc/cluster.h b/c/enc/cluster.h
index bb26124..be58614 100644
--- a/c/enc/cluster.h
+++ b/c/enc/cluster.h
@@ -9,10 +9,10 @@
#ifndef BROTLI_ENC_CLUSTER_H_
#define BROTLI_ENC_CLUSTER_H_
-#include "../common/platform.h"
#include <brotli/types.h>
#include "./histogram.h"
#include "./memory.h"
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
diff --git a/c/enc/command.h b/c/enc/command.h
index 1aac856..632318e 100644
--- a/c/enc/command.h
+++ b/c/enc/command.h
@@ -10,10 +10,9 @@
#define BROTLI_ENC_COMMAND_H_
#include "../common/constants.h"
-#include "../common/platform.h"
+#include <brotli/port.h>
#include <brotli/types.h>
#include "./fast_log.h"
-#include "./params.h"
#include "./prefix.h"
#if defined(__cplusplus) || defined(c_plusplus)
@@ -62,21 +61,21 @@ static BROTLI_INLINE uint16_t GetCopyLengthCode(size_t copylen) {
static BROTLI_INLINE uint16_t CombineLengthCodes(
uint16_t inscode, uint16_t copycode, BROTLI_BOOL use_last_distance) {
uint16_t bits64 =
- (uint16_t)((copycode & 0x7u) | ((inscode & 0x7u) << 3u));
- if (use_last_distance && inscode < 8u && copycode < 16u) {
- return (copycode < 8u) ? bits64 : (bits64 | 64u);
+ (uint16_t)((copycode & 0x7u) | ((inscode & 0x7u) << 3));
+ if (use_last_distance && inscode < 8 && copycode < 16) {
+ return (copycode < 8) ? bits64 : (bits64 | 64);
} else {
/* Specification: 5 Encoding of ... (last table) */
/* offset = 2 * index, where index is in range [0..8] */
- uint32_t offset = 2u * ((copycode >> 3u) + 3u * (inscode >> 3u));
+ int offset = 2 * ((copycode >> 3) + 3 * (inscode >> 3));
/* All values in specification are K * 64,
where K = [2, 3, 6, 4, 5, 8, 7, 9, 10],
i + 1 = [1, 2, 3, 4, 5, 6, 7, 8, 9],
K - i - 1 = [1, 1, 3, 0, 0, 2, 0, 1, 2] = D.
All values in D require only 2 bits to encode.
Magic constant is shifted 6 bits left, to avoid final multiplication. */
- offset = (offset << 5u) + 0x40u + ((0x520D40u >> offset) & 0xC0u);
- return (uint16_t)(offset | bits64);
+ offset = (offset << 5) + 0x40 + ((0x520D40 >> offset) & 0xC0);
+ return (uint16_t)offset | bits64;
}
}
@@ -106,61 +105,53 @@ static BROTLI_INLINE uint32_t GetCopyExtra(uint16_t copycode) {
typedef struct Command {
uint32_t insert_len_;
- /* Stores copy_len in low 25 bits and copy_code - copy_len in high 7 bit. */
+ /* Stores copy_len in low 24 bits and copy_len XOR copy_code in high 8 bit. */
uint32_t copy_len_;
- /* Stores distance extra bits. */
uint32_t dist_extra_;
uint16_t cmd_prefix_;
- /* Stores distance code in low 10 bits
- and number of extra bits in high 6 bits. */
uint16_t dist_prefix_;
} Command;
/* distance_code is e.g. 0 for same-as-last short code, or 16 for offset 1. */
-static BROTLI_INLINE void InitCommand(Command* self,
- const BrotliDistanceParams* dist, size_t insertlen,
+static BROTLI_INLINE void InitCommand(Command* self, size_t insertlen,
size_t copylen, int copylen_code_delta, size_t distance_code) {
/* Don't rely on signed int representation, use honest casts. */
uint32_t delta = (uint8_t)((int8_t)copylen_code_delta);
self->insert_len_ = (uint32_t)insertlen;
- self->copy_len_ = (uint32_t)(copylen | (delta << 25));
+ self->copy_len_ = (uint32_t)(copylen | (delta << 24));
/* The distance prefix and extra bits are stored in this Command as if
npostfix and ndirect were 0, they are only recomputed later after the
clustering if needed. */
PrefixEncodeCopyDistance(
- distance_code, dist->num_direct_distance_codes,
- dist->distance_postfix_bits, &self->dist_prefix_, &self->dist_extra_);
+ distance_code, 0, 0, &self->dist_prefix_, &self->dist_extra_);
GetLengthCode(
insertlen, (size_t)((int)copylen + copylen_code_delta),
- TO_BROTLI_BOOL((self->dist_prefix_ & 0x3FF) == 0), &self->cmd_prefix_);
+ TO_BROTLI_BOOL(self->dist_prefix_ == 0), &self->cmd_prefix_);
}
static BROTLI_INLINE void InitInsertCommand(Command* self, size_t insertlen) {
self->insert_len_ = (uint32_t)insertlen;
- self->copy_len_ = 4 << 25;
+ self->copy_len_ = 4 << 24;
self->dist_extra_ = 0;
self->dist_prefix_ = BROTLI_NUM_DISTANCE_SHORT_CODES;
GetLengthCode(insertlen, 4, BROTLI_FALSE, &self->cmd_prefix_);
}
-static BROTLI_INLINE uint32_t CommandRestoreDistanceCode(
- const Command* self, const BrotliDistanceParams* dist) {
- if ((self->dist_prefix_ & 0x3FFu) <
- BROTLI_NUM_DISTANCE_SHORT_CODES + dist->num_direct_distance_codes) {
- return self->dist_prefix_ & 0x3FFu;
+static BROTLI_INLINE uint32_t CommandRestoreDistanceCode(const Command* self) {
+ if (self->dist_prefix_ < BROTLI_NUM_DISTANCE_SHORT_CODES) {
+ return self->dist_prefix_;
} else {
- uint32_t dcode = self->dist_prefix_ & 0x3FFu;
- uint32_t nbits = self->dist_prefix_ >> 10;
- uint32_t extra = self->dist_extra_;
- uint32_t postfix_mask = (1U << dist->distance_postfix_bits) - 1U;
- uint32_t hcode = (dcode - dist->num_direct_distance_codes -
- BROTLI_NUM_DISTANCE_SHORT_CODES) >>
- dist->distance_postfix_bits;
- uint32_t lcode = (dcode - dist->num_direct_distance_codes -
- BROTLI_NUM_DISTANCE_SHORT_CODES) & postfix_mask;
- uint32_t offset = ((2U + (hcode & 1U)) << nbits) - 4U;
- return ((offset + extra) << dist->distance_postfix_bits) + lcode +
- dist->num_direct_distance_codes + BROTLI_NUM_DISTANCE_SHORT_CODES;
+ uint32_t nbits = self->dist_extra_ >> 24;
+ uint32_t extra = self->dist_extra_ & 0xffffff;
+ /* It is assumed that the distance was first encoded with NPOSTFIX = 0 and
+ NDIRECT = 0, so the code itself is of this form:
+ BROTLI_NUM_DISTANCE_SHORT_CODES + 2 * (nbits - 1) + prefix_bit
+ Therefore, the following expression results in (2 + prefix_bit). */
+ uint32_t prefix =
+ self->dist_prefix_ + 4u - BROTLI_NUM_DISTANCE_SHORT_CODES - 2u * nbits;
+ /* Subtract 4 for offset (Chapter 4.) and
+ increase by BROTLI_NUM_DISTANCE_SHORT_CODES - 1 */
+ return (prefix << nbits) + extra + BROTLI_NUM_DISTANCE_SHORT_CODES - 4u;
}
}
@@ -174,13 +165,12 @@ static BROTLI_INLINE uint32_t CommandDistanceContext(const Command* self) {
}
static BROTLI_INLINE uint32_t CommandCopyLen(const Command* self) {
- return self->copy_len_ & 0x1FFFFFF;
+ return self->copy_len_ & 0xFFFFFF;
}
static BROTLI_INLINE uint32_t CommandCopyLenCode(const Command* self) {
- uint32_t modifier = self->copy_len_ >> 25;
- int32_t delta = (int8_t)((uint8_t)(modifier | ((modifier & 0x40) << 1)));
- return (uint32_t)((int32_t)(self->copy_len_ & 0x1FFFFFF) + delta);
+ int32_t delta = (int8_t)((uint8_t)(self->copy_len_ >> 24));
+ return (uint32_t)((int32_t)(self->copy_len_ & 0xFFFFFF) + delta);
}
#if defined(__cplusplus) || defined(c_plusplus)
diff --git a/c/enc/compress_fragment.c b/c/enc/compress_fragment.c
index 9e50b20..b4ca810 100644
--- a/c/enc/compress_fragment.c
+++ b/c/enc/compress_fragment.c
@@ -17,15 +17,16 @@
#include <string.h> /* memcmp, memcpy, memset */
#include "../common/constants.h"
-#include "../common/platform.h"
#include <brotli/types.h>
#include "./brotli_bit_stream.h"
#include "./entropy_encode.h"
#include "./fast_log.h"
#include "./find_match_length.h"
#include "./memory.h"
+#include "./port.h"
#include "./write_bits.h"
+
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
@@ -38,7 +39,7 @@ extern "C" {
* 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 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;
@@ -47,8 +48,8 @@ static BROTLI_INLINE uint32_t Hash(const uint8_t* p, size_t shift) {
static BROTLI_INLINE uint32_t HashBytesAtOffset(
uint64_t v, int offset, size_t shift) {
- BROTLI_DCHECK(offset >= 0);
- BROTLI_DCHECK(offset <= 3);
+ assert(offset >= 0);
+ assert(offset <= 3);
{
const uint64_t h = ((v >> (8 * offset)) << 24) * kHashMul32;
return (uint32_t)(h >> shift);
@@ -57,7 +58,7 @@ static BROTLI_INLINE uint32_t HashBytesAtOffset(
static BROTLI_INLINE BROTLI_BOOL IsMatch(const uint8_t* p1, const uint8_t* p2) {
return TO_BROTLI_BOOL(
- BrotliUnalignedRead32(p1) == BrotliUnalignedRead32(p2) &&
+ BROTLI_UNALIGNED_LOAD32(p1) == BROTLI_UNALIGNED_LOAD32(p2) &&
p1[4] == p2[4]);
}
@@ -202,7 +203,7 @@ static BROTLI_INLINE void EmitInsertLen(size_t insertlen,
} else {
BrotliWriteBits(depth[61], bits[61], storage_ix, storage);
BrotliWriteBits(12, insertlen - 2114, storage_ix, storage);
- ++histo[61];
+ ++histo[21];
}
}
@@ -215,11 +216,11 @@ static BROTLI_INLINE void EmitLongInsertLen(size_t insertlen,
if (insertlen < 22594) {
BrotliWriteBits(depth[62], bits[62], storage_ix, storage);
BrotliWriteBits(14, insertlen - 6210, storage_ix, storage);
- ++histo[62];
+ ++histo[22];
} else {
BrotliWriteBits(depth[63], bits[63], storage_ix, storage);
BrotliWriteBits(24, insertlen - 22594, storage_ix, storage);
- ++histo[63];
+ ++histo[23];
}
}
@@ -251,7 +252,7 @@ static BROTLI_INLINE void EmitCopyLen(size_t copylen,
} else {
BrotliWriteBits(depth[39], bits[39], storage_ix, storage);
BrotliWriteBits(24, copylen - 2118, storage_ix, storage);
- ++histo[39];
+ ++histo[47];
}
}
@@ -293,7 +294,7 @@ static BROTLI_INLINE void EmitCopyLenLastDistance(size_t copylen,
BrotliWriteBits(depth[39], bits[39], storage_ix, storage);
BrotliWriteBits(24, copylen - 2120, storage_ix, storage);
BrotliWriteBits(depth[64], bits[64], storage_ix, storage);
- ++histo[39];
+ ++histo[47];
++histo[64];
}
}
@@ -343,7 +344,7 @@ static void BrotliStoreMetaBlockHeader(
}
static void UpdateBits(size_t n_bits, uint32_t bits, size_t pos,
- uint8_t* array) {
+ uint8_t *array) {
while (n_bits > 0) {
size_t byte_pos = pos >> 3;
size_t n_unchanged_bits = pos & 7;
@@ -521,12 +522,12 @@ static BROTLI_INLINE void BrotliCompressFragmentFastImpl(
const uint8_t* next_ip = ip;
const uint8_t* candidate;
- BROTLI_DCHECK(next_emit < ip);
+ assert(next_emit < ip);
trawl:
do {
uint32_t hash = next_hash;
uint32_t bytes_between_hash_lookups = skip++ >> 5;
- BROTLI_DCHECK(hash == Hash(next_ip, shift));
+ assert(hash == Hash(next_ip, shift));
ip = next_ip;
next_ip = ip + bytes_between_hash_lookups;
if (BROTLI_PREDICT_FALSE(next_ip > ip_limit)) {
@@ -541,8 +542,8 @@ trawl:
}
}
candidate = base_ip + table[hash];
- BROTLI_DCHECK(candidate >= base_ip);
- BROTLI_DCHECK(candidate < ip);
+ assert(candidate >= base_ip);
+ assert(candidate < ip);
table[hash] = (int)(ip - base_ip);
} while (BROTLI_PREDICT_TRUE(!IsMatch(ip, candidate)));
@@ -565,7 +566,7 @@ trawl:
int distance = (int)(base - candidate); /* > 0 */
size_t insert = (size_t)(base - next_emit);
ip += matched;
- BROTLI_DCHECK(0 == memcmp(base, candidate, matched));
+ assert(0 == memcmp(base, candidate, matched));
if (BROTLI_PREDICT_TRUE(insert < 6210)) {
EmitInsertLen(insert, cmd_depth, cmd_bits, cmd_histo,
storage_ix, storage);
@@ -625,7 +626,7 @@ trawl:
if (ip - candidate > MAX_DISTANCE) break;
ip += matched;
last_distance = (int)(base - candidate); /* > 0 */
- BROTLI_DCHECK(0 == memcmp(base, candidate, matched));
+ assert(0 == memcmp(base, candidate, matched));
EmitCopyLen(matched, cmd_depth, cmd_bits, cmd_histo,
storage_ix, storage);
EmitDistance((size_t)last_distance, cmd_depth, cmd_bits,
@@ -658,7 +659,7 @@ trawl:
}
emit_remainder:
- BROTLI_DCHECK(next_emit <= ip_end);
+ assert(next_emit <= ip_end);
input += block_size;
input_size -= block_size;
block_size = BROTLI_MIN(size_t, input_size, kMergeBlockSize);
@@ -668,7 +669,7 @@ trawl:
if (input_size > 0 &&
total_block_size + block_size <= (1 << 20) &&
ShouldMergeBlock(input, block_size, lit_depth)) {
- BROTLI_DCHECK(total_block_size > (1 << 16));
+ assert(total_block_size > (1 << 16));
/* Update the size of the current meta-block and continue emitting commands.
We can do this because the current size and the new size both have 5
nibbles. */
@@ -751,7 +752,7 @@ void BrotliCompressFragmentFast(
const size_t table_bits = Log2FloorNonZero(table_size);
if (input_size == 0) {
- BROTLI_DCHECK(is_last);
+ assert(is_last);
BrotliWriteBits(1, 1, storage_ix, storage); /* islast */
BrotliWriteBits(1, 1, storage_ix, storage); /* isempty */
*storage_ix = (*storage_ix + 7u) & ~7u;
@@ -767,7 +768,7 @@ void BrotliCompressFragmentFast(
break;
FOR_TABLE_BITS_(CASE_)
#undef CASE_
- default: BROTLI_DCHECK(0); break;
+ default: assert(0); break;
}
/* If output is larger than single uncompressed block, rewrite it. */
diff --git a/c/enc/compress_fragment.h b/c/enc/compress_fragment.h
index 80007f5..d221266 100644
--- a/c/enc/compress_fragment.h
+++ b/c/enc/compress_fragment.h
@@ -12,9 +12,9 @@
#ifndef BROTLI_ENC_COMPRESS_FRAGMENT_H_
#define BROTLI_ENC_COMPRESS_FRAGMENT_H_
-#include "../common/platform.h"
#include <brotli/types.h>
#include "./memory.h"
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
diff --git a/c/enc/compress_fragment_two_pass.c b/c/enc/compress_fragment_two_pass.c
index f8a5606..e6611a0 100644
--- a/c/enc/compress_fragment_two_pass.c
+++ b/c/enc/compress_fragment_two_pass.c
@@ -15,7 +15,6 @@
#include <string.h> /* memcmp, memcpy, memset */
#include "../common/constants.h"
-#include "../common/platform.h"
#include <brotli/types.h>
#include "./bit_cost.h"
#include "./brotli_bit_stream.h"
@@ -23,8 +22,10 @@
#include "./fast_log.h"
#include "./find_match_length.h"
#include "./memory.h"
+#include "./port.h"
#include "./write_bits.h"
+
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
@@ -37,31 +38,28 @@ extern "C" {
* 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 uint32_t kHashMul32 = 0x1e35a7bd;
-static BROTLI_INLINE uint32_t Hash(const uint8_t* p,
- size_t shift, size_t length) {
- const uint64_t h =
- (BROTLI_UNALIGNED_LOAD64LE(p) << ((8 - length) * 8)) * kHashMul32;
+static BROTLI_INLINE uint32_t Hash(const uint8_t* p, size_t shift) {
+ const uint64_t h = (BROTLI_UNALIGNED_LOAD64LE(p) << 16) * kHashMul32;
return (uint32_t)(h >> shift);
}
-static BROTLI_INLINE uint32_t HashBytesAtOffset(uint64_t v, size_t offset,
- size_t shift, size_t length) {
- BROTLI_DCHECK(offset <= 8 - length);
+static BROTLI_INLINE uint32_t HashBytesAtOffset(
+ uint64_t v, int offset, size_t shift) {
+ assert(offset >= 0);
+ assert(offset <= 2);
{
- const uint64_t h = ((v >> (8 * offset)) << ((8 - length) * 8)) * kHashMul32;
+ const uint64_t h = ((v >> (8 * offset)) << 16) * kHashMul32;
return (uint32_t)(h >> shift);
}
}
-static BROTLI_INLINE BROTLI_BOOL IsMatch(const uint8_t* p1, const uint8_t* p2,
- size_t length) {
- if (BrotliUnalignedRead32(p1) == BrotliUnalignedRead32(p2)) {
- if (length == 4) return BROTLI_TRUE;
- return TO_BROTLI_BOOL(p1[4] == p2[4] && p1[5] == p2[5]);
- }
- return BROTLI_FALSE;
+static BROTLI_INLINE BROTLI_BOOL IsMatch(const uint8_t* p1, const uint8_t* p2) {
+ return TO_BROTLI_BOOL(
+ BROTLI_UNALIGNED_LOAD32(p1) == BROTLI_UNALIGNED_LOAD32(p2) &&
+ p1[4] == p2[4] &&
+ p1[5] == p2[5]);
}
/* Builds a command and distance prefix code (each 64 symbols) into "depth" and
@@ -238,8 +236,7 @@ static void BrotliStoreMetaBlockHeader(
static BROTLI_INLINE void CreateCommands(const uint8_t* input,
size_t block_size, size_t input_size, const uint8_t* base_ip, int* table,
- size_t table_bits, size_t min_match,
- uint8_t** literals, uint32_t** commands) {
+ size_t table_bits, uint8_t** literals, uint32_t** commands) {
/* "ip" is the input pointer. */
const uint8_t* ip = input;
const size_t shift = 64u - table_bits;
@@ -251,18 +248,19 @@ static BROTLI_INLINE void CreateCommands(const uint8_t* input,
int last_distance = -1;
const size_t kInputMarginBytes = BROTLI_WINDOW_GAP;
+ const size_t kMinMatchLen = 6;
if (BROTLI_PREDICT_TRUE(block_size >= kInputMarginBytes)) {
/* For the last block, we need to keep a 16 bytes margin so that we can be
sure that all distances are at most window size - 16.
For all other blocks, we only need to keep a margin of 5 bytes so that
we don't go over the block size with a copy. */
- const size_t len_limit = BROTLI_MIN(size_t, block_size - min_match,
+ const size_t len_limit = BROTLI_MIN(size_t, block_size - kMinMatchLen,
input_size - kInputMarginBytes);
const uint8_t* ip_limit = input + len_limit;
uint32_t next_hash;
- for (next_hash = Hash(++ip, shift, min_match); ; ) {
+ for (next_hash = Hash(++ip, shift); ; ) {
/* Step 1: Scan forward in the input looking for a 6-byte-long match.
If we get close to exhausting the input then goto emit_remainder.
@@ -283,31 +281,31 @@ static BROTLI_INLINE void CreateCommands(const uint8_t* input,
const uint8_t* next_ip = ip;
const uint8_t* candidate;
- BROTLI_DCHECK(next_emit < ip);
+ assert(next_emit < ip);
trawl:
do {
uint32_t hash = next_hash;
uint32_t bytes_between_hash_lookups = skip++ >> 5;
ip = next_ip;
- BROTLI_DCHECK(hash == Hash(ip, shift, min_match));
+ assert(hash == Hash(ip, shift));
next_ip = ip + bytes_between_hash_lookups;
if (BROTLI_PREDICT_FALSE(next_ip > ip_limit)) {
goto emit_remainder;
}
- next_hash = Hash(next_ip, shift, min_match);
+ next_hash = Hash(next_ip, shift);
candidate = ip - last_distance;
- if (IsMatch(ip, candidate, min_match)) {
+ if (IsMatch(ip, candidate)) {
if (BROTLI_PREDICT_TRUE(candidate < ip)) {
table[hash] = (int)(ip - base_ip);
break;
}
}
candidate = base_ip + table[hash];
- BROTLI_DCHECK(candidate >= base_ip);
- BROTLI_DCHECK(candidate < ip);
+ assert(candidate >= base_ip);
+ assert(candidate < ip);
table[hash] = (int)(ip - base_ip);
- } while (BROTLI_PREDICT_TRUE(!IsMatch(ip, candidate, min_match)));
+ } while (BROTLI_PREDICT_TRUE(!IsMatch(ip, candidate)));
/* Check copy distance. If candidate is not feasible, continue search.
Checking is done outside of hot loop to reduce overhead. */
@@ -322,13 +320,12 @@ trawl:
/* We have a 6-byte match at ip, and we need to emit bytes in
[next_emit, ip). */
const uint8_t* base = ip;
- size_t matched = min_match + FindMatchLengthWithLimit(
- candidate + min_match, ip + min_match,
- (size_t)(ip_end - ip) - min_match);
+ size_t matched = 6 + FindMatchLengthWithLimit(
+ candidate + 6, ip + 6, (size_t)(ip_end - ip) - 6);
int distance = (int)(base - candidate); /* > 0 */
int insert = (int)(base - next_emit);
ip += matched;
- BROTLI_DCHECK(0 == memcmp(base, candidate, matched));
+ assert(0 == memcmp(base, candidate, matched));
EmitInsertLen((uint32_t)insert, commands);
memcpy(*literals, next_emit, (size_t)insert);
*literals += insert;
@@ -349,50 +346,35 @@ trawl:
/* We could immediately start working at ip now, but to improve
compression we first update "table" with the hashes of some
positions within the last copy. */
- uint64_t input_bytes;
+ uint64_t input_bytes = BROTLI_UNALIGNED_LOAD64LE(ip - 5);
+ uint32_t prev_hash = HashBytesAtOffset(input_bytes, 0, shift);
uint32_t cur_hash;
- uint32_t prev_hash;
- if (min_match == 4) {
- input_bytes = BROTLI_UNALIGNED_LOAD64LE(ip - 3);
- cur_hash = HashBytesAtOffset(input_bytes, 3, shift, min_match);
- prev_hash = HashBytesAtOffset(input_bytes, 0, shift, min_match);
- table[prev_hash] = (int)(ip - base_ip - 3);
- prev_hash = HashBytesAtOffset(input_bytes, 1, shift, min_match);
- table[prev_hash] = (int)(ip - base_ip - 2);
- prev_hash = HashBytesAtOffset(input_bytes, 0, shift, min_match);
- table[prev_hash] = (int)(ip - base_ip - 1);
- } else {
- input_bytes = BROTLI_UNALIGNED_LOAD64LE(ip - 5);
- prev_hash = HashBytesAtOffset(input_bytes, 0, shift, min_match);
- table[prev_hash] = (int)(ip - base_ip - 5);
- prev_hash = HashBytesAtOffset(input_bytes, 1, shift, min_match);
- table[prev_hash] = (int)(ip - base_ip - 4);
- prev_hash = HashBytesAtOffset(input_bytes, 2, shift, min_match);
- table[prev_hash] = (int)(ip - base_ip - 3);
- input_bytes = BROTLI_UNALIGNED_LOAD64LE(ip - 2);
- cur_hash = HashBytesAtOffset(input_bytes, 2, shift, min_match);
- prev_hash = HashBytesAtOffset(input_bytes, 0, shift, min_match);
- table[prev_hash] = (int)(ip - base_ip - 2);
- prev_hash = HashBytesAtOffset(input_bytes, 1, shift, min_match);
- table[prev_hash] = (int)(ip - base_ip - 1);
- }
+ table[prev_hash] = (int)(ip - base_ip - 5);
+ prev_hash = HashBytesAtOffset(input_bytes, 1, shift);
+ table[prev_hash] = (int)(ip - base_ip - 4);
+ prev_hash = HashBytesAtOffset(input_bytes, 2, shift);
+ table[prev_hash] = (int)(ip - base_ip - 3);
+ input_bytes = BROTLI_UNALIGNED_LOAD64LE(ip - 2);
+ cur_hash = HashBytesAtOffset(input_bytes, 2, shift);
+ prev_hash = HashBytesAtOffset(input_bytes, 0, shift);
+ table[prev_hash] = (int)(ip - base_ip - 2);
+ prev_hash = HashBytesAtOffset(input_bytes, 1, shift);
+ table[prev_hash] = (int)(ip - base_ip - 1);
candidate = base_ip + table[cur_hash];
table[cur_hash] = (int)(ip - base_ip);
}
}
- while (ip - candidate <= MAX_DISTANCE &&
- IsMatch(ip, candidate, min_match)) {
+ while (ip - candidate <= MAX_DISTANCE && IsMatch(ip, candidate)) {
/* We have a 6-byte match at ip, and no need to emit any
literal bytes prior to ip. */
const uint8_t* base = ip;
- size_t matched = min_match + FindMatchLengthWithLimit(
- candidate + min_match, ip + min_match,
- (size_t)(ip_end - ip) - min_match);
+ size_t matched = 6 + FindMatchLengthWithLimit(
+ candidate + 6, ip + 6, (size_t)(ip_end - ip) - 6);
ip += matched;
last_distance = (int)(base - candidate); /* > 0 */
- BROTLI_DCHECK(0 == memcmp(base, candidate, matched));
+ assert(0 == memcmp(base, candidate, matched));
EmitCopyLen(matched, commands);
EmitDistance((uint32_t)last_distance, commands);
@@ -404,45 +386,32 @@ trawl:
/* We could immediately start working at ip now, but to improve
compression we first update "table" with the hashes of some
positions within the last copy. */
- uint64_t input_bytes;
+ uint64_t input_bytes = BROTLI_UNALIGNED_LOAD64LE(ip - 5);
+ uint32_t prev_hash = HashBytesAtOffset(input_bytes, 0, shift);
uint32_t cur_hash;
- uint32_t prev_hash;
- if (min_match == 4) {
- input_bytes = BROTLI_UNALIGNED_LOAD64LE(ip - 3);
- cur_hash = HashBytesAtOffset(input_bytes, 3, shift, min_match);
- prev_hash = HashBytesAtOffset(input_bytes, 0, shift, min_match);
- table[prev_hash] = (int)(ip - base_ip - 3);
- prev_hash = HashBytesAtOffset(input_bytes, 1, shift, min_match);
- table[prev_hash] = (int)(ip - base_ip - 2);
- prev_hash = HashBytesAtOffset(input_bytes, 2, shift, min_match);
- table[prev_hash] = (int)(ip - base_ip - 1);
- } else {
- input_bytes = BROTLI_UNALIGNED_LOAD64LE(ip - 5);
- prev_hash = HashBytesAtOffset(input_bytes, 0, shift, min_match);
- table[prev_hash] = (int)(ip - base_ip - 5);
- prev_hash = HashBytesAtOffset(input_bytes, 1, shift, min_match);
- table[prev_hash] = (int)(ip - base_ip - 4);
- prev_hash = HashBytesAtOffset(input_bytes, 2, shift, min_match);
- table[prev_hash] = (int)(ip - base_ip - 3);
- input_bytes = BROTLI_UNALIGNED_LOAD64LE(ip - 2);
- cur_hash = HashBytesAtOffset(input_bytes, 2, shift, min_match);
- prev_hash = HashBytesAtOffset(input_bytes, 0, shift, min_match);
- table[prev_hash] = (int)(ip - base_ip - 2);
- prev_hash = HashBytesAtOffset(input_bytes, 1, shift, min_match);
- table[prev_hash] = (int)(ip - base_ip - 1);
- }
+ table[prev_hash] = (int)(ip - base_ip - 5);
+ prev_hash = HashBytesAtOffset(input_bytes, 1, shift);
+ table[prev_hash] = (int)(ip - base_ip - 4);
+ prev_hash = HashBytesAtOffset(input_bytes, 2, shift);
+ table[prev_hash] = (int)(ip - base_ip - 3);
+ input_bytes = BROTLI_UNALIGNED_LOAD64LE(ip - 2);
+ cur_hash = HashBytesAtOffset(input_bytes, 2, shift);
+ prev_hash = HashBytesAtOffset(input_bytes, 0, shift);
+ table[prev_hash] = (int)(ip - base_ip - 2);
+ prev_hash = HashBytesAtOffset(input_bytes, 1, shift);
+ table[prev_hash] = (int)(ip - base_ip - 1);
candidate = base_ip + table[cur_hash];
table[cur_hash] = (int)(ip - base_ip);
}
}
- next_hash = Hash(++ip, shift, min_match);
+ next_hash = Hash(++ip, shift);
}
}
emit_remainder:
- BROTLI_DCHECK(next_emit <= ip_end);
+ assert(next_emit <= ip_end);
/* Emit the remaining bytes as literals. */
if (next_emit < ip_end) {
const uint32_t insert = (uint32_t)(ip_end - next_emit);
@@ -488,7 +457,7 @@ static void StoreCommands(MemoryManager* m,
for (i = 0; i < num_commands; ++i) {
const uint32_t code = commands[i] & 0xFF;
- BROTLI_DCHECK(code < 128);
+ assert(code < 128);
++cmd_histo[code];
}
cmd_histo[1] += 1;
@@ -502,7 +471,7 @@ static void StoreCommands(MemoryManager* m,
const uint32_t cmd = commands[i];
const uint32_t code = cmd & 0xFF;
const uint32_t extra = cmd >> 8;
- BROTLI_DCHECK(code < 128);
+ assert(code < 128);
BrotliWriteBits(cmd_depths[code], cmd_bits[code], storage_ix, storage);
BrotliWriteBits(kNumExtraBits[code], extra, storage_ix, storage);
if (code < 24) {
@@ -557,8 +526,7 @@ static void EmitUncompressedMetaBlock(const uint8_t* input, size_t input_size,
static BROTLI_INLINE void BrotliCompressFragmentTwoPassImpl(
MemoryManager* m, const uint8_t* input, size_t input_size,
BROTLI_BOOL is_last, uint32_t* command_buf, uint8_t* literal_buf,
- int* table, size_t table_bits, size_t min_match,
- size_t* storage_ix, uint8_t* storage) {
+ int* table, size_t table_bits, size_t* storage_ix, uint8_t* storage) {
/* Save the start of the first block for position and distance computations.
*/
const uint8_t* base_ip = input;
@@ -570,8 +538,8 @@ static BROTLI_INLINE void BrotliCompressFragmentTwoPassImpl(
uint32_t* commands = command_buf;
uint8_t* literals = literal_buf;
size_t num_literals;
- CreateCommands(input, block_size, input_size, base_ip, table,
- table_bits, min_match, &literals, &commands);
+ CreateCommands(input, block_size, input_size, base_ip, table, table_bits,
+ &literals, &commands);
num_literals = (size_t)(literals - literal_buf);
if (ShouldCompress(input, block_size, num_literals)) {
const size_t num_commands = (size_t)(commands - command_buf);
@@ -600,9 +568,8 @@ static BROTLI_NOINLINE void BrotliCompressFragmentTwoPassImpl ## B( \
MemoryManager* m, const uint8_t* input, size_t input_size, \
BROTLI_BOOL is_last, uint32_t* command_buf, uint8_t* literal_buf, \
int* table, size_t* storage_ix, uint8_t* storage) { \
- size_t min_match = (B <= 15) ? 4 : 6; \
BrotliCompressFragmentTwoPassImpl(m, input, input_size, is_last, command_buf,\
- literal_buf, table, B, min_match, storage_ix, storage); \
+ literal_buf, table, B, storage_ix, storage); \
}
FOR_TABLE_BITS_(BAKE_METHOD_PARAM_)
#undef BAKE_METHOD_PARAM_
@@ -622,7 +589,7 @@ void BrotliCompressFragmentTwoPass(
break;
FOR_TABLE_BITS_(CASE_)
#undef CASE_
- default: BROTLI_DCHECK(0); break;
+ default: assert(0); break;
}
/* If output is larger than single uncompressed block, rewrite it. */
diff --git a/c/enc/compress_fragment_two_pass.h b/c/enc/compress_fragment_two_pass.h
index 928677d..ed91942 100644
--- a/c/enc/compress_fragment_two_pass.h
+++ b/c/enc/compress_fragment_two_pass.h
@@ -13,9 +13,9 @@
#ifndef BROTLI_ENC_COMPRESS_FRAGMENT_TWO_PASS_H_
#define BROTLI_ENC_COMPRESS_FRAGMENT_TWO_PASS_H_
-#include "../common/platform.h"
#include <brotli/types.h>
#include "./memory.h"
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
diff --git a/c/enc/context.h b/c/enc/context.h
new file mode 100644
index 0000000..0e2e453
--- /dev/null
+++ b/c/enc/context.h
@@ -0,0 +1,184 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Functions to map previous bytes into a context id. */
+
+#ifndef BROTLI_ENC_CONTEXT_H_
+#define BROTLI_ENC_CONTEXT_H_
+
+#include <brotli/port.h>
+#include <brotli/types.h>
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+/* Second-order context lookup table for UTF8 byte streams.
+
+ If p1 and p2 are the previous two bytes, we calculate the context as
+
+ context = kUTF8ContextLookup[p1] | kUTF8ContextLookup[p2 + 256].
+
+ If the previous two bytes are ASCII characters (i.e. < 128), this will be
+ equivalent to
+
+ context = 4 * context1(p1) + context2(p2),
+
+ where context1 is based on the previous byte in the following way:
+
+ 0 : non-ASCII control
+ 1 : \t, \n, \r
+ 2 : space
+ 3 : other punctuation
+ 4 : " '
+ 5 : %
+ 6 : ( < [ {
+ 7 : ) > ] }
+ 8 : , ; :
+ 9 : .
+ 10 : =
+ 11 : number
+ 12 : upper-case vowel
+ 13 : upper-case consonant
+ 14 : lower-case vowel
+ 15 : lower-case consonant
+
+ and context2 is based on the second last byte:
+
+ 0 : control, space
+ 1 : punctuation
+ 2 : upper-case letter, number
+ 3 : lower-case letter
+
+ If the last byte is ASCII, and the second last byte is not (in a valid UTF8
+ stream it will be a continuation byte, value between 128 and 191), the
+ context is the same as if the second last byte was an ASCII control or space.
+
+ If the last byte is a UTF8 lead byte (value >= 192), then the next byte will
+ be a continuation byte and the context id is 2 or 3 depending on the LSB of
+ the last byte and to a lesser extent on the second last byte if it is ASCII.
+
+ If the last byte is a UTF8 continuation byte, the second last byte can be:
+ - continuation byte: the next byte is probably ASCII or lead byte (assuming
+ 4-byte UTF8 characters are rare) and the context id is 0 or 1.
+ - lead byte (192 - 207): next byte is ASCII or lead byte, context is 0 or 1
+ - lead byte (208 - 255): next byte is continuation byte, context is 2 or 3
+
+ The possible value combinations of the previous two bytes, the range of
+ context ids and the type of the next byte is summarized in the table below:
+
+ |--------\-----------------------------------------------------------------|
+ | \ Last byte |
+ | Second \---------------------------------------------------------------|
+ | last byte \ ASCII | cont. byte | lead byte |
+ | \ (0-127) | (128-191) | (192-) |
+ |=============|===================|=====================|==================|
+ | ASCII | next: ASCII/lead | not valid | next: cont. |
+ | (0-127) | context: 4 - 63 | | context: 2 - 3 |
+ |-------------|-------------------|---------------------|------------------|
+ | cont. byte | next: ASCII/lead | next: ASCII/lead | next: cont. |
+ | (128-191) | context: 4 - 63 | context: 0 - 1 | context: 2 - 3 |
+ |-------------|-------------------|---------------------|------------------|
+ | lead byte | not valid | next: ASCII/lead | not valid |
+ | (192-207) | | context: 0 - 1 | |
+ |-------------|-------------------|---------------------|------------------|
+ | lead byte | not valid | next: cont. | not valid |
+ | (208-) | | context: 2 - 3 | |
+ |-------------|-------------------|---------------------|------------------|
+*/
+static const uint8_t kUTF8ContextLookup[512] = {
+ /* Last byte. */
+ /* */
+ /* ASCII range. */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 12, 16, 12, 12, 20, 12, 16, 24, 28, 12, 12, 32, 12, 36, 12,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 32, 32, 24, 40, 28, 12,
+ 12, 48, 52, 52, 52, 48, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48,
+ 52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 24, 12, 28, 12, 12,
+ 12, 56, 60, 60, 60, 56, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56,
+ 60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 24, 12, 28, 12, 0,
+ /* UTF8 continuation byte range. */
+ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
+ /* UTF8 lead byte range. */
+ 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
+ 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
+ 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
+ 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
+ /* Second last byte. */
+ /* */
+ /* ASCII range. */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1,
+ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,
+ 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 0,
+ /* UTF8 continuation byte range. */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* UTF8 lead byte range. */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+};
+
+/* Context lookup table for small signed integers. */
+static const uint8_t kSigned3BitContextLookup[] = {
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7,
+};
+
+typedef enum ContextType {
+ CONTEXT_LSB6 = 0,
+ CONTEXT_MSB6 = 1,
+ CONTEXT_UTF8 = 2,
+ CONTEXT_SIGNED = 3
+} ContextType;
+
+static BROTLI_INLINE uint8_t Context(uint8_t p1, uint8_t p2, ContextType mode) {
+ switch (mode) {
+ case CONTEXT_LSB6:
+ return p1 & 0x3f;
+ case CONTEXT_MSB6:
+ return (uint8_t)(p1 >> 2);
+ case CONTEXT_UTF8:
+ return kUTF8ContextLookup[p1] | kUTF8ContextLookup[p2 + 256];
+ case CONTEXT_SIGNED:
+ return (uint8_t)((kSigned3BitContextLookup[p1] << 3) +
+ kSigned3BitContextLookup[p2]);
+ default:
+ return 0;
+ }
+}
+
+#if defined(__cplusplus) || defined(c_plusplus)
+} /* extern "C" */
+#endif
+
+#endif /* BROTLI_ENC_CONTEXT_H_ */
diff --git a/c/enc/dictionary_hash.c b/c/enc/dictionary_hash.c
index 3677d7d..4018784 100644..100755
--- a/c/enc/dictionary_hash.c
+++ b/c/enc/dictionary_hash.c
@@ -6,7 +6,7 @@
/* Hash table on the 4-byte prefixes of static dictionary words. */
-#include "../common/platform.h"
+#include <brotli/port.h>
#include "./dictionary_hash.h"
#if defined(__cplusplus) || defined(c_plusplus)
diff --git a/c/enc/encode.c b/c/enc/encode.c
index ec56da2..0695210 100644
--- a/c/enc/encode.c
+++ b/c/enc/encode.c
@@ -11,9 +11,6 @@
#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"
@@ -21,13 +18,14 @@
#include "./brotli_bit_stream.h"
#include "./compress_fragment.h"
#include "./compress_fragment_two_pass.h"
-#include "./encoder_dict.h"
+#include "./context.h"
#include "./entropy_encode.h"
#include "./fast_log.h"
#include "./hash.h"
#include "./histogram.h"
#include "./memory.h"
#include "./metablock.h"
+#include "./port.h"
#include "./prefix.h"
#include "./quality.h"
#include "./ringbuffer.h"
@@ -71,8 +69,8 @@ typedef struct BrotliEncoderStateStruct {
uint64_t last_processed_pos_;
int dist_cache_[BROTLI_NUM_DISTANCE_SHORT_CODES];
int saved_dist_cache_[4];
- uint16_t last_bytes_;
- uint8_t last_bytes_bits_;
+ uint8_t last_byte_;
+ uint8_t last_byte_bits_;
uint8_t prev_byte_;
uint8_t prev_byte2_;
size_t storage_size_;
@@ -117,6 +115,7 @@ typedef struct BrotliEncoderStateStruct {
static BROTLI_BOOL EnsureInitialized(BrotliEncoderState* s);
static size_t InputBlockSize(BrotliEncoderState* s) {
+ if (!EnsureInitialized(s)) return 0;
return (size_t)1 << s->params.lgblock;
}
@@ -162,22 +161,30 @@ BROTLI_BOOL BrotliEncoderSetParameter(
state->params.size_hint = value;
return BROTLI_TRUE;
- case BROTLI_PARAM_LARGE_WINDOW:
- state->params.large_window = TO_BROTLI_BOOL(!!value);
- return BROTLI_TRUE;
-
- case BROTLI_PARAM_NPOSTFIX:
- state->params.dist.distance_postfix_bits = value;
- return BROTLI_TRUE;
-
- case BROTLI_PARAM_NDIRECT:
- state->params.dist.num_direct_distance_codes = value;
- return BROTLI_TRUE;
-
default: return BROTLI_FALSE;
}
}
+static void RecomputeDistancePrefixes(Command* cmds,
+ size_t num_commands,
+ uint32_t num_direct_distance_codes,
+ uint32_t distance_postfix_bits) {
+ size_t i;
+ if (num_direct_distance_codes == 0 && distance_postfix_bits == 0) {
+ return;
+ }
+ for (i = 0; i < num_commands; ++i) {
+ Command* cmd = &cmds[i];
+ if (CommandCopyLen(cmd) && cmd->cmd_prefix_ >= 128) {
+ PrefixEncodeCopyDistance(CommandRestoreDistanceCode(cmd),
+ num_direct_distance_codes,
+ distance_postfix_bits,
+ &cmd->dist_prefix_,
+ &cmd->dist_extra_);
+ }
+ }
+}
+
/* Wraps 64-bit input position to 32-bit ring-buffer position preserving
"not-a-first-lap" feature. */
static uint32_t WrapPosition(uint64_t position) {
@@ -219,7 +226,7 @@ static int* GetHashTable(BrotliEncoderState* s, int quality,
const size_t max_table_size = MaxHashTableSize(quality);
size_t htsize = HashTableSize(max_table_size, input_size);
int* table;
- BROTLI_DCHECK(max_table_size >= 256);
+ assert(max_table_size >= 256);
if (quality == FAST_ONE_PASS_COMPRESSION_QUALITY) {
/* Only odd shifts are supported by fast-one-pass. */
if ((htsize & 0xAAAAA) == 0) {
@@ -244,25 +251,20 @@ static int* GetHashTable(BrotliEncoderState* s, int quality,
return table;
}
-static void EncodeWindowBits(int lgwin, BROTLI_BOOL large_window,
- uint16_t* last_bytes, uint8_t* last_bytes_bits) {
- if (large_window) {
- *last_bytes = (uint16_t)(((lgwin & 0x3F) << 8) | 0x11);
- *last_bytes_bits = 14;
+static void EncodeWindowBits(int lgwin, uint8_t* last_byte,
+ uint8_t* last_byte_bits) {
+ if (lgwin == 16) {
+ *last_byte = 0;
+ *last_byte_bits = 1;
+ } else if (lgwin == 17) {
+ *last_byte = 1;
+ *last_byte_bits = 7;
+ } else if (lgwin > 17) {
+ *last_byte = (uint8_t)(((lgwin - 17) << 1) | 1);
+ *last_byte_bits = 4;
} else {
- if (lgwin == 16) {
- *last_bytes = 0;
- *last_bytes_bits = 1;
- } else if (lgwin == 17) {
- *last_bytes = 1;
- *last_bytes_bits = 7;
- } else if (lgwin > 17) {
- *last_bytes = (uint16_t)(((lgwin - 17) << 1) | 0x01);
- *last_bytes_bits = 4;
- } else {
- *last_bytes = (uint16_t)(((lgwin - 8) << 4) | 0x01);
- *last_bytes_bits = 7;
- }
+ *last_byte = (uint8_t)(((lgwin - 8) << 4) | 1);
+ *last_byte_bits = 7;
}
}
@@ -355,7 +357,7 @@ static void ChooseContextMap(int quality,
}
total = monogram_histo[0] + monogram_histo[1] + monogram_histo[2];
- BROTLI_DCHECK(total != 0);
+ assert(total != 0);
entropy[0] = 1.0 / (double)total;
entropy[1] *= entropy[0];
entropy[2] *= entropy[0];
@@ -418,7 +420,6 @@ static BROTLI_BOOL ShouldUseComplexStaticContextMap(const uint8_t* input,
double entropy[3];
size_t dummy;
size_t i;
- ContextLut utf8_lut = BROTLI_CONTEXT_LUT(CONTEXT_UTF8);
for (; start_pos + 64 <= end_pos; start_pos += 4096) {
const size_t stride_end_pos = start_pos + 64;
uint8_t prev2 = input[start_pos & mask];
@@ -429,7 +430,7 @@ static BROTLI_BOOL ShouldUseComplexStaticContextMap(const uint8_t* input,
for (pos = start_pos + 2; pos < stride_end_pos; ++pos) {
const uint8_t literal = input[pos & mask];
const uint8_t context = (uint8_t)kStaticContextMapComplexUTF8[
- BROTLI_CONTEXT(prev1, prev2, utf8_lut)];
+ Context(prev1, prev2, CONTEXT_UTF8)];
++total;
++combined_histo[literal >> 3];
++context_histo[context][literal >> 3];
@@ -518,26 +519,12 @@ static BROTLI_BOOL ShouldCompress(
return BROTLI_TRUE;
}
-/* Chooses the literal context mode for a metablock */
-static ContextType ChooseContextMode(const BrotliEncoderParams* params,
- const uint8_t* data, const size_t pos, const size_t mask,
- const size_t length) {
- /* We only do the computation for the option of something else than
- CONTEXT_UTF8 for the highest qualities */
- if (params->quality >= MIN_QUALITY_FOR_HQ_BLOCK_SPLITTING &&
- !BrotliIsMostlyUTF8(data, pos, mask, length, kMinUTF8Ratio)) {
- return CONTEXT_SIGNED;
- }
- return CONTEXT_UTF8;
-}
-
static void WriteMetaBlockInternal(MemoryManager* m,
const uint8_t* data,
const size_t mask,
const uint64_t last_flush_pos,
const size_t bytes,
const BROTLI_BOOL is_last,
- ContextType literal_context_mode,
const BrotliEncoderParams* params,
const uint8_t prev_byte,
const uint8_t prev_byte2,
@@ -549,10 +536,10 @@ static void WriteMetaBlockInternal(MemoryManager* m,
size_t* storage_ix,
uint8_t* storage) {
const uint32_t wrapped_last_flush_pos = WrapPosition(last_flush_pos);
- uint16_t last_bytes;
- uint8_t last_bytes_bits;
- ContextLut literal_context_lut = BROTLI_CONTEXT_LUT(literal_context_mode);
- BrotliEncoderParams block_params = *params;
+ uint8_t last_byte;
+ uint8_t last_byte_bits;
+ uint32_t num_direct_distance_codes = 0;
+ uint32_t distance_postfix_bits = 0;
if (bytes == 0) {
/* Write the ISLAST and ISEMPTY bits. */
@@ -572,22 +559,31 @@ static void WriteMetaBlockInternal(MemoryManager* m,
return;
}
- BROTLI_DCHECK(*storage_ix <= 14);
- last_bytes = (uint16_t)((storage[1] << 8) | storage[0]);
- last_bytes_bits = (uint8_t)(*storage_ix);
+ last_byte = storage[0];
+ last_byte_bits = (uint8_t)(*storage_ix & 0xff);
+ if (params->quality >= MIN_QUALITY_FOR_RECOMPUTE_DISTANCE_PREFIXES &&
+ params->mode == BROTLI_MODE_FONT) {
+ num_direct_distance_codes = 12;
+ distance_postfix_bits = 1;
+ RecomputeDistancePrefixes(commands,
+ num_commands,
+ num_direct_distance_codes,
+ distance_postfix_bits);
+ }
if (params->quality <= MAX_QUALITY_FOR_STATIC_ENTROPY_CODES) {
BrotliStoreMetaBlockFast(m, data, wrapped_last_flush_pos,
- bytes, mask, is_last, params,
+ bytes, mask, is_last,
commands, num_commands,
storage_ix, storage);
if (BROTLI_IS_OOM(m)) return;
} else if (params->quality < MIN_QUALITY_FOR_BLOCK_SPLIT) {
BrotliStoreMetaBlockTrivial(m, data, wrapped_last_flush_pos,
- bytes, mask, is_last, params,
+ bytes, mask, is_last,
commands, num_commands,
storage_ix, storage);
if (BROTLI_IS_OOM(m)) return;
} else {
+ ContextType literal_context_mode = CONTEXT_UTF8;
MetaBlockSplit mb;
InitMetaBlockSplit(&mb);
if (params->quality < MIN_QUALITY_FOR_HQ_BLOCK_SPLITTING) {
@@ -600,11 +596,15 @@ static void WriteMetaBlockInternal(MemoryManager* m,
&literal_context_map);
}
BrotliBuildMetaBlockGreedy(m, data, wrapped_last_flush_pos, mask,
- prev_byte, prev_byte2, literal_context_lut, num_literal_contexts,
+ prev_byte, prev_byte2, literal_context_mode, num_literal_contexts,
literal_context_map, commands, num_commands, &mb);
if (BROTLI_IS_OOM(m)) return;
} else {
- BrotliBuildMetaBlock(m, data, wrapped_last_flush_pos, mask, &block_params,
+ if (!BrotliIsMostlyUTF8(data, wrapped_last_flush_pos, mask, bytes,
+ kMinUTF8Ratio)) {
+ literal_context_mode = CONTEXT_SIGNED;
+ }
+ BrotliBuildMetaBlock(m, data, wrapped_last_flush_pos, mask, params,
prev_byte, prev_byte2,
commands, num_commands,
literal_context_mode,
@@ -612,19 +612,15 @@ static void WriteMetaBlockInternal(MemoryManager* m,
if (BROTLI_IS_OOM(m)) return;
}
if (params->quality >= MIN_QUALITY_FOR_OPTIMIZE_HISTOGRAMS) {
- /* The number of distance symbols effectively used for distance
- histograms. It might be less than distance alphabet size
- for "Large Window Brotli" (32-bit). */
- uint32_t num_effective_dist_codes = block_params.dist.alphabet_size;
- if (num_effective_dist_codes > BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS) {
- num_effective_dist_codes = BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS;
- }
- BrotliOptimizeHistograms(num_effective_dist_codes, &mb);
+ BrotliOptimizeHistograms(num_direct_distance_codes,
+ distance_postfix_bits,
+ &mb);
}
BrotliStoreMetaBlock(m, data, wrapped_last_flush_pos, bytes, mask,
prev_byte, prev_byte2,
is_last,
- &block_params,
+ num_direct_distance_codes,
+ distance_postfix_bits,
literal_context_mode,
commands, num_commands,
&mb,
@@ -635,48 +631,20 @@ static void WriteMetaBlockInternal(MemoryManager* m,
if (bytes + 4 < (*storage_ix >> 3)) {
/* Restore the distance cache and last byte. */
memcpy(dist_cache, saved_dist_cache, 4 * sizeof(dist_cache[0]));
- storage[0] = (uint8_t)last_bytes;
- storage[1] = (uint8_t)(last_bytes >> 8);
- *storage_ix = last_bytes_bits;
+ storage[0] = last_byte;
+ *storage_ix = last_byte_bits;
BrotliStoreUncompressedMetaBlock(is_last, data,
wrapped_last_flush_pos, mask,
bytes, storage_ix, storage);
}
}
-static void ChooseDistanceParams(BrotliEncoderParams* params) {
- uint32_t distance_postfix_bits = 0;
- uint32_t num_direct_distance_codes = 0;
-
- if (params->quality >= MIN_QUALITY_FOR_NONZERO_DISTANCE_PARAMS) {
- uint32_t ndirect_msb;
- if (params->mode == BROTLI_MODE_FONT) {
- distance_postfix_bits = 1;
- num_direct_distance_codes = 12;
- } else {
- distance_postfix_bits = params->dist.distance_postfix_bits;
- num_direct_distance_codes = params->dist.num_direct_distance_codes;
- }
- ndirect_msb = (num_direct_distance_codes >> distance_postfix_bits) & 0x0F;
- if (distance_postfix_bits > BROTLI_MAX_NPOSTFIX ||
- num_direct_distance_codes > BROTLI_MAX_NDIRECT ||
- (ndirect_msb << distance_postfix_bits) != num_direct_distance_codes) {
- distance_postfix_bits = 0;
- num_direct_distance_codes = 0;
- }
- }
-
- BrotliInitDistanceParams(
- params, distance_postfix_bits, num_direct_distance_codes);
-}
-
static BROTLI_BOOL EnsureInitialized(BrotliEncoderState* s) {
if (BROTLI_IS_OOM(&s->memory_manager_)) return BROTLI_FALSE;
if (s->is_initialized_) return BROTLI_TRUE;
SanitizeParams(&s->params);
s->params.lgblock = ComputeLgBlock(&s->params);
- ChooseDistanceParams(&s->params);
s->remaining_metadata_bytes_ = BROTLI_UINT32_MAX;
@@ -689,8 +657,7 @@ static BROTLI_BOOL EnsureInitialized(BrotliEncoderState* s) {
s->params.quality == FAST_TWO_PASS_COMPRESSION_QUALITY) {
lgwin = BROTLI_MAX(int, lgwin, 18);
}
- EncodeWindowBits(lgwin, s->params.large_window,
- &s->last_bytes_, &s->last_bytes_bits_);
+ EncodeWindowBits(lgwin, &s->last_byte_, &s->last_byte_bits_);
}
if (s->params.quality == FAST_ONE_PASS_COMPRESSION_QUALITY) {
@@ -704,18 +671,11 @@ static BROTLI_BOOL EnsureInitialized(BrotliEncoderState* s) {
static void BrotliEncoderInitParams(BrotliEncoderParams* params) {
params->mode = BROTLI_DEFAULT_MODE;
- params->large_window = BROTLI_FALSE;
params->quality = BROTLI_DEFAULT_QUALITY;
params->lgwin = BROTLI_DEFAULT_WINDOW;
params->lgblock = 0;
params->size_hint = 0;
params->disable_literal_context_modeling = BROTLI_FALSE;
- BrotliInitEncoderDictionary(&params->dictionary);
- params->dist.distance_postfix_bits = 0;
- params->dist.num_direct_distance_codes = 0;
- params->dist.alphabet_size =
- BROTLI_DISTANCE_ALPHABET_SIZE(0, 0, BROTLI_MAX_DISTANCE_BITS);
- params->dist.max_distance = BROTLI_MAX_DISTANCE;
}
static void BrotliEncoderInitState(BrotliEncoderState* s) {
@@ -758,8 +718,9 @@ static void BrotliEncoderInitState(BrotliEncoderState* s) {
memcpy(s->saved_dist_cache_, s->dist_cache_, sizeof(s->saved_dist_cache_));
}
-BrotliEncoderState* BrotliEncoderCreateInstance(
- brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
+BrotliEncoderState* BrotliEncoderCreateInstance(brotli_alloc_func alloc_func,
+ brotli_free_func free_func,
+ void* opaque) {
BrotliEncoderState* state = 0;
if (!alloc_func && !free_func) {
state = (BrotliEncoderState*)malloc(sizeof(BrotliEncoderState));
@@ -816,6 +777,7 @@ static void CopyInputToRingBuffer(BrotliEncoderState* s,
const uint8_t* input_buffer) {
RingBuffer* ringbuffer_ = &s->ringbuffer_;
MemoryManager* m = &s->memory_manager_;
+ if (!EnsureInitialized(s)) return;
RingBufferWrite(m, input_buffer, input_size, ringbuffer_);
if (BROTLI_IS_OOM(m)) return;
s->input_pos_ += input_size;
@@ -875,39 +837,6 @@ static BROTLI_BOOL UpdateLastProcessedPos(BrotliEncoderState* s) {
return TO_BROTLI_BOOL(wrapped_input_pos < wrapped_last_processed_pos);
}
-static void ExtendLastCommand(BrotliEncoderState* s, uint32_t* bytes,
- uint32_t* wrapped_last_processed_pos) {
- Command* last_command = &s->commands_[s->num_commands_ - 1];
- const uint8_t* data = s->ringbuffer_.buffer_;
- const uint32_t mask = s->ringbuffer_.mask_;
- uint64_t max_backward_distance =
- (((uint64_t)1) << s->params.lgwin) - BROTLI_WINDOW_GAP;
- uint64_t last_copy_len = last_command->copy_len_ & 0x1FFFFFF;
- uint64_t last_processed_pos = s->last_processed_pos_ - last_copy_len;
- uint64_t max_distance = last_processed_pos < max_backward_distance ?
- last_processed_pos : max_backward_distance;
- uint64_t cmd_dist = (uint64_t)s->dist_cache_[0];
- uint32_t distance_code = CommandRestoreDistanceCode(last_command,
- &s->params.dist);
- if (distance_code < BROTLI_NUM_DISTANCE_SHORT_CODES ||
- distance_code - (BROTLI_NUM_DISTANCE_SHORT_CODES - 1) == cmd_dist) {
- if (cmd_dist <= max_distance) {
- while (*bytes != 0 && data[*wrapped_last_processed_pos & mask] ==
- data[(*wrapped_last_processed_pos - cmd_dist) & mask]) {
- last_command->copy_len_++;
- (*bytes)--;
- (*wrapped_last_processed_pos)++;
- }
- }
- /* The copy length is at most the metablock size, and thus expressible. */
- GetLengthCode(last_command->insert_len_,
- (size_t)((int)(last_command->copy_len_ & 0x1FFFFFF) +
- (int)(last_command->copy_len_ >> 25)),
- TO_BROTLI_BOOL((last_command->dist_prefix_ & 0x3FF) == 0),
- &last_command->cmd_prefix_);
- }
-}
-
/*
Processes the accumulated input data and sets |*out_size| to the length of
the new output meta-block, or to zero if no new output meta-block has been
@@ -924,13 +853,15 @@ static BROTLI_BOOL EncodeData(
BrotliEncoderState* s, const BROTLI_BOOL is_last,
const BROTLI_BOOL force_flush, size_t* out_size, uint8_t** output) {
const uint64_t delta = UnprocessedInputSize(s);
- uint32_t bytes = (uint32_t)delta;
- uint32_t wrapped_last_processed_pos = WrapPosition(s->last_processed_pos_);
+ const uint32_t bytes = (uint32_t)delta;
+ const uint32_t wrapped_last_processed_pos =
+ WrapPosition(s->last_processed_pos_);
uint8_t* data;
uint32_t mask;
MemoryManager* m = &s->memory_manager_;
- ContextType literal_context_mode;
+ const BrotliDictionary* dictionary = BrotliGetDictionary();
+ if (!EnsureInitialized(s)) return BROTLI_FALSE;
data = s->ringbuffer_.buffer_;
mask = s->ringbuffer_.mask_;
@@ -953,7 +884,7 @@ static BROTLI_BOOL EncodeData(
if (s->params.quality == FAST_ONE_PASS_COMPRESSION_QUALITY ||
s->params.quality == FAST_TWO_PASS_COMPRESSION_QUALITY) {
uint8_t* storage;
- size_t storage_ix = s->last_bytes_bits_;
+ size_t storage_ix = s->last_byte_bits_;
size_t table_size;
int* table;
@@ -963,10 +894,9 @@ static BROTLI_BOOL EncodeData(
*out_size = 0;
return BROTLI_TRUE;
}
- storage = GetBrotliStorage(s, 2 * bytes + 503);
+ storage = GetBrotliStorage(s, 2 * bytes + 502);
if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
- storage[0] = (uint8_t)s->last_bytes_;
- storage[1] = (uint8_t)(s->last_bytes_ >> 8);
+ storage[0] = s->last_byte_;
table = GetHashTable(s, s->params.quality, bytes, &table_size);
if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
if (s->params.quality == FAST_ONE_PASS_COMPRESSION_QUALITY) {
@@ -987,8 +917,8 @@ static BROTLI_BOOL EncodeData(
&storage_ix, storage);
if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
}
- s->last_bytes_ = (uint16_t)(storage[storage_ix >> 3]);
- s->last_bytes_bits_ = storage_ix & 7u;
+ s->last_byte_ = storage[storage_ix >> 3];
+ s->last_byte_bits_ = storage_ix & 7u;
UpdateLastProcessedPos(s);
*output = &storage[0];
*out_size = storage_ix >> 3;
@@ -1016,39 +946,27 @@ static BROTLI_BOOL EncodeData(
InitOrStitchToPreviousBlock(m, &s->hasher_, data, mask, &s->params,
wrapped_last_processed_pos, bytes, is_last);
-
- literal_context_mode = ChooseContextMode(
- &s->params, data, WrapPosition(s->last_flush_pos_),
- mask, (size_t)(s->input_pos_ - s->last_flush_pos_));
-
if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
- if (s->num_commands_ && s->last_insert_len_ == 0) {
- ExtendLastCommand(s, &bytes, &wrapped_last_processed_pos);
- }
-
if (s->params.quality == ZOPFLIFICATION_QUALITY) {
- BROTLI_DCHECK(s->params.hasher.type == 10);
- BrotliCreateZopfliBackwardReferences(m,
- bytes, wrapped_last_processed_pos,
- data, mask, &s->params, s->hasher_, s->dist_cache_,
- &s->last_insert_len_, &s->commands_[s->num_commands_],
- &s->num_commands_, &s->num_literals_);
+ assert(s->params.hasher.type == 10);
+ BrotliCreateZopfliBackwardReferences(
+ m, dictionary, bytes, wrapped_last_processed_pos, data, mask,
+ &s->params, s->hasher_, s->dist_cache_, &s->last_insert_len_,
+ &s->commands_[s->num_commands_], &s->num_commands_, &s->num_literals_);
if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
} else if (s->params.quality == HQ_ZOPFLIFICATION_QUALITY) {
- BROTLI_DCHECK(s->params.hasher.type == 10);
- BrotliCreateHqZopfliBackwardReferences(m,
- bytes, wrapped_last_processed_pos,
- data, mask, &s->params, s->hasher_, s->dist_cache_,
- &s->last_insert_len_, &s->commands_[s->num_commands_],
- &s->num_commands_, &s->num_literals_);
+ assert(s->params.hasher.type == 10);
+ BrotliCreateHqZopfliBackwardReferences(
+ m, dictionary, bytes, wrapped_last_processed_pos, data, mask,
+ &s->params, s->hasher_, s->dist_cache_, &s->last_insert_len_,
+ &s->commands_[s->num_commands_], &s->num_commands_, &s->num_literals_);
if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
} else {
BrotliCreateBackwardReferences(
- bytes, wrapped_last_processed_pos,
- data, mask, &s->params, s->hasher_, s->dist_cache_,
- &s->last_insert_len_, &s->commands_[s->num_commands_],
- &s->num_commands_, &s->num_literals_);
+ dictionary, bytes, wrapped_last_processed_pos, data, mask,
+ &s->params, s->hasher_, s->dist_cache_, &s->last_insert_len_,
+ &s->commands_[s->num_commands_], &s->num_commands_, &s->num_literals_);
}
{
@@ -1091,25 +1009,24 @@ static BROTLI_BOOL EncodeData(
*out_size = 0;
return BROTLI_TRUE;
}
- BROTLI_DCHECK(s->input_pos_ >= s->last_flush_pos_);
- BROTLI_DCHECK(s->input_pos_ > s->last_flush_pos_ || is_last);
- BROTLI_DCHECK(s->input_pos_ - s->last_flush_pos_ <= 1u << 24);
+ assert(s->input_pos_ >= s->last_flush_pos_);
+ assert(s->input_pos_ > s->last_flush_pos_ || is_last);
+ assert(s->input_pos_ - s->last_flush_pos_ <= 1u << 24);
{
const uint32_t metablock_size =
(uint32_t)(s->input_pos_ - s->last_flush_pos_);
- uint8_t* storage = GetBrotliStorage(s, 2 * metablock_size + 503);
- size_t storage_ix = s->last_bytes_bits_;
+ uint8_t* storage = GetBrotliStorage(s, 2 * metablock_size + 502);
+ size_t storage_ix = s->last_byte_bits_;
if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
- storage[0] = (uint8_t)s->last_bytes_;
- storage[1] = (uint8_t)(s->last_bytes_ >> 8);
+ storage[0] = s->last_byte_;
WriteMetaBlockInternal(
m, data, mask, s->last_flush_pos_, metablock_size, is_last,
- literal_context_mode, &s->params, s->prev_byte_, s->prev_byte2_,
+ &s->params, s->prev_byte_, s->prev_byte2_,
s->num_literals_, s->num_commands_, s->commands_, s->saved_dist_cache_,
s->dist_cache_, &storage_ix, storage);
if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
- s->last_bytes_ = (uint16_t)(storage[storage_ix >> 3]);
- s->last_bytes_bits_ = storage_ix & 7u;
+ s->last_byte_ = storage[storage_ix >> 3];
+ s->last_byte_bits_ = storage_ix & 7u;
s->last_flush_pos_ = s->input_pos_;
if (UpdateLastProcessedPos(s)) {
HasherReset(s->hasher_);
@@ -1138,11 +1055,10 @@ static BROTLI_BOOL EncodeData(
static size_t WriteMetadataHeader(
BrotliEncoderState* s, const size_t block_size, uint8_t* header) {
size_t storage_ix;
- storage_ix = s->last_bytes_bits_;
- header[0] = (uint8_t)s->last_bytes_;
- header[1] = (uint8_t)(s->last_bytes_ >> 8);
- s->last_bytes_ = 0;
- s->last_bytes_bits_ = 0;
+ storage_ix = s->last_byte_bits_;
+ header[0] = s->last_byte_;
+ s->last_byte_ = 0;
+ s->last_byte_bits_ = 0;
BrotliWriteBits(1, 0, &storage_ix, header);
BrotliWriteBits(2, 3, &storage_ix, header);
@@ -1172,14 +1088,15 @@ static BROTLI_BOOL BrotliCompressBufferQuality10(
BROTLI_BOOL ok = BROTLI_TRUE;
const size_t max_out_size = *encoded_size;
size_t total_out_size = 0;
- uint16_t last_bytes;
- uint8_t last_bytes_bits;
+ uint8_t last_byte;
+ uint8_t last_byte_bits;
HasherHandle hasher = NULL;
const size_t hasher_eff_size =
BROTLI_MIN(size_t, input_size, max_backward_limit + BROTLI_WINDOW_GAP);
BrotliEncoderParams params;
+ const BrotliDictionary* dictionary = BrotliGetDictionary();
const int lgmetablock = BROTLI_MIN(int, 24, lgwin + 1);
size_t max_block_size;
@@ -1193,18 +1110,14 @@ static BROTLI_BOOL BrotliCompressBufferQuality10(
BrotliEncoderInitParams(&params);
params.quality = 10;
params.lgwin = lgwin;
- if (lgwin > BROTLI_MAX_WINDOW_BITS) {
- params.large_window = BROTLI_TRUE;
- }
SanitizeParams(&params);
params.lgblock = ComputeLgBlock(&params);
- ChooseDistanceParams(&params);
max_block_size = (size_t)1 << params.lgblock;
BrotliInitMemoryManager(m, 0, 0, 0);
- BROTLI_DCHECK(input_size <= mask + 1);
- EncodeWindowBits(lgwin, params.large_window, &last_bytes, &last_bytes_bits);
+ assert(input_size <= mask + 1);
+ EncodeWindowBits(lgwin, &last_byte, &last_byte_bits);
InitOrStitchToPreviousBlock(m, &hasher, input_buffer, mask, &params,
0, hasher_eff_size, BROTLI_TRUE);
if (BROTLI_IS_OOM(m)) goto oom;
@@ -1224,9 +1137,6 @@ static BROTLI_BOOL BrotliCompressBufferQuality10(
uint8_t* storage;
size_t storage_ix;
- ContextType literal_context_mode = ChooseContextMode(&params,
- input_buffer, metablock_start, mask, metablock_end - metablock_start);
-
size_t block_start;
for (block_start = metablock_start; block_start < metablock_end; ) {
size_t block_size =
@@ -1238,8 +1148,8 @@ static BROTLI_BOOL BrotliCompressBufferQuality10(
BrotliInitZopfliNodes(nodes, block_size + 1);
StitchToPreviousBlockH10(hasher, block_size, block_start,
input_buffer, mask);
- path_size = BrotliZopfliComputeShortestPath(m,
- block_size, block_start, input_buffer, mask, &params,
+ path_size = BrotliZopfliComputeShortestPath(
+ m, dictionary, block_size, block_start, input_buffer, mask, &params,
max_backward_limit, dist_cache, hasher, nodes);
if (BROTLI_IS_OOM(m)) goto oom;
/* We allocate a command buffer in the first iteration of this loop that
@@ -1283,14 +1193,13 @@ static BROTLI_BOOL BrotliCompressBufferQuality10(
is_last = TO_BROTLI_BOOL(metablock_start + metablock_size == input_size);
storage = NULL;
- storage_ix = last_bytes_bits;
+ storage_ix = last_byte_bits;
if (metablock_size == 0) {
/* Write the ISLAST and ISEMPTY bits. */
storage = BROTLI_ALLOC(m, uint8_t, 16);
if (BROTLI_IS_OOM(m)) goto oom;
- storage[0] = (uint8_t)last_bytes;
- storage[1] = (uint8_t)(last_bytes >> 8);
+ storage[0] = last_byte;
BrotliWriteBits(2, 3, &storage_ix, storage);
storage_ix = (storage_ix + 7u) & ~7u;
} else if (!ShouldCompress(input_buffer, mask, metablock_start,
@@ -1300,40 +1209,37 @@ static BROTLI_BOOL BrotliCompressBufferQuality10(
memcpy(dist_cache, saved_dist_cache, 4 * sizeof(dist_cache[0]));
storage = BROTLI_ALLOC(m, uint8_t, metablock_size + 16);
if (BROTLI_IS_OOM(m)) goto oom;
- storage[0] = (uint8_t)last_bytes;
- storage[1] = (uint8_t)(last_bytes >> 8);
+ storage[0] = last_byte;
BrotliStoreUncompressedMetaBlock(is_last, input_buffer,
metablock_start, mask, metablock_size,
&storage_ix, storage);
} else {
+ uint32_t num_direct_distance_codes = 0;
+ uint32_t distance_postfix_bits = 0;
+ ContextType literal_context_mode = CONTEXT_UTF8;
MetaBlockSplit mb;
- BrotliEncoderParams block_params = params;
InitMetaBlockSplit(&mb);
- BrotliBuildMetaBlock(m, input_buffer, metablock_start, mask,
- &block_params,
+ if (!BrotliIsMostlyUTF8(input_buffer, metablock_start, mask,
+ metablock_size, kMinUTF8Ratio)) {
+ literal_context_mode = CONTEXT_SIGNED;
+ }
+ BrotliBuildMetaBlock(m, input_buffer, metablock_start, mask, &params,
prev_byte, prev_byte2,
commands, num_commands,
literal_context_mode,
&mb);
if (BROTLI_IS_OOM(m)) goto oom;
- {
- /* The number of distance symbols effectively used for distance
- histograms. It might be less than distance alphabet size
- for "Large Window Brotli" (32-bit). */
- uint32_t num_effective_dist_codes = block_params.dist.alphabet_size;
- if (num_effective_dist_codes > BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS) {
- num_effective_dist_codes = BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS;
- }
- BrotliOptimizeHistograms(num_effective_dist_codes, &mb);
- }
- storage = BROTLI_ALLOC(m, uint8_t, 2 * metablock_size + 503);
+ BrotliOptimizeHistograms(num_direct_distance_codes,
+ distance_postfix_bits,
+ &mb);
+ storage = BROTLI_ALLOC(m, uint8_t, 2 * metablock_size + 502);
if (BROTLI_IS_OOM(m)) goto oom;
- storage[0] = (uint8_t)last_bytes;
- storage[1] = (uint8_t)(last_bytes >> 8);
+ storage[0] = last_byte;
BrotliStoreMetaBlock(m, input_buffer, metablock_start, metablock_size,
mask, prev_byte, prev_byte2,
is_last,
- &block_params,
+ num_direct_distance_codes,
+ distance_postfix_bits,
literal_context_mode,
commands, num_commands,
&mb,
@@ -1342,22 +1248,19 @@ static BROTLI_BOOL BrotliCompressBufferQuality10(
if (metablock_size + 4 < (storage_ix >> 3)) {
/* Restore the distance cache and last byte. */
memcpy(dist_cache, saved_dist_cache, 4 * sizeof(dist_cache[0]));
- storage[0] = (uint8_t)last_bytes;
- storage[1] = (uint8_t)(last_bytes >> 8);
- storage_ix = last_bytes_bits;
+ storage[0] = last_byte;
+ storage_ix = last_byte_bits;
BrotliStoreUncompressedMetaBlock(is_last, input_buffer,
metablock_start, mask,
metablock_size, &storage_ix, storage);
}
DestroyMetaBlockSplit(m, &mb);
}
- last_bytes = (uint16_t)(storage[storage_ix >> 3]);
- last_bytes_bits = storage_ix & 7u;
+ last_byte = storage[storage_ix >> 3];
+ last_byte_bits = storage_ix & 7u;
metablock_start += metablock_size;
- if (metablock_start < input_size) {
- prev_byte = input_buffer[metablock_start - 1];
- prev_byte2 = input_buffer[metablock_start - 2];
- }
+ prev_byte = input_buffer[metablock_start - 1];
+ prev_byte2 = input_buffer[metablock_start - 2];
/* Save the state of the distance cache in case we need to restore it for
emitting an uncompressed block. */
memcpy(saved_dist_cache, dist_cache, 4 * sizeof(dist_cache[0]));
@@ -1387,10 +1290,12 @@ oom:
size_t BrotliEncoderMaxCompressedSize(size_t input_size) {
/* [window bits / empty metadata] + N * [uncompressed] + [last empty] */
- size_t num_large_blocks = input_size >> 14;
- size_t overhead = 2 + (4 * num_large_blocks) + 3 + 1;
+ size_t num_large_blocks = input_size >> 24;
+ size_t tail = input_size - (num_large_blocks << 24);
+ size_t tail_overhead = (tail > (1 << 20)) ? 4 : 3;
+ size_t overhead = 2 + (4 * num_large_blocks) + tail_overhead + 1;
size_t result = input_size + overhead;
- if (input_size == 0) return 2;
+ if (input_size == 0) return 1;
return (result < input_size) ? 0 : result;
}
@@ -1451,7 +1356,7 @@ BROTLI_BOOL BrotliEncoderCompress(
}
if (quality == 10) {
/* TODO: Implement this direct path for all quality levels. */
- const int lg_win = BROTLI_MIN(int, BROTLI_LARGE_MAX_WINDOW_BITS,
+ const int lg_win = BROTLI_MIN(int, BROTLI_MAX_WINDOW_BITS,
BROTLI_MAX(int, 16, lgwin));
int ok = BrotliCompressBufferQuality10(lg_win, input_size, input_buffer,
encoded_size, encoded_buffer);
@@ -1475,9 +1380,6 @@ BROTLI_BOOL BrotliEncoderCompress(
BrotliEncoderSetParameter(s, BROTLI_PARAM_LGWIN, (uint32_t)lgwin);
BrotliEncoderSetParameter(s, BROTLI_PARAM_MODE, (uint32_t)mode);
BrotliEncoderSetParameter(s, BROTLI_PARAM_SIZE_HINT, (uint32_t)input_size);
- if (lgwin > BROTLI_MAX_WINDOW_BITS) {
- BrotliEncoderSetParameter(s, BROTLI_PARAM_LARGE_WINDOW, BROTLI_TRUE);
- }
result = BrotliEncoderCompressStream(s, BROTLI_OPERATION_FINISH,
&available_in, &next_in, &available_out, &next_out, &total_out);
if (!BrotliEncoderIsFinished(s)) result = 0;
@@ -1500,11 +1402,11 @@ fallback:
}
static void InjectBytePaddingBlock(BrotliEncoderState* s) {
- uint32_t seal = s->last_bytes_;
- size_t seal_bits = s->last_bytes_bits_;
+ uint32_t seal = s->last_byte_;
+ size_t seal_bits = s->last_byte_bits_;
uint8_t* destination;
- s->last_bytes_ = 0;
- s->last_bytes_bits_ = 0;
+ s->last_byte_ = 0;
+ s->last_byte_bits_ = 0;
/* is_last = 0, data_nibbles = 11, reserved = 0, meta_nibbles = 00 */
seal |= 0x6u << seal_bits;
seal_bits += 6;
@@ -1518,7 +1420,6 @@ static void InjectBytePaddingBlock(BrotliEncoderState* s) {
}
destination[0] = (uint8_t)seal;
if (seal_bits > 8) destination[1] = (uint8_t)(seal >> 8);
- if (seal_bits > 16) destination[2] = (uint8_t)(seal >> 16);
s->available_out_ += (seal_bits + 7) >> 3;
}
@@ -1527,7 +1428,7 @@ static void InjectBytePaddingBlock(BrotliEncoderState* s) {
static BROTLI_BOOL InjectFlushOrPushOutput(BrotliEncoderState* s,
size_t* available_out, uint8_t** next_out, size_t* total_out) {
if (s->stream_state_ == BROTLI_STREAM_FLUSH_REQUESTED &&
- s->last_bytes_bits_ != 0) {
+ s->last_byte_bits_ != 0) {
InjectBytePaddingBlock(s);
return BROTLI_TRUE;
}
@@ -1608,10 +1509,10 @@ static BROTLI_BOOL BrotliEncoderCompressStreamFast(
(*available_in == block_size) && (op == BROTLI_OPERATION_FINISH);
BROTLI_BOOL force_flush =
(*available_in == block_size) && (op == BROTLI_OPERATION_FLUSH);
- size_t max_out_size = 2 * block_size + 503;
+ size_t max_out_size = 2 * block_size + 502;
BROTLI_BOOL inplace = BROTLI_TRUE;
uint8_t* storage = NULL;
- size_t storage_ix = s->last_bytes_bits_;
+ size_t storage_ix = s->last_byte_bits_;
size_t table_size;
int* table;
@@ -1626,8 +1527,7 @@ static BROTLI_BOOL BrotliEncoderCompressStreamFast(
storage = GetBrotliStorage(s, max_out_size);
if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
}
- storage[0] = (uint8_t)s->last_bytes_;
- storage[1] = (uint8_t)(s->last_bytes_ >> 8);
+ storage[0] = s->last_byte_;
table = GetHashTable(s, s->params.quality, block_size, &table_size);
if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
@@ -1646,8 +1546,8 @@ static BROTLI_BOOL BrotliEncoderCompressStreamFast(
*available_in -= block_size;
if (inplace) {
size_t out_bytes = storage_ix >> 3;
- BROTLI_DCHECK(out_bytes <= *available_out);
- BROTLI_DCHECK((storage_ix & 7) == 0 || out_bytes < *available_out);
+ assert(out_bytes <= *available_out);
+ assert((storage_ix & 7) == 0 || out_bytes < *available_out);
*next_out += out_bytes;
*available_out -= out_bytes;
s->total_out_ += out_bytes;
@@ -1657,8 +1557,8 @@ static BROTLI_BOOL BrotliEncoderCompressStreamFast(
s->next_out_ = storage;
s->available_out_ = out_bytes;
}
- s->last_bytes_ = (uint16_t)(storage[storage_ix >> 3]);
- s->last_bytes_bits_ = storage_ix & 7u;
+ s->last_byte_ = storage[storage_ix >> 3];
+ s->last_byte_bits_ = storage_ix & 7u;
if (force_flush) s->stream_state_ = BROTLI_STREAM_FLUSH_REQUESTED;
if (is_last) s->stream_state_ = BROTLI_STREAM_FINISHED;
diff --git a/c/enc/encoder_dict.c b/c/enc/encoder_dict.c
deleted file mode 100755
index 8b2f6ad..0000000
--- a/c/enc/encoder_dict.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Copyright 2017 Google Inc. All Rights Reserved.
-
- Distributed under MIT license.
- See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
-*/
-
-#include "./encoder_dict.h"
-
-#include "../common/dictionary.h"
-#include "../common/transform.h"
-#include "./dictionary_hash.h"
-#include "./hash.h"
-
-#if defined(__cplusplus) || defined(c_plusplus)
-extern "C" {
-#endif
-
-void BrotliInitEncoderDictionary(BrotliEncoderDictionary* dict) {
- dict->words = BrotliGetDictionary();
-
- dict->hash_table = kStaticDictionaryHash;
- dict->buckets = kStaticDictionaryBuckets;
- dict->dict_words = kStaticDictionaryWords;
-
- dict->cutoffTransformsCount = kCutoffTransformsCount;
- dict->cutoffTransforms = kCutoffTransforms;
-
-}
-
-#if defined(__cplusplus) || defined(c_plusplus)
-} /* extern "C" */
-#endif
diff --git a/c/enc/encoder_dict.h b/c/enc/encoder_dict.h
deleted file mode 100755
index 3cb6b0a..0000000
--- a/c/enc/encoder_dict.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Copyright 2017 Google Inc. All Rights Reserved.
-
- Distributed under MIT license.
- See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
-*/
-
-#ifndef BROTLI_ENC_ENCODER_DICT_H_
-#define BROTLI_ENC_ENCODER_DICT_H_
-
-#include "../common/dictionary.h"
-#include "../common/platform.h"
-#include <brotli/types.h>
-#include "./static_dict_lut.h"
-
-#if defined(__cplusplus) || defined(c_plusplus)
-extern "C" {
-#endif
-
-/* Dictionary data (words and transforms) for 1 possible context */
-typedef struct BrotliEncoderDictionary {
- const BrotliDictionary* words;
-
- /* cut off for fast encoder */
- uint32_t cutoffTransformsCount;
- uint64_t cutoffTransforms;
-
- /* from dictionary_hash.h, for fast encoder */
- const uint16_t* hash_table;
-
- /* from static_dict_lut.h, for slow encoder */
- const uint16_t* buckets;
- const DictWord* dict_words;
-} BrotliEncoderDictionary;
-
-BROTLI_INTERNAL void BrotliInitEncoderDictionary(BrotliEncoderDictionary* dict);
-
-#if defined(__cplusplus) || defined(c_plusplus)
-} /* extern "C" */
-#endif
-
-#endif /* BROTLI_ENC_ENCODER_DICT_H_ */
diff --git a/c/enc/entropy_encode.c b/c/enc/entropy_encode.c
index 97f9dfb..41ea948 100644
--- a/c/enc/entropy_encode.c
+++ b/c/enc/entropy_encode.c
@@ -11,8 +11,8 @@
#include <string.h> /* memset */
#include "../common/constants.h"
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -23,7 +23,7 @@ BROTLI_BOOL BrotliSetDepth(
int stack[16];
int level = 0;
int p = p0;
- BROTLI_DCHECK(max_depth <= 15);
+ assert(max_depth <= 15);
stack[0] = -1;
while (BROTLI_TRUE) {
if (pool[p].index_left_ >= 0) {
@@ -66,11 +66,11 @@ static BROTLI_INLINE BROTLI_BOOL SortHuffmanTree(
we are not planning to use this with extremely long blocks.
See http://en.wikipedia.org/wiki/Huffman_coding */
-void BrotliCreateHuffmanTree(const uint32_t* data,
+void BrotliCreateHuffmanTree(const uint32_t *data,
const size_t length,
const int tree_limit,
HuffmanTree* tree,
- uint8_t* depth) {
+ uint8_t *depth) {
uint32_t count_limit;
HuffmanTree sentinel;
InitHuffmanTree(&sentinel, BROTLI_UINT32_MAX, -1, -1);
@@ -165,7 +165,7 @@ static void BrotliWriteHuffmanTreeRepetitions(
size_t* tree_size,
uint8_t* tree,
uint8_t* extra_bits_data) {
- BROTLI_DCHECK(repetitions > 0);
+ assert(repetitions > 0);
if (previous_value != value) {
tree[*tree_size] = value;
extra_bits_data[*tree_size] = 0;
@@ -371,8 +371,8 @@ void BrotliOptimizeHuffmanCountsForRle(size_t length, uint32_t* counts,
}
static void DecideOverRleUse(const uint8_t* depth, const size_t length,
- BROTLI_BOOL* use_rle_for_non_zero,
- BROTLI_BOOL* use_rle_for_zero) {
+ BROTLI_BOOL *use_rle_for_non_zero,
+ BROTLI_BOOL *use_rle_for_zero) {
size_t total_reps_zero = 0;
size_t total_reps_non_zero = 0;
size_t count_reps_zero = 1;
@@ -454,26 +454,26 @@ void BrotliWriteHuffmanTree(const uint8_t* depth,
static uint16_t BrotliReverseBits(size_t num_bits, uint16_t bits) {
static const size_t kLut[16] = { /* Pre-reversed 4-bit values. */
- 0x00, 0x08, 0x04, 0x0C, 0x02, 0x0A, 0x06, 0x0E,
- 0x01, 0x09, 0x05, 0x0D, 0x03, 0x0B, 0x07, 0x0F
+ 0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,
+ 0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf
};
- size_t retval = kLut[bits & 0x0F];
+ size_t retval = kLut[bits & 0xf];
size_t i;
for (i = 4; i < num_bits; i += 4) {
retval <<= 4;
bits = (uint16_t)(bits >> 4);
- retval |= kLut[bits & 0x0F];
+ retval |= kLut[bits & 0xf];
}
- retval >>= ((0 - num_bits) & 0x03);
+ retval >>= ((0 - num_bits) & 0x3);
return (uint16_t)retval;
}
/* 0..15 are values for bits */
#define MAX_HUFFMAN_BITS 16
-void BrotliConvertBitDepthsToSymbols(const uint8_t* depth,
+void BrotliConvertBitDepthsToSymbols(const uint8_t *depth,
size_t len,
- uint16_t* bits) {
+ uint16_t *bits) {
/* In Brotli, all bit depths are [1..15]
0 bit depth means that the symbol does not exist. */
uint16_t bl_count[MAX_HUFFMAN_BITS] = { 0 };
diff --git a/c/enc/entropy_encode.h b/c/enc/entropy_encode.h
index f23d9c3..812d009 100644
--- a/c/enc/entropy_encode.h
+++ b/c/enc/entropy_encode.h
@@ -9,8 +9,8 @@
#ifndef BROTLI_ENC_ENTROPY_ENCODE_H_
#define BROTLI_ENC_ENTROPY_ENCODE_H_
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -46,11 +46,11 @@ BROTLI_INTERNAL BROTLI_BOOL BrotliSetDepth(
be at least 2 * length + 1 long.
See http://en.wikipedia.org/wiki/Huffman_coding */
-BROTLI_INTERNAL void BrotliCreateHuffmanTree(const uint32_t* data,
+BROTLI_INTERNAL void BrotliCreateHuffmanTree(const uint32_t *data,
const size_t length,
const int tree_limit,
HuffmanTree* tree,
- uint8_t* depth);
+ uint8_t *depth);
/* Change the population counts in a way that the consequent
Huffman tree compression, especially its RLE-part will be more
@@ -72,9 +72,9 @@ BROTLI_INTERNAL void BrotliWriteHuffmanTree(const uint8_t* depth,
uint8_t* extra_bits_data);
/* Get the actual bit values for a tree of bit depths. */
-BROTLI_INTERNAL void BrotliConvertBitDepthsToSymbols(const uint8_t* depth,
+BROTLI_INTERNAL void BrotliConvertBitDepthsToSymbols(const uint8_t *depth,
size_t len,
- uint16_t* bits);
+ uint16_t *bits);
/* Input size optimized Shell sort. */
typedef BROTLI_BOOL (*HuffmanTreeComparator)(
diff --git a/c/enc/entropy_encode_static.h b/c/enc/entropy_encode_static.h
index 62b99a9..bc0ee53 100644
--- a/c/enc/entropy_encode_static.h
+++ b/c/enc/entropy_encode_static.h
@@ -10,7 +10,7 @@
#define BROTLI_ENC_ENTROPY_ENCODE_STATIC_H_
#include "../common/constants.h"
-#include "../common/platform.h"
+#include <brotli/port.h>
#include <brotli/types.h>
#include "./write_bits.h"
@@ -83,7 +83,7 @@ static const uint32_t kCodeLengthBits[18] = {
static BROTLI_INLINE void StoreStaticCodeLengthCode(
size_t* storage_ix, uint8_t* storage) {
BrotliWriteBits(
- 40, BROTLI_MAKE_UINT64_T(0x0000FFu, 0x55555554u), storage_ix, storage);
+ 40, BROTLI_MAKE_UINT64_T(0x0000ffU, 0x55555554U), storage_ix, storage);
}
static const uint64_t kZeroRepsBits[BROTLI_NUM_COMMAND_SYMBOLS] = {
@@ -529,7 +529,7 @@ static const uint16_t kStaticDistanceCodeBits[64] = {
static BROTLI_INLINE void StoreStaticDistanceHuffmanTree(
size_t* storage_ix, uint8_t* storage) {
- BrotliWriteBits(28, 0x0369DC03u, storage_ix, storage);
+ BrotliWriteBits(28, 0x0369dc03U, storage_ix, storage);
}
#if defined(__cplusplus) || defined(c_plusplus)
diff --git a/c/enc/fast_log.h b/c/enc/fast_log.h
index cade123..49c1af3 100644
--- a/c/enc/fast_log.h
+++ b/c/enc/fast_log.h
@@ -11,17 +11,15 @@
#include <math.h>
-#include "../common/platform.h"
#include <brotli/types.h>
+#include <brotli/port.h>
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
static BROTLI_INLINE uint32_t Log2FloorNonZero(size_t n) {
- /* TODO: generalize and move to platform.h */
-#if BROTLI_GNUC_HAS_BUILTIN(__builtin_clz, 3, 4, 0) || \
- BROTLI_INTEL_VERSION_CHECK(16, 0, 0)
+#if BROTLI_MODERN_COMPILER || __has_builtin(__builtin_clz)
return 31u ^ (uint32_t)__builtin_clz((uint32_t)n);
#else
uint32_t result = 0;
diff --git a/c/enc/find_match_length.h b/c/enc/find_match_length.h
index bc428cf..4184531 100644
--- a/c/enc/find_match_length.h
+++ b/c/enc/find_match_length.h
@@ -9,8 +9,8 @@
#ifndef BROTLI_ENC_FIND_MATCH_LENGTH_H_
#define BROTLI_ENC_FIND_MATCH_LENGTH_H_
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -60,8 +60,8 @@ static BROTLI_INLINE size_t FindMatchLengthWithLimit(const uint8_t* s1,
the first non-matching bit and use that to calculate the total
length of the match. */
while (s2_ptr <= s2_limit - 4 &&
- BrotliUnalignedRead32(s2_ptr) ==
- BrotliUnalignedRead32(s1 + matched)) {
+ BROTLI_UNALIGNED_LOAD32(s2_ptr) ==
+ BROTLI_UNALIGNED_LOAD32(s1 + matched)) {
s2_ptr += 4;
matched += 4;
}
diff --git a/c/enc/hash.h b/c/enc/hash.h
index 2602490..c94edd3 100644
--- a/c/enc/hash.h
+++ b/c/enc/hash.h
@@ -14,12 +14,11 @@
#include "../common/constants.h"
#include "../common/dictionary.h"
-#include "../common/platform.h"
#include <brotli/types.h>
-#include "./encoder_dict.h"
#include "./fast_log.h"
#include "./find_match_length.h"
#include "./memory.h"
+#include "./port.h"
#include "./quality.h"
#include "./static_dict.h"
@@ -36,10 +35,8 @@ extern "C" {
* * HasherCommon structure
* * private structured hasher data, depending on hasher type
* * private dynamic hasher data, depending on hasher type and parameters
- *
- * Using "define" instead of "typedef", because on MSVC __restrict does not work
- * on typedef pointer types. */
-#define HasherHandle uint8_t*
+ */
+typedef uint8_t* HasherHandle;
typedef struct {
BrotliHasherParams params;
@@ -76,13 +73,13 @@ typedef struct HasherSearchResult {
* 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(0x1E35A7BD, 0x1E35A7BD);
+static const uint32_t kHashMul32 = 0x1e35a7bd;
+static const uint64_t kHashMul64 = BROTLI_MAKE_UINT64_T(0x1e35a7bd, 0x1e35a7bd);
static const uint64_t kHashMul64Long =
- BROTLI_MAKE_UINT64_T(0x1FE35A7Bu, 0xD3579BD3u);
+ BROTLI_MAKE_UINT64_T(0x1fe35a7bU, 0xd3579bd3U);
static BROTLI_INLINE uint32_t Hash14(const uint8_t* data) {
- uint32_t h = BROTLI_UNALIGNED_LOAD32LE(data) * kHashMul32;
+ uint32_t h = BROTLI_UNALIGNED_LOAD32(data) * kHashMul32;
/* The higher bits contain more mixture from the multiplication,
so we take our results from there. */
return h >> (32 - 14);
@@ -149,35 +146,34 @@ static BROTLI_INLINE score_t BackwardReferencePenaltyUsingLastDistance(
}
static BROTLI_INLINE BROTLI_BOOL TestStaticDictionaryItem(
- const BrotliEncoderDictionary* dictionary, size_t item, const uint8_t* data,
- size_t max_length, size_t max_backward, size_t max_distance,
- HasherSearchResult* out) {
+ const BrotliDictionary* dictionary, size_t item, const uint8_t* data,
+ size_t max_length, size_t max_backward, HasherSearchResult* out) {
size_t len;
- size_t word_idx;
+ size_t dist;
size_t offset;
size_t matchlen;
size_t backward;
score_t score;
len = item & 0x1F;
- word_idx = item >> 5;
- offset = dictionary->words->offsets_by_length[len] + len * word_idx;
+ dist = item >> 5;
+ offset = dictionary->offsets_by_length[len] + len * dist;
if (len > max_length) {
return BROTLI_FALSE;
}
matchlen =
- FindMatchLengthWithLimit(data, &dictionary->words->data[offset], len);
- if (matchlen + dictionary->cutoffTransformsCount <= len || matchlen == 0) {
+ FindMatchLengthWithLimit(data, &dictionary->data[offset], len);
+ if (matchlen + kCutoffTransformsCount <= len || matchlen == 0) {
return BROTLI_FALSE;
}
{
size_t cut = len - matchlen;
- size_t transform_id = (cut << 2) +
- (size_t)((dictionary->cutoffTransforms >> (cut * 6)) & 0x3F);
- backward = max_backward + 1 + word_idx +
- (transform_id << dictionary->words->size_bits_by_length[len]);
+ size_t transform_id =
+ (cut << 2) + (size_t)((kCutoffTransforms >> (cut * 6)) & 0x3F);
+ backward = max_backward + dist + 1 +
+ (transform_id << dictionary->size_bits_by_length[len]);
}
- if (backward > max_distance) {
+ if (backward >= BROTLI_MAX_DISTANCE) {
return BROTLI_FALSE;
}
score = BackwardReferenceScore(matchlen, backward);
@@ -192,10 +188,9 @@ static BROTLI_INLINE BROTLI_BOOL TestStaticDictionaryItem(
}
static BROTLI_INLINE void SearchInStaticDictionary(
- const BrotliEncoderDictionary* dictionary,
+ const BrotliDictionary* dictionary, const uint16_t* dictionary_hash,
HasherHandle handle, const uint8_t* data, size_t max_length,
- size_t max_backward, size_t max_distance,
- HasherSearchResult* out, BROTLI_BOOL shallow) {
+ size_t max_backward, HasherSearchResult* out, BROTLI_BOOL shallow) {
size_t key;
size_t i;
HasherCommon* self = GetHasherCommon(handle);
@@ -204,11 +199,11 @@ static BROTLI_INLINE void SearchInStaticDictionary(
}
key = Hash14(data) << 1;
for (i = 0; i < (shallow ? 1u : 2u); ++i, ++key) {
- size_t item = dictionary->hash_table[key];
+ size_t item = dictionary_hash[key];
self->dict_num_lookups++;
if (item != 0) {
BROTLI_BOOL item_matches = TestStaticDictionaryItem(
- dictionary, item, data, max_length, max_backward, max_distance, out);
+ dictionary, item, data, max_length, max_backward, out);
if (item_matches) {
self->dict_num_matches++;
}
@@ -343,57 +338,11 @@ static BROTLI_INLINE size_t BackwardMatchLengthCode(const BackwardMatch* self) {
#undef BUCKET_BITS
#undef HASHER
-/* fast large window hashers */
-
-#define HASHER() HROLLING_FAST
-#define CHUNKLEN 32
-#define JUMP 4
-#define NUMBUCKETS 16777216
-#define MASK ((NUMBUCKETS * 64) - 1)
-#include "./hash_rolling_inc.h" /* NOLINT(build/include) */
-#undef JUMP
-#undef HASHER
-
-
-#define HASHER() HROLLING
-#define JUMP 1
-#include "./hash_rolling_inc.h" /* NOLINT(build/include) */
-#undef MASK
-#undef NUMBUCKETS
-#undef JUMP
-#undef CHUNKLEN
-#undef HASHER
-
-#define HASHER() H35
-#define HASHER_A H3
-#define HASHER_B HROLLING_FAST
-#include "./hash_composite_inc.h" /* NOLINT(build/include) */
-#undef HASHER_A
-#undef HASHER_B
-#undef HASHER
-
-#define HASHER() H55
-#define HASHER_A H54
-#define HASHER_B HROLLING_FAST
-#include "./hash_composite_inc.h" /* NOLINT(build/include) */
-#undef HASHER_A
-#undef HASHER_B
-#undef HASHER
-
-#define HASHER() H65
-#define HASHER_A H6
-#define HASHER_B HROLLING
-#include "./hash_composite_inc.h" /* NOLINT(build/include) */
-#undef HASHER_A
-#undef HASHER_B
-#undef HASHER
-
#undef FN
#undef CAT
#undef EXPAND_CAT
-#define FOR_GENERIC_HASHERS(H) H(2) H(3) H(4) H(5) H(6) H(40) H(41) H(42) H(54)\
- H(35) H(55) H(65)
+#define FOR_GENERIC_HASHERS(H) H(2) H(3) H(4) H(5) H(6) H(40) H(41) H(42) H(54)
#define FOR_ALL_HASHERS(H) FOR_GENERIC_HASHERS(H) H(10)
static BROTLI_INLINE void DestroyHasher(
diff --git a/c/enc/hash_composite_inc.h b/c/enc/hash_composite_inc.h
deleted file mode 100755
index f829a97..0000000
--- a/c/enc/hash_composite_inc.h
+++ /dev/null
@@ -1,133 +0,0 @@
-/* NOLINT(build/header_guard) */
-/* Copyright 2018 Google Inc. All Rights Reserved.
-
- Distributed under MIT license.
- See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
-*/
-
-/* template parameters: FN, HASHER_A, HASHER_B */
-
-/* Composite hasher: This hasher allows to combine two other hashers, HASHER_A
- and HASHER_B. */
-
-#define HashComposite HASHER()
-
-#define FN_A(X) EXPAND_CAT(X, HASHER_A)
-#define FN_B(X) EXPAND_CAT(X, HASHER_B)
-
-static BROTLI_INLINE size_t FN(HashTypeLength)(void) {
- size_t a = FN_A(HashTypeLength)();
- size_t b = FN_B(HashTypeLength)();
- return a > b ? a : b;
-}
-
-static BROTLI_INLINE size_t FN(StoreLookahead)(void) {
- size_t a = FN_A(StoreLookahead)();
- size_t b = FN_B(StoreLookahead)();
- return a > b ? a : b;
-}
-
-typedef struct HashComposite {
- HasherHandle ha;
- HasherHandle hb;
- const BrotliEncoderParams* params;
-} HashComposite;
-
-static BROTLI_INLINE HashComposite* FN(Self)(HasherHandle handle) {
- return (HashComposite*)&(GetHasherCommon(handle)[1]);
-}
-
-static void FN(Initialize)(
- HasherHandle handle, const BrotliEncoderParams* params) {
- HashComposite* self = FN(Self)(handle);
- self->ha = 0;
- self->hb = 0;
- self->params = params;
- /* TODO: Initialize of the hashers is defered to Prepare (and params
- remembered here) because we don't get the one_shot and input_size params
- here that are needed to know the memory size of them. Instead provide
- those params to all hashers FN(Initialize) */
-}
-
-static void FN(Prepare)(HasherHandle handle, BROTLI_BOOL one_shot,
- size_t input_size, const uint8_t* data) {
- HashComposite* self = FN(Self)(handle);
- if (!self->ha) {
- HasherCommon* common_a;
- HasherCommon* common_b;
-
- self->ha = handle + sizeof(HasherCommon) + sizeof(HashComposite);
- common_a = (HasherCommon*)self->ha;
- common_a->params = self->params->hasher;
- common_a->is_prepared_ = BROTLI_FALSE;
- common_a->dict_num_lookups = 0;
- common_a->dict_num_matches = 0;
- FN_A(Initialize)(self->ha, self->params);
-
- self->hb = self->ha + sizeof(HasherCommon) + FN_A(HashMemAllocInBytes)(
- self->params, one_shot, input_size);
- common_b = (HasherCommon*)self->hb;
- common_b->params = self->params->hasher;
- common_b->is_prepared_ = BROTLI_FALSE;
- common_b->dict_num_lookups = 0;
- common_b->dict_num_matches = 0;
- FN_B(Initialize)(self->hb, self->params);
- }
- FN_A(Prepare)(self->ha, one_shot, input_size, data);
- FN_B(Prepare)(self->hb, one_shot, input_size, data);
-}
-
-static BROTLI_INLINE size_t FN(HashMemAllocInBytes)(
- const BrotliEncoderParams* params, BROTLI_BOOL one_shot,
- size_t input_size) {
- return sizeof(HashComposite) + 2 * sizeof(HasherCommon) +
- FN_A(HashMemAllocInBytes)(params, one_shot, input_size) +
- FN_B(HashMemAllocInBytes)(params, one_shot, input_size);
-}
-
-static BROTLI_INLINE void FN(Store)(HasherHandle BROTLI_RESTRICT handle,
- const uint8_t* BROTLI_RESTRICT data, const size_t mask, const size_t ix) {
- HashComposite* self = FN(Self)(handle);
- FN_A(Store)(self->ha, data, mask, ix);
- FN_B(Store)(self->hb, data, mask, ix);
-}
-
-static BROTLI_INLINE void FN(StoreRange)(HasherHandle handle,
- const uint8_t* data, const size_t mask, const size_t ix_start,
- const size_t ix_end) {
- HashComposite* self = FN(Self)(handle);
- FN_A(StoreRange)(self->ha, data, mask, ix_start, ix_end);
- FN_B(StoreRange)(self->hb, data, mask, ix_start, ix_end);
-}
-
-static BROTLI_INLINE void FN(StitchToPreviousBlock)(HasherHandle handle,
- size_t num_bytes, size_t position, const uint8_t* ringbuffer,
- size_t ring_buffer_mask) {
- HashComposite* self = FN(Self)(handle);
- FN_A(StitchToPreviousBlock)(self->ha, num_bytes, position, ringbuffer,
- ring_buffer_mask);
- FN_B(StitchToPreviousBlock)(self->hb, num_bytes, position, ringbuffer,
- ring_buffer_mask);
-}
-
-static BROTLI_INLINE void FN(PrepareDistanceCache)(
- HasherHandle handle, int* BROTLI_RESTRICT distance_cache) {
- HashComposite* self = FN(Self)(handle);
- FN_A(PrepareDistanceCache)(self->ha, distance_cache);
- FN_B(PrepareDistanceCache)(self->hb, distance_cache);
-}
-
-static BROTLI_INLINE void FN(FindLongestMatch)(HasherHandle handle,
- const BrotliEncoderDictionary* dictionary,
- const uint8_t* BROTLI_RESTRICT data, const size_t ring_buffer_mask,
- const int* BROTLI_RESTRICT distance_cache, const size_t cur_ix,
- const size_t max_length, const size_t max_backward, const size_t gap,
- const size_t max_distance, HasherSearchResult* BROTLI_RESTRICT out) {
- HashComposite* self = FN(Self)(handle);
- FN_A(FindLongestMatch)(self->ha, dictionary, data, ring_buffer_mask,
- distance_cache, cur_ix, max_length, max_backward, gap, max_distance, out);
- FN_B(FindLongestMatch)(self->hb, dictionary, data, ring_buffer_mask,
- distance_cache, cur_ix, max_length, max_backward, gap, max_distance, out);
-}
-
-#undef HashComposite
diff --git a/c/enc/hash_forgetful_chain_inc.h b/c/enc/hash_forgetful_chain_inc.h
index 41cb3ff..8f9ee73 100644..100755
--- a/c/enc/hash_forgetful_chain_inc.h
+++ b/c/enc/hash_forgetful_chain_inc.h
@@ -28,8 +28,8 @@ static BROTLI_INLINE size_t FN(HashTypeLength)(void) { return 4; }
static BROTLI_INLINE size_t FN(StoreLookahead)(void) { return 4; }
/* HashBytes is the function that chooses the bucket to place the address in.*/
-static BROTLI_INLINE size_t FN(HashBytes)(const uint8_t* data) {
- const uint32_t h = BROTLI_UNALIGNED_LOAD32LE(data) * kHashMul32;
+static BROTLI_INLINE size_t FN(HashBytes)(const uint8_t *data) {
+ const uint32_t h = BROTLI_UNALIGNED_LOAD32(data) * kHashMul32;
/* The higher bits contain more mixture from the multiplication,
so we take our results from there. */
return h >> (32 - BUCKET_BITS);
@@ -115,7 +115,7 @@ static BROTLI_INLINE void FN(Store)(HasherHandle BROTLI_RESTRICT handle,
}
static BROTLI_INLINE void FN(StoreRange)(HasherHandle handle,
- const uint8_t* data, const size_t mask, const size_t ix_start,
+ const uint8_t *data, const size_t mask, const size_t ix_start,
const size_t ix_end) {
size_t i;
for (i = ix_start; i < ix_end; ++i) {
@@ -154,12 +154,11 @@ static BROTLI_INLINE void FN(PrepareDistanceCache)(
Writes the best match into |out|.
|out|->score is updated only if a better match is found. */
static BROTLI_INLINE void FN(FindLongestMatch)(HasherHandle handle,
- const BrotliEncoderDictionary* dictionary,
+ const BrotliDictionary* dictionary, const uint16_t* dictionary_hash,
const uint8_t* BROTLI_RESTRICT data, const size_t ring_buffer_mask,
const int* BROTLI_RESTRICT distance_cache,
const size_t cur_ix, const size_t max_length, const size_t max_backward,
- const size_t gap, const size_t max_distance,
- HasherSearchResult* BROTLI_RESTRICT out) {
+ const size_t gap, HasherSearchResult* BROTLI_RESTRICT out) {
HashForgetfulChain* self = FN(Self)(handle);
const size_t cur_ix_masked = cur_ix & ring_buffer_mask;
/* Don't accept a short copy from far away. */
@@ -241,9 +240,9 @@ static BROTLI_INLINE void FN(FindLongestMatch)(HasherHandle handle,
FN(Store)(handle, data, ring_buffer_mask, cur_ix);
}
if (out->score == min_score) {
- SearchInStaticDictionary(dictionary,
- handle, &data[cur_ix_masked], max_length, max_backward + gap,
- max_distance, out, BROTLI_FALSE);
+ SearchInStaticDictionary(dictionary, dictionary_hash,
+ handle, &data[cur_ix_masked], max_length, max_backward + gap, out,
+ BROTLI_FALSE);
}
}
diff --git a/c/enc/hash_longest_match64_inc.h b/c/enc/hash_longest_match64_inc.h
index e099edf..6b0697b 100644..100755
--- a/c/enc/hash_longest_match64_inc.h
+++ b/c/enc/hash_longest_match64_inc.h
@@ -20,7 +20,7 @@ static BROTLI_INLINE size_t FN(HashTypeLength)(void) { return 8; }
static BROTLI_INLINE size_t FN(StoreLookahead)(void) { return 8; }
/* HashBytes is the function that chooses the bucket to place the address in. */
-static BROTLI_INLINE uint32_t FN(HashBytes)(const uint8_t* data,
+static BROTLI_INLINE uint32_t FN(HashBytes)(const uint8_t *data,
const uint64_t mask,
const int shift) {
const uint64_t h = (BROTLI_UNALIGNED_LOAD64LE(data) & mask) * kHashMul64Long;
@@ -105,7 +105,7 @@ static BROTLI_INLINE size_t FN(HashMemAllocInBytes)(
/* Look at 4 bytes at &data[ix & mask].
Compute a hash from these, and store the value of ix at that position. */
-static BROTLI_INLINE void FN(Store)(HasherHandle handle, const uint8_t* data,
+static BROTLI_INLINE void FN(Store)(HasherHandle handle, const uint8_t *data,
const size_t mask, const size_t ix) {
HashLongestMatch* self = FN(Self)(handle);
uint16_t* num = FN(Num)(self);
@@ -119,7 +119,7 @@ static BROTLI_INLINE void FN(Store)(HasherHandle handle, const uint8_t* data,
}
static BROTLI_INLINE void FN(StoreRange)(HasherHandle handle,
- const uint8_t* data, const size_t mask, const size_t ix_start,
+ const uint8_t *data, const size_t mask, const size_t ix_start,
const size_t ix_end) {
size_t i;
for (i = ix_start; i < ix_end; ++i) {
@@ -158,11 +158,11 @@ static BROTLI_INLINE void FN(PrepareDistanceCache)(
Writes the best match into |out|.
|out|->score is updated only if a better match is found. */
static BROTLI_INLINE void FN(FindLongestMatch)(HasherHandle handle,
- const BrotliEncoderDictionary* dictionary,
+ const BrotliDictionary* dictionary, const uint16_t* dictionary_hash,
const uint8_t* BROTLI_RESTRICT data, const size_t ring_buffer_mask,
const int* BROTLI_RESTRICT distance_cache, const size_t cur_ix,
const size_t max_length, const size_t max_backward, const size_t gap,
- const size_t max_distance, HasherSearchResult* BROTLI_RESTRICT out) {
+ HasherSearchResult* BROTLI_RESTRICT out) {
HasherCommon* common = GetHasherCommon(handle);
HashLongestMatch* self = FN(Self)(handle);
uint16_t* num = FN(Num)(self);
@@ -257,9 +257,9 @@ static BROTLI_INLINE void FN(FindLongestMatch)(HasherHandle handle,
++num[key];
}
if (min_score == out->score) {
- SearchInStaticDictionary(dictionary,
- handle, &data[cur_ix_masked], max_length, max_backward + gap,
- max_distance, out, BROTLI_FALSE);
+ SearchInStaticDictionary(dictionary, dictionary_hash,
+ handle, &data[cur_ix_masked], max_length, max_backward + gap, out,
+ BROTLI_FALSE);
}
}
diff --git a/c/enc/hash_longest_match_inc.h b/c/enc/hash_longest_match_inc.h
index 951d7a4..dc5335f 100644
--- a/c/enc/hash_longest_match_inc.h
+++ b/c/enc/hash_longest_match_inc.h
@@ -20,8 +20,8 @@ static BROTLI_INLINE size_t FN(HashTypeLength)(void) { return 4; }
static BROTLI_INLINE size_t FN(StoreLookahead)(void) { return 4; }
/* HashBytes is the function that chooses the bucket to place the address in. */
-static uint32_t FN(HashBytes)(const uint8_t* data, const int shift) {
- uint32_t h = BROTLI_UNALIGNED_LOAD32LE(data) * kHashMul32;
+static uint32_t FN(HashBytes)(const uint8_t *data, const int shift) {
+ uint32_t h = BROTLI_UNALIGNED_LOAD32(data) * kHashMul32;
/* The higher bits contain more mixture from the multiplication,
so we take our results from there. */
return (uint32_t)(h >> shift);
@@ -112,7 +112,7 @@ static BROTLI_INLINE void FN(Store)(HasherHandle handle, const uint8_t* data,
}
static BROTLI_INLINE void FN(StoreRange)(HasherHandle handle,
- const uint8_t* data, const size_t mask, const size_t ix_start,
+ const uint8_t *data, const size_t mask, const size_t ix_start,
const size_t ix_end) {
size_t i;
for (i = ix_start; i < ix_end; ++i) {
@@ -151,11 +151,11 @@ static BROTLI_INLINE void FN(PrepareDistanceCache)(
Writes the best match into |out|.
|out|->score is updated only if a better match is found. */
static BROTLI_INLINE void FN(FindLongestMatch)(HasherHandle handle,
- const BrotliEncoderDictionary* dictionary,
+ const BrotliDictionary* dictionary, const uint16_t* dictionary_hash,
const uint8_t* BROTLI_RESTRICT data, const size_t ring_buffer_mask,
const int* BROTLI_RESTRICT distance_cache, const size_t cur_ix,
const size_t max_length, const size_t max_backward, const size_t gap,
- const size_t max_distance, HasherSearchResult* BROTLI_RESTRICT out) {
+ HasherSearchResult* BROTLI_RESTRICT out) {
HasherCommon* common = GetHasherCommon(handle);
HashLongestMatch* self = FN(Self)(handle);
uint16_t* num = FN(Num)(self);
@@ -249,9 +249,9 @@ static BROTLI_INLINE void FN(FindLongestMatch)(HasherHandle handle,
++num[key];
}
if (min_score == out->score) {
- SearchInStaticDictionary(dictionary,
- handle, &data[cur_ix_masked], max_length, max_backward + gap,
- max_distance, out, BROTLI_FALSE);
+ SearchInStaticDictionary(dictionary, dictionary_hash,
+ handle, &data[cur_ix_masked], max_length, max_backward + gap, out,
+ BROTLI_FALSE);
}
}
diff --git a/c/enc/hash_longest_match_quickly_inc.h b/c/enc/hash_longest_match_quickly_inc.h
index a7b9639..2c78351 100644
--- a/c/enc/hash_longest_match_quickly_inc.h
+++ b/c/enc/hash_longest_match_quickly_inc.h
@@ -81,7 +81,7 @@ static BROTLI_INLINE size_t FN(HashMemAllocInBytes)(
Compute a hash from these, and store the value somewhere within
[ix .. ix+3]. */
static BROTLI_INLINE void FN(Store)(HasherHandle handle,
- const uint8_t* data, const size_t mask, const size_t ix) {
+ const uint8_t *data, const size_t mask, const size_t ix) {
const uint32_t key = FN(HashBytes)(&data[ix & mask]);
/* Wiggle the value with the bucket sweep range. */
const uint32_t off = (ix >> 3) % BUCKET_SWEEP;
@@ -89,7 +89,7 @@ static BROTLI_INLINE void FN(Store)(HasherHandle handle,
}
static BROTLI_INLINE void FN(StoreRange)(HasherHandle handle,
- const uint8_t* data, const size_t mask, const size_t ix_start,
+ const uint8_t *data, const size_t mask, const size_t ix_start,
const size_t ix_end) {
size_t i;
for (i = ix_start; i < ix_end; ++i) {
@@ -125,12 +125,11 @@ static BROTLI_INLINE void FN(PrepareDistanceCache)(
Writes the best match into |out|.
|out|->score is updated only if a better match is found. */
static BROTLI_INLINE void FN(FindLongestMatch)(
- HasherHandle handle, const BrotliEncoderDictionary* dictionary,
- const uint8_t* BROTLI_RESTRICT data,
+ HasherHandle handle, const BrotliDictionary* dictionary,
+ const uint16_t* dictionary_hash, const uint8_t* BROTLI_RESTRICT data,
const size_t ring_buffer_mask, const int* BROTLI_RESTRICT distance_cache,
const size_t cur_ix, const size_t max_length, const size_t max_backward,
- const size_t gap, const size_t max_distance,
- HasherSearchResult* BROTLI_RESTRICT out) {
+ const size_t gap, HasherSearchResult* BROTLI_RESTRICT out) {
HashLongestMatchQuickly* self = FN(Self)(handle);
const size_t best_len_in = out->len;
const size_t cur_ix_masked = cur_ix & ring_buffer_mask;
@@ -192,7 +191,7 @@ static BROTLI_INLINE void FN(FindLongestMatch)(
}
}
} else {
- uint32_t* bucket = self->buckets_ + key;
+ uint32_t *bucket = self->buckets_ + key;
int i;
prev_ix = *bucket++;
for (i = 0; i < BUCKET_SWEEP; ++i, prev_ix = *bucket++) {
@@ -222,9 +221,9 @@ static BROTLI_INLINE void FN(FindLongestMatch)(
}
}
if (USE_DICTIONARY && min_score == out->score) {
- SearchInStaticDictionary(dictionary,
- handle, &data[cur_ix_masked], max_length, max_backward + gap,
- max_distance, out, BROTLI_TRUE);
+ SearchInStaticDictionary(dictionary, dictionary_hash,
+ handle, &data[cur_ix_masked], max_length, max_backward + gap, out,
+ BROTLI_TRUE);
}
self->buckets_[key + ((cur_ix >> 3) % BUCKET_SWEEP)] = (uint32_t)cur_ix;
}
diff --git a/c/enc/hash_rolling_inc.h b/c/enc/hash_rolling_inc.h
deleted file mode 100755
index 4d5d14a..0000000
--- a/c/enc/hash_rolling_inc.h
+++ /dev/null
@@ -1,215 +0,0 @@
-/* NOLINT(build/header_guard) */
-/* Copyright 2018 Google Inc. All Rights Reserved.
-
- Distributed under MIT license.
- See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
-*/
-
-/* template parameters: FN, JUMP, NUMBUCKETS, MASK, CHUNKLEN */
-/* NUMBUCKETS / (MASK + 1) = probability of storing and using hash code. */
-/* JUMP = skip bytes for speedup */
-
-/* Rolling hash for long distance long string matches. Stores one position
- per bucket, bucket key is computed over a long region. */
-
-#define HashRolling HASHER()
-
-static const uint32_t FN(kRollingHashMul32) = 69069;
-static const uint32_t FN(kInvalidPos) = 0xffffffff;
-
-/* This hasher uses a longer forward length, but returning a higher value here
- will hurt compression by the main hasher when combined with a composite
- hasher. The hasher tests for forward itself instead. */
-static BROTLI_INLINE size_t FN(HashTypeLength)(void) { return 4; }
-static BROTLI_INLINE size_t FN(StoreLookahead)(void) { return 4; }
-
-/* Computes a code from a single byte. A lookup table of 256 values could be
- used, but simply adding 1 works about as good. */
-static uint32_t FN(HashByte)(uint8_t byte) {
- return (uint32_t)byte + 1u;
-}
-
-static uint32_t FN(HashRollingFunctionInitial)(uint32_t state, uint8_t add,
- uint32_t factor) {
- return (uint32_t)(factor * state + FN(HashByte)(add));
-}
-
-static uint32_t FN(HashRollingFunction)(uint32_t state, uint8_t add,
- uint8_t rem, uint32_t factor,
- uint32_t factor_remove) {
- return (uint32_t)(factor * state +
- FN(HashByte)(add) - factor_remove * FN(HashByte)(rem));
-}
-
-typedef struct HashRolling {
- uint32_t state;
- uint32_t* table;
- size_t next_ix;
-
- uint32_t chunk_len;
- uint32_t factor;
- uint32_t factor_remove;
-} HashRolling;
-
-static BROTLI_INLINE HashRolling* FN(Self)(HasherHandle handle) {
- return (HashRolling*)&(GetHasherCommon(handle)[1]);
-}
-
-static void FN(Initialize)(
- HasherHandle handle, const BrotliEncoderParams* params) {
- HashRolling* self = FN(Self)(handle);
- size_t i;
- self->state = 0;
- self->next_ix = 0;
-
- self->factor = FN(kRollingHashMul32);
-
- /* Compute the factor of the oldest byte to remove: factor**steps modulo
- 0xffffffff (the multiplications rely on 32-bit overflow) */
- self->factor_remove = 1;
- for (i = 0; i < CHUNKLEN; i += JUMP) {
- self->factor_remove *= self->factor;
- }
-
- self->table = (uint32_t*)((HasherHandle)self + sizeof(HashRolling));
- for (i = 0; i < NUMBUCKETS; i++) {
- self->table[i] = FN(kInvalidPos);
- }
-
- BROTLI_UNUSED(params);
-}
-
-static void FN(Prepare)(HasherHandle handle, BROTLI_BOOL one_shot,
- size_t input_size, const uint8_t* data) {
- HashRolling* self = FN(Self)(handle);
- size_t i;
- /* Too small size, cannot use this hasher. */
- if (input_size < CHUNKLEN) return;
- self->state = 0;
- for (i = 0; i < CHUNKLEN; i += JUMP) {
- self->state = FN(HashRollingFunctionInitial)(
- self->state, data[i], self->factor);
- }
- BROTLI_UNUSED(one_shot);
-}
-
-static BROTLI_INLINE size_t FN(HashMemAllocInBytes)(
- const BrotliEncoderParams* params, BROTLI_BOOL one_shot,
- size_t input_size) {
- return sizeof(HashRolling) + NUMBUCKETS * sizeof(uint32_t);
- BROTLI_UNUSED(params);
- BROTLI_UNUSED(one_shot);
- BROTLI_UNUSED(input_size);
-}
-
-static BROTLI_INLINE void FN(Store)(HasherHandle BROTLI_RESTRICT handle,
- const uint8_t* BROTLI_RESTRICT data, const size_t mask, const size_t ix) {
- BROTLI_UNUSED(handle);
- BROTLI_UNUSED(data);
- BROTLI_UNUSED(mask);
- BROTLI_UNUSED(ix);
-}
-
-static BROTLI_INLINE void FN(StoreRange)(HasherHandle handle,
- const uint8_t* data, const size_t mask, const size_t ix_start,
- const size_t ix_end) {
- BROTLI_UNUSED(handle);
- BROTLI_UNUSED(data);
- BROTLI_UNUSED(mask);
- BROTLI_UNUSED(ix_start);
- BROTLI_UNUSED(ix_end);
-}
-
-static BROTLI_INLINE void FN(StitchToPreviousBlock)(HasherHandle handle,
- size_t num_bytes, size_t position, const uint8_t* ringbuffer,
- size_t ring_buffer_mask) {
- /* In this case we must re-initialize the hasher from scratch from the
- current position. */
- HashRolling* self = FN(Self)(handle);
- size_t position_masked;
- size_t available = num_bytes;
- if ((position & (JUMP - 1)) != 0) {
- size_t diff = JUMP - (position & (JUMP - 1));
- available = (diff > available) ? 0 : (available - diff);
- position += diff;
- }
- position_masked = position & ring_buffer_mask;
- /* wrapping around ringbuffer not handled. */
- if (available > ring_buffer_mask - position_masked) {
- available = ring_buffer_mask - position_masked;
- }
-
- FN(Prepare)(handle, BROTLI_FALSE, available,
- ringbuffer + (position & ring_buffer_mask));
- self->next_ix = position;
- BROTLI_UNUSED(num_bytes);
-}
-
-static BROTLI_INLINE void FN(PrepareDistanceCache)(
- HasherHandle handle, int* BROTLI_RESTRICT distance_cache) {
- BROTLI_UNUSED(handle);
- BROTLI_UNUSED(distance_cache);
-}
-
-static BROTLI_INLINE void FN(FindLongestMatch)(HasherHandle handle,
- const BrotliEncoderDictionary* dictionary,
- const uint8_t* BROTLI_RESTRICT data, const size_t ring_buffer_mask,
- const int* BROTLI_RESTRICT distance_cache, const size_t cur_ix,
- const size_t max_length, const size_t max_backward, const size_t gap,
- const size_t max_distance, HasherSearchResult* BROTLI_RESTRICT out) {
- HashRolling* self = FN(Self)(handle);
- const size_t cur_ix_masked = cur_ix & ring_buffer_mask;
- size_t pos = self->next_ix;
-
- if ((cur_ix & (JUMP - 1)) != 0) return;
-
- /* Not enough lookahead */
- if (max_length < CHUNKLEN) return;
-
- for (pos = self->next_ix; pos <= cur_ix; pos += JUMP) {
- uint32_t code = self->state & MASK;
-
- uint8_t rem = data[pos & ring_buffer_mask];
- uint8_t add = data[(pos + CHUNKLEN) & ring_buffer_mask];
- size_t found_ix = FN(kInvalidPos);
-
- self->state = FN(HashRollingFunction)(
- self->state, add, rem, self->factor, self->factor_remove);
-
- if (code < NUMBUCKETS) {
- found_ix = self->table[code];
- self->table[code] = (uint32_t)pos;
- if (pos == cur_ix && found_ix != FN(kInvalidPos)) {
- /* The cast to 32-bit makes backward distances up to 4GB work even
- if cur_ix is above 4GB, despite using 32-bit values in the table. */
- size_t backward = (uint32_t)(cur_ix - found_ix);
- if (backward <= max_backward) {
- const size_t found_ix_masked = found_ix & ring_buffer_mask;
- const size_t len = FindMatchLengthWithLimit(&data[found_ix_masked],
- &data[cur_ix_masked],
- max_length);
- if (len >= 4 && len > out->len) {
- score_t score = BackwardReferenceScore(len, backward);
- if (score > out->score) {
- out->len = len;
- out->distance = backward;
- out->score = score;
- out->len_code_delta = 0;
- }
- }
- }
- }
- }
- }
-
- self->next_ix = cur_ix + JUMP;
-
- /* NOTE: this hasher does not search in the dictionary. It is used as
- backup-hasher, the main hasher already searches in it. */
- BROTLI_UNUSED(dictionary);
- BROTLI_UNUSED(distance_cache);
- BROTLI_UNUSED(gap);
- BROTLI_UNUSED(max_distance);
-}
-
-#undef HashRolling
diff --git a/c/enc/hash_to_binary_tree_inc.h b/c/enc/hash_to_binary_tree_inc.h
index 48097b1..30c71b5 100644..100755
--- a/c/enc/hash_to_binary_tree_inc.h
+++ b/c/enc/hash_to_binary_tree_inc.h
@@ -24,8 +24,8 @@ static BROTLI_INLINE size_t FN(StoreLookahead)(void) {
return MAX_TREE_COMP_LENGTH;
}
-static uint32_t FN(HashBytes)(const uint8_t* data) {
- uint32_t h = BROTLI_UNALIGNED_LOAD32LE(data) * kHashMul32;
+static uint32_t FN(HashBytes)(const uint8_t *data) {
+ uint32_t h = BROTLI_UNALIGNED_LOAD32(data) * kHashMul32;
/* The higher bits contain more mixture from the multiplication,
so we take our results from there. */
return h >> (32 - BUCKET_BITS);
@@ -154,13 +154,12 @@ static BROTLI_INLINE BackwardMatch* FN(StoreAndFindMatches)(
{
const size_t cur_len = BROTLI_MIN(size_t, best_len_left, best_len_right);
size_t len;
- BROTLI_DCHECK(cur_len <= MAX_TREE_COMP_LENGTH);
+ assert(cur_len <= MAX_TREE_COMP_LENGTH);
len = cur_len +
FindMatchLengthWithLimit(&data[cur_ix_masked + cur_len],
&data[prev_ix_masked + cur_len],
max_length - cur_len);
- BROTLI_DCHECK(
- 0 == memcmp(&data[cur_ix_masked], &data[prev_ix_masked], len));
+ assert(0 == memcmp(&data[cur_ix_masked], &data[prev_ix_masked], len));
if (matches && len > *best_len) {
*best_len = len;
InitBackwardMatch(matches++, backward, len);
@@ -200,7 +199,7 @@ static BROTLI_INLINE BackwardMatch* FN(StoreAndFindMatches)(
sorted by strictly increasing length and (non-strictly) increasing
distance. */
static BROTLI_INLINE size_t FN(FindAllMatches)(HasherHandle handle,
- const BrotliEncoderDictionary* dictionary, const uint8_t* data,
+ const BrotliDictionary* dictionary, const uint8_t* data,
const size_t ring_buffer_mask, const size_t cur_ix,
const size_t max_length, const size_t max_backward, const size_t gap,
const BrotliEncoderParams* params, BackwardMatch* matches) {
@@ -252,7 +251,7 @@ static BROTLI_INLINE size_t FN(FindAllMatches)(HasherHandle handle,
uint32_t dict_id = dict_matches[l];
if (dict_id < kInvalidMatch) {
size_t distance = max_backward + gap + (dict_id >> 5) + 1;
- if (distance <= params->dist.max_distance) {
+ if (distance < BROTLI_MAX_DISTANCE) {
InitDictionaryBackwardMatch(matches++, distance, l, dict_id & 31);
}
}
@@ -265,7 +264,7 @@ static BROTLI_INLINE size_t FN(FindAllMatches)(HasherHandle handle,
/* Stores the hash of the next 4 bytes and re-roots the binary tree at the
current sequence, without returning any matches.
REQUIRES: ix + MAX_TREE_COMP_LENGTH <= end-of-current-block */
-static BROTLI_INLINE void FN(Store)(HasherHandle handle, const uint8_t* data,
+static BROTLI_INLINE void FN(Store)(HasherHandle handle, const uint8_t *data,
const size_t mask, const size_t ix) {
HashToBinaryTree* self = FN(Self)(handle);
/* Maximum distance is window size - 16, see section 9.1. of the spec. */
@@ -275,7 +274,7 @@ static BROTLI_INLINE void FN(Store)(HasherHandle handle, const uint8_t* data,
}
static BROTLI_INLINE void FN(StoreRange)(HasherHandle handle,
- const uint8_t* data, const size_t mask, const size_t ix_start,
+ const uint8_t *data, const size_t mask, const size_t ix_start,
const size_t ix_end) {
size_t i = ix_start;
size_t j = ix_start;
diff --git a/c/enc/histogram.c b/c/enc/histogram.c
index 6da2ff6..bb7b4c5 100644
--- a/c/enc/histogram.c
+++ b/c/enc/histogram.c
@@ -8,9 +8,9 @@
#include "./histogram.h"
-#include "../common/context.h"
#include "./block_splitter.h"
#include "./command.h"
+#include "./context.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -63,16 +63,13 @@ void BrotliBuildHistogramsWithContext(
BlockSplitIteratorNext(&insert_and_copy_it);
HistogramAddCommand(&insert_and_copy_histograms[insert_and_copy_it.type_],
cmd->cmd_prefix_);
- /* TODO: unwrap iterator blocks. */
for (j = cmd->insert_len_; j != 0; --j) {
size_t context;
BlockSplitIteratorNext(&literal_it);
- context = literal_it.type_;
- if (context_modes) {
- ContextLut lut = BROTLI_CONTEXT_LUT(context_modes[context]);
- context = (context << BROTLI_LITERAL_CONTEXT_BITS) +
- BROTLI_CONTEXT(prev_byte, prev_byte2, lut);
- }
+ context = context_modes ?
+ ((literal_it.type_ << BROTLI_LITERAL_CONTEXT_BITS) +
+ Context(prev_byte, prev_byte2, context_modes[literal_it.type_])) :
+ literal_it.type_;
HistogramAddLiteral(&literal_histograms[context],
ringbuffer[pos & mask]);
prev_byte2 = prev_byte;
@@ -89,7 +86,7 @@ void BrotliBuildHistogramsWithContext(
context = (dist_it.type_ << BROTLI_DISTANCE_CONTEXT_BITS) +
CommandDistanceContext(cmd);
HistogramAddDistance(&copy_dist_histograms[context],
- cmd->dist_prefix_ & 0x3FF);
+ cmd->dist_prefix_);
}
}
}
diff --git a/c/enc/histogram.h b/c/enc/histogram.h
index 42af3c3..2161574 100644
--- a/c/enc/histogram.h
+++ b/c/enc/histogram.h
@@ -12,19 +12,16 @@
#include <string.h> /* memset */
#include "../common/constants.h"
-#include "../common/context.h"
-#include "../common/platform.h"
#include <brotli/types.h>
#include "./block_splitter.h"
#include "./command.h"
+#include "./context.h"
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
-/* The distance symbols effectively used by "Large Window Brotli" (32-bit). */
-#define BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS 544
-
#define FN(X) X ## Literal
#define DATA_SIZE BROTLI_NUM_LITERAL_SYMBOLS
#define DataType uint8_t
@@ -41,7 +38,7 @@ extern "C" {
#undef FN
#define FN(X) X ## Distance
-#define DATA_SIZE BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS
+#define DATA_SIZE BROTLI_NUM_DISTANCE_SYMBOLS
#include "./histogram_inc.h" /* NOLINT(build/include) */
#undef DataType
#undef DATA_SIZE
diff --git a/c/enc/histogram_inc.h b/c/enc/histogram_inc.h
index 50eaf74..7807036 100644
--- a/c/enc/histogram_inc.h
+++ b/c/enc/histogram_inc.h
@@ -33,7 +33,7 @@ static BROTLI_INLINE void FN(HistogramAdd)(FN(Histogram)* self, size_t val) {
}
static BROTLI_INLINE void FN(HistogramAddVector)(FN(Histogram)* self,
- const DataType* p, size_t n) {
+ const DataType *p, size_t n) {
self->total_count_ += n;
n += 1;
while (--n) ++self->data_[*p++];
diff --git a/c/enc/literal_cost.c b/c/enc/literal_cost.c
index c231100..91c691c 100644
--- a/c/enc/literal_cost.c
+++ b/c/enc/literal_cost.c
@@ -9,9 +9,9 @@
#include "./literal_cost.h"
-#include "../common/platform.h"
#include <brotli/types.h>
#include "./fast_log.h"
+#include "./port.h"
#include "./utf8_util.h"
#if defined(__cplusplus) || defined(c_plusplus)
@@ -25,7 +25,7 @@ static size_t UTF8Position(size_t last, size_t c, size_t clamp) {
return BROTLI_MIN(size_t, 1, clamp);
} else {
/* Let's decide over the last byte if this ends the sequence. */
- if (last < 0xE0) {
+ if (last < 0xe0) {
return 0; /* Completed two or three byte coding. */
} else { /* Next one is the 'Byte 3' of utf-8 encoding. */
return BROTLI_MIN(size_t, 2, clamp);
@@ -34,7 +34,7 @@ static size_t UTF8Position(size_t last, size_t c, size_t clamp) {
}
static size_t DecideMultiByteStatsLevel(size_t pos, size_t len, size_t mask,
- const uint8_t* data) {
+ const uint8_t *data) {
size_t counts[3] = { 0 };
size_t max_utf8 = 1; /* should be 2, but 1 compresses better. */
size_t last_c = 0;
@@ -54,7 +54,7 @@ static size_t DecideMultiByteStatsLevel(size_t pos, size_t len, size_t mask,
}
static void EstimateBitCostsForLiteralsUTF8(size_t pos, size_t len, size_t mask,
- const uint8_t* data, float* cost) {
+ const uint8_t *data, float *cost) {
/* max_utf8 is 0 (normal ASCII single byte modeling),
1 (for 2-byte UTF-8 modeling), or 2 (for 3-byte UTF-8 modeling). */
const size_t max_utf8 = DecideMultiByteStatsLevel(pos, len, mask, data);
@@ -125,7 +125,7 @@ static void EstimateBitCostsForLiteralsUTF8(size_t pos, size_t len, size_t mask,
}
void BrotliEstimateBitCostsForLiterals(size_t pos, size_t len, size_t mask,
- const uint8_t* data, float* cost) {
+ const uint8_t *data, float *cost) {
if (BrotliIsMostlyUTF8(data, pos, mask, len, kMinUTF8Ratio)) {
EstimateBitCostsForLiteralsUTF8(pos, len, mask, data, cost);
return;
diff --git a/c/enc/literal_cost.h b/c/enc/literal_cost.h
index 8f53f39..7b3d030 100644
--- a/c/enc/literal_cost.h
+++ b/c/enc/literal_cost.h
@@ -10,8 +10,8 @@
#ifndef BROTLI_ENC_LITERAL_COST_H_
#define BROTLI_ENC_LITERAL_COST_H_
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -21,7 +21,7 @@ extern "C" {
ring-buffer (data, mask) will take entropy coded and writes these estimates
to the cost[0..len) array. */
BROTLI_INTERNAL void BrotliEstimateBitCostsForLiterals(
- size_t pos, size_t len, size_t mask, const uint8_t* data, float* cost);
+ size_t pos, size_t len, size_t mask, const uint8_t *data, float *cost);
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
diff --git a/c/enc/memory.c b/c/enc/memory.c
index f6ed7e3..5aa5a22 100644
--- a/c/enc/memory.c
+++ b/c/enc/memory.c
@@ -9,11 +9,12 @@
#include "./memory.h"
+#include <assert.h>
#include <stdlib.h> /* exit, free, malloc */
#include <string.h> /* memcpy */
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -27,12 +28,22 @@ extern "C" {
#define NEW_ALLOCATED_OFFSET MAX_PERM_ALLOCATED
#define NEW_FREED_OFFSET (MAX_PERM_ALLOCATED + MAX_NEW_ALLOCATED)
+static void* DefaultAllocFunc(void* opaque, size_t size) {
+ BROTLI_UNUSED(opaque);
+ return malloc(size);
+}
+
+static void DefaultFreeFunc(void* opaque, void* address) {
+ BROTLI_UNUSED(opaque);
+ free(address);
+}
+
void BrotliInitMemoryManager(
MemoryManager* m, brotli_alloc_func alloc_func, brotli_free_func free_func,
void* opaque) {
if (!alloc_func) {
- m->alloc_func = BrotliDefaultAllocFunc;
- m->free_func = BrotliDefaultFreeFunc;
+ m->alloc_func = DefaultAllocFunc;
+ m->free_func = DefaultFreeFunc;
m->opaque = 0;
} else {
m->alloc_func = alloc_func;
@@ -121,11 +132,11 @@ static void CollectGarbagePointers(MemoryManager* m) {
m->pointers + NEW_FREED_OFFSET, m->new_freed);
m->perm_allocated -= annihilated;
m->new_freed -= annihilated;
- BROTLI_DCHECK(m->new_freed == 0);
+ assert(m->new_freed == 0);
}
if (m->new_allocated != 0) {
- BROTLI_DCHECK(m->perm_allocated + m->new_allocated <= MAX_PERM_ALLOCATED);
+ assert(m->perm_allocated + m->new_allocated <= MAX_PERM_ALLOCATED);
memcpy(m->pointers + PERM_ALLOCATED_OFFSET + m->perm_allocated,
m->pointers + NEW_ALLOCATED_OFFSET,
sizeof(void*) * m->new_allocated);
diff --git a/c/enc/memory.h b/c/enc/memory.h
index ab928d0..babf1f8 100644
--- a/c/enc/memory.h
+++ b/c/enc/memory.h
@@ -9,10 +9,8 @@
#ifndef BROTLI_ENC_MEMORY_H_
#define BROTLI_ENC_MEMORY_H_
-#include <string.h> /* memcpy */
-
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -58,43 +56,6 @@ BROTLI_INTERNAL void BrotliFree(MemoryManager* m, void* p);
BROTLI_INTERNAL void BrotliWipeOutMemoryManager(MemoryManager* m);
-/*
-Dynamically grows array capacity to at least the requested size
-M: MemoryManager
-T: data type
-A: array
-C: capacity
-R: requested size
-*/
-#define BROTLI_ENSURE_CAPACITY(M, T, A, C, R) { \
- if (C < (R)) { \
- size_t _new_size = (C == 0) ? (R) : C; \
- T* new_array; \
- while (_new_size < (R)) _new_size *= 2; \
- new_array = BROTLI_ALLOC((M), T, _new_size); \
- if (!BROTLI_IS_OOM(M) && C != 0) \
- memcpy(new_array, A, C * sizeof(T)); \
- BROTLI_FREE((M), A); \
- A = new_array; \
- C = _new_size; \
- } \
-}
-
-/*
-Appends value and dynamically grows array capacity when needed
-M: MemoryManager
-T: data type
-A: array
-C: array capacity
-S: array size
-V: value to append
-*/
-#define BROTLI_ENSURE_CAPACITY_APPEND(M, T, A, C, S, V) { \
- (S)++; \
- BROTLI_ENSURE_CAPACITY(M, T, A, C, S); \
- A[(S) - 1] = (V); \
-}
-
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
#endif
diff --git a/c/enc/metablock.c b/c/enc/metablock.c
index 641f95e..1db76da 100644
--- a/c/enc/metablock.c
+++ b/c/enc/metablock.c
@@ -10,131 +10,29 @@
#include "./metablock.h"
#include "../common/constants.h"
-#include "../common/context.h"
-#include "../common/platform.h"
#include <brotli/types.h>
#include "./bit_cost.h"
#include "./block_splitter.h"
#include "./cluster.h"
+#include "./context.h"
#include "./entropy_encode.h"
#include "./histogram.h"
#include "./memory.h"
+#include "./port.h"
#include "./quality.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
-void BrotliInitDistanceParams(BrotliEncoderParams* params,
- uint32_t npostfix, uint32_t ndirect) {
- BrotliDistanceParams* dist_params = &params->dist;
- uint32_t alphabet_size, max_distance;
-
- dist_params->distance_postfix_bits = npostfix;
- dist_params->num_direct_distance_codes = ndirect;
-
- alphabet_size = BROTLI_DISTANCE_ALPHABET_SIZE(
- npostfix, ndirect, BROTLI_MAX_DISTANCE_BITS);
- max_distance = ndirect + (1U << (BROTLI_MAX_DISTANCE_BITS + npostfix + 2)) -
- (1U << (npostfix + 2));
-
- if (params->large_window) {
- static const uint32_t bound[BROTLI_MAX_NPOSTFIX + 1] = {0, 4, 12, 28};
- uint32_t postfix = 1U << npostfix;
- alphabet_size = BROTLI_DISTANCE_ALPHABET_SIZE(
- npostfix, ndirect, BROTLI_LARGE_MAX_DISTANCE_BITS);
- /* The maximum distance is set so that no distance symbol used can encode
- a distance larger than BROTLI_MAX_ALLOWED_DISTANCE with all
- its extra bits set. */
- if (ndirect < bound[npostfix]) {
- max_distance = BROTLI_MAX_ALLOWED_DISTANCE - (bound[npostfix] - ndirect);
- } else if (ndirect >= bound[npostfix] + postfix) {
- max_distance = (3U << 29) - 4 + (ndirect - bound[npostfix]);
- } else {
- max_distance = BROTLI_MAX_ALLOWED_DISTANCE;
- }
- }
-
- dist_params->alphabet_size = alphabet_size;
- dist_params->max_distance = max_distance;
-}
-
-static void RecomputeDistancePrefixes(Command* cmds,
- size_t num_commands,
- const BrotliDistanceParams* orig_params,
- const BrotliDistanceParams* new_params) {
- size_t i;
-
- if (orig_params->distance_postfix_bits == new_params->distance_postfix_bits &&
- orig_params->num_direct_distance_codes ==
- new_params->num_direct_distance_codes) {
- return;
- }
-
- for (i = 0; i < num_commands; ++i) {
- Command* cmd = &cmds[i];
- if (CommandCopyLen(cmd) && cmd->cmd_prefix_ >= 128) {
- PrefixEncodeCopyDistance(CommandRestoreDistanceCode(cmd, orig_params),
- new_params->num_direct_distance_codes,
- new_params->distance_postfix_bits,
- &cmd->dist_prefix_,
- &cmd->dist_extra_);
- }
- }
-}
-
-static BROTLI_BOOL ComputeDistanceCost(const Command* cmds,
- size_t num_commands,
- const BrotliDistanceParams* orig_params,
- const BrotliDistanceParams* new_params,
- double* cost) {
- size_t i;
- BROTLI_BOOL equal_params = BROTLI_FALSE;
- uint16_t dist_prefix;
- uint32_t dist_extra;
- double extra_bits = 0.0;
- HistogramDistance histo;
- HistogramClearDistance(&histo);
-
- if (orig_params->distance_postfix_bits == new_params->distance_postfix_bits &&
- orig_params->num_direct_distance_codes ==
- new_params->num_direct_distance_codes) {
- equal_params = BROTLI_TRUE;
- }
-
- for (i = 0; i < num_commands; i++) {
- const Command* cmd = &cmds[i];
- if (CommandCopyLen(cmd) && cmd->cmd_prefix_ >= 128) {
- if (equal_params) {
- dist_prefix = cmd->dist_prefix_;
- } else {
- uint32_t distance = CommandRestoreDistanceCode(cmd, orig_params);
- if (distance > new_params->max_distance) {
- return BROTLI_FALSE;
- }
- PrefixEncodeCopyDistance(distance,
- new_params->num_direct_distance_codes,
- new_params->distance_postfix_bits,
- &dist_prefix,
- &dist_extra);
- }
- HistogramAddDistance(&histo, dist_prefix & 0x3FF);
- extra_bits += dist_prefix >> 10;
- }
- }
-
- *cost = BrotliPopulationCostDistance(&histo) + extra_bits;
- return BROTLI_TRUE;
-}
-
void BrotliBuildMetaBlock(MemoryManager* m,
const uint8_t* ringbuffer,
const size_t pos,
const size_t mask,
- BrotliEncoderParams* params,
+ const BrotliEncoderParams* params,
uint8_t prev_byte,
uint8_t prev_byte2,
- Command* cmds,
+ const Command* cmds,
size_t num_commands,
ContextType literal_context_mode,
MetaBlockSplit* mb) {
@@ -147,46 +45,6 @@ void BrotliBuildMetaBlock(MemoryManager* m,
size_t distance_histograms_size;
size_t i;
size_t literal_context_multiplier = 1;
- uint32_t npostfix;
- uint32_t ndirect_msb = 0;
- BROTLI_BOOL check_orig = BROTLI_TRUE;
- double best_dist_cost = 1e99;
- BrotliEncoderParams orig_params = *params;
- BrotliEncoderParams new_params = *params;
-
- for (npostfix = 0; npostfix <= BROTLI_MAX_NPOSTFIX; npostfix++) {
- for (; ndirect_msb < 16; ndirect_msb++) {
- uint32_t ndirect = ndirect_msb << npostfix;
- BROTLI_BOOL skip;
- double dist_cost;
- BrotliInitDistanceParams(&new_params, npostfix, ndirect);
- if (npostfix == orig_params.dist.distance_postfix_bits &&
- ndirect == orig_params.dist.num_direct_distance_codes) {
- check_orig = BROTLI_FALSE;
- }
- skip = !ComputeDistanceCost(
- cmds, num_commands,
- &orig_params.dist, &new_params.dist, &dist_cost);
- if (skip || (dist_cost > best_dist_cost)) {
- break;
- }
- best_dist_cost = dist_cost;
- params->dist = new_params.dist;
- }
- if (ndirect_msb > 0) ndirect_msb--;
- ndirect_msb /= 2;
- }
- if (check_orig) {
- double dist_cost;
- ComputeDistanceCost(cmds, num_commands,
- &orig_params.dist, &orig_params.dist, &dist_cost);
- if (dist_cost < best_dist_cost) {
- best_dist_cost = dist_cost;
- params->dist = orig_params.dist;
- }
- }
- RecomputeDistancePrefixes(cmds, num_commands,
- &orig_params.dist, &params->dist);
BrotliSplitBlock(m, cmds, num_commands,
ringbuffer, pos, mask, params,
@@ -219,7 +77,7 @@ void BrotliBuildMetaBlock(MemoryManager* m,
if (BROTLI_IS_OOM(m)) return;
ClearHistogramsDistance(distance_histograms, distance_histograms_size);
- BROTLI_DCHECK(mb->command_histograms == 0);
+ assert(mb->command_histograms == 0);
mb->command_histograms_size = mb->command_split.num_types;
mb->command_histograms =
BROTLI_ALLOC(m, HistogramCommand, mb->command_histograms_size);
@@ -232,14 +90,14 @@ void BrotliBuildMetaBlock(MemoryManager* m,
literal_histograms, mb->command_histograms, distance_histograms);
BROTLI_FREE(m, literal_context_modes);
- BROTLI_DCHECK(mb->literal_context_map == 0);
+ assert(mb->literal_context_map == 0);
mb->literal_context_map_size =
mb->literal_split.num_types << BROTLI_LITERAL_CONTEXT_BITS;
mb->literal_context_map =
BROTLI_ALLOC(m, uint32_t, mb->literal_context_map_size);
if (BROTLI_IS_OOM(m)) return;
- BROTLI_DCHECK(mb->literal_histograms == 0);
+ assert(mb->literal_histograms == 0);
mb->literal_histograms_size = mb->literal_context_map_size;
mb->literal_histograms =
BROTLI_ALLOC(m, HistogramLiteral, mb->literal_histograms_size);
@@ -263,14 +121,14 @@ void BrotliBuildMetaBlock(MemoryManager* m,
}
}
- BROTLI_DCHECK(mb->distance_context_map == 0);
+ assert(mb->distance_context_map == 0);
mb->distance_context_map_size =
mb->distance_split.num_types << BROTLI_DISTANCE_CONTEXT_BITS;
mb->distance_context_map =
BROTLI_ALLOC(m, uint32_t, mb->distance_context_map_size);
if (BROTLI_IS_OOM(m)) return;
- BROTLI_DCHECK(mb->distance_histograms == 0);
+ assert(mb->distance_histograms == 0);
mb->distance_histograms_size = mb->distance_context_map_size;
mb->distance_histograms =
BROTLI_ALLOC(m, HistogramDistance, mb->distance_histograms_size);
@@ -342,7 +200,7 @@ static void InitContextBlockSplitter(
size_t* histograms_size) {
size_t max_num_blocks = num_symbols / min_block_size + 1;
size_t max_num_types;
- BROTLI_DCHECK(num_contexts <= BROTLI_MAX_STATIC_CONTEXTS);
+ assert(num_contexts <= BROTLI_MAX_STATIC_CONTEXTS);
self->alphabet_size_ = alphabet_size;
self->num_contexts_ = num_contexts;
@@ -368,7 +226,7 @@ static void InitContextBlockSplitter(
if (BROTLI_IS_OOM(m)) return;
split->num_blocks = max_num_blocks;
if (BROTLI_IS_OOM(m)) return;
- BROTLI_DCHECK(*histograms == 0);
+ assert(*histograms == 0);
*histograms_size = max_num_types * num_contexts;
*histograms = BROTLI_ALLOC(m, HistogramLiteral, *histograms_size);
self->histograms_ = *histograms;
@@ -521,7 +379,7 @@ static void MapStaticContexts(MemoryManager* m,
const uint32_t* static_context_map,
MetaBlockSplit* mb) {
size_t i;
- BROTLI_DCHECK(mb->literal_context_map == 0);
+ assert(mb->literal_context_map == 0);
mb->literal_context_map_size =
mb->literal_split.num_types << BROTLI_LITERAL_CONTEXT_BITS;
mb->literal_context_map =
@@ -540,9 +398,9 @@ static void MapStaticContexts(MemoryManager* m,
static BROTLI_INLINE void BrotliBuildMetaBlockGreedyInternal(
MemoryManager* m, const uint8_t* ringbuffer, size_t pos, size_t mask,
- uint8_t prev_byte, uint8_t prev_byte2, ContextLut literal_context_lut,
+ uint8_t prev_byte, uint8_t prev_byte2, ContextType literal_context_mode,
const size_t num_contexts, const uint32_t* static_context_map,
- const Command* commands, size_t n_commands, MetaBlockSplit* mb) {
+ const Command *commands, size_t n_commands, MetaBlockSplit* mb) {
union {
BlockSplitterLiteral plain;
ContextBlockSplitter ctx;
@@ -583,8 +441,7 @@ static BROTLI_INLINE void BrotliBuildMetaBlockGreedyInternal(
if (num_contexts == 1) {
BlockSplitterAddSymbolLiteral(&lit_blocks.plain, literal);
} else {
- size_t context =
- BROTLI_CONTEXT(prev_byte, prev_byte2, literal_context_lut);
+ size_t context = Context(prev_byte, prev_byte2, literal_context_mode);
ContextBlockSplitterAddSymbol(&lit_blocks.ctx, m, literal,
static_context_map[context]);
if (BROTLI_IS_OOM(m)) return;
@@ -598,7 +455,7 @@ static BROTLI_INLINE void BrotliBuildMetaBlockGreedyInternal(
prev_byte2 = ringbuffer[(pos - 2) & mask];
prev_byte = ringbuffer[(pos - 1) & mask];
if (cmd.cmd_prefix_ >= 128) {
- BlockSplitterAddSymbolDistance(&dist_blocks, cmd.dist_prefix_ & 0x3FF);
+ BlockSplitterAddSymbolDistance(&dist_blocks, cmd.dist_prefix_);
}
}
}
@@ -625,7 +482,7 @@ void BrotliBuildMetaBlockGreedy(MemoryManager* m,
size_t mask,
uint8_t prev_byte,
uint8_t prev_byte2,
- ContextLut literal_context_lut,
+ ContextType literal_context_mode,
size_t num_contexts,
const uint32_t* static_context_map,
const Command* commands,
@@ -633,17 +490,19 @@ void BrotliBuildMetaBlockGreedy(MemoryManager* m,
MetaBlockSplit* mb) {
if (num_contexts == 1) {
BrotliBuildMetaBlockGreedyInternal(m, ringbuffer, pos, mask, prev_byte,
- prev_byte2, literal_context_lut, 1, NULL, commands, n_commands, mb);
+ prev_byte2, literal_context_mode, 1, NULL, commands, n_commands, mb);
} else {
BrotliBuildMetaBlockGreedyInternal(m, ringbuffer, pos, mask, prev_byte,
- prev_byte2, literal_context_lut, num_contexts, static_context_map,
+ prev_byte2, literal_context_mode, num_contexts, static_context_map,
commands, n_commands, mb);
}
}
-void BrotliOptimizeHistograms(uint32_t num_distance_codes,
+void BrotliOptimizeHistograms(size_t num_direct_distance_codes,
+ size_t distance_postfix_bits,
MetaBlockSplit* mb) {
uint8_t good_for_rle[BROTLI_NUM_COMMAND_SYMBOLS];
+ size_t num_distance_codes;
size_t i;
for (i = 0; i < mb->literal_histograms_size; ++i) {
BrotliOptimizeHuffmanCountsForRle(256, mb->literal_histograms[i].data_,
@@ -654,6 +513,9 @@ void BrotliOptimizeHistograms(uint32_t num_distance_codes,
mb->command_histograms[i].data_,
good_for_rle);
}
+ num_distance_codes = BROTLI_NUM_DISTANCE_SHORT_CODES +
+ num_direct_distance_codes +
+ ((2 * BROTLI_MAX_DISTANCE_BITS) << distance_postfix_bits);
for (i = 0; i < mb->distance_histograms_size; ++i) {
BrotliOptimizeHuffmanCountsForRle(num_distance_codes,
mb->distance_histograms[i].data_,
diff --git a/c/enc/metablock.h b/c/enc/metablock.h
index 334a79a..cc52399 100644
--- a/c/enc/metablock.h
+++ b/c/enc/metablock.h
@@ -10,13 +10,13 @@
#ifndef BROTLI_ENC_METABLOCK_H_
#define BROTLI_ENC_METABLOCK_H_
-#include "../common/context.h"
-#include "../common/platform.h"
#include <brotli/types.h>
#include "./block_splitter.h"
#include "./command.h"
+#include "./context.h"
#include "./histogram.h"
#include "./memory.h"
+#include "./port.h"
#include "./quality.h"
#if defined(__cplusplus) || defined(c_plusplus)
@@ -67,18 +67,15 @@ static BROTLI_INLINE void DestroyMetaBlockSplit(
BROTLI_FREE(m, mb->distance_histograms);
}
-/* Uses the slow shortest-path block splitter and does context clustering.
- The distance parameters are dynamically selected based on the commands
- which get recomputed under the new distance parameters. The new distance
- parameters are stored into *params. */
+/* Uses the slow shortest-path block splitter and does context clustering. */
BROTLI_INTERNAL void BrotliBuildMetaBlock(MemoryManager* m,
const uint8_t* ringbuffer,
const size_t pos,
const size_t mask,
- BrotliEncoderParams* params,
+ const BrotliEncoderParams* params,
uint8_t prev_byte,
uint8_t prev_byte2,
- Command* cmds,
+ const Command* cmds,
size_t num_commands,
ContextType literal_context_mode,
MetaBlockSplit* mb);
@@ -88,16 +85,14 @@ BROTLI_INTERNAL void BrotliBuildMetaBlock(MemoryManager* m,
is the same for all block types. */
BROTLI_INTERNAL void BrotliBuildMetaBlockGreedy(
MemoryManager* m, const uint8_t* ringbuffer, size_t pos, size_t mask,
- uint8_t prev_byte, uint8_t prev_byte2, ContextLut literal_context_lut,
+ uint8_t prev_byte, uint8_t prev_byte2, ContextType literal_context_mode,
size_t num_contexts, const uint32_t* static_context_map,
const Command* commands, size_t n_commands, MetaBlockSplit* mb);
-BROTLI_INTERNAL void BrotliOptimizeHistograms(uint32_t num_distance_codes,
+BROTLI_INTERNAL void BrotliOptimizeHistograms(size_t num_direct_distance_codes,
+ size_t distance_postfix_bits,
MetaBlockSplit* mb);
-BROTLI_INTERNAL void BrotliInitDistanceParams(BrotliEncoderParams* params,
- uint32_t npostfix, uint32_t ndirect);
-
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
#endif
diff --git a/c/enc/metablock_inc.h b/c/enc/metablock_inc.h
index dcc9d3c..c8bfb81 100644
--- a/c/enc/metablock_inc.h
+++ b/c/enc/metablock_inc.h
@@ -67,7 +67,7 @@ static void FN(InitBlockSplitter)(
split->lengths, split->lengths_alloc_size, max_num_blocks);
if (BROTLI_IS_OOM(m)) return;
self->split_->num_blocks = max_num_blocks;
- BROTLI_DCHECK(*histograms == 0);
+ assert(*histograms == 0);
*histograms_size = max_num_types;
*histograms = BROTLI_ALLOC(m, HistogramType, *histograms_size);
self->histograms_ = *histograms;
diff --git a/c/enc/params.h b/c/enc/params.h
deleted file mode 100755
index 6ecf1d3..0000000
--- a/c/enc/params.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Copyright 2017 Google Inc. All Rights Reserved.
-
- Distributed under MIT license.
- See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
-*/
-
-/* Parameters for the Brotli encoder with chosen quality levels. */
-
-#ifndef BROTLI_ENC_PARAMS_H_
-#define BROTLI_ENC_PARAMS_H_
-
-#include <brotli/encode.h>
-#include "./encoder_dict.h"
-
-typedef struct BrotliHasherParams {
- int type;
- int bucket_bits;
- int block_bits;
- int hash_len;
- int num_last_distances_to_check;
-} BrotliHasherParams;
-
-typedef struct BrotliDistanceParams {
- uint32_t distance_postfix_bits;
- uint32_t num_direct_distance_codes;
- uint32_t alphabet_size;
- size_t max_distance;
-} BrotliDistanceParams;
-
-/* Encoding parameters */
-typedef struct BrotliEncoderParams {
- BrotliEncoderMode mode;
- int quality;
- int lgwin;
- int lgblock;
- size_t size_hint;
- BROTLI_BOOL disable_literal_context_modeling;
- BROTLI_BOOL large_window;
- BrotliHasherParams hasher;
- BrotliDistanceParams dist;
- BrotliEncoderDictionary dictionary;
-} BrotliEncoderParams;
-
-#endif /* BROTLI_ENC_PARAMS_H_ */
diff --git a/c/enc/port.h b/c/enc/port.h
new file mode 100644
index 0000000..0e5f0e7
--- /dev/null
+++ b/c/enc/port.h
@@ -0,0 +1,184 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Macros for endianness, branch prediction and unaligned loads and stores. */
+
+#ifndef BROTLI_ENC_PORT_H_
+#define BROTLI_ENC_PORT_H_
+
+#include <assert.h>
+#include <string.h> /* memcpy */
+
+#include <brotli/port.h>
+#include <brotli/types.h>
+
+#if defined OS_LINUX || defined OS_CYGWIN
+#include <endian.h>
+#elif defined OS_FREEBSD
+#include <machine/endian.h>
+#elif defined OS_MACOSX
+#include <machine/endian.h>
+/* Let's try and follow the Linux convention */
+#define __BYTE_ORDER BYTE_ORDER
+#define __LITTLE_ENDIAN LITTLE_ENDIAN
+#endif
+
+/* define the macro BROTLI_LITTLE_ENDIAN
+ using the above endian definitions from endian.h if
+ endian.h was included */
+#ifdef __BYTE_ORDER
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define BROTLI_LITTLE_ENDIAN
+#endif
+
+#else
+
+#if defined(__LITTLE_ENDIAN__)
+#define BROTLI_LITTLE_ENDIAN
+#endif
+#endif /* __BYTE_ORDER */
+
+#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
+#define BROTLI_LITTLE_ENDIAN
+#endif
+
+/* Enable little-endian optimization for x64 architecture on Windows. */
+#if (defined(_WIN32) || defined(_WIN64)) && defined(_M_X64)
+#define BROTLI_LITTLE_ENDIAN
+#endif
+
+/* Portable handling of unaligned loads, stores, and copies.
+ On some platforms, like ARM, the copy functions can be more efficient
+ then a load and a store. */
+
+#if defined(BROTLI_LITTLE_ENDIAN) && (\
+ defined(ARCH_PIII) || defined(ARCH_ATHLON) || \
+ defined(ARCH_K8) || defined(_ARCH_PPC))
+
+/* x86 and x86-64 can perform unaligned loads/stores directly;
+ modern PowerPC hardware can also do unaligned integer loads and stores;
+ but note: the FPU still sends unaligned loads and stores to a trap handler!
+*/
+
+#define BROTLI_UNALIGNED_LOAD32(_p) (*(const uint32_t *)(_p))
+#define BROTLI_UNALIGNED_LOAD64LE(_p) (*(const uint64_t *)(_p))
+
+#define BROTLI_UNALIGNED_STORE64LE(_p, _val) \
+ (*(uint64_t *)(_p) = (_val))
+
+#elif defined(BROTLI_LITTLE_ENDIAN) && defined(__arm__) && \
+ !defined(__ARM_ARCH_5__) && \
+ !defined(__ARM_ARCH_5T__) && \
+ !defined(__ARM_ARCH_5TE__) && \
+ !defined(__ARM_ARCH_5TEJ__) && \
+ !defined(__ARM_ARCH_6__) && \
+ !defined(__ARM_ARCH_6J__) && \
+ !defined(__ARM_ARCH_6K__) && \
+ !defined(__ARM_ARCH_6Z__) && \
+ !defined(__ARM_ARCH_6ZK__) && \
+ !defined(__ARM_ARCH_6T2__)
+
+/* ARMv7 and newer support native unaligned accesses, but only of 16-bit
+ and 32-bit values (not 64-bit); older versions either raise a fatal signal,
+ do an unaligned read and rotate the words around a bit, or do the reads very
+ slowly (trip through kernel mode). */
+
+#define BROTLI_UNALIGNED_LOAD32(_p) (*(const uint32_t *)(_p))
+
+static BROTLI_INLINE uint64_t BROTLI_UNALIGNED_LOAD64LE(const void *p) {
+ uint64_t t;
+ memcpy(&t, p, sizeof t);
+ return t;
+}
+
+static BROTLI_INLINE void BROTLI_UNALIGNED_STORE64LE(void *p, uint64_t v) {
+ memcpy(p, &v, sizeof v);
+}
+
+#else
+
+/* These functions are provided for architectures that don't support */
+/* unaligned loads and stores. */
+
+static BROTLI_INLINE uint32_t BROTLI_UNALIGNED_LOAD32(const void *p) {
+ uint32_t t;
+ memcpy(&t, p, sizeof t);
+ return t;
+}
+
+#if defined(BROTLI_LITTLE_ENDIAN)
+
+static BROTLI_INLINE uint64_t BROTLI_UNALIGNED_LOAD64LE(const void *p) {
+ uint64_t t;
+ memcpy(&t, p, sizeof t);
+ return t;
+}
+
+static BROTLI_INLINE void BROTLI_UNALIGNED_STORE64LE(void *p, uint64_t v) {
+ memcpy(p, &v, sizeof v);
+}
+
+#else /* BROTLI_LITTLE_ENDIAN */
+
+static BROTLI_INLINE uint64_t BROTLI_UNALIGNED_LOAD64LE(const void *p) {
+ const uint8_t* in = (const uint8_t*)p;
+ uint64_t value = (uint64_t)(in[0]);
+ value |= (uint64_t)(in[1]) << 8;
+ value |= (uint64_t)(in[2]) << 16;
+ value |= (uint64_t)(in[3]) << 24;
+ value |= (uint64_t)(in[4]) << 32;
+ value |= (uint64_t)(in[5]) << 40;
+ value |= (uint64_t)(in[6]) << 48;
+ value |= (uint64_t)(in[7]) << 56;
+ return value;
+}
+
+static BROTLI_INLINE void BROTLI_UNALIGNED_STORE64LE(void *p, uint64_t v) {
+ uint8_t* out = (uint8_t*)p;
+ out[0] = (uint8_t)v;
+ out[1] = (uint8_t)(v >> 8);
+ out[2] = (uint8_t)(v >> 16);
+ out[3] = (uint8_t)(v >> 24);
+ out[4] = (uint8_t)(v >> 32);
+ out[5] = (uint8_t)(v >> 40);
+ out[6] = (uint8_t)(v >> 48);
+ out[7] = (uint8_t)(v >> 56);
+}
+
+#endif /* BROTLI_LITTLE_ENDIAN */
+
+#endif
+
+#define TEMPLATE_(T) \
+ static BROTLI_INLINE T brotli_min_ ## T (T a, T b) { return a < b ? a : b; } \
+ static BROTLI_INLINE T brotli_max_ ## T (T a, T b) { return a > b ? a : b; }
+TEMPLATE_(double) TEMPLATE_(float) TEMPLATE_(int)
+TEMPLATE_(size_t) TEMPLATE_(uint32_t) TEMPLATE_(uint8_t)
+#undef TEMPLATE_
+#define BROTLI_MIN(T, A, B) (brotli_min_ ## T((A), (B)))
+#define BROTLI_MAX(T, A, B) (brotli_max_ ## T((A), (B)))
+
+#define BROTLI_SWAP(T, A, I, J) { \
+ T __brotli_swap_tmp = (A)[(I)]; \
+ (A)[(I)] = (A)[(J)]; \
+ (A)[(J)] = __brotli_swap_tmp; \
+}
+
+#define BROTLI_ENSURE_CAPACITY(M, T, A, C, R) { \
+ if (C < (R)) { \
+ size_t _new_size = (C == 0) ? (R) : C; \
+ T* new_array; \
+ while (_new_size < (R)) _new_size *= 2; \
+ new_array = BROTLI_ALLOC((M), T, _new_size); \
+ if (!BROTLI_IS_OOM(m) && C != 0) \
+ memcpy(new_array, A, C * sizeof(T)); \
+ BROTLI_FREE((M), A); \
+ A = new_array; \
+ C = _new_size; \
+ } \
+}
+
+#endif /* BROTLI_ENC_PORT_H_ */
diff --git a/c/enc/prefix.h b/c/enc/prefix.h
index fd359a4..e279ffe 100644
--- a/c/enc/prefix.h
+++ b/c/enc/prefix.h
@@ -11,7 +11,7 @@
#define BROTLI_ENC_PREFIX_H_
#include "../common/constants.h"
-#include "../common/platform.h"
+#include <brotli/port.h>
#include <brotli/types.h>
#include "./fast_log.h"
@@ -39,10 +39,11 @@ static BROTLI_INLINE void PrefixEncodeCopyDistance(size_t distance_code,
size_t prefix = (dist >> bucket) & 1;
size_t offset = (2 + prefix) << bucket;
size_t nbits = bucket - postfix_bits;
- *code = (uint16_t)((nbits << 10) |
+ *code = (uint16_t)(
(BROTLI_NUM_DISTANCE_SHORT_CODES + num_direct_codes +
((2 * (nbits - 1) + prefix) << postfix_bits) + postfix));
- *extra_bits = (uint32_t)((dist - offset) >> postfix_bits);
+ *extra_bits = (uint32_t)(
+ (nbits << 24) | ((dist - offset) >> postfix_bits));
}
}
diff --git a/c/enc/quality.h b/c/enc/quality.h
index 5f4d034..09a5fdc 100644..100755
--- a/c/enc/quality.h
+++ b/c/enc/quality.h
@@ -10,9 +10,7 @@
#ifndef BROTLI_ENC_QUALITY_H_
#define BROTLI_ENC_QUALITY_H_
-#include "../common/platform.h"
#include <brotli/encode.h>
-#include "./params.h"
#define FAST_ONE_PASS_COMPRESSION_QUALITY 0
#define FAST_TWO_PASS_COMPRESSION_QUALITY 1
@@ -21,16 +19,36 @@
#define MAX_QUALITY_FOR_STATIC_ENTROPY_CODES 2
#define MIN_QUALITY_FOR_BLOCK_SPLIT 4
-#define MIN_QUALITY_FOR_NONZERO_DISTANCE_PARAMS 4
#define MIN_QUALITY_FOR_OPTIMIZE_HISTOGRAMS 4
#define MIN_QUALITY_FOR_EXTENSIVE_REFERENCE_SEARCH 5
#define MIN_QUALITY_FOR_CONTEXT_MODELING 5
#define MIN_QUALITY_FOR_HQ_CONTEXT_MODELING 7
#define MIN_QUALITY_FOR_HQ_BLOCK_SPLITTING 10
+/* Only for "font" mode. */
+#define MIN_QUALITY_FOR_RECOMPUTE_DISTANCE_PREFIXES 10
/* For quality below MIN_QUALITY_FOR_BLOCK_SPLIT there is no block splitting,
so we buffer at most this much literals and commands. */
-#define MAX_NUM_DELAYED_SYMBOLS 0x2FFF
+#define MAX_NUM_DELAYED_SYMBOLS 0x2fff
+
+typedef struct BrotliHasherParams {
+ int type;
+ int bucket_bits;
+ int block_bits;
+ int hash_len;
+ int num_last_distances_to_check;
+} BrotliHasherParams;
+
+/* Encoding parameters */
+typedef struct BrotliEncoderParams {
+ BrotliEncoderMode mode;
+ int quality;
+ int lgwin;
+ int lgblock;
+ size_t size_hint;
+ BROTLI_BOOL disable_literal_context_modeling;
+ BrotliHasherParams hasher;
+} BrotliEncoderParams;
/* Returns hash-table size for quality levels 0 and 1. */
static BROTLI_INLINE size_t MaxHashTableSize(int quality) {
@@ -59,15 +77,10 @@ static BROTLI_INLINE size_t MaxZopfliCandidates(
static BROTLI_INLINE void SanitizeParams(BrotliEncoderParams* params) {
params->quality = BROTLI_MIN(int, BROTLI_MAX_QUALITY,
BROTLI_MAX(int, BROTLI_MIN_QUALITY, params->quality));
- if (params->quality <= MAX_QUALITY_FOR_STATIC_ENTROPY_CODES) {
- params->large_window = BROTLI_FALSE;
- }
if (params->lgwin < BROTLI_MIN_WINDOW_BITS) {
params->lgwin = BROTLI_MIN_WINDOW_BITS;
- } else {
- int max_lgwin = params->large_window ? BROTLI_LARGE_MAX_WINDOW_BITS :
- BROTLI_MAX_WINDOW_BITS;
- if (params->lgwin > max_lgwin) params->lgwin = max_lgwin;
+ } else if (params->lgwin > BROTLI_MAX_WINDOW_BITS) {
+ params->lgwin = BROTLI_MAX_WINDOW_BITS;
}
}
@@ -142,24 +155,6 @@ static BROTLI_INLINE void ChooseHasher(const BrotliEncoderParams* params,
hparams->num_last_distances_to_check =
params->quality < 7 ? 4 : params->quality < 9 ? 10 : 16;
}
-
- if (params->lgwin > 24) {
- /* Different hashers for large window brotli: not for qualities <= 2,
- these are too fast for large window. Not for qualities >= 10: their
- hasher already works well with large window. So the changes are:
- H3 --> H35: for quality 3.
- H54 --> H55: for quality 4 with size hint > 1MB
- H6 --> H65: for qualities 5, 6, 7, 8, 9. */
- if (hparams->type == 3) {
- hparams->type = 35;
- }
- if (hparams->type == 54) {
- hparams->type = 55;
- }
- if (hparams->type == 6) {
- hparams->type = 65;
- }
- }
}
#endif /* BROTLI_ENC_QUALITY_H_ */
diff --git a/c/enc/ringbuffer.h b/c/enc/ringbuffer.h
index 86079a8..0e7ef97 100644
--- a/c/enc/ringbuffer.h
+++ b/c/enc/ringbuffer.h
@@ -11,9 +11,9 @@
#include <string.h> /* memcpy */
-#include "../common/platform.h"
#include <brotli/types.h>
#include "./memory.h"
+#include "./port.h"
#include "./quality.h"
#if defined(__cplusplus) || defined(c_plusplus)
@@ -41,9 +41,9 @@ typedef struct RingBuffer {
uint32_t pos_;
/* The actual ring buffer containing the copy of the last two bytes, the data,
and the copy of the beginning as a tail. */
- uint8_t* data_;
+ uint8_t *data_;
/* The start of the ring-buffer. */
- uint8_t* buffer_;
+ uint8_t *buffer_;
} RingBuffer;
static BROTLI_INLINE void RingBufferInit(RingBuffer* rb) {
@@ -91,7 +91,7 @@ static BROTLI_INLINE void RingBufferInitBuffer(
}
static BROTLI_INLINE void RingBufferWriteTail(
- const uint8_t* bytes, size_t n, RingBuffer* rb) {
+ const uint8_t *bytes, size_t n, RingBuffer* rb) {
const size_t masked_pos = rb->pos_ & rb->mask_;
if (BROTLI_PREDICT_FALSE(masked_pos < rb->tail_size_)) {
/* Just fill the tail buffer with the beginning data. */
@@ -103,7 +103,7 @@ static BROTLI_INLINE void RingBufferWriteTail(
/* Push bytes into the ring buffer. */
static BROTLI_INLINE void RingBufferWrite(
- MemoryManager* m, const uint8_t* bytes, size_t n, RingBuffer* rb) {
+ MemoryManager* m, const uint8_t *bytes, size_t n, RingBuffer* rb) {
if (rb->pos_ == 0 && n < rb->tail_size_) {
/* Special case for the first write: to process the first block, we don't
need to allocate the whole ring-buffer and we don't need the tail
@@ -144,16 +144,12 @@ static BROTLI_INLINE void RingBufferWrite(
n - (rb->size_ - masked_pos));
}
}
- {
- BROTLI_BOOL not_first_lap = (rb->pos_ & (1u << 31)) != 0;
- uint32_t rb_pos_mask = (1u << 31) - 1;
- rb->buffer_[-2] = rb->buffer_[rb->size_ - 2];
- rb->buffer_[-1] = rb->buffer_[rb->size_ - 1];
- rb->pos_ = (rb->pos_ & rb_pos_mask) + (uint32_t)(n & rb_pos_mask);
- if (not_first_lap) {
- /* Wrap, but preserve not-a-first-lap feature. */
- rb->pos_ |= 1u << 31;
- }
+ rb->buffer_[-2] = rb->buffer_[rb->size_ - 2];
+ rb->buffer_[-1] = rb->buffer_[rb->size_ - 1];
+ rb->pos_ += (uint32_t)n;
+ if (rb->pos_ > (1u << 30)) {
+ /* Wrap, but preserve not-a-first-lap feature. */
+ rb->pos_ = (rb->pos_ & ((1u << 30) - 1)) | (1u << 30);
}
}
diff --git a/c/enc/static_dict.c b/c/enc/static_dict.c
index 7299ab7..b98ee8b 100644
--- a/c/enc/static_dict.c
+++ b/c/enc/static_dict.c
@@ -7,17 +7,21 @@
#include "./static_dict.h"
#include "../common/dictionary.h"
-#include "../common/platform.h"
-#include "../common/transform.h"
-#include "./encoder_dict.h"
#include "./find_match_length.h"
+#include "./port.h"
+#include "./static_dict_lut.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;
+static const uint8_t kUppercaseFirst = 10;
+static const uint8_t kOmitLastNTransforms[10] = {
+ 0, 12, 27, 23, 42, 63, 56, 48, 59, 64,
+};
+
+static BROTLI_INLINE uint32_t Hash(const uint8_t *data) {
+ uint32_t h = BROTLI_UNALIGNED_LOAD32(data) * kDictHashMul32;
/* The higher bits contain more mixture from the multiplication,
so we take our results from there. */
return h >> (32 - kDictNumBits);
@@ -75,33 +79,32 @@ static BROTLI_INLINE BROTLI_BOOL IsMatch(const BrotliDictionary* dictionary,
}
BROTLI_BOOL BrotliFindAllStaticDictionaryMatches(
- const BrotliEncoderDictionary* dictionary, const uint8_t* data,
- size_t min_length, size_t max_length, uint32_t* matches) {
+ const BrotliDictionary* dictionary, const uint8_t* data, size_t min_length,
+ size_t max_length, uint32_t* matches) {
BROTLI_BOOL has_found_match = BROTLI_FALSE;
{
- size_t offset = dictionary->buckets[Hash(data)];
+ size_t offset = kStaticDictionaryBuckets[Hash(data)];
BROTLI_BOOL end = !offset;
while (!end) {
- DictWord w = dictionary->dict_words[offset++];
+ DictWord w = kStaticDictionaryWords[offset++];
const size_t l = w.len & 0x1F;
- const size_t n = (size_t)1 << dictionary->words->size_bits_by_length[l];
+ const size_t n = (size_t)1 << dictionary->size_bits_by_length[l];
const size_t id = w.idx;
end = !!(w.len & 0x80);
w.len = (uint8_t)l;
if (w.transform == 0) {
const size_t matchlen =
- DictMatchLength(dictionary->words, data, id, l, max_length);
+ DictMatchLength(dictionary, data, id, l, max_length);
const uint8_t* s;
size_t minlen;
size_t maxlen;
size_t len;
- /* Transform "" + BROTLI_TRANSFORM_IDENTITY + "" */
+ /* Transform "" + kIdentity + "" */
if (matchlen == l) {
AddMatch(id, l, l, matches);
has_found_match = BROTLI_TRUE;
}
- /* Transforms "" + BROTLI_TRANSFORM_OMIT_LAST_1 + "" and
- "" + BROTLI_TRANSFORM_OMIT_LAST_1 + "ing " */
+ /* Transforms "" + kOmitLast1 + "" and "" + kOmitLast1 + "ing " */
if (matchlen >= l - 1) {
AddMatch(id + 12 * n, l - 1, l, matches);
if (l + 2 < max_length &&
@@ -111,22 +114,19 @@ BROTLI_BOOL BrotliFindAllStaticDictionaryMatches(
}
has_found_match = BROTLI_TRUE;
}
- /* Transform "" + BROTLI_TRANSFORM_OMIT_LAST_# + "" (# = 2 .. 9) */
+ /* Transform "" + kOmitLastN + "" (N = 2 .. 9) */
minlen = min_length;
if (l > 9) minlen = BROTLI_MAX(size_t, minlen, l - 9);
maxlen = BROTLI_MIN(size_t, matchlen, l - 2);
for (len = minlen; len <= maxlen; ++len) {
- size_t cut = l - len;
- size_t transform_id = (cut << 2) +
- (size_t)((dictionary->cutoffTransforms >> (cut * 6)) & 0x3F);
- AddMatch(id + transform_id * n, len, l, matches);
+ AddMatch(id + kOmitLastNTransforms[l - len] * n, len, l, matches);
has_found_match = BROTLI_TRUE;
}
if (matchlen < l || l + 6 >= max_length) {
continue;
}
s = &data[l];
- /* Transforms "" + BROTLI_TRANSFORM_IDENTITY + <suffix> */
+ /* Transforms "" + kIdentity + <suffix> */
if (s[0] == ' ') {
AddMatch(id + n, l + 1, l, matches);
if (s[1] == 'a') {
@@ -273,13 +273,12 @@ BROTLI_BOOL BrotliFindAllStaticDictionaryMatches(
}
}
} else {
- /* Set is_all_caps=0 for BROTLI_TRANSFORM_UPPERCASE_FIRST and
- is_all_caps=1 otherwise (BROTLI_TRANSFORM_UPPERCASE_ALL)
- transform. */
+ /* Set is_all_caps=0 for kUppercaseFirst and
+ is_all_caps=1 otherwise (kUppercaseAll) transform. */
const BROTLI_BOOL is_all_caps =
- TO_BROTLI_BOOL(w.transform != BROTLI_TRANSFORM_UPPERCASE_FIRST);
+ TO_BROTLI_BOOL(w.transform != kUppercaseFirst);
const uint8_t* s;
- if (!IsMatch(dictionary->words, w, data, max_length)) {
+ if (!IsMatch(dictionary, w, data, max_length)) {
continue;
}
/* Transform "" + kUppercase{First,All} + "" */
@@ -324,29 +323,27 @@ BROTLI_BOOL BrotliFindAllStaticDictionaryMatches(
/* 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 = kStaticDictionaryBuckets[Hash(&data[1])];
BROTLI_BOOL end = !offset;
while (!end) {
- DictWord w = dictionary->dict_words[offset++];
+ DictWord w = kStaticDictionaryWords[offset++];
const size_t l = w.len & 0x1F;
- const size_t n = (size_t)1 << dictionary->words->size_bits_by_length[l];
+ const size_t n = (size_t)1 << dictionary->size_bits_by_length[l];
const size_t id = w.idx;
end = !!(w.len & 0x80);
w.len = (uint8_t)l;
if (w.transform == 0) {
const uint8_t* s;
- if (!IsMatch(dictionary->words, w, &data[1], max_length - 1)) {
+ if (!IsMatch(dictionary, w, &data[1], max_length - 1)) {
continue;
}
- /* Transforms " " + BROTLI_TRANSFORM_IDENTITY + "" and
- "." + BROTLI_TRANSFORM_IDENTITY + "" */
+ /* Transforms " " + kIdentity + "" and "." + kIdentity + "" */
AddMatch(id + (is_space ? 6 : 32) * n, l + 1, l, matches);
has_found_match = BROTLI_TRUE;
if (l + 2 >= max_length) {
continue;
}
- /* Transforms " " + BROTLI_TRANSFORM_IDENTITY + <suffix> and
- "." + BROTLI_TRANSFORM_IDENTITY + <suffix>
+ /* Transforms " " + kIdentity + <suffix> and "." + kIdentity + <suffix>
*/
s = &data[l + 1];
if (s[0] == ' ') {
@@ -373,13 +370,12 @@ BROTLI_BOOL BrotliFindAllStaticDictionaryMatches(
}
}
} else if (is_space) {
- /* Set is_all_caps=0 for BROTLI_TRANSFORM_UPPERCASE_FIRST and
- is_all_caps=1 otherwise (BROTLI_TRANSFORM_UPPERCASE_ALL)
- transform. */
+ /* Set is_all_caps=0 for kUppercaseFirst and
+ is_all_caps=1 otherwise (kUppercaseAll) transform. */
const BROTLI_BOOL is_all_caps =
- TO_BROTLI_BOOL(w.transform != BROTLI_TRANSFORM_UPPERCASE_FIRST);
+ TO_BROTLI_BOOL(w.transform != kUppercaseFirst);
const uint8_t* s;
- if (!IsMatch(dictionary->words, w, &data[1], max_length - 1)) {
+ if (!IsMatch(dictionary, w, &data[1], max_length - 1)) {
continue;
}
/* Transforms " " + kUppercase{First,All} + "" */
@@ -415,22 +411,22 @@ BROTLI_BOOL BrotliFindAllStaticDictionaryMatches(
}
}
if (max_length >= 6) {
- /* Transforms with prefixes "e ", "s ", ", " and "\xC2\xA0" */
+ /* Transforms with prefixes "e ", "s ", ", " and "\xc2\xa0" */
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])];
+ (data[0] == 0xc2 && data[1] == 0xa0)) {
+ size_t offset = kStaticDictionaryBuckets[Hash(&data[2])];
BROTLI_BOOL end = !offset;
while (!end) {
- DictWord w = dictionary->dict_words[offset++];
+ DictWord w = kStaticDictionaryWords[offset++];
const size_t l = w.len & 0x1F;
- const size_t n = (size_t)1 << dictionary->words->size_bits_by_length[l];
+ const size_t n = (size_t)1 << dictionary->size_bits_by_length[l];
const size_t id = w.idx;
end = !!(w.len & 0x80);
w.len = (uint8_t)l;
if (w.transform == 0 &&
- IsMatch(dictionary->words, w, &data[2], max_length - 2)) {
- if (data[0] == 0xC2) {
+ IsMatch(dictionary, w, &data[2], max_length - 2)) {
+ if (data[0] == 0xc2) {
AddMatch(id + 102 * n, l + 2, l, matches);
has_found_match = BROTLI_TRUE;
} else if (l + 2 < max_length && data[l + 2] == ' ') {
@@ -448,17 +444,17 @@ BROTLI_BOOL BrotliFindAllStaticDictionaryMatches(
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 = kStaticDictionaryBuckets[Hash(&data[5])];
BROTLI_BOOL end = !offset;
while (!end) {
- DictWord w = dictionary->dict_words[offset++];
+ DictWord w = kStaticDictionaryWords[offset++];
const size_t l = w.len & 0x1F;
- const size_t n = (size_t)1 << dictionary->words->size_bits_by_length[l];
+ const size_t n = (size_t)1 << dictionary->size_bits_by_length[l];
const size_t id = w.idx;
end = !!(w.len & 0x80);
w.len = (uint8_t)l;
if (w.transform == 0 &&
- IsMatch(dictionary->words, w, &data[5], max_length - 5)) {
+ IsMatch(dictionary, w, &data[5], max_length - 5)) {
AddMatch(id + (data[0] == ' ' ? 41 : 72) * n, l + 5, l, matches);
has_found_match = BROTLI_TRUE;
if (l + 5 < max_length) {
diff --git a/c/enc/static_dict.h b/c/enc/static_dict.h
index 6b5d4eb..fb74b13 100644
--- a/c/enc/static_dict.h
+++ b/c/enc/static_dict.h
@@ -10,16 +10,15 @@
#define BROTLI_ENC_STATIC_DICT_H_
#include "../common/dictionary.h"
-#include "../common/platform.h"
#include <brotli/types.h>
-#include "./encoder_dict.h"
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
#define BROTLI_MAX_STATIC_DICTIONARY_MATCH_LEN 37
-static const uint32_t kInvalidMatch = 0xFFFFFFF;
+static const uint32_t kInvalidMatch = 0xfffffff;
/* Matches data against static dictionary words, and for each length l,
for which a match is found, updates matches[l] to be the minimum possible
@@ -29,7 +28,7 @@ static const uint32_t kInvalidMatch = 0xFFFFFFF;
matches array is at least BROTLI_MAX_STATIC_DICTIONARY_MATCH_LEN + 1 long
all elements are initialized to kInvalidMatch */
BROTLI_INTERNAL BROTLI_BOOL BrotliFindAllStaticDictionaryMatches(
- const BrotliEncoderDictionary* dictionary,
+ const BrotliDictionary* dictionary,
const uint8_t* data, size_t min_length, size_t max_length,
uint32_t* matches);
diff --git a/c/enc/static_dict_lut.h b/c/enc/static_dict_lut.h
index e299cda..ba94f76 100644
--- a/c/enc/static_dict_lut.h
+++ b/c/enc/static_dict_lut.h
@@ -23,7 +23,7 @@ typedef struct DictWord {
} DictWord;
static const int kDictNumBits = 15;
-static const uint32_t kDictHashMul32 = 0x1E35A7BD;
+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,
diff --git a/c/enc/utf8_util.c b/c/enc/utf8_util.c
index 04a7805..a334927 100644
--- a/c/enc/utf8_util.c
+++ b/c/enc/utf8_util.c
@@ -25,37 +25,37 @@ static size_t BrotliParseAsUTF8(
}
/* 2-byte UTF8 */
if (size > 1u &&
- (input[0] & 0xE0) == 0xC0 &&
- (input[1] & 0xC0) == 0x80) {
- *symbol = (((input[0] & 0x1F) << 6) |
- (input[1] & 0x3F));
- if (*symbol > 0x7F) {
+ (input[0] & 0xe0) == 0xc0 &&
+ (input[1] & 0xc0) == 0x80) {
+ *symbol = (((input[0] & 0x1f) << 6) |
+ (input[1] & 0x3f));
+ if (*symbol > 0x7f) {
return 2;
}
}
/* 3-byte UFT8 */
if (size > 2u &&
- (input[0] & 0xF0) == 0xE0 &&
- (input[1] & 0xC0) == 0x80 &&
- (input[2] & 0xC0) == 0x80) {
- *symbol = (((input[0] & 0x0F) << 12) |
- ((input[1] & 0x3F) << 6) |
- (input[2] & 0x3F));
- if (*symbol > 0x7FF) {
+ (input[0] & 0xf0) == 0xe0 &&
+ (input[1] & 0xc0) == 0x80 &&
+ (input[2] & 0xc0) == 0x80) {
+ *symbol = (((input[0] & 0x0f) << 12) |
+ ((input[1] & 0x3f) << 6) |
+ (input[2] & 0x3f));
+ if (*symbol > 0x7ff) {
return 3;
}
}
/* 4-byte UFT8 */
if (size > 3u &&
- (input[0] & 0xF8) == 0xF0 &&
- (input[1] & 0xC0) == 0x80 &&
- (input[2] & 0xC0) == 0x80 &&
- (input[3] & 0xC0) == 0x80) {
+ (input[0] & 0xf8) == 0xf0 &&
+ (input[1] & 0xc0) == 0x80 &&
+ (input[2] & 0xc0) == 0x80 &&
+ (input[3] & 0xc0) == 0x80) {
*symbol = (((input[0] & 0x07) << 18) |
- ((input[1] & 0x3F) << 12) |
- ((input[2] & 0x3F) << 6) |
- (input[3] & 0x3F));
- if (*symbol > 0xFFFF && *symbol <= 0x10FFFF) {
+ ((input[1] & 0x3f) << 12) |
+ ((input[2] & 0x3f) << 6) |
+ (input[3] & 0x3f));
+ if (*symbol > 0xffff && *symbol <= 0x10ffff) {
return 4;
}
}
diff --git a/c/enc/utf8_util.h b/c/enc/utf8_util.h
index 8fda80c..2ede131 100644
--- a/c/enc/utf8_util.h
+++ b/c/enc/utf8_util.h
@@ -9,8 +9,8 @@
#ifndef BROTLI_ENC_UTF8_UTIL_H_
#define BROTLI_ENC_UTF8_UTIL_H_
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
diff --git a/c/enc/write_bits.h b/c/enc/write_bits.h
index 36515a6..83fdddc 100644
--- a/c/enc/write_bits.h
+++ b/c/enc/write_bits.h
@@ -9,8 +9,11 @@
#ifndef BROTLI_ENC_WRITE_BITS_H_
#define BROTLI_ENC_WRITE_BITS_H_
-#include "../common/platform.h"
+#include <assert.h>
+#include <stdio.h> /* printf */
+
#include <brotli/types.h>
+#include "./port.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -35,27 +38,27 @@ extern "C" {
and locate the rest in BYTE+1, BYTE+2, etc. */
static BROTLI_INLINE void BrotliWriteBits(size_t n_bits,
uint64_t bits,
- size_t* BROTLI_RESTRICT pos,
- uint8_t* BROTLI_RESTRICT array) {
-#if defined(BROTLI_LITTLE_ENDIAN)
+ size_t * BROTLI_RESTRICT pos,
+ uint8_t * BROTLI_RESTRICT array) {
+#ifdef BROTLI_LITTLE_ENDIAN
/* This branch of the code can write up to 56 bits at a time,
7 bits are lost by being perhaps already in *p and at least
1 bit is needed to initialize the bit-stream ahead (i.e. if 7
bits are in *p and we write 57 bits, then the next write will
access a byte that was never initialized). */
- uint8_t* p = &array[*pos >> 3];
- uint64_t v = (uint64_t)(*p); /* Zero-extend 8 to 64 bits. */
- BROTLI_LOG(("WriteBits %2d 0x%08x%08x %10d\n", (int)n_bits,
- (uint32_t)(bits >> 32), (uint32_t)(bits & 0xFFFFFFFF),
- (int)*pos));
- BROTLI_DCHECK((bits >> n_bits) == 0);
- BROTLI_DCHECK(n_bits <= 56);
+ uint8_t *p = &array[*pos >> 3];
+ uint64_t v = *p;
+#ifdef BIT_WRITER_DEBUG
+ printf("WriteBits %2d 0x%016llx %10d\n", n_bits, bits, *pos);
+#endif
+ assert((bits >> n_bits) == 0);
+ assert(n_bits <= 56);
v |= bits << (*pos & 7);
BROTLI_UNALIGNED_STORE64LE(p, v); /* Set some bits. */
*pos += n_bits;
#else
- /* implicit & 0xFF is assumed for uint8_t arithmetics */
- uint8_t* array_pos = &array[*pos >> 3];
+ /* implicit & 0xff is assumed for uint8_t arithmetics */
+ uint8_t *array_pos = &array[*pos >> 3];
const size_t bits_reserved_in_first_byte = (*pos & 7);
size_t bits_left_to_write;
bits <<= bits_reserved_in_first_byte;
@@ -72,9 +75,11 @@ static BROTLI_INLINE void BrotliWriteBits(size_t n_bits,
}
static BROTLI_INLINE void BrotliWriteBitsPrepareStorage(
- size_t pos, uint8_t* array) {
- BROTLI_LOG(("WriteBitsPrepareStorage %10d\n", (int)pos));
- BROTLI_DCHECK((pos & 7) == 0);
+ size_t pos, uint8_t *array) {
+#ifdef BIT_WRITER_DEBUG
+ printf("WriteBitsPrepareStorage %10d\n", pos);
+#endif
+ assert((pos & 7) == 0);
array[pos >> 3] = 0;
}
diff --git a/c/fuzz/decode_fuzzer.c b/c/fuzz/decode_fuzzer.cc
index 46144e0..60c6f8e 100644
--- a/c/fuzz/decode_fuzzer.c
+++ b/c/fuzz/decode_fuzzer.cc
@@ -4,23 +4,18 @@
#include <stddef.h>
#include <stdint.h>
-#include <stdlib.h>
#include <brotli/decode.h>
// Entry point for LibFuzzer.
-int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
size_t addend = 0;
if (size > 0)
addend = data[size - 1] & 7;
const uint8_t* next_in = data;
const int kBufferSize = 1024;
- uint8_t* buffer = (uint8_t*) malloc(kBufferSize);
- if (!buffer) {
- // OOM is out-of-scope here.
- return 0;
- }
+ uint8_t* buffer = new uint8_t[kBufferSize];
/* The biggest "magic number" in brotli is 16MiB - 16, so no need to check
the cases with much longer output. */
const size_t total_out_limit = (addend == 0) ? (1 << 26) : (1 << 24);
@@ -53,6 +48,6 @@ int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
}
BrotliDecoderDestroyInstance(state);
- free(buffer);
+ delete[] buffer;
return 0;
}
diff --git a/c/fuzz/run_decode_fuzzer.c b/c/fuzz/run_decode_fuzzer.cc
index c84f98a..8fd4189 100644
--- a/c/fuzz/run_decode_fuzzer.c
+++ b/c/fuzz/run_decode_fuzzer.cc
@@ -11,7 +11,7 @@
#include <stdlib.h>
#include <stdint.h>
-void LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);
+extern "C" void LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);
int main(int argc, char* *argv) {
if (argc != 2) {
diff --git a/c/fuzz/test_fuzzer.sh b/c/fuzz/test_fuzzer.sh
index 9985194..8266fde 100755
--- a/c/fuzz/test_fuzzer.sh
+++ b/c/fuzz/test_fuzzer.sh
@@ -1,10 +1,6 @@
#!/usr/bin/env bash
-set -e
-export CC=${CC:-cc}
-
-BROTLI="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." && pwd )"
-SRC=$BROTLI/c
+BROTLI="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )"
cd $BROTLI
@@ -12,16 +8,16 @@ rm -rf bin
mkdir bin
cd bin
-cmake $BROTLI -DCMAKE_C_COMPILER="$CC" \
- -DBUILD_TESTING=OFF -DENABLE_SANITIZER=address
-make -j$(nproc) brotlidec-static
+cmake .. -B./ -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DENABLE_SANITIZER=address
+make clean
+make -j$(nproc) brotlidec
-${CC} -o run_decode_fuzzer -std=c99 -fsanitize=address -I$SRC/include \
- $SRC/fuzz/decode_fuzzer.c $SRC/fuzz/run_decode_fuzzer.c \
- ./libbrotlidec-static.a ./libbrotlicommon-static.a
+c++ -c -std=c++11 ../fuzz/decode_fuzzer.cc -I./include
+ar rvs decode_fuzzer.a decode_fuzzer.o
+c++ ../fuzz/run_decode_fuzzer.cc -o run_decode_fuzzer -lasan decode_fuzzer.a ./libbrotlidec.a ./libbrotlicommon.a
mkdir decode_corpora
-unzip $BROTLI/java/org/brotli/integration/fuzz_data.zip -d decode_corpora
+unzip ../java/org/brotli/integration/fuzz_data.zip -d decode_corpora
for f in `ls decode_corpora`
do
diff --git a/c/include/brotli/decode.h b/c/include/brotli/decode.h
index 0f5c8f9..d1d21c4 100644..100755
--- a/c/include/brotli/decode.h
+++ b/c/include/brotli/decode.h
@@ -34,11 +34,11 @@ typedef struct BrotliDecoderStateStruct BrotliDecoderState;
typedef enum {
/** Decoding error, e.g. corrupted input or memory allocation problem. */
BROTLI_DECODER_RESULT_ERROR = 0,
- /** Decoding successfully completed. */
+ /** Decoding successfully completed */
BROTLI_DECODER_RESULT_SUCCESS = 1,
- /** Partially done; should be called again with more input. */
+ /** Partially done; should be called again with more input */
BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT = 2,
- /** Partially done; should be called again with more output. */
+ /** Partially done; should be called again with more output */
BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT = 3
} BrotliDecoderResult;
@@ -83,10 +83,10 @@ typedef enum {
BROTLI_ERROR_CODE(_ERROR_FORMAT_, WINDOW_BITS, -13) SEPARATOR \
BROTLI_ERROR_CODE(_ERROR_FORMAT_, PADDING_1, -14) SEPARATOR \
BROTLI_ERROR_CODE(_ERROR_FORMAT_, PADDING_2, -15) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_FORMAT_, DISTANCE, -16) SEPARATOR \
\
- /* -17..-18 codes are reserved */ \
+ /* -16..-17 codes are reserved */ \
\
+ BROTLI_ERROR_CODE(_ERROR_, COMPOUND_DICTIONARY, -18) SEPARATOR \
BROTLI_ERROR_CODE(_ERROR_, DICTIONARY_NOT_SET, -19) SEPARATOR \
BROTLI_ERROR_CODE(_ERROR_, INVALID_ARGUMENTS, -20) SEPARATOR \
\
@@ -135,11 +135,7 @@ typedef enum BrotliDecoderParameter {
* Ring buffer is allocated according to window size, despite the real size of
* the content.
*/
- BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION = 0,
- /**
- * Flag that determines if "Large Window Brotli" is used.
- */
- BROTLI_DECODER_PARAM_LARGE_WINDOW = 1
+ BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION = 0
} BrotliDecoderParameter;
/**
@@ -163,11 +159,10 @@ BROTLI_DEC_API BROTLI_BOOL BrotliDecoderSetParameter(
*
* @p alloc_func and @p free_func @b MUST be both zero or both non-zero. In the
* case they are both zero, default memory allocators are used. @p opaque is
- * passed to @p alloc_func and @p free_func when they are called. @p free_func
- * has to return without doing anything when asked to free a NULL pointer.
+ * passed to @p alloc_func and @p free_func when they are called.
*
* @param alloc_func custom memory allocation function
- * @param free_func custom memory free function
+ * @param free_func custom memory fee function
* @param opaque custom memory manager handle
* @returns @c 0 if instance can not be allocated or initialized
* @returns pointer to initialized ::BrotliDecoderState otherwise
diff --git a/c/include/brotli/encode.h b/c/include/brotli/encode.h
index 0ced7e5..e4cf18b 100644..100755
--- a/c/include/brotli/encode.h
+++ b/c/include/brotli/encode.h
@@ -27,11 +27,6 @@ extern "C" {
* @note equal to @c BROTLI_MAX_DISTANCE_BITS constant.
*/
#define BROTLI_MAX_WINDOW_BITS 24
-/**
- * Maximal value for ::BROTLI_PARAM_LGWIN parameter
- * in "Large Window Brotli" (32-bit).
- */
-#define BROTLI_LARGE_MAX_WINDOW_BITS 30
/** Minimal value for ::BROTLI_PARAM_LGBLOCK parameter. */
#define BROTLI_MIN_INPUT_BLOCK_BITS 16
/** Maximal value for ::BROTLI_PARAM_LGBLOCK parameter. */
@@ -181,27 +176,7 @@ typedef enum BrotliEncoderParameter {
*
* The default value is 0, which means that the total input size is unknown.
*/
- BROTLI_PARAM_SIZE_HINT = 5,
- /**
- * Flag that determines if "Large Window Brotli" is used.
- */
- BROTLI_PARAM_LARGE_WINDOW = 6,
- /**
- * Recommended number of postfix bits (NPOSTFIX).
- *
- * Encoder may change this value.
- *
- * Range is from 0 to ::BROTLI_MAX_NPOSTFIX.
- */
- BROTLI_PARAM_NPOSTFIX = 7,
- /**
- * Recommended number of direct distance codes (NDIRECT).
- *
- * Encoder may change this value.
- *
- * Range is from 0 to (15 << NPOSTFIX) in steps of (1 << NPOSTFIX).
- */
- BROTLI_PARAM_NDIRECT = 8
+ BROTLI_PARAM_SIZE_HINT = 5
} BrotliEncoderParameter;
/**
@@ -234,11 +209,10 @@ BROTLI_ENC_API BROTLI_BOOL BrotliEncoderSetParameter(
*
* @p alloc_func and @p free_func @b MUST be both zero or both non-zero. In the
* case they are both zero, default memory allocators are used. @p opaque is
- * passed to @p alloc_func and @p free_func when they are called. @p free_func
- * has to return without doing anything when asked to free a NULL pointer.
+ * passed to @p alloc_func and @p free_func when they are called.
*
* @param alloc_func custom memory allocation function
- * @param free_func custom memory free function
+ * @param free_func custom memory fee function
* @param opaque custom memory manager handle
* @returns @c 0 if instance can not be allocated or initialized
* @returns pointer to initialized ::BrotliEncoderState otherwise
@@ -256,9 +230,10 @@ BROTLI_ENC_API void BrotliEncoderDestroyInstance(BrotliEncoderState* state);
/**
* Calculates the output size bound for the given @p input_size.
*
- * @warning Result is only valid if quality is at least @c 2 and, in
- * case ::BrotliEncoderCompressStream was used, no flushes
- * (::BROTLI_OPERATION_FLUSH) were performed.
+ * @warning Result is not applicable to ::BrotliEncoderCompressStream output,
+ * because every "flush" adds extra overhead bytes, and some encoder
+ * settings (e.g. quality @c 0 and @c 1) might imply a "soft flush"
+ * after every chunk of input.
*
* @param input_size size of projected input
* @returns @c 0 if result does not fit @c size_t
@@ -308,7 +283,7 @@ BROTLI_ENC_API BROTLI_BOOL BrotliEncoderCompress(
* that amount.
*
* @p total_out, if it is not a null-pointer, will be set to the number
- * of bytes compressed since the last @p state initialization.
+ * of bytes decompressed since the last @p state initialization.
*
*
*
diff --git a/c/include/brotli/port.h b/c/include/brotli/port.h
index 20dc231..16c31d4 100644..100755
--- a/c/include/brotli/port.h
+++ b/c/include/brotli/port.h
@@ -4,247 +4,90 @@
See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
*/
-/* Macros for compiler / platform specific API declarations. */
+/* Macros for compiler / platform specific features and build options. */
#ifndef BROTLI_COMMON_PORT_H_
#define BROTLI_COMMON_PORT_H_
-/* The following macros were borrowed from https://github.com/nemequ/hedley
- * with permission of original author - Evan Nemerson <evan@nemerson.com> */
-
-/* >>> >>> >>> hedley macros */
-
-#define BROTLI_MAKE_VERSION(major, minor, revision) \
- (((major) * 1000000) + ((minor) * 1000) + (revision))
-
-#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__)
-#define BROTLI_GNUC_VERSION \
- BROTLI_MAKE_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
-#elif defined(__GNUC__)
-#define BROTLI_GNUC_VERSION BROTLI_MAKE_VERSION(__GNUC__, __GNUC_MINOR__, 0)
+/* Compatibility with non-clang compilers. */
+#ifndef __has_builtin
+#define __has_builtin(x) 0
#endif
-#if defined(BROTLI_GNUC_VERSION)
-#define BROTLI_GNUC_VERSION_CHECK(major, minor, patch) \
- (BROTLI_GNUC_VERSION >= BROTLI_MAKE_VERSION(major, minor, patch))
-#else
-#define BROTLI_GNUC_VERSION_CHECK(major, minor, patch) (0)
+#ifndef __has_attribute
+#define __has_attribute(x) 0
#endif
-#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000)
-#define BROTLI_MSVC_VERSION \
- BROTLI_MAKE_VERSION((_MSC_FULL_VER / 10000000), \
- (_MSC_FULL_VER % 10000000) / 100000, \
- (_MSC_FULL_VER % 100000) / 100)
-#elif defined(_MSC_FULL_VER)
-#define BROTLI_MSVC_VERSION \
- BROTLI_MAKE_VERSION((_MSC_FULL_VER / 1000000), \
- (_MSC_FULL_VER % 1000000) / 10000, \
- (_MSC_FULL_VER % 10000) / 10)
-#elif defined(_MSC_VER)
-#define BROTLI_MSVC_VERSION \
- BROTLI_MAKE_VERSION(_MSC_VER / 100, _MSC_VER % 100, 0)
+#ifndef __has_feature
+#define __has_feature(x) 0
#endif
-#if !defined(_MSC_VER)
-#define BROTLI_MSVC_VERSION_CHECK(major, minor, patch) (0)
-#elif defined(_MSC_VER) && (_MSC_VER >= 1400)
-#define BROTLI_MSVC_VERSION_CHECK(major, minor, patch) \
- (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch)))
-#elif defined(_MSC_VER) && (_MSC_VER >= 1200)
-#define BROTLI_MSVC_VERSION_CHECK(major, minor, patch) \
- (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch)))
+#if defined(__GNUC__) && defined(__GNUC_MINOR__)
+#define BROTLI_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
#else
-#define BROTLI_MSVC_VERSION_CHECK(major, minor, patch) \
- (_MSC_VER >= ((major * 100) + (minor)))
+#define BROTLI_GCC_VERSION 0
#endif
-#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE)
-#define BROTLI_INTEL_VERSION \
- BROTLI_MAKE_VERSION(__INTEL_COMPILER / 100, \
- __INTEL_COMPILER % 100, \
- __INTEL_COMPILER_UPDATE)
-#elif defined(__INTEL_COMPILER)
-#define BROTLI_INTEL_VERSION \
- BROTLI_MAKE_VERSION(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0)
-#endif
-
-#if defined(BROTLI_INTEL_VERSION)
-#define BROTLI_INTEL_VERSION_CHECK(major, minor, patch) \
- (BROTLI_INTEL_VERSION >= BROTLI_MAKE_VERSION(major, minor, patch))
+#if defined(__ICC)
+#define BROTLI_ICC_VERSION __ICC
#else
-#define BROTLI_INTEL_VERSION_CHECK(major, minor, patch) (0)
-#endif
-
-#if defined(__PGI) && \
- defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__)
-#define BROTLI_PGI_VERSION \
- BROTLI_MAKE_VERSION(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__)
-#endif
-
-#if defined(BROTLI_PGI_VERSION)
-#define BROTLI_PGI_VERSION_CHECK(major, minor, patch) \
- (BROTLI_PGI_VERSION >= BROTLI_MAKE_VERSION(major, minor, patch))
-#else
-#define BROTLI_PGI_VERSION_CHECK(major, minor, patch) (0)
-#endif
-
-#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000)
-#define BROTLI_SUNPRO_VERSION \
- BROTLI_MAKE_VERSION( \
- (((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), \
- (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), \
- (__SUNPRO_C & 0xf) * 10)
-#elif defined(__SUNPRO_C)
-#define BROTLI_SUNPRO_VERSION \
- BROTLI_MAKE_VERSION((__SUNPRO_C >> 8) & 0xf, \
- (__SUNPRO_C >> 4) & 0xf, \
- (__SUNPRO_C) & 0xf)
-#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000)
-#define BROTLI_SUNPRO_VERSION \
- BROTLI_MAKE_VERSION( \
- (((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), \
- (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), \
- (__SUNPRO_CC & 0xf) * 10)
-#elif defined(__SUNPRO_CC)
-#define BROTLI_SUNPRO_VERSION \
- BROTLI_MAKE_VERSION((__SUNPRO_CC >> 8) & 0xf, \
- (__SUNPRO_CC >> 4) & 0xf, \
- (__SUNPRO_CC) & 0xf)
+#define BROTLI_ICC_VERSION 0
#endif
-#if defined(BROTLI_SUNPRO_VERSION)
-#define BROTLI_SUNPRO_VERSION_CHECK(major, minor, patch) \
- (BROTLI_SUNPRO_VERSION >= BROTLI_MAKE_VERSION(major, minor, patch))
+#if defined(BROTLI_BUILD_MODERN_COMPILER)
+#define BROTLI_MODERN_COMPILER 1
+#elif BROTLI_GCC_VERSION >= 304 || BROTLI_ICC_VERSION >= 1600
+#define BROTLI_MODERN_COMPILER 1
#else
-#define BROTLI_SUNPRO_VERSION_CHECK(major, minor, patch) (0)
+#define BROTLI_MODERN_COMPILER 0
#endif
-#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION)
-#define BROTLI_ARM_VERSION \
- BROTLI_MAKE_VERSION((__ARMCOMPILER_VERSION / 1000000), \
- (__ARMCOMPILER_VERSION % 1000000) / 10000, \
- (__ARMCOMPILER_VERSION % 10000) / 100)
-#elif defined(__CC_ARM) && defined(__ARMCC_VERSION)
-#define BROTLI_ARM_VERSION \
- BROTLI_MAKE_VERSION((__ARMCC_VERSION / 1000000), \
- (__ARMCC_VERSION % 1000000) / 10000, \
- (__ARMCC_VERSION % 10000) / 100)
-#endif
+/* Define "BROTLI_PREDICT_TRUE" and "BROTLI_PREDICT_FALSE" macros for capable
+ compilers.
-#if defined(BROTLI_ARM_VERSION)
-#define BROTLI_ARM_VERSION_CHECK(major, minor, patch) \
- (BROTLI_ARM_VERSION >= BROTLI_MAKE_VERSION(major, minor, patch))
-#else
-#define BROTLI_ARM_VERSION_CHECK(major, minor, patch) (0)
-#endif
+To apply compiler hint, enclose the branching condition into macros, like this:
-#if defined(__ibmxl__)
-#define BROTLI_IBM_VERSION \
- BROTLI_MAKE_VERSION(__ibmxl_version__, \
- __ibmxl_release__, \
- __ibmxl_modification__)
-#elif defined(__xlC__) && defined(__xlC_ver__)
-#define BROTLI_IBM_VERSION \
- BROTLI_MAKE_VERSION(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff)
-#elif defined(__xlC__)
-#define BROTLI_IBM_VERSION BROTLI_MAKE_VERSION(__xlC__ >> 8, __xlC__ & 0xff, 0)
-#endif
+ if (BROTLI_PREDICT_TRUE(zero == 0)) {
+ // main execution path
+ } else {
+ // compiler should place this code outside of main execution path
+ }
-#if defined(BROTLI_IBM_VERSION)
-#define BROTLI_IBM_VERSION_CHECK(major, minor, patch) \
- (BROTLI_IBM_VERSION >= BROTLI_MAKE_VERSION(major, minor, patch))
-#else
-#define BROTLI_IBM_VERSION_CHECK(major, minor, patch) (0)
-#endif
+OR:
-#if defined(__TI_COMPILER_VERSION__)
-#define BROTLI_TI_VERSION \
- BROTLI_MAKE_VERSION((__TI_COMPILER_VERSION__ / 1000000), \
- (__TI_COMPILER_VERSION__ % 1000000) / 1000, \
- (__TI_COMPILER_VERSION__ % 1000))
-#endif
+ if (BROTLI_PREDICT_FALSE(something_rare_or_unexpected_happens)) {
+ // compiler should place this code outside of main execution path
+ }
-#if defined(BROTLI_TI_VERSION)
-#define BROTLI_TI_VERSION_CHECK(major, minor, patch) \
- (BROTLI_TI_VERSION >= BROTLI_MAKE_VERSION(major, minor, patch))
-#else
-#define BROTLI_TI_VERSION_CHECK(major, minor, patch) (0)
-#endif
-
-#if defined(__IAR_SYSTEMS_ICC__)
-#if __VER__ > 1000
-#define BROTLI_IAR_VERSION \
- BROTLI_MAKE_VERSION((__VER__ / 1000000), \
- (__VER__ / 1000) % 1000, \
- (__VER__ % 1000))
-#else
-#define BROTLI_IAR_VERSION BROTLI_MAKE_VERSION(VER / 100, __VER__ % 100, 0)
-#endif
-#endif
-
-#if defined(BROTLI_IAR_VERSION)
-#define BROTLI_IAR_VERSION_CHECK(major, minor, patch) \
- (BROTLI_IAR_VERSION >= BROTLI_MAKE_VERSION(major, minor, patch))
-#else
-#define BROTLI_IAR_VERSION_CHECK(major, minor, patch) (0)
-#endif
-
-#if defined(__TINYC__)
-#define BROTLI_TINYC_VERSION \
- BROTLI_MAKE_VERSION(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100)
-#endif
-
-#if defined(BROTLI_TINYC_VERSION)
-#define BROTLI_TINYC_VERSION_CHECK(major, minor, patch) \
- (BROTLI_TINYC_VERSION >= BROTLI_MAKE_VERSION(major, minor, patch))
-#else
-#define BROTLI_TINYC_VERSION_CHECK(major, minor, patch) (0)
-#endif
-
-#if defined(__has_attribute)
-#define BROTLI_GNUC_HAS_ATTRIBUTE(attribute, major, minor, patch) \
- __has_attribute(attribute)
+*/
+#if BROTLI_MODERN_COMPILER || __has_builtin(__builtin_expect)
+#define BROTLI_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1))
+#define BROTLI_PREDICT_FALSE(x) (__builtin_expect(x, 0))
#else
-#define BROTLI_GNUC_HAS_ATTRIBUTE(attribute, major, minor, patch) \
- BROTLI_GNUC_VERSION_CHECK(major, minor, patch)
+#define BROTLI_PREDICT_FALSE(x) (x)
+#define BROTLI_PREDICT_TRUE(x) (x)
#endif
-#if defined(__has_builtin)
-#define BROTLI_GNUC_HAS_BUILTIN(builtin, major, minor, patch) \
- __has_builtin(builtin)
+#if BROTLI_MODERN_COMPILER || __has_attribute(always_inline)
+#define BROTLI_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((always_inline))
#else
-#define BROTLI_GNUC_HAS_BUILTIN(builtin, major, minor, patch) \
- BROTLI_GNUC_VERSION_CHECK(major, minor, patch)
+#define BROTLI_ATTRIBUTE_ALWAYS_INLINE
#endif
#if defined(_WIN32) || defined(__CYGWIN__)
-#define BROTLI_PUBLIC
-#elif BROTLI_GNUC_VERSION_CHECK(3, 3, 0) || \
- BROTLI_TI_VERSION_CHECK(8, 0, 0) || \
- BROTLI_INTEL_VERSION_CHECK(16, 0, 0) || \
- BROTLI_ARM_VERSION_CHECK(4, 1, 0) || \
- BROTLI_IBM_VERSION_CHECK(13, 1, 0) || \
- BROTLI_SUNPRO_VERSION_CHECK(5, 11, 0) || \
- (BROTLI_TI_VERSION_CHECK(7, 3, 0) && \
- defined(__TI_GNU_ATTRIBUTE_SUPPORT__) && defined(__TI_EABI__))
-#define BROTLI_PUBLIC __attribute__ ((visibility ("default")))
+#define BROTLI_ATTRIBUTE_VISIBILITY_HIDDEN
+#elif BROTLI_MODERN_COMPILER || __has_attribute(visibility)
+#define BROTLI_ATTRIBUTE_VISIBILITY_HIDDEN \
+ __attribute__ ((visibility ("hidden")))
#else
-#define BROTLI_PUBLIC
+#define BROTLI_ATTRIBUTE_VISIBILITY_HIDDEN
#endif
-#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
- !defined(__STDC_NO_VLA__) && !defined(__cplusplus) && \
- !defined(__PGI) && !defined(__PGIC__) && !defined(__TINYC__)
-#define BROTLI_ARRAY_PARAM(name) (name)
-#else
-#define BROTLI_ARRAY_PARAM(name)
+#ifndef BROTLI_INTERNAL
+#define BROTLI_INTERNAL BROTLI_ATTRIBUTE_VISIBILITY_HIDDEN
#endif
-/* <<< <<< <<< end of hedley macros. */
-
-#if defined(BROTLI_SHARED_COMPILATION)
-#if defined(_WIN32)
+#if defined(BROTLI_SHARED_COMPILATION) && defined(_WIN32)
#if defined(BROTLICOMMON_SHARED_COMPILATION)
#define BROTLI_COMMON_API __declspec(dllexport)
#else
@@ -260,15 +103,44 @@
#else
#define BROTLI_ENC_API __declspec(dllimport)
#endif /* BROTLIENC_SHARED_COMPILATION */
-#else /* _WIN32 */
-#define BROTLI_COMMON_API BROTLI_PUBLIC
-#define BROTLI_DEC_API BROTLI_PUBLIC
-#define BROTLI_ENC_API BROTLI_PUBLIC
-#endif /* _WIN32 */
-#else /* BROTLI_SHARED_COMPILATION */
+#else /* BROTLI_SHARED_COMPILATION && _WIN32 */
#define BROTLI_COMMON_API
#define BROTLI_DEC_API
#define BROTLI_ENC_API
#endif
+#ifndef _MSC_VER
+#if defined(__cplusplus) || !defined(__STRICT_ANSI__) || \
+ (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L)
+#define BROTLI_INLINE inline BROTLI_ATTRIBUTE_ALWAYS_INLINE
+#else
+#define BROTLI_INLINE
+#endif
+#else /* _MSC_VER */
+#define BROTLI_INLINE __forceinline
+#endif /* _MSC_VER */
+
+#if !defined(__cplusplus) && !defined(c_plusplus) && \
+ (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L)
+#define BROTLI_RESTRICT restrict
+#elif BROTLI_GCC_VERSION > 295 || defined(__llvm__)
+#define BROTLI_RESTRICT __restrict
+#else
+#define BROTLI_RESTRICT
+#endif
+
+#if BROTLI_MODERN_COMPILER || __has_attribute(noinline)
+#define BROTLI_NOINLINE __attribute__((noinline))
+#else
+#define BROTLI_NOINLINE
+#endif
+
+#if BROTLI_MODERN_COMPILER || __has_attribute(deprecated)
+#define BROTLI_DEPRECATED __attribute__((deprecated))
+#else
+#define BROTLI_DEPRECATED
+#endif
+
+#define BROTLI_UNUSED(X) (void)(X)
+
#endif /* BROTLI_COMMON_PORT_H_ */
diff --git a/c/include/brotli/types.h b/c/include/brotli/types.h
index eff1a3c..fcb2710 100644..100755
--- a/c/include/brotli/types.h
+++ b/c/include/brotli/types.h
@@ -80,4 +80,11 @@ typedef void* (*brotli_alloc_func)(void* opaque, size_t size);
*/
typedef void (*brotli_free_func)(void* opaque, void* address);
+#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
+ !defined(__cplusplus) && !defined(__PGI)
+#define BROTLI_ARRAY_PARAM(L) L
+#else
+#define BROTLI_ARRAY_PARAM(L)
+#endif
+
#endif /* BROTLI_COMMON_TYPES_H_ */
diff --git a/c/tools/brotli.c b/c/tools/brotli.c
index ea4fdac..497ae65 100644..100755
--- a/c/tools/brotli.c
+++ b/c/tools/brotli.c
@@ -78,7 +78,7 @@ typedef enum {
COMMAND_VERSION
} Command;
-#define DEFAULT_LGWIN 24
+#define DEFAULT_LGWIN 22
#define DEFAULT_SUFFIX ".br"
#define MAX_OPTIONS 20
@@ -93,7 +93,6 @@ typedef struct {
BROTLI_BOOL write_to_stdout;
BROTLI_BOOL test_integrity;
BROTLI_BOOL decompress;
- BROTLI_BOOL large_window;
const char* output_path;
const char* suffix;
int not_input_indices[MAX_OPTIONS];
@@ -112,15 +111,8 @@ typedef struct {
uint8_t* output;
const char* current_input_path;
const char* current_output_path;
- int64_t input_file_length; /* -1, if impossible to calculate */
FILE* fin;
FILE* fout;
-
- /* I/O buffers */
- size_t available_in;
- const uint8_t* next_in;
- size_t available_out;
- uint8_t* next_out;
} Context;
/* Parse up to 5 decimal digits. */
@@ -193,10 +185,9 @@ static Command ParseParams(Context* params) {
/* Too many options. The expected longest option list is:
"-q 0 -w 10 -o f -D d -S b -d -f -k -n -v --", i.e. 16 items in total.
- This check is an additional guard that is never triggered, but provides
- a guard for future changes. */
+ This check is an additinal guard that is never triggered, but provides an
+ additional guard for future changes. */
if (next_option_index > (MAX_OPTIONS - 2)) {
- fprintf(stderr, "too many options passed\n");
return COMMAND_INVALID;
}
@@ -222,135 +213,80 @@ static Command ParseParams(Context* params) {
for (j = 1; j < arg_len; ++j) {
char c = arg[j];
if (c >= '0' && c <= '9') {
- if (quality_set) {
- fprintf(stderr, "quality already set\n");
- return COMMAND_INVALID;
- }
+ if (quality_set) return COMMAND_INVALID;
quality_set = BROTLI_TRUE;
params->quality = c - '0';
continue;
} else if (c == 'c') {
- if (output_set) {
- fprintf(stderr, "write to standard output already set\n");
- return COMMAND_INVALID;
- }
+ if (output_set) return COMMAND_INVALID;
output_set = BROTLI_TRUE;
params->write_to_stdout = BROTLI_TRUE;
continue;
} else if (c == 'd') {
- if (command_set) {
- fprintf(stderr, "command already set when parsing -d\n");
- return COMMAND_INVALID;
- }
+ if (command_set) return COMMAND_INVALID;
command_set = BROTLI_TRUE;
command = COMMAND_DECOMPRESS;
continue;
} else if (c == 'f') {
- if (params->force_overwrite) {
- fprintf(stderr, "force output overwrite already set\n");
- return COMMAND_INVALID;
- }
+ if (params->force_overwrite) return COMMAND_INVALID;
params->force_overwrite = BROTLI_TRUE;
continue;
} else if (c == 'h') {
/* Don't parse further. */
return COMMAND_HELP;
} else if (c == 'j' || c == 'k') {
- if (keep_set) {
- fprintf(stderr, "argument --rm / -j or --keep / -n already set\n");
- return COMMAND_INVALID;
- }
+ if (keep_set) return COMMAND_INVALID;
keep_set = BROTLI_TRUE;
params->junk_source = TO_BROTLI_BOOL(c == 'j');
continue;
} else if (c == 'n') {
- if (!params->copy_stat) {
- fprintf(stderr, "argument --no-copy-stat / -n already set\n");
- return COMMAND_INVALID;
- }
+ if (!params->copy_stat) return COMMAND_INVALID;
params->copy_stat = BROTLI_FALSE;
continue;
} else if (c == 't') {
- if (command_set) {
- fprintf(stderr, "command already set when parsing -t\n");
- return COMMAND_INVALID;
- }
+ if (command_set) return COMMAND_INVALID;
command_set = BROTLI_TRUE;
command = COMMAND_TEST_INTEGRITY;
continue;
} else if (c == 'v') {
- if (params->verbose) {
- fprintf(stderr, "argument --verbose / -v already set\n");
- return COMMAND_INVALID;
- }
+ if (params->verbose) return COMMAND_INVALID;
params->verbose = BROTLI_TRUE;
continue;
} else if (c == 'V') {
/* Don't parse further. */
return COMMAND_VERSION;
} else if (c == 'Z') {
- if (quality_set) {
- fprintf(stderr, "quality already set\n");
- return COMMAND_INVALID;
- }
+ if (quality_set) return COMMAND_INVALID;
quality_set = BROTLI_TRUE;
params->quality = 11;
continue;
}
/* o/q/w/D/S with parameter is expected */
if (c != 'o' && c != 'q' && c != 'w' && c != 'D' && c != 'S') {
- fprintf(stderr, "invalid argument -%c\n", c);
- return COMMAND_INVALID;
- }
- if (j + 1 != arg_len) {
- fprintf(stderr, "expected parameter for argument -%c\n", c);
return COMMAND_INVALID;
}
+ if (j + 1 != arg_len) return COMMAND_INVALID;
i++;
- if (i == argc || !argv[i] || argv[i][0] == 0) {
- fprintf(stderr, "expected parameter for argument -%c\n", c);
- return COMMAND_INVALID;
- }
+ if (i == argc || !argv[i] || argv[i][0] == 0) return COMMAND_INVALID;
params->not_input_indices[next_option_index++] = i;
if (c == 'o') {
- if (output_set) {
- fprintf(stderr, "write to standard output already set (-o)\n");
- return COMMAND_INVALID;
- }
+ if (output_set) return COMMAND_INVALID;
params->output_path = argv[i];
} else if (c == 'q') {
- if (quality_set) {
- fprintf(stderr, "quality already set\n");
- return COMMAND_INVALID;
- }
+ if (quality_set) return COMMAND_INVALID;
quality_set = ParseInt(argv[i], BROTLI_MIN_QUALITY,
BROTLI_MAX_QUALITY, &params->quality);
- if (!quality_set) {
- fprintf(stderr, "error parsing quality value [%s]\n", argv[i]);
- return COMMAND_INVALID;
- }
+ if (!quality_set) return COMMAND_INVALID;
} else if (c == 'w') {
- if (lgwin_set) {
- fprintf(stderr, "lgwin parameter already set\n");
- return COMMAND_INVALID;
- }
+ if (lgwin_set) return COMMAND_INVALID;
lgwin_set = ParseInt(argv[i], 0,
BROTLI_MAX_WINDOW_BITS, &params->lgwin);
- if (!lgwin_set) {
- fprintf(stderr, "error parsing lgwin value [%s]\n", argv[i]);
- return COMMAND_INVALID;
- }
+ if (!lgwin_set) return COMMAND_INVALID;
if (params->lgwin != 0 && params->lgwin < BROTLI_MIN_WINDOW_BITS) {
- fprintf(stderr,
- "lgwin parameter (%d) smaller than the minimum (%d)\n",
- params->lgwin, BROTLI_MIN_WINDOW_BITS);
return COMMAND_INVALID;
}
} else if (c == 'S') {
- if (suffix_set) {
- fprintf(stderr, "suffix already set\n");
- return COMMAND_INVALID;
- }
+ if (suffix_set) return COMMAND_INVALID;
suffix_set = BROTLI_TRUE;
params->suffix = argv[i];
}
@@ -358,67 +294,40 @@ static Command ParseParams(Context* params) {
} else { /* Double-dash. */
arg = &arg[2];
if (strcmp("best", arg) == 0) {
- if (quality_set) {
- fprintf(stderr, "quality already set\n");
- return COMMAND_INVALID;
- }
+ if (quality_set) return COMMAND_INVALID;
quality_set = BROTLI_TRUE;
params->quality = 11;
} else if (strcmp("decompress", arg) == 0) {
- if (command_set) {
- fprintf(stderr, "command already set when parsing --decompress\n");
- return COMMAND_INVALID;
- }
+ if (command_set) return COMMAND_INVALID;
command_set = BROTLI_TRUE;
command = COMMAND_DECOMPRESS;
} else if (strcmp("force", arg) == 0) {
- if (params->force_overwrite) {
- fprintf(stderr, "force output overwrite already set\n");
- return COMMAND_INVALID;
- }
+ if (params->force_overwrite) return COMMAND_INVALID;
params->force_overwrite = BROTLI_TRUE;
} else if (strcmp("help", arg) == 0) {
/* Don't parse further. */
return COMMAND_HELP;
} else if (strcmp("keep", arg) == 0) {
- if (keep_set) {
- fprintf(stderr, "argument --rm / -j or --keep / -n already set\n");
- return COMMAND_INVALID;
- }
+ if (keep_set) return COMMAND_INVALID;
keep_set = BROTLI_TRUE;
params->junk_source = BROTLI_FALSE;
} else if (strcmp("no-copy-stat", arg) == 0) {
- if (!params->copy_stat) {
- fprintf(stderr, "argument --no-copy-stat / -n already set\n");
- return COMMAND_INVALID;
- }
+ if (!params->copy_stat) return COMMAND_INVALID;
params->copy_stat = BROTLI_FALSE;
} else if (strcmp("rm", arg) == 0) {
- if (keep_set) {
- fprintf(stderr, "argument --rm / -j or --keep / -n already set\n");
- return COMMAND_INVALID;
- }
+ if (keep_set) return COMMAND_INVALID;
keep_set = BROTLI_TRUE;
params->junk_source = BROTLI_TRUE;
} else if (strcmp("stdout", arg) == 0) {
- if (output_set) {
- fprintf(stderr, "write to standard output already set\n");
- return COMMAND_INVALID;
- }
+ if (output_set) return COMMAND_INVALID;
output_set = BROTLI_TRUE;
params->write_to_stdout = BROTLI_TRUE;
} else if (strcmp("test", arg) == 0) {
- if (command_set) {
- fprintf(stderr, "command already set when parsing --test\n");
- return COMMAND_INVALID;
- }
+ if (command_set) return COMMAND_INVALID;
command_set = BROTLI_TRUE;
command = COMMAND_TEST_INTEGRITY;
} else if (strcmp("verbose", arg) == 0) {
- if (params->verbose) {
- fprintf(stderr, "argument --verbose / -v already set\n");
- return COMMAND_INVALID;
- }
+ if (params->verbose) return COMMAND_INVALID;
params->verbose = BROTLI_TRUE;
} else if (strcmp("version", arg) == 0) {
/* Don't parse further. */
@@ -427,74 +336,30 @@ static Command ParseParams(Context* params) {
/* key=value */
const char* value = strrchr(arg, '=');
size_t key_len;
- if (!value || value[1] == 0) {
- fprintf(stderr, "must pass the parameter as --%s=value\n", arg);
- return COMMAND_INVALID;
- }
+ if (!value || value[1] == 0) return COMMAND_INVALID;
key_len = (size_t)(value - arg);
value++;
if (strncmp("lgwin", arg, key_len) == 0) {
- if (lgwin_set) {
- fprintf(stderr, "lgwin parameter already set\n");
- return COMMAND_INVALID;
- }
+ if (lgwin_set) return COMMAND_INVALID;
lgwin_set = ParseInt(value, 0,
BROTLI_MAX_WINDOW_BITS, &params->lgwin);
- if (!lgwin_set) {
- fprintf(stderr, "error parsing lgwin value [%s]\n", value);
- return COMMAND_INVALID;
- }
- if (params->lgwin != 0 && params->lgwin < BROTLI_MIN_WINDOW_BITS) {
- fprintf(stderr,
- "lgwin parameter (%d) smaller than the minimum (%d)\n",
- params->lgwin, BROTLI_MIN_WINDOW_BITS);
- return COMMAND_INVALID;
- }
- } else if (strncmp("large_window", arg, key_len) == 0) {
- /* This option is intentionally not mentioned in help. */
- if (lgwin_set) {
- fprintf(stderr, "lgwin parameter already set\n");
- return COMMAND_INVALID;
- }
- lgwin_set = ParseInt(value, 0,
- BROTLI_LARGE_MAX_WINDOW_BITS, &params->lgwin);
- if (!lgwin_set) {
- fprintf(stderr, "error parsing lgwin value [%s]\n", value);
- return COMMAND_INVALID;
- }
+ if (!lgwin_set) return COMMAND_INVALID;
if (params->lgwin != 0 && params->lgwin < BROTLI_MIN_WINDOW_BITS) {
- fprintf(stderr,
- "lgwin parameter (%d) smaller than the minimum (%d)\n",
- params->lgwin, BROTLI_MIN_WINDOW_BITS);
return COMMAND_INVALID;
}
} else if (strncmp("output", arg, key_len) == 0) {
- if (output_set) {
- fprintf(stderr,
- "write to standard output already set (--output)\n");
- return COMMAND_INVALID;
- }
+ if (output_set) return COMMAND_INVALID;
params->output_path = value;
} else if (strncmp("quality", arg, key_len) == 0) {
- if (quality_set) {
- fprintf(stderr, "quality already set\n");
- return COMMAND_INVALID;
- }
+ if (quality_set) return COMMAND_INVALID;
quality_set = ParseInt(value, BROTLI_MIN_QUALITY,
BROTLI_MAX_QUALITY, &params->quality);
- if (!quality_set) {
- fprintf(stderr, "error parsing quality value [%s]\n", value);
- return COMMAND_INVALID;
- }
+ if (!quality_set) return COMMAND_INVALID;
} else if (strncmp("suffix", arg, key_len) == 0) {
- if (suffix_set) {
- fprintf(stderr, "suffix already set\n");
- return COMMAND_INVALID;
- }
+ if (suffix_set) return COMMAND_INVALID;
suffix_set = BROTLI_TRUE;
params->suffix = value;
} else {
- fprintf(stderr, "invalid parameter: [%s]\n", arg);
return COMMAND_INVALID;
}
}
@@ -525,40 +390,39 @@ static void PrintVersion(void) {
fprintf(stdout, "brotli %d.%d.%d\n", major, minor, patch);
}
-static void PrintHelp(const char* name, BROTLI_BOOL error) {
- FILE* media = error ? stderr : stdout;
+static void PrintHelp(const char* name) {
/* String is cut to pieces with length less than 509, to conform C90 spec. */
- fprintf(media,
+ fprintf(stdout,
"Usage: %s [OPTION]... [FILE]...\n",
name);
- fprintf(media,
+ fprintf(stdout,
"Options:\n"
" -# compression level (0-9)\n"
" -c, --stdout write on standard output\n"
" -d, --decompress decompress\n"
" -f, --force force output file overwrite\n"
" -h, --help display this help and exit\n");
- fprintf(media,
+ fprintf(stdout,
" -j, --rm remove source file(s)\n"
" -k, --keep keep source file(s) (default)\n"
" -n, --no-copy-stat do not copy source file(s) attributes\n"
" -o FILE, --output=FILE output file (only if 1 input file)\n");
- fprintf(media,
+ fprintf(stdout,
" -q NUM, --quality=NUM compression level (%d-%d)\n",
BROTLI_MIN_QUALITY, BROTLI_MAX_QUALITY);
- fprintf(media,
+ fprintf(stdout,
" -t, --test test compressed file integrity\n"
" -v, --verbose verbose mode\n");
- fprintf(media,
-" -w NUM, --lgwin=NUM set LZ77 window size (0, %d-%d)\n",
- BROTLI_MIN_WINDOW_BITS, BROTLI_MAX_WINDOW_BITS);
- fprintf(media,
+ fprintf(stdout,
+" -w NUM, --lgwin=NUM set LZ77 window size (0, %d-%d) (default:%d)\n",
+ BROTLI_MIN_WINDOW_BITS, BROTLI_MAX_WINDOW_BITS, DEFAULT_LGWIN);
+ fprintf(stdout,
" window size = 2**NUM - 16\n"
" 0 lets compressor choose the optimal value\n");
- fprintf(media,
+ fprintf(stdout,
" -S SUF, --suffix=SUF output file suffix (default:'%s')\n",
DEFAULT_SUFFIX);
- fprintf(media,
+ fprintf(stdout,
" -V, --version display version and exit\n"
" -Z, --best use best compression level (11) (default)\n"
"Simple options could be coalesced, i.e. '-9kf' is equivalent to '-9 -k -f'.\n"
@@ -609,23 +473,6 @@ static BROTLI_BOOL OpenOutputFile(const char* output_path, FILE** f,
return BROTLI_TRUE;
}
-static int64_t FileSize(const char* path) {
- FILE* f = fopen(path, "rb");
- int64_t retval;
- if (f == NULL) {
- return -1;
- }
- if (fseek(f, 0L, SEEK_END) != 0) {
- fclose(f);
- return -1;
- }
- retval = ftell(f);
- if (fclose(f) != 0) {
- return -1;
- }
- return retval;
-}
-
/* Copy file times and permissions.
TODO: this is a "best effort" implementation; honest cross-platform
fully featured implementation is way too hacky; add more hacks by request. */
@@ -666,8 +513,6 @@ static BROTLI_BOOL NextFile(Context* context) {
/* Iterator points to last used arg; increment to search for the next one. */
context->iterator++;
- context->input_file_length = -1;
-
/* No input path; read from console. */
if (context->input_count == 0) {
if (context->iterator > 1) return BROTLI_FALSE;
@@ -697,7 +542,6 @@ static BROTLI_BOOL NextFile(Context* context) {
}
context->current_input_path = arg;
- context->input_file_length = FileSize(arg);
context->current_output_path = context->output_path;
if (context->output_path) return BROTLI_TRUE;
@@ -780,75 +624,46 @@ static BROTLI_BOOL CloseFiles(Context* context, BROTLI_BOOL success) {
return is_ok;
}
-static const size_t kFileBufferSize = 1 << 19;
-
-static void InitializeBuffers(Context* context) {
- context->available_in = 0;
- context->next_in = NULL;
- context->available_out = kFileBufferSize;
- context->next_out = context->output;
-}
-
-static BROTLI_BOOL HasMoreInput(Context* context) {
- return feof(context->fin) ? BROTLI_FALSE : BROTLI_TRUE;
-}
-
-static BROTLI_BOOL ProvideInput(Context* context) {
- context->available_in =
- fread(context->input, 1, kFileBufferSize, context->fin);
- context->next_in = context->input;
- if (ferror(context->fin)) {
- fprintf(stderr, "failed to read input [%s]: %s\n",
- PrintablePath(context->current_input_path), strerror(errno));
- return BROTLI_FALSE;
- }
- return BROTLI_TRUE;
-}
-
-/* Internal: should be used only in Provide-/Flush-Output. */
-static BROTLI_BOOL WriteOutput(Context* context) {
- size_t out_size = (size_t)(context->next_out - context->output);
- if (out_size == 0) return BROTLI_TRUE;
- if (context->test_integrity) return BROTLI_TRUE;
-
- fwrite(context->output, 1, out_size, context->fout);
- if (ferror(context->fout)) {
- fprintf(stderr, "failed to write output [%s]: %s\n",
- PrintablePath(context->current_output_path), strerror(errno));
- return BROTLI_FALSE;
- }
- return BROTLI_TRUE;
-}
-
-static BROTLI_BOOL ProvideOutput(Context* context) {
- if (!WriteOutput(context)) return BROTLI_FALSE;
- context->available_out = kFileBufferSize;
- context->next_out = context->output;
- return BROTLI_TRUE;
-}
-
-static BROTLI_BOOL FlushOutput(Context* context) {
- if (!WriteOutput(context)) return BROTLI_FALSE;
- context->available_out = 0;
- return BROTLI_TRUE;
-}
+static const size_t kFileBufferSize = 1 << 16;
static BROTLI_BOOL DecompressFile(Context* context, BrotliDecoderState* s) {
+ size_t available_in = 0;
+ const uint8_t* next_in = NULL;
+ size_t available_out = kFileBufferSize;
+ uint8_t* next_out = context->output;
BrotliDecoderResult result = BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT;
- InitializeBuffers(context);
for (;;) {
+ if (next_out != context->output) {
+ if (!context->test_integrity) {
+ size_t out_size = (size_t)(next_out - context->output);
+ fwrite(context->output, 1, out_size, context->fout);
+ if (ferror(context->fout)) {
+ fprintf(stderr, "failed to write output [%s]: %s\n",
+ PrintablePath(context->current_output_path), strerror(errno));
+ return BROTLI_FALSE;
+ }
+ }
+ available_out = kFileBufferSize;
+ next_out = context->output;
+ }
+
if (result == BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT) {
- if (!HasMoreInput(context)) {
+ if (feof(context->fin)) {
fprintf(stderr, "corrupt input [%s]\n",
PrintablePath(context->current_input_path));
return BROTLI_FALSE;
}
- if (!ProvideInput(context)) return BROTLI_FALSE;
+ available_in = fread(context->input, 1, kFileBufferSize, context->fin);
+ next_in = context->input;
+ if (ferror(context->fin)) {
+ fprintf(stderr, "failed to read input [%s]: %s\n",
+ PrintablePath(context->current_input_path), strerror(errno));
+ return BROTLI_FALSE;
+ }
} else if (result == BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT) {
- if (!ProvideOutput(context)) return BROTLI_FALSE;
+ /* Nothing to do - output is already written. */
} else if (result == BROTLI_DECODER_RESULT_SUCCESS) {
- if (!FlushOutput(context)) return BROTLI_FALSE;
- if (context->available_in != 0 || HasMoreInput(context)) {
+ if (available_in != 0 || !feof(context->fin)) {
fprintf(stderr, "corrupt input [%s]\n",
PrintablePath(context->current_input_path));
return BROTLI_FALSE;
@@ -860,8 +675,8 @@ static BROTLI_BOOL DecompressFile(Context* context, BrotliDecoderState* s) {
return BROTLI_FALSE;
}
- result = BrotliDecoderDecompressStream(s, &context->available_in,
- &context->next_in, &context->available_out, &context->next_out, 0);
+ result = BrotliDecoderDecompressStream(
+ s, &available_in, &next_in, &available_out, &next_out, 0);
}
}
@@ -873,10 +688,6 @@ static BROTLI_BOOL DecompressFiles(Context* context) {
fprintf(stderr, "out of memory\n");
return BROTLI_FALSE;
}
- /* This allows decoding "large-window" streams. Though it creates
- fragmentation (new builds decode streams that old builds don't),
- it is better from used experience perspective. */
- BrotliDecoderSetParameter(s, BROTLI_DECODER_PARAM_LARGE_WINDOW, 1u);
is_ok = OpenFiles(context);
if (is_ok && !context->current_input_path &&
!context->force_overwrite && isatty(STDIN_FILENO)) {
@@ -892,31 +703,46 @@ static BROTLI_BOOL DecompressFiles(Context* context) {
}
static BROTLI_BOOL CompressFile(Context* context, BrotliEncoderState* s) {
+ size_t available_in = 0;
+ const uint8_t* next_in = NULL;
+ size_t available_out = kFileBufferSize;
+ uint8_t* next_out = context->output;
BROTLI_BOOL is_eof = BROTLI_FALSE;
- InitializeBuffers(context);
+
for (;;) {
- if (context->available_in == 0 && !is_eof) {
- if (!ProvideInput(context)) return BROTLI_FALSE;
- is_eof = !HasMoreInput(context);
+ if (available_in == 0 && !is_eof) {
+ available_in = fread(context->input, 1, kFileBufferSize, context->fin);
+ next_in = context->input;
+ if (ferror(context->fin)) {
+ fprintf(stderr, "failed to read input [%s]: %s\n",
+ PrintablePath(context->current_input_path), strerror(errno));
+ return BROTLI_FALSE;
+ }
+ is_eof = feof(context->fin) ? BROTLI_TRUE : BROTLI_FALSE;
}
if (!BrotliEncoderCompressStream(s,
is_eof ? BROTLI_OPERATION_FINISH : BROTLI_OPERATION_PROCESS,
- &context->available_in, &context->next_in,
- &context->available_out, &context->next_out, NULL)) {
+ &available_in, &next_in, &available_out, &next_out, NULL)) {
/* Should detect OOM? */
fprintf(stderr, "failed to compress data [%s]\n",
PrintablePath(context->current_input_path));
return BROTLI_FALSE;
}
- if (context->available_out == 0) {
- if (!ProvideOutput(context)) return BROTLI_FALSE;
+ if (available_out != kFileBufferSize) {
+ size_t out_size = kFileBufferSize - available_out;
+ fwrite(context->output, 1, out_size, context->fout);
+ if (ferror(context->fout)) {
+ fprintf(stderr, "failed to write output [%s]: %s\n",
+ PrintablePath(context->current_output_path), strerror(errno));
+ return BROTLI_FALSE;
+ }
+ available_out = kFileBufferSize;
+ next_out = context->output;
}
- if (BrotliEncoderIsFinished(s)) {
- return FlushOutput(context);
- }
+ if (BrotliEncoderIsFinished(s)) return BROTLI_TRUE;
}
}
@@ -930,34 +756,8 @@ static BROTLI_BOOL CompressFiles(Context* context) {
}
BrotliEncoderSetParameter(s,
BROTLI_PARAM_QUALITY, (uint32_t)context->quality);
- if (context->lgwin > 0) {
- /* Specified by user. */
- /* Do not enable "large-window" extension, if not required. */
- if (context->lgwin > BROTLI_MAX_WINDOW_BITS) {
- BrotliEncoderSetParameter(s, BROTLI_PARAM_LARGE_WINDOW, 1u);
- }
- BrotliEncoderSetParameter(s,
- BROTLI_PARAM_LGWIN, (uint32_t)context->lgwin);
- } else {
- /* 0, or not specified by user; could be chosen by compressor. */
- uint32_t lgwin = DEFAULT_LGWIN;
- /* Use file size to limit lgwin. */
- if (context->input_file_length >= 0) {
- int32_t size = 1 << BROTLI_MIN_WINDOW_BITS;
- lgwin = BROTLI_MIN_WINDOW_BITS;
- while (size < context->input_file_length) {
- size <<= 1;
- lgwin++;
- if (lgwin == BROTLI_MAX_WINDOW_BITS) break;
- }
- }
- BrotliEncoderSetParameter(s, BROTLI_PARAM_LGWIN, lgwin);
- }
- if (context->input_file_length > 0) {
- uint32_t size_hint = context->input_file_length < (1 << 30) ?
- (uint32_t)context->input_file_length : (1u << 30);
- BrotliEncoderSetParameter(s, BROTLI_PARAM_SIZE_HINT, size_hint);
- }
+ BrotliEncoderSetParameter(s,
+ BROTLI_PARAM_LGWIN, (uint32_t)context->lgwin);
is_ok = OpenFiles(context);
if (is_ok && !context->current_output_path &&
!context->force_overwrite && isatty(STDOUT_FILENO)) {
@@ -979,7 +779,7 @@ int main(int argc, char** argv) {
int i;
context.quality = 11;
- context.lgwin = -1;
+ context.lgwin = DEFAULT_LGWIN;
context.force_overwrite = BROTLI_FALSE;
context.junk_source = BROTLI_FALSE;
context.copy_stat = BROTLI_TRUE;
@@ -987,7 +787,6 @@ int main(int argc, char** argv) {
context.verbose = BROTLI_FALSE;
context.write_to_stdout = BROTLI_FALSE;
context.decompress = BROTLI_FALSE;
- context.large_window = BROTLI_FALSE;
context.output_path = NULL;
context.suffix = DEFAULT_SUFFIX;
for (i = 0; i < MAX_OPTIONS; ++i) context.not_input_indices[i] = 0;
@@ -1047,8 +846,8 @@ int main(int argc, char** argv) {
case COMMAND_HELP:
case COMMAND_INVALID:
default:
+ PrintHelp(FileName(argv[0]));
is_ok = (command == COMMAND_HELP);
- PrintHelp(FileName(argv[0]), is_ok);
break;
}
diff --git a/c/tools/brotli.md b/c/tools/brotli.md
index c029869..c029869 100644..100755
--- a/c/tools/brotli.md
+++ b/c/tools/brotli.md
diff --git a/configure b/configure
index d96129a..d9bd3e3 100755
--- a/configure
+++ b/configure
@@ -1,8 +1,6 @@
#!/usr/bin/env bash
-echo "Use Autotools, Bazel, CMake or Premake5 to generate projects / build files."
+echo "Use Bazel, CMake or Premake5 to generate projects / build files."
echo " Bazel: http://www.bazel.build/"
echo " CMake: https://cmake.org/"
echo " Premake5: https://premake.github.io/"
-echo "To generate Autotools 'configure' file run './bootstrap'."
-echo "Run './configure-cmake' for Autotools-like CMake configuration."
echo "Or simply run 'make' to build and test command line tool."
diff --git a/configure.ac b/configure.ac
deleted file mode 100644
index 87d579d..0000000
--- a/configure.ac
+++ /dev/null
@@ -1,14 +0,0 @@
-AC_PREREQ(2.57)
-
-dnl Actual version is substituted by bootstrap
-AC_INIT([brotli], [0.0.0], [https://groups.google.com/forum/#!forum/brotli])
-
-AM_INIT_AUTOMAKE()
-AC_CONFIG_MACRO_DIR([m4])
-
-AC_PROG_CC
-LT_INIT
-
-AC_CONFIG_FILES([Makefile scripts/libbrotlicommon.pc scripts/libbrotlidec.pc scripts/libbrotlienc.pc])
-
-AC_OUTPUT \ No newline at end of file
diff --git a/docs/brotli.1 b/docs/brotli.1
index 7242a32..c55b906 100644..100755
--- a/docs/brotli.1
+++ b/docs/brotli.1
@@ -1,4 +1,4 @@
-.TH "BROTLI" "1" "February 2018" "brotli 1.0.0" "User commands"
+.TH "BROTLI" "1" "August 2017" "brotli 1.0.0" "User commands"
.SH "NAME"
\fBbrotli\fR \- brotli, unbrotli \- compress or decompress files
.SH SYNOPSIS
diff --git a/docs/decode.h.3 b/docs/decode.h.3
index 7b8581c..965d07f 100644..100755
--- a/docs/decode.h.3
+++ b/docs/decode.h.3
@@ -1,4 +1,4 @@
-.TH "decode.h" 3 "Thu Feb 22 2018" "Brotli" \" -*- nroff -*-
+.TH "decode.h" 3 "Wed Aug 2 2017" "Brotli" \" -*- nroff -*-
.ad l
.nh
.SH NAME
@@ -143,9 +143,6 @@ Options to be used with \fBBrotliDecoderSetParameter\fP\&.
.TP
\fB\fIBROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION \fP\fP
Disable 'canny' ring buffer allocation strategy\&. Ring buffer is allocated according to window size, despite the real size of the content\&.
-.TP
-\fB\fIBROTLI_DECODER_PARAM_LARGE_WINDOW \fP\fP
-Flag that determines if 'Large Window Brotli' is used\&.
.SS "enum \fBBrotliDecoderResult\fP"
.PP
@@ -172,13 +169,13 @@ Partially done; should be called again with more output\&.
.PP
Creates an instance of \fBBrotliDecoderState\fP and initializes it\&. The instance can be used once for decoding and should then be destroyed with \fBBrotliDecoderDestroyInstance\fP, it cannot be reused for a new decoding session\&.
.PP
-\fCalloc_func\fP and \fCfree_func\fP \fBMUST\fP be both zero or both non-zero\&. In the case they are both zero, default memory allocators are used\&. \fCopaque\fP is passed to \fCalloc_func\fP and \fCfree_func\fP when they are called\&. \fCfree_func\fP has to return without doing anything when asked to free a NULL pointer\&.
+\fCalloc_func\fP and \fCfree_func\fP \fBMUST\fP be both zero or both non-zero\&. In the case they are both zero, default memory allocators are used\&. \fCopaque\fP is passed to \fCalloc_func\fP and \fCfree_func\fP when they are called\&.
.PP
\fBParameters:\fP
.RS 4
\fIalloc_func\fP custom memory allocation function
.br
-\fIfree_func\fP custom memory free function
+\fIfree_func\fP custom memory fee function
.br
\fIopaque\fP custom memory manager handle
.RE
diff --git a/docs/encode.h.3 b/docs/encode.h.3
index eff57bd..dd420bb 100644..100755
--- a/docs/encode.h.3
+++ b/docs/encode.h.3
@@ -1,4 +1,4 @@
-.TH "encode.h" 3 "Thu Feb 22 2018" "Brotli" \" -*- nroff -*-
+.TH "encode.h" 3 "Wed Sep 20 2017" "Brotli" \" -*- nroff -*-
.ad l
.nh
.SH NAME
@@ -23,10 +23,6 @@ encode.h \- API for Brotli compression\&.
.br
.RI "\fIDefault value for \fBBROTLI_PARAM_LGWIN\fP parameter\&. \fP"
.ti -1c
-.RI "#define \fBBROTLI_LARGE_MAX_WINDOW_BITS\fP 30"
-.br
-.RI "\fIMaximal value for \fBBROTLI_PARAM_LGWIN\fP parameter in 'Large Window Brotli' (32-bit)\&. \fP"
-.ti -1c
.RI "#define \fBBROTLI_MAX_INPUT_BLOCK_BITS\fP 24"
.br
.RI "\fIMaximal value for \fBBROTLI_PARAM_LGBLOCK\fP parameter\&. \fP"
@@ -291,19 +287,6 @@ Flag that affects usage of 'literal context modeling' format feature\&. This fla
.TP
\fB\fIBROTLI_PARAM_SIZE_HINT \fP\fP
Estimated total input size for all \fBBrotliEncoderCompressStream\fP calls\&. The default value is 0, which means that the total input size is unknown\&.
-.TP
-\fB\fIBROTLI_PARAM_LARGE_WINDOW \fP\fP
-Flag that determines if 'Large Window Brotli' is used\&.
-.TP
-\fB\fIBROTLI_PARAM_NPOSTFIX \fP\fP
-Recommended number of postfix bits (NPOSTFIX)\&. Encoder may change this value\&.
-.PP
-Range is from 0 to ::BROTLI_MAX_NPOSTFIX\&.
-.TP
-\fB\fIBROTLI_PARAM_NDIRECT \fP\fP
-Recommended number of direct distance codes (NDIRECT)\&. Encoder may change this value\&.
-.PP
-Range is from 0 to (15 << NPOSTFIX) in steps of (1 << NPOSTFIX)\&.
.SH "Function Documentation"
.PP
.SS "\fBBROTLI_BOOL\fP BrotliEncoderCompress (int quality, int lgwin, \fBBrotliEncoderMode\fP mode, size_t input_size, const uint8_t input_buffer[input_size], size_t * encoded_size, uint8_t encoded_buffer[*encoded_size])"
@@ -352,7 +335,7 @@ Compresses input stream to output stream\&. The values \fC*available_in\fP and \
.PP
After each call, \fC*available_in\fP will be decremented by the amount of input bytes consumed, and the \fC*next_in\fP pointer will be incremented by that amount\&. Similarly, \fC*available_out\fP will be decremented by the amount of output bytes written, and the \fC*next_out\fP pointer will be incremented by that amount\&.
.PP
-\fCtotal_out\fP, if it is not a null-pointer, will be set to the number of bytes compressed since the last \fCstate\fP initialization\&.
+\fCtotal_out\fP, if it is not a null-pointer, will be set to the number of bytes decompressed since the last \fCstate\fP initialization\&.
.PP
Internally workflow consists of 3 tasks:
.IP "1." 4
@@ -408,13 +391,13 @@ When flushing and finishing, \fCop\fP should not change until operation is compl
.SS "\fBBrotliEncoderState\fP* BrotliEncoderCreateInstance (\fBbrotli_alloc_func\fP alloc_func, \fBbrotli_free_func\fP free_func, void * opaque)"
.PP
-Creates an instance of \fBBrotliEncoderState\fP and initializes it\&. \fCalloc_func\fP and \fCfree_func\fP \fBMUST\fP be both zero or both non-zero\&. In the case they are both zero, default memory allocators are used\&. \fCopaque\fP is passed to \fCalloc_func\fP and \fCfree_func\fP when they are called\&. \fCfree_func\fP has to return without doing anything when asked to free a NULL pointer\&.
+Creates an instance of \fBBrotliEncoderState\fP and initializes it\&. \fCalloc_func\fP and \fCfree_func\fP \fBMUST\fP be both zero or both non-zero\&. In the case they are both zero, default memory allocators are used\&. \fCopaque\fP is passed to \fCalloc_func\fP and \fCfree_func\fP when they are called\&.
.PP
\fBParameters:\fP
.RS 4
\fIalloc_func\fP custom memory allocation function
.br
-\fIfree_func\fP custom memory free function
+\fIfree_func\fP custom memory fee function
.br
\fIopaque\fP custom memory manager handle
.RE
@@ -481,7 +464,7 @@ Calculates the output size bound for the given \fCinput_size\fP\&.
.PP
\fBWarning:\fP
.RS 4
-Result is only valid if quality is at least \fC2\fP and, in case \fBBrotliEncoderCompressStream\fP was used, no flushes (\fBBROTLI_OPERATION_FLUSH\fP) were performed\&.
+Result is not applicable to \fBBrotliEncoderCompressStream\fP output, because every 'flush' adds extra overhead bytes, and some encoder settings (e\&.g\&. quality \fC0\fP and \fC1\fP) might imply a 'soft flush' after every chunk of input\&.
.RE
.PP
\fBParameters:\fP
diff --git a/docs/types.h.3 b/docs/types.h.3
index bef9313..e72ae6e 100644..100755
--- a/docs/types.h.3
+++ b/docs/types.h.3
@@ -1,4 +1,4 @@
-.TH "types.h" 3 "Thu Feb 22 2018" "Brotli" \" -*- nroff -*-
+.TH "types.h" 3 "Wed Aug 2 2017" "Brotli" \" -*- nroff -*-
.ad l
.nh
.SH NAME
diff --git a/fetch-spec/shared-brotli-fetch-spec.txt b/fetch-spec/shared-brotli-fetch-spec.txt
deleted file mode 100644
index ea2d117..0000000
--- a/fetch-spec/shared-brotli-fetch-spec.txt
+++ /dev/null
@@ -1,116 +0,0 @@
-[DRAFT]
-
-Introduction:
-
-This document is a draft proposal for Shard Brotli dictionaries in the fetch spec
-(https://fetch.spec.whatwg.org/).
-
-The goal is to add support for custom dictionaries for Brotli. A dictionary is used
-to improve compression. A client can download a dictionary from a server and then
-use it to decompress resources compressed with this dictionary.
-
-This document specifies how the client and server negotiate the dictionary over HTTP.
-A high level overview is as follows: The server adds an HTTP header to the response
-with a URL of the dictionary. The browser downloads the dictionary from the URL and
-then caches it so it can be reused. The server also adds a checksum to an HTTP header
-which the client uses to verify the dictionary. Caching, CORS, and other existing
-mechanisms are used. A dictionary can be a pre-made static dictionary, but does not
-have to be, for example a previous page loaded from this server, or an old version
-of a page, can be used as well.
-
-Below are changes and additions to add Shared Brotli dictionaries to the fetch spec
-at https://fetch.spec.whatwg.org/:
-
-Additions to `4.5. HTTP-network-or-cache fetch`
-
-Add to point `15. Modify httpRequest’s header list per HTTP.`:
-
- If the recursive-sbr flag is enabled, `Accept-Encoding` may not contain `sbr`
- [NOTE-BOX] When sbr can be used, it is possible to add a header Available-Dict
- with the URL and hash code of a cached resource. The server may then use it as
- shared dictionary.
-
-Additions to `4.6. HTTP-network fetch`
-
-Add after point `10. Run these steps, but abort if the ongoing fetch is terminated`:
-
- 11. Let codings be the result of extracting header list values given
- `Content-Encoding` and response’s header list.
- 12. If codings contains `sbr`
- 1. If the header list does not contain `Sbr-Dict`, return a network error
- 2. Let dictionaryId be the result of extracting header list values given
- `Sbr-Dict` and response’s header list.
-
-To point `12. Run these substeps in parallel:`, add new first sub-point:
-
- 1. If codings contains `sbr`, run these subsubsteps:
- 1. Let dictionaryResponse be the result of performing a
- Shared-Brotli-dictionary fetch given dictionaryId and request.
- 2. If dictionaryResponse is a network error, return a network error.
-
-Change point `12.4. Set bytes to the result of handling content codings given codings and bytes.` to:
-
- 4. Set bytes to the result of handling content codings given codings, bytes
- and, if codings contains `sbr`, also dictionaryResponse's body.
- [NOTE-BOX] If the dictionary is still being fetched, which happens in
- parallel, enqueue bytes in a compressed buffer and handle content coding
- once the dictionary is fetched
-
-Additions to `2.2.4. Bodies`
-
-
-Change last section `To handle content codings ...` to:
-
- To handle content codings given codings, bytes and optionally a dictionary, run these substeps:
- 1. If codings are not supported, return bytes.
- 2. If the codings has `sbr`, run these subsubsteps:
- a. Return the result of decoding bytes and dictionary with the Shared
- Brotli decoder.
- [Shared Brotli Spec] [IANA Brotli](https://www.iana.org/assignments/http-parameters/http-parameters.xhtml)
- 3. Else:
- a. Return the result of decoding bytes with the given codings, as
- explained in HTTP. [HTTP] [HTTP-SEMANTICS] [HTTP-COND] [HTTP-CACHING]
- [HTTP-AUTH]
-
-New section `4.10. Shared-Brotli-dictionary fetch`
-
- To perform a Shared-Brotli-dictionary fetch using dictionaryId, and parentRequest, perform these steps:
-
- 1. Let dictionaryURL be the URL extracted from dictionaryId
- 2. Let dictionaryHash be the hash id extracted from dictionaryId
- 3. Let dictionaryRequest be a new request whose method is `GET`, url is
- dictionaryURL, mode is "cors", and client is parentRequest's client.
- 4. Let dictionaryResponse be the result of performing an
- [HTTP-network-or-cache](https://fetch.spec.whatwg.org/#concept-http-network-or-cache-fetch)
- fetch using dictionaryRequest with the recursive-sbr flag set to true.
- [NOTE-BOX] For compression benefits, the dictionary should be reused to
- decode multiple different responses. We rely on caching to achieve this.
- It is suggested for servers to not add any "no-cache" or short "max-age"
- Cache-Control directives, and it is suggested for the client to effectively
- support caching it.
- [NOTE-BOX] Since the same dictionary can be identified by a hash code, a
- browser can avoid fetching a dictionary if it already has one with the same
- hashed cached from a different source URL.
- [NOTE-BOX] It is suggested that a server does not reuse the same URL
- to host an updated or different dictionary. Instead the same dictionary URL
- should contain a dictionary with the same content and same hash.
- 5. If dictionaryResponse is a network error, return a network error.
- 6. If dictionaryResponse's status is not an ok status, return a network error.
- 7. Let tokens be the result of
- [parsing metadata](https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata)
- given dictionaryHash.
- [Subresource Integrity](https://w3c.github.io/webappsec-subresource-integrity/)
- 8. If tokens is no metadata or the length of tokens is not 1, return a network
- error
- 9. Let algorithm be the alg component of tokens[0]. If alg is 'hw3', set
- algorithm to 256-bit HighwayHash
- 10. Let digest be the val component of tokens[1].
- 11. Let hashValue be the result of base64 decoding digest
- [base64](https://tools.ietf.org/html/rfc4648)
- 12. If hashValue is not a valid base64 encoding, return a network error
- [NOTE-BOX] All of the supported hashing algorithms are cryptographically
- secure.
- 13. Compute the hash code of dictionaryResponse's body using algorithm and
- compare this checksum for equality with hashValue. If the computed
- checksum does not match hashValue, return a network error.
- 14. Return dictionaryResponse.
diff --git a/go/BUILD b/go/BUILD
deleted file mode 100644
index 72a5317..0000000
--- a/go/BUILD
+++ /dev/null
@@ -1,2 +0,0 @@
-# Description:
-# cbrotli is a CGo wrapper for Brotli, a generic-purpose lossless compression algorithm.
diff --git a/go/WORKSPACE b/go/WORKSPACE
deleted file mode 100644
index 8a88c7e..0000000
--- a/go/WORKSPACE
+++ /dev/null
@@ -1,16 +0,0 @@
-workspace(name = "org_brotli_go")
-
-local_repository(
- name = "org_brotli",
- path = "..",
-)
-
-http_archive(
- name = "io_bazel_rules_go",
- urls = ["https://github.com/bazelbuild/rules_go/releases/download/0.12.0/rules_go-0.12.0.tar.gz"],
- sha256 = "c1f52b8789218bb1542ed362c4f7de7052abcf254d865d96fb7ba6d44bc15ee3",
-)
-
-load("@io_bazel_rules_go//go:def.bzl", "go_rules_dependencies", "go_register_toolchains")
-go_rules_dependencies()
-go_register_toolchains()
diff --git a/go/cbrotli/BUILD b/go/cbrotli/BUILD
index ce594ad..e045b61 100644..100755
--- a/go/cbrotli/BUILD
+++ b/go/cbrotli/BUILD
@@ -2,25 +2,25 @@ package(default_visibility = ["//visibility:public"])
licenses(["notice"]) # MIT
-load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
+load("@io_bazel_rules_go//go:def.bzl", "go_prefix", "cgo_library", "go_test")
-go_library(
+go_prefix("github.com/google/brotli")
+
+cgo_library(
name = "cbrotli",
srcs = [
"reader.go",
"writer.go",
],
cdeps = [
- "@org_brotli//:brotlidec",
- "@org_brotli//:brotlienc",
+ "//:brotlidec",
+ "//:brotlienc",
],
- cgo = True,
- importpath = "github.com/google/brotli/go/cbrotli",
)
go_test(
name = "cbrotli_test",
size = "small",
srcs = ["cbrotli_test.go"],
- embed = [":cbrotli"],
+ library = ":cbrotli",
)
diff --git a/go/cbrotli/cbrotli_test.go b/go/cbrotli/cbrotli_test.go
index f59ec58..f59ec58 100644..100755
--- a/go/cbrotli/cbrotli_test.go
+++ b/go/cbrotli/cbrotli_test.go
diff --git a/go/cbrotli/cgo.go b/go/cbrotli/cgo.go
index f953f72..f953f72 100644..100755
--- a/go/cbrotli/cgo.go
+++ b/go/cbrotli/cgo.go
diff --git a/go/cbrotli/reader.go b/go/cbrotli/reader.go
index 3d8d424..3d8d424 100644..100755
--- a/go/cbrotli/reader.go
+++ b/go/cbrotli/reader.go
diff --git a/go/cbrotli/writer.go b/go/cbrotli/writer.go
index 9fa75ab..9fa75ab 100644..100755
--- a/go/cbrotli/writer.go
+++ b/go/cbrotli/writer.go
diff --git a/java/BUILD b/java/BUILD
deleted file mode 100644
index a00e2d0..0000000
--- a/java/BUILD
+++ /dev/null
@@ -1,86 +0,0 @@
-package(
- default_visibility = ["//visibility:public"],
-)
-
-# >>> JNI headers
-
-genrule(
- name = "copy_link_jni_header",
- srcs = ["@openjdk_linux//:jni_h"],
- outs = ["jni/jni.h"],
- cmd = "cp -f $< $@",
-)
-
-genrule(
- name = "copy_link_jni_md_header",
- srcs = select({
- "@org_brotli//:darwin": ["@openjdk_macos//:jni_md_h"],
- "@org_brotli//:darwin_x86_64": ["@openjdk_macos//:jni_md_h"],
- "@org_brotli//:windows_msys": ["@openjdk_win//:jni_md_h"],
- "@org_brotli//:windows_msvc": ["@openjdk_win//:jni_md_h"],
- "@org_brotli//:windows": ["@openjdk_win//:jni_md_h"],
- "//conditions:default": ["@openjdk_linux//:jni_md_h"],
- }),
- outs = ["jni/jni_md.h"],
- cmd = "cp -f $< $@",
-)
-
-cc_library(
- name = "jni_inc",
- hdrs = [
- ":jni/jni.h",
- ":jni/jni_md.h",
- ],
- includes = ["jni"],
-)
-
-# <<< JNI headers
-
-########################################################
-# WARNING: do not (transitively) depend on this target!
-########################################################
-cc_binary(
- name = "brotli_jni.dll",
- srcs = [
- "@org_brotli//:common_headers",
- "@org_brotli//:common_sources",
- "@org_brotli//:dec_headers",
- "@org_brotli//:dec_sources",
- "@org_brotli//:enc_headers",
- "@org_brotli//:enc_sources",
- "//org/brotli/wrapper/common:jni_src",
- "//org/brotli/wrapper/dec:jni_src",
- "//org/brotli/wrapper/enc:jni_src",
- ],
- deps = [
- "@org_brotli//:brotli_inc",
- ":jni_inc",
- ],
- linkshared = 1,
-)
-
-########################################################
-# WARNING: do not (transitively) depend on this target!
-########################################################
-cc_binary(
- name = "brotli_jni_no_dictionary_data.dll",
- srcs = [
- "@org_brotli//:common_headers",
- "@org_brotli//:common_sources",
- "@org_brotli//:dec_headers",
- "@org_brotli//:dec_sources",
- "@org_brotli//:enc_headers",
- "@org_brotli//:enc_sources",
- "//org/brotli/wrapper/common:jni_src",
- "//org/brotli/wrapper/dec:jni_src",
- "//org/brotli/wrapper/enc:jni_src",
- ],
- defines = [
- "BROTLI_EXTERNAL_DICTIONARY_DATA=",
- ],
- deps = [
- "@org_brotli//:brotli_inc",
- ":jni_inc",
- ],
- linkshared = 1,
-)
diff --git a/java/WORKSPACE b/java/WORKSPACE
deleted file mode 100644
index ab3f8b1..0000000
--- a/java/WORKSPACE
+++ /dev/null
@@ -1,69 +0,0 @@
-workspace(name = "org_brotli_java")
-
-local_repository(
- name = "org_brotli",
- path = "..",
-)
-
-maven_jar(
- name = "junit_junit",
- artifact = "junit:junit:4.12",
-)
-
-new_http_archive(
- name = "openjdk_linux",
- urls = [
- "https://mirror.bazel.build/openjdk/azul-zulu-8.23.0.3-jdk8.0.144/zulu8.23.0.3-jdk8.0.144-linux_x64.tar.gz",
- "https://bazel-mirror.storage.googleapis.com/openjdk/azul-zulu-8.23.0.3-jdk8.0.144/zulu8.23.0.3-jdk8.0.144-linux_x64.tar.gz",
- "https://cdn.azul.com/zulu/bin/zulu8.23.0.3-jdk8.0.144-linux_x64.tar.gz",
- ],
- sha256 = "7e6284739c0e5b7142bc7a9adc61ced70dc5bb26b130b582b18e809013bcb251",
- build_file_content = """
-package(
- default_visibility = ["//visibility:public"],
-)
-filegroup(
- name = "jni_h",
- srcs = ["zulu8.23.0.3-jdk8.0.144-linux_x64/include/jni.h"],
-)
-filegroup(
- name = "jni_md_h",
- srcs = ["zulu8.23.0.3-jdk8.0.144-linux_x64/include/linux/jni_md.h"],
-)""",
-)
-
-new_http_archive(
- name = "openjdk_macos",
- urls = [
- "https://mirror.bazel.build/openjdk/azul-zulu-8.23.0.3-jdk8.0.144/zulu8.23.0.3-jdk8.0.144-macosx_x64.zip",
- "https://bazel-mirror.storage.googleapis.com/openjdk/azul-zulu-8.23.0.3-jdk8.0.144/zulu8.23.0.3-jdk8.0.144-macosx_x64.zip",
- "https://cdn.azul.com/zulu/bin/zulu8.23.0.3-jdk8.0.144-macosx_x64.zip",
- ],
- sha256 = "ff533364c9cbd3b271ab5328efe28e2dd6d7bae5b630098a5683f742ecf0709d",
- build_file_content = """
-package(
- default_visibility = ["//visibility:public"],
-)
-filegroup(
- name = "jni_md_h",
- srcs = ["zulu8.23.0.3-jdk8.0.144-macosx_x64/include/darwin/jni_md.h"],
-)""",
-)
-
-new_http_archive(
- name = "openjdk_win",
- urls = [
- "https://mirror.bazel.build/openjdk/azul-zulu-8.23.0.3-jdk8.0.144/zulu8.23.0.3-jdk8.0.144-win_x64.zip",
- "https://bazel-mirror.storage.googleapis.com/openjdk/azul-zulu-8.23.0.3-jdk8.0.144/zulu8.23.0.3-jdk8.0.144-win_x64.zip",
- "https://cdn.azul.com/zulu/bin/zulu8.23.0.3-jdk8.0.144-win_x64.zip",
- ],
- sha256 = "f1d9d3341ef7c8c9baff3597953e99a6a7c64f8608ee62c03fdd7574b7655c02",
- build_file_content = """
-package(
- default_visibility = ["//visibility:public"],
-)
-filegroup(
- name = "jni_md_h",
- srcs = ["zulu8.23.0.3-jdk8.0.144-win_x64/include/win32/jni_md.h"],
-)""",
-)
diff --git a/java/org/brotli/dec/BUILD b/java/org/brotli/dec/BUILD
index e6d3a4d..8a2558c 100644..100755
--- a/java/org/brotli/dec/BUILD
+++ b/java/org/brotli/dec/BUILD
@@ -43,12 +43,6 @@ java_test(
)
java_test(
- name = "EagerStreamTest",
- test_class = "org.brotli.dec.EagerStreamTest",
- runtime_deps = [":test_lib"],
-)
-
-java_test(
name = "SynthTest",
test_class = "org.brotli.dec.SynthTest",
runtime_deps = [":test_lib"],
diff --git a/java/org/brotli/dec/BitReader.java b/java/org/brotli/dec/BitReader.java
index 5d54e01..5d54e01 100644..100755
--- a/java/org/brotli/dec/BitReader.java
+++ b/java/org/brotli/dec/BitReader.java
diff --git a/java/org/brotli/dec/BitReaderTest.java b/java/org/brotli/dec/BitReaderTest.java
index fa57640..fa57640 100644..100755
--- a/java/org/brotli/dec/BitReaderTest.java
+++ b/java/org/brotli/dec/BitReaderTest.java
diff --git a/java/org/brotli/dec/BrotliInputStream.java b/java/org/brotli/dec/BrotliInputStream.java
index a27e928..a2bca95 100644..100755
--- a/java/org/brotli/dec/BrotliInputStream.java
+++ b/java/org/brotli/dec/BrotliInputStream.java
@@ -16,7 +16,7 @@ import java.io.InputStream;
*/
public class BrotliInputStream extends InputStream {
- public static final int DEFAULT_INTERNAL_BUFFER_SIZE = 256;
+ public static final int DEFAULT_INTERNAL_BUFFER_SIZE = 16384;
/**
* Internal buffer used for efficient byte-by-byte reading.
@@ -44,8 +44,7 @@ public class BrotliInputStream extends InputStream {
* <p> For byte-by-byte reading ({@link #read()}) internal buffer with
* {@link #DEFAULT_INTERNAL_BUFFER_SIZE} size is allocated and used.
*
- * <p> Will block the thread until first {@link BitReader#CAPACITY} bytes of data of source
- * are available.
+ * <p> Will block the thread until first kilobyte of data of source is available.
*
* @param source underlying data source
* @throws IOException in case of corrupted data or source stream problems
@@ -60,8 +59,7 @@ public class BrotliInputStream extends InputStream {
* <p> For byte-by-byte reading ({@link #read()}) internal buffer of specified size is
* allocated and used.
*
- * <p> Will block the thread until first {@link BitReader#CAPACITY} bytes of data of source
- * are available.
+ * <p> Will block the thread until first kilobyte of data of source is available.
*
* @param source compressed data source
* @param byteReadBufferSize size of internal buffer used in case of
@@ -84,10 +82,6 @@ public class BrotliInputStream extends InputStream {
}
}
- public void setEager(boolean eager) {
- state.isEager = eager ? 1 : 0;
- }
-
/**
* {@inheritDoc}
*/
diff --git a/java/org/brotli/dec/BrotliRuntimeException.java b/java/org/brotli/dec/BrotliRuntimeException.java
index 1844907..1844907 100644..100755
--- a/java/org/brotli/dec/BrotliRuntimeException.java
+++ b/java/org/brotli/dec/BrotliRuntimeException.java
diff --git a/java/org/brotli/dec/Context.java b/java/org/brotli/dec/Context.java
index d9f3f91..d9f3f91 100644..100755
--- a/java/org/brotli/dec/Context.java
+++ b/java/org/brotli/dec/Context.java
diff --git a/java/org/brotli/dec/Decode.java b/java/org/brotli/dec/Decode.java
index 9e3d43b..4a1ded6 100644..100755
--- a/java/org/brotli/dec/Decode.java
+++ b/java/org/brotli/dec/Decode.java
@@ -25,10 +25,10 @@ final class Decode {
private static final int COPY_UNCOMPRESSED = 5;
private static final int INSERT_LOOP = 6;
private static final int COPY_LOOP = 7;
- private static final int TRANSFORM = 8;
- private static final int FINISHED = 9;
- private static final int CLOSED = 10;
- private static final int INIT_WRITE = 11;
+ private static final int COPY_WRAP_BUFFER = 8;
+ private static final int TRANSFORM = 9;
+ private static final int FINISHED = 10;
+ private static final int CLOSED = 11;
private static final int WRITE = 12;
private static final int DEFAULT_CODE_LENGTH = 8;
@@ -550,7 +550,9 @@ final class Decode {
private static void readNextMetablockHeader(State s) {
if (s.inputEnd != 0) {
s.nextRunningState = FINISHED;
- s.runningState = INIT_WRITE;
+ s.bytesToWrite = s.pos;
+ s.bytesWritten = 0;
+ s.runningState = WRITE;
return;
}
// TODO: Reset? Do we need this?
@@ -672,7 +674,9 @@ final class Decode {
s.pos += chunkLength;
if (s.pos == s.ringBufferSize) {
s.nextRunningState = COPY_UNCOMPRESSED;
- s.runningState = INIT_WRITE;
+ s.bytesToWrite = s.ringBufferSize;
+ s.bytesWritten = 0;
+ s.runningState = WRITE;
return;
}
@@ -682,12 +686,12 @@ final class Decode {
private static int writeRingBuffer(State s) {
int toWrite = Math.min(s.outputLength - s.outputUsed,
- s.ringBufferBytesReady - s.ringBufferBytesWritten);
+ s.bytesToWrite - s.bytesWritten);
if (toWrite != 0) {
- System.arraycopy(s.ringBuffer, s.ringBufferBytesWritten, s.output,
+ System.arraycopy(s.ringBuffer, s.bytesWritten, s.output,
s.outputOffset + s.outputUsed, toWrite);
s.outputUsed += toWrite;
- s.ringBufferBytesWritten += toWrite;
+ s.bytesWritten += toWrite;
}
if (s.outputUsed < s.outputLength) {
@@ -708,15 +712,6 @@ final class Decode {
return group;
}
- // Returns offset in ringBuffer that should trigger WRITE when filled.
- private static int calculateFence(State s) {
- int result = s.ringBufferSize;
- if (s.isEager != 0) {
- result = Math.min(result, s.ringBufferBytesWritten + s.outputLength - s.outputUsed);
- }
- return result;
- }
-
/**
* Actual decompress implementation.
*/
@@ -727,7 +722,6 @@ final class Decode {
if (s.runningState == CLOSED) {
throw new IllegalStateException("Can't decompress after close");
}
- int fence = calculateFence(s);
int ringBufferMask = s.ringBufferSize - 1;
byte[] ringBuffer = s.ringBuffer;
@@ -740,7 +734,6 @@ final class Decode {
}
readNextMetablockHeader(s);
/* Ring-buffer would be reallocated here. */
- fence = calculateFence(s);
ringBufferMask = s.ringBufferSize - 1;
ringBuffer = s.ringBuffer;
continue;
@@ -794,11 +787,12 @@ final class Decode {
BitReader.fillBitWindow(s);
ringBuffer[s.pos] =
(byte) readSymbol(s.hGroup0, s.literalTree, s);
- s.pos++;
s.j++;
- if (s.pos >= fence) {
+ if (s.pos++ == ringBufferMask) {
s.nextRunningState = INSERT_LOOP;
- s.runningState = INIT_WRITE;
+ s.bytesToWrite = s.ringBufferSize;
+ s.bytesWritten = 0;
+ s.runningState = WRITE;
break;
}
}
@@ -819,11 +813,12 @@ final class Decode {
prevByte1 = readSymbol(
s.hGroup0, s.hGroup0[literalTreeIndex], s);
ringBuffer[s.pos] = (byte) prevByte1;
- s.pos++;
s.j++;
- if (s.pos >= fence) {
+ if (s.pos++ == ringBufferMask) {
s.nextRunningState = INSERT_LOOP;
- s.runningState = INIT_WRITE;
+ s.bytesToWrite = s.ringBufferSize;
+ s.bytesWritten = 0;
+ s.runningState = WRITE;
break;
}
}
@@ -873,6 +868,7 @@ final class Decode {
s.maxDistance = s.maxBackwardDistance;
}
+ s.copyDst = s.pos;
if (s.distance > s.maxDistance) {
s.runningState = TRANSFORM;
continue;
@@ -911,11 +907,12 @@ final class Decode {
ringBuffer[s.pos] =
ringBuffer[(s.pos - s.distance) & ringBufferMask];
s.metaBlockLength--;
- s.pos++;
s.j++;
- if (s.pos >= fence) {
+ if (s.pos++ == ringBufferMask) {
s.nextRunningState = COPY_LOOP;
- s.runningState = INIT_WRITE;
+ s.bytesToWrite = s.ringBufferSize;
+ s.bytesWritten = 0;
+ s.runningState = WRITE;
break;
}
}
@@ -936,13 +933,16 @@ final class Decode {
int transformIdx = wordId >>> shift;
offset += wordIdx * s.copyLength;
if (transformIdx < Transform.NUM_TRANSFORMS) {
- int len = Transform.transformDictionaryWord(ringBuffer, s.pos,
+ int len = Transform.transformDictionaryWord(ringBuffer, s.copyDst,
Dictionary.getData(), offset, s.copyLength, transformIdx);
+ s.copyDst += len;
s.pos += len;
s.metaBlockLength -= len;
- if (s.pos >= fence) {
- s.nextRunningState = MAIN_LOOP;
- s.runningState = INIT_WRITE;
+ if (s.copyDst >= s.ringBufferSize) {
+ s.nextRunningState = COPY_WRAP_BUFFER;
+ s.bytesToWrite = s.ringBufferSize;
+ s.bytesWritten = 0;
+ s.runningState = WRITE;
continue;
}
} else {
@@ -954,6 +954,11 @@ final class Decode {
s.runningState = MAIN_LOOP;
continue;
+ case COPY_WRAP_BUFFER:
+ Utils.copyBytesWithin(ringBuffer, 0, s.ringBufferSize, s.copyDst);
+ s.runningState = MAIN_LOOP;
+ continue;
+
case READ_METADATA:
while (s.metaBlockLength > 0) {
BitReader.readMoreInput(s);
@@ -970,10 +975,6 @@ final class Decode {
copyUncompressedData(s);
continue;
- case INIT_WRITE:
- s.ringBufferBytesReady = Math.min(s.pos, s.ringBufferSize);
- s.runningState = WRITE;
- // fall through
case WRITE:
if (writeRingBuffer(s) == 0) {
// Output buffer is full.
@@ -982,14 +983,7 @@ final class Decode {
if (s.pos >= s.maxBackwardDistance) {
s.maxDistance = s.maxBackwardDistance;
}
- // Wrap the ringBuffer.
- if (s.pos >= s.ringBufferSize) {
- if (s.pos > s.ringBufferSize) {
- Utils.copyBytesWithin(ringBuffer, 0, s.ringBufferSize, s.pos);
- }
- s.pos &= ringBufferMask;
- s.ringBufferBytesWritten = 0;
- }
+ s.pos &= ringBufferMask;
s.runningState = s.nextRunningState;
continue;
diff --git a/java/org/brotli/dec/DecodeTest.java b/java/org/brotli/dec/DecodeTest.java
index a0c2784..a0c2784 100644..100755
--- a/java/org/brotli/dec/DecodeTest.java
+++ b/java/org/brotli/dec/DecodeTest.java
diff --git a/java/org/brotli/dec/Dictionary.java b/java/org/brotli/dec/Dictionary.java
index a6867b7..a6867b7 100644..100755
--- a/java/org/brotli/dec/Dictionary.java
+++ b/java/org/brotli/dec/Dictionary.java
diff --git a/java/org/brotli/dec/DictionaryData.java b/java/org/brotli/dec/DictionaryData.java
index a65e812..9ac6e55 100644..100755
--- a/java/org/brotli/dec/DictionaryData.java
+++ b/java/org/brotli/dec/DictionaryData.java
@@ -6,7 +6,6 @@
package org.brotli.dec;
-import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
/**
@@ -21,39 +20,36 @@ final class DictionaryData {
private static void unpackDictionaryData(
ByteBuffer dictionary, String data0, String data1, String skipFlip) {
- // Initialize lower 7 bits of every byte in the dictionary.
- byte[] dict;
- try {
- // NB: String#getBytes(String) is present in JDK 1.1, while other variants require JDK 1.6 and
- // above.
- dict = (data0 + data1).getBytes("US-ASCII");
- } catch (UnsupportedEncodingException e) {
- throw new RuntimeException(e); // cannot happen
- }
- if (dict.length != dictionary.capacity()) {
+ int n0 = data0.length();
+ int n1 = data1.length();
+ if (n0 + n1 != dictionary.capacity()) {
throw new RuntimeException("Corrupted brotli dictionary");
}
-
- // Toggle high bit using run-length delta encoded "skipFlip".
int offset = 0;
+ for (int i = 0; i < n0; ++i) {
+ dictionary.put(offset, (byte) data0.charAt(i));
+ offset++;
+ }
+ for (int i = 0; i < n1; ++i) {
+ dictionary.put(offset, (byte) data1.charAt(i));
+ offset++;
+ }
+ offset = 0;
int n = skipFlip.length();
for (int i = 0; i < n; i += 2) {
int skip = skipFlip.charAt(i) - 36;
int flip = skipFlip.charAt(i + 1) - 36;
offset += skip;
for (int j = 0; j < flip; ++j) {
- dict[offset] |= 0x80;
+ dictionary.put(offset, (byte) (dictionary.get(offset) | 0x80));
offset++;
}
}
-
- dictionary.put(dict);
}
static {
ByteBuffer dictionary = ByteBuffer.allocateDirect(122784);
unpackDictionaryData(dictionary, DATA0, DATA1, SKIP_FLIP);
- dictionary.flip();
Dictionary.setData(dictionary.asReadOnlyBuffer());
}
}
diff --git a/java/org/brotli/dec/DictionaryTest.java b/java/org/brotli/dec/DictionaryTest.java
index b2ea04b..b2ea04b 100644..100755
--- a/java/org/brotli/dec/DictionaryTest.java
+++ b/java/org/brotli/dec/DictionaryTest.java
diff --git a/java/org/brotli/dec/EagerStreamTest.java b/java/org/brotli/dec/EagerStreamTest.java
deleted file mode 100755
index 069ae34..0000000
--- a/java/org/brotli/dec/EagerStreamTest.java
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Copyright 2018 Google Inc. All Rights Reserved.
-
- Distributed under MIT license.
- See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
-*/
-
-package org.brotli.dec;
-
-import static org.junit.Assert.assertTrue;
-
-import java.io.ByteArrayInputStream;
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for {@link Decode}.
- */
-@RunWith(JUnit4.class)
-public class EagerStreamTest {
-
- private static final byte[] DATA = {
- 31, 118, -122, 17, -43, -92, 84, 0, -76, 42, -80, -101, 95, -74, -104, -120, -89, -127, 30, 58,
- -4, 11, 91, -104, -99, -81, 44, 86, 61, 108, -74, -97, 68, 32, -120, -78, 97, -107, 88, -52,
- -22, -55, -8, -56, -106, -117, 49, 113, -106, -82, -43, -12, -11, -91, -66, 55, 68, 118, -127,
- -77, -104, -12, 103, -14, -94, -30, -112, 100, 79, -72, -42, 121, 62, -99, 76, -39, -89, 42, 58,
- -110, 91, 65, 32, -102, -113, 49, 4, 73, 60, 122, -106, 107, 16, -123, 30, -97, 90, -102, -83,
- -65, -90, 34, 26, -26, 52, 75, -118, 43, -47, -47, 52, 84, -10, -121, -68, -2, 20, 80, 101, 53,
- 101, -119, -17, -111, -75, -21, -66, -96, -80, -114, 4, -65, 124, -89, -3, -25, -25, -21, -35,
- -15, -114, 55, 14, -76, -68, 71, 9, 123, 46, 78, 67, -18, -127, 70, -93, -128, -44, -87, 3, 36,
- -107, -3, 62, 83, 75, -123, -125, -11, 50, 46, -68, 80, 54, 9, -116, -29, 82, -14, -87, -94, 92,
- -88, -86, -18, -1, 22, 3, 46, -98, -128, -27, 121, -56, 88, -37, 85, -43, 61, -60, 12, -122,
- 107, -64, -27, -45, -110, 123, 60, 99, 108, 46, -29, -77, 76, 65, 100, 92, -104, 40, 63, 19, 36,
- -89, 80, -39, 37, -95, -74, 97, 90, -109, 54, 105, -10, -38, 100, 95, 27, 36, 33, -60, 39, 100,
- 32, -18, 93, -46, -99, 103, 127, -91, -62, 82, 76, 56, -66, -110, -16, 83, -116, -76, -9, -47,
- -5, -32, -65, 111, 0, 55, 47, -60, -95, -56, -100, 65, 125, 38, 77, 38, -32, -62, 55, 119, 10,
- 120, -69, 33, -111, -62, -87, 17, 102, -95, -106, 26, -50, -16, -109, 94, 83, -79, 90, 2, 42,
- -47, 37, -124, 114, -68, 6, 104, -65, 38, -108, -114, -110, 73, -95, -83, -90, -86, -36, -48,
- -63, -97, -120, -25, -53, 93, -77, -50, 59, -74, -9, 36, 85, 11, 76, 95, 74, -61, -9, 116, -14,
- -38, 73, 78, 44, -92, 58, -27, -54, 38, 81, 50, -36, -46, -117, 126, 89, 53, -37, -58, -12, 61,
- 77, -56, -85, -21, -128, 43, -111, 14, 54, 57, 116, 52, -85, 70, 88, -72, -26, 54, 109, -70,
- -84, -13, -1, -54, 91, 81, 101, -65, 49, -48, -16, 26, -115, -39, 100, -21, 105, -121, 38, 72,
- -115, 104, -100, 36, 120, 15, -109, 115, 64, 118, -68, -14, -26, -57, -71, 9, -118, -113, 15,
- 94, 108, 114, 109, -14, -80, -31, -57, -6, 57, 111, -36, -92, -25, -23, -71, -61, 120, 93, -65,
- 104, -123, -53, 35, -77, -8, -23, -31, 99, -3, 73, 75, 98, -2, -94, 73, 91, -109, -38, -78,
- -106, -121, -17, -21, 55, 45, -26, -7, -93, 38, 59, -90, -116, 3, -68, -2, -110, 19, -96, 28,
- -23, -39, 102, 99, 8, -82, -41, 63, 88, -70, 115, -123, -11, 111, 92, 47, -12, -16, -70, -2,
- -29, 101, 61, -45, -57, 54, 24, -125, 20, -37, -75, 89, -56, 52, 125, 22, -68, -63, 105, -91,
- -20, 91, 56, -99, -56, 35, -77, -78, -24, -79, 57, 5, -55, 101, -127, 75, -35, -113, -51, -103,
- 79, 102, 16, -124, -79, -128, -45, -65, -84, -97, -91, -90, -105, 76, 90, -93, 90, -49, -41,
- 104, 44, 81, -37, -84, 103, -120, -51, 79, -43, -114, -101, 38, -78, -94, -1, 15, 109, -62, 34,
- -65, -127, 98, 32, 46, -72, 70, 58, -61, -55, 90, 30, -103, 5, 109, -105, -119, 81, 92, -40,
- -75, -23, -77, 36, 18, 62, -33, -51, -38, -19, -12, 89, -101, 117, 94, 71, 127, -43, 54, 115,
- -67, 34, -83, -115, 127, 127, 42, 126, -121, -121, -40, 56, -113, 60, -27, 30, 44, -21, 98,
- -123, -14, 91, -69, 15, -81, 119, -101, 25, -73, 40, 105, 26, -86, -31, 86, -75, 74, 94, -74,
- 19, -4, -20, 69, 24, 43, -5, -91, 6, -89, 52, 77, -65, -71, 82, -81, -52, 22, -61, -15, 51, 22,
- 1, 70, -43, -3, -39, -27, 123, -13, -127, -86, 65, 51, 45, 127, -101, -27, -3, -44, -34, 75, 69,
- 77, 71, -34, 7, -51, 93, -83, -84, -57, -38, -100, 59, -105, -1, 44, -47, 63, 96, -127, 32, -63,
- 16, 80, -64, -127, 6, 54, 12, 44, 28, 48, -128, 4, 10, -104, 64, 3, 11, -47, 59, -79, -125, 52,
- -16, -78, -66, 19, -6, -33, -107, -10, -4, -42, 102, -31, -32, 99, 115, -22, -96, -45, -112, 28,
- 126, -44, -4, -47, -99, 127, -84, 37, -112, -34, 36, 1, -68, -14, -16, 55, 83, -99, 120, -69,
- -30, 89, 48, 126, -80, -43, 15, 13, -18, 14, -4, -126, -120, -118, -11, 100, 16, 76, 17, 54,
- -75, 114, 101, 37, 121, -23, -65, 39, 94, -48, -78, 67, -61, 75, 48, 23, -127, 83, -124, 95, -5,
- 67, 13, 87, 18, -2, 117, -36, -121, 115, -112, -107, -54, -36, 14, -4, -68, 35, 32, 79, -118,
- 81, 94, -56, -110, 37, -84, -121, 72, -7, -52, -40, -44, -1, 73, 123, 12, 42, -67, -87, 63, -2,
- -100, 29, -41, 112, 98, -125, 88, 97, -56, 90, 7, -40, -111, -126, 74, 121, -95, -45, -69, 48,
- -98, 18, -20, -124, 3, 46, -5, 26, 24, -79, 109, 4, 43, 60, 97, 96, -76, -21, 95, -52, -40, -45,
- 2, -103, -107, -9, 79, -79, -82, -73, -51, -74, -10, 81, -77, 111, -96, -41, -120, -38, 24, -87,
- 93, -41, 64, 72, 57, -81, -32, 60, -79, 36, -84, -89, -7, -25, 81, -98, 36, -22, -69, 86, 123,
- 120, -16, -113, -70, 47, -125, 2, 97, 78, -91, 102, 120, -91, 5, -71, 39, 116, -12, -79, -29,
- -9, 87, -5, -37, 87, -73, 116, -15, -10, -106, -49, -3, -21, 5, 120, 47, 72, -40, 79, -3, 85,
- -84, -87, 57, -83, -67, -64, 122, -39, 36, 70, -27, 71, -73, 42, -100, -99, 124, -90, 90, -29,
- -54, -115, 7, 89, -51, 9, -43, 32, 79, -104, 127, -38, 7, 93, -80, -124, 27, 96, 54, -51, -7,
- 57, 57, 63, 21, 110, 70, 122, 76, 51, 124, 78, -5, 126, -100, -98, 116, 59, 125, -106, -113,
- -111, -128, 92, 43, -19, -2, 105, -90, 96, -116, -116, -30, 115, -20, -106, 64, -108, -111, 94,
- -9, -123, 52, -71, -88, -84, 87, -25, -54, -117, -2, -29, 29, -85, -22, -20, -94, -25, 98, 101,
- 114, 80, -55, -51, 97, 99, 117, -86, 2, 79, 48, 110, 44, -94, -127, -85, 61, -95, 30, -91, -125,
- 83, 113, -93, -4, -126, -98, -93, -68, -99, -70, -37, -73, -90, 4, 53, -2, 78, -35, 101, 42, -6,
- -3, 106, -117, -127, 48, 31, 88, 117, 116, 106, -98, -23, -117, -7, -57, -128, -118, -117, -118,
- 115, 30, -61, 6, -38, -114, -103, 37, 53, -4, -100, -121, 98, -110, -113, 2, -20, 26, -88, -118,
- 19, -71, 39, -54, -11, -28, 47, 28, 89, 35, -13, -20, -48, 14, -6, -91, -85, -119, -7, 116, 112,
- 114, 41, 44, -1, -39, 60, -85, -54, 101, -119, 95, -77, -64, -121, 47, 75, -78, -30, -66, -38,
- -15, 98, 14, 82, -60, 85, -90, -78, 112, -7, 64, 5, 28, 64, 41, -64, 57, 85, 21, 122, -52, 90,
- 70, -73, 17, 47, -125, 40, -45, -7, -91, 100, -21, -120, -51, 21, 65, 31, 110, -105, -79, -80,
- 105, -43, 73, -61, 45, -30, -4, 83, 95, 3, 109, 55, -92, 120, 74, -36, -111, 54, -26, 76, -69,
- 7, -20, 55, 4, 70, -124, -31, -32, 127, -63, -58, 73, 106, 109, -41, -45, 96, 30, 63, 14, 8, 16,
- -88, 69, -115, -17, -14, -116, 115, -88, 119, -65, 16, -64, -112, -73, -10, -46, -7, 113, 5, 54,
- -38, -47, -18, 106, 23, 12, -117, 120, -107, 121, -62, -35, -6, -56, 112, 81, 3, 5, 31, -11,
- -92, -85, -29, 102, 43, 108, 88, -69, 55, -74, 110, 97, -128, 29, -63, -114, -19, 77, 123, 23,
- 76, 81, 57, 51, 117, -74, -1, 74, 84, 70, 86, -109, -127, 122, 10, 9, 23, 71, 110, -116, -30,
- -85, -104, 2, 40, -62, 20, 46, 8, 95, 46, 13, 113, -83, 124, 33, 38, 105, -99, 72, -62, -80,
- -16, -118, 92, -66, -14, -124, 112, 79, 103, 53, -127, 61, -31, -92, 92, -42, -37, -37, -24,
- -116, 2, -81, 40, 46, -44, 23, -68, -113, 88, 92, 95, 11, 118, 98, 19, -80, -102, 96, 73, -20,
- 47, -105, -120, -74, -83, -77, -87, -59, -97, 112, 99, -52, 80, 116, -119, -44, 18, 62, 108, 73,
- -34, 70, 28, 73, 81, -26, 87, -125, -55, 64, -53, -73, 114, -3, -45, -109, 19, -2, 68, 119, 14,
- 26, 72, 19, 13, -121, -98, 26, -52, 85, 34, 17, -95, -7, 20, -12, 106, -11, 104, 20, -106, -42,
- -26, 107, -106, 112, 103, -53, -62, 13, -58, -23, 23, 65, -104, -55, -90, 107, 55, -77, -25,
- -125, 63, -61, -21, 117, -102, -70, -93, -67, -45, -61, 18, -63, 7, -127, 90, 16, -25, 116, 80,
- 35, 105, 80, -93, 105, -44, 114, -126, -103, 88, -102, -76, -94, -66, 69, -35, 22, 36, 95, -55,
- 22, 43, 78, -111, 109, 72, 104, -49, -9, -48, 59, 102, -54, -43, -128, 111, 127, -9, 35, 23,
- -79, 40, -122, -52, 36, -81, -4, -102, -2, -62, 53, -111, -117, 40, 122, -95, 55, 32, -127, -9,
- -91, 79, -109, -81, -3, 98, -78, 56, -119, 69, -41, 76, -102, 18, 90, -15, 12, -60, 86, -106,
- 34, -118, -43, -13, 61, -106, -56, 48, 27, -15, -70, -41, 127, 61, -2, -80, -13, 86, 28, 91,
- -10, -8, 98, -20, 54, 122, -116, -55, -70, -94, 54, -64, 71, 102, -106, -1, 99, -73, -71, -18,
- -11, 56, 11, -27, -5, 11, -86, 126, 8, 46, -21, 63, -66, -43, 88, 46, -113, -5, 113, 26, -9,
- -32, 18, -3, -6, -38, 81, 38, -110, 111, 97, 34, 65, 114, -71, -118, 9, -110, -109, -61, -113,
- 31, -82, -102, -127, 16, -7, -16, -11, -87, -76, -41, -52, 58, -116, 100, 102, -127, 6, 127, 64,
- 14, 110, 112, 43, 44, 87, 42, -118, -119, -39, 64, -7, 57, 16, 2, -69, -12, -54, -94, 36, -48,
- 123, -119, 82, 46, 26, -62, 30, 97, -17, 34, 80, 32, -15, 116, -96, -3, 33, 34, 51, 59, -63,
- -100, -7, -79, -126, -21, -15, -18, -113, 30, -25, 107, -25, -125, 53, 82, -15, -80, 96, -24,
- -47, 94, -25, -109, -94, 114, -62, 112, -104, 26, -107, -68, -14, -36, -9, -89, 27, -75, 62, 62,
- -20, -125, -77, -57, -127, 80, 58, -118, 63, -27, -82, -126, 74, -23, -91, -28, -95, 8, -122,
- -73, 28, -87, -74, 80, -15, -119, 14, 32, 124, 73, 15, 61, -32, -68, 81, 56, -119, 66, 105, 3,
- -15, 20, -86, 124, -70, -113, 100, -72, -117, -97, 127, 103, 16, 105, 8, 39, -128, -64, -47, 66,
- 123, -110, 13, 123, -124, -24, 42, 102, -4, 47, 107, 125, 63, -52, -35, 113, -74, 13, 8, 17, 16,
- -106, -21, -69, 47, -3, 103, -2, 19, -100, 111, -11, 1, 112, 90, -38, -31, -45, -55, 25, 92,
- -122, 66, -18, -98, -82, -49, 119, -35, -128, 26, 60, -79, -23, 127, 82, -52, 115, 77, -109,
- -111, 17, -99, 31, 33, 41, 35, 87, -47, -126, -18, -25, 81, -71, 9, -72, -92, 64, -92, 23, 116,
- 96, 40, 55, -87, 119, -105, 66, 49, 46, -10, 26, -25, -105, 127, -124, 86, -2, 39, 116, -108, 6,
- 21, 15, 1, 75, -5, 101, 13, 57, 70, 126, -50, -97, 123, -73, -77, 53, -11, -73, 44, -99, 91, 85,
- 21, -59, -1, 117, 64, -100, 47, 75, 93, 9, -4, 83, -55, 15, 99, 31, 43, -49, 15, -89, -115,
- -114, -50, -35, -19, -65, 122, -39, 92, -21, -3, -66, 8, -70, 107, -55, -86, -36, -23, -21, 80,
- -79, 48, 116, 57, -71, 33, -111, -68, -75, 37, 55, 39, 124, 96, -66, 10, 14, 118, 50, 85, -33,
- 54, -101, -7, 21, 88, -122, 50, -92, 123, 37, 109, -60, -127, 26, 110, -20, -31, -66, -56, -24,
- 47, -14, -60, -101, 69, -38, 78, 0, 44, -71, 108, 4, 25, -68, -106, 20, -40, -103, 108, -70,
- -56, 78, 12, 82, 81, 46, -105, -123, -46, -20, -127, -67, -77, 76, -74, 40, 105, 2, 27, 112,
- -107, -121, -53, 6, -88, -11, 26, 41, 64, -69, -44, 27, 47, 24, -31, -86, -4, 4, -46, 42, 50,
- -55, 37, -11, -95, 108, 54, 37, 67, 37, -14, -40, 41, 124, 22, 108, 99, 16, 55, 88, 19, 49, -87,
- 27, 17, -68, -107, 15, -62, 84, 109, 72, -26, 71, 63, -17, -72, -63, -101, -8, 62, 24, -112,
- 126, -102, -64, 29, -19, -75, 74, 29, 90, -90, 83, -22, 106, -27, -114, 56, -111, -33, 11, 3,
- -16, 94, 115, -97, 67, -78, 62, -93, -36, 60, -65, -54, 72, 70, 44, -77, 73, 29, -106, 38, 72,
- -37, -110, 79, -98, -15, -58, 96, -85, -68, -15, 73, 57, -127, 14, -123, -40, 70, 63, -64, 115,
- -63, 127, 94, 85, 52, 30, -62, 83, -30, -97, 82, 39, 2, 36, -50, 106, 116, 66, 104, -14, 73, 14,
- -106, -127, 11, 41, -27, 56, -99, -74, 55, 123, 124, 9, 46, 12, -97, -37, -10, 122, 124, -27,
- -64, 93, -70, 9, 119, 13, -9, -71, -118, 19, 50, -36, 114, 120, -24, -62, 40, 127, 9, -62, 84,
- 57, 66, 91, -114, 120, -49, 63, 99, -73, -66, -64, 84, -31, 67, -52, 12, 38, -62, 37, -122, -50,
- -95, 24, 19, 54, -80, 57, -118, -84, 124, 90, 53, 72, 29, -123, 67, -65, 99, -58, -28, 20, -110,
- -103, 92, -91, -108, 23, -118, 44, 74, 76, -29, 94, -121, -37, -32, 107, -62, -67, -55, -45,
- -50, -44, 25, -77, -102, 90, -128, -31, -5, -64, 110, 122, 88, -18, -53, -85, 122, -11, 100,
- -106, 97, 59, -103, -110, 5, -16, 59, -126, -74, 9, -119, 115, 49, -73, -42, 32, 100, 59, -98,
- 106, 55, -101, 87, 126, 59, -23, 106, -102, 100, -69, -46, 76, 53, -107, -119, -113, 104, 117,
- -27, 75, -32, 8, -81, -10, 50, 108, -32, 51, -79, -53, -2, 66, -9, 113, 14, 99, -100, -34, -21,
- 13, 2, 45, -33, 0, -16, -64, -126, 69, -25, -34, 28, 105, -48, -38, 82, 12, 27, -71, 35, 13, 11,
- 21, 26, -19, -4, 44, -52, -126, -63, -32, -84, -22, -63, -29, 96, -97, -82, -12, -53, 98, 41,
- -69, -38, 101, -31, 47, -9, 16, -10, 9, -36, -103, -91, -65, -36, -93, -45, 94, 110, 54, -94,
- 68, -39, -116, -40, 61, -112, -91, -79, 98, -36, 87, 35, 88, -61, 125, 112, -84, 48, -38, 105,
- -92, 69, -68, 92, 0, 27, -72, -65, 97, 98, 66, 97, -74, 29, 46, -21, 102, 61, 120, -62, 38,
- -125, -60, -43, 4, 5, -27, 113, -43, 105, -22, -110, 68, 13, -14, -23, 18, 95, -79, -108, 87,
- 19, -80, 16, 54, -121, 88, -64, -113, 73, 3, -20, 17, 0, 26, -88, -49, -2, 21, 120, -105, -85,
- -113, 76, 106, 37, -13, -75, 29, -127, 10, -17, -53, -124, 24, 37, -31, 26, -1, 109, 88, -88,
- -37, -51, -32, -125, 48, -40, 123, -108, 55, -120, -62, -91, 47, 62, -127, -25, 99, 68, 22, -40,
- 58, 119, -31, -93, -122, 39, -92, 25, -127, -42, 97, 69, -6, 110, -61, -21, -94, 82, 123, -93,
- -51, -90, 50, -96, 127, -32, 125, -76, 117, 75, -52, 79, 110, -51, -15, -81, 49, 62, 118, 120,
- -27, 22, 84, -22, 77, -105, 87, -7, -23, 47, -8, 108, 82, -12, 84, -52, -85, 68, -89, -24, -32,
- 6, -34, -83, 80, 44, 12, -51, 50, 74, -121, -106, 6, 85, 32, 42, 76, -59, -52, -99, 102, 108,
- -127, -49, 0, 60, 62, 2, 13, -19, -92, -41, -69, 55, -70, 94, 23, 36, 89, 70, -115, -51, 26,
- -95, 13, -69, 42, 62, 59, -24, -63, -50, -6, -86, -97, -115, -58, -107, 69, -12, -109, 73, 4,
- 63, 12, 32, 13, -123, -72, -41, -7, -81, 37, -91, -128, 109, -79, -80, 88, -22, 108, 126, 103,
- 27, -29, -81, 52, 55, -91, -13, -43, -75, -59, 80, -6, 6, 83, -103, -64, 8, 63, -34, -59, 21,
- 55, -115, 62, 77, 30, -50, -71, -66, 87, 99, -47, 0, 124, 76, 120, 79, -12, 54, -16, -98, -72,
- -41, -66, -14, 114, -27, 108, 57, -49, 107, -73, 90, 107, -103, 25, -107, 112, -119, -54, 106,
- -54, -8, -13, -81, -62, 92, -84, 113, 77, 74, -63, 104, 92, -94, -128, -43, -54, -71, 117, 27,
- 14, 98, 52, 119, -93, -77, -80, -46, 88, 35, 123, 86, 87, 122, 62, 108, 19, 27, 111, 2, 62, -67,
- 89, 14, -82, 41, 123, -117, 74, 109, -124, -115, 15, 123, -65, 42, -81, -105, 19, -30, 86, -72,
- 84, 63, -109, 34, -65, -127, 6, -104, 77, 103, -111, 90, 16, 31, -74, -33, 122, 58, 52, 10, 2,
- 65, 72, 68, 79, 52, 31, -19, 100, -86, 21, -49, 116, 101, 82, 111, -96, -76, 67, -40, -62, -15,
- -79, 109, -58, 6, 11, -91, -29, 65, 21, 75, 74, -28, 21, 103, 46, 48, -42, 51, -110, 80, -95,
- -102, -9, 8, -95, 102, 102, 16, 105, 103, 92, -106, -109, 77, 93, 32, -12, -25, 5, 17, -86, -34,
- 58, -50, 55, 63, -8, -72, 3, 26, 91, 72, 71, -77, 94, 91, 39, 45, 7, 0, 30, -45, -100, 35, 43,
- -41, -72, 16, -103, -115, -4, 51, 39, -23, -89, -84, 105, 94, -91, -88, 82, 123, -26, 51, -16,
- 97, 47, -39, 35, 46, -89, 74, 7, -80, 116, -21, 82, -84, -13, -99, 31, -58, -93, 36, 99, 36, 44,
- -65, 45, 94, -91, -41, 115, -10, 116, -67, 45, 19, -20, 113, -62, 111, 124, 108, 71, -121, -64,
- 122, -121, -105, 114, 115, -126, -93, -108, -113, -1, -80, -86, 116, -111, -29, 53, -76, 87, 19,
- 45, -30, 91, 91, -7, -49, 12, 112, -8, -26, 82, 58, -82, -76, 119, -50, 14, 85, 113, 20, 48,
- -102, 37, 24, -120, -107, -52, 67, -44, -92, -79, -40, 28, 21, 55, 116, 88, 19, -49, -78, 86,
- -89, 74, -4, 118, 75, 11, -103, -127, -47, -16, -77, -78, 8, 2, -88, 50, 23, -99, 102, -100,
- -116, -99, -109, -112, -115, 78, 55, -39, -84, 100, -91, -101, 73, -9, 39, -23, 62, -125, -106,
- -55, 119, -118, 114, -33, -99, 20, -53, 91, 115, 47, -93, 51, -99, -9, 92, -71, 120, 57, -44,
- -87, -11, 108, 30, 43, -4, 118, 90, 126, -54, -99, -47, -2, -61, -3, -62, 45, 92, -70, -105, 30,
- 98, 112, -94, 56, 35, -22, 32, -93, -6, -36, -5, -77, -78, 120, 45, 104, 69, -49, -30, 39, 75,
- 38, -94, -12, 34, 34, -44, 48, -100, 74, 34, 69, 94, -12, 73, 27, -111, 90, 33, -38, 93, 40,
- -16, 89, 26, -110, -116, -10, -65, 85, -57, 48, -86, 121, 118, -41, 63, 33, 109, -78, -26, 122,
- 111, -115, -52, 95, 26, -70, -14, -86, -80, -27, -6, 12, -44, 123, 28, 93, -74, 14, -124, 87,
- -28, -12, 111, -117, -83, 48, -41, -3, 60, -51, -91, 118, 54, 110, 18, -2, -120, -66, 46, -35,
- -91, 106, 94, -91, -11, 41, -92, -22, 96, -113, -109, 105, 56, -80, 17, -118, 124, -16, 30, 30,
- 117, 126, -99, -106, -69, -28, 85, 85, -41, 21, -95, -85, -112, -125, -45, 69, 10, -34, -120,
- 33, -58, 120, 51, -22, -7, 31, -34, 4, 55, -102, -70, 118, -83, 49, 111, -45, -9, 69, -95, -66,
- 116, -3, 104, -61, 17, 21, -20, 121, 117, 127, -70, 5, 89, -89, 51, 15, 64, 126, -73, 97, 90,
- 119, -22, -37, -54, 52, -33, 26, -54, 75, 79, 73, 100, 44, 3, 53, -25, 49, -123, -101, -80, -54,
- -81, -32, 88, 49, -14, -4, 18, 42, 52, -65, -33, 68, 83, -89, -11, 57, 102, 71, 122, 74, -92,
- -44, -94, -108, 14, 104, -107, -124, -63, 8, 32, 85, -18, -16, -91, -63, -38, 27, -108, 24, 19,
- -33, 53, 70, -32, 41, 38, -77, -30, 89, 28, -15, -89, -86, 32, 51, 28, 67, 124, -96, -103, -34,
- -113, 22, 15, -8, 104, -38, -56, 65, -96, -111, 104, -9, -38, 107, 55, 112, 47, 99, 50, -18, 90,
- -69, 116, 80, 95, 52, -27, -98, 6, 12, -11, 124, -120, -96, -91, 118, -51, -120, 90, -92, -104,
- -83, -73, 84, 61, 78, -39, -99, 33, 58, -45, -14, 127, -20, -44, 125, 21, -26, -21, -36, 51, 73,
- 71, 73, -17, 83, 11, 107, 91, 36, -65, -24, 56, 117, 114, -126, -34, 1, 120, 66, -50, 14, 91,
- 97, -35, 75, 87, 123, -53, 63, -38, -74, -62, -117, -45, -40, 125, -5, 53, 50, 0, -110, 7, 7,
- 45, 37, -71, -21, 70, -95, -60, 74, -55, -54, -96, 115, -62, -32, -3, -121, -18, 27, -107, 49,
- -39, 58, -39, 91, 107, 65, -99, -64, -19, -10, -126, 38, -40, -112, 0, 16, 107, -59, 119, -70,
- 79, 49, -18, -76, -22, -38, -98, 35, -99, 61, 67, -100, 29, -104, -17, 22, 108, 105, 88, -114,
- -65, 84, 99, -69, -84, -87, -81, -28, 68, -66, 3, 69, -69, 83, 16, 61, -102, 50, 67, 46, -98,
- -77, -40, -78, 48, 68, -85, 123, -92, 37, 14, 75, 13, -23, -110, 23, 26, 90, -81, -1, -109, 85,
- 121, -68, -55, -7, 21, -81, -35, 41, 3, -72, -52, 36, 35, -83, -9, -81, -124, -104, 31, 54, 8,
- -32, 80, 73, 89, -41, 116, 127, -110, 68, -82, 82, -79, 105, 113, -110, -70, 121, -24, -54, 37,
- -12, -70, -77, 15, 14, 105, -19, 16, -6, 73, 102, 121, -116, -62, 54, 65, 119, 43, 60, -79, -66,
- -17, 1, 97, -1, -11, -5, 104, 10, 59, -108, 21, -8, 64, -71, -86, 14, -98, -87, -49, 30, -45,
- 109, 43, -67, 10, -122, 25, 98, -102, 127, -27, -52, -61, -66, -47, 114, -94, -126, 4, 0, -65,
- -11, -51, -67, 84, -43, 44, 88, 53, -6, 124, 11, -123, 34, 12, 102, -13, -106, 47, 62, -71, 43,
- -65, 28, 37, 32, 80, 23, 6, 75, -103, 73, 112, 33, 84, -89, 12, -81, 42, 65, 58, 14, -102, 90,
- 29, -116, 104, 107, -99, -1, -43, 122, 118, 88, -2, 117, 84, 1, -123, -2, 2, -32, -18, -122,
- -36, -58, 16, 76, 115, 27, -121, -2, -79, -44, -39, 33, -29, 33, -34, 55, 71, 61, 117, -22,
- -126, 51, 29, 55, -34, -48, 17, -57, 74, 71, -33, -50, 60, 41, -119, -93, -45, -127, -30, 104,
- 35, 60, -117, -113, 81, -59, -39, -84, -39, -46, -106, 57, 77, 62, -11, -44, -87, 71, 35, -117,
- -87, -77, -98, 68, -29, -121, -16, -16, 39, 48, -74, 23, 82, -62, 32, 62, 27, 125, 84, 39, -91,
- -91, -93, 76, -24, 98, 123, -58, -114, 17, 28, 93, -17, 74, 92, -17, 9, -86, -116, -72, 54, -74,
- 71, 9, -97, -33, -20, -126, -50, 117, 102, 54, 123, 124, -70, 30, -102, 27, 23, 105, -40, -35,
- -89, -33, 89, 3, 44, 18, -15, 10, 116, -111, 1, -81, -31, -125, -102, 103, -93, -15, 72, 84, 19,
- -30, -17, -115, 99, 43, 5, -92, 52, 59, -55, -105, -128, 19, 8, -78, 43, 7, -55, -126, -106, 11,
- 69, 118, 24, -128, -54, -86, 22, -121, -43, 69, -15, 96, 52, 52, 90, -118, -10, -58, 121, 63,
- -48, -13, 22, -101, 17, 42, -28, -54, -63, 121, -96, 111, 113, 103, 126, 37, -52, -40, -106,
- -104, 123, -48, -92, 83, 100, -70, -52, -59, -93, -116, -90, -93, 82, -117, 103, 52, -71, -42,
- 57, 25, 57, -74, 71, 7, 32, 96, -60, 11, 121, 58, 71, 40, -92, 35, 88, -12, -109, -56, -122,
- -30, -118, 103, 65, -5, -90, -97, 103, -117, 66, -20, -42, -46, 67, -29, -23, 72, -97, 26, -54,
- -103, -76, -47, -71, 23, -83, -20, 95, 111, 101, -83, 106, -71, -70, -63, 55, -85, -41, 117, -9,
- 37, 96, -71, -118, -44, -43, 2, 107, 113, -39, -107, 41, -13, 0, -87, 77, 83, 99, 68, -84, -6,
- -1, 67, 124, -57, 115, 29, 24, 26, -42, 104, 58, -87, -38, 12, -98, 11, 109, 62, 59, -66, -48,
- -20, 70, -111, 11, 120, 21, -58, -29, -76, 44, -7, 26, -119, -59, -87, 44, 122, 8, 114, -58,
- -109, -119, -63, -58, -51, 33, 35, -109, 81, 110, -90, 121, -21, 64, -60, 68, 18, 75, -82, -81,
- -103, -76, -116, 23, 53, 58, -41, -23, 49, -102, 81, 101, 39, -59, -91, -98, 111, 2, 65, 110,
- 121, 5, 13, 97, -119, 109, 40, 82, 47, -51, 47, -57, 35, -109, 53, -42, 10, 3, -15, 122, -25,
- -67, -62, -121, -120, -31, 18, -20, 87, -88, 75, 95, -121, -93, 33, 61, -88, -96, 88, -69, -54,
- -121, -99, 49, 122, -53, -49, -125, 53, -79, -46, -128, 109, 125, -93, -83, 44, -101, 69, 68,
- -91, -17, 55, -13, -75, -80, 21, 32, -13, 40, 86, -65, 85, 80, -82, -38, -52, 110, -119, 100, 8,
- 77, -23, 67, -41, 73, 27, 38, 9, -11, -32, -30, 75, -15, 67, -41, 46, 27, -89, 9, 117, -38, -14,
- -81, -4, 71, 113, -79, 81, -36, 63, 15, -70, 104, 34, -56, -39, 93, -34, -127, 90, -36, 73, 47,
- -76, 113, 55, 123, -92, 48, 116, 108, -123, 31, -67, -39, 3, -9, 6, 13, -17, -50, -125, 1, 105,
- 121, 100, 79, 82, -85, 123, -33, -73, 54, -61, -113, 121, -110, 69, 119, 94, -112, -120, -34,
- -35, -104, -116, 44, 85, 109, -104, 127, 120, 87, 75, -48, -115, 74, 85, -47, -53, 16, -5, 92,
- 67, -32, 12, 79, 109, 105, 5, -92, 51, 46, 96, -96, 63, 106, 82, -54, -95, 20, -60, -23, 48, -5,
- -128, 22, 23, -93, 93, -64, 35, 21, -121, -79, 59, -1, -50, 55, -7, -10, -85, 3, -7, 121, 98, 5,
- -19, 76, -78, -128, -47, -42, 61, -59, -46, -24, -16, -51, -48, 122, -26, 74, -91, 54, 53, 46,
- 74, 25, -30, -74, 52, -22, 118, -103, -53, -113, 44, -19, 70, -86, 106, 72, -68, -86, 110, 34,
- -35, 57, -43, 32, -4, 14, 102, 25, -76, -84, -86, -83, -2, -107, -4, 49, -97, -83, -95, 6, 100,
- -73, 6, 34, 49, 59, 50, 30, -8, 6, -55, 24, -6, 67, -121, 115, 40, -50, -75, -46, -26, 111, -20,
- -75, -83, -16, -48, 65, -64, 119, 62, -59, 3, -12, 109, 0, -118, -94, 17, -51, 124, 63, 42, -3,
- 44, 53, -81, -35, -33, -83, 115, -114, -4, -104, 44, 7, -81, -97, -102, 104, 29, -97, 70, 91, 3,
- 88, 67, -127, 78, -92, -16, -34, -18, -81, -125, -38, 117, -78, -36, 9, 76, -85, 121, 2, 10,
- 114, 65, -5, -29, -34, 101, 20, -108, 46, -90, -98, 85, -62, -51, 108, -72, -51, 44, 22, 112,
- 121, 58, -58, 109, -96, 58, 103, 27, -88, -81, 99, -7, -33, -113, 64, -122, 115, 19, -93, 37,
- -19, 93, -98, 78, 115, 91, -88, -82, -36, 61, 90, 77, 27, 26, -116, 80, 90, 85, 6, -87, 59, 110,
- 63, 20, -81, -127, -53, 18, -73, 39, 75, 79, -106, 29, -50, -13, 43, -99, -92, 109, 80, -83, 69,
- -102, 38, 90, -41, 48, -47, -93, 18, 116, 32, 90, -73, -96, 90, 49, 19, 73, -35, 60, 53, -72,
- -52, 84, 52, 27, -67, -114, 82, 79, -89, -80, -111, 124, -51, 80, 110, -76, 125, 18, -73, 44,
- -100, 118, -16, -64, -35, 22, -86, -116, -19, -101, -35, 42, 85, -83, 69, -65, 37, -104, -88,
- -108, -25, -9, 15, 91, -100, -86, 8, -75, -37, 103, 3, -69, -9, 114, -25, 25, -87, 118, -75,
- -115, -8, 74, 53, 73, 46, -22, -108, 30, 71, -96, 40, -76, 121, 71, -63, 95, 96, 113, -54, 87,
- 1, -79, 2, -40, 11, 22, -118, -117, 94, -44, -112, -27, -86, 96, -4, -58, 121, -71, 54, -58,
- -71, -125, -65, 126, -116, -107, 125, -28, -74, 97, 15, -76, 59, -26, 58, -38, -39, 122, 55, 85,
- -109, -114, 75, 25, -74, 57, -78, -10, -76, -115, -12, 29, 84, 86, 97, 5, 116, -114, 62, -98,
- -36, 105, -119, -19, 12, 11, 49, 76, 21, 56, 1, 115, 115, 42, -67, 60, -40, 19, 38, 50, 33, 112,
- 98, 123, -76, -74, 50, 66, 18, -61, -114, 36, -95, 92, 124, 20, -56, 29, -41, 28, -4, -106, 115,
- -83, 98, -47, 96, 87, -72, 96, -83, -93, 1, 112, -43, 59, -80, -24, 46, -45, 87, 92, -108, -78,
- 101, -112, 111, -119, -67, 26, 97, 1, 36, -128, 120, 8, -20, 84, 107, -9, -104, 25, 0, -36, 58,
- 111, 81, -83, 65, 42, 51, 61, -71, 118, 111, 29, -93, 39, -56, -72, -18, -53, 0, 34, -77, -59,
- 112, -79, 51, 86, 82, -24, 64, -120, -1, -102, -3, 42, -93, 16, 38, 100, 39, -124, 92, -89, 31,
- 94, -32, 40, 19, -8, 48, -83, -66, -68, 110, -72, 36, -38, -91, -63, 33, 35, -96, -121, -119,
- -59, 56, 89, -117, -123, -79, -68, 42, -4, -116, -108, -104, -84, -111, -26, 94, -38, 61, 94,
- -72, -85, -18, -30, 118, -14, -94, -74, -24, -21, -90, -83, -116, -38, -8, 9, -17, 72, -62, -78,
- -75, 47, -117, 109, 127, -87, -36, 53, 90, 16, -72, -50, 40, 87, 97, -51, -96, -55, -120, -32,
- -58, -21, 102, 117, -121, -98, 74, -67, 104, -122, 108, -3, -96, 64, -114, -3, 30, 48, -14, 44,
- -41, 91, 54, 58, 80, -13, -88, 121, 32, 122, 25, 24, 9, 72, 17, -1, -93, -66, 96, -84, 4, 37,
- 69, 91, 64, 32, 46, 89, 7, -32, -120, 10, -38, -3, -59, -75, 14, 116, 115, 121, 99, 122, -95,
- 107, 1, 65, 70, -45, 35, -52, -87, -56, 43, 121, 12, -93, -8, 83, -118, 15, -33, -67, 45, 74,
- -66, -31, -28, 5, 104, -13, 113, 19, -89, 105, 66, -82, 74, 54, -104, 69, 103, 86, 118, -44,
- -75, -47, 81, -75, 8, -32, -95, 121, 48, -121, -106, -88, -15, -52, -99, -78, 58, 113, 16, 71,
- -48, 76, 80, 81, 59, 43, -106, 27, -49, 2, -11, -71, -30, -80, -44, 62, -113, -20, 12, -60, -87,
- 22, -30, 64, -120, 127, 121, 47, 127, 58, -98, -4, 79, -72, -117, 115, 52, 95, 40, -59, -125,
- -33, 125, -96, -93, -92, 17, -99, -85, 10, -119, 91, -115, -63, -32, -11, -102, -105, -93, 90,
- 37, 94, -104, -47, -63, -94, 15, -34, 20, 73, -59, 85, -31, 6, 106, -67, 14, -125, 28, -63, 40,
- 86, -68, 104, -22, 124, -27, -84, -13, 43, -45, -30, -95, 95, 16, 79, 23, -66, -78, -74, 43, 86,
- 70, -95, 90, -65, -1, -58, 54, 12, 47, -47, 28, 91, -54, -19, -75, -43, 12, -108, 12, 71, 38,
- 118, -8, 1, 42, -113, -6, 1, -93, 118, 67, -79, 25, -80, 118, 34, -29, 0, -23, 86, 53, -118, 89,
- 112, 0, -61, -88, 76, -24, 59, -75, 23, -1, 64, -80, -52, -40, 34, -50, -19, -127, 57, 79, 43,
- 92, -113, -96, 73, 0, 33, 122, 42, 104, -62, -66, -108, -104, 45, -120, 69, -3, -20, -113, -40,
- -70, -96, 72, -21, -95, 1, -16, -124, -87, 125, 56, -108, 7, -112, -104, 105, 80, -34, -93, 24,
- -6, 35, -38, 42, -4, 23, -112, 40, 45, 106, -72, 29, 44, -36, -61, -8, -93, -34, 3, -41, -26,
- 121, 6, 100, -14, -112, -117, -15, -120, -92, 44, -43, 94, -13, 121, -59, -82, -68, 7, -19,
- -110, -121, -58, -118, -121, 92, -8, 33, -120, -28, -95, -31, -120, -62, 49, 51, 3, 68, 4, -56,
- 51, -13, -90, 47, -16, -24, 63, 125, -11, -94, 99, 69, -84, -54, 127, 81, -120, 42, -47, -128,
- -13, 38, 115, 59, -112, -30, -9, -116, 121, 63, 111, 32, -116, -2, 0, -33, 79, -67, 90, -65,
- -108, -107, -5, -107, 11, -102, 91, 106, -42, 74, 45, -80, -65, 54, 36, 121, -125, -118, -34,
- -51, 36, -85, -78, 86, 121, -103, -39, 35, -76, 17, 59, 68, -40, -43, -27, 63, -76, 126, -94,
- 18, 87, 20, 92, 38, -6, -54, 9, 45, 93, -57, 53, -11, -44, -38, -24, -126, -40, -24, -35, -121,
- -55, -87, -63, 70, -88, 13, -78, -89, 2, 50, 59, 4, -14, 81, 25, 34, -20, 87, 116, -76, -31,
- -93, 15, 112, 61, -43, -11, -86, -25, 10, 41, 1, 60, 105, -42, -90, -44, 38, 98, 126, -128, 28,
- 99, 20, -97, 105, -101, 27, -106, 13, -108, -18, 23, -79, 121, 57, 93, -16, -37, -82, -1, -128,
- -67, 99, 117, 79, 85, 83, 12, 53, -101, -52, -75, 72, -128, -62, 45, -54, 11, 0, -58, -88, 11,
- 121, 33, 86, -87, 31, -54, 109, -37, 10, 119, -9, 55, -7, 77, -52, 93, 64, -62, 115, -88, -4,
- 67, -1, -37, 31, 107, 90, -109, -121, 71, 105, -123, 61, 75, 89, 108, -91, -6, 115, 45, 109, 10,
- -35, -84, 41, 127, 104, -84, -70, -6, -118, 6, 110, 99, -7, -112, 15, -79, -20, 51, -41, 78, 25,
- -97, -2, -121, -117, 7, -87, -76, 60, -7, -7, 0, 51, 91, 34, 85, 21, -1, 108, 41, 8, 126, -25,
- -30, 68, 109, -52, -51, 1, -111, 11, -22, -70, -33, 95, 40, 6, 63, 52, -66, -20, -6, -104, 81,
- 57, 22, 82, 119, 126, 76, -10, -108, -63, -123, 19, 23, -106, -1, 117, 26, 112, -85, -78, 81,
- -116, 53, 86, -126, -80, 122, 36, 67, 18, 19, -114, 73, 125, -3, -69, 99, 10, -30, 19, 112,
- -103, 0, -61, 47, -106, -45, -105, -107, -56, 23, 14, 51, -70, 30, -32, 30, 7, 22, -31, -41, 19,
- -47, -64, -52, 119, -66, 54, -109, -87, 3, 95, -124, 94, -48, 36, -40, 13, 19, 91, -14, -115,
- 103, 66, 20, 44, 47, 8, -40, 4, -114, -110, -47, -28, -108, 89, 0, -7, -71, -91, -43, 98, 8,
- -85, -98, -113, 103, -71, 69, 14, -95, -36, 92, -17, -66, -95, 123, -15, 52, 88, -60, -23, 123,
- -61, -4, -33, -45, 77, 57, -121, 119, 116, -40, -31, -15, 96, 54, -49, -44, 36, -37, 111, -45,
- -17, 12, 14, 21, 105, 48, 51, 42, -89, 55, 61, -5, -2, -36, -88, 36, -35, -29, -7, -68, -28,
- -76, 5, -38, -66, -72, 24, -120, 8, -86, -28, 0, 71, -89, 20, -40, -100, 61, -57, 52, 23, 66,
- -2, -24, -7, 86, -100, 111, -114, -47, -25, -40, -61, -67, -104, 33, 49, 16, -115, 9, -64, 27,
- 122, 34, -33, -89, -113, -50, 42, 111, -14, 110, 43, 32, -112, 101, -59, 28, 76, -2, -117, 47,
- 5, -73, -75, 21, -91, 99, 81, 93, -17, -119, 68, -21, -84, -51, -64, -98, 58, -33, 77, 4, 18,
- 116, 62, 111, -105, -13, 91, -92, 81, -34, 40, 17, -128, 85, -19, 20, 8, 92, 83, 10, 3, 40, 89,
- 60, 109, -23, 59, -66, -22, 43, 124, 25, -105, 77, 14, 75, -111, 13, 45, -90, -108, -79, 78,
- -45, -55, -44, -86, -20, -41, -11, 65, 76, -79, 91, -23, 77, -84, 114, -109, 2, -71, 68, 8, -31,
- 99, 97, -104, -94, 69, 64, -16, -48, -78, 99, -58, -17, 95, 96, -64, 47, 96, -69, 60, 28, 114,
- 64, -128, -128, 114, 28, -124, 72, -41, -48, 82, -6, 63, -27, -126, -86, -121, 0, 4, 4, 35,
- -111, 66, 64, -61, 117, -92, 48, 88, -128, 116, 7, -24, -111, -55, 96, -59, -96, 49, -70, -41,
- -47, 85, 86, -37, -32, 53, -49, 62, 68, 80, -37, 95, 29, -114, 11, -65, 90, -99, -97, 101, 96,
- -88, 5, 34, 3, 23, -22, 42, 4, -4, 17, -121, 106, -60, 33, -38, -32, -8, 41, -87, -4, -35, -102,
- 7, 18, 35, -7, 85, -18, 60, 15, 34, 82, 46, 68, 63, 80, -38, 4, 51, -74, -34, 83, -33, -8, 44,
- 87, -18, -8, 46, -53, -109, -121, -114, 10, 63, -36, -1, -123, 69, 107, -58, 33, -11, 63, -117,
- 60, 22, 73, -36, 22, -76, -92, -74, -37, -35, 87, 40, -97, -6, 95, -25, -2, -99, -101, 102, -48,
- 45, -55, 85, 94, -48, 57, -100, 34, 16, -63, -16, 106, -75, -7, -109, 71, -74, 20, -16, 37, 90,
- -61, 69, 19, -111, 95, -104, 116, 75, -68, 85, -80, 66, 127, 127, 67, -98, 121, 53, 23, -3, 56,
- -89, 99, 57, 9, 122, 76, 119, 1, -117, 47, -105, -42, -7, 51, -8, -81, 48, -60, -69, -29, 24,
- 19, -81, 43, 31, -36, 62, 96, 20, -58, 39, -122, -115, 7, -114, 118, 27, 27, 78, -101, 75, -93,
- -104, -8, 119, 121, -97, -84, 58, 33, 18, -35, -29, 20, 20, 7, 112, 60, 31, -12, 7, -128, -55,
- -68, -7, -12, -115, 97, 115, 44, -46, -68, 108, 36, 121, -1, 84, -4, -26, -126, 85, -32, 36, 26,
- -19, 71, -121, -92, -51, -116, 81, -71, -83, -50, 21, -119, -60, -78, -84, 102, 19, -26, 118,
- -53, -13, 16, 36, -64, -83, -66, 32, -99, 54, 83, 104, 61, -19, 107, 95, -66, -42, -6, 25, 86,
- -13, -53, -49, -9, 74, -13, 58, 125, -96, -32, -22, -21, -12, -38, -114, -88, -100, 35, -87,
- -108, -2, -103, 87, -119, -109, 50, -28, -101, -4, -43, 105, 119, -118, 103, -104, 41, 47, 71,
- 53, 11, -53, 59, -13, -11, 83, -33, 28, 11, 78, -59, 73, -33, -60, 119, -73, -127, 98, 39, 77,
- 21, -8, -103, 103, 44, -87, -52, -74, 56, -63, -70, -121, 40, 103, 7, -100, 113, 53, -46, 44,
- 16, 31, 102, -31, 104, -38, -120, 118, -122, -55, 25, 1, 92, 22, -14, 24, 108, 92, -90, -93,
- -16, -99, -13, -127, 75, 101, -42, -86, -29, -51, -49, -105, -118, 91, -56, -51, -73, 117, 53,
- -39, -73, 121, 83, -49, -10, -86, 11, -97, 40, -33, 6, -40, -9, -32, 92, -101, -83, 116, -5,
- -57, -93, -121, 2, 38, -65, -6, 45, 100, 92, 92, 74, 115, 45, -33, 92, -11, 70, 33, 76, 85, 94,
- 1, -111, -103, 6, -4, -31, 44, -53, -77, -45, 100, -83, 92, -11, 10, -7, 126, 23, 36, 61, -18,
- -28, 67, 126, 53, -45, -77, 95, 43, -73, 30, -37, 122, -53, -79, -77, -42, 71, -124, 43, -89,
- 60, -80, -89, -68, 96, 29, 103, -50, -93, 105, 7
- };
-
- static class ProxyStream extends FilterInputStream {
- int readBytes;
-
- ProxyStream(InputStream is) {
- super(is);
- }
-
- @Override
- public int read(byte[] b, int off, int len) throws IOException {
- int result = super.read(b, off, len);
- if (result > 0) {
- readBytes += result;
- }
- return result;
- }
- }
-
- @Test
- public void testEagerStream() throws IOException {
- ProxyStream ps = new ProxyStream(new ByteArrayInputStream(DATA));
- BrotliInputStream reader = new BrotliInputStream(ps, 1);
- byte[] buffer = new byte[1];
- reader.read(buffer);
- reader.close();
- int normalReadBytes = ps.readBytes;
-
- ps = new ProxyStream(new ByteArrayInputStream(DATA));
- reader = new BrotliInputStream(ps, 1);
- reader.setEager(true);
- reader.read(buffer);
- reader.close();
- int eagerReadBytes = ps.readBytes;
-
- // Did not continue decoding - suspended as soon as enough data was decoded.
- assertTrue(eagerReadBytes < normalReadBytes);
- }
-}
diff --git a/java/org/brotli/dec/Huffman.java b/java/org/brotli/dec/Huffman.java
index 868701a..868701a 100644..100755
--- a/java/org/brotli/dec/Huffman.java
+++ b/java/org/brotli/dec/Huffman.java
diff --git a/java/org/brotli/dec/SetDictionaryTest.java b/java/org/brotli/dec/SetDictionaryTest.java
index f462c49..f462c49 100644..100755
--- a/java/org/brotli/dec/SetDictionaryTest.java
+++ b/java/org/brotli/dec/SetDictionaryTest.java
diff --git a/java/org/brotli/dec/State.java b/java/org/brotli/dec/State.java
index 2dc46d5..183df44 100644..100755
--- a/java/org/brotli/dec/State.java
+++ b/java/org/brotli/dec/State.java
@@ -63,6 +63,7 @@ final class State {
int distancePostfixBits;
int distance;
int copyLength;
+ int copyDst;
int maxBackwardDistance;
int maxRingBufferSize;
int ringBufferSize;
@@ -70,9 +71,8 @@ final class State {
int outputOffset;
int outputLength;
int outputUsed;
- int ringBufferBytesWritten;
- int ringBufferBytesReady;
- int isEager;
+ int bytesWritten;
+ int bytesToWrite;
InputStream input; // BitReader
diff --git a/java/org/brotli/dec/SynthTest.java b/java/org/brotli/dec/SynthTest.java
index c95a3c9..c95a3c9 100644..100755
--- a/java/org/brotli/dec/SynthTest.java
+++ b/java/org/brotli/dec/SynthTest.java
diff --git a/java/org/brotli/dec/Transform.java b/java/org/brotli/dec/Transform.java
index b90f2e9..b90f2e9 100644..100755
--- a/java/org/brotli/dec/Transform.java
+++ b/java/org/brotli/dec/Transform.java
diff --git a/java/org/brotli/dec/TransformTest.java b/java/org/brotli/dec/TransformTest.java
index 616ba35..616ba35 100644..100755
--- a/java/org/brotli/dec/TransformTest.java
+++ b/java/org/brotli/dec/TransformTest.java
diff --git a/java/org/brotli/dec/Utils.java b/java/org/brotli/dec/Utils.java
index 369e655..369e655 100644..100755
--- a/java/org/brotli/dec/Utils.java
+++ b/java/org/brotli/dec/Utils.java
diff --git a/java/org/brotli/dec/pom.xml b/java/org/brotli/dec/pom.xml
index 24b7aa1..24b7aa1 100644..100755
--- a/java/org/brotli/dec/pom.xml
+++ b/java/org/brotli/dec/pom.xml
diff --git a/java/org/brotli/dec/proguard.cfg b/java/org/brotli/dec/proguard.cfg
index 4c545dc..4c545dc 100644..100755
--- a/java/org/brotli/dec/proguard.cfg
+++ b/java/org/brotli/dec/proguard.cfg
diff --git a/java/org/brotli/integration/BUILD b/java/org/brotli/integration/BUILD
index 5b77325..ac9bc2c 100644..100755
--- a/java/org/brotli/integration/BUILD
+++ b/java/org/brotli/integration/BUILD
@@ -2,21 +2,11 @@
# Integration test runner + corpus for Java port of Brotli decoder.
java_library(
- name = "brotli_jni_test_base",
- srcs = ["BrotliJniTestBase.java"],
- visibility = [
- "//org/brotli/wrapper/common:__pkg__",
- "//org/brotli/wrapper/dec:__pkg__",
- "//org/brotli/wrapper/enc:__pkg__",
- ],
-)
-
-java_library(
name = "bundle_helper",
srcs = ["BundleHelper.java"],
visibility = [
- "//org/brotli/wrapper/dec:__pkg__",
- "//org/brotli/wrapper/enc:__pkg__",
+ "//java/org/brotli/wrapper/dec:__pkg__",
+ "//java/org/brotli/wrapper/enc:__pkg__",
],
)
@@ -25,7 +15,7 @@ java_library(
srcs = ["BundleChecker.java"],
deps = [
":bundle_helper",
- "//org/brotli/dec",
+ "//java/org/brotli/dec",
],
)
@@ -37,7 +27,7 @@ java_binary(
java_test(
name = "bundle_checker_data_test",
- args = ["org/brotli/integration/test_data.zip"],
+ args = ["java/org/brotli/integration/test_data.zip"],
data = ["test_data.zip"],
main_class = "org.brotli.integration.BundleChecker",
use_testrunner = 0,
@@ -48,7 +38,7 @@ java_test(
name = "bundle_checker_fuzz_test",
args = [
"-s",
- "org/brotli/integration/fuzz_data.zip",
+ "java/org/brotli/integration/fuzz_data.zip",
],
data = ["fuzz_data.zip"],
main_class = "org.brotli.integration.BundleChecker",
@@ -60,7 +50,7 @@ filegroup(
name = "test_data",
srcs = ["test_data.zip"],
visibility = [
- "//org/brotli/wrapper/dec:__pkg__",
+ "//java/org/brotli/wrapper/dec:__pkg__",
],
)
@@ -68,6 +58,6 @@ filegroup(
name = "test_corpus",
srcs = ["test_corpus.zip"],
visibility = [
- "//org/brotli/wrapper/enc:__pkg__",
+ "//java/org/brotli/wrapper/enc:__pkg__",
],
)
diff --git a/java/org/brotli/integration/BrotliJniTestBase.java b/java/org/brotli/integration/BrotliJniTestBase.java
deleted file mode 100644
index 4d699d5..0000000
--- a/java/org/brotli/integration/BrotliJniTestBase.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.brotli.integration;
-
-/**
- * Optionally loads brotli JNI wrapper native library.
- */
-public class BrotliJniTestBase {
- static {
- String jniLibrary = System.getProperty("BROTLI_JNI_LIBRARY");
- if (jniLibrary != null) {
- System.load(new java.io.File(jniLibrary).getAbsolutePath());
- }
- }
-} \ No newline at end of file
diff --git a/java/org/brotli/integration/BundleChecker.java b/java/org/brotli/integration/BundleChecker.java
index e3ddb33..e3ddb33 100644..100755
--- a/java/org/brotli/integration/BundleChecker.java
+++ b/java/org/brotli/integration/BundleChecker.java
diff --git a/java/org/brotli/integration/BundleHelper.java b/java/org/brotli/integration/BundleHelper.java
index 0eab7bc..0eab7bc 100644..100755
--- a/java/org/brotli/integration/BundleHelper.java
+++ b/java/org/brotli/integration/BundleHelper.java
diff --git a/java/org/brotli/integration/fuzz_data.zip b/java/org/brotli/integration/fuzz_data.zip
index 7a7eeda..7a7eeda 100644..100755
--- a/java/org/brotli/integration/fuzz_data.zip
+++ b/java/org/brotli/integration/fuzz_data.zip
Binary files differ
diff --git a/java/org/brotli/integration/pom.xml b/java/org/brotli/integration/pom.xml
index 2858a12..2858a12 100644..100755
--- a/java/org/brotli/integration/pom.xml
+++ b/java/org/brotli/integration/pom.xml
diff --git a/java/org/brotli/integration/test_corpus.zip b/java/org/brotli/integration/test_corpus.zip
index 8450112..8450112 100644..100755
--- a/java/org/brotli/integration/test_corpus.zip
+++ b/java/org/brotli/integration/test_corpus.zip
Binary files differ
diff --git a/java/org/brotli/integration/test_data.zip b/java/org/brotli/integration/test_data.zip
index 15ed862..15ed862 100644..100755
--- a/java/org/brotli/integration/test_data.zip
+++ b/java/org/brotli/integration/test_data.zip
Binary files differ
diff --git a/java/org/brotli/pom.xml b/java/org/brotli/pom.xml
index bb4a5a3..bb4a5a3 100644..100755
--- a/java/org/brotli/pom.xml
+++ b/java/org/brotli/pom.xml
diff --git a/java/org/brotli/wrapper/common/BUILD b/java/org/brotli/wrapper/common/BUILD
index 48b02f3..8623272 100644..100755
--- a/java/org/brotli/wrapper/common/BUILD
+++ b/java/org/brotli/wrapper/common/BUILD
@@ -7,54 +7,59 @@ filegroup(
srcs = ["common_jni.cc"],
)
-filegroup(
- name = "brotli_jni_no_dictionary_data",
- srcs = ["//:brotli_jni_no_dictionary_data.dll"],
+#########################################
+# WARNING: do not depend on this target!
+#########################################
+java_library(
+ name = "common_no_dictionary_data",
+ srcs = glob(
+ ["*.java"],
+ exclude = ["*Test*.java"],
+ ),
+ deps = ["//:jni_no_dictionary_data"],
)
+#########################################
+# WARNING: do not depend on this target!
+#########################################
java_library(
name = "common",
srcs = glob(
["*.java"],
exclude = ["*Test*.java"],
),
+ deps = ["//:jni"],
)
-java_library(
- name = "test_lib",
- testonly = 1,
- srcs = glob(["*Test*.java"]),
+java_test(
+ name = "SetZeroDictionaryTest",
+ size = "small",
+ srcs = ["SetZeroDictionaryTest.java"],
+ data = ["//:jni_no_dictionary_data"], # Bazel JNI workaround
deps = [
- ":common",
- "//org/brotli/dec",
- "//org/brotli/integration:brotli_jni_test_base",
- "//org/brotli/wrapper/dec",
+ ":common_no_dictionary_data",
+ "//java/org/brotli/wrapper/dec",
"@junit_junit//jar",
],
)
-java_test(
- name = "SetZeroDictionaryTest",
- test_class = "org.brotli.wrapper.common.SetZeroDictionaryTest",
- size = "small",
- data = [
- ":brotli_jni_no_dictionary_data", # Bazel JNI workaround
- ],
- jvm_flags = [
- "-DBROTLI_JNI_LIBRARY=$(location :brotli_jni_no_dictionary_data)",
- ],
- runtime_deps = [":test_lib"],
+filegroup(
+ name = "rfc_dictionary",
+ srcs = ["//:dictionary"],
)
java_test(
name = "SetRfcDictionaryTest",
- test_class = "org.brotli.wrapper.common.SetRfcDictionaryTest",
size = "small",
+ srcs = ["SetRfcDictionaryTest.java"],
data = [
- ":brotli_jni_no_dictionary_data", # Bazel JNI workaround
+ ":rfc_dictionary",
+ "//:jni_no_dictionary_data", # Bazel JNI workaround
],
- jvm_flags = [
- "-DBROTLI_JNI_LIBRARY=$(location :brotli_jni_no_dictionary_data)",
+ jvm_flags = ["-DRFC_DICTIONARY=$(location :rfc_dictionary)"],
+ deps = [
+ ":common_no_dictionary_data",
+ "//java/org/brotli/wrapper/dec",
+ "@junit_junit//jar",
],
- runtime_deps = [":test_lib"],
)
diff --git a/java/org/brotli/wrapper/common/BrotliCommon.java b/java/org/brotli/wrapper/common/BrotliCommon.java
index 9419e42..9419e42 100644..100755
--- a/java/org/brotli/wrapper/common/BrotliCommon.java
+++ b/java/org/brotli/wrapper/common/BrotliCommon.java
diff --git a/java/org/brotli/wrapper/common/CommonJNI.java b/java/org/brotli/wrapper/common/CommonJNI.java
index d662546..d662546 100644..100755
--- a/java/org/brotli/wrapper/common/CommonJNI.java
+++ b/java/org/brotli/wrapper/common/CommonJNI.java
diff --git a/java/org/brotli/wrapper/common/SetRfcDictionaryTest.java b/java/org/brotli/wrapper/common/SetRfcDictionaryTest.java
index a986eae..8577800 100644..100755
--- a/java/org/brotli/wrapper/common/SetRfcDictionaryTest.java
+++ b/java/org/brotli/wrapper/common/SetRfcDictionaryTest.java
@@ -9,11 +9,11 @@ package org.brotli.wrapper.common;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
-import org.brotli.dec.Dictionary;
-import org.brotli.integration.BrotliJniTestBase;
import org.brotli.wrapper.dec.BrotliInputStream;
import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@@ -25,21 +25,44 @@ import org.junit.runners.JUnit4;
* Tests for {@link BrotliCommon}.
*/
@RunWith(JUnit4.class)
-public class SetRfcDictionaryTest extends BrotliJniTestBase {
+public class SetRfcDictionaryTest {
+
+ // TODO: remove when Bazel get JNI support.
+ static {
+ System.load(new java.io.File(new java.io.File(System.getProperty("java.library.path")),
+ "liblibjni_Uno_Udictionary_Udata.so").getAbsolutePath());
+ }
@Test
- public void testRfcDictionaryChecksums() throws NoSuchAlgorithmException {
- System.err.println(Dictionary.getData().slice().remaining());
+ public void testRfcDictionaryChecksums() throws IOException, NoSuchAlgorithmException {
+ FileInputStream dictionary = new FileInputStream(System.getProperty("RFC_DICTIONARY"));
+ byte[] data = new byte[BrotliCommon.RFC_DICTIONARY_SIZE + 1];
+ int offset = 0;
+ try {
+ int readBytes;
+ while ((readBytes = dictionary.read(data, offset, data.length - offset)) != -1) {
+ offset += readBytes;
+ if (offset > BrotliCommon.RFC_DICTIONARY_SIZE) {
+ break;
+ }
+ }
+ } finally {
+ dictionary.close();
+ }
+ if (offset != BrotliCommon.RFC_DICTIONARY_SIZE) {
+ fail("dictionary size mismatch");
+ }
+
MessageDigest md5 = MessageDigest.getInstance("MD5");
- md5.update(Dictionary.getData().slice());
+ md5.update(data, 0, offset);
assertTrue(BrotliCommon.checkDictionaryDataMd5(md5.digest()));
MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
- sha1.update(Dictionary.getData().slice());
+ sha1.update(data, 0, offset);
assertTrue(BrotliCommon.checkDictionaryDataSha1(sha1.digest()));
MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
- sha256.update(Dictionary.getData().slice());
+ sha256.update(data, 0, offset);
assertTrue(BrotliCommon.checkDictionaryDataSha256(sha256.digest()));
}
@@ -48,7 +71,12 @@ public class SetRfcDictionaryTest extends BrotliJniTestBase {
/* "leftdatadataleft" encoded with dictionary words. */
byte[] data = {27, 15, 0, 0, 0, 0, -128, -29, -76, 13, 0, 0, 7, 91, 38, 49, 64, 2, 0, -32, 78,
27, 65, -128, 32, 80, 16, 36, 8, 6};
- BrotliCommon.setDictionaryData(Dictionary.getData());
+ FileInputStream dictionary = new FileInputStream(System.getProperty("RFC_DICTIONARY"));
+ try {
+ BrotliCommon.setDictionaryData(dictionary);
+ } finally {
+ dictionary.close();
+ }
BrotliInputStream decoder = new BrotliInputStream(new ByteArrayInputStream(data));
byte[] output = new byte[17];
diff --git a/java/org/brotli/wrapper/common/SetZeroDictionaryTest.java b/java/org/brotli/wrapper/common/SetZeroDictionaryTest.java
index 669939c..9046e31 100644..100755
--- a/java/org/brotli/wrapper/common/SetZeroDictionaryTest.java
+++ b/java/org/brotli/wrapper/common/SetZeroDictionaryTest.java
@@ -9,7 +9,6 @@ package org.brotli.wrapper.common;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
-import org.brotli.integration.BrotliJniTestBase;
import org.brotli.wrapper.dec.BrotliInputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -21,7 +20,13 @@ import org.junit.runners.JUnit4;
* Tests for {@link BrotliCommon}.
*/
@RunWith(JUnit4.class)
-public class SetZeroDictionaryTest extends BrotliJniTestBase {
+public class SetZeroDictionaryTest {
+
+ // TODO: remove when Bazel get JNI support.
+ static {
+ System.load(new java.io.File(new java.io.File(System.getProperty("java.library.path")),
+ "liblibjni_Uno_Udictionary_Udata.so").getAbsolutePath());
+ }
@Test
public void testZeroDictionary() throws IOException {
diff --git a/java/org/brotli/wrapper/common/common_jni.cc b/java/org/brotli/wrapper/common/common_jni.cc
index 2ea2ad8..2ea2ad8 100644..100755
--- a/java/org/brotli/wrapper/common/common_jni.cc
+++ b/java/org/brotli/wrapper/common/common_jni.cc
diff --git a/java/org/brotli/wrapper/dec/BUILD b/java/org/brotli/wrapper/dec/BUILD
index fcf0dbf..58ab3d4 100644..100755
--- a/java/org/brotli/wrapper/dec/BUILD
+++ b/java/org/brotli/wrapper/dec/BUILD
@@ -7,77 +7,67 @@ filegroup(
srcs = ["decoder_jni.cc"],
)
+#########################################
+# WARNING: do not depend on this target!
+#########################################
java_library(
name = "dec",
srcs = glob(
["*.java"],
exclude = ["*Test*.java"],
),
-)
-
-java_library(
- name = "test_lib",
- testonly = 1,
- srcs = glob(["*Test*.java"]),
- deps = [
- ":dec",
- "//org/brotli/integration:brotli_jni_test_base",
- "//org/brotli/integration:bundle_helper",
- "@junit_junit//jar",
- ],
-)
-
-filegroup(
- name = "brotli_jni",
- srcs = ["//:brotli_jni.dll"],
+ deps = ["//:jni"],
)
filegroup(
name = "test_bundle",
- srcs = ["//org/brotli/integration:test_data"],
+ srcs = ["//java/org/brotli/integration:test_data"],
)
java_test(
name = "BrotliDecoderChannelTest",
- test_class = "org.brotli.wrapper.dec.BrotliDecoderChannelTest",
size = "large",
+ srcs = ["BrotliDecoderChannelTest.java"],
data = [
- ":brotli_jni", # Bazel JNI workaround
":test_bundle",
+ "//:jni", # Bazel JNI workaround
],
- jvm_flags = [
- "-DBROTLI_JNI_LIBRARY=$(location :brotli_jni)",
- "-DTEST_BUNDLE=$(location :test_bundle)",
+ jvm_flags = ["-DTEST_BUNDLE=$(location :test_bundle)"],
+ deps = [
+ ":dec",
+ "//java/org/brotli/integration:bundle_helper",
+ "@junit_junit//jar",
],
- runtime_deps = [":test_lib"],
)
java_test(
name = "BrotliInputStreamTest",
- test_class = "org.brotli.wrapper.dec.BrotliInputStreamTest",
size = "large",
+ srcs = ["BrotliInputStreamTest.java"],
data = [
- ":brotli_jni", # Bazel JNI workaround
":test_bundle",
+ "//:jni", # Bazel JNI workaround
],
- jvm_flags = [
- "-DBROTLI_JNI_LIBRARY=$(location :brotli_jni)",
- "-DTEST_BUNDLE=$(location :test_bundle)",
+ jvm_flags = ["-DTEST_BUNDLE=$(location :test_bundle)"],
+ deps = [
+ ":dec",
+ "//java/org/brotli/integration:bundle_helper",
+ "@junit_junit//jar",
],
- runtime_deps = [":test_lib"],
)
java_test(
name = "DecoderTest",
- test_class = "org.brotli.wrapper.dec.DecoderTest",
size = "large",
+ srcs = ["DecoderTest.java"],
data = [
- ":brotli_jni", # Bazel JNI workaround
":test_bundle",
+ "//:jni", # Bazel JNI workaround
],
- jvm_flags = [
- "-DBROTLI_JNI_LIBRARY=$(location :brotli_jni)",
- "-DTEST_BUNDLE=$(location :test_bundle)",
+ jvm_flags = ["-DTEST_BUNDLE=$(location :test_bundle)"],
+ deps = [
+ ":dec",
+ "//java/org/brotli/integration:bundle_helper",
+ "@junit_junit//jar",
],
- runtime_deps = [":test_lib"],
)
diff --git a/java/org/brotli/wrapper/dec/BrotliDecoderChannel.java b/java/org/brotli/wrapper/dec/BrotliDecoderChannel.java
index 6dfe8f2..c9a752a 100644..100755
--- a/java/org/brotli/wrapper/dec/BrotliDecoderChannel.java
+++ b/java/org/brotli/wrapper/dec/BrotliDecoderChannel.java
@@ -58,8 +58,8 @@ public class BrotliDecoderChannel extends Decoder implements ReadableByteChannel
int result = 0;
while (dst.hasRemaining()) {
int outputSize = decode();
- if (outputSize <= 0) {
- return result == 0 ? outputSize : result;
+ if (outputSize == -1) {
+ return result == 0 ? -1 : result;
}
result += consume(dst);
}
diff --git a/java/org/brotli/wrapper/dec/BrotliDecoderChannelTest.java b/java/org/brotli/wrapper/dec/BrotliDecoderChannelTest.java
index 71d8f68..b6fc036 100644..100755
--- a/java/org/brotli/wrapper/dec/BrotliDecoderChannelTest.java
+++ b/java/org/brotli/wrapper/dec/BrotliDecoderChannelTest.java
@@ -8,7 +8,6 @@ package org.brotli.wrapper.dec;
import static org.junit.Assert.assertEquals;
-import org.brotli.integration.BrotliJniTestBase;
import org.brotli.integration.BundleHelper;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
@@ -24,7 +23,13 @@ import org.junit.runners.AllTests;
/** Tests for {@link org.brotli.wrapper.dec.BrotliDecoderChannel}. */
@RunWith(AllTests.class)
-public class BrotliDecoderChannelTest extends BrotliJniTestBase {
+public class BrotliDecoderChannelTest {
+
+ // TODO: remove when Bazel get JNI support.
+ static {
+ System.load(new java.io.File(new java.io.File(System.getProperty("java.library.path")),
+ "liblibjni.so").getAbsolutePath());
+ }
static InputStream getBundle() throws IOException {
return new FileInputStream(System.getProperty("TEST_BUNDLE"));
diff --git a/java/org/brotli/wrapper/dec/BrotliInputStream.java b/java/org/brotli/wrapper/dec/BrotliInputStream.java
index 26f7a82..d1aa76b 100644..100755
--- a/java/org/brotli/wrapper/dec/BrotliInputStream.java
+++ b/java/org/brotli/wrapper/dec/BrotliInputStream.java
@@ -34,10 +34,6 @@ public class BrotliInputStream extends InputStream {
this(source, DEFAULT_BUFFER_SIZE);
}
- public void setEager(boolean eager) {
- decoder.setEager(eager);
- }
-
@Override
public void close() throws IOException {
decoder.close();
@@ -53,16 +49,7 @@ public class BrotliInputStream extends InputStream {
if (decoder.closed) {
throw new IOException("read after close");
}
- int decoded;
- // Iterate until at leat one byte is decoded, or EOF reached.
- while (true) {
- decoded = decoder.decode();
- if (decoded != 0) {
- break;
- }
- }
-
- if (decoded == -1) {
+ if (decoder.decode() == -1) {
return -1;
}
return decoder.buffer.get() & 0xFF;
diff --git a/java/org/brotli/wrapper/dec/BrotliInputStreamTest.java b/java/org/brotli/wrapper/dec/BrotliInputStreamTest.java
index 5da7115..aec26a0 100644..100755
--- a/java/org/brotli/wrapper/dec/BrotliInputStreamTest.java
+++ b/java/org/brotli/wrapper/dec/BrotliInputStreamTest.java
@@ -8,7 +8,6 @@ package org.brotli.wrapper.dec;
import static org.junit.Assert.assertEquals;
-import org.brotli.integration.BrotliJniTestBase;
import org.brotli.integration.BundleHelper;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
@@ -22,7 +21,13 @@ import org.junit.runners.AllTests;
/** Tests for {@link org.brotli.wrapper.dec.BrotliInputStream}. */
@RunWith(AllTests.class)
-public class BrotliInputStreamTest extends BrotliJniTestBase {
+public class BrotliInputStreamTest {
+
+ // TODO: remove when Bazel get JNI support.
+ static {
+ System.load(new java.io.File(new java.io.File(System.getProperty("java.library.path")),
+ "liblibjni.so").getAbsolutePath());
+ }
static InputStream getBundle() throws IOException {
return new FileInputStream(System.getProperty("TEST_BUNDLE"));
diff --git a/java/org/brotli/wrapper/dec/Decoder.java b/java/org/brotli/wrapper/dec/Decoder.java
index 548c14d..95060ae 100644..100755
--- a/java/org/brotli/wrapper/dec/Decoder.java
+++ b/java/org/brotli/wrapper/dec/Decoder.java
@@ -15,12 +15,10 @@ import java.util.ArrayList;
* Base class for InputStream / Channel implementations.
*/
public class Decoder {
- private static final ByteBuffer EMPTY_BUFER = ByteBuffer.allocate(0);
private final ReadableByteChannel source;
private final DecoderJNI.Wrapper decoder;
ByteBuffer buffer;
boolean closed;
- boolean eager;
/**
* Creates a Decoder wrapper.
@@ -49,10 +47,6 @@ public class Decoder {
throw new IOException(message);
}
- public void setEager(boolean eager) {
- this.eager = eager;
- }
-
/**
* Continue decoding.
*
@@ -77,22 +71,12 @@ public class Decoder {
break;
case NEEDS_MORE_INPUT:
- // In "eager" more pulling preempts pushing.
- if (eager && decoder.hasOutput()) {
- buffer = decoder.pull();
- break;
- }
ByteBuffer inputBuffer = decoder.getInputBuffer();
inputBuffer.clear();
int bytesRead = source.read(inputBuffer);
if (bytesRead == -1) {
fail("unexpected end of input");
}
- if (bytesRead == 0) {
- // No input data is currently available.
- buffer = EMPTY_BUFER;
- return 0;
- }
decoder.push(bytesRead);
break;
diff --git a/java/org/brotli/wrapper/dec/DecoderJNI.java b/java/org/brotli/wrapper/dec/DecoderJNI.java
index 320705c..3a59053 100644..100755
--- a/java/org/brotli/wrapper/dec/DecoderJNI.java
+++ b/java/org/brotli/wrapper/dec/DecoderJNI.java
@@ -12,13 +12,13 @@ import java.nio.ByteBuffer;
/**
* JNI wrapper for brotli decoder.
*/
-public class DecoderJNI {
+class DecoderJNI {
private static native ByteBuffer nativeCreate(long[] context);
private static native void nativePush(long[] context, int length);
private static native ByteBuffer nativePull(long[] context);
private static native void nativeDestroy(long[] context);
- public enum Status {
+ enum Status {
ERROR,
DONE,
NEEDS_MORE_INPUT,
@@ -26,12 +26,12 @@ public class DecoderJNI {
OK
};
- public static class Wrapper {
- private final long[] context = new long[3];
+ static class Wrapper {
+ private final long[] context = new long[2];
private final ByteBuffer inputBuffer;
private Status lastStatus = Status.NEEDS_MORE_INPUT;
- public Wrapper(int inputBufferSize) throws IOException {
+ Wrapper(int inputBufferSize) throws IOException {
this.context[1] = inputBufferSize;
this.inputBuffer = nativeCreate(this.context);
if (this.context[0] == 0) {
@@ -39,7 +39,7 @@ public class DecoderJNI {
}
}
- public void push(int length) {
+ void push(int length) {
if (length < 0) {
throw new IllegalArgumentException("negative block length");
}
@@ -71,23 +71,19 @@ public class DecoderJNI {
}
}
- public Status getStatus() {
+ Status getStatus() {
return lastStatus;
}
- public ByteBuffer getInputBuffer() {
+ ByteBuffer getInputBuffer() {
return inputBuffer;
}
- public boolean hasOutput() {
- return context[2] != 0;
- }
-
- public ByteBuffer pull() {
+ ByteBuffer pull() {
if (context[0] == 0) {
throw new IllegalStateException("brotli decoder is already destroyed");
}
- if (lastStatus != Status.NEEDS_MORE_OUTPUT && !hasOutput()) {
+ if (lastStatus != Status.NEEDS_MORE_OUTPUT) {
throw new IllegalStateException("pulling output from decoder in " + lastStatus + " state");
}
ByteBuffer result = nativePull(context);
@@ -98,7 +94,7 @@ public class DecoderJNI {
/**
* Releases native resources.
*/
- public void destroy() {
+ void destroy() {
if (context[0] == 0) {
throw new IllegalStateException("brotli decoder is already destroyed");
}
diff --git a/java/org/brotli/wrapper/dec/DecoderTest.java b/java/org/brotli/wrapper/dec/DecoderTest.java
index 74b77d3..0a8970f 100644..100755
--- a/java/org/brotli/wrapper/dec/DecoderTest.java
+++ b/java/org/brotli/wrapper/dec/DecoderTest.java
@@ -8,7 +8,6 @@ package org.brotli.wrapper.dec;
import static org.junit.Assert.assertEquals;
-import org.brotli.integration.BrotliJniTestBase;
import org.brotli.integration.BundleHelper;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
@@ -22,7 +21,13 @@ import org.junit.runners.AllTests;
/** Tests for {@link org.brotli.wrapper.dec.Decoder}. */
@RunWith(AllTests.class)
-public class DecoderTest extends BrotliJniTestBase {
+public class DecoderTest {
+
+ // TODO: remove when Bazel get JNI support.
+ static {
+ System.load(new java.io.File(new java.io.File(System.getProperty("java.library.path")),
+ "liblibjni.so").getAbsolutePath());
+ }
static InputStream getBundle() throws IOException {
return new FileInputStream(System.getProperty("TEST_BUNDLE"));
diff --git a/java/org/brotli/wrapper/dec/EagerStreamTest.java b/java/org/brotli/wrapper/dec/EagerStreamTest.java
deleted file mode 100755
index 9166092..0000000
--- a/java/org/brotli/wrapper/dec/EagerStreamTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/* Copyright 2017 Google Inc. All Rights Reserved.
-
- Distributed under MIT license.
- See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
-*/
-
-package org.brotli.wrapper.dec;
-
-import static org.junit.Assert.assertEquals;
-
-import org.brotli.integration.BrotliJniTestBase;
-import java.io.IOException;
-import java.io.InputStream;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for {@link org.brotli.wrapper.dec.BrotliInputStream}. */
-@RunWith(JUnit4.class)
-public class EagerStreamTest extends BrotliJniTestBase {
-
- @Test
- public void testEagerReading() throws IOException {
- final StringBuilder log = new StringBuilder();
- final byte[] data = {0, 0, 16, 42, 3};
- InputStream source = new InputStream() {
- int index;
-
- @Override
- public int read() {
- if (index < data.length) {
- log.append("<").append(index);
- return data[index++];
- } else {
- log.append("<#");
- return -1;
- }
- }
-
- @Override
- public int read(byte[] b) throws IOException {
- return read(b, 0, b.length);
- }
-
- @Override
- public int read(byte[] b, int off, int len) throws IOException {
- if (len < 1) {
- return 0;
- }
- int d = read();
- if (d == -1) {
- return 0;
- }
- b[off] = (byte) d;
- return 1;
- }
- };
- BrotliInputStream reader = new BrotliInputStream(source);
- reader.setEager(true);
- int count = 0;
- while (true) {
- log.append("^").append(count);
- int b = reader.read();
- if (b == -1) {
- log.append(">#");
- break;
- } else {
- log.append(">").append(count++);
- }
- }
- // Lazy log: ^0<0<1<2<3<4>0^1>#
- assertEquals("^0<0<1<2<3>0^1<4>#", log.toString());
- }
-
-}
diff --git a/java/org/brotli/wrapper/dec/decoder_jni.cc b/java/org/brotli/wrapper/dec/decoder_jni.cc
index 268a10b..19c022b 100644..100755
--- a/java/org/brotli/wrapper/dec/decoder_jni.cc
+++ b/java/org/brotli/wrapper/dec/decoder_jni.cc
@@ -45,11 +45,10 @@ Java_org_brotli_wrapper_dec_DecoderJNI_nativeCreate(
JNIEnv* env, jobject /*jobj*/, jlongArray ctx) {
bool ok = true;
DecoderHandle* handle = nullptr;
- jlong context[3];
- env->GetLongArrayRegion(ctx, 0, 3, context);
+ jlong context[2];
+ env->GetLongArrayRegion(ctx, 0, 2, context);
size_t input_size = context[1];
context[0] = 0;
- context[2] = 0;
handle = new (std::nothrow) DecoderHandle();
ok = !!handle;
@@ -80,7 +79,7 @@ Java_org_brotli_wrapper_dec_DecoderJNI_nativeCreate(
delete handle;
}
- env->SetLongArrayRegion(ctx, 0, 3, context);
+ env->SetLongArrayRegion(ctx, 0, 2, context);
if (!ok) {
return nullptr;
@@ -106,12 +105,11 @@ Java_org_brotli_wrapper_dec_DecoderJNI_nativeCreate(
JNIEXPORT void JNICALL
Java_org_brotli_wrapper_dec_DecoderJNI_nativePush(
JNIEnv* env, jobject /*jobj*/, jlongArray ctx, jint input_length) {
- jlong context[3];
- env->GetLongArrayRegion(ctx, 0, 3, context);
+ jlong context[2];
+ env->GetLongArrayRegion(ctx, 0, 2, context);
DecoderHandle* handle = getHandle(reinterpret_cast<void*>(context[0]));
context[1] = 0; /* ERROR */
- context[2] = 0;
- env->SetLongArrayRegion(ctx, 0, 3, context);
+ env->SetLongArrayRegion(ctx, 0, 2, context);
if (input_length != 0) {
/* Still have unconsumed data. Workflow is broken. */
@@ -147,8 +145,7 @@ Java_org_brotli_wrapper_dec_DecoderJNI_nativePush(
context[1] = 0;
break;
}
- context[2] = BrotliDecoderHasMoreOutput(handle->state) ? 1 : 0;
- env->SetLongArrayRegion(ctx, 0, 3, context);
+ env->SetLongArrayRegion(ctx, 0, 2, context);
}
/**
@@ -161,13 +158,12 @@ Java_org_brotli_wrapper_dec_DecoderJNI_nativePush(
JNIEXPORT jobject JNICALL
Java_org_brotli_wrapper_dec_DecoderJNI_nativePull(
JNIEnv* env, jobject /*jobj*/, jlongArray ctx) {
- jlong context[3];
- env->GetLongArrayRegion(ctx, 0, 3, context);
+ jlong context[2];
+ env->GetLongArrayRegion(ctx, 0, 2, context);
DecoderHandle* handle = getHandle(reinterpret_cast<void*>(context[0]));
size_t data_length = 0;
const uint8_t* data = BrotliDecoderTakeOutput(handle->state, &data_length);
- bool hasMoreOutput = !!BrotliDecoderHasMoreOutput(handle->state);
- if (hasMoreOutput) {
+ if (BrotliDecoderHasMoreOutput(handle->state)) {
context[1] = 3;
} else if (BrotliDecoderIsFinished(handle->state)) {
/* Bytes after stream end are not allowed. */
@@ -176,8 +172,7 @@ Java_org_brotli_wrapper_dec_DecoderJNI_nativePull(
/* Can proceed, or more data is required? */
context[1] = (handle->input_offset == handle->input_length) ? 2 : 4;
}
- context[2] = hasMoreOutput ? 1 : 0;
- env->SetLongArrayRegion(ctx, 0, 3, context);
+ env->SetLongArrayRegion(ctx, 0, 2, context);
return env->NewDirectByteBuffer(const_cast<uint8_t*>(data), data_length);
}
@@ -189,8 +184,8 @@ Java_org_brotli_wrapper_dec_DecoderJNI_nativePull(
JNIEXPORT void JNICALL
Java_org_brotli_wrapper_dec_DecoderJNI_nativeDestroy(
JNIEnv* env, jobject /*jobj*/, jlongArray ctx) {
- jlong context[3];
- env->GetLongArrayRegion(ctx, 0, 3, context);
+ jlong context[2];
+ env->GetLongArrayRegion(ctx, 0, 2, context);
DecoderHandle* handle = getHandle(reinterpret_cast<void*>(context[0]));
BrotliDecoderDestroyInstance(handle->state);
delete[] handle->input_start;
diff --git a/java/org/brotli/wrapper/enc/BUILD b/java/org/brotli/wrapper/enc/BUILD
index 42ad23e..39b1b37 100644..100755
--- a/java/org/brotli/wrapper/enc/BUILD
+++ b/java/org/brotli/wrapper/enc/BUILD
@@ -7,81 +7,73 @@ filegroup(
srcs = ["encoder_jni.cc"],
)
-filegroup(
- name = "brotli_jni",
- srcs = ["//:brotli_jni.dll"],
-)
-
+#########################################
+# WARNING: do not depend on this target!
+#########################################
java_library(
name = "enc",
srcs = glob(
["*.java"],
exclude = ["*Test*.java"],
),
-)
-
-java_library(
- name = "test_lib",
- testonly = 1,
- srcs = glob(["*Test*.java"]),
- deps = [
- ":enc",
- "//org/brotli/integration:brotli_jni_test_base",
- "//org/brotli/integration:bundle_helper",
- "//org/brotli/wrapper/dec",
- "@junit_junit//jar",
- ],
+ deps = ["//:jni"],
)
filegroup(
name = "test_bundle",
- srcs = ["//org/brotli/integration:test_corpus"],
+ srcs = ["//java/org/brotli/integration:test_corpus"],
)
java_test(
name = "BrotliEncoderChannelTest",
- test_class = "org.brotli.wrapper.enc.BrotliEncoderChannelTest",
size = "large",
+ srcs = ["BrotliEncoderChannelTest.java"],
data = [
- ":brotli_jni", # Bazel JNI workaround
":test_bundle",
+ "//:jni", # Bazel JNI workaround
],
- jvm_flags = [
- "-DBROTLI_JNI_LIBRARY=$(location :brotli_jni)",
- "-DTEST_BUNDLE=$(location :test_bundle)",
- ],
+ jvm_flags = ["-DTEST_BUNDLE=$(location :test_bundle)"],
shard_count = 15,
- runtime_deps = [":test_lib"],
+ deps = [
+ ":enc",
+ "//java/org/brotli/integration:bundle_helper",
+ "//java/org/brotli/wrapper/dec",
+ "@junit_junit//jar",
+ ],
)
java_test(
name = "BrotliOutputStreamTest",
- test_class = "org.brotli.wrapper.enc.BrotliOutputStreamTest",
size = "large",
+ srcs = ["BrotliOutputStreamTest.java"],
data = [
- ":brotli_jni", # Bazel JNI workaround
":test_bundle",
+ "//:jni", # Bazel JNI workaround
],
- jvm_flags = [
- "-DBROTLI_JNI_LIBRARY=$(location :brotli_jni)",
- "-DTEST_BUNDLE=$(location :test_bundle)",
- ],
+ jvm_flags = ["-DTEST_BUNDLE=$(location :test_bundle)"],
shard_count = 15,
- runtime_deps = [":test_lib"],
+ deps = [
+ ":enc",
+ "//java/org/brotli/integration:bundle_helper",
+ "//java/org/brotli/wrapper/dec",
+ "@junit_junit//jar",
+ ],
)
java_test(
name = "EncoderTest",
- test_class = "org.brotli.wrapper.enc.EncoderTest",
size = "large",
+ srcs = ["EncoderTest.java"],
data = [
- ":brotli_jni", # Bazel JNI workaround
":test_bundle",
+ "//:jni", # Bazel JNI workaround
],
- jvm_flags = [
- "-DBROTLI_JNI_LIBRARY=$(location :brotli_jni)",
- "-DTEST_BUNDLE=$(location :test_bundle)",
- ],
+ jvm_flags = ["-DTEST_BUNDLE=$(location :test_bundle)"],
shard_count = 15,
- runtime_deps = [":test_lib"],
+ deps = [
+ ":enc",
+ "//java/org/brotli/integration:bundle_helper",
+ "//java/org/brotli/wrapper/dec",
+ "@junit_junit//jar",
+ ],
)
diff --git a/java/org/brotli/wrapper/enc/BrotliEncoderChannel.java b/java/org/brotli/wrapper/enc/BrotliEncoderChannel.java
index 83fc3ec..83fc3ec 100644..100755
--- a/java/org/brotli/wrapper/enc/BrotliEncoderChannel.java
+++ b/java/org/brotli/wrapper/enc/BrotliEncoderChannel.java
diff --git a/java/org/brotli/wrapper/enc/BrotliEncoderChannelTest.java b/java/org/brotli/wrapper/enc/BrotliEncoderChannelTest.java
index 2492589..1ab7599 100644..100755
--- a/java/org/brotli/wrapper/enc/BrotliEncoderChannelTest.java
+++ b/java/org/brotli/wrapper/enc/BrotliEncoderChannelTest.java
@@ -2,7 +2,6 @@ package org.brotli.wrapper.enc;
import static org.junit.Assert.assertEquals;
-import org.brotli.integration.BrotliJniTestBase;
import org.brotli.integration.BundleHelper;
import org.brotli.wrapper.dec.BrotliInputStream;
import java.io.ByteArrayInputStream;
@@ -21,13 +20,19 @@ import org.junit.runners.AllTests;
/** Tests for {@link org.brotli.wrapper.enc.BrotliEncoderChannel}. */
@RunWith(AllTests.class)
-public class BrotliEncoderChannelTest extends BrotliJniTestBase {
+public class BrotliEncoderChannelTest {
private enum TestMode {
WRITE_ALL,
WRITE_CHUNKS
}
+ // TODO: remove when Bazel get JNI support.
+ static {
+ System.load(new java.io.File(new java.io.File(System.getProperty("java.library.path")),
+ "liblibjni.so").getAbsolutePath());
+ }
+
private static final int CHUNK_SIZE = 256;
static InputStream getBundle() throws IOException {
diff --git a/java/org/brotli/wrapper/enc/BrotliOutputStream.java b/java/org/brotli/wrapper/enc/BrotliOutputStream.java
index 5bd3957..5bd3957 100644..100755
--- a/java/org/brotli/wrapper/enc/BrotliOutputStream.java
+++ b/java/org/brotli/wrapper/enc/BrotliOutputStream.java
diff --git a/java/org/brotli/wrapper/enc/BrotliOutputStreamTest.java b/java/org/brotli/wrapper/enc/BrotliOutputStreamTest.java
index 699b4b2..a436e81 100644..100755
--- a/java/org/brotli/wrapper/enc/BrotliOutputStreamTest.java
+++ b/java/org/brotli/wrapper/enc/BrotliOutputStreamTest.java
@@ -2,7 +2,6 @@ package org.brotli.wrapper.enc;
import static org.junit.Assert.assertEquals;
-import org.brotli.integration.BrotliJniTestBase;
import org.brotli.integration.BundleHelper;
import org.brotli.wrapper.dec.BrotliInputStream;
import java.io.ByteArrayInputStream;
@@ -19,7 +18,7 @@ import org.junit.runners.AllTests;
/** Tests for {@link org.brotli.wrapper.enc.BrotliOutputStream}. */
@RunWith(AllTests.class)
-public class BrotliOutputStreamTest extends BrotliJniTestBase {
+public class BrotliOutputStreamTest {
private enum TestMode {
WRITE_ALL,
@@ -27,6 +26,12 @@ public class BrotliOutputStreamTest extends BrotliJniTestBase {
WRITE_BYTE
}
+ // TODO: remove when Bazel get JNI support.
+ static {
+ System.load(new java.io.File(new java.io.File(System.getProperty("java.library.path")),
+ "liblibjni.so").getAbsolutePath());
+ }
+
private static final int CHUNK_SIZE = 256;
static InputStream getBundle() throws IOException {
diff --git a/java/org/brotli/wrapper/enc/Encoder.java b/java/org/brotli/wrapper/enc/Encoder.java
index f35bc22..f35bc22 100644..100755
--- a/java/org/brotli/wrapper/enc/Encoder.java
+++ b/java/org/brotli/wrapper/enc/Encoder.java
diff --git a/java/org/brotli/wrapper/enc/EncoderJNI.java b/java/org/brotli/wrapper/enc/EncoderJNI.java
index 6627f5a..6627f5a 100644..100755
--- a/java/org/brotli/wrapper/enc/EncoderJNI.java
+++ b/java/org/brotli/wrapper/enc/EncoderJNI.java
diff --git a/java/org/brotli/wrapper/enc/EncoderTest.java b/java/org/brotli/wrapper/enc/EncoderTest.java
index 18ed647..0c26882 100644..100755
--- a/java/org/brotli/wrapper/enc/EncoderTest.java
+++ b/java/org/brotli/wrapper/enc/EncoderTest.java
@@ -2,7 +2,6 @@ package org.brotli.wrapper.enc;
import static org.junit.Assert.assertEquals;
-import org.brotli.integration.BrotliJniTestBase;
import org.brotli.integration.BundleHelper;
import org.brotli.wrapper.dec.BrotliInputStream;
import java.io.ByteArrayInputStream;
@@ -17,7 +16,14 @@ import org.junit.runners.AllTests;
/** Tests for {@link org.brotli.wrapper.enc.Encoder}. */
@RunWith(AllTests.class)
-public class EncoderTest extends BrotliJniTestBase {
+public class EncoderTest {
+
+ // TODO: remove when Bazel get JNI support.
+ static {
+ System.load(new java.io.File(new java.io.File(System.getProperty("java.library.path")),
+ "liblibjni.so").getAbsolutePath());
+ }
+
static InputStream getBundle() throws IOException {
return new FileInputStream(System.getProperty("TEST_BUNDLE"));
}
diff --git a/java/org/brotli/wrapper/enc/encoder_jni.cc b/java/org/brotli/wrapper/enc/encoder_jni.cc
index 5cde6df..5cde6df 100644..100755
--- a/java/org/brotli/wrapper/enc/encoder_jni.cc
+++ b/java/org/brotli/wrapper/enc/encoder_jni.cc
diff --git a/js/BUILD b/js/BUILD
index 49c1728..67088b1 100644..100755
--- a/js/BUILD
+++ b/js/BUILD
@@ -10,23 +10,16 @@ load("@io_bazel_rules_closure//closure:defs.bzl", "closure_js_library")
closure_js_library(
name = "polyfill",
srcs = ["polyfill.js"],
- suppress = [
- "JSC_INVALID_OPERAND_TYPE",
- "JSC_MISSING_JSDOC",
- "JSC_STRICT_INEXISTENT_PROPERTY",
- "JSC_TYPE_MISMATCH",
- "JSC_UNKNOWN_EXPR_TYPE",
- ],
+ language = "ECMASCRIPT6_STRICT",
+ suppress = ["JSC_MISSING_JSDOC"],
)
# Do NOT use this artifact; it is for test purposes only.
closure_js_library(
name = "decode",
srcs = ["decode.js"],
- suppress = [
- "JSC_DUP_VAR_DECLARATION",
- "JSC_USELESS_BLOCK",
- ],
+ language = "ECMASCRIPT6_STRICT",
+ suppress = ["JSC_USELESS_BLOCK"],
deps = [":polyfill"],
)
@@ -35,6 +28,7 @@ load("@io_bazel_rules_closure//closure:defs.bzl", "closure_js_test")
closure_js_test(
name = "all_tests",
srcs = ["decode_test.js"],
+ language = "ECMASCRIPT6_STRICT",
deps = [
":decode",
":polyfill",
diff --git a/js/WORKSPACE b/js/WORKSPACE
deleted file mode 100644
index b364e5f..0000000
--- a/js/WORKSPACE
+++ /dev/null
@@ -1,14 +0,0 @@
-workspace(name = "org_brotli_js")
-
-http_archive(
- name = "io_bazel_rules_closure",
- sha256 = "a80acb69c63d5f6437b099c111480a4493bad4592015af2127a2f49fb7512d8d",
- strip_prefix = "rules_closure-0.7.0",
- urls = [
- "https://mirror.bazel.build/github.com/bazelbuild/rules_closure/archive/0.7.0.tar.gz",
- "https://github.com/bazelbuild/rules_closure/archive/0.7.0.tar.gz",
- ],
-)
-
-load("@io_bazel_rules_closure//closure:defs.bzl", "closure_repositories")
-closure_repositories()
diff --git a/js/decode.js b/js/decode.js
index 864bc63..b786d66 100644..100755
--- a/js/decode.js
+++ b/js/decode.js
@@ -4,8 +4,8 @@
See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
*/
-/** @return {function(!Int8Array):!Int8Array} */
-function BrotliDecodeClosure() {
+/** @export */
+var BrotliDecode = (function() {
"use strict";
/** @type {!Int8Array} */
@@ -61,7 +61,7 @@ function BrotliDecodeClosure() {
/**
* @param {!State} s
* @param {!InputStream} input
- * @return {void}
+ * @return {!void}
*/
function initState(s, input) {
if (s.runningState != 0) {
@@ -80,7 +80,7 @@ function BrotliDecodeClosure() {
}
/**
* @param {!State} s
- * @return {void}
+ * @return {!void}
*/
function close(s) {
if (s.runningState == 0) {
@@ -116,7 +116,7 @@ function BrotliDecodeClosure() {
}
/**
* @param {!State} s
- * @return {void}
+ * @return {!void}
*/
function decodeMetaBlockLength(s) {
if (s.bitOffset >= 16) {
@@ -226,7 +226,7 @@ function BrotliDecodeClosure() {
/**
* @param {!Int32Array} v
* @param {!number} index
- * @return {void}
+ * @return {!void}
*/
function moveToFront(v, index) {
var /** !number */ value = v[index];
@@ -238,7 +238,7 @@ function BrotliDecodeClosure() {
/**
* @param {!Int8Array} v
* @param {!number} vLen
- * @return {void}
+ * @return {!void}
*/
function inverseMoveToFrontTransform(v, vLen) {
var /** !Int32Array */ mtf = new Int32Array(256);
@@ -258,7 +258,7 @@ function BrotliDecodeClosure() {
* @param {!number} numSymbols
* @param {!Int32Array} codeLengths
* @param {!State} s
- * @return {void}
+ * @return {!void}
*/
function readHuffmanCodeLengths(codeLengthCodeLengths, numSymbols, codeLengths, s) {
var /** !number */ symbol = 0;
@@ -343,7 +343,7 @@ function BrotliDecodeClosure() {
* @param {!Int32Array} table
* @param {!number} offset
* @param {!State} s
- * @return {void}
+ * @return {!void}
*/
function readHuffmanCode(alphabetSize, table, offset, s) {
var /** !number */ ok = 1;
@@ -517,7 +517,7 @@ function BrotliDecodeClosure() {
}
/**
* @param {!State} s
- * @return {void}
+ * @return {!void}
*/
function decodeLiteralBlockSwitch(s) {
s.literalBlockLength = decodeBlockTypeAndLength(s, 0, s.numLiteralBlockTypes);
@@ -531,7 +531,7 @@ function BrotliDecodeClosure() {
}
/**
* @param {!State} s
- * @return {void}
+ * @return {!void}
*/
function decodeCommandBlockSwitch(s) {
s.commandBlockLength = decodeBlockTypeAndLength(s, 1, s.numCommandBlockTypes);
@@ -539,7 +539,7 @@ function BrotliDecodeClosure() {
}
/**
* @param {!State} s
- * @return {void}
+ * @return {!void}
*/
function decodeDistanceBlockSwitch(s) {
s.distanceBlockLength = decodeBlockTypeAndLength(s, 2, s.numDistanceBlockTypes);
@@ -547,7 +547,7 @@ function BrotliDecodeClosure() {
}
/**
* @param {!State} s
- * @return {void}
+ * @return {!void}
*/
function maybeReallocateRingBuffer(s) {
var /** !number */ newSize = s.maxRingBufferSize;
@@ -573,7 +573,7 @@ function BrotliDecodeClosure() {
}
/**
* @param {!State} s
- * @return {void}
+ * @return {!void}
*/
function readNextMetablockHeader(s) {
if (s.inputEnd != 0) {
@@ -626,7 +626,7 @@ function BrotliDecodeClosure() {
}
/**
* @param {!State} s
- * @return {void}
+ * @return {!void}
*/
function readMetablockHuffmanCodesAndContextMaps(s) {
s.numLiteralBlockTypes = decodeVarLenUnsignedByte(s) + 1;
@@ -690,7 +690,7 @@ function BrotliDecodeClosure() {
}
/**
* @param {!State} s
- * @return {void}
+ * @return {!void}
*/
function copyUncompressedData(s) {
var /** !Int8Array */ ringBuffer = s.ringBuffer;
@@ -748,7 +748,7 @@ function BrotliDecodeClosure() {
}
/**
* @param {!State} s
- * @return {void}
+ * @return {!void}
*/
function decompress(s) {
if (s.runningState == 0) {
@@ -1044,7 +1044,7 @@ function BrotliDecodeClosure() {
* @param {!Int32Array} transforms
* @param {!string} prefixSuffixSrc
* @param {!string} transformsSrc
- * @return {void}
+ * @return {!void}
*/
function unpackTransforms(prefixSuffix, prefixSuffixHeads, transforms, prefixSuffixSrc, transformsSrc) {
var /** !number */ n = prefixSuffixSrc.length;
@@ -1142,7 +1142,7 @@ function BrotliDecodeClosure() {
* @param {!number} step
* @param {!number} end
* @param {!number} item
- * @return {void}
+ * @return {!void}
*/
function replicateValue(table, offset, step, end, item) {
do {
@@ -1174,7 +1174,7 @@ function BrotliDecodeClosure() {
* @param {!number} rootBits
* @param {!Int32Array} codeLengths
* @param {!number} codeLengthsSize
- * @return {void}
+ * @return {!void}
*/
function buildHuffmanTable(rootTable, tableOffset, rootBits, codeLengths, codeLengthsSize) {
var /** !number */ key;
@@ -1232,7 +1232,7 @@ function BrotliDecodeClosure() {
/**
* @param {!State} s
- * @return {void}
+ * @return {!void}
*/
function doReadMoreInput(s) {
if (s.endOfStreamReached != 0) {
@@ -1261,7 +1261,7 @@ function BrotliDecodeClosure() {
/**
* @param {!State} s
* @param {!number} endOfStream
- * @return {void}
+ * @return {!void}
*/
function checkHealth(s, endOfStream) {
if (s.endOfStreamReached == 0) {
@@ -1298,7 +1298,7 @@ function BrotliDecodeClosure() {
}
/**
* @param {!State} s
- * @return {void}
+ * @return {!void}
*/
function initBitReader(s) {
s.byteBuffer = new Int8Array(4160);
@@ -1311,7 +1311,7 @@ function BrotliDecodeClosure() {
}
/**
* @param {!State} s
- * @return {void}
+ * @return {!void}
*/
function prepare(s) {
if (s.halfOffset > 2030) {
@@ -1325,7 +1325,7 @@ function BrotliDecodeClosure() {
}
/**
* @param {!State} s
- * @return {void}
+ * @return {!void}
*/
function reload(s) {
if (s.bitOffset == 32) {
@@ -1334,7 +1334,7 @@ function BrotliDecodeClosure() {
}
/**
* @param {!State} s
- * @return {void}
+ * @return {!void}
*/
function jumpToByteBoundary(s) {
var /** !number */ padding = (32 - s.bitOffset) & 7;
@@ -1361,7 +1361,7 @@ function BrotliDecodeClosure() {
* @param {!Int8Array} data
* @param {!number} offset
* @param {!number} length
- * @return {void}
+ * @return {!void}
*/
function copyBytes(s, data, offset, length) {
if ((s.bitOffset & 7) != 0) {
@@ -1412,7 +1412,7 @@ function BrotliDecodeClosure() {
/**
* @param {!State} s
* @param {!number} byteLen
- * @return {void}
+ * @return {!void}
*/
function bytesToNibbles(s, byteLen) {
var /** !Int8Array */ byteBuffer = s.byteBuffer;
@@ -1428,7 +1428,7 @@ function BrotliDecodeClosure() {
* @param {!Int32Array} lookup
* @param {!string} map
* @param {!string} rle
- * @return {void}
+ * @return {!void}
*/
function unpackLookupTable(lookup, map, rle) {
for (var /** !number */ i = 0; i < 256; ++i) {
@@ -1603,7 +1603,7 @@ function BrotliDecodeClosure() {
* @param {!string} data0
* @param {!string} data1
* @param {!string} skipFlip
- * @return {void}
+ * @return {!void}
*/
function unpackDictionaryData(dictionary, data0, data1, skipFlip) {
var /** !number */ n0 = data0.length;
@@ -1708,9 +1708,6 @@ function BrotliDecodeClosure() {
}
return decode;
-}
-
-/** @export */
-var BrotliDecode = BrotliDecodeClosure();
+})();
window["BrotliDecode"] = BrotliDecode;
diff --git a/js/decode.min.js b/js/decode.min.js
index b079713..a9c6150 100755
--- a/js/decode.min.js
+++ b/js/decode.min.js
@@ -1 +1 @@
-function BrotliDecodeClosure(){"use strict";function e(e){this.data=e,this.offset=0}function t(e){if(e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),0==S(e,1))return 16;var t=S(e,3);return 0!=t?17+t:0!=(t=S(e,3))?8+t:17}function i(e,i){if(0!=e.l)throw"State MUST be uninitialized";e.h=new Int32Array(6480),e.input=i,z(e);var n=t(e);if(9==n)throw"Invalid 'windowBits' code";e.p=1<<n,e.u=e.p-16,e.l=1}function n(e){if(0==e.l)throw"State MUST be initialized";11!=e.l&&(e.l=11,null!=e.input&&(e.input,e.input=null))}function a(e){if(e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),0!=S(e,1)){var t=S(e,3);return 0==t?1:S(e,t)+(1<<t)}return 0}function o(e){if(e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),e.m=S(e,1),e.g=0,e.P=0,e.$=0,0==e.m||0==S(e,1)){var t=S(e,2)+4;if(7==t){if(e.$=1,0!=S(e,1))throw"Corrupted reserved bit";var i=S(e,2);if(0==i)return;for(n=0;n<i;n++){if(e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),0==(a=S(e,8))&&n+1==i&&i>1)throw"Exuberant nibble";e.g|=a<<8*n}}else for(var n=0;n<t;n++){e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16);var a=S(e,4);if(0==a&&n+1==t&&t>4)throw"Exuberant nibble";e.g|=a<<4*n}e.g++,0==e.m&&(e.P=S(e,1))}}function r(e,t,i){var n=i.i>>>i.t,a=e[t+=255&n]>>16,o=65535&e[t];return a<=8?(i.t+=a,o):(t+=o,t+=(n&(1<<a)-1)>>>8,i.t+=8+(e[t]>>16),65535&e[t])}function s(e,t,i){i.t>=16&&(i.i=i.o[i.s++]<<16|i.i>>>16,i.t-=16);var n=r(e,t,i),a=ee[n];return i.t>=16&&(i.i=i.o[i.s++]<<16|i.i>>>16,i.t-=16),Z[n]+(a<=16?S(i,a):E(i,a))}function l(e,t,i){return e<16?(i+=_[e],i&=3,t[i]+G[e]):e-16+1}function c(e,t){for(var i=e[t];t>0;t--)e[t]=e[t-1];e[0]=i}function d(e,t){for(var i=new Int32Array(256),n=0;n<256;n++)i[n]=n;for(n=0;n<t;n++){var a=255&e[n];e[n]=i[a],0!=a&&c(i,a)}}function h(e,t,i,n){var a=0,o=8,r=0,s=0,l=32768,c=new Int32Array(32);for(q(c,0,5,e,18);a<t&&l>0;){n.s>2030&&I(n),n.t>=16&&(n.i=n.o[n.s++]<<16|n.i>>>16,n.t-=16);var d=n.i>>>n.t&31;n.t+=c[d]>>16;var h=65535&c[d];if(h<16)r=0,i[a++]=h,0!=h&&(o=h,l-=32768>>h);else{var f=h-14,p=0;16==h&&(p=o),s!=p&&(r=0,s=p);var u=r;r>0&&(r-=2,r<<=f),n.t>=16&&(n.i=n.o[n.s++]<<16|n.i>>>16,n.t-=16);var m=(r+=S(n,f)+3)-u;if(a+m>t)throw"symbol + repeatDelta > numSymbols";for(var g=0;g<m;g++)i[a++]=s;0!=s&&(l-=m<<15-s)}}if(0!=l)throw"Unused space";i.fill(0,a,t)}function f(e,t){for(var i=0;i<t-1;++i)for(var n=i+1;n<t;++n)if(e[i]==e[n])return 0;return 1}function p(e,t,i,n){var a,o=1;n.s>2030&&I(n);var r=new Int32Array(e);if(n.t>=16&&(n.i=n.o[n.s++]<<16|n.i>>>16,n.t-=16),1==(a=S(n,2))){for(var s=e-1,l=0,c=new Int32Array(4),d=S(n,2)+1;0!=s;)s>>=1,l++;for(g=0;g<d;g++)n.t>=16&&(n.i=n.o[n.s++]<<16|n.i>>>16,n.t-=16),c[g]=S(n,l)%e,r[c[g]]=2;switch(r[c[0]]=1,d){case 2:r[c[1]]=1;break;case 4:1==S(n,1)?(r[c[2]]=3,r[c[3]]=3):r[c[0]]=2}o=f(c,d)}else{for(var p=new Int32Array(18),u=32,m=0,g=a;g<18&&u>0;g++){var P=W[g];n.t>=16&&(n.i=n.o[n.s++]<<16|n.i>>>16,n.t-=16);var $=n.i>>>n.t&15;n.t+=J[$]>>16;var b=65535&J[$];p[P]=b,0!=b&&(u-=32>>b,m++)}0!=u&&1!=m&&(o=0),h(p,e,r,n)}if(0==o)throw"Can't readHuffmanCode";q(t,i,8,r,e)}function u(e,t,i){i.s>2030&&I(i);var n=a(i)+1;if(1==n)return t.fill(0,0,e),n;i.t>=16&&(i.i=i.o[i.s++]<<16|i.i>>>16,i.t-=16);var o=0;0!=S(i,1)&&(o=S(i,4)+1);var s=new Int32Array(1080);p(n+o,s,0,i);for(var l=0;l<e;){i.s>2030&&I(i),i.t>=16&&(i.i=i.o[i.s++]<<16|i.i>>>16,i.t-=16);var c=r(s,0,i);if(0==c)t[l]=0,l++;else if(c<=o){i.t>=16&&(i.i=i.o[i.s++]<<16|i.i>>>16,i.t-=16);for(var h=(1<<c)+S(i,c);0!=h;){if(l>=e)throw"Corrupted context map";t[l]=0,l++,h--}}else t[l]=c-o,l++}return i.t>=16&&(i.i=i.o[i.s++]<<16|i.i>>>16,i.t-=16),1==S(i,1)&&d(t,e),n}function m(e,t,i){var n=e.v,a=4+2*t;e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16);var o=r(e.h,1080*t,e),l=s(e.h,1080*(t+3),e);return 1==o?o=n[a+1]+1:0==o?o=n[a]:o-=2,o>=i&&(o-=i),n[a]=n[a+1],n[a+1]=o,l}function g(e){e.X=m(e,0,e.Y);var t=e.v[5];e.k=t<<6,e.C=255&e.j[e.k],e.A=e.q[e.C];var i=e.I[t];e.T=i<<9,e.S=e.T+256}function P(e){e.D=m(e,1,e.F),e.N=e.B[e.v[7]]}function $(e){e.M=m(e,2,e.U),e.H=e.v[9]<<2}function b(e){var t=e.p;if(t>e.R){for(var i=e.R;t>>1>i;)t>>=1;0==e.m&&t<16384&&e.p>=16384&&(t=16384)}if(!(t<=e.O)){var n=t+37,a=new Int8Array(n);0!=e.L.length&&a.set(e.L.subarray(0,0+e.O),0),e.L=a,e.O=t}}function v(e){if(0!=e.m)return e.W=10,e._=e.G,e.J=0,void(e.l=12);e.q=new Int32Array(0),e.B=new Int32Array(0),e.V=new Int32Array(0),e.s>2030&&I(e),o(e),0==e.g&&0==e.$||(0!=e.P||0!=e.$?(N(e),e.l=0!=e.$?4:5):e.l=2,0==e.$&&(e.R+=e.g,e.R>1<<30&&(e.R=1<<30),e.O<e.p&&b(e)))}function y(e,t,i){return i<=1?1<<28:(p(i+2,e.h,1080*t,e),p(26,e.h,1080*(t+3),e),s(e.h,1080*(t+3),e))}function X(e){e.Y=a(e)+1,e.X=y(e,0,e.Y),e.F=a(e)+1,e.D=y(e,1,e.F),e.U=a(e)+1,e.M=y(e,2,e.U),e.s>2030&&I(e),e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),e.K=S(e,2),e.Z=16+(S(e,4)<<e.K),e.ee=(1<<e.K)-1;var t=e.Z+(48<<e.K);e.I=new Int8Array(e.Y);for(var i=0;i<e.Y;){for(var n=R(i+96,e.Y);i<n;++i)e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),e.I[i]=S(e,2);e.s>2030&&I(e)}e.j=new Int8Array(e.Y<<6);var o=u(e.Y<<6,e.j,e);e.te=1;for(var r=0;r<e.Y<<6;r++)if(e.j[r]!=r>>6){e.te=0;break}e.ie=new Int8Array(e.U<<2);var s=u(e.U<<2,e.ie,e);e.q=Q(256,o,e),e.B=Q(704,e.F,e),e.V=Q(t,s,e),e.k=0,e.H=0,e.T=e.I[0]<<9,e.S=e.T+256,e.C=0,e.A=e.q[0],e.N=e.B[0],e.v[4]=1,e.v[5]=0,e.v[6]=1,e.v[7]=0,e.v[8]=1,e.v[9]=0}function w(e){var t=e.L;if(e.g<=0)return F(e),void(e.l=1);var i=R(e.O-e.G,e.g);if(M(e,t,e.G,i),e.g-=i,e.G+=i,e.G==e.O)return e.W=5,e._=e.O,e.J=0,void(e.l=12);F(e),e.l=1}function Y(e){var t=R(e.ne-e.ae,e._-e.J);return 0!=t&&(e.oe.set(e.L.subarray(e.J,e.J+t),e.re+e.ae),e.ae+=t,e.J+=t),e.ae<e.ne?1:0}function Q(e,t,i){for(var n=new Int32Array(t+1080*t),a=t,o=0;o<t;o++)n[o]=a,p(e,n,a,i),a+=1080;return n}function k(e){if(0==e.l)throw"Can't decompress until initialized";if(11==e.l)throw"Can't decompress after close";for(var t=e.O-1,i=e.L;10!=e.l;)switch(e.l){case 1:if(e.g<0)throw"Invalid metablock length";v(e),t=e.O-1,i=e.L;continue;case 2:X(e),e.l=3;case 3:if(e.g<=0){e.l=1;continue}e.s>2030&&I(e),0==e.D&&P(e),e.D--,e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16);var n=r(e.B,e.N,e),a=n>>>6;e.se=0,a>=2&&(a-=2,e.se=-1);var o=oe[a]+(n>>>3&7);e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16);var s=ie[o],c=s<=16?S(e,s):E(e,s);e.le=te[o]+c;var d=re[a]+(7&n);e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16);var h=ae[d],f=h<=16?S(e,h):E(e,h);e.ce=ne[d]+f,e.de=0,e.l=6;case 6:if(0!=e.te){for(;e.de<e.le;)if(e.s>2030&&I(e),0==e.X&&g(e),e.X--,e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),i[e.G]=r(e.q,e.A,e),e.de++,e.G++==t){e.W=6,e._=e.O,e.J=0,e.l=12;break}}else for(var p=255&i[e.G-1&t],u=255&i[e.G-2&t];e.de<e.le;){e.s>2030&&I(e),0==e.X&&g(e);var m=255&e.j[e.k+(de[e.T+p]|de[e.S+u])];if(e.X--,u=p,e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),p=r(e.q,e.q[m],e),i[e.G]=p,e.de++,e.G++==t){e.W=6,e._=e.O,e.J=0,e.l=12;break}}if(6!=e.l)continue;if(e.g-=e.le,e.g<=0){e.l=3;continue}if(e.se<0&&(e.s>2030&&I(e),0==e.M&&$(e),e.M--,e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),e.se=r(e.V,e.V[255&e.ie[e.H+(e.ce>4?3:e.ce-2)]],e),e.se>=e.Z)){e.se-=e.Z;var b=e.se&e.ee;e.se>>>=e.K;var y=1+(e.se>>>1),Q=(2+(1&e.se)<<y)-4;e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16);var k=y<=16?S(e,y):E(e,y);e.se=e.Z+b+(Q+k<<e.K)}if(e.he=l(e.se,e.v,e.fe),e.he<0)throw"Negative distance";if(e.maxDistance!=e.u&&e.G<e.u?e.maxDistance=e.G:e.maxDistance=e.u,e.pe=e.G,e.he>e.maxDistance){e.l=9;continue}if(e.se>0&&(e.v[3&e.fe]=e.he,e.fe++),e.ce>e.g)throw"Invalid backward reference";e.de=0,e.l=7;case 7:var C=e.G-e.he&t,j=e.G,A=e.ce-e.de,q=C+A,z=j+A;if(q<t&&z<t){if(A<12||q>j&&z>C)for(var D=0;D<A;D+=4)i[j++]=i[C++],i[j++]=i[C++],i[j++]=i[C++],i[j++]=i[C++];else i.copyWithin(j,C,q);e.de+=A,e.g-=A,e.G+=A}else for(;e.de<e.ce;)if(i[e.G]=i[e.G-e.he&t],e.g--,e.de++,e.G++==t){e.W=7,e._=e.O,e.J=0,e.l=12;break}7==e.l&&(e.l=3);continue;case 9:if(!(e.ce>=4&&e.ce<=24))throw"Invalid backward reference";var Q=V[e.ce],F=e.he-e.maxDistance-1,B=K[e.ce],M=F>>>B;if(Q+=(F&(1<<B)-1)*e.ce,!(M<121))throw"Invalid backward reference";var U=x(i,e.pe,L,Q,e.ce,M);if(e.pe+=U,e.G+=U,e.g-=U,e.pe>=e.O){e.W=8,e._=e.O,e.J=0,e.l=12;continue}e.l=3;continue;case 8:i.copyWithin(0,e.O,e.pe),e.l=3;continue;case 4:for(;e.g>0;)e.s>2030&&I(e),e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),S(e,8),e.g--;e.l=1;continue;case 5:w(e);continue;case 12:if(0==Y(e))return;e.G>=e.u&&(e.maxDistance=e.u),e.G&=t,e.l=e.W;continue;default:throw"Unexpected state "+e.l}if(10==e.l){if(e.g<0)throw"Invalid metablock length";N(e),T(e,1)}}function x(e,t,i,n,a,o){for(var r=t,s=3*o,l=ce[se[s]],c=se[s+1],d=ce[se[s+2]];0!=le[l];)e[r++]=le[l++];var h=c>=12?c-11:0;h>a&&(h=a),n+=h,a-=h;for(var f=a-=c<=9?c:0;f>0;)e[r++]=i[n++],f--;if(11==c||10==c){var p=r-a;for(10==c&&(a=1);a>0;){var u=255&e[p];u<192?(u>=97&&u<=122&&(e[p]^=32),p+=1,a-=1):u<224?(e[p+1]^=32,p+=2,a-=2):(e[p+2]^=5,p+=3,a-=3)}}for(;0!=le[d];)e[r++]=le[d++];return r-t}function C(e,t){for(var i=1<<t-1;0!=(e&i);)i>>=1;return(e&i-1)+i}function j(e,t,i,n,a){do{e[t+(n-=i)]=a}while(n>0)}function A(e,t,i){for(var n=1<<t-i;t<15&&!((n-=e[t])<=0);)t++,n<<=1;return t-i}function q(e,t,i,n,a){var o,r,s=new Int32Array(a),l=new Int32Array(16),c=new Int32Array(16);for(r=0;r<a;r++)l[n[r]]++;c[1]=0;for(p=1;p<15;p++)c[p+1]=c[p]+l[p];for(r=0;r<a;r++)0!=n[r]&&(s[c[n[r]]++]=r);var d=i,h=1<<d,f=h;if(1!=c[15]){o=0,r=0;for(var p=1,u=2;p<=i;p++,u<<=1)for(;l[p]>0;l[p]--)j(e,t+o,u,h,p<<16|s[r++]),o=C(o,p);for(var m=f-1,g=-1,P=t,p=i+1,u=2;p<=15;p++,u<<=1)for(;l[p]>0;l[p]--)(o&m)!=g&&(P+=h,f+=h=1<<(d=A(l,p,i)),e[t+(g=o&m)]=d+i<<16|P-t-g),j(e,P+(o>>i),u,h,p-i<<16|s[r++]),o=C(o,p)}else for(o=0;o<f;o++)e[t+o]=s[0]}function I(e){if(0!=e.ue){if(B(e)>=-2)return;throw"No more input"}var t=e.s<<1,i=4096-t;for(e.me.copyWithin(0,t,4096),e.s=0;i<4096;){var n=4096-i,a=O(e.input,e.me,i,n);if(a<=0){e.ue=1,e.ge=i,i+=1;break}i+=a}U(e,i)}function T(e,t){if(0!=e.ue){var i=(e.s<<1)+(e.t+7>>3)-4;if(i>e.ge)throw"Read after end";if(0!=t&&i!=e.ge)throw"Unused bytes after end"}}function S(e,t){var i=e.i>>>e.t&(1<<t)-1;return e.t+=t,i}function E(e,t){var i=S(e,16);return e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16,i|S(e,t-16)<<16}function z(e){e.me=new Int8Array(4160),e.i=0,e.o=new Int16Array(2080),e.t=32,e.s=2048,e.ue=0,D(e)}function D(e){e.s>2030&&I(e),T(e,0),e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16,e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16}function F(e){32==e.t&&D(e)}function N(e){var t=32-e.t&7;if(0!=t&&0!=S(e,t))throw"Corrupted padding bits"}function B(e){var t=2048;return 0!=e.ue&&(t=e.ge+1>>1),t-e.s}function M(e,t,i,n){if(0!=(7&e.t))throw"Unaligned copyBytes";for(;32!=e.t&&0!=n;)t[i++]=e.i>>>e.t,e.t+=8,n--;if(0!=n){var a=R(B(e),n>>1);if(a>0){var o=e.s<<1,r=a<<1;t.set(e.me.subarray(o,o+r),i),i+=r,n-=r,e.s+=a}if(0!=n)if(B(e)>0){for(e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16);0!=n;)t[i++]=e.i>>>e.t,e.t+=8,n--;T(e,0)}else for(;n>0;){var s=O(e.input,t,i,n);if(-1==s)throw"Unexpected end of input";i+=s,n-=s}}}function U(e,t){for(var i=e.me,n=t>>1,a=e.o,o=0;o<n;++o)a[o]=255&i[2*o]|(255&i[2*o+1])<<8}function H(){this.L=new Int8Array(0),this.I=new Int8Array(0),this.j=new Int8Array(0),this.ie=new Int8Array(0),this.oe=new Int8Array(0),this.me=new Int8Array(0),this.o=new Int16Array(0),this.Pe=new Int32Array(0),this.v=new Int32Array(0),this.h=new Int32Array(0),this.q=new Int32Array(0),this.B=new Int32Array(0),this.V=new Int32Array(0),this.l=0,this.W=0,this.i=0,this.t=0,this.s=0,this.ge=0,this.ue=0,this.g=0,this.m=0,this.P=0,this.$=0,this.X=0,this.Y=0,this.D=0,this.F=0,this.M=0,this.U=0,this.G=0,this.maxDistance=0,this.fe=0,this.te=0,this.C=0,this.A=0,this.de=0,this.le=0,this.k=0,this.H=0,this.T=0,this.S=0,this.N=0,this.se=0,this.Z=0,this.ee=0,this.K=0,this.he=0,this.ce=0,this.pe=0,this.u=0,this.p=0,this.O=0,this.R=0,this.re=0,this.ne=0,this.ae=0,this.J=0,this._=0,this.input=null,this.L=new Int8Array(0),this.v=new Int32Array(10),this.v[0]=16,this.v[1]=15,this.v[2]=11,this.v[3]=4}function R(e,t){return e<=t?e:t}function O(e,t,i,n){if(null==e)return-1;var a=R(e.offset+n,e.data.length),o=a-e.offset;return t.set(e.data.subarray(e.offset,a),i),e.offset+=o,o}var L=new Int8Array(0),W=Int32Array.from([1,2,3,4,0,5,17,6,16,7,8,9,10,11,12,13,14,15]),_=Int32Array.from([3,2,1,0,3,3,3,3,3,3,2,2,2,2,2,2]),G=Int32Array.from([0,0,0,0,-1,1,-2,2,-3,3,-1,1,-2,2,-3,3]),J=Int32Array.from([131072,131076,131075,196610,131072,131076,131075,262145,131072,131076,131075,196610,131072,131076,131075,262149]),V=Int32Array.from([0,0,0,0,0,4096,9216,21504,35840,44032,53248,63488,74752,87040,93696,100864,104704,106752,108928,113536,115968,118528,119872,121280,122016]),K=Int32Array.from([0,0,0,0,10,10,11,11,10,10,10,10,10,9,9,8,7,7,8,7,7,6,6,5,5]),Z=Int32Array.from([1,5,9,13,17,25,33,41,49,65,81,97,113,145,177,209,241,305,369,497,753,1265,2289,4337,8433,16625]),ee=Int32Array.from([2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,7,8,9,10,11,12,13,24]),te=Int32Array.from([0,1,2,3,4,5,6,8,10,14,18,26,34,50,66,98,130,194,322,578,1090,2114,6210,22594]),ie=Int32Array.from([0,0,0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,7,8,9,10,12,14,24]),ne=Int32Array.from([2,3,4,5,6,7,8,9,10,12,14,18,22,30,38,54,70,102,134,198,326,582,1094,2118]),ae=Int32Array.from([0,0,0,0,0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,7,8,9,10,24]),oe=Int32Array.from([0,0,8,8,0,16,8,16,16]),re=Int32Array.from([0,8,0,8,16,0,16,8,16]),se=new Int32Array(363),le=new Int8Array(217),ce=new Int32Array(51);!function(e,t,i,n,a){for(var o=n.length,r=1,s=0;s<o;++s){var l=n.charCodeAt(s);e[s]=l,35==l&&(t[r++]=s+1,e[s]=0)}for(s=0;s<363;++s)i[s]=a.charCodeAt(s)-32}(le,ce,se,'# #s #, #e #.# the #.com/#\xc2\xa0# of # and # in # to #"#">#\n#]# for # a # that #. # with #\'# from # by #. The # on # as # is #ing #\n\t#:#ed #(# at #ly #="# of the #. This #,# not #er #al #=\'#ful #ive #less #est #ize #ous #'," !! ! , *! &! \" ! ) * * - ! # ! #!*! + ,$ ! - % . / # 0 1 . \" 2 3!* 4% ! # / 5 6 7 8 0 1 & $ 9 + : ; < ' != > ?! 4 @ 4 2 & A *# ( B C& ) % ) !*# *-% A +! *. D! %' & E *6 F G% ! *A *% H! D I!+! J!+ K +- *4! A L!*4 M N +6 O!*% +.! K *G P +%( ! G *D +D Q +# *K!*G!+D!+# +G +A +4!+% +K!+4!*D!+K!*K");var de=new Int32Array(2048);!function(e,t,i){for(s=0;s<256;++s)e[s]=63&s,e[512+s]=s>>2,e[1792+s]=2+(s>>6);for(s=0;s<128;++s)e[1024+s]=4*(t.charCodeAt(s)-32);for(s=0;s<64;++s)e[1152+s]=1&s,e[1216+s]=2+(1&s);for(var n=1280,a=0;a<19;++a)for(var o=3&a,r=i.charCodeAt(a)-32,s=0;s<r;++s)e[n++]=o;for(s=0;s<16;++s)e[1792+s]=1,e[2032+s]=6;e[1792]=0,e[2047]=7;for(s=0;s<256;++s)e[1536+s]=e[1792+s]<<3}(de," !! ! \"#$##%#$&'##(#)#++++++++++((&*'##,---,---,-----,-----,-----&#'###.///.///./////./////./////&#'# ","A/* ': & : $ \x81 @");var he=new Int8Array(122784);return function(e,t,i,n){var a=t.length,o=i.length;if(a+o!=e.length)throw"Corrupted brotli dictionary";for(var r=0,s=0;s<a;++s)e[r]=t.charCodeAt(s),r++;for(s=0;s<o;++s)e[r]=i.charCodeAt(s),r++;r=0;for(var l=n.length,s=0;s<l;s+=2){var c=n.charCodeAt(s)-36,d=n.charCodeAt(s+1)-36;r+=c;for(var h=0;h<d;++h)e[r]=128|e[r],r++}}(he,'timedownlifeleftbackcodedatashowonlysitecityopenjustlikefreeworktextyearoverbodyloveformbookplaylivelinehelphomesidemorewordlongthemviewfindpagedaysfullheadtermeachareafromtruemarkableuponhighdatelandnewsevennextcasebothpostusedmadehandherewhatnameLinkblogsizebaseheldmakemainuser\') +holdendswithNewsreadweresigntakehavegameseencallpathwellplusmenufilmpartjointhislistgoodneedwayswestjobsmindalsologorichuseslastteamarmyfoodkingwilleastwardbestfirePageknowaway.pngmovethanloadgiveselfnotemuchfeedmanyrockicononcelookhidediedHomerulehostajaxinfoclublawslesshalfsomesuchzone100%onescareTimeracebluefourweekfacehopegavehardlostwhenparkkeptpassshiproomHTMLplanTypedonesavekeepflaglinksoldfivetookratetownjumpthusdarkcardfilefearstaykillthatfallautoever.comtalkshopvotedeepmoderestturnbornbandfellroseurl(skinrolecomeactsagesmeetgold.jpgitemvaryfeltthensenddropViewcopy1.0"</a>stopelseliestourpack.gifpastcss?graymean&gt;rideshotlatesaidroadvar feeljohnrickportfast\'UA-dead</b>poorbilltypeU.S.woodmust2px;Inforankwidewantwalllead[0];paulwavesure$(\'#waitmassarmsgoesgainlangpaid!-- lockunitrootwalkfirmwifexml"songtest20pxkindrowstoolfontmailsafestarmapscorerainflowbabyspansays4px;6px;artsfootrealwikiheatsteptriporg/lakeweaktoldFormcastfansbankveryrunsjulytask1px;goalgrewslowedgeid="sets5px;.js?40pxif (soonseatnonetubezerosentreedfactintogiftharm18pxcamehillboldzoomvoideasyringfillpeakinitcost3px;jacktagsbitsrolleditknewnear\x3c!--growJSONdutyNamesaleyou lotspainjazzcoldeyesfishwww.risktabsprev10pxrise25pxBlueding300,ballfordearnwildbox.fairlackverspairjunetechif(!pickevil$("#warmlorddoespull,000ideadrawhugespotfundburnhrefcellkeystickhourlossfuel12pxsuitdealRSS"agedgreyGET"easeaimsgirlaids8px;navygridtips#999warsladycars); }php?helltallwhomzh:e*/\r\n 100hall.\n\nA7px;pushchat0px;crew*/</hash75pxflatrare && tellcampontolaidmissskiptentfinemalegetsplot400,\r\n\r\ncoolfeet.php<br>ericmostguidbelldeschairmathatom/img&#82luckcent000;tinygonehtmlselldrugFREEnodenick?id=losenullvastwindRSS wearrelybeensamedukenasacapewishgulfT23:hitsslotgatekickblurthey15px\'\'););">msiewinsbirdsortbetaseekT18:ordstreemall60pxfarmb\0\x19sboys[0].\');"POSTbearkids);}}marytend(UK)quadzh:f-siz----prop\');\rliftT19:viceandydebt>RSSpoolneckblowT16:doorevalT17:letsfailoralpollnovacolsgene b\0\x14softrometillross<h3>pourfadepink<tr>mini)|!(minezh:hbarshear00);milk --\x3eironfreddiskwentsoilputs/js/holyT22:ISBNT20:adamsees<h2>json\', \'contT21: RSSloopasiamoon</p>soulLINEfortcartT14:<h1>80px!--<9px;T04:mike:46ZniceinchYorkricezh:d\'));puremageparatonebond:37Z_of_\']);000,zh:gtankyardbowlbush:56ZJava30px\n|}\n%C3%:34ZjeffEXPIcashvisagolfsnowzh:iquer.csssickmeatmin.binddellhirepicsrent:36ZHTTP-201fotowolfEND xbox:54ZBODYdick;\n}\nexit:35Zvarsbeat\'});diet999;anne}}</[i].LangkmB2wiretoysaddssealalex;\n\t}echonine.org005)tonyjewssandlegsroof000) 200winegeardogsbootgarycutstyletemption.xmlcockgang$(\'.50pxPh.Dmiscalanloandeskmileryanunixdisc);}\ndustclip).\n\n70px-200DVDs7]><tapedemoi++)wageeurophiloptsholeFAQsasin-26TlabspetsURL bulkcook;}\r\nHEAD[0])abbrjuan(198leshtwin</i>sonyguysfuckpipe|-\n!002)ndow[1];[];\nLog salt\r\n\t\tbangtrimbath){\r\n00px\n});ko:lfeesad>\rs:// [];tollplug(){\n{\r\n .js\'200pdualboat.JPG);\n}quot);\n\n\');\n\r\n}\r201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037201320122011201020092008200720062005200420032002200120001999199819971996199519941993199219911990198919881987198619851984198319821981198019791978197719761975197419731972197119701969196819671966196519641963196219611960195919581957195619551954195319521951195010001024139400009999comomC!sesteestaperotodohacecadaaC1obiendC-aasC-vidacasootroforosolootracualdijosidograntipotemadebealgoquC)estonadatrespococasabajotodasinoaguapuesunosantediceluisellamayozonaamorpisoobraclicellodioshoracasiP7P0P=P0P>P<Q\0P0Q\0Q\x03Q\x02P0P=P5P?P>P>Q\x02P8P7P=P>P4P>Q\x02P>P6P5P>P=P8Q\x05P\x1dP0P5P5P1Q\vP<Q\vP\x12Q\vQ\x01P>P2Q\vP2P>P\x1dP>P>P1P\x1fP>P;P8P=P8P P$P\x1dP5P\x1cQ\vQ\x02Q\vP\x1eP=P8P<P4P0P\x17P0P\x14P0P\x1dQ\x03P\x1eP1Q\x02P5P\x18P7P5P9P=Q\x03P<P<P"Q\vQ\x03P6Y\x01Y\nX#Y\x06Y\x05X\'Y\x05X9Y\x03Y\x04X#Y\bX1X/Y\nX\'Y\x01Y\tY\x07Y\bY\x04Y\x05Y\x04Y\x03X\'Y\bY\x04Y\x07X(X3X\'Y\x04X%Y\x06Y\x07Y\nX#Y\nY\x02X/Y\x07Y\x04X+Y\x05X(Y\x07Y\x04Y\bY\x04Y\nX(Y\x04X\'Y\nX(Y\x03X4Y\nX\'Y\x05X#Y\x05Y\x06X*X(Y\nY\x04Y\x06X-X(Y\x07Y\x05Y\x05X4Y\bX4firstvideolightworldmediawhitecloseblackrightsmallbooksplacemusicfieldorderpointvalueleveltableboardhousegroupworksyearsstatetodaywaterstartstyledeathpowerphonenighterrorinputabouttermstitletoolseventlocaltimeslargewordsgamesshortspacefocusclearmodelblockguideradiosharewomenagainmoneyimagenamesyounglineslatercolorgreenfront&amp;watchforcepricerulesbeginaftervisitissueareasbelowindextotalhourslabelprintpressbuiltlinksspeedstudytradefoundsenseundershownformsrangeaddedstillmovedtakenaboveflashfixedoftenotherviewschecklegalriveritemsquickshapehumanexistgoingmoviethirdbasicpeacestagewidthloginideaswrotepagesusersdrivestorebreaksouthvoicesitesmonthwherebuildwhichearthforumthreesportpartyClicklowerlivesclasslayerentrystoryusagesoundcourtyour birthpopuptypesapplyImagebeinguppernoteseveryshowsmeansextramatchtrackknownearlybegansuperpapernorthlearngivennamedendedTermspartsGroupbrandusingwomanfalsereadyaudiotakeswhile.com/livedcasesdailychildgreatjudgethoseunitsneverbroadcoastcoverapplefilescyclesceneplansclickwritequeenpieceemailframeolderphotolimitcachecivilscaleenterthemetheretouchboundroyalaskedwholesincestock namefaithheartemptyofferscopeownedmightalbumthinkbloodarraymajortrustcanonunioncountvalidstoneStyleLoginhappyoccurleft:freshquitefilmsgradeneedsurbanfightbasishoverauto;route.htmlmixedfinalYour slidetopicbrownalonedrawnsplitreachRightdatesmarchquotegoodsLinksdoubtasyncthumballowchiefyouthnovel10px;serveuntilhandsCheckSpacequeryjamesequaltwice0,000Startpanelsongsroundeightshiftworthpostsleadsweeksavoidthesemilesplanesmartalphaplantmarksratesplaysclaimsalestextsstarswrong</h3>thing.org/multiheardPowerstandtokensolid(thisbringshipsstafftriedcallsfullyfactsagentThis //--\x3eadminegyptEvent15px;Emailtrue"crossspentblogsbox">notedleavechinasizesguest</h4>robotheavytrue,sevengrandcrimesignsawaredancephase>\x3c!--en_US&#39;200px_namelatinenjoyajax.ationsmithU.S. holdspeterindianav">chainscorecomesdoingpriorShare1990sromanlistsjapanfallstrialowneragree</h2>abusealertopera"-//WcardshillsteamsPhototruthclean.php?saintmetallouismeantproofbriefrow">genretrucklooksValueFrame.net/--\x3e\n<try {\nvar makescostsplainadultquesttrainlaborhelpscausemagicmotortheir250pxleaststepsCountcouldglasssidesfundshotelawardmouthmovesparisgivesdutchtexasfruitnull,||[];top">\n\x3c!--POST"ocean<br/>floorspeakdepth sizebankscatchchart20px;aligndealswould50px;url="parksmouseMost ...</amongbrainbody none;basedcarrydraftreferpage_home.meterdelaydreamprovejoint</tr>drugs\x3c!-- aprilidealallenexactforthcodeslogicView seemsblankports (200saved_linkgoalsgrantgreekhomesringsrated30px;whoseparse();" Blocklinuxjonespixel\');">);if(-leftdavidhorseFocusraiseboxesTrackement</em>bar">.src=toweralt="cablehenry24px;setupitalysharpminortastewantsthis.resetwheelgirls/css/100%;clubsstuffbiblevotes 1000korea});\r\nbandsqueue= {};80px;cking{\r\n\t\taheadclockirishlike ratiostatsForm"yahoo)[0];Aboutfinds</h1>debugtasksURL =cells})();12px;primetellsturns0x600.jpg"spainbeachtaxesmicroangel--\x3e</giftssteve-linkbody.});\n\tmount (199FAQ</rogerfrankClass28px;feeds<h1><scotttests22px;drink) || lewisshall#039; for lovedwaste00px;ja:c\x02simon<fontreplymeetsuntercheaptightBrand) != dressclipsroomsonkeymobilmain.Name platefunnytreescom/"1.jpgwmodeparamSTARTleft idden, 201);\n}\nform.viruschairtransworstPagesitionpatch\x3c!--\no-cacfirmstours,000 asiani++){adobe\')[0]id=10both;menu .2.mi.png"kevincoachChildbruce2.jpgURL)+.jpg|suitesliceharry120" sweettr>\r\nname=diegopage swiss--\x3e\n\n#fff;">Log.com"treatsheet) && 14px;sleepntentfiledja:c\x03id="cName"worseshots-box-delta\n&lt;bears:48Z<data-rural</a> spendbakershops= "";php">ction13px;brianhellosize=o=%2F joinmaybe<img img">, fjsimg" ")[0]MTopBType"newlyDanskczechtrailknows</h5>faq">zh-cn10);\n-1");type=bluestrulydavis.js\';>\r\n<!steel you h2>\r\nform jesus100% menu.\r\n\t\r\nwalesrisksumentddingb-likteachgif" vegasdanskeestishqipsuomisobredesdeentretodospuedeaC1osestC!tienehastaotrospartedondenuevohacerformamismomejormundoaquC-dC-assC3loayudafechatodastantomenosdatosotrassitiomuchoahoralugarmayorestoshorastenerantesfotosestaspaC-snuevasaludforosmedioquienmesespoderchileserC!vecesdecirjosC)estarventagrupohechoellostengoamigocosasnivelgentemismaairesjuliotemashaciafavorjuniolibrepuntobuenoautorabrilbuenatextomarzosaberlistaluegocC3moenerojuegoperC:haberestoynuncamujervalorfueralibrogustaigualvotoscasosguC-apuedosomosavisousteddebennochebuscafaltaeurosseriedichocursoclavecasasleC3nplazolargoobrasvistaapoyojuntotratavistocrearcampohemoscincocargopisosordenhacenC!readiscopedrocercapuedapapelmenorC:tilclarojorgecalleponertardenadiemarcasigueellassiglocochemotosmadreclaserestoniC1oquedapasarbancohijosviajepabloC)stevienereinodejarfondocanalnorteletracausatomarmanoslunesautosvillavendopesartipostengamarcollevapadreunidovamoszonasambosbandamariaabusomuchasubirriojavivirgradochicaallC-jovendichaestantalessalirsuelopesosfinesllamabuscoC)stalleganegroplazahumorpagarjuntadobleislasbolsabaC1ohablaluchaC\x01readicenjugarnotasvalleallC!cargadolorabajoestC)gustomentemariofirmacostofichaplatahogarartesleyesaquelmuseobasespocosmitadcielochicomiedoganarsantoetapadebesplayaredessietecortecoreadudasdeseoviejodeseaaguas&quot;domaincommonstatuseventsmastersystemactionbannerremovescrollupdateglobalmediumfilternumberchangeresultpublicscreenchoosenormaltravelissuessourcetargetspringmodulemobileswitchphotosborderregionitselfsocialactivecolumnrecordfollowtitle>eitherlengthfamilyfriendlayoutauthorcreatereviewsummerserverplayedplayerexpandpolicyformatdoublepointsseriespersonlivingdesignmonthsforcesuniqueweightpeopleenergynaturesearchfigurehavingcustomoffsetletterwindowsubmitrendergroupsuploadhealthmethodvideosschoolfutureshadowdebatevaluesObjectothersrightsleaguechromesimplenoticesharedendingseasonreportonlinesquarebuttonimagesenablemovinglatestwinterFranceperiodstrongrepeatLondondetailformeddemandsecurepassedtoggleplacesdevicestaticcitiesstreamyellowattackstreetflighthiddeninfo">openedusefulvalleycausesleadersecretseconddamagesportsexceptratingsignedthingseffectfieldsstatesofficevisualeditorvolumeReportmuseummoviesparentaccessmostlymother" id="marketgroundchancesurveybeforesymbolmomentspeechmotioninsidematterCenterobjectexistsmiddleEuropegrowthlegacymannerenoughcareeransweroriginportalclientselectrandomclosedtopicscomingfatheroptionsimplyraisedescapechosenchurchdefinereasoncorneroutputmemoryiframepolicemodelsNumberduringoffersstyleskilledlistedcalledsilvermargindeletebetterbrowselimitsGlobalsinglewidgetcenterbudgetnowrapcreditclaimsenginesafetychoicespirit-stylespreadmakingneededrussiapleaseextentScriptbrokenallowschargedividefactormember-basedtheoryconfigaroundworkedhelpedChurchimpactshouldalwayslogo" bottomlist">){var prefixorangeHeader.push(couplegardenbridgelaunchReviewtakingvisionlittledatingButtonbeautythemesforgotSearchanchoralmostloadedChangereturnstringreloadMobileincomesupplySourceordersviewed&nbsp;courseAbout island<html cookiename="amazonmodernadvicein</a>: The dialoghousesBEGIN MexicostartscentreheightaddingIslandassetsEmpireSchooleffortdirectnearlymanualSelect.\n\nOnejoinedmenu">PhilipawardshandleimportOfficeregardskillsnationSportsdegreeweekly (e.g.behinddoctorloggedunited</b></beginsplantsassistartistissued300px|canadaagencyschemeremainBrazilsamplelogo">beyond-scaleacceptservedmarineFootercamera</h1>\n_form"leavesstress" />\r\n.gif" onloadloaderOxfordsistersurvivlistenfemaleDesignsize="appealtext">levelsthankshigherforcedanimalanyoneAfricaagreedrecentPeople<br />wonderpricesturned|| {};main">inlinesundaywrap">failedcensusminutebeaconquotes150px|estateremoteemail"linkedright;signalformal1.htmlsignupprincefloat:.png" forum.AccesspaperssoundsextendHeightsliderUTF-8"&amp; Before. WithstudioownersmanageprofitjQueryannualparamsboughtfamousgooglelongeri++) {israelsayingdecidehome">headerensurebranchpiecesblock;statedtop"><racingresize--&gt;pacitysexualbureau.jpg" 10,000obtaintitlesamount, Inc.comedymenu" lyricstoday.indeedcounty_logo.FamilylookedMarketlse ifPlayerturkey);var forestgivingerrorsDomain}else{insertBlog</footerlogin.fasteragents<body 10px 0pragmafridayjuniordollarplacedcoversplugin5,000 page">boston.test(avatartested_countforumsschemaindex,filledsharesreaderalert(appearSubmitline">body">\n* TheThoughseeingjerseyNews</verifyexpertinjurywidth=CookieSTART across_imagethreadnativepocketbox">\nSystem DavidcancertablesprovedApril reallydriveritem">more">boardscolorscampusfirst || [];media.guitarfinishwidth:showedOther .php" assumelayerswilsonstoresreliefswedenCustomeasily your String\n\nWhiltaylorclear:resortfrenchthough") + "<body>buyingbrandsMembername">oppingsector5px;">vspacepostermajor coffeemartinmaturehappen</nav>kansaslink">Images=falsewhile hspace0&amp; \n\nIn powerPolski-colorjordanBottomStart -count2.htmlnews">01.jpgOnline-rightmillerseniorISBN 00,000 guidesvalue)ectionrepair.xml" rights.html-blockregExp:hoverwithinvirginphones</tr>\rusing \n\tvar >\');\n\t</td>\n</tr>\nbahasabrasilgalegomagyarpolskisrpskiX1X/Y\bd8-f\x16\x07g.\0d=\x13g9\x01i+\x14d?!f\x01/d8-e\x1b=f\b\x11d;,d8\0d8*e\x05,e\x0f8g.!g\x10\x06h.:e\x1d\x1be\x0f/d;%f\x1c\re\n!f\x176i\x174d8*d::d:\'e\x13\x01h\x07*e71d<\x01d8\x1af\x1f%g\x1c\ve7%d=\x1ch\x01\x14g3;f2!f\x1c\tg=\x11g+\x19f\t\0f\x1c\th/\x04h.:d8-e?\x03f\x16\x07g+ g\x14(f\b7i&\x16i!5d=\x1ch\0\x05f\n\0f\x1c/i\x17.i"\x18g\x1b8e\x053d8\vh==f\x10\x1cg4"d=?g\x14(h=/d;6e\x1c(g:?d8;i"\x18h5\x04f\x16\x19h\'\x06i"\x11e\x1b\x1ee$\rf3(e\x06\fg=\x11g;\x1cf\x146h\x17\x0fe\x06\x05e.9f\x0e(h\r\x10e8\x02e\x1c:f6\bf\x01/g):i\x174e\x0f\x11e8\x03d;\0d9\be%=e\x0f\vg\x14\x1ff4;e\x1b>g\t\x07e\x0f\x11e1\x15e&\x02f\x1e\x1cf\t\vf\x1c:f\x160i\x17;f\x1c\0f\x160f\x169e<\x0fe\f\x17d:,f\x0f\x10d>\x1be\x053d:\x0ef\x1b4e$\x1ah?\x19d8*g3;g;\x1fg\x1f%i\x01\x13f88f\b\x0fe9?e\x11\ne\x056d;\x16e\x0f\x11h!(e.\te\x05(g,,d8\0d<\x1ae\x11\x18h?\x1bh!\fg\x029e\x07;g\t\bf\x1d\x03g\x145e-\x10d8\x16g\x15\fh.>h.!e\x05\rh49f\x15\x19h\x022e\n e\x05%f4;e\n(d;\x16d;,e\x15\x06e\x13\x01e\r\x1ae."g\x0e0e\x1c(d8\nf57e&\x02d=\x15e72g;\x0fg\x15\x19h(\0h/&g;\x06g$>e\f:g\x19;e=\x15f\x1c,g+\x19i\x1c\0h&\x01d;7f <f\x14/f\f\x01e\x1b=i\x19\x05i\x13>f\x0e%e\x1b=e.6e;:h.>f\x1c\ve\x0f\vi\x18\x05h/;f3\x15e>\vd=\rg=.g;\x0ff5\x0ei\0\tf\v)h?\x19f 7e=\x13e\t\re\b\x06g1;f\x0e\x12h!\fe\x1b d8:d:$f\x18\x13f\x1c\0e\x10\x0ei\x1f3d9\x10d8\rh\x03=i\0\x1ah?\x07h!\fd8\x1ag\'\x11f\n\0e\x0f/h\x03=h.>e$\x07e\x10\bd=\x1ce$\'e.6g$>d<\x1ag \x14g)6d8\x13d8\x1ae\x05(i\x03(i!9g\x1b.h?\x19i\x07\fh?\x18f\x18/e<\0e\'\vf\x03\x05e\x065g\x145h\x04\x11f\x16\x07d;6e\x13\x01g\t\fe8.e\n)f\x16\x07e\f\x16h5\x04f:\x10e$\'e-&e-&d9 e\x1c0e\x1d\0f5\x0fh\'\bf\n\x15h5\x04e7%g(\vh&\x01f1\x02f\0\x0ed9\bf\x176e\0\x19e\n\x1fh\x03=d8;h&\x01g\x1b.e\t\rh5\x04h./e\x1f\x0ee8\x02f\x169f3\x15g\x145e=1f\v\x1bh\x01\x18e#0f\x18\x0ed;;d=\x15e\x01%e:7f\x150f\r.g>\x0ee\x1b=f1=h=&d;\vg;\rd=\x06f\x18/d:$f5\x01g\x14\x1fd:\'f\t\0d;%g\x145h/\x1df\x18>g$:d8\0d:\x1be\r\x15d=\rd::e\x11\x18e\b\x06f\x1e\x10e\x1c0e\x1b>f\x17\x05f88e7%e\x057e-&g\x14\x1fg3;e\b\x17g=\x11e\x0f\ve8\x16e-\x10e/\x06g \x01i"\x11i\x01\x13f\x0e\'e\b6e\x1c0e\f:e\x1f:f\x1c,e\x05(e\x1b=g=\x11d8\ni\x07\rh&\x01g,,d:\fe\x16\x1cf,"h?\x1be\x05%e\x0f\vf\x03\x05h?\x19d:\x1bh\0\x03h/\x15e\x0f\x11g\x0e0e\x1f9h.-d;%d8\nf\x14?e:\x1cf\b\x10d8:g\x0e/e"\x03i&\x19f8/e\x10\ff\x176e(1d9\x10e\x0f\x11i\0\x01d8\0e.\x1ae<\0e\x0f\x11d=\x1ce\x13\x01f \x07e\x07\x06f,"h?\x0eh\'#e\x063e\x1c0f\x169d8\0d8\vd;%e\x0f\nh4#d;;f\b\x16h\0\x05e."f\b7d;#h!(g\'/e\b\x06e%3d::f\x150g \x01i\x14\0e\x14.e\x07:g\x0e0g&;g:?e:\x14g\x14(e\b\x17h!(d8\re\x10\fg<\x16h>\x11g;\x1fh.!f\x1f%h/"d8\rh&\x01f\x1c\te\x053f\x1c:f\x1e\x04e>\be$\x1af\x12-f\x14>g;\x04g;\x07f\x14?g-\x16g\x1b4f\x0e%h\x03=e\n\x1bf\x1d%f:\x10f\x19\x02i\x16\x13g\x1c\ve\b0g\x03-i\x17(e\x053i\x14.d8\x13e\f:i\x1d\x1ee88h\v1h/-g\x19>e:&e8\ff\x1c\x1bg>\x0ee%3f/\x14h>\x03g\x1f%h/\x06h\'\x04e.\x1ae;:h..i\x03(i\x17(f\x04\x0fh\'\x01g2>e=)f\x17%f\x1c,f\x0f\x10i+\x18e\x0f\x11h(\0f\x169i\x1d"e\x1f:i\x07\x11e$\x04g\x10\x06f\x1d\x03i\x19\x10e=1g\t\x07i\x136h!\fh?\x18f\x1c\te\b\x06d:+g\t)e\x13\x01g;\x0fh\x10%f7;e\n d8\x13e.6h?\x19g\'\rh/\x1di"\x18h57f\x1d%d8\x1ae\n!e\x05,e\x11\nh.0e=\x15g.\0d;\vh4(i\x07\x0fg\x147d::e=1e\x13\re<\x15g\x14(f\n%e\x11\ni\x03(e\b\x06e?+i\0\x1fe\x12(h/"f\x176e0\x1af3(f\x04\x0fg\x143h/7e-&f !e:\x14h/%e\x0e\x06e\x0f2e\x0f*f\x18/h?\x14e\x1b\x1eh4-d90e\x10\rg\'0d8:d:\x06f\b\x10e\n\x1fh/4f\x18\x0ed>\x1be:\x14e-)e-\x10d8\x13i"\x18g(\ve:\x0fd8\0h\b,f\x1c\x03e\x13!e\x0f*f\x1c\te\x056e.\x03d?\x1df\n$h\0\fd8\x14d;\ne$)g*\x17e\x0f#e\n(f\0\x01g\n6f\0\x01g\t9e\b+h.$d8:e?\x05i!;f\x1b4f\x160e0\x0fh/4f\b\x11e\0\x11d=\x1cd8:e*\x12d=\x13e\f\x05f\v,i\x02#d9\bd8\0f 7e\x1b=e\x06\x05f\x18/e\x10&f 9f\r.g\x145h\'\x06e-&i\x19"e\x057f\x1c\th?\x07g(\vg\x141d:\x0ed::f\t\re\x07:f\x1d%d8\rh?\x07f-#e\x1c(f\x18\x0ef\x18\x1ff\x15\x05d:\ve\x053g3;f \x07i"\x18e\x15\x06e\n!h>\x13e\x05%d8\0g\x1b4e\x1f:g!\0f\x15\x19e-&d:\x06h\'#e;:g-\x11g;\x13f\x1e\x1ce\x05(g\x10\x03i\0\x1ag\x1f%h.!e\b\x12e/9d:\x0eh\t:f\x1c/g\x1b8e\x06\fe\x0f\x11g\x14\x1fg\x1c\x1fg\x1a\x04e;:g+\vg-\tg:\'g1;e\x1e\vg;\x0fi*\fe.\x1eg\x0e0e\b6d=\x1cf\x1d%h\x07*f \x07g->d;%d8\ve\x0e\x1fe\b\x1bf\x17 f3\x15e\x056d8-e\0\vd::d8\0e\b\x07f\f\x07e\r\x17e\x053i\x17-i\x1b\x06e\x1b"g,,d8\te\x053f3(e\x1b f-$g\x05\'g\t\x07f71e\x1c3e\x15\x06d8\x1ae9?e7\x1ef\x17%f\x1c\x1fi+\x18g:\'f\x1c\0h?\x11g;<e\x10\bh!(g$:d8\x13h>\x11h!\fd8:d:$i\0\x1ah/\x04d;7h\'\te>\x17g2>e\r\x0ee.6e:-e.\ff\b\x10f\x04\x1fh\'\te.\th#\x05e>\x17e\b0i\x02.d;6e\b6e:&i#\x1fe\x13\x01h\x19=g\x046h=,h==f\n%d;7h.0h\0\x05f\x169f!\bh!\ff\x14?d::f0\x11g\x14(e\x13\x01d8\x1ch%?f\x0f\x10e\x07:i\x05\x12e:\x17g\x046e\x10\x0ed;\x18f,>g\x03-g\x029d;%e\t\re.\fe\x05(e\x0f\x11e8\x16h.>g=.i"\x06e/<e7%d8\x1ae\f;i\x19"g\x1c\vg\x1c\vg;\x0fe\x058e\x0e\x1fe\x1b e93e\x0f0e\x10\x04g\'\re"\x1ee\n f\x1d\x10f\x16\x19f\x160e"\x1ed9\ve\x10\x0eh\x01\fd8\x1af\x15\bf\x1e\x1cd;\ne94h.:f\x16\x07f\b\x11e\x1b=e\x11\nh/\tg\t\bd8;d?.f\x149e\x0f\x02d8\x0ef\t\x13e\r0e?+d9\x10f\x1c:f"0h\'\x02g\x029e-\x18e\x1c(g2>g%\x1eh\x0e7e>\x17e\b)g\x14(g;\'g;-d= d;,h?\x19d9\bf(!e<\x0fh/-h(\0h\x03=e$\x1fi\x1b\x05h\x19\x0ef\x13\rd=\x1ci#\x0ef <d8\0h57g\'\x11e-&d=\x13h\x022g\x1f-d?!f\x1d!d;6f2;g\x16\x17h?\x10e\n(d:\'d8\x1ad<\x1ah..e/<h\b*e\x05\bg\x14\x1fh\x01\x14g\x1b\x1fe\x0f/f\x18/e\x15\x0fi!\fg;\x13f\x1e\x04d=\x1cg\x14(h0\x03f\x1f%h3\x07f\x16\x19h\x07*e\n(h4\x1fh4#e\x06\x1cd8\x1ah.?i\x17.e.\x1ef\x16=f\x0e%e\x0f\x17h.(h.:i\x02#d8*e\x0f\ri&\be\n e<:e%3f\0\'h\f\x03e\x1b4f\x1c\re\v\x19d<\x11i\x172d;\nf\x17%e."f\x1c\rh\'\0g\x1c\ve\x0f\x02e\n g\x1a\x04h/\x1dd8\0g\x029d?\x1dh/\x01e\x1b>d9&f\x1c\tf\x15\bf5\vh/\x15g\';e\n(f\t\rh\x03=e\x063e.\x1ah\x02!g%(d8\rf\x16-i\x1c\0f1\x02d8\re>\x17e\n\x1ef3\x15d9\vi\x174i\x07\x07g\x14(h\x10%i\x14\0f\n\x15h/\tg\x1b.f \x07g\b1f\x03\x05f\x11\x04e=1f\x1c\td:\x1bh$\x07h#=f\x16\x07e-&f\x1c:d<\x1af\x150e-\x17h#\x05d?.h4-g\t)e\x06\x1cf\x1d\x11e\x05(i\x1d"g2>e\x13\x01e\x056e.\x1ed:\vf\x03\x05f04e93f\x0f\x10g$:d8\ne8\x02h0"h0"f\x19.i\0\x1af\x15\x19e8\bd8\nd< g1;e\b+f-\ff\x1b2f\v%f\x1c\te\b\x1bf\x160i\x05\rd;6e\x0f*h&\x01f\x176d;#h3\x07h(\nh>>e\b0d::g\x14\x1fh."i\x18\x05h\0\x01e8\be1\x15g$:e?\x03g\x10\x06h44e-\x10g62g+\x19d8;i!\fh\x07*g\x046g:\'e\b+g.\0e\r\x15f\x149i\x1d)i\x02#d:\x1bf\x1d%h/4f\t\x13e<\0d;#g \x01e\b i\x19$h/\x01e\b8h\n\x02g\x1b.i\x07\rg\x029f,!f\x158e$\x1ae0\x11h\'\x04e\b\x12h5\x04i\x07\x11f\t>e\b0d;%e\x10\x0ee$\'e\x05(d8;i!5f\x1c\0d=3e\x1b\x1eg-\x14e$)d8\vd?\x1di\x1a\x1cg\x0e0d;#f#\0f\x1f%f\n\x15g%(e0\x0ff\x176f2\x12f\x1c\tf-#e88g\x14\x1ah\x073d;#g\x10\x06g\x1b.e=\x15e\x05,e<\0e$\re\b6i\x07\x11h\x1e\re98g&\x0fg\t\bf\x1c,e="f\b\x10e\x07\x06e$\x07h!\ff\x03\x05e\x1b\x1ee\b0f\0\x1df\x033f\0\x0ef 7e\r\x0fh..h.$h/\x01f\x1c\0e%=d:\'g\x14\x1ff\f\tg\x05\'f\x1c\rh#\x05e9?d8\x1ce\n(f<+i\x07\x07h4-f\x160f\t\vg;\x04e\x1b>i\x1d"f\x1d?e\x0f\x02h\0\x03f\x14?f2;e.9f\x18\x13e$)e\x1c0e\n*e\n\x1bd::d;,e\r\x07g:\'i\0\x1fe:&d::g\t)h0\x03f\x154f5\x01h!\fi\0 f\b\x10f\x16\x07e-\x17i\x1f)e\x1b=h48f\x18\x13e<\0e1\x15g\x1b8i\x17\x1ch!(g\x0e0e=1h\'\x06e&\x02f-$g>\x0ee.9e$\'e0\x0ff\n%i\x01\x13f\x1d!f,>e?\x03f\x03\x05h.8e$\x1af3\x15h\'\x04e.6e1\x05d9&e:\x17h?\x1ef\x0e%g+\ve\r3d8>f\n%f\n\0e7\'e%%h?\x10g\x19;e\x05%d;%f\x1d%g\x10\x06h.:d:\vd;6h\x07*g\x141d8-e\r\x0ee\n\x1ee\x05,e&\be&\bg\x1c\x1ff-#d8\ri\x14\x19e\x05(f\x16\x07e\x10\be\x10\fd;7e\0<e\b+d::g\x1b\x11g\x1d#e\x057d=\x13d8\x16g:*e\x1b"i\x18\x1fe\b\x1bd8\x1af\t?f\v\x05e"\x1ei\x15?f\x1c\td::d?\x1df\f\x01e\x15\x06e.6g;4d?.e\x0f0f9>e7&e\x0f3h\x02!d;=g-\x14f!\be.\x1ei\x19\x05g\x145d?!g;\x0fg\x10\x06g\x14\x1fe\x11=e.#d< d;;e\n!f-#e<\x0fg\t9h\t2d8\vf\x1d%e\r\x0fd<\x1ae\x0f*h\x03=e=\x13g\x046i\x07\rf\x160e\x05\'e.9f\f\x07e/<h?\x10h!\ff\x17%e?\x17h3#e.6h6\x05h?\x07e\x1c\x1fe\x1c0f5\x19f1\x1ff\x14/d;\x18f\x0e(e\x07:g+\x19i\x15?f\x1d-e7\x1ef\t\'h!\fe\b6i\0 d9\vd8\0f\x0e(e9?g\x0e0e\x1c:f\x0f\x0fh?0e\x0f\x18e\f\x16d< g;\x1ff-\ff\t\vd?\x1di\x19)h/>g(\ve\f;g\x16\x17g;\x0fh?\x07h?\x07e\x0e;d9\ve\t\rf\x146e\x05%e94e:&f\x1d\x02e?\x17g>\x0ed8=f\x1c\0i+\x18g\x19;i\x19\x06f\x1c*f\x1d%e\n e7%e\x05\rh4#f\x15\x19g(\vg\t\be\x1d\x17h:+d=\x13i\x07\re:\x06e\x07:e\x14.f\b\x10f\x1c,e="e<\x0fe\x1c\x1fh1\x06e\x07:e\x039d8\x1cf\x169i\x02.g.1e\r\x17d:,f1\x02h\x01\fe\x0f\x16e>\x17h\x01\fd=\rg\x1b8d?!i!5i\x1d"e\b\x06i\x12\x1fg=\x11i!5g!.e.\x1ae\x1b>d>\vg=\x11e\x1d\0g\'/f\x1e\x01i\x14\x19h//g\x1b.g\x1a\x04e.\x1dh4\x1df\x1c:e\x053i#\x0ei\x19)f\x0e\bf\x1d\x03g\x17\x05f/\x12e. g\t)i\x19$d:\x06h)\x15h+\x16g\x16>g\x17\x05e\x0f\nf\x176f1\x02h4-g+\x19g\x029e\x04?g+%f/\x0fe$)d8-e$.h.$h/\x06f/\x0fd8*e$)f4%e-\x17d=\x13e\x0f0g\x01#g;4f\n$f\x1c,i!5d8*f\0\'e.\x18f\x169e88h\'\x01g\x1b8f\x1c:f\b\x18g\x15%e:\x14e=\x13e>\ve8\bf\x169d>?f !e\x1b-h\x02!e8\x02f\b?e1\vf \x0fg\x1b.e\x11\x18e7%e/<h\x074g*\x01g\x046i\x01\x13e\x057f\x1c,g=\x11g;\x13e\x10\bf!#f!\be\n3e\n(e\x0f&e$\x16g>\x0ee\x05\x03e<\x15h57f\x149e\x0f\x18g,,e\x1b\x1bd<\x1ah.!h**f\x18\x0ei\x1a\x10g\'\x01e.\x1de.\x1dh\'\x04h\f\x03f6\bh49e\x051e\x10\fe?\x18h.0d=\x13g3;e8&f\x1d%e\x10\re-\x17g\x19<h!(e<\0f\x14>e\n g\x1b\x1fe\x0f\x17e\b0d:\ff\t\ve$\'i\x07\x0ff\b\x10d::f\x150i\x07\x0fe\x051d:+e\f:e\x1f\x1fe%3e-)e\x0e\x1fe\b\x19f\t\0e\x1c(g;\x13f\x1d\x1fi\0\x1ad?!h6\x05g:\'i\x05\rg=.e=\x13f\x176d<\x18g\'\0f\0\'f\x04\x1ff\b?d:\'i\x01\nf\b2e\x07:e\x0f#f\x0f\x10d:$e01d8\x1ad?\x1de\x01%g(\ve:&e\x0f\x02f\x150d:\vd8\x1af\x154d8*e11d8\x1cf\x03\x05f\x04\x1fg\t9f.\ne\b\x06i!\x1ef\x10\x1ce0\ve1\x1ed:\x0ei\x17(f\b7h4"e\n!e#0i\x1f3e\x0f\ne\x056h4"g;\x0fe\x1d\x1af\f\x01e92i\x03(f\b\x10g+\ve\b)g\x1b\nh\0\x03h\x19\x11f\b\x10i\x03=e\f\x05h#\x05g\x14(f\b6f/\x14h5\x1bf\x16\x07f\x18\x0ef\v\x1be\x15\x06e.\ff\x154g\x1c\x1ff\x18/g\x1c<g\x1d\x1bd<\x19d<4e(\x01f\x1c\x1bi"\x06e\x1f\x1fe\r+g\x14\x1fd<\x18f\x03 h+\x16e#\x07e\x05,e\x051h\t/e%=e\x05\x05e\b\x06g,&e\x10\bi\x19\x04d;6g\t9g\x029d8\re\x0f/h\v1f\x16\x07h5\x04d:\'f 9f\x1c,f\x18\x0ef\x18>e/\x06g"<e\x05,d<\x17f0\x11f\x17\x0ff\x1b4e\n d:+e\x0f\x17e\x10\fe-&e\x10/e\n(i\0\x02e\x10\be\x0e\x1ff\x1d%i\x17.g-\x14f\x1c,f\x16\x07g>\x0ei#\x1fg;?h\t2g(3e.\x1ag;\bd:\x0eg\x14\x1fg\t)d>\x1bf1\x02f\x10\x1cg\v\x10e\n\x1bi\x07\x0fd8%i\x07\rf08h?\x1ce\x06\x19g\x1c\x1ff\x1c\ti\x19\x10g+\x1ed:\te/9h1!h49g\x14(d8\re%=g;\x1de/9e\r\x01e\b\x06d?\x03h?\x1bg\x029h/\x04e=1i\x1f3d<\x18e\n?d8\re0\x11f,#h5\x0fe96d8\x14f\x1c\tg\x029f\x169e\x10\x11e\x05(f\x160d?!g\x14(h.>f\x16=e="h1!h5\x04f <g*\x01g 4i\x1a\x0fg\x1d\0i\x07\re$\'d:\x0ef\x18/f/\x15d8\x1af\x19:h\x03=e\f\x16e7%e.\fg>\x0ee\x15\x06e\x1f\x0eg;\x1fd8\0e\x07:g\t\bf\t\x13i\0 g\x14"e\x13\x01f&\x02e\x065g\x14(d:\x0ed?\x1dg\x15\x19e\x1b g4 d8-e\x1c\ve-\x18e\x02(h44e\x1b>f\x1c\0f\x04\x1bi\x15?f\x1c\x1fe\x0f#d;7g\x10\x06h4"e\x1f:e\x1c0e.\tf\x0e\x12f-&f1\ti\x07\fi\x1d"e\b\x1be;:e$)g):i&\x16e\x05\be.\fe\x16\x04i)1e\n(d8\vi\x1d"d8\re\x06\rh/\x1ad?!f\x04\x0fd9\ti\x183e\x05\th\v1e\x1b=f<\x02d:.e\x06\x1bd:\vg\x0e)e.6g>$d<\x17e\x06\x1cf0\x11e\r3e\x0f/e\x10\rg(1e.6e\x057e\n(g\x14;f\x033e\b0f3(f\x18\x0ee0\x0fe-&f\0\'h\x03=h\0\x03g \x14g!,d;6h\'\x02g\x1c\vf8\x05f%\x1af\x10\x1eg,\x11i&\x16i \x01i;\x04i\x07\x11i\0\x02g\x14(f1\x1fh\v\x0fg\x1c\x1fe.\x1ed8;g.!i\x186f.5h(;e\x06\ng?;h/\x11f\x1d\x03e\b)e\x01\x1ae%=d<<d9\x0ei\0\x1ah./f\x16=e7%g\v\0f\x05\vd9\x1fh.8g\x0e/d?\x1de\x1f9e\x05;f&\x02e?5e$\'e\x1e\vf\x1c:g%(g\x10\x06h\'#e\f?e\x10\rcuandoenviarmadridbuscariniciotiempoporquecuentaestadopuedenjuegoscontraestC!nnombretienenperfilmaneraamigosciudadcentroaunquepuedesdentroprimerpreciosegC:nbuenosvolverpuntossemanahabC-aagostonuevosunidoscarlosequiponiC1osmuchosalgunacorreoimagenpartirarribamarC-ahombreempleoverdadcambiomuchasfueronpasadolC-neaparecenuevascursosestabaquierolibroscuantoaccesomiguelvarioscuatrotienesgruposserC!neuropamediosfrenteacercademC!sofertacochesmodeloitalialetrasalgC:ncompracualesexistecuerposiendoprensallegarviajesdineromurciapodrC!puestodiariopuebloquieremanuelpropiocrisisciertoseguromuertefuentecerrargrandeefectopartesmedidapropiaofrecetierrae-mailvariasformasfuturoobjetoseguirriesgonormasmismosC:nicocaminositiosrazC3ndebidopruebatoledotenC-ajesC:sesperococinaorigentiendacientocC!dizhablarserC-alatinafuerzaestiloguerraentrarC)xitolC3pezagendavC-deoevitarpaginametrosjavierpadresfC!cilcabezaC!reassalidaenvC-ojapC3nabusosbienestextosllevarpuedanfuertecomC:nclaseshumanotenidobilbaounidadestC!seditarcreadoP4P;Q\x0fQ\x07Q\x02P>P:P0P:P8P;P8Q\rQ\x02P>P2Q\x01P5P5P3P>P?Q\0P8Q\x02P0P:P5Q\tP5Q\x03P6P5P\x1aP0P:P1P5P7P1Q\vP;P>P=P8P\x12Q\x01P5P?P>P4P-Q\x02P>Q\x02P>P<Q\x07P5P<P=P5Q\x02P;P5Q\x02Q\0P0P7P>P=P0P3P4P5P<P=P5P\x14P;Q\x0fP\x1fQ\0P8P=P0Q\x01P=P8Q\x05Q\x02P5P<P:Q\x02P>P3P>P4P2P>Q\x02Q\x02P0P<P!P(P\x10P<P0Q\x0fP\'Q\x02P>P2P0Q\x01P2P0P<P5P<Q\x03P"P0P:P4P2P0P=P0P<Q\rQ\x02P8Q\rQ\x02Q\x03P\x12P0P<Q\x02P5Q\x05P?Q\0P>Q\x02Q\x03Q\x02P=P0P4P4P=Q\x0fP\x12P>Q\x02Q\x02Q\0P8P=P5P9P\x12P0Q\x01P=P8P<Q\x01P0P<Q\x02P>Q\x02Q\0Q\x03P1P\x1eP=P8P<P8Q\0P=P5P5P\x1eP\x1eP\x1eP;P8Q\x06Q\rQ\x02P0P\x1eP=P0P=P5P<P4P>P<P<P>P9P4P2P5P>P=P>Q\x01Q\x03P4`$\x15`%\x07`$9`%\b`$\x15`%\0`$8`%\x07`$\x15`$>`$\x15`%\v`$\x14`$0`$*`$0`$(`%\x07`$\x0f`$\x15`$\x15`$?`$-`%\0`$\x07`$8`$\x15`$0`$$`%\v`$9`%\v`$\x06`$*`$9`%\0`$/`$9`$/`$>`$$`$\x15`$%`$>jagran`$\x06`$\x1c`$\x1c`%\v`$\x05`$,`$&`%\v`$\x17`$\b`$\x1c`$>`$\x17`$\x0f`$9`$.`$\x07`$(`$5`$9`$/`%\x07`$%`%\x07`$%`%\0`$\x18`$0`$\x1c`$,`$&`%\0`$\x15`$\b`$\x1c`%\0`$5`%\x07`$(`$\b`$(`$\x0f`$9`$0`$\t`$8`$.`%\x07`$\x15`$.`$5`%\v`$2`%\x07`$8`$,`$.`$\b`$&`%\x07`$\x13`$0`$\x06`$.`$,`$8`$-`$0`$,`$(`$\x1a`$2`$.`$(`$\x06`$\x17`$8`%\0`$2`%\0X9Y\x04Y\tX%Y\x04Y\tY\x07X0X\'X"X.X1X9X/X/X\'Y\x04Y\tY\x07X0Y\x07X5Y\bX1X:Y\nX1Y\x03X\'Y\x06Y\bY\x04X\'X(Y\nY\x06X9X1X6X0Y\x04Y\x03Y\x07Y\x06X\'Y\nY\bY\x05Y\x02X\'Y\x04X9Y\x04Y\nX\'Y\x06X\'Y\x04Y\x03Y\x06X-X*Y\tY\x02X(Y\x04Y\bX-X)X\'X.X1Y\x01Y\x02X7X9X(X/X1Y\x03Y\x06X%X0X\'Y\x03Y\x05X\'X\'X-X/X%Y\x04X\'Y\x01Y\nY\x07X(X9X6Y\x03Y\nY\x01X(X-X+Y\bY\x05Y\x06Y\bY\x07Y\bX#Y\x06X\'X,X/X\'Y\x04Y\x07X\'X3Y\x04Y\x05X9Y\x06X/Y\x04Y\nX3X9X(X1X5Y\x04Y\tY\x05Y\x06X0X(Y\x07X\'X#Y\x06Y\x07Y\x05X+Y\x04Y\x03Y\x06X*X\'Y\x04X\'X-Y\nX+Y\x05X5X1X4X1X-X-Y\bY\x04Y\bY\x01Y\nX\'X0X\'Y\x04Y\x03Y\x04Y\x05X1X)X\'Y\x06X*X\'Y\x04Y\x01X#X(Y\bX.X\'X5X#Y\x06X*X\'Y\x06Y\x07X\'Y\x04Y\nX9X6Y\bY\bY\x02X/X\'X(Y\x06X.Y\nX1X(Y\x06X*Y\x04Y\x03Y\x05X4X\'X!Y\bY\x07Y\nX\'X(Y\bY\x02X5X5Y\bY\x05X\'X1Y\x02Y\x05X#X-X/Y\x06X-Y\x06X9X/Y\x05X1X#Y\nX\'X-X)Y\x03X*X(X/Y\bY\x06Y\nX,X(Y\x05Y\x06Y\x07X*X-X*X,Y\x07X)X3Y\x06X)Y\nX*Y\x05Y\x03X1X)X:X2X)Y\x06Y\x01X3X(Y\nX*Y\x04Y\x04Y\x07Y\x04Y\x06X\'X*Y\x04Y\x03Y\x02Y\x04X(Y\x04Y\x05X\'X9Y\x06Y\x07X#Y\bY\x04X4Y\nX!Y\x06Y\bX1X#Y\x05X\'Y\x01Y\nY\x03X(Y\x03Y\x04X0X\'X*X1X*X(X(X#Y\x06Y\x07Y\x05X3X\'Y\x06Y\x03X(Y\nX9Y\x01Y\x02X/X-X3Y\x06Y\x04Y\x07Y\x05X4X9X1X#Y\x07Y\x04X4Y\x07X1Y\x02X7X1X7Y\x04X(profileservicedefaulthimselfdetailscontentsupportstartedmessagesuccessfashion<title>countryaccountcreatedstoriesresultsrunningprocesswritingobjectsvisiblewelcomearticleunknownnetworkcompanydynamicbrowserprivacyproblemServicerespectdisplayrequestreservewebsitehistoryfriendsoptionsworkingversionmillionchannelwindow.addressvisitedweathercorrectproductedirectforwardyou canremovedsubjectcontrolarchivecurrentreadinglibrarylimitedmanagerfurthersummarymachineminutesprivatecontextprogramsocietynumberswrittenenabledtriggersourcesloadingelementpartnerfinallyperfectmeaningsystemskeepingculture&quot;,journalprojectsurfaces&quot;expiresreviewsbalanceEnglishContentthroughPlease opinioncontactaverageprimaryvillageSpanishgallerydeclinemeetingmissionpopularqualitymeasuregeneralspeciessessionsectionwriterscounterinitialreportsfiguresmembersholdingdisputeearlierexpressdigitalpictureAnothermarriedtrafficleadingchangedcentralvictoryimages/reasonsstudiesfeaturelistingmust beschoolsVersionusuallyepisodeplayinggrowingobviousoverlaypresentactions</ul>\r\nwrapperalreadycertainrealitystorageanotherdesktopofferedpatternunusualDigitalcapitalWebsitefailureconnectreducedAndroiddecadesregular &amp; animalsreleaseAutomatgettingmethodsnothingPopularcaptionletterscapturesciencelicensechangesEngland=1&amp;History = new CentralupdatedSpecialNetworkrequirecommentwarningCollegetoolbarremainsbecauseelectedDeutschfinanceworkersquicklybetweenexactlysettingdiseaseSocietyweaponsexhibit&lt;!--Controlclassescoveredoutlineattacksdevices(windowpurposetitle="Mobile killingshowingItaliandroppedheavilyeffects-1\']);\nconfirmCurrentadvancesharingopeningdrawingbillionorderedGermanyrelated</form>includewhetherdefinedSciencecatalogArticlebuttonslargestuniformjourneysidebarChicagoholidayGeneralpassage,&quot;animatefeelingarrivedpassingnaturalroughly.\n\nThe but notdensityBritainChineselack oftributeIreland" data-factorsreceivethat isLibraryhusbandin factaffairsCharlesradicalbroughtfindinglanding:lang="return leadersplannedpremiumpackageAmericaEdition]&quot;Messageneed tovalue="complexlookingstationbelievesmaller-mobilerecordswant tokind ofFirefoxyou aresimilarstudiedmaximumheadingrapidlyclimatekingdomemergedamountsfoundedpioneerformuladynastyhow to SupportrevenueeconomyResultsbrothersoldierlargelycalling.&quot;AccountEdward segmentRobert effortsPacificlearnedup withheight:we haveAngelesnations_searchappliedacquiremassivegranted: falsetreatedbiggestbenefitdrivingStudiesminimumperhapsmorningsellingis usedreversevariant role="missingachievepromotestudentsomeoneextremerestorebottom:evolvedall thesitemapenglishway to AugustsymbolsCompanymattersmusicalagainstserving})();\r\npaymenttroubleconceptcompareparentsplayersregionsmonitor \'\'The winningexploreadaptedGalleryproduceabilityenhancecareers). The collectSearch ancientexistedfooter handlerprintedconsoleEasternexportswindowsChannelillegalneutralsuggest_headersigning.html">settledwesterncausing-webkitclaimedJusticechaptervictimsThomas mozillapromisepartieseditionoutside:false,hundredOlympic_buttonauthorsreachedchronicdemandssecondsprotectadoptedprepareneithergreatlygreateroverallimprovecommandspecialsearch.worshipfundingthoughthighestinsteadutilityquarterCulturetestingclearlyexposedBrowserliberal} catchProjectexamplehide();FloridaanswersallowedEmperordefenseseriousfreedomSeveral-buttonFurtherout of != nulltrainedDenmarkvoid(0)/all.jspreventRequestStephen\n\nWhen observe</h2>\r\nModern provide" alt="borders.\n\nFor \n\nMany artistspoweredperformfictiontype ofmedicalticketsopposedCouncilwitnessjusticeGeorge Belgium...</a>twitternotablywaitingwarfare Other rankingphrasesmentionsurvivescholar</p>\r\n Countryignoredloss ofjust asGeorgiastrange<head><stopped1\']);\r\nislandsnotableborder:list ofcarried100,000</h3>\n severalbecomesselect wedding00.htmlmonarchoff theteacherhighly biologylife ofor evenrise of&raquo;plusonehunting(thoughDouglasjoiningcirclesFor theAncientVietnamvehiclesuch ascrystalvalue =Windowsenjoyeda smallassumed<a id="foreign All rihow theDisplayretiredhoweverhidden;battlesseekingcabinetwas notlook atconductget theJanuaryhappensturninga:hoverOnline French lackingtypicalextractenemieseven ifgeneratdecidedare not/searchbeliefs-image:locatedstatic.login">convertviolententeredfirst">circuitFinlandchemistshe was10px;">as suchdivided</span>will beline ofa greatmystery/index.fallingdue to railwaycollegemonsterdescentit withnuclearJewish protestBritishflowerspredictreformsbutton who waslectureinstantsuicidegenericperiodsmarketsSocial fishingcombinegraphicwinners<br /><by the NaturalPrivacycookiesoutcomeresolveSwedishbrieflyPersianso muchCenturydepictscolumnshousingscriptsnext tobearingmappingrevisedjQuery(-width:title">tooltipSectiondesignsTurkishyounger.match(})();\n\nburningoperatedegreessource=Richardcloselyplasticentries</tr>\r\ncolor:#ul id="possessrollingphysicsfailingexecutecontestlink toDefault<br />\n: true,chartertourismclassicproceedexplain</h1>\r\nonline.?xml vehelpingdiamonduse theairlineend --\x3e).attr(readershosting#ffffffrealizeVincentsignals src="/ProductdespitediversetellingPublic held inJoseph theatreaffects<style>a largedoesn\'tlater, ElementfaviconcreatorHungaryAirportsee theso thatMichaelSystemsPrograms, and width=e&quot;tradingleft">\npersonsGolden Affairsgrammarformingdestroyidea ofcase ofoldest this is.src = cartoonregistrCommonsMuslimsWhat isin manymarkingrevealsIndeed,equally/show_aoutdoorescape(Austriageneticsystem,In the sittingHe alsoIslandsAcademy\n\t\t\x3c!--Daniel bindingblock">imposedutilizeAbraham(except{width:putting).html(|| [];\nDATA[ *kitchenmountedactual dialectmainly _blank\'installexpertsif(typeIt also&copy; ">Termsborn inOptionseasterntalkingconcerngained ongoingjustifycriticsfactoryits ownassaultinvitedlastinghis ownhref="/" rel="developconcertdiagramdollarsclusterphp?id=alcohol);})();using a><span>vesselsrevivalAddressamateurandroidallegedillnesswalkingcentersqualifymatchesunifiedextinctDefensedied in\n\t\x3c!-- customslinkingLittle Book ofeveningmin.js?are thekontakttoday\'s.html" target=wearingAll Rig;\n})();raising Also, crucialabout">declare--\x3e\n<scfirefoxas muchappliesindex, s, but type = \n\r\n\x3c!--towardsRecordsPrivateForeignPremierchoicesVirtualreturnsCommentPoweredinline;povertychamberLiving volumesAnthonylogin" RelatedEconomyreachescuttinggravitylife inChapter-shadowNotable</td>\r\n returnstadiumwidgetsvaryingtravelsheld bywho arework infacultyangularwho hadairporttown of\n\nSome \'click\'chargeskeywordit willcity of(this);Andrew unique checkedor more300px; return;rsion="pluginswithin herselfStationFederalventurepublishsent totensionactresscome tofingersDuke ofpeople,exploitwhat isharmonya major":"httpin his menu">\nmonthlyofficercouncilgainingeven inSummarydate ofloyaltyfitnessand wasemperorsupremeSecond hearingRussianlongestAlbertalateralset of small">.appenddo withfederalbank ofbeneathDespiteCapitalgrounds), and percentit fromclosingcontainInsteadfifteenas well.yahoo.respondfighterobscurereflectorganic= Math.editingonline paddinga wholeonerroryear ofend of barrierwhen itheader home ofresumedrenamedstrong>heatingretainscloudfrway of March 1knowingin partBetweenlessonsclosestvirtuallinks">crossedEND --\x3efamous awardedLicenseHealth fairly wealthyminimalAfricancompetelabel">singingfarmersBrasil)discussreplaceGregoryfont copursuedappearsmake uproundedboth ofblockedsaw theofficescoloursif(docuwhen heenforcepush(fuAugust UTF-8">Fantasyin mostinjuredUsuallyfarmingclosureobject defenceuse of Medical<body>\nevidentbe usedkeyCodesixteenIslamic#000000entire widely active (typeofone cancolor =speakerextendsPhysicsterrain<tbody>funeralviewingmiddle cricketprophetshifteddoctorsRussell targetcompactalgebrasocial-bulk ofman and</td>\n he left).val()false);logicalbankinghome tonaming Arizonacredits);\n});\nfounderin turnCollinsbefore But thechargedTitle">CaptainspelledgoddessTag --\x3eAdding:but wasRecent patientback in=false&Lincolnwe knowCounterJudaismscript altered\']);\n has theunclearEvent\',both innot all\n\n\x3c!-- placinghard to centersort ofclientsstreetsBernardassertstend tofantasydown inharbourFreedomjewelry/about..searchlegendsis mademodern only ononly toimage" linear painterand notrarely acronymdelivershorter00&amp;as manywidth="/* <![Ctitle =of the lowest picked escapeduses ofpeoples PublicMatthewtacticsdamagedway forlaws ofeasy to windowstrong simple}catch(seventhinfoboxwent topaintedcitizenI don\'tretreat. Some ww.");\nbombingmailto:made in. Many carries||{};wiwork ofsynonymdefeatsfavoredopticalpageTraunless sendingleft"><comScorAll thejQuery.touristClassicfalse" Wilhelmsuburbsgenuinebishops.split(global followsbody ofnominalContactsecularleft tochiefly-hidden-banner</li>\n\n. When in bothdismissExplorealways via thespaC1olwelfareruling arrangecaptainhis sonrule ofhe tookitself,=0&amp;(calledsamplesto makecom/pagMartin Kennedyacceptsfull ofhandledBesides//--\x3e</able totargetsessencehim to its by common.mineralto takeways tos.org/ladvisedpenaltysimple:if theyLettersa shortHerbertstrikes groups.lengthflightsoverlapslowly lesser social </p>\n\t\tit intoranked rate oful>\r\n attemptpair ofmake itKontaktAntoniohaving ratings activestreamstrapped").css(hostilelead tolittle groups,Picture--\x3e\r\n\r\n rows=" objectinverse<footerCustomV><\\/scrsolvingChamberslaverywoundedwhereas!= \'undfor allpartly -right:Arabianbacked centuryunit ofmobile-Europe,is homerisk ofdesiredClintoncost ofage of become none ofp&quot;Middle ead\')[0Criticsstudios>&copy;group">assemblmaking pressedwidget.ps:" ? rebuiltby someFormer editorsdelayedCanonichad thepushingclass="but arepartialBabylonbottom carrierCommandits useAs withcoursesa thirddenotesalso inHouston20px;">accuseddouble goal ofFamous ).bind(priests Onlinein Julyst + "gconsultdecimalhelpfulrevivedis veryr\'+\'iptlosing femalesis alsostringsdays ofarrivalfuture <objectforcingString(" />\n\t\there isencoded. The balloondone by/commonbgcolorlaw of Indianaavoidedbut the2px 3pxjquery.after apolicy.men andfooter-= true;for usescreen.Indian image =family,http:// &nbsp;driverseternalsame asnoticedviewers})();\n is moreseasonsformer the newis justconsent Searchwas thewhy theshippedbr><br>width: height=made ofcuisineis thata very Admiral fixed;normal MissionPress, ontariocharsettry to invaded="true"spacingis mosta more totallyfall of});\r\n immensetime inset outsatisfyto finddown tolot of Playersin Junequantumnot thetime todistantFinnishsrc = (single help ofGerman law andlabeledforestscookingspace">header-well asStanleybridges/globalCroatia About [0];\n it, andgroupedbeing a){throwhe madelighterethicalFFFFFF"bottom"like a employslive inas seenprintermost ofub-linkrejectsand useimage">succeedfeedingNuclearinformato helpWomen\'sNeitherMexicanprotein<table by manyhealthylawsuitdevised.push({sellerssimply Through.cookie Image(older">us.js"> Since universlarger open to!-- endlies in\']);\r\n marketwho is ("DOMComanagedone fortypeof Kingdomprofitsproposeto showcenter;made itdressedwere inmixtureprecisearisingsrc = \'make a securedBaptistvoting \n\t\tvar March 2grew upClimate.removeskilledway the</head>face ofacting right">to workreduceshas haderectedshow();action=book ofan area== "htt<header\n<html>conformfacing cookie.rely onhosted .customhe wentbut forspread Family a meansout theforums.footage">MobilClements" id="as highintense--\x3e\x3c!--female is seenimpliedset thea stateand hisfastestbesidesbutton_bounded"><img Infoboxevents,a youngand areNative cheaperTimeoutand hasengineswon the(mostlyright: find a -bottomPrince area ofmore ofsearch_nature,legallyperiod,land ofor withinducedprovingmissilelocallyAgainstthe wayk&quot;px;">\r\npushed abandonnumeralCertainIn thismore inor somename isand, incrownedISBN 0-createsOctobermay notcenter late inDefenceenactedwish tobroadlycoolingonload=it. TherecoverMembersheight assumes<html>\npeople.in one =windowfooter_a good reklamaothers,to this_cookiepanel">London,definescrushedbaptismcoastalstatus title" move tolost inbetter impliesrivalryservers SystemPerhapses and contendflowinglasted rise inGenesisview ofrising seem tobut in backinghe willgiven agiving cities.flow of Later all butHighwayonly bysign ofhe doesdiffersbattery&amp;lasinglesthreatsintegertake onrefusedcalled =US&ampSee thenativesby thissystem.head of:hover,lesbiansurnameand allcommon/header__paramsHarvard/pixel.removalso longrole ofjointlyskyscraUnicodebr />\r\nAtlantanucleusCounty,purely count">easily build aonclicka givenpointerh&quot;events else {\nditionsnow the, with man whoorg/Webone andcavalryHe diedseattle00,000 {windowhave toif(windand itssolely m&quot;renewedDetroitamongsteither them inSenatorUs</a><King ofFrancis-produche usedart andhim andused byscoringat hometo haverelatesibilityfactionBuffalolink"><what hefree toCity ofcome insectorscountedone daynervoussquare };if(goin whatimg" alis onlysearch/tuesdaylooselySolomonsexual - <a hrmedium"DO NOT France,with a war andsecond take a >\r\n\r\n\r\nmarket.highwaydone inctivity"last">obligedrise to"undefimade to Early praisedin its for hisathleteJupiterYahoo! termed so manyreally s. The a woman?value=direct right" bicycleacing="day andstatingRather,higher Office are nowtimes, when a pay foron this-link">;borderaround annual the Newput the.com" takin toa brief(in thegroups.; widthenzymessimple in late{returntherapya pointbanninginks">\n();" rea place\\u003Caabout atr>\r\n\t\tccount gives a<SCRIPTRailwaythemes/toolboxById("xhumans,watchesin some if (wicoming formats Under but hashanded made bythan infear ofdenoted/iframeleft involtagein eacha&quot;base ofIn manyundergoregimesaction </p>\r\n<ustomVa;&gt;</importsor thatmostly &amp;re size="</a></ha classpassiveHost = WhetherfertileVarious=[];(fucameras/></td>acts asIn some>\r\n\r\n<!organis <br />BeijingcatalC deutscheuropeueuskaragaeilgesvenskaespaC1amensajeusuariotrabajomC)xicopC!ginasiempresistemaoctubreduranteaC1adirempresamomentonuestroprimeratravC)sgraciasnuestraprocesoestadoscalidadpersonanC:meroacuerdomC:sicamiembroofertasalgunospaC-sesejemploderechoademC!sprivadoagregarenlacesposiblehotelessevillaprimeroC:ltimoeventosarchivoculturamujeresentradaanuncioembargomercadograndesestudiomejoresfebrerodiseC1oturismocC3digoportadaespaciofamiliaantoniopermiteguardaralgunaspreciosalguiensentidovisitastC-tuloconocersegundoconsejofranciaminutossegundatenemosefectosmC!lagasesiC3nrevistagranadacompraringresogarcC-aacciC3necuadorquienesinclusodeberC!materiahombresmuestrapodrC-amaC1anaC:ltimaestamosoficialtambienningC:nsaludospodemosmejorarpositionbusinesshomepagesecuritylanguagestandardcampaignfeaturescategoryexternalchildrenreservedresearchexchangefavoritetemplatemilitaryindustryservicesmaterialproductsz-index:commentssoftwarecompletecalendarplatformarticlesrequiredmovementquestionbuildingpoliticspossiblereligionphysicalfeedbackregisterpicturesdisabledprotocolaudiencesettingsactivityelementslearninganythingabstractprogressoverviewmagazineeconomictrainingpressurevarious <strong>propertyshoppingtogetheradvancedbehaviordownloadfeaturedfootballselectedLanguagedistanceremembertrackingpasswordmodifiedstudentsdirectlyfightingnortherndatabasefestivalbreakinglocationinternetdropdownpracticeevidencefunctionmarriageresponseproblemsnegativeprogramsanalysisreleasedbanner">purchasepoliciesregionalcreativeargumentbookmarkreferrerchemicaldivisioncallbackseparateprojectsconflicthardwareinterestdeliverymountainobtained= false;for(var acceptedcapacitycomputeridentityaircraftemployedproposeddomesticincludesprovidedhospitalverticalcollapseapproachpartnerslogo"><adaughterauthor" culturalfamilies/images/assemblypowerfulteachingfinisheddistrictcriticalcgi-bin/purposesrequireselectionbecomingprovidesacademicexerciseactuallymedicineconstantaccidentMagazinedocumentstartingbottom">observed: &quot;extendedpreviousSoftwarecustomerdecisionstrengthdetailedslightlyplanningtextareacurrencyeveryonestraighttransferpositiveproducedheritageshippingabsolutereceivedrelevantbutton" violenceanywherebenefitslaunchedrecentlyalliancefollowedmultiplebulletinincludedoccurredinternal$(this).republic><tr><tdcongressrecordedultimatesolution<ul id="discoverHome</a>websitesnetworksalthoughentirelymemorialmessagescontinueactive">somewhatvictoriaWestern title="LocationcontractvisitorsDownloadwithout right">\nmeasureswidth = variableinvolvedvirginianormallyhappenedaccountsstandingnationalRegisterpreparedcontrolsaccuratebirthdaystrategyofficialgraphicscriminalpossiblyconsumerPersonalspeakingvalidateachieved.jpg" />machines</h2>\n keywordsfriendlybrotherscombinedoriginalcomposedexpectedadequatepakistanfollow" valuable</label>relativebringingincreasegovernorplugins/List of Header">" name=" (&quot;graduate</head>\ncommercemalaysiadirectormaintain;height:schedulechangingback to catholicpatternscolor: #greatestsuppliesreliable</ul>\n\t\t<select citizensclothingwatching<li id="specificcarryingsentence<center>contrastthinkingcatch(e)southernMichael merchantcarouselpadding:interior.split("lizationOctober ){returnimproved--&gt;\n\ncoveragechairman.png" />subjectsRichard whateverprobablyrecoverybaseballjudgmentconnect..css" /> websitereporteddefault"/></a>\r\nelectricscotlandcreationquantity. ISBN 0did not instance-search-" lang="speakersComputercontainsarchivesministerreactiondiscountItalianocriteriastrongly: \'http:\'script\'coveringofferingappearedBritish identifyFacebooknumerousvehiclesconcernsAmericanhandlingdiv id="William provider_contentaccuracysection andersonflexibleCategorylawrence<script>layout="approved maximumheader"></table>Serviceshamiltoncurrent canadianchannels/themes//articleoptionalportugalvalue=""intervalwirelessentitledagenciesSearch" measuredthousandspending&hellip;new Date" size="pageNamemiddle" " /></a>hidden">sequencepersonaloverflowopinionsillinoislinks">\n\t<title>versionssaturdayterminalitempropengineersectionsdesignerproposal="false"EspaC1olreleasessubmit" er&quot;additionsymptomsorientedresourceright"><pleasurestationshistory.leaving border=contentscenter">.\n\nSome directedsuitablebulgaria.show();designedGeneral conceptsExampleswilliamsOriginal"><span>search">operatorrequestsa &quot;allowingDocumentrevision. \n\nThe yourselfContact michiganEnglish columbiapriorityprintingdrinkingfacilityreturnedContent officersRussian generate-8859-1"indicatefamiliar qualitymargin:0 contentviewportcontacts-title">portable.length eligibleinvolvesatlanticonload="default.suppliedpaymentsglossary\n\nAfter guidance</td><tdencodingmiddle">came to displaysscottishjonathanmajoritywidgets.clinicalthailandteachers<head>\n\taffectedsupportspointer;toString</small>oklahomawill be investor0" alt="holidaysResourcelicensed (which . After considervisitingexplorerprimary search" android"quickly meetingsestimate;return ;color:# height=approval, &quot; checked.min.js"magnetic></a></hforecast. While thursdaydvertise&eacute;hasClassevaluateorderingexistingpatients Online coloradoOptions"campbell\x3c!-- end</span><<br />\r\n_popups|sciences,&quot; quality Windows assignedheight: <b classle&quot; value=" Companyexamples<iframe believespresentsmarshallpart of properly).\n\nThe taxonomymuch of </span>\n" data-srtuguC*sscrollTo project<head>\r\nattorneyemphasissponsorsfancyboxworld\'s wildlifechecked=sessionsprogrammpx;font- Projectjournalsbelievedvacationthompsonlightingand the special border=0checking</tbody><button Completeclearfix\n<head>\narticle <sectionfindingsrole in popular Octoberwebsite exposureused to changesoperatedclickingenteringcommandsinformed numbers </div>creatingonSubmitmarylandcollegesanalyticlistingscontact.loggedInadvisorysiblingscontent"s&quot;)s. This packagescheckboxsuggestspregnanttomorrowspacing=icon.pngjapanesecodebasebutton">gamblingsuch as , while </span> missourisportingtop:1px .</span>tensionswidth="2lazyloadnovemberused in height="cript">\n&nbsp;</<tr><td height:2/productcountry include footer" &lt;!-- title"></jquery.</form>\n(g.\0d=\x13)(g9\x01i+\x14)hrvatskiitalianoromC"nD\x03tC<rkC\'eX\'X1X/Y\btambiC)nnoticiasmensajespersonasderechosnacionalserviciocontactousuariosprogramagobiernoempresasanunciosvalenciacolombiadespuC)sdeportesproyectoproductopC:bliconosotroshistoriapresentemillonesmediantepreguntaanteriorrecursosproblemasantiagonuestrosopiniC3nimprimirmientrasamC)ricavendedorsociedadrespectorealizarregistropalabrasinterC)sentoncesespecialmiembrosrealidadcC3rdobazaragozapC!ginassocialesbloqueargestiC3nalquilersistemascienciascompletoversiC3ncompletaestudiospC:blicaobjetivoalicantebuscadorcantidadentradasaccionesarchivossuperiormayorC-aalemaniafunciC3nC:ltimoshaciendoaquellosediciC3nfernandoambientefacebooknuestrasclientesprocesosbastantepresentareportarcongresopublicarcomerciocontratojC3venesdistritotC)cnicaconjuntoenergC-atrabajarasturiasrecienteutilizarboletC-nsalvadorcorrectatrabajosprimerosnegocioslibertaddetallespantallaprC3ximoalmerC-aanimalesquiC)nescorazC3nsecciC3nbuscandoopcionesexteriorconceptotodavC-agalerC-aescribirmedicinalicenciaconsultaaspectoscrC-ticadC3laresjusticiadeberC!nperC-odonecesitamantenerpequeC1orecibidatribunaltenerifecanciC3ncanariasdescargadiversosmallorcarequieretC)cnicodeberC-aviviendafinanzasadelantefuncionaconsejosdifC-cilciudadesantiguasavanzadatC)rminounidadessC!nchezcampaC1asoftonicrevistascontienesectoresmomentosfacultadcrC)ditodiversassupuestofactoressegundospequeC1aP3P>P4P0P5Q\x01P;P8P5Q\x01Q\x02Q\fP1Q\vP;P>P1Q\vQ\x02Q\fQ\rQ\x02P>P<P\x15Q\x01P;P8Q\x02P>P3P>P<P5P=Q\x0fP2Q\x01P5Q\x05Q\rQ\x02P>P9P4P0P6P5P1Q\vP;P8P3P>P4Q\x03P4P5P=Q\fQ\rQ\x02P>Q\x02P1Q\vP;P0Q\x01P5P1Q\x0fP>P4P8P=Q\x01P5P1P5P=P0P4P>Q\x01P0P9Q\x02Q\x04P>Q\x02P>P=P5P3P>Q\x01P2P>P8Q\x01P2P>P9P8P3Q\0Q\vQ\x02P>P6P5P2Q\x01P5P<Q\x01P2P>Q\x0eP;P8Q\bQ\fQ\rQ\x02P8Q\x05P?P>P:P0P4P=P5P9P4P>P<P0P<P8Q\0P0P;P8P1P>Q\x02P5P<Q\x03Q\x05P>Q\x02Q\x0fP4P2Q\x03Q\x05Q\x01P5Q\x02P8P;Q\x0eP4P8P4P5P;P>P<P8Q\0P5Q\x02P5P1Q\x0fQ\x01P2P>P5P2P8P4P5Q\x07P5P3P>Q\rQ\x02P8P<Q\x01Q\x07P5Q\x02Q\x02P5P<Q\vQ\x06P5P=Q\vQ\x01Q\x02P0P;P2P5P4Q\fQ\x02P5P<P5P2P>P4Q\vQ\x02P5P1P5P2Q\vQ\bP5P=P0P<P8Q\x02P8P?P0Q\x02P>P<Q\x03P?Q\0P0P2P;P8Q\x06P0P>P4P=P0P3P>P4Q\vP7P=P0Q\x0eP<P>P3Q\x03P4Q\0Q\x03P3P2Q\x01P5P9P8P4P5Q\x02P:P8P=P>P>P4P=P>P4P5P;P0P4P5P;P5Q\x01Q\0P>P:P8Q\x0eP=Q\x0fP2P5Q\x01Q\fP\x15Q\x01Q\x02Q\fQ\0P0P7P0P=P0Q\bP8X\'Y\x04Y\x04Y\x07X\'Y\x04X*Y\nX,Y\x05Y\nX9X.X\'X5X)X\'Y\x04X0Y\nX9Y\x04Y\nY\x07X,X/Y\nX/X\'Y\x04X"Y\x06X\'Y\x04X1X/X*X-Y\x03Y\x05X5Y\x01X-X)Y\x03X\'Y\x06X*X\'Y\x04Y\x04Y\nY\nY\x03Y\bY\x06X4X(Y\x03X)Y\x01Y\nY\x07X\'X(Y\x06X\'X*X-Y\bX\'X!X#Y\x03X+X1X.Y\x04X\'Y\x04X\'Y\x04X-X(X/Y\x04Y\nY\x04X/X1Y\bX3X\'X6X:X7X*Y\x03Y\bY\x06Y\x07Y\x06X\'Y\x03X3X\'X-X)Y\x06X\'X/Y\nX\'Y\x04X7X(X9Y\x04Y\nY\x03X4Y\x03X1X\'Y\nY\x05Y\x03Y\x06Y\x05Y\x06Y\x07X\'X4X1Y\x03X)X1X&Y\nX3Y\x06X4Y\nX7Y\x05X\'X0X\'X\'Y\x04Y\x01Y\x06X4X(X\'X(X*X9X(X1X1X-Y\x05X)Y\x03X\'Y\x01X)Y\nY\x02Y\bY\x04Y\x05X1Y\x03X2Y\x03Y\x04Y\x05X)X#X-Y\x05X/Y\x02Y\x04X(Y\nY\nX9Y\x06Y\nX5Y\bX1X)X7X1Y\nY\x02X4X\'X1Y\x03X,Y\bX\'Y\x04X#X.X1Y\tY\x05X9Y\x06X\'X\'X(X-X+X9X1Y\bX6X(X4Y\x03Y\x04Y\x05X3X,Y\x04X(Y\x06X\'Y\x06X.X\'Y\x04X/Y\x03X*X\'X(Y\x03Y\x04Y\nX)X(X/Y\bY\x06X#Y\nX6X\'Y\nY\bX,X/Y\x01X1Y\nY\x02Y\x03X*X(X*X#Y\x01X6Y\x04Y\x05X7X(X.X\'Y\x03X+X1X(X\'X1Y\x03X\'Y\x01X6Y\x04X\'X-Y\x04Y\tY\x06Y\x01X3Y\x07X#Y\nX\'Y\x05X1X/Y\bX/X#Y\x06Y\x07X\'X/Y\nY\x06X\'X\'Y\x04X\'Y\x06Y\x05X9X1X6X*X9Y\x04Y\x05X/X\'X.Y\x04Y\x05Y\x05Y\x03Y\x06\0\0\0\0\0\0\0\0\x01\0\x01\0\x01\0\x01\0\x02\0\x02\0\x02\0\x02\0\x04\0\x04\0\x04\0\x04\0\0\x01\x02\x03\x04\x05\x06\x07\x07\x06\x05\x04\x03\x02\x01\0\b\t\n\v\f\r\x0e\x0f\x0f\x0e\r\f\v\n\t\b\x10\x11\x12\x13\x14\x15\x16\x17\x17\x16\x15\x14\x13\x12\x11\x10\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x1f\x1e\x1d\x1c\x1b\x1a\x19\x18\x7f\x7f\x7f\x7f\0\0\0\0\0\0\0\0\x7f\x7f\x7f\x7f\x01\0\0\0\x02\0\0\0\x02\0\0\0\x01\0\0\0\x01\0\0\0\x03\0\0\0\x7f\x7f\0\x01\0\0\0\x01\0\0\x7f\x7f\0\x01\0\0\0\b\0\b\0\b\0\b\0\0\0\x01\0\x02\0\x03\0\x04\0\x05\0\x06\0\x07resourcescountriesquestionsequipmentcommunityavailablehighlightDTD/xhtmlmarketingknowledgesomethingcontainerdirectionsubscribeadvertisecharacter" value="</select>Australia" class="situationauthorityfollowingprimarilyoperationchallengedevelopedanonymousfunction functionscompaniesstructureagreement" title="potentialeducationargumentssecondarycopyrightlanguagesexclusivecondition</form>\r\nstatementattentionBiography} else {\nsolutionswhen the Analyticstemplatesdangeroussatellitedocumentspublisherimportantprototypeinfluence&raquo;</effectivegenerallytransformbeautifultransportorganizedpublishedprominentuntil thethumbnailNational .focus();over the migrationannouncedfooter">\nexceptionless thanexpensiveformationframeworkterritoryndicationcurrentlyclassNamecriticismtraditionelsewhereAlexanderappointedmaterialsbroadcastmentionedaffiliate</option>treatmentdifferent/default.Presidentonclick="biographyotherwisepermanentFranC\'aisHollywoodexpansionstandards</style>\nreductionDecember preferredCambridgeopponentsBusiness confusion>\n<title>presentedexplaineddoes not worldwideinterfacepositionsnewspaper</table>\nmountainslike the essentialfinancialselectionaction="/abandonedEducationparseInt(stabilityunable to</title>\nrelationsNote thatefficientperformedtwo yearsSince thethereforewrapper">alternateincreasedBattle ofperceivedtrying tonecessaryportrayedelectionsElizabeth</iframe>discoveryinsurances.length;legendaryGeographycandidatecorporatesometimesservices.inherited</strong>CommunityreligiouslocationsCommitteebuildingsthe worldno longerbeginningreferencecannot befrequencytypicallyinto the relative;recordingpresidentinitiallytechniquethe otherit can beexistenceunderlinethis timetelephoneitemscopepracticesadvantage);return For otherprovidingdemocracyboth the extensivesufferingsupportedcomputers functionpracticalsaid thatit may beEnglish</from the scheduleddownloads</label>\nsuspectedmargin: 0spiritual</head>\n\nmicrosoftgraduallydiscussedhe becameexecutivejquery.jshouseholdconfirmedpurchasedliterallydestroyedup to thevariationremainingit is notcenturiesJapanese among thecompletedalgorithminterestsrebellionundefinedencourageresizableinvolvingsensitiveuniversalprovision(althoughfeaturingconducted), which continued-header">February numerous overflow:componentfragmentsexcellentcolspan="technicalnear the Advanced source ofexpressedHong Kong Facebookmultiple mechanismelevationoffensive</form>\n\tsponsoreddocument.or &quot;there arethose whomovementsprocessesdifficultsubmittedrecommendconvincedpromoting" width=".replace(classicalcoalitionhis firstdecisionsassistantindicatedevolution-wrapper"enough toalong thedelivered--\x3e\r\n\x3c!--American protectedNovember </style><furnitureInternet onblur="suspendedrecipientbased on Moreover,abolishedcollectedwere madeemotionalemergencynarrativeadvocatespx;bordercommitteddir="ltr"employeesresearch. selectedsuccessorcustomersdisplayedSeptemberaddClass(Facebook suggestedand lateroperatingelaborateSometimesInstitutecertainlyinstalledfollowersJerusalemthey havecomputinggeneratedprovincesguaranteearbitraryrecognizewanted topx;width:theory ofbehaviourWhile theestimatedbegan to it becamemagnitudemust havemore thanDirectoryextensionsecretarynaturallyoccurringvariablesgiven theplatform.</label><failed tocompoundskinds of societiesalongside --&gt;\n\nsouthwestthe rightradiationmay have unescape(spoken in" href="/programmeonly the come fromdirectoryburied ina similarthey were</font></Norwegianspecifiedproducingpassenger(new DatetemporaryfictionalAfter theequationsdownload.regularlydeveloperabove thelinked tophenomenaperiod oftooltip">substanceautomaticaspect ofAmong theconnectedestimatesAir Forcesystem ofobjectiveimmediatemaking itpaintingsconqueredare stillproceduregrowth ofheaded byEuropean divisionsmoleculesfranchiseintentionattractedchildhoodalso useddedicatedsingaporedegree offather ofconflicts</a></p>\ncame fromwere usednote thatreceivingExecutiveeven moreaccess tocommanderPoliticalmusiciansdeliciousprisonersadvent ofUTF-8" /><![CDATA[">ContactSouthern bgcolor="series of. It was in Europepermittedvalidate.appearingofficialsseriously-languageinitiatedextendinglong-terminflationsuch thatgetCookiemarked by</button>implementbut it isincreasesdown the requiringdependent--\x3e\n\x3c!-- interviewWith the copies ofconsensuswas builtVenezuela(formerlythe statepersonnelstrategicfavour ofinventionWikipediacontinentvirtuallywhich wasprincipleComplete identicalshow thatprimitiveaway frommolecularpreciselydissolvedUnder theversion=">&nbsp;</It is the This is will haveorganismssome timeFriedrichwas firstthe only fact thatform id="precedingTechnicalphysicistoccurs innavigatorsection">span id="sought tobelow thesurviving}</style>his deathas in thecaused bypartiallyexisting using thewas givena list oflevels ofnotion ofOfficial dismissedscientistresemblesduplicateexplosiverecoveredall othergalleries{padding:people ofregion ofaddressesassociateimg alt="in modernshould bemethod ofreportingtimestampneeded tothe Greatregardingseemed toviewed asimpact onidea thatthe Worldheight ofexpandingThese arecurrent">carefullymaintainscharge ofClassicaladdressedpredictedownership<div id="right">\r\nresidenceleave thecontent">are often })();\r\nprobably Professor-button" respondedsays thathad to beplaced inHungarianstatus ofserves asUniversalexecutionaggregatefor whichinfectionagreed tohowever, popular">placed onconstructelectoralsymbol ofincludingreturn toarchitectChristianprevious living ineasier toprofessor\n&lt;!-- effect ofanalyticswas takenwhere thetook overbelief inAfrikaansas far aspreventedwork witha special<fieldsetChristmasRetrieved\n\nIn the back intonortheastmagazines><strong>committeegoverninggroups ofstored inestablisha generalits firsttheir ownpopulatedan objectCaribbeanallow thedistrictswisconsinlocation.; width: inhabitedSocialistJanuary 1</footer>similarlychoice ofthe same specific business The first.length; desire todeal withsince theuserAgentconceivedindex.phpas &quot;engage inrecently,few yearswere also\n<head>\n<edited byare knowncities inaccesskeycondemnedalso haveservices,family ofSchool ofconvertednature of languageministers</object>there is a popularsequencesadvocatedThey wereany otherlocation=enter themuch morereflectedwas namedoriginal a typicalwhen theyengineerscould notresidentswednesdaythe third productsJanuary 2what theya certainreactionsprocessorafter histhe last contained"></div>\n</a></td>depend onsearch">\npieces ofcompetingReferencetennesseewhich has version=</span> <</header>gives thehistorianvalue="">padding:0view thattogether,the most was foundsubset ofattack onchildren,points ofpersonal position:allegedlyClevelandwas laterand afterare givenwas stillscrollingdesign ofmakes themuch lessAmericans.\n\nAfter , but theMuseum oflouisiana(from theminnesotaparticlesa processDominicanvolume ofreturningdefensive00px|righmade frommouseover" style="states of(which iscontinuesFranciscobuilding without awith somewho woulda form ofa part ofbefore itknown as Serviceslocation and oftenmeasuringand it ispaperbackvalues of\r\n<title>= window.determineer&quot; played byand early</center>from thisthe threepower andof &quot;innerHTML<a href="y:inline;Church ofthe eventvery highofficial -height: content="/cgi-bin/to createafrikaansesperantofranC\'aislatvieE!ulietuviE3D\feE!tinaD\reE!tina`9\x04`8\x17`8"f\x17%f\x1c,h*\x1eg.\0d=\x13e-\x17g9\x01i+\x14e-\x17m\x15\x1cj5-l\x164d8:d;\0d9\bh.!g.\x17f\x1c:g,\x14h.0f\x1c,h(\x0eh+\x16e\r\0f\x1c\re\n!e\x19(d:\x12h\x01\x14g=\x11f\b?e\x1c0d:\'d?1d9\x10i\x03(e\x07:g\t\bg$>f\x0e\x12h!\ff&\x1ci\x03(h\x10=f <h?\x1bd8\0f-%f\x14/d;\x18e.\x1di*\fh/\x01g \x01e\'\x14e\x11\x18d<\x1af\x150f\r.e:\x13f6\bh49h\0\x05e\n\x1ee\x05,e.$h.(h.:e\f:f71e\x1c3e8\x02f\x12-f\x14>e\x19(e\f\x17d:,e8\x02e$\'e-&g\x14\x1fh6\nf\x1d%h6\ng.!g\x10\x06e\x11\x18d?!f\x01/g=\x11serviciosartC-culoargentinabarcelonacualquierpublicadoproductospolC-ticarespuestawikipediasiguientebC:squedacomunidadseguridadprincipalpreguntascontenidorespondervenezuelaproblemasdiciembrerelaciC3nnoviembresimilaresproyectosprogramasinstitutoactividadencuentraeconomC-aimC!genescontactardescargarnecesarioatenciC3ntelC)fonocomisiC3ncancionescapacidadencontraranC!lisisfavoritostC)rminosprovinciaetiquetaselementosfuncionesresultadocarC!cterpropiedadprincipionecesidadmunicipalcreaciC3ndescargaspresenciacomercialopinionesejercicioeditorialsalamancagonzC!lezdocumentopelC-cularecientesgeneralestarragonaprC!cticanovedadespropuestapacientestC)cnicasobjetivoscontactos`$.`%\x07`$\x02`$2`$?`$\x0f`$9`%\b`$\x02`$\x17`$/`$>`$8`$>`$%`$\x0f`$5`$\x02`$0`$9`%\x07`$\x15`%\v`$\b`$\x15`%\x01`$\x1b`$0`$9`$>`$,`$>`$&`$\x15`$9`$>`$8`$-`%\0`$9`%\x01`$\x0f`$0`$9`%\0`$.`%\b`$\x02`$&`$?`$(`$,`$>`$$diplodocs`$8`$.`$/`$0`%\x02`$*`$(`$>`$.`$*`$$`$>`$+`$?`$0`$\x14`$8`$$`$$`$0`$9`$2`%\v`$\x17`$9`%\x01`$\x06`$,`$>`$0`$&`%\x07`$6`$9`%\x01`$\b`$\x16`%\x07`$2`$/`$&`$?`$\x15`$>`$.`$5`%\x07`$,`$$`%\0`$(`$,`%\0`$\x1a`$.`%\f`$$`$8`$>`$2`$2`%\x07`$\x16`$\x1c`%\t`$,`$.`$&`$&`$$`$%`$>`$(`$9`%\0`$6`$9`$0`$\x05`$2`$\x17`$\x15`$-`%\0`$(`$\x17`$0`$*`$>`$8`$0`$>`$$`$\x15`$?`$\x0f`$\t`$8`%\x07`$\x17`$/`%\0`$9`%\x02`$\x01`$\x06`$\x17`%\x07`$\x1f`%\0`$.`$\x16`%\v`$\x1c`$\x15`$>`$0`$\x05`$-`%\0`$\x17`$/`%\x07`$$`%\x01`$.`$5`%\v`$\x1f`$&`%\x07`$\x02`$\x05`$\x17`$0`$\x10`$8`%\x07`$.`%\x07`$2`$2`$\x17`$>`$9`$>`$2`$\n`$*`$0`$\x1a`$>`$0`$\x10`$8`$>`$&`%\x07`$0`$\x1c`$?`$8`$&`$?`$2`$,`$\x02`$&`$,`$(`$>`$9`%\x02`$\x02`$2`$>`$\x16`$\x1c`%\0`$$`$,`$\x1f`$(`$.`$?`$2`$\x07`$8`%\x07`$\x06`$(`%\x07`$(`$/`$>`$\x15`%\x01`$2`$2`%\t`$\x17`$-`$>`$\x17`$0`%\x07`$2`$\x1c`$\x17`$9`$0`$>`$.`$2`$\x17`%\x07`$*`%\x07`$\x1c`$9`$>`$%`$\x07`$8`%\0`$8`$9`%\0`$\x15`$2`$>`$ `%\0`$\x15`$9`$>`$\x01`$&`%\x02`$0`$$`$9`$$`$8`$>`$$`$/`$>`$&`$\x06`$/`$>`$*`$>`$\x15`$\x15`%\f`$(`$6`$>`$.`$&`%\x07`$\x16`$/`$9`%\0`$0`$>`$/`$\x16`%\x01`$&`$2`$\x17`%\0categoriesexperience</title>\r\nCopyright javascriptconditionseverything<p class="technologybackground<a class="management&copy; 201javaScriptcharactersbreadcrumbthemselveshorizontalgovernmentCaliforniaactivitiesdiscoveredNavigationtransitionconnectionnavigationappearance</title><mcheckbox" techniquesprotectionapparentlyas well asunt\', \'UA-resolutionoperationstelevisiontranslatedWashingtonnavigator. = window.impression&lt;br&gt;literaturepopulationbgcolor="#especially content="productionnewsletterpropertiesdefinitionleadershipTechnologyParliamentcomparisonul class=".indexOf("conclusiondiscussioncomponentsbiologicalRevolution_containerunderstoodnoscript><permissioneach otheratmosphere onfocus="<form id="processingthis.valuegenerationConferencesubsequentwell-knownvariationsreputationphenomenondisciplinelogo.png" (document,boundariesexpressionsettlementBackgroundout of theenterprise("https:" unescape("password" democratic<a href="/wrapper">\nmembershiplinguisticpx;paddingphilosophyassistanceuniversityfacilitiesrecognizedpreferenceif (typeofmaintainedvocabularyhypothesis.submit();&amp;nbsp;annotationbehind theFoundationpublisher"assumptionintroducedcorruptionscientistsexplicitlyinstead ofdimensions onClick="considereddepartmentoccupationsoon afterinvestmentpronouncedidentifiedexperimentManagementgeographic" height="link rel=".replace(/depressionconferencepunishmenteliminatedresistanceadaptationoppositionwell knownsupplementdeterminedh1 class="0px;marginmechanicalstatisticscelebratedGovernment\n\nDuring tdevelopersartificialequivalentoriginatedCommissionattachment<span id="there wereNederlandsbeyond theregisteredjournalistfrequentlyall of thelang="en" </style>\r\nabsolute; supportingextremely mainstream</strong> popularityemployment</table>\r\n colspan="</form>\n conversionabout the </p></div>integrated" lang="enPortuguesesubstituteindividualimpossiblemultimediaalmost allpx solid #apart fromsubject toin Englishcriticizedexcept forguidelinesoriginallyremarkablethe secondh2 class="<a title="(includingparametersprohibited= "http://dictionaryperceptionrevolutionfoundationpx;height:successfulsupportersmillenniumhis fatherthe &quot;no-repeat;commercialindustrialencouragedamount of unofficialefficiencyReferencescoordinatedisclaimerexpeditiondevelopingcalculatedsimplifiedlegitimatesubstring(0" class="completelyillustratefive yearsinstrumentPublishing1" class="psychologyconfidencenumber of absence offocused onjoined thestructurespreviously></iframe>once againbut ratherimmigrantsof course,a group ofLiteratureUnlike the</a>&nbsp;\nfunction it was theConventionautomobileProtestantaggressiveafter the Similarly," /></div>collection\r\nfunctionvisibilitythe use ofvolunteersattractionunder the threatened*<![CDATA[importancein generalthe latter</form>\n</.indexOf(\'i = 0; i <differencedevoted totraditionssearch forultimatelytournamentattributesso-called }\n</style>evaluationemphasizedaccessible</section>successionalong withMeanwhile,industries</a><br />has becomeaspects ofTelevisionsufficientbasketballboth sidescontinuingan article<img alt="adventureshis mothermanchesterprinciplesparticularcommentaryeffects ofdecided to"><strong>publishersJournal ofdifficultyfacilitateacceptablestyle.css"\tfunction innovation>Copyrightsituationswould havebusinessesDictionarystatementsoften usedpersistentin Januarycomprising</title>\n\tdiplomaticcontainingperformingextensionsmay not beconcept of onclick="It is alsofinancial making theLuxembourgadditionalare calledengaged in"script");but it waselectroniconsubmit="\n\x3c!-- End electricalofficiallysuggestiontop of theunlike theAustralianOriginallyreferences\n</head>\r\nrecognisedinitializelimited toAlexandriaretirementAdventuresfour years\n\n&lt;!-- increasingdecorationh3 class="origins ofobligationregulationclassified(function(advantagesbeing the historians<base hrefrepeatedlywilling tocomparabledesignatednominationfunctionalinside therevelationend of thes for the authorizedrefused totake placeautonomouscompromisepolitical restauranttwo of theFebruary 2quality ofswfobject.understandnearly allwritten byinterviews" width="1withdrawalfloat:leftis usuallycandidatesnewspapersmysteriousDepartmentbest knownparliamentsuppressedconvenientremembereddifferent systematichas led topropagandacontrolledinfluencesceremonialproclaimedProtectionli class="Scientificclass="no-trademarksmore than widespreadLiberationtook placeday of theas long asimprisonedAdditional\n<head>\n<mLaboratoryNovember 2exceptionsIndustrialvariety offloat: lefDuring theassessmenthave been deals withStatisticsoccurrence/ul></div>clearfix">the publicmany yearswhich wereover time,synonymouscontent">\npresumablyhis familyuserAgent.unexpectedincluding challengeda minorityundefined"belongs totaken fromin Octoberposition: said to bereligious Federation rowspan="only a fewmeant thatled to the--\x3e\r\n<div <fieldset>Archbishop class="nobeing usedapproachesprivilegesnoscript>\nresults inmay be theEaster eggmechanismsreasonablePopulationCollectionselected">noscript>\r/index.phparrival of-jssdk\'));managed toincompletecasualtiescompletionChristiansSeptember arithmeticproceduresmight haveProductionit appearsPhilosophyfriendshipleading togiving thetoward theguaranteeddocumentedcolor:#000video gamecommissionreflectingchange theassociatedsans-serifonkeypress; padding:He was theunderlyingtypically , and the srcElementsuccessivesince the should be networkingaccountinguse of thelower thanshows that</span>\n\t\tcomplaintscontinuousquantitiesastronomerhe did notdue to itsapplied toan averageefforts tothe futureattempt toTherefore,capabilityRepublicanwas formedElectronickilometerschallengespublishingthe formerindigenousdirectionssubsidiaryconspiracydetails ofand in theaffordablesubstancesreason forconventionitemtype="absolutelysupposedlyremained aattractivetravellingseparatelyfocuses onelementaryapplicablefound thatstylesheetmanuscriptstands for no-repeat(sometimesCommercialin Americaundertakenquarter ofan examplepersonallyindex.php?</button>\npercentagebest-knowncreating a" dir="ltrLieutenant\n<div id="they wouldability ofmade up ofnoted thatclear thatargue thatto anotherchildren\'spurpose offormulatedbased uponthe regionsubject ofpassengerspossession.\n\nIn the Before theafterwardscurrently across thescientificcommunity.capitalismin Germanyright-wingthe systemSociety ofpoliticiandirection:went on toremoval of New York apartmentsindicationduring theunless thehistoricalhad been adefinitiveingredientattendanceCenter forprominencereadyStatestrategiesbut in theas part ofconstituteclaim thatlaboratorycompatiblefailure of, such as began withusing the to providefeature offrom which/" class="geologicalseveral ofdeliberateimportant holds thating&quot; valign=topthe Germanoutside ofnegotiatedhis careerseparationid="searchwas calledthe fourthrecreationother thanpreventionwhile the education,connectingaccuratelywere builtwas killedagreementsmuch more Due to thewidth: 100some otherKingdom ofthe entirefamous forto connectobjectivesthe Frenchpeople andfeatured">is said tostructuralreferendummost oftena separate->\n<div id Official worldwide.aria-labelthe planetand it wasd" value="looking atbeneficialare in themonitoringreportedlythe modernworking onallowed towhere the innovative</a></div>soundtracksearchFormtend to beinput id="opening ofrestrictedadopted byaddressingtheologianmethods ofvariant ofChristian very largeautomotiveby far therange frompursuit offollow thebrought toin Englandagree thataccused ofcomes frompreventingdiv style=his or hertremendousfreedom ofconcerning0 1em 1em;Basketball/style.cssan earliereven after/" title=".com/indextaking thepittsburghcontent">\r<script>(fturned outhaving the</span>\r\n occasionalbecause itstarted tophysically></div>\n created byCurrently, bgcolor="tabindex="disastrousAnalytics also has a><div id="</style>\n<called forsinger and.src = "//violationsthis pointconstantlyis locatedrecordingsd from thenederlandsportuguC*sW"W\x11W(W\x19W*Y\x01X\'X1X3[\fdesarrollocomentarioeducaciC3nseptiembreregistradodirecciC3nubicaciC3npublicidadrespuestasresultadosimportantereservadosartC-culosdiferentessiguientesrepC:blicasituaciC3nministerioprivacidaddirectorioformaciC3npoblaciC3npresidentecont','enidosaccesoriostechnoratipersonalescategorC-aespecialesdisponibleactualidadreferenciavalladolidbibliotecarelacionescalendariopolC-ticasanterioresdocumentosnaturalezamaterialesdiferenciaeconC3micatransporterodrC-guezparticiparencuentrandiscusiC3nestructurafundaciC3nfrecuentespermanentetotalmenteP<P>P6P=P>P1Q\x03P4P5Q\x02P<P>P6P5Q\x02P2Q\0P5P<Q\x0fQ\x02P0P:P6P5Q\x07Q\x02P>P1Q\vP1P>P;P5P5P>Q\x07P5P=Q\fQ\rQ\x02P>P3P>P:P>P3P4P0P?P>Q\x01P;P5P2Q\x01P5P3P>Q\x01P0P9Q\x02P5Q\x07P5Q\0P5P7P<P>P3Q\x03Q\x02Q\x01P0P9Q\x02P0P6P8P7P=P8P<P5P6P4Q\x03P1Q\x03P4Q\x03Q\x02P\x1fP>P8Q\x01P:P7P4P5Q\x01Q\fP2P8P4P5P>Q\x01P2Q\x0fP7P8P=Q\x03P6P=P>Q\x01P2P>P5P9P;Q\x0eP4P5P9P?P>Q\0P=P>P<P=P>P3P>P4P5Q\x02P5P9Q\x01P2P>P8Q\x05P?Q\0P0P2P0Q\x02P0P:P>P9P<P5Q\x01Q\x02P>P8P<P5P5Q\x02P6P8P7P=Q\fP>P4P=P>P9P;Q\x03Q\x07Q\bP5P?P5Q\0P5P4Q\x07P0Q\x01Q\x02P8Q\x07P0Q\x01Q\x02Q\fQ\0P0P1P>Q\x02P=P>P2Q\vQ\x05P?Q\0P0P2P>Q\x01P>P1P>P9P?P>Q\x02P>P<P<P5P=P5P5Q\x07P8Q\x01P;P5P=P>P2Q\vP5Q\x03Q\x01P;Q\x03P3P>P:P>P;P>P=P0P7P0P4Q\x02P0P:P>P5Q\x02P>P3P4P0P?P>Q\x07Q\x02P8P\x1fP>Q\x01P;P5Q\x02P0P:P8P5P=P>P2Q\vP9Q\x01Q\x02P>P8Q\x02Q\x02P0P:P8Q\x05Q\x01Q\0P0P7Q\x03P!P0P=P:Q\x02Q\x04P>Q\0Q\x03P<P\x1aP>P3P4P0P:P=P8P3P8Q\x01P;P>P2P0P=P0Q\bP5P9P=P0P9Q\x02P8Q\x01P2P>P8P<Q\x01P2Q\x0fP7Q\fP;Q\x0eP1P>P9Q\x07P0Q\x01Q\x02P>Q\x01Q\0P5P4P8P\x1aQ\0P>P<P5P$P>Q\0Q\x03P<Q\0Q\vP=P:P5Q\x01Q\x02P0P;P8P?P>P8Q\x01P:Q\x02Q\vQ\x01Q\x0fQ\x07P<P5Q\x01Q\x0fQ\x06Q\x06P5P=Q\x02Q\0Q\x02Q\0Q\x03P4P0Q\x01P0P<Q\vQ\x05Q\0Q\vP=P:P0P\x1dP>P2Q\vP9Q\x07P0Q\x01P>P2P<P5Q\x01Q\x02P0Q\x04P8P;Q\fP<P<P0Q\0Q\x02P0Q\x01Q\x02Q\0P0P=P<P5Q\x01Q\x02P5Q\x02P5P:Q\x01Q\x02P=P0Q\bP8Q\x05P<P8P=Q\x03Q\x02P8P<P5P=P8P8P<P5Q\x0eQ\x02P=P>P<P5Q\0P3P>Q\0P>P4Q\x01P0P<P>P<Q\rQ\x02P>P<Q\x03P:P>P=Q\x06P5Q\x01P2P>P5P<P:P0P:P>P9P\x10Q\0Q\x05P8P2Y\x05Y\x06X*X/Y\tX%X1X3X\'Y\x04X1X3X\'Y\x04X)X\'Y\x04X9X\'Y\x05Y\x03X*X(Y\x07X\'X(X1X\'Y\x05X,X\'Y\x04Y\nY\bY\x05X\'Y\x04X5Y\bX1X,X/Y\nX/X)X\'Y\x04X9X6Y\bX%X6X\'Y\x01X)X\'Y\x04Y\x02X3Y\x05X\'Y\x04X9X\'X(X*X-Y\x05Y\nY\x04Y\x05Y\x04Y\x01X\'X*Y\x05Y\x04X*Y\x02Y\tX*X9X/Y\nY\x04X\'Y\x04X4X9X1X#X.X(X\'X1X*X7Y\bY\nX1X9Y\x04Y\nY\x03Y\x05X%X1Y\x01X\'Y\x02X7Y\x04X(X\'X*X\'Y\x04Y\x04X:X)X*X1X*Y\nX(X\'Y\x04Y\x06X\'X3X\'Y\x04X4Y\nX.Y\x05Y\x06X*X/Y\nX\'Y\x04X9X1X(X\'Y\x04Y\x02X5X5X\'Y\x01Y\x04X\'Y\x05X9Y\x04Y\nY\x07X\'X*X-X/Y\nX+X\'Y\x04Y\x04Y\x07Y\x05X\'Y\x04X9Y\x05Y\x04Y\x05Y\x03X*X(X)Y\nY\x05Y\x03Y\x06Y\x03X\'Y\x04X7Y\x01Y\x04Y\x01Y\nX/Y\nY\bX%X/X\'X1X)X*X\'X1Y\nX.X\'Y\x04X5X-X)X*X3X,Y\nY\x04X\'Y\x04Y\bY\x02X*X9Y\x06X/Y\x05X\'Y\x05X/Y\nY\x06X)X*X5Y\x05Y\nY\x05X#X1X4Y\nY\x01X\'Y\x04X0Y\nY\x06X9X1X(Y\nX)X(Y\bX\'X(X)X#Y\x04X9X\'X(X\'Y\x04X3Y\x01X1Y\x05X4X\'Y\x03Y\x04X*X9X\'Y\x04Y\tX\'Y\x04X#Y\bY\x04X\'Y\x04X3Y\x06X)X,X\'Y\x05X9X)X\'Y\x04X5X-Y\x01X\'Y\x04X/Y\nY\x06Y\x03Y\x04Y\x05X\'X*X\'Y\x04X.X\'X5X\'Y\x04Y\x05Y\x04Y\x01X#X9X6X\'X!Y\x03X*X\'X(X)X\'Y\x04X.Y\nX1X1X3X\'X&Y\x04X\'Y\x04Y\x02Y\x04X(X\'Y\x04X#X/X(Y\x05Y\x02X\'X7X9Y\x05X1X\'X3Y\x04Y\x05Y\x06X7Y\x02X)X\'Y\x04Y\x03X*X(X\'Y\x04X1X,Y\x04X\'X4X*X1Y\x03X\'Y\x04Y\x02X/Y\x05Y\nX9X7Y\nY\x03sByTagName(.jpg" alt="1px solid #.gif" alt="transparentinformationapplication" onclick="establishedadvertising.png" alt="environmentperformanceappropriate&amp;mdash;immediately</strong></rather thantemperaturedevelopmentcompetitionplaceholdervisibility:copyright">0" height="even thoughreplacementdestinationCorporation<ul class="AssociationindividualsperspectivesetTimeout(url(http://mathematicsmargin-top:eventually description) no-repeatcollections.JPG|thumb|participate/head><bodyfloat:left;<li class="hundreds of\n\nHowever, compositionclear:both;cooperationwithin the label for="border-top:New Zealandrecommendedphotographyinteresting&lt;sup&gt;controversyNetherlandsalternativemaxlength="switzerlandDevelopmentessentially\n\nAlthough </textarea>thunderbirdrepresented&amp;ndash;speculationcommunitieslegislationelectronics\n\t<div id="illustratedengineeringterritoriesauthoritiesdistributed6" height="sans-serif;capable of disappearedinteractivelooking forit would beAfghanistanwas createdMath.floor(surroundingcan also beobservationmaintenanceencountered<h2 class="more recentit has beeninvasion of).getTime()fundamentalDespite the"><div id="inspirationexaminationpreparationexplanation<input id="</a></span>versions ofinstrumentsbefore the = \'http://Descriptionrelatively .substring(each of theexperimentsinfluentialintegrationmany peopledue to the combinationdo not haveMiddle East<noscript><copyright" perhaps theinstitutionin Decemberarrangementmost famouspersonalitycreation oflimitationsexclusivelysovereignty-content">\n<td class="undergroundparallel todoctrine ofoccupied byterminologyRenaissancea number ofsupport forexplorationrecognitionpredecessor<img src="/<h1 class="publicationmay also bespecialized</fieldset>progressivemillions ofstates thatenforcementaround the one another.parentNodeagricultureAlternativeresearcherstowards theMost of themany other (especially<td width=";width:100%independent<h3 class=" onchange=").addClass(interactionOne of the daughter ofaccessoriesbranches of\r\n<div id="the largestdeclarationregulationsInformationtranslationdocumentaryin order to">\n<head>\n<" height="1across the orientation);<\/script>implementedcan be seenthere was ademonstratecontainer">connectionsthe Britishwas written!important;px; margin-followed byability to complicatedduring the immigrationalso called<h4 class="distinctionreplaced bygovernmentslocation ofin Novemberwhether the</p>\n</div>acquisitioncalled the persecutiondesignation{font-size:appeared ininvestigateexperiencedmost likelywidely useddiscussionspresence of (document.extensivelyIt has beenit does notcontrary toinhabitantsimprovementscholarshipconsumptioninstructionfor exampleone or morepx; paddingthe currenta series ofare usuallyrole in thepreviously derivativesevidence ofexperiencescolorschemestated thatcertificate</a></div>\n selected="high schoolresponse tocomfortableadoption ofthree yearsthe countryin Februaryso that thepeople who provided by<param nameaffected byin terms ofappointmentISO-8859-1"was born inhistorical regarded asmeasurementis based on and other : function(significantcelebrationtransmitted/js/jquery.is known astheoretical tabindex="it could be<noscript>\nhaving been\r\n<head>\r\n< &quot;The compilationhe had beenproduced byphilosopherconstructedintended toamong othercompared toto say thatEngineeringa differentreferred todifferencesbelief thatphotographsidentifyingHistory of Republic ofnecessarilyprobabilitytechnicallyleaving thespectacularfraction ofelectricityhead of therestaurantspartnershipemphasis onmost recentshare with saying thatfilled withdesigned toit is often"></iframe>as follows:merged withthrough thecommercial pointed outopportunityview of therequirementdivision ofprogramminghe receivedsetInterval"></span></in New Yorkadditional compression\n\n<div id="incorporate;<\/script><attachEventbecame the " target="_carried outSome of thescience andthe time ofContainer">maintainingChristopherMuch of thewritings of" height="2size of theversion of mixture of between theExamples ofeducationalcompetitive onsubmit="director ofdistinctive/DTD XHTML relating totendency toprovince ofwhich woulddespite thescientific legislature.innerHTML allegationsAgriculturewas used inapproach tointelligentyears later,sans-serifdeterminingPerformanceappearances, which is foundationsabbreviatedhigher thans from the individual composed ofsupposed toclaims thatattributionfont-size:1elements ofHistorical his brotherat the timeanniversarygoverned byrelated to ultimately innovationsit is stillcan only bedefinitionstoGMTStringA number ofimg class="Eventually,was changedoccurred inneighboringdistinguishwhen he wasintroducingterrestrialMany of theargues thatan Americanconquest ofwidespread were killedscreen and In order toexpected todescendantsare locatedlegislativegenerations backgroundmost peopleyears afterthere is nothe highestfrequently they do notargued thatshowed thatpredominanttheologicalby the timeconsideringshort-lived</span></a>can be usedvery littleone of the had alreadyinterpretedcommunicatefeatures ofgovernment,</noscript>entered the" height="3Independentpopulationslarge-scale. Although used in thedestructionpossibilitystarting intwo or moreexpressionssubordinatelarger thanhistory and</option>\r\nContinentaleliminatingwill not bepractice ofin front ofsite of theensure thatto create amississippipotentiallyoutstandingbetter thanwhat is nowsituated inmeta name="TraditionalsuggestionsTranslationthe form ofatmosphericideologicalenterprisescalculatingeast of theremnants ofpluginspage/index.php?remained intransformedHe was alsowas alreadystatisticalin favor ofMinistry ofmovement offormulationis required<link rel="This is the <a href="/popularizedinvolved inare used toand severalmade by theseems to belikely thatPalestiniannamed afterit had beenmost commonto refer tobut this isconsecutivetemporarilyIn general,conventionstakes placesubdivisionterritorialoperationalpermanentlywas largelyoutbreak ofin the pastfollowing a xmlns:og="><a class="class="textConversion may be usedmanufactureafter beingclearfix">\nquestion ofwas electedto become abecause of some peopleinspired bysuccessful a time whenmore commonamongst thean officialwidth:100%;technology,was adoptedto keep thesettlementslive birthsindex.html"Connecticutassigned to&amp;times;account foralign=rightthe companyalways beenreturned toinvolvementBecause thethis period" name="q" confined toa result ofvalue="" />is actuallyEnvironment\r\n</head>\r\nConversely,>\n<div id="0" width="1is probablyhave becomecontrollingthe problemcitizens ofpoliticiansreached theas early as:none; over<table cellvalidity ofdirectly toonmousedownwhere it iswhen it wasmembers of relation toaccommodatealong with In the latethe Englishdelicious">this is notthe presentif they areand finallya matter of\r\n\t</div>\r\n\r\n<\/script>faster thanmajority ofafter whichcomparativeto maintainimprove theawarded theer" class="frameborderrestorationin the sameanalysis oftheir firstDuring the continentalsequence offunction(){font-size: work on the<\/script>\n<begins withjavascript:constituentwas foundedequilibriumassume thatis given byneeds to becoordinatesthe variousare part ofonly in thesections ofis a commontheories ofdiscoveriesassociationedge of thestrength ofposition inpresent-dayuniversallyto form thebut insteadcorporationattached tois commonlyreasons for &quot;the can be madewas able towhich meansbut did notonMouseOveras possibleoperated bycoming fromthe primaryaddition offor severaltransferreda period ofare able tohowever, itshould havemuch larger\n\t<\/script>adopted theproperty ofdirected byeffectivelywas broughtchildren ofProgramminglonger thanmanuscriptswar againstby means ofand most ofsimilar to proprietaryoriginatingprestigiousgrammaticalexperience.to make theIt was alsois found incompetitorsin the U.S.replace thebrought thecalculationfall of thethe generalpracticallyin honor ofreleased inresidentialand some ofking of thereaction to1st Earl ofculture andprincipally</title>\n they can beback to thesome of hisexposure toare similarform of theaddFavoritecitizenshippart in thepeople within practiceto continue&amp;minus;approved by the first allowed theand for thefunctioningplaying thesolution toheight="0" in his bookmore than afollows thecreated thepresence in&nbsp;</td>nationalistthe idea ofa characterwere forced class="btndays of thefeatured inshowing theinterest inin place ofturn of thethe head ofLord of thepoliticallyhas its ownEducationalapproval ofsome of theeach other,behavior ofand becauseand anotherappeared onrecorded inblack&quot;may includethe world\'scan lead torefers to aborder="0" government winning theresulted in while the Washington,the subjectcity in the></div>\r\n\t\treflect theto completebecame moreradioactiverejected bywithout anyhis father,which couldcopy of theto indicatea politicalaccounts ofconstitutesworked wither</a></li>of his lifeaccompaniedclientWidthprevent theLegislativedifferentlytogether inhas severalfor anothertext of thefounded thee with the is used forchanged theusually theplace wherewhereas the> <a href=""><a href="themselves,although hethat can betraditionalrole of theas a resultremoveChilddesigned bywest of theSome peopleproduction,side of thenewslettersused by thedown to theaccepted bylive in theattempts tooutside thefrequenciesHowever, inprogrammersat least inapproximatealthough itwas part ofand variousGovernor ofthe articleturned into><a href="/the economyis the mostmost widelywould laterand perhapsrise to theoccurs whenunder whichconditions.the westerntheory thatis producedthe city ofin which heseen in thethe centralbuilding ofmany of hisarea of theis the onlymost of themany of thethe WesternThere is noextended toStatisticalcolspan=2 |short storypossible totopologicalcritical ofreported toa Christiandecision tois equal toproblems ofThis can bemerchandisefor most ofno evidenceeditions ofelements in&quot;. Thecom/images/which makesthe processremains theliterature,is a memberthe popularthe ancientproblems intime of thedefeated bybody of thea few yearsmuch of thethe work ofCalifornia,served as agovernment.concepts ofmovement in\t\t<div id="it" value="language ofas they areproduced inis that theexplain thediv></div>\nHowever thelead to the\t<a href="/was grantedpeople havecontinuallywas seen asand relatedthe role ofproposed byof the besteach other.Constantinepeople fromdialects ofto revisionwas renameda source ofthe initiallaunched inprovide theto the westwhere thereand similarbetween twois also theEnglish andconditions,that it wasentitled tothemselves.quantity ofransparencythe same asto join thecountry andthis is theThis led toa statementcontrast tolastIndexOfthrough hisis designedthe term isis providedprotect theng</a></li>The currentthe site ofsubstantialexperience,in the Westthey shouldslovenD\rinacomentariosuniversidadcondicionesactividadesexperienciatecnologC-aproducciC3npuntuaciC3naplicaciC3ncontraseC1acategorC-asregistrarseprofesionaltratamientoregC-stratesecretarC-aprincipalesprotecciC3nimportantesimportanciaposibilidadinteresantecrecimientonecesidadessuscribirseasociaciC3ndisponiblesevaluaciC3nestudiantesresponsableresoluciC3nguadalajararegistradosoportunidadcomercialesfotografC-aautoridadesingenierC-atelevisiC3ncompetenciaoperacionesestablecidosimplementeactualmentenavegaciC3nconformidadline-height:font-family:" : "http://applicationslink" href="specifically//<![CDATA[\nOrganizationdistribution0px; height:relationshipdevice-width<div class="<label for="registration</noscript>\n/index.html"window.open( !important;application/independence//www.googleorganizationautocompleterequirementsconservative<form name="intellectualmargin-left:18th centuryan importantinstitutionsabbreviation<img class="organisationcivilization19th centuryarchitectureincorporated20th century-container">most notably/></a></div>notification\'undefined\')Furthermore,believe thatinnerHTML = prior to thedramaticallyreferring tonegotiationsheadquartersSouth AfricaunsuccessfulPennsylvaniaAs a result,<html lang="&lt;/sup&gt;dealing withphiladelphiahistorically);<\/script>\npadding-top:experimentalgetAttributeinstructionstechnologiespart of the =function(){subscriptionl.dtd">\r\n<htgeographicalConstitution\', function(supported byagriculturalconstructionpublicationsfont-size: 1a variety of<div style="Encyclopediaiframe src="demonstratedaccomplisheduniversitiesDemographics);<\/script><dedicated toknowledge ofsatisfactionparticularly</div></div>English (US)appendChild(transmissions. However, intelligence" tabindex="float:right;Commonwealthranging fromin which theat least onereproductionencyclopedia;font-size:1jurisdictionat that time"><a class="In addition,description+conversationcontact withis generallyr" content="representing&lt;math&gt;presentationoccasionally<img width="navigation">compensationchampionshipmedia="all" violation ofreference toreturn true;Strict//EN" transactionsinterventionverificationInformation difficultiesChampionshipcapabilities<![endif]--\x3e}\n<\/script>\nChristianityfor example,Professionalrestrictionssuggest thatwas released(such as theremoveClass(unemploymentthe Americanstructure of/index.html published inspan class=""><a href="/introductionbelonging toclaimed thatconsequences<meta name="Guide to theoverwhelmingagainst the concentrated,\n.nontouch observations</a>\n</div>\nf (document.border: 1px {font-size:1treatment of0" height="1modificationIndependencedivided intogreater thanachievementsestablishingJavaScript" neverthelesssignificanceBroadcasting>&nbsp;</td>container">\nsuch as the influence ofa particularsrc=\'http://navigation" half of the substantial &nbsp;</div>advantage ofdiscovery offundamental metropolitanthe opposite" xml:lang="deliberatelyalign=centerevolution ofpreservationimprovementsbeginning inJesus ChristPublicationsdisagreementtext-align:r, function()similaritiesbody></html>is currentlyalphabeticalis sometimestype="image/many of the flow:hidden;available indescribe theexistence ofall over thethe Internet\t<ul class="installationneighborhoodarmed forcesreducing thecontinues toNonetheless,temperatures\n\t\t<a href="close to theexamples of is about the(see below)." id="searchprofessionalis availablethe official\t\t<\/script>\n\n\t\t<div id="accelerationthrough the Hall of Famedescriptionstranslationsinterference type=\'text/recent yearsin the worldvery popular{background:traditional some of the connected toexploitationemergence ofconstitutionA History ofsignificant manufacturedexpectations><noscript><can be foundbecause the has not beenneighbouringwithout the added to the\t<li class="instrumentalSoviet Unionacknowledgedwhich can bename for theattention toattempts to developmentsIn fact, the<li class="aimplicationssuitable formuch of the colonizationpresidentialcancelBubble Informationmost of the is describedrest of the more or lessin SeptemberIntelligencesrc="http://px; height: available tomanufacturerhuman rightslink href="/availabilityproportionaloutside the astronomicalhuman beingsname of the are found inare based onsmaller thana person whoexpansion ofarguing thatnow known asIn the earlyintermediatederived fromScandinavian</a></div>\r\nconsider thean estimatedthe National<div id="pagresulting incommissionedanalogous toare required/ul>\n</div>\nwas based onand became a&nbsp;&nbsp;t" value="" was capturedno more thanrespectivelycontinue to >\r\n<head>\r\n<were createdmore generalinformation used for theindependent the Imperialcomponent ofto the northinclude the Constructionside of the would not befor instanceinvention ofmore complexcollectivelybackground: text-align: its originalinto accountthis processan extensivehowever, thethey are notrejected thecriticism ofduring whichprobably thethis article(function(){It should bean agreementaccidentallydiffers fromArchitecturebetter knownarrangementsinfluence onattended theidentical tosouth of thepass throughxml" title="weight:bold;creating thedisplay:nonereplaced the<img src="/ihttps://www.World War IItestimonialsfound in therequired to and that thebetween the was designedconsists of considerablypublished bythe languageConservationconsisted ofrefer to theback to the css" media="People from available onproved to besuggestions"was known asvarieties oflikely to becomprised ofsupport the hands of thecoupled withconnect and border:none;performancesbefore beinglater becamecalculationsoften calledresidents ofmeaning that><li class="evidence forexplanationsenvironments"></a></div>which allowsIntroductiondeveloped bya wide rangeon behalf ofvalign="top"principle ofat the time,</noscript>\rsaid to havein the firstwhile othershypotheticalphilosopherspower of thecontained inperformed byinability towere writtenspan style="input name="the questionintended forrejection ofimplies thatinvented thethe standardwas probablylink betweenprofessor ofinteractionschanging theIndian Ocean class="lastworking with\'http://www.years beforeThis was therecreationalentering themeasurementsan extremelyvalue of thestart of the\n<\/script>\n\nan effort toincrease theto the southspacing="0">sufficientlythe Europeanconverted toclearTimeoutdid not haveconsequentlyfor the nextextension ofeconomic andalthough theare producedand with theinsufficientgiven by thestating thatexpenditures</span></a>\nthought thaton the basiscellpadding=image of thereturning toinformation,separated byassassinateds" content="authority ofnorthwestern</div>\n<div "></div>\r\n consultationcommunity ofthe nationalit should beparticipants align="leftthe greatestselection ofsupernaturaldependent onis mentionedallowing thewas inventedaccompanyinghis personalavailable atstudy of theon the otherexecution ofHuman Rightsterms of theassociationsresearch andsucceeded bydefeated theand from thebut they arecommander ofstate of theyears of agethe study of<ul class="splace in thewhere he was<li class="fthere are nowhich becamehe publishedexpressed into which thecommissionerfont-weight:territory ofextensions">Roman Empireequal to theIn contrast,however, andis typicallyand his wife(also called><ul class="effectively evolved intoseem to havewhich is thethere was noan excellentall of thesedescribed byIn practice,broadcastingcharged withreflected insubjected tomilitary andto the pointeconomicallysetTargetingare actuallyvictory over();<\/script>continuouslyrequired forevolutionaryan effectivenorth of the, which was front of theor otherwisesome form ofhad not beengenerated byinformation.permitted toincludes thedevelopment,entered intothe previousconsistentlyare known asthe field ofthis type ofgiven to thethe title ofcontains theinstances ofin the northdue to theirare designedcorporationswas that theone of thesemore popularsucceeded insupport fromin differentdominated bydesigned forownership ofand possiblystandardizedresponseTextwas intendedreceived theassumed thatareas of theprimarily inthe basis ofin the senseaccounts fordestroyed byat least twowas declaredcould not beSecretary ofappear to bemargin-top:1/^\\s+|\\s+$/ge){throw e};the start oftwo separatelanguage andwho had beenoperation ofdeath of thereal numbers\t<link rel="provided thethe story ofcompetitionsenglish (UK)english (US)P\x1cP>P=P3P>P;P!Q\0P?Q\x01P:P8Q\x01Q\0P?Q\x01P:P8Q\x01Q\0P?Q\x01P:P>Y\x04X9X1X(Y\nX)f-#i+\x14d8-f\x16\x07g.\0d=\x13d8-f\x16\x07g9\x01d=\x13d8-f\x16\x07f\x1c\ti\x19\x10e\x05,e\x0f8d::f0\x11f\x14?e:\x1ci\x18?i\x07\fe74e74g$>d<\x1ad8;d9\tf\x13\rd=\x1cg3;g;\x1ff\x14?g-\x16f3\x15h\'\x04informaciC3nherramientaselectrC3nicodescripciC3nclasificadosconocimientopublicaciC3nrelacionadasinformC!ticarelacionadosdepartamentotrabajadoresdirectamenteayuntamientomercadoLibrecontC!ctenoshabitacionescumplimientorestaurantesdisposiciC3nconsecuenciaelectrC3nicaaplicacionesdesconectadoinstalaciC3nrealizaciC3nutilizaciC3nenciclopediaenfermedadesinstrumentosexperienciasinstituciC3nparticularessubcategoriaQ\x02P>P;Q\fP:P>P P>Q\x01Q\x01P8P8Q\0P0P1P>Q\x02Q\vP1P>P;Q\fQ\bP5P?Q\0P>Q\x01Q\x02P>P<P>P6P5Q\x02P5P4Q\0Q\x03P3P8Q\x05Q\x01P;Q\x03Q\x07P0P5Q\x01P5P9Q\x07P0Q\x01P2Q\x01P5P3P4P0P P>Q\x01Q\x01P8Q\x0fP\x1cP>Q\x01P:P2P5P4Q\0Q\x03P3P8P5P3P>Q\0P>P4P0P2P>P?Q\0P>Q\x01P4P0P=P=Q\vQ\x05P4P>P;P6P=Q\vP8P<P5P=P=P>P\x1cP>Q\x01P:P2Q\vQ\0Q\x03P1P;P5P9P\x1cP>Q\x01P:P2P0Q\x01Q\x02Q\0P0P=Q\vP=P8Q\x07P5P3P>Q\0P0P1P>Q\x02P5P4P>P;P6P5P=Q\x03Q\x01P;Q\x03P3P8Q\x02P5P?P5Q\0Q\fP\x1eP4P=P0P:P>P?P>Q\x02P>P<Q\x03Q\0P0P1P>Q\x02Q\x03P0P?Q\0P5P;Q\x0fP2P>P>P1Q\tP5P>P4P=P>P3P>Q\x01P2P>P5P3P>Q\x01Q\x02P0Q\x02Q\fP8P4Q\0Q\x03P3P>P9Q\x04P>Q\0Q\x03P<P5Q\x05P>Q\0P>Q\bP>P?Q\0P>Q\x02P8P2Q\x01Q\x01Q\vP;P:P0P:P0P6P4Q\vP9P2P;P0Q\x01Q\x02P8P3Q\0Q\x03P?P?Q\vP2P<P5Q\x01Q\x02P5Q\0P0P1P>Q\x02P0Q\x01P:P0P7P0P;P?P5Q\0P2Q\vP9P4P5P;P0Q\x02Q\fP4P5P=Q\fP3P8P?P5Q\0P8P>P4P1P8P7P=P5Q\x01P>Q\x01P=P>P2P5P<P>P<P5P=Q\x02P:Q\x03P?P8Q\x02Q\fP4P>P;P6P=P0Q\0P0P<P:P0Q\x05P=P0Q\x07P0P;P>P P0P1P>Q\x02P0P"P>P;Q\fP:P>Q\x01P>P2Q\x01P5P<P2Q\x02P>Q\0P>P9P=P0Q\x07P0P;P0Q\x01P?P8Q\x01P>P:Q\x01P;Q\x03P6P1Q\vQ\x01P8Q\x01Q\x02P5P<P?P5Q\x07P0Q\x02P8P=P>P2P>P3P>P?P>P<P>Q\tP8Q\x01P0P9Q\x02P>P2P?P>Q\x07P5P<Q\x03P?P>P<P>Q\tQ\fP4P>P;P6P=P>Q\x01Q\x01Q\vP;P:P8P1Q\vQ\x01Q\x02Q\0P>P4P0P=P=Q\vP5P<P=P>P3P8P5P?Q\0P>P5P:Q\x02P!P5P9Q\x07P0Q\x01P<P>P4P5P;P8Q\x02P0P:P>P3P>P>P=P;P0P9P=P3P>Q\0P>P4P5P2P5Q\0Q\x01P8Q\x0fQ\x01Q\x02Q\0P0P=P5Q\x04P8P;Q\fP<Q\vQ\x03Q\0P>P2P=Q\x0fQ\0P0P7P=Q\vQ\x05P8Q\x01P:P0Q\x02Q\fP=P5P4P5P;Q\x0eQ\x0fP=P2P0Q\0Q\x0fP<P5P=Q\fQ\bP5P<P=P>P3P8Q\x05P4P0P=P=P>P9P7P=P0Q\x07P8Q\x02P=P5P;Q\fP7Q\x0fQ\x04P>Q\0Q\x03P<P0P"P5P?P5Q\0Q\fP<P5Q\x01Q\x0fQ\x06P0P7P0Q\tP8Q\x02Q\vP\x1bQ\x03Q\x07Q\bP8P5`$(`$9`%\0`$\x02`$\x15`$0`$(`%\x07`$\x05`$*`$(`%\x07`$\x15`$?`$/`$>`$\x15`$0`%\x07`$\x02`$\x05`$(`%\r`$/`$\x15`%\r`$/`$>`$\x17`$>`$\x07`$!`$,`$>`$0`%\x07`$\x15`$?`$8`%\0`$&`$?`$/`$>`$*`$9`$2`%\x07`$8`$?`$\x02`$9`$-`$>`$0`$$`$\x05`$*`$(`%\0`$5`$>`$2`%\x07`$8`%\x07`$5`$>`$\x15`$0`$$`%\x07`$.`%\x07`$0`%\x07`$9`%\v`$(`%\x07`$8`$\x15`$$`%\x07`$,`$9`%\x01`$$`$8`$>`$\x07`$\x1f`$9`%\v`$\x17`$>`$\x1c`$>`$(`%\x07`$.`$?`$(`$\x1f`$\x15`$0`$$`$>`$\x15`$0`$(`$>`$\t`$(`$\x15`%\x07`$/`$9`$>`$\x01`$8`$,`$8`%\x07`$-`$>`$7`$>`$\x06`$*`$\x15`%\x07`$2`$?`$/`%\x07`$6`%\x01`$0`%\x02`$\x07`$8`$\x15`%\x07`$\x18`$\x02`$\x1f`%\x07`$.`%\x07`$0`%\0`$8`$\x15`$$`$>`$.`%\x07`$0`$>`$2`%\x07`$\x15`$0`$\x05`$\'`$?`$\x15`$\x05`$*`$(`$>`$8`$.`$>`$\x1c`$.`%\x01`$\x1d`%\x07`$\x15`$>`$0`$#`$9`%\v`$$`$>`$\x15`$!`$<`%\0`$/`$9`$>`$\x02`$9`%\v`$\x1f`$2`$6`$,`%\r`$&`$2`$?`$/`$>`$\x1c`%\0`$5`$(`$\x1c`$>`$$`$>`$\x15`%\b`$8`%\x07`$\x06`$*`$\x15`$>`$5`$>`$2`%\0`$&`%\x07`$(`%\x07`$*`%\x02`$0`%\0`$*`$>`$(`%\0`$\t`$8`$\x15`%\x07`$9`%\v`$\x17`%\0`$,`%\b`$ `$\x15`$\x06`$*`$\x15`%\0`$5`$0`%\r`$7`$\x17`$>`$\x02`$5`$\x06`$*`$\x15`%\v`$\x1c`$?`$2`$>`$\x1c`$>`$(`$>`$8`$9`$.`$$`$9`$.`%\x07`$\x02`$\t`$(`$\x15`%\0`$/`$>`$9`%\x02`$&`$0`%\r`$\x1c`$8`%\x02`$\x1a`%\0`$*`$8`$\x02`$&`$8`$5`$>`$2`$9`%\v`$(`$>`$9`%\v`$$`%\0`$\x1c`%\b`$8`%\x07`$5`$>`$*`$8`$\x1c`$(`$$`$>`$(`%\x07`$$`$>`$\x1c`$>`$0`%\0`$\x18`$>`$/`$2`$\x1c`$?`$2`%\x07`$(`%\0`$\x1a`%\x07`$\x1c`$>`$\x02`$\x1a`$*`$$`%\r`$0`$\x17`%\x02`$\x17`$2`$\x1c`$>`$$`%\x07`$,`$>`$9`$0`$\x06`$*`$(`%\x07`$5`$>`$9`$(`$\x07`$8`$\x15`$>`$8`%\x01`$,`$9`$0`$9`$(`%\x07`$\x07`$8`$8`%\x07`$8`$9`$?`$$`$,`$!`$<`%\x07`$\x18`$\x1f`$(`$>`$$`$2`$>`$6`$*`$>`$\x02`$\x1a`$6`%\r`$0`%\0`$,`$!`$<`%\0`$9`%\v`$$`%\x07`$8`$>`$\b`$\x1f`$6`$>`$/`$&`$8`$\x15`$$`%\0`$\x1c`$>`$$`%\0`$5`$>`$2`$>`$9`$\x1c`$>`$0`$*`$\x1f`$(`$>`$0`$\x16`$(`%\x07`$8`$!`$<`$\x15`$.`$?`$2`$>`$\t`$8`$\x15`%\0`$\x15`%\x07`$5`$2`$2`$\x17`$$`$>`$\x16`$>`$(`$>`$\x05`$0`%\r`$%`$\x1c`$9`$>`$\x02`$&`%\x07`$\x16`$>`$*`$9`$2`%\0`$(`$?`$/`$.`$,`$?`$(`$>`$,`%\b`$\x02`$\x15`$\x15`$9`%\0`$\x02`$\x15`$9`$(`$>`$&`%\x07`$$`$>`$9`$.`$2`%\x07`$\x15`$>`$+`%\0`$\x1c`$,`$\x15`$?`$$`%\x01`$0`$$`$.`$>`$\x02`$\x17`$5`$9`%\0`$\x02`$0`%\v`$\x1c`$<`$.`$?`$2`%\0`$\x06`$0`%\v`$*`$8`%\x07`$(`$>`$/`$>`$&`$5`$2`%\x07`$(`%\x07`$\x16`$>`$$`$>`$\x15`$0`%\0`$,`$\t`$(`$\x15`$>`$\x1c`$5`$>`$,`$*`%\x02`$0`$>`$,`$!`$<`$>`$8`%\f`$&`$>`$6`%\x07`$/`$0`$\x15`$?`$/`%\x07`$\x15`$9`$>`$\x02`$\x05`$\x15`$8`$0`$,`$(`$>`$\x0f`$5`$9`$>`$\x02`$8`%\r`$%`$2`$.`$?`$2`%\x07`$2`%\x07`$\x16`$\x15`$5`$?`$7`$/`$\x15`%\r`$0`$\x02`$8`$.`%\x02`$9`$%`$>`$(`$>X*X3X*X7Y\nX9Y\x05X4X\'X1Y\x03X)X(Y\bX\'X3X7X)X\'Y\x04X5Y\x01X-X)Y\x05Y\bX\'X6Y\nX9X\'Y\x04X.X\'X5X)X\'Y\x04Y\x05X2Y\nX/X\'Y\x04X9X\'Y\x05X)X\'Y\x04Y\x03X\'X*X(X\'Y\x04X1X/Y\bX/X(X1Y\x06X\'Y\x05X,X\'Y\x04X/Y\bY\x04X)X\'Y\x04X9X\'Y\x04Y\x05X\'Y\x04Y\x05Y\bY\x02X9X\'Y\x04X9X1X(Y\nX\'Y\x04X3X1Y\nX9X\'Y\x04X,Y\bX\'Y\x04X\'Y\x04X0Y\x07X\'X(X\'Y\x04X-Y\nX\'X)X\'Y\x04X-Y\x02Y\bY\x02X\'Y\x04Y\x03X1Y\nY\x05X\'Y\x04X9X1X\'Y\x02Y\x05X-Y\x01Y\bX8X)X\'Y\x04X+X\'Y\x06Y\nY\x05X4X\'Y\x07X/X)X\'Y\x04Y\x05X1X#X)X\'Y\x04Y\x02X1X"Y\x06X\'Y\x04X4X(X\'X(X\'Y\x04X-Y\bX\'X1X\'Y\x04X,X/Y\nX/X\'Y\x04X#X3X1X)X\'Y\x04X9Y\x04Y\bY\x05Y\x05X,Y\x05Y\bX9X)X\'Y\x04X1X-Y\x05Y\x06X\'Y\x04Y\x06Y\x02X\'X7Y\x01Y\x04X3X7Y\nY\x06X\'Y\x04Y\x03Y\bY\nX*X\'Y\x04X/Y\x06Y\nX\'X(X1Y\x03X\'X*Y\x07X\'Y\x04X1Y\nX\'X6X*X-Y\nX\'X*Y\nX(X*Y\bY\x02Y\nX*X\'Y\x04X#Y\bY\x04Y\tX\'Y\x04X(X1Y\nX/X\'Y\x04Y\x03Y\x04X\'Y\x05X\'Y\x04X1X\'X(X7X\'Y\x04X4X.X5Y\nX3Y\nX\'X1X\'X*X\'Y\x04X+X\'Y\x04X+X\'Y\x04X5Y\x04X\'X)X\'Y\x04X-X/Y\nX+X\'Y\x04X2Y\bX\'X1X\'Y\x04X.Y\x04Y\nX,X\'Y\x04X,Y\x05Y\nX9X\'Y\x04X9X\'Y\x05Y\x07X\'Y\x04X,Y\x05X\'Y\x04X\'Y\x04X3X\'X9X)Y\x05X4X\'Y\x07X/Y\x07X\'Y\x04X1X&Y\nX3X\'Y\x04X/X.Y\bY\x04X\'Y\x04Y\x01Y\x06Y\nX)X\'Y\x04Y\x03X*X\'X(X\'Y\x04X/Y\bX1Y\nX\'Y\x04X/X1Y\bX3X\'X3X*X:X1Y\x02X*X5X\'Y\x05Y\nY\x05X\'Y\x04X(Y\x06X\'X*X\'Y\x04X9X8Y\nY\x05entertainmentunderstanding = function().jpg" width="configuration.png" width="<body class="Math.random()contemporary United Statescircumstances.appendChild(organizations<span class=""><img src="/distinguishedthousands of communicationclear"></div>investigationfavicon.ico" margin-right:based on the Massachusettstable border=internationalalso known aspronunciationbackground:#fpadding-left:For example, miscellaneous&lt;/math&gt;psychologicalin particularearch" type="form method="as opposed toSupreme Courtoccasionally Additionally,North Americapx;backgroundopportunitiesEntertainment.toLowerCase(manufacturingprofessional combined withFor instance,consisting of" maxlength="return false;consciousnessMediterraneanextraordinaryassassinationsubsequently button type="the number ofthe original comprehensiverefers to the</ul>\n</div>\nphilosophicallocation.hrefwas publishedSan Francisco(function(){\n<div id="mainsophisticatedmathematical /head>\r\n<bodysuggests thatdocumentationconcentrationrelationshipsmay have been(for example,This article in some casesparts of the definition ofGreat Britain cellpadding=equivalent toplaceholder="; font-size: justificationbelieved thatsuffered fromattempted to leader of thecript" src="/(function() {are available\n\t<link rel=" src=\'http://interested inconventional " alt="" /></are generallyhas also beenmost popular correspondingcredited withtyle="border:</a></span></.gif" width="<iframe src="table class="inline-block;according to together withapproximatelyparliamentarymore and moredisplay:none;traditionallypredominantly&nbsp;|&nbsp;&nbsp;</span> cellspacing=<input name="or" content="controversialproperty="og:/x-shockwave-demonstrationsurrounded byNevertheless,was the firstconsiderable Although the collaborationshould not beproportion of<span style="known as the shortly afterfor instance,described as /head>\n<body starting withincreasingly the fact thatdiscussion ofmiddle of thean individualdifficult to point of viewhomosexualityacceptance of</span></div>manufacturersorigin of thecommonly usedimportance ofdenominationsbackground: #length of thedeterminationa significant" border="0">revolutionaryprinciples ofis consideredwas developedIndo-Europeanvulnerable toproponents ofare sometimescloser to theNew York City name="searchattributed tocourse of themathematicianby the end ofat the end of" border="0" technological.removeClass(branch of theevidence that![endif]--\x3e\r\nInstitute of into a singlerespectively.and thereforeproperties ofis located insome of whichThere is alsocontinued to appearance of &amp;ndash; describes theconsiderationauthor of theindependentlyequipped withdoes not have</a><a href="confused with<link href="/at the age ofappear in theThese includeregardless ofcould be used style=&quot;several timesrepresent thebody>\n</html>thought to bepopulation ofpossibilitiespercentage ofaccess to thean attempt toproduction ofjquery/jquerytwo differentbelong to theestablishmentreplacing thedescription" determine theavailable forAccording to wide range of\t<div class="more commonlyorganisationsfunctionalitywas completed &amp;mdash; participationthe characteran additionalappears to befact that thean example ofsignificantlyonmouseover="because they async = true;problems withseems to havethe result of src="http://familiar withpossession offunction () {took place inand sometimessubstantially<span></span>is often usedin an attemptgreat deal ofEnvironmentalsuccessfully virtually all20th century,professionalsnecessary to determined bycompatibilitybecause it isDictionary ofmodificationsThe followingmay refer to:Consequently,Internationalalthough somethat would beworld\'s firstclassified asbottom of the(particularlyalign="left" most commonlybasis for thefoundation ofcontributionspopularity ofcenter of theto reduce thejurisdictionsapproximation onmouseout="New Testamentcollection of</span></a></in the Unitedfilm director-strict.dtd">has been usedreturn to thealthough thischange in theseveral otherbut there areunprecedentedis similar toespecially inweight: bold;is called thecomputationalindicate thatrestricted to\t<meta name="are typicallyconflict withHowever, the An example ofcompared withquantities ofrather than aconstellationnecessary forreported thatspecificationpolitical and&nbsp;&nbsp;<references tothe same yearGovernment ofgeneration ofhave not beenseveral yearscommitment to\t\t<ul class="visualization19th century,practitionersthat he wouldand continuedoccupation ofis defined ascentre of thethe amount of><div style="equivalent ofdifferentiatebrought aboutmargin-left: automaticallythought of asSome of these\n<div class="input class="replaced withis one of theeducation andinfluenced byreputation as\n<meta name="accommodation</div>\n</div>large part ofInstitute forthe so-called against the In this case,was appointedclaimed to beHowever, thisDepartment ofthe remainingeffect on theparticularly deal with the\n<div style="almost alwaysare currentlyexpression ofphilosophy offor more thancivilizationson the islandselectedIndexcan result in" value="" />the structure /></a></div>Many of thesecaused by theof the Unitedspan class="mcan be tracedis related tobecame one ofis frequentlyliving in thetheoreticallyFollowing theRevolutionarygovernment inis determinedthe politicalintroduced insufficient todescription">short storiesseparation ofas to whetherknown for itswas initiallydisplay:blockis an examplethe principalconsists of arecognized as/body></html>a substantialreconstructedhead of stateresistance toundergraduateThere are twogravitationalare describedintentionallyserved as theclass="headeropposition tofundamentallydominated theand the otheralliance withwas forced torespectively,and politicalin support ofpeople in the20th century.and publishedloadChartbeatto understandmember statesenvironmentalfirst half ofcountries andarchitecturalbe consideredcharacterizedclearIntervalauthoritativeFederation ofwas succeededand there area consequencethe Presidentalso includedfree softwaresuccession ofdeveloped thewas destroyedaway from the;\n<\/script>\n<although theyfollowed by amore powerfulresulted in aUniversity ofHowever, manythe presidentHowever, someis thought tountil the endwas announcedare importantalso includes><input type=the center of DO NOT ALTERused to referthemes/?sort=that had beenthe basis forhas developedin the summercomparativelydescribed thesuch as thosethe resultingis impossiblevarious otherSouth Africanhave the sameeffectivenessin which case; text-align:structure and; background:regarding thesupported theis also knownstyle="marginincluding thebahasa Melayunorsk bokmC%lnorsk nynorskslovenE!D\rinainternacionalcalificaciC3ncomunicaciC3nconstrucciC3n"><div class="disambiguationDomainName\', \'administrationsimultaneouslytransportationInternational margin-bottom:responsibility<![endif]--\x3e\n</><meta name="implementationinfrastructurerepresentationborder-bottom:</head>\n<body>=http%3A%2F%2F<form method="method="post" /favicon.ico" });\n<\/script>\n.setAttribute(Administration= new Array();<![endif]--\x3e\r\ndisplay:block;Unfortunately,">&nbsp;</div>/favicon.ico">=\'stylesheet\' identification, for example,<li><a href="/an alternativeas a result ofpt"><\/script>\ntype="submit" \n(function() {recommendationform action="/transformationreconstruction.style.display According to hidden" name="along with thedocument.body.approximately Communicationspost" action="meaning &quot;--<![endif]--\x3ePrime Ministercharacteristic</a> <a class=the history of onmouseover="the governmenthref="https://was originallywas introducedclassificationrepresentativeare considered<![endif]--\x3e\n\ndepends on theUniversity of in contrast to placeholder="in the case ofinternational constitutionalstyle="border-: function() {Because of the-strict.dtd">\n<table class="accompanied byaccount of the<script src="/nature of the the people in in addition tos); js.id = id" width="100%"regarding the Roman Catholican independentfollowing the .gif" width="1the following discriminationarchaeologicalprime minister.js"><\/script>combination of marginwidth="createElement(w.attachEvent(</a></td></tr>src="https://aIn particular, align="left" Czech RepublicUnited Kingdomcorrespondenceconcluded that.html" title="(function () {comes from theapplication of<span class="sbelieved to beement(\'script\'</a>\n</li>\n<livery different><span class="option value="(also known as\t<li><a href="><input name="separated fromreferred to as valign="top">founder of theattempting to carbon dioxide\n\n<div class="class="search-/body>\n</html>opportunity tocommunications</head>\r\n<body style="width:Tia:?ng Via;\x07tchanges in theborder-color:#0" border="0" </span></div><was discovered" type="text" );\n<\/script>\n\nDepartment of ecclesiasticalthere has beenresulting from</body></html>has never beenthe first timein response toautomatically </div>\n\n<div iwas consideredpercent of the" /></a></div>collection of descended fromsection of theaccept-charsetto be confusedmember of the padding-right:translation ofinterpretation href=\'http://whether or notThere are alsothere are manya small numberother parts ofimpossible to class="buttonlocated in the. However, theand eventuallyAt the end of because of itsrepresents the<form action=" method="post"it is possiblemore likely toan increase inhave also beencorresponds toannounced thatalign="right">many countriesfor many yearsearliest knownbecause it waspt"><\/script>\r valign="top" inhabitants offollowing year\r\n<div class="million peoplecontroversial concerning theargue that thegovernment anda reference totransferred todescribing the style="color:although therebest known forsubmit" name="multiplicationmore than one recognition ofCouncil of theedition of the <meta name="Entertainment away from the ;margin-right:at the time ofinvestigationsconnected withand many otheralthough it isbeginning with <span class="descendants of<span class="i align="right"</head>\n<body aspects of thehas since beenEuropean Unionreminiscent ofmore difficultVice Presidentcomposition ofpassed throughmore importantfont-size:11pxexplanation ofthe concept ofwritten in the\t<span class="is one of the resemblance toon the groundswhich containsincluding the defined by thepublication ofmeans that theoutside of thesupport of the<input class="<span class="t(Math.random()most prominentdescription ofConstantinoplewere published<div class="seappears in the1" height="1" most importantwhich includeswhich had beendestruction ofthe population\n\t<div class="possibility ofsometimes usedappear to havesuccess of theintended to bepresent in thestyle="clear:b\r\n<\/script>\r\n<was founded ininterview with_id" content="capital of the\r\n<link rel="srelease of thepoint out thatxMLHttpRequestand subsequentsecond largestvery importantspecificationssurface of theapplied to theforeign policy_setDomainNameestablished inis believed toIn addition tomeaning of theis named afterto protect theis representedDeclaration ofmore efficientClassificationother forms ofhe returned to<span class="cperformance of(function() {\rif and only ifregions of theleading to therelations withUnited Nationsstyle="height:other than theype" content="Association of\n</head>\n<bodylocated on theis referred to(including theconcentrationsthe individualamong the mostthan any other/>\n<link rel=" return false;the purpose ofthe ability to;color:#fff}\n.\n<span class="the subject ofdefinitions of>\r\n<link rel="claim that thehave developed<table width="celebration ofFollowing the to distinguish<span class="btakes place inunder the namenoted that the><![endif]--\x3e\nstyle="margin-instead of theintroduced thethe process ofincreasing thedifferences inestimated thatespecially the/div><div id="was eventuallythroughout histhe differencesomething thatspan></span></significantly ><\/script>\r\n\r\nenvironmental to prevent thehave been usedespecially forunderstand theis essentiallywere the firstis the largesthave been made" src="http://interpreted assecond half ofcrolling="no" is composed ofII, Holy Romanis expected tohave their owndefined as thetraditionally have differentare often usedto ensure thatagreement withcontaining theare frequentlyinformation onexample is theresulting in a</a></li></ul> class="footerand especiallytype="button" </span></span>which included>\n<meta name="considered thecarried out byHowever, it isbecame part ofin relation topopular in thethe capital ofwas officiallywhich has beenthe History ofalternative todifferent fromto support thesuggested thatin the process <div class="the foundationbecause of hisconcerned withthe universityopposed to thethe context of<span class="ptext" name="q"\t\t<div class="the scientificrepresented bymathematicianselected by thethat have been><div class="cdiv id="headerin particular,converted into);\n<\/script>\n<philosophical srpskohrvatskitia:?ng Via;\x07tP Q\x03Q\x01Q\x01P:P8P9Q\0Q\x03Q\x01Q\x01P:P8P9investigaciC3nparticipaciC3nP:P>Q\x02P>Q\0Q\vP5P>P1P;P0Q\x01Q\x02P8P:P>Q\x02P>Q\0Q\vP9Q\x07P5P;P>P2P5P:Q\x01P8Q\x01Q\x02P5P<Q\vP\x1dP>P2P>Q\x01Q\x02P8P:P>Q\x02P>Q\0Q\vQ\x05P>P1P;P0Q\x01Q\x02Q\fP2Q\0P5P<P5P=P8P:P>Q\x02P>Q\0P0Q\x0fQ\x01P5P3P>P4P=Q\x0fQ\x01P:P0Q\x07P0Q\x02Q\fP=P>P2P>Q\x01Q\x02P8P#P:Q\0P0P8P=Q\vP2P>P?Q\0P>Q\x01Q\vP:P>Q\x02P>Q\0P>P9Q\x01P4P5P;P0Q\x02Q\fP?P>P<P>Q\tQ\fQ\x0eQ\x01Q\0P5P4Q\x01Q\x02P2P>P1Q\0P0P7P>P<Q\x01Q\x02P>Q\0P>P=Q\vQ\x03Q\x07P0Q\x01Q\x02P8P5Q\x02P5Q\x07P5P=P8P5P\x13P;P0P2P=P0Q\x0fP8Q\x01Q\x02P>Q\0P8P8Q\x01P8Q\x01Q\x02P5P<P0Q\0P5Q\bP5P=P8Q\x0fP!P:P0Q\x07P0Q\x02Q\fP?P>Q\rQ\x02P>P<Q\x03Q\x01P;P5P4Q\x03P5Q\x02Q\x01P:P0P7P0Q\x02Q\fQ\x02P>P2P0Q\0P>P2P:P>P=P5Q\x07P=P>Q\0P5Q\bP5P=P8P5P:P>Q\x02P>Q\0P>P5P>Q\0P3P0P=P>P2P:P>Q\x02P>Q\0P>P<P P5P:P;P0P<P0X\'Y\x04Y\x05Y\x06X*X/Y\tY\x05Y\x06X*X/Y\nX\'X*X\'Y\x04Y\x05Y\bX6Y\bX9X\'Y\x04X(X1X\'Y\x05X,X\'Y\x04Y\x05Y\bX\'Y\x02X9X\'Y\x04X1X3X\'X&Y\x04Y\x05X4X\'X1Y\x03X\'X*X\'Y\x04X#X9X6X\'X!X\'Y\x04X1Y\nX\'X6X)X\'Y\x04X*X5Y\x05Y\nY\x05X\'Y\x04X\'X9X6X\'X!X\'Y\x04Y\x06X*X\'X&X,X\'Y\x04X#Y\x04X9X\'X(X\'Y\x04X*X3X,Y\nY\x04X\'Y\x04X#Y\x02X3X\'Y\x05X\'Y\x04X6X:X7X\'X*X\'Y\x04Y\x01Y\nX/Y\nY\bX\'Y\x04X*X1X-Y\nX(X\'Y\x04X,X/Y\nX/X)X\'Y\x04X*X9Y\x04Y\nY\x05X\'Y\x04X#X.X(X\'X1X\'Y\x04X\'Y\x01Y\x04X\'Y\x05X\'Y\x04X#Y\x01Y\x04X\'Y\x05X\'Y\x04X*X\'X1Y\nX.X\'Y\x04X*Y\x02Y\x06Y\nX)X\'Y\x04X\'Y\x04X9X\'X(X\'Y\x04X.Y\bX\'X7X1X\'Y\x04Y\x05X,X*Y\x05X9X\'Y\x04X/Y\nY\x03Y\bX1X\'Y\x04X3Y\nX\'X-X)X9X(X/X\'Y\x04Y\x04Y\x07X\'Y\x04X*X1X(Y\nX)X\'Y\x04X1Y\bX\'X(X7X\'Y\x04X#X/X(Y\nX)X\'Y\x04X\'X.X(X\'X1X\'Y\x04Y\x05X*X-X/X)X\'Y\x04X\'X:X\'Y\x06Y\ncursor:pointer;</title>\n<meta " href="http://"><span class="members of the window.locationvertical-align:/a> | <a href="<!doctype html>media="screen" <option value="favicon.ico" />\n\t\t<div class="characteristics" method="get" /body>\n</html>\nshortcut icon" document.write(padding-bottom:representativessubmit" value="align="center" throughout the science fiction\n <div class="submit" class="one of the most valign="top"><was established);\r\n<\/script>\r\nreturn false;">).style.displaybecause of the document.cookie<form action="/}body{margin:0;Encyclopedia ofversion of the .createElement(name" content="</div>\n</div>\n\nadministrative </body>\n</html>history of the "><input type="portion of the as part of the &nbsp;<a href="other countries">\n<div class="</span></span><In other words,display: block;control of the introduction of/>\n<meta name="as well as the in recent years\r\n\t<div class="</div>\n\t</div>\ninspired by thethe end of the compatible withbecame known as style="margin:.js"><\/script>< International there have beenGerman language style="color:#Communist Partyconsistent withborder="0" cell marginheight="the majority of" align="centerrelated to the many different Orthodox Churchsimilar to the />\n<link rel="swas one of the until his death})();\n<\/script>other languagescompared to theportions of thethe Netherlandsthe most commonbackground:url(argued that thescrolling="no" included in theNorth American the name of theinterpretationsthe traditionaldevelopment of frequently useda collection ofvery similar tosurrounding theexample of thisalign="center">would have beenimage_caption =attached to thesuggesting thatin the form of involved in theis derived fromnamed after theIntroduction torestrictions on style="width: can be used to the creation ofmost important information andresulted in thecollapse of theThis means thatelements of thewas replaced byanalysis of theinspiration forregarded as themost successfulknown as &quot;a comprehensiveHistory of the were consideredreturned to theare referred toUnsourced image>\n\t<div class="consists of thestopPropagationinterest in theavailability ofappears to haveelectromagneticenableServices(function of theIt is important<\/script></div>function(){var relative to theas a result of the position ofFor example, in method="post" was followed by&amp;mdash; thethe applicationjs"><\/script>\r\nul></div></div>after the deathwith respect tostyle="padding:is particularlydisplay:inline; type="submit" is divided intod8-f\x16\x07 (g.\0d=\x13)responsabilidadadministraciC3ninternacionalescorrespondiente`$\t`$*`$/`%\v`$\x17`$*`%\x02`$0`%\r`$5`$9`$.`$>`$0`%\x07`$2`%\v`$\x17`%\v`$\x02`$\x1a`%\x01`$(`$>`$5`$2`%\x07`$\x15`$?`$(`$8`$0`$\x15`$>`$0`$*`%\x01`$2`$?`$8`$\x16`%\v`$\x1c`%\x07`$\x02`$\x1a`$>`$9`$?`$\x0f`$-`%\x07`$\x1c`%\x07`$\x02`$6`$>`$.`$?`$2`$9`$.`$>`$0`%\0`$\x1c`$>`$\x17`$0`$#`$,`$(`$>`$(`%\x07`$\x15`%\x01`$.`$>`$0`$,`%\r`$2`%\t`$\x17`$.`$>`$2`$?`$\x15`$.`$9`$?`$2`$>`$*`%\x03`$7`%\r`$ `$,`$"`$<`$$`%\x07`$-`$>`$\x1c`$*`$>`$\x15`%\r`$2`$?`$\x15`$\x1f`%\r`$0`%\x07`$(`$\x16`$?`$2`$>`$+`$&`%\f`$0`$>`$(`$.`$>`$.`$2`%\x07`$.`$$`$&`$>`$(`$,`$>`$\x1c`$>`$0`$5`$?`$\x15`$>`$8`$\x15`%\r`$/`%\v`$\x02`$\x1a`$>`$9`$$`%\x07`$*`$9`%\x01`$\x01`$\x1a`$,`$$`$>`$/`$>`$8`$\x02`$5`$>`$&`$&`%\x07`$\x16`$(`%\x07`$*`$?`$\x1b`$2`%\x07`$5`$?`$6`%\x07`$7`$0`$>`$\x1c`%\r`$/`$\t`$$`%\r`$$`$0`$.`%\x01`$\x02`$,`$\b`$&`%\v`$(`%\v`$\x02`$\t`$*`$\x15`$0`$#`$*`$"`$<`%\x07`$\x02`$8`%\r`$%`$?`$$`$+`$?`$2`%\r`$.`$.`%\x01`$\x16`%\r`$/`$\x05`$\x1a`%\r`$\x1b`$>`$\x1b`%\x02`$\x1f`$$`%\0`$8`$\x02`$\x17`%\0`$$`$\x1c`$>`$\x0f`$\x17`$>`$5`$?`$-`$>`$\x17`$\x18`$#`%\r`$\x1f`%\x07`$&`%\x02`$8`$0`%\x07`$&`$?`$(`%\v`$\x02`$9`$$`%\r`$/`$>`$8`%\x07`$\x15`%\r`$8`$\x17`$>`$\x02`$\'`%\0`$5`$?`$6`%\r`$5`$0`$>`$$`%\x07`$\x02`$&`%\b`$\x1f`%\r`$8`$(`$\x15`%\r`$6`$>`$8`$>`$.`$(`%\x07`$\x05`$&`$>`$2`$$`$,`$?`$\x1c`$2`%\0`$*`%\x01`$0`%\x02`$7`$9`$?`$\x02`$&`%\0`$.`$?`$$`%\r`$0`$\x15`$5`$?`$$`$>`$0`%\x01`$*`$/`%\x07`$8`%\r`$%`$>`$(`$\x15`$0`%\v`$!`$<`$.`%\x01`$\x15`%\r`$$`$/`%\v`$\x1c`$(`$>`$\x15`%\x03`$*`$/`$>`$*`%\v`$8`%\r`$\x1f`$\x18`$0`%\x07`$2`%\x02`$\x15`$>`$0`%\r`$/`$5`$?`$\x1a`$>`$0`$8`%\x02`$\x1a`$(`$>`$.`%\x02`$2`%\r`$/`$&`%\x07`$\x16`%\x07`$\x02`$9`$.`%\x07`$6`$>`$8`%\r`$\x15`%\x02`$2`$.`%\b`$\x02`$(`%\x07`$$`%\b`$/`$>`$0`$\x1c`$?`$8`$\x15`%\x07rss+xml" title="-type" content="title" content="at the same time.js"><\/script>\n<" method="post" </span></a></li>vertical-align:t/jquery.min.js">.click(function( style="padding-})();\n<\/script>\n</span><a href="<a href="http://); return false;text-decoration: scrolling="no" border-collapse:associated with Bahasa IndonesiaEnglish language<text xml:space=.gif" border="0"</body>\n</html>\noverflow:hidden;img src="http://addEventListenerresponsible for s.js"><\/script>\n/favicon.ico" />operating system" style="width:1target="_blank">State Universitytext-align:left;\ndocument.write(, including the around the world);\r\n<\/script>\r\n<" style="height:;overflow:hiddenmore informationan internationala member of the one of the firstcan be found in </div>\n\t\t</div>\ndisplay: none;">" />\n<link rel="\n (function() {the 15th century.preventDefault(large number of Byzantine Empire.jpg|thumb|left|vast majority ofmajority of the align="center">University Pressdominated by theSecond World Wardistribution of style="position:the rest of the characterized by rel="nofollow">derives from therather than the a combination ofstyle="width:100English-speakingcomputer scienceborder="0" alt="the existence ofDemocratic Party" style="margin-For this reason,.js"><\/script>\n\tsByTagName(s)[0]js"><\/script>\r\n<.js"><\/script>\r\nlink rel="icon" \' alt=\'\' class=\'formation of theversions of the </a></div></div>/page>\n <page>\n<div class="contbecame the firstbahasa Indonesiaenglish (simple)N\x15N;N;N7N=N9N:N,Q\x05Q\0P2P0Q\x02Q\x01P:P8P:P>P<P?P0P=P8P8Q\x0fP2P;Q\x0fP5Q\x02Q\x01Q\x0fP\x14P>P1P0P2P8Q\x02Q\fQ\x07P5P;P>P2P5P:P0Q\0P0P7P2P8Q\x02P8Q\x0fP\x18P=Q\x02P5Q\0P=P5Q\x02P\x1eQ\x02P2P5Q\x02P8Q\x02Q\fP=P0P?Q\0P8P<P5Q\0P8P=Q\x02P5Q\0P=P5Q\x02P:P>Q\x02P>Q\0P>P3P>Q\x01Q\x02Q\0P0P=P8Q\x06Q\vP:P0Q\x07P5Q\x01Q\x02P2P5Q\x03Q\x01P;P>P2P8Q\x0fQ\x05P?Q\0P>P1P;P5P<Q\vP?P>P;Q\x03Q\x07P8Q\x02Q\fQ\x0fP2P;Q\x0fQ\x0eQ\x02Q\x01Q\x0fP=P0P8P1P>P;P5P5P:P>P<P?P0P=P8Q\x0fP2P=P8P<P0P=P8P5Q\x01Q\0P5P4Q\x01Q\x02P2P0X\'Y\x04Y\x05Y\bX\'X6Y\nX9X\'Y\x04X1X&Y\nX3Y\nX)X\'Y\x04X\'Y\x06X*Y\x02X\'Y\x04Y\x05X4X\'X1Y\x03X\'X*Y\x03X\'Y\x04X3Y\nX\'X1X\'X*X\'Y\x04Y\x05Y\x03X*Y\bX(X)X\'Y\x04X3X9Y\bX/Y\nX)X\'X-X5X\'X&Y\nX\'X*X\'Y\x04X9X\'Y\x04Y\x05Y\nX)X\'Y\x04X5Y\bX*Y\nX\'X*X\'Y\x04X\'Y\x06X*X1Y\x06X*X\'Y\x04X*X5X\'Y\x05Y\nY\x05X\'Y\x04X%X3Y\x04X\'Y\x05Y\nX\'Y\x04Y\x05X4X\'X1Y\x03X)X\'Y\x04Y\x05X1X&Y\nX\'X*robots" content="<div id="footer">the United States<img src="http://.jpg|right|thumb|.js"><\/script>\r\n<location.protocolframeborder="0" s" />\n<meta name="</a></div></div><font-weight:bold;&quot; and &quot;depending on the margin:0;padding:" rel="nofollow" President of the twentieth centuryevision>\n </pageInternet Explorera.async = true;\r\ninformation about<div id="header">" action="http://<a href="https://<div id="content"</div>\r\n</div>\r\n<derived from the <img src=\'http://according to the \n</body>\n</html>\nstyle="font-size:script language="Arial, Helvetica,</a><span class="<\/script><script political partiestd></tr></table><href="http://www.interpretation ofrel="stylesheet" document.write(\'<charset="utf-8">\nbeginning of the revealed that thetelevision series" rel="nofollow"> target="_blank">claiming that thehttp%3A%2F%2Fwww.manifestations ofPrime Minister ofinfluenced by theclass="clearfix">/div>\r\n</div>\r\n\r\nthree-dimensionalChurch of Englandof North Carolinasquare kilometres.addEventListenerdistinct from thecommonly known asPhonetic Alphabetdeclared that thecontrolled by theBenjamin Franklinrole-playing gamethe University ofin Western Europepersonal computerProject Gutenbergregardless of thehas been proposedtogether with the></li><li class="in some countriesmin.js"><\/script>of the populationofficial language<img src="images/identified by thenatural resourcesclassification ofcan be consideredquantum mechanicsNevertheless, themillion years ago</body>\r\n</html>\rN\x15N;N;N7N=N9N:N,\ntake advantage ofand, according toattributed to theMicrosoft Windowsthe first centuryunder the controldiv class="headershortly after thenotable exceptiontens of thousandsseveral differentaround the world.reaching militaryisolated from theopposition to thethe Old TestamentAfrican Americansinserted into theseparate from themetropolitan areamakes it possibleacknowledged thatarguably the mosttype="text/css">\nthe InternationalAccording to the pe="text/css" />\ncoincide with thetwo-thirds of theDuring this time,during the periodannounced that hethe internationaland more recentlybelieved that theconsciousness andformerly known assurrounded by thefirst appeared inoccasionally usedposition:absolute;" target="_blank" position:relative;text-align:center;jax/libs/jquery/1.background-color:#type="application/anguage" content="<meta http-equiv="Privacy Policy</a>e("%3Cscript src=\'" target="_blank">On the other hand,.jpg|thumb|right|2</div><div class="<div style="float:nineteenth century</body>\r\n</html>\r\n<img src="http://s;text-align:centerfont-weight: bold; According to the difference between" frameborder="0" " style="position:link href="http://html4/loose.dtd">\nduring this period</td></tr></table>closely related tofor the first time;font-weight:bold;input type="text" <span style="font-onreadystatechange\t<div class="cleardocument.location. For example, the a wide variety of <!DOCTYPE html>\r\n<&nbsp;&nbsp;&nbsp;"><a href="http://style="float:left;concerned with the=http%3A%2F%2Fwww.in popular culturetype="text/css" />it is possible to Harvard Universitytylesheet" href="/the main characterOxford University name="keywords" cstyle="text-align:the United Kingdomfederal government<div style="margin depending on the description of the<div class="header.min.js"><\/script>destruction of theslightly differentin accordance withtelecommunicationsindicates that theshortly thereafterespecially in the European countriesHowever, there aresrc="http://staticsuggested that the" src="http://www.a large number of Telecommunications" rel="nofollow" tHoly Roman Emperoralmost exclusively" border="0" alt="Secretary of Stateculminating in theCIA World Factbookthe most importantanniversary of thestyle="background-<li><em><a href="/the Atlantic Oceanstrictly speaking,shortly before thedifferent types ofthe Ottoman Empire><img src="http://An Introduction toconsequence of thedeparture from theConfederate Statesindigenous peoplesProceedings of theinformation on thetheories have beeninvolvement in thedivided into threeadjacent countriesis responsible fordissolution of thecollaboration withwidely regarded ashis contemporariesfounding member ofDominican Republicgenerally acceptedthe possibility ofare also availableunder constructionrestoration of thethe general publicis almost entirelypasses through thehas been suggestedcomputer and videoGermanic languages according to the different from theshortly afterwardshref="https://www.recent developmentBoard of Directors<div class="search| <a href="http://In particular, theMultiple footnotesor other substancethousands of yearstranslation of the</div>\r\n</div>\r\n\r\n<a href="index.phpwas established inmin.js"><\/script>\nparticipate in thea strong influencestyle="margin-top:represented by thegraduated from theTraditionally, theElement("script");However, since the/div>\n</div>\n<div left; margin-left:protection against0; vertical-align:Unfortunately, thetype="image/x-icon/div>\n<div class=" class="clearfix"><div class="footer\t\t</div>\n\t\t</div>\nthe motion pictureP\x11Q\nP;P3P0Q\0Q\x01P:P8P1Q\nP;P3P0Q\0Q\x01P:P8P$P5P4P5Q\0P0Q\x06P8P8P=P5Q\x01P:P>P;Q\fP:P>Q\x01P>P>P1Q\tP5P=P8P5Q\x01P>P>P1Q\tP5P=P8Q\x0fP?Q\0P>P3Q\0P0P<P<Q\vP\x1eQ\x02P?Q\0P0P2P8Q\x02Q\fP1P5Q\x01P?P;P0Q\x02P=P>P<P0Q\x02P5Q\0P8P0P;Q\vP?P>P7P2P>P;Q\x0fP5Q\x02P?P>Q\x01P;P5P4P=P8P5Q\0P0P7P;P8Q\x07P=Q\vQ\x05P?Q\0P>P4Q\x03P:Q\x06P8P8P?Q\0P>P3Q\0P0P<P<P0P?P>P;P=P>Q\x01Q\x02Q\fQ\x0eP=P0Q\x05P>P4P8Q\x02Q\x01Q\x0fP8P7P1Q\0P0P=P=P>P5P=P0Q\x01P5P;P5P=P8Q\x0fP8P7P<P5P=P5P=P8Q\x0fP:P0Q\x02P5P3P>Q\0P8P8P\x10P;P5P:Q\x01P0P=P4Q\0`$&`%\r`$5`$>`$0`$>`$.`%\b`$(`%\x01`$\x05`$2`$*`%\r`$0`$&`$>`$(`$-`$>`$0`$$`%\0`$/`$\x05`$(`%\x01`$&`%\x07`$6`$9`$?`$(`%\r`$&`%\0`$\x07`$\x02`$!`$?`$/`$>`$&`$?`$2`%\r`$2`%\0`$\x05`$\'`$?`$\x15`$>`$0`$5`%\0`$!`$?`$/`%\v`$\x1a`$?`$\x1f`%\r`$ `%\x07`$8`$.`$>`$\x1a`$>`$0`$\x1c`$\x02`$\x15`%\r`$6`$(`$&`%\x01`$(`$?`$/`$>`$*`%\r`$0`$/`%\v`$\x17`$\x05`$(`%\x01`$8`$>`$0`$\x11`$(`$2`$>`$\x07`$(`$*`$>`$0`%\r`$\x1f`%\0`$6`$0`%\r`$$`%\v`$\x02`$2`%\v`$\x15`$8`$-`$>`$+`$<`%\r`$2`%\b`$6`$6`$0`%\r`$$`%\x07`$\x02`$*`%\r`$0`$&`%\x07`$6`$*`%\r`$2`%\x07`$/`$0`$\x15`%\x07`$\x02`$&`%\r`$0`$8`%\r`$%`$?`$$`$?`$\t`$$`%\r`$*`$>`$&`$\t`$(`%\r`$9`%\x07`$\x02`$\x1a`$?`$\x1f`%\r`$ `$>`$/`$>`$$`%\r`$0`$>`$\x1c`%\r`$/`$>`$&`$>`$*`%\x01`$0`$>`$(`%\x07`$\x1c`%\v`$!`$<`%\x07`$\x02`$\x05`$(`%\x01`$5`$>`$&`$6`%\r`$0`%\x07`$#`%\0`$6`$?`$\x15`%\r`$7`$>`$8`$0`$\x15`$>`$0`%\0`$8`$\x02`$\x17`%\r`$0`$9`$*`$0`$?`$#`$>`$.`$,`%\r`$0`$>`$\x02`$!`$,`$\x1a`%\r`$\x1a`%\v`$\x02`$\t`$*`$2`$,`%\r`$\'`$.`$\x02`$$`%\r`$0`%\0`$8`$\x02`$*`$0`%\r`$\x15`$\t`$.`%\r`$.`%\0`$&`$.`$>`$\'`%\r`$/`$.`$8`$9`$>`$/`$$`$>`$6`$,`%\r`$&`%\v`$\x02`$.`%\0`$!`$?`$/`$>`$\x06`$\b`$*`%\0`$\x0f`$2`$.`%\v`$,`$>`$\x07`$2`$8`$\x02`$\x16`%\r`$/`$>`$\x06`$*`$0`%\x07`$6`$(`$\x05`$(`%\x01`$,`$\x02`$\'`$,`$>`$\x1c`$<`$>`$0`$(`$5`%\0`$(`$$`$.`$*`%\r`$0`$.`%\x01`$\x16`$*`%\r`$0`$6`%\r`$(`$*`$0`$?`$5`$>`$0`$(`%\x01`$\x15`$8`$>`$(`$8`$.`$0`%\r`$%`$(`$\x06`$/`%\v`$\x1c`$?`$$`$8`%\v`$.`$5`$>`$0X\'Y\x04Y\x05X4X\'X1Y\x03X\'X*X\'Y\x04Y\x05Y\x06X*X/Y\nX\'X*X\'Y\x04Y\x03Y\x05X(Y\nY\bX*X1X\'Y\x04Y\x05X4X\'Y\x07X/X\'X*X9X/X/X\'Y\x04X2Y\bX\'X1X9X/X/X\'Y\x04X1X/Y\bX/X\'Y\x04X%X3Y\x04X\'Y\x05Y\nX)X\'Y\x04Y\x01Y\bX*Y\bX4Y\bX(X\'Y\x04Y\x05X3X\'X(Y\x02X\'X*X\'Y\x04Y\x05X9Y\x04Y\bY\x05X\'X*X\'Y\x04Y\x05X3Y\x04X3Y\x04X\'X*X\'Y\x04X,X1X\'Y\x01Y\nY\x03X3X\'Y\x04X\'X3Y\x04X\'Y\x05Y\nX)X\'Y\x04X\'X*X5X\'Y\x04X\'X*keywords" content="w3.org/1999/xhtml"><a target="_blank" text/html; charset=" target="_blank"><table cellpadding="autocomplete="off" text-align: center;to last version by background-color: #" href="http://www./div></div><div id=<a href="#" class=""><img src="http://cript" src="http://\n<script language="//EN" "http://www.wencodeURIComponent(" href="javascript:<div class="contentdocument.write(\'<scposition: absolute;script src="http:// style="margin-top:.min.js"><\/script>\n</div>\n<div class="w3.org/1999/xhtml" \n\r\n</body>\r\n</html>distinction between/" target="_blank"><link href="http://encoding="utf-8"?>\nw.addEventListener?action="http://www.icon" href="http:// style="background:type="text/css" />\nmeta property="og:t<input type="text" style="text-align:the development of tylesheet" type="tehtml; charset=utf-8is considered to betable width="100%" In addition to the contributed to the differences betweendevelopment of the It is important to <\/script>\n\n<script style="font-size:1></span><span id=gbLibrary of Congress<img src="http://imEnglish translationAcademy of Sciencesdiv style="display:construction of the.getElementById(id)in conjunction withElement(\'script\'); <meta property="og:P\x11Q\nP;P3P0Q\0Q\x01P:P8\n type="text" name=">Privacy Policy</a>administered by theenableSingleRequeststyle=&quot;margin:</div></div></div><><img src="http://i style=&quot;float:referred to as the total population ofin Washington, D.C. style="background-among other things,organization of theparticipated in thethe introduction ofidentified with thefictional character Oxford University misunderstanding ofThere are, however,stylesheet" href="/Columbia Universityexpanded to includeusually referred toindicating that thehave suggested thataffiliated with thecorrelation betweennumber of different></td></tr></table>Republic of Ireland\n<\/script>\n<script under the influencecontribution to theOfficial website ofheadquarters of thecentered around theimplications of thehave been developedFederal Republic ofbecame increasinglycontinuation of theNote, however, thatsimilar to that of capabilities of theaccordance with theparticipants in thefurther developmentunder the directionis often consideredhis younger brother</td></tr></table><a http-equiv="X-UA-physical propertiesof British Columbiahas been criticized(with the exceptionquestions about thepassing through the0" cellpadding="0" thousands of peopleredirects here. Forhave children under%3E%3C/script%3E"));<a href="http://www.<li><a href="http://site_name" content="text-decoration:nonestyle="display: none<meta http-equiv="X-new Date().getTime() type="image/x-icon"</span><span class="language="javascriptwindow.location.href<a href="javascript:--\x3e\r\n<script type="t<a href=\'http://www.hortcut icon" href="</div>\r\n<div class="<script src="http://" rel="stylesheet" t</div>\n<script type=/a> <a href="http:// allowTransparency="X-UA-Compatible" conrelationship between\n<\/script>\r\n<script </a></li></ul></div>associated with the programming language</a><a href="http://</a></li><li class="form action="http://<div style="display:type="text" name="q"<table width="100%" background-position:" border="0" width="rel="shortcut icon" h6><ul><li><a href=" <meta http-equiv="css" media="screen" responsible for the " type="application/" style="background-html; charset=utf-8" allowtransparency="stylesheet" type="te\r\n<meta http-equiv="></span><span class="0" cellspacing="0">;\n<\/script>\n<script sometimes called thedoes not necessarilyFor more informationat the beginning of <!DOCTYPE html><htmlparticularly in the type="hidden" name="javascript:void(0);"effectiveness of the autocomplete="off" generally considered><input type="text" "><\/script>\r\n<scriptthroughout the worldcommon misconceptionassociation with the</div>\n</div>\n<div cduring his lifetime,corresponding to thetype="image/x-icon" an increasing numberdiplomatic relationsare often consideredmeta charset="utf-8" <input type="text" examples include the"><img src="http://iparticipation in thethe establishment of\n</div>\n<div class="&amp;nbsp;&amp;nbsp;to determine whetherquite different frommarked the beginningdistance between thecontributions to theconflict between thewidely considered towas one of the firstwith varying degreeshave speculated that(document.getElementparticipating in theoriginally developedeta charset="utf-8"> type="text/css" />\ninterchangeably withmore closely relatedsocial and politicalthat would otherwiseperpendicular to thestyle type="text/csstype="submit" name="families residing indeveloping countriescomputer programmingeconomic developmentdetermination of thefor more informationon several occasionsportuguC*s (Europeu)P#P:Q\0P0Q\x17P=Q\x01Q\fP:P0Q\x03P:Q\0P0Q\x17P=Q\x01Q\fP:P0P P>Q\x01Q\x01P8P9Q\x01P:P>P9P<P0Q\x02P5Q\0P8P0P;P>P2P8P=Q\x04P>Q\0P<P0Q\x06P8P8Q\x03P?Q\0P0P2P;P5P=P8Q\x0fP=P5P>P1Q\x05P>P4P8P<P>P8P=Q\x04P>Q\0P<P0Q\x06P8Q\x0fP\x18P=Q\x04P>Q\0P<P0Q\x06P8Q\x0fP P5Q\x01P?Q\x03P1P;P8P:P8P:P>P;P8Q\x07P5Q\x01Q\x02P2P>P8P=Q\x04P>Q\0P<P0Q\x06P8Q\x0eQ\x02P5Q\0Q\0P8Q\x02P>Q\0P8P8P4P>Q\x01Q\x02P0Q\x02P>Q\x07P=P>X\'Y\x04Y\x05X*Y\bX\'X,X/Y\bY\x06X\'Y\x04X\'X4X*X1X\'Y\x03X\'X*X\'Y\x04X\'Y\x02X*X1X\'X-X\'X*html; charset=UTF-8" setTimeout(function()display:inline-block;<input type="submit" type = \'text/javascri<img src="http://www." "http://www.w3.org/shortcut icon" href="" autocomplete="off" </a></div><div class=</a></li>\n<li class="css" type="text/css" <form action="http://xt/css" href="http://link rel="alternate" \r\n<script type="text/ onclick="javascript:(new Date).getTime()}height="1" width="1" People\'s Republic of <a href="http://www.text-decoration:underthe beginning of the </div>\n</div>\n</div>\nestablishment of the </div></div></div></d#viewport{min-height:\n<script src="http://option><option value=often referred to as /option>\n<option valu<!DOCTYPE html>\n\x3c!--[International Airport>\n<a href="http://www</a><a href="http://w`8 `82`8)`82`9\x04`8\x17`8"a\x03%a\x03\x10a\x03 a\x03\x17a\x03#a\x03\x1aa\x03\x18f-#i+\x14d8-f\x16\x07 (g9\x01i+\x14)`$(`$?`$0`%\r`$&`%\x07`$6`$!`$>`$\t`$(`$2`%\v`$!`$\x15`%\r`$7`%\x07`$$`%\r`$0`$\x1c`$>`$(`$\x15`$>`$0`%\0`$8`$\x02`$,`$\x02`$\'`$?`$$`$8`%\r`$%`$>`$*`$(`$>`$8`%\r`$5`%\0`$\x15`$>`$0`$8`$\x02`$8`%\r`$\x15`$0`$#`$8`$>`$.`$\x17`%\r`$0`%\0`$\x1a`$?`$\x1f`%\r`$ `%\v`$\x02`$5`$?`$\x1c`%\r`$\x1e`$>`$(`$\x05`$.`%\x07`$0`$?`$\x15`$>`$5`$?`$-`$?`$(`%\r`$(`$\x17`$>`$!`$?`$/`$>`$\x01`$\x15`%\r`$/`%\v`$\x02`$\x15`$?`$8`%\x01`$0`$\x15`%\r`$7`$>`$*`$9`%\x01`$\x01`$\x1a`$$`%\0`$*`%\r`$0`$,`$\x02`$\'`$(`$\x1f`$?`$*`%\r`$*`$#`%\0`$\x15`%\r`$0`$?`$\x15`%\x07`$\x1f`$*`%\r`$0`$>`$0`$\x02`$-`$*`%\r`$0`$>`$*`%\r`$$`$.`$>`$2`$?`$\x15`%\v`$\x02`$0`$+`$<`%\r`$$`$>`$0`$(`$?`$0`%\r`$.`$>`$#`$2`$?`$.`$?`$\x1f`%\x07`$!description" content="document.location.prot.getElementsByTagName(<!DOCTYPE html>\n<html <meta charset="utf-8">:url" content="http://.css" rel="stylesheet"style type="text/css">type="text/css" href="w3.org/1999/xhtml" xmltype="text/javascript" method="get" action="link rel="stylesheet" = document.getElementtype="image/x-icon" />cellpadding="0" cellsp.css" type="text/css" </a></li><li><a href="" width="1" height="1""><a href="http://www.style="display:none;">alternate" type="appli-//W3C//DTD XHTML 1.0 ellspacing="0" cellpad type="hidden" value="/a>&nbsp;<span role="s\n<input type="hidden" language="JavaScript" document.getElementsBg="0" cellspacing="0" ype="text/css" media="type=\'text/javascript\'with the exception of ype="text/css" rel="st height="1" width="1" =\'+encodeURIComponent(<link rel="alternate" \nbody, tr, input, textmeta name="robots" conmethod="post" action=">\n<a href="http://www.css" rel="stylesheet" </div></div><div classlanguage="javascript">aria-hidden="true">B7<ript" type="text/javasl=0;})();\n(function(){background-image: url(/a></li><li><a href="h\t\t<li><a href="http://ator" aria-hidden="tru> <a href="http://www.language="javascript" /option>\n<option value/div></div><div class=rator" aria-hidden="tre=(new Date).getTime()portuguC*s (do Brasil)P>Q\0P3P0P=P8P7P0Q\x06P8P8P2P>P7P<P>P6P=P>Q\x01Q\x02Q\fP>P1Q\0P0P7P>P2P0P=P8Q\x0fQ\0P5P3P8Q\x01Q\x02Q\0P0Q\x06P8P8P2P>P7P<P>P6P=P>Q\x01Q\x02P8P>P1Q\x0fP7P0Q\x02P5P;Q\fP=P0<!DOCTYPE html PUBLIC "nt-Type" content="text/<meta http-equiv="Conteransitional//EN" "http:<html xmlns="http://www-//W3C//DTD XHTML 1.0 TDTD/xhtml1-transitional//www.w3.org/TR/xhtml1/pe = \'text/javascript\';<meta name="descriptionparentNode.insertBefore<input type="hidden" najs" type="text/javascri(document).ready(functiscript type="text/javasimage" content="http://UA-Compatible" content=tml; charset=utf-8" />\nlink rel="shortcut icon<link rel="stylesheet" <\/script>\n<script type== document.createElemen<a target="_blank" href= document.getElementsBinput type="text" name=a.type = \'text/javascrinput type="hidden" namehtml; charset=utf-8" />dtd">\n<html xmlns="http-//W3C//DTD HTML 4.01 TentsByTagName(\'script\')input type="hidden" nam<script type="text/javas" style="display:none;">document.getElementById(=document.createElement(\' type=\'text/javascript\'input type="text" name="d.getElementsByTagName(snical" href="http://www.C//DTD HTML 4.01 Transit<style type="text/css">\n\n<style type="text/css">ional.dtd">\n<html xmlns=http-equiv="Content-Typeding="0" cellspacing="0"html; charset=utf-8" />\n style="display:none;"><<li><a href="http://www. type=\'text/javascript\'>P4P5Q\x0fQ\x02P5P;Q\fP=P>Q\x01Q\x02P8Q\x01P>P>Q\x02P2P5Q\x02Q\x01Q\x02P2P8P8P?Q\0P>P8P7P2P>P4Q\x01Q\x02P2P0P1P5P7P>P?P0Q\x01P=P>Q\x01Q\x02P8`$*`%\x01`$8`%\r`$$`$?`$\x15`$>`$\x15`$>`$\x02`$\x17`%\r`$0`%\x07`$8`$\t`$(`%\r`$9`%\v`$\x02`$(`%\x07`$5`$?`$\'`$>`$(`$8`$-`$>`$+`$?`$\x15`%\r`$8`$?`$\x02`$\x17`$8`%\x01`$0`$\x15`%\r`$7`$?`$$`$\x15`%\t`$*`%\0`$0`$>`$\x07`$\x1f`$5`$?`$\x1c`%\r`$\x1e`$>`$*`$(`$\x15`$>`$0`%\r`$0`$5`$>`$\b`$8`$\x15`%\r`$0`$?`$/`$$`$>',"\u06f7%\u018c'T%\x85'W%\xd7%O%g%\xa6&\u0193%\u01e5&>&*&'&^&\x88\u0178\u0c3e&\u01ad&\u0192&)&^&%&'&\x82&P&1&\xb1&3&]&m&u&E&t&C&\xcf&V&V&/&>&6&\u0f76\u177co&p&@&E&M&P&x&@&F&e&\xcc&7&:&(&D&0&C&)&.&F&-&1&(&L&F&1\u025e*\u03ea\u21f3&\u1372&K&;&)&E&H&P&0&?&9&V&\x81&-&v&a&,&E&)&?&=&'&'&B&\u0d2e&\u0503&\u0316*&*8&%&%&&&%,)&\x9a&>&\x86&7&]&F&2&>&J&6&n&2&%&?&\x8e&2&6&J&g&-&0&,&*&J&*&O&)&6&(&<&B&N&.&P&@&2&.&W&M&%\u053c\x84(,(<&,&\u03da&\u18c7&-&,(%&(&%&(\u013b0&X&D&\x81&j&'&J&(&.&B&3&Z&R&h&3&E&E&<\xc6-\u0360\u1ef3&%8?&@&,&Z&@&0&J&,&^&x&_&6&C&6&C\u072c\u2a25&f&-&-&-&-&,&J&2&8&z&8&C&Y&8&-&d&\u1e78\xcc-&7&1&F&7&t&W&7&I&.&.&^&=\u0f9c\u19d3&8(>&/&/&\u077b')'\u1065')'%@/&0&%\u043e\u09c0*&*@&C\u053d\u05d4\u0274\u05eb4\u0dd7\u071a\u04d16\u0d84&/\u0178\u0303Z&*%\u0246\u03ff&\u0134&1\xa8\u04b4\u0174"),L=he,function(t){var a=new H;i(a,new e(t));for(var o=0,r=[];d=new Int8Array(16384),r.push(d),a.oe=d,a.re=0,a.ne=16384,a.ae=0,k(a),o+=a.ae,!(a.ae<16384););n(a);for(var s=new Int8Array(o),l=0,c=0;c<r.length;++c){var d=r[c],h=R(o,l+16384)-l;h<16384?s.set(d.subarray(0,h),l):s.set(d,l),l+=h}return s}}var BrotliDecode=BrotliDecodeClosure();window.BrotliDecode=BrotliDecode; \ No newline at end of file
+window.BrotliDecode=function(){"use strict";function e(e){this.data=e,this.offset=0}function t(e){if(e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),0==S(e,1))return 16;var t=S(e,3);return 0!=t?17+t:0!=(t=S(e,3))?8+t:17}function i(e,i){if(0!=e.l)throw"State MUST be uninitialized";e.h=new Int32Array(6480),e.input=i,z(e);var n=t(e);if(9==n)throw"Invalid 'windowBits' code";e.p=1<<n,e.u=e.p-16,e.l=1}function n(e){if(0==e.l)throw"State MUST be initialized";11!=e.l&&(e.l=11,null!=e.input&&(e.input,e.input=null))}function a(e){if(e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),0!=S(e,1)){var t=S(e,3);return 0==t?1:S(e,t)+(1<<t)}return 0}function o(e){if(e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),e.m=S(e,1),e.g=0,e.P=0,e.$=0,0==e.m||0==S(e,1)){var t=S(e,2)+4;if(7==t){if(e.$=1,0!=S(e,1))throw"Corrupted reserved bit";var i=S(e,2);if(0==i)return;for(n=0;n<i;n++){if(e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),0==(a=S(e,8))&&n+1==i&&i>1)throw"Exuberant nibble";e.g|=a<<8*n}}else for(var n=0;n<t;n++){e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16);var a=S(e,4);if(0==a&&n+1==t&&t>4)throw"Exuberant nibble";e.g|=a<<4*n}e.g++,0==e.m&&(e.P=S(e,1))}}function r(e,t,i){var n=i.i>>>i.t,a=e[t+=255&n]>>16,o=65535&e[t];return a<=8?(i.t+=a,o):(t+=o,t+=(n&(1<<a)-1)>>>8,i.t+=8+(e[t]>>16),65535&e[t])}function s(e,t,i){i.t>=16&&(i.i=i.o[i.s++]<<16|i.i>>>16,i.t-=16);var n=r(e,t,i),a=ee[n];return i.t>=16&&(i.i=i.o[i.s++]<<16|i.i>>>16,i.t-=16),Z[n]+(a<=16?S(i,a):E(i,a))}function l(e,t,i){return e<16?(i+=_[e],i&=3,t[i]+G[e]):e-16+1}function c(e,t){for(var i=e[t];t>0;t--)e[t]=e[t-1];e[0]=i}function d(e,t){for(var i=new Int32Array(256),n=0;n<256;n++)i[n]=n;for(n=0;n<t;n++){var a=255&e[n];e[n]=i[a],0!=a&&c(i,a)}}function h(e,t,i,n){var a=0,o=8,r=0,s=0,l=32768,c=new Int32Array(32);for(q(c,0,5,e,18);a<t&&l>0;){n.s>2030&&I(n),n.t>=16&&(n.i=n.o[n.s++]<<16|n.i>>>16,n.t-=16);var d=n.i>>>n.t&31;n.t+=c[d]>>16;var h=65535&c[d];if(h<16)r=0,i[a++]=h,0!=h&&(o=h,l-=32768>>h);else{var f=h-14,p=0;16==h&&(p=o),s!=p&&(r=0,s=p);var u=r;r>0&&(r-=2,r<<=f),n.t>=16&&(n.i=n.o[n.s++]<<16|n.i>>>16,n.t-=16);var m=(r+=S(n,f)+3)-u;if(a+m>t)throw"symbol + repeatDelta > numSymbols";for(var g=0;g<m;g++)i[a++]=s;0!=s&&(l-=m<<15-s)}}if(0!=l)throw"Unused space";i.fill(0,a,t)}function f(e,t){for(var i=0;i<t-1;++i)for(var n=i+1;n<t;++n)if(e[i]==e[n])return 0;return 1}function p(e,t,i,n){var a,o=1;n.s>2030&&I(n);var r=new Int32Array(e);if(n.t>=16&&(n.i=n.o[n.s++]<<16|n.i>>>16,n.t-=16),1==(a=S(n,2))){for(var s=e-1,l=0,c=new Int32Array(4),d=S(n,2)+1;0!=s;)s>>=1,l++;for(g=0;g<d;g++)n.t>=16&&(n.i=n.o[n.s++]<<16|n.i>>>16,n.t-=16),c[g]=S(n,l)%e,r[c[g]]=2;switch(r[c[0]]=1,d){case 2:r[c[1]]=1;break;case 4:1==S(n,1)?(r[c[2]]=3,r[c[3]]=3):r[c[0]]=2}o=f(c,d)}else{for(var p=new Int32Array(18),u=32,m=0,g=a;g<18&&u>0;g++){var P=W[g];n.t>=16&&(n.i=n.o[n.s++]<<16|n.i>>>16,n.t-=16);var $=n.i>>>n.t&15;n.t+=J[$]>>16;var b=65535&J[$];p[P]=b,0!=b&&(u-=32>>b,m++)}0!=u&&1!=m&&(o=0),h(p,e,r,n)}if(0==o)throw"Can't readHuffmanCode";q(t,i,8,r,e)}function u(e,t,i){i.s>2030&&I(i);var n=a(i)+1;if(1==n)return t.fill(0,0,e),n;i.t>=16&&(i.i=i.o[i.s++]<<16|i.i>>>16,i.t-=16);var o=0;0!=S(i,1)&&(o=S(i,4)+1);var s=new Int32Array(1080);p(n+o,s,0,i);for(var l=0;l<e;){i.s>2030&&I(i),i.t>=16&&(i.i=i.o[i.s++]<<16|i.i>>>16,i.t-=16);var c=r(s,0,i);if(0==c)t[l]=0,l++;else if(c<=o){i.t>=16&&(i.i=i.o[i.s++]<<16|i.i>>>16,i.t-=16);for(var h=(1<<c)+S(i,c);0!=h;){if(l>=e)throw"Corrupted context map";t[l]=0,l++,h--}}else t[l]=c-o,l++}return i.t>=16&&(i.i=i.o[i.s++]<<16|i.i>>>16,i.t-=16),1==S(i,1)&&d(t,e),n}function m(e,t,i){var n=e.v,a=4+2*t;e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16);var o=r(e.h,1080*t,e),l=s(e.h,1080*(t+3),e);return 1==o?o=n[a+1]+1:0==o?o=n[a]:o-=2,o>=i&&(o-=i),n[a]=n[a+1],n[a+1]=o,l}function g(e){e.X=m(e,0,e.Y);var t=e.v[5];e.k=t<<6,e.C=255&e.j[e.k],e.A=e.q[e.C];var i=e.I[t];e.T=i<<9,e.S=e.T+256}function P(e){e.D=m(e,1,e.F),e.N=e.B[e.v[7]]}function $(e){e.M=m(e,2,e.U),e.H=e.v[9]<<2}function b(e){var t=e.p;if(t>e.R){for(var i=e.R;t>>1>i;)t>>=1;0==e.m&&t<16384&&e.p>=16384&&(t=16384)}if(!(t<=e.O)){var n=t+37,a=new Int8Array(n);0!=e.L.length&&a.set(e.L.subarray(0,0+e.O),0),e.L=a,e.O=t}}function v(e){if(0!=e.m)return e.W=10,e._=e.G,e.J=0,void(e.l=12);e.q=new Int32Array(0),e.B=new Int32Array(0),e.V=new Int32Array(0),e.s>2030&&I(e),o(e),0==e.g&&0==e.$||(0!=e.P||0!=e.$?(N(e),e.l=0!=e.$?4:5):e.l=2,0==e.$&&(e.R+=e.g,e.R>1<<30&&(e.R=1<<30),e.O<e.p&&b(e)))}function y(e,t,i){return i<=1?1<<28:(p(i+2,e.h,1080*t,e),p(26,e.h,1080*(t+3),e),s(e.h,1080*(t+3),e))}function X(e){e.Y=a(e)+1,e.X=y(e,0,e.Y),e.F=a(e)+1,e.D=y(e,1,e.F),e.U=a(e)+1,e.M=y(e,2,e.U),e.s>2030&&I(e),e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),e.K=S(e,2),e.Z=16+(S(e,4)<<e.K),e.ee=(1<<e.K)-1;var t=e.Z+(48<<e.K);e.I=new Int8Array(e.Y);for(var i=0;i<e.Y;){for(var n=R(i+96,e.Y);i<n;++i)e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),e.I[i]=S(e,2);e.s>2030&&I(e)}e.j=new Int8Array(e.Y<<6);var o=u(e.Y<<6,e.j,e);e.te=1;for(var r=0;r<e.Y<<6;r++)if(e.j[r]!=r>>6){e.te=0;break}e.ie=new Int8Array(e.U<<2);var s=u(e.U<<2,e.ie,e);e.q=Q(256,o,e),e.B=Q(704,e.F,e),e.V=Q(t,s,e),e.k=0,e.H=0,e.T=e.I[0]<<9,e.S=e.T+256,e.C=0,e.A=e.q[0],e.N=e.B[0],e.v[4]=1,e.v[5]=0,e.v[6]=1,e.v[7]=0,e.v[8]=1,e.v[9]=0}function w(e){var t=e.L;if(e.g<=0)return F(e),void(e.l=1);var i=R(e.O-e.G,e.g);if(M(e,t,e.G,i),e.g-=i,e.G+=i,e.G==e.O)return e.W=5,e._=e.O,e.J=0,void(e.l=12);F(e),e.l=1}function Y(e){var t=R(e.ne-e.ae,e._-e.J);return 0!=t&&(e.oe.set(e.L.subarray(e.J,e.J+t),e.re+e.ae),e.ae+=t,e.J+=t),e.ae<e.ne?1:0}function Q(e,t,i){for(var n=new Int32Array(t+1080*t),a=t,o=0;o<t;o++)n[o]=a,p(e,n,a,i),a+=1080;return n}function k(e){if(0==e.l)throw"Can't decompress until initialized";if(11==e.l)throw"Can't decompress after close";for(var t=e.O-1,i=e.L;10!=e.l;)switch(e.l){case 1:if(e.g<0)throw"Invalid metablock length";v(e),t=e.O-1,i=e.L;continue;case 2:X(e),e.l=3;case 3:if(e.g<=0){e.l=1;continue}e.s>2030&&I(e),0==e.D&&P(e),e.D--,e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16);var n=r(e.B,e.N,e),a=n>>>6;e.se=0,a>=2&&(a-=2,e.se=-1);var o=oe[a]+(n>>>3&7);e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16);var s=ie[o],c=s<=16?S(e,s):E(e,s);e.le=te[o]+c;var d=re[a]+(7&n);e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16);var h=ae[d],f=h<=16?S(e,h):E(e,h);e.ce=ne[d]+f,e.de=0,e.l=6;case 6:if(0!=e.te){for(;e.de<e.le;)if(e.s>2030&&I(e),0==e.X&&g(e),e.X--,e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),i[e.G]=r(e.q,e.A,e),e.de++,e.G++==t){e.W=6,e._=e.O,e.J=0,e.l=12;break}}else for(var p=255&i[e.G-1&t],u=255&i[e.G-2&t];e.de<e.le;){e.s>2030&&I(e),0==e.X&&g(e);var m=255&e.j[e.k+(de[e.T+p]|de[e.S+u])];if(e.X--,u=p,e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),p=r(e.q,e.q[m],e),i[e.G]=p,e.de++,e.G++==t){e.W=6,e._=e.O,e.J=0,e.l=12;break}}if(6!=e.l)continue;if(e.g-=e.le,e.g<=0){e.l=3;continue}if(e.se<0&&(e.s>2030&&I(e),0==e.M&&$(e),e.M--,e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),e.se=r(e.V,e.V[255&e.ie[e.H+(e.ce>4?3:e.ce-2)]],e),e.se>=e.Z)){e.se-=e.Z;var b=e.se&e.ee;e.se>>>=e.K;var y=1+(e.se>>>1),Q=(2+(1&e.se)<<y)-4;e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16);var k=y<=16?S(e,y):E(e,y);e.se=e.Z+b+(Q+k<<e.K)}if(e.he=l(e.se,e.v,e.fe),e.he<0)throw"Negative distance";if(e.maxDistance!=e.u&&e.G<e.u?e.maxDistance=e.G:e.maxDistance=e.u,e.pe=e.G,e.he>e.maxDistance){e.l=9;continue}if(e.se>0&&(e.v[3&e.fe]=e.he,e.fe++),e.ce>e.g)throw"Invalid backward reference";e.de=0,e.l=7;case 7:var C=e.G-e.he&t,j=e.G,A=e.ce-e.de,q=C+A,z=j+A;if(q<t&&z<t){if(A<12||q>j&&z>C)for(var D=0;D<A;D+=4)i[j++]=i[C++],i[j++]=i[C++],i[j++]=i[C++],i[j++]=i[C++];else i.copyWithin(j,C,q);e.de+=A,e.g-=A,e.G+=A}else for(;e.de<e.ce;)if(i[e.G]=i[e.G-e.he&t],e.g--,e.de++,e.G++==t){e.W=7,e._=e.O,e.J=0,e.l=12;break}7==e.l&&(e.l=3);continue;case 9:if(!(e.ce>=4&&e.ce<=24))throw"Invalid backward reference";var Q=V[e.ce],F=e.he-e.maxDistance-1,B=K[e.ce],M=F>>>B;if(Q+=(F&(1<<B)-1)*e.ce,!(M<121))throw"Invalid backward reference";var U=x(i,e.pe,L,Q,e.ce,M);if(e.pe+=U,e.G+=U,e.g-=U,e.pe>=e.O){e.W=8,e._=e.O,e.J=0,e.l=12;continue}e.l=3;continue;case 8:i.copyWithin(0,e.O,e.pe),e.l=3;continue;case 4:for(;e.g>0;)e.s>2030&&I(e),e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16),S(e,8),e.g--;e.l=1;continue;case 5:w(e);continue;case 12:if(0==Y(e))return;e.G>=e.u&&(e.maxDistance=e.u),e.G&=t,e.l=e.W;continue;default:throw"Unexpected state "+e.l}if(10==e.l){if(e.g<0)throw"Invalid metablock length";N(e),T(e,1)}}function x(e,t,i,n,a,o){for(var r=t,s=3*o,l=ce[se[s]],c=se[s+1],d=ce[se[s+2]];0!=le[l];)e[r++]=le[l++];var h=c>=12?c-11:0;h>a&&(h=a),n+=h,a-=h;for(var f=a-=c<=9?c:0;f>0;)e[r++]=i[n++],f--;if(11==c||10==c){var p=r-a;for(10==c&&(a=1);a>0;){var u=255&e[p];u<192?(u>=97&&u<=122&&(e[p]^=32),p+=1,a-=1):u<224?(e[p+1]^=32,p+=2,a-=2):(e[p+2]^=5,p+=3,a-=3)}}for(;0!=le[d];)e[r++]=le[d++];return r-t}function C(e,t){for(var i=1<<t-1;0!=(e&i);)i>>=1;return(e&i-1)+i}function j(e,t,i,n,a){do{e[t+(n-=i)]=a}while(n>0)}function A(e,t,i){for(var n=1<<t-i;t<15&&!((n-=e[t])<=0);)t++,n<<=1;return t-i}function q(e,t,i,n,a){var o,r,s=new Int32Array(a),l=new Int32Array(16),c=new Int32Array(16);for(r=0;r<a;r++)l[n[r]]++;c[1]=0;for(p=1;p<15;p++)c[p+1]=c[p]+l[p];for(r=0;r<a;r++)0!=n[r]&&(s[c[n[r]]++]=r);var d=i,h=1<<d,f=h;if(1!=c[15]){o=0,r=0;for(var p=1,u=2;p<=i;p++,u<<=1)for(;l[p]>0;l[p]--)j(e,t+o,u,h,p<<16|s[r++]),o=C(o,p);for(var m=f-1,g=-1,P=t,p=i+1,u=2;p<=15;p++,u<<=1)for(;l[p]>0;l[p]--)(o&m)!=g&&(P+=h,f+=h=1<<(d=A(l,p,i)),e[t+(g=o&m)]=d+i<<16|P-t-g),j(e,P+(o>>i),u,h,p-i<<16|s[r++]),o=C(o,p)}else for(o=0;o<f;o++)e[t+o]=s[0]}function I(e){if(0!=e.ue){if(B(e)>=-2)return;throw"No more input"}var t=e.s<<1,i=4096-t;for(e.me.copyWithin(0,t,4096),e.s=0;i<4096;){var n=4096-i,a=O(e.input,e.me,i,n);if(a<=0){e.ue=1,e.ge=i,i+=1;break}i+=a}U(e,i)}function T(e,t){if(0!=e.ue){var i=(e.s<<1)+(e.t+7>>3)-4;if(i>e.ge)throw"Read after end";if(0!=t&&i!=e.ge)throw"Unused bytes after end"}}function S(e,t){var i=e.i>>>e.t&(1<<t)-1;return e.t+=t,i}function E(e,t){var i=S(e,16);return e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16,i|S(e,t-16)<<16}function z(e){e.me=new Int8Array(4160),e.i=0,e.o=new Int16Array(2080),e.t=32,e.s=2048,e.ue=0,D(e)}function D(e){e.s>2030&&I(e),T(e,0),e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16,e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16}function F(e){32==e.t&&D(e)}function N(e){var t=32-e.t&7;if(0!=t&&0!=S(e,t))throw"Corrupted padding bits"}function B(e){var t=2048;return 0!=e.ue&&(t=e.ge+1>>1),t-e.s}function M(e,t,i,n){if(0!=(7&e.t))throw"Unaligned copyBytes";for(;32!=e.t&&0!=n;)t[i++]=e.i>>>e.t,e.t+=8,n--;if(0!=n){var a=R(B(e),n>>1);if(a>0){var o=e.s<<1,r=a<<1;t.set(e.me.subarray(o,o+r),i),i+=r,n-=r,e.s+=a}if(0!=n)if(B(e)>0){for(e.t>=16&&(e.i=e.o[e.s++]<<16|e.i>>>16,e.t-=16);0!=n;)t[i++]=e.i>>>e.t,e.t+=8,n--;T(e,0)}else for(;n>0;){var s=O(e.input,t,i,n);if(-1==s)throw"Unexpected end of input";i+=s,n-=s}}}function U(e,t){for(var i=e.me,n=t>>1,a=e.o,o=0;o<n;++o)a[o]=255&i[2*o]|(255&i[2*o+1])<<8}function H(){this.L=new Int8Array(0),this.I=new Int8Array(0),this.j=new Int8Array(0),this.ie=new Int8Array(0),this.oe=new Int8Array(0),this.me=new Int8Array(0),this.o=new Int16Array(0),this.Pe=new Int32Array(0),this.v=new Int32Array(0),this.h=new Int32Array(0),this.q=new Int32Array(0),this.B=new Int32Array(0),this.V=new Int32Array(0),this.l=0,this.W=0,this.i=0,this.t=0,this.s=0,this.ge=0,this.ue=0,this.g=0,this.m=0,this.P=0,this.$=0,this.X=0,this.Y=0,this.D=0,this.F=0,this.M=0,this.U=0,this.G=0,this.maxDistance=0,this.fe=0,this.te=0,this.C=0,this.A=0,this.de=0,this.le=0,this.k=0,this.H=0,this.T=0,this.S=0,this.N=0,this.se=0,this.Z=0,this.ee=0,this.K=0,this.he=0,this.ce=0,this.pe=0,this.u=0,this.p=0,this.O=0,this.R=0,this.re=0,this.ne=0,this.ae=0,this.J=0,this._=0,this.input=null,this.L=new Int8Array(0),this.v=new Int32Array(10),this.v[0]=16,this.v[1]=15,this.v[2]=11,this.v[3]=4}function R(e,t){return e<=t?e:t}function O(e,t,i,n){if(null==e)return-1;var a=R(e.offset+n,e.data.length),o=a-e.offset;return t.set(e.data.subarray(e.offset,a),i),e.offset+=o,o}var L=new Int8Array(0),W=Int32Array.from([1,2,3,4,0,5,17,6,16,7,8,9,10,11,12,13,14,15]),_=Int32Array.from([3,2,1,0,3,3,3,3,3,3,2,2,2,2,2,2]),G=Int32Array.from([0,0,0,0,-1,1,-2,2,-3,3,-1,1,-2,2,-3,3]),J=Int32Array.from([131072,131076,131075,196610,131072,131076,131075,262145,131072,131076,131075,196610,131072,131076,131075,262149]),V=Int32Array.from([0,0,0,0,0,4096,9216,21504,35840,44032,53248,63488,74752,87040,93696,100864,104704,106752,108928,113536,115968,118528,119872,121280,122016]),K=Int32Array.from([0,0,0,0,10,10,11,11,10,10,10,10,10,9,9,8,7,7,8,7,7,6,6,5,5]),Z=Int32Array.from([1,5,9,13,17,25,33,41,49,65,81,97,113,145,177,209,241,305,369,497,753,1265,2289,4337,8433,16625]),ee=Int32Array.from([2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,7,8,9,10,11,12,13,24]),te=Int32Array.from([0,1,2,3,4,5,6,8,10,14,18,26,34,50,66,98,130,194,322,578,1090,2114,6210,22594]),ie=Int32Array.from([0,0,0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,7,8,9,10,12,14,24]),ne=Int32Array.from([2,3,4,5,6,7,8,9,10,12,14,18,22,30,38,54,70,102,134,198,326,582,1094,2118]),ae=Int32Array.from([0,0,0,0,0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,7,8,9,10,24]),oe=Int32Array.from([0,0,8,8,0,16,8,16,16]),re=Int32Array.from([0,8,0,8,16,0,16,8,16]),se=new Int32Array(363),le=new Int8Array(217),ce=new Int32Array(51);!function(e,t,i,n,a){for(var o=n.length,r=1,s=0;s<o;++s){var l=n.charCodeAt(s);e[s]=l,35==l&&(t[r++]=s+1,e[s]=0)}for(s=0;s<363;++s)i[s]=a.charCodeAt(s)-32}(le,ce,se,'# #s #, #e #.# the #.com/#\xc2\xa0# of # and # in # to #"#">#\n#]# for # a # that #. # with #\'# from # by #. The # on # as # is #ing #\n\t#:#ed #(# at #ly #="# of the #. This #,# not #er #al #=\'#ful #ive #less #est #ize #ous #'," !! ! , *! &! \" ! ) * * - ! # ! #!*! + ,$ ! - % . / # 0 1 . \" 2 3!* 4% ! # / 5 6 7 8 0 1 & $ 9 + : ; < ' != > ?! 4 @ 4 2 & A *# ( B C& ) % ) !*# *-% A +! *. D! %' & E *6 F G% ! *A *% H! D I!+! J!+ K +- *4! A L!*4 M N +6 O!*% +.! K *G P +%( ! G *D +D Q +# *K!*G!+D!+# +G +A +4!+% +K!+4!*D!+K!*K");var de=new Int32Array(2048);!function(e,t,i){for(s=0;s<256;++s)e[s]=63&s,e[512+s]=s>>2,e[1792+s]=2+(s>>6);for(s=0;s<128;++s)e[1024+s]=4*(t.charCodeAt(s)-32);for(s=0;s<64;++s)e[1152+s]=1&s,e[1216+s]=2+(1&s);for(var n=1280,a=0;a<19;++a)for(var o=3&a,r=i.charCodeAt(a)-32,s=0;s<r;++s)e[n++]=o;for(s=0;s<16;++s)e[1792+s]=1,e[2032+s]=6;e[1792]=0,e[2047]=7;for(s=0;s<256;++s)e[1536+s]=e[1792+s]<<3}(de," !! ! \"#$##%#$&'##(#)#++++++++++((&*'##,---,---,-----,-----,-----&#'###.///.///./////./////./////&#'# ","A/* ': & : $ \x81 @");var he=new Int8Array(122784);return function(e,t,i,n){var a=t.length,o=i.length;if(a+o!=e.length)throw"Corrupted brotli dictionary";for(var r=0,s=0;s<a;++s)e[r]=t.charCodeAt(s),r++;for(s=0;s<o;++s)e[r]=i.charCodeAt(s),r++;r=0;for(var l=n.length,s=0;s<l;s+=2){var c=n.charCodeAt(s)-36,d=n.charCodeAt(s+1)-36;r+=c;for(var h=0;h<d;++h)e[r]=128|e[r],r++}}(he,'timedownlifeleftbackcodedatashowonlysitecityopenjustlikefreeworktextyearoverbodyloveformbookplaylivelinehelphomesidemorewordlongthemviewfindpagedaysfullheadtermeachareafromtruemarkableuponhighdatelandnewsevennextcasebothpostusedmadehandherewhatnameLinkblogsizebaseheldmakemainuser\') +holdendswithNewsreadweresigntakehavegameseencallpathwellplusmenufilmpartjointhislistgoodneedwayswestjobsmindalsologorichuseslastteamarmyfoodkingwilleastwardbestfirePageknowaway.pngmovethanloadgiveselfnotemuchfeedmanyrockicononcelookhidediedHomerulehostajaxinfoclublawslesshalfsomesuchzone100%onescareTimeracebluefourweekfacehopegavehardlostwhenparkkeptpassshiproomHTMLplanTypedonesavekeepflaglinksoldfivetookratetownjumpthusdarkcardfilefearstaykillthatfallautoever.comtalkshopvotedeepmoderestturnbornbandfellroseurl(skinrolecomeactsagesmeetgold.jpgitemvaryfeltthensenddropViewcopy1.0"</a>stopelseliestourpack.gifpastcss?graymean&gt;rideshotlatesaidroadvar feeljohnrickportfast\'UA-dead</b>poorbilltypeU.S.woodmust2px;Inforankwidewantwalllead[0];paulwavesure$(\'#waitmassarmsgoesgainlangpaid!-- lockunitrootwalkfirmwifexml"songtest20pxkindrowstoolfontmailsafestarmapscorerainflowbabyspansays4px;6px;artsfootrealwikiheatsteptriporg/lakeweaktoldFormcastfansbankveryrunsjulytask1px;goalgrewslowedgeid="sets5px;.js?40pxif (soonseatnonetubezerosentreedfactintogiftharm18pxcamehillboldzoomvoideasyringfillpeakinitcost3px;jacktagsbitsrolleditknewnear\x3c!--growJSONdutyNamesaleyou lotspainjazzcoldeyesfishwww.risktabsprev10pxrise25pxBlueding300,ballfordearnwildbox.fairlackverspairjunetechif(!pickevil$("#warmlorddoespull,000ideadrawhugespotfundburnhrefcellkeystickhourlossfuel12pxsuitdealRSS"agedgreyGET"easeaimsgirlaids8px;navygridtips#999warsladycars); }php?helltallwhomzh:e*/\r\n 100hall.\n\nA7px;pushchat0px;crew*/</hash75pxflatrare && tellcampontolaidmissskiptentfinemalegetsplot400,\r\n\r\ncoolfeet.php<br>ericmostguidbelldeschairmathatom/img&#82luckcent000;tinygonehtmlselldrugFREEnodenick?id=losenullvastwindRSS wearrelybeensamedukenasacapewishgulfT23:hitsslotgatekickblurthey15px\'\'););">msiewinsbirdsortbetaseekT18:ordstreemall60pxfarmb\0\x19sboys[0].\');"POSTbearkids);}}marytend(UK)quadzh:f-siz----prop\');\rliftT19:viceandydebt>RSSpoolneckblowT16:doorevalT17:letsfailoralpollnovacolsgene b\0\x14softrometillross<h3>pourfadepink<tr>mini)|!(minezh:hbarshear00);milk --\x3eironfreddiskwentsoilputs/js/holyT22:ISBNT20:adamsees<h2>json\', \'contT21: RSSloopasiamoon</p>soulLINEfortcartT14:<h1>80px!--<9px;T04:mike:46ZniceinchYorkricezh:d\'));puremageparatonebond:37Z_of_\']);000,zh:gtankyardbowlbush:56ZJava30px\n|}\n%C3%:34ZjeffEXPIcashvisagolfsnowzh:iquer.csssickmeatmin.binddellhirepicsrent:36ZHTTP-201fotowolfEND xbox:54ZBODYdick;\n}\nexit:35Zvarsbeat\'});diet999;anne}}</[i].LangkmB2wiretoysaddssealalex;\n\t}echonine.org005)tonyjewssandlegsroof000) 200winegeardogsbootgarycutstyletemption.xmlcockgang$(\'.50pxPh.Dmiscalanloandeskmileryanunixdisc);}\ndustclip).\n\n70px-200DVDs7]><tapedemoi++)wageeurophiloptsholeFAQsasin-26TlabspetsURL bulkcook;}\r\nHEAD[0])abbrjuan(198leshtwin</i>sonyguysfuckpipe|-\n!002)ndow[1];[];\nLog salt\r\n\t\tbangtrimbath){\r\n00px\n});ko:lfeesad>\rs:// [];tollplug(){\n{\r\n .js\'200pdualboat.JPG);\n}quot);\n\n\');\n\r\n}\r201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037201320122011201020092008200720062005200420032002200120001999199819971996199519941993199219911990198919881987198619851984198319821981198019791978197719761975197419731972197119701969196819671966196519641963196219611960195919581957195619551954195319521951195010001024139400009999comomC!sesteestaperotodohacecadaaC1obiendC-aasC-vidacasootroforosolootracualdijosidograntipotemadebealgoquC)estonadatrespococasabajotodasinoaguapuesunosantediceluisellamayozonaamorpisoobraclicellodioshoracasiP7P0P=P0P>P<Q\0P0Q\0Q\x03Q\x02P0P=P5P?P>P>Q\x02P8P7P=P>P4P>Q\x02P>P6P5P>P=P8Q\x05P\x1dP0P5P5P1Q\vP<Q\vP\x12Q\vQ\x01P>P2Q\vP2P>P\x1dP>P>P1P\x1fP>P;P8P=P8P P$P\x1dP5P\x1cQ\vQ\x02Q\vP\x1eP=P8P<P4P0P\x17P0P\x14P0P\x1dQ\x03P\x1eP1Q\x02P5P\x18P7P5P9P=Q\x03P<P<P"Q\vQ\x03P6Y\x01Y\nX#Y\x06Y\x05X\'Y\x05X9Y\x03Y\x04X#Y\bX1X/Y\nX\'Y\x01Y\tY\x07Y\bY\x04Y\x05Y\x04Y\x03X\'Y\bY\x04Y\x07X(X3X\'Y\x04X%Y\x06Y\x07Y\nX#Y\nY\x02X/Y\x07Y\x04X+Y\x05X(Y\x07Y\x04Y\bY\x04Y\nX(Y\x04X\'Y\nX(Y\x03X4Y\nX\'Y\x05X#Y\x05Y\x06X*X(Y\nY\x04Y\x06X-X(Y\x07Y\x05Y\x05X4Y\bX4firstvideolightworldmediawhitecloseblackrightsmallbooksplacemusicfieldorderpointvalueleveltableboardhousegroupworksyearsstatetodaywaterstartstyledeathpowerphonenighterrorinputabouttermstitletoolseventlocaltimeslargewordsgamesshortspacefocusclearmodelblockguideradiosharewomenagainmoneyimagenamesyounglineslatercolorgreenfront&amp;watchforcepricerulesbeginaftervisitissueareasbelowindextotalhourslabelprintpressbuiltlinksspeedstudytradefoundsenseundershownformsrangeaddedstillmovedtakenaboveflashfixedoftenotherviewschecklegalriveritemsquickshapehumanexistgoingmoviethirdbasicpeacestagewidthloginideaswrotepagesusersdrivestorebreaksouthvoicesitesmonthwherebuildwhichearthforumthreesportpartyClicklowerlivesclasslayerentrystoryusagesoundcourtyour birthpopuptypesapplyImagebeinguppernoteseveryshowsmeansextramatchtrackknownearlybegansuperpapernorthlearngivennamedendedTermspartsGroupbrandusingwomanfalsereadyaudiotakeswhile.com/livedcasesdailychildgreatjudgethoseunitsneverbroadcoastcoverapplefilescyclesceneplansclickwritequeenpieceemailframeolderphotolimitcachecivilscaleenterthemetheretouchboundroyalaskedwholesincestock namefaithheartemptyofferscopeownedmightalbumthinkbloodarraymajortrustcanonunioncountvalidstoneStyleLoginhappyoccurleft:freshquitefilmsgradeneedsurbanfightbasishoverauto;route.htmlmixedfinalYour slidetopicbrownalonedrawnsplitreachRightdatesmarchquotegoodsLinksdoubtasyncthumballowchiefyouthnovel10px;serveuntilhandsCheckSpacequeryjamesequaltwice0,000Startpanelsongsroundeightshiftworthpostsleadsweeksavoidthesemilesplanesmartalphaplantmarksratesplaysclaimsalestextsstarswrong</h3>thing.org/multiheardPowerstandtokensolid(thisbringshipsstafftriedcallsfullyfactsagentThis //--\x3eadminegyptEvent15px;Emailtrue"crossspentblogsbox">notedleavechinasizesguest</h4>robotheavytrue,sevengrandcrimesignsawaredancephase>\x3c!--en_US&#39;200px_namelatinenjoyajax.ationsmithU.S. holdspeterindianav">chainscorecomesdoingpriorShare1990sromanlistsjapanfallstrialowneragree</h2>abusealertopera"-//WcardshillsteamsPhototruthclean.php?saintmetallouismeantproofbriefrow">genretrucklooksValueFrame.net/--\x3e\n<try {\nvar makescostsplainadultquesttrainlaborhelpscausemagicmotortheir250pxleaststepsCountcouldglasssidesfundshotelawardmouthmovesparisgivesdutchtexasfruitnull,||[];top">\n\x3c!--POST"ocean<br/>floorspeakdepth sizebankscatchchart20px;aligndealswould50px;url="parksmouseMost ...</amongbrainbody none;basedcarrydraftreferpage_home.meterdelaydreamprovejoint</tr>drugs\x3c!-- aprilidealallenexactforthcodeslogicView seemsblankports (200saved_linkgoalsgrantgreekhomesringsrated30px;whoseparse();" Blocklinuxjonespixel\');">);if(-leftdavidhorseFocusraiseboxesTrackement</em>bar">.src=toweralt="cablehenry24px;setupitalysharpminortastewantsthis.resetwheelgirls/css/100%;clubsstuffbiblevotes 1000korea});\r\nbandsqueue= {};80px;cking{\r\n\t\taheadclockirishlike ratiostatsForm"yahoo)[0];Aboutfinds</h1>debugtasksURL =cells})();12px;primetellsturns0x600.jpg"spainbeachtaxesmicroangel--\x3e</giftssteve-linkbody.});\n\tmount (199FAQ</rogerfrankClass28px;feeds<h1><scotttests22px;drink) || lewisshall#039; for lovedwaste00px;ja:c\x02simon<fontreplymeetsuntercheaptightBrand) != dressclipsroomsonkeymobilmain.Name platefunnytreescom/"1.jpgwmodeparamSTARTleft idden, 201);\n}\nform.viruschairtransworstPagesitionpatch\x3c!--\no-cacfirmstours,000 asiani++){adobe\')[0]id=10both;menu .2.mi.png"kevincoachChildbruce2.jpgURL)+.jpg|suitesliceharry120" sweettr>\r\nname=diegopage swiss--\x3e\n\n#fff;">Log.com"treatsheet) && 14px;sleepntentfiledja:c\x03id="cName"worseshots-box-delta\n&lt;bears:48Z<data-rural</a> spendbakershops= "";php">ction13px;brianhellosize=o=%2F joinmaybe<img img">, fjsimg" ")[0]MTopBType"newlyDanskczechtrailknows</h5>faq">zh-cn10);\n-1");type=bluestrulydavis.js\';>\r\n<!steel you h2>\r\nform jesus100% menu.\r\n\t\r\nwalesrisksumentddingb-likteachgif" vegasdanskeestishqipsuomisobredesdeentretodospuedeaC1osestC!tienehastaotrospartedondenuevohacerformamismomejormundoaquC-dC-assC3loayudafechatodastantomenosdatosotrassitiomuchoahoralugarmayorestoshorastenerantesfotosestaspaC-snuevasaludforosmedioquienmesespoderchileserC!vecesdecirjosC)estarventagrupohechoellostengoamigocosasnivelgentemismaairesjuliotemashaciafavorjuniolibrepuntobuenoautorabrilbuenatextomarzosaberlistaluegocC3moenerojuegoperC:haberestoynuncamujervalorfueralibrogustaigualvotoscasosguC-apuedosomosavisousteddebennochebuscafaltaeurosseriedichocursoclavecasasleC3nplazolargoobrasvistaapoyojuntotratavistocrearcampohemoscincocargopisosordenhacenC!readiscopedrocercapuedapapelmenorC:tilclarojorgecalleponertardenadiemarcasigueellassiglocochemotosmadreclaserestoniC1oquedapasarbancohijosviajepabloC)stevienereinodejarfondocanalnorteletracausatomarmanoslunesautosvillavendopesartipostengamarcollevapadreunidovamoszonasambosbandamariaabusomuchasubirriojavivirgradochicaallC-jovendichaestantalessalirsuelopesosfinesllamabuscoC)stalleganegroplazahumorpagarjuntadobleislasbolsabaC1ohablaluchaC\x01readicenjugarnotasvalleallC!cargadolorabajoestC)gustomentemariofirmacostofichaplatahogarartesleyesaquelmuseobasespocosmitadcielochicomiedoganarsantoetapadebesplayaredessietecortecoreadudasdeseoviejodeseaaguas&quot;domaincommonstatuseventsmastersystemactionbannerremovescrollupdateglobalmediumfilternumberchangeresultpublicscreenchoosenormaltravelissuessourcetargetspringmodulemobileswitchphotosborderregionitselfsocialactivecolumnrecordfollowtitle>eitherlengthfamilyfriendlayoutauthorcreatereviewsummerserverplayedplayerexpandpolicyformatdoublepointsseriespersonlivingdesignmonthsforcesuniqueweightpeopleenergynaturesearchfigurehavingcustomoffsetletterwindowsubmitrendergroupsuploadhealthmethodvideosschoolfutureshadowdebatevaluesObjectothersrightsleaguechromesimplenoticesharedendingseasonreportonlinesquarebuttonimagesenablemovinglatestwinterFranceperiodstrongrepeatLondondetailformeddemandsecurepassedtoggleplacesdevicestaticcitiesstreamyellowattackstreetflighthiddeninfo">openedusefulvalleycausesleadersecretseconddamagesportsexceptratingsignedthingseffectfieldsstatesofficevisualeditorvolumeReportmuseummoviesparentaccessmostlymother" id="marketgroundchancesurveybeforesymbolmomentspeechmotioninsidematterCenterobjectexistsmiddleEuropegrowthlegacymannerenoughcareeransweroriginportalclientselectrandomclosedtopicscomingfatheroptionsimplyraisedescapechosenchurchdefinereasoncorneroutputmemoryiframepolicemodelsNumberduringoffersstyleskilledlistedcalledsilvermargindeletebetterbrowselimitsGlobalsinglewidgetcenterbudgetnowrapcreditclaimsenginesafetychoicespirit-stylespreadmakingneededrussiapleaseextentScriptbrokenallowschargedividefactormember-basedtheoryconfigaroundworkedhelpedChurchimpactshouldalwayslogo" bottomlist">){var prefixorangeHeader.push(couplegardenbridgelaunchReviewtakingvisionlittledatingButtonbeautythemesforgotSearchanchoralmostloadedChangereturnstringreloadMobileincomesupplySourceordersviewed&nbsp;courseAbout island<html cookiename="amazonmodernadvicein</a>: The dialoghousesBEGIN MexicostartscentreheightaddingIslandassetsEmpireSchooleffortdirectnearlymanualSelect.\n\nOnejoinedmenu">PhilipawardshandleimportOfficeregardskillsnationSportsdegreeweekly (e.g.behinddoctorloggedunited</b></beginsplantsassistartistissued300px|canadaagencyschemeremainBrazilsamplelogo">beyond-scaleacceptservedmarineFootercamera</h1>\n_form"leavesstress" />\r\n.gif" onloadloaderOxfordsistersurvivlistenfemaleDesignsize="appealtext">levelsthankshigherforcedanimalanyoneAfricaagreedrecentPeople<br />wonderpricesturned|| {};main">inlinesundaywrap">failedcensusminutebeaconquotes150px|estateremoteemail"linkedright;signalformal1.htmlsignupprincefloat:.png" forum.AccesspaperssoundsextendHeightsliderUTF-8"&amp; Before. WithstudioownersmanageprofitjQueryannualparamsboughtfamousgooglelongeri++) {israelsayingdecidehome">headerensurebranchpiecesblock;statedtop"><racingresize--&gt;pacitysexualbureau.jpg" 10,000obtaintitlesamount, Inc.comedymenu" lyricstoday.indeedcounty_logo.FamilylookedMarketlse ifPlayerturkey);var forestgivingerrorsDomain}else{insertBlog</footerlogin.fasteragents<body 10px 0pragmafridayjuniordollarplacedcoversplugin5,000 page">boston.test(avatartested_countforumsschemaindex,filledsharesreaderalert(appearSubmitline">body">\n* TheThoughseeingjerseyNews</verifyexpertinjurywidth=CookieSTART across_imagethreadnativepocketbox">\nSystem DavidcancertablesprovedApril reallydriveritem">more">boardscolorscampusfirst || [];media.guitarfinishwidth:showedOther .php" assumelayerswilsonstoresreliefswedenCustomeasily your String\n\nWhiltaylorclear:resortfrenchthough") + "<body>buyingbrandsMembername">oppingsector5px;">vspacepostermajor coffeemartinmaturehappen</nav>kansaslink">Images=falsewhile hspace0&amp; \n\nIn powerPolski-colorjordanBottomStart -count2.htmlnews">01.jpgOnline-rightmillerseniorISBN 00,000 guidesvalue)ectionrepair.xml" rights.html-blockregExp:hoverwithinvirginphones</tr>\rusing \n\tvar >\');\n\t</td>\n</tr>\nbahasabrasilgalegomagyarpolskisrpskiX1X/Y\bd8-f\x16\x07g.\0d=\x13g9\x01i+\x14d?!f\x01/d8-e\x1b=f\b\x11d;,d8\0d8*e\x05,e\x0f8g.!g\x10\x06h.:e\x1d\x1be\x0f/d;%f\x1c\re\n!f\x176i\x174d8*d::d:\'e\x13\x01h\x07*e71d<\x01d8\x1af\x1f%g\x1c\ve7%d=\x1ch\x01\x14g3;f2!f\x1c\tg=\x11g+\x19f\t\0f\x1c\th/\x04h.:d8-e?\x03f\x16\x07g+ g\x14(f\b7i&\x16i!5d=\x1ch\0\x05f\n\0f\x1c/i\x17.i"\x18g\x1b8e\x053d8\vh==f\x10\x1cg4"d=?g\x14(h=/d;6e\x1c(g:?d8;i"\x18h5\x04f\x16\x19h\'\x06i"\x11e\x1b\x1ee$\rf3(e\x06\fg=\x11g;\x1cf\x146h\x17\x0fe\x06\x05e.9f\x0e(h\r\x10e8\x02e\x1c:f6\bf\x01/g):i\x174e\x0f\x11e8\x03d;\0d9\be%=e\x0f\vg\x14\x1ff4;e\x1b>g\t\x07e\x0f\x11e1\x15e&\x02f\x1e\x1cf\t\vf\x1c:f\x160i\x17;f\x1c\0f\x160f\x169e<\x0fe\f\x17d:,f\x0f\x10d>\x1be\x053d:\x0ef\x1b4e$\x1ah?\x19d8*g3;g;\x1fg\x1f%i\x01\x13f88f\b\x0fe9?e\x11\ne\x056d;\x16e\x0f\x11h!(e.\te\x05(g,,d8\0d<\x1ae\x11\x18h?\x1bh!\fg\x029e\x07;g\t\bf\x1d\x03g\x145e-\x10d8\x16g\x15\fh.>h.!e\x05\rh49f\x15\x19h\x022e\n e\x05%f4;e\n(d;\x16d;,e\x15\x06e\x13\x01e\r\x1ae."g\x0e0e\x1c(d8\nf57e&\x02d=\x15e72g;\x0fg\x15\x19h(\0h/&g;\x06g$>e\f:g\x19;e=\x15f\x1c,g+\x19i\x1c\0h&\x01d;7f <f\x14/f\f\x01e\x1b=i\x19\x05i\x13>f\x0e%e\x1b=e.6e;:h.>f\x1c\ve\x0f\vi\x18\x05h/;f3\x15e>\vd=\rg=.g;\x0ff5\x0ei\0\tf\v)h?\x19f 7e=\x13e\t\re\b\x06g1;f\x0e\x12h!\fe\x1b d8:d:$f\x18\x13f\x1c\0e\x10\x0ei\x1f3d9\x10d8\rh\x03=i\0\x1ah?\x07h!\fd8\x1ag\'\x11f\n\0e\x0f/h\x03=h.>e$\x07e\x10\bd=\x1ce$\'e.6g$>d<\x1ag \x14g)6d8\x13d8\x1ae\x05(i\x03(i!9g\x1b.h?\x19i\x07\fh?\x18f\x18/e<\0e\'\vf\x03\x05e\x065g\x145h\x04\x11f\x16\x07d;6e\x13\x01g\t\fe8.e\n)f\x16\x07e\f\x16h5\x04f:\x10e$\'e-&e-&d9 e\x1c0e\x1d\0f5\x0fh\'\bf\n\x15h5\x04e7%g(\vh&\x01f1\x02f\0\x0ed9\bf\x176e\0\x19e\n\x1fh\x03=d8;h&\x01g\x1b.e\t\rh5\x04h./e\x1f\x0ee8\x02f\x169f3\x15g\x145e=1f\v\x1bh\x01\x18e#0f\x18\x0ed;;d=\x15e\x01%e:7f\x150f\r.g>\x0ee\x1b=f1=h=&d;\vg;\rd=\x06f\x18/d:$f5\x01g\x14\x1fd:\'f\t\0d;%g\x145h/\x1df\x18>g$:d8\0d:\x1be\r\x15d=\rd::e\x11\x18e\b\x06f\x1e\x10e\x1c0e\x1b>f\x17\x05f88e7%e\x057e-&g\x14\x1fg3;e\b\x17g=\x11e\x0f\ve8\x16e-\x10e/\x06g \x01i"\x11i\x01\x13f\x0e\'e\b6e\x1c0e\f:e\x1f:f\x1c,e\x05(e\x1b=g=\x11d8\ni\x07\rh&\x01g,,d:\fe\x16\x1cf,"h?\x1be\x05%e\x0f\vf\x03\x05h?\x19d:\x1bh\0\x03h/\x15e\x0f\x11g\x0e0e\x1f9h.-d;%d8\nf\x14?e:\x1cf\b\x10d8:g\x0e/e"\x03i&\x19f8/e\x10\ff\x176e(1d9\x10e\x0f\x11i\0\x01d8\0e.\x1ae<\0e\x0f\x11d=\x1ce\x13\x01f \x07e\x07\x06f,"h?\x0eh\'#e\x063e\x1c0f\x169d8\0d8\vd;%e\x0f\nh4#d;;f\b\x16h\0\x05e."f\b7d;#h!(g\'/e\b\x06e%3d::f\x150g \x01i\x14\0e\x14.e\x07:g\x0e0g&;g:?e:\x14g\x14(e\b\x17h!(d8\re\x10\fg<\x16h>\x11g;\x1fh.!f\x1f%h/"d8\rh&\x01f\x1c\te\x053f\x1c:f\x1e\x04e>\be$\x1af\x12-f\x14>g;\x04g;\x07f\x14?g-\x16g\x1b4f\x0e%h\x03=e\n\x1bf\x1d%f:\x10f\x19\x02i\x16\x13g\x1c\ve\b0g\x03-i\x17(e\x053i\x14.d8\x13e\f:i\x1d\x1ee88h\v1h/-g\x19>e:&e8\ff\x1c\x1bg>\x0ee%3f/\x14h>\x03g\x1f%h/\x06h\'\x04e.\x1ae;:h..i\x03(i\x17(f\x04\x0fh\'\x01g2>e=)f\x17%f\x1c,f\x0f\x10i+\x18e\x0f\x11h(\0f\x169i\x1d"e\x1f:i\x07\x11e$\x04g\x10\x06f\x1d\x03i\x19\x10e=1g\t\x07i\x136h!\fh?\x18f\x1c\te\b\x06d:+g\t)e\x13\x01g;\x0fh\x10%f7;e\n d8\x13e.6h?\x19g\'\rh/\x1di"\x18h57f\x1d%d8\x1ae\n!e\x05,e\x11\nh.0e=\x15g.\0d;\vh4(i\x07\x0fg\x147d::e=1e\x13\re<\x15g\x14(f\n%e\x11\ni\x03(e\b\x06e?+i\0\x1fe\x12(h/"f\x176e0\x1af3(f\x04\x0fg\x143h/7e-&f !e:\x14h/%e\x0e\x06e\x0f2e\x0f*f\x18/h?\x14e\x1b\x1eh4-d90e\x10\rg\'0d8:d:\x06f\b\x10e\n\x1fh/4f\x18\x0ed>\x1be:\x14e-)e-\x10d8\x13i"\x18g(\ve:\x0fd8\0h\b,f\x1c\x03e\x13!e\x0f*f\x1c\te\x056e.\x03d?\x1df\n$h\0\fd8\x14d;\ne$)g*\x17e\x0f#e\n(f\0\x01g\n6f\0\x01g\t9e\b+h.$d8:e?\x05i!;f\x1b4f\x160e0\x0fh/4f\b\x11e\0\x11d=\x1cd8:e*\x12d=\x13e\f\x05f\v,i\x02#d9\bd8\0f 7e\x1b=e\x06\x05f\x18/e\x10&f 9f\r.g\x145h\'\x06e-&i\x19"e\x057f\x1c\th?\x07g(\vg\x141d:\x0ed::f\t\re\x07:f\x1d%d8\rh?\x07f-#e\x1c(f\x18\x0ef\x18\x1ff\x15\x05d:\ve\x053g3;f \x07i"\x18e\x15\x06e\n!h>\x13e\x05%d8\0g\x1b4e\x1f:g!\0f\x15\x19e-&d:\x06h\'#e;:g-\x11g;\x13f\x1e\x1ce\x05(g\x10\x03i\0\x1ag\x1f%h.!e\b\x12e/9d:\x0eh\t:f\x1c/g\x1b8e\x06\fe\x0f\x11g\x14\x1fg\x1c\x1fg\x1a\x04e;:g+\vg-\tg:\'g1;e\x1e\vg;\x0fi*\fe.\x1eg\x0e0e\b6d=\x1cf\x1d%h\x07*f \x07g->d;%d8\ve\x0e\x1fe\b\x1bf\x17 f3\x15e\x056d8-e\0\vd::d8\0e\b\x07f\f\x07e\r\x17e\x053i\x17-i\x1b\x06e\x1b"g,,d8\te\x053f3(e\x1b f-$g\x05\'g\t\x07f71e\x1c3e\x15\x06d8\x1ae9?e7\x1ef\x17%f\x1c\x1fi+\x18g:\'f\x1c\0h?\x11g;<e\x10\bh!(g$:d8\x13h>\x11h!\fd8:d:$i\0\x1ah/\x04d;7h\'\te>\x17g2>e\r\x0ee.6e:-e.\ff\b\x10f\x04\x1fh\'\te.\th#\x05e>\x17e\b0i\x02.d;6e\b6e:&i#\x1fe\x13\x01h\x19=g\x046h=,h==f\n%d;7h.0h\0\x05f\x169f!\bh!\ff\x14?d::f0\x11g\x14(e\x13\x01d8\x1ch%?f\x0f\x10e\x07:i\x05\x12e:\x17g\x046e\x10\x0ed;\x18f,>g\x03-g\x029d;%e\t\re.\fe\x05(e\x0f\x11e8\x16h.>g=.i"\x06e/<e7%d8\x1ae\f;i\x19"g\x1c\vg\x1c\vg;\x0fe\x058e\x0e\x1fe\x1b e93e\x0f0e\x10\x04g\'\re"\x1ee\n f\x1d\x10f\x16\x19f\x160e"\x1ed9\ve\x10\x0eh\x01\fd8\x1af\x15\bf\x1e\x1cd;\ne94h.:f\x16\x07f\b\x11e\x1b=e\x11\nh/\tg\t\bd8;d?.f\x149e\x0f\x02d8\x0ef\t\x13e\r0e?+d9\x10f\x1c:f"0h\'\x02g\x029e-\x18e\x1c(g2>g%\x1eh\x0e7e>\x17e\b)g\x14(g;\'g;-d= d;,h?\x19d9\bf(!e<\x0fh/-h(\0h\x03=e$\x1fi\x1b\x05h\x19\x0ef\x13\rd=\x1ci#\x0ef <d8\0h57g\'\x11e-&d=\x13h\x022g\x1f-d?!f\x1d!d;6f2;g\x16\x17h?\x10e\n(d:\'d8\x1ad<\x1ah..e/<h\b*e\x05\bg\x14\x1fh\x01\x14g\x1b\x1fe\x0f/f\x18/e\x15\x0fi!\fg;\x13f\x1e\x04d=\x1cg\x14(h0\x03f\x1f%h3\x07f\x16\x19h\x07*e\n(h4\x1fh4#e\x06\x1cd8\x1ah.?i\x17.e.\x1ef\x16=f\x0e%e\x0f\x17h.(h.:i\x02#d8*e\x0f\ri&\be\n e<:e%3f\0\'h\f\x03e\x1b4f\x1c\re\v\x19d<\x11i\x172d;\nf\x17%e."f\x1c\rh\'\0g\x1c\ve\x0f\x02e\n g\x1a\x04h/\x1dd8\0g\x029d?\x1dh/\x01e\x1b>d9&f\x1c\tf\x15\bf5\vh/\x15g\';e\n(f\t\rh\x03=e\x063e.\x1ah\x02!g%(d8\rf\x16-i\x1c\0f1\x02d8\re>\x17e\n\x1ef3\x15d9\vi\x174i\x07\x07g\x14(h\x10%i\x14\0f\n\x15h/\tg\x1b.f \x07g\b1f\x03\x05f\x11\x04e=1f\x1c\td:\x1bh$\x07h#=f\x16\x07e-&f\x1c:d<\x1af\x150e-\x17h#\x05d?.h4-g\t)e\x06\x1cf\x1d\x11e\x05(i\x1d"g2>e\x13\x01e\x056e.\x1ed:\vf\x03\x05f04e93f\x0f\x10g$:d8\ne8\x02h0"h0"f\x19.i\0\x1af\x15\x19e8\bd8\nd< g1;e\b+f-\ff\x1b2f\v%f\x1c\te\b\x1bf\x160i\x05\rd;6e\x0f*h&\x01f\x176d;#h3\x07h(\nh>>e\b0d::g\x14\x1fh."i\x18\x05h\0\x01e8\be1\x15g$:e?\x03g\x10\x06h44e-\x10g62g+\x19d8;i!\fh\x07*g\x046g:\'e\b+g.\0e\r\x15f\x149i\x1d)i\x02#d:\x1bf\x1d%h/4f\t\x13e<\0d;#g \x01e\b i\x19$h/\x01e\b8h\n\x02g\x1b.i\x07\rg\x029f,!f\x158e$\x1ae0\x11h\'\x04e\b\x12h5\x04i\x07\x11f\t>e\b0d;%e\x10\x0ee$\'e\x05(d8;i!5f\x1c\0d=3e\x1b\x1eg-\x14e$)d8\vd?\x1di\x1a\x1cg\x0e0d;#f#\0f\x1f%f\n\x15g%(e0\x0ff\x176f2\x12f\x1c\tf-#e88g\x14\x1ah\x073d;#g\x10\x06g\x1b.e=\x15e\x05,e<\0e$\re\b6i\x07\x11h\x1e\re98g&\x0fg\t\bf\x1c,e="f\b\x10e\x07\x06e$\x07h!\ff\x03\x05e\x1b\x1ee\b0f\0\x1df\x033f\0\x0ef 7e\r\x0fh..h.$h/\x01f\x1c\0e%=d:\'g\x14\x1ff\f\tg\x05\'f\x1c\rh#\x05e9?d8\x1ce\n(f<+i\x07\x07h4-f\x160f\t\vg;\x04e\x1b>i\x1d"f\x1d?e\x0f\x02h\0\x03f\x14?f2;e.9f\x18\x13e$)e\x1c0e\n*e\n\x1bd::d;,e\r\x07g:\'i\0\x1fe:&d::g\t)h0\x03f\x154f5\x01h!\fi\0 f\b\x10f\x16\x07e-\x17i\x1f)e\x1b=h48f\x18\x13e<\0e1\x15g\x1b8i\x17\x1ch!(g\x0e0e=1h\'\x06e&\x02f-$g>\x0ee.9e$\'e0\x0ff\n%i\x01\x13f\x1d!f,>e?\x03f\x03\x05h.8e$\x1af3\x15h\'\x04e.6e1\x05d9&e:\x17h?\x1ef\x0e%g+\ve\r3d8>f\n%f\n\0e7\'e%%h?\x10g\x19;e\x05%d;%f\x1d%g\x10\x06h.:d:\vd;6h\x07*g\x141d8-e\r\x0ee\n\x1ee\x05,e&\be&\bg\x1c\x1ff-#d8\ri\x14\x19e\x05(f\x16\x07e\x10\be\x10\fd;7e\0<e\b+d::g\x1b\x11g\x1d#e\x057d=\x13d8\x16g:*e\x1b"i\x18\x1fe\b\x1bd8\x1af\t?f\v\x05e"\x1ei\x15?f\x1c\td::d?\x1df\f\x01e\x15\x06e.6g;4d?.e\x0f0f9>e7&e\x0f3h\x02!d;=g-\x14f!\be.\x1ei\x19\x05g\x145d?!g;\x0fg\x10\x06g\x14\x1fe\x11=e.#d< d;;e\n!f-#e<\x0fg\t9h\t2d8\vf\x1d%e\r\x0fd<\x1ae\x0f*h\x03=e=\x13g\x046i\x07\rf\x160e\x05\'e.9f\f\x07e/<h?\x10h!\ff\x17%e?\x17h3#e.6h6\x05h?\x07e\x1c\x1fe\x1c0f5\x19f1\x1ff\x14/d;\x18f\x0e(e\x07:g+\x19i\x15?f\x1d-e7\x1ef\t\'h!\fe\b6i\0 d9\vd8\0f\x0e(e9?g\x0e0e\x1c:f\x0f\x0fh?0e\x0f\x18e\f\x16d< g;\x1ff-\ff\t\vd?\x1di\x19)h/>g(\ve\f;g\x16\x17g;\x0fh?\x07h?\x07e\x0e;d9\ve\t\rf\x146e\x05%e94e:&f\x1d\x02e?\x17g>\x0ed8=f\x1c\0i+\x18g\x19;i\x19\x06f\x1c*f\x1d%e\n e7%e\x05\rh4#f\x15\x19g(\vg\t\be\x1d\x17h:+d=\x13i\x07\re:\x06e\x07:e\x14.f\b\x10f\x1c,e="e<\x0fe\x1c\x1fh1\x06e\x07:e\x039d8\x1cf\x169i\x02.g.1e\r\x17d:,f1\x02h\x01\fe\x0f\x16e>\x17h\x01\fd=\rg\x1b8d?!i!5i\x1d"e\b\x06i\x12\x1fg=\x11i!5g!.e.\x1ae\x1b>d>\vg=\x11e\x1d\0g\'/f\x1e\x01i\x14\x19h//g\x1b.g\x1a\x04e.\x1dh4\x1df\x1c:e\x053i#\x0ei\x19)f\x0e\bf\x1d\x03g\x17\x05f/\x12e. g\t)i\x19$d:\x06h)\x15h+\x16g\x16>g\x17\x05e\x0f\nf\x176f1\x02h4-g+\x19g\x029e\x04?g+%f/\x0fe$)d8-e$.h.$h/\x06f/\x0fd8*e$)f4%e-\x17d=\x13e\x0f0g\x01#g;4f\n$f\x1c,i!5d8*f\0\'e.\x18f\x169e88h\'\x01g\x1b8f\x1c:f\b\x18g\x15%e:\x14e=\x13e>\ve8\bf\x169d>?f !e\x1b-h\x02!e8\x02f\b?e1\vf \x0fg\x1b.e\x11\x18e7%e/<h\x074g*\x01g\x046i\x01\x13e\x057f\x1c,g=\x11g;\x13e\x10\bf!#f!\be\n3e\n(e\x0f&e$\x16g>\x0ee\x05\x03e<\x15h57f\x149e\x0f\x18g,,e\x1b\x1bd<\x1ah.!h**f\x18\x0ei\x1a\x10g\'\x01e.\x1de.\x1dh\'\x04h\f\x03f6\bh49e\x051e\x10\fe?\x18h.0d=\x13g3;e8&f\x1d%e\x10\re-\x17g\x19<h!(e<\0f\x14>e\n g\x1b\x1fe\x0f\x17e\b0d:\ff\t\ve$\'i\x07\x0ff\b\x10d::f\x150i\x07\x0fe\x051d:+e\f:e\x1f\x1fe%3e-)e\x0e\x1fe\b\x19f\t\0e\x1c(g;\x13f\x1d\x1fi\0\x1ad?!h6\x05g:\'i\x05\rg=.e=\x13f\x176d<\x18g\'\0f\0\'f\x04\x1ff\b?d:\'i\x01\nf\b2e\x07:e\x0f#f\x0f\x10d:$e01d8\x1ad?\x1de\x01%g(\ve:&e\x0f\x02f\x150d:\vd8\x1af\x154d8*e11d8\x1cf\x03\x05f\x04\x1fg\t9f.\ne\b\x06i!\x1ef\x10\x1ce0\ve1\x1ed:\x0ei\x17(f\b7h4"e\n!e#0i\x1f3e\x0f\ne\x056h4"g;\x0fe\x1d\x1af\f\x01e92i\x03(f\b\x10g+\ve\b)g\x1b\nh\0\x03h\x19\x11f\b\x10i\x03=e\f\x05h#\x05g\x14(f\b6f/\x14h5\x1bf\x16\x07f\x18\x0ef\v\x1be\x15\x06e.\ff\x154g\x1c\x1ff\x18/g\x1c<g\x1d\x1bd<\x19d<4e(\x01f\x1c\x1bi"\x06e\x1f\x1fe\r+g\x14\x1fd<\x18f\x03 h+\x16e#\x07e\x05,e\x051h\t/e%=e\x05\x05e\b\x06g,&e\x10\bi\x19\x04d;6g\t9g\x029d8\re\x0f/h\v1f\x16\x07h5\x04d:\'f 9f\x1c,f\x18\x0ef\x18>e/\x06g"<e\x05,d<\x17f0\x11f\x17\x0ff\x1b4e\n d:+e\x0f\x17e\x10\fe-&e\x10/e\n(i\0\x02e\x10\be\x0e\x1ff\x1d%i\x17.g-\x14f\x1c,f\x16\x07g>\x0ei#\x1fg;?h\t2g(3e.\x1ag;\bd:\x0eg\x14\x1fg\t)d>\x1bf1\x02f\x10\x1cg\v\x10e\n\x1bi\x07\x0fd8%i\x07\rf08h?\x1ce\x06\x19g\x1c\x1ff\x1c\ti\x19\x10g+\x1ed:\te/9h1!h49g\x14(d8\re%=g;\x1de/9e\r\x01e\b\x06d?\x03h?\x1bg\x029h/\x04e=1i\x1f3d<\x18e\n?d8\re0\x11f,#h5\x0fe96d8\x14f\x1c\tg\x029f\x169e\x10\x11e\x05(f\x160d?!g\x14(h.>f\x16=e="h1!h5\x04f <g*\x01g 4i\x1a\x0fg\x1d\0i\x07\re$\'d:\x0ef\x18/f/\x15d8\x1af\x19:h\x03=e\f\x16e7%e.\fg>\x0ee\x15\x06e\x1f\x0eg;\x1fd8\0e\x07:g\t\bf\t\x13i\0 g\x14"e\x13\x01f&\x02e\x065g\x14(d:\x0ed?\x1dg\x15\x19e\x1b g4 d8-e\x1c\ve-\x18e\x02(h44e\x1b>f\x1c\0f\x04\x1bi\x15?f\x1c\x1fe\x0f#d;7g\x10\x06h4"e\x1f:e\x1c0e.\tf\x0e\x12f-&f1\ti\x07\fi\x1d"e\b\x1be;:e$)g):i&\x16e\x05\be.\fe\x16\x04i)1e\n(d8\vi\x1d"d8\re\x06\rh/\x1ad?!f\x04\x0fd9\ti\x183e\x05\th\v1e\x1b=f<\x02d:.e\x06\x1bd:\vg\x0e)e.6g>$d<\x17e\x06\x1cf0\x11e\r3e\x0f/e\x10\rg(1e.6e\x057e\n(g\x14;f\x033e\b0f3(f\x18\x0ee0\x0fe-&f\0\'h\x03=h\0\x03g \x14g!,d;6h\'\x02g\x1c\vf8\x05f%\x1af\x10\x1eg,\x11i&\x16i \x01i;\x04i\x07\x11i\0\x02g\x14(f1\x1fh\v\x0fg\x1c\x1fe.\x1ed8;g.!i\x186f.5h(;e\x06\ng?;h/\x11f\x1d\x03e\b)e\x01\x1ae%=d<<d9\x0ei\0\x1ah./f\x16=e7%g\v\0f\x05\vd9\x1fh.8g\x0e/d?\x1de\x1f9e\x05;f&\x02e?5e$\'e\x1e\vf\x1c:g%(g\x10\x06h\'#e\f?e\x10\rcuandoenviarmadridbuscariniciotiempoporquecuentaestadopuedenjuegoscontraestC!nnombretienenperfilmaneraamigosciudadcentroaunquepuedesdentroprimerpreciosegC:nbuenosvolverpuntossemanahabC-aagostonuevosunidoscarlosequiponiC1osmuchosalgunacorreoimagenpartirarribamarC-ahombreempleoverdadcambiomuchasfueronpasadolC-neaparecenuevascursosestabaquierolibroscuantoaccesomiguelvarioscuatrotienesgruposserC!neuropamediosfrenteacercademC!sofertacochesmodeloitalialetrasalgC:ncompracualesexistecuerposiendoprensallegarviajesdineromurciapodrC!puestodiariopuebloquieremanuelpropiocrisisciertoseguromuertefuentecerrargrandeefectopartesmedidapropiaofrecetierrae-mailvariasformasfuturoobjetoseguirriesgonormasmismosC:nicocaminositiosrazC3ndebidopruebatoledotenC-ajesC:sesperococinaorigentiendacientocC!dizhablarserC-alatinafuerzaestiloguerraentrarC)xitolC3pezagendavC-deoevitarpaginametrosjavierpadresfC!cilcabezaC!reassalidaenvC-ojapC3nabusosbienestextosllevarpuedanfuertecomC:nclaseshumanotenidobilbaounidadestC!seditarcreadoP4P;Q\x0fQ\x07Q\x02P>P:P0P:P8P;P8Q\rQ\x02P>P2Q\x01P5P5P3P>P?Q\0P8Q\x02P0P:P5Q\tP5Q\x03P6P5P\x1aP0P:P1P5P7P1Q\vP;P>P=P8P\x12Q\x01P5P?P>P4P-Q\x02P>Q\x02P>P<Q\x07P5P<P=P5Q\x02P;P5Q\x02Q\0P0P7P>P=P0P3P4P5P<P=P5P\x14P;Q\x0fP\x1fQ\0P8P=P0Q\x01P=P8Q\x05Q\x02P5P<P:Q\x02P>P3P>P4P2P>Q\x02Q\x02P0P<P!P(P\x10P<P0Q\x0fP\'Q\x02P>P2P0Q\x01P2P0P<P5P<Q\x03P"P0P:P4P2P0P=P0P<Q\rQ\x02P8Q\rQ\x02Q\x03P\x12P0P<Q\x02P5Q\x05P?Q\0P>Q\x02Q\x03Q\x02P=P0P4P4P=Q\x0fP\x12P>Q\x02Q\x02Q\0P8P=P5P9P\x12P0Q\x01P=P8P<Q\x01P0P<Q\x02P>Q\x02Q\0Q\x03P1P\x1eP=P8P<P8Q\0P=P5P5P\x1eP\x1eP\x1eP;P8Q\x06Q\rQ\x02P0P\x1eP=P0P=P5P<P4P>P<P<P>P9P4P2P5P>P=P>Q\x01Q\x03P4`$\x15`%\x07`$9`%\b`$\x15`%\0`$8`%\x07`$\x15`$>`$\x15`%\v`$\x14`$0`$*`$0`$(`%\x07`$\x0f`$\x15`$\x15`$?`$-`%\0`$\x07`$8`$\x15`$0`$$`%\v`$9`%\v`$\x06`$*`$9`%\0`$/`$9`$/`$>`$$`$\x15`$%`$>jagran`$\x06`$\x1c`$\x1c`%\v`$\x05`$,`$&`%\v`$\x17`$\b`$\x1c`$>`$\x17`$\x0f`$9`$.`$\x07`$(`$5`$9`$/`%\x07`$%`%\x07`$%`%\0`$\x18`$0`$\x1c`$,`$&`%\0`$\x15`$\b`$\x1c`%\0`$5`%\x07`$(`$\b`$(`$\x0f`$9`$0`$\t`$8`$.`%\x07`$\x15`$.`$5`%\v`$2`%\x07`$8`$,`$.`$\b`$&`%\x07`$\x13`$0`$\x06`$.`$,`$8`$-`$0`$,`$(`$\x1a`$2`$.`$(`$\x06`$\x17`$8`%\0`$2`%\0X9Y\x04Y\tX%Y\x04Y\tY\x07X0X\'X"X.X1X9X/X/X\'Y\x04Y\tY\x07X0Y\x07X5Y\bX1X:Y\nX1Y\x03X\'Y\x06Y\bY\x04X\'X(Y\nY\x06X9X1X6X0Y\x04Y\x03Y\x07Y\x06X\'Y\nY\bY\x05Y\x02X\'Y\x04X9Y\x04Y\nX\'Y\x06X\'Y\x04Y\x03Y\x06X-X*Y\tY\x02X(Y\x04Y\bX-X)X\'X.X1Y\x01Y\x02X7X9X(X/X1Y\x03Y\x06X%X0X\'Y\x03Y\x05X\'X\'X-X/X%Y\x04X\'Y\x01Y\nY\x07X(X9X6Y\x03Y\nY\x01X(X-X+Y\bY\x05Y\x06Y\bY\x07Y\bX#Y\x06X\'X,X/X\'Y\x04Y\x07X\'X3Y\x04Y\x05X9Y\x06X/Y\x04Y\nX3X9X(X1X5Y\x04Y\tY\x05Y\x06X0X(Y\x07X\'X#Y\x06Y\x07Y\x05X+Y\x04Y\x03Y\x06X*X\'Y\x04X\'X-Y\nX+Y\x05X5X1X4X1X-X-Y\bY\x04Y\bY\x01Y\nX\'X0X\'Y\x04Y\x03Y\x04Y\x05X1X)X\'Y\x06X*X\'Y\x04Y\x01X#X(Y\bX.X\'X5X#Y\x06X*X\'Y\x06Y\x07X\'Y\x04Y\nX9X6Y\bY\bY\x02X/X\'X(Y\x06X.Y\nX1X(Y\x06X*Y\x04Y\x03Y\x05X4X\'X!Y\bY\x07Y\nX\'X(Y\bY\x02X5X5Y\bY\x05X\'X1Y\x02Y\x05X#X-X/Y\x06X-Y\x06X9X/Y\x05X1X#Y\nX\'X-X)Y\x03X*X(X/Y\bY\x06Y\nX,X(Y\x05Y\x06Y\x07X*X-X*X,Y\x07X)X3Y\x06X)Y\nX*Y\x05Y\x03X1X)X:X2X)Y\x06Y\x01X3X(Y\nX*Y\x04Y\x04Y\x07Y\x04Y\x06X\'X*Y\x04Y\x03Y\x02Y\x04X(Y\x04Y\x05X\'X9Y\x06Y\x07X#Y\bY\x04X4Y\nX!Y\x06Y\bX1X#Y\x05X\'Y\x01Y\nY\x03X(Y\x03Y\x04X0X\'X*X1X*X(X(X#Y\x06Y\x07Y\x05X3X\'Y\x06Y\x03X(Y\nX9Y\x01Y\x02X/X-X3Y\x06Y\x04Y\x07Y\x05X4X9X1X#Y\x07Y\x04X4Y\x07X1Y\x02X7X1X7Y\x04X(profileservicedefaulthimselfdetailscontentsupportstartedmessagesuccessfashion<title>countryaccountcreatedstoriesresultsrunningprocesswritingobjectsvisiblewelcomearticleunknownnetworkcompanydynamicbrowserprivacyproblemServicerespectdisplayrequestreservewebsitehistoryfriendsoptionsworkingversionmillionchannelwindow.addressvisitedweathercorrectproductedirectforwardyou canremovedsubjectcontrolarchivecurrentreadinglibrarylimitedmanagerfurthersummarymachineminutesprivatecontextprogramsocietynumberswrittenenabledtriggersourcesloadingelementpartnerfinallyperfectmeaningsystemskeepingculture&quot;,journalprojectsurfaces&quot;expiresreviewsbalanceEnglishContentthroughPlease opinioncontactaverageprimaryvillageSpanishgallerydeclinemeetingmissionpopularqualitymeasuregeneralspeciessessionsectionwriterscounterinitialreportsfiguresmembersholdingdisputeearlierexpressdigitalpictureAnothermarriedtrafficleadingchangedcentralvictoryimages/reasonsstudiesfeaturelistingmust beschoolsVersionusuallyepisodeplayinggrowingobviousoverlaypresentactions</ul>\r\nwrapperalreadycertainrealitystorageanotherdesktopofferedpatternunusualDigitalcapitalWebsitefailureconnectreducedAndroiddecadesregular &amp; animalsreleaseAutomatgettingmethodsnothingPopularcaptionletterscapturesciencelicensechangesEngland=1&amp;History = new CentralupdatedSpecialNetworkrequirecommentwarningCollegetoolbarremainsbecauseelectedDeutschfinanceworkersquicklybetweenexactlysettingdiseaseSocietyweaponsexhibit&lt;!--Controlclassescoveredoutlineattacksdevices(windowpurposetitle="Mobile killingshowingItaliandroppedheavilyeffects-1\']);\nconfirmCurrentadvancesharingopeningdrawingbillionorderedGermanyrelated</form>includewhetherdefinedSciencecatalogArticlebuttonslargestuniformjourneysidebarChicagoholidayGeneralpassage,&quot;animatefeelingarrivedpassingnaturalroughly.\n\nThe but notdensityBritainChineselack oftributeIreland" data-factorsreceivethat isLibraryhusbandin factaffairsCharlesradicalbroughtfindinglanding:lang="return leadersplannedpremiumpackageAmericaEdition]&quot;Messageneed tovalue="complexlookingstationbelievesmaller-mobilerecordswant tokind ofFirefoxyou aresimilarstudiedmaximumheadingrapidlyclimatekingdomemergedamountsfoundedpioneerformuladynastyhow to SupportrevenueeconomyResultsbrothersoldierlargelycalling.&quot;AccountEdward segmentRobert effortsPacificlearnedup withheight:we haveAngelesnations_searchappliedacquiremassivegranted: falsetreatedbiggestbenefitdrivingStudiesminimumperhapsmorningsellingis usedreversevariant role="missingachievepromotestudentsomeoneextremerestorebottom:evolvedall thesitemapenglishway to AugustsymbolsCompanymattersmusicalagainstserving})();\r\npaymenttroubleconceptcompareparentsplayersregionsmonitor \'\'The winningexploreadaptedGalleryproduceabilityenhancecareers). The collectSearch ancientexistedfooter handlerprintedconsoleEasternexportswindowsChannelillegalneutralsuggest_headersigning.html">settledwesterncausing-webkitclaimedJusticechaptervictimsThomas mozillapromisepartieseditionoutside:false,hundredOlympic_buttonauthorsreachedchronicdemandssecondsprotectadoptedprepareneithergreatlygreateroverallimprovecommandspecialsearch.worshipfundingthoughthighestinsteadutilityquarterCulturetestingclearlyexposedBrowserliberal} catchProjectexamplehide();FloridaanswersallowedEmperordefenseseriousfreedomSeveral-buttonFurtherout of != nulltrainedDenmarkvoid(0)/all.jspreventRequestStephen\n\nWhen observe</h2>\r\nModern provide" alt="borders.\n\nFor \n\nMany artistspoweredperformfictiontype ofmedicalticketsopposedCouncilwitnessjusticeGeorge Belgium...</a>twitternotablywaitingwarfare Other rankingphrasesmentionsurvivescholar</p>\r\n Countryignoredloss ofjust asGeorgiastrange<head><stopped1\']);\r\nislandsnotableborder:list ofcarried100,000</h3>\n severalbecomesselect wedding00.htmlmonarchoff theteacherhighly biologylife ofor evenrise of&raquo;plusonehunting(thoughDouglasjoiningcirclesFor theAncientVietnamvehiclesuch ascrystalvalue =Windowsenjoyeda smallassumed<a id="foreign All rihow theDisplayretiredhoweverhidden;battlesseekingcabinetwas notlook atconductget theJanuaryhappensturninga:hoverOnline French lackingtypicalextractenemieseven ifgeneratdecidedare not/searchbeliefs-image:locatedstatic.login">convertviolententeredfirst">circuitFinlandchemistshe was10px;">as suchdivided</span>will beline ofa greatmystery/index.fallingdue to railwaycollegemonsterdescentit withnuclearJewish protestBritishflowerspredictreformsbutton who waslectureinstantsuicidegenericperiodsmarketsSocial fishingcombinegraphicwinners<br /><by the NaturalPrivacycookiesoutcomeresolveSwedishbrieflyPersianso muchCenturydepictscolumnshousingscriptsnext tobearingmappingrevisedjQuery(-width:title">tooltipSectiondesignsTurkishyounger.match(})();\n\nburningoperatedegreessource=Richardcloselyplasticentries</tr>\r\ncolor:#ul id="possessrollingphysicsfailingexecutecontestlink toDefault<br />\n: true,chartertourismclassicproceedexplain</h1>\r\nonline.?xml vehelpingdiamonduse theairlineend --\x3e).attr(readershosting#ffffffrealizeVincentsignals src="/ProductdespitediversetellingPublic held inJoseph theatreaffects<style>a largedoesn\'tlater, ElementfaviconcreatorHungaryAirportsee theso thatMichaelSystemsPrograms, and width=e&quot;tradingleft">\npersonsGolden Affairsgrammarformingdestroyidea ofcase ofoldest this is.src = cartoonregistrCommonsMuslimsWhat isin manymarkingrevealsIndeed,equally/show_aoutdoorescape(Austriageneticsystem,In the sittingHe alsoIslandsAcademy\n\t\t\x3c!--Daniel bindingblock">imposedutilizeAbraham(except{width:putting).html(|| [];\nDATA[ *kitchenmountedactual dialectmainly _blank\'installexpertsif(typeIt also&copy; ">Termsborn inOptionseasterntalkingconcerngained ongoingjustifycriticsfactoryits ownassaultinvitedlastinghis ownhref="/" rel="developconcertdiagramdollarsclusterphp?id=alcohol);})();using a><span>vesselsrevivalAddressamateurandroidallegedillnesswalkingcentersqualifymatchesunifiedextinctDefensedied in\n\t\x3c!-- customslinkingLittle Book ofeveningmin.js?are thekontakttoday\'s.html" target=wearingAll Rig;\n})();raising Also, crucialabout">declare--\x3e\n<scfirefoxas muchappliesindex, s, but type = \n\r\n\x3c!--towardsRecordsPrivateForeignPremierchoicesVirtualreturnsCommentPoweredinline;povertychamberLiving volumesAnthonylogin" RelatedEconomyreachescuttinggravitylife inChapter-shadowNotable</td>\r\n returnstadiumwidgetsvaryingtravelsheld bywho arework infacultyangularwho hadairporttown of\n\nSome \'click\'chargeskeywordit willcity of(this);Andrew unique checkedor more300px; return;rsion="pluginswithin herselfStationFederalventurepublishsent totensionactresscome tofingersDuke ofpeople,exploitwhat isharmonya major":"httpin his menu">\nmonthlyofficercouncilgainingeven inSummarydate ofloyaltyfitnessand wasemperorsupremeSecond hearingRussianlongestAlbertalateralset of small">.appenddo withfederalbank ofbeneathDespiteCapitalgrounds), and percentit fromclosingcontainInsteadfifteenas well.yahoo.respondfighterobscurereflectorganic= Math.editingonline paddinga wholeonerroryear ofend of barrierwhen itheader home ofresumedrenamedstrong>heatingretainscloudfrway of March 1knowingin partBetweenlessonsclosestvirtuallinks">crossedEND --\x3efamous awardedLicenseHealth fairly wealthyminimalAfricancompetelabel">singingfarmersBrasil)discussreplaceGregoryfont copursuedappearsmake uproundedboth ofblockedsaw theofficescoloursif(docuwhen heenforcepush(fuAugust UTF-8">Fantasyin mostinjuredUsuallyfarmingclosureobject defenceuse of Medical<body>\nevidentbe usedkeyCodesixteenIslamic#000000entire widely active (typeofone cancolor =speakerextendsPhysicsterrain<tbody>funeralviewingmiddle cricketprophetshifteddoctorsRussell targetcompactalgebrasocial-bulk ofman and</td>\n he left).val()false);logicalbankinghome tonaming Arizonacredits);\n});\nfounderin turnCollinsbefore But thechargedTitle">CaptainspelledgoddessTag --\x3eAdding:but wasRecent patientback in=false&Lincolnwe knowCounterJudaismscript altered\']);\n has theunclearEvent\',both innot all\n\n\x3c!-- placinghard to centersort ofclientsstreetsBernardassertstend tofantasydown inharbourFreedomjewelry/about..searchlegendsis mademodern only ononly toimage" linear painterand notrarely acronymdelivershorter00&amp;as manywidth="/* <![Ctitle =of the lowest picked escapeduses ofpeoples PublicMatthewtacticsdamagedway forlaws ofeasy to windowstrong simple}catch(seventhinfoboxwent topaintedcitizenI don\'tretreat. Some ww.");\nbombingmailto:made in. Many carries||{};wiwork ofsynonymdefeatsfavoredopticalpageTraunless sendingleft"><comScorAll thejQuery.touristClassicfalse" Wilhelmsuburbsgenuinebishops.split(global followsbody ofnominalContactsecularleft tochiefly-hidden-banner</li>\n\n. When in bothdismissExplorealways via thespaC1olwelfareruling arrangecaptainhis sonrule ofhe tookitself,=0&amp;(calledsamplesto makecom/pagMartin Kennedyacceptsfull ofhandledBesides//--\x3e</able totargetsessencehim to its by common.mineralto takeways tos.org/ladvisedpenaltysimple:if theyLettersa shortHerbertstrikes groups.lengthflightsoverlapslowly lesser social </p>\n\t\tit intoranked rate oful>\r\n attemptpair ofmake itKontaktAntoniohaving ratings activestreamstrapped").css(hostilelead tolittle groups,Picture--\x3e\r\n\r\n rows=" objectinverse<footerCustomV><\\/scrsolvingChamberslaverywoundedwhereas!= \'undfor allpartly -right:Arabianbacked centuryunit ofmobile-Europe,is homerisk ofdesiredClintoncost ofage of become none ofp&quot;Middle ead\')[0Criticsstudios>&copy;group">assemblmaking pressedwidget.ps:" ? rebuiltby someFormer editorsdelayedCanonichad thepushingclass="but arepartialBabylonbottom carrierCommandits useAs withcoursesa thirddenotesalso inHouston20px;">accuseddouble goal ofFamous ).bind(priests Onlinein Julyst + "gconsultdecimalhelpfulrevivedis veryr\'+\'iptlosing femalesis alsostringsdays ofarrivalfuture <objectforcingString(" />\n\t\there isencoded. The balloondone by/commonbgcolorlaw of Indianaavoidedbut the2px 3pxjquery.after apolicy.men andfooter-= true;for usescreen.Indian image =family,http:// &nbsp;driverseternalsame asnoticedviewers})();\n is moreseasonsformer the newis justconsent Searchwas thewhy theshippedbr><br>width: height=made ofcuisineis thata very Admiral fixed;normal MissionPress, ontariocharsettry to invaded="true"spacingis mosta more totallyfall of});\r\n immensetime inset outsatisfyto finddown tolot of Playersin Junequantumnot thetime todistantFinnishsrc = (single help ofGerman law andlabeledforestscookingspace">header-well asStanleybridges/globalCroatia About [0];\n it, andgroupedbeing a){throwhe madelighterethicalFFFFFF"bottom"like a employslive inas seenprintermost ofub-linkrejectsand useimage">succeedfeedingNuclearinformato helpWomen\'sNeitherMexicanprotein<table by manyhealthylawsuitdevised.push({sellerssimply Through.cookie Image(older">us.js"> Since universlarger open to!-- endlies in\']);\r\n marketwho is ("DOMComanagedone fortypeof Kingdomprofitsproposeto showcenter;made itdressedwere inmixtureprecisearisingsrc = \'make a securedBaptistvoting \n\t\tvar March 2grew upClimate.removeskilledway the</head>face ofacting right">to workreduceshas haderectedshow();action=book ofan area== "htt<header\n<html>conformfacing cookie.rely onhosted .customhe wentbut forspread Family a meansout theforums.footage">MobilClements" id="as highintense--\x3e\x3c!--female is seenimpliedset thea stateand hisfastestbesidesbutton_bounded"><img Infoboxevents,a youngand areNative cheaperTimeoutand hasengineswon the(mostlyright: find a -bottomPrince area ofmore ofsearch_nature,legallyperiod,land ofor withinducedprovingmissilelocallyAgainstthe wayk&quot;px;">\r\npushed abandonnumeralCertainIn thismore inor somename isand, incrownedISBN 0-createsOctobermay notcenter late inDefenceenactedwish tobroadlycoolingonload=it. TherecoverMembersheight assumes<html>\npeople.in one =windowfooter_a good reklamaothers,to this_cookiepanel">London,definescrushedbaptismcoastalstatus title" move tolost inbetter impliesrivalryservers SystemPerhapses and contendflowinglasted rise inGenesisview ofrising seem tobut in backinghe willgiven agiving cities.flow of Later all butHighwayonly bysign ofhe doesdiffersbattery&amp;lasinglesthreatsintegertake onrefusedcalled =US&ampSee thenativesby thissystem.head of:hover,lesbiansurnameand allcommon/header__paramsHarvard/pixel.removalso longrole ofjointlyskyscraUnicodebr />\r\nAtlantanucleusCounty,purely count">easily build aonclicka givenpointerh&quot;events else {\nditionsnow the, with man whoorg/Webone andcavalryHe diedseattle00,000 {windowhave toif(windand itssolely m&quot;renewedDetroitamongsteither them inSenatorUs</a><King ofFrancis-produche usedart andhim andused byscoringat hometo haverelatesibilityfactionBuffalolink"><what hefree toCity ofcome insectorscountedone daynervoussquare };if(goin whatimg" alis onlysearch/tuesdaylooselySolomonsexual - <a hrmedium"DO NOT France,with a war andsecond take a >\r\n\r\n\r\nmarket.highwaydone inctivity"last">obligedrise to"undefimade to Early praisedin its for hisathleteJupiterYahoo! termed so manyreally s. The a woman?value=direct right" bicycleacing="day andstatingRather,higher Office are nowtimes, when a pay foron this-link">;borderaround annual the Newput the.com" takin toa brief(in thegroups.; widthenzymessimple in late{returntherapya pointbanninginks">\n();" rea place\\u003Caabout atr>\r\n\t\tccount gives a<SCRIPTRailwaythemes/toolboxById("xhumans,watchesin some if (wicoming formats Under but hashanded made bythan infear ofdenoted/iframeleft involtagein eacha&quot;base ofIn manyundergoregimesaction </p>\r\n<ustomVa;&gt;</importsor thatmostly &amp;re size="</a></ha classpassiveHost = WhetherfertileVarious=[];(fucameras/></td>acts asIn some>\r\n\r\n<!organis <br />BeijingcatalC deutscheuropeueuskaragaeilgesvenskaespaC1amensajeusuariotrabajomC)xicopC!ginasiempresistemaoctubreduranteaC1adirempresamomentonuestroprimeratravC)sgraciasnuestraprocesoestadoscalidadpersonanC:meroacuerdomC:sicamiembroofertasalgunospaC-sesejemploderechoademC!sprivadoagregarenlacesposiblehotelessevillaprimeroC:ltimoeventosarchivoculturamujeresentradaanuncioembargomercadograndesestudiomejoresfebrerodiseC1oturismocC3digoportadaespaciofamiliaantoniopermiteguardaralgunaspreciosalguiensentidovisitastC-tuloconocersegundoconsejofranciaminutossegundatenemosefectosmC!lagasesiC3nrevistagranadacompraringresogarcC-aacciC3necuadorquienesinclusodeberC!materiahombresmuestrapodrC-amaC1anaC:ltimaestamosoficialtambienningC:nsaludospodemosmejorarpositionbusinesshomepagesecuritylanguagestandardcampaignfeaturescategoryexternalchildrenreservedresearchexchangefavoritetemplatemilitaryindustryservicesmaterialproductsz-index:commentssoftwarecompletecalendarplatformarticlesrequiredmovementquestionbuildingpoliticspossiblereligionphysicalfeedbackregisterpicturesdisabledprotocolaudiencesettingsactivityelementslearninganythingabstractprogressoverviewmagazineeconomictrainingpressurevarious <strong>propertyshoppingtogetheradvancedbehaviordownloadfeaturedfootballselectedLanguagedistanceremembertrackingpasswordmodifiedstudentsdirectlyfightingnortherndatabasefestivalbreakinglocationinternetdropdownpracticeevidencefunctionmarriageresponseproblemsnegativeprogramsanalysisreleasedbanner">purchasepoliciesregionalcreativeargumentbookmarkreferrerchemicaldivisioncallbackseparateprojectsconflicthardwareinterestdeliverymountainobtained= false;for(var acceptedcapacitycomputeridentityaircraftemployedproposeddomesticincludesprovidedhospitalverticalcollapseapproachpartnerslogo"><adaughterauthor" culturalfamilies/images/assemblypowerfulteachingfinisheddistrictcriticalcgi-bin/purposesrequireselectionbecomingprovidesacademicexerciseactuallymedicineconstantaccidentMagazinedocumentstartingbottom">observed: &quot;extendedpreviousSoftwarecustomerdecisionstrengthdetailedslightlyplanningtextareacurrencyeveryonestraighttransferpositiveproducedheritageshippingabsolutereceivedrelevantbutton" violenceanywherebenefitslaunchedrecentlyalliancefollowedmultiplebulletinincludedoccurredinternal$(this).republic><tr><tdcongressrecordedultimatesolution<ul id="discoverHome</a>websitesnetworksalthoughentirelymemorialmessagescontinueactive">somewhatvictoriaWestern title="LocationcontractvisitorsDownloadwithout right">\nmeasureswidth = variableinvolvedvirginianormallyhappenedaccountsstandingnationalRegisterpreparedcontrolsaccuratebirthdaystrategyofficialgraphicscriminalpossiblyconsumerPersonalspeakingvalidateachieved.jpg" />machines</h2>\n keywordsfriendlybrotherscombinedoriginalcomposedexpectedadequatepakistanfollow" valuable</label>relativebringingincreasegovernorplugins/List of Header">" name=" (&quot;graduate</head>\ncommercemalaysiadirectormaintain;height:schedulechangingback to catholicpatternscolor: #greatestsuppliesreliable</ul>\n\t\t<select citizensclothingwatching<li id="specificcarryingsentence<center>contrastthinkingcatch(e)southernMichael merchantcarouselpadding:interior.split("lizationOctober ){returnimproved--&gt;\n\ncoveragechairman.png" />subjectsRichard whateverprobablyrecoverybaseballjudgmentconnect..css" /> websitereporteddefault"/></a>\r\nelectricscotlandcreationquantity. ISBN 0did not instance-search-" lang="speakersComputercontainsarchivesministerreactiondiscountItalianocriteriastrongly: \'http:\'script\'coveringofferingappearedBritish identifyFacebooknumerousvehiclesconcernsAmericanhandlingdiv id="William provider_contentaccuracysection andersonflexibleCategorylawrence<script>layout="approved maximumheader"></table>Serviceshamiltoncurrent canadianchannels/themes//articleoptionalportugalvalue=""intervalwirelessentitledagenciesSearch" measuredthousandspending&hellip;new Date" size="pageNamemiddle" " /></a>hidden">sequencepersonaloverflowopinionsillinoislinks">\n\t<title>versionssaturdayterminalitempropengineersectionsdesignerproposal="false"EspaC1olreleasessubmit" er&quot;additionsymptomsorientedresourceright"><pleasurestationshistory.leaving border=contentscenter">.\n\nSome directedsuitablebulgaria.show();designedGeneral conceptsExampleswilliamsOriginal"><span>search">operatorrequestsa &quot;allowingDocumentrevision. \n\nThe yourselfContact michiganEnglish columbiapriorityprintingdrinkingfacilityreturnedContent officersRussian generate-8859-1"indicatefamiliar qualitymargin:0 contentviewportcontacts-title">portable.length eligibleinvolvesatlanticonload="default.suppliedpaymentsglossary\n\nAfter guidance</td><tdencodingmiddle">came to displaysscottishjonathanmajoritywidgets.clinicalthailandteachers<head>\n\taffectedsupportspointer;toString</small>oklahomawill be investor0" alt="holidaysResourcelicensed (which . After considervisitingexplorerprimary search" android"quickly meetingsestimate;return ;color:# height=approval, &quot; checked.min.js"magnetic></a></hforecast. While thursdaydvertise&eacute;hasClassevaluateorderingexistingpatients Online coloradoOptions"campbell\x3c!-- end</span><<br />\r\n_popups|sciences,&quot; quality Windows assignedheight: <b classle&quot; value=" Companyexamples<iframe believespresentsmarshallpart of properly).\n\nThe taxonomymuch of </span>\n" data-srtuguC*sscrollTo project<head>\r\nattorneyemphasissponsorsfancyboxworld\'s wildlifechecked=sessionsprogrammpx;font- Projectjournalsbelievedvacationthompsonlightingand the special border=0checking</tbody><button Completeclearfix\n<head>\narticle <sectionfindingsrole in popular Octoberwebsite exposureused to changesoperatedclickingenteringcommandsinformed numbers </div>creatingonSubmitmarylandcollegesanalyticlistingscontact.loggedInadvisorysiblingscontent"s&quot;)s. This packagescheckboxsuggestspregnanttomorrowspacing=icon.pngjapanesecodebasebutton">gamblingsuch as , while </span> missourisportingtop:1px .</span>tensionswidth="2lazyloadnovemberused in height="cript">\n&nbsp;</<tr><td height:2/productcountry include footer" &lt;!-- title"></jquery.</form>\n(g.\0d=\x13)(g9\x01i+\x14)hrvatskiitalianoromC"nD\x03tC<rkC\'eX\'X1X/Y\btambiC)nnoticiasmensajespersonasderechosnacionalserviciocontactousuariosprogramagobiernoempresasanunciosvalenciacolombiadespuC)sdeportesproyectoproductopC:bliconosotroshistoriapresentemillonesmediantepreguntaanteriorrecursosproblemasantiagonuestrosopiniC3nimprimirmientrasamC)ricavendedorsociedadrespectorealizarregistropalabrasinterC)sentoncesespecialmiembrosrealidadcC3rdobazaragozapC!ginassocialesbloqueargestiC3nalquilersistemascienciascompletoversiC3ncompletaestudiospC:blicaobjetivoalicantebuscadorcantidadentradasaccionesarchivossuperiormayorC-aalemaniafunciC3nC:ltimoshaciendoaquellosediciC3nfernandoambientefacebooknuestrasclientesprocesosbastantepresentareportarcongresopublicarcomerciocontratojC3venesdistritotC)cnicaconjuntoenergC-atrabajarasturiasrecienteutilizarboletC-nsalvadorcorrectatrabajosprimerosnegocioslibertaddetallespantallaprC3ximoalmerC-aanimalesquiC)nescorazC3nsecciC3nbuscandoopcionesexteriorconceptotodavC-agalerC-aescribirmedicinalicenciaconsultaaspectoscrC-ticadC3laresjusticiadeberC!nperC-odonecesitamantenerpequeC1orecibidatribunaltenerifecanciC3ncanariasdescargadiversosmallorcarequieretC)cnicodeberC-aviviendafinanzasadelantefuncionaconsejosdifC-cilciudadesantiguasavanzadatC)rminounidadessC!nchezcampaC1asoftonicrevistascontienesectoresmomentosfacultadcrC)ditodiversassupuestofactoressegundospequeC1aP3P>P4P0P5Q\x01P;P8P5Q\x01Q\x02Q\fP1Q\vP;P>P1Q\vQ\x02Q\fQ\rQ\x02P>P<P\x15Q\x01P;P8Q\x02P>P3P>P<P5P=Q\x0fP2Q\x01P5Q\x05Q\rQ\x02P>P9P4P0P6P5P1Q\vP;P8P3P>P4Q\x03P4P5P=Q\fQ\rQ\x02P>Q\x02P1Q\vP;P0Q\x01P5P1Q\x0fP>P4P8P=Q\x01P5P1P5P=P0P4P>Q\x01P0P9Q\x02Q\x04P>Q\x02P>P=P5P3P>Q\x01P2P>P8Q\x01P2P>P9P8P3Q\0Q\vQ\x02P>P6P5P2Q\x01P5P<Q\x01P2P>Q\x0eP;P8Q\bQ\fQ\rQ\x02P8Q\x05P?P>P:P0P4P=P5P9P4P>P<P0P<P8Q\0P0P;P8P1P>Q\x02P5P<Q\x03Q\x05P>Q\x02Q\x0fP4P2Q\x03Q\x05Q\x01P5Q\x02P8P;Q\x0eP4P8P4P5P;P>P<P8Q\0P5Q\x02P5P1Q\x0fQ\x01P2P>P5P2P8P4P5Q\x07P5P3P>Q\rQ\x02P8P<Q\x01Q\x07P5Q\x02Q\x02P5P<Q\vQ\x06P5P=Q\vQ\x01Q\x02P0P;P2P5P4Q\fQ\x02P5P<P5P2P>P4Q\vQ\x02P5P1P5P2Q\vQ\bP5P=P0P<P8Q\x02P8P?P0Q\x02P>P<Q\x03P?Q\0P0P2P;P8Q\x06P0P>P4P=P0P3P>P4Q\vP7P=P0Q\x0eP<P>P3Q\x03P4Q\0Q\x03P3P2Q\x01P5P9P8P4P5Q\x02P:P8P=P>P>P4P=P>P4P5P;P0P4P5P;P5Q\x01Q\0P>P:P8Q\x0eP=Q\x0fP2P5Q\x01Q\fP\x15Q\x01Q\x02Q\fQ\0P0P7P0P=P0Q\bP8X\'Y\x04Y\x04Y\x07X\'Y\x04X*Y\nX,Y\x05Y\nX9X.X\'X5X)X\'Y\x04X0Y\nX9Y\x04Y\nY\x07X,X/Y\nX/X\'Y\x04X"Y\x06X\'Y\x04X1X/X*X-Y\x03Y\x05X5Y\x01X-X)Y\x03X\'Y\x06X*X\'Y\x04Y\x04Y\nY\nY\x03Y\bY\x06X4X(Y\x03X)Y\x01Y\nY\x07X\'X(Y\x06X\'X*X-Y\bX\'X!X#Y\x03X+X1X.Y\x04X\'Y\x04X\'Y\x04X-X(X/Y\x04Y\nY\x04X/X1Y\bX3X\'X6X:X7X*Y\x03Y\bY\x06Y\x07Y\x06X\'Y\x03X3X\'X-X)Y\x06X\'X/Y\nX\'Y\x04X7X(X9Y\x04Y\nY\x03X4Y\x03X1X\'Y\nY\x05Y\x03Y\x06Y\x05Y\x06Y\x07X\'X4X1Y\x03X)X1X&Y\nX3Y\x06X4Y\nX7Y\x05X\'X0X\'X\'Y\x04Y\x01Y\x06X4X(X\'X(X*X9X(X1X1X-Y\x05X)Y\x03X\'Y\x01X)Y\nY\x02Y\bY\x04Y\x05X1Y\x03X2Y\x03Y\x04Y\x05X)X#X-Y\x05X/Y\x02Y\x04X(Y\nY\nX9Y\x06Y\nX5Y\bX1X)X7X1Y\nY\x02X4X\'X1Y\x03X,Y\bX\'Y\x04X#X.X1Y\tY\x05X9Y\x06X\'X\'X(X-X+X9X1Y\bX6X(X4Y\x03Y\x04Y\x05X3X,Y\x04X(Y\x06X\'Y\x06X.X\'Y\x04X/Y\x03X*X\'X(Y\x03Y\x04Y\nX)X(X/Y\bY\x06X#Y\nX6X\'Y\nY\bX,X/Y\x01X1Y\nY\x02Y\x03X*X(X*X#Y\x01X6Y\x04Y\x05X7X(X.X\'Y\x03X+X1X(X\'X1Y\x03X\'Y\x01X6Y\x04X\'X-Y\x04Y\tY\x06Y\x01X3Y\x07X#Y\nX\'Y\x05X1X/Y\bX/X#Y\x06Y\x07X\'X/Y\nY\x06X\'X\'Y\x04X\'Y\x06Y\x05X9X1X6X*X9Y\x04Y\x05X/X\'X.Y\x04Y\x05Y\x05Y\x03Y\x06\0\0\0\0\0\0\0\0\x01\0\x01\0\x01\0\x01\0\x02\0\x02\0\x02\0\x02\0\x04\0\x04\0\x04\0\x04\0\0\x01\x02\x03\x04\x05\x06\x07\x07\x06\x05\x04\x03\x02\x01\0\b\t\n\v\f\r\x0e\x0f\x0f\x0e\r\f\v\n\t\b\x10\x11\x12\x13\x14\x15\x16\x17\x17\x16\x15\x14\x13\x12\x11\x10\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x1f\x1e\x1d\x1c\x1b\x1a\x19\x18\x7f\x7f\x7f\x7f\0\0\0\0\0\0\0\0\x7f\x7f\x7f\x7f\x01\0\0\0\x02\0\0\0\x02\0\0\0\x01\0\0\0\x01\0\0\0\x03\0\0\0\x7f\x7f\0\x01\0\0\0\x01\0\0\x7f\x7f\0\x01\0\0\0\b\0\b\0\b\0\b\0\0\0\x01\0\x02\0\x03\0\x04\0\x05\0\x06\0\x07resourcescountriesquestionsequipmentcommunityavailablehighlightDTD/xhtmlmarketingknowledgesomethingcontainerdirectionsubscribeadvertisecharacter" value="</select>Australia" class="situationauthorityfollowingprimarilyoperationchallengedevelopedanonymousfunction functionscompaniesstructureagreement" title="potentialeducationargumentssecondarycopyrightlanguagesexclusivecondition</form>\r\nstatementattentionBiography} else {\nsolutionswhen the Analyticstemplatesdangeroussatellitedocumentspublisherimportantprototypeinfluence&raquo;</effectivegenerallytransformbeautifultransportorganizedpublishedprominentuntil thethumbnailNational .focus();over the migrationannouncedfooter">\nexceptionless thanexpensiveformationframeworkterritoryndicationcurrentlyclassNamecriticismtraditionelsewhereAlexanderappointedmaterialsbroadcastmentionedaffiliate</option>treatmentdifferent/default.Presidentonclick="biographyotherwisepermanentFranC\'aisHollywoodexpansionstandards</style>\nreductionDecember preferredCambridgeopponentsBusiness confusion>\n<title>presentedexplaineddoes not worldwideinterfacepositionsnewspaper</table>\nmountainslike the essentialfinancialselectionaction="/abandonedEducationparseInt(stabilityunable to</title>\nrelationsNote thatefficientperformedtwo yearsSince thethereforewrapper">alternateincreasedBattle ofperceivedtrying tonecessaryportrayedelectionsElizabeth</iframe>discoveryinsurances.length;legendaryGeographycandidatecorporatesometimesservices.inherited</strong>CommunityreligiouslocationsCommitteebuildingsthe worldno longerbeginningreferencecannot befrequencytypicallyinto the relative;recordingpresidentinitiallytechniquethe otherit can beexistenceunderlinethis timetelephoneitemscopepracticesadvantage);return For otherprovidingdemocracyboth the extensivesufferingsupportedcomputers functionpracticalsaid thatit may beEnglish</from the scheduleddownloads</label>\nsuspectedmargin: 0spiritual</head>\n\nmicrosoftgraduallydiscussedhe becameexecutivejquery.jshouseholdconfirmedpurchasedliterallydestroyedup to thevariationremainingit is notcenturiesJapanese among thecompletedalgorithminterestsrebellionundefinedencourageresizableinvolvingsensitiveuniversalprovision(althoughfeaturingconducted), which continued-header">February numerous overflow:componentfragmentsexcellentcolspan="technicalnear the Advanced source ofexpressedHong Kong Facebookmultiple mechanismelevationoffensive</form>\n\tsponsoreddocument.or &quot;there arethose whomovementsprocessesdifficultsubmittedrecommendconvincedpromoting" width=".replace(classicalcoalitionhis firstdecisionsassistantindicatedevolution-wrapper"enough toalong thedelivered--\x3e\r\n\x3c!--American protectedNovember </style><furnitureInternet onblur="suspendedrecipientbased on Moreover,abolishedcollectedwere madeemotionalemergencynarrativeadvocatespx;bordercommitteddir="ltr"employeesresearch. selectedsuccessorcustomersdisplayedSeptemberaddClass(Facebook suggestedand lateroperatingelaborateSometimesInstitutecertainlyinstalledfollowersJerusalemthey havecomputinggeneratedprovincesguaranteearbitraryrecognizewanted topx;width:theory ofbehaviourWhile theestimatedbegan to it becamemagnitudemust havemore thanDirectoryextensionsecretarynaturallyoccurringvariablesgiven theplatform.</label><failed tocompoundskinds of societiesalongside --&gt;\n\nsouthwestthe rightradiationmay have unescape(spoken in" href="/programmeonly the come fromdirectoryburied ina similarthey were</font></Norwegianspecifiedproducingpassenger(new DatetemporaryfictionalAfter theequationsdownload.regularlydeveloperabove thelinked tophenomenaperiod oftooltip">substanceautomaticaspect ofAmong theconnectedestimatesAir Forcesystem ofobjectiveimmediatemaking itpaintingsconqueredare stillproceduregrowth ofheaded byEuropean divisionsmoleculesfranchiseintentionattractedchildhoodalso useddedicatedsingaporedegree offather ofconflicts</a></p>\ncame fromwere usednote thatreceivingExecutiveeven moreaccess tocommanderPoliticalmusiciansdeliciousprisonersadvent ofUTF-8" /><![CDATA[">ContactSouthern bgcolor="series of. It was in Europepermittedvalidate.appearingofficialsseriously-languageinitiatedextendinglong-terminflationsuch thatgetCookiemarked by</button>implementbut it isincreasesdown the requiringdependent--\x3e\n\x3c!-- interviewWith the copies ofconsensuswas builtVenezuela(formerlythe statepersonnelstrategicfavour ofinventionWikipediacontinentvirtuallywhich wasprincipleComplete identicalshow thatprimitiveaway frommolecularpreciselydissolvedUnder theversion=">&nbsp;</It is the This is will haveorganismssome timeFriedrichwas firstthe only fact thatform id="precedingTechnicalphysicistoccurs innavigatorsection">span id="sought tobelow thesurviving}</style>his deathas in thecaused bypartiallyexisting using thewas givena list oflevels ofnotion ofOfficial dismissedscientistresemblesduplicateexplosiverecoveredall othergalleries{padding:people ofregion ofaddressesassociateimg alt="in modernshould bemethod ofreportingtimestampneeded tothe Greatregardingseemed toviewed asimpact onidea thatthe Worldheight ofexpandingThese arecurrent">carefullymaintainscharge ofClassicaladdressedpredictedownership<div id="right">\r\nresidenceleave thecontent">are often })();\r\nprobably Professor-button" respondedsays thathad to beplaced inHungarianstatus ofserves asUniversalexecutionaggregatefor whichinfectionagreed tohowever, popular">placed onconstructelectoralsymbol ofincludingreturn toarchitectChristianprevious living ineasier toprofessor\n&lt;!-- effect ofanalyticswas takenwhere thetook overbelief inAfrikaansas far aspreventedwork witha special<fieldsetChristmasRetrieved\n\nIn the back intonortheastmagazines><strong>committeegoverninggroups ofstored inestablisha generalits firsttheir ownpopulatedan objectCaribbeanallow thedistrictswisconsinlocation.; width: inhabitedSocialistJanuary 1</footer>similarlychoice ofthe same specific business The first.length; desire todeal withsince theuserAgentconceivedindex.phpas &quot;engage inrecently,few yearswere also\n<head>\n<edited byare knowncities inaccesskeycondemnedalso haveservices,family ofSchool ofconvertednature of languageministers</object>there is a popularsequencesadvocatedThey wereany otherlocation=enter themuch morereflectedwas namedoriginal a typicalwhen theyengineerscould notresidentswednesdaythe third productsJanuary 2what theya certainreactionsprocessorafter histhe last contained"></div>\n</a></td>depend onsearch">\npieces ofcompetingReferencetennesseewhich has version=</span> <</header>gives thehistorianvalue="">padding:0view thattogether,the most was foundsubset ofattack onchildren,points ofpersonal position:allegedlyClevelandwas laterand afterare givenwas stillscrollingdesign ofmakes themuch lessAmericans.\n\nAfter , but theMuseum oflouisiana(from theminnesotaparticlesa processDominicanvolume ofreturningdefensive00px|righmade frommouseover" style="states of(which iscontinuesFranciscobuilding without awith somewho woulda form ofa part ofbefore itknown as Serviceslocation and oftenmeasuringand it ispaperbackvalues of\r\n<title>= window.determineer&quot; played byand early</center>from thisthe threepower andof &quot;innerHTML<a href="y:inline;Church ofthe eventvery highofficial -height: content="/cgi-bin/to createafrikaansesperantofranC\'aislatvieE!ulietuviE3D\feE!tinaD\reE!tina`9\x04`8\x17`8"f\x17%f\x1c,h*\x1eg.\0d=\x13e-\x17g9\x01i+\x14e-\x17m\x15\x1cj5-l\x164d8:d;\0d9\bh.!g.\x17f\x1c:g,\x14h.0f\x1c,h(\x0eh+\x16e\r\0f\x1c\re\n!e\x19(d:\x12h\x01\x14g=\x11f\b?e\x1c0d:\'d?1d9\x10i\x03(e\x07:g\t\bg$>f\x0e\x12h!\ff&\x1ci\x03(h\x10=f <h?\x1bd8\0f-%f\x14/d;\x18e.\x1di*\fh/\x01g \x01e\'\x14e\x11\x18d<\x1af\x150f\r.e:\x13f6\bh49h\0\x05e\n\x1ee\x05,e.$h.(h.:e\f:f71e\x1c3e8\x02f\x12-f\x14>e\x19(e\f\x17d:,e8\x02e$\'e-&g\x14\x1fh6\nf\x1d%h6\ng.!g\x10\x06e\x11\x18d?!f\x01/g=\x11serviciosartC-culoargentinabarcelonacualquierpublicadoproductospolC-ticarespuestawikipediasiguientebC:squedacomunidadseguridadprincipalpreguntascontenidorespondervenezuelaproblemasdiciembrerelaciC3nnoviembresimilaresproyectosprogramasinstitutoactividadencuentraeconomC-aimC!genescontactardescargarnecesarioatenciC3ntelC)fonocomisiC3ncancionescapacidadencontraranC!lisisfavoritostC)rminosprovinciaetiquetaselementosfuncionesresultadocarC!cterpropiedadprincipionecesidadmunicipalcreaciC3ndescargaspresenciacomercialopinionesejercicioeditorialsalamancagonzC!lezdocumentopelC-cularecientesgeneralestarragonaprC!cticanovedadespropuestapacientestC)cnicasobjetivoscontactos`$.`%\x07`$\x02`$2`$?`$\x0f`$9`%\b`$\x02`$\x17`$/`$>`$8`$>`$%`$\x0f`$5`$\x02`$0`$9`%\x07`$\x15`%\v`$\b`$\x15`%\x01`$\x1b`$0`$9`$>`$,`$>`$&`$\x15`$9`$>`$8`$-`%\0`$9`%\x01`$\x0f`$0`$9`%\0`$.`%\b`$\x02`$&`$?`$(`$,`$>`$$diplodocs`$8`$.`$/`$0`%\x02`$*`$(`$>`$.`$*`$$`$>`$+`$?`$0`$\x14`$8`$$`$$`$0`$9`$2`%\v`$\x17`$9`%\x01`$\x06`$,`$>`$0`$&`%\x07`$6`$9`%\x01`$\b`$\x16`%\x07`$2`$/`$&`$?`$\x15`$>`$.`$5`%\x07`$,`$$`%\0`$(`$,`%\0`$\x1a`$.`%\f`$$`$8`$>`$2`$2`%\x07`$\x16`$\x1c`%\t`$,`$.`$&`$&`$$`$%`$>`$(`$9`%\0`$6`$9`$0`$\x05`$2`$\x17`$\x15`$-`%\0`$(`$\x17`$0`$*`$>`$8`$0`$>`$$`$\x15`$?`$\x0f`$\t`$8`%\x07`$\x17`$/`%\0`$9`%\x02`$\x01`$\x06`$\x17`%\x07`$\x1f`%\0`$.`$\x16`%\v`$\x1c`$\x15`$>`$0`$\x05`$-`%\0`$\x17`$/`%\x07`$$`%\x01`$.`$5`%\v`$\x1f`$&`%\x07`$\x02`$\x05`$\x17`$0`$\x10`$8`%\x07`$.`%\x07`$2`$2`$\x17`$>`$9`$>`$2`$\n`$*`$0`$\x1a`$>`$0`$\x10`$8`$>`$&`%\x07`$0`$\x1c`$?`$8`$&`$?`$2`$,`$\x02`$&`$,`$(`$>`$9`%\x02`$\x02`$2`$>`$\x16`$\x1c`%\0`$$`$,`$\x1f`$(`$.`$?`$2`$\x07`$8`%\x07`$\x06`$(`%\x07`$(`$/`$>`$\x15`%\x01`$2`$2`%\t`$\x17`$-`$>`$\x17`$0`%\x07`$2`$\x1c`$\x17`$9`$0`$>`$.`$2`$\x17`%\x07`$*`%\x07`$\x1c`$9`$>`$%`$\x07`$8`%\0`$8`$9`%\0`$\x15`$2`$>`$ `%\0`$\x15`$9`$>`$\x01`$&`%\x02`$0`$$`$9`$$`$8`$>`$$`$/`$>`$&`$\x06`$/`$>`$*`$>`$\x15`$\x15`%\f`$(`$6`$>`$.`$&`%\x07`$\x16`$/`$9`%\0`$0`$>`$/`$\x16`%\x01`$&`$2`$\x17`%\0categoriesexperience</title>\r\nCopyright javascriptconditionseverything<p class="technologybackground<a class="management&copy; 201javaScriptcharactersbreadcrumbthemselveshorizontalgovernmentCaliforniaactivitiesdiscoveredNavigationtransitionconnectionnavigationappearance</title><mcheckbox" techniquesprotectionapparentlyas well asunt\', \'UA-resolutionoperationstelevisiontranslatedWashingtonnavigator. = window.impression&lt;br&gt;literaturepopulationbgcolor="#especially content="productionnewsletterpropertiesdefinitionleadershipTechnologyParliamentcomparisonul class=".indexOf("conclusiondiscussioncomponentsbiologicalRevolution_containerunderstoodnoscript><permissioneach otheratmosphere onfocus="<form id="processingthis.valuegenerationConferencesubsequentwell-knownvariationsreputationphenomenondisciplinelogo.png" (document,boundariesexpressionsettlementBackgroundout of theenterprise("https:" unescape("password" democratic<a href="/wrapper">\nmembershiplinguisticpx;paddingphilosophyassistanceuniversityfacilitiesrecognizedpreferenceif (typeofmaintainedvocabularyhypothesis.submit();&amp;nbsp;annotationbehind theFoundationpublisher"assumptionintroducedcorruptionscientistsexplicitlyinstead ofdimensions onClick="considereddepartmentoccupationsoon afterinvestmentpronouncedidentifiedexperimentManagementgeographic" height="link rel=".replace(/depressionconferencepunishmenteliminatedresistanceadaptationoppositionwell knownsupplementdeterminedh1 class="0px;marginmechanicalstatisticscelebratedGovernment\n\nDuring tdevelopersartificialequivalentoriginatedCommissionattachment<span id="there wereNederlandsbeyond theregisteredjournalistfrequentlyall of thelang="en" </style>\r\nabsolute; supportingextremely mainstream</strong> popularityemployment</table>\r\n colspan="</form>\n conversionabout the </p></div>integrated" lang="enPortuguesesubstituteindividualimpossiblemultimediaalmost allpx solid #apart fromsubject toin Englishcriticizedexcept forguidelinesoriginallyremarkablethe secondh2 class="<a title="(includingparametersprohibited= "http://dictionaryperceptionrevolutionfoundationpx;height:successfulsupportersmillenniumhis fatherthe &quot;no-repeat;commercialindustrialencouragedamount of unofficialefficiencyReferencescoordinatedisclaimerexpeditiondevelopingcalculatedsimplifiedlegitimatesubstring(0" class="completelyillustratefive yearsinstrumentPublishing1" class="psychologyconfidencenumber of absence offocused onjoined thestructurespreviously></iframe>once againbut ratherimmigrantsof course,a group ofLiteratureUnlike the</a>&nbsp;\nfunction it was theConventionautomobileProtestantaggressiveafter the Similarly," /></div>collection\r\nfunctionvisibilitythe use ofvolunteersattractionunder the threatened*<![CDATA[importancein generalthe latter</form>\n</.indexOf(\'i = 0; i <differencedevoted totraditionssearch forultimatelytournamentattributesso-called }\n</style>evaluationemphasizedaccessible</section>successionalong withMeanwhile,industries</a><br />has becomeaspects ofTelevisionsufficientbasketballboth sidescontinuingan article<img alt="adventureshis mothermanchesterprinciplesparticularcommentaryeffects ofdecided to"><strong>publishersJournal ofdifficultyfacilitateacceptablestyle.css"\tfunction innovation>Copyrightsituationswould havebusinessesDictionarystatementsoften usedpersistentin Januarycomprising</title>\n\tdiplomaticcontainingperformingextensionsmay not beconcept of onclick="It is alsofinancial making theLuxembourgadditionalare calledengaged in"script");but it waselectroniconsubmit="\n\x3c!-- End electricalofficiallysuggestiontop of theunlike theAustralianOriginallyreferences\n</head>\r\nrecognisedinitializelimited toAlexandriaretirementAdventuresfour years\n\n&lt;!-- increasingdecorationh3 class="origins ofobligationregulationclassified(function(advantagesbeing the historians<base hrefrepeatedlywilling tocomparabledesignatednominationfunctionalinside therevelationend of thes for the authorizedrefused totake placeautonomouscompromisepolitical restauranttwo of theFebruary 2quality ofswfobject.understandnearly allwritten byinterviews" width="1withdrawalfloat:leftis usuallycandidatesnewspapersmysteriousDepartmentbest knownparliamentsuppressedconvenientremembereddifferent systematichas led topropagandacontrolledinfluencesceremonialproclaimedProtectionli class="Scientificclass="no-trademarksmore than widespreadLiberationtook placeday of theas long asimprisonedAdditional\n<head>\n<mLaboratoryNovember 2exceptionsIndustrialvariety offloat: lefDuring theassessmenthave been deals withStatisticsoccurrence/ul></div>clearfix">the publicmany yearswhich wereover time,synonymouscontent">\npresumablyhis familyuserAgent.unexpectedincluding challengeda minorityundefined"belongs totaken fromin Octoberposition: said to bereligious Federation rowspan="only a fewmeant thatled to the--\x3e\r\n<div <fieldset>Archbishop class="nobeing usedapproachesprivilegesnoscript>\nresults inmay be theEaster eggmechanismsreasonablePopulationCollectionselected">noscript>\r/index.phparrival of-jssdk\'));managed toincompletecasualtiescompletionChristiansSeptember arithmeticproceduresmight haveProductionit appearsPhilosophyfriendshipleading togiving thetoward theguaranteeddocumentedcolor:#000video gamecommissionreflectingchange theassociatedsans-serifonkeypress; padding:He was theunderlyingtypically , and the srcElementsuccessivesince the should be networkingaccountinguse of thelower thanshows that</span>\n\t\tcomplaintscontinuousquantitiesastronomerhe did notdue to itsapplied toan averageefforts tothe futureattempt toTherefore,capabilityRepublicanwas formedElectronickilometerschallengespublishingthe formerindigenousdirectionssubsidiaryconspiracydetails ofand in theaffordablesubstancesreason forconventionitemtype="absolutelysupposedlyremained aattractivetravellingseparatelyfocuses onelementaryapplicablefound thatstylesheetmanuscriptstands for no-repeat(sometimesCommercialin Americaundertakenquarter ofan examplepersonallyindex.php?</button>\npercentagebest-knowncreating a" dir="ltrLieutenant\n<div id="they wouldability ofmade up ofnoted thatclear thatargue thatto anotherchildren\'spurpose offormulatedbased uponthe regionsubject ofpassengerspossession.\n\nIn the Before theafterwardscurrently across thescientificcommunity.capitalismin Germanyright-wingthe systemSociety ofpoliticiandirection:went on toremoval of New York apartmentsindicationduring theunless thehistoricalhad been adefinitiveingredientattendanceCenter forprominencereadyStatestrategiesbut in theas part ofconstituteclaim thatlaboratorycompatiblefailure of, such as began withusing the to providefeature offrom which/" class="geologicalseveral ofdeliberateimportant holds thating&quot; valign=topthe Germanoutside ofnegotiatedhis careerseparationid="searchwas calledthe fourthrecreationother thanpreventionwhile the education,connectingaccuratelywere builtwas killedagreementsmuch more Due to thewidth: 100some otherKingdom ofthe entirefamous forto connectobjectivesthe Frenchpeople andfeatured">is said tostructuralreferendummost oftena separate->\n<div id Official worldwide.aria-labelthe planetand it wasd" value="looking atbeneficialare in themonitoringreportedlythe modernworking onallowed towhere the innovative</a></div>soundtracksearchFormtend to beinput id="opening ofrestrictedadopted byaddressingtheologianmethods ofvariant ofChristian very largeautomotiveby far therange frompursuit offollow thebrought toin Englandagree thataccused ofcomes frompreventingdiv style=his or hertremendousfreedom ofconcerning0 1em 1em;Basketball/style.cssan earliereven after/" title=".com/indextaking thepittsburghcontent">\r<script>(fturned outhaving the</span>\r\n occasionalbecause itstarted tophysically></div>\n created byCurrently, bgcolor="tabindex="disastrousAnalytics also has a><div id="</style>\n<called forsinger and.src = "//violationsthis pointconstantlyis locatedrecordingsd from thenederlandsportuguC*sW"W\x11W(W\x19W*Y\x01X\'X1X3[\fdesarrollocomentarioeducaciC3nseptiembreregistradodirecciC3nubicaciC3npublicidadrespuestasresultadosimportantereservadosartC-culosdiferentessiguientesrepC:blicasituaciC3nministerioprivacidaddirectorioformaciC3npoblaciC3npresidentecont','enidosaccesoriostechnoratipersonalescategorC-aespecialesdisponibleactualidadreferenciavalladolidbibliotecarelacionescalendariopolC-ticasanterioresdocumentosnaturalezamaterialesdiferenciaeconC3micatransporterodrC-guezparticiparencuentrandiscusiC3nestructurafundaciC3nfrecuentespermanentetotalmenteP<P>P6P=P>P1Q\x03P4P5Q\x02P<P>P6P5Q\x02P2Q\0P5P<Q\x0fQ\x02P0P:P6P5Q\x07Q\x02P>P1Q\vP1P>P;P5P5P>Q\x07P5P=Q\fQ\rQ\x02P>P3P>P:P>P3P4P0P?P>Q\x01P;P5P2Q\x01P5P3P>Q\x01P0P9Q\x02P5Q\x07P5Q\0P5P7P<P>P3Q\x03Q\x02Q\x01P0P9Q\x02P0P6P8P7P=P8P<P5P6P4Q\x03P1Q\x03P4Q\x03Q\x02P\x1fP>P8Q\x01P:P7P4P5Q\x01Q\fP2P8P4P5P>Q\x01P2Q\x0fP7P8P=Q\x03P6P=P>Q\x01P2P>P5P9P;Q\x0eP4P5P9P?P>Q\0P=P>P<P=P>P3P>P4P5Q\x02P5P9Q\x01P2P>P8Q\x05P?Q\0P0P2P0Q\x02P0P:P>P9P<P5Q\x01Q\x02P>P8P<P5P5Q\x02P6P8P7P=Q\fP>P4P=P>P9P;Q\x03Q\x07Q\bP5P?P5Q\0P5P4Q\x07P0Q\x01Q\x02P8Q\x07P0Q\x01Q\x02Q\fQ\0P0P1P>Q\x02P=P>P2Q\vQ\x05P?Q\0P0P2P>Q\x01P>P1P>P9P?P>Q\x02P>P<P<P5P=P5P5Q\x07P8Q\x01P;P5P=P>P2Q\vP5Q\x03Q\x01P;Q\x03P3P>P:P>P;P>P=P0P7P0P4Q\x02P0P:P>P5Q\x02P>P3P4P0P?P>Q\x07Q\x02P8P\x1fP>Q\x01P;P5Q\x02P0P:P8P5P=P>P2Q\vP9Q\x01Q\x02P>P8Q\x02Q\x02P0P:P8Q\x05Q\x01Q\0P0P7Q\x03P!P0P=P:Q\x02Q\x04P>Q\0Q\x03P<P\x1aP>P3P4P0P:P=P8P3P8Q\x01P;P>P2P0P=P0Q\bP5P9P=P0P9Q\x02P8Q\x01P2P>P8P<Q\x01P2Q\x0fP7Q\fP;Q\x0eP1P>P9Q\x07P0Q\x01Q\x02P>Q\x01Q\0P5P4P8P\x1aQ\0P>P<P5P$P>Q\0Q\x03P<Q\0Q\vP=P:P5Q\x01Q\x02P0P;P8P?P>P8Q\x01P:Q\x02Q\vQ\x01Q\x0fQ\x07P<P5Q\x01Q\x0fQ\x06Q\x06P5P=Q\x02Q\0Q\x02Q\0Q\x03P4P0Q\x01P0P<Q\vQ\x05Q\0Q\vP=P:P0P\x1dP>P2Q\vP9Q\x07P0Q\x01P>P2P<P5Q\x01Q\x02P0Q\x04P8P;Q\fP<P<P0Q\0Q\x02P0Q\x01Q\x02Q\0P0P=P<P5Q\x01Q\x02P5Q\x02P5P:Q\x01Q\x02P=P0Q\bP8Q\x05P<P8P=Q\x03Q\x02P8P<P5P=P8P8P<P5Q\x0eQ\x02P=P>P<P5Q\0P3P>Q\0P>P4Q\x01P0P<P>P<Q\rQ\x02P>P<Q\x03P:P>P=Q\x06P5Q\x01P2P>P5P<P:P0P:P>P9P\x10Q\0Q\x05P8P2Y\x05Y\x06X*X/Y\tX%X1X3X\'Y\x04X1X3X\'Y\x04X)X\'Y\x04X9X\'Y\x05Y\x03X*X(Y\x07X\'X(X1X\'Y\x05X,X\'Y\x04Y\nY\bY\x05X\'Y\x04X5Y\bX1X,X/Y\nX/X)X\'Y\x04X9X6Y\bX%X6X\'Y\x01X)X\'Y\x04Y\x02X3Y\x05X\'Y\x04X9X\'X(X*X-Y\x05Y\nY\x04Y\x05Y\x04Y\x01X\'X*Y\x05Y\x04X*Y\x02Y\tX*X9X/Y\nY\x04X\'Y\x04X4X9X1X#X.X(X\'X1X*X7Y\bY\nX1X9Y\x04Y\nY\x03Y\x05X%X1Y\x01X\'Y\x02X7Y\x04X(X\'X*X\'Y\x04Y\x04X:X)X*X1X*Y\nX(X\'Y\x04Y\x06X\'X3X\'Y\x04X4Y\nX.Y\x05Y\x06X*X/Y\nX\'Y\x04X9X1X(X\'Y\x04Y\x02X5X5X\'Y\x01Y\x04X\'Y\x05X9Y\x04Y\nY\x07X\'X*X-X/Y\nX+X\'Y\x04Y\x04Y\x07Y\x05X\'Y\x04X9Y\x05Y\x04Y\x05Y\x03X*X(X)Y\nY\x05Y\x03Y\x06Y\x03X\'Y\x04X7Y\x01Y\x04Y\x01Y\nX/Y\nY\bX%X/X\'X1X)X*X\'X1Y\nX.X\'Y\x04X5X-X)X*X3X,Y\nY\x04X\'Y\x04Y\bY\x02X*X9Y\x06X/Y\x05X\'Y\x05X/Y\nY\x06X)X*X5Y\x05Y\nY\x05X#X1X4Y\nY\x01X\'Y\x04X0Y\nY\x06X9X1X(Y\nX)X(Y\bX\'X(X)X#Y\x04X9X\'X(X\'Y\x04X3Y\x01X1Y\x05X4X\'Y\x03Y\x04X*X9X\'Y\x04Y\tX\'Y\x04X#Y\bY\x04X\'Y\x04X3Y\x06X)X,X\'Y\x05X9X)X\'Y\x04X5X-Y\x01X\'Y\x04X/Y\nY\x06Y\x03Y\x04Y\x05X\'X*X\'Y\x04X.X\'X5X\'Y\x04Y\x05Y\x04Y\x01X#X9X6X\'X!Y\x03X*X\'X(X)X\'Y\x04X.Y\nX1X1X3X\'X&Y\x04X\'Y\x04Y\x02Y\x04X(X\'Y\x04X#X/X(Y\x05Y\x02X\'X7X9Y\x05X1X\'X3Y\x04Y\x05Y\x06X7Y\x02X)X\'Y\x04Y\x03X*X(X\'Y\x04X1X,Y\x04X\'X4X*X1Y\x03X\'Y\x04Y\x02X/Y\x05Y\nX9X7Y\nY\x03sByTagName(.jpg" alt="1px solid #.gif" alt="transparentinformationapplication" onclick="establishedadvertising.png" alt="environmentperformanceappropriate&amp;mdash;immediately</strong></rather thantemperaturedevelopmentcompetitionplaceholdervisibility:copyright">0" height="even thoughreplacementdestinationCorporation<ul class="AssociationindividualsperspectivesetTimeout(url(http://mathematicsmargin-top:eventually description) no-repeatcollections.JPG|thumb|participate/head><bodyfloat:left;<li class="hundreds of\n\nHowever, compositionclear:both;cooperationwithin the label for="border-top:New Zealandrecommendedphotographyinteresting&lt;sup&gt;controversyNetherlandsalternativemaxlength="switzerlandDevelopmentessentially\n\nAlthough </textarea>thunderbirdrepresented&amp;ndash;speculationcommunitieslegislationelectronics\n\t<div id="illustratedengineeringterritoriesauthoritiesdistributed6" height="sans-serif;capable of disappearedinteractivelooking forit would beAfghanistanwas createdMath.floor(surroundingcan also beobservationmaintenanceencountered<h2 class="more recentit has beeninvasion of).getTime()fundamentalDespite the"><div id="inspirationexaminationpreparationexplanation<input id="</a></span>versions ofinstrumentsbefore the = \'http://Descriptionrelatively .substring(each of theexperimentsinfluentialintegrationmany peopledue to the combinationdo not haveMiddle East<noscript><copyright" perhaps theinstitutionin Decemberarrangementmost famouspersonalitycreation oflimitationsexclusivelysovereignty-content">\n<td class="undergroundparallel todoctrine ofoccupied byterminologyRenaissancea number ofsupport forexplorationrecognitionpredecessor<img src="/<h1 class="publicationmay also bespecialized</fieldset>progressivemillions ofstates thatenforcementaround the one another.parentNodeagricultureAlternativeresearcherstowards theMost of themany other (especially<td width=";width:100%independent<h3 class=" onchange=").addClass(interactionOne of the daughter ofaccessoriesbranches of\r\n<div id="the largestdeclarationregulationsInformationtranslationdocumentaryin order to">\n<head>\n<" height="1across the orientation);<\/script>implementedcan be seenthere was ademonstratecontainer">connectionsthe Britishwas written!important;px; margin-followed byability to complicatedduring the immigrationalso called<h4 class="distinctionreplaced bygovernmentslocation ofin Novemberwhether the</p>\n</div>acquisitioncalled the persecutiondesignation{font-size:appeared ininvestigateexperiencedmost likelywidely useddiscussionspresence of (document.extensivelyIt has beenit does notcontrary toinhabitantsimprovementscholarshipconsumptioninstructionfor exampleone or morepx; paddingthe currenta series ofare usuallyrole in thepreviously derivativesevidence ofexperiencescolorschemestated thatcertificate</a></div>\n selected="high schoolresponse tocomfortableadoption ofthree yearsthe countryin Februaryso that thepeople who provided by<param nameaffected byin terms ofappointmentISO-8859-1"was born inhistorical regarded asmeasurementis based on and other : function(significantcelebrationtransmitted/js/jquery.is known astheoretical tabindex="it could be<noscript>\nhaving been\r\n<head>\r\n< &quot;The compilationhe had beenproduced byphilosopherconstructedintended toamong othercompared toto say thatEngineeringa differentreferred todifferencesbelief thatphotographsidentifyingHistory of Republic ofnecessarilyprobabilitytechnicallyleaving thespectacularfraction ofelectricityhead of therestaurantspartnershipemphasis onmost recentshare with saying thatfilled withdesigned toit is often"></iframe>as follows:merged withthrough thecommercial pointed outopportunityview of therequirementdivision ofprogramminghe receivedsetInterval"></span></in New Yorkadditional compression\n\n<div id="incorporate;<\/script><attachEventbecame the " target="_carried outSome of thescience andthe time ofContainer">maintainingChristopherMuch of thewritings of" height="2size of theversion of mixture of between theExamples ofeducationalcompetitive onsubmit="director ofdistinctive/DTD XHTML relating totendency toprovince ofwhich woulddespite thescientific legislature.innerHTML allegationsAgriculturewas used inapproach tointelligentyears later,sans-serifdeterminingPerformanceappearances, which is foundationsabbreviatedhigher thans from the individual composed ofsupposed toclaims thatattributionfont-size:1elements ofHistorical his brotherat the timeanniversarygoverned byrelated to ultimately innovationsit is stillcan only bedefinitionstoGMTStringA number ofimg class="Eventually,was changedoccurred inneighboringdistinguishwhen he wasintroducingterrestrialMany of theargues thatan Americanconquest ofwidespread were killedscreen and In order toexpected todescendantsare locatedlegislativegenerations backgroundmost peopleyears afterthere is nothe highestfrequently they do notargued thatshowed thatpredominanttheologicalby the timeconsideringshort-lived</span></a>can be usedvery littleone of the had alreadyinterpretedcommunicatefeatures ofgovernment,</noscript>entered the" height="3Independentpopulationslarge-scale. Although used in thedestructionpossibilitystarting intwo or moreexpressionssubordinatelarger thanhistory and</option>\r\nContinentaleliminatingwill not bepractice ofin front ofsite of theensure thatto create amississippipotentiallyoutstandingbetter thanwhat is nowsituated inmeta name="TraditionalsuggestionsTranslationthe form ofatmosphericideologicalenterprisescalculatingeast of theremnants ofpluginspage/index.php?remained intransformedHe was alsowas alreadystatisticalin favor ofMinistry ofmovement offormulationis required<link rel="This is the <a href="/popularizedinvolved inare used toand severalmade by theseems to belikely thatPalestiniannamed afterit had beenmost commonto refer tobut this isconsecutivetemporarilyIn general,conventionstakes placesubdivisionterritorialoperationalpermanentlywas largelyoutbreak ofin the pastfollowing a xmlns:og="><a class="class="textConversion may be usedmanufactureafter beingclearfix">\nquestion ofwas electedto become abecause of some peopleinspired bysuccessful a time whenmore commonamongst thean officialwidth:100%;technology,was adoptedto keep thesettlementslive birthsindex.html"Connecticutassigned to&amp;times;account foralign=rightthe companyalways beenreturned toinvolvementBecause thethis period" name="q" confined toa result ofvalue="" />is actuallyEnvironment\r\n</head>\r\nConversely,>\n<div id="0" width="1is probablyhave becomecontrollingthe problemcitizens ofpoliticiansreached theas early as:none; over<table cellvalidity ofdirectly toonmousedownwhere it iswhen it wasmembers of relation toaccommodatealong with In the latethe Englishdelicious">this is notthe presentif they areand finallya matter of\r\n\t</div>\r\n\r\n<\/script>faster thanmajority ofafter whichcomparativeto maintainimprove theawarded theer" class="frameborderrestorationin the sameanalysis oftheir firstDuring the continentalsequence offunction(){font-size: work on the<\/script>\n<begins withjavascript:constituentwas foundedequilibriumassume thatis given byneeds to becoordinatesthe variousare part ofonly in thesections ofis a commontheories ofdiscoveriesassociationedge of thestrength ofposition inpresent-dayuniversallyto form thebut insteadcorporationattached tois commonlyreasons for &quot;the can be madewas able towhich meansbut did notonMouseOveras possibleoperated bycoming fromthe primaryaddition offor severaltransferreda period ofare able tohowever, itshould havemuch larger\n\t<\/script>adopted theproperty ofdirected byeffectivelywas broughtchildren ofProgramminglonger thanmanuscriptswar againstby means ofand most ofsimilar to proprietaryoriginatingprestigiousgrammaticalexperience.to make theIt was alsois found incompetitorsin the U.S.replace thebrought thecalculationfall of thethe generalpracticallyin honor ofreleased inresidentialand some ofking of thereaction to1st Earl ofculture andprincipally</title>\n they can beback to thesome of hisexposure toare similarform of theaddFavoritecitizenshippart in thepeople within practiceto continue&amp;minus;approved by the first allowed theand for thefunctioningplaying thesolution toheight="0" in his bookmore than afollows thecreated thepresence in&nbsp;</td>nationalistthe idea ofa characterwere forced class="btndays of thefeatured inshowing theinterest inin place ofturn of thethe head ofLord of thepoliticallyhas its ownEducationalapproval ofsome of theeach other,behavior ofand becauseand anotherappeared onrecorded inblack&quot;may includethe world\'scan lead torefers to aborder="0" government winning theresulted in while the Washington,the subjectcity in the></div>\r\n\t\treflect theto completebecame moreradioactiverejected bywithout anyhis father,which couldcopy of theto indicatea politicalaccounts ofconstitutesworked wither</a></li>of his lifeaccompaniedclientWidthprevent theLegislativedifferentlytogether inhas severalfor anothertext of thefounded thee with the is used forchanged theusually theplace wherewhereas the> <a href=""><a href="themselves,although hethat can betraditionalrole of theas a resultremoveChilddesigned bywest of theSome peopleproduction,side of thenewslettersused by thedown to theaccepted bylive in theattempts tooutside thefrequenciesHowever, inprogrammersat least inapproximatealthough itwas part ofand variousGovernor ofthe articleturned into><a href="/the economyis the mostmost widelywould laterand perhapsrise to theoccurs whenunder whichconditions.the westerntheory thatis producedthe city ofin which heseen in thethe centralbuilding ofmany of hisarea of theis the onlymost of themany of thethe WesternThere is noextended toStatisticalcolspan=2 |short storypossible totopologicalcritical ofreported toa Christiandecision tois equal toproblems ofThis can bemerchandisefor most ofno evidenceeditions ofelements in&quot;. Thecom/images/which makesthe processremains theliterature,is a memberthe popularthe ancientproblems intime of thedefeated bybody of thea few yearsmuch of thethe work ofCalifornia,served as agovernment.concepts ofmovement in\t\t<div id="it" value="language ofas they areproduced inis that theexplain thediv></div>\nHowever thelead to the\t<a href="/was grantedpeople havecontinuallywas seen asand relatedthe role ofproposed byof the besteach other.Constantinepeople fromdialects ofto revisionwas renameda source ofthe initiallaunched inprovide theto the westwhere thereand similarbetween twois also theEnglish andconditions,that it wasentitled tothemselves.quantity ofransparencythe same asto join thecountry andthis is theThis led toa statementcontrast tolastIndexOfthrough hisis designedthe term isis providedprotect theng</a></li>The currentthe site ofsubstantialexperience,in the Westthey shouldslovenD\rinacomentariosuniversidadcondicionesactividadesexperienciatecnologC-aproducciC3npuntuaciC3naplicaciC3ncontraseC1acategorC-asregistrarseprofesionaltratamientoregC-stratesecretarC-aprincipalesprotecciC3nimportantesimportanciaposibilidadinteresantecrecimientonecesidadessuscribirseasociaciC3ndisponiblesevaluaciC3nestudiantesresponsableresoluciC3nguadalajararegistradosoportunidadcomercialesfotografC-aautoridadesingenierC-atelevisiC3ncompetenciaoperacionesestablecidosimplementeactualmentenavegaciC3nconformidadline-height:font-family:" : "http://applicationslink" href="specifically//<![CDATA[\nOrganizationdistribution0px; height:relationshipdevice-width<div class="<label for="registration</noscript>\n/index.html"window.open( !important;application/independence//www.googleorganizationautocompleterequirementsconservative<form name="intellectualmargin-left:18th centuryan importantinstitutionsabbreviation<img class="organisationcivilization19th centuryarchitectureincorporated20th century-container">most notably/></a></div>notification\'undefined\')Furthermore,believe thatinnerHTML = prior to thedramaticallyreferring tonegotiationsheadquartersSouth AfricaunsuccessfulPennsylvaniaAs a result,<html lang="&lt;/sup&gt;dealing withphiladelphiahistorically);<\/script>\npadding-top:experimentalgetAttributeinstructionstechnologiespart of the =function(){subscriptionl.dtd">\r\n<htgeographicalConstitution\', function(supported byagriculturalconstructionpublicationsfont-size: 1a variety of<div style="Encyclopediaiframe src="demonstratedaccomplisheduniversitiesDemographics);<\/script><dedicated toknowledge ofsatisfactionparticularly</div></div>English (US)appendChild(transmissions. However, intelligence" tabindex="float:right;Commonwealthranging fromin which theat least onereproductionencyclopedia;font-size:1jurisdictionat that time"><a class="In addition,description+conversationcontact withis generallyr" content="representing&lt;math&gt;presentationoccasionally<img width="navigation">compensationchampionshipmedia="all" violation ofreference toreturn true;Strict//EN" transactionsinterventionverificationInformation difficultiesChampionshipcapabilities<![endif]--\x3e}\n<\/script>\nChristianityfor example,Professionalrestrictionssuggest thatwas released(such as theremoveClass(unemploymentthe Americanstructure of/index.html published inspan class=""><a href="/introductionbelonging toclaimed thatconsequences<meta name="Guide to theoverwhelmingagainst the concentrated,\n.nontouch observations</a>\n</div>\nf (document.border: 1px {font-size:1treatment of0" height="1modificationIndependencedivided intogreater thanachievementsestablishingJavaScript" neverthelesssignificanceBroadcasting>&nbsp;</td>container">\nsuch as the influence ofa particularsrc=\'http://navigation" half of the substantial &nbsp;</div>advantage ofdiscovery offundamental metropolitanthe opposite" xml:lang="deliberatelyalign=centerevolution ofpreservationimprovementsbeginning inJesus ChristPublicationsdisagreementtext-align:r, function()similaritiesbody></html>is currentlyalphabeticalis sometimestype="image/many of the flow:hidden;available indescribe theexistence ofall over thethe Internet\t<ul class="installationneighborhoodarmed forcesreducing thecontinues toNonetheless,temperatures\n\t\t<a href="close to theexamples of is about the(see below)." id="searchprofessionalis availablethe official\t\t<\/script>\n\n\t\t<div id="accelerationthrough the Hall of Famedescriptionstranslationsinterference type=\'text/recent yearsin the worldvery popular{background:traditional some of the connected toexploitationemergence ofconstitutionA History ofsignificant manufacturedexpectations><noscript><can be foundbecause the has not beenneighbouringwithout the added to the\t<li class="instrumentalSoviet Unionacknowledgedwhich can bename for theattention toattempts to developmentsIn fact, the<li class="aimplicationssuitable formuch of the colonizationpresidentialcancelBubble Informationmost of the is describedrest of the more or lessin SeptemberIntelligencesrc="http://px; height: available tomanufacturerhuman rightslink href="/availabilityproportionaloutside the astronomicalhuman beingsname of the are found inare based onsmaller thana person whoexpansion ofarguing thatnow known asIn the earlyintermediatederived fromScandinavian</a></div>\r\nconsider thean estimatedthe National<div id="pagresulting incommissionedanalogous toare required/ul>\n</div>\nwas based onand became a&nbsp;&nbsp;t" value="" was capturedno more thanrespectivelycontinue to >\r\n<head>\r\n<were createdmore generalinformation used for theindependent the Imperialcomponent ofto the northinclude the Constructionside of the would not befor instanceinvention ofmore complexcollectivelybackground: text-align: its originalinto accountthis processan extensivehowever, thethey are notrejected thecriticism ofduring whichprobably thethis article(function(){It should bean agreementaccidentallydiffers fromArchitecturebetter knownarrangementsinfluence onattended theidentical tosouth of thepass throughxml" title="weight:bold;creating thedisplay:nonereplaced the<img src="/ihttps://www.World War IItestimonialsfound in therequired to and that thebetween the was designedconsists of considerablypublished bythe languageConservationconsisted ofrefer to theback to the css" media="People from available onproved to besuggestions"was known asvarieties oflikely to becomprised ofsupport the hands of thecoupled withconnect and border:none;performancesbefore beinglater becamecalculationsoften calledresidents ofmeaning that><li class="evidence forexplanationsenvironments"></a></div>which allowsIntroductiondeveloped bya wide rangeon behalf ofvalign="top"principle ofat the time,</noscript>\rsaid to havein the firstwhile othershypotheticalphilosopherspower of thecontained inperformed byinability towere writtenspan style="input name="the questionintended forrejection ofimplies thatinvented thethe standardwas probablylink betweenprofessor ofinteractionschanging theIndian Ocean class="lastworking with\'http://www.years beforeThis was therecreationalentering themeasurementsan extremelyvalue of thestart of the\n<\/script>\n\nan effort toincrease theto the southspacing="0">sufficientlythe Europeanconverted toclearTimeoutdid not haveconsequentlyfor the nextextension ofeconomic andalthough theare producedand with theinsufficientgiven by thestating thatexpenditures</span></a>\nthought thaton the basiscellpadding=image of thereturning toinformation,separated byassassinateds" content="authority ofnorthwestern</div>\n<div "></div>\r\n consultationcommunity ofthe nationalit should beparticipants align="leftthe greatestselection ofsupernaturaldependent onis mentionedallowing thewas inventedaccompanyinghis personalavailable atstudy of theon the otherexecution ofHuman Rightsterms of theassociationsresearch andsucceeded bydefeated theand from thebut they arecommander ofstate of theyears of agethe study of<ul class="splace in thewhere he was<li class="fthere are nowhich becamehe publishedexpressed into which thecommissionerfont-weight:territory ofextensions">Roman Empireequal to theIn contrast,however, andis typicallyand his wife(also called><ul class="effectively evolved intoseem to havewhich is thethere was noan excellentall of thesedescribed byIn practice,broadcastingcharged withreflected insubjected tomilitary andto the pointeconomicallysetTargetingare actuallyvictory over();<\/script>continuouslyrequired forevolutionaryan effectivenorth of the, which was front of theor otherwisesome form ofhad not beengenerated byinformation.permitted toincludes thedevelopment,entered intothe previousconsistentlyare known asthe field ofthis type ofgiven to thethe title ofcontains theinstances ofin the northdue to theirare designedcorporationswas that theone of thesemore popularsucceeded insupport fromin differentdominated bydesigned forownership ofand possiblystandardizedresponseTextwas intendedreceived theassumed thatareas of theprimarily inthe basis ofin the senseaccounts fordestroyed byat least twowas declaredcould not beSecretary ofappear to bemargin-top:1/^\\s+|\\s+$/ge){throw e};the start oftwo separatelanguage andwho had beenoperation ofdeath of thereal numbers\t<link rel="provided thethe story ofcompetitionsenglish (UK)english (US)P\x1cP>P=P3P>P;P!Q\0P?Q\x01P:P8Q\x01Q\0P?Q\x01P:P8Q\x01Q\0P?Q\x01P:P>Y\x04X9X1X(Y\nX)f-#i+\x14d8-f\x16\x07g.\0d=\x13d8-f\x16\x07g9\x01d=\x13d8-f\x16\x07f\x1c\ti\x19\x10e\x05,e\x0f8d::f0\x11f\x14?e:\x1ci\x18?i\x07\fe74e74g$>d<\x1ad8;d9\tf\x13\rd=\x1cg3;g;\x1ff\x14?g-\x16f3\x15h\'\x04informaciC3nherramientaselectrC3nicodescripciC3nclasificadosconocimientopublicaciC3nrelacionadasinformC!ticarelacionadosdepartamentotrabajadoresdirectamenteayuntamientomercadoLibrecontC!ctenoshabitacionescumplimientorestaurantesdisposiciC3nconsecuenciaelectrC3nicaaplicacionesdesconectadoinstalaciC3nrealizaciC3nutilizaciC3nenciclopediaenfermedadesinstrumentosexperienciasinstituciC3nparticularessubcategoriaQ\x02P>P;Q\fP:P>P P>Q\x01Q\x01P8P8Q\0P0P1P>Q\x02Q\vP1P>P;Q\fQ\bP5P?Q\0P>Q\x01Q\x02P>P<P>P6P5Q\x02P5P4Q\0Q\x03P3P8Q\x05Q\x01P;Q\x03Q\x07P0P5Q\x01P5P9Q\x07P0Q\x01P2Q\x01P5P3P4P0P P>Q\x01Q\x01P8Q\x0fP\x1cP>Q\x01P:P2P5P4Q\0Q\x03P3P8P5P3P>Q\0P>P4P0P2P>P?Q\0P>Q\x01P4P0P=P=Q\vQ\x05P4P>P;P6P=Q\vP8P<P5P=P=P>P\x1cP>Q\x01P:P2Q\vQ\0Q\x03P1P;P5P9P\x1cP>Q\x01P:P2P0Q\x01Q\x02Q\0P0P=Q\vP=P8Q\x07P5P3P>Q\0P0P1P>Q\x02P5P4P>P;P6P5P=Q\x03Q\x01P;Q\x03P3P8Q\x02P5P?P5Q\0Q\fP\x1eP4P=P0P:P>P?P>Q\x02P>P<Q\x03Q\0P0P1P>Q\x02Q\x03P0P?Q\0P5P;Q\x0fP2P>P>P1Q\tP5P>P4P=P>P3P>Q\x01P2P>P5P3P>Q\x01Q\x02P0Q\x02Q\fP8P4Q\0Q\x03P3P>P9Q\x04P>Q\0Q\x03P<P5Q\x05P>Q\0P>Q\bP>P?Q\0P>Q\x02P8P2Q\x01Q\x01Q\vP;P:P0P:P0P6P4Q\vP9P2P;P0Q\x01Q\x02P8P3Q\0Q\x03P?P?Q\vP2P<P5Q\x01Q\x02P5Q\0P0P1P>Q\x02P0Q\x01P:P0P7P0P;P?P5Q\0P2Q\vP9P4P5P;P0Q\x02Q\fP4P5P=Q\fP3P8P?P5Q\0P8P>P4P1P8P7P=P5Q\x01P>Q\x01P=P>P2P5P<P>P<P5P=Q\x02P:Q\x03P?P8Q\x02Q\fP4P>P;P6P=P0Q\0P0P<P:P0Q\x05P=P0Q\x07P0P;P>P P0P1P>Q\x02P0P"P>P;Q\fP:P>Q\x01P>P2Q\x01P5P<P2Q\x02P>Q\0P>P9P=P0Q\x07P0P;P0Q\x01P?P8Q\x01P>P:Q\x01P;Q\x03P6P1Q\vQ\x01P8Q\x01Q\x02P5P<P?P5Q\x07P0Q\x02P8P=P>P2P>P3P>P?P>P<P>Q\tP8Q\x01P0P9Q\x02P>P2P?P>Q\x07P5P<Q\x03P?P>P<P>Q\tQ\fP4P>P;P6P=P>Q\x01Q\x01Q\vP;P:P8P1Q\vQ\x01Q\x02Q\0P>P4P0P=P=Q\vP5P<P=P>P3P8P5P?Q\0P>P5P:Q\x02P!P5P9Q\x07P0Q\x01P<P>P4P5P;P8Q\x02P0P:P>P3P>P>P=P;P0P9P=P3P>Q\0P>P4P5P2P5Q\0Q\x01P8Q\x0fQ\x01Q\x02Q\0P0P=P5Q\x04P8P;Q\fP<Q\vQ\x03Q\0P>P2P=Q\x0fQ\0P0P7P=Q\vQ\x05P8Q\x01P:P0Q\x02Q\fP=P5P4P5P;Q\x0eQ\x0fP=P2P0Q\0Q\x0fP<P5P=Q\fQ\bP5P<P=P>P3P8Q\x05P4P0P=P=P>P9P7P=P0Q\x07P8Q\x02P=P5P;Q\fP7Q\x0fQ\x04P>Q\0Q\x03P<P0P"P5P?P5Q\0Q\fP<P5Q\x01Q\x0fQ\x06P0P7P0Q\tP8Q\x02Q\vP\x1bQ\x03Q\x07Q\bP8P5`$(`$9`%\0`$\x02`$\x15`$0`$(`%\x07`$\x05`$*`$(`%\x07`$\x15`$?`$/`$>`$\x15`$0`%\x07`$\x02`$\x05`$(`%\r`$/`$\x15`%\r`$/`$>`$\x17`$>`$\x07`$!`$,`$>`$0`%\x07`$\x15`$?`$8`%\0`$&`$?`$/`$>`$*`$9`$2`%\x07`$8`$?`$\x02`$9`$-`$>`$0`$$`$\x05`$*`$(`%\0`$5`$>`$2`%\x07`$8`%\x07`$5`$>`$\x15`$0`$$`%\x07`$.`%\x07`$0`%\x07`$9`%\v`$(`%\x07`$8`$\x15`$$`%\x07`$,`$9`%\x01`$$`$8`$>`$\x07`$\x1f`$9`%\v`$\x17`$>`$\x1c`$>`$(`%\x07`$.`$?`$(`$\x1f`$\x15`$0`$$`$>`$\x15`$0`$(`$>`$\t`$(`$\x15`%\x07`$/`$9`$>`$\x01`$8`$,`$8`%\x07`$-`$>`$7`$>`$\x06`$*`$\x15`%\x07`$2`$?`$/`%\x07`$6`%\x01`$0`%\x02`$\x07`$8`$\x15`%\x07`$\x18`$\x02`$\x1f`%\x07`$.`%\x07`$0`%\0`$8`$\x15`$$`$>`$.`%\x07`$0`$>`$2`%\x07`$\x15`$0`$\x05`$\'`$?`$\x15`$\x05`$*`$(`$>`$8`$.`$>`$\x1c`$.`%\x01`$\x1d`%\x07`$\x15`$>`$0`$#`$9`%\v`$$`$>`$\x15`$!`$<`%\0`$/`$9`$>`$\x02`$9`%\v`$\x1f`$2`$6`$,`%\r`$&`$2`$?`$/`$>`$\x1c`%\0`$5`$(`$\x1c`$>`$$`$>`$\x15`%\b`$8`%\x07`$\x06`$*`$\x15`$>`$5`$>`$2`%\0`$&`%\x07`$(`%\x07`$*`%\x02`$0`%\0`$*`$>`$(`%\0`$\t`$8`$\x15`%\x07`$9`%\v`$\x17`%\0`$,`%\b`$ `$\x15`$\x06`$*`$\x15`%\0`$5`$0`%\r`$7`$\x17`$>`$\x02`$5`$\x06`$*`$\x15`%\v`$\x1c`$?`$2`$>`$\x1c`$>`$(`$>`$8`$9`$.`$$`$9`$.`%\x07`$\x02`$\t`$(`$\x15`%\0`$/`$>`$9`%\x02`$&`$0`%\r`$\x1c`$8`%\x02`$\x1a`%\0`$*`$8`$\x02`$&`$8`$5`$>`$2`$9`%\v`$(`$>`$9`%\v`$$`%\0`$\x1c`%\b`$8`%\x07`$5`$>`$*`$8`$\x1c`$(`$$`$>`$(`%\x07`$$`$>`$\x1c`$>`$0`%\0`$\x18`$>`$/`$2`$\x1c`$?`$2`%\x07`$(`%\0`$\x1a`%\x07`$\x1c`$>`$\x02`$\x1a`$*`$$`%\r`$0`$\x17`%\x02`$\x17`$2`$\x1c`$>`$$`%\x07`$,`$>`$9`$0`$\x06`$*`$(`%\x07`$5`$>`$9`$(`$\x07`$8`$\x15`$>`$8`%\x01`$,`$9`$0`$9`$(`%\x07`$\x07`$8`$8`%\x07`$8`$9`$?`$$`$,`$!`$<`%\x07`$\x18`$\x1f`$(`$>`$$`$2`$>`$6`$*`$>`$\x02`$\x1a`$6`%\r`$0`%\0`$,`$!`$<`%\0`$9`%\v`$$`%\x07`$8`$>`$\b`$\x1f`$6`$>`$/`$&`$8`$\x15`$$`%\0`$\x1c`$>`$$`%\0`$5`$>`$2`$>`$9`$\x1c`$>`$0`$*`$\x1f`$(`$>`$0`$\x16`$(`%\x07`$8`$!`$<`$\x15`$.`$?`$2`$>`$\t`$8`$\x15`%\0`$\x15`%\x07`$5`$2`$2`$\x17`$$`$>`$\x16`$>`$(`$>`$\x05`$0`%\r`$%`$\x1c`$9`$>`$\x02`$&`%\x07`$\x16`$>`$*`$9`$2`%\0`$(`$?`$/`$.`$,`$?`$(`$>`$,`%\b`$\x02`$\x15`$\x15`$9`%\0`$\x02`$\x15`$9`$(`$>`$&`%\x07`$$`$>`$9`$.`$2`%\x07`$\x15`$>`$+`%\0`$\x1c`$,`$\x15`$?`$$`%\x01`$0`$$`$.`$>`$\x02`$\x17`$5`$9`%\0`$\x02`$0`%\v`$\x1c`$<`$.`$?`$2`%\0`$\x06`$0`%\v`$*`$8`%\x07`$(`$>`$/`$>`$&`$5`$2`%\x07`$(`%\x07`$\x16`$>`$$`$>`$\x15`$0`%\0`$,`$\t`$(`$\x15`$>`$\x1c`$5`$>`$,`$*`%\x02`$0`$>`$,`$!`$<`$>`$8`%\f`$&`$>`$6`%\x07`$/`$0`$\x15`$?`$/`%\x07`$\x15`$9`$>`$\x02`$\x05`$\x15`$8`$0`$,`$(`$>`$\x0f`$5`$9`$>`$\x02`$8`%\r`$%`$2`$.`$?`$2`%\x07`$2`%\x07`$\x16`$\x15`$5`$?`$7`$/`$\x15`%\r`$0`$\x02`$8`$.`%\x02`$9`$%`$>`$(`$>X*X3X*X7Y\nX9Y\x05X4X\'X1Y\x03X)X(Y\bX\'X3X7X)X\'Y\x04X5Y\x01X-X)Y\x05Y\bX\'X6Y\nX9X\'Y\x04X.X\'X5X)X\'Y\x04Y\x05X2Y\nX/X\'Y\x04X9X\'Y\x05X)X\'Y\x04Y\x03X\'X*X(X\'Y\x04X1X/Y\bX/X(X1Y\x06X\'Y\x05X,X\'Y\x04X/Y\bY\x04X)X\'Y\x04X9X\'Y\x04Y\x05X\'Y\x04Y\x05Y\bY\x02X9X\'Y\x04X9X1X(Y\nX\'Y\x04X3X1Y\nX9X\'Y\x04X,Y\bX\'Y\x04X\'Y\x04X0Y\x07X\'X(X\'Y\x04X-Y\nX\'X)X\'Y\x04X-Y\x02Y\bY\x02X\'Y\x04Y\x03X1Y\nY\x05X\'Y\x04X9X1X\'Y\x02Y\x05X-Y\x01Y\bX8X)X\'Y\x04X+X\'Y\x06Y\nY\x05X4X\'Y\x07X/X)X\'Y\x04Y\x05X1X#X)X\'Y\x04Y\x02X1X"Y\x06X\'Y\x04X4X(X\'X(X\'Y\x04X-Y\bX\'X1X\'Y\x04X,X/Y\nX/X\'Y\x04X#X3X1X)X\'Y\x04X9Y\x04Y\bY\x05Y\x05X,Y\x05Y\bX9X)X\'Y\x04X1X-Y\x05Y\x06X\'Y\x04Y\x06Y\x02X\'X7Y\x01Y\x04X3X7Y\nY\x06X\'Y\x04Y\x03Y\bY\nX*X\'Y\x04X/Y\x06Y\nX\'X(X1Y\x03X\'X*Y\x07X\'Y\x04X1Y\nX\'X6X*X-Y\nX\'X*Y\nX(X*Y\bY\x02Y\nX*X\'Y\x04X#Y\bY\x04Y\tX\'Y\x04X(X1Y\nX/X\'Y\x04Y\x03Y\x04X\'Y\x05X\'Y\x04X1X\'X(X7X\'Y\x04X4X.X5Y\nX3Y\nX\'X1X\'X*X\'Y\x04X+X\'Y\x04X+X\'Y\x04X5Y\x04X\'X)X\'Y\x04X-X/Y\nX+X\'Y\x04X2Y\bX\'X1X\'Y\x04X.Y\x04Y\nX,X\'Y\x04X,Y\x05Y\nX9X\'Y\x04X9X\'Y\x05Y\x07X\'Y\x04X,Y\x05X\'Y\x04X\'Y\x04X3X\'X9X)Y\x05X4X\'Y\x07X/Y\x07X\'Y\x04X1X&Y\nX3X\'Y\x04X/X.Y\bY\x04X\'Y\x04Y\x01Y\x06Y\nX)X\'Y\x04Y\x03X*X\'X(X\'Y\x04X/Y\bX1Y\nX\'Y\x04X/X1Y\bX3X\'X3X*X:X1Y\x02X*X5X\'Y\x05Y\nY\x05X\'Y\x04X(Y\x06X\'X*X\'Y\x04X9X8Y\nY\x05entertainmentunderstanding = function().jpg" width="configuration.png" width="<body class="Math.random()contemporary United Statescircumstances.appendChild(organizations<span class=""><img src="/distinguishedthousands of communicationclear"></div>investigationfavicon.ico" margin-right:based on the Massachusettstable border=internationalalso known aspronunciationbackground:#fpadding-left:For example, miscellaneous&lt;/math&gt;psychologicalin particularearch" type="form method="as opposed toSupreme Courtoccasionally Additionally,North Americapx;backgroundopportunitiesEntertainment.toLowerCase(manufacturingprofessional combined withFor instance,consisting of" maxlength="return false;consciousnessMediterraneanextraordinaryassassinationsubsequently button type="the number ofthe original comprehensiverefers to the</ul>\n</div>\nphilosophicallocation.hrefwas publishedSan Francisco(function(){\n<div id="mainsophisticatedmathematical /head>\r\n<bodysuggests thatdocumentationconcentrationrelationshipsmay have been(for example,This article in some casesparts of the definition ofGreat Britain cellpadding=equivalent toplaceholder="; font-size: justificationbelieved thatsuffered fromattempted to leader of thecript" src="/(function() {are available\n\t<link rel=" src=\'http://interested inconventional " alt="" /></are generallyhas also beenmost popular correspondingcredited withtyle="border:</a></span></.gif" width="<iframe src="table class="inline-block;according to together withapproximatelyparliamentarymore and moredisplay:none;traditionallypredominantly&nbsp;|&nbsp;&nbsp;</span> cellspacing=<input name="or" content="controversialproperty="og:/x-shockwave-demonstrationsurrounded byNevertheless,was the firstconsiderable Although the collaborationshould not beproportion of<span style="known as the shortly afterfor instance,described as /head>\n<body starting withincreasingly the fact thatdiscussion ofmiddle of thean individualdifficult to point of viewhomosexualityacceptance of</span></div>manufacturersorigin of thecommonly usedimportance ofdenominationsbackground: #length of thedeterminationa significant" border="0">revolutionaryprinciples ofis consideredwas developedIndo-Europeanvulnerable toproponents ofare sometimescloser to theNew York City name="searchattributed tocourse of themathematicianby the end ofat the end of" border="0" technological.removeClass(branch of theevidence that![endif]--\x3e\r\nInstitute of into a singlerespectively.and thereforeproperties ofis located insome of whichThere is alsocontinued to appearance of &amp;ndash; describes theconsiderationauthor of theindependentlyequipped withdoes not have</a><a href="confused with<link href="/at the age ofappear in theThese includeregardless ofcould be used style=&quot;several timesrepresent thebody>\n</html>thought to bepopulation ofpossibilitiespercentage ofaccess to thean attempt toproduction ofjquery/jquerytwo differentbelong to theestablishmentreplacing thedescription" determine theavailable forAccording to wide range of\t<div class="more commonlyorganisationsfunctionalitywas completed &amp;mdash; participationthe characteran additionalappears to befact that thean example ofsignificantlyonmouseover="because they async = true;problems withseems to havethe result of src="http://familiar withpossession offunction () {took place inand sometimessubstantially<span></span>is often usedin an attemptgreat deal ofEnvironmentalsuccessfully virtually all20th century,professionalsnecessary to determined bycompatibilitybecause it isDictionary ofmodificationsThe followingmay refer to:Consequently,Internationalalthough somethat would beworld\'s firstclassified asbottom of the(particularlyalign="left" most commonlybasis for thefoundation ofcontributionspopularity ofcenter of theto reduce thejurisdictionsapproximation onmouseout="New Testamentcollection of</span></a></in the Unitedfilm director-strict.dtd">has been usedreturn to thealthough thischange in theseveral otherbut there areunprecedentedis similar toespecially inweight: bold;is called thecomputationalindicate thatrestricted to\t<meta name="are typicallyconflict withHowever, the An example ofcompared withquantities ofrather than aconstellationnecessary forreported thatspecificationpolitical and&nbsp;&nbsp;<references tothe same yearGovernment ofgeneration ofhave not beenseveral yearscommitment to\t\t<ul class="visualization19th century,practitionersthat he wouldand continuedoccupation ofis defined ascentre of thethe amount of><div style="equivalent ofdifferentiatebrought aboutmargin-left: automaticallythought of asSome of these\n<div class="input class="replaced withis one of theeducation andinfluenced byreputation as\n<meta name="accommodation</div>\n</div>large part ofInstitute forthe so-called against the In this case,was appointedclaimed to beHowever, thisDepartment ofthe remainingeffect on theparticularly deal with the\n<div style="almost alwaysare currentlyexpression ofphilosophy offor more thancivilizationson the islandselectedIndexcan result in" value="" />the structure /></a></div>Many of thesecaused by theof the Unitedspan class="mcan be tracedis related tobecame one ofis frequentlyliving in thetheoreticallyFollowing theRevolutionarygovernment inis determinedthe politicalintroduced insufficient todescription">short storiesseparation ofas to whetherknown for itswas initiallydisplay:blockis an examplethe principalconsists of arecognized as/body></html>a substantialreconstructedhead of stateresistance toundergraduateThere are twogravitationalare describedintentionallyserved as theclass="headeropposition tofundamentallydominated theand the otheralliance withwas forced torespectively,and politicalin support ofpeople in the20th century.and publishedloadChartbeatto understandmember statesenvironmentalfirst half ofcountries andarchitecturalbe consideredcharacterizedclearIntervalauthoritativeFederation ofwas succeededand there area consequencethe Presidentalso includedfree softwaresuccession ofdeveloped thewas destroyedaway from the;\n<\/script>\n<although theyfollowed by amore powerfulresulted in aUniversity ofHowever, manythe presidentHowever, someis thought tountil the endwas announcedare importantalso includes><input type=the center of DO NOT ALTERused to referthemes/?sort=that had beenthe basis forhas developedin the summercomparativelydescribed thesuch as thosethe resultingis impossiblevarious otherSouth Africanhave the sameeffectivenessin which case; text-align:structure and; background:regarding thesupported theis also knownstyle="marginincluding thebahasa Melayunorsk bokmC%lnorsk nynorskslovenE!D\rinainternacionalcalificaciC3ncomunicaciC3nconstrucciC3n"><div class="disambiguationDomainName\', \'administrationsimultaneouslytransportationInternational margin-bottom:responsibility<![endif]--\x3e\n</><meta name="implementationinfrastructurerepresentationborder-bottom:</head>\n<body>=http%3A%2F%2F<form method="method="post" /favicon.ico" });\n<\/script>\n.setAttribute(Administration= new Array();<![endif]--\x3e\r\ndisplay:block;Unfortunately,">&nbsp;</div>/favicon.ico">=\'stylesheet\' identification, for example,<li><a href="/an alternativeas a result ofpt"><\/script>\ntype="submit" \n(function() {recommendationform action="/transformationreconstruction.style.display According to hidden" name="along with thedocument.body.approximately Communicationspost" action="meaning &quot;--<![endif]--\x3ePrime Ministercharacteristic</a> <a class=the history of onmouseover="the governmenthref="https://was originallywas introducedclassificationrepresentativeare considered<![endif]--\x3e\n\ndepends on theUniversity of in contrast to placeholder="in the case ofinternational constitutionalstyle="border-: function() {Because of the-strict.dtd">\n<table class="accompanied byaccount of the<script src="/nature of the the people in in addition tos); js.id = id" width="100%"regarding the Roman Catholican independentfollowing the .gif" width="1the following discriminationarchaeologicalprime minister.js"><\/script>combination of marginwidth="createElement(w.attachEvent(</a></td></tr>src="https://aIn particular, align="left" Czech RepublicUnited Kingdomcorrespondenceconcluded that.html" title="(function () {comes from theapplication of<span class="sbelieved to beement(\'script\'</a>\n</li>\n<livery different><span class="option value="(also known as\t<li><a href="><input name="separated fromreferred to as valign="top">founder of theattempting to carbon dioxide\n\n<div class="class="search-/body>\n</html>opportunity tocommunications</head>\r\n<body style="width:Tia:?ng Via;\x07tchanges in theborder-color:#0" border="0" </span></div><was discovered" type="text" );\n<\/script>\n\nDepartment of ecclesiasticalthere has beenresulting from</body></html>has never beenthe first timein response toautomatically </div>\n\n<div iwas consideredpercent of the" /></a></div>collection of descended fromsection of theaccept-charsetto be confusedmember of the padding-right:translation ofinterpretation href=\'http://whether or notThere are alsothere are manya small numberother parts ofimpossible to class="buttonlocated in the. However, theand eventuallyAt the end of because of itsrepresents the<form action=" method="post"it is possiblemore likely toan increase inhave also beencorresponds toannounced thatalign="right">many countriesfor many yearsearliest knownbecause it waspt"><\/script>\r valign="top" inhabitants offollowing year\r\n<div class="million peoplecontroversial concerning theargue that thegovernment anda reference totransferred todescribing the style="color:although therebest known forsubmit" name="multiplicationmore than one recognition ofCouncil of theedition of the <meta name="Entertainment away from the ;margin-right:at the time ofinvestigationsconnected withand many otheralthough it isbeginning with <span class="descendants of<span class="i align="right"</head>\n<body aspects of thehas since beenEuropean Unionreminiscent ofmore difficultVice Presidentcomposition ofpassed throughmore importantfont-size:11pxexplanation ofthe concept ofwritten in the\t<span class="is one of the resemblance toon the groundswhich containsincluding the defined by thepublication ofmeans that theoutside of thesupport of the<input class="<span class="t(Math.random()most prominentdescription ofConstantinoplewere published<div class="seappears in the1" height="1" most importantwhich includeswhich had beendestruction ofthe population\n\t<div class="possibility ofsometimes usedappear to havesuccess of theintended to bepresent in thestyle="clear:b\r\n<\/script>\r\n<was founded ininterview with_id" content="capital of the\r\n<link rel="srelease of thepoint out thatxMLHttpRequestand subsequentsecond largestvery importantspecificationssurface of theapplied to theforeign policy_setDomainNameestablished inis believed toIn addition tomeaning of theis named afterto protect theis representedDeclaration ofmore efficientClassificationother forms ofhe returned to<span class="cperformance of(function() {\rif and only ifregions of theleading to therelations withUnited Nationsstyle="height:other than theype" content="Association of\n</head>\n<bodylocated on theis referred to(including theconcentrationsthe individualamong the mostthan any other/>\n<link rel=" return false;the purpose ofthe ability to;color:#fff}\n.\n<span class="the subject ofdefinitions of>\r\n<link rel="claim that thehave developed<table width="celebration ofFollowing the to distinguish<span class="btakes place inunder the namenoted that the><![endif]--\x3e\nstyle="margin-instead of theintroduced thethe process ofincreasing thedifferences inestimated thatespecially the/div><div id="was eventuallythroughout histhe differencesomething thatspan></span></significantly ><\/script>\r\n\r\nenvironmental to prevent thehave been usedespecially forunderstand theis essentiallywere the firstis the largesthave been made" src="http://interpreted assecond half ofcrolling="no" is composed ofII, Holy Romanis expected tohave their owndefined as thetraditionally have differentare often usedto ensure thatagreement withcontaining theare frequentlyinformation onexample is theresulting in a</a></li></ul> class="footerand especiallytype="button" </span></span>which included>\n<meta name="considered thecarried out byHowever, it isbecame part ofin relation topopular in thethe capital ofwas officiallywhich has beenthe History ofalternative todifferent fromto support thesuggested thatin the process <div class="the foundationbecause of hisconcerned withthe universityopposed to thethe context of<span class="ptext" name="q"\t\t<div class="the scientificrepresented bymathematicianselected by thethat have been><div class="cdiv id="headerin particular,converted into);\n<\/script>\n<philosophical srpskohrvatskitia:?ng Via;\x07tP Q\x03Q\x01Q\x01P:P8P9Q\0Q\x03Q\x01Q\x01P:P8P9investigaciC3nparticipaciC3nP:P>Q\x02P>Q\0Q\vP5P>P1P;P0Q\x01Q\x02P8P:P>Q\x02P>Q\0Q\vP9Q\x07P5P;P>P2P5P:Q\x01P8Q\x01Q\x02P5P<Q\vP\x1dP>P2P>Q\x01Q\x02P8P:P>Q\x02P>Q\0Q\vQ\x05P>P1P;P0Q\x01Q\x02Q\fP2Q\0P5P<P5P=P8P:P>Q\x02P>Q\0P0Q\x0fQ\x01P5P3P>P4P=Q\x0fQ\x01P:P0Q\x07P0Q\x02Q\fP=P>P2P>Q\x01Q\x02P8P#P:Q\0P0P8P=Q\vP2P>P?Q\0P>Q\x01Q\vP:P>Q\x02P>Q\0P>P9Q\x01P4P5P;P0Q\x02Q\fP?P>P<P>Q\tQ\fQ\x0eQ\x01Q\0P5P4Q\x01Q\x02P2P>P1Q\0P0P7P>P<Q\x01Q\x02P>Q\0P>P=Q\vQ\x03Q\x07P0Q\x01Q\x02P8P5Q\x02P5Q\x07P5P=P8P5P\x13P;P0P2P=P0Q\x0fP8Q\x01Q\x02P>Q\0P8P8Q\x01P8Q\x01Q\x02P5P<P0Q\0P5Q\bP5P=P8Q\x0fP!P:P0Q\x07P0Q\x02Q\fP?P>Q\rQ\x02P>P<Q\x03Q\x01P;P5P4Q\x03P5Q\x02Q\x01P:P0P7P0Q\x02Q\fQ\x02P>P2P0Q\0P>P2P:P>P=P5Q\x07P=P>Q\0P5Q\bP5P=P8P5P:P>Q\x02P>Q\0P>P5P>Q\0P3P0P=P>P2P:P>Q\x02P>Q\0P>P<P P5P:P;P0P<P0X\'Y\x04Y\x05Y\x06X*X/Y\tY\x05Y\x06X*X/Y\nX\'X*X\'Y\x04Y\x05Y\bX6Y\bX9X\'Y\x04X(X1X\'Y\x05X,X\'Y\x04Y\x05Y\bX\'Y\x02X9X\'Y\x04X1X3X\'X&Y\x04Y\x05X4X\'X1Y\x03X\'X*X\'Y\x04X#X9X6X\'X!X\'Y\x04X1Y\nX\'X6X)X\'Y\x04X*X5Y\x05Y\nY\x05X\'Y\x04X\'X9X6X\'X!X\'Y\x04Y\x06X*X\'X&X,X\'Y\x04X#Y\x04X9X\'X(X\'Y\x04X*X3X,Y\nY\x04X\'Y\x04X#Y\x02X3X\'Y\x05X\'Y\x04X6X:X7X\'X*X\'Y\x04Y\x01Y\nX/Y\nY\bX\'Y\x04X*X1X-Y\nX(X\'Y\x04X,X/Y\nX/X)X\'Y\x04X*X9Y\x04Y\nY\x05X\'Y\x04X#X.X(X\'X1X\'Y\x04X\'Y\x01Y\x04X\'Y\x05X\'Y\x04X#Y\x01Y\x04X\'Y\x05X\'Y\x04X*X\'X1Y\nX.X\'Y\x04X*Y\x02Y\x06Y\nX)X\'Y\x04X\'Y\x04X9X\'X(X\'Y\x04X.Y\bX\'X7X1X\'Y\x04Y\x05X,X*Y\x05X9X\'Y\x04X/Y\nY\x03Y\bX1X\'Y\x04X3Y\nX\'X-X)X9X(X/X\'Y\x04Y\x04Y\x07X\'Y\x04X*X1X(Y\nX)X\'Y\x04X1Y\bX\'X(X7X\'Y\x04X#X/X(Y\nX)X\'Y\x04X\'X.X(X\'X1X\'Y\x04Y\x05X*X-X/X)X\'Y\x04X\'X:X\'Y\x06Y\ncursor:pointer;</title>\n<meta " href="http://"><span class="members of the window.locationvertical-align:/a> | <a href="<!doctype html>media="screen" <option value="favicon.ico" />\n\t\t<div class="characteristics" method="get" /body>\n</html>\nshortcut icon" document.write(padding-bottom:representativessubmit" value="align="center" throughout the science fiction\n <div class="submit" class="one of the most valign="top"><was established);\r\n<\/script>\r\nreturn false;">).style.displaybecause of the document.cookie<form action="/}body{margin:0;Encyclopedia ofversion of the .createElement(name" content="</div>\n</div>\n\nadministrative </body>\n</html>history of the "><input type="portion of the as part of the &nbsp;<a href="other countries">\n<div class="</span></span><In other words,display: block;control of the introduction of/>\n<meta name="as well as the in recent years\r\n\t<div class="</div>\n\t</div>\ninspired by thethe end of the compatible withbecame known as style="margin:.js"><\/script>< International there have beenGerman language style="color:#Communist Partyconsistent withborder="0" cell marginheight="the majority of" align="centerrelated to the many different Orthodox Churchsimilar to the />\n<link rel="swas one of the until his death})();\n<\/script>other languagescompared to theportions of thethe Netherlandsthe most commonbackground:url(argued that thescrolling="no" included in theNorth American the name of theinterpretationsthe traditionaldevelopment of frequently useda collection ofvery similar tosurrounding theexample of thisalign="center">would have beenimage_caption =attached to thesuggesting thatin the form of involved in theis derived fromnamed after theIntroduction torestrictions on style="width: can be used to the creation ofmost important information andresulted in thecollapse of theThis means thatelements of thewas replaced byanalysis of theinspiration forregarded as themost successfulknown as &quot;a comprehensiveHistory of the were consideredreturned to theare referred toUnsourced image>\n\t<div class="consists of thestopPropagationinterest in theavailability ofappears to haveelectromagneticenableServices(function of theIt is important<\/script></div>function(){var relative to theas a result of the position ofFor example, in method="post" was followed by&amp;mdash; thethe applicationjs"><\/script>\r\nul></div></div>after the deathwith respect tostyle="padding:is particularlydisplay:inline; type="submit" is divided intod8-f\x16\x07 (g.\0d=\x13)responsabilidadadministraciC3ninternacionalescorrespondiente`$\t`$*`$/`%\v`$\x17`$*`%\x02`$0`%\r`$5`$9`$.`$>`$0`%\x07`$2`%\v`$\x17`%\v`$\x02`$\x1a`%\x01`$(`$>`$5`$2`%\x07`$\x15`$?`$(`$8`$0`$\x15`$>`$0`$*`%\x01`$2`$?`$8`$\x16`%\v`$\x1c`%\x07`$\x02`$\x1a`$>`$9`$?`$\x0f`$-`%\x07`$\x1c`%\x07`$\x02`$6`$>`$.`$?`$2`$9`$.`$>`$0`%\0`$\x1c`$>`$\x17`$0`$#`$,`$(`$>`$(`%\x07`$\x15`%\x01`$.`$>`$0`$,`%\r`$2`%\t`$\x17`$.`$>`$2`$?`$\x15`$.`$9`$?`$2`$>`$*`%\x03`$7`%\r`$ `$,`$"`$<`$$`%\x07`$-`$>`$\x1c`$*`$>`$\x15`%\r`$2`$?`$\x15`$\x1f`%\r`$0`%\x07`$(`$\x16`$?`$2`$>`$+`$&`%\f`$0`$>`$(`$.`$>`$.`$2`%\x07`$.`$$`$&`$>`$(`$,`$>`$\x1c`$>`$0`$5`$?`$\x15`$>`$8`$\x15`%\r`$/`%\v`$\x02`$\x1a`$>`$9`$$`%\x07`$*`$9`%\x01`$\x01`$\x1a`$,`$$`$>`$/`$>`$8`$\x02`$5`$>`$&`$&`%\x07`$\x16`$(`%\x07`$*`$?`$\x1b`$2`%\x07`$5`$?`$6`%\x07`$7`$0`$>`$\x1c`%\r`$/`$\t`$$`%\r`$$`$0`$.`%\x01`$\x02`$,`$\b`$&`%\v`$(`%\v`$\x02`$\t`$*`$\x15`$0`$#`$*`$"`$<`%\x07`$\x02`$8`%\r`$%`$?`$$`$+`$?`$2`%\r`$.`$.`%\x01`$\x16`%\r`$/`$\x05`$\x1a`%\r`$\x1b`$>`$\x1b`%\x02`$\x1f`$$`%\0`$8`$\x02`$\x17`%\0`$$`$\x1c`$>`$\x0f`$\x17`$>`$5`$?`$-`$>`$\x17`$\x18`$#`%\r`$\x1f`%\x07`$&`%\x02`$8`$0`%\x07`$&`$?`$(`%\v`$\x02`$9`$$`%\r`$/`$>`$8`%\x07`$\x15`%\r`$8`$\x17`$>`$\x02`$\'`%\0`$5`$?`$6`%\r`$5`$0`$>`$$`%\x07`$\x02`$&`%\b`$\x1f`%\r`$8`$(`$\x15`%\r`$6`$>`$8`$>`$.`$(`%\x07`$\x05`$&`$>`$2`$$`$,`$?`$\x1c`$2`%\0`$*`%\x01`$0`%\x02`$7`$9`$?`$\x02`$&`%\0`$.`$?`$$`%\r`$0`$\x15`$5`$?`$$`$>`$0`%\x01`$*`$/`%\x07`$8`%\r`$%`$>`$(`$\x15`$0`%\v`$!`$<`$.`%\x01`$\x15`%\r`$$`$/`%\v`$\x1c`$(`$>`$\x15`%\x03`$*`$/`$>`$*`%\v`$8`%\r`$\x1f`$\x18`$0`%\x07`$2`%\x02`$\x15`$>`$0`%\r`$/`$5`$?`$\x1a`$>`$0`$8`%\x02`$\x1a`$(`$>`$.`%\x02`$2`%\r`$/`$&`%\x07`$\x16`%\x07`$\x02`$9`$.`%\x07`$6`$>`$8`%\r`$\x15`%\x02`$2`$.`%\b`$\x02`$(`%\x07`$$`%\b`$/`$>`$0`$\x1c`$?`$8`$\x15`%\x07rss+xml" title="-type" content="title" content="at the same time.js"><\/script>\n<" method="post" </span></a></li>vertical-align:t/jquery.min.js">.click(function( style="padding-})();\n<\/script>\n</span><a href="<a href="http://); return false;text-decoration: scrolling="no" border-collapse:associated with Bahasa IndonesiaEnglish language<text xml:space=.gif" border="0"</body>\n</html>\noverflow:hidden;img src="http://addEventListenerresponsible for s.js"><\/script>\n/favicon.ico" />operating system" style="width:1target="_blank">State Universitytext-align:left;\ndocument.write(, including the around the world);\r\n<\/script>\r\n<" style="height:;overflow:hiddenmore informationan internationala member of the one of the firstcan be found in </div>\n\t\t</div>\ndisplay: none;">" />\n<link rel="\n (function() {the 15th century.preventDefault(large number of Byzantine Empire.jpg|thumb|left|vast majority ofmajority of the align="center">University Pressdominated by theSecond World Wardistribution of style="position:the rest of the characterized by rel="nofollow">derives from therather than the a combination ofstyle="width:100English-speakingcomputer scienceborder="0" alt="the existence ofDemocratic Party" style="margin-For this reason,.js"><\/script>\n\tsByTagName(s)[0]js"><\/script>\r\n<.js"><\/script>\r\nlink rel="icon" \' alt=\'\' class=\'formation of theversions of the </a></div></div>/page>\n <page>\n<div class="contbecame the firstbahasa Indonesiaenglish (simple)N\x15N;N;N7N=N9N:N,Q\x05Q\0P2P0Q\x02Q\x01P:P8P:P>P<P?P0P=P8P8Q\x0fP2P;Q\x0fP5Q\x02Q\x01Q\x0fP\x14P>P1P0P2P8Q\x02Q\fQ\x07P5P;P>P2P5P:P0Q\0P0P7P2P8Q\x02P8Q\x0fP\x18P=Q\x02P5Q\0P=P5Q\x02P\x1eQ\x02P2P5Q\x02P8Q\x02Q\fP=P0P?Q\0P8P<P5Q\0P8P=Q\x02P5Q\0P=P5Q\x02P:P>Q\x02P>Q\0P>P3P>Q\x01Q\x02Q\0P0P=P8Q\x06Q\vP:P0Q\x07P5Q\x01Q\x02P2P5Q\x03Q\x01P;P>P2P8Q\x0fQ\x05P?Q\0P>P1P;P5P<Q\vP?P>P;Q\x03Q\x07P8Q\x02Q\fQ\x0fP2P;Q\x0fQ\x0eQ\x02Q\x01Q\x0fP=P0P8P1P>P;P5P5P:P>P<P?P0P=P8Q\x0fP2P=P8P<P0P=P8P5Q\x01Q\0P5P4Q\x01Q\x02P2P0X\'Y\x04Y\x05Y\bX\'X6Y\nX9X\'Y\x04X1X&Y\nX3Y\nX)X\'Y\x04X\'Y\x06X*Y\x02X\'Y\x04Y\x05X4X\'X1Y\x03X\'X*Y\x03X\'Y\x04X3Y\nX\'X1X\'X*X\'Y\x04Y\x05Y\x03X*Y\bX(X)X\'Y\x04X3X9Y\bX/Y\nX)X\'X-X5X\'X&Y\nX\'X*X\'Y\x04X9X\'Y\x04Y\x05Y\nX)X\'Y\x04X5Y\bX*Y\nX\'X*X\'Y\x04X\'Y\x06X*X1Y\x06X*X\'Y\x04X*X5X\'Y\x05Y\nY\x05X\'Y\x04X%X3Y\x04X\'Y\x05Y\nX\'Y\x04Y\x05X4X\'X1Y\x03X)X\'Y\x04Y\x05X1X&Y\nX\'X*robots" content="<div id="footer">the United States<img src="http://.jpg|right|thumb|.js"><\/script>\r\n<location.protocolframeborder="0" s" />\n<meta name="</a></div></div><font-weight:bold;&quot; and &quot;depending on the margin:0;padding:" rel="nofollow" President of the twentieth centuryevision>\n </pageInternet Explorera.async = true;\r\ninformation about<div id="header">" action="http://<a href="https://<div id="content"</div>\r\n</div>\r\n<derived from the <img src=\'http://according to the \n</body>\n</html>\nstyle="font-size:script language="Arial, Helvetica,</a><span class="<\/script><script political partiestd></tr></table><href="http://www.interpretation ofrel="stylesheet" document.write(\'<charset="utf-8">\nbeginning of the revealed that thetelevision series" rel="nofollow"> target="_blank">claiming that thehttp%3A%2F%2Fwww.manifestations ofPrime Minister ofinfluenced by theclass="clearfix">/div>\r\n</div>\r\n\r\nthree-dimensionalChurch of Englandof North Carolinasquare kilometres.addEventListenerdistinct from thecommonly known asPhonetic Alphabetdeclared that thecontrolled by theBenjamin Franklinrole-playing gamethe University ofin Western Europepersonal computerProject Gutenbergregardless of thehas been proposedtogether with the></li><li class="in some countriesmin.js"><\/script>of the populationofficial language<img src="images/identified by thenatural resourcesclassification ofcan be consideredquantum mechanicsNevertheless, themillion years ago</body>\r\n</html>\rN\x15N;N;N7N=N9N:N,\ntake advantage ofand, according toattributed to theMicrosoft Windowsthe first centuryunder the controldiv class="headershortly after thenotable exceptiontens of thousandsseveral differentaround the world.reaching militaryisolated from theopposition to thethe Old TestamentAfrican Americansinserted into theseparate from themetropolitan areamakes it possibleacknowledged thatarguably the mosttype="text/css">\nthe InternationalAccording to the pe="text/css" />\ncoincide with thetwo-thirds of theDuring this time,during the periodannounced that hethe internationaland more recentlybelieved that theconsciousness andformerly known assurrounded by thefirst appeared inoccasionally usedposition:absolute;" target="_blank" position:relative;text-align:center;jax/libs/jquery/1.background-color:#type="application/anguage" content="<meta http-equiv="Privacy Policy</a>e("%3Cscript src=\'" target="_blank">On the other hand,.jpg|thumb|right|2</div><div class="<div style="float:nineteenth century</body>\r\n</html>\r\n<img src="http://s;text-align:centerfont-weight: bold; According to the difference between" frameborder="0" " style="position:link href="http://html4/loose.dtd">\nduring this period</td></tr></table>closely related tofor the first time;font-weight:bold;input type="text" <span style="font-onreadystatechange\t<div class="cleardocument.location. For example, the a wide variety of <!DOCTYPE html>\r\n<&nbsp;&nbsp;&nbsp;"><a href="http://style="float:left;concerned with the=http%3A%2F%2Fwww.in popular culturetype="text/css" />it is possible to Harvard Universitytylesheet" href="/the main characterOxford University name="keywords" cstyle="text-align:the United Kingdomfederal government<div style="margin depending on the description of the<div class="header.min.js"><\/script>destruction of theslightly differentin accordance withtelecommunicationsindicates that theshortly thereafterespecially in the European countriesHowever, there aresrc="http://staticsuggested that the" src="http://www.a large number of Telecommunications" rel="nofollow" tHoly Roman Emperoralmost exclusively" border="0" alt="Secretary of Stateculminating in theCIA World Factbookthe most importantanniversary of thestyle="background-<li><em><a href="/the Atlantic Oceanstrictly speaking,shortly before thedifferent types ofthe Ottoman Empire><img src="http://An Introduction toconsequence of thedeparture from theConfederate Statesindigenous peoplesProceedings of theinformation on thetheories have beeninvolvement in thedivided into threeadjacent countriesis responsible fordissolution of thecollaboration withwidely regarded ashis contemporariesfounding member ofDominican Republicgenerally acceptedthe possibility ofare also availableunder constructionrestoration of thethe general publicis almost entirelypasses through thehas been suggestedcomputer and videoGermanic languages according to the different from theshortly afterwardshref="https://www.recent developmentBoard of Directors<div class="search| <a href="http://In particular, theMultiple footnotesor other substancethousands of yearstranslation of the</div>\r\n</div>\r\n\r\n<a href="index.phpwas established inmin.js"><\/script>\nparticipate in thea strong influencestyle="margin-top:represented by thegraduated from theTraditionally, theElement("script");However, since the/div>\n</div>\n<div left; margin-left:protection against0; vertical-align:Unfortunately, thetype="image/x-icon/div>\n<div class=" class="clearfix"><div class="footer\t\t</div>\n\t\t</div>\nthe motion pictureP\x11Q\nP;P3P0Q\0Q\x01P:P8P1Q\nP;P3P0Q\0Q\x01P:P8P$P5P4P5Q\0P0Q\x06P8P8P=P5Q\x01P:P>P;Q\fP:P>Q\x01P>P>P1Q\tP5P=P8P5Q\x01P>P>P1Q\tP5P=P8Q\x0fP?Q\0P>P3Q\0P0P<P<Q\vP\x1eQ\x02P?Q\0P0P2P8Q\x02Q\fP1P5Q\x01P?P;P0Q\x02P=P>P<P0Q\x02P5Q\0P8P0P;Q\vP?P>P7P2P>P;Q\x0fP5Q\x02P?P>Q\x01P;P5P4P=P8P5Q\0P0P7P;P8Q\x07P=Q\vQ\x05P?Q\0P>P4Q\x03P:Q\x06P8P8P?Q\0P>P3Q\0P0P<P<P0P?P>P;P=P>Q\x01Q\x02Q\fQ\x0eP=P0Q\x05P>P4P8Q\x02Q\x01Q\x0fP8P7P1Q\0P0P=P=P>P5P=P0Q\x01P5P;P5P=P8Q\x0fP8P7P<P5P=P5P=P8Q\x0fP:P0Q\x02P5P3P>Q\0P8P8P\x10P;P5P:Q\x01P0P=P4Q\0`$&`%\r`$5`$>`$0`$>`$.`%\b`$(`%\x01`$\x05`$2`$*`%\r`$0`$&`$>`$(`$-`$>`$0`$$`%\0`$/`$\x05`$(`%\x01`$&`%\x07`$6`$9`$?`$(`%\r`$&`%\0`$\x07`$\x02`$!`$?`$/`$>`$&`$?`$2`%\r`$2`%\0`$\x05`$\'`$?`$\x15`$>`$0`$5`%\0`$!`$?`$/`%\v`$\x1a`$?`$\x1f`%\r`$ `%\x07`$8`$.`$>`$\x1a`$>`$0`$\x1c`$\x02`$\x15`%\r`$6`$(`$&`%\x01`$(`$?`$/`$>`$*`%\r`$0`$/`%\v`$\x17`$\x05`$(`%\x01`$8`$>`$0`$\x11`$(`$2`$>`$\x07`$(`$*`$>`$0`%\r`$\x1f`%\0`$6`$0`%\r`$$`%\v`$\x02`$2`%\v`$\x15`$8`$-`$>`$+`$<`%\r`$2`%\b`$6`$6`$0`%\r`$$`%\x07`$\x02`$*`%\r`$0`$&`%\x07`$6`$*`%\r`$2`%\x07`$/`$0`$\x15`%\x07`$\x02`$&`%\r`$0`$8`%\r`$%`$?`$$`$?`$\t`$$`%\r`$*`$>`$&`$\t`$(`%\r`$9`%\x07`$\x02`$\x1a`$?`$\x1f`%\r`$ `$>`$/`$>`$$`%\r`$0`$>`$\x1c`%\r`$/`$>`$&`$>`$*`%\x01`$0`$>`$(`%\x07`$\x1c`%\v`$!`$<`%\x07`$\x02`$\x05`$(`%\x01`$5`$>`$&`$6`%\r`$0`%\x07`$#`%\0`$6`$?`$\x15`%\r`$7`$>`$8`$0`$\x15`$>`$0`%\0`$8`$\x02`$\x17`%\r`$0`$9`$*`$0`$?`$#`$>`$.`$,`%\r`$0`$>`$\x02`$!`$,`$\x1a`%\r`$\x1a`%\v`$\x02`$\t`$*`$2`$,`%\r`$\'`$.`$\x02`$$`%\r`$0`%\0`$8`$\x02`$*`$0`%\r`$\x15`$\t`$.`%\r`$.`%\0`$&`$.`$>`$\'`%\r`$/`$.`$8`$9`$>`$/`$$`$>`$6`$,`%\r`$&`%\v`$\x02`$.`%\0`$!`$?`$/`$>`$\x06`$\b`$*`%\0`$\x0f`$2`$.`%\v`$,`$>`$\x07`$2`$8`$\x02`$\x16`%\r`$/`$>`$\x06`$*`$0`%\x07`$6`$(`$\x05`$(`%\x01`$,`$\x02`$\'`$,`$>`$\x1c`$<`$>`$0`$(`$5`%\0`$(`$$`$.`$*`%\r`$0`$.`%\x01`$\x16`$*`%\r`$0`$6`%\r`$(`$*`$0`$?`$5`$>`$0`$(`%\x01`$\x15`$8`$>`$(`$8`$.`$0`%\r`$%`$(`$\x06`$/`%\v`$\x1c`$?`$$`$8`%\v`$.`$5`$>`$0X\'Y\x04Y\x05X4X\'X1Y\x03X\'X*X\'Y\x04Y\x05Y\x06X*X/Y\nX\'X*X\'Y\x04Y\x03Y\x05X(Y\nY\bX*X1X\'Y\x04Y\x05X4X\'Y\x07X/X\'X*X9X/X/X\'Y\x04X2Y\bX\'X1X9X/X/X\'Y\x04X1X/Y\bX/X\'Y\x04X%X3Y\x04X\'Y\x05Y\nX)X\'Y\x04Y\x01Y\bX*Y\bX4Y\bX(X\'Y\x04Y\x05X3X\'X(Y\x02X\'X*X\'Y\x04Y\x05X9Y\x04Y\bY\x05X\'X*X\'Y\x04Y\x05X3Y\x04X3Y\x04X\'X*X\'Y\x04X,X1X\'Y\x01Y\nY\x03X3X\'Y\x04X\'X3Y\x04X\'Y\x05Y\nX)X\'Y\x04X\'X*X5X\'Y\x04X\'X*keywords" content="w3.org/1999/xhtml"><a target="_blank" text/html; charset=" target="_blank"><table cellpadding="autocomplete="off" text-align: center;to last version by background-color: #" href="http://www./div></div><div id=<a href="#" class=""><img src="http://cript" src="http://\n<script language="//EN" "http://www.wencodeURIComponent(" href="javascript:<div class="contentdocument.write(\'<scposition: absolute;script src="http:// style="margin-top:.min.js"><\/script>\n</div>\n<div class="w3.org/1999/xhtml" \n\r\n</body>\r\n</html>distinction between/" target="_blank"><link href="http://encoding="utf-8"?>\nw.addEventListener?action="http://www.icon" href="http:// style="background:type="text/css" />\nmeta property="og:t<input type="text" style="text-align:the development of tylesheet" type="tehtml; charset=utf-8is considered to betable width="100%" In addition to the contributed to the differences betweendevelopment of the It is important to <\/script>\n\n<script style="font-size:1></span><span id=gbLibrary of Congress<img src="http://imEnglish translationAcademy of Sciencesdiv style="display:construction of the.getElementById(id)in conjunction withElement(\'script\'); <meta property="og:P\x11Q\nP;P3P0Q\0Q\x01P:P8\n type="text" name=">Privacy Policy</a>administered by theenableSingleRequeststyle=&quot;margin:</div></div></div><><img src="http://i style=&quot;float:referred to as the total population ofin Washington, D.C. style="background-among other things,organization of theparticipated in thethe introduction ofidentified with thefictional character Oxford University misunderstanding ofThere are, however,stylesheet" href="/Columbia Universityexpanded to includeusually referred toindicating that thehave suggested thataffiliated with thecorrelation betweennumber of different></td></tr></table>Republic of Ireland\n<\/script>\n<script under the influencecontribution to theOfficial website ofheadquarters of thecentered around theimplications of thehave been developedFederal Republic ofbecame increasinglycontinuation of theNote, however, thatsimilar to that of capabilities of theaccordance with theparticipants in thefurther developmentunder the directionis often consideredhis younger brother</td></tr></table><a http-equiv="X-UA-physical propertiesof British Columbiahas been criticized(with the exceptionquestions about thepassing through the0" cellpadding="0" thousands of peopleredirects here. Forhave children under%3E%3C/script%3E"));<a href="http://www.<li><a href="http://site_name" content="text-decoration:nonestyle="display: none<meta http-equiv="X-new Date().getTime() type="image/x-icon"</span><span class="language="javascriptwindow.location.href<a href="javascript:--\x3e\r\n<script type="t<a href=\'http://www.hortcut icon" href="</div>\r\n<div class="<script src="http://" rel="stylesheet" t</div>\n<script type=/a> <a href="http:// allowTransparency="X-UA-Compatible" conrelationship between\n<\/script>\r\n<script </a></li></ul></div>associated with the programming language</a><a href="http://</a></li><li class="form action="http://<div style="display:type="text" name="q"<table width="100%" background-position:" border="0" width="rel="shortcut icon" h6><ul><li><a href=" <meta http-equiv="css" media="screen" responsible for the " type="application/" style="background-html; charset=utf-8" allowtransparency="stylesheet" type="te\r\n<meta http-equiv="></span><span class="0" cellspacing="0">;\n<\/script>\n<script sometimes called thedoes not necessarilyFor more informationat the beginning of <!DOCTYPE html><htmlparticularly in the type="hidden" name="javascript:void(0);"effectiveness of the autocomplete="off" generally considered><input type="text" "><\/script>\r\n<scriptthroughout the worldcommon misconceptionassociation with the</div>\n</div>\n<div cduring his lifetime,corresponding to thetype="image/x-icon" an increasing numberdiplomatic relationsare often consideredmeta charset="utf-8" <input type="text" examples include the"><img src="http://iparticipation in thethe establishment of\n</div>\n<div class="&amp;nbsp;&amp;nbsp;to determine whetherquite different frommarked the beginningdistance between thecontributions to theconflict between thewidely considered towas one of the firstwith varying degreeshave speculated that(document.getElementparticipating in theoriginally developedeta charset="utf-8"> type="text/css" />\ninterchangeably withmore closely relatedsocial and politicalthat would otherwiseperpendicular to thestyle type="text/csstype="submit" name="families residing indeveloping countriescomputer programmingeconomic developmentdetermination of thefor more informationon several occasionsportuguC*s (Europeu)P#P:Q\0P0Q\x17P=Q\x01Q\fP:P0Q\x03P:Q\0P0Q\x17P=Q\x01Q\fP:P0P P>Q\x01Q\x01P8P9Q\x01P:P>P9P<P0Q\x02P5Q\0P8P0P;P>P2P8P=Q\x04P>Q\0P<P0Q\x06P8P8Q\x03P?Q\0P0P2P;P5P=P8Q\x0fP=P5P>P1Q\x05P>P4P8P<P>P8P=Q\x04P>Q\0P<P0Q\x06P8Q\x0fP\x18P=Q\x04P>Q\0P<P0Q\x06P8Q\x0fP P5Q\x01P?Q\x03P1P;P8P:P8P:P>P;P8Q\x07P5Q\x01Q\x02P2P>P8P=Q\x04P>Q\0P<P0Q\x06P8Q\x0eQ\x02P5Q\0Q\0P8Q\x02P>Q\0P8P8P4P>Q\x01Q\x02P0Q\x02P>Q\x07P=P>X\'Y\x04Y\x05X*Y\bX\'X,X/Y\bY\x06X\'Y\x04X\'X4X*X1X\'Y\x03X\'X*X\'Y\x04X\'Y\x02X*X1X\'X-X\'X*html; charset=UTF-8" setTimeout(function()display:inline-block;<input type="submit" type = \'text/javascri<img src="http://www." "http://www.w3.org/shortcut icon" href="" autocomplete="off" </a></div><div class=</a></li>\n<li class="css" type="text/css" <form action="http://xt/css" href="http://link rel="alternate" \r\n<script type="text/ onclick="javascript:(new Date).getTime()}height="1" width="1" People\'s Republic of <a href="http://www.text-decoration:underthe beginning of the </div>\n</div>\n</div>\nestablishment of the </div></div></div></d#viewport{min-height:\n<script src="http://option><option value=often referred to as /option>\n<option valu<!DOCTYPE html>\n\x3c!--[International Airport>\n<a href="http://www</a><a href="http://w`8 `82`8)`82`9\x04`8\x17`8"a\x03%a\x03\x10a\x03 a\x03\x17a\x03#a\x03\x1aa\x03\x18f-#i+\x14d8-f\x16\x07 (g9\x01i+\x14)`$(`$?`$0`%\r`$&`%\x07`$6`$!`$>`$\t`$(`$2`%\v`$!`$\x15`%\r`$7`%\x07`$$`%\r`$0`$\x1c`$>`$(`$\x15`$>`$0`%\0`$8`$\x02`$,`$\x02`$\'`$?`$$`$8`%\r`$%`$>`$*`$(`$>`$8`%\r`$5`%\0`$\x15`$>`$0`$8`$\x02`$8`%\r`$\x15`$0`$#`$8`$>`$.`$\x17`%\r`$0`%\0`$\x1a`$?`$\x1f`%\r`$ `%\v`$\x02`$5`$?`$\x1c`%\r`$\x1e`$>`$(`$\x05`$.`%\x07`$0`$?`$\x15`$>`$5`$?`$-`$?`$(`%\r`$(`$\x17`$>`$!`$?`$/`$>`$\x01`$\x15`%\r`$/`%\v`$\x02`$\x15`$?`$8`%\x01`$0`$\x15`%\r`$7`$>`$*`$9`%\x01`$\x01`$\x1a`$$`%\0`$*`%\r`$0`$,`$\x02`$\'`$(`$\x1f`$?`$*`%\r`$*`$#`%\0`$\x15`%\r`$0`$?`$\x15`%\x07`$\x1f`$*`%\r`$0`$>`$0`$\x02`$-`$*`%\r`$0`$>`$*`%\r`$$`$.`$>`$2`$?`$\x15`%\v`$\x02`$0`$+`$<`%\r`$$`$>`$0`$(`$?`$0`%\r`$.`$>`$#`$2`$?`$.`$?`$\x1f`%\x07`$!description" content="document.location.prot.getElementsByTagName(<!DOCTYPE html>\n<html <meta charset="utf-8">:url" content="http://.css" rel="stylesheet"style type="text/css">type="text/css" href="w3.org/1999/xhtml" xmltype="text/javascript" method="get" action="link rel="stylesheet" = document.getElementtype="image/x-icon" />cellpadding="0" cellsp.css" type="text/css" </a></li><li><a href="" width="1" height="1""><a href="http://www.style="display:none;">alternate" type="appli-//W3C//DTD XHTML 1.0 ellspacing="0" cellpad type="hidden" value="/a>&nbsp;<span role="s\n<input type="hidden" language="JavaScript" document.getElementsBg="0" cellspacing="0" ype="text/css" media="type=\'text/javascript\'with the exception of ype="text/css" rel="st height="1" width="1" =\'+encodeURIComponent(<link rel="alternate" \nbody, tr, input, textmeta name="robots" conmethod="post" action=">\n<a href="http://www.css" rel="stylesheet" </div></div><div classlanguage="javascript">aria-hidden="true">B7<ript" type="text/javasl=0;})();\n(function(){background-image: url(/a></li><li><a href="h\t\t<li><a href="http://ator" aria-hidden="tru> <a href="http://www.language="javascript" /option>\n<option value/div></div><div class=rator" aria-hidden="tre=(new Date).getTime()portuguC*s (do Brasil)P>Q\0P3P0P=P8P7P0Q\x06P8P8P2P>P7P<P>P6P=P>Q\x01Q\x02Q\fP>P1Q\0P0P7P>P2P0P=P8Q\x0fQ\0P5P3P8Q\x01Q\x02Q\0P0Q\x06P8P8P2P>P7P<P>P6P=P>Q\x01Q\x02P8P>P1Q\x0fP7P0Q\x02P5P;Q\fP=P0<!DOCTYPE html PUBLIC "nt-Type" content="text/<meta http-equiv="Conteransitional//EN" "http:<html xmlns="http://www-//W3C//DTD XHTML 1.0 TDTD/xhtml1-transitional//www.w3.org/TR/xhtml1/pe = \'text/javascript\';<meta name="descriptionparentNode.insertBefore<input type="hidden" najs" type="text/javascri(document).ready(functiscript type="text/javasimage" content="http://UA-Compatible" content=tml; charset=utf-8" />\nlink rel="shortcut icon<link rel="stylesheet" <\/script>\n<script type== document.createElemen<a target="_blank" href= document.getElementsBinput type="text" name=a.type = \'text/javascrinput type="hidden" namehtml; charset=utf-8" />dtd">\n<html xmlns="http-//W3C//DTD HTML 4.01 TentsByTagName(\'script\')input type="hidden" nam<script type="text/javas" style="display:none;">document.getElementById(=document.createElement(\' type=\'text/javascript\'input type="text" name="d.getElementsByTagName(snical" href="http://www.C//DTD HTML 4.01 Transit<style type="text/css">\n\n<style type="text/css">ional.dtd">\n<html xmlns=http-equiv="Content-Typeding="0" cellspacing="0"html; charset=utf-8" />\n style="display:none;"><<li><a href="http://www. type=\'text/javascript\'>P4P5Q\x0fQ\x02P5P;Q\fP=P>Q\x01Q\x02P8Q\x01P>P>Q\x02P2P5Q\x02Q\x01Q\x02P2P8P8P?Q\0P>P8P7P2P>P4Q\x01Q\x02P2P0P1P5P7P>P?P0Q\x01P=P>Q\x01Q\x02P8`$*`%\x01`$8`%\r`$$`$?`$\x15`$>`$\x15`$>`$\x02`$\x17`%\r`$0`%\x07`$8`$\t`$(`%\r`$9`%\v`$\x02`$(`%\x07`$5`$?`$\'`$>`$(`$8`$-`$>`$+`$?`$\x15`%\r`$8`$?`$\x02`$\x17`$8`%\x01`$0`$\x15`%\r`$7`$?`$$`$\x15`%\t`$*`%\0`$0`$>`$\x07`$\x1f`$5`$?`$\x1c`%\r`$\x1e`$>`$*`$(`$\x15`$>`$0`%\r`$0`$5`$>`$\b`$8`$\x15`%\r`$0`$?`$/`$$`$>',"\u06f7%\u018c'T%\x85'W%\xd7%O%g%\xa6&\u0193%\u01e5&>&*&'&^&\x88\u0178\u0c3e&\u01ad&\u0192&)&^&%&'&\x82&P&1&\xb1&3&]&m&u&E&t&C&\xcf&V&V&/&>&6&\u0f76\u177co&p&@&E&M&P&x&@&F&e&\xcc&7&:&(&D&0&C&)&.&F&-&1&(&L&F&1\u025e*\u03ea\u21f3&\u1372&K&;&)&E&H&P&0&?&9&V&\x81&-&v&a&,&E&)&?&=&'&'&B&\u0d2e&\u0503&\u0316*&*8&%&%&&&%,)&\x9a&>&\x86&7&]&F&2&>&J&6&n&2&%&?&\x8e&2&6&J&g&-&0&,&*&J&*&O&)&6&(&<&B&N&.&P&@&2&.&W&M&%\u053c\x84(,(<&,&\u03da&\u18c7&-&,(%&(&%&(\u013b0&X&D&\x81&j&'&J&(&.&B&3&Z&R&h&3&E&E&<\xc6-\u0360\u1ef3&%8?&@&,&Z&@&0&J&,&^&x&_&6&C&6&C\u072c\u2a25&f&-&-&-&-&,&J&2&8&z&8&C&Y&8&-&d&\u1e78\xcc-&7&1&F&7&t&W&7&I&.&.&^&=\u0f9c\u19d3&8(>&/&/&\u077b')'\u1065')'%@/&0&%\u043e\u09c0*&*@&C\u053d\u05d4\u0274\u05eb4\u0dd7\u071a\u04d16\u0d84&/\u0178\u0303Z&*%\u0246\u03ff&\u0134&1\xa8\u04b4\u0174"),L=he,function(t){var a=new H;i(a,new e(t));for(var o=0,r=[];d=new Int8Array(16384),r.push(d),a.oe=d,a.re=0,a.ne=16384,a.ae=0,k(a),o+=a.ae,!(a.ae<16384););n(a);for(var s=new Int8Array(o),l=0,c=0;c<r.length;++c){var d=r[c],h=R(o,l+16384)-l;h<16384?s.set(d.subarray(0,h),l):s.set(d,l),l+=h}return s}}(); \ No newline at end of file
diff --git a/js/decode_test.js b/js/decode_test.js
index 0c18f44..78ee18b 100644..100755
--- a/js/decode_test.js
+++ b/js/decode_test.js
@@ -2,20 +2,17 @@ goog.require('goog.testing.asserts');
goog.require('goog.testing.jsunit');
/**
- * @param {!Int8Array} bytes
+ * @param {string} bytes
* @return {string}
*/
function bytesToString(bytes) {
return String.fromCharCode.apply(null, new Uint16Array(bytes));
}
-function testMetadata() {
- assertEquals("", bytesToString(BrotliDecode(Int8Array.from([1, 11, 0, 42, 3]))));
-}
-
function testEmpty() {
assertEquals("", bytesToString(BrotliDecode(Int8Array.from([6]))));
assertEquals("", bytesToString(BrotliDecode(Int8Array.from([0x81, 1]))));
+ assertEquals("", bytesToString(BrotliDecode(Int8Array.from([1, 11, 0, 42, 3]))));
}
function testBaseDictWord() {
@@ -23,7 +20,6 @@ function testBaseDictWord() {
0x1b, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe3, 0xb4, 0x0d, 0x00, 0x00,
0x07, 0x5b, 0x26, 0x31, 0x40, 0x02, 0x00, 0xe0, 0x4e, 0x1b, 0x41, 0x02
]);
- /** @type {!Int8Array} */
var output = BrotliDecode(input);
assertEquals("time", bytesToString(output));
}
@@ -34,7 +30,6 @@ function testBlockCountMessage() {
0x65, 0xe1, 0xfc, 0xfd, 0x22, 0x2c, 0xc4, 0x00, 0x00, 0x38, 0xd8, 0x32,
0x89, 0x01, 0x12, 0x00, 0x00, 0x77, 0xda, 0x04, 0x10, 0x42, 0x00, 0x00, 0x00
]);
- /** @type {!Int8Array} */
var output = BrotliDecode(input);
assertEquals("aabbaaaaabab", bytesToString(output));
}
@@ -47,7 +42,6 @@ function testCompressedUncompressedShortCompressedSmallWindow() {
0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x4e, 0xdb, 0x00, 0x00, 0x70, 0xb0,
0x65, 0x12, 0x03, 0x24, 0x00, 0x00, 0xee, 0xb4, 0x11, 0x24, 0x00
]);
- /** @type {!Int8Array} */
var output = BrotliDecode(input);
assertEquals(
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +
@@ -73,7 +67,6 @@ function testIntactDistanceRingBuffer0() {
0x07, 0x5b, 0x26, 0x31, 0x40, 0x02, 0x00, 0xe0, 0x4e, 0x1b, 0xa1, 0x80,
0x20, 0x00
]);
- /** @type {!Int8Array} */
var output = BrotliDecode(input);
assertEquals("himselfself", bytesToString(output));
}
diff --git a/js/polyfill.js b/js/polyfill.js
index 707a89a..707a89a 100644..100755
--- a/js/polyfill.js
+++ b/js/polyfill.js
diff --git a/python/tests/compressor_test.py b/python/tests/compressor_test.py
index 2d47919..22e3bc5 100644
--- a/python/tests/compressor_test.py
+++ b/python/tests/compressor_test.py
@@ -17,9 +17,6 @@ class _TestCompressor(object):
CHUNK_SIZE = 2048
- def tearDown(self):
- self.compressor = None
-
def _check_decompression(self, test_data):
# Write decompression to temp file and verify it matches the original.
temp_uncompressed = _test_utils.get_temp_uncompressed_name(test_data)
diff --git a/python/tests/decompressor_test.py b/python/tests/decompressor_test.py
index 99667bc..afa127f 100644
--- a/python/tests/decompressor_test.py
+++ b/python/tests/decompressor_test.py
@@ -21,9 +21,6 @@ class TestDecompressor(_test_utils.TestCase):
def setUp(self):
self.decompressor = brotli.Decompressor()
- def tearDown(self):
- self.decompressor = None
-
def _check_decompression(self, test_data):
# Verify decompression matches the original.
temp_uncompressed = _test_utils.get_temp_uncompressed_name(test_data)
diff --git a/research/BUILD b/research/BUILD
deleted file mode 100755
index 7b7d81b..0000000
--- a/research/BUILD
+++ /dev/null
@@ -1,44 +0,0 @@
-# Description: brotli research tools.
-
-package(default_visibility = ["//visibility:public"])
-
-licenses(["notice"]) # MIT
-
-cc_library(
- name = "dm",
- srcs = ["deorummolae.cc"],
- hdrs = [
- "deorummolae.h",
- "esaxx/sais.hxx",
- ],
-)
-
-cc_library(
- name = "durchschlag",
- srcs = ["durchschlag.cc"],
- hdrs = ["durchschlag.h"],
- deps = ["@divsufsort//:libdivsufsort"],
-)
-
-cc_library(
- name = "sieve",
- srcs = ["sieve.cc"],
- hdrs = ["sieve.h"],
-)
-
-cc_binary(
- name = "dictionary_generator",
- srcs = ["dictionary_generator.cc"],
- deps = [
- ":dm",
- ":durchschlag",
- ":sieve",
- ],
-)
-
-cc_binary(
- name = "brotli_decoder",
- srcs = ["brotli_decoder.c"],
- linkstatic = 1,
- deps = ["@org_brotli//:brotlidec"],
-)
diff --git a/research/BUILD.libdivsufsort b/research/BUILD.libdivsufsort
deleted file mode 100644
index ce60e9c..0000000
--- a/research/BUILD.libdivsufsort
+++ /dev/null
@@ -1,55 +0,0 @@
-package(
- default_visibility = ["//visibility:public"],
-)
-
-cc_library(
- name = "libdivsufsort",
- srcs = [
- "lib/divsufsort.c",
- "lib/sssort.c",
- "lib/trsort.c",
- "lib/utils.c",
- ],
- hdrs = [
- "include/config.h",
- "include/divsufsort.h",
- "include/divsufsort_private.h",
- ],
- copts = [
- "-DHAVE_CONFIG_H=1",
- ],
- includes = ["include"],
-)
-
-commom_awk_replaces = (
- "gsub(/#cmakedefine/, \"#define\"); " +
- "gsub(/@DIVSUFSORT_EXPORT@/, \"\"); " +
- "gsub(/@DIVSUFSORT_IMPORT@/, \"\"); " +
- "gsub(/@INLINE@/, \"inline\"); " +
- "gsub(/@INCFILE@/, \"#include <inttypes.h>\"); " +
- "gsub(/@SAUCHAR_TYPE@/, \"uint8_t\"); " +
- "gsub(/@SAINT32_TYPE@/, \"int32_t\"); " +
- "gsub(/@SAINT_PRId@/, \"PRId32\"); "
-)
-
-genrule(
- name = "config_h",
- srcs = ["include/config.h.cmake"],
- outs = ["include/config.h"],
- cmd = ("awk '{ " +
- "gsub(/@HAVE_IO_H 1@/, \"HAVE_IO_H 0\"); " +
- commom_awk_replaces +
- "print; }' $(<) > $(@)"),
-)
-
-genrule(
- name = "divsufsort_h",
- srcs = ["include/divsufsort.h.cmake"],
- outs = ["include/divsufsort.h"],
- cmd = ("awk '{ " +
- "gsub(/@W64BIT@/, \"\"); " +
- "gsub(/@SAINDEX_TYPE@/, \"int32_t\"); " +
- "gsub(/@SAINDEX_PRId@/, \"PRId32\"); " +
- commom_awk_replaces +
- "print; }' $(<) > $(@)"),
-)
diff --git a/research/WORKSPACE b/research/WORKSPACE
deleted file mode 100644
index bb0f8ca..0000000
--- a/research/WORKSPACE
+++ /dev/null
@@ -1,12 +0,0 @@
-workspace(name = "org_brotli_research")
-
-local_repository(
- name = "org_brotli",
- path = "..",
-)
-
-new_local_repository(
- name = "divsufsort",
- build_file = "BUILD.libdivsufsort",
- path = "libdivsufsort",
-)
diff --git a/research/brotli_decoder.c b/research/brotli_decoder.c
deleted file mode 100644
index b1d556d..0000000
--- a/research/brotli_decoder.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Copyright 2018 Google Inc. All Rights Reserved.
-
- Distributed under MIT license.
- See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include <brotli/decode.h>
-
-#define BUFFER_SIZE (1u << 20)
-
-typedef struct Context {
- FILE* fin;
- FILE* fout;
- uint8_t* input_buffer;
- uint8_t* output_buffer;
- BrotliDecoderState* decoder;
-} Context;
-
-void init(Context* ctx) {
- ctx->fin = 0;
- ctx->fout = 0;
- ctx->input_buffer = 0;
- ctx->output_buffer = 0;
- ctx->decoder = 0;
-}
-
-void cleanup(Context* ctx) {
- if (ctx->decoder) BrotliDecoderDestroyInstance(ctx->decoder);
- if (ctx->output_buffer) free(ctx->output_buffer);
- if (ctx->input_buffer) free(ctx->input_buffer);
- if (ctx->fout) fclose(ctx->fout);
- if (ctx->fin) fclose(ctx->fin);
-}
-
-void fail(Context* ctx, const char* message) {
- fprintf(stderr, "%s\n", message);
- exit(1);
-}
-
-int main(int argc, char** argv) {
- Context ctx;
- BrotliDecoderResult result = BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT;
- size_t available_in;
- const uint8_t* next_in;
- size_t available_out = BUFFER_SIZE;
- uint8_t* next_out;
- init(&ctx);
-
- ctx.fin = fdopen(STDIN_FILENO, "rb");
- if (!ctx.fin) fail(&ctx, "can't open input file");
- ctx.fout = fdopen(STDOUT_FILENO, "wb");
- if (!ctx.fout) fail(&ctx, "can't open output file");
- ctx.input_buffer = (uint8_t*)malloc(BUFFER_SIZE);
- if (!ctx.input_buffer) fail(&ctx, "out of memory / input buffer");
- ctx.output_buffer = (uint8_t*)malloc(BUFFER_SIZE);
- if (!ctx.output_buffer) fail(&ctx, "out of memory / output buffer");
- ctx.decoder = BrotliDecoderCreateInstance(0, 0, 0);
- if (!ctx.decoder) fail(&ctx, "out of memory / decoder");
- BrotliDecoderSetParameter(ctx.decoder, BROTLI_DECODER_PARAM_LARGE_WINDOW, 1);
-
- next_out = ctx.output_buffer;
- while (1) {
- if (result == BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT) {
- if (feof(ctx.fin)) break;
- available_in = fread(ctx.input_buffer, 1, BUFFER_SIZE, ctx.fin);
- next_in = ctx.input_buffer;
- if (ferror(ctx.fin)) break;
- } else if (result == BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT) {
- fwrite(ctx.output_buffer, 1, BUFFER_SIZE, ctx.fout);
- if (ferror(ctx.fout)) break;
- available_out = BUFFER_SIZE;
- next_out = ctx.output_buffer;
- } else {
- break;
- }
- result = BrotliDecoderDecompressStream(
- ctx.decoder, &available_in, &next_in, &available_out, &next_out, 0);
- }
- if (next_out != ctx.output_buffer) {
- fwrite(ctx.output_buffer, 1, next_out - ctx.output_buffer, ctx.fout);
- }
- if ((result == BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT) || ferror(ctx.fout)) {
- fail(&ctx, "failed to write output");
- } else if (result != BROTLI_DECODER_RESULT_SUCCESS) {
- fail(&ctx, "corrupt input");
- }
- cleanup(&ctx);
- return 0;
-}
diff --git a/research/brotlidump.py b/research/brotlidump.py
index 7018934..a625368 100644
--- a/research/brotlidump.py
+++ b/research/brotlidump.py
@@ -1467,17 +1467,16 @@ class Layout:
#we use it for display until now; definition comes below
lengthCode = LengthAlphabet('#'+alphabet.name)
lengthIter = iter(lengths)
- lengthsLeft = len(lengths)
- while total<32 and lengthsLeft>0:
- lengthsLeft -= 1
+ while total<32:
newSymbol = next(lengthIter)
lol.description = str(lengthCode[newSymbol])
length = self.verboseRead(lol)
if length:
codeLengths[newSymbol] = length
total += 32>>length
+ if total>=32:
+ break
if total>32: raise ValueError("Stream format")
- if len(codeLengths)==1: codeLengths[list(codeLengths.keys())[0]] = 0
#Now set the encoding of the lengthCode
lengthCode.setLength(codeLengths)
print("***** Lengths for {} will be coded as:".format(alphabet.name))
diff --git a/research/deorummolae.cc b/research/deorummolae.cc
index d15b7ee..f4cc53e 100644..100755
--- a/research/deorummolae.cc
+++ b/research/deorummolae.cc
@@ -1,7 +1,7 @@
#include "./deorummolae.h"
#include <array>
-#include <cstdio>
+#include <vector>
#include "./esaxx/sais.hxx"
@@ -15,31 +15,22 @@
/* Non tunable definitions. */
#define CHUNK_MASK (CHUNK_SIZE - 1)
-#define COVERAGE_SIZE (1 << (DM_LOG_MAX_FILES - 6))
+#define COVERAGE_SIZE (1 << (LOG_MAX_FILES - 6))
/* File coverage: every bit set to 1 denotes a file covered by an isle. */
typedef std::array<uint64_t, COVERAGE_SIZE> Coverage;
-/* Symbol of text alphabet. */
-typedef int32_t TextChar;
-
-/* Pointer to position in text. */
-typedef uint32_t TextIdx;
-
-/* SAIS sarray_type; unfortunately, must be a signed type. */
-typedef int32_t TextSaIdx;
-
-static size_t popcount(uint64_t u) {
- return static_cast<size_t>(__builtin_popcountll(u));
+static int popcount(uint64_t u) {
+ return __builtin_popcountll(u);
}
/* Condense terminators and pad file entries. */
-static void rewriteText(std::vector<TextChar>* text) {
- TextChar terminator = text->back();
- TextChar prev = terminator;
- TextIdx to = 0;
- for (TextIdx from = 0; from < text->size(); ++from) {
- TextChar next = text->at(from);
+static void rewriteText(std::vector<int>* text) {
+ int terminator = text->back();
+ int prev = terminator;
+ size_t to = 0;
+ for (size_t from = 0; from < text->size(); ++from) {
+ int next = text->at(from);
if (next < 256 || prev < 256) {
text->at(to++) = next;
if (next >= 256) terminator = next;
@@ -52,12 +43,11 @@ static void rewriteText(std::vector<TextChar>* text) {
}
/* Reenumerate terminators for smaller alphabet. */
-static void remapTerminators(std::vector<TextChar>* text,
- TextChar* next_terminator) {
- TextChar prev = -1;
- TextChar x = 256;
- for (TextIdx i = 0; i < text->size(); ++i) {
- TextChar next = text->at(i);
+static void remapTerminators(std::vector<int>* text, int* next_terminator) {
+ int prev = -1;
+ int x = 256;
+ for (size_t i = 0; i < text->size(); ++i) {
+ int next = text->at(i);
if (next < 256) { // Char.
// Do nothing.
} else if (prev < 256) { // Terminator after char.
@@ -72,15 +62,15 @@ static void remapTerminators(std::vector<TextChar>* text,
}
/* Combine all file entries; create mapping position->file. */
-static void buildFullText(std::vector<std::vector<TextChar>>* data,
- std::vector<TextChar>* full_text, std::vector<TextIdx>* file_map,
- std::vector<TextIdx>* file_offset, TextChar* next_terminator) {
+static void buildFullText(std::vector<std::vector<int>>* data,
+ std::vector<int>* full_text, std::vector<size_t>* file_map,
+ std::vector<size_t>* file_offset, int* next_terminator) {
file_map->resize(0);
file_offset->resize(0);
full_text->resize(0);
- for (TextIdx i = 0; i < data->size(); ++i) {
+ for (size_t i = 0; i < data->size(); ++i) {
file_offset->push_back(full_text->size());
- std::vector<TextChar>& file = data->at(i);
+ std::vector<int>& file = data->at(i);
rewriteText(&file);
full_text->insert(full_text->end(), file.begin(), file.end());
file_map->insert(file_map->end(), file.size() / CHUNK_SIZE, i);
@@ -90,19 +80,18 @@ static void buildFullText(std::vector<std::vector<TextChar>>* data,
/* Build longest-common-prefix based on suffix array and text.
TODO: borrowed -> unknown efficiency. */
-static void buildLcp(std::vector<TextChar>* text, std::vector<TextIdx>* sa,
- std::vector<TextIdx>* lcp, std::vector<TextIdx>* invese_sa) {
- TextIdx size = static_cast<TextIdx>(text->size());
+static void buildLcp(std::vector<int>* text, std::vector<int>* sa,
+ std::vector<int>* lcp, std::vector<int>* invese_sa) {
+ int size = static_cast<int>(text->size());
lcp->resize(size);
- TextIdx k = 0;
+ int k = 0;
lcp->at(size - 1) = 0;
- for (TextIdx i = 0; i < size; ++i) {
+ for (int i = 0; i < size; ++i) {
if (invese_sa->at(i) == size - 1) {
k = 0;
continue;
}
- // Suffix which follow i-th suffix.
- TextIdx j = sa->at(invese_sa->at(i) + 1);
+ int j = sa->at(invese_sa->at(i) + 1); // Suffix which follow i-th suffix.
while (i + k < size && j + k < size && text->at(i + k) == text->at(j + k)) {
++k;
}
@@ -115,21 +104,21 @@ static void buildLcp(std::vector<TextChar>* text, std::vector<TextIdx>* sa,
When we raise the LCP requirement, the isle sunks and smaller isles appear
instead. */
typedef struct {
- TextIdx lcp;
- TextIdx l;
- TextIdx r;
+ int lcp;
+ int l;
+ int r;
Coverage coverage;
} Isle;
/* Helper routine for `cutMatch`. */
-static void poisonData(TextIdx pos, TextIdx length,
- std::vector<std::vector<TextChar>>* data, std::vector<TextIdx>* file_map,
- std::vector<TextIdx>* file_offset, TextChar* next_terminator) {
- TextIdx f = file_map->at(pos / CHUNK_SIZE);
+static void poisonData(int pos, int length, std::vector<std::vector<int>>* data,
+ std::vector<size_t>* file_map, std::vector<size_t>* file_offset,
+ int* next_terminator) {
+ size_t f = file_map->at(pos / CHUNK_SIZE);
pos -= file_offset->at(f);
- std::vector<TextChar>& file = data->at(f);
- TextIdx l = (length == CUT_MATCH) ? CUT_MATCH : 1;
- for (TextIdx j = 0; j < l; j++, pos++) {
+ std::vector<int>& file = data->at(f);
+ int l = (length == CUT_MATCH) ? CUT_MATCH : 1;
+ for (int j = 0; j < l; j++, pos++) {
if (file[pos] >= 256) continue;
if (file[pos + 1] >= 256) {
file[pos] = file[pos + 1];
@@ -144,12 +133,12 @@ static void poisonData(TextIdx pos, TextIdx length,
/* Remove substrings of a given match from files.
Substrings are replaced with unique terminators, so next iteration SA would
not allow to cross removed areas. */
-static void cutMatch(std::vector<std::vector<TextChar>>* data, TextIdx index,
- TextIdx length, std::vector<TextIdx>* sa, std::vector<TextIdx>* lcp,
- std::vector<TextIdx>* invese_sa, TextChar* next_terminator,
- std::vector<TextIdx>* file_map, std::vector<TextIdx>* file_offset) {
+static void cutMatch(std::vector<std::vector<int>>* data, int index, int length,
+ std::vector<int>* sa, std::vector<int>* lcp, std::vector<int>* invese_sa,
+ int* next_terminator, std::vector<size_t>* file_map,
+ std::vector<size_t>* file_offset) {
while (length >= CUT_MATCH) {
- TextIdx i = index;
+ int i = index;
while (lcp->at(i) >= length) {
i++;
poisonData(
@@ -166,98 +155,81 @@ static void cutMatch(std::vector<std::vector<TextChar>>* data, TextIdx index,
}
}
-std::string DM_generate(size_t dictionary_size_limit,
- const std::vector<size_t>& sample_sizes, const uint8_t* sample_data) {
+size_t DM_generate(uint8_t* dictionary, size_t dictionary_size_limit,
+ size_t num_samples, const size_t* sample_sizes,
+ const uint8_t* sample_data) {
{
- TextIdx tmp = static_cast<TextIdx>(dictionary_size_limit);
- if ((tmp != dictionary_size_limit) || (tmp > 1u << 30)) {
- fprintf(stderr, "dictionary_size_limit is too large\n");
- return "";
+ uint64_t tmp = 0;
+ if (popcount(tmp - 1u) != 64) {
+ fprintf(stderr, "64-bit platform is required\n");
+ return 0;
}
}
/* Could use 256 + '0' for easier debugging. */
- TextChar next_terminator = 256;
+ int next_terminator = 256;
- std::string output;
- std::vector<std::vector<TextChar>> data;
+ std::vector<std::vector<int>> data;
- TextIdx offset = 0;
- size_t num_samples = sample_sizes.size();
- if (num_samples > DM_MAX_FILES) num_samples = DM_MAX_FILES;
+ size_t offset = 0;
+ if (num_samples > MAX_FILES) num_samples = MAX_FILES;
for (size_t n = 0; n < num_samples; ++n) {
- TextIdx delta = static_cast<TextIdx>(sample_sizes[n]);
- if (delta != sample_sizes[n]) {
- fprintf(stderr, "sample is too large\n");
- return "";
- }
- if (delta == 0) {
- fprintf(stderr, "0-length samples are prohibited\n");
- return "";
- }
- TextIdx next_offset = offset + delta;
- if (next_offset <= offset) {
- fprintf(stderr, "corpus is too large\n");
- return "";
- }
+ size_t next_offset = offset + sample_sizes[n];
data.push_back(
- std::vector<TextChar>(sample_data + offset, sample_data + next_offset));
+ std::vector<int>(sample_data + offset, sample_data + next_offset));
offset = next_offset;
data.back().push_back(next_terminator++);
}
/* Most arrays are allocated once, and then just resized to smaller and
smaller sizes. */
- std::vector<TextChar> full_text;
- std::vector<TextIdx> file_map;
- std::vector<TextIdx> file_offset;
- std::vector<TextIdx> sa;
- std::vector<TextIdx> invese_sa;
- std::vector<TextIdx> lcp;
+ std::vector<int> full_text;
+ std::vector<size_t> file_map;
+ std::vector<size_t> file_offset;
+ std::vector<int> sa;
+ std::vector<int> invese_sa;
+ std::vector<int> lcp;
std::vector<Isle> isles;
std::vector<char> output_data;
- TextIdx total = 0;
- TextIdx total_cost = 0;
- TextIdx best_cost;
+ size_t total = 0;
+ size_t total_cost = 0;
+ size_t best_cost;
Isle best_isle;
- size_t min_count = num_samples;
+ int min_count = num_samples;
while (true) {
- TextIdx max_match = static_cast<TextIdx>(dictionary_size_limit) - total;
+ size_t max_match = dictionary_size_limit - total;
buildFullText(&data, &full_text, &file_map, &file_offset, &next_terminator);
sa.resize(full_text.size());
- /* Hopefully, non-negative TextSaIdx is the same sa TextIdx counterpart. */
- saisxx(full_text.data(), reinterpret_cast<TextSaIdx*>(sa.data()),
- static_cast<TextChar>(full_text.size()), next_terminator);
+ saisxx(full_text.data(), sa.data(), static_cast<int>(full_text.size()),
+ next_terminator);
invese_sa.resize(full_text.size());
- for (TextIdx i = 0; i < full_text.size(); ++i) {
- invese_sa[sa[i]] = i;
- }
+ for (int i = 0; i < full_text.size(); ++i) invese_sa[sa[i]] = i;
buildLcp(&full_text, &sa, &lcp, &invese_sa);
/* Do not rebuild SA/LCP, just use different selection. */
- retry:
+retry:
best_cost = 0;
best_isle = {0, 0, 0, {{0}}};
isles.resize(0);
isles.push_back(best_isle);
- for (TextIdx i = 0; i < lcp.size(); ++i) {
- TextIdx l = i;
+ for (int i = 0; i < static_cast<int>(lcp.size()); ++i) {
+ int l = i;
Coverage cov = {{0}};
- size_t f = file_map[sa[i] / CHUNK_SIZE];
- cov[f >> 6] = (static_cast<uint64_t>(1)) << (f & 63);
+ int f = file_map[sa[i] / CHUNK_SIZE];
+ cov[f >> 6] = ((uint64_t)1) << (f & 63);
while (lcp[i] < isles.back().lcp) {
Isle& top = isles.back();
top.r = i;
l = top.l;
for (size_t x = 0; x < cov.size(); ++x) cov[x] |= top.coverage[x];
- size_t count = 0;
+ int count = 0;
for (size_t x = 0; x < cov.size(); ++x) count += popcount(cov[x]);
- TextIdx effective_lcp = top.lcp;
+ int effective_lcp = top.lcp;
/* Restrict (last) dictionary entry length. */
if (effective_lcp > max_match) effective_lcp = max_match;
- TextIdx cost = count * effective_lcp;
+ int cost = count * effective_lcp;
if (cost > best_cost && count >= min_count &&
effective_lcp >= MIN_MATCH) {
best_cost = cost;
@@ -280,23 +252,25 @@ std::string DM_generate(size_t dictionary_size_limit,
if (best_cost == 0 || best_isle.lcp < MIN_MATCH) {
if (min_count >= 8) {
min_count = (min_count * 7) / 8;
- fprintf(stderr, "Retry: min_count=%zu\n", min_count);
+ fprintf(stderr, "Retry: min_count=%d\n", min_count);
goto retry;
}
break;
}
/* Save the entry. */
- fprintf(stderr, "Savings: %d+%d, dictionary: %d+%d\n",
- total_cost, best_cost, total, best_isle.lcp);
- int* piece = &full_text[sa[best_isle.l]];
- output.insert(output.end(), piece, piece + best_isle.lcp);
+ fprintf(stderr,
+ "Savings: %zu+%zu, dictionary: %zu+%d\n",
+ total_cost, best_cost, total, best_isle.lcp);
+ for (size_t i = 0; i < best_isle.lcp; ++i) {
+ dictionary[total + i] =
+ static_cast<uint8_t>(full_text[sa[best_isle.l] + i]);
+ }
total += best_isle.lcp;
total_cost += best_cost;
- cutMatch(&data, best_isle.l, best_isle.lcp, &sa, &lcp, &invese_sa,
- &next_terminator, &file_map, &file_offset);
+ cutMatch(&data, best_isle.l, best_isle.lcp, &sa, &lcp,
+ &invese_sa, &next_terminator, &file_map, &file_offset);
if (total >= dictionary_size_limit) break;
}
-
- return output;
+ return total;
}
diff --git a/research/deorummolae.h b/research/deorummolae.h
index 5815097..f37015c 100644..100755
--- a/research/deorummolae.h
+++ b/research/deorummolae.h
@@ -1,26 +1,27 @@
#ifndef BROTLI_RESEARCH_DEORUMMOLAE_H_
#define BROTLI_RESEARCH_DEORUMMOLAE_H_
-#include <cstddef>
-#include <cstdint>
-#include <string>
-#include <vector>
+#include <stddef.h>
+#include <stdint.h>
/* log2(maximal number of files). Value 6 provides some speedups. */
-#define DM_LOG_MAX_FILES 6
+#define LOG_MAX_FILES 6
/* Non tunable definitions. */
-#define DM_MAX_FILES (1 << DM_LOG_MAX_FILES)
+#define MAX_FILES (1 << LOG_MAX_FILES)
/**
* Generate a dictionary for given samples.
*
+ * @param dictionary storage for generated dictionary
* @param dictionary_size_limit maximal dictionary size
- * @param sample_sizes vector with sample sizes
+ * @param num_samples number of samples
+ * @param sample_sizes array with sample sizes
* @param sample_data concatenated samples
- * @return generated dictionary
+ * @return generated dictionary size
*/
-std::string DM_generate(size_t dictionary_size_limit,
- const std::vector<size_t>& sample_sizes, const uint8_t* sample_data);
+size_t DM_generate(uint8_t* dictionary, size_t dictionary_size_limit,
+ size_t num_samples, const size_t* sample_sizes,
+ const uint8_t* sample_data);
#endif // BROTLI_RESEARCH_DEORUMMOLAE_H_
diff --git a/research/dictionary_generator.cc b/research/dictionary_generator.cc
deleted file mode 100755
index 00cfaba..0000000
--- a/research/dictionary_generator.cc
+++ /dev/null
@@ -1,232 +0,0 @@
-#include <cstddef>
-#include <cstdio>
-#include <cstring>
-#include <fstream>
-#include <vector>
-
-#include "./deorummolae.h"
-#include "./durchschlag.h"
-#include "./sieve.h"
-
-#define METHOD_DM 0
-#define METHOD_SIEVE 1
-#define METHOD_DURCHSCHLAG 2
-#define METHOD_DISTILL 3
-#define METHOD_PURIFY 4
-
-static size_t readInt(const char* str) {
- size_t result = 0;
- if (str[0] == 0 || str[0] == '0') {
- return 0;
- }
- for (size_t i = 0; i < 13; ++i) {
- if (str[i] == 0) {
- return result;
- }
- if (str[i] == 'k' || str[i] == 'K') {
- if ((str[i + 1] == 0) && ((result << 10) > result)) {
- return result << 10;
- }
- return 0;
- }
- if (str[i] == 'm' || str[i] == 'M') {
- if ((str[i + 1] == 0) && ((result << 20) > result)) {
- return result << 20;
- }
- return 0;
- }
- if (str[i] < '0' || str[i] > '9') {
- return 0;
- }
- size_t next = (10 * result) + (str[i] - '0');
- if (next <= result) {
- return 0;
- }
- result = next;
- }
- return 0;
-}
-
-static std::string readFile(const std::string& path) {
- std::ifstream file(path);
- std::string content(
- (std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
- return content;
-}
-
-static void writeFile(const char* file, const std::string& content) {
- std::ofstream outfile(file, std::ofstream::binary);
- outfile.write(content.c_str(), static_cast<std::streamsize>(content.size()));
- outfile.close();
-}
-
-static void writeSamples(char const* argv[], const std::vector<int>& pathArgs,
- const std::vector<size_t>& sizes, const uint8_t* data) {
- size_t offset = 0;
- for (size_t i = 0; i < pathArgs.size(); ++i) {
- int j = pathArgs[i];
- const char* file = argv[j];
- size_t sampleSize = sizes[i];
- std::ofstream outfile(file, std::ofstream::binary);
- outfile.write(reinterpret_cast<const char*>(data + offset),
- static_cast<std::streamsize>(sampleSize));
- outfile.close();
- offset += sampleSize;
- }
-}
-
-/* Returns "base file name" or its tail, if it contains '/' or '\'. */
-static const char* fileName(const char* path) {
- const char* separator_position = strrchr(path, '/');
- if (separator_position) path = separator_position + 1;
- separator_position = strrchr(path, '\\');
- if (separator_position) path = separator_position + 1;
- return path;
-}
-
-static void printHelp(const char* name) {
- fprintf(stderr, "Usage: %s [OPTION]... DICTIONARY [SAMPLE]...\n", name);
- fprintf(stderr,
- "Options:\n"
- " --dm use 'deorummolae' engine\n"
- " --distill rewrite samples; unique text parts are removed\n"
- " --dsh use 'durchschlag' engine (default)\n"
- " --purify rewrite samples; unique text parts are zeroed out\n"
- " --sieve use 'sieve' engine\n"
- " -b# set block length for 'durchschlag'; default: 1024\n"
- " -s# set slice length for 'distill', 'durchschlag', 'purify'\n"
- " and 'sieve'; default: 16\n"
- " -t# set target dictionary size (limit); default: 16K\n"
- " -u# set minimum slice population (for rewrites); default: 2\n"
- "# is a decimal number with optional k/K/m/M suffix.\n"
- "WARNING: 'distill' and 'purify' will overwrite original samples!\n"
- " Completely unique samples might become empty files.\n\n");
-}
-
-int main(int argc, char const* argv[]) {
- int dictionaryArg = -1;
- int method = METHOD_DURCHSCHLAG;
- size_t sliceLen = 16;
- size_t targetSize = 16 << 10;
- size_t blockSize = 1024;
- size_t minimumPopulation = 2;
-
- std::vector<uint8_t> data;
- std::vector<size_t> sizes;
- std::vector<int> pathArgs;
- size_t total = 0;
- for (int i = 1; i < argc; ++i) {
- if (argv[i] == nullptr) {
- continue;
- }
- if (argv[i][0] == '-') {
- if (argv[i][1] == '-') {
- if (dictionaryArg != -1) {
- fprintf(stderr,
- "Method should be specified before dictionary / sample '%s'\n",
- argv[i]);
- exit(1);
- }
- if (std::strcmp("--sieve", argv[i]) == 0) {
- method = METHOD_SIEVE;
- continue;
- }
- if (std::strcmp("--dm", argv[i]) == 0) {
- method = METHOD_DM;
- continue;
- }
- if (std::strcmp("--dsh", argv[i]) == 0) {
- method = METHOD_DURCHSCHLAG;
- continue;
- }
- if (std::strcmp("--distill", argv[i]) == 0) {
- method = METHOD_DISTILL;
- continue;
- }
- if (std::strcmp("--purify", argv[i]) == 0) {
- method = METHOD_PURIFY;
- continue;
- }
- printHelp(fileName(argv[0]));
- fprintf(stderr, "Invalid option '%s'\n", argv[i]);
- exit(1);
- }
- if (argv[i][1] == 'b') {
- blockSize = readInt(&argv[i][2]);
- if (blockSize < 16 || blockSize > 65536) {
- printHelp(fileName(argv[0]));
- fprintf(stderr, "Invalid option '%s'\n", argv[i]);
- exit(1);
- }
- } else if (argv[i][1] == 's') {
- sliceLen = readInt(&argv[i][2]);
- if (sliceLen < 4 || sliceLen > 256) {
- printHelp(fileName(argv[0]));
- fprintf(stderr, "Invalid option '%s'\n", argv[i]);
- exit(1);
- }
- } else if (argv[i][1] == 't') {
- targetSize = readInt(&argv[i][2]);
- if (targetSize < 256 || targetSize > (1 << 25)) {
- printHelp(fileName(argv[0]));
- fprintf(stderr, "Invalid option '%s'\n", argv[i]);
- exit(1);
- }
- } else if (argv[i][1] == 'u') {
- minimumPopulation = readInt(&argv[i][2]);
- if (minimumPopulation < 256 || minimumPopulation > 65536) {
- printHelp(fileName(argv[0]));
- fprintf(stderr, "Invalid option '%s'\n", argv[i]);
- exit(1);
- }
- } else {
- printHelp(fileName(argv[0]));
- fprintf(stderr, "Unrecognized option '%s'\n", argv[i]);
- exit(1);
- }
- continue;
- }
- if (dictionaryArg == -1) {
- if (method != METHOD_DISTILL && method != METHOD_PURIFY) {
- dictionaryArg = i;
- continue;
- }
- }
- std::string content = readFile(argv[i]);
- data.insert(data.end(), content.begin(), content.end());
- total += content.size();
- pathArgs.push_back(i);
- sizes.push_back(content.size());
- }
- bool wantDictionary = (dictionaryArg == -1);
- if (method == METHOD_DISTILL || method == METHOD_PURIFY) {
- wantDictionary = false;
- }
- if (wantDictionary || total == 0) {
- printHelp(fileName(argv[0]));
- fprintf(stderr, "Not enough arguments\n");
- exit(1);
- }
-
- if (method == METHOD_SIEVE) {
- writeFile(argv[dictionaryArg], sieve_generate(
- targetSize, sliceLen, sizes, data.data()));
- } else if (method == METHOD_DM) {
- writeFile(argv[dictionaryArg], DM_generate(
- targetSize, sizes, data.data()));
- } else if (method == METHOD_DURCHSCHLAG) {
- writeFile(argv[dictionaryArg], durchschlag_generate(
- targetSize, sliceLen, blockSize, sizes, data.data()));
- } else if (method == METHOD_DISTILL) {
- durchschlag_distill(sliceLen, minimumPopulation, &sizes, data.data());
- writeSamples(argv, pathArgs, sizes, data.data());
- } else if (method == METHOD_PURIFY) {
- durchschlag_purify(sliceLen, minimumPopulation, sizes, data.data());
- writeSamples(argv, pathArgs, sizes, data.data());
- } else {
- printHelp(fileName(argv[0]));
- fprintf(stderr, "Unknown generator\n");
- exit(1);
- }
- return 0;
-}
diff --git a/research/draw_diff.cc b/research/draw_diff.cc
index 1a52869..01b6716 100644
--- a/research/draw_diff.cc
+++ b/research/draw_diff.cc
@@ -16,27 +16,22 @@
#include <cstdlib> /* exit, EXIT_FAILURE */
#include <vector>
-#if !defined(CHECK)
+#ifndef CHECK
#define CHECK(X) if (!(X)) exit(EXIT_FAILURE);
#endif
-typedef uint8_t* ScanLine;
-typedef ScanLine* Image;
-
-void ReadPGM(FILE* f, Image* image, size_t* height, size_t* width) {
+void ReadPGM(FILE* f, uint8_t*** image, size_t* height, size_t* width) {
int colors;
CHECK(fscanf(f, "P5\n%lu %lu\n%d\n", width, height, &colors) == 3);
assert(colors == 255);
- ScanLine* lines = new ScanLine[*height];
- *image = lines;
+ *image = new uint8_t*[*height];
for (int i = *height - 1; i >= 0; --i) {
- ScanLine line = new uint8_t[*width];
- lines[i] = line;
- CHECK(fread(line, 1, *width, f) == *width);
+ (*image)[i] = new uint8_t[*width];
+ CHECK(fread((*image)[i], 1, *width, f) == *width);
}
}
-void CalculateDiff(int** diff, Image image1, Image image2,
+void CalculateDiff(int** diff, uint8_t** image1, uint8_t** image2,
size_t height, size_t width) {
for (size_t i = 0; i < height; ++i) {
for (size_t j = 0; j < width; ++j) {
@@ -45,7 +40,7 @@ void CalculateDiff(int** diff, Image image1, Image image2,
}
}
-void DrawDiff(int** diff, Image image1, Image image2,
+void DrawDiff(int** diff, uint8_t** image1, uint8_t** image2,
size_t height, size_t width, FILE* f) {
int max = -1234;
int min = +1234;
@@ -83,13 +78,13 @@ void DrawDiff(int** diff, Image image1, Image image2,
delete[] row;
}
-int main(int argc, char** argv) {
+int main(int argc, char* argv[]) {
if (argc != 4) {
printf("usage: %s pgm1 pgm2 diff_ppm_path\n", argv[0]);
return 1;
}
- Image image1, image2;
+ uint8_t **image1, **image2;
size_t h1, w1, h2, w2;
FILE* fimage1 = fopen(argv[1], "rb");
diff --git a/research/durchschlag.cc b/research/durchschlag.cc
deleted file mode 100755
index 2fbf41b..0000000
--- a/research/durchschlag.cc
+++ /dev/null
@@ -1,726 +0,0 @@
-#include "./durchschlag.h"
-
-#include <algorithm>
-#include <exception> /* terminate */
-
-#include "divsufsort.h"
-
-/* Pointer to position in text. */
-typedef DurchschlagTextIdx TextIdx;
-
-/* (Sum of) value(s) of slice(s). */
-typedef uint32_t Score;
-
-typedef struct HashSlot {
- TextIdx next;
- TextIdx offset;
-} HashSlot;
-
-typedef struct MetaSlot {
- TextIdx mark;
- Score score;
-} MetaSlot;
-
-typedef struct Range {
- TextIdx start;
- TextIdx end;
-} Range;
-
-typedef struct Candidate {
- Score score;
- TextIdx position;
-} Candidate;
-
-struct greaterScore {
- bool operator()(const Candidate& a, const Candidate& b) const {
- return (a.score > b.score) ||
- ((a.score == b.score) && (a.position < b.position));
- }
-};
-
-struct lessScore {
- bool operator()(const Candidate& a, const Candidate& b) const {
- return (a.score < b.score) ||
- ((a.score == b.score) && (a.position > b.position));
- }
-};
-
-#define CANDIDATE_BUNDLE_SIZE (1 << 18)
-
-static void fatal(const char* error) {
- fprintf(stderr, "%s\n", error);
- std::terminate();
-}
-
-static TextIdx calculateDictionarySize(const std::vector<Range>& ranges) {
- TextIdx result = 0;
- for (size_t i = 0; i < ranges.size(); ++i) {
- const Range& r = ranges[i];
- result += r.end - r.start;
- }
- return result;
-}
-
-static std::string createDictionary(
- const uint8_t* data, const std::vector<Range>& ranges, size_t limit) {
- std::string output;
- output.reserve(calculateDictionarySize(ranges));
- for (size_t i = 0; i < ranges.size(); ++i) {
- const Range& r = ranges[i];
- output.insert(output.end(), &data[r.start], &data[r.end]);
- }
- if (output.size() > limit) {
- output.resize(limit);
- }
- return output;
-}
-
-/* precondition: span > 0
- precondition: end + span == len(shortcut) */
-static Score buildCandidatesList(std::vector<Candidate>* candidates,
- std::vector<MetaSlot>* map, TextIdx span, const TextIdx* shortcut,
- TextIdx end) {
- candidates->resize(0);
-
- size_t n = map->size();
- MetaSlot* slots = map->data();
- for (size_t j = 0; j < n; ++j) {
- slots[j].mark = 0;
- }
-
- Score score = 0;
- /* Consider the whole span, except one last item. The following loop will
- add the last item to the end of the "chain", evaluate it, and cut one
- "link" form the beginning. */
- for (size_t j = 0; j < span - 1; ++j) {
- MetaSlot& item = slots[shortcut[j]];
- if (item.mark == 0) {
- score += item.score;
- }
- item.mark++;
- }
-
- TextIdx i = 0;
- TextIdx limit = std::min<TextIdx>(end, CANDIDATE_BUNDLE_SIZE);
- Score maxScore = 0;
- for (; i < limit; ++i) {
- TextIdx slice = shortcut[i + span - 1];
- MetaSlot& pick = slots[slice];
- if (pick.mark == 0) {
- score += pick.score;
- }
- pick.mark++;
-
- if (score > maxScore) {
- maxScore = score;
- }
- candidates->push_back({score, i});
-
- MetaSlot& drop = slots[shortcut[i]];
- drop.mark--;
- if (drop.mark == 0) {
- score -= drop.score;
- }
- }
-
- std::make_heap(candidates->begin(), candidates->end(), greaterScore());
- Score minScore = candidates->at(0).score;
- for (; i < end; ++i) {
- TextIdx slice = shortcut[i + span - 1];
- MetaSlot& pick = slots[slice];
- if (pick.mark == 0) {
- score += pick.score;
- }
- pick.mark++;
-
- if (score > maxScore) {
- maxScore = score;
- }
- if (score >= minScore) {
- candidates->push_back({score, i});
- std::push_heap(candidates->begin(), candidates->end(), greaterScore());
- if (candidates->size() > CANDIDATE_BUNDLE_SIZE && maxScore != minScore) {
- while (candidates->at(0).score == minScore) {
- std::pop_heap(candidates->begin(), candidates->end(), greaterScore());
- candidates->pop_back();
- }
- minScore = candidates->at(0).score;
- }
- }
-
- MetaSlot& drop = slots[shortcut[i]];
- drop.mark--;
- if (drop.mark == 0) {
- score -= drop.score;
- }
- }
-
- for (size_t j = 0; j < n; ++j) {
- slots[j].mark = 0;
- }
-
- std::make_heap(candidates->begin(), candidates->end(), lessScore());
- return minScore;
-}
-
-/* precondition: span > 0
- precondition: end + span == len(shortcut) */
-static Score rebuildCandidatesList(std::vector<TextIdx>* candidates,
- std::vector<MetaSlot>* map, TextIdx span, const TextIdx* shortcut,
- TextIdx end, TextIdx* next) {
- size_t n = candidates->size();
- TextIdx* data = candidates->data();
- for (size_t i = 0; i < n; ++i) {
- data[i] = 0;
- }
-
- n = map->size();
- MetaSlot* slots = map->data();
- for (size_t i = 0; i < n; ++i) {
- slots[i].mark = 0;
- }
-
- Score score = 0;
- /* Consider the whole span, except one last item. The following loop will
- add the last item to the end of the "chain", evaluate it, and cut one
- "link" form the beginning. */
- for (TextIdx i = 0; i < span - 1; ++i) {
- MetaSlot& item = slots[shortcut[i]];
- if (item.mark == 0) {
- score += item.score;
- }
- item.mark++;
- }
-
- Score maxScore = 0;
- for (TextIdx i = 0; i < end; ++i) {
- MetaSlot& pick = slots[shortcut[i + span - 1]];
- if (pick.mark == 0) {
- score += pick.score;
- }
- pick.mark++;
-
- if (candidates->size() <= score) {
- candidates->resize(score + 1);
- }
- if (score > maxScore) {
- maxScore = score;
- }
- next[i] = candidates->at(score);
- candidates->at(score) = i;
-
- MetaSlot& drop = slots[shortcut[i]];
- drop.mark--;
- if (drop.mark == 0) {
- score -= drop.score;
- }
- }
-
- for (size_t i = 0; i < n; ++i) {
- slots[i].mark = 0;
- }
-
- candidates->resize(maxScore + 1);
- return maxScore;
-}
-
-static void addRange(std::vector<Range>* ranges, TextIdx start, TextIdx end) {
- for (auto it = ranges->begin(); it != ranges->end();) {
- if (end < it->start) {
- ranges->insert(it, {start, end});
- return;
- }
- if (it->end < start) {
- it++;
- continue;
- }
- // Combine with existing.
- start = std::min(start, it->start);
- end = std::max(end, it->end);
- // Remove consumed vector and continue.
- it = ranges->erase(it);
- }
- ranges->push_back({start, end});
-}
-
-std::string durchschlag_generate(
- size_t dictionary_size_limit, size_t slice_len, size_t block_len,
- const std::vector<size_t>& sample_sizes, const uint8_t* sample_data) {
- DurchschlagContext ctx = durchschlag_prepare(
- slice_len, sample_sizes, sample_data);
- return durchschlag_generate(DURCHSCHLAG_COLLABORATIVE,
- dictionary_size_limit, block_len, ctx, sample_data);
-}
-
-DurchschlagContext durchschlag_prepare(size_t slice_len,
- const std::vector<size_t>& sample_sizes, const uint8_t* sample_data) {
- /* Parameters aliasing */
- TextIdx sliceLen = static_cast<TextIdx>(slice_len);
- if (sliceLen != slice_len) fatal("slice_len is too large");
- if (sliceLen < 1) fatal("slice_len is too small");
- const uint8_t* data = sample_data;
-
- TextIdx total = 0;
- std::vector<TextIdx> offsets;
- offsets.reserve(sample_sizes.size());
- for (size_t i = 0; i < sample_sizes.size(); ++i) {
- TextIdx delta = static_cast<TextIdx>(sample_sizes[i]);
- if (delta != sample_sizes[i]) fatal("sample is too large");
- if (delta == 0) fatal("0-length samples are prohibited");
- TextIdx next_total = total + delta;
- if (next_total <= total) fatal("corpus is too large");
- total = next_total;
- offsets.push_back(total);
- }
-
- if (total < sliceLen) fatal("slice_len is larger than corpus size");
- TextIdx end = total - static_cast<TextIdx>(sliceLen) + 1;
- TextIdx hashLen = 11;
- while (hashLen < 29 && ((1u << hashLen) < end)) {
- hashLen += 3;
- }
- hashLen -= 3;
- TextIdx hashMask = (1u << hashLen) - 1u;
- std::vector<TextIdx> hashHead(1 << hashLen);
- TextIdx hash = 0;
- TextIdx lShift = 3;
- TextIdx rShift = hashLen - lShift;
- for (TextIdx i = 0; i < sliceLen - 1; ++i) {
- TextIdx v = data[i];
- hash = (((hash << lShift) | (hash >> rShift)) & hashMask) ^ v;
- }
- TextIdx lShiftX = (lShift * (sliceLen - 1)) % hashLen;
- TextIdx rShiftX = hashLen - lShiftX;
-
- std::vector<HashSlot> map;
- map.push_back({0, 0});
- TextIdx hashSlot = 1;
- std::vector<TextIdx> sliceMap;
- sliceMap.reserve(end);
- for (TextIdx i = 0; i < end; ++i) {
- TextIdx v = data[i + sliceLen - 1];
- TextIdx bucket = (((hash << lShift) | (hash >> rShift)) & hashMask) ^ v;
- v = data[i];
- hash = bucket ^ (((v << lShiftX) | (v >> rShiftX)) & hashMask);
- TextIdx slot = hashHead[bucket];
- while (slot != 0) {
- HashSlot& item = map[slot];
- TextIdx start = item.offset;
- bool miss = false;
- for (TextIdx j = 0; j < sliceLen; ++j) {
- if (data[i + j] != data[start + j]) {
- miss = true;
- break;
- }
- }
- if (!miss) {
- sliceMap.push_back(slot);
- break;
- }
- slot = item.next;
- }
- if (slot == 0) {
- map.push_back({hashHead[bucket], i});
- hashHead[bucket] = hashSlot;
- sliceMap.push_back(hashSlot);
- hashSlot++;
- }
- }
-
- return {total, sliceLen, static_cast<TextIdx>(map.size()),
- std::move(offsets), std::move(sliceMap)};
-}
-
-DurchschlagContext durchschlag_prepare(size_t slice_len,
- const std::vector<size_t>& sample_sizes, const DurchschlagIndex& index) {
- /* Parameters aliasing */
- TextIdx sliceLen = static_cast<TextIdx>(slice_len);
- if (sliceLen != slice_len) fatal("slice_len is too large");
- if (sliceLen < 1) fatal("slice_len is too small");
- const TextIdx* lcp = index.lcp.data();
- const TextIdx* sa = index.sa.data();
-
- TextIdx total = 0;
- std::vector<TextIdx> offsets;
- offsets.reserve(sample_sizes.size());
- for (size_t i = 0; i < sample_sizes.size(); ++i) {
- TextIdx delta = static_cast<TextIdx>(sample_sizes[i]);
- if (delta != sample_sizes[i]) fatal("sample is too large");
- if (delta == 0) fatal("0-length samples are prohibited");
- TextIdx next_total = total + delta;
- if (next_total <= total) fatal("corpus is too large");
- total = next_total;
- offsets.push_back(total);
- }
-
- if (total < sliceLen) fatal("slice_len is larger than corpus size");
- TextIdx counter = 1;
- TextIdx end = total - sliceLen + 1;
- std::vector<TextIdx> sliceMap(total);
- TextIdx last = 0;
- TextIdx current = 1;
- while (current <= total) {
- if (lcp[current - 1] < sliceLen) {
- for (TextIdx i = last; i < current; ++i) {
- sliceMap[sa[i]] = counter;
- }
- counter++;
- last = current;
- }
- current++;
- }
- sliceMap.resize(end);
-
- // Reorder items for the better locality.
- std::vector<TextIdx> reorder(counter);
- counter = 1;
- for (TextIdx i = 0; i < end; ++i) {
- if (reorder[sliceMap[i]] == 0) {
- reorder[sliceMap[i]] = counter++;
- }
- }
- for (TextIdx i = 0; i < end; ++i) {
- sliceMap[i] = reorder[sliceMap[i]];
- }
-
- return {total, sliceLen, counter, std::move(offsets), std::move(sliceMap)};
-}
-
-DurchschlagIndex durchschlag_index(const std::vector<uint8_t>& data) {
- TextIdx total = static_cast<TextIdx>(data.size());
- if (total != data.size()) fatal("corpus is too large");
- saidx_t saTotal = static_cast<saidx_t>(total);
- if (saTotal < 0) fatal("corpus is too large");
- if (static_cast<TextIdx>(saTotal) != total) fatal("corpus is too large");
- std::vector<TextIdx> sa(total);
- /* Hopefully, non-negative int32_t values match TextIdx ones. */
- if (sizeof(TextIdx) != sizeof(int32_t)) fatal("type length mismatch");
- int32_t* saData = reinterpret_cast<int32_t*>(sa.data());
- divsufsort(data.data(), saData, saTotal);
-
- std::vector<TextIdx> isa(total);
- for (TextIdx i = 0; i < total; ++i) isa[sa[i]] = i;
-
- // TODO: borrowed -> unknown efficiency.
- std::vector<TextIdx> lcp(total);
- TextIdx k = 0;
- lcp[total - 1] = 0;
- for (TextIdx i = 0; i < total; ++i) {
- TextIdx current = isa[i];
- if (current == total - 1) {
- k = 0;
- continue;
- }
- TextIdx j = sa[current + 1]; // Suffix which follow i-th suffix.
- while ((i + k < total) && (j + k < total) && (data[i + k] == data[j + k])) {
- ++k;
- }
- lcp[current] = k;
- if (k > 0) --k;
- }
-
- return {std::move(lcp), std::move(sa)};
-}
-
-static void ScoreSlices(const std::vector<TextIdx>& offsets,
- std::vector<MetaSlot>& map, const TextIdx* shortcut, TextIdx end) {
- TextIdx piece = 0;
- /* Fresh map contains all zeroes -> initial mark should be different. */
- TextIdx mark = 1;
- for (TextIdx i = 0; i < end; ++i) {
- if (offsets[piece] == i) {
- piece++;
- mark++;
- }
- MetaSlot& item = map[shortcut[i]];
- if (item.mark != mark) {
- item.mark = mark;
- item.score++;
- }
- }
-}
-
-static std::string durchschlagGenerateExclusive(
- size_t dictionary_size_limit, size_t block_len,
- const DurchschlagContext& context, const uint8_t* sample_data) {
- /* Parameters aliasing */
- TextIdx targetSize = static_cast<TextIdx>(dictionary_size_limit);
- if (targetSize != dictionary_size_limit) {
- fprintf(stderr, "dictionary_size_limit is too large\n");
- return "";
- }
- TextIdx sliceLen = context.sliceLen;
- TextIdx total = context.dataSize;
- TextIdx blockLen = static_cast<TextIdx>(block_len);
- if (blockLen != block_len) {
- fprintf(stderr, "block_len is too large\n");
- return "";
- }
- const uint8_t* data = sample_data;
- const std::vector<TextIdx>& offsets = context.offsets;
- std::vector<MetaSlot> map(context.numUniqueSlices);
- const TextIdx* shortcut = context.sliceMap.data();
-
- /* Initialization */
- if (blockLen < sliceLen) {
- fprintf(stderr, "sliceLen is larger than block_len\n");
- return "";
- }
- if (targetSize < blockLen || total < blockLen) {
- fprintf(stderr, "block_len is too large\n");
- return "";
- }
- TextIdx end = total - sliceLen + 1;
- ScoreSlices(offsets, map, shortcut, end);
- TextIdx span = blockLen - sliceLen + 1;
- end = static_cast<TextIdx>(context.sliceMap.size()) - span;
- std::vector<TextIdx> candidates;
- std::vector<TextIdx> next(end);
- Score maxScore = rebuildCandidatesList(
- &candidates, &map, span, shortcut, end, next.data());
-
- /* Block selection */
- const size_t triesLimit = (600 * 1000000) / span;
- const size_t candidatesLimit = (150 * 1000000) / span;
- std::vector<Range> ranges;
- TextIdx mark = 0;
- size_t numTries = 0;
- while (true) {
- TextIdx dictSize = calculateDictionarySize(ranges);
- size_t numCandidates = 0;
- if (dictSize > targetSize - blockLen) {
- break;
- }
- if (maxScore == 0) {
- break;
- }
- while (true) {
- TextIdx candidate = 0;
- while (maxScore > 0) {
- if (candidates[maxScore] != 0) {
- candidate = candidates[maxScore];
- candidates[maxScore] = next[candidate];
- break;
- }
- maxScore--;
- }
- if (maxScore == 0) {
- break;
- }
- mark++;
- numTries++;
- numCandidates++;
- Score score = 0;
- for (size_t j = candidate; j < candidate + span; ++j) {
- MetaSlot& item = map[shortcut[j]];
- if (item.mark != mark) {
- score += item.score;
- item.mark = mark;
- }
- }
- if (score < maxScore) {
- if (numTries < triesLimit && numCandidates < candidatesLimit) {
- next[candidate] = candidates[score];
- candidates[score] = candidate;
- } else {
- maxScore = rebuildCandidatesList(
- &candidates, &map, span, shortcut, end, next.data());
- mark = 0;
- numTries = 0;
- numCandidates = 0;
- }
- continue;
- } else if (score > maxScore) {
- fprintf(stderr, "Broken invariant\n");
- return "";
- }
- for (TextIdx j = candidate; j < candidate + span; ++j) {
- MetaSlot& item = map[shortcut[j]];
- item.score = 0;
- }
- addRange(&ranges, candidate, candidate + blockLen);
- break;
- }
- }
-
- return createDictionary(data, ranges, targetSize);
-}
-
-static std::string durchschlagGenerateCollaborative(
- size_t dictionary_size_limit, size_t block_len,
- const DurchschlagContext& context, const uint8_t* sample_data) {
- /* Parameters aliasing */
- TextIdx targetSize = static_cast<TextIdx>(dictionary_size_limit);
- if (targetSize != dictionary_size_limit) {
- fprintf(stderr, "dictionary_size_limit is too large\n");
- return "";
- }
- TextIdx sliceLen = context.sliceLen;
- TextIdx total = context.dataSize;
- TextIdx blockLen = static_cast<TextIdx>(block_len);
- if (blockLen != block_len) {
- fprintf(stderr, "block_len is too large\n");
- return "";
- }
- const uint8_t* data = sample_data;
- const std::vector<TextIdx>& offsets = context.offsets;
- std::vector<MetaSlot> map(context.numUniqueSlices);
- const TextIdx* shortcut = context.sliceMap.data();
-
- /* Initialization */
- if (blockLen < sliceLen) {
- fprintf(stderr, "sliceLen is larger than block_len\n");
- return "";
- }
- if (targetSize < blockLen || total < blockLen) {
- fprintf(stderr, "block_len is too large\n");
- return "";
- }
- TextIdx end = total - sliceLen + 1;
- ScoreSlices(offsets, map, shortcut, end);
- TextIdx span = blockLen - sliceLen + 1;
- end = static_cast<TextIdx>(context.sliceMap.size()) - span;
- std::vector<Candidate> candidates;
- candidates.reserve(CANDIDATE_BUNDLE_SIZE + 1024);
- Score minScore = buildCandidatesList(&candidates, &map, span, shortcut, end);
-
- /* Block selection */
- std::vector<Range> ranges;
- TextIdx mark = 0;
- while (true) {
- TextIdx dictSize = calculateDictionarySize(ranges);
- if (dictSize > targetSize - blockLen) {
- break;
- }
- if (minScore == 0 && candidates.empty()) {
- break;
- }
- while (true) {
- if (candidates.empty()) {
- minScore = buildCandidatesList(&candidates, &map, span, shortcut, end);
- mark = 0;
- }
- TextIdx candidate = candidates[0].position;
- Score expectedScore = candidates[0].score;
- if (expectedScore == 0) {
- candidates.resize(0);
- break;
- }
- std::pop_heap(candidates.begin(), candidates.end(), lessScore());
- candidates.pop_back();
- mark++;
- Score score = 0;
- for (TextIdx j = candidate; j < candidate + span; ++j) {
- MetaSlot& item = map[shortcut[j]];
- if (item.mark != mark) {
- score += item.score;
- item.mark = mark;
- }
- }
- if (score < expectedScore) {
- if (score >= minScore) {
- candidates.push_back({score, candidate});
- std::push_heap(candidates.begin(), candidates.end(), lessScore());
- }
- continue;
- } else if (score > expectedScore) {
- fatal("Broken invariant");
- }
- for (TextIdx j = candidate; j < candidate + span; ++j) {
- MetaSlot& item = map[shortcut[j]];
- item.score = 0;
- }
- addRange(&ranges, candidate, candidate + blockLen);
- break;
- }
- }
-
- return createDictionary(data, ranges, targetSize);
-}
-
-std::string durchschlag_generate(DurchschalgResourceStrategy strategy,
- size_t dictionary_size_limit, size_t block_len,
- const DurchschlagContext& context, const uint8_t* sample_data) {
- if (strategy == DURCHSCHLAG_COLLABORATIVE) {
- return durchschlagGenerateCollaborative(
- dictionary_size_limit, block_len, context, sample_data);
- } else {
- return durchschlagGenerateExclusive(
- dictionary_size_limit, block_len, context, sample_data);
- }
-}
-
-void durchschlag_distill(size_t slice_len, size_t minimum_population,
- std::vector<size_t>* sample_sizes, uint8_t* sample_data) {
- /* Parameters aliasing */
- uint8_t* data = sample_data;
-
- /* Build slice map. */
- DurchschlagContext context = durchschlag_prepare(
- slice_len, *sample_sizes, data);
-
- /* Calculate slice population. */
- const std::vector<TextIdx>& offsets = context.offsets;
- std::vector<MetaSlot> map(context.numUniqueSlices);
- const TextIdx* shortcut = context.sliceMap.data();
- TextIdx sliceLen = context.sliceLen;
- TextIdx total = context.dataSize;
- TextIdx end = total - sliceLen + 1;
- ScoreSlices(offsets, map, shortcut, end);
-
- /* Condense samples, omitting unique slices. */
- TextIdx readPos = 0;
- TextIdx writePos = 0;
- TextIdx lastNonUniquePos = 0;
- for (TextIdx i = 0; i < sample_sizes->size(); ++i) {
- TextIdx sampleStart = writePos;
- TextIdx oldSampleEnd =
- readPos + static_cast<TextIdx>(sample_sizes->at(i));
- while (readPos < oldSampleEnd) {
- if (readPos < end) {
- MetaSlot& item = map[shortcut[readPos]];
- if (item.score >= minimum_population) {
- lastNonUniquePos = readPos + sliceLen;
- }
- }
- if (readPos < lastNonUniquePos) {
- data[writePos++] = data[readPos];
- }
- readPos++;
- }
- sample_sizes->at(i) = writePos - sampleStart;
- }
-}
-
-void durchschlag_purify(size_t slice_len, size_t minimum_population,
- const std::vector<size_t>& sample_sizes, uint8_t* sample_data) {
- /* Parameters aliasing */
- uint8_t* data = sample_data;
-
- /* Build slice map. */
- DurchschlagContext context = durchschlag_prepare(
- slice_len, sample_sizes, data);
-
- /* Calculate slice population. */
- const std::vector<TextIdx>& offsets = context.offsets;
- std::vector<MetaSlot> map(context.numUniqueSlices);
- const TextIdx* shortcut = context.sliceMap.data();
- TextIdx sliceLen = context.sliceLen;
- TextIdx total = context.dataSize;
- TextIdx end = total - sliceLen + 1;
- ScoreSlices(offsets, map, shortcut, end);
-
- /* Rewrite samples, zeroing out unique slices. */
- TextIdx lastNonUniquePos = 0;
- for (TextIdx readPos = 0; readPos < total; ++readPos) {
- if (readPos < end) {
- MetaSlot& item = map[shortcut[readPos]];
- if (item.score >= minimum_population) {
- lastNonUniquePos = readPos + sliceLen;
- }
- }
- if (readPos >= lastNonUniquePos) {
- data[readPos] = 0;
- }
- }
-}
diff --git a/research/durchschlag.h b/research/durchschlag.h
deleted file mode 100755
index adbc531..0000000
--- a/research/durchschlag.h
+++ /dev/null
@@ -1,99 +0,0 @@
-#ifndef BROTLI_RESEARCH_DURCHSCHLAG_H_
-#define BROTLI_RESEARCH_DURCHSCHLAG_H_
-
-#include <cstddef>
-#include <cstdint>
-#include <string>
-#include <vector>
-
-/**
- * Generate a dictionary for given samples.
- *
- * @param dictionary_size_limit maximal dictionary size
- * @param slice_len text slice size
- * @param block_len score block length
- * @param sample_sizes vector with sample sizes
- * @param sample_data concatenated samples
- * @return generated dictionary
- */
-std::string durchschlag_generate(
- size_t dictionary_size_limit, size_t slice_len, size_t block_len,
- const std::vector<size_t>& sample_sizes, const uint8_t* sample_data);
-
-//------------------------------------------------------------------------------
-// Lower level API for repetitive dictionary generation.
-//------------------------------------------------------------------------------
-
-/* Pointer to position in text. */
-typedef uint32_t DurchschlagTextIdx;
-
-/* Context is made public for flexible serialization / deserialization. */
-typedef struct DurchschlagContext {
- DurchschlagTextIdx dataSize;
- DurchschlagTextIdx sliceLen;
- DurchschlagTextIdx numUniqueSlices;
- std::vector<DurchschlagTextIdx> offsets;
- std::vector<DurchschlagTextIdx> sliceMap;
-} DurchschlagContext;
-
-DurchschlagContext durchschlag_prepare(size_t slice_len,
- const std::vector<size_t>& sample_sizes, const uint8_t* sample_data);
-
-typedef enum DurchschalgResourceStrategy {
- // Faster
- DURCHSCHLAG_EXCLUSIVE = 0,
- // Uses much less memory
- DURCHSCHLAG_COLLABORATIVE = 1
-} DurchschalgResourceStrategy;
-
-std::string durchschlag_generate(DurchschalgResourceStrategy strategy,
- size_t dictionary_size_limit, size_t block_len,
- const DurchschlagContext& context, const uint8_t* sample_data);
-
-//------------------------------------------------------------------------------
-// Suffix Array based preparation.
-//------------------------------------------------------------------------------
-
-typedef struct DurchschlagIndex {
- std::vector<DurchschlagTextIdx> lcp;
- std::vector<DurchschlagTextIdx> sa;
-} DurchschlagIndex;
-
-DurchschlagIndex durchschlag_index(const std::vector<uint8_t>& data);
-
-DurchschlagContext durchschlag_prepare(size_t slice_len,
- const std::vector<size_t>& sample_sizes, const DurchschlagIndex& index);
-
-//------------------------------------------------------------------------------
-// Data preparation.
-//------------------------------------------------------------------------------
-
-/**
- * Cut out unique slices.
- *
- * Both @p sample_sizes and @p sample_data are modified in-place. Number of
- * samples remains unchanged, but some samples become shorter.
- *
- * @param slice_len (unique) slice size
- * @param minimum_population minimum non-unique slice occurrence
- * @param sample_sizes [in / out] vector with sample sizes
- * @param sample_data [in / out] concatenated samples
- */
-void durchschlag_distill(size_t slice_len, size_t minimum_population,
- std::vector<size_t>* sample_sizes, uint8_t* sample_data);
-
-/**
- * Replace unique slices with zeroes.
- *
- * @p sample_data is modified in-place. Number of samples and their length
- * remain unchanged.
- *
- * @param slice_len (unique) slice size
- * @param minimum_population minimum non-unique slice occurrence
- * @param sample_sizes vector with sample sizes
- * @param sample_data [in / out] concatenated samples
- */
-void durchschlag_purify(size_t slice_len, size_t minimum_population,
- const std::vector<size_t>& sample_sizes, uint8_t* sample_data);
-
-#endif // BROTLI_RESEARCH_DURCHSCHLAG_H_
diff --git a/research/libdivsufsort b/research/libdivsufsort
deleted file mode 160000
-Subproject 5f60d6f026c30fb4ac296f696b3c8b0eb71bd42
diff --git a/research/read_dist.h b/research/read_dist.h
index 63d3b97..3cac473 100644
--- a/research/read_dist.h
+++ b/research/read_dist.h
@@ -19,7 +19,7 @@
#include <cstdio>
#include <cstdlib> /* exit, EXIT_FAILURE */
-#if !defined(CHECK)
+#ifndef CHECK
#define CHECK(X) if (!(X)) exit(EXIT_FAILURE);
#endif
diff --git a/research/sieve.cc b/research/sieve.cc
deleted file mode 100755
index 4d147e1..0000000
--- a/research/sieve.cc
+++ /dev/null
@@ -1,259 +0,0 @@
-#include "./sieve.h"
-
-/* Pointer to position in (combined corpus) text. */
-typedef uint32_t TextIdx;
-
-/* Index of sample / generation. */
-typedef uint16_t SampleIdx;
-
-typedef struct Slot {
- TextIdx next;
- TextIdx offset;
- SampleIdx presence;
- SampleIdx mark;
-} Slot;
-
-static const TextIdx kNowhere = static_cast<TextIdx>(-1);
-
-static TextIdx dryRun(TextIdx sliceLen, Slot* map, TextIdx* shortcut,
- TextIdx end, TextIdx middle, SampleIdx minPresence, SampleIdx iteration) {
- TextIdx from = kNowhere;
- TextIdx to = kNowhere;
- TextIdx result = 0;
- SampleIdx targetPresence = minPresence;
- for (TextIdx i = 0; i < end; ++i) {
- if (i == middle) {
- targetPresence++;
- }
- Slot& item = map[shortcut[i]];
- if (item.mark != iteration) {
- item.mark = iteration;
- if (item.presence >= targetPresence) {
- if ((to == kNowhere) || (to < i)) {
- if (from != kNowhere) {
- result += to - from;
- }
- from = i;
- }
- to = i + sliceLen;
- }
- }
- }
- if (from != kNowhere) {
- result += to - from;
- }
- return result;
-}
-
-static std::string createDictionary(const uint8_t* data, TextIdx sliceLen,
- Slot* map, TextIdx* shortcut, TextIdx end, TextIdx middle,
- SampleIdx minPresence, SampleIdx iteration) {
- std::string output;
- TextIdx from = kNowhere;
- TextIdx to = kNowhere;
- SampleIdx targetPresence = minPresence;
- for (TextIdx i = 0; i < end; ++i) {
- if (i == middle) {
- targetPresence++;
- }
- Slot& item = map[shortcut[i]];
- if (item.mark != iteration) {
- item.mark = iteration;
- if (item.presence >= targetPresence) {
- if ((to == kNowhere) || (to < i)) {
- if (from != kNowhere) {
- output.insert(output.end(), &data[from], &data[to]);
- }
- from = i;
- }
- to = i + sliceLen;
- }
- }
- }
- if (from != kNowhere) {
- output.insert(output.end(), &data[from], &data[to]);
- }
- return output;
-}
-
-std::string sieve_generate(size_t dictionary_size_limit, size_t slice_len,
- const std::vector<size_t>& sample_sizes, const uint8_t* sample_data) {
- /* Parameters aliasing */
- TextIdx targetSize = static_cast<TextIdx>(dictionary_size_limit);
- if (targetSize != dictionary_size_limit) {
- fprintf(stderr, "dictionary_size_limit is too large\n");
- return "";
- }
- TextIdx sliceLen = static_cast<TextIdx>(slice_len);
- if (sliceLen != slice_len) {
- fprintf(stderr, "slice_len is too large\n");
- return "";
- }
- if (sliceLen < 1) {
- fprintf(stderr, "slice_len is too small\n");
- return "";
- }
- SampleIdx numSamples = static_cast<SampleIdx>(sample_sizes.size());
- if ((numSamples != sample_sizes.size()) || (numSamples * 2 < numSamples)) {
- fprintf(stderr, "too many samples\n");
- return "";
- }
- const uint8_t* data = sample_data;
-
- TextIdx total = 0;
- std::vector<TextIdx> offsets;
- for (SampleIdx i = 0; i < numSamples; ++i) {
- TextIdx delta = static_cast<TextIdx>(sample_sizes[i]);
- if (delta != sample_sizes[i]) {
- fprintf(stderr, "sample is too large\n");
- return "";
- }
- if (delta == 0) {
- fprintf(stderr, "empty samples are prohibited\n");
- return "";
- }
- if (total + delta <= total) {
- fprintf(stderr, "corpus is too large\n");
- return "";
- }
- total += delta;
- offsets.push_back(total);
- }
-
- if (total * 2 < total) {
- fprintf(stderr, "corpus is too large\n");
- return "";
- }
-
- if (total < sliceLen) {
- fprintf(stderr, "slice_len is larger than corpus size\n");
- return "";
- }
-
- /*****************************************************************************
- * Build coverage map.
- ****************************************************************************/
- std::vector<Slot> map;
- std::vector<TextIdx> shortcut;
- map.push_back({0, 0, 0, 0});
- TextIdx end = total - sliceLen;
- TextIdx hashLen = 11;
- while (hashLen < 29 && ((1u << hashLen) < end)) {
- hashLen += 3;
- }
- hashLen -= 3;
- TextIdx hashMask = (1u << hashLen) - 1u;
- std::vector<TextIdx> hashHead(1 << hashLen);
- TextIdx hashSlot = 1;
- SampleIdx piece = 0;
- TextIdx hash = 0;
- TextIdx lShift = 3;
- TextIdx rShift = hashLen - lShift;
- for (TextIdx i = 0; i < sliceLen - 1; ++i) {
- TextIdx v = data[i];
- hash = (((hash << lShift) | (hash >> rShift)) & hashMask) ^ v;
- }
- TextIdx lShiftX = (lShift * (sliceLen - 1)) % hashLen;
- TextIdx rShiftX = hashLen - lShiftX;
- for (TextIdx i = 0; i < end; ++i) {
- TextIdx v = data[i + sliceLen - 1];
- hash = (((hash << lShift) | (hash >> rShift)) & hashMask) ^ v;
-
- if (offsets[piece] == i) {
- piece++;
- }
- TextIdx slot = hashHead[hash];
- while (slot != 0) {
- Slot& item = map[slot];
- TextIdx start = item.offset;
- bool miss = false;
- for (TextIdx j = 0; j < sliceLen; ++j) {
- if (data[i + j] != data[start + j]) {
- miss = true;
- break;
- }
- }
- if (!miss) {
- if (item.mark != piece) {
- item.mark = piece;
- item.presence++;
- }
- shortcut.push_back(slot);
- break;
- }
- slot = item.next;
- }
- if (slot == 0) {
- map.push_back({hashHead[hash], i, 1, piece});
- hashHead[hash] = hashSlot;
- shortcut.push_back(hashSlot);
- hashSlot++;
- }
- v = data[i];
- hash ^= ((v << lShiftX) | (v >> rShiftX)) & hashMask;
- }
-
- /*****************************************************************************
- * Build dictionary of specified size.
- ****************************************************************************/
- SampleIdx a = 1;
- TextIdx size = dryRun(
- sliceLen, map.data(), shortcut.data(), end, end, a, ++piece);
- /* Maximal output is smaller than target. */
- if (size <= targetSize) {
- return createDictionary(
- data, sliceLen, map.data(), shortcut.data(), end, end, a, ++piece);
- }
-
- SampleIdx b = numSamples;
- size = dryRun(sliceLen, map.data(), shortcut.data(), end, end, b, ++piece);
- if (size == targetSize) {
- return createDictionary(
- data, sliceLen, map.data(), shortcut.data(), end, end, b, ++piece);
- }
- /* Run binary search. */
- if (size < targetSize) {
- /* size(a) > targetSize > size(b) && a < m < b */
- while (a + 1 < b) {
- SampleIdx m = static_cast<SampleIdx>((a + b) / 2);
- size = dryRun(
- sliceLen, map.data(), shortcut.data(), end, end, m, ++piece);
- if (size < targetSize) {
- b = m;
- } else if (size > targetSize) {
- a = m;
- } else {
- return createDictionary(
- data, sliceLen, map.data(), shortcut.data(), end, end, b, ++piece);
- }
- }
- } else {
- a = b;
- }
- /* size(minPresence) > targetSize > size(minPresence + 1) */
- SampleIdx minPresence = a;
- TextIdx c = 0;
- TextIdx d = end;
- /* size(a) < targetSize < size(b) && a < m < b */
- while (c + 1 < d) {
- TextIdx m = (c + d) / 2;
- size = dryRun(
- sliceLen, map.data(), shortcut.data(), end, m, minPresence, ++piece);
- if (size < targetSize) {
- c = m;
- } else if (size > targetSize) {
- d = m;
- } else {
- return createDictionary(data, sliceLen, map.data(), shortcut.data(), end,
- m, minPresence, ++piece);
- }
- }
-
- bool unrestricted = false;
- if (minPresence <= 2 && !unrestricted) {
- minPresence = 2;
- c = end;
- }
- return createDictionary(data, sliceLen, map.data(), shortcut.data(), end, c,
- minPresence, ++piece);
-}
diff --git a/research/sieve.h b/research/sieve.h
deleted file mode 100755
index 6c65dc8..0000000
--- a/research/sieve.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef BROTLI_RESEARCH_SIEVE_H_
-#define BROTLI_RESEARCH_SIEVE_H_
-
-#include <cstddef>
-#include <cstdint>
-#include <string>
-#include <vector>
-
-/**
- * Generate a dictionary for given samples.
- *
- * @param dictionary_size_limit maximal dictionary size
- * @param slice_len text slice size
- * @param sample_sizes vector with sample sizes
- * @param sample_data concatenated samples
- * @return generated dictionary
- */
-std::string sieve_generate(size_t dictionary_size_limit, size_t slice_len,
- const std::vector<size_t>& sample_sizes, const uint8_t* sample_data);
-
-#endif // BROTLI_RESEARCH_SIEVE_H_
diff --git a/scripts/.travis.sh b/scripts/.travis.sh
index 6387e22..63939a6 100755
--- a/scripts/.travis.sh
+++ b/scripts/.travis.sh
@@ -11,7 +11,7 @@ case "$1" in
case "${CC}" in
"gcc-"*)
- which ${CC} || brew install $(echo "${CC}" | sed 's/\-/@/') || brew link --overwrite $(echo "${CC}" | sed 's/\-/@/')
+ which ${CC} || brew install homebrew/versions/gcc$(echo "${CC#*-}" | sed 's/\.//')
;;
esac
@@ -51,18 +51,8 @@ case "$1" in
cd java/org/brotli
mvn install && cd integration && mvn verify
;;
- "autotools")
- ./bootstrap && ./configure && make
- ;;
- "fuzz")
- ./c/fuzz/test_fuzzer.sh
- ;;
"bazel")
- bazel build -c opt ...:all &&
- cd go && bazel test -c opt ...:all && cd .. &&
- cd java && bazel test -c opt ...:all && cd .. &&
- cd js && bazel test -c opt ...:all && cd .. &&
- cd research && bazel build -c opt ...:all && cd ..
+ bazel test -c opt ...:all
;;
esac
;;
diff --git a/scripts/appveyor.yml b/scripts/appveyor.yml
index abfb58f..2c98f19 100644
--- a/scripts/appveyor.yml
+++ b/scripts/appveyor.yml
@@ -4,23 +4,11 @@ branches:
environment:
matrix:
- - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- BUILD_SYSTEM: CMake
- GENERATOR: Visual Studio 15 2017 Win64
- CONFIG: Release
-
- - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- BUILD_SYSTEM: CMake
- GENERATOR: Visual Studio 15 2017 Win64
- CONFIG: Debug
-
- BUILD_SYSTEM: CMake
GENERATOR: Visual Studio 14 2015 Win64
- CONFIG: Debug
- BUILD_SYSTEM: CMake
GENERATOR: Visual Studio 14 2015
- CONFIG: Debug
- BUILD_SYSTEM: Python
PYTHON: "C:\\Python27"
@@ -38,63 +26,42 @@ environment:
- BUILD_SYSTEM: make
ARCH: "x86_64"
- - BUILD_SYSTEM: bazel
-
install:
- IF "%BUILD_SYSTEM%"=="Python" (
SET "PATH=%PYTHON%;%PYTHON%\Scripts;%PATH%" &&
- python -m pip install --upgrade pip &&
+ pip install --disable-pip-version-check --user --upgrade pip &&
pip install --upgrade setuptools
)
- IF "%BUILD_SYSTEM%"=="make" (
IF "%ARCH%"=="i686" (
SET "TOOLCHAIN=i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32"
) ELSE (
- SET "TOOLCHAIN=x86_64-7.3.0-posix-seh-rt_v5-rev0\mingw64"
+ SET "TOOLCHAIN=x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64"
)
)
-- IF "%BUILD_SYSTEM%"=="bazel" (
- appveyor DownloadFile https://github.com/bazelbuild/bazel/releases/download/0.14.1/bazel-0.14.1-windows-x86_64.exe -FileName bazel.exe
- )
before_build:
-- FOR /f %%i in ('C:\cygwin64\bin\date.exe +%%Y-%%m-%%d') DO SET "RELEASE_DATE=%%i"
- IF "%BUILD_SYSTEM%"=="CMake" ( mkdir builddir && cd builddir && cmake -G "%GENERATOR%" .. )
- IF "%BUILD_SYSTEM%"=="make" (
SET "CC=gcc" &&
SET "PATH=C:\mingw-w64\%TOOLCHAIN%\bin;%PATH%" &&
- COPY C:\msys64\usr\bin\make.exe C:\mingw-w64\%TOOLCHAIN%\bin\make.exe
+ COPY C:\msys64\usr\bin\make.exe C:\mingw-w64\%TOOLCHAIN%\bin\make.exe &&
+ FOR /f %%i in ('C:\cygwin64\bin\date.exe +%%Y-%%m-%%d') DO SET "RELEASE_DATE=%%i"
)
-- SET "ROOT=%APPVEYOR_BUILD_FOLDER%"
build_script:
-- IF "%BUILD_SYSTEM%"=="CMake" ( cmake --build . --config %CONFIG% )
+- IF "%BUILD_SYSTEM%"=="CMake" ( cmake --build . --config Debug )
- IF "%BUILD_SYSTEM%"=="Python" ( python setup.py build_ext )
- IF "%BUILD_SYSTEM%"=="make" (
sh -c "make brotli" &&
cd bin && 7z a -tzip -mx9 brotli-win-%ARCH%-%RELEASE_DATE%.zip brotli.exe &&
appveyor PushArtifact brotli-win-%ARCH%-%RELEASE_DATE%.zip && cd ..
)
-- IF "%BUILD_SYSTEM%"=="bazel" (
- cd java &&
- %ROOT%\bazel.exe --batch build -c opt org/brotli/wrapper/...:all &&
- python %ROOT%\scripts\fix-win-bazel-build.py &&
- cd bazel-bin &&
- 7z a -tzip -mx9 brotli-win-bazel-jni-%RELEASE_DATE%.zip brotli_jni.dll &&
- appveyor PushArtifact brotli-win-bazel-jni-%RELEASE_DATE%.zip &&
- cd .. &&
- cd ..
- )
test_script:
-- IF "%BUILD_SYSTEM%"=="CMake" ( ctest --output-on-failure --interactive-debug-mode 0 -C %CONFIG% )
+- IF "%BUILD_SYSTEM%"=="CMake" ( ctest --output-on-failure --interactive-debug-mode 0 -C Debug )
- IF "%BUILD_SYSTEM%"=="Python" ( python setup.py test )
- IF "%BUILD_SYSTEM%"=="make" ( sh -c "make test" )
-- IF "%BUILD_SYSTEM%"=="bazel" (
- cd java &&
- %ROOT%\bazel.exe --batch test -c opt --test_output streamed org/brotli/wrapper/...:all &&
- cd ..
- )
deploy:
- provider: BinTray
diff --git a/scripts/dictionary/README.md b/scripts/dictionary/README.md
deleted file mode 100644
index 366a82c..0000000
--- a/scripts/dictionary/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-Set of tools that can be used to download brotli RFC, extract and validate
-binary dictionary, and generate dictionary derivatives
-(e.g. Java `DictionaryData` class constants).
diff --git a/scripts/dictionary/step-01-download-rfc.py b/scripts/dictionary/step-01-download-rfc.py
deleted file mode 100644
index 14f65cc..0000000
--- a/scripts/dictionary/step-01-download-rfc.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Step 01 - download RFC7932.
-#
-# RFC is the ultimate source for brotli format and constants, including
-# static dictionary.
-
-import urllib2
-
-response = urllib2.urlopen('https://tools.ietf.org/rfc/rfc7932.txt')
-
-text = response.read()
-path = "rfc7932.txt"
-
-with open(path, "w") as rfc:
- rfc.write(text)
-
-print("Downloaded and saved " + str(len(text)) + " bytes to " + path)
diff --git a/scripts/dictionary/step-02-rfc-to-bin.py b/scripts/dictionary/step-02-rfc-to-bin.py
deleted file mode 100644
index 27737c5..0000000
--- a/scripts/dictionary/step-02-rfc-to-bin.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# Step 02 - parse RFC.
-#
-# Static dictionary is described in "Appendix A" section in a hexadecimal form.
-# This tool locates dictionary data in RFC and converts it to raw binary format.
-
-import re
-
-rfc_path = "rfc7932.txt"
-
-with open(rfc_path, "r") as rfc:
- lines = rfc.readlines()
-
-re_data_line = re.compile("^ [0-9a-f]{64}$")
-
-appendix_a_found = False
-dictionary = []
-for line in lines:
- if appendix_a_found:
- if re_data_line.match(line) is not None:
- data = line.strip()
- for i in range(32):
- dictionary.append(int(data[2 * i : 2 * i + 2], 16))
- if len(dictionary) == 122784:
- break
- else:
- if line.startswith("Appendix A."):
- appendix_a_found = True
-
-bin_path = "dictionary.bin"
-
-with open(bin_path, "wb") as output:
- output.write(bytearray(dictionary))
-
-print("Parsed and saved " + str(len(dictionary)) + " bytes to " + bin_path)
diff --git a/scripts/dictionary/step-03-validate-bin.py b/scripts/dictionary/step-03-validate-bin.py
deleted file mode 100644
index 171cc9b..0000000
--- a/scripts/dictionary/step-03-validate-bin.py
+++ /dev/null
@@ -1,38 +0,0 @@
-# Step 03 - validate raw dictionary file.
-#
-# CRC32, MD5, SHA1 and SHA256 checksums for raw binary dictionary are checked.
-
-import hashlib
-import zlib
-
-bin_path = "dictionary.bin"
-
-with open(bin_path, "rb") as raw:
- data = raw.read()
-
-def check_digest(name, expected, actual):
- if expected == actual:
- print("[OK] " + name)
- else:
- print("[ERROR] " + name + " | " + expected + " != " + actual)
-
-
-check_digest(
- "CRC32", # This is the only checksum provided in RFC.
- "0x5136cb04",
- hex(zlib.crc32(data)))
-
-check_digest(
- "MD5",
- "96cecd2ee7a666d5aa3627d74735b32a",
- hashlib.md5(data).hexdigest())
-
-check_digest(
- "SHA1",
- "72b41051cb61a9281ba3c4414c289da50d9a7640",
- hashlib.sha1(data).hexdigest())
-
-check_digest(
- "SHA256",
- "20e42eb1b511c21806d4d227d07e5dd06877d8ce7b3a817f378f313653f35c70",
- hashlib.sha256(data).hexdigest())
diff --git a/scripts/dictionary/step-04-generate-java-literals.py b/scripts/dictionary/step-04-generate-java-literals.py
deleted file mode 100644
index fd3c64e..0000000
--- a/scripts/dictionary/step-04-generate-java-literals.py
+++ /dev/null
@@ -1,79 +0,0 @@
-# Step 04 - generate Java literals.
-#
-# Java byte-code has ridiculous restrictions. There is no such thing as
-# "array literal" - those are implemented as series of data[x] = y;
-# as a consequence N-byte array will use 7N bytes in class, plus N bytes
-# in instantiated variable. Also no literal could be longer than 64KiB.
-#
-# To keep dictionary data compact both in source code and in compiled format
-# we use the following tricks:
-# * use String as a data container
-# * store only lowest 7 bits; i.e. all characters fit ASCII table; this allows
-# efficient conversion to byte array; also ASCII characters use only 1 byte
-#. of memory (UTF-8 encoding)
-# * RLE-compress sequence of 8-th bits
-#
-# This script generates literals used in Java code.
-
-bin_path = "dictionary.bin"
-
-with open(bin_path, "rb") as raw:
- data = raw.read()
-
-low = []
-hi = []
-is_skip = True
-skip_flip_offset = 36
-cntr = skip_flip_offset
-for b in data:
- value = ord(b)
- low.append(chr(value & 0x7F))
- if is_skip:
- if value < 0x80:
- cntr += 1
- else:
- is_skip = False
- hi.append(unichr(cntr))
- cntr = skip_flip_offset + 1
- else:
- if value >= 0x80:
- cntr += 1
- else:
- is_skip = True
- hi.append(unichr(cntr))
- cntr = skip_flip_offset + 1
-hi.append(unichr(cntr))
-
-low0 = low[0 : len(low) // 2]
-low1 = low[len(low) // 2 : len(low)]
-
-def escape(chars):
- result = []
- for c in chars:
- if "\r" == c:
- result.append("\\r")
- elif "\n" == c:
- result.append("\\n")
- elif "\t" == c:
- result.append("\\t")
- elif "\"" == c:
- result.append("\\\"")
- elif "\\" == c:
- result.append("\\\\")
- elif ord(c) < 32 or ord(c) >= 127:
- result.append("\\u%04X" % ord(c))
- else:
- result.append(c);
- return result
-
-
-source_code = [
- " private static final String DATA0 = \"", "".join(escape(low0)), "\";\n",
- " private static final String DATA1 = \"", "".join(escape(low1)), "\";\n",
- " private static final String SKIP_FLIP = \"", "".join(escape(hi)), "\";\n"
-]
-
-src_path = "DictionaryData.inc.java"
-
-with open(src_path, "w") as source:
- source.write("".join(source_code))
diff --git a/scripts/fix-win-bazel-build.py b/scripts/fix-win-bazel-build.py
deleted file mode 100644
index 7a9b211..0000000
--- a/scripts/fix-win-bazel-build.py
+++ /dev/null
@@ -1,36 +0,0 @@
-import fnmatch
-import os
-import os.path
-from shutil import copyfile
-
-print('Searching for manifests...')
-
-matches = []
-for root, dirnames, filenames in os.walk('bazel-bin\\org\\brotli'):
- for filename in fnmatch.filter(filenames, '*.runfiles_manifest'):
- matches.append(os.path.join(root, filename))
-
-for match in matches:
- print('Scanning manifest ' + match)
- runfiles = match[:-len('_manifest')]
- with open(match) as manifest:
- for entry in manifest:
- entry = entry.strip()
- if not entry.startswith("org_brotli_java"):
- continue
- if entry.startswith('org_brotli_java/external'):
- continue
- (alias, space, link) = entry.partition(' ')
- if alias.endswith('.jar') or alias.endswith('.exe'):
- continue
- link = link.replace('/', '\\')
- alias = alias.replace('/', '\\')
- dst = os.path.join(runfiles, alias)
- if not os.path.exists(dst):
- print(link + ' -> ' + dst)
- parent = os.path.dirname(dst)
- if not os.path.exists(parent):
- os.makedirs(parent)
- copyfile(link, dst)
-
-print('Finished resolving symlinks')
diff --git a/scripts/libbrotlicommon.pc.in b/scripts/libbrotlicommon.pc.in
deleted file mode 100644
index 2a8cf7a..0000000
--- a/scripts/libbrotlicommon.pc.in
+++ /dev/null
@@ -1,11 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: libbrotlicommon
-URL: https://github.com/google/brotli
-Description: Brotli common dictionary library
-Version: @PACKAGE_VERSION@
-Libs: -L${libdir} -lbrotlicommon
-Cflags: -I${includedir}
diff --git a/scripts/libbrotlidec.pc.in b/scripts/libbrotlidec.pc.in
deleted file mode 100644
index 6f8ef2e..0000000
--- a/scripts/libbrotlidec.pc.in
+++ /dev/null
@@ -1,12 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: libbrotlidec
-URL: https://github.com/google/brotli
-Description: Brotli decoder library
-Version: @PACKAGE_VERSION@
-Libs: -L${libdir} -lbrotlidec
-Requires.private: libbrotlicommon >= 1.0.2
-Cflags: -I${includedir}
diff --git a/scripts/libbrotlienc.pc.in b/scripts/libbrotlienc.pc.in
deleted file mode 100644
index 2098afe..0000000
--- a/scripts/libbrotlienc.pc.in
+++ /dev/null
@@ -1,12 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: libbrotlienc
-URL: https://github.com/google/brotli
-Description: Brotli encoder library
-Version: @PACKAGE_VERSION@
-Libs: -L${libdir} -lbrotlienc
-Requires.private: libbrotlicommon >= 1.0.2
-Cflags: -I${includedir}
diff --git a/scripts/sources.lst b/scripts/sources.lst
deleted file mode 100644
index 4ca22bc..0000000
--- a/scripts/sources.lst
+++ /dev/null
@@ -1,97 +0,0 @@
-# IT WOULD BE FOOLISH TO USE COMPUTERS TO AUTOMATE REPETITIVE TASKS:
-# ENLIST EVERY USED HEADER AND SOURCE FILE MANUALLY!
-
-BROTLI_CLI_C = \
- c/tools/brotli.c
-
-BROTLI_COMMON_C = \
- c/common/dictionary.c \
- c/common/transform.c
-
-BROTLI_COMMON_H = \
- c/common/constants.h \
- c/common/context.h \
- c/common/dictionary.h \
- c/common/platform.h \
- c/common/transform.h \
- c/common/version.h
-
-BROTLI_DEC_C = \
- c/dec/bit_reader.c \
- c/dec/decode.c \
- c/dec/huffman.c \
- c/dec/state.c
-
-BROTLI_DEC_H = \
- c/dec/bit_reader.h \
- c/dec/huffman.h \
- c/dec/prefix.h \
- c/dec/state.h
-
-BROTLI_ENC_C = \
- c/enc/backward_references.c \
- c/enc/backward_references_hq.c \
- c/enc/bit_cost.c \
- c/enc/block_splitter.c \
- c/enc/brotli_bit_stream.c \
- c/enc/cluster.c \
- c/enc/compress_fragment.c \
- c/enc/compress_fragment_two_pass.c \
- c/enc/dictionary_hash.c \
- c/enc/encode.c \
- c/enc/encoder_dict.c \
- c/enc/entropy_encode.c \
- c/enc/histogram.c \
- c/enc/literal_cost.c \
- c/enc/memory.c \
- c/enc/metablock.c \
- c/enc/static_dict.c \
- c/enc/utf8_util.c
-
-BROTLI_ENC_H = \
- c/enc/backward_references.h \
- c/enc/backward_references_hq.h \
- c/enc/backward_references_inc.h \
- c/enc/bit_cost.h \
- c/enc/bit_cost_inc.h \
- c/enc/block_encoder_inc.h \
- c/enc/block_splitter.h \
- c/enc/block_splitter_inc.h \
- c/enc/brotli_bit_stream.h \
- c/enc/cluster.h \
- c/enc/cluster_inc.h \
- c/enc/command.h \
- c/enc/compress_fragment.h \
- c/enc/compress_fragment_two_pass.h \
- c/enc/dictionary_hash.h \
- c/enc/encoder_dict.h \
- c/enc/entropy_encode.h \
- c/enc/entropy_encode_static.h \
- c/enc/fast_log.h \
- c/enc/find_match_length.h \
- c/enc/hash.h \
- c/enc/hash_forgetful_chain_inc.h \
- c/enc/hash_longest_match64_inc.h \
- c/enc/hash_longest_match_inc.h \
- c/enc/hash_longest_match_quickly_inc.h \
- c/enc/hash_to_binary_tree_inc.h \
- c/enc/histogram.h \
- c/enc/histogram_inc.h \
- c/enc/literal_cost.h \
- c/enc/memory.h \
- c/enc/metablock.h \
- c/enc/metablock_inc.h \
- c/enc/params.h \
- c/enc/prefix.h \
- c/enc/quality.h \
- c/enc/ringbuffer.h \
- c/enc/static_dict.h \
- c/enc/static_dict_lut.h \
- c/enc/utf8_util.h \
- c/enc/write_bits.h
-
-BROTLI_INCLUDE = \
- c/include/brotli/decode.h \
- c/include/brotli/encode.h \
- c/include/brotli/port.h \
- c/include/brotli/types.h
diff --git a/setup.py b/setup.py
index 7535fb2..a8a2ebe 100644
--- a/setup.py
+++ b/setup.py
@@ -182,7 +182,6 @@ EXT_MODULES = [
sources=[
'python/_brotli.cc',
'c/common/dictionary.c',
- 'c/common/transform.c',
'c/dec/bit_reader.c',
'c/dec/decode.c',
'c/dec/huffman.c',
@@ -197,7 +196,6 @@ EXT_MODULES = [
'c/enc/compress_fragment_two_pass.c',
'c/enc/dictionary_hash.c',
'c/enc/encode.c',
- 'c/enc/encoder_dict.c',
'c/enc/entropy_encode.c',
'c/enc/histogram.c',
'c/enc/literal_cost.c',
@@ -208,15 +206,15 @@ EXT_MODULES = [
],
depends=[
'c/common/constants.h',
- 'c/common/context.h',
'c/common/dictionary.h',
- 'c/common/platform.h',
- 'c/common/transform.h',
'c/common/version.h',
'c/dec/bit_reader.h',
+ 'c/dec/context.h',
'c/dec/huffman.h',
+ 'c/dec/port.h',
'c/dec/prefix.h',
'c/dec/state.h',
+ 'c/dec/transform.h',
'c/enc/backward_references.h',
'c/enc/backward_references_hq.h',
'c/enc/backward_references_inc.h',
@@ -231,8 +229,8 @@ EXT_MODULES = [
'c/enc/command.h',
'c/enc/compress_fragment.h',
'c/enc/compress_fragment_two_pass.h',
+ 'c/enc/context.h',
'c/enc/dictionary_hash.h',
- 'c/enc/encoder_dict.h',
'c/enc/entropy_encode.h',
'c/enc/entropy_encode_static.h',
'c/enc/fast_log.h',
@@ -249,7 +247,7 @@ EXT_MODULES = [
'c/enc/memory.h',
'c/enc/metablock.h',
'c/enc/metablock_inc.h',
- 'c/enc/params.h',
+ 'c/enc/port.h',
'c/enc/prefix.h',
'c/enc/quality.h',
'c/enc/ringbuffer.h',