diff --git a/cmake/sanitize.cmake b/cmake/sanitize.cmake index 0ccd6933dec..7a9e263778e 100644 --- a/cmake/sanitize.cmake +++ b/cmake/sanitize.cmake @@ -57,8 +57,8 @@ if (SANITIZE) endif () elseif (SANITIZE STREQUAL "undefined") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SAN_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all -fno-sanitize=float-divide-by-zero") - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SAN_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all -fno-sanitize=float-divide-by-zero") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SAN_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all -fno-sanitize=float-divide-by-zero -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/tests/ubsan_suppressions.txt") + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SAN_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all -fno-sanitize=float-divide-by-zero -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/tests/ubsan_suppressions.txt") if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined") endif() diff --git a/debian/clickhouse-server.init b/debian/clickhouse-server.init index f56164759bf..8f10153a682 100755 --- a/debian/clickhouse-server.init +++ b/debian/clickhouse-server.init @@ -153,82 +153,19 @@ initdb() start() { - [ -x $CLICKHOUSE_BINDIR/$PROGRAM ] || exit 0 - local EXIT_STATUS - EXIT_STATUS=0 - - echo -n "Start $PROGRAM service: " - - if is_running; then - echo -n "already running " - EXIT_STATUS=1 - else - ulimit -n 262144 - mkdir -p $CLICKHOUSE_PIDDIR - chown -R $CLICKHOUSE_USER:$CLICKHOUSE_GROUP $CLICKHOUSE_PIDDIR - initdb - if ! is_running; then - # Lock should not be held while running child process, so we release the lock. Note: obviously, there is race condition. - # But clickhouse-server has protection from simultaneous runs with same data directory. - su -s $SHELL ${CLICKHOUSE_USER} -c "$FLOCK -u 9; $CLICKHOUSE_PROGRAM_ENV exec -a \"$PROGRAM\" \"$CLICKHOUSE_BINDIR/$PROGRAM\" --daemon --pid-file=\"$CLICKHOUSE_PIDFILE\" --config-file=\"$CLICKHOUSE_CONFIG\"" - EXIT_STATUS=$? - if [ $EXIT_STATUS -ne 0 ]; then - return $EXIT_STATUS - fi - fi - fi - - if [ $EXIT_STATUS -eq 0 ]; then - attempts=0 - while ! is_running && [ $attempts -le ${CLICKHOUSE_START_TIMEOUT:=10} ]; do - attempts=$(($attempts + 1)) - sleep 1 - done - if is_running; then - echo "DONE" - else - echo "UNKNOWN" - fi - else - echo "FAILED" - fi - - return $EXIT_STATUS + ${CLICKHOUSE_GENERIC_PROGRAM} start --user "${CLICKHOUSE_USER}" --pid-path "${CLICKHOUSE_PIDDIR}" --config-path "${CLICKHOUSE_CONFDIR}" --binary-path "${CLICKHOUSE_BINDIR}" } stop() { - #local EXIT_STATUS - EXIT_STATUS=0 - - if [ -f $CLICKHOUSE_PIDFILE ]; then - - echo -n "Stop $PROGRAM service: " - - kill -TERM $(cat "$CLICKHOUSE_PIDFILE") - - if ! wait_for_done ${CLICKHOUSE_STOP_TIMEOUT}; then - EXIT_STATUS=2 - echo "TIMEOUT" - else - echo "DONE" - fi - - fi - return $EXIT_STATUS + ${CLICKHOUSE_GENERIC_PROGRAM} stop --pid-path "${CLICKHOUSE_PIDDIR}" } restart() { - check_config - if stop; then - if start; then - return 0 - fi - fi - return 1 + ${CLICKHOUSE_GENERIC_PROGRAM} restart --user "${CLICKHOUSE_USER}" --pid-path "${CLICKHOUSE_PIDDIR}" --config-path "${CLICKHOUSE_CONFDIR}" --binary-path "${CLICKHOUSE_BINDIR}" } diff --git a/debian/clickhouse-server.postinst b/debian/clickhouse-server.postinst index 6e031ae8f44..dc876f45954 100644 --- a/debian/clickhouse-server.postinst +++ b/debian/clickhouse-server.postinst @@ -2,6 +2,7 @@ set -e # set -x +PROGRAM=clickhouse-server CLICKHOUSE_USER=${CLICKHOUSE_USER:=clickhouse} CLICKHOUSE_GROUP=${CLICKHOUSE_GROUP:=${CLICKHOUSE_USER}} # Please note that we don't support paths with whitespaces. This is rather ignorant. @@ -12,6 +13,7 @@ CLICKHOUSE_BINDIR=${CLICKHOUSE_BINDIR:=/usr/bin} CLICKHOUSE_GENERIC_PROGRAM=${CLICKHOUSE_GENERIC_PROGRAM:=clickhouse} EXTRACT_FROM_CONFIG=${CLICKHOUSE_GENERIC_PROGRAM}-extract-from-config CLICKHOUSE_CONFIG=$CLICKHOUSE_CONFDIR/config.xml +CLICKHOUSE_PIDDIR=/var/run/$PROGRAM [ -f /usr/share/debconf/confmodule ] && . /usr/share/debconf/confmodule [ -f /etc/default/clickhouse ] && . /etc/default/clickhouse @@ -41,105 +43,5 @@ if [ "$1" = configure ] || [ -n "$not_deb_os" ]; then fi fi - # Make sure the administrative user exists - if ! getent passwd ${CLICKHOUSE_USER} > /dev/null; then - if [ -n "$not_deb_os" ]; then - useradd -r -s /bin/false --home-dir /nonexistent ${CLICKHOUSE_USER} > /dev/null - else - adduser --system --disabled-login --no-create-home --home /nonexistent \ - --shell /bin/false --group --gecos "ClickHouse server" ${CLICKHOUSE_USER} > /dev/null - fi - fi - - # if the user was created manually, make sure the group is there as well - if ! getent group ${CLICKHOUSE_GROUP} > /dev/null; then - groupadd -r ${CLICKHOUSE_GROUP} > /dev/null - fi - - # make sure user is in the correct group - if ! id -Gn ${CLICKHOUSE_USER} | grep -qw ${CLICKHOUSE_USER}; then - usermod -a -G ${CLICKHOUSE_GROUP} ${CLICKHOUSE_USER} > /dev/null - fi - - # check validity of user and group - if [ "$(id -u ${CLICKHOUSE_USER})" -eq 0 ]; then - echo "The ${CLICKHOUSE_USER} system user must not have uid 0 (root). -Please fix this and reinstall this package." >&2 - exit 1 - fi - - if [ "$(id -g ${CLICKHOUSE_GROUP})" -eq 0 ]; then - echo "The ${CLICKHOUSE_USER} system user must not have root as primary group. -Please fix this and reinstall this package." >&2 - exit 1 - fi - - if [ -x "$CLICKHOUSE_BINDIR/$EXTRACT_FROM_CONFIG" ] && [ -f "$CLICKHOUSE_CONFIG" ]; then - if [ -z "$SHELL" ]; then - SHELL="/bin/sh" - fi - CLICKHOUSE_DATADIR_FROM_CONFIG=$(su -s $SHELL ${CLICKHOUSE_USER} -c "$CLICKHOUSE_BINDIR/$EXTRACT_FROM_CONFIG --config-file=\"$CLICKHOUSE_CONFIG\" --key=path") ||: - echo "Path to data directory in ${CLICKHOUSE_CONFIG}: ${CLICKHOUSE_DATADIR_FROM_CONFIG}" - fi - CLICKHOUSE_DATADIR_FROM_CONFIG=${CLICKHOUSE_DATADIR_FROM_CONFIG:=$CLICKHOUSE_DATADIR} - - if [ ! -d ${CLICKHOUSE_DATADIR_FROM_CONFIG} ]; then - mkdir -p ${CLICKHOUSE_DATADIR_FROM_CONFIG} - chown ${CLICKHOUSE_USER}:${CLICKHOUSE_GROUP} ${CLICKHOUSE_DATADIR_FROM_CONFIG} - chmod 700 ${CLICKHOUSE_DATADIR_FROM_CONFIG} - fi - - if [ -d ${CLICKHOUSE_CONFDIR} ]; then - mkdir -p ${CLICKHOUSE_CONFDIR}/users.d - mkdir -p ${CLICKHOUSE_CONFDIR}/config.d - rm -fv ${CLICKHOUSE_CONFDIR}/*-preprocessed.xml ||: - fi - - [ -e ${CLICKHOUSE_CONFDIR}/preprocessed ] || ln -s ${CLICKHOUSE_DATADIR_FROM_CONFIG}/preprocessed_configs ${CLICKHOUSE_CONFDIR}/preprocessed ||: - - if [ ! -d ${CLICKHOUSE_LOGDIR} ]; then - mkdir -p ${CLICKHOUSE_LOGDIR} - chown root:${CLICKHOUSE_GROUP} ${CLICKHOUSE_LOGDIR} - # Allow everyone to read logs, root and clickhouse to read-write - chmod 775 ${CLICKHOUSE_LOGDIR} - fi - - # Set net_admin capabilities to support introspection of "taskstats" performance metrics from the kernel - # and ipc_lock capabilities to allow mlock of clickhouse binary. - - # 1. Check that "setcap" tool exists. - # 2. Check that an arbitrary program with installed capabilities can run. - # 3. Set the capabilities. - - # The second is important for Docker and systemd-nspawn. - # When the container has no capabilities, - # but the executable file inside the container has capabilities, - # then attempt to run this file will end up with a cryptic "Operation not permitted" message. - - TMPFILE=/tmp/test_setcap.sh - - command -v setcap >/dev/null \ - && echo > $TMPFILE && chmod a+x $TMPFILE && $TMPFILE && setcap "cap_net_admin,cap_ipc_lock,cap_sys_nice+ep" $TMPFILE && $TMPFILE && rm $TMPFILE \ - && setcap "cap_net_admin,cap_ipc_lock,cap_sys_nice+ep" "${CLICKHOUSE_BINDIR}/${CLICKHOUSE_GENERIC_PROGRAM}" \ - || echo "Cannot set 'net_admin' or 'ipc_lock' or 'sys_nice' capability for clickhouse binary. This is optional. Taskstats accounting will be disabled. To enable taskstats accounting you may add the required capability later manually." - - # Clean old dynamic compilation results - if [ -d "${CLICKHOUSE_DATADIR_FROM_CONFIG}/build" ]; then - rm -f ${CLICKHOUSE_DATADIR_FROM_CONFIG}/build/*.cpp ${CLICKHOUSE_DATADIR_FROM_CONFIG}/build/*.so ||: - fi - - if [ -f /usr/share/debconf/confmodule ]; then - db_get clickhouse-server/default-password - defaultpassword="$RET" - if [ -n "$defaultpassword" ]; then - echo "$defaultpassword" > ${CLICKHOUSE_CONFDIR}/users.d/default-password.xml - chown ${CLICKHOUSE_USER}:${CLICKHOUSE_GROUP} ${CLICKHOUSE_CONFDIR}/users.d/default-password.xml - chmod 600 ${CLICKHOUSE_CONFDIR}/users.d/default-password.xml - fi - - # everything went well, so now let's reset the password - db_set clickhouse-server/default-password "" - # ... done with debconf here - db_stop - fi + ${CLICKHOUSE_GENERIC_PROGRAM} install --user "${CLICKHOUSE_USER}" --group "${CLICKHOUSE_GROUP}" --pid-path "${CLICKHOUSE_PIDDIR}" --config-path "${CLICKHOUSE_CONFDIR}" --binary-path "${CLICKHOUSE_BINDIR}" --log-path "${CLICKHOUSE_LOGDIR}" --data-path "${CLICKHOUSE_DATADIR}" fi diff --git a/docker/test/fasttest/Dockerfile b/docker/test/fasttest/Dockerfile index bed438a6579..6547a98c58b 100644 --- a/docker/test/fasttest/Dockerfile +++ b/docker/test/fasttest/Dockerfile @@ -53,7 +53,6 @@ RUN apt-get update \ ninja-build \ psmisc \ python3 \ - python3-pip \ python3-lxml \ python3-requests \ python3-termcolor \ @@ -63,8 +62,6 @@ RUN apt-get update \ unixodbc \ --yes --no-install-recommends -RUN pip3 install numpy scipy pandas - # This symlink required by gcc to find lld compiler RUN ln -s /usr/bin/lld-${LLVM_VERSION} /usr/bin/ld.lld diff --git a/docker/test/fasttest/run.sh b/docker/test/fasttest/run.sh index f12ecbb2c9c..ed1346043bc 100755 --- a/docker/test/fasttest/run.sh +++ b/docker/test/fasttest/run.sh @@ -219,6 +219,8 @@ TESTS_TO_SKIP=( 01268_dictionary_direct_layout 01280_ssd_complex_key_dictionary 01281_group_by_limit_memory_tracking # max_memory_usage_for_user can interfere another queries running concurrently + 01318_encrypt # Depends on OpenSSL + 01318_decrypt # Depends on OpenSSL 01281_unsucceeded_insert_select_queries_counter 01292_create_user 01294_lazy_database_concurrent diff --git a/docker/test/performance-comparison/README.md b/docker/test/performance-comparison/README.md index 3953e99fc0f..782644a81dd 100644 --- a/docker/test/performance-comparison/README.md +++ b/docker/test/performance-comparison/README.md @@ -48,12 +48,13 @@ This table shows queries that take significantly longer to process on the client #### Unexpected Query Duration Action required for every item -- these are errors that must be fixed. -Queries that have "short" duration (on the order of 0.1 s) can't be reliably tested in a normal way, where we perform a small (about ten) measurements for each server, because the signal-to-noise ratio is much smaller. There is a special mode for such queries that instead runs them for a fixed amount of time, normally with much higher number of measurements (up to thousands). This mode must be explicitly enabled by the test author to avoid accidental errors. It must be used only for queries that are meant to complete "immediately", such as `select count(*)`. If your query is not supposed to be "immediate", try to make it run longer, by e.g. processing more data. +A query is supposed to run longer than 0.1 second. If your query runs faster, increase the amount of processed data to bring the run time above this threshold. You can use a bigger table (e.g. `hits_100m` instead of `hits_10m`), increase a `LIMIT`, make a query single-threaded, and so on. Queries that are too fast suffer from poor stability and precision. -This table shows queries for which the "short" marking is not consistent with the actual query run time -- i.e., a query runs for a long time but is marked as short, or it runs very fast but is not marked as short. +Sometimes you want to test a query that is supposed to complete "instantaneously", i.e. in sublinear time. This might be `count(*)`, or parsing a complicated tuple. It might not be practical or even possible to increase the run time of such queries by adding more data. For such queries there is a specal comparison mode which runs them for a fixed amount of time, instead of a fixed number of iterations like we do normally. This mode is inferior to the normal mode, because the influence of noise and overhead is higher, which leads to less precise and stable results. -If your query is really supposed to complete "immediately" and can't be made to run longer, you have to mark it as "short". To do so, write `...` in the test file. The value of "short" attribute is evaluated as a python expression, and substitutions are performed, so you can write something like `select count(*) from table where {column1} > {column2}`, to mark only a particular combination of variables as short. +If it is impossible to increase the run time of a query and it is supposed to complete "immediately", you have to explicitly mark this in the test. To do so, add a `short` attribute to the query tag in the test file: `...`. The value of the `short` attribute is evaluated as a python expression, and substitutions are performed, so you can write something like `select count(*) from table where {column1} > {column2}`, to mark only a particular combination of variables as short. +This table shows queries for which the `short` marking is not consistent with the actual query run time -- i.e., a query runs for a normal time but is marked as `short`, or it runs faster than normal but is not marked as `short`. #### Partial Queries Action required for the cells marked in red. diff --git a/docker/test/performance-comparison/report.py b/docker/test/performance-comparison/report.py index 1f55300661b..9d3ccabb788 100755 --- a/docker/test/performance-comparison/report.py +++ b/docker/test/performance-comparison/report.py @@ -468,14 +468,14 @@ if args.report == 'main': return columns = [ - 'Test', #0 - 'Wall clock time, s', #1 - 'Total client time, s', #2 - 'Total queries', #3 - 'Longest query
(sum for all runs), s', #4 - 'Avg wall clock time
(sum for all runs), s', #5 - 'Shortest query
(sum for all runs), s', #6 - '', # Runs #7 + 'Test', #0 + 'Wall clock time, entire test, s', #1 + 'Total client time for measured query runs, s', #2 + 'Queries', #3 + 'Longest query, total for measured runs, s', #4 + 'Wall clock time per query, s', #5 + 'Shortest query, total for measured runs, s', #6 + '', # Runs #7 ] attrs = ['' for c in columns] attrs[7] = None diff --git a/docs/en/introduction/adopters.md b/docs/en/introduction/adopters.md index b85aa9b261f..c4d74ea6ee6 100644 --- a/docs/en/introduction/adopters.md +++ b/docs/en/introduction/adopters.md @@ -88,6 +88,7 @@ toc_title: Adopters | SMI2 | News | Analytics | — | — | [Blog Post in Russian, November 2017](https://habr.com/ru/company/smi2/blog/314558/) | | Splunk | Business Analytics | Main product | — | — | [Slides in English, January 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup12/splunk.pdf) | | Spotify | Music | Experimentation | — | — | [Slides, July 2018](https://www.slideshare.net/glebus/using-clickhouse-for-experimentation-104247173) | +| Staffcop | Information Security | Main Product | — | — | [Official website, Documentation](https://www.staffcop.ru/sce43) | | Tencent | Big Data | Data processing | — | — | [Slides in Chinese, October 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/5.%20ClickHouse大数据集群应用_李俊飞腾讯网媒事业部.pdf) | | Tencent | Messaging | Logging | — | — | [Talk in Chinese, November 2019](https://youtu.be/T-iVQRuw-QY?t=5050) | | Traffic Stars | AD network | — | — | — | [Slides in Russian, May 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup15/lightning/ninja.pdf) | diff --git a/docs/en/operations/settings/settings.md b/docs/en/operations/settings/settings.md index f93a8b680b5..1efb7cfa8d6 100644 --- a/docs/en/operations/settings/settings.md +++ b/docs/en/operations/settings/settings.md @@ -305,6 +305,10 @@ When enabled, replace empty input fields in TSV with default values. For complex Disabled by default. +## input_format_tsv_enum_as_number {#settings-input_format_tsv_enum_as_number} + +For TSV input format switches to parsing enum values as enum ids. + ## input_format_null_as_default {#settings-input-format-null-as-default} Enables or disables using default values if input data contain `NULL`, but the data type of the corresponding column in not `Nullable(T)` (for text input formats). @@ -1161,6 +1165,10 @@ The character is interpreted as a delimiter in the CSV data. By default, the del For CSV input format enables or disables parsing of unquoted `NULL` as literal (synonym for `\N`). +## input_format_csv_enum_as_number {#settings-input_format_csv_enum_as_number} + +For CSV input format switches to parsing enum values as enum ids. + ## output_format_csv_crlf_end_of_line {#settings-output-format-csv-crlf-end-of-line} Use DOS/Windows-style line separator (CRLF) in CSV instead of Unix style (LF). @@ -1398,6 +1406,17 @@ Possible values: Default value: 0 +## allow_nondeterministic_optimize_skip_unused_shards {#allow-nondeterministic-optimize-skip-unused-shards} + +Allow nondeterministic (like `rand` or `dictGet`, since later has some caveats with updates) functions in sharding key. + +Possible values: + +- 0 — Disallowed. +- 1 — Allowed. + +Default value: 0 + ## optimize_skip_unused_shards_nesting {#optimize-skip-unused-shards-nesting} Controls [`optimize_skip_unused_shards`](#optimize-skip-unused-shards) (hence still requires [`optimize_skip_unused_shards`](#optimize-skip-unused-shards)) depends on the nesting level of the distributed query (case when you have `Distributed` table that look into another `Distributed` table). diff --git a/docs/en/sql-reference/functions/string-search-functions.md b/docs/en/sql-reference/functions/string-search-functions.md index 5f08417f349..881139f103c 100644 --- a/docs/en/sql-reference/functions/string-search-functions.md +++ b/docs/en/sql-reference/functions/string-search-functions.md @@ -461,6 +461,66 @@ For other regular expressions, the code is the same as for the ‘match’ funct The same thing as ‘like’, but negative. +## ilike {#ilike} + +Case insensitive variant of [like](https://clickhouse.tech/docs/en/sql-reference/functions/string-search-functions/#function-like) function. You can use `ILIKE` operator instead of the `ilike` function. + +**Syntax** + +``` sql +ilike(haystack, pattern) +``` + +**Parameters** + +- `haystack` — Input string. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `pattern` — If `pattern` doesn't contain percent signs or underscores, then the `pattern` only represents the string itself. An underscore (`_`) in `pattern` stands for (matches) any single character. A percent sign (`%`) matches any sequence of zero or more characters. + +Some `pattern` examples: + +``` text +'abc' ILIKE 'abc' true +'abc' ILIKE 'a%' true +'abc' ILIKE '_b_' true +'abc' ILIKE 'c' false +``` + +**Returned values** + +- True, if the string matches `pattern`. +- False, if the string doesn't match `pattern`. + +**Example** + +Input table: + +``` text +┌─id─┬─name─────┬─days─┐ +│ 1 │ January │ 31 │ +│ 2 │ February │ 29 │ +│ 3 │ March │ 31 │ +│ 4 │ April │ 30 │ +└────┴──────────┴──────┘ +``` + +Query: + +``` sql +SELECT * FROM Months WHERE ilike(name, '%j%') +``` + +Result: + +``` text +┌─id─┬─name────┬─days─┐ +│ 1 │ January │ 31 │ +└────┴─────────┴──────┘ +``` + +**See Also** + +- [like](https://clickhouse.tech/docs/en/sql-reference/functions/string-search-functions/#function-like) + ## ngramDistance(haystack, needle) {#ngramdistancehaystack-needle} Calculates the 4-gram distance between `haystack` and `needle`: counts the symmetric difference between two multisets of 4-grams and normalizes it by the sum of their cardinalities. Returns float number from 0 to 1 – the closer to zero, the more strings are similar to each other. If the constant `needle` or `haystack` is more than 32Kb, throws an exception. If some of the non-constant `haystack` or `needle` strings are more than 32Kb, the distance is always one. diff --git a/docs/en/sql-reference/operators/index.md b/docs/en/sql-reference/operators/index.md index e07febf9ec9..3fe3384fffc 100644 --- a/docs/en/sql-reference/operators/index.md +++ b/docs/en/sql-reference/operators/index.md @@ -53,6 +53,8 @@ ClickHouse transforms operators to their corresponding functions at the query pa `a NOT LIKE s` – The `notLike(a, b)` function. +`a ILIKE s` – The `ilike(a, b)` function. + `a BETWEEN b AND c` – The same as `a >= b AND a <= c`. `a NOT BETWEEN b AND c` – The same as `a < b OR a > c`. diff --git a/docs/en/sql-reference/statements/create/table.md b/docs/en/sql-reference/statements/create/table.md index 016641b958d..9aecc6c07f7 100644 --- a/docs/en/sql-reference/statements/create/table.md +++ b/docs/en/sql-reference/statements/create/table.md @@ -139,7 +139,7 @@ ENGINE = ``` The `Default` codec can be specified to reference default compression which may dependend on different settings (and properties of data) in runtime. -Example: `value UInt64 CODEC(Default)` - the same as lack of codec specification. +Example: `value UInt64 CODEC(Default)` — the same as lack of codec specification. Also you can remove current CODEC from the column and use default compression from config.xml: diff --git a/docs/en/sql-reference/table-functions/view.md b/docs/en/sql-reference/table-functions/view.md new file mode 100644 index 00000000000..9997971af65 --- /dev/null +++ b/docs/en/sql-reference/table-functions/view.md @@ -0,0 +1,67 @@ +--- +toc_priority: 51 +toc_title: view +--- + +## view {#view} + +Turns a subquery into a table. The function implements views (see [CREATE VIEW](https://clickhouse.tech/docs/en/sql-reference/statements/create/view/#create-view)). The resulting table doesn't store data, but only stores the specified `SELECT` query. When reading from the table, ClickHouse executes the query and deletes all unnecessary columns from the result. + +**Syntax** + +``` sql +view(subquery) +``` + +**Parameters** + +- `subquery` — `SELECT` query. + +**Returned value** + +- A table. + +**Example** + +Input table: + +``` text +┌─id─┬─name─────┬─days─┐ +│ 1 │ January │ 31 │ +│ 2 │ February │ 29 │ +│ 3 │ March │ 31 │ +│ 4 │ April │ 30 │ +└────┴──────────┴──────┘ +``` + +Query: + +``` sql +SELECT * FROM view(SELECT name FROM months) +``` + +Result: + +``` text +┌─name─────┐ +│ January │ +│ February │ +│ March │ +│ April │ +└──────────┘ +``` + +You can use the `view` function as a parameter of the [remote](https://clickhouse.tech/docs/en/sql-reference/table-functions/remote/#remote-remotesecure) and [cluster](https://clickhouse.tech/docs/en/sql-reference/table-functions/cluster/#cluster-clusterallreplicas) table functions: + +``` sql +SELECT * FROM remote(`127.0.0.1`, view(SELECT a, b, c FROM table_name)) +``` + +``` sql +SELECT * FROM cluster(`cluster_name`, view(SELECT a, b, c FROM table_name)) +``` + +**See Also** + +- [View Table Engine](https://clickhouse.tech/docs/en/engines/table-engines/special/view/) +[Original article](https://clickhouse.tech/docs/en/query_language/table_functions/view/) \ No newline at end of file diff --git a/docs/ru/operations/system-tables/query_log.md b/docs/ru/operations/system-tables/query_log.md index 340e77d85da..27ed93e874e 100644 --- a/docs/ru/operations/system-tables/query_log.md +++ b/docs/ru/operations/system-tables/query_log.md @@ -34,6 +34,7 @@ ClickHouse не удаляет данные из таблица автомати - `event_date` ([Date](../../sql-reference/data-types/date.md)) — дата начала запроса. - `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — время начала запроса. - `query_start_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — время начала обработки запроса. +- `query_start_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — время начала обработки запроса с точностью до микросекунд. - `query_duration_ms` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — длительность выполнения запроса в миллисекундах. - `read_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Общее количество строк, считанных из всех таблиц и табличных функций, участвующих в запросе. Включает в себя обычные подзапросы, подзапросы для `IN` и `JOIN`. Для распределенных запросов `read_rows` включает в себя общее количество строк, прочитанных на всех репликах. Каждая реплика передает собственное значение `read_rows`, а сервер-инициатор запроса суммирует все полученные и локальные значения. Объемы кэша не учитываюся. - `read_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Общее количество байтов, считанных из всех таблиц и табличных функций, участвующих в запросе. Включает в себя обычные подзапросы, подзапросы для `IN` и `JOIN`. Для распределенных запросов `read_bytes` включает в себя общее количество байтов, прочитанных на всех репликах. Каждая реплика передает собственное значение `read_bytes`, а сервер-инициатор запроса суммирует все полученные и локальные значения. Объемы кэша не учитываюся. diff --git a/docs/ru/operations/system-tables/query_thread_log.md b/docs/ru/operations/system-tables/query_thread_log.md index acee3063323..11571f594d5 100644 --- a/docs/ru/operations/system-tables/query_thread_log.md +++ b/docs/ru/operations/system-tables/query_thread_log.md @@ -16,6 +16,7 @@ ClickHouse не удаляет данные из таблицы автомати - `event_date` ([Date](../../sql-reference/data-types/date.md)) — дата завершения выполнения запроса потоком. - `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — дата и время завершения выполнения запроса потоком. - `query_start_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — время начала обработки запроса. +- `query_start_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — время начала обработки запроса с точностью до микросекунд. - `query_duration_ms` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — длительность обработки запроса в миллисекундах. - `read_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — количество прочитанных строк. - `read_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — количество прочитанных байтов. diff --git a/docs/ru/sql-reference/functions/string-search-functions.md b/docs/ru/sql-reference/functions/string-search-functions.md index 29dd67fd0eb..078a09a8aa4 100644 --- a/docs/ru/sql-reference/functions/string-search-functions.md +++ b/docs/ru/sql-reference/functions/string-search-functions.md @@ -442,6 +442,66 @@ SELECT extractAllGroupsVertical('abc=111, def=222, ghi=333', '("[^"]+"|\\w+)=("[ То же, что like, но с отрицанием. +## ilike {#ilike} + +Нечувствительный к регистру вариант функции [like](https://clickhouse.tech/docs/ru/sql-reference/functions/string-search-functions/#function-like). Вы можете использовать оператор `ILIKE` вместо функции `ilike`. + +**Синтаксис** + +``` sql +ilike(haystack, pattern) +``` + +**Параметры** + +- `haystack` — Входная строка. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `pattern` — Если `pattern` не содержит процента или нижнего подчеркивания, тогда `pattern` представляет саму строку. Нижнее подчеркивание (`_`) в `pattern` обозначает любой отдельный символ. Знак процента (`%`) соответствует последовательности из любого количества символов: от нуля и более. + +Некоторые примеры `pattern`: + +``` text +'abc' ILIKE 'abc' true +'abc' ILIKE 'a%' true +'abc' ILIKE '_b_' true +'abc' ILIKE 'c' false +``` + +**Возвращаемые значения** + +- Правда, если строка соответствует `pattern`. +- Ложь, если строка не соответствует `pattern`. + +**Пример** + +Входная таблица: + +``` text +┌─id─┬─name─────┬─days─┐ +│ 1 │ January │ 31 │ +│ 2 │ February │ 29 │ +│ 3 │ March │ 31 │ +│ 4 │ April │ 30 │ +└────┴──────────┴──────┘ +``` + +Запрос: + +``` sql +SELECT * FROM Months WHERE ilike(name, '%j%') +``` + +Результат: + +``` text +┌─id─┬─name────┬─days─┐ +│ 1 │ January │ 31 │ +└────┴─────────┴──────┘ +``` + +**Смотрите также** + +- [like](https://clickhouse.tech/docs/ru/sql-reference/functions/string-search-functions/#function-like) + ## ngramDistance(haystack, needle) {#ngramdistancehaystack-needle} Вычисление 4-граммного расстояния между `haystack` и `needle`: считается симметрическая разность между двумя мультимножествами 4-грамм и нормализуется на сумму их мощностей. Возвращает число float от 0 до 1 – чем ближе к нулю, тем больше строки похожи друг на друга. Если константный `needle` или `haystack` больше чем 32КБ, кидается исключение. Если некоторые строки из неконстантного `haystack` или `needle` больше 32КБ, расстояние всегда равно единице. diff --git a/docs/ru/sql-reference/operators/index.md b/docs/ru/sql-reference/operators/index.md index ef4d1ae048e..08594193d4c 100644 --- a/docs/ru/sql-reference/operators/index.md +++ b/docs/ru/sql-reference/operators/index.md @@ -49,6 +49,8 @@ `a NOT LIKE s` - функция `notLike(a, b)` +`a ILIKE s` – функция `ilike(a, b)` + `a BETWEEN b AND c` - равнозначно `a >= b AND a <= c` `a NOT BETWEEN b AND c` - равнозначно `a < b OR a > c` diff --git a/docs/ru/sql-reference/statements/create/table.md b/docs/ru/sql-reference/statements/create/table.md index 74eb0ff56e7..c6093bbc6de 100644 --- a/docs/ru/sql-reference/statements/create/table.md +++ b/docs/ru/sql-reference/statements/create/table.md @@ -119,7 +119,18 @@ ENGINE = ... ``` -Если задать кодек для столбца, то кодек по умолчанию не применяется. Кодеки можно последовательно комбинировать, например, `CODEC(Delta, ZSTD)`. Чтобы выбрать наиболее подходящую для вашего проекта комбинацию кодеков, необходимо провести сравнительные тесты, подобные тем, что описаны в статье Altinity [New Encodings to Improve ClickHouse Efficiency](https://www.altinity.com/blog/2019/7/new-encodings-to-improve-clickhouse). +Если кодек `Default` задан для столбца, используется сжатие по умолчанию, которое может зависеть от различных настроек (и свойств данных) во время выполнения. +Пример: `value UInt64 CODEC(Default)` — то же самое, что не указать кодек. + +Также можно подменить кодек столбца сжатием по умолчанию, определенным в config.xml: + +``` sql +ALTER TABLE codec_example MODIFY COLUMN float_value CODEC(Default); +``` + +Кодеки можно последовательно комбинировать, например, `CODEC(Delta, Default)`. + +Чтобы выбрать наиболее подходящую для вашего проекта комбинацию кодеков, необходимо провести сравнительные тесты, подобные тем, что описаны в статье Altinity [New Encodings to Improve ClickHouse Efficiency](https://www.altinity.com/blog/2019/7/new-encodings-to-improve-clickhouse). Для столбцов типа `ALIAS` кодеки не применяются. !!! warning "Предупреждение" Нельзя распаковать базу данных ClickHouse с помощью сторонних утилит наподобие `lz4`. Необходимо использовать специальную утилиту [clickhouse-compressor](https://github.com/ClickHouse/ClickHouse/tree/master/programs/compressor). @@ -195,4 +206,4 @@ CREATE TEMPORARY TABLE [IF NOT EXISTS] table_name [Оригинальная статья](https://clickhouse.tech/docs/ru/sql-reference/statements/create/table) - \ No newline at end of file + diff --git a/docs/ru/sql-reference/table-functions/view.md b/docs/ru/sql-reference/table-functions/view.md new file mode 100644 index 00000000000..8a97253d048 --- /dev/null +++ b/docs/ru/sql-reference/table-functions/view.md @@ -0,0 +1,62 @@ +## view {#view} + +Преобразовывает подзапрос в таблицу. Функция реализовывает представления (смотрите [CREATE VIEW](https://clickhouse.tech/docs/ru/sql-reference/statements/create/view/#create-view)). Результирующая таблица не хранит данные, а только сохраняет указанный запрос `SELECT`. При чтении из таблицы, ClickHouse выполняет запрос и удаляет все ненужные столбцы из результата. + +**Синтаксис** + +``` sql +view(subquery) +``` + +**Входные параметры** + +- `subquery` — запрос `SELECT`. + +**Возвращаемое значение** + +- Таблица. + +**Пример** + +Входная таблица: + +``` text +┌─id─┬─name─────┬─days─┐ +│ 1 │ January │ 31 │ +│ 2 │ February │ 29 │ +│ 3 │ March │ 31 │ +│ 4 │ April │ 30 │ +└────┴──────────┴──────┘ +``` + +Запрос: + +``` sql +SELECT * FROM view(SELECT name FROM months) +``` + +Результат: + +``` text +┌─name─────┐ +│ January │ +│ February │ +│ March │ +│ April │ +└──────────┘ +``` + +Вы можете использовать функцию `view` как параметр табличных функций [remote](https://clickhouse.tech/docs/ru/sql-reference/table-functions/remote/#remote-remotesecure) и [cluster](https://clickhouse.tech/docs/ru/sql-reference/table-functions/cluster/#cluster-clusterallreplicas): + +``` sql +SELECT * FROM remote(`127.0.0.1`, view(SELECT a, b, c FROM table_name)) +``` + +``` sql +SELECT * FROM cluster(`cluster_name`, view(SELECT a, b, c FROM table_name)) +``` + +**Смотрите также** + +- [view](https://clickhouse.tech/docs/ru/engines/table-engines/special/view/#table_engines-view) +[Оригинальная статья](https://clickhouse.tech/docs/ru/query_language/table_functions/view/) \ No newline at end of file diff --git a/docs/tools/requirements.txt b/docs/tools/requirements.txt index 68a72a6a785..c4559696b16 100644 --- a/docs/tools/requirements.txt +++ b/docs/tools/requirements.txt @@ -14,7 +14,7 @@ Jinja2==2.11.2 jinja2-highlight==0.6.1 jsmin==2.2.2 livereload==2.6.2 -Markdown==3.2.1 +Markdown==3.3.2 MarkupSafe==1.1.1 mkdocs==1.1.2 mkdocs-htmlproofer-plugin==0.0.3 diff --git a/programs/install/Install.cpp b/programs/install/Install.cpp index ae0c22c8fcc..8290118089c 100644 --- a/programs/install/Install.cpp +++ b/programs/install/Install.cpp @@ -548,11 +548,27 @@ int mainEntryClickHouseInstall(int argc, char ** argv) users_config_file.string(), users_d.string()); } - /// Set capabilities for the binary. + /** Set capabilities for the binary. + * + * 1. Check that "setcap" tool exists. + * 2. Check that an arbitrary program with installed capabilities can run. + * 3. Set the capabilities. + * + * The second is important for Docker and systemd-nspawn. + * When the container has no capabilities, + * but the executable file inside the container has capabilities, + * then attempt to run this file will end up with a cryptic "Operation not permitted" message. + */ #if defined(__linux__) fmt::print("Setting capabilities for clickhouse binary. This is optional.\n"); - std::string command = fmt::format("command -v setcap && setcap 'cap_net_admin,cap_ipc_lock,cap_sys_nice+ep' {}", main_bin_path.string()); + std::string command = fmt::format("command -v setcap >/dev/null" + " && echo > {0} && chmod a+x {0} && {0} && setcap 'cap_net_admin,cap_ipc_lock,cap_sys_nice+ep' {0} && {0} && rm {0}" + " && setcap 'cap_net_admin,cap_ipc_lock,cap_sys_nice+ep' {1}" + " || echo \"Cannot set 'net_admin' or 'ipc_lock' or 'sys_nice' capability for clickhouse binary." + " This is optional. Taskstats accounting will be disabled." + " To enable taskstats accounting you may add the required capability later manually.\"", + "/tmp/test_setcap.sh", main_bin_path.string()); fmt::print(" {}\n", command); executeScript(command); #endif diff --git a/programs/server/CMakeLists.txt b/programs/server/CMakeLists.txt index b3dcf1955fe..198d9081168 100644 --- a/programs/server/CMakeLists.txt +++ b/programs/server/CMakeLists.txt @@ -4,7 +4,7 @@ set(CLICKHOUSE_SERVER_SOURCES ) if (OS_LINUX) - set (LINK_CONFIG_LIB INTERFACE "-Wl,${WHOLE_ARCHIVE} $ -Wl,${NO_WHOLE_ARCHIVE}") + set (LINK_RESOURCE_LIB INTERFACE "-Wl,${WHOLE_ARCHIVE} $ -Wl,${NO_WHOLE_ARCHIVE}") endif () set (CLICKHOUSE_SERVER_LINK @@ -20,7 +20,7 @@ set (CLICKHOUSE_SERVER_LINK clickhouse_table_functions string_utils - ${LINK_CONFIG_LIB} + ${LINK_RESOURCE_LIB} PUBLIC daemon @@ -37,20 +37,20 @@ if (OS_LINUX) # 1. Allow to run the binary without download of any other files. # 2. Allow to implement "sudo clickhouse install" tool. - foreach(CONFIG_FILE config users embedded) - set(CONFIG_OBJ ${CONFIG_FILE}.o) - set(CONFIG_OBJS ${CONFIG_OBJS} ${CONFIG_OBJ}) + foreach(RESOURCE_FILE config.xml users.xml embedded.xml play.html) + set(RESOURCE_OBJ ${RESOURCE_FILE}.o) + set(RESOURCE_OBJS ${RESOURCE_OBJS} ${RESOURCE_OBJ}) # https://stackoverflow.com/questions/14776463/compile-and-add-an-object-file-from-a-binary-with-cmake - add_custom_command(OUTPUT ${CONFIG_OBJ} - COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${OBJCOPY_PATH} -I binary ${OBJCOPY_ARCH_OPTIONS} ${CONFIG_FILE}.xml ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_OBJ} + add_custom_command(OUTPUT ${RESOURCE_OBJ} + COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && ${OBJCOPY_PATH} -I binary ${OBJCOPY_ARCH_OPTIONS} ${RESOURCE_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${RESOURCE_OBJ} COMMAND ${OBJCOPY_PATH} --rename-section .data=.rodata,alloc,load,readonly,data,contents - ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_OBJ} ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_OBJ}) + ${CMAKE_CURRENT_BINARY_DIR}/${RESOURCE_OBJ} ${CMAKE_CURRENT_BINARY_DIR}/${RESOURCE_OBJ}) - set_source_files_properties(${CONFIG_OBJ} PROPERTIES EXTERNAL_OBJECT true GENERATED true) - endforeach(CONFIG_FILE) + set_source_files_properties(${RESOURCE_OBJ} PROPERTIES EXTERNAL_OBJECT true GENERATED true) + endforeach(RESOURCE_FILE) - add_library(clickhouse_server_configs STATIC ${CONFIG_OBJS}) + add_library(clickhouse_server_configs STATIC ${RESOURCE_OBJS}) set_target_properties(clickhouse_server_configs PROPERTIES LINKER_LANGUAGE C) # whole-archive prevents symbols from being discarded for unknown reason diff --git a/programs/server/config.xml b/programs/server/config.xml index 83921b12382..9850d77abb7 100644 --- a/programs/server/config.xml +++ b/programs/server/config.xml @@ -212,22 +212,10 @@ /var/lib/clickhouse/user_files/ - - - - - users.xml - - - - /var/lib/clickhouse/access/ - - - - + - + + + + + users.xml + + + + /var/lib/clickhouse/access/ + + + + + default @@ -704,18 +722,22 @@ --> /var/lib/clickhouse/format_schemas/ - - hide SSN - \b\d{3}-\d{2}-\d{4}\b - 000-00-0000 + hide encrypt/decrypt arguments + ((?:aes_)?(?:encrypt|decrypt)(?:_mysql)?)\s*\(\s*(?:'(?:\\'|.)+'|.*?)\s*\) + + \1(???) - --> + + + ClickHouse Query + + + + + + + +
+ +
+
+ +
+
+ +  (Ctrl+Enter) + + 🌑🌞 +
+
+
+

+    
+

+

+ + + + diff --git a/src/Access/AccessControlManager.cpp b/src/Access/AccessControlManager.cpp index ecbb02966f0..56d225f64f4 100644 --- a/src/Access/AccessControlManager.cpp +++ b/src/Access/AccessControlManager.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -253,6 +254,12 @@ void AccessControlManager::addMemoryStorage(const String & storage_name_) } +void AccessControlManager::addLDAPStorage(const String & storage_name_, const Poco::Util::AbstractConfiguration & config_, const String & prefix_) +{ + addStorage(std::make_shared(storage_name_, this, config_, prefix_)); +} + + void AccessControlManager::addStoragesFromUserDirectoriesConfig( const Poco::Util::AbstractConfiguration & config, const String & key, @@ -275,6 +282,8 @@ void AccessControlManager::addStoragesFromUserDirectoriesConfig( type = UsersConfigAccessStorage::STORAGE_TYPE; else if ((type == "local") || (type == "local_directory")) type = DiskAccessStorage::STORAGE_TYPE; + else if (type == "ldap") + type = LDAPAccessStorage::STORAGE_TYPE; String name = config.getString(prefix + ".name", type); @@ -295,6 +304,10 @@ void AccessControlManager::addStoragesFromUserDirectoriesConfig( bool readonly = config.getBool(prefix + ".readonly", false); addDiskStorage(name, path, readonly); } + else if (type == LDAPAccessStorage::STORAGE_TYPE) + { + addLDAPStorage(name, config, prefix); + } else throw Exception("Unknown storage type '" + type + "' at " + prefix + " in config", ErrorCodes::UNKNOWN_ELEMENT_IN_CONFIG); } @@ -346,7 +359,7 @@ UUID AccessControlManager::login(const String & user_name, const String & passwo void AccessControlManager::setExternalAuthenticatorsConfig(const Poco::Util::AbstractConfiguration & config) { - external_authenticators->setConfig(config, getLogger()); + external_authenticators->setConfiguration(config, getLogger()); } diff --git a/src/Access/AccessControlManager.h b/src/Access/AccessControlManager.h index 81a66ce8f1d..c960b330ee6 100644 --- a/src/Access/AccessControlManager.h +++ b/src/Access/AccessControlManager.h @@ -82,6 +82,9 @@ public: void addMemoryStorage(); void addMemoryStorage(const String & storage_name_); + /// Adds LDAPAccessStorage which allows querying remote LDAP server for user info. + void addLDAPStorage(const String & storage_name_, const Poco::Util::AbstractConfiguration & config_, const String & prefix_); + /// Adds storages from config. void addStoragesFromUserDirectoriesConfig(const Poco::Util::AbstractConfiguration & config, const String & key, diff --git a/src/Access/ExternalAuthenticators.cpp b/src/Access/ExternalAuthenticators.cpp index a0c5fbf1a79..3ed1b21c3c2 100644 --- a/src/Access/ExternalAuthenticators.cpp +++ b/src/Access/ExternalAuthenticators.cpp @@ -156,7 +156,7 @@ void ExternalAuthenticators::reset() ldap_server_params.clear(); } -void ExternalAuthenticators::setConfig(const Poco::Util::AbstractConfiguration & config, Poco::Logger * log) +void ExternalAuthenticators::setConfiguration(const Poco::Util::AbstractConfiguration & config, Poco::Logger * log) { std::scoped_lock lock(mutex); reset(); diff --git a/src/Access/ExternalAuthenticators.h b/src/Access/ExternalAuthenticators.h index 7484996c472..7502409d817 100644 --- a/src/Access/ExternalAuthenticators.h +++ b/src/Access/ExternalAuthenticators.h @@ -26,7 +26,7 @@ class ExternalAuthenticators { public: void reset(); - void setConfig(const Poco::Util::AbstractConfiguration & config, Poco::Logger * log); + void setConfiguration(const Poco::Util::AbstractConfiguration & config, Poco::Logger * log); void setLDAPServerParams(const String & server, const LDAPServerParams & params); LDAPServerParams getLDAPServerParams(const String & server) const; diff --git a/src/Access/IAccessStorage.cpp b/src/Access/IAccessStorage.cpp index e5170221e18..8dd219e07d7 100644 --- a/src/Access/IAccessStorage.cpp +++ b/src/Access/IAccessStorage.cpp @@ -14,6 +14,8 @@ namespace ErrorCodes extern const int ACCESS_ENTITY_ALREADY_EXISTS; extern const int ACCESS_ENTITY_NOT_FOUND; extern const int ACCESS_STORAGE_READONLY; + extern const int WRONG_PASSWORD; + extern const int IP_ADDRESS_NOT_ALLOWED; extern const int AUTHENTICATION_FAILED; extern const int LOGICAL_ERROR; } @@ -418,9 +420,21 @@ UUID IAccessStorage::login( const String & user_name, const String & password, const Poco::Net::IPAddress & address, - const ExternalAuthenticators & external_authenticators) const + const ExternalAuthenticators & external_authenticators, + bool replace_exception_with_cannot_authenticate) const { - return loginImpl(user_name, password, address, external_authenticators); + try + { + return loginImpl(user_name, password, address, external_authenticators); + } + catch (...) + { + if (!replace_exception_with_cannot_authenticate) + throw; + + tryLogCurrentException(getLogger(), user_name + ": Authentication failed"); + throwCannotAuthenticate(user_name); + } } @@ -434,11 +448,16 @@ UUID IAccessStorage::loginImpl( { if (auto user = tryRead(*id)) { - if (isPasswordCorrectImpl(*user, password, external_authenticators) && isAddressAllowedImpl(*user, address)) - return *id; + if (!isPasswordCorrectImpl(*user, password, external_authenticators)) + throwInvalidPassword(); + + if (!isAddressAllowedImpl(*user, address)) + throwAddressNotAllowed(address); + + return *id; } } - throwCannotAuthenticate(user_name); + throwNotFound(EntityType::USER, user_name); } @@ -554,6 +573,15 @@ void IAccessStorage::throwReadonlyCannotRemove(EntityType type, const String & n ErrorCodes::ACCESS_STORAGE_READONLY); } +void IAccessStorage::throwAddressNotAllowed(const Poco::Net::IPAddress & address) +{ + throw Exception("Connections from " + address.toString() + " are not allowed", ErrorCodes::IP_ADDRESS_NOT_ALLOWED); +} + +void IAccessStorage::throwInvalidPassword() +{ + throw Exception("Invalid password", ErrorCodes::WRONG_PASSWORD); +} void IAccessStorage::throwCannotAuthenticate(const String & user_name) { diff --git a/src/Access/IAccessStorage.h b/src/Access/IAccessStorage.h index 5a86e817fb2..ecf6b260712 100644 --- a/src/Access/IAccessStorage.h +++ b/src/Access/IAccessStorage.h @@ -144,7 +144,7 @@ public: /// Finds an user, check its password and returns the ID of the user. /// Throws an exception if no such user or password is incorrect. - UUID login(const String & user_name, const String & password, const Poco::Net::IPAddress & address, const ExternalAuthenticators & external_authenticators) const; + UUID login(const String & user_name, const String & password, const Poco::Net::IPAddress & address, const ExternalAuthenticators & external_authenticators, bool replace_exception_with_cannot_authenticate = true) const; /// Returns the ID of an user who has logged in (maybe on another node). /// The function assumes that the password has been already checked somehow, so we can skip checking it now. @@ -182,6 +182,8 @@ protected: [[noreturn]] void throwReadonlyCannotInsert(EntityType type, const String & name) const; [[noreturn]] void throwReadonlyCannotUpdate(EntityType type, const String & name) const; [[noreturn]] void throwReadonlyCannotRemove(EntityType type, const String & name) const; + [[noreturn]] static void throwAddressNotAllowed(const Poco::Net::IPAddress & address); + [[noreturn]] static void throwInvalidPassword(); [[noreturn]] static void throwCannotAuthenticate(const String & user_name); using Notification = std::tuple; diff --git a/src/Access/LDAPAccessStorage.cpp b/src/Access/LDAPAccessStorage.cpp new file mode 100644 index 00000000000..cf5e7673e40 --- /dev/null +++ b/src/Access/LDAPAccessStorage.cpp @@ -0,0 +1,313 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace DB +{ +namespace ErrorCodes +{ + extern const int BAD_ARGUMENTS; +} + + +LDAPAccessStorage::LDAPAccessStorage(const String & storage_name_, AccessControlManager * access_control_manager_, const Poco::Util::AbstractConfiguration & config, const String & prefix) + : IAccessStorage(storage_name_) +{ + setConfiguration(access_control_manager_, config, prefix); +} + + +void LDAPAccessStorage::setConfiguration(AccessControlManager * access_control_manager_, const Poco::Util::AbstractConfiguration & config, const String & prefix) +{ + std::scoped_lock lock(mutex); + + // TODO: switch to passing config as a ConfigurationView and remove this extra prefix once a version of Poco with proper implementation is available. + const String prefix_str = (prefix.empty() ? "" : prefix + "."); + + const bool has_server = config.has(prefix_str + "server"); + const bool has_roles = config.has(prefix_str + "roles"); + + if (!has_server) + throw Exception("Missing 'server' field for LDAP user directory.", ErrorCodes::BAD_ARGUMENTS); + + const auto ldap_server_cfg = config.getString(prefix_str + "server"); + if (ldap_server_cfg.empty()) + throw Exception("Empty 'server' field for LDAP user directory.", ErrorCodes::BAD_ARGUMENTS); + + std::set roles_cfg; + if (has_roles) + { + Poco::Util::AbstractConfiguration::Keys role_names; + config.keys(prefix_str + "roles", role_names); + + // Currently, we only extract names of roles from the section names and assign them directly and unconditionally. + roles_cfg.insert(role_names.begin(), role_names.end()); + } + + access_control_manager = access_control_manager_; + ldap_server = ldap_server_cfg; + default_role_names.swap(roles_cfg); + roles_of_interest.clear(); + role_change_subscription = access_control_manager->subscribeForChanges( + [this] (const UUID & id, const AccessEntityPtr & entity) + { + return this->processRoleChange(id, entity); + } + ); + + /// Update `roles_of_interests` with initial values. + for (const auto & role_name : default_role_names) + { + if (auto role_id = access_control_manager->find(role_name)) + roles_of_interest.emplace(*role_id, role_name); + } +} + + +void LDAPAccessStorage::processRoleChange(const UUID & id, const AccessEntityPtr & entity) +{ + std::scoped_lock lock(mutex); + + /// Update `roles_of_interests`. + auto role = typeid_cast>(entity); + bool need_to_update_users = false; + + if (role && default_role_names.count(role->getName())) + { + /// If a role was created with one of the `default_role_names` or renamed to one of the `default_role_names`, + /// then set `need_to_update_users`. + need_to_update_users = roles_of_interest.insert_or_assign(id, role->getName()).second; + } + else + { + /// If a role was removed or renamed to a name which isn't contained in the `default_role_names`, + /// then set `need_to_update_users`. + need_to_update_users = roles_of_interest.erase(id) > 0; + } + + /// Update users which have been created. + if (need_to_update_users) + { + auto update_func = [this] (const AccessEntityPtr & entity_) -> AccessEntityPtr + { + if (auto user = typeid_cast>(entity_)) + { + auto changed_user = typeid_cast>(user->clone()); + auto & granted_roles = changed_user->granted_roles.roles; + granted_roles.clear(); + boost::range::copy(roles_of_interest | boost::adaptors::map_keys, std::inserter(granted_roles, granted_roles.end())); + return changed_user; + } + return entity_; + }; + memory_storage.update(memory_storage.findAll(), update_func); + } +} + + +void LDAPAccessStorage::checkAllDefaultRoleNamesFoundNoLock() const +{ + boost::container::flat_set role_names_of_interest; + boost::range::copy(roles_of_interest | boost::adaptors::map_values, std::inserter(role_names_of_interest, role_names_of_interest.end())); + + for (const auto & role_name : default_role_names) + { + if (!role_names_of_interest.count(role_name)) + throwDefaultRoleNotFound(role_name); + } +} + + +const char * LDAPAccessStorage::getStorageType() const +{ + return STORAGE_TYPE; +} + + +String LDAPAccessStorage::getStorageParamsJSON() const +{ + std::scoped_lock lock(mutex); + Poco::JSON::Object params_json; + + params_json.set("server", ldap_server); + params_json.set("roles", default_role_names); + + std::ostringstream oss; + Poco::JSON::Stringifier::stringify(params_json, oss); + + return oss.str(); +} + + +std::optional LDAPAccessStorage::findImpl(EntityType type, const String & name) const +{ + std::scoped_lock lock(mutex); + return memory_storage.find(type, name); +} + + +std::vector LDAPAccessStorage::findAllImpl(EntityType type) const +{ + std::scoped_lock lock(mutex); + return memory_storage.findAll(type); +} + + +bool LDAPAccessStorage::existsImpl(const UUID & id) const +{ + std::scoped_lock lock(mutex); + return memory_storage.exists(id); +} + + +AccessEntityPtr LDAPAccessStorage::readImpl(const UUID & id) const +{ + std::scoped_lock lock(mutex); + return memory_storage.read(id); +} + + +String LDAPAccessStorage::readNameImpl(const UUID & id) const +{ + std::scoped_lock lock(mutex); + return memory_storage.readName(id); +} + + +bool LDAPAccessStorage::canInsertImpl(const AccessEntityPtr &) const +{ + return false; +} + + +UUID LDAPAccessStorage::insertImpl(const AccessEntityPtr & entity, bool) +{ + throwReadonlyCannotInsert(entity->getType(), entity->getName()); +} + + +void LDAPAccessStorage::removeImpl(const UUID & id) +{ + std::scoped_lock lock(mutex); + auto entity = read(id); + throwReadonlyCannotRemove(entity->getType(), entity->getName()); +} + + +void LDAPAccessStorage::updateImpl(const UUID & id, const UpdateFunc &) +{ + std::scoped_lock lock(mutex); + auto entity = read(id); + throwReadonlyCannotUpdate(entity->getType(), entity->getName()); +} + + +ext::scope_guard LDAPAccessStorage::subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const +{ + std::scoped_lock lock(mutex); + return memory_storage.subscribeForChanges(id, handler); +} + + +ext::scope_guard LDAPAccessStorage::subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const +{ + std::scoped_lock lock(mutex); + return memory_storage.subscribeForChanges(type, handler); +} + + +bool LDAPAccessStorage::hasSubscriptionImpl(const UUID & id) const +{ + std::scoped_lock lock(mutex); + return memory_storage.hasSubscription(id); +} + + +bool LDAPAccessStorage::hasSubscriptionImpl(EntityType type) const +{ + std::scoped_lock lock(mutex); + return memory_storage.hasSubscription(type); +} + +UUID LDAPAccessStorage::loginImpl(const String & user_name, const String & password, const Poco::Net::IPAddress & address, const ExternalAuthenticators & external_authenticators) const +{ + std::scoped_lock lock(mutex); + auto id = memory_storage.find(user_name); + if (id) + { + auto user = memory_storage.read(*id); + + if (!isPasswordCorrectImpl(*user, password, external_authenticators)) + throwInvalidPassword(); + + if (!isAddressAllowedImpl(*user, address)) + throwAddressNotAllowed(address); + + return *id; + } + else + { + // User does not exist, so we create one, and will add it if authentication is successful. + auto user = std::make_shared(); + user->setName(user_name); + user->authentication = Authentication(Authentication::Type::LDAP_SERVER); + user->authentication.setServerName(ldap_server); + + if (!isPasswordCorrectImpl(*user, password, external_authenticators)) + throwInvalidPassword(); + + if (!isAddressAllowedImpl(*user, address)) + throwAddressNotAllowed(address); + + checkAllDefaultRoleNamesFoundNoLock(); + + auto & granted_roles = user->granted_roles.roles; + boost::range::copy(roles_of_interest | boost::adaptors::map_keys, std::inserter(granted_roles, granted_roles.end())); + + return memory_storage.insert(user); + } +} + +UUID LDAPAccessStorage::getIDOfLoggedUserImpl(const String & user_name) const +{ + std::scoped_lock lock(mutex); + auto id = memory_storage.find(user_name); + if (id) + { + return *id; + } + else + { + // User does not exist, so we create one, and add it pretending that the authentication is successful. + auto user = std::make_shared(); + user->setName(user_name); + user->authentication = Authentication(Authentication::Type::LDAP_SERVER); + user->authentication.setServerName(ldap_server); + + checkAllDefaultRoleNamesFoundNoLock(); + + auto & granted_roles = user->granted_roles.roles; + boost::range::copy(roles_of_interest | boost::adaptors::map_keys, std::inserter(granted_roles, granted_roles.end())); + + return memory_storage.insert(user); + } +} + +void LDAPAccessStorage::throwDefaultRoleNotFound(const String & role_name) +{ + throw Exception("One of the default roles, the role '" + role_name + "', is not found", IAccessEntity::TypeInfo::get(IAccessEntity::Type::ROLE).not_found_error_code); +} + +} diff --git a/src/Access/LDAPAccessStorage.h b/src/Access/LDAPAccessStorage.h new file mode 100644 index 00000000000..a845279841c --- /dev/null +++ b/src/Access/LDAPAccessStorage.h @@ -0,0 +1,71 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + + +namespace Poco +{ + namespace Util + { + class AbstractConfiguration; + } +} + + +namespace DB +{ +class AccessControlManager; + +/// Implementation of IAccessStorage which allows attaching users from a remote LDAP server. +/// Currently, any user name will be treated as a name of an existing remote user, +/// a user info entity will be created, with LDAP_SERVER authentication type. +class LDAPAccessStorage : public IAccessStorage +{ +public: + static constexpr char STORAGE_TYPE[] = "ldap"; + + explicit LDAPAccessStorage(const String & storage_name_, AccessControlManager * access_control_manager_, const Poco::Util::AbstractConfiguration & config, const String & prefix); + virtual ~LDAPAccessStorage() override = default; + +public: // IAccessStorage implementations. + virtual const char * getStorageType() const override; + virtual String getStorageParamsJSON() const override; + +private: // IAccessStorage implementations. + virtual std::optional findImpl(EntityType type, const String & name) const override; + virtual std::vector findAllImpl(EntityType type) const override; + virtual bool existsImpl(const UUID & id) const override; + virtual AccessEntityPtr readImpl(const UUID & id) const override; + virtual String readNameImpl(const UUID & id) const override; + virtual bool canInsertImpl(const AccessEntityPtr &) const override; + virtual UUID insertImpl(const AccessEntityPtr & entity, bool replace_if_exists) override; + virtual void removeImpl(const UUID & id) override; + virtual void updateImpl(const UUID & id, const UpdateFunc & update_func) override; + virtual ext::scope_guard subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const override; + virtual ext::scope_guard subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const override; + virtual bool hasSubscriptionImpl(const UUID & id) const override; + virtual bool hasSubscriptionImpl(EntityType type) const override; + virtual UUID loginImpl(const String & user_name, const String & password, const Poco::Net::IPAddress & address, const ExternalAuthenticators & external_authenticators) const override; + virtual UUID getIDOfLoggedUserImpl(const String & user_name) const override; + +private: + void setConfiguration(AccessControlManager * access_control_manager_, const Poco::Util::AbstractConfiguration & config, const String & prefix); + void processRoleChange(const UUID & id, const AccessEntityPtr & entity); + void checkAllDefaultRoleNamesFoundNoLock() const; + + [[noreturn]] static void throwDefaultRoleNotFound(const String & role_name); + + mutable std::recursive_mutex mutex; + AccessControlManager * access_control_manager = nullptr; + String ldap_server; + std::set default_role_names; + std::map roles_of_interest; + ext::scope_guard role_change_subscription; + mutable MemoryAccessStorage memory_storage; +}; +} diff --git a/src/Access/LDAPClient.cpp b/src/Access/LDAPClient.cpp index a85e96ab86c..a3223902361 100644 --- a/src/Access/LDAPClient.cpp +++ b/src/Access/LDAPClient.cpp @@ -2,6 +2,8 @@ #include #include +#include + #include #include @@ -27,16 +29,13 @@ LDAPClient::~LDAPClient() closeConnection(); } -void LDAPClient::openConnection() -{ - const bool graceful_bind_failure = false; - diag(openConnection(graceful_bind_failure)); -} - #if USE_LDAP namespace { + + std::recursive_mutex ldap_global_mutex; + auto escapeForLDAP(const String & src) { String dest; @@ -63,10 +62,13 @@ namespace return dest; } + } void LDAPClient::diag(const int rc) { + std::scoped_lock lock(ldap_global_mutex); + if (rc != LDAP_SUCCESS) { String text; @@ -100,8 +102,10 @@ void LDAPClient::diag(const int rc) } } -int LDAPClient::openConnection(const bool graceful_bind_failure) +void LDAPClient::openConnection() { + std::scoped_lock lock(ldap_global_mutex); + closeConnection(); { @@ -232,8 +236,6 @@ int LDAPClient::openConnection(const bool graceful_bind_failure) if (params.enable_tls == LDAPServerParams::TLSEnable::YES_STARTTLS) diag(ldap_start_tls_s(handle, nullptr, nullptr)); - int rc = LDAP_OTHER; - switch (params.sasl_mechanism) { case LDAPServerParams::SASLMechanism::SIMPLE: @@ -244,20 +246,21 @@ int LDAPClient::openConnection(const bool graceful_bind_failure) cred.bv_val = const_cast(params.password.c_str()); cred.bv_len = params.password.size(); - rc = ldap_sasl_bind_s(handle, dn.c_str(), LDAP_SASL_SIMPLE, &cred, nullptr, nullptr, nullptr); - - if (!graceful_bind_failure) - diag(rc); + diag(ldap_sasl_bind_s(handle, dn.c_str(), LDAP_SASL_SIMPLE, &cred, nullptr, nullptr, nullptr)); break; } + default: + { + throw Exception("Unknown SASL mechanism", ErrorCodes::LDAP_ERROR); + } } - - return rc; } void LDAPClient::closeConnection() noexcept { + std::scoped_lock lock(ldap_global_mutex); + if (!handle) return; @@ -267,42 +270,21 @@ void LDAPClient::closeConnection() noexcept bool LDAPSimpleAuthClient::check() { - if (params.user.empty()) - throw Exception("LDAP authentication of a user with an empty name is not allowed", ErrorCodes::BAD_ARGUMENTS); + std::scoped_lock lock(ldap_global_mutex); + if (params.user.empty()) + throw Exception("LDAP authentication of a user with empty name is not allowed", ErrorCodes::BAD_ARGUMENTS); + + // Silently reject authentication attempt if the password is empty as if it didn't match. if (params.password.empty()) - return false; // Silently reject authentication attempt if the password is empty as if it didn't match. + return false; SCOPE_EXIT({ closeConnection(); }); - const bool graceful_bind_failure = true; - const auto rc = openConnection(graceful_bind_failure); + // Will throw on any error, including invalid credentials. + openConnection(); - bool result = false; - - switch (rc) - { - case LDAP_SUCCESS: - { - result = true; - break; - } - - case LDAP_INVALID_CREDENTIALS: - { - result = false; - break; - } - - default: - { - result = false; - diag(rc); - break; - } - } - - return result; + return true; } #else // USE_LDAP @@ -312,7 +294,7 @@ void LDAPClient::diag(const int) throw Exception("ClickHouse was built without LDAP support", ErrorCodes::FEATURE_IS_NOT_ENABLED_AT_BUILD_TIME); } -int LDAPClient::openConnection(const bool) +void LDAPClient::openConnection() { throw Exception("ClickHouse was built without LDAP support", ErrorCodes::FEATURE_IS_NOT_ENABLED_AT_BUILD_TIME); } diff --git a/src/Access/LDAPClient.h b/src/Access/LDAPClient.h index b117ed9a026..777c87c5b94 100644 --- a/src/Access/LDAPClient.h +++ b/src/Access/LDAPClient.h @@ -32,7 +32,6 @@ public: protected: MAYBE_NORETURN void diag(const int rc); MAYBE_NORETURN void openConnection(); - int openConnection(const bool graceful_bind_failure = false); void closeConnection() noexcept; protected: diff --git a/src/Access/LDAPParams.h b/src/Access/LDAPParams.h index 2168ce45203..eeadba6bc01 100644 --- a/src/Access/LDAPParams.h +++ b/src/Access/LDAPParams.h @@ -42,6 +42,7 @@ struct LDAPServerParams enum class SASLMechanism { + UNKNOWN, SIMPLE }; diff --git a/src/Access/MemoryAccessStorage.cpp b/src/Access/MemoryAccessStorage.cpp index 114c8eb8bee..58280c8b1d7 100644 --- a/src/Access/MemoryAccessStorage.cpp +++ b/src/Access/MemoryAccessStorage.cpp @@ -69,7 +69,7 @@ UUID MemoryAccessStorage::insertImpl(const AccessEntityPtr & new_entity, bool re UUID id = generateRandomID(); std::lock_guard lock{mutex}; - insertNoLock(generateRandomID(), new_entity, replace_if_exists, notifications); + insertNoLock(id, new_entity, replace_if_exists, notifications); return id; } diff --git a/src/Access/MultipleAccessStorage.cpp b/src/Access/MultipleAccessStorage.cpp index 8ddc7410d8d..a8ce3f602ed 100644 --- a/src/Access/MultipleAccessStorage.cpp +++ b/src/Access/MultipleAccessStorage.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -27,6 +28,15 @@ MultipleAccessStorage::MultipleAccessStorage(const String & storage_name_) { } +MultipleAccessStorage::~MultipleAccessStorage() +{ + /// It's better to remove the storages in the reverse order because they could depend on each other somehow. + const auto storages = getStoragesPtr(); + for (const auto & storage : *storages | boost::adaptors::reversed) + { + removeStorage(storage); + } +} void MultipleAccessStorage::setStorages(const std::vector & storages) { @@ -400,7 +410,7 @@ UUID MultipleAccessStorage::loginImpl(const String & user_name, const String & p { try { - auto id = storage->login(user_name, password, address, external_authenticators); + auto id = storage->login(user_name, password, address, external_authenticators, /* replace_exception_with_cannot_authenticate = */ false); std::lock_guard lock{mutex}; ids_cache.set(id, storage); return id; @@ -416,7 +426,7 @@ UUID MultipleAccessStorage::loginImpl(const String & user_name, const String & p throw; } } - throwCannotAuthenticate(user_name); + throwNotFound(EntityType::USER, user_name); } diff --git a/src/Access/MultipleAccessStorage.h b/src/Access/MultipleAccessStorage.h index 36551f1cbc8..8844de8c029 100644 --- a/src/Access/MultipleAccessStorage.h +++ b/src/Access/MultipleAccessStorage.h @@ -18,6 +18,7 @@ public: using ConstStoragePtr = std::shared_ptr; MultipleAccessStorage(const String & storage_name_ = STORAGE_TYPE); + ~MultipleAccessStorage() override; const char * getStorageType() const override { return STORAGE_TYPE; } diff --git a/src/Access/ya.make b/src/Access/ya.make index e5fa73f107c..b945c5a192a 100644 --- a/src/Access/ya.make +++ b/src/Access/ya.make @@ -24,6 +24,7 @@ SRCS( GrantedRoles.cpp IAccessEntity.cpp IAccessStorage.cpp + LDAPAccessStorage.cpp LDAPClient.cpp MemoryAccessStorage.cpp MultipleAccessStorage.cpp diff --git a/src/Columns/ColumnString.cpp b/src/Columns/ColumnString.cpp index 23414626a59..cd06ea20f83 100644 --- a/src/Columns/ColumnString.cpp +++ b/src/Columns/ColumnString.cpp @@ -634,4 +634,10 @@ void ColumnString::protect() getOffsets().protect(); } +void ColumnString::validate() const +{ + if (!offsets.empty() && offsets.back() != chars.size()) + throw Exception(ErrorCodes::LOGICAL_ERROR, "ColumnString validation failed: size mismatch (internal logical error) {} != {}", offsets.back(), chars.size()); +} + } diff --git a/src/Columns/ColumnString.h b/src/Columns/ColumnString.h index 128e1efe146..19398e07b83 100644 --- a/src/Columns/ColumnString.h +++ b/src/Columns/ColumnString.h @@ -267,6 +267,9 @@ public: Offsets & getOffsets() { return offsets; } const Offsets & getOffsets() const { return offsets; } + + // Throws an exception if offsets/chars are messed up + void validate() const; }; diff --git a/src/Common/ErrorCodes.cpp b/src/Common/ErrorCodes.cpp index b841368f662..b14c090c848 100644 --- a/src/Common/ErrorCodes.cpp +++ b/src/Common/ErrorCodes.cpp @@ -510,6 +510,8 @@ namespace ErrorCodes extern const int ROW_AND_ROWS_TOGETHER = 544; extern const int FIRST_AND_NEXT_TOGETHER = 545; extern const int NO_ROW_DELIMITER = 546; + extern const int INVALID_RAID_TYPE = 547; + extern const int UNKNOWN_VOLUME = 548; extern const int KEEPER_EXCEPTION = 999; extern const int POCO_EXCEPTION = 1000; diff --git a/src/Common/MemoryTracker.cpp b/src/Common/MemoryTracker.cpp index 5d51fc9f301..87567591ddf 100644 --- a/src/Common/MemoryTracker.cpp +++ b/src/Common/MemoryTracker.cpp @@ -30,6 +30,8 @@ namespace ProfileEvents static constexpr size_t log_peak_memory_usage_every = 1ULL << 30; +thread_local bool MemoryTracker::BlockerInThread::is_blocked = false; + MemoryTracker total_memory_tracker(nullptr, VariableContext::Global); @@ -56,13 +58,15 @@ MemoryTracker::~MemoryTracker() void MemoryTracker::logPeakMemoryUsage() const { const auto * description = description_ptr.load(std::memory_order_relaxed); - LOG_DEBUG(&Poco::Logger::get("MemoryTracker"), "Peak memory usage{}: {}.", (description ? " " + std::string(description) : ""), ReadableSize(peak)); + LOG_DEBUG(&Poco::Logger::get("MemoryTracker"), + "Peak memory usage{}: {}.", (description ? " " + std::string(description) : ""), ReadableSize(peak)); } void MemoryTracker::logMemoryUsage(Int64 current) const { const auto * description = description_ptr.load(std::memory_order_relaxed); - LOG_DEBUG(&Poco::Logger::get("MemoryTracker"), "Current memory usage{}: {}.", (description ? " " + std::string(description) : ""), ReadableSize(current)); + LOG_DEBUG(&Poco::Logger::get("MemoryTracker"), + "Current memory usage{}: {}.", (description ? " " + std::string(description) : ""), ReadableSize(current)); } @@ -71,7 +75,7 @@ void MemoryTracker::alloc(Int64 size) if (size < 0) throw DB::Exception(DB::ErrorCodes::LOGICAL_ERROR, "Negative size ({}) is passed to MemoryTracker. It is a bug.", size); - if (blocker.isCancelled()) + if (BlockerInThread::isBlocked()) return; /** Using memory_order_relaxed means that if allocations are done simultaneously, @@ -86,12 +90,15 @@ void MemoryTracker::alloc(Int64 size) Int64 current_hard_limit = hard_limit.load(std::memory_order_relaxed); Int64 current_profiler_limit = profiler_limit.load(std::memory_order_relaxed); - /// Cap the limit to the total_memory_tracker, since it may include some drift. + /// Cap the limit to the total_memory_tracker, since it may include some drift + /// for user-level memory tracker. /// /// And since total_memory_tracker is reset to the process resident /// memory peridically (in AsynchronousMetrics::update()), any limit can be /// capped to it, to avoid possible drift. - if (unlikely(current_hard_limit && will_be > current_hard_limit)) + if (unlikely(current_hard_limit + && will_be > current_hard_limit + && level == VariableContext::User)) { Int64 total_amount = total_memory_tracker.get(); if (amount > total_amount) @@ -104,10 +111,8 @@ void MemoryTracker::alloc(Int64 size) std::bernoulli_distribution fault(fault_probability); if (unlikely(fault_probability && fault(thread_local_rng))) { - free(size); - /// Prevent recursion. Exception::ctor -> std::string -> new[] -> MemoryTracker::alloc - auto untrack_lock = blocker.cancel(); // NOLINT + BlockerInThread untrack_lock; ProfileEvents::increment(ProfileEvents::QueryMemoryLimitExceeded); std::stringstream message; @@ -118,12 +123,13 @@ void MemoryTracker::alloc(Int64 size) << " (attempt to allocate chunk of " << size << " bytes)" << ", maximum: " << formatReadableSizeWithBinarySuffix(current_hard_limit); + amount.fetch_sub(size, std::memory_order_relaxed); throw DB::Exception(message.str(), DB::ErrorCodes::MEMORY_LIMIT_EXCEEDED); } if (unlikely(current_profiler_limit && will_be > current_profiler_limit)) { - auto no_track = blocker.cancel(); + BlockerInThread untrack_lock; DB::TraceCollector::collect(DB::TraceType::Memory, StackTrace(), size); setOrRaiseProfilerLimit((will_be + profiler_step - 1) / profiler_step * profiler_step); } @@ -131,16 +137,14 @@ void MemoryTracker::alloc(Int64 size) std::bernoulli_distribution sample(sample_probability); if (unlikely(sample_probability && sample(thread_local_rng))) { - auto no_track = blocker.cancel(); + BlockerInThread untrack_lock; DB::TraceCollector::collect(DB::TraceType::MemorySample, StackTrace(), size); } if (unlikely(current_hard_limit && will_be > current_hard_limit)) { - free(size); - /// Prevent recursion. Exception::ctor -> std::string -> new[] -> MemoryTracker::alloc - auto no_track = blocker.cancel(); // NOLINT + BlockerInThread untrack_lock; ProfileEvents::increment(ProfileEvents::QueryMemoryLimitExceeded); std::stringstream message; @@ -151,6 +155,7 @@ void MemoryTracker::alloc(Int64 size) << " (attempt to allocate chunk of " << size << " bytes)" << ", maximum: " << formatReadableSizeWithBinarySuffix(current_hard_limit); + amount.fetch_sub(size, std::memory_order_relaxed); throw DB::Exception(message.str(), DB::ErrorCodes::MEMORY_LIMIT_EXCEEDED); } @@ -177,13 +182,13 @@ void MemoryTracker::updatePeak(Int64 will_be) void MemoryTracker::free(Int64 size) { - if (blocker.isCancelled()) + if (BlockerInThread::isBlocked()) return; std::bernoulli_distribution sample(sample_probability); if (unlikely(sample_probability && sample(thread_local_rng))) { - auto no_track = blocker.cancel(); + BlockerInThread untrack_lock; DB::TraceCollector::collect(DB::TraceType::MemorySample, StackTrace(), -size); } @@ -298,11 +303,3 @@ namespace CurrentMemoryTracker } } } - -DB::SimpleActionLock getCurrentMemoryTrackerActionLock() -{ - auto * memory_tracker = DB::CurrentThread::getMemoryTracker(); - if (!memory_tracker) - return {}; - return memory_tracker->blocker.cancel(); -} diff --git a/src/Common/MemoryTracker.h b/src/Common/MemoryTracker.h index 8af683ae790..9f4f4357024 100644 --- a/src/Common/MemoryTracker.h +++ b/src/Common/MemoryTracker.h @@ -3,7 +3,6 @@ #include #include #include -#include #include @@ -131,8 +130,18 @@ public: /// Prints info about peak memory consumption into log. void logPeakMemoryUsage() const; - /// To be able to temporarily stop memory tracker - DB::SimpleActionBlocker blocker; + /// To be able to temporarily stop memory tracking from current thread. + struct BlockerInThread + { + private: + BlockerInThread(const BlockerInThread &) = delete; + BlockerInThread & operator=(const BlockerInThread &) = delete; + static thread_local bool is_blocked; + public: + BlockerInThread() { is_blocked = true; } + ~BlockerInThread() { is_blocked = false; } + static bool isBlocked() { return is_blocked; } + }; }; extern MemoryTracker total_memory_tracker; @@ -145,7 +154,3 @@ namespace CurrentMemoryTracker void realloc(Int64 old_size, Int64 new_size); void free(Int64 size); } - - -/// Holding this object will temporarily disable memory tracking. -DB::SimpleActionLock getCurrentMemoryTrackerActionLock(); diff --git a/src/Common/tests/average.cpp b/src/Common/tests/average.cpp index 5f3b13af8e8..efe78212f06 100644 --- a/src/Common/tests/average.cpp +++ b/src/Common/tests/average.cpp @@ -502,8 +502,8 @@ Float NO_INLINE really_unrolled(const PODArray & keys, const PODArray void add(Float value) @@ -522,13 +522,13 @@ Float NO_INLINE another_unrolled_x4(const PODArray & keys, const PODArray { State4 map[256]{}; - size_t size = keys.size() & ~size_t(3); - for (size_t i = 0; i < size; i+=4) + size_t size = keys.size() / 4 * 4; + for (size_t i = 0; i < size; i += 4) { map[keys[i]].add<0>(values[i]); - map[keys[i+1]].add<1>(values[i]); - map[keys[i+2]].add<2>(values[i]); - map[keys[i+3]].add<3>(values[i]); + map[keys[i + 1]].add<1>(values[i]); + map[keys[i + 2]].add<2>(values[i]); + map[keys[i + 3]].add<3>(values[i]); } /// tail diff --git a/src/Core/Settings.h b/src/Core/Settings.h index d73098ca6e0..b94883ca871 100644 --- a/src/Core/Settings.h +++ b/src/Core/Settings.h @@ -111,6 +111,7 @@ class IColumn; M(UInt64, distributed_group_by_no_merge, 0, "If 1, Do not merge aggregation states from different servers for distributed query processing - in case it is for certain that there are different keys on different shards. If 2 - same as 1 but also apply ORDER BY and LIMIT stages", 0) \ M(Bool, optimize_distributed_group_by_sharding_key, false, "Optimize GROUP BY sharding_key queries (by avodiing costly aggregation on the initiator server).", 0) \ M(Bool, optimize_skip_unused_shards, false, "Assumes that data is distributed by sharding_key. Optimization to skip unused shards if SELECT query filters by sharding_key.", 0) \ + M(Bool, allow_nondeterministic_optimize_skip_unused_shards, false, "Allow non-deterministic functions (includes dictGet) in sharding_key for optimize_skip_unused_shards", 0) \ M(UInt64, force_optimize_skip_unused_shards, 0, "Throw an exception if unused shards cannot be skipped (1 - throw only if the table has the sharding key, 2 - always throw.", 0) \ M(UInt64, optimize_skip_unused_shards_nesting, 0, "Same as optimize_skip_unused_shards, but accept nesting level until which it will work.", 0) \ M(UInt64, force_optimize_skip_unused_shards_nesting, 0, "Same as force_optimize_skip_unused_shards, but accept nesting level until which it will work.", 0) \ @@ -153,6 +154,7 @@ class IColumn; \ M(DistributedProductMode, distributed_product_mode, DistributedProductMode::DENY, "How are distributed subqueries performed inside IN or JOIN sections?", IMPORTANT) \ \ + M(UInt64, max_concurrent_queries_for_all_users, 0, "The maximum number of concurrent requests for all users.", 0) \ M(UInt64, max_concurrent_queries_for_user, 0, "The maximum number of concurrent requests per user.", 0) \ \ M(Bool, insert_deduplicate, true, "For INSERT queries in the replicated table, specifies that deduplication of insertings blocks should be performed", 0) \ @@ -411,12 +413,14 @@ class IColumn; M(Bool, format_csv_allow_double_quotes, 1, "If it is set to true, allow strings in double quotes.", 0) \ M(Bool, output_format_csv_crlf_end_of_line, false, "If it is set true, end of line in CSV format will be \\r\\n instead of \\n.", 0) \ M(Bool, input_format_csv_unquoted_null_literal_as_null, false, "Consider unquoted NULL literal as \\N", 0) \ + M(Bool, input_format_csv_enum_as_number, false, "Treat inserted enum values in CSV formats as enum indices \\N", 0) \ M(Bool, input_format_skip_unknown_fields, false, "Skip columns with unknown names from input data (it works for JSONEachRow, CSVWithNames, TSVWithNames and TSKV formats).", 0) \ M(Bool, input_format_with_names_use_header, true, "For TSVWithNames and CSVWithNames input formats this controls whether format parser is to assume that column data appear in the input exactly as they are specified in the header.", 0) \ M(Bool, input_format_import_nested_json, false, "Map nested JSON data to nested tables (it works for JSONEachRow format).", 0) \ M(Bool, optimize_aggregators_of_group_by_keys, true, "Eliminates min/max/any/anyLast aggregators of GROUP BY keys in SELECT section", 0) \ M(Bool, input_format_defaults_for_omitted_fields, true, "For input data calculate default expressions for omitted fields (it works for JSONEachRow, CSV and TSV formats).", IMPORTANT) \ M(Bool, input_format_tsv_empty_as_default, false, "Treat empty fields in TSV input as default values.", 0) \ + M(Bool, input_format_tsv_enum_as_number, false, "Treat inserted enum values in TSV formats as enum indices \\N", 0) \ M(Bool, input_format_null_as_default, false, "For text input formats initialize null fields with default values if data type of this field is not nullable", 0) \ \ M(DateTimeInputFormat, date_time_input_format, FormatSettings::DateTimeInputFormat::Basic, "Method to read DateTime from text input formats. Possible values: 'basic' and 'best_effort'.", 0) \ diff --git a/src/DataTypes/DataTypeEnum.cpp b/src/DataTypes/DataTypeEnum.cpp index 9ad6a9cb690..ce61794facd 100644 --- a/src/DataTypes/DataTypeEnum.cpp +++ b/src/DataTypes/DataTypeEnum.cpp @@ -146,12 +146,17 @@ void DataTypeEnum::serializeTextEscaped(const IColumn & column, size_t row } template -void DataTypeEnum::deserializeTextEscaped(IColumn & column, ReadBuffer & istr, const FormatSettings &) const +void DataTypeEnum::deserializeTextEscaped(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const { - /// NOTE It would be nice to do without creating a temporary object - at least extract std::string out. - std::string field_name; - readEscapedString(field_name, istr); - assert_cast(column).getData().push_back(getValue(StringRef(field_name))); + if (settings.tsv.input_format_enum_as_number) + assert_cast(column).getData().push_back(readValue(istr)); + else + { + /// NOTE It would be nice to do without creating a temporary object - at least extract std::string out. + std::string field_name; + readEscapedString(field_name, istr); + assert_cast(column).getData().push_back(getValue(StringRef(field_name))); + } } template @@ -169,11 +174,16 @@ void DataTypeEnum::deserializeTextQuoted(IColumn & column, ReadBuffer & is } template -void DataTypeEnum::deserializeWholeText(IColumn & column, ReadBuffer & istr, const FormatSettings &) const +void DataTypeEnum::deserializeWholeText(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const { - std::string field_name; - readString(field_name, istr); - assert_cast(column).getData().push_back(getValue(StringRef(field_name))); + if (settings.tsv.input_format_enum_as_number) + assert_cast(column).getData().push_back(readValue(istr)); + else + { + std::string field_name; + readString(field_name, istr); + assert_cast(column).getData().push_back(getValue(StringRef(field_name))); + } } template @@ -191,9 +201,14 @@ void DataTypeEnum::serializeTextXML(const IColumn & column, size_t row_num template void DataTypeEnum::deserializeTextJSON(IColumn & column, ReadBuffer & istr, const FormatSettings &) const { - std::string field_name; - readJSONString(field_name, istr); - assert_cast(column).getData().push_back(getValue(StringRef(field_name))); + if (!istr.eof() && *istr.position() != '"') + assert_cast(column).getData().push_back(readValue(istr)); + else + { + std::string field_name; + readJSONString(field_name, istr); + assert_cast(column).getData().push_back(getValue(StringRef(field_name))); + } } template @@ -205,9 +220,14 @@ void DataTypeEnum::serializeTextCSV(const IColumn & column, size_t row_num template void DataTypeEnum::deserializeTextCSV(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const { - std::string field_name; - readCSVString(field_name, istr, settings.csv); - assert_cast(column).getData().push_back(getValue(StringRef(field_name))); + if (settings.csv.input_format_enum_as_number) + assert_cast(column).getData().push_back(readValue(istr)); + else + { + std::string field_name; + readCSVString(field_name, istr, settings.csv); + assert_cast(column).getData().push_back(getValue(StringRef(field_name))); + } } template diff --git a/src/DataTypes/DataTypeEnum.h b/src/DataTypes/DataTypeEnum.h index 80b41692cdd..a66b36c6a8d 100644 --- a/src/DataTypes/DataTypeEnum.h +++ b/src/DataTypes/DataTypeEnum.h @@ -66,13 +66,18 @@ public: TypeIndex getTypeId() const override { return sizeof(FieldType) == 1 ? TypeIndex::Enum8 : TypeIndex::Enum16; } - const StringRef & getNameForValue(const FieldType & value) const + auto findByValue(const FieldType & value) const { const auto it = value_to_name_map.find(value); if (it == std::end(value_to_name_map)) throw Exception{"Unexpected value " + toString(value) + " for type " + getName(), ErrorCodes::BAD_ARGUMENTS}; - return it->second; + return it; + } + + const StringRef & getNameForValue(const FieldType & value) const + { + return findByValue(value)->second; } FieldType getValue(StringRef field_name) const @@ -84,6 +89,13 @@ public: return it->getMapped(); } + FieldType readValue(ReadBuffer & istr) const + { + FieldType x; + readText(x, istr); + return findByValue(x)->first; + } + Field castToName(const Field & value_or_name) const override; Field castToValue(const Field & value_or_name) const override; diff --git a/src/Dictionaries/FileDictionarySource.cpp b/src/Dictionaries/FileDictionarySource.cpp index 18893a99f4e..82aea4cbb98 100644 --- a/src/Dictionaries/FileDictionarySource.cpp +++ b/src/Dictionaries/FileDictionarySource.cpp @@ -32,7 +32,7 @@ FileDictionarySource::FileDictionarySource( { const String user_files_path = context.getUserFilesPath(); if (!startsWith(filepath, user_files_path)) - throw Exception("File path " + filepath + " is not inside " + user_files_path, ErrorCodes::PATH_ACCESS_DENIED); + throw Exception(ErrorCodes::PATH_ACCESS_DENIED, "File path {} is not inside {}", filepath, user_files_path); } } @@ -60,7 +60,7 @@ BlockInputStreamPtr FileDictionarySource::loadAll() std::string FileDictionarySource::toString() const { - return "File: " + filepath + ' ' + format; + return fmt::format("File: {}, {}", filepath, format); } diff --git a/src/Disks/DiskDecorator.cpp b/src/Disks/DiskDecorator.cpp index 7f2ea58d7cf..aaa54005f6f 100644 --- a/src/Disks/DiskDecorator.cpp +++ b/src/Disks/DiskDecorator.cpp @@ -180,4 +180,9 @@ void DiskDecorator::sync(int fd) const delegate->sync(fd); } +Executor & DiskDecorator::getExecutor() +{ + return delegate->getExecutor(); +} + } diff --git a/src/Disks/DiskDecorator.h b/src/Disks/DiskDecorator.h index f1ddfff4952..1ce3c3ea773 100644 --- a/src/Disks/DiskDecorator.h +++ b/src/Disks/DiskDecorator.h @@ -4,6 +4,10 @@ namespace DB { + +/** Forwards all methods to another disk. + * Methods can be overridden by descendants. + */ class DiskDecorator : public IDisk { public: @@ -46,6 +50,7 @@ public: void close(int fd) const override; void sync(int fd) const override; const String getType() const override { return delegate->getType(); } + Executor & getExecutor() override; protected: DiskPtr delegate; diff --git a/src/Disks/DiskSelector.h b/src/Disks/DiskSelector.h index 3f19dfba381..5d023fe1fbc 100644 --- a/src/Disks/DiskSelector.h +++ b/src/Disks/DiskSelector.h @@ -23,8 +23,11 @@ public: DiskSelector(const Poco::Util::AbstractConfiguration & config, const String & config_prefix, const Context & context); DiskSelector(const DiskSelector & from) : disks(from.disks) { } - DiskSelectorPtr - updateFromConfig(const Poco::Util::AbstractConfiguration & config, const String & config_prefix, const Context & context) const; + DiskSelectorPtr updateFromConfig( + const Poco::Util::AbstractConfiguration & config, + const String & config_prefix, + const Context & context + ) const; /// Get disk by name DiskPtr get(const String & name) const; diff --git a/src/Disks/IDisk.h b/src/Disks/IDisk.h index 688c1dfad42..ac0f5a2ae8f 100644 --- a/src/Disks/IDisk.h +++ b/src/Disks/IDisk.h @@ -195,10 +195,10 @@ public: /// Invoked when Global Context is shutdown. virtual void shutdown() { } -private: /// Returns executor to perform asynchronous operations. - Executor & getExecutor() { return *executor; } + virtual Executor & getExecutor() { return *executor; } +private: std::unique_ptr executor; }; diff --git a/src/Disks/IVolume.cpp b/src/Disks/IVolume.cpp index 95f03826591..ac277d962ed 100644 --- a/src/Disks/IVolume.cpp +++ b/src/Disks/IVolume.cpp @@ -9,7 +9,7 @@ namespace DB { namespace ErrorCodes { - extern const int EXCESSIVE_ELEMENT_IN_CONFIG; + extern const int NO_ELEMENTS_IN_CONFIG; extern const int INCONSISTENT_RESERVATIONS; extern const int NO_RESERVATIONS_PROVIDED; extern const int UNKNOWN_VOLUME_TYPE; @@ -51,7 +51,7 @@ IVolume::IVolume( } if (disks.empty()) - throw Exception("Volume must contain at least one disk.", ErrorCodes::EXCESSIVE_ELEMENT_IN_CONFIG); + throw Exception("Volume must contain at least one disk", ErrorCodes::NO_ELEMENTS_IN_CONFIG); } UInt64 IVolume::getMaxUnreservedFreeSpace() const diff --git a/src/Disks/IVolume.h b/src/Disks/IVolume.h index eaf3bf1dbd4..c040d9d58e1 100644 --- a/src/Disks/IVolume.h +++ b/src/Disks/IVolume.h @@ -64,6 +64,12 @@ public: virtual DiskPtr getDisk(size_t i) const { return disks[i]; } const Disks & getDisks() const { return disks; } + /// Returns effective value of whether merges are allowed on this volume (true) or not (false). + virtual bool areMergesAvoided() const { return false; } + + /// User setting for enabling and disabling merges on volume. + virtual void setAvoidMergesUserOverride(bool /*avoid*/) {} + protected: Disks disks; const String name; diff --git a/src/Disks/SingleDiskVolume.h b/src/Disks/SingleDiskVolume.h index c441d4c2dd2..bade6041ea0 100644 --- a/src/Disks/SingleDiskVolume.h +++ b/src/Disks/SingleDiskVolume.h @@ -8,7 +8,7 @@ namespace DB class SingleDiskVolume : public IVolume { public: - SingleDiskVolume(const String & name_, DiskPtr disk): IVolume(name_, {disk}) + SingleDiskVolume(const String & name_, DiskPtr disk, size_t max_data_part_size_ = 0): IVolume(name_, {disk}, max_data_part_size_) { } diff --git a/src/Disks/StoragePolicy.cpp b/src/Disks/StoragePolicy.cpp index 1aa20301bc0..8a71f4f7a2f 100644 --- a/src/Disks/StoragePolicy.cpp +++ b/src/Disks/StoragePolicy.cpp @@ -11,6 +11,13 @@ #include +namespace +{ + const auto DEFAULT_STORAGE_POLICY_NAME = "default"; + const auto DEFAULT_VOLUME_NAME = "default"; + const auto DEFAULT_DISK_NAME = "default"; +} + namespace DB { @@ -18,11 +25,14 @@ namespace ErrorCodes { extern const int BAD_ARGUMENTS; extern const int EXCESSIVE_ELEMENT_IN_CONFIG; + extern const int NO_ELEMENTS_IN_CONFIG; extern const int UNKNOWN_DISK; extern const int UNKNOWN_POLICY; + extern const int UNKNOWN_VOLUME; extern const int LOGICAL_ERROR; } + StoragePolicy::StoragePolicy( String name_, const Poco::Util::AbstractConfiguration & config, @@ -30,44 +40,42 @@ StoragePolicy::StoragePolicy( DiskSelectorPtr disks) : name(std::move(name_)) { - String volumes_prefix = config_prefix + ".volumes"; - if (!config.has(volumes_prefix)) - throw Exception("StoragePolicy must contain at least one volume (.volumes)", ErrorCodes::EXCESSIVE_ELEMENT_IN_CONFIG); - Poco::Util::AbstractConfiguration::Keys keys; - config.keys(volumes_prefix, keys); + String volumes_prefix = config_prefix + ".volumes"; + + if (!config.has(volumes_prefix)) + { + if (name != DEFAULT_STORAGE_POLICY_NAME) + throw Exception("Storage policy " + backQuote(name) + " must contain at least one volume (.volumes)", ErrorCodes::NO_ELEMENTS_IN_CONFIG); + } + else + { + config.keys(volumes_prefix, keys); + } for (const auto & attr_name : keys) { if (!std::all_of(attr_name.begin(), attr_name.end(), isWordCharASCII)) throw Exception( - "Volume name can contain only alphanumeric and '_' (" + attr_name + ")", ErrorCodes::EXCESSIVE_ELEMENT_IN_CONFIG); - volumes.push_back(std::make_shared(attr_name, config, volumes_prefix + "." + attr_name, disks)); - if (volumes_names.find(attr_name) != volumes_names.end()) - throw Exception("Volumes names must be unique (" + attr_name + " duplicated)", ErrorCodes::UNKNOWN_POLICY); - volumes_names[attr_name] = volumes.size() - 1; + "Volume name can contain only alphanumeric and '_' in storage policy " + backQuote(name) + " (" + attr_name + ")", ErrorCodes::EXCESSIVE_ELEMENT_IN_CONFIG); + volumes.emplace_back(createVolumeFromConfig(attr_name, config, volumes_prefix + "." + attr_name, disks)); + } + + if (volumes.empty() && name == DEFAULT_STORAGE_POLICY_NAME) + { + auto default_volume = std::make_shared(DEFAULT_VOLUME_NAME, std::vector{disks->get(DEFAULT_DISK_NAME)}, 0, false); + volumes.emplace_back(std::move(default_volume)); } if (volumes.empty()) - throw Exception("StoragePolicy must contain at least one volume.", ErrorCodes::EXCESSIVE_ELEMENT_IN_CONFIG); + throw Exception("Storage policy " + backQuote(name) + " must contain at least one volume.", ErrorCodes::NO_ELEMENTS_IN_CONFIG); - /// Check that disks are unique in Policy - std::set disk_names; - for (const auto & volume : volumes) - { - for (const auto & disk : volume->getDisks()) - { - if (disk_names.find(disk->getName()) != disk_names.end()) - throw Exception( - "Duplicate disk '" + disk->getName() + "' in storage policy '" + name + "'", ErrorCodes::EXCESSIVE_ELEMENT_IN_CONFIG); - - disk_names.insert(disk->getName()); - } - } - - move_factor = config.getDouble(config_prefix + ".move_factor", 0.1); + const double default_move_factor = volumes.size() > 1 ? 0.1 : 0.0; + move_factor = config.getDouble(config_prefix + ".move_factor", default_move_factor); if (move_factor > 1) - throw Exception("Disk move factor have to be in [0., 1.] interval, but set to " + toString(move_factor), ErrorCodes::LOGICAL_ERROR); + throw Exception("Disk move factor have to be in [0., 1.] interval, but set to " + toString(move_factor) + " in storage policy " + backQuote(name), ErrorCodes::LOGICAL_ERROR); + + buildVolumeIndices(); } @@ -75,16 +83,43 @@ StoragePolicy::StoragePolicy(String name_, Volumes volumes_, double move_factor_ : volumes(std::move(volumes_)), name(std::move(name_)), move_factor(move_factor_) { if (volumes.empty()) - throw Exception("StoragePolicy must contain at least one Volume.", ErrorCodes::UNKNOWN_POLICY); + throw Exception("Storage policy " + backQuote(name) + " must contain at least one Volume.", ErrorCodes::NO_ELEMENTS_IN_CONFIG); if (move_factor > 1) - throw Exception("Disk move factor have to be in [0., 1.] interval, but set to " + toString(move_factor), ErrorCodes::LOGICAL_ERROR); + throw Exception("Disk move factor have to be in [0., 1.] interval, but set to " + toString(move_factor) + " in storage policy " + backQuote(name), ErrorCodes::LOGICAL_ERROR); - for (size_t i = 0; i < volumes.size(); ++i) + buildVolumeIndices(); +} + + +StoragePolicy::StoragePolicy(const StoragePolicy & storage_policy, + const Poco::Util::AbstractConfiguration & config, + const String & config_prefix, + DiskSelectorPtr disks) + : StoragePolicy(storage_policy.getName(), config, config_prefix, disks) +{ + for (auto & volume : volumes) { - if (volumes_names.find(volumes[i]->getName()) != volumes_names.end()) - throw Exception("Volumes names must be unique (" + volumes[i]->getName() + " duplicated).", ErrorCodes::UNKNOWN_POLICY); - volumes_names[volumes[i]->getName()] = i; + if (storage_policy.volume_index_by_volume_name.count(volume->getName()) > 0) + { + auto old_volume = storage_policy.getVolumeByName(volume->getName()); + try + { + auto new_volume = updateVolumeFromConfig(old_volume, config, config_prefix + ".volumes." + volume->getName(), disks); + volume = std::move(new_volume); + } + catch (Exception & e) + { + /// Default policies are allowed to be missed in configuration. + if (e.code() != ErrorCodes::NO_ELEMENTS_IN_CONFIG || storage_policy.getName() != DEFAULT_STORAGE_POLICY_NAME) + throw; + + Poco::Util::AbstractConfiguration::Keys keys; + config.keys(config_prefix, keys); + if (!keys.empty()) + throw; + } + } } } @@ -93,20 +128,20 @@ bool StoragePolicy::isDefaultPolicy() const { /// Guessing if this policy is default, not 100% correct though. - if (getName() != "default") + if (getName() != DEFAULT_STORAGE_POLICY_NAME) return false; if (volumes.size() != 1) return false; - if (volumes[0]->getName() != "default") + if (volumes[0]->getName() != DEFAULT_VOLUME_NAME) return false; const auto & disks = volumes[0]->getDisks(); if (disks.size() != 1) return false; - if (disks[0]->getName() != "default") + if (disks[0]->getName() != DEFAULT_DISK_NAME) return false; return true; @@ -128,10 +163,10 @@ DiskPtr StoragePolicy::getAnyDisk() const /// StoragePolicy must contain at least one Volume /// Volume must contain at least one Disk if (volumes.empty()) - throw Exception("StoragePolicy has no volumes. It's a bug.", ErrorCodes::LOGICAL_ERROR); + throw Exception("Storage policy " + backQuote(name) + " has no volumes. It's a bug.", ErrorCodes::LOGICAL_ERROR); if (volumes[0]->getDisks().empty()) - throw Exception("Volume '" + volumes[0]->getName() + "' has no disks. It's a bug.", ErrorCodes::LOGICAL_ERROR); + throw Exception("Volume " + backQuote(name) + "." + backQuote(volumes[0]->getName()) + " has no disks. It's a bug.", ErrorCodes::LOGICAL_ERROR); return volumes[0]->getDisks()[0]; } @@ -195,6 +230,24 @@ ReservationPtr StoragePolicy::makeEmptyReservationOnLargestDisk() const } +VolumePtr StoragePolicy::getVolume(size_t index) const +{ + if (index < volume_index_by_volume_name.size()) + return volumes[index]; + else + throw Exception("No volume with index " + std::to_string(index) + " in storage policy " + backQuote(name), ErrorCodes::UNKNOWN_VOLUME); +} + + +VolumePtr StoragePolicy::getVolumeByName(const String & volume_name) const +{ + auto it = volume_index_by_volume_name.find(volume_name); + if (it == volume_index_by_volume_name.end()) + throw Exception("No such volume " + backQuote(volume_name) + " in storage policy " + backQuote(name), ErrorCodes::UNKNOWN_VOLUME); + return getVolume(it->second); +} + + void StoragePolicy::checkCompatibleWith(const StoragePolicyPtr & new_storage_policy) const { std::unordered_set new_volume_names; @@ -204,7 +257,7 @@ void StoragePolicy::checkCompatibleWith(const StoragePolicyPtr & new_storage_pol for (const auto & volume : getVolumes()) { if (new_volume_names.count(volume->getName()) == 0) - throw Exception("New storage policy shall contain volumes of old one", ErrorCodes::BAD_ARGUMENTS); + throw Exception("New storage policy " + backQuote(name) + " shall contain volumes of old one", ErrorCodes::BAD_ARGUMENTS); std::unordered_set new_disk_names; for (const auto & disk : new_storage_policy->getVolumeByName(volume->getName())->getDisks()) @@ -212,21 +265,46 @@ void StoragePolicy::checkCompatibleWith(const StoragePolicyPtr & new_storage_pol for (const auto & disk : volume->getDisks()) if (new_disk_names.count(disk->getName()) == 0) - throw Exception("New storage policy shall contain disks of old one", ErrorCodes::BAD_ARGUMENTS); + throw Exception("New storage policy " + backQuote(name) + " shall contain disks of old one", ErrorCodes::BAD_ARGUMENTS); } } size_t StoragePolicy::getVolumeIndexByDisk(const DiskPtr & disk_ptr) const { - for (size_t i = 0; i < volumes.size(); ++i) + auto it = volume_index_by_disk_name.find(disk_ptr->getName()); + if (it != volume_index_by_disk_name.end()) + return it->second; + else + throw Exception("No disk " + backQuote(disk_ptr->getName()) + " in policy " + backQuote(name), ErrorCodes::UNKNOWN_DISK); +} + + +void StoragePolicy::buildVolumeIndices() +{ + for (size_t index = 0; index < volumes.size(); ++index) { - const auto & volume = volumes[i]; + const VolumePtr & volume = volumes[index]; + + if (volume_index_by_volume_name.find(volume->getName()) != volume_index_by_volume_name.end()) + throw Exception("Volume names must be unique in storage policy " + + backQuote(name) + " (" + backQuote(volume->getName()) + " is duplicated)" + , ErrorCodes::EXCESSIVE_ELEMENT_IN_CONFIG); + + volume_index_by_volume_name[volume->getName()] = index; + for (const auto & disk : volume->getDisks()) - if (disk->getName() == disk_ptr->getName()) - return i; + { + const String & disk_name = disk->getName(); + + if (volume_index_by_disk_name.find(disk_name) != volume_index_by_disk_name.end()) + throw Exception("Disk names must be unique in storage policy " + + backQuote(name) + " (" + backQuote(disk_name) + " is duplicated)" + , ErrorCodes::EXCESSIVE_ELEMENT_IN_CONFIG); + + volume_index_by_disk_name[disk_name] = index; + } } - throw Exception("No disk " + disk_ptr->getName() + " in policy " + name, ErrorCodes::UNKNOWN_DISK); } @@ -242,44 +320,40 @@ StoragePolicySelector::StoragePolicySelector( { if (!std::all_of(name.begin(), name.end(), isWordCharASCII)) throw Exception( - "StoragePolicy name can contain only alphanumeric and '_' (" + name + ")", ErrorCodes::EXCESSIVE_ELEMENT_IN_CONFIG); + "Storage policy name can contain only alphanumeric and '_' (" + backQuote(name) + ")", ErrorCodes::EXCESSIVE_ELEMENT_IN_CONFIG); policies.emplace(name, std::make_shared(name, config, config_prefix + "." + name, disks)); LOG_INFO(&Poco::Logger::get("StoragePolicySelector"), "Storage policy {} loaded", backQuote(name)); } - constexpr auto default_storage_policy_name = "default"; - constexpr auto default_volume_name = "default"; - constexpr auto default_disk_name = "default"; - - /// Add default policy if it's not specified explicetly - if (policies.find(default_storage_policy_name) == policies.end()) + /// Add default policy if it isn't explicitly specified. + if (policies.find(DEFAULT_STORAGE_POLICY_NAME) == policies.end()) { - auto default_volume = std::make_shared(default_volume_name, std::vector{disks->get(default_disk_name)}, 0); - - auto default_policy = std::make_shared(default_storage_policy_name, Volumes{default_volume}, 0.0); - policies.emplace(default_storage_policy_name, default_policy); + auto default_policy = std::make_shared(DEFAULT_STORAGE_POLICY_NAME, config, config_prefix + "." + DEFAULT_STORAGE_POLICY_NAME, disks); + policies.emplace(DEFAULT_STORAGE_POLICY_NAME, std::move(default_policy)); } } StoragePolicySelectorPtr StoragePolicySelector::updateFromConfig(const Poco::Util::AbstractConfiguration & config, const String & config_prefix, DiskSelectorPtr disks) const { - Poco::Util::AbstractConfiguration::Keys keys; - config.keys(config_prefix, keys); - std::shared_ptr result = std::make_shared(config, config_prefix, disks); - constexpr auto default_storage_policy_name = "default"; - + /// First pass, check. for (const auto & [name, policy] : policies) { - if (name != default_storage_policy_name && result->policies.count(name) == 0) + if (result->policies.count(name) == 0) throw Exception("Storage policy " + backQuote(name) + " is missing in new configuration", ErrorCodes::BAD_ARGUMENTS); policy->checkCompatibleWith(result->policies[name]); } + /// Second pass, load. + for (const auto & [name, policy] : policies) + { + result->policies[name] = std::make_shared(*policy, config, config_prefix + "." + name, disks); + } + return result; } @@ -288,7 +362,7 @@ StoragePolicyPtr StoragePolicySelector::get(const String & name) const { auto it = policies.find(name); if (it == policies.end()) - throw Exception("Unknown StoragePolicy " + name, ErrorCodes::UNKNOWN_POLICY); + throw Exception("Unknown storage policy " + backQuote(name), ErrorCodes::UNKNOWN_POLICY); return it->second; } diff --git a/src/Disks/StoragePolicy.h b/src/Disks/StoragePolicy.h index 0e0795d8bf1..f4a4a0070b8 100644 --- a/src/Disks/StoragePolicy.h +++ b/src/Disks/StoragePolicy.h @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -36,6 +37,13 @@ public: StoragePolicy(String name_, Volumes volumes_, double move_factor_); + StoragePolicy( + const StoragePolicy & storage_policy, + const Poco::Util::AbstractConfiguration & config, + const String & config_prefix, + DiskSelectorPtr disks + ); + bool isDefaultPolicy() const; /// Returns disks ordered by volumes priority @@ -72,16 +80,10 @@ public: /// which should be kept with help of background moves double getMoveFactor() const { return move_factor; } - /// Get volume by index from storage_policy - VolumePtr getVolume(size_t i) const { return (i < volumes_names.size() ? volumes[i] : VolumePtr()); } + /// Get volume by index. + VolumePtr getVolume(size_t index) const; - VolumePtr getVolumeByName(const String & volume_name) const - { - auto it = volumes_names.find(volume_name); - if (it == volumes_names.end()) - return {}; - return getVolume(it->second); - } + VolumePtr getVolumeByName(const String & volume_name) const; /// Checks if storage policy can be replaced by another one. void checkCompatibleWith(const StoragePolicyPtr & new_storage_policy) const; @@ -89,12 +91,15 @@ public: private: Volumes volumes; const String name; - std::map volumes_names; + std::unordered_map volume_index_by_volume_name; + std::unordered_map volume_index_by_disk_name; /// move_factor from interval [0., 1.] /// We move something if disk from this policy /// filled more than total_size * move_factor double move_factor = 0.1; /// by default move factor is 10% + + void buildVolumeIndices(); }; diff --git a/src/Disks/VolumeJBOD.cpp b/src/Disks/VolumeJBOD.cpp index 3ac8a50acfb..e5905f77db3 100644 --- a/src/Disks/VolumeJBOD.cpp +++ b/src/Disks/VolumeJBOD.cpp @@ -56,11 +56,23 @@ VolumeJBOD::VolumeJBOD( /// Default value is 'true' due to backward compatibility. perform_ttl_move_on_insert = config.getBool(config_prefix + ".perform_ttl_move_on_insert", true); + + are_merges_avoided = config.getBool(config_prefix + ".prefer_not_to_merge", false); +} + +VolumeJBOD::VolumeJBOD(const VolumeJBOD & volume_jbod, + const Poco::Util::AbstractConfiguration & config, + const String & config_prefix, + DiskSelectorPtr disk_selector) + : VolumeJBOD(volume_jbod.name, config, config_prefix, disk_selector) +{ + are_merges_avoided_user_override = volume_jbod.are_merges_avoided_user_override.load(std::memory_order_relaxed); + last_used = volume_jbod.last_used.load(std::memory_order_relaxed); } DiskPtr VolumeJBOD::getDisk(size_t /* index */) const { - size_t start_from = last_used.fetch_add(1u, std::memory_order_relaxed); + size_t start_from = last_used.fetch_add(1u, std::memory_order_acq_rel); size_t index = start_from % disks.size(); return disks[index]; } @@ -73,7 +85,7 @@ ReservationPtr VolumeJBOD::reserve(UInt64 bytes) if (max_data_part_size != 0 && bytes > max_data_part_size) return {}; - size_t start_from = last_used.fetch_add(1u, std::memory_order_relaxed); + size_t start_from = last_used.fetch_add(1u, std::memory_order_acq_rel); size_t disks_num = disks.size(); for (size_t i = 0; i < disks_num; ++i) { @@ -87,4 +99,19 @@ ReservationPtr VolumeJBOD::reserve(UInt64 bytes) return {}; } +bool VolumeJBOD::areMergesAvoided() const +{ + auto are_merges_avoided_user_override_value = are_merges_avoided_user_override.load(std::memory_order_acquire); + if (are_merges_avoided_user_override_value) + return *are_merges_avoided_user_override_value; + else + return are_merges_avoided; +} + +void VolumeJBOD::setAvoidMergesUserOverride(bool avoid) +{ + are_merges_avoided_user_override.store(avoid, std::memory_order_release); +} + + } diff --git a/src/Disks/VolumeJBOD.h b/src/Disks/VolumeJBOD.h index 52eb2f00721..621125f1109 100644 --- a/src/Disks/VolumeJBOD.h +++ b/src/Disks/VolumeJBOD.h @@ -1,10 +1,19 @@ #pragma once +#include +#include + #include + namespace DB { +class VolumeJBOD; + +using VolumeJBODPtr = std::shared_ptr; +using VolumesJBOD = std::vector; + /** * Implements something similar to JBOD (https://en.wikipedia.org/wiki/Non-RAID_drive_architectures#JBOD). * When MergeTree engine wants to write part — it requests VolumeJBOD to reserve space on the next available @@ -13,8 +22,9 @@ namespace DB class VolumeJBOD : public IVolume { public: - VolumeJBOD(String name_, Disks disks_, UInt64 max_data_part_size_) + VolumeJBOD(String name_, Disks disks_, UInt64 max_data_part_size_, bool are_merges_avoided_) : IVolume(name_, disks_, max_data_part_size_) + , are_merges_avoided(are_merges_avoided_) { } @@ -25,6 +35,13 @@ public: DiskSelectorPtr disk_selector ); + VolumeJBOD( + const VolumeJBOD & volume_jbod, + const Poco::Util::AbstractConfiguration & config, + const String & config_prefix, + DiskSelectorPtr disk_selector + ); + VolumeType getType() const override { return VolumeType::JBOD; } /// Always returns next disk (round-robin), ignores argument. @@ -38,11 +55,19 @@ public: /// Returns valid reservation or nullptr if there is no space left on any disk. ReservationPtr reserve(UInt64 bytes) override; + bool areMergesAvoided() const override; + + void setAvoidMergesUserOverride(bool avoid) override; + + /// True if parts on this volume participate in merges according to configuration. + bool are_merges_avoided = true; + private: + /// Index of last used disk. mutable std::atomic last_used = 0; + + /// True if parts on this volume participate in merges according to START/STOP MERGES ON VOLUME. + std::atomic> are_merges_avoided_user_override{std::nullopt}; }; -using VolumeJBODPtr = std::shared_ptr; -using VolumesJBOD = std::vector; - } diff --git a/src/Disks/VolumeRAID1.h b/src/Disks/VolumeRAID1.h index 58cb5bd2623..f6f2d245a49 100644 --- a/src/Disks/VolumeRAID1.h +++ b/src/Disks/VolumeRAID1.h @@ -3,18 +3,23 @@ #include #include + namespace DB { -/// Volume which reserserves space on each underlying disk. +class VolumeRAID1; + +using VolumeRAID1Ptr = std::shared_ptr; + +/// Volume which reserves space on each underlying disk. /// /// NOTE: Just interface implementation, doesn't used in codebase, /// also not available for user. class VolumeRAID1 : public VolumeJBOD { public: - VolumeRAID1(String name_, Disks disks_, UInt64 max_data_part_size_) - : VolumeJBOD(name_, disks_, max_data_part_size_) + VolumeRAID1(String name_, Disks disks_, UInt64 max_data_part_size_, bool are_merges_avoided_in_config_) + : VolumeJBOD(name_, disks_, max_data_part_size_, are_merges_avoided_in_config_) { } @@ -27,11 +32,18 @@ public: { } + VolumeRAID1( + VolumeRAID1 & volume_raid1, + const Poco::Util::AbstractConfiguration & config, + const String & config_prefix, + DiskSelectorPtr disk_selector) + : VolumeJBOD(volume_raid1, config, config_prefix, disk_selector) + { + } + VolumeType getType() const override { return VolumeType::RAID1; } ReservationPtr reserve(UInt64 bytes) override; }; -using VolumeRAID1Ptr = std::shared_ptr; - } diff --git a/src/Disks/createVolume.cpp b/src/Disks/createVolume.cpp index 90ed333406e..a290a1d3db3 100644 --- a/src/Disks/createVolume.cpp +++ b/src/Disks/createVolume.cpp @@ -12,6 +12,7 @@ namespace DB namespace ErrorCodes { extern const int UNKNOWN_RAID_TYPE; + extern const int INVALID_RAID_TYPE; } VolumePtr createVolumeFromReservation(const ReservationPtr & reservation, VolumePtr other_volume) @@ -20,12 +21,12 @@ VolumePtr createVolumeFromReservation(const ReservationPtr & reservation, Volume { /// Since reservation on JBOD chooses one of disks and makes reservation there, volume /// for such type of reservation will be with one disk. - return std::make_shared(other_volume->getName(), reservation->getDisk()); + return std::make_shared(other_volume->getName(), reservation->getDisk(), other_volume->max_data_part_size); } if (other_volume->getType() == VolumeType::RAID1) { auto volume = std::dynamic_pointer_cast(other_volume); - return std::make_shared(volume->getName(), reservation->getDisks(), volume->max_data_part_size); + return std::make_shared(volume->getName(), reservation->getDisks(), volume->max_data_part_size, volume->are_merges_avoided); } return nullptr; } @@ -37,17 +38,31 @@ VolumePtr createVolumeFromConfig( DiskSelectorPtr disk_selector ) { - auto has_raid_type = config.has(config_prefix + ".raid_type"); - if (!has_raid_type) - { - return std::make_shared(name, config, config_prefix, disk_selector); - } - String raid_type = config.getString(config_prefix + ".raid_type"); + String raid_type = config.getString(config_prefix + ".raid_type", "JBOD"); if (raid_type == "JBOD") { return std::make_shared(name, config, config_prefix, disk_selector); } - throw Exception("Unknown raid type '" + raid_type + "'", ErrorCodes::UNKNOWN_RAID_TYPE); + throw Exception("Unknown RAID type '" + raid_type + "'", ErrorCodes::UNKNOWN_RAID_TYPE); +} + +VolumePtr updateVolumeFromConfig( + VolumePtr volume, + const Poco::Util::AbstractConfiguration & config, + const String & config_prefix, + DiskSelectorPtr & disk_selector +) +{ + String raid_type = config.getString(config_prefix + ".raid_type", "JBOD"); + if (raid_type == "JBOD") + { + VolumeJBODPtr volume_jbod = std::dynamic_pointer_cast(volume); + if (!volume_jbod) + throw Exception("Invalid RAID type '" + raid_type + "', shall be JBOD", ErrorCodes::INVALID_RAID_TYPE); + + return std::make_shared(*volume_jbod, config, config_prefix, disk_selector); + } + throw Exception("Unknown RAID type '" + raid_type + "'", ErrorCodes::UNKNOWN_RAID_TYPE); } } diff --git a/src/Disks/createVolume.h b/src/Disks/createVolume.h index 64f5e73181b..479501759d1 100644 --- a/src/Disks/createVolume.h +++ b/src/Disks/createVolume.h @@ -6,6 +6,7 @@ namespace DB { VolumePtr createVolumeFromReservation(const ReservationPtr & reservation, VolumePtr other_volume); + VolumePtr createVolumeFromConfig( String name_, const Poco::Util::AbstractConfiguration & config, @@ -13,4 +14,11 @@ VolumePtr createVolumeFromConfig( DiskSelectorPtr disk_selector ); +VolumePtr updateVolumeFromConfig( + VolumePtr volume, + const Poco::Util::AbstractConfiguration & config, + const String & config_prefix, + DiskSelectorPtr & disk_selector +); + } diff --git a/src/Formats/FormatFactory.cpp b/src/Formats/FormatFactory.cpp index 6707653a84a..4dc5b816420 100644 --- a/src/Formats/FormatFactory.cpp +++ b/src/Formats/FormatFactory.cpp @@ -49,6 +49,7 @@ static FormatSettings getInputFormatSetting(const Settings & settings, const Con format_settings.csv.allow_double_quotes = settings.format_csv_allow_double_quotes; format_settings.csv.unquoted_null_literal_as_null = settings.input_format_csv_unquoted_null_literal_as_null; format_settings.csv.empty_as_default = settings.input_format_defaults_for_omitted_fields; + format_settings.csv.input_format_enum_as_number = settings.input_format_csv_enum_as_number; format_settings.null_as_default = settings.input_format_null_as_default; format_settings.values.interpret_expressions = settings.input_format_values_interpret_expressions; format_settings.values.deduce_templates_of_expressions = settings.input_format_values_deduce_templates_of_expressions; @@ -63,6 +64,7 @@ static FormatSettings getInputFormatSetting(const Settings & settings, const Con format_settings.template_settings.row_format = settings.format_template_row; format_settings.template_settings.row_between_delimiter = settings.format_template_rows_between_delimiter; format_settings.tsv.empty_as_default = settings.input_format_tsv_empty_as_default; + format_settings.tsv.input_format_enum_as_number = settings.input_format_tsv_enum_as_number; format_settings.schema.format_schema = settings.format_schema; format_settings.schema.format_schema_path = context.getFormatSchemaPath(); format_settings.schema.is_server = context.hasGlobalContext() && (context.getGlobalContext().getApplicationType() == Context::ApplicationType::SERVER); diff --git a/src/Formats/FormatSettings.h b/src/Formats/FormatSettings.h index 20c8a032231..8d7c3cdb49f 100644 --- a/src/Formats/FormatSettings.h +++ b/src/Formats/FormatSettings.h @@ -34,6 +34,7 @@ struct FormatSettings bool unquoted_null_literal_as_null = false; bool empty_as_default = false; bool crlf_end_of_line = false; + bool input_format_enum_as_number = false; }; CSV csv; @@ -81,6 +82,7 @@ struct FormatSettings bool empty_as_default = false; bool crlf_end_of_line = false; String null_representation = "\\N"; + bool input_format_enum_as_number = false; }; TSV tsv; diff --git a/src/Functions/FunctionHelpers.cpp b/src/Functions/FunctionHelpers.cpp index 473feeaca60..ab9f90eba0b 100644 --- a/src/Functions/FunctionHelpers.cpp +++ b/src/Functions/FunctionHelpers.cpp @@ -137,7 +137,7 @@ void validateArgumentsImpl(const IFunction & func, const auto & arg = arguments[i + argument_offset]; const auto descriptor = descriptors[i]; if (int error_code = descriptor.isValid(arg.type, arg.column); error_code != 0) - throw Exception("Illegal type of argument #" + std::to_string(i) + throw Exception("Illegal type of argument #" + std::to_string(argument_offset + i + 1) // +1 is for human-friendly 1-based indexing + (descriptor.argument_name ? " '" + std::string(descriptor.argument_name) + "'" : String{}) + " of function " + func.getName() + (descriptor.expected_type_description ? String(", expected ") + descriptor.expected_type_description : String{}) diff --git a/src/Functions/FunctionsAES.cpp b/src/Functions/FunctionsAES.cpp new file mode 100644 index 00000000000..1588006eed8 --- /dev/null +++ b/src/Functions/FunctionsAES.cpp @@ -0,0 +1,63 @@ +#include + +#if USE_SSL + +#include +#include + +#include +#include + + +namespace DB +{ +namespace ErrorCodes +{ + extern const int OPENSSL_ERROR; +} +} + +namespace OpenSSLDetails +{ +void onError(std::string error_message) +{ + error_message += ". OpenSSL error code: " + std::to_string(ERR_get_error()); + throw DB::Exception(error_message, DB::ErrorCodes::OPENSSL_ERROR); +} + +StringRef foldEncryptionKeyInMySQLCompatitableMode(size_t cipher_key_size, const StringRef & key, std::array & folded_key) +{ + assert(cipher_key_size <= EVP_MAX_KEY_LENGTH); + memcpy(folded_key.data(), key.data, cipher_key_size); + + for (size_t i = cipher_key_size; i < key.size; ++i) + { + folded_key[i % cipher_key_size] ^= key.data[i]; + } + + return StringRef(folded_key.data(), cipher_key_size); +} + +const EVP_CIPHER * getCipherByName(const StringRef & cipher_name) +{ + const auto * evp_cipher = EVP_get_cipherbyname(cipher_name.data); + if (evp_cipher == nullptr) + { + // For some reasons following ciphers can't be found by name. + if (cipher_name == "aes-128-cfb128") + evp_cipher = EVP_aes_128_cfb128(); + else if (cipher_name == "aes-192-cfb128") + evp_cipher = EVP_aes_192_cfb128(); + else if (cipher_name == "aes-256-cfb128") + evp_cipher = EVP_aes_256_cfb128(); + } + + // NOTE: cipher obtained not via EVP_CIPHER_fetch() would cause extra work on each context reset + // with EVP_CIPHER_CTX_reset() or EVP_EncryptInit_ex(), but using EVP_CIPHER_fetch() + // causes data race, so we stick to the slower but safer alternative here. + return evp_cipher; +} + +} + +#endif diff --git a/src/Functions/FunctionsAES.h b/src/Functions/FunctionsAES.h new file mode 100644 index 00000000000..d7b724dcbe9 --- /dev/null +++ b/src/Functions/FunctionsAES.h @@ -0,0 +1,693 @@ +#pragma once + +#if !defined(ARCADIA_BUILD) +# include +#endif + +#if USE_SSL +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include + +#include + + +namespace DB +{ +namespace ErrorCodes +{ + extern const int BAD_ARGUMENTS; +} +} + +namespace OpenSSLDetails +{ +[[noreturn]] void onError(std::string error_message); +StringRef foldEncryptionKeyInMySQLCompatitableMode(size_t cipher_key_size, const StringRef & key, std::array & folded_key); + +const EVP_CIPHER * getCipherByName(const StringRef & name); + +enum class CompatibilityMode +{ + MySQL, + OpenSSL +}; + +enum class CipherMode +{ + MySQLCompatibility, // with key folding + OpenSSLCompatibility, // just as regular openssl's enc application does (AEAD modes, like GCM and CCM are not supported) + RFC5116_AEAD_AES_GCM // AEAD GCM with custom IV length and tag (HMAC) appended to the ciphertext, see https://tools.ietf.org/html/rfc5116#section-5.1 +}; + + +template +struct KeyHolder +{ + inline StringRef setKey(size_t cipher_key_size, const StringRef & key) const + { + if (key.size != cipher_key_size) + throw DB::Exception(fmt::format("Invalid key size: {} expected {}", key.size, cipher_key_size), + DB::ErrorCodes::BAD_ARGUMENTS); + + return key; + } +}; + +template <> +struct KeyHolder +{ + inline StringRef setKey(size_t cipher_key_size, const StringRef & key) + { + if (key.size < cipher_key_size) + throw DB::Exception(fmt::format("Invalid key size: {} expected {}", key.size, cipher_key_size), + DB::ErrorCodes::BAD_ARGUMENTS); + + // MySQL does something fancy with the keys that are too long, + // ruining compatibility with OpenSSL and not improving security. + // But we have to do the same to be compatitable with MySQL. + // see https://github.com/mysql/mysql-server/blob/8.0/router/src/harness/src/my_aes_openssl.cc#L71 + // (my_aes_create_key function) + return foldEncryptionKeyInMySQLCompatitableMode(cipher_key_size, key, folded_key); + } + + ~KeyHolder() + { + OPENSSL_cleanse(folded_key.data(), folded_key.size()); + } + +private: + std::array folded_key; +}; + +template +inline void validateCipherMode(const EVP_CIPHER * evp_cipher) +{ + if constexpr (compatibility_mode == CompatibilityMode::MySQL) + { + switch (EVP_CIPHER_mode(evp_cipher)) + { + case EVP_CIPH_ECB_MODE: [[fallthrough]]; + case EVP_CIPH_CBC_MODE: [[fallthrough]]; + case EVP_CIPH_CFB_MODE: [[fallthrough]]; + case EVP_CIPH_OFB_MODE: + return; + } + } + else if constexpr (compatibility_mode == CompatibilityMode::OpenSSL) + { + switch (EVP_CIPHER_mode(evp_cipher)) + { + case EVP_CIPH_ECB_MODE: [[fallthrough]]; + case EVP_CIPH_CBC_MODE: [[fallthrough]]; + case EVP_CIPH_CFB_MODE: [[fallthrough]]; + case EVP_CIPH_OFB_MODE: [[fallthrough]]; + case EVP_CIPH_CTR_MODE: [[fallthrough]]; + case EVP_CIPH_GCM_MODE: + return; + } + } + + throw DB::Exception("Unsupported cipher mode " + std::string(EVP_CIPHER_name(evp_cipher)), DB::ErrorCodes::BAD_ARGUMENTS); +} + +template +inline void validateIV(const StringRef & iv_value, const size_t cipher_iv_size) +{ + // In MySQL mode we don't care if IV is longer than expected, only if shorter. + if ((mode == CipherMode::MySQLCompatibility && iv_value.size != 0 && iv_value.size < cipher_iv_size) + || (mode == CipherMode::OpenSSLCompatibility && iv_value.size != 0 && iv_value.size != cipher_iv_size)) + throw DB::Exception(fmt::format("Invalid IV size: {} expected {}", iv_value.size, cipher_iv_size), + DB::ErrorCodes::BAD_ARGUMENTS); +} + +} + +namespace DB +{ +template +class FunctionEncrypt : public IFunction +{ +public: + static constexpr OpenSSLDetails::CompatibilityMode compatibility_mode = Impl::compatibility_mode; + static constexpr auto name = Impl::name; + static FunctionPtr create(const Context &) { return std::make_shared(); } + +private: + using CipherMode = OpenSSLDetails::CipherMode; + + String getName() const override { return name; } + bool isVariadic() const override { return true; } + size_t getNumberOfArguments() const override { return 0; } + ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {0}; } + bool useDefaultImplementationForConstants() const override { return true; } + + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override + { + auto optional_args = FunctionArgumentDescriptors{ + {"IV", isStringOrFixedString, nullptr, "Initialization vector binary string"}, + }; + + if constexpr (compatibility_mode == OpenSSLDetails::CompatibilityMode::OpenSSL) + { + optional_args.emplace_back(FunctionArgumentDescriptor{ + "AAD", isStringOrFixedString, nullptr, "Additional authenticated data binary string for GCM mode" + }); + } + + validateFunctionArgumentTypes(*this, arguments, + FunctionArgumentDescriptors{ + {"mode", isStringOrFixedString, isColumnConst, "encryption mode string"}, + {"input", nullptr, nullptr, "plaintext"}, + {"key", isStringOrFixedString, nullptr, "encryption key binary string"}, + }, + optional_args + ); + + return std::make_shared(); + } + + void executeImpl(DB::ColumnsWithTypeAndName & block, const ColumnNumbers & arguments, size_t result, size_t input_rows_count) const override + { + using namespace OpenSSLDetails; + + const auto mode = block[arguments[0]].column->getDataAt(0); + + if (mode.size == 0 || !std::string_view(mode).starts_with("aes-")) + throw Exception("Invalid mode: " + mode.toString(), ErrorCodes::BAD_ARGUMENTS); + + auto evp_cipher = getCipherByName(mode); + if (evp_cipher == nullptr) + throw Exception("Invalid mode: " + mode.toString(), ErrorCodes::BAD_ARGUMENTS); + + const auto cipher_mode = EVP_CIPHER_mode(evp_cipher); + + const auto input_column = block[arguments[1]].column; + const auto key_column = block[arguments[2]].column; + + OpenSSLDetails::validateCipherMode(evp_cipher); + + ColumnPtr result_column; + if (arguments.size() <= 3) + result_column = doEncrypt(evp_cipher, input_rows_count, input_column, key_column, nullptr, nullptr); + else + { + const auto iv_column = block[arguments[3]].column; + if (compatibility_mode != OpenSSLDetails::CompatibilityMode::MySQL && EVP_CIPHER_iv_length(evp_cipher) == 0) + throw Exception(mode.toString() + " does not support IV", ErrorCodes::BAD_ARGUMENTS); + + if (arguments.size() <= 4) + { + result_column = doEncrypt(evp_cipher, input_rows_count, input_column, key_column, iv_column, nullptr); + } + else + { + if (cipher_mode != EVP_CIPH_GCM_MODE) + throw Exception("AAD can be only set for GCM-mode", ErrorCodes::BAD_ARGUMENTS); + + const auto aad_column = block[arguments[4]].column; + result_column = doEncrypt(evp_cipher, input_rows_count, input_column, key_column, iv_column, aad_column); + } + } + + block[result].column = std::move(result_column); + } + + template + static ColumnPtr doEncrypt(const EVP_CIPHER * evp_cipher, + size_t input_rows_count, + const InputColumnType & input_column, + const KeyColumnType & key_column, + const IvColumnType & iv_column, + const AadColumnType & aad_column) + { + if constexpr (compatibility_mode == OpenSSLDetails::CompatibilityMode::MySQL) + { + return doEncryptImpl(evp_cipher, input_rows_count, input_column, key_column, iv_column, aad_column); + } + else + { + if (EVP_CIPHER_mode(evp_cipher) == EVP_CIPH_GCM_MODE) + { + return doEncryptImpl(evp_cipher, input_rows_count, input_column, key_column, iv_column, aad_column); + } + else + { + return doEncryptImpl(evp_cipher, input_rows_count, input_column, key_column, iv_column, aad_column); + } + } + + return nullptr; + } + + template + static ColumnPtr doEncryptImpl(const EVP_CIPHER * evp_cipher, + size_t input_rows_count, + const InputColumnType & input_column, + const KeyColumnType & key_column, + [[maybe_unused]] const IvColumnType & iv_column, + [[maybe_unused]] const AadColumnType & aad_column) + { + using namespace OpenSSLDetails; + + auto evp_ctx_ptr = std::unique_ptr(EVP_CIPHER_CTX_new(), &EVP_CIPHER_CTX_free); + auto evp_ctx = evp_ctx_ptr.get(); + + const auto block_size = static_cast(EVP_CIPHER_block_size(evp_cipher)); + const auto key_size = static_cast(EVP_CIPHER_key_length(evp_cipher)); + [[maybe_unused]] const auto iv_size = static_cast(EVP_CIPHER_iv_length(evp_cipher)); + const auto tag_size = 16; // https://tools.ietf.org/html/rfc5116#section-5.1 + + auto encrypted_result_column = ColumnString::create(); + auto & encrypted_result_column_data = encrypted_result_column->getChars(); + auto & encrypted_result_column_offsets = encrypted_result_column->getOffsets(); + + { + size_t resulting_size = 0; + // for modes with block_size > 1, plaintext is padded up to a block_size, + // which may result in allocating to much for block_size = 1. + // That may lead later to reading unallocated data from underlying PaddedPODArray + // due to assumption that it is safe to read up to 15 bytes past end. + const auto pad_to_next_block = block_size == 1 ? 0 : 1; + for (size_t r = 0; r < input_rows_count; ++r) + { + resulting_size += (input_column->getDataAt(r).size / block_size + pad_to_next_block) * block_size + 1; + if constexpr (mode == CipherMode::RFC5116_AEAD_AES_GCM) + resulting_size += tag_size; + } +#if defined(MEMORY_SANITIZER) + encrypted_result_column_data.resize_fill(resulting_size, 0xFF); +#else + encrypted_result_column_data.resize(resulting_size); +#endif + } + + auto encrypted = encrypted_result_column_data.data(); + + KeyHolder key_holder; + + for (size_t r = 0; r < input_rows_count; ++r) + { + const auto key_value = key_holder.setKey(key_size, key_column->getDataAt(r)); + auto iv_value = StringRef{}; + if constexpr (!std::is_same_v>) + { + iv_value = iv_column->getDataAt(r); + } + + const auto input_value = input_column->getDataAt(r); + auto aad_value = StringRef{}; + if constexpr (mode == CipherMode::RFC5116_AEAD_AES_GCM && !std::is_same_v>) + { + aad_value = aad_column->getDataAt(r); + } + + if constexpr (mode != CipherMode::MySQLCompatibility) + { + // in GCM mode IV can be of arbitrary size (>0), IV is optional for other modes. + if (mode == CipherMode::RFC5116_AEAD_AES_GCM && iv_value.size == 0) + { + throw Exception("Invalid IV size " + std::to_string(iv_value.size) + " != expected size " + std::to_string(iv_size), + DB::ErrorCodes::BAD_ARGUMENTS); + } + + if (mode != CipherMode::RFC5116_AEAD_AES_GCM && key_value.size != key_size) + { + throw Exception("Invalid key size " + std::to_string(key_value.size) + " != expected size " + std::to_string(key_size), + DB::ErrorCodes::BAD_ARGUMENTS); + } + } + + // Avoid extra work on empty ciphertext/plaintext for some ciphers + if (!(input_value.size == 0 && block_size == 1 && mode != CipherMode::RFC5116_AEAD_AES_GCM)) + { + // 1: Init CTX + if constexpr (mode == CipherMode::RFC5116_AEAD_AES_GCM) + { + // 1.a.1: Init CTX with custom IV length and optionally with AAD + if (EVP_EncryptInit_ex(evp_ctx, evp_cipher, nullptr, nullptr, nullptr) != 1) + onError("Failed to initialize encryption context with cipher"); + + if (EVP_CIPHER_CTX_ctrl(evp_ctx, EVP_CTRL_AEAD_SET_IVLEN, iv_value.size, nullptr) != 1) + onError("Failed to set custom IV length to " + std::to_string(iv_value.size)); + + if (EVP_EncryptInit_ex(evp_ctx, nullptr, nullptr, + reinterpret_cast(key_value.data), + reinterpret_cast(iv_value.data)) != 1) + onError("Failed to set key and IV"); + + // 1.a.2 Set AAD + if constexpr (!std::is_same_v>) + { + const auto aad_data = aad_column->getDataAt(r); + int tmp_len = 0; + if (aad_data.size != 0 && EVP_EncryptUpdate(evp_ctx, nullptr, &tmp_len, + reinterpret_cast(aad_data.data), aad_data.size) != 1) + onError("Failed to set AAD data"); + } + } + else + { + // 1.b: Init CTX + validateIV(iv_value, iv_size); + + if (EVP_EncryptInit_ex(evp_ctx, evp_cipher, nullptr, + reinterpret_cast(key_value.data), + reinterpret_cast(iv_value.data)) != 1) + onError("Failed to initialize cipher context"); + } + + int output_len = 0; + // 2: Feed the data to the cipher + if (EVP_EncryptUpdate(evp_ctx, + reinterpret_cast(encrypted), &output_len, + reinterpret_cast(input_value.data), static_cast(input_value.size)) != 1) + onError("Failed to encrypt"); + encrypted += output_len; + + // 3: retrieve encrypted data (ciphertext) + if (EVP_EncryptFinal_ex(evp_ctx, + reinterpret_cast(encrypted), &output_len) != 1) + onError("Failed to fetch ciphertext"); + encrypted += output_len; + + // 4: optionally retrieve a tag and append it to the ciphertext (RFC5116): + // https://tools.ietf.org/html/rfc5116#section-5.1 + if constexpr (mode == CipherMode::RFC5116_AEAD_AES_GCM) + { + if (EVP_CIPHER_CTX_ctrl(evp_ctx, EVP_CTRL_AEAD_GET_TAG, tag_size, encrypted) != 1) + onError("Failed to retrieve GCM tag"); + encrypted += tag_size; + } + } + + *encrypted = '\0'; + ++encrypted; + + encrypted_result_column_offsets.push_back(encrypted - encrypted_result_column_data.data()); + } + + // in case of block size of 1, we overestimate buffer required for encrypted data, fix it up. + if (!encrypted_result_column_offsets.empty() && encrypted_result_column_data.size() > encrypted_result_column_offsets.back()) + { + encrypted_result_column_data.resize(encrypted_result_column_offsets.back()); + } + + encrypted_result_column->validate(); + return encrypted_result_column; + } +}; + + +/// AES_decrypt(string, key, block_mode[, init_vector]) +template +class FunctionDecrypt : public IFunction +{ +public: + static constexpr OpenSSLDetails::CompatibilityMode compatibility_mode = Impl::compatibility_mode; + static constexpr auto name = Impl::name; + static FunctionPtr create(const Context &) { return std::make_shared(); } + +private: + using CipherMode = OpenSSLDetails::CipherMode; + + String getName() const override { return name; } + bool isVariadic() const override { return true; } + size_t getNumberOfArguments() const override { return 0; } + ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {0}; } + bool useDefaultImplementationForConstants() const override { return true; } + + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override + { + auto optional_args = FunctionArgumentDescriptors{ + {"IV", isStringOrFixedString, nullptr, "Initialization vector binary string"}, + }; + + if constexpr (compatibility_mode == OpenSSLDetails::CompatibilityMode::OpenSSL) + { + optional_args.emplace_back(FunctionArgumentDescriptor{ + "AAD", isStringOrFixedString, nullptr, "Additional authenticated data binary string for GCM mode" + }); + } + + validateFunctionArgumentTypes(*this, arguments, + FunctionArgumentDescriptors{ + {"mode", isStringOrFixedString, isColumnConst, "decryption mode string"}, + {"input", nullptr, nullptr, "ciphertext"}, + {"key", isStringOrFixedString, nullptr, "decryption key binary string"}, + }, + optional_args + ); + + return std::make_shared(); + } + + void executeImpl(DB::ColumnsWithTypeAndName & block, const ColumnNumbers & arguments, size_t result, size_t input_rows_count) const override + { + using namespace OpenSSLDetails; + + const auto mode = block[arguments[0]].column->getDataAt(0); + if (mode.size == 0 || !std::string_view(mode).starts_with("aes-")) + throw Exception("Invalid mode: " + mode.toString(), ErrorCodes::BAD_ARGUMENTS); + + auto evp_cipher = getCipherByName(mode); + if (evp_cipher == nullptr) + throw Exception("Invalid mode: " + mode.toString(), ErrorCodes::BAD_ARGUMENTS); + + OpenSSLDetails::validateCipherMode(evp_cipher); + + const auto input_column = block[arguments[1]].column; + const auto key_column = block[arguments[2]].column; + + ColumnPtr result_column; + if (arguments.size() <= 3) + result_column = doDecrypt(evp_cipher, input_rows_count, input_column, key_column, nullptr, nullptr); + else + { + const auto iv_column = block[arguments[3]].column; + if (compatibility_mode != OpenSSLDetails::CompatibilityMode::MySQL && EVP_CIPHER_iv_length(evp_cipher) == 0) + throw Exception(mode.toString() + " does not support IV", ErrorCodes::BAD_ARGUMENTS); + + if (arguments.size() <= 4) + { + result_column = doDecrypt(evp_cipher, input_rows_count, input_column, key_column, iv_column, nullptr); + } + else + { + if (EVP_CIPHER_mode(evp_cipher) != EVP_CIPH_GCM_MODE) + throw Exception("AAD can be only set for GCM-mode", ErrorCodes::BAD_ARGUMENTS); + + const auto aad_column = block[arguments[4]].column; + result_column = doDecrypt(evp_cipher, input_rows_count, input_column, key_column, iv_column, aad_column); + } + } + + block[result].column = std::move(result_column); + } + + template + static ColumnPtr doDecrypt(const EVP_CIPHER * evp_cipher, + size_t input_rows_count, + const InputColumnType & input_column, + const KeyColumnType & key_column, + const IvColumnType & iv_column, + const AadColumnType & aad_column) + { + if constexpr (compatibility_mode == OpenSSLDetails::CompatibilityMode::MySQL) + { + return doDecryptImpl(evp_cipher, input_rows_count, input_column, key_column, iv_column, aad_column); + } + else + { + const auto cipher_mode = EVP_CIPHER_mode(evp_cipher); + if (cipher_mode == EVP_CIPH_GCM_MODE) + { + return doDecryptImpl(evp_cipher, input_rows_count, input_column, key_column, iv_column, aad_column); + } + else + { + return doDecryptImpl(evp_cipher, input_rows_count, input_column, key_column, iv_column, aad_column); + } + } + + return nullptr; + } + + template + static ColumnPtr doDecryptImpl(const EVP_CIPHER * evp_cipher, + size_t input_rows_count, + const InputColumnType & input_column, + const KeyColumnType & key_column, + [[maybe_unused]] const IvColumnType & iv_column, + [[maybe_unused]] const AadColumnType & aad_column) + { + using namespace OpenSSLDetails; + + auto evp_ctx_ptr = std::unique_ptr(EVP_CIPHER_CTX_new(), &EVP_CIPHER_CTX_free); + auto evp_ctx = evp_ctx_ptr.get(); + + [[maybe_unused]] const auto block_size = static_cast(EVP_CIPHER_block_size(evp_cipher)); + [[maybe_unused]] const auto iv_size = static_cast(EVP_CIPHER_iv_length(evp_cipher)); + const auto key_size = static_cast(EVP_CIPHER_key_length(evp_cipher)); + const auto tag_size = 16; // https://tools.ietf.org/html/rfc5116#section-5.1 + + auto decrypted_result_column = ColumnString::create(); + auto & decrypted_result_column_data = decrypted_result_column->getChars(); + auto & decrypted_result_column_offsets = decrypted_result_column->getOffsets(); + + { + size_t resulting_size = 0; + for (size_t r = 0; r < input_rows_count; ++r) + { + resulting_size += input_column->getDataAt(r).size + 1; + if constexpr (mode == CipherMode::RFC5116_AEAD_AES_GCM) + resulting_size -= tag_size; + } + +#if defined(MEMORY_SANITIZER) + // Pre-fill result column with values to prevent MSAN from dropping dead on + // aes-X-ecb mode with "WARNING: MemorySanitizer: use-of-uninitialized-value". + // This is most likely to be caused by the underlying assembler implementation: + // see crypto/aes/aesni-x86_64.s, function aesni_ecb_encrypt + // which msan seems to fail instrument correctly. + decrypted_result_column_data.resize_fill(resulting_size, 0xFF); +#else + decrypted_result_column_data.resize(resulting_size); +#endif + } + auto decrypted = decrypted_result_column_data.data(); + + KeyHolder key_holder; + for (size_t r = 0; r < input_rows_count; ++r) + { + // 0: prepare key if required + auto key_value = key_holder.setKey(key_size, key_column->getDataAt(r)); + auto iv_value = StringRef{}; + if constexpr (!std::is_same_v>) + { + iv_value = iv_column->getDataAt(r); + } + + auto input_value = input_column->getDataAt(r); + if constexpr (mode == CipherMode::RFC5116_AEAD_AES_GCM) + { + // empty plaintext results in empty ciphertext + tag, means there should be atleast tag_size bytes. + if (input_value.size < tag_size) + throw Exception(fmt::format("Encrypted data is too short: only {} bytes, " + "should contain at least {} bytes of a tag.", + input_value.size, block_size, tag_size), ErrorCodes::BAD_ARGUMENTS); + input_value.size -= tag_size; + } + + if constexpr (mode != CipherMode::MySQLCompatibility) + { + // in GCM mode IV can be of arbitrary size (>0), for other modes IV is optional. + if (mode == CipherMode::RFC5116_AEAD_AES_GCM && iv_value.size == 0) + { + throw Exception("Invalid IV size " + std::to_string(iv_value.size) + " != expected size " + std::to_string(iv_size), + DB::ErrorCodes::BAD_ARGUMENTS); + } + + if (key_value.size != key_size) + { + throw Exception("Invalid key size " + std::to_string(key_value.size) + " != expected size " + std::to_string(key_size), + DB::ErrorCodes::BAD_ARGUMENTS); + } + } + + // Avoid extra work on empty ciphertext/plaintext for some ciphers + if (!(input_value.size == 0 && block_size == 1 && mode != CipherMode::RFC5116_AEAD_AES_GCM)) + { + // 1: Init CTX + if constexpr (mode == CipherMode::RFC5116_AEAD_AES_GCM) + { + if (EVP_DecryptInit_ex(evp_ctx, evp_cipher, nullptr, nullptr, nullptr) != 1) + onError("Failed to initialize cipher context 1"); + + // 1.a.1 : Set custom IV length + if (EVP_CIPHER_CTX_ctrl(evp_ctx, EVP_CTRL_AEAD_SET_IVLEN, iv_value.size, nullptr) != 1) + onError("Failed to set custom IV length to " + std::to_string(iv_value.size)); + + // 1.a.1 : Init CTX with key and IV + if (EVP_DecryptInit_ex(evp_ctx, nullptr, nullptr, + reinterpret_cast(key_value.data), + reinterpret_cast(iv_value.data)) != 1) + onError("Failed to set key and IV"); + + // 1.a.2: Set AAD if present + if constexpr (!std::is_same_v>) + { + const auto aad_data = aad_column->getDataAt(r); + int tmp_len = 0; + if (aad_data.size != 0 && EVP_DecryptUpdate(evp_ctx, nullptr, &tmp_len, + reinterpret_cast(aad_data.data), aad_data.size) != 1) + onError("Failed to sed AAD data"); + } + } + else + { + // 1.b: Init CTX + validateIV(iv_value, iv_size); + + if (EVP_DecryptInit_ex(evp_ctx, evp_cipher, nullptr, + reinterpret_cast(key_value.data), + reinterpret_cast(iv_value.data)) != 1) + onError("Failed to initialize cipher context"); + } + + // 2: Feed the data to the cipher + int output_len = 0; + if (EVP_DecryptUpdate(evp_ctx, + reinterpret_cast(decrypted), &output_len, + reinterpret_cast(input_value.data), static_cast(input_value.size)) != 1) + onError("Failed to decrypt"); + decrypted += output_len; + + // 3: optionally get tag from the ciphertext (RFC5116) and feed it to the context + if constexpr (mode == CipherMode::RFC5116_AEAD_AES_GCM) + { + void * tag = const_cast(reinterpret_cast(input_value.data + input_value.size)); + if (EVP_CIPHER_CTX_ctrl(evp_ctx, EVP_CTRL_AEAD_SET_TAG, tag_size, tag) != 1) + onError("Failed to set tag"); + } + + // 4: retrieve encrypted data (ciphertext) + if (EVP_DecryptFinal_ex(evp_ctx, + reinterpret_cast(decrypted), &output_len) != 1) + onError("Failed to decrypt"); + decrypted += output_len; + } + + *decrypted = '\0'; + ++decrypted; + + decrypted_result_column_offsets.push_back(decrypted - decrypted_result_column_data.data()); + + } + + // in case we overestimate buffer required for decrypted data, fix it up. + if (!decrypted_result_column_offsets.empty() && decrypted_result_column_data.size() > decrypted_result_column_offsets.back()) + { + decrypted_result_column_data.resize(decrypted_result_column_offsets.back()); + } + + decrypted_result_column->validate(); + return decrypted_result_column; + } +}; + +} + + +#endif diff --git a/src/Functions/FunctionsCoding.h b/src/Functions/FunctionsCoding.h index 08ea1c8418a..67108a5b3d2 100644 --- a/src/Functions/FunctionsCoding.h +++ b/src/Functions/FunctionsCoding.h @@ -1659,7 +1659,7 @@ public: if (!isUInt8(second_argument)) throw Exception{"Illegal type " + second_argument->getName() + " of second argument of function " + getName() - + ", expected numeric type.", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT}; + + ", expected UInt8", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT}; DataTypePtr element = DataTypeFactory::instance().get("IPv6"); return std::make_shared(DataTypes{element, element}); @@ -1673,19 +1673,21 @@ public: const auto & col_type_name_ip = columns[arguments[0]]; const ColumnPtr & column_ip = col_type_name_ip.column; + const auto col_const_ip_in = checkAndGetColumnConst(column_ip.get()); const auto col_ip_in = checkAndGetColumn(column_ip.get()); - if (!col_ip_in) + if (!col_ip_in && !col_const_ip_in) throw Exception("Illegal column " + columns[arguments[0]].column->getName() + " of argument of function " + getName(), ErrorCodes::ILLEGAL_COLUMN); - if (col_ip_in->getN() != IPV6_BINARY_LENGTH) - throw Exception("Illegal type " + col_type_name_ip.type->getName() + - " of column " + col_ip_in->getName() + - " argument of function " + getName() + - ", expected FixedString(" + toString(IPV6_BINARY_LENGTH) + ")", - ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); + if ((col_const_ip_in && col_const_ip_in->getValue().size() != IPV6_BINARY_LENGTH) || + (col_ip_in && col_ip_in->getN() != IPV6_BINARY_LENGTH)) + throw Exception("Illegal type " + col_type_name_ip.type->getName() + + " of column " + column_ip->getName() + + " argument of function " + getName() + + ", expected FixedString(" + toString(IPV6_BINARY_LENGTH) + ")", + ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); const auto & col_type_name_cidr = columns[arguments[1]]; const ColumnPtr & column_cidr = col_type_name_cidr.column; @@ -1698,8 +1700,6 @@ public: + " of argument of function " + getName(), ErrorCodes::ILLEGAL_COLUMN); - const auto & vec_in = col_ip_in->getChars(); - auto col_res_lower_range = ColumnFixedString::create(IPV6_BINARY_LENGTH); auto col_res_upper_range = ColumnFixedString::create(IPV6_BINARY_LENGTH); @@ -1711,14 +1711,24 @@ public: static constexpr UInt8 max_cidr_mask = IPV6_BINARY_LENGTH * 8; + const String col_const_ip_str = col_const_ip_in ? col_const_ip_in->getValue() : ""; + const UInt8 * col_const_ip_value = col_const_ip_in ? reinterpret_cast(col_const_ip_str.c_str()) : nullptr; + for (size_t offset = 0; offset < input_rows_count; ++offset) { const size_t offset_ipv6 = offset * IPV6_BINARY_LENGTH; + + const UInt8 * ip = col_const_ip_in + ? col_const_ip_value + : &col_ip_in->getChars()[offset_ipv6]; + UInt8 cidr = col_const_cidr_in ? col_const_cidr_in->getValue() : col_cidr_in->getData()[offset]; + cidr = std::min(cidr, max_cidr_mask); - applyCIDRMask(&vec_in[offset_ipv6], &vec_res_lower_range[offset_ipv6], &vec_res_upper_range[offset_ipv6], cidr); + + applyCIDRMask(ip, &vec_res_lower_range[offset_ipv6], &vec_res_upper_range[offset_ipv6], cidr); } columns[result].column = ColumnTuple::create(Columns{std::move(col_res_lower_range), std::move(col_res_upper_range)}); @@ -1763,7 +1773,7 @@ public: if (!isUInt8(second_argument)) throw Exception{"Illegal type " + second_argument->getName() + " of second argument of function " + getName() - + ", expected numeric type.", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT}; + + ", expected UInt8", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT}; DataTypePtr element = DataTypeFactory::instance().get("IPv4"); return std::make_shared(DataTypes{element, element}); @@ -1777,8 +1787,9 @@ public: const auto & col_type_name_ip = columns[arguments[0]]; const ColumnPtr & column_ip = col_type_name_ip.column; + const auto col_const_ip_in = checkAndGetColumnConst(column_ip.get()); const auto col_ip_in = checkAndGetColumn(column_ip.get()); - if (!col_ip_in) + if (!col_const_ip_in && !col_ip_in) throw Exception("Illegal column " + columns[arguments[0]].column->getName() + " of argument of function " + getName(), ErrorCodes::ILLEGAL_COLUMN); @@ -1794,8 +1805,6 @@ public: + " of argument of function " + getName(), ErrorCodes::ILLEGAL_COLUMN); - const auto & vec_in = col_ip_in->getData(); - auto col_res_lower_range = ColumnUInt32::create(); auto col_res_upper_range = ColumnUInt32::create(); @@ -1807,11 +1816,15 @@ public: for (size_t i = 0; i < input_rows_count; ++i) { + UInt32 ip = col_const_ip_in + ? col_const_ip_in->getValue() + : col_ip_in->getData()[i]; + UInt8 cidr = col_const_cidr_in ? col_const_cidr_in->getValue() : col_cidr_in->getData()[i]; - std::tie(vec_res_lower_range[i], vec_res_upper_range[i]) = applyCIDRMask(vec_in[i], cidr); + std::tie(vec_res_lower_range[i], vec_res_upper_range[i]) = applyCIDRMask(ip, cidr); } columns[result].column = ColumnTuple::create(Columns{std::move(col_res_lower_range), std::move(col_res_upper_range)}); diff --git a/src/Functions/aes_decrypt_mysql.cpp b/src/Functions/aes_decrypt_mysql.cpp new file mode 100644 index 00000000000..d5d7a6660e4 --- /dev/null +++ b/src/Functions/aes_decrypt_mysql.cpp @@ -0,0 +1,31 @@ +#if !defined(ARCADIA_BUILD) +# include +#endif + +#if USE_SSL + +#include +#include + +namespace +{ + +struct DecryptMySQLModeImpl +{ + static constexpr auto name = "aes_decrypt_mysql"; + static constexpr auto compatibility_mode = OpenSSLDetails::CompatibilityMode::MySQL; +}; + +} + +namespace DB +{ + +void registerFunctionAESDecryptMysql(FunctionFactory & factory) +{ + factory.registerFunction>(); +} + +} + +#endif diff --git a/src/Functions/aes_encrypt_mysql.cpp b/src/Functions/aes_encrypt_mysql.cpp new file mode 100644 index 00000000000..bdf7d8d2cce --- /dev/null +++ b/src/Functions/aes_encrypt_mysql.cpp @@ -0,0 +1,31 @@ +#if !defined(ARCADIA_BUILD) +# include +#endif + +#if USE_SSL + +#include +#include + +namespace +{ + +struct EncryptMySQLModeImpl +{ + static constexpr auto name = "aes_encrypt_mysql"; + static constexpr auto compatibility_mode = OpenSSLDetails::CompatibilityMode::MySQL; +}; + +} + +namespace DB +{ + +void registerFunctionAESEncryptMysql(FunctionFactory & factory) +{ + factory.registerFunction>(); +} + +} + +#endif diff --git a/src/Functions/decrypt.cpp b/src/Functions/decrypt.cpp new file mode 100644 index 00000000000..a9090a31f0e --- /dev/null +++ b/src/Functions/decrypt.cpp @@ -0,0 +1,31 @@ +#if !defined(ARCADIA_BUILD) +# include +#endif + +#if USE_SSL + +#include +#include + +namespace +{ + +struct DecryptImpl +{ + static constexpr auto name = "decrypt"; + static constexpr auto compatibility_mode = OpenSSLDetails::CompatibilityMode::OpenSSL; +}; + +} + +namespace DB +{ + +void registerFunctionDecrypt(FunctionFactory & factory) +{ + factory.registerFunction>(); +} + +} + +#endif diff --git a/src/Functions/encrypt.cpp b/src/Functions/encrypt.cpp new file mode 100644 index 00000000000..ba8ffa1bc59 --- /dev/null +++ b/src/Functions/encrypt.cpp @@ -0,0 +1,31 @@ +#if !defined(ARCADIA_BUILD) +# include +#endif + +#if USE_SSL + +#include +#include + +namespace +{ + +struct EncryptImpl +{ + static constexpr auto name = "encrypt"; + static constexpr auto compatibility_mode = OpenSSLDetails::CompatibilityMode::OpenSSL; +}; + +} + +namespace DB +{ + +void registerFunctionEncrypt(FunctionFactory & factory) +{ + factory.registerFunction>(); +} + +} + +#endif diff --git a/src/Functions/registerFunctions.cpp b/src/Functions/registerFunctions.cpp index f70b712564f..6dfebc13665 100644 --- a/src/Functions/registerFunctions.cpp +++ b/src/Functions/registerFunctions.cpp @@ -1,3 +1,7 @@ +#if !defined(ARCADIA_BUILD) +# include +#endif + #include @@ -37,12 +41,21 @@ void registerFunctionsNull(FunctionFactory &); void registerFunctionsJSON(FunctionFactory &); void registerFunctionsConsistentHashing(FunctionFactory & factory); void registerFunctionsUnixTimestamp64(FunctionFactory & factory); + #if !defined(ARCADIA_BUILD) void registerFunctionBayesAB(FunctionFactory &); #endif void registerFunctionTid(FunctionFactory & factory); void registerFunctionLogTrace(FunctionFactory & factory); +#if USE_SSL +void registerFunctionEncrypt(FunctionFactory & factory); +void registerFunctionDecrypt(FunctionFactory & factory); +void registerFunctionAESEncryptMysql(FunctionFactory & factory); +void registerFunctionAESDecryptMysql(FunctionFactory & factory); + +#endif + void registerFunctions() { @@ -84,9 +97,17 @@ void registerFunctions() registerFunctionsIntrospection(factory); registerFunctionsConsistentHashing(factory); registerFunctionsUnixTimestamp64(factory); + #if !defined(ARCADIA_BUILD) registerFunctionBayesAB(factory); #endif + +#if USE_SSL + registerFunctionEncrypt(factory); + registerFunctionDecrypt(factory); + registerFunctionAESEncryptMysql(factory); + registerFunctionAESDecryptMysql(factory); +#endif registerFunctionTid(factory); registerFunctionLogTrace(factory); } diff --git a/src/Functions/ya.make b/src/Functions/ya.make index a934e128a36..ed03f5175ab 100644 --- a/src/Functions/ya.make +++ b/src/Functions/ya.make @@ -47,6 +47,8 @@ SRCS( addSeconds.cpp addWeeks.cpp addYears.cpp + aes_decrypt_mysql.cpp + aes_encrypt_mysql.cpp appendTrailingCharIfAbsent.cpp array/arrayAll.cpp array/arrayAUC.cpp @@ -141,6 +143,7 @@ SRCS( currentUser.cpp dateDiff.cpp date_trunc.cpp + decrypt.cpp defaultValueOfArgumentType.cpp defaultValueOfTypeName.cpp demange.cpp @@ -148,6 +151,7 @@ SRCS( dumpColumnStructure.cpp e.cpp empty.cpp + encrypt.cpp endsWith.cpp equals.cpp erfc.cpp @@ -176,6 +180,7 @@ SRCS( FunctionFQDN.cpp FunctionHelpers.cpp FunctionJoinGet.cpp + FunctionsAES.cpp FunctionsCoding.cpp FunctionsConversion.cpp FunctionsEmbeddedDictionaries.cpp diff --git a/src/Interpreters/Context.cpp b/src/Interpreters/Context.cpp index 4295972ef80..9c1f253f820 100644 --- a/src/Interpreters/Context.cpp +++ b/src/Interpreters/Context.cpp @@ -590,7 +590,7 @@ VolumePtr Context::setTemporaryStorage(const String & path, const String & polic shared->tmp_path += '/'; auto disk = std::make_shared("_tmp_default", shared->tmp_path, 0); - shared->tmp_volume = std::make_shared("_tmp_default", disk); + shared->tmp_volume = std::make_shared("_tmp_default", disk, 0); } else { diff --git a/src/Interpreters/ExpressionAnalyzer.cpp b/src/Interpreters/ExpressionAnalyzer.cpp index aab980bddc7..f79bb36ec46 100644 --- a/src/Interpreters/ExpressionAnalyzer.cpp +++ b/src/Interpreters/ExpressionAnalyzer.cpp @@ -117,11 +117,14 @@ ExpressionAnalyzer::ExpressionAnalyzer( const TreeRewriterResultPtr & syntax_analyzer_result_, const Context & context_, size_t subquery_depth_, - bool do_global) + bool do_global, + SubqueriesForSets subqueries_for_sets_) : query(query_), context(context_), settings(context.getSettings()) , subquery_depth(subquery_depth_) , syntax(syntax_analyzer_result_) { + subqueries_for_sets = std::move(subqueries_for_sets_); + /// external_tables, subqueries_for_sets for global subqueries. /// Replaces global subqueries with the generated names of temporary tables that will be sent to remote servers. initGlobalSubqueriesAndExternalTables(do_global); diff --git a/src/Interpreters/ExpressionAnalyzer.h b/src/Interpreters/ExpressionAnalyzer.h index 0790c9f9bfb..6389d8a142c 100644 --- a/src/Interpreters/ExpressionAnalyzer.h +++ b/src/Interpreters/ExpressionAnalyzer.h @@ -93,7 +93,7 @@ public: const ASTPtr & query_, const TreeRewriterResultPtr & syntax_analyzer_result_, const Context & context_) - : ExpressionAnalyzer(query_, syntax_analyzer_result_, context_, 0, false) + : ExpressionAnalyzer(query_, syntax_analyzer_result_, context_, 0, false, {}) {} void appendExpression(ExpressionActionsChain & chain, const ASTPtr & expr, bool only_types); @@ -124,7 +124,8 @@ protected: const TreeRewriterResultPtr & syntax_analyzer_result_, const Context & context_, size_t subquery_depth_, - bool do_global_); + bool do_global_, + SubqueriesForSets subqueries_for_sets_); ASTPtr query; const Context & context; @@ -244,8 +245,9 @@ public: const StorageMetadataPtr & metadata_snapshot_, const NameSet & required_result_columns_ = {}, bool do_global_ = false, - const SelectQueryOptions & options_ = {}) - : ExpressionAnalyzer(query_, syntax_analyzer_result_, context_, options_.subquery_depth, do_global_) + const SelectQueryOptions & options_ = {}, + SubqueriesForSets subqueries_for_sets_ = {}) + : ExpressionAnalyzer(query_, syntax_analyzer_result_, context_, options_.subquery_depth, do_global_, std::move(subqueries_for_sets_)) , metadata_snapshot(metadata_snapshot_) , required_result_columns(required_result_columns_) , query_options(options_) diff --git a/src/Interpreters/InterpreterInsertQuery.cpp b/src/Interpreters/InterpreterInsertQuery.cpp index 1a0ee21b99b..aa8bcd74ea6 100644 --- a/src/Interpreters/InterpreterInsertQuery.cpp +++ b/src/Interpreters/InterpreterInsertQuery.cpp @@ -413,6 +413,11 @@ BlockIO InterpreterInsertQuery::execute() res.out = std::move(out_streams.at(0)); res.pipeline.addStorageHolder(table); + if (const auto * mv = dynamic_cast(table.get())) + { + if (auto inner_table = mv->tryGetTargetTable()) + res.pipeline.addStorageHolder(inner_table); + } return res; } diff --git a/src/Interpreters/InterpreterSelectQuery.cpp b/src/Interpreters/InterpreterSelectQuery.cpp index a43c0eaf8c1..96a393f1448 100644 --- a/src/Interpreters/InterpreterSelectQuery.cpp +++ b/src/Interpreters/InterpreterSelectQuery.cpp @@ -304,6 +304,8 @@ InterpreterSelectQuery::InterpreterSelectQuery( if (storage) view = dynamic_cast(storage.get()); + SubqueriesForSets subquery_for_sets; + auto analyze = [&] (bool try_move_to_prewhere) { /// Allow push down and other optimizations for VIEW: replace with subquery and rewrite it. @@ -344,7 +346,7 @@ InterpreterSelectQuery::InterpreterSelectQuery( query_analyzer = std::make_unique( query_ptr, syntax_analyzer_result, *context, metadata_snapshot, NameSet(required_result_column_names.begin(), required_result_column_names.end()), - !options.only_analyze, options); + !options.only_analyze, options, std::move(subquery_for_sets)); if (!options.only_analyze) { @@ -430,6 +432,7 @@ InterpreterSelectQuery::InterpreterSelectQuery( if (need_analyze_again) { + subquery_for_sets = std::move(query_analyzer->getSubqueriesForSets()); /// Do not try move conditions to PREWHERE for the second time. /// Otherwise, we won't be able to fallback from inefficient PREWHERE to WHERE later. analyze(/* try_move_to_prewhere = */ false); diff --git a/src/Interpreters/InterpreterSystemQuery.cpp b/src/Interpreters/InterpreterSystemQuery.cpp index 4bfa84090c2..f0a8ce9064d 100644 --- a/src/Interpreters/InterpreterSystemQuery.cpp +++ b/src/Interpreters/InterpreterSystemQuery.cpp @@ -133,7 +133,11 @@ void InterpreterSystemQuery::startStopAction(StorageActionBlockType action_type, auto manager = context.getActionLocksManager(); manager->cleanExpired(); - if (table_id) + if (volume_ptr && action_type == ActionLocks::PartsMerge) + { + volume_ptr->setAvoidMergesUserOverride(!start); + } + else if (table_id) { context.checkAccess(getRequiredAccessType(action_type), table_id); if (start) @@ -199,6 +203,10 @@ BlockIO InterpreterSystemQuery::execute() if (!query.target_dictionary.empty() && !query.database.empty()) query.target_dictionary = query.database + "." + query.target_dictionary; + volume_ptr = {}; + if (!query.storage_policy.empty() && !query.volume.empty()) + volume_ptr = context.getStoragePolicy(query.storage_policy)->getVolumeByName(query.volume); + switch (query.type) { case Type::SHUTDOWN: diff --git a/src/Interpreters/InterpreterSystemQuery.h b/src/Interpreters/InterpreterSystemQuery.h index 8e3578dfb2f..6fd96c15a2e 100644 --- a/src/Interpreters/InterpreterSystemQuery.h +++ b/src/Interpreters/InterpreterSystemQuery.h @@ -5,6 +5,7 @@ #include #include #include +#include namespace Poco { class Logger; } @@ -44,6 +45,7 @@ private: Context & context; Poco::Logger * log = nullptr; StorageID table_id = StorageID::createEmpty(); /// Will be set up if query contains table name + VolumePtr volume_ptr; /// Tries to get a replicated table and restart it /// Returns pointer to a newly created table if the restart was successful diff --git a/src/Interpreters/ProcessList.cpp b/src/Interpreters/ProcessList.cpp index 2203e91e913..dc021210d9d 100644 --- a/src/Interpreters/ProcessList.cpp +++ b/src/Interpreters/ProcessList.cpp @@ -89,6 +89,34 @@ ProcessList::EntryPtr ProcessList::insert(const String & query_, const IAST * as throw Exception("Too many simultaneous queries. Maximum: " + toString(max_size), ErrorCodes::TOO_MANY_SIMULTANEOUS_QUERIES); } + { + /** + * `max_size` check above is controlled by `max_concurrent_queries` server setting and is a "hard" limit for how many + * queries the server can process concurrently. It is configured at startup. When the server is overloaded with queries and the + * hard limit is reached it is impossible to connect to the server to run queries for investigation. + * + * With `max_concurrent_queries_for_all_users` it is possible to configure an additional, runtime configurable, limit for query concurrency. + * Usually it should be configured just once for `default_profile` which is inherited by all users. DBAs can override + * this setting when connecting to ClickHouse, or it can be configured for a DBA profile to have a value greater than that of + * the default profile (or 0 for unlimited). + * + * One example is to set `max_size=X`, `max_concurrent_queries_for_all_users=X-10` for default profile, + * and `max_concurrent_queries_for_all_users=0` for DBAs or accounts that are vital for ClickHouse operations (like metrics + * exporters). + * + * Another creative example is to configure `max_concurrent_queries_for_all_users=50` for "analyst" profiles running adhoc queries + * and `max_concurrent_queries_for_all_users=100` for "customer facing" services. This way "analyst" queries will be rejected + * once is already processing 50+ concurrent queries (including analysts or any other users). + */ + + if (!is_unlimited_query && settings.max_concurrent_queries_for_all_users + && processes.size() >= settings.max_concurrent_queries_for_all_users) + throw Exception( + "Too many simultaneous queries for all users. Current: " + toString(processes.size()) + + ", maximum: " + settings.max_concurrent_queries_for_all_users.toString(), + ErrorCodes::TOO_MANY_SIMULTANEOUS_QUERIES); + } + /** Why we use current user? * Because initial one is passed by client and credentials for it is not verified, * and using initial_user for limits will be insecure. diff --git a/src/Interpreters/SystemLog.h b/src/Interpreters/SystemLog.h index 2a0ce9cef53..99a85405348 100644 --- a/src/Interpreters/SystemLog.h +++ b/src/Interpreters/SystemLog.h @@ -233,7 +233,7 @@ void SystemLog::add(const LogElement & element) /// The size of allocation can be in order of a few megabytes. /// But this should not be accounted for query memory usage. /// Otherwise the tests like 01017_uniqCombined_memory_usage.sql will be flacky. - auto temporarily_disable_memory_tracker = getCurrentMemoryTrackerActionLock(); + MemoryTracker::BlockerInThread temporarily_disable_memory_tracker; /// Should not log messages under mutex. bool queue_is_half_full = false; diff --git a/src/Interpreters/executeQuery.cpp b/src/Interpreters/executeQuery.cpp index d66fdeea46f..57c557c5658 100644 --- a/src/Interpreters/executeQuery.cpp +++ b/src/Interpreters/executeQuery.cpp @@ -157,7 +157,7 @@ static void setExceptionStackTrace(QueryLogElement & elem) { /// Disable memory tracker for stack trace. /// Because if exception is "Memory limit (for query) exceed", then we probably can't allocate another one string. - auto temporarily_disable_memory_tracker = getCurrentMemoryTrackerActionLock(); + MemoryTracker::BlockerInThread temporarily_disable_memory_tracker; try { @@ -338,28 +338,26 @@ static std::tuple executeQueryImpl( try { - bool ast_modified = false; /// Replace ASTQueryParameter with ASTLiteral for prepared statements. if (context.hasQueryParameters()) { ReplaceQueryParameterVisitor visitor(context.getQueryParameters()); visitor.visit(ast); - ast_modified = true; + query = serializeAST(*ast); } + /// MUST goes before any modification (except for prepared statements, + /// since it substitute parameters and w/o them query does not contains + /// parameters), to keep query as-is in query_log and server log. + query_for_logging = prepareQueryForLogging(query, context); + logQuery(query_for_logging, context, internal); + /// Propagate WITH statement to children ASTSelect. if (settings.enable_global_with_statement) { ApplyWithGlobalVisitor().visit(ast); - ast_modified = true; - } - - if (ast_modified) query = serializeAST(*ast); - - query_for_logging = prepareQueryForLogging(query, context); - - logQuery(query_for_logging, context, internal); + } /// Check the limits. checkASTSizeLimits(*ast, settings); diff --git a/src/Parsers/ASTSystemQuery.cpp b/src/Parsers/ASTSystemQuery.cpp index 5ed1757e1ce..9cbb6ae94f6 100644 --- a/src/Parsers/ASTSystemQuery.cpp +++ b/src/Parsers/ASTSystemQuery.cpp @@ -118,7 +118,8 @@ void ASTSystemQuery::formatImpl(const FormatSettings & settings, FormatState &, << (settings.hilite ? hilite_none : ""); }; - auto print_drop_replica = [&] { + auto print_drop_replica = [&] + { settings.ostr << " " << quoteString(replica); if (!table.empty()) { @@ -140,6 +141,16 @@ void ASTSystemQuery::formatImpl(const FormatSettings & settings, FormatState &, } }; + auto print_on_volume = [&] + { + settings.ostr << " ON VOLUME " + << (settings.hilite ? hilite_identifier : "") << backQuoteIfNeed(storage_policy) + << (settings.hilite ? hilite_none : "") + << "." + << (settings.hilite ? hilite_identifier : "") << backQuoteIfNeed(volume) + << (settings.hilite ? hilite_none : ""); + }; + if (!cluster.empty()) formatOnCluster(settings); @@ -160,6 +171,8 @@ void ASTSystemQuery::formatImpl(const FormatSettings & settings, FormatState &, { if (!table.empty()) print_database_table(); + else if (!volume.empty()) + print_on_volume(); } else if (type == Type::RESTART_REPLICA || type == Type::SYNC_REPLICA || type == Type::FLUSH_DISTRIBUTED) { diff --git a/src/Parsers/ASTSystemQuery.h b/src/Parsers/ASTSystemQuery.h index b2ffa706e19..f8f803e1c0c 100644 --- a/src/Parsers/ASTSystemQuery.h +++ b/src/Parsers/ASTSystemQuery.h @@ -65,6 +65,8 @@ public: String replica; String replica_zk_path; bool is_drop_whole_replica; + String storage_policy; + String volume; String getID(char) const override { return "SYSTEM query"; } diff --git a/src/Parsers/ParserSystemQuery.cpp b/src/Parsers/ParserSystemQuery.cpp index a98ca2d4922..296f4187e3a 100644 --- a/src/Parsers/ParserSystemQuery.cpp +++ b/src/Parsers/ParserSystemQuery.cpp @@ -129,6 +129,33 @@ bool ParserSystemQuery::parseImpl(IParser::Pos & pos, ASTPtr & node, Expected & case Type::STOP_MERGES: case Type::START_MERGES: + { + String storage_policy_str; + String volume_str; + + if (ParserKeyword{"ON VOLUME"}.ignore(pos, expected)) + { + ASTPtr ast; + if (ParserIdentifier{}.parse(pos, ast, expected)) + storage_policy_str = ast->as().name; + else + return false; + + if (!ParserToken{TokenType::Dot}.ignore(pos, expected)) + return false; + + if (ParserIdentifier{}.parse(pos, ast, expected)) + volume_str = ast->as().name; + else + return false; + } + res->storage_policy = storage_policy_str; + res->volume = volume_str; + if (res->volume.empty() && res->storage_policy.empty()) + parseDatabaseAndTableName(pos, expected, res->database, res->table); + break; + } + case Type::STOP_TTL_MERGES: case Type::START_TTL_MERGES: case Type::STOP_MOVES: diff --git a/src/Server/HTTPHandlerFactory.cpp b/src/Server/HTTPHandlerFactory.cpp index f34852054d1..8915ea747ca 100644 --- a/src/Server/HTTPHandlerFactory.cpp +++ b/src/Server/HTTPHandlerFactory.cpp @@ -8,6 +8,7 @@ #include "ReplicasStatusHandler.h" #include "InterserverIOHTTPHandler.h" #include "PrometheusRequestHandler.h" +#include "WebUIRequestHandler.h" namespace DB @@ -78,7 +79,9 @@ static inline auto createHandlersFactoryFromConfig( for (const auto & key : keys) { if (key == "defaults") + { addDefaultHandlersFactory(*main_handler_factory, server, async_metrics); + } else if (startsWith(key, "rule")) { const auto & handler_type = server.config().getString(prefix + "." + key + ".handler.type", ""); @@ -112,7 +115,9 @@ static inline auto createHandlersFactoryFromConfig( static inline Poco::Net::HTTPRequestHandlerFactory * createHTTPHandlerFactory(IServer & server, const std::string & name, AsynchronousMetrics & async_metrics) { if (server.config().has("http_handlers")) + { return createHandlersFactoryFromConfig(server, name, "http_handlers", async_metrics); + } else { auto factory = std::make_unique(name); @@ -168,6 +173,10 @@ void addCommonDefaultHandlersFactory(HTTPRequestHandlerFactoryMain & factory, IS auto replicas_status_handler = std::make_unique>(server); replicas_status_handler->attachNonStrictPath("/replicas_status")->allowGetAndHeadRequest(); factory.addHandler(replicas_status_handler.release()); + + auto web_ui_handler = std::make_unique>(server, "play.html"); + web_ui_handler->attachNonStrictPath("/play")->allowGetAndHeadRequest(); + factory.addHandler(web_ui_handler.release()); } void addDefaultHandlersFactory(HTTPRequestHandlerFactoryMain & factory, IServer & server, AsynchronousMetrics & async_metrics) diff --git a/src/Server/StaticRequestHandler.cpp b/src/Server/StaticRequestHandler.cpp index 22f32e6a0e7..7f63099c972 100644 --- a/src/Server/StaticRequestHandler.cpp +++ b/src/Server/StaticRequestHandler.cpp @@ -1,4 +1,5 @@ #include "StaticRequestHandler.h" +#include "IServer.h" #include "HTTPHandlerFactory.h" #include "HTTPHandlerRequestFilter.h" @@ -17,6 +18,8 @@ #include #include #include +#include + namespace DB { diff --git a/src/Server/StaticRequestHandler.h b/src/Server/StaticRequestHandler.h index a5ac44683a1..0a29384ad0e 100644 --- a/src/Server/StaticRequestHandler.h +++ b/src/Server/StaticRequestHandler.h @@ -1,16 +1,15 @@ #pragma once -#include "IServer.h" - #include -#include #include -#include namespace DB { +class IServer; +class WriteBuffer; + /// Response with custom string. Can be used for browser. class StaticRequestHandler : public Poco::Net::HTTPRequestHandler { @@ -22,7 +21,11 @@ private: String response_expression; public: - StaticRequestHandler(IServer & server, const String & expression, int status_ = 200, const String & content_type_ = "text/html; charset=UTF-8"); + StaticRequestHandler( + IServer & server, + const String & expression, + int status_ = 200, + const String & content_type_ = "text/html; charset=UTF-8"); void writeResponse(WriteBuffer & out); diff --git a/src/Server/WebUIRequestHandler.cpp b/src/Server/WebUIRequestHandler.cpp new file mode 100644 index 00000000000..6159a27971f --- /dev/null +++ b/src/Server/WebUIRequestHandler.cpp @@ -0,0 +1,35 @@ +#include "WebUIRequestHandler.h" +#include "IServer.h" + +#include +#include +#include + +#include +#include + + +namespace DB +{ + +WebUIRequestHandler::WebUIRequestHandler(IServer & server_, std::string resource_name_) + : server(server_), resource_name(std::move(resource_name_)) +{ +} + + +void WebUIRequestHandler::handleRequest(Poco::Net::HTTPServerRequest & request, Poco::Net::HTTPServerResponse & response) +{ + auto keep_alive_timeout = server.config().getUInt("keep_alive_timeout", 10); + + response.setContentType("text/html; charset=UTF-8"); + + if (request.getVersion() == Poco::Net::HTTPServerRequest::HTTP_1_1) + response.setChunkedTransferEncoding(true); + + setResponseDefaultHeaders(response, keep_alive_timeout); + response.setStatusAndReason(Poco::Net::HTTPResponse::HTTP_OK); + response.send() << getResource(resource_name); +} + +} diff --git a/src/Server/WebUIRequestHandler.h b/src/Server/WebUIRequestHandler.h new file mode 100644 index 00000000000..3066b86b36a --- /dev/null +++ b/src/Server/WebUIRequestHandler.h @@ -0,0 +1,23 @@ +#pragma once + +#include + + +namespace DB +{ + +class IServer; + +/// Response with HTML page that allows to send queries and show results in browser. +class WebUIRequestHandler : public Poco::Net::HTTPRequestHandler +{ +private: + IServer & server; + std::string resource_name; +public: + WebUIRequestHandler(IServer & server_, std::string resource_name_); + void handleRequest(Poco::Net::HTTPServerRequest & request, Poco::Net::HTTPServerResponse & response) override; +}; + +} + diff --git a/src/Server/ya.make b/src/Server/ya.make index 011aec19a15..cab114871c5 100644 --- a/src/Server/ya.make +++ b/src/Server/ya.make @@ -22,6 +22,7 @@ SRCS( ReplicasStatusHandler.cpp StaticRequestHandler.cpp TCPHandler.cpp + WebUIRequestHandler.cpp ) diff --git a/src/Storages/MergeTree/DataPartsExchange.cpp b/src/Storages/MergeTree/DataPartsExchange.cpp index 3da0e203f14..0e79404e59d 100644 --- a/src/Storages/MergeTree/DataPartsExchange.cpp +++ b/src/Storages/MergeTree/DataPartsExchange.cpp @@ -311,7 +311,7 @@ MergeTreeData::MutableDataPartPtr Fetcher::downloadPartToMemory( NativeBlockInputStream block_in(in, 0); auto block = block_in.read(); - auto volume = std::make_shared("volume_" + part_name, reservation->getDisk()); + auto volume = std::make_shared("volume_" + part_name, reservation->getDisk(), 0); MergeTreeData::MutableDataPartPtr new_data_part = std::make_shared(data, part_name, volume); @@ -408,7 +408,7 @@ MergeTreeData::MutableDataPartPtr Fetcher::downloadPartToDisk( assertEOF(in); - auto volume = std::make_shared("volume_" + part_name, disk); + auto volume = std::make_shared("volume_" + part_name, disk, 0); MergeTreeData::MutableDataPartPtr new_data_part = data.createPart(part_name, volume, part_relative_path); new_data_part->is_temp = true; new_data_part->modification_time = time(nullptr); diff --git a/src/Storages/MergeTree/IMergeTreeDataPart.cpp b/src/Storages/MergeTree/IMergeTreeDataPart.cpp index 40f12428561..319b486c2c6 100644 --- a/src/Storages/MergeTree/IMergeTreeDataPart.cpp +++ b/src/Storages/MergeTree/IMergeTreeDataPart.cpp @@ -408,7 +408,7 @@ void IMergeTreeDataPart::loadColumnsChecksumsIndexes(bool require_columns_checks /// Memory should not be limited during ATTACH TABLE query. /// This is already true at the server startup but must be also ensured for manual table ATTACH. /// Motivation: memory for index is shared between queries - not belong to the query itself. - auto temporarily_disable_memory_tracker = getCurrentMemoryTrackerActionLock(); + MemoryTracker::BlockerInThread temporarily_disable_memory_tracker; loadColumns(require_columns_checksums); loadChecksums(require_columns_checksums); @@ -760,6 +760,16 @@ void IMergeTreeDataPart::loadColumns(bool require) column_name_to_position.emplace(column.name, pos++); } +bool IMergeTreeDataPart::shallParticipateInMerges(const StoragePolicyPtr & storage_policy) const +{ + /// `IMergeTreeDataPart::volume` describes space where current part belongs, and holds + /// `SingleDiskVolume` object which does not contain up-to-date settings of corresponding volume. + /// Therefore we shall obtain volume from storage policy. + auto volume_ptr = storage_policy->getVolume(storage_policy->getVolumeIndexByDisk(volume->getDisk())); + + return !volume_ptr->areMergesAvoided(); +} + UInt64 IMergeTreeDataPart::calculateTotalSizeOnDisk(const DiskPtr & disk_, const String & from) { if (disk_->isFile(from)) @@ -943,21 +953,26 @@ void IMergeTreeDataPart::makeCloneInDetached(const String & prefix, const Storag volume->getDisk()->removeIfExists(destination_path + "/" + DELETE_ON_DESTROY_MARKER_FILE_NAME); } -void IMergeTreeDataPart::makeCloneOnDiskDetached(const ReservationPtr & reservation) const +void IMergeTreeDataPart::makeCloneOnDisk(const DiskPtr & disk, const String & directory_name) const { assertOnDisk(); - auto reserved_disk = reservation->getDisk(); - if (reserved_disk->getName() == volume->getDisk()->getName()) + + if (disk->getName() == volume->getDisk()->getName()) throw Exception("Can not clone data part " + name + " to same disk " + volume->getDisk()->getName(), ErrorCodes::LOGICAL_ERROR); + if (directory_name.empty()) + throw Exception("Can not clone data part " + name + " to empty directory.", ErrorCodes::LOGICAL_ERROR); - String path_to_clone = storage.relative_data_path + "detached/"; + String path_to_clone = storage.relative_data_path + directory_name + '/'; - if (reserved_disk->exists(path_to_clone + relative_path)) - throw Exception("Path " + fullPath(reserved_disk, path_to_clone + relative_path) + " already exists. Can not clone ", ErrorCodes::DIRECTORY_ALREADY_EXISTS); - reserved_disk->createDirectory(path_to_clone); + if (disk->exists(path_to_clone + relative_path)) + { + LOG_WARNING(storage.log, "Path " + fullPath(disk, path_to_clone + relative_path) + " already exists. Will remove it and clone again."); + disk->removeRecursive(path_to_clone + relative_path + '/'); + } + disk->createDirectories(path_to_clone); - volume->getDisk()->copy(getFullRelativePath(), reserved_disk, path_to_clone); - volume->getDisk()->removeIfExists(path_to_clone + "/" + DELETE_ON_DESTROY_MARKER_FILE_NAME); + volume->getDisk()->copy(getFullRelativePath(), disk, path_to_clone); + volume->getDisk()->removeIfExists(path_to_clone + '/' + DELETE_ON_DESTROY_MARKER_FILE_NAME); } void IMergeTreeDataPart::checkConsistencyBase() const diff --git a/src/Storages/MergeTree/IMergeTreeDataPart.h b/src/Storages/MergeTree/IMergeTreeDataPart.h index 78daf6c9017..202d9494247 100644 --- a/src/Storages/MergeTree/IMergeTreeDataPart.h +++ b/src/Storages/MergeTree/IMergeTreeDataPart.h @@ -316,15 +316,19 @@ public: /// Makes clone of a part in detached/ directory via hard links virtual void makeCloneInDetached(const String & prefix, const StorageMetadataPtr & metadata_snapshot) const; - /// Makes full clone of part in detached/ on another disk - void makeCloneOnDiskDetached(const ReservationPtr & reservation) const; + /// Makes full clone of part in specified subdirectory (relative to storage data directory, e.g. "detached") on another disk + void makeCloneOnDisk(const DiskPtr & disk, const String & directory_name) const; /// Checks that .bin and .mrk files exist. /// /// NOTE: Doesn't take column renames into account, if some column renames /// take place, you must take original name of column for this part from /// storage and pass it to this method. - virtual bool hasColumnFiles(const String & /* column */, const IDataType & /* type */) const{ return false; } + virtual bool hasColumnFiles(const String & /* column */, const IDataType & /* type */) const { return false; } + + /// Returns true if this part shall participate in merges according to + /// settings of given storage policy. + bool shallParticipateInMerges(const StoragePolicyPtr & storage_policy) const; /// Calculate the total size of the entire directory with all the files static UInt64 calculateTotalSizeOnDisk(const DiskPtr & disk_, const String & from); diff --git a/src/Storages/MergeTree/MergeSelector.h b/src/Storages/MergeTree/MergeSelector.h index fcdfcf5b890..5a92b4c5dd6 100644 --- a/src/Storages/MergeTree/MergeSelector.h +++ b/src/Storages/MergeTree/MergeSelector.h @@ -48,6 +48,8 @@ public: /// Part compression codec definition. ASTPtr compression_codec_desc; + + bool shall_participate_in_merges = true; }; /// Parts are belong to partitions. Only parts within same partition could be merged. diff --git a/src/Storages/MergeTree/MergeTreeData.cpp b/src/Storages/MergeTree/MergeTreeData.cpp index a0c1de756be..cd776a661ed 100644 --- a/src/Storages/MergeTree/MergeTreeData.cpp +++ b/src/Storages/MergeTree/MergeTreeData.cpp @@ -776,7 +776,7 @@ void MergeTreeData::loadDataParts(bool skip_sanity_checks) if (!MergeTreePartInfo::tryParsePartName(part_name, &part_info, format_version)) return; - auto single_disk_volume = std::make_shared("volume_" + part_name, part_disk_ptr); + auto single_disk_volume = std::make_shared("volume_" + part_name, part_disk_ptr, 0); auto part = createPart(part_name, part_info, single_disk_volume, part_name); bool broken = false; @@ -2996,7 +2996,7 @@ MergeTreeData::MutableDataPartsVector MergeTreeData::tryLoadPartsToAttach(const for (const auto & part_names : renamed_parts.old_and_new_names) { LOG_DEBUG(log, "Checking part {}", part_names.second); - auto single_disk_volume = std::make_shared("volume_" + part_names.first, name_to_disk[part_names.first]); + auto single_disk_volume = std::make_shared("volume_" + part_names.first, name_to_disk[part_names.first], 0); MutableDataPartPtr part = createPart(part_names.first, single_disk_volume, source_dir + part_names.second); loadPartAndFixMetadataImpl(part); loaded_parts.push_back(part); @@ -3409,7 +3409,7 @@ MergeTreeData::MutableDataPartPtr MergeTreeData::cloneAndLoadDataPartOnSameDisk( localBackup(disk, src_part_path, dst_part_path); disk->removeIfExists(dst_part_path + "/" + IMergeTreeDataPart::DELETE_ON_DESTROY_MARKER_FILE_NAME); - auto single_disk_volume = std::make_shared(disk->getName(), disk); + auto single_disk_volume = std::make_shared(disk->getName(), disk, 0); auto dst_data_part = createPart(dst_part_name, dst_part_info, single_disk_volume, tmp_dst_part_name); dst_data_part->is_temp = true; diff --git a/src/Storages/MergeTree/MergeTreeDataMergerMutator.cpp b/src/Storages/MergeTree/MergeTreeDataMergerMutator.cpp index fb0a488700c..df42f164e34 100644 --- a/src/Storages/MergeTree/MergeTreeDataMergerMutator.cpp +++ b/src/Storages/MergeTree/MergeTreeDataMergerMutator.cpp @@ -226,6 +226,8 @@ bool MergeTreeDataMergerMutator::selectPartsToMerge( IMergeSelector::PartsRanges parts_ranges; + StoragePolicyPtr storage_policy = data.getStoragePolicy(); + const String * prev_partition_id = nullptr; /// Previous part only in boundaries of partition frame const MergeTreeData::DataPartPtr * prev_part = nullptr; @@ -275,6 +277,7 @@ bool MergeTreeDataMergerMutator::selectPartsToMerge( part_info.data = ∂ part_info.ttl_infos = &part->ttl_infos; part_info.compression_codec_desc = part->default_codec->getFullCodecDesc(); + part_info.shall_participate_in_merges = part->shallParticipateInMerges(storage_policy); parts_ranges.back().emplace_back(part_info); @@ -667,7 +670,7 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataMergerMutator::mergePartsToTempor merging_columns, merging_column_names); - auto single_disk_volume = std::make_shared("volume_" + future_part.name, disk); + auto single_disk_volume = std::make_shared("volume_" + future_part.name, disk, 0); MergeTreeData::MutableDataPartPtr new_data_part = data.createPart( future_part.name, future_part.type, @@ -1127,7 +1130,7 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataMergerMutator::mutatePartToTempor in->setProgressCallback(MergeProgressCallback(merge_entry, watch_prev_elapsed, stage_progress)); } - auto single_disk_volume = std::make_shared("volume_" + future_part.name, space_reservation->getDisk()); + auto single_disk_volume = std::make_shared("volume_" + future_part.name, space_reservation->getDisk(), 0); auto new_data_part = data.createPart( future_part.name, future_part.type, future_part.part_info, single_disk_volume, "tmp_mut_" + future_part.name); diff --git a/src/Storages/MergeTree/MergeTreeDataPartWriterOnDisk.cpp b/src/Storages/MergeTree/MergeTreeDataPartWriterOnDisk.cpp index c6b689da33a..21db4827f42 100644 --- a/src/Storages/MergeTree/MergeTreeDataPartWriterOnDisk.cpp +++ b/src/Storages/MergeTree/MergeTreeDataPartWriterOnDisk.cpp @@ -212,7 +212,7 @@ void MergeTreeDataPartWriterOnDisk::calculateAndSerializePrimaryIndex(const Bloc * And otherwise it will look like excessively growing memory consumption in context of query. * (observed in long INSERT SELECTs) */ - auto temporarily_disable_memory_tracker = getCurrentMemoryTrackerActionLock(); + MemoryTracker::BlockerInThread temporarily_disable_memory_tracker; /// Write index. The index contains Primary Key value for each `index_granularity` row. diff --git a/src/Storages/MergeTree/MergeTreeMarksLoader.cpp b/src/Storages/MergeTree/MergeTreeMarksLoader.cpp index a7107789bfd..c5a99b128e9 100644 --- a/src/Storages/MergeTree/MergeTreeMarksLoader.cpp +++ b/src/Storages/MergeTree/MergeTreeMarksLoader.cpp @@ -48,7 +48,7 @@ const MarkInCompressedFile & MergeTreeMarksLoader::getMark(size_t row_index, siz MarkCache::MappedPtr MergeTreeMarksLoader::loadMarksImpl() { /// Memory for marks must not be accounted as memory usage for query, because they are stored in shared cache. - auto temporarily_disable_memory_tracker = getCurrentMemoryTrackerActionLock(); + MemoryTracker::BlockerInThread temporarily_disable_memory_tracker; size_t file_size = disk->getFileSize(mrk_path); size_t mark_size = index_granularity_info.getMarkSizeInBytes(columns_in_mark); diff --git a/src/Storages/MergeTree/MergeTreePartsMover.cpp b/src/Storages/MergeTree/MergeTreePartsMover.cpp index c5c6a63abc4..7b8c88b1bff 100644 --- a/src/Storages/MergeTree/MergeTreePartsMover.cpp +++ b/src/Storages/MergeTree/MergeTreePartsMover.cpp @@ -195,11 +195,13 @@ MergeTreeData::DataPartPtr MergeTreePartsMover::clonePart(const MergeTreeMoveEnt throw Exception("Cancelled moving parts.", ErrorCodes::ABORTED); LOG_TRACE(log, "Cloning part {}", moving_part.part->name); - moving_part.part->makeCloneOnDiskDetached(moving_part.reserved_space); - auto single_disk_volume = std::make_shared("volume_" + moving_part.part->name, moving_part.reserved_space->getDisk()); + const String directory_to_move = "moving"; + moving_part.part->makeCloneOnDisk(moving_part.reserved_space->getDisk(), directory_to_move); + + auto single_disk_volume = std::make_shared("volume_" + moving_part.part->name, moving_part.reserved_space->getDisk(), 0); MergeTreeData::MutableDataPartPtr cloned_part = - data->createPart(moving_part.part->name, single_disk_volume, "detached/" + moving_part.part->name); + data->createPart(moving_part.part->name, single_disk_volume, directory_to_move + '/' + moving_part.part->name); LOG_TRACE(log, "Part {} was cloned to {}", moving_part.part->name, cloned_part->getFullPath()); cloned_part->loadColumnsChecksumsIndexes(true, true); diff --git a/src/Storages/MergeTree/MergeTreeWriteAheadLog.cpp b/src/Storages/MergeTree/MergeTreeWriteAheadLog.cpp index 4c445735a97..1d133f73a7b 100644 --- a/src/Storages/MergeTree/MergeTreeWriteAheadLog.cpp +++ b/src/Storages/MergeTree/MergeTreeWriteAheadLog.cpp @@ -130,7 +130,7 @@ MergeTreeData::MutableDataPartsVector MergeTreeWriteAheadLog::restore(const Stor else if (action_type == ActionType::ADD_PART) { auto part_disk = storage.reserveSpace(0)->getDisk(); - auto single_disk_volume = std::make_shared("volume_" + part_name, disk); + auto single_disk_volume = std::make_shared("volume_" + part_name, disk, 0); part = storage.createPart( part_name, diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.cpp b/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.cpp index 27e870bda78..cf8c32db804 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.cpp +++ b/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.cpp @@ -71,7 +71,10 @@ void ReplicatedMergeTreeRestartingThread::run() bool old_val = false; if (storage.is_readonly.compare_exchange_strong(old_val, true)) + { + incr_readonly = true; CurrentMetrics::add(CurrentMetrics::ReadonlyReplica); + } partialShutdown(); } @@ -112,7 +115,10 @@ void ReplicatedMergeTreeRestartingThread::run() bool old_val = true; if (storage.is_readonly.compare_exchange_strong(old_val, false)) + { + incr_readonly = false; CurrentMetrics::sub(CurrentMetrics::ReadonlyReplica); + } first_time = false; } @@ -349,6 +355,13 @@ void ReplicatedMergeTreeRestartingThread::shutdown() task->deactivate(); LOG_TRACE(log, "Restarting thread finished"); + /// For detach table query, we should reset the ReadonlyReplica metric. + if (incr_readonly) + { + CurrentMetrics::sub(CurrentMetrics::ReadonlyReplica); + incr_readonly = false; + } + /// Stop other tasks. partialShutdown(); } diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.h b/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.h index bb032d9df8c..986253a2206 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.h +++ b/src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.h @@ -36,6 +36,9 @@ private: Poco::Logger * log; std::atomic need_stop {false}; + // We need it besides `storage.is_readonly`, bacause `shutdown()` may be called many times, that way `storage.is_readonly` will not change. + bool incr_readonly = false; + /// The random data we wrote into `/replicas/me/is_active`. String active_node_identifier; diff --git a/src/Storages/MergeTree/SimpleMergeSelector.cpp b/src/Storages/MergeTree/SimpleMergeSelector.cpp index cbb24d1494e..c8c38e73a33 100644 --- a/src/Storages/MergeTree/SimpleMergeSelector.cpp +++ b/src/Storages/MergeTree/SimpleMergeSelector.cpp @@ -1,4 +1,5 @@ #include + #include #include @@ -152,6 +153,9 @@ void selectWithinPartition( if (begin > 1000) break; + if (!parts[begin].shall_participate_in_merges) + continue; + size_t sum_size = parts[begin].size; size_t max_size = parts[begin].size; size_t min_age = parts[begin].age; @@ -161,6 +165,9 @@ void selectWithinPartition( if (settings.max_parts_to_merge_at_once && end - begin > settings.max_parts_to_merge_at_once) break; + if (!parts[end - 1].shall_participate_in_merges) + break; + size_t cur_size = parts[end - 1].size; size_t cur_age = parts[end - 1].age; diff --git a/src/Storages/MergeTree/TTLMergeSelector.cpp b/src/Storages/MergeTree/TTLMergeSelector.cpp index 7f76da085c9..fc7aa93e129 100644 --- a/src/Storages/MergeTree/TTLMergeSelector.cpp +++ b/src/Storages/MergeTree/TTLMergeSelector.cpp @@ -25,6 +25,7 @@ IMergeSelector::PartsRange ITTLMergeSelector::select( ssize_t partition_to_merge_index = -1; time_t partition_to_merge_min_ttl = 0; + /// Find most old TTL. for (size_t i = 0; i < parts_ranges.size(); ++i) { const auto & mergeable_parts_in_partition = parts_ranges[i]; @@ -56,6 +57,7 @@ IMergeSelector::PartsRange ITTLMergeSelector::select( Iterator best_end = best_begin + 1; size_t total_size = 0; + /// Find begin of range with most old TTL. while (true) { time_t ttl = getTTLForPart(*best_begin); @@ -63,6 +65,7 @@ IMergeSelector::PartsRange ITTLMergeSelector::select( if (!ttl || isTTLAlreadySatisfied(*best_begin) || ttl > current_time || (max_total_size_to_merge && total_size > max_total_size_to_merge)) { + /// This condition can not be satisfied on first iteration. ++best_begin; break; } @@ -74,6 +77,7 @@ IMergeSelector::PartsRange ITTLMergeSelector::select( --best_begin; } + /// Find end of range with most old TTL. while (best_end != best_partition.end()) { time_t ttl = getTTLForPart(*best_end); @@ -97,6 +101,19 @@ time_t TTLDeleteMergeSelector::getTTLForPart(const IMergeSelector::Part & part) return only_drop_parts ? part.ttl_infos->part_max_ttl : part.ttl_infos->part_min_ttl; } +bool TTLDeleteMergeSelector::isTTLAlreadySatisfied(const IMergeSelector::Part & part) const +{ + /// N.B. Satisfied TTL means that TTL is NOT expired. + /// return true -- this part can not be selected + /// return false -- this part can be selected + + /// Dropping whole part is an exception to `shall_participate_in_merges` logic. + if (only_drop_parts) + return false; + + return !part.shall_participate_in_merges; +} + time_t TTLRecompressMergeSelector::getTTLForPart(const IMergeSelector::Part & part) const { return part.ttl_infos->getMinimalMaxRecompressionTTL(); @@ -104,6 +121,13 @@ time_t TTLRecompressMergeSelector::getTTLForPart(const IMergeSelector::Part & pa bool TTLRecompressMergeSelector::isTTLAlreadySatisfied(const IMergeSelector::Part & part) const { + /// N.B. Satisfied TTL means that TTL is NOT expired. + /// return true -- this part can not be selected + /// return false -- this part can be selected + + if (!part.shall_participate_in_merges) + return true; + if (recompression_ttls.empty()) return false; diff --git a/src/Storages/MergeTree/TTLMergeSelector.h b/src/Storages/MergeTree/TTLMergeSelector.h index 73d364f28c7..c294687cdc5 100644 --- a/src/Storages/MergeTree/TTLMergeSelector.h +++ b/src/Storages/MergeTree/TTLMergeSelector.h @@ -64,10 +64,7 @@ public: /// Delete TTL should be checked only by TTL time, there are no other ways /// to satisfy it. - bool isTTLAlreadySatisfied(const IMergeSelector::Part &) const override - { - return false; - } + bool isTTLAlreadySatisfied(const IMergeSelector::Part &) const override; private: bool only_drop_parts; diff --git a/src/Storages/StorageBuffer.cpp b/src/Storages/StorageBuffer.cpp index 659df2026c8..cf1eaa1f46d 100644 --- a/src/Storages/StorageBuffer.cpp +++ b/src/Storages/StorageBuffer.cpp @@ -239,6 +239,7 @@ Pipe StorageBuffer::read( } pipe_from_dst.addTableLock(destination_lock); + pipe_from_dst.addStorageHolder(destination); } Pipe pipe_from_buffers; @@ -315,7 +316,7 @@ static void appendBlock(const Block & from, Block & to) size_t old_rows = to.rows(); - auto temporarily_disable_memory_tracker = getCurrentMemoryTrackerActionLock(); + MemoryTracker::BlockerInThread temporarily_disable_memory_tracker; try { @@ -693,7 +694,7 @@ void StorageBuffer::writeBlockToDestination(const Block & block, StoragePtr tabl } auto destination_metadata_snapshot = table->getInMemoryMetadataPtr(); - auto temporarily_disable_memory_tracker = getCurrentMemoryTrackerActionLock(); + MemoryTracker::BlockerInThread temporarily_disable_memory_tracker; auto insert = std::make_shared(); insert->table_id = destination_id; diff --git a/src/Storages/StorageDistributed.cpp b/src/Storages/StorageDistributed.cpp index afac3f97d68..b858239d637 100644 --- a/src/Storages/StorageDistributed.cpp +++ b/src/Storages/StorageDistributed.cpp @@ -454,7 +454,7 @@ QueryProcessingStage::Enum StorageDistributed::getQueryProcessingStage(const Con if (settings.optimize_skip_unused_shards && settings.optimize_distributed_group_by_sharding_key && has_sharding_key && - sharding_key_is_deterministic) + (settings.allow_nondeterministic_optimize_skip_unused_shards || sharding_key_is_deterministic)) { Block sharding_key_block = sharding_key_expr->getSampleBlock(); auto stage = getOptimizedQueryProcessingStage(query_ptr, settings.extremes, sharding_key_block); @@ -710,7 +710,9 @@ ClusterPtr StorageDistributed::getOptimizedCluster(const Context & context, cons ClusterPtr cluster = getCluster(); const Settings & settings = context.getSettingsRef(); - if (has_sharding_key && sharding_key_is_deterministic) + bool sharding_key_is_usable = settings.allow_nondeterministic_optimize_skip_unused_shards || sharding_key_is_deterministic; + + if (has_sharding_key && sharding_key_is_usable) { ClusterPtr optimized = skipUnusedShards(cluster, query_ptr, metadata_snapshot, context); if (optimized) @@ -723,7 +725,7 @@ ClusterPtr StorageDistributed::getOptimizedCluster(const Context & context, cons std::stringstream exception_message; if (!has_sharding_key) exception_message << "No sharding key"; - else if (!sharding_key_is_deterministic) + else if (!sharding_key_is_usable) exception_message << "Sharding key is not deterministic"; else exception_message << "Sharding key " << sharding_key_column_name << " is not used"; diff --git a/src/Storages/StorageMaterializeMySQL.cpp b/src/Storages/StorageMaterializeMySQL.cpp index 99c573e575e..a582b83c5a2 100644 --- a/src/Storages/StorageMaterializeMySQL.cpp +++ b/src/Storages/StorageMaterializeMySQL.cpp @@ -82,6 +82,7 @@ Pipe StorageMaterializeMySQL::read( } Pipe pipe = nested_storage->read(require_columns_name, nested_metadata, query_info, context, processed_stage, max_block_size, num_streams); + pipe.addTableLock(lock); if (!expressions->children.empty() && !pipe.empty()) { diff --git a/src/Storages/StorageMaterializedView.cpp b/src/Storages/StorageMaterializedView.cpp index 3e1df80ff42..8591bebe5cc 100644 --- a/src/Storages/StorageMaterializedView.cpp +++ b/src/Storages/StorageMaterializedView.cpp @@ -124,6 +124,7 @@ Pipe StorageMaterializedView::read( Pipe pipe = storage->read(column_names, metadata_snapshot, query_info, context, processed_stage, max_block_size, num_streams); pipe.addTableLock(lock); + pipe.addStorageHolder(storage); return pipe; } diff --git a/src/Storages/StorageMerge.cpp b/src/Storages/StorageMerge.cpp index 1ff307d66eb..1400689b990 100644 --- a/src/Storages/StorageMerge.cpp +++ b/src/Storages/StorageMerge.cpp @@ -344,6 +344,7 @@ Pipe StorageMerge::createSources( convertingSourceStream(header, metadata_snapshot, *modified_context, modified_query_info.query, pipe, processed_stage); pipe.addTableLock(struct_lock); + pipe.addStorageHolder(storage); pipe.addInterpreterContext(modified_context); } diff --git a/src/Storages/System/StorageSystemStoragePolicies.cpp b/src/Storages/System/StorageSystemStoragePolicies.cpp index 415e7ce2c78..86ce9de081c 100644 --- a/src/Storages/System/StorageSystemStoragePolicies.cpp +++ b/src/Storages/System/StorageSystemStoragePolicies.cpp @@ -29,6 +29,7 @@ StorageSystemStoragePolicies::StorageSystemStoragePolicies(const StorageID & tab {"volume_type", std::make_shared()}, {"max_data_part_size", std::make_shared()}, {"move_factor", std::make_shared()}, + {"prefer_not_to_merge", std::make_shared()} })); // TODO: Add string column with custom volume-type-specific options setInMemoryMetadata(storage_metadata); @@ -52,6 +53,7 @@ Pipe StorageSystemStoragePolicies::read( MutableColumnPtr col_volume_type = ColumnString::create(); MutableColumnPtr col_max_part_size = ColumnUInt64::create(); MutableColumnPtr col_move_factor = ColumnFloat32::create(); + MutableColumnPtr col_prefer_not_to_merge = ColumnUInt8::create(); for (const auto & [policy_name, policy_ptr] : context.getPoliciesMap()) { @@ -69,6 +71,7 @@ Pipe StorageSystemStoragePolicies::read( col_volume_type->insert(volumeTypeToString(volumes[i]->getType())); col_max_part_size->insert(volumes[i]->max_data_part_size); col_move_factor->insert(policy_ptr->getMoveFactor()); + col_prefer_not_to_merge->insert(volumes[i]->areMergesAvoided() ? 1 : 0); } } @@ -80,6 +83,7 @@ Pipe StorageSystemStoragePolicies::read( res_columns.emplace_back(std::move(col_volume_type)); res_columns.emplace_back(std::move(col_max_part_size)); res_columns.emplace_back(std::move(col_move_factor)); + res_columns.emplace_back(std::move(col_prefer_not_to_merge)); UInt64 num_rows = res_columns.at(0)->size(); Chunk chunk(std::move(res_columns), num_rows); diff --git a/tests/integration/test_concurrent_queries_for_all_users_restriction/__init__.py b/tests/integration/test_concurrent_queries_for_all_users_restriction/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/integration/test_concurrent_queries_for_all_users_restriction/configs/user_restrictions.xml b/tests/integration/test_concurrent_queries_for_all_users_restriction/configs/user_restrictions.xml new file mode 100644 index 00000000000..87790f2536c --- /dev/null +++ b/tests/integration/test_concurrent_queries_for_all_users_restriction/configs/user_restrictions.xml @@ -0,0 +1,38 @@ + + + + 10000000000 + 0 + random + 2 + + + 10000000000 + 0 + random + + + + + + + ::/0 + + default + default + + + + + ::/0 + + someuser + default + + + + + + + + diff --git a/tests/integration/test_concurrent_queries_for_all_users_restriction/test.py b/tests/integration/test_concurrent_queries_for_all_users_restriction/test.py new file mode 100644 index 00000000000..ac6e87cdee5 --- /dev/null +++ b/tests/integration/test_concurrent_queries_for_all_users_restriction/test.py @@ -0,0 +1,41 @@ +import time +from multiprocessing.dummy import Pool + +import pytest +from helpers.cluster import ClickHouseCluster + +cluster = ClickHouseCluster(__file__) + +node1 = cluster.add_instance('node1', user_configs=['configs/user_restrictions.xml']) + + +@pytest.fixture(scope="module") +def started_cluster(): + try: + cluster.start() + node1.query("create table nums (number UInt64) ENGINE = MergeTree() order by tuple()") + node1.query("insert into nums values (0), (1)") + yield cluster + finally: + cluster.shutdown() + + +def test_exception_message(started_cluster): + assert node1.query("select number from nums order by number") == "0\n1\n" + + def node_busy(_): + for i in range(10): + node1.query("select sleep(2)", user='someuser', ignore_error=True) + + busy_pool = Pool(3) + busy_pool.map_async(node_busy, range(3)) + time.sleep(1) # wait a little until polling starts + + with pytest.raises(Exception) as exc_info: + for i in range(3): + assert node1.query("select number from remote('node1', 'default', 'nums')", user='default') == "0\n1\n" + exc_info.match("Too many simultaneous queries for all users") + + for i in range(3): + assert node1.query("select number from remote('node1', 'default', 'nums')", user='default', + settings={'max_concurrent_queries_for_all_users': 0}) == "0\n1\n" diff --git a/tests/integration/test_merge_tree_s3_failover/configs/config.d/instant_moves.xml b/tests/integration/test_merge_tree_s3_failover/configs/config.d/instant_moves.xml new file mode 100644 index 00000000000..7b68c6946ca --- /dev/null +++ b/tests/integration/test_merge_tree_s3_failover/configs/config.d/instant_moves.xml @@ -0,0 +1,4 @@ + + 0.5 + 0.5 + diff --git a/tests/integration/test_merge_tree_s3_failover/configs/config.d/part_log.xml b/tests/integration/test_merge_tree_s3_failover/configs/config.d/part_log.xml new file mode 100644 index 00000000000..fb449ee4ad5 --- /dev/null +++ b/tests/integration/test_merge_tree_s3_failover/configs/config.d/part_log.xml @@ -0,0 +1,8 @@ + + + + system + part_log
+ 7500 +
+
diff --git a/tests/integration/test_merge_tree_s3_failover/configs/config.d/storage_conf.xml b/tests/integration/test_merge_tree_s3_failover/configs/config.d/storage_conf.xml index d4d53ab5efe..bcd5ef97a09 100644 --- a/tests/integration/test_merge_tree_s3_failover/configs/config.d/storage_conf.xml +++ b/tests/integration/test_merge_tree_s3_failover/configs/config.d/storage_conf.xml @@ -12,6 +12,7 @@ 0 +
@@ -21,6 +22,16 @@ + + +
+ default +
+ + s3 + +
+
diff --git a/tests/integration/test_merge_tree_s3_failover/test.py b/tests/integration/test_merge_tree_s3_failover/test.py index 59006e2e99a..11a1e464cb6 100644 --- a/tests/integration/test_merge_tree_s3_failover/test.py +++ b/tests/integration/test_merge_tree_s3_failover/test.py @@ -45,7 +45,10 @@ def cluster(): try: cluster = ClickHouseCluster(__file__) cluster.add_instance("node", - main_configs=["configs/config.d/log_conf.xml", "configs/config.d/storage_conf.xml"], + main_configs=["configs/config.d/log_conf.xml", + "configs/config.d/storage_conf.xml", + "configs/config.d/instant_moves.xml", + "configs/config.d/part_log.xml"], with_minio=True) logging.info("Starting cluster...") cluster.start() @@ -115,3 +118,60 @@ def test_write_failover(cluster, min_bytes_for_wide_part, request_count): assert node.query("CHECK TABLE s3_failover_test") == '1\n' assert node.query("SELECT * FROM s3_failover_test FORMAT Values") == data + + +# Check that second data part move is ended successfully if first attempt was failed. +def test_move_failover(cluster): + node = cluster.instances["node"] + + node.query( + """ + CREATE TABLE s3_failover_test ( + dt DateTime, + id Int64, + data String + ) ENGINE=MergeTree() + ORDER BY id + TTL dt + INTERVAL 3 SECOND TO VOLUME 'external' + SETTINGS storage_policy='s3_cold' + """ + ) + + # Fail a request to S3 to break first TTL move. + fail_request(cluster, 1) + + node.query("INSERT INTO s3_failover_test VALUES (now() - 2, 0, 'data'), (now() - 2, 1, 'data')") + + # Wait for part move to S3. + max_attempts = 10 + for attempt in range(max_attempts + 1): + disk = node.query("SELECT disk_name FROM system.parts WHERE table='s3_failover_test' LIMIT 1") + if disk != "s3\n": + if attempt == max_attempts: + assert disk == "s3\n", "Expected move to S3 while part still on disk " + disk + else: + time.sleep(1) + else: + break + + # Ensure part_log is created. + node.query("SYSTEM FLUSH LOGS") + + # There should be 2 attempts to move part. + assert node.query(""" + SELECT count(*) FROM system.part_log + WHERE event_type='MovePart' AND table='s3_failover_test' + """) == '2\n' + + # First attempt should be failed with expected error. + exception = node.query(""" + SELECT exception FROM system.part_log + WHERE event_type='MovePart' AND table='s3_failover_test' AND notEmpty(exception) + ORDER BY event_time + LIMIT 1 + """) + assert exception.find("Expected Error") != -1, exception + + # Ensure data is not corrupted. + assert node.query("CHECK TABLE s3_failover_test") == '1\n' + assert node.query("SELECT id,data FROM s3_failover_test FORMAT Values") == "(0,'data'),(1,'data')" diff --git a/tests/integration/test_multiple_disks/configs/config.d/storage_configuration.xml b/tests/integration/test_multiple_disks/configs/config.d/storage_configuration.xml index 9abbdd26650..c04106221f7 100644 --- a/tests/integration/test_multiple_disks/configs/config.d/storage_configuration.xml +++ b/tests/integration/test_multiple_disks/configs/config.d/storage_configuration.xml @@ -30,6 +30,18 @@ + + +
+ jbod1 +
+ + external + true + +
+
+ diff --git a/tests/integration/test_multiple_disks/test.py b/tests/integration/test_multiple_disks/test.py index 5058bcf368e..496b34f22f0 100644 --- a/tests/integration/test_multiple_disks/test.py +++ b/tests/integration/test_multiple_disks/test.py @@ -76,6 +76,7 @@ def test_system_tables(start_cluster): "volume_type": "JBOD", "max_data_part_size": "0", "move_factor": 0.1, + "prefer_not_to_merge": 0, }, { "policy_name": "small_jbod_with_external", @@ -85,6 +86,27 @@ def test_system_tables(start_cluster): "volume_type": "JBOD", "max_data_part_size": "0", "move_factor": 0.1, + "prefer_not_to_merge": 0, + }, + { + "policy_name": "small_jbod_with_external_no_merges", + "volume_name": "main", + "volume_priority": "1", + "disks": ["jbod1"], + "volume_type": "JBOD", + "max_data_part_size": "0", + "move_factor": 0.1, + "prefer_not_to_merge": 0, + }, + { + "policy_name": "small_jbod_with_external_no_merges", + "volume_name": "external", + "volume_priority": "2", + "disks": ["external"], + "volume_type": "JBOD", + "max_data_part_size": "0", + "move_factor": 0.1, + "prefer_not_to_merge": 1, }, { "policy_name": "one_more_small_jbod_with_external", @@ -94,6 +116,7 @@ def test_system_tables(start_cluster): "volume_type": "JBOD", "max_data_part_size": "0", "move_factor": 0.1, + "prefer_not_to_merge": 0, }, { "policy_name": "one_more_small_jbod_with_external", @@ -103,6 +126,7 @@ def test_system_tables(start_cluster): "volume_type": "JBOD", "max_data_part_size": "0", "move_factor": 0.1, + "prefer_not_to_merge": 0, }, { "policy_name": "jbods_with_external", @@ -112,6 +136,7 @@ def test_system_tables(start_cluster): "volume_type": "JBOD", "max_data_part_size": "10485760", "move_factor": 0.1, + "prefer_not_to_merge": 0, }, { "policy_name": "jbods_with_external", @@ -121,6 +146,7 @@ def test_system_tables(start_cluster): "volume_type": "JBOD", "max_data_part_size": "0", "move_factor": 0.1, + "prefer_not_to_merge": 0, }, { "policy_name": "moving_jbod_with_external", @@ -130,6 +156,7 @@ def test_system_tables(start_cluster): "volume_type": "JBOD", "max_data_part_size": "0", "move_factor": 0.7, + "prefer_not_to_merge": 0, }, { "policy_name": "moving_jbod_with_external", @@ -139,6 +166,7 @@ def test_system_tables(start_cluster): "volume_type": "JBOD", "max_data_part_size": "0", "move_factor": 0.7, + "prefer_not_to_merge": 0, }, { "policy_name": "default_disk_with_external", @@ -148,6 +176,7 @@ def test_system_tables(start_cluster): "volume_type": "JBOD", "max_data_part_size": "2097152", "move_factor": 0.1, + "prefer_not_to_merge": 0, }, { "policy_name": "default_disk_with_external", @@ -157,6 +186,7 @@ def test_system_tables(start_cluster): "volume_type": "JBOD", "max_data_part_size": "20971520", "move_factor": 0.1, + "prefer_not_to_merge": 0, }, { "policy_name": "special_warning_policy", @@ -166,6 +196,7 @@ def test_system_tables(start_cluster): "volume_type": "JBOD", "max_data_part_size": "0", "move_factor": 0.1, + "prefer_not_to_merge": 0, }, { "policy_name": "special_warning_policy", @@ -175,6 +206,7 @@ def test_system_tables(start_cluster): "volume_type": "JBOD", "max_data_part_size": "0", "move_factor": 0.1, + "prefer_not_to_merge": 0, }, { "policy_name": "special_warning_policy", @@ -184,6 +216,7 @@ def test_system_tables(start_cluster): "volume_type": "JBOD", "max_data_part_size": "1024", "move_factor": 0.1, + "prefer_not_to_merge": 0, }, { "policy_name": "special_warning_policy", @@ -193,6 +226,7 @@ def test_system_tables(start_cluster): "volume_type": "JBOD", "max_data_part_size": "1024000000", "move_factor": 0.1, + "prefer_not_to_merge": 0, }, ] @@ -306,6 +340,9 @@ def get_used_disks_for_table(node, table_name): table_name)).strip().split('\n') +def get_used_parts_for_table(node, table_name): + return node.query("SELECT name FROM system.parts WHERE table = '{}' AND active = 1 ORDER BY modification_time".format(table_name)).splitlines() + def test_no_warning_about_zero_max_data_part_size(start_cluster): def get_log(node): return node.exec_in_container(["bash", "-c", "cat /var/log/clickhouse-server/clickhouse-server.log"]) @@ -370,6 +407,8 @@ def test_round_robin(start_cluster, name, engine): ]) def test_max_data_part_size(start_cluster, name, engine): try: + assert int(*node1.query("""SELECT max_data_part_size FROM system.storage_policies WHERE policy_name = 'jbods_with_external' AND volume_name = 'main'""").splitlines()) == 10*1024*1024 + node1.query(""" CREATE TABLE {name} ( s1 String @@ -832,7 +871,7 @@ def test_concurrent_alter_move(start_cluster, name, engine): tasks.append(p.apply_async(optimize_table, (100,))) for task in tasks: - task.get(timeout=120) + task.get(timeout=240) assert node1.query("SELECT 1") == "1\n" assert node1.query("SELECT COUNT() FROM {}".format(name)) == "500\n" @@ -1263,8 +1302,7 @@ def test_move_while_merge(start_cluster): node1.query("INSERT INTO {name} VALUES (1)".format(name=name)) node1.query("INSERT INTO {name} VALUES (2)".format(name=name)) - parts = node1.query( - "SELECT name FROM system.parts WHERE table = '{name}' AND active = 1".format(name=name)).splitlines() + parts = get_used_parts_for_table(node1, name) assert len(parts) == 2 def optimize(): @@ -1329,7 +1367,10 @@ def test_move_across_policies_does_not_work(start_cluster): """.format(name=name)) node1.query("""INSERT INTO {name} VALUES (1)""".format(name=name)) - node1.query("""ALTER TABLE {name} MOVE PARTITION tuple() TO DISK 'jbod2'""".format(name=name)) + try: + node1.query("""ALTER TABLE {name} MOVE PARTITION tuple() TO DISK 'jbod2'""".format(name=name)) + except QueryRuntimeException: + """All parts of partition 'all' are already on disk 'jbod2'.""" with pytest.raises(QueryRuntimeException, match='.*because disk does not belong to storage policy.*'): node1.query("""ALTER TABLE {name}2 ATTACH PARTITION tuple() FROM {name}""".format(name=name)) @@ -1345,3 +1386,160 @@ def test_move_across_policies_does_not_work(start_cluster): finally: node1.query("DROP TABLE IF EXISTS {name}".format(name=name)) node1.query("DROP TABLE IF EXISTS {name}2".format(name=name)) + + +def _insert_merge_execute(node, name, policy, parts, cmds, parts_before_cmds, parts_after_cmds): + try: + node.query(""" + CREATE TABLE {name} ( + n Int64 + ) ENGINE = MergeTree + ORDER BY tuple() + PARTITION BY tuple() + TTL now()-1 TO VOLUME 'external' + SETTINGS storage_policy='{policy}' + """.format(name=name, policy=policy)) + + for i in range(parts): + node.query("""INSERT INTO {name} VALUES ({n})""".format(name=name, n=i)) + + disks = get_used_disks_for_table(node, name) + assert set(disks) == {"external"} + + node.query("""OPTIMIZE TABLE {name}""".format(name=name)) + + parts = get_used_parts_for_table(node, name) + assert len(parts) == parts_before_cmds + + for cmd in cmds: + node.query(cmd) + + node.query("""OPTIMIZE TABLE {name}""".format(name=name)) + + parts = get_used_parts_for_table(node, name) + assert len(parts) == parts_after_cmds + + finally: + node.query("DROP TABLE IF EXISTS {name}".format(name=name)) + + +def _check_merges_are_working(node, storage_policy, volume, shall_work): + try: + name = "_check_merges_are_working_{storage_policy}_{volume}".format(storage_policy=storage_policy, volume=volume) + + node.query(""" + CREATE TABLE {name} ( + n Int64 + ) ENGINE = MergeTree + ORDER BY tuple() + PARTITION BY tuple() + SETTINGS storage_policy='{storage_policy}' + """.format(name=name, storage_policy=storage_policy)) + + created_parts = 24 + + for i in range(created_parts): + node.query("""INSERT INTO {name} VALUES ({n})""".format(name=name, n=i)) + try: + node.query("""ALTER TABLE {name} MOVE PARTITION tuple() TO VOLUME '{volume}' """.format(name=name, volume=volume)) + except: + """Ignore 'nothing to move'.""" + + expected_disks = set(node.query(""" + SELECT disks FROM system.storage_policies ARRAY JOIN disks WHERE volume_name = '{volume_name}' + """.format(volume_name=volume)).splitlines()) + + disks = get_used_disks_for_table(node, name) + assert set(disks) <= expected_disks + + node.query("""OPTIMIZE TABLE {name} FINAL""".format(name=name)) + + parts = get_used_parts_for_table(node, name) + assert len(parts) == 1 if shall_work else created_parts + + finally: + node.query("DROP TABLE IF EXISTS {name}".format(name=name)) + + +def _get_prefer_not_to_merge_for_storage_policy(node, storage_policy): + return list(map(int, node.query("SELECT prefer_not_to_merge FROM system.storage_policies WHERE policy_name = '{}' ORDER BY volume_priority".format(storage_policy)).splitlines())) + + +def test_simple_merge_tree_merges_are_disabled(start_cluster): + _check_merges_are_working(node1, "small_jbod_with_external_no_merges", "external", False) + + +def test_no_merges_in_configuration_allow_from_query_without_reload(start_cluster): + try: + name = "test_no_merges_in_configuration_allow_from_query_without_reload" + policy = "small_jbod_with_external_no_merges" + node1.restart_clickhouse(kill=True) + assert _get_prefer_not_to_merge_for_storage_policy(node1, policy) == [0, 1] + _check_merges_are_working(node1, policy, "external", False) + + _insert_merge_execute(node1, name, policy, 2, [ + "SYSTEM START MERGES ON VOLUME {}.external".format(policy) + ], 2, 1) + assert _get_prefer_not_to_merge_for_storage_policy(node1, policy) == [0, 0] + _check_merges_are_working(node1, policy, "external", True) + + finally: + node1.query("SYSTEM STOP MERGES ON VOLUME {}.external".format(policy)) + + +def test_no_merges_in_configuration_allow_from_query_with_reload(start_cluster): + try: + name = "test_no_merges_in_configuration_allow_from_query_with_reload" + policy = "small_jbod_with_external_no_merges" + node1.restart_clickhouse(kill=True) + assert _get_prefer_not_to_merge_for_storage_policy(node1, policy) == [0, 1] + _check_merges_are_working(node1, policy, "external", False) + + _insert_merge_execute(node1, name, policy, 2, [ + "SYSTEM START MERGES ON VOLUME {}.external".format(policy), + "SYSTEM RELOAD CONFIG" + ], 2, 1) + assert _get_prefer_not_to_merge_for_storage_policy(node1, policy) == [0, 0] + _check_merges_are_working(node1, policy, "external", True) + + finally: + node1.query("SYSTEM STOP MERGES ON VOLUME {}.external".format(policy)) + + +def test_yes_merges_in_configuration_disallow_from_query_without_reload(start_cluster): + try: + name = "test_yes_merges_in_configuration_allow_from_query_without_reload" + policy = "small_jbod_with_external" + node1.restart_clickhouse(kill=True) + assert _get_prefer_not_to_merge_for_storage_policy(node1, policy) == [0, 0] + _check_merges_are_working(node1, policy, "external", True) + + _insert_merge_execute(node1, name, policy, 2, [ + "SYSTEM STOP MERGES ON VOLUME {}.external".format(policy), + "INSERT INTO {name} VALUES (2)".format(name=name) + ], 1, 2) + assert _get_prefer_not_to_merge_for_storage_policy(node1, policy) == [0, 1] + _check_merges_are_working(node1, policy, "external", False) + + finally: + node1.query("SYSTEM START MERGES ON VOLUME {}.external".format(policy)) + + +def test_yes_merges_in_configuration_disallow_from_query_with_reload(start_cluster): + try: + name = "test_yes_merges_in_configuration_allow_from_query_with_reload" + policy = "small_jbod_with_external" + node1.restart_clickhouse(kill=True) + assert _get_prefer_not_to_merge_for_storage_policy(node1, policy) == [0, 0] + _check_merges_are_working(node1, policy, "external", True) + + _insert_merge_execute(node1, name, policy, 2, [ + "SYSTEM STOP MERGES ON VOLUME {}.external".format(policy), + "INSERT INTO {name} VALUES (2)".format(name=name), + "SYSTEM RELOAD CONFIG" + ], 1, 2) + assert _get_prefer_not_to_merge_for_storage_policy(node1, policy) == [0, 1] + _check_merges_are_working(node1, policy, "external", False) + + finally: + node1.query("SYSTEM START MERGES ON VOLUME {}.external".format(policy)) diff --git a/tests/integration/test_system_metrics/__init__.py b/tests/integration/test_system_metrics/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/integration/test_system_metrics/configs/remote_servers.xml b/tests/integration/test_system_metrics/configs/remote_servers.xml new file mode 100644 index 00000000000..a6e80ce2b08 --- /dev/null +++ b/tests/integration/test_system_metrics/configs/remote_servers.xml @@ -0,0 +1,19 @@ + + + + + true + + shard_0 + node1 + 9000 + + + shard_0 + node2 + 9000 + + + + + diff --git a/tests/integration/test_system_metrics/test.py b/tests/integration/test_system_metrics/test.py new file mode 100644 index 00000000000..9e8eac162f6 --- /dev/null +++ b/tests/integration/test_system_metrics/test.py @@ -0,0 +1,61 @@ +import time + +import pytest +from helpers.cluster import ClickHouseCluster +from helpers.test_tools import assert_eq_with_retry +from helpers.network import PartitionManager + + +def fill_nodes(nodes, shard): + for node in nodes: + node.query( + ''' + CREATE DATABASE test; + + CREATE TABLE test.test_table(date Date, id UInt32) + ENGINE = ReplicatedMergeTree('/clickhouse/tables/test{shard}/replicated', '{replica}') ORDER BY id PARTITION BY toYYYYMM(date) SETTINGS min_replicated_logs_to_keep=3, max_replicated_logs_to_keep=5, cleanup_delay_period=0, cleanup_delay_period_random_add=0; + '''.format(shard=shard, replica=node.name)) + + +cluster = ClickHouseCluster(__file__) +node1 = cluster.add_instance('node1', main_configs=['configs/remote_servers.xml'], with_zookeeper=True) +node2 = cluster.add_instance('node2', main_configs=['configs/remote_servers.xml'], with_zookeeper=True) + + +@pytest.fixture(scope="module") +def start_cluster(): + try: + cluster.start() + + fill_nodes([node1, node2], 1) + + yield cluster + + except Exception as ex: + print(ex) + + finally: + cluster.shutdown() + +def test_readonly_metrics(start_cluster): + assert node1.query("SELECT value FROM system.metrics WHERE metric = 'ReadonlyReplica'") == "0\n" + + with PartitionManager() as pm: + ## make node1 readonly -> heal -> readonly -> heal -> detach table -> heal -> attach table + pm.drop_instance_zk_connections(node1) + assert_eq_with_retry(node1, "SELECT value FROM system.metrics WHERE metric = 'ReadonlyReplica'", "1\n", retry_count=300, sleep_time=1) + + pm.heal_all() + assert_eq_with_retry(node1, "SELECT value FROM system.metrics WHERE metric = 'ReadonlyReplica'", "0\n", retry_count=300, sleep_time=1) + + pm.drop_instance_zk_connections(node1) + assert_eq_with_retry(node1, "SELECT value FROM system.metrics WHERE metric = 'ReadonlyReplica'", "1\n", retry_count=300, sleep_time=1) + + + node1.query("DETACH TABLE test.test_table") + assert "0\n" == node1.query("SELECT value FROM system.metrics WHERE metric = 'ReadonlyReplica'") + + pm.heal_all() + node1.query("ATTACH TABLE test.test_table") + assert_eq_with_retry(node1, "SELECT value FROM system.metrics WHERE metric = 'ReadonlyReplica'", "0\n", retry_count=300, sleep_time=1) + diff --git a/tests/performance/encrypt_decrypt.xml b/tests/performance/encrypt_decrypt.xml new file mode 100644 index 00000000000..1ec1827991f --- /dev/null +++ b/tests/performance/encrypt_decrypt.xml @@ -0,0 +1,84 @@ + + + + + + func + + + encrypt('aes-128-cbc', materialize(plaintext), key16, iv16) + encrypt('aes-128-cfb1', materialize(plaintext), key16, iv16) + encrypt('aes-128-cfb8', materialize(plaintext), key16, iv16) + encrypt('aes-128-cfb128', materialize(plaintext), key16, iv16) + encrypt('aes-128-ctr', materialize(plaintext), key16, iv16) + encrypt('aes-128-ecb', materialize(plaintext), key16) + encrypt('aes-128-ofb', materialize(plaintext), key16, iv16) + encrypt('aes-128-gcm', materialize(plaintext), key16, iv12, 'aadaadaadaad') + + encrypt('aes-192-cbc', materialize(plaintext), key24, iv16) + encrypt('aes-192-cfb1', materialize(plaintext), key24, iv16) + encrypt('aes-192-cfb8', materialize(plaintext), key24, iv16) + encrypt('aes-192-cfb128', materialize(plaintext), key24, iv16) + encrypt('aes-192-ctr', materialize(plaintext), key24, iv16) + encrypt('aes-192-ecb', materialize(plaintext), key24) + encrypt('aes-192-ofb', materialize(plaintext), key24, iv16) + encrypt('aes-192-gcm', materialize(plaintext), key24, iv12, 'aadaadaadaad') + + encrypt('aes-256-cbc', materialize(plaintext), key32, iv16) + encrypt('aes-256-cfb1', materialize(plaintext), key32, iv16) + encrypt('aes-256-cfb8', materialize(plaintext), key32, iv16) + encrypt('aes-256-cfb128', materialize(plaintext), key32, iv16) + encrypt('aes-256-ctr', materialize(plaintext), key32, iv16) + encrypt('aes-256-ecb', materialize(plaintext), key32) + encrypt('aes-256-ofb', materialize(plaintext), key32, iv16) + encrypt('aes-256-gcm', materialize(plaintext), key32, iv12, 'aadaadaadaad') + + + decrypt('aes-128-cbc', encrypt('aes-128-cbc', materialize(plaintext), key16, iv16), key16, iv16) + decrypt('aes-128-cfb8', encrypt('aes-128-cfb8', materialize(plaintext), key16, iv16), key16, iv16) + decrypt('aes-128-cfb128', encrypt('aes-128-cfb128', materialize(plaintext), key16, iv16), key16, iv16) + decrypt('aes-128-ctr', encrypt('aes-128-ctr', materialize(plaintext), key16, iv16), key16, iv16) + decrypt('aes-128-ecb', encrypt('aes-128-ecb', materialize(plaintext), key16), key16) + decrypt('aes-128-ofb', encrypt('aes-128-ofb', materialize(plaintext), key16, iv16), key16, iv16) + decrypt('aes-128-gcm', encrypt('aes-128-gcm', materialize(plaintext), key16, iv12, 'aadaadaadaad'), key16, iv12, 'aadaadaadaad') + + decrypt('aes-192-cbc', encrypt('aes-192-cbc', materialize(plaintext), key24, iv16), key24, iv16) + decrypt('aes-192-cfb8', encrypt('aes-192-cfb8', materialize(plaintext), key24, iv16), key24, iv16) + decrypt('aes-192-cfb128', encrypt('aes-192-cfb128', materialize(plaintext), key24, iv16), key24, iv16) + decrypt('aes-192-ctr', encrypt('aes-192-ctr', materialize(plaintext), key24, iv16), key24, iv16) + decrypt('aes-192-ecb', encrypt('aes-192-ecb', materialize(plaintext), key24), key24) + decrypt('aes-192-ofb', encrypt('aes-192-ofb', materialize(plaintext), key24, iv16), key24, iv16) + decrypt('aes-192-gcm', encrypt('aes-192-gcm', materialize(plaintext), key24, iv12, 'aadaadaadaad'), key24, iv12, 'aadaadaadaad') + + decrypt('aes-256-cbc', encrypt('aes-256-cbc', materialize(plaintext), key32, iv16), key32, iv16) + decrypt('aes-256-cfb8', encrypt('aes-256-cfb8', materialize(plaintext), key32, iv16), key32, iv16) + decrypt('aes-256-cfb128', encrypt('aes-256-cfb128', materialize(plaintext), key32, iv16), key32, iv16) + decrypt('aes-256-ctr', encrypt('aes-256-ctr', materialize(plaintext), key32, iv16), key32, iv16) + decrypt('aes-256-ecb', encrypt('aes-256-ecb', materialize(plaintext), key32), key32) + decrypt('aes-256-ofb', encrypt('aes-256-ofb', materialize(plaintext), key32, iv16), key32, iv16) + decrypt('aes-256-gcm', encrypt('aes-256-gcm', materialize(plaintext), key32, iv12, 'aadaadaadaad'), key32, iv12, 'aadaadaadaad') + + + + + table + + numbers(100000) + + + + plaintext + + number + 'paintext' + '\x12\x2B\xF9\x16\x93\xA4\xD6\x74\x22\xD9\x17\x5E\x38\xCD\x1D\x7B\xB0\x12\xEC\x43\x6B\xC7\x76\xFD\xA1\xA2\x4E\xFC\xBC\x19\x92\x3A\x12\x8B\xD4\xB3\x62\xA8\x9D\xBB\x3E\x0C\x08\x12\x67\x20\x7D\x02\x58\xCF\xE7\xD6\x06\xB8\xB0\x14\x0A\x70\xA1\x81\x94\x14\x24\x74' + + + + + + WITH {plaintext} as plaintext, repeat('k', 32) as key32, substring(key32, 1, 24) as key24, substring(key32, 1, 16) as key16, repeat('iv', 8) as iv16, substring(iv16, 1, 12) as iv12 SELECT count() FROM {table} WHERE NOT ignore({func}) LIMIT 1 + + WITH {plaintext} as plaintext, repeat('k', 32) as key32, substring(key32, 1, 24) as key24, substring(key32, 1, 16) as key16, repeat('iv', 8) as iv16, substring(iv16, 1, 12) as iv12 SELECT count() FROM {table} WHERE NOT ignore({func}) + diff --git a/tests/performance/encrypt_decrypt_empty_string.xml b/tests/performance/encrypt_decrypt_empty_string.xml new file mode 100644 index 00000000000..1d88c7f4a7d --- /dev/null +++ b/tests/performance/encrypt_decrypt_empty_string.xml @@ -0,0 +1,67 @@ + + + + + + func + + + encrypt('aes-128-cfb1', materialize(plaintext), key16, iv16) + encrypt('aes-128-cfb8', materialize(plaintext), key16, iv16) + encrypt('aes-128-cfb128', materialize(plaintext), key16, iv16) + encrypt('aes-128-ctr', materialize(plaintext), key16, iv16) + encrypt('aes-128-ofb', materialize(plaintext), key16, iv16) + + encrypt('aes-192-cfb1', materialize(plaintext), key24, iv16) + encrypt('aes-192-cfb8', materialize(plaintext), key24, iv16) + encrypt('aes-192-cfb128', materialize(plaintext), key24, iv16) + encrypt('aes-192-ctr', materialize(plaintext), key24, iv16) + encrypt('aes-192-ofb', materialize(plaintext), key24, iv16) + + encrypt('aes-256-cfb1', materialize(plaintext), key32, iv16) + encrypt('aes-256-cfb8', materialize(plaintext), key32, iv16) + encrypt('aes-256-cfb128', materialize(plaintext), key32, iv16) + encrypt('aes-256-ctr', materialize(plaintext), key32, iv16) + encrypt('aes-256-ofb', materialize(plaintext), key32, iv16) + + + decrypt('aes-128-cfb1', encrypt('aes-128-cfb1', materialize(plaintext), key16, iv16), key16, iv16) + decrypt('aes-128-cfb8', encrypt('aes-128-cfb8', materialize(plaintext), key16, iv16), key16, iv16) + decrypt('aes-128-cfb128', encrypt('aes-128-cfb128', materialize(plaintext), key16, iv16), key16, iv16) + decrypt('aes-128-ctr', encrypt('aes-128-ctr', materialize(plaintext), key16, iv16), key16, iv16) + decrypt('aes-128-ofb', encrypt('aes-128-ofb', materialize(plaintext), key16, iv16), key16, iv16) + + decrypt('aes-192-cfb1', encrypt('aes-192-cfb1', materialize(plaintext), key24, iv16), key24, iv16) + decrypt('aes-192-cfb8', encrypt('aes-192-cfb8', materialize(plaintext), key24, iv16), key24, iv16) + decrypt('aes-192-cfb128', encrypt('aes-192-cfb128', materialize(plaintext), key24, iv16), key24, iv16) + decrypt('aes-192-ctr', encrypt('aes-192-ctr', materialize(plaintext), key24, iv16), key24, iv16) + decrypt('aes-192-ofb', encrypt('aes-192-ofb', materialize(plaintext), key24, iv16), key24, iv16) + + decrypt('aes-256-cfb1', encrypt('aes-256-cfb1', materialize(plaintext), key32, iv16), key32, iv16) + decrypt('aes-256-cfb8', encrypt('aes-256-cfb8', materialize(plaintext), key32, iv16), key32, iv16) + decrypt('aes-256-cfb128', encrypt('aes-256-cfb128', materialize(plaintext), key32, iv16), key32, iv16) + decrypt('aes-256-ctr', encrypt('aes-256-ctr', materialize(plaintext), key32, iv16), key32, iv16) + decrypt('aes-256-ofb', encrypt('aes-256-ofb', materialize(plaintext), key32, iv16), key32, iv16) + + + + + table + + numbers(10000000) + + + + plaintext + + '' + + + + + + WITH {plaintext} as plaintext, repeat('k', 32) as key32, substring(key32, 1, 24) as key24, substring(key32, 1, 16) as key16, repeat('iv', 8) as iv16, substring(iv16, 1, 12) as iv12 SELECT count() FROM {table} WHERE NOT ignore({func}) LIMIT 1 + + WITH {plaintext} as plaintext, repeat('k', 32) as key32, substring(key32, 1, 24) as key24, substring(key32, 1, 16) as key16, repeat('iv', 8) as iv16, substring(iv16, 1, 12) as iv12 SELECT count() FROM {table} WHERE NOT ignore({func}) + diff --git a/tests/performance/encrypt_decrypt_empty_string_slow.xml b/tests/performance/encrypt_decrypt_empty_string_slow.xml new file mode 100644 index 00000000000..e994cfd87d4 --- /dev/null +++ b/tests/performance/encrypt_decrypt_empty_string_slow.xml @@ -0,0 +1,55 @@ + + + + + + func + + + encrypt('aes-128-cbc', materialize(plaintext), key16, iv16) + encrypt('aes-128-ecb', materialize(plaintext), key16) + encrypt('aes-128-gcm', materialize(plaintext), key16, iv12, 'aadaadaadaad') + + encrypt('aes-192-cbc', materialize(plaintext), key24, iv16) + encrypt('aes-192-ecb', materialize(plaintext), key24) + encrypt('aes-192-gcm', materialize(plaintext), key24, iv12, 'aadaadaadaad') + + encrypt('aes-256-cbc', materialize(plaintext), key32, iv16) + encrypt('aes-256-ecb', materialize(plaintext), key32) + encrypt('aes-256-gcm', materialize(plaintext), key32, iv12, 'aadaadaadaad') + + + decrypt('aes-128-cbc', encrypt('aes-128-cbc', materialize(plaintext), key16, iv16), key16, iv16) + decrypt('aes-128-ecb', encrypt('aes-128-ecb', materialize(plaintext), key16), key16) + decrypt('aes-128-gcm', encrypt('aes-128-gcm', materialize(plaintext), key16, iv12, 'aadaadaadaad'), key16, iv12, 'aadaadaadaad') + + decrypt('aes-192-cbc', encrypt('aes-192-cbc', materialize(plaintext), key24, iv16), key24, iv16) + decrypt('aes-192-ecb', encrypt('aes-192-ecb', materialize(plaintext), key24), key24) + decrypt('aes-192-gcm', encrypt('aes-192-gcm', materialize(plaintext), key24, iv12, 'aadaadaadaad'), key24, iv12, 'aadaadaadaad') + + decrypt('aes-256-cbc', encrypt('aes-256-cbc', materialize(plaintext), key32, iv16), key32, iv16) + decrypt('aes-256-ecb', encrypt('aes-256-ecb', materialize(plaintext), key32), key32) + decrypt('aes-256-gcm', encrypt('aes-256-gcm', materialize(plaintext), key32, iv12, 'aadaadaadaad'), key32, iv12, 'aadaadaadaad') + + + + + table + + numbers(100000) + + + + plaintext + + '' + + + + + + WITH {plaintext} as plaintext, repeat('k', 32) as key32, substring(key32, 1, 24) as key24, substring(key32, 1, 16) as key16, repeat('iv', 8) as iv16, substring(iv16, 1, 12) as iv12 SELECT count() FROM {table} WHERE NOT ignore({func}) LIMIT 1 + + WITH {plaintext} as plaintext, repeat('k', 32) as key32, substring(key32, 1, 24) as key24, substring(key32, 1, 16) as key16, repeat('iv', 8) as iv16, substring(iv16, 1, 12) as iv12 SELECT count() FROM {table} WHERE NOT ignore({func}) + diff --git a/tests/performance/encrypt_decrypt_slow.xml b/tests/performance/encrypt_decrypt_slow.xml new file mode 100644 index 00000000000..57712da9086 --- /dev/null +++ b/tests/performance/encrypt_decrypt_slow.xml @@ -0,0 +1,36 @@ + + + + + + func + + + decrypt('aes-128-cfb1', encrypt('aes-128-cfb1', materialize(plaintext), key16, iv16), key16, iv16) + decrypt('aes-192-cfb1', encrypt('aes-192-cfb1', materialize(plaintext), key24, iv16), key24, iv16) + decrypt('aes-256-cfb1', encrypt('aes-256-cfb1', materialize(plaintext), key32, iv16), key32, iv16) + + + + + table + + numbers(50000) + + + + plaintext + + number + 'paintext' + '\x12\x2B\xF9\x16\x93\xA4\xD6\x74\x22\xD9\x17\x5E\x38\xCD\x1D\x7B\xB0\x12\xEC\x43\x6B\xC7\x76\xFD\xA1\xA2\x4E\xFC\xBC\x19\x92\x3A\x12\x8B\xD4\xB3\x62\xA8\x9D\xBB\x3E\x0C\x08\x12\x67\x20\x7D\x02\x58\xCF\xE7\xD6\x06\xB8\xB0\x14\x0A\x70\xA1\x81\x94\x14\x24\x74' + + + + + + WITH {plaintext} as plaintext, repeat('k', 32) as key32, substring(key32, 1, 24) as key24, substring(key32, 1, 16) as key16, repeat('iv', 8) as iv16, substring(iv16, 1, 12) as iv12 SELECT count() FROM {table} WHERE NOT ignore({func}) LIMIT 1 + + WITH {plaintext} as plaintext, repeat('k', 32) as key32, substring(key32, 1, 24) as key24, substring(key32, 1, 16) as key16, repeat('iv', 8) as iv16, substring(iv16, 1, 12) as iv12 SELECT count() FROM {table} WHERE NOT ignore({func}) + diff --git a/tests/queries/0_stateless/00652_replicated_mutations_default_database_zookeeper.sh b/tests/queries/0_stateless/00652_replicated_mutations_default_database_zookeeper.sh index d4f70f0504f..e40c877e8a2 100755 --- a/tests/queries/0_stateless/00652_replicated_mutations_default_database_zookeeper.sh +++ b/tests/queries/0_stateless/00652_replicated_mutations_default_database_zookeeper.sh @@ -15,12 +15,10 @@ INSERT INTO mutations_r1 VALUES (123, 1), (234, 2), (345, 3); CREATE TABLE for_subquery(x UInt32) ENGINE TinyLog; INSERT INTO for_subquery VALUES (234), (345); -ALTER TABLE mutations_r1 UPDATE y = y + 1 WHERE x IN for_subquery; -ALTER TABLE mutations_r1 UPDATE y = y + 1 WHERE x IN (SELECT x FROM for_subquery); +ALTER TABLE mutations_r1 UPDATE y = y + 1 WHERE x IN for_subquery SETTINGS mutations_sync = 2; +ALTER TABLE mutations_r1 UPDATE y = y + 1 WHERE x IN (SELECT x FROM for_subquery) SETTINGS mutations_sync = 2; EOF -wait_for_mutation "mutations_r1" "0000000001" - ${CLICKHOUSE_CLIENT} --query="SELECT * FROM mutations_r1" ${CLICKHOUSE_CLIENT} --query="DROP TABLE mutations_r1" diff --git a/tests/queries/0_stateless/00652_replicated_mutations_zookeeper.sh b/tests/queries/0_stateless/00652_replicated_mutations_zookeeper.sh index 380f6ee6ff8..9e4bdba1294 100755 --- a/tests/queries/0_stateless/00652_replicated_mutations_zookeeper.sh +++ b/tests/queries/0_stateless/00652_replicated_mutations_zookeeper.sh @@ -26,8 +26,8 @@ ${CLICKHOUSE_CLIENT} --query="ALTER TABLE mutations_r1 DELETE WHERE nonexistent ${CLICKHOUSE_CLIENT} --query="ALTER TABLE mutations_r1 DELETE WHERE d = '11'" 2>/dev/null || echo "Query should fail 2" # Delete some values -${CLICKHOUSE_CLIENT} --query="ALTER TABLE mutations_r1 DELETE WHERE x % 2 = 1" -${CLICKHOUSE_CLIENT} --query="ALTER TABLE mutations_r1 DELETE WHERE s = 'd'" +${CLICKHOUSE_CLIENT} --query="ALTER TABLE mutations_r1 DELETE WHERE x % 2 = 1 SETTINGS mutations_sync = 2" +${CLICKHOUSE_CLIENT} --query="ALTER TABLE mutations_r1 DELETE WHERE s = 'd' SETTINGS mutations_sync = 2" ${CLICKHOUSE_CLIENT} --query="ALTER TABLE mutations_r1 DELETE WHERE m = 3 SETTINGS mutations_sync = 2" # Insert more data @@ -62,8 +62,8 @@ ${CLICKHOUSE_CLIENT} --query="CREATE TABLE mutations_cleaner_r2(x UInt32) ENGINE ${CLICKHOUSE_CLIENT} --query="INSERT INTO mutations_cleaner_r1(x) VALUES (1), (2), (3), (4)" # Add some mutations and wait for their execution -${CLICKHOUSE_CLIENT} --query="ALTER TABLE mutations_cleaner_r1 DELETE WHERE x = 1" -${CLICKHOUSE_CLIENT} --query="ALTER TABLE mutations_cleaner_r1 DELETE WHERE x = 2" +${CLICKHOUSE_CLIENT} --query="ALTER TABLE mutations_cleaner_r1 DELETE WHERE x = 1 SETTINGS mutations_sync = 2" +${CLICKHOUSE_CLIENT} --query="ALTER TABLE mutations_cleaner_r1 DELETE WHERE x = 2 SETTINGS mutations_sync = 2" ${CLICKHOUSE_CLIENT} --query="ALTER TABLE mutations_cleaner_r1 DELETE WHERE x = 3 SETTINGS mutations_sync = 2" # Add another mutation and prevent its execution on the second replica diff --git a/tests/queries/0_stateless/00937_ipv4_cidr_range.reference b/tests/queries/0_stateless/00937_ipv4_cidr_range.reference index 060780263de..01f85dc6447 100644 --- a/tests/queries/0_stateless/00937_ipv4_cidr_range.reference +++ b/tests/queries/0_stateless/00937_ipv4_cidr_range.reference @@ -1,3 +1,5 @@ +check invalid params +tests 4 3 2 @@ -14,3 +16,5 @@ ('192.168.5.2','192.168.5.2') ('0.0.0.0','0.255.255.255') ('240.0.0.0','255.255.255.255') +('240.0.0.0','255.255.255.255') +('248.0.0.0','255.255.255.255') diff --git a/tests/queries/0_stateless/00937_ipv4_cidr_range.sql b/tests/queries/0_stateless/00937_ipv4_cidr_range.sql index d0a04dd1cce..badefe22383 100644 --- a/tests/queries/0_stateless/00937_ipv4_cidr_range.sql +++ b/tests/queries/0_stateless/00937_ipv4_cidr_range.sql @@ -1,3 +1,9 @@ +SELECT 'check invalid params'; +SELECT IPv4CIDRToRange(1, 1); -- { serverError 43 } +SELECT IPv4CIDRToRange(toUInt32(1), 512); -- { serverError 43 } + +SELECT 'tests'; + DROP TABLE IF EXISTS ipv4_range; CREATE TABLE ipv4_range(ip IPv4, cidr UInt8) ENGINE = Memory; @@ -16,7 +22,9 @@ WITH IPv4CIDRToRange(ip, cidr) as ip_range SELECT ip, cidr, IPv4NumToString(tupl DROP TABLE ipv4_range; SELECT IPv4CIDRToRange(toIPv4('192.168.5.2'), 0); -SELEcT IPv4CIDRToRange(toIPv4('255.255.255.255'), 8); +SELECT IPv4CIDRToRange(toIPv4('255.255.255.255'), 8); SELECT IPv4CIDRToRange(toIPv4('192.168.5.2'), 32); SELECT IPv4CIDRToRange(toIPv4('0.0.0.0'), 8); SELECT IPv4CIDRToRange(toIPv4('255.0.0.0'), 4); + +SELECT IPv4CIDRToRange(toIPv4('255.0.0.0'), toUInt8(4 + number)) FROM numbers(2); diff --git a/tests/queries/0_stateless/00938_ipv6_cidr_range.reference b/tests/queries/0_stateless/00938_ipv6_cidr_range.reference index fe2a43fbda5..10e9be0bb8c 100644 --- a/tests/queries/0_stateless/00938_ipv6_cidr_range.reference +++ b/tests/queries/0_stateless/00938_ipv6_cidr_range.reference @@ -1,3 +1,5 @@ +check invalid params +tests 3 4 3 @@ -16,3 +18,5 @@ ffff:: 4 ('f000::','ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff') ('::','ff:ffff:ffff:ffff:ffff:ffff:ffff:ffff') ('f000::','ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff') 1 +('2001:db8:0:85a3::ac1f:8001','2001:db8:0:85a3::ac1f:8001') +('2001:db8:0:85a3::ac1f:8000','2001:db8:0:85a3::ac1f:8001') diff --git a/tests/queries/0_stateless/00938_ipv6_cidr_range.sql b/tests/queries/0_stateless/00938_ipv6_cidr_range.sql index 5f69710b220..3fa4c7c5d3f 100644 --- a/tests/queries/0_stateless/00938_ipv6_cidr_range.sql +++ b/tests/queries/0_stateless/00938_ipv6_cidr_range.sql @@ -1,3 +1,11 @@ +SELECT 'check invalid params'; +SELECT IPv6CIDRToRange(1, 1); -- { serverError 43 } +SELECT IPv6CIDRToRange('1234', 1); -- { serverError 43 } +SELECT IPv6CIDRToRange(toFixedString('1234', 10), 1); -- { serverError 43 } +SELECT IPv6CIDRToRange(toFixedString('1234', 16), toUInt16(1)); -- { serverError 43 } + +SELECT 'tests'; + DROP TABLE IF EXISTS ipv6_range; CREATE TABLE ipv6_range(ip IPv6, cidr UInt8) ENGINE = Memory; @@ -23,3 +31,5 @@ SELECT IPv6CIDRToRange(IPv6StringToNum('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' SELECT IPv6CIDRToRange(IPv6StringToNum('0000:0000:0000:0000:0000:0000:0000:0000'), 8); SELECT IPv6CIDRToRange(IPv6StringToNum('ffff:0000:0000:0000:0000:0000:0000:0000'), 4); SELECT IPv6CIDRToRange(IPv6StringToNum('2001:0db8:0000:85a3:0000:0000:ac1f:8001'), 128) = IPv6CIDRToRange(IPv6StringToNum('2001:0db8:0000:85a3:0000:0000:ac1f:8001'), 200) ; + +SELECT IPv6CIDRToRange(IPv6StringToNum('2001:0db8:0000:85a3:0000:0000:ac1f:8001'), toUInt8(128 - number)) FROM numbers(2); diff --git a/tests/queries/0_stateless/01318_decrypt.reference b/tests/queries/0_stateless/01318_decrypt.reference new file mode 100644 index 00000000000..352bde1e502 --- /dev/null +++ b/tests/queries/0_stateless/01318_decrypt.reference @@ -0,0 +1,144 @@ +0 +0 +0 +1 +MySQL-compatitable mode, with key folding, no length checks, etc. +aes-128-cbc 1 +aes-128-cbc 1 +aes-128-cbc 1 +aes-192-cbc 1 +aes-192-cbc 1 +aes-192-cbc 1 +aes-256-cbc 1 +aes-256-cbc 1 +aes-256-cbc 1 +aes-128-cfb1 1 +aes-128-cfb1 1 +aes-128-cfb1 1 +aes-192-cfb1 1 +aes-192-cfb1 1 +aes-192-cfb1 1 +aes-256-cfb1 1 +aes-256-cfb1 1 +aes-256-cfb1 1 +aes-128-cfb8 1 +aes-128-cfb8 1 +aes-128-cfb8 1 +aes-192-cfb8 1 +aes-192-cfb8 1 +aes-192-cfb8 1 +aes-256-cfb8 1 +aes-256-cfb8 1 +aes-256-cfb8 1 +aes-128-cfb128 1 +aes-128-cfb128 1 +aes-128-cfb128 1 +aes-192-cfb128 1 +aes-192-cfb128 1 +aes-192-cfb128 1 +aes-256-cfb128 1 +aes-256-cfb128 1 +aes-256-cfb128 1 +aes-128-ecb 1 +aes-128-ecb 1 +aes-128-ecb 1 +aes-192-ecb 1 +aes-192-ecb 1 +aes-192-ecb 1 +aes-256-ecb 1 +aes-256-ecb 1 +aes-256-ecb 1 +aes-128-ofb 1 +aes-128-ofb 1 +aes-128-ofb 1 +aes-192-ofb 1 +aes-192-ofb 1 +aes-192-ofb 1 +aes-256-ofb 1 +aes-256-ofb 1 +aes-256-ofb 1 +Strict mode without key folding and proper key and iv lengths checks. +aes-128-cbc 1 +aes-128-cbc 1 +aes-128-cbc 1 +aes-192-cbc 1 +aes-192-cbc 1 +aes-192-cbc 1 +aes-256-cbc 1 +aes-256-cbc 1 +aes-256-cbc 1 +aes-128-cfb1 1 +aes-128-cfb1 1 +aes-128-cfb1 1 +aes-192-cfb1 1 +aes-192-cfb1 1 +aes-192-cfb1 1 +aes-256-cfb1 1 +aes-256-cfb1 1 +aes-256-cfb1 1 +aes-128-cfb8 1 +aes-128-cfb8 1 +aes-128-cfb8 1 +aes-192-cfb8 1 +aes-192-cfb8 1 +aes-192-cfb8 1 +aes-256-cfb8 1 +aes-256-cfb8 1 +aes-256-cfb8 1 +aes-128-cfb128 1 +aes-128-cfb128 1 +aes-128-cfb128 1 +aes-192-cfb128 1 +aes-192-cfb128 1 +aes-192-cfb128 1 +aes-256-cfb128 1 +aes-256-cfb128 1 +aes-256-cfb128 1 +aes-128-ctr 1 +aes-128-ctr 1 +aes-128-ctr 1 +aes-192-ctr 1 +aes-192-ctr 1 +aes-192-ctr 1 +aes-256-ctr 1 +aes-256-ctr 1 +aes-256-ctr 1 +aes-128-ecb 1 +aes-128-ecb 1 +aes-128-ecb 1 +aes-192-ecb 1 +aes-192-ecb 1 +aes-192-ecb 1 +aes-256-ecb 1 +aes-256-ecb 1 +aes-256-ecb 1 +aes-128-ofb 1 +aes-128-ofb 1 +aes-128-ofb 1 +aes-192-ofb 1 +aes-192-ofb 1 +aes-192-ofb 1 +aes-256-ofb 1 +aes-256-ofb 1 +aes-256-ofb 1 +GCM mode with IV +aes-128-gcm 1 +aes-128-gcm 1 +aes-128-gcm 1 +aes-192-gcm 1 +aes-192-gcm 1 +aes-192-gcm 1 +aes-256-gcm 1 +aes-256-gcm 1 +aes-256-gcm 1 +GCM mode with IV and AAD +aes-128-gcm 1 +aes-128-gcm 1 +aes-128-gcm 1 +aes-192-gcm 1 +aes-192-gcm 1 +aes-192-gcm 1 +aes-256-gcm 1 +aes-256-gcm 1 +aes-256-gcm 1 +F56E87055BC32D0EEB31B2EACC2BF2A5 1 diff --git a/tests/queries/0_stateless/01318_decrypt.sql b/tests/queries/0_stateless/01318_decrypt.sql new file mode 100644 index 00000000000..796c42db1ab --- /dev/null +++ b/tests/queries/0_stateless/01318_decrypt.sql @@ -0,0 +1,152 @@ +--- aes_decrypt_mysql(string, key, block_mode[, init_vector, AAD]) +-- The MySQL-compatitable encryption, only ecb, cbc, cfb1, cfb8, cfb128 and ofb modes are supported, +-- just like for MySQL +-- https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_aes-encrypt +-- https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_block_encryption_mode +-- Please note that for keys that exceed mode-specific length, keys are folded in a MySQL-specific way, +-- meaning that whole key is used, but effective key length is still determined by mode. +-- when key doesn't exceed the default mode length, ecryption result equals with AES_encypt() + +----------------------------------------------------------------------------------------- +-- error cases +----------------------------------------------------------------------------------------- +SELECT aes_decrypt_mysql(); --{serverError 42} not enough arguments +SELECT aes_decrypt_mysql('aes-128-ecb'); --{serverError 42} not enough arguments +SELECT aes_decrypt_mysql('aes-128-ecb', 'text'); --{serverError 42} not enough arguments + +-- Mode +SELECT aes_decrypt_mysql(789, 'text', 'key'); --{serverError 43} bad mode type +SELECT aes_decrypt_mysql('blah blah blah', 'text', 'key'); -- {serverError 36} garbage mode value +SELECT aes_decrypt_mysql('des-ede3-ecb', 'text', 'key'); -- {serverError 36} bad mode value of valid cipher name +SELECT aes_decrypt_mysql('aes-128-gcm', 'text', 'key'); -- {serverError 36} mode is not supported by _mysql-functions + +SELECT decrypt(789, 'text', 'key'); --{serverError 43} bad mode type +SELECT decrypt('blah blah blah', 'text', 'key'); -- {serverError 36} garbage mode value +SELECT decrypt('des-ede3-ecb', 'text', 'key'); -- {serverError 36} bad mode value of valid cipher name + + +-- Key +SELECT aes_decrypt_mysql('aes-128-ecb', 'text', 456); --{serverError 43} bad key type +SELECT aes_decrypt_mysql('aes-128-ecb', 'text', 'key'); -- {serverError 36} key is too short + +SELECT decrypt('aes-128-ecb', 'text'); --{serverError 42} key is missing +SELECT decrypt('aes-128-ecb', 'text', 456); --{serverError 43} bad key type +SELECT decrypt('aes-128-ecb', 'text', 'key'); -- {serverError 36} key is too short +SELECT decrypt('aes-128-ecb', 'text', 'keykeykeykeykeykeykeykeykeykeykeykey'); -- {serverError 36} key is to long + +-- IV +SELECT aes_decrypt_mysql('aes-128-ecb', 'text', 'key', 1011); --{serverError 43} bad IV type 6 +SELECT aes_decrypt_mysql('aes-128-ecb', 'text', 'key', 'iv'); --{serverError 36} IV is too short 4 + +SELECT decrypt('aes-128-cbc', 'text', 'keykeykeykeykeyk', 1011); --{serverError 43} bad IV type 1 +SELECT decrypt('aes-128-cbc', 'text', 'keykeykeykeykeyk', 'iviviviviviviviviviviviviviviviviviviviviv'); --{serverError 36} IV is too long 3 +SELECT decrypt('aes-128-cbc', 'text', 'keykeykeykeykeyk', 'iv'); --{serverError 36} IV is too short 2 + +--AAD +SELECT aes_decrypt_mysql('aes-128-ecb', 'text', 'key', 'IV', 1213); --{serverError 42} too many arguments + +SELECT decrypt('aes-128-ecb', 'text', 'key', 'IV', 1213); --{serverError 43} bad AAD type +SELECT decrypt('aes-128-gcm', 'text', 'key', 'IV', 1213); --{serverError 43} bad AAD type + +-- Invalid ciphertext should cause an error or produce garbage +SELECT ignore(decrypt('aes-128-ecb', 'hello there', '1111111111111111')); -- {serverError 454} 1 +SELECT ignore(decrypt('aes-128-cbc', 'hello there', '1111111111111111')); -- {serverError 454} 2 +SELECT ignore(decrypt('aes-128-cfb1', 'hello there', '1111111111111111')); -- GIGO +SELECT ignore(decrypt('aes-128-ofb', 'hello there', '1111111111111111')); -- GIGO +SELECT ignore(decrypt('aes-128-ctr', 'hello there', '1111111111111111')); -- GIGO +SELECT decrypt('aes-128-ctr', '', '1111111111111111') == ''; + + +----------------------------------------------------------------------------------------- +-- Validate against predefined ciphertext,plaintext,key and IV for MySQL compatibility mode +----------------------------------------------------------------------------------------- +CREATE TABLE encryption_test +( + input String, + key String DEFAULT unhex('fb9958e2e897ef3fdb49067b51a24af645b3626eed2f9ea1dc7fd4dd71b7e38f9a68db2a3184f952382c783785f9d77bf923577108a88adaacae5c141b1576b0'), + iv String DEFAULT unhex('8CA3554377DFF8A369BC50A89780DD85'), + key32 String DEFAULT substring(key, 1, 32), + key24 String DEFAULT substring(key, 1, 24), + key16 String DEFAULT substring(key, 1, 16) +) Engine = Memory; + +INSERT INTO encryption_test (input) +VALUES (''), ('text'), ('What Is ClickHouse? ClickHouse is a column-oriented database management system (DBMS) for online analytical processing of queries (OLAP).'); + + +SELECT 'MySQL-compatitable mode, with key folding, no length checks, etc.'; +SELECT 'aes-128-cbc' as mode, aes_decrypt_mysql(mode, aes_encrypt_mysql(mode, input, key, iv), key, iv) == input FROM encryption_test; +SELECT 'aes-192-cbc' as mode, aes_decrypt_mysql(mode, aes_encrypt_mysql(mode, input, key, iv), key, iv) == input FROM encryption_test; +SELECT 'aes-256-cbc' as mode, aes_decrypt_mysql(mode, aes_encrypt_mysql(mode, input, key, iv), key, iv) == input FROM encryption_test; + +SELECT 'aes-128-cfb1' as mode, aes_decrypt_mysql(mode, aes_encrypt_mysql(mode, input, key, iv), key, iv) == input FROM encryption_test; +SELECT 'aes-192-cfb1' as mode, aes_decrypt_mysql(mode, aes_encrypt_mysql(mode, input, key, iv), key, iv) == input FROM encryption_test; +SELECT 'aes-256-cfb1' as mode, aes_decrypt_mysql(mode, aes_encrypt_mysql(mode, input, key, iv), key, iv) == input FROM encryption_test; + +SELECT 'aes-128-cfb8' as mode, aes_decrypt_mysql(mode, aes_encrypt_mysql(mode, input, key, iv), key, iv) == input FROM encryption_test; +SELECT 'aes-192-cfb8' as mode, aes_decrypt_mysql(mode, aes_encrypt_mysql(mode, input, key, iv), key, iv) == input FROM encryption_test; +SELECT 'aes-256-cfb8' as mode, aes_decrypt_mysql(mode, aes_encrypt_mysql(mode, input, key, iv), key, iv) == input FROM encryption_test; + +SELECT 'aes-128-cfb128' as mode, aes_decrypt_mysql(mode, aes_encrypt_mysql(mode, input, key, iv), key, iv) == input FROM encryption_test; +SELECT 'aes-192-cfb128' as mode, aes_decrypt_mysql(mode, aes_encrypt_mysql(mode, input, key, iv), key, iv) == input FROM encryption_test; +SELECT 'aes-256-cfb128' as mode, aes_decrypt_mysql(mode, aes_encrypt_mysql(mode, input, key, iv), key, iv) == input FROM encryption_test; + +SELECT 'aes-128-ecb' as mode, aes_decrypt_mysql(mode, aes_encrypt_mysql(mode, input, key, iv), key, iv) == input FROM encryption_test; +SELECT 'aes-192-ecb' as mode, aes_decrypt_mysql(mode, aes_encrypt_mysql(mode, input, key, iv), key, iv) == input FROM encryption_test; +SELECT 'aes-256-ecb' as mode, aes_decrypt_mysql(mode, aes_encrypt_mysql(mode, input, key, iv), key, iv) == input FROM encryption_test; + +SELECT 'aes-128-ofb' as mode, aes_decrypt_mysql(mode, aes_encrypt_mysql(mode, input, key, iv), key, iv) == input FROM encryption_test; +SELECT 'aes-192-ofb' as mode, aes_decrypt_mysql(mode, aes_encrypt_mysql(mode, input, key, iv), key, iv) == input FROM encryption_test; +SELECT 'aes-256-ofb' as mode, aes_decrypt_mysql(mode, aes_encrypt_mysql(mode, input, key, iv), key, iv) == input FROM encryption_test; + +SELECT 'Strict mode without key folding and proper key and iv lengths checks.'; +SELECT 'aes-128-cbc' as mode, decrypt(mode, encrypt(mode, input, key16, iv), key16, iv) == input FROM encryption_test; +SELECT 'aes-192-cbc' as mode, decrypt(mode, encrypt(mode, input, key24, iv), key24, iv) == input FROM encryption_test; +SELECT 'aes-256-cbc' as mode, decrypt(mode, encrypt(mode, input, key32, iv), key32, iv) == input FROM encryption_test; + +SELECT 'aes-128-cfb1' as mode, decrypt(mode, encrypt(mode, input, key16, iv), key16, iv) == input FROM encryption_test; +SELECT 'aes-192-cfb1' as mode, decrypt(mode, encrypt(mode, input, key24, iv), key24, iv) == input FROM encryption_test; +SELECT 'aes-256-cfb1' as mode, decrypt(mode, encrypt(mode, input, key32, iv), key32, iv) == input FROM encryption_test; + +SELECT 'aes-128-cfb8' as mode, decrypt(mode, encrypt(mode, input, key16, iv), key16, iv) == input FROM encryption_test; +SELECT 'aes-192-cfb8' as mode, decrypt(mode, encrypt(mode, input, key24, iv), key24, iv) == input FROM encryption_test; +SELECT 'aes-256-cfb8' as mode, decrypt(mode, encrypt(mode, input, key32, iv), key32, iv) == input FROM encryption_test; + +SELECT 'aes-128-cfb128' as mode, decrypt(mode, encrypt(mode, input, key16, iv), key16, iv) == input FROM encryption_test; +SELECT 'aes-192-cfb128' as mode, decrypt(mode, encrypt(mode, input, key24, iv), key24, iv) == input FROM encryption_test; +SELECT 'aes-256-cfb128' as mode, decrypt(mode, encrypt(mode, input, key32, iv), key32, iv) == input FROM encryption_test; + +SELECT 'aes-128-ctr' as mode, decrypt(mode, encrypt(mode, input, key16, iv), key16, iv) == input FROM encryption_test; +SELECT 'aes-192-ctr' as mode, decrypt(mode, encrypt(mode, input, key24, iv), key24, iv) == input FROM encryption_test; +SELECT 'aes-256-ctr' as mode, decrypt(mode, encrypt(mode, input, key32, iv), key32, iv) == input FROM encryption_test; + +SELECT 'aes-128-ecb' as mode, decrypt(mode, encrypt(mode, input, key16), key16) == input FROM encryption_test; +SELECT 'aes-192-ecb' as mode, decrypt(mode, encrypt(mode, input, key24), key24) == input FROM encryption_test; +SELECT 'aes-256-ecb' as mode, decrypt(mode, encrypt(mode, input, key32), key32) == input FROM encryption_test; + +SELECT 'aes-128-ofb' as mode, decrypt(mode, encrypt(mode, input, key16, iv), key16, iv) == input FROM encryption_test; +SELECT 'aes-192-ofb' as mode, decrypt(mode, encrypt(mode, input, key24, iv), key24, iv) == input FROM encryption_test; +SELECT 'aes-256-ofb' as mode, decrypt(mode, encrypt(mode, input, key32, iv), key32, iv) == input FROM encryption_test; + +SELECT 'GCM mode with IV'; +SELECT 'aes-128-gcm' as mode, decrypt(mode, encrypt(mode, input, key16, iv), key16, iv) == input FROM encryption_test; +SELECT 'aes-192-gcm' as mode, decrypt(mode, encrypt(mode, input, key24, iv), key24, iv) == input FROM encryption_test; +SELECT 'aes-256-gcm' as mode, decrypt(mode, encrypt(mode, input, key32, iv), key32, iv) == input FROM encryption_test; + +SELECT 'GCM mode with IV and AAD'; +SELECT 'aes-128-gcm' as mode, decrypt(mode, encrypt(mode, input, key16, iv, 'AAD'), key16, iv, 'AAD') == input FROM encryption_test; +SELECT 'aes-192-gcm' as mode, decrypt(mode, encrypt(mode, input, key24, iv, 'AAD'), key24, iv, 'AAD') == input FROM encryption_test; +SELECT 'aes-256-gcm' as mode, decrypt(mode, encrypt(mode, input, key32, iv, 'AAD'), key32, iv, 'AAD') == input FROM encryption_test; + + +-- based on https://github.com/openssl/openssl/blob/master/demos/evp/aesgcm.c#L20 +WITH + unhex('eebc1f57487f51921c0465665f8ae6d1658bb26de6f8a069a3520293a572078f') as key, + unhex('67ba0510262ae487d737ee6298f77e0c') as tag, + unhex('99aa3e68ed8173a0eed06684') as iv, + unhex('f56e87055bc32d0eeb31b2eacc2bf2a5') as plaintext, + unhex('4d23c3cec334b49bdb370c437fec78de') as aad, + unhex('f7264413a84c0e7cd536867eb9f21736') as ciphertext +SELECT + hex(decrypt('aes-256-gcm', concat(ciphertext, tag), key, iv, aad)) as plaintext_actual, + plaintext_actual = hex(plaintext); diff --git a/tests/queries/0_stateless/01318_encrypt.reference b/tests/queries/0_stateless/01318_encrypt.reference new file mode 100644 index 00000000000..9b4495f1409 --- /dev/null +++ b/tests/queries/0_stateless/01318_encrypt.reference @@ -0,0 +1,147 @@ +UInt64 5417DEA8D67A1A03FD561809C62402FF +Float64 9B66D0AA685DC0F1EFFA2E385F7EA2F2 +Decimal64 5417DEA8D67A1A03FD561809C62402FF +MySQL-compatitable mode, with key folding, no length checks, etc. +aes-128-cbc B2EB028BC2236566A946085E65A5632B +aes-128-cbc 25026C55954363AEF90325822218C370 +aes-128-cbc 683051259880871EA8EBFBBF5360D1DA96D967450DFEFA45C89C8B2D59121602C1C5A54AAB8C95EC53F46E5A021BEDE7B5B2B9E83A416726F0DD750F6ACE9C654C986C3B3C9BEB497F54BFA2EF1B107EF204E7508C4E2D37797641404E51D496DFE477A49DCECB2EB47FC6BB6A13CF72AD19E99CEE7656D3EA29BDBC673879D7814D158FB8CB0760DFE89943BE3234C1 +aes-192-cbc 829FA9DAF77594921A16494EC005AD29 +aes-192-cbc 20727A7264B5DD601ECFE40FB9CF50B0 +aes-192-cbc BBFE507F31FF227F74EFA831CCE338443947492DD8141840B0C3D006404836574040AC80DD243311E1A791BB0C5C02AB4DF85BA39B102056DA75CF1E32BAA8836E616D27542F84EA4792F41CD1180E0FF66ACACEDAC4AFD0D2031771C370D413A077DC755F5AF38A441950958216B1130BBF6265E1CE824A6E9B0EE76993495535654B10344A201171D9F1A788FBB45A +aes-256-cbc 8C0F6D5F2B0E751EC2033C5CA08E99F7 +aes-256-cbc D907F72499D48DB36850AF2C038CEF62 +aes-256-cbc A398D86A880BA4DE1FBA1ABBD38B9DA3B038B198134E798A4CF134029DB18B0A53F9A7177DAA5270EAD7448C56EB96351745A779A56B42A848FE265BFAB85BF349580A9E1751E627AEE80A8B0FC9046F18B8CF575358E21F5E353F115B2BF87984DB199744D4A83E58AD4764B6DFA92F933E0E1AA1F2AA95E4A9662C9BD8F1AC8D79BF531E77EDDB1A25CCD52D4E994D +aes-128-cfb1 +aes-128-cfb1 78BF3E26 +aes-128-cfb1 4A9D5DC0463F6C4E353E20ED62EFE9B9470882BEFE403CDCEF73019133EAA6B38E92C8C8D0BA46DFEE332A4D1003481EF5E05AB30244ECBFB46E1FD878377D9A8209630C2304D42B2B8F545841535DE3C3D7FC6DD839EB8C35D9CB7172D0F5B9AE7EB3E1BE2F1E42007BA76FBBFE9B38225071468717E9C8EFBA73FDA016A533F709B1B4B18AFD4D85 +aes-192-cfb1 +aes-192-cfb1 6B44342A +aes-192-cfb1 5D93C18B6821DA795910E27BA92A0F6C1BB74F924C5D369D4DB4697AC9F2F2F9F7159EC34C66260DB6BEE4BE13F51344EDC640F10B6ED64D1DD891FF8542ECA6B9CA7BB64DCA160C5460CE1F1BF602C16B571E35FBFFD4F26EC34FBBCE14D9C56ABE18779C9DC5266601573B4D25B188E0778EE77C98B0B16F65623BBB834F2B254B84D1B891ED4105 +aes-256-cfb1 +aes-256-cfb1 51860DF1 +aes-256-cfb1 687FB4B773E5C87F8B42E6A9B2538EC3D1B302B11BCECC0F846B2D5BB3050C41BAF43B29271F663035A27863C913C7149B5E1CF08E803616B9B649EB33C63F66EF608876A5BB43ABDD310E40597DDC93E88E4465663D7E967A0E1EA68C98CD5E039B08843EDE8E11A66DBBA67F3D4844EB0270732BE69ADFEF6DC6E801E100479AB86AFE3447454841 +aes-128-cfb8 +aes-128-cfb8 0EC82D99 +aes-128-cfb8 2DDE927A331C8482A453901E6EA1119746A5E6E7452DDC1349973A04433AD56C3473D10EFC5030B9BDC2549D607D174469134D73AC325C2B6E2BDF8F4D323B82F37222FC05C199EDA9693490EFA52427B00E872F9D89FC2262147296B5957BE8EA8FF2A6BF5BB3A6537C0A81D8BBC671E716C3B52504F2D567031AAC33B4434677BAF0944E883961DA +aes-192-cfb8 +aes-192-cfb8 054CD2E8 +aes-192-cfb8 26AC354F7232BD5A0B3CDC241EFF3ED9258E118FC0301E1CA1A745FC20F029066D1D3DA5368A2FE7B589CD6242F68546999DF68A0E1DE018B5B3DCD5CA911506FC6EFADC769CB6CFE2A91749C2DBA06D4614E351A4AAC58C381344DB44E3A83F31A299823B2158C4E65B457072CFBAD4D14FE9960876245E840117E8B39018D6D34C4832510A1992BD +aes-256-cfb8 +aes-256-cfb8 7FA03B1B +aes-256-cfb8 5C67ABAE9944F8BE6C35F1B348CF2E112ECF45349EA2BCFC1789EA89B7298998E8886E9147FA9AEBC3DFBEFB3320C1661251A9129DBC14649D88983371D10185E6C6D0C935438344B161999191C05CA805E7C5A7410C50370FE3347CDE4A21F5089831116701B324A5CBB24EE604F043259B8898976B807DEB3544951C0AB2C2CE55DE964B4BBD285E +aes-128-cfb128 +aes-128-cfb128 0EAAFAF5 +aes-128-cfb128 2DA7E3F5CD13148BED988533A2560F52959044EC2FF38A1D1A66DB2B20635FC8800060DA0062E0399CFE059E5E687F4BBA5E7182A4D79F18317B970708F079A59771C231EBA359741565B903BA820EE3EA07249777E745387B9774EE495940A50121A617B20768AA3A1A78AC9D49983E7BD43CD7BD21504640EAB23F57AB9E5B6260D875B665A63359 +aes-192-cfb128 +aes-192-cfb128 053E029A +aes-192-cfb128 26331B9AEF235360655730F3D8905479AEACC18B2FFCC7FF355DBA918A2B09C5FEEE817C929400A3E412A7528EB6D79846B687858E250AD54A9913CB81009AC55E391163ECCEF6DA0095C4C57B2C913D70B82C0B14ADD59DD559A039B48A47C86142D15922E86FE2586707F689DFD962D2B96E3571151D642A8E8CC2F2CC09D17F009592B0963AD2AB +aes-256-cfb128 +aes-256-cfb128 7FB039F7 +aes-256-cfb128 5CBD20F7ABD3AC41FCAA1A5C0E119E2BB5174FDACA4353FFA5D1BC2928CE015E08C7D813C51A9493902FD4BF6A864FA6F26B220C8FD21B846C90453241F369B170B6DAAF5B7E10AF025EA6EBF3852BCDA6AA92DA086B13162E3CCCC859FE3A6A8782395247785951D5095305BE97196C4A8C7607CFC0191A4DEB72F085ECF759F5AA5CBD3BE60A7FF5 +aes-128-ecb FEA8CFDE6EE2C6E7A2CC6ADDC9F62C83 +aes-128-ecb 78B16CD4BE107660156124C5FEE6454A +aes-128-ecb 67C0B119D96F18E2823968D42871B3D126D5DDD35074303974946BE81A246757C3ACAEBFE0590EC98C4F51469E9FE27A8F8A98749E4DCAEF02F2076AC4CEB317062C0531F5FD2A505FE62413D8B0900ECAB5B8E1909A4A38FF922E3302857A16CE8E6804ACBA36C5E00EF5054288922517E59A47D0A26451905DE9E391D683ABB5852B5611886A2EF662AC8A1E156D85 +aes-192-ecb 99BA10452392CF90CC4D24489213BE78 +aes-192-ecb EB9D63FB9A457DB400EDE00878E828B1 +aes-192-ecb 4ADC9AA9BDD0A70C9FAEEA565C0C3329E2D0D5A9BB5F48ADB440F2676173CBB099898BBDF3DE98BCE4C0D663916E8CF401B063AD51BF3110C2C318DECB62F3C87B564C61794F6B393761745626A58DC3485E3930E4145E35C343DB56FB51D831C9EDB07987939009EB4241A0E3BE9CF64E235081AB5EFBBE585FE547AC49F65E5D1E772DE16A0BC85D7C60CAC34094A8 +aes-256-ecb 42575C26B6D9838CF5BB0214CFA7CA31 +aes-256-ecb 08B5C9159FA1E2C986FE57CFFE4A5CD7 +aes-256-ecb 72FC92DD17DD5E0BA4B621C2F20B9B04C3F81A42BA8E34F1138EAC99C1FD43B85AD238B61B8B68389F432E734345CC26C21D1DCCA80EF4B267BAAEEFCB5A6A00A323693758C8E31DC84BF8E017C81825C51A2D30607174403B61B7D71A3FFBFC6905A977B496DDF09E1C2BDC49AF1AAA0FD3B130404A27F7915007B2E00646C8573137E8AE1DF231C0235F53C1E7A832 +aes-128-ofb +aes-128-ofb 0EAAFAF5 +aes-128-ofb 2DA7E3F5CD13148BED988533A2560F523B04048D918E339B531EBE886FA60448A32056AE6599984C4FB6F41381A09E822470951A7B154A157C661BEF5116633B8CF39574CB5754368011C249A9A936AA7A2D75812B42E28259D219CE5A69E3B0CF8FEE19427B607E2D02F2A3ED184B4D1387CFCEEA2BD48FF9AB7091F5A7548B8C3601DF0CCBEEBDBC +aes-192-ofb +aes-192-ofb 053E029A +aes-192-ofb 26331B9AEF235360655730F3D890547987BD7D29A17C0B076546820084C2F973C28E93589C68BFBFAC8D212F36A5809F0532ABEE022C1DEC985487DF146BCAAA1A82310DE8EF397A5121873D2335FAC47D05CA27A49048F55366D7AA6BBD4E64740CB36EC538B225D7667D796665E3EFD0BDBE0226F716388A39063A85CCD0969CFA52BE4B2F523603 +aes-256-ofb +aes-256-ofb 7FB039F7 +aes-256-ofb 5CBD20F7ABD3AC41FCAA1A5C0E119E2BCD544279C69E49904DCC791C2D5A8542FE255641D9F79B6900744A4310F0965F1CC84147CE952A32837B9F0853EC7DDB3FCBF49EC5E7C3674AA38ED3A1FB212C56FBB1A0AEFBF8E8E3AE5C0B08E86E317E3A5A998A9EF062FF95977571804F40C1120E54AFDC495EF95D532BB76F6F5351285AAF302ACCA066 +Strict mode without key folding and proper key and iv lengths checks. +aes-128-cbc C09B247E927C81D643CDCA58B2AD3F0D +aes-128-cbc 676ED1EA792A8E2E4B0D3CF45A945D73 +aes-128-cbc 7FDC3DAECBD2C89E41561A04ED586244BE3266643877D721F80C78E6E5F0F195A450DC2548A8DB3253D9612DB116B4B50C3B1C2EEB93704942449C7A606DE2035813B83B533FF561A6781F306A8720AE6344F30B8AE4A81920C3A8A777310FF6246B914127983C8D2E951675E929F939F05E50AA0ED635A2564EB276DD428DCB0D6B7CD655E065210955BD373C555D2E +aes-192-cbc 0735013389B1241D9316202CD7A618A2 +aes-192-cbc 5DC3B5ACD2CF676F968E12068BA8C675 +aes-192-cbc C6390AAB7AB3B7E6A15E8CA4907AE2B5B0D767B30B0BFFF87D76FF025C384669E1DB6769234B89E5CB365B6721D118534D4CDB33977D87FE22CE9D4CF546AF96ED35F558839AFC6748759F3A36B8C44B5232038F0528254EC5FFE58A68C5306C4C4F982FEE2F9955C6833747B2E093AE1F0BF19A4AB16F4429E5FFB2C17F70588A79B67301FDD6D2A731229FF25853B1 +aes-256-cbc 8C0F6D5F2B0E751EC2033C5CA08E99F7 +aes-256-cbc D907F72499D48DB36850AF2C038CEF62 +aes-256-cbc A398D86A880BA4DE1FBA1ABBD38B9DA3B038B198134E798A4CF134029DB18B0A53F9A7177DAA5270EAD7448C56EB96351745A779A56B42A848FE265BFAB85BF349580A9E1751E627AEE80A8B0FC9046F18B8CF575358E21F5E353F115B2BF87984DB199744D4A83E58AD4764B6DFA92F933E0E1AA1F2AA95E4A9662C9BD8F1AC8D79BF531E77EDDB1A25CCD52D4E994D +aes-128-cfb1 +aes-128-cfb1 79A4880E +aes-128-cfb1 5A83873C33073FB2AA84F0344C5828D833DE87B85BA3B7A5F27521C072C99359F1E95ABD2C98E02712DAA23F27BDFB28089152BFD4074E1AE3BEF472EE7518FCD824C67FA767142E5BEF00D089F2BB1A31F555CE6DFBAA7D0698C9016AEA1BCF2296DB5820B36E397DD8546874C4A2135C02877828478785F536345EBAD3541D484DED181587D043B1 +aes-192-cfb1 +aes-192-cfb1 AECB3AEE +aes-192-cfb1 8014FFC665907F3FAB5AA3C7BFEE808BFB744F7EF2AC7243D099ED3D188E6C457F497E875B023F070B7FBA2BDDB091D71CEBB4CD39B19FB61737EB06927A6406B53F6513B07ADE609FEA4D358E9396EA2BE2C3CF873C52B03BA1FAC1540E3491AABAE769C3DFF081224A1A5B8ECFBA098793D3E7FFFD5C810342E780577FF11B0A77E751F8940C1288 +aes-256-cfb1 +aes-256-cfb1 51860DF1 +aes-256-cfb1 687FB4B773E5C87F8B42E6A9B2538EC3D1B302B11BCECC0F846B2D5BB3050C41BAF43B29271F663035A27863C913C7149B5E1CF08E803616B9B649EB33C63F66EF608876A5BB43ABDD310E40597DDC93E88E4465663D7E967A0E1EA68C98CD5E039B08843EDE8E11A66DBBA67F3D4844EB0270732BE69ADFEF6DC6E801E100479AB86AFE3447454841 +aes-128-cfb8 +aes-128-cfb8 513D0801 +aes-128-cfb8 72B632E6010A526E5F7EFEC4ABFF87E2087FB91159399FCF81639B104B5CFD92D7DC4A6FDD1946FCD7883D88A65B3DAB050467886CFF35B33035C7671F85EBEDB7D934A93CE9EECEE251C95E33CC1E7EAB7F38FC37B1BE08F675CBD446B8B4856363DE1BD6976546DAB4A1125BE5A0516C9BCEEF99BC1EE20539160A973771C01EF45D7A8A78F5D3AE +aes-192-cfb8 +aes-192-cfb8 F9B3F3EE +aes-192-cfb8 DAB2433E165A0CD4261DCD2B77B9A2D6128D8054F02166B76CC45B681BC7556E48A06A1838C0F5F0BD6C766DBFEFC07769FF986E58F5B5DA9AE8AF1AFC64A038F8939DD51B585A3FFFD13948D6D716D574BAD875258E3E8D2D2CC589982B625E375B31C34B1F50E82125AB91F14ABCD984FA24057D1BB15395214DC830F125A6EDB3C43023F3F403DA +aes-256-cfb8 +aes-256-cfb8 7FA03B1B +aes-256-cfb8 5C67ABAE9944F8BE6C35F1B348CF2E112ECF45349EA2BCFC1789EA89B7298998E8886E9147FA9AEBC3DFBEFB3320C1661251A9129DBC14649D88983371D10185E6C6D0C935438344B161999191C05CA805E7C5A7410C50370FE3347CDE4A21F5089831116701B324A5CBB24EE604F043259B8898976B807DEB3544951C0AB2C2CE55DE964B4BBD285E +aes-128-cfb128 +aes-128-cfb128 519F7556 +aes-128-cfb128 72926C569BC409EA1646E840082C18F28531DE0AEFA2F980ADCEA64A8BC57798CD549092928F115E702F325DA709A7DB445B6BE9C510452ABB78966B4D8EB622303113EB1BB955FB507A11B1092FEA78C5A05F71D8A9E553591AC6E72B833F1BECE8A5E1816742270C12495BD436C93C5DD1EC017A2EEFE5C5966A01D2BA0EED477D46234DFF333F02 +aes-192-cfb128 +aes-192-cfb128 F978FB28 +aes-192-cfb128 DA75E22875FB05DDE0145038A775E5BD6397D4DC5839CCF84C1F2D0983E87E06A7B1DB1E25FF9A3C0C7BE9FAF61AAC2DE08AAD9C08694F7E35F8E144967C0C798365AB4BA5DF2308014862C80617AF0BC6857B15806412A0E5CAB5B017196A3AFFB73DB33E3D3954FA1F8839501CD117003ED139231E15B28B5E73FBF84E3CC047A2DA0ADA74C25DE8 +aes-256-cfb128 +aes-256-cfb128 7FB039F7 +aes-256-cfb128 5CBD20F7ABD3AC41FCAA1A5C0E119E2BB5174FDACA4353FFA5D1BC2928CE015E08C7D813C51A9493902FD4BF6A864FA6F26B220C8FD21B846C90453241F369B170B6DAAF5B7E10AF025EA6EBF3852BCDA6AA92DA086B13162E3CCCC859FE3A6A8782395247785951D5095305BE97196C4A8C7607CFC0191A4DEB72F085ECF759F5AA5CBD3BE60A7FF5 +aes-128-ctr +aes-128-ctr 519F7556 +aes-128-ctr 72926C569BC409EA1646E840082C18F24A5A4A7A178EBCBAC0F170479253ACD2A18968DEAB5148C9C2E878B8F4B7C82B6601A0CD5470AA74EA7A2AAD15107950FC50786C3DC483B8BCA6DF1E5CDD64332C2289641EF66271DFEF9D07B392D4762AEE8FD65E0E8E8CB4FBE26D9D94A207352046380BB44AF32EDB900F6796EA87FC4C52A092CEB229C7 +aes-192-ctr +aes-192-ctr F978FB28 +aes-192-ctr DA75E22875FB05DDE0145038A775E5BDD158C02B77DD5840038E297E275500B3B8CA25422979B29D57F07B94359EF6F84552018BEC0D8CD444A852E31BCAD95811D396DA223589983AE09C80D27E690B3CCFEE1AD0E6F30493A8221698F12286F86F2202A7BABFC0F710B234994CDA7001E3CD237B171D663EB425D08D330557812F6D8897F1B30E93 +aes-256-ctr +aes-256-ctr 7FB039F7 +aes-256-ctr 5CBD20F7ABD3AC41FCAA1A5C0E119E2B3259493C5A24845535AF1E97FACD790FB5C06D94F7292D617D38EC3319718C29F9CC533560228E892CC9C80867167AC8F26B09D34E5917A59B35D7DF30604B66F2E5891E22539F1B8581037933B623132FE4249191908457BB27E08CA8E2FE066B1119FD9DE6C7A604F4D2DDC4C64A6D37CDD7C1BA883EF759 +aes-128-ecb 4603E6862B0D94BBEC68E0B0DF51D60F +aes-128-ecb 3004851B86D3F3950672DE7085D27C03 +aes-128-ecb E807F8C8D40A11F65076361AFC7D8B6844054F47B421F0AA0C0D693388A8779A08D71389C06C509D73FA533392DBD24F1600A9650F7F8D1D55F65E50312D48A6CFA69BDCB8D096AB47E8BDA65DC5DA6A5245536312D04882DC94ACF050F3E53A22CAC2D6C1962697DA311B595A086A8DA3EFDE5E1AE0A7009455F3CB6621EADB1E74727BF0F4AF0C4191FE504EA1BBB4 +aes-192-ecb 046D3CD33E7B61B75D1BE371CA44DD76 +aes-192-ecb 37CE413D3B953BCEB7FAD79837DB5F1C +aes-192-ecb 60CCA1B9A0E5F2E88561E960309229385DB05D62A012FF35AF39D0577C3E31C1D55BB51C9DD3DA07F87E565031A40900745844A5CC79B143662BD392581DAFD17E829EB15C0D5D853B49FD5536F0E3F2E8B3337BBA63C06AAD32C282C98F42D45442CE8971CACE0BAC9852E656A6A7F6A8203EA1BC77AC3965CA192CC817D52A628217933A2B5C2264A71B6E60354997 +aes-256-ecb 42575C26B6D9838CF5BB0214CFA7CA31 +aes-256-ecb 08B5C9159FA1E2C986FE57CFFE4A5CD7 +aes-256-ecb 72FC92DD17DD5E0BA4B621C2F20B9B04C3F81A42BA8E34F1138EAC99C1FD43B85AD238B61B8B68389F432E734345CC26C21D1DCCA80EF4B267BAAEEFCB5A6A00A323693758C8E31DC84BF8E017C81825C51A2D30607174403B61B7D71A3FFBFC6905A977B496DDF09E1C2BDC49AF1AAA0FD3B130404A27F7915007B2E00646C8573137E8AE1DF231C0235F53C1E7A832 +aes-128-ofb +aes-128-ofb 519F7556 +aes-128-ofb 72926C569BC409EA1646E840082C18F273A5DC2A93E6F58F6191847385035377DECB7C20E0E35B04724FA5B4473999A192B9C6125A441DA50AE071E7A0924B4770278CD219870320F9654177936CEBB5DBAC5E065596D56ED010E57FCC66B9A1FA541B96FCBEAEB4F8D177FEEAAFB9A78C0F1A55B15C1B1009F0EBBB4AEBF4D2DC537EA3012A99F7E4 +aes-192-ofb +aes-192-ofb F978FB28 +aes-192-ofb DA75E22875FB05DDE0145038A775E5BD26133E8DFB8FC939B564D224E623B825FB59E66D34DA6499850F9A390CB7531D31AB0567D77BF2DD4EE7AA9FD39ACA53B589A12627292B4A707D2F3069DB542D797213C379EFBF700F6F638FB0A98307F2CBC7F73E1DC857885B8DF4F5BC190E65B77ED27BA283027262D953FDA346F8FD2435996BFC919171 +aes-256-ofb +aes-256-ofb 7FB039F7 +aes-256-ofb 5CBD20F7ABD3AC41FCAA1A5C0E119E2BCD544279C69E49904DCC791C2D5A8542FE255641D9F79B6900744A4310F0965F1CC84147CE952A32837B9F0853EC7DDB3FCBF49EC5E7C3674AA38ED3A1FB212C56FBB1A0AEFBF8E8E3AE5C0B08E86E317E3A5A998A9EF062FF95977571804F40C1120E54AFDC495EF95D532BB76F6F5351285AAF302ACCA066 +GCM mode with IV +aes-128-gcm 3D67D2B8D8F49A24C482085FEC494231 +aes-128-gcm C08B1CF60C5A2C92C55DAC62223CBA22C736446C +aes-128-gcm E38605F61AE032292F25A35A6CDF6E827980625B9A50BB3C77CD2AD54DB9BE5578322CC55569D1B0C5B82577060C0053388F511DB7BF9C898BF4B05FB6C8C0D0F50449C06A2E89E086610CB2BAEF25B206312836884DCBCC6CD8329B2A43E2BA751183B1696AB3F070BE94FA823F1E1A5E2372A06E1AD2719AF37983D23FCD199820B7769E72EDC20AF48466DAEB6550DC7FDBA041F77D5231 +aes-192-gcm FC2C8C63A570E584AB71F19BA6E79A8F +aes-192-gcm 9A6CF0FDA93F1614F982B5570CC1216D84E356BD +aes-192-gcm B961E9FD9B940EBAD7ADDA75C9F198A40797A598AC7FA183AC58705EF6E4E295504D71B85D81978B4CE196AFFFA019B941F44B14DF06375688FCA986F2F3088C24E955392F0DB378F033052822D560CD8DDFF5472C66029E997AE2D63935DAAA10D6703E5AB627E8168F16CF5CDB1112DD2D49F10E087BA20831DCCE592465C95AAA5AF8F766BAEDC3FD3949EDD2E667333C83E58786504137 +aes-256-gcm E99DBEBC01F021758352D7FBD9039EFA +aes-256-gcm 8742CE3A7B0595B281C712600D274CA881F47414 +aes-256-gcm A44FD73ACEB1A64BDE2D03808A2576EDBB6076F61614CC84A960CCBE55FBABF365671B7017BC89C8A2E0A633E0A05E40B2681B33AD3E7A0AC4925DBD9735C4D1C1E33726B1D6A83CBD337A65C50D7CC33CC4E64369D54C1B6AF3A82D206DF0698BEB61EF9AB2DF81B03DF3829A2EC42D667D87376B8A1351C69BB7A11CCBE50DA88ABA991E98D3BD71129682F35422AD73B05EC624357E77FC +GCM mode with IV and AAD +aes-128-gcm 5AB059BB98F087E8134B19E7EB5CD9C7 +aes-128-gcm C08B1CF67AD5D38FE0F3508689794961B8D1FAB8 +aes-128-gcm E38605F61AE032292F25A35A6CDF6E827980625B9A50BB3C77CD2AD54DB9BE5578322CC55569D1B0C5B82577060C0053388F511DB7BF9C898BF4B05FB6C8C0D0F50449C06A2E89E086610CB2BAEF25B206312836884DCBCC6CD8329B2A43E2BA751183B1696AB3F070BE94FA823F1E1A5E2372A06E1AD2719AF37983D23FCD199820B7769E72EDC20A0826DB2A479DB59F7216A9BDCBD0C989 +aes-192-gcm 04C13E4B1D62481ED22B3644595CB5DB +aes-192-gcm 9A6CF0FD2B329B04EAD18301818F016DF8F77447 +aes-192-gcm B961E9FD9B940EBAD7ADDA75C9F198A40797A598AC7FA183AC58705EF6E4E295504D71B85D81978B4CE196AFFFA019B941F44B14DF06375688FCA986F2F3088C24E955392F0DB378F033052822D560CD8DDFF5472C66029E997AE2D63935DAAA10D6703E5AB627E8168F16CF5CDB1112DD2D49F10E087BA20831DCCE592465C95AAA5AF8F766BAEDC3668E035498D8C46FB662833CCC12C9D6 +aes-256-gcm E94F5F6ED4A99B741D492D7EA10B7147 +aes-256-gcm 8742CE3A3EA5153952DB4C0D94B501FE878FF9A7 +aes-256-gcm A44FD73ACEB1A64BDE2D03808A2576EDBB6076F61614CC84A960CCBE55FBABF365671B7017BC89C8A2E0A633E0A05E40B2681B33AD3E7A0AC4925DBD9735C4D1C1E33726B1D6A83CBD337A65C50D7CC33CC4E64369D54C1B6AF3A82D206DF0698BEB61EF9AB2DF81B03DF3829A2EC42D667D87376B8A1351C69BB7A11CCBE50DA88ABA991E98D3BD712F56268961DDAB59FA4D2B50578602C4 +Nullable and LowCardinality +Nullable(String) \N +Nullable(String) 7FB039F7 +LowCardinality(String) 7FB039F7 +F7264413A84C0E7CD536867EB9F2173667BA0510262AE487D737EE6298F77E0C 1 diff --git a/tests/queries/0_stateless/01318_encrypt.sql b/tests/queries/0_stateless/01318_encrypt.sql new file mode 100644 index 00000000000..9766988764a --- /dev/null +++ b/tests/queries/0_stateless/01318_encrypt.sql @@ -0,0 +1,156 @@ +--- aes_encrypt_mysql(string, key, block_mode[, init_vector, AAD]) +-- The MySQL-compatitable encryption, only ecb, cbc, cfb1, cfb8, cfb128 and ofb modes are supported, +-- just like for MySQL +-- https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_aes-encrypt +-- https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_block_encryption_mode +-- Please note that for keys that exceed mode-specific length, keys are folded in a MySQL-specific way, +-- meaning that whole key is used, but effective key length is still determined by mode. +-- when key doesn't exceed the default mode length, ecryption result equals with AES_encypt() + +----------------------------------------------------------------------------------------- +-- error cases +----------------------------------------------------------------------------------------- +SELECT aes_encrypt_mysql(); --{serverError 42} not enough arguments +SELECT aes_encrypt_mysql('aes-128-ecb'); --{serverError 42} not enough arguments +SELECT aes_encrypt_mysql('aes-128-ecb', 'text'); --{serverError 42} not enough arguments + +-- Mode +SELECT aes_encrypt_mysql(789, 'text', 'key'); --{serverError 43} bad mode type +SELECT aes_encrypt_mysql('blah blah blah', 'text', 'key'); -- {serverError 36} garbage mode value +SELECT aes_encrypt_mysql('des-ede3-ecb', 'text', 'key'); -- {serverError 36} bad mode value of valid cipher name +SELECT aes_encrypt_mysql('aes-128-gcm', 'text', 'key'); -- {serverError 36} mode is not supported by _mysql-functions + +SELECT encrypt(789, 'text', 'key'); --{serverError 43} bad mode type +SELECT encrypt('blah blah blah', 'text', 'key'); -- {serverError 36} garbage mode value +SELECT encrypt('des-ede3-ecb', 'text', 'key'); -- {serverError 36} bad mode value of valid cipher name + + +-- Key +SELECT aes_encrypt_mysql('aes-128-ecb', 'text', 456); --{serverError 43} bad key type +SELECT aes_encrypt_mysql('aes-128-ecb', 'text', 'key'); -- {serverError 36} key is too short + +SELECT encrypt('aes-128-ecb', 'text'); --{serverError 42} key is missing +SELECT encrypt('aes-128-ecb', 'text', 456); --{serverError 43} bad key type +SELECT encrypt('aes-128-ecb', 'text', 'key'); -- {serverError 36} key is too short +SELECT encrypt('aes-128-ecb', 'text', 'keykeykeykeykeykeykeykeykeykeykeykey'); -- {serverError 36} key is to long + +-- IV +SELECT aes_encrypt_mysql('aes-128-ecb', 'text', 'key', 1011); --{serverError 43} bad IV type 6 +SELECT aes_encrypt_mysql('aes-128-ecb', 'text', 'key', 'iv'); --{serverError 36} IV is too short 4 + +SELECT encrypt('aes-128-cbc', 'text', 'keykeykeykeykeyk', 1011); --{serverError 43} bad IV type 1 +SELECT encrypt('aes-128-cbc', 'text', 'keykeykeykeykeyk', 'iviviviviviviviviviviviviviviviviviviviviv'); --{serverError 36} IV is too long 3 +SELECT encrypt('aes-128-cbc', 'text', 'keykeykeykeykeyk', 'iv'); --{serverError 36} IV is too short 2 + +--AAD +SELECT aes_encrypt_mysql('aes-128-ecb', 'text', 'key', 'IV', 1213); --{serverError 42} too many arguments + +SELECT encrypt('aes-128-ecb', 'text', 'key', 'IV', 1213); --{serverError 43} bad AAD type +SELECT encrypt('aes-128-gcm', 'text', 'key', 'IV', 1213); --{serverError 43} bad AAD type + +----------------------------------------------------------------------------------------- +-- Valid cases +----------------------------------------------------------------------------------------- + +SELECT 'UInt64', hex(aes_encrypt_mysql('aes-128-ecb', 123456789101112, 'keykeykeykeykeykeykeykeykeykeyke')); +SELECT 'Float64', hex(aes_encrypt_mysql('aes-128-ecb', 1234567891011.12, 'keykeykeykeykeykeykeykeykeykeyke')); +SELECT 'Decimal64', hex(aes_encrypt_mysql('aes-128-ecb', toDecimal64(1234567891011.12, 2), 'keykeykeykeykeykeykeykeykeykeyke')); + +----------------------------------------------------------------------------------------- +-- Validate against predefined ciphertext,plaintext,key and IV for MySQL compatibility mode +----------------------------------------------------------------------------------------- +CREATE TABLE encryption_test +( + input String, + key String DEFAULT unhex('fb9958e2e897ef3fdb49067b51a24af645b3626eed2f9ea1dc7fd4dd71b7e38f9a68db2a3184f952382c783785f9d77bf923577108a88adaacae5c141b1576b0'), + iv String DEFAULT unhex('8CA3554377DFF8A369BC50A89780DD85'), + key32 String DEFAULT substring(key, 1, 32), + key24 String DEFAULT substring(key, 1, 24), + key16 String DEFAULT substring(key, 1, 16) +) Engine = Memory; + +INSERT INTO encryption_test (input) +VALUES (''), ('text'), ('What Is ClickHouse? ClickHouse is a column-oriented database management system (DBMS) for online analytical processing of queries (OLAP).'); + + +SELECT 'MySQL-compatitable mode, with key folding, no length checks, etc.'; +SELECT 'aes-128-cbc' as mode, hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test; +SELECT 'aes-192-cbc' as mode, hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test; +SELECT 'aes-256-cbc' as mode, hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test; + +SELECT 'aes-128-cfb1' as mode, hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test; +SELECT 'aes-192-cfb1' as mode, hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test; +SELECT 'aes-256-cfb1' as mode, hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test; + +SELECT 'aes-128-cfb8' as mode, hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test; +SELECT 'aes-192-cfb8' as mode, hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test; +SELECT 'aes-256-cfb8' as mode, hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test; + +SELECT 'aes-128-cfb128' as mode, hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test; +SELECT 'aes-192-cfb128' as mode, hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test; +SELECT 'aes-256-cfb128' as mode, hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test; + +SELECT 'aes-128-ecb' as mode, hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test; +SELECT 'aes-192-ecb' as mode, hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test; +SELECT 'aes-256-ecb' as mode, hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test; + +SELECT 'aes-128-ofb' as mode, hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test; +SELECT 'aes-192-ofb' as mode, hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test; +SELECT 'aes-256-ofb' as mode, hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test; + + +SELECT 'Strict mode without key folding and proper key and iv lengths checks.'; +SELECT 'aes-128-cbc' as mode, hex(encrypt(mode, input, key16, iv)) FROM encryption_test; +SELECT 'aes-192-cbc' as mode, hex(encrypt(mode, input, key24, iv)) FROM encryption_test; +SELECT 'aes-256-cbc' as mode, hex(encrypt(mode, input, key32, iv)) FROM encryption_test; + +SELECT 'aes-128-cfb1' as mode, hex(encrypt(mode, input, key16, iv)) FROM encryption_test; +SELECT 'aes-192-cfb1' as mode, hex(encrypt(mode, input, key24, iv)) FROM encryption_test; +SELECT 'aes-256-cfb1' as mode, hex(encrypt(mode, input, key32, iv)) FROM encryption_test; + +SELECT 'aes-128-cfb8' as mode, hex(encrypt(mode, input, key16, iv)) FROM encryption_test; +SELECT 'aes-192-cfb8' as mode, hex(encrypt(mode, input, key24, iv)) FROM encryption_test; +SELECT 'aes-256-cfb8' as mode, hex(encrypt(mode, input, key32, iv)) FROM encryption_test; + +SELECT 'aes-128-cfb128' as mode, hex(encrypt(mode, input, key16, iv)) FROM encryption_test; +SELECT 'aes-192-cfb128' as mode, hex(encrypt(mode, input, key24, iv)) FROM encryption_test; +SELECT 'aes-256-cfb128' as mode, hex(encrypt(mode, input, key32, iv)) FROM encryption_test; + +SELECT 'aes-128-ctr' as mode, hex(encrypt(mode, input, key16, iv)) FROM encryption_test; +SELECT 'aes-192-ctr' as mode, hex(encrypt(mode, input, key24, iv)) FROM encryption_test; +SELECT 'aes-256-ctr' as mode, hex(encrypt(mode, input, key32, iv)) FROM encryption_test; + +SELECT 'aes-128-ecb' as mode, hex(encrypt(mode, input, key16)) FROM encryption_test; +SELECT 'aes-192-ecb' as mode, hex(encrypt(mode, input, key24)) FROM encryption_test; +SELECT 'aes-256-ecb' as mode, hex(encrypt(mode, input, key32)) FROM encryption_test; + +SELECT 'aes-128-ofb' as mode, hex(encrypt(mode, input, key16, iv)) FROM encryption_test; +SELECT 'aes-192-ofb' as mode, hex(encrypt(mode, input, key24, iv)) FROM encryption_test; +SELECT 'aes-256-ofb' as mode, hex(encrypt(mode, input, key32, iv)) FROM encryption_test; + +SELECT 'GCM mode with IV'; +SELECT 'aes-128-gcm' as mode, hex(encrypt(mode, input, key16, iv)) FROM encryption_test; +SELECT 'aes-192-gcm' as mode, hex(encrypt(mode, input, key24, iv)) FROM encryption_test; +SELECT 'aes-256-gcm' as mode, hex(encrypt(mode, input, key32, iv)) FROM encryption_test; + +SELECT 'GCM mode with IV and AAD'; +SELECT 'aes-128-gcm' as mode, hex(encrypt(mode, input, key16, iv, 'AAD')) FROM encryption_test; +SELECT 'aes-192-gcm' as mode, hex(encrypt(mode, input, key24, iv, 'AAD')) FROM encryption_test; +SELECT 'aes-256-gcm' as mode, hex(encrypt(mode, input, key32, iv, 'AAD')) FROM encryption_test; + +SELECT 'Nullable and LowCardinality'; +WITH CAST(NULL as Nullable(String)) as input, 'aes-256-ofb' as mode SELECT toTypeName(input), hex(aes_encrypt_mysql(mode, input, key32,iv)) FROM encryption_test LIMIT 1; +WITH CAST('text' as Nullable(String)) as input, 'aes-256-ofb' as mode SELECT toTypeName(input), hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test LIMIT 1; +WITH CAST('text' as LowCardinality(String)) as input, 'aes-256-ofb' as mode SELECT toTypeName(input), hex(aes_encrypt_mysql(mode, input, key32, iv)) FROM encryption_test LIMIT 1; + +-- based on https://github.com/openssl/openssl/blob/master/demos/evp/aesgcm.c#L20 +WITH + unhex('eebc1f57487f51921c0465665f8ae6d1658bb26de6f8a069a3520293a572078f') as key, + unhex('67ba0510262ae487d737ee6298f77e0c') as tag, + unhex('99aa3e68ed8173a0eed06684') as iv, + unhex('f56e87055bc32d0eeb31b2eacc2bf2a5') as plaintext, + unhex('4d23c3cec334b49bdb370c437fec78de') as aad, + unhex('f7264413a84c0e7cd536867eb9f21736') as ciphertext +SELECT + hex(encrypt('aes-256-gcm', plaintext, key, iv, aad)) as ciphertext_actual, + ciphertext_actual = concat(hex(ciphertext), hex(tag)); diff --git a/tests/queries/0_stateless/01514_input_format_csv_enum_as_number_setting.reference b/tests/queries/0_stateless/01514_input_format_csv_enum_as_number_setting.reference new file mode 100644 index 00000000000..6b67bbaaf74 --- /dev/null +++ b/tests/queries/0_stateless/01514_input_format_csv_enum_as_number_setting.reference @@ -0,0 +1 @@ +102 es diff --git a/tests/queries/0_stateless/01514_input_format_csv_enum_as_number_setting.sql b/tests/queries/0_stateless/01514_input_format_csv_enum_as_number_setting.sql new file mode 100644 index 00000000000..526af60434f --- /dev/null +++ b/tests/queries/0_stateless/01514_input_format_csv_enum_as_number_setting.sql @@ -0,0 +1,15 @@ +DROP TABLE IF EXISTS table_with_enum_column_for_csv_insert; + +CREATE TABLE table_with_enum_column_for_csv_insert ( + Id Int32, + Value Enum('ef' = 1, 'es' = 2) +) ENGINE=Memory(); + +SET input_format_csv_enum_as_number = 1; + +INSERT INTO table_with_enum_column_for_csv_insert FORMAT CSV 102,2 +SELECT * FROM table_with_enum_column_for_csv_insert; + +SET input_format_csv_enum_as_number = 0; + +DROP TABLE IF EXISTS table_with_enum_column_for_csv_insert; diff --git a/tests/queries/0_stateless/01514_input_format_json_enum_as_number.reference b/tests/queries/0_stateless/01514_input_format_json_enum_as_number.reference new file mode 100644 index 00000000000..6b67bbaaf74 --- /dev/null +++ b/tests/queries/0_stateless/01514_input_format_json_enum_as_number.reference @@ -0,0 +1 @@ +102 es diff --git a/tests/queries/0_stateless/01514_input_format_json_enum_as_number.sql b/tests/queries/0_stateless/01514_input_format_json_enum_as_number.sql new file mode 100644 index 00000000000..8d55a257c47 --- /dev/null +++ b/tests/queries/0_stateless/01514_input_format_json_enum_as_number.sql @@ -0,0 +1,11 @@ +DROP TABLE IF EXISTS table_with_enum_column_for_json_insert; + +CREATE TABLE table_with_enum_column_for_json_insert ( + Id Int32, + Value Enum('ef' = 1, 'es' = 2) +) ENGINE=Memory(); + +INSERT INTO table_with_enum_column_for_json_insert FORMAT JSONEachRow {"Id":102,"Value":2} +SELECT * FROM table_with_enum_column_for_json_insert; + +DROP TABLE IF EXISTS table_with_enum_column_for_json_insert; diff --git a/tests/queries/0_stateless/01514_input_format_tsv_enum_as_number_setting.reference b/tests/queries/0_stateless/01514_input_format_tsv_enum_as_number_setting.reference new file mode 100644 index 00000000000..2ff52a8eabf --- /dev/null +++ b/tests/queries/0_stateless/01514_input_format_tsv_enum_as_number_setting.reference @@ -0,0 +1,2 @@ +102 es +103 ef diff --git a/tests/queries/0_stateless/01514_input_format_tsv_enum_as_number_setting.sql b/tests/queries/0_stateless/01514_input_format_tsv_enum_as_number_setting.sql new file mode 100644 index 00000000000..033d7d282f0 --- /dev/null +++ b/tests/queries/0_stateless/01514_input_format_tsv_enum_as_number_setting.sql @@ -0,0 +1,16 @@ +DROP TABLE IF EXISTS table_with_enum_column_for_tsv_insert; + +CREATE TABLE table_with_enum_column_for_tsv_insert ( + Id Int32, + Value Enum('ef' = 1, 'es' = 2) +) ENGINE=Memory(); + +SET input_format_tsv_enum_as_number = 1; + +INSERT INTO table_with_enum_column_for_tsv_insert FORMAT TSV 102 2 +INSERT INTO table_with_enum_column_for_tsv_insert FORMAT TabSeparatedRaw 103 1 +SELECT * FROM table_with_enum_column_for_tsv_insert ORDER BY Id; + +SET input_format_tsv_enum_as_number = 0; + +DROP TABLE IF EXISTS table_with_enum_column_for_tsv_insert; diff --git a/tests/queries/0_stateless/01518_nullable_aggregate_states1.reference b/tests/queries/0_stateless/01518_nullable_aggregate_states1.reference new file mode 100644 index 00000000000..91814440b35 --- /dev/null +++ b/tests/queries/0_stateless/01518_nullable_aggregate_states1.reference @@ -0,0 +1,5 @@ +1 0 \N \N \N \N \N +1 0 \N \N \N \N \N +--- empty resultset --- +0 0 \N \N \N \N \N +0 0 \N \N \N \N \N diff --git a/tests/queries/0_stateless/01518_nullable_aggregate_states1.sql b/tests/queries/0_stateless/01518_nullable_aggregate_states1.sql new file mode 100644 index 00000000000..5626369b042 --- /dev/null +++ b/tests/queries/0_stateless/01518_nullable_aggregate_states1.sql @@ -0,0 +1,17 @@ +select count(), count(a), max(a), min(a), avg(a), sum(a), any(a) +from (select cast(Null,'Nullable(Float64)') a); + +select countMerge(cnts), countMerge(cntsa), maxMerge(maxs), minMerge(mins), avgMerge(avgs), sumMerge(sums), anyMerge(anys) from ( +select countState() cnts, countState(a) cntsa, maxState(a) maxs, minState(a) mins, avgState(a) avgs, sumState(a) sums, anyState(a) anys +from (select cast(Null,'Nullable(Float64)') a)); + + +select '--- empty resultset ---'; + + +select count(), count(a), max(a), min(a), avg(a), sum(a), any(a) +from (select cast(1,'Nullable(Float64)') a) where a =0; + +select countMerge(cnts), countMerge(cntsa), maxMerge(maxs), minMerge(mins), avgMerge(avgs), sumMerge(sums), anyMerge(anys) from ( +select countState() cnts, countState(a) cntsa, maxState(a) maxs, minState(a) mins, avgState(a) avgs, sumState(a) sums, anyState(a) anys +from (select cast(1,'Nullable(Float64)') a) where a =0 ); diff --git a/tests/queries/0_stateless/01518_nullable_aggregate_states2.reference b/tests/queries/0_stateless/01518_nullable_aggregate_states2.reference new file mode 100644 index 00000000000..cb1a5a32ebf --- /dev/null +++ b/tests/queries/0_stateless/01518_nullable_aggregate_states2.reference @@ -0,0 +1,2020 @@ +100500 +2003 + ---- select without states ---- +-1 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N +-2 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N +-3 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N +-4 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N +-5 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N +0 102 0 99900 0 300 150 15150 0 300 150 15150 0.00000 300.00000 150.00000 15150.00000 2020-01-01 2020-01-02 2020-01-01 00:00:00 2020-01-02 03:45:00 2020-01-01 00:00:00.000 2020-01-02 03:45:00.000 0 99900 49950 5044950 0 99900 49950 5044950 -32569 32366 4529.009900990099 457430 -127 124 -2.9504950495049505 -298 +1 102 1 9991 0.003 300.003 150.003 15150.3033 0.003 300.003 150.003 15150.30329 0.00300 300.00300 150.00300 15150.30300 2020-01-01 2020-01-02 2020-01-01 00:00:01 2020-01-02 03:45:01 2020-01-01 00:00:01.000 2020-01-02 03:45:01.000 1 99901 49951 5045051 1 99901 49951 5045051 -32568 32367 4530.009900990099 457531 -126 125 -1.9504950495049505 -197 +10 102 10 99910 0.03003 300.03003 150.03003 15153.03303 0.03003 300.03003 150.03002 15153.03296 0.03003 300.03003 150.03003 15153.03303 2020-01-01 2020-01-02 2020-01-01 00:00:10 2020-01-02 03:45:10 2020-01-01 00:00:10.000 2020-01-02 03:45:10.000 10 99910 49960 5045960 10 99910 49960 5045960 -32559 32376 4539.009900990099 458440 -128 127 -0.5544554455445545 -56 +100 101 100 99001 0.3003 297.3003 148.8003 14880.03003 0.3003 297.3003 148.80029 14880.02962 0.30030 297.30030 148.80030 14880.03000 2020-01-01 2020-01-02 2020-01-01 00:01:40 2020-01-02 03:30:01 2020-01-01 00:01:40.000 2020-01-02 03:30:01.000 100 99001 49550.5 4955050 100 99001 49550.5 4955050 -32469 32466 4986.02 498602 -127 124 -0.86 -86 +101 101 10091 99002 0.3033 297.3033 148.8033 14880.33033 0.3033 297.3033 148.8033 14880.33035 0.30330 297.30330 148.80330 14880.33000 2020-01-01 2020-01-02 2020-01-01 00:01:41 2020-01-02 03:30:02 2020-01-01 00:01:41.000 2020-01-02 03:30:02.000 101 99002 49551.5 4955150 101 99002 49551.5 4955150 -32468 32467 4987.02 498702 -126 125 0.14 14 +102 101 10092 99003 0.3063 297.3063 148.8063 14880.63063 0.3063 297.3063 148.8063 14880.6305 0.30630 297.30630 148.80630 14880.63000 2020-01-01 2020-01-02 2020-01-01 00:01:42 2020-01-02 03:30:03 2020-01-01 00:01:42.000 2020-01-02 03:30:03.000 102 99003 49552.5 4955250 102 99003 49552.5 4955250 -32467 32468 4988.02 498802 -125 126 1.14 114 +103 101 10093 99004 0.3093 297.3093 148.8093 14880.93093 0.3093 297.3093 148.8093 14880.93085 0.30930 297.30930 148.80930 14880.93000 2020-01-01 2020-01-02 2020-01-01 00:01:43 2020-01-02 03:30:04 2020-01-01 00:01:43.000 2020-01-02 03:30:04.000 103 99004 49553.5 4955350 103 99004 49553.5 4955350 -32466 32469 4989.02 498902 -124 127 2.14 214 +104 101 10094 99005 0.31231 297.31231 148.81231 14881.23123 0.31231 297.31232 148.81231 14881.23144 0.31231 297.31231 148.81231 14881.23100 2020-01-01 2020-01-02 2020-01-01 00:01:44 2020-01-02 03:30:05 2020-01-01 00:01:44.000 2020-01-02 03:30:05.000 104 99005 49554.5 4955450 104 99005 49554.5 4955450 -32465 32470 4990.02 499002 -128 127 0.58 58 +105 101 10095 99006 0.31531 297.31531 148.81531 14881.53153 0.31531 297.3153 148.81531 14881.53174 0.31531 297.31531 148.81531 14881.53100 2020-01-01 2020-01-02 2020-01-01 00:01:45 2020-01-02 03:30:06 2020-01-01 00:01:45.000 2020-01-02 03:30:06.000 105 99006 49555.5 4955550 105 99006 49555.5 4955550 -32464 32471 4991.02 499102 -128 123 -0.98 -98 +106 101 10096 99007 0.31831 297.31831 148.81831 14881.83183 0.31831 297.31833 148.81831 14881.83182 0.31831 297.31831 148.81831 14881.83100 2020-01-01 2020-01-02 2020-01-01 00:01:46 2020-01-02 03:30:07 2020-01-01 00:01:46.000 2020-01-02 03:30:07.000 106 99007 49556.5 4955650 106 99007 49556.5 4955650 -32463 32472 4992.02 499202 -127 124 0.02 2 +107 101 10097 99008 0.32132 297.32132 148.82132 14882.13213 0.32132 297.32132 148.82131 14882.13197 0.32132 297.32132 148.82132 14882.13200 2020-01-01 2020-01-02 2020-01-01 00:01:47 2020-01-02 03:30:08 2020-01-01 00:01:47.000 2020-01-02 03:30:08.000 107 99008 49557.5 4955750 107 99008 49557.5 4955750 -32462 32473 4993.02 499302 -126 125 1.02 102 +108 101 10098 99009 0.32432 297.32432 148.82432 14882.43243 0.32432 297.3243 148.82432 14882.43232 0.32432 297.32432 148.82432 14882.43200 2020-01-01 2020-01-02 2020-01-01 00:01:48 2020-01-02 03:30:09 2020-01-01 00:01:48.000 2020-01-02 03:30:09.000 108 99009 49558.5 4955850 108 99009 49558.5 4955850 -32461 32474 4994.02 499402 -125 126 2.02 202 +109 101 10099 99010 0.32732 297.32732 148.82732 14882.73273 0.32732 297.32733 148.82732 14882.7329 0.32732 297.32732 148.82732 14882.73200 2020-01-01 2020-01-02 2020-01-01 00:01:49 2020-01-02 03:30:10 2020-01-01 00:01:49.000 2020-01-02 03:30:10.000 109 99010 49559.5 4955950 109 99010 49559.5 4955950 -32460 32475 4995.02 499502 -124 127 3.02 302 +11 102 10001 99911 0.03303 300.03303 150.03303 15153.33633 0.03303 300.03302 150.03303 15153.33627 0.03303 300.03303 150.03303 15153.33603 2020-01-01 2020-01-02 2020-01-01 00:00:11 2020-01-02 03:45:11 2020-01-01 00:00:11.000 2020-01-02 03:45:11.000 11 99911 49961 5046061 11 99911 49961 5046061 -32558 32377 4540.009900990099 458541 -128 123 -2.089108910891089 -211 +110 101 10100 99011 0.33033 297.33033 148.83033 14883.03303 0.33033 297.33032 148.83033 14883.03321 0.33033 297.33033 148.83033 14883.03300 2020-01-01 2020-01-02 2020-01-01 00:01:50 2020-01-02 03:30:11 2020-01-01 00:01:50.000 2020-01-02 03:30:11.000 110 99011 49560.5 4956050 110 99011 49560.5 4956050 -32459 32476 4996.02 499602 -128 127 1.46 146 +111 101 10101 99012 0.33333 297.33333 148.83333 14883.33333 0.33333 297.33334 148.83333 14883.33329 0.33333 297.33333 148.83333 14883.33300 2020-01-01 2020-01-02 2020-01-01 00:01:51 2020-01-02 03:30:12 2020-01-01 00:01:51.000 2020-01-02 03:30:12.000 111 99012 49561.5 4956150 111 99012 49561.5 4956150 -32458 32477 4997.02 499702 -128 123 -0.1 -10 +112 101 10102 99013 0.33633 297.33633 148.83633 14883.63363 0.33633 297.33633 148.83633 14883.63348 0.33633 297.33633 148.83633 14883.63300 2020-01-01 2020-01-02 2020-01-01 00:01:52 2020-01-02 03:30:13 2020-01-01 00:01:52.000 2020-01-02 03:30:13.000 112 99013 49562.5 4956250 112 99013 49562.5 4956250 -32457 32478 4998.02 499802 -127 124 0.9 90 +113 101 10103 99014 0.33933 297.33933 148.83933 14883.93393 0.33933 297.33932 148.83933 14883.9338 0.33933 297.33933 148.83933 14883.93300 2020-01-01 2020-01-02 2020-01-01 00:01:53 2020-01-02 03:30:14 2020-01-01 00:01:53.000 2020-01-02 03:30:14.000 113 99014 49563.5 4956350 113 99014 49563.5 4956350 -32456 32479 4999.02 499902 -126 125 1.9 190 +114 101 10104 99015 0.34234 297.34234 148.84234 14884.23423 0.34234 297.34235 148.84234 14884.23437 0.34234 297.34234 148.84234 14884.23400 2020-01-01 2020-01-02 2020-01-01 00:01:54 2020-01-02 03:30:15 2020-01-01 00:01:54.000 2020-01-02 03:30:15.000 114 99015 49564.5 4956450 114 99015 49564.5 4956450 -32455 32480 5000.02 500002 -125 126 2.9 290 +115 101 10105 99016 0.34534 297.34534 148.84534 14884.53453 0.34534 297.34534 148.84534 14884.53468 0.34534 297.34534 148.84534 14884.53400 2020-01-01 2020-01-02 2020-01-01 00:01:55 2020-01-02 03:30:16 2020-01-01 00:01:55.000 2020-01-02 03:30:16.000 115 99016 49565.5 4956550 115 99016 49565.5 4956550 -32454 32481 5001.02 500102 -124 127 3.9 390 +116 101 10106 99017 0.34834 297.34834 148.84834 14884.83483 0.34834 297.34836 148.84834 14884.83476 0.34834 297.34834 148.84834 14884.83400 2020-01-01 2020-01-02 2020-01-01 00:01:56 2020-01-02 03:30:17 2020-01-01 00:01:56.000 2020-01-02 03:30:17.000 116 99017 49566.5 4956650 116 99017 49566.5 4956650 -32453 32482 5002.02 500202 -128 127 2.34 234 +117 101 10107 99018 0.35135 297.35135 148.85135 14885.13513 0.35135 297.35135 148.85134 14885.13495 0.35135 297.35135 148.85135 14885.13500 2020-01-01 2020-01-02 2020-01-01 00:01:57 2020-01-02 03:30:18 2020-01-01 00:01:57.000 2020-01-02 03:30:18.000 117 99018 49567.5 4956750 117 99018 49567.5 4956750 -32452 32483 5003.02 500302 -128 123 0.78 78 +118 101 10108 99019 0.35435 297.35435 148.85435 14885.43543 0.35435 297.35434 148.85435 14885.43526 0.35435 297.35435 148.85435 14885.43500 2020-01-01 2020-01-02 2020-01-01 00:01:58 2020-01-02 03:30:19 2020-01-01 00:01:58.000 2020-01-02 03:30:19.000 118 99019 49568.5 4956850 118 99019 49568.5 4956850 -32451 32484 5004.02 500402 -127 124 1.78 178 +119 101 10109 99020 0.35735 297.35735 148.85735 14885.73573 0.35735 297.35736 148.85736 14885.736 0.35735 297.35735 148.85735 14885.73500 2020-01-01 2020-01-02 2020-01-01 00:01:59 2020-01-02 03:30:20 2020-01-01 00:01:59.000 2020-01-02 03:30:20.000 119 99020 49569.5 4956950 119 99020 49569.5 4956950 -32450 32485 5005.02 500502 -126 125 2.78 278 +12 102 10002 99912 0.03603 300.03603 150.03603 15153.63963 0.03603 300.03604 150.03603 15153.6399 0.03603 300.03603 150.03603 15153.63903 2020-01-01 2020-01-02 2020-01-01 00:00:12 2020-01-02 03:45:12 2020-01-01 00:00:12.000 2020-01-02 03:45:12.000 12 99912 49962 5046162 12 99912 49962 5046162 -32557 32378 4541.009900990099 458642 -127 124 -1.0891089108910892 -110 +120 101 10110 99021 0.36036 297.36036 148.86036 14886.03603 0.36036 297.36035 148.86036 14886.03615 0.36036 297.36036 148.86036 14886.03600 2020-01-01 2020-01-02 2020-01-01 00:02:00 2020-01-02 03:30:21 2020-01-01 00:02:00.000 2020-01-02 03:30:21.000 120 99021 49570.5 4957050 120 99021 49570.5 4957050 -32449 32486 5006.02 500602 -125 126 3.78 378 +121 101 10111 99022 0.36336 297.36336 148.86336 14886.33633 0.36336 297.36337 148.86336 14886.33627 0.36336 297.36336 148.86336 14886.33600 2020-01-01 2020-01-02 2020-01-01 00:02:01 2020-01-02 03:30:22 2020-01-01 00:02:01.000 2020-01-02 03:30:22.000 121 99022 49571.5 4957150 121 99022 49571.5 4957150 -32448 32487 5007.02 500702 -124 127 4.78 478 +122 101 10112 99023 0.36636 297.36636 148.86636 14886.63663 0.36636 297.36636 148.86636 14886.63642 0.36636 297.36636 148.86636 14886.63600 2020-01-01 2020-01-02 2020-01-01 00:02:02 2020-01-02 03:30:23 2020-01-01 00:02:02.000 2020-01-02 03:30:23.000 122 99023 49572.5 4957250 122 99023 49572.5 4957250 -32447 32488 5008.02 500802 -128 127 3.22 322 +123 101 10113 99024 0.36936 297.36936 148.86936 14886.93693 0.36936 297.36935 148.86936 14886.93673 0.36936 297.36936 148.86936 14886.93600 2020-01-01 2020-01-02 2020-01-01 00:02:03 2020-01-02 03:30:24 2020-01-01 00:02:03.000 2020-01-02 03:30:24.000 123 99024 49573.5 4957350 123 99024 49573.5 4957350 -32446 32489 5009.02 500902 -128 127 1.66 166 +124 101 10114 99025 0.37237 297.37237 148.87237 14887.23723 0.37237 297.37238 148.87237 14887.23746 0.37237 297.37237 148.87237 14887.23700 2020-01-01 2020-01-02 2020-01-01 00:02:04 2020-01-02 03:30:25 2020-01-01 00:02:04.000 2020-01-02 03:30:25.000 124 99025 49574.5 4957450 124 99025 49574.5 4957450 -32445 32490 5010.02 501002 -128 124 0.1 10 +125 101 10115 99026 0.37537 297.37537 148.87537 14887.53753 0.37537 297.37537 148.87537 14887.53762 0.37537 297.37537 148.87537 14887.53700 2020-01-01 2020-01-02 2020-01-01 00:02:05 2020-01-02 03:30:26 2020-01-01 00:02:05.000 2020-01-02 03:30:26.000 125 99026 49575.5 4957550 125 99026 49575.5 4957550 -32444 32491 5011.02 501102 -127 125 1.1 110 +126 101 10116 99027 0.37837 297.37837 148.87837 14887.83783 0.37837 297.3784 148.87837 14887.83774 0.37837 297.37837 148.87837 14887.83700 2020-01-01 2020-01-02 2020-01-01 00:02:06 2020-01-02 03:30:27 2020-01-01 00:02:06.000 2020-01-02 03:30:27.000 126 99027 49576.5 4957650 126 99027 49576.5 4957650 -32443 32492 5012.02 501202 -126 126 2.1 210 +127 101 10117 99028 0.38138 297.38138 148.88138 14888.13813 0.38138 297.38138 148.88137 14888.13789 0.38138 297.38138 148.88138 14888.13800 2020-01-01 2020-01-02 2020-01-01 00:02:07 2020-01-02 03:30:28 2020-01-01 00:02:07.000 2020-01-02 03:30:28.000 127 99028 49577.5 4957750 127 99028 49577.5 4957750 -32442 32493 5013.02 501302 -125 127 3.1 310 +128 101 10118 99029 0.38438 297.38438 148.88438 14888.43843 0.38438 297.3844 148.88438 14888.43862 0.38438 297.38438 148.88438 14888.43800 2020-01-01 2020-01-02 2020-01-01 00:02:08 2020-01-02 03:30:29 2020-01-01 00:02:08.000 2020-01-02 03:30:29.000 128 99029 49578.5 4957850 128 99029 49578.5 4957850 -32441 32494 5014.02 501402 -128 127 1.54 154 +129 101 10119 99030 0.38738 297.38738 148.88738 14888.73873 0.38738 297.3874 148.88738 14888.73894 0.38738 297.38738 148.88738 14888.73800 2020-01-01 2020-01-02 2020-01-01 00:02:09 2020-01-02 03:30:30 2020-01-01 00:02:09.000 2020-01-02 03:30:30.000 129 99030 49579.5 4957950 129 99030 49579.5 4957950 -32440 32495 5015.02 501502 -128 127 -0.02 -2 +13 102 10003 99913 0.03903 300.03903 150.03903 15153.94294 0.03903 300.03903 150.03903 15153.94255 0.03903 300.03903 150.03903 15153.94203 2020-01-01 2020-01-02 2020-01-01 00:00:13 2020-01-02 03:45:13 2020-01-01 00:00:13.000 2020-01-02 03:45:13.000 13 99913 49963 5046263 13 99913 49963 5046263 -32556 32379 4542.009900990099 458743 -126 125 -0.0891089108910891 -9 +130 101 10120 99031 0.39039 297.39039 148.89039 14889.03903 0.39039 297.39038 148.89039 14889.03909 0.39039 297.39039 148.89039 14889.03900 2020-01-01 2020-01-02 2020-01-01 00:02:10 2020-01-02 03:30:31 2020-01-01 00:02:10.000 2020-01-02 03:30:31.000 130 99031 49580.5 4958050 130 99031 49580.5 4958050 -32439 32496 5016.02 501602 -128 123 -1.58 -158 +131 101 10121 99032 0.39339 297.39339 148.89339 14889.33933 0.39339 297.3934 148.89339 14889.33921 0.39339 297.39339 148.89339 14889.33900 2020-01-01 2020-01-02 2020-01-01 00:02:11 2020-01-02 03:30:32 2020-01-01 00:02:11.000 2020-01-02 03:30:32.000 131 99032 49581.5 4958150 131 99032 49581.5 4958150 -32438 32497 5017.02 501702 -127 124 -0.58 -58 +132 101 10122 99033 0.39639 297.39639 148.89639 14889.63963 0.39639 297.3964 148.89639 14889.63936 0.39639 297.39639 148.89639 14889.63900 2020-01-01 2020-01-02 2020-01-01 00:02:12 2020-01-02 03:30:33 2020-01-01 00:02:12.000 2020-01-02 03:30:33.000 132 99033 49582.5 4958250 132 99033 49582.5 4958250 -32437 32498 5018.02 501802 -126 125 0.42 42 +133 101 10123 99034 0.39939 297.39939 148.89939 14889.93993 0.39939 297.3994 148.8994 14889.94009 0.39939 297.39939 148.89939 14889.93900 2020-01-01 2020-01-02 2020-01-01 00:02:13 2020-01-02 03:30:34 2020-01-01 00:02:13.000 2020-01-02 03:30:34.000 133 99034 49583.5 4958350 133 99034 49583.5 4958350 -32436 32499 5019.02 501902 -125 126 1.42 142 +134 101 10124 99035 0.4024 297.4024 148.9024 14890.24024 0.4024 297.4024 148.9024 14890.24041 0.40240 297.40240 148.90240 14890.24000 2020-01-01 2020-01-02 2020-01-01 00:02:14 2020-01-02 03:30:35 2020-01-01 00:02:14.000 2020-01-02 03:30:35.000 134 99035 49584.5 4958450 134 99035 49584.5 4958450 -32435 32500 5020.02 502002 -124 127 2.42 242 +135 101 10125 99036 0.4054 297.4054 148.9054 14890.54054 0.4054 297.4054 148.9054 14890.54059 0.40540 297.40540 148.90540 14890.54000 2020-01-01 2020-01-02 2020-01-01 00:02:15 2020-01-02 03:30:36 2020-01-01 00:02:15.000 2020-01-02 03:30:36.000 135 99036 49585.5 4958550 135 99036 49585.5 4958550 -32434 32501 5021.02 502102 -128 127 0.86 86 +136 101 10126 99037 0.4084 297.4084 148.9084 14890.84084 0.4084 297.40842 148.9084 14890.84068 0.40840 297.40840 148.90840 14890.84000 2020-01-01 2020-01-02 2020-01-01 00:02:16 2020-01-02 03:30:37 2020-01-01 00:02:16.000 2020-01-02 03:30:37.000 136 99037 49586.5 4958650 136 99037 49586.5 4958650 -32433 32502 5022.02 502202 -128 123 -0.7 -70 +137 101 10127 99038 0.41141 297.41141 148.91141 14891.14114 0.41141 297.4114 148.9114 14891.14099 0.41141 297.41141 148.91141 14891.14100 2020-01-01 2020-01-02 2020-01-01 00:02:17 2020-01-02 03:30:38 2020-01-01 00:02:17.000 2020-01-02 03:30:38.000 137 99038 49587.5 4958750 137 99038 49587.5 4958750 -32432 32503 5023.02 502302 -127 124 0.3 30 +138 101 10128 99039 0.41441 297.41441 148.91441 14891.44144 0.41441 297.41443 148.91441 14891.44157 0.41441 297.41441 148.91441 14891.44100 2020-01-01 2020-01-02 2020-01-01 00:02:18 2020-01-02 03:30:39 2020-01-01 00:02:18.000 2020-01-02 03:30:39.000 138 99039 49588.5 4958850 138 99039 49588.5 4958850 -32431 32504 5024.02 502402 -126 125 1.3 130 +139 101 10129 99040 0.41741 297.41741 148.91741 14891.74174 0.41741 297.41742 148.91741 14891.74188 0.41741 297.41741 148.91741 14891.74100 2020-01-01 2020-01-02 2020-01-01 00:02:19 2020-01-02 03:30:40 2020-01-01 00:02:19.000 2020-01-02 03:30:40.000 139 99040 49589.5 4958950 139 99040 49589.5 4958950 -32430 32505 5025.02 502502 -125 126 2.3 230 +14 102 10004 99914 0.04204 300.04204 150.04204 15154.24624 0.04204 300.04205 150.04204 15154.2463 0.04204 300.04204 150.04204 15154.24604 2020-01-01 2020-01-02 2020-01-01 00:00:14 2020-01-02 03:45:14 2020-01-01 00:00:14.000 2020-01-02 03:45:14.000 14 99914 49964 5046364 14 99914 49964 5046364 -32555 32380 4543.009900990099 458844 -125 126 0.9108910891089109 92 +140 101 10130 99041 0.42042 297.42042 148.92042 14892.04204 0.42042 297.4204 148.92042 14892.04206 0.42042 297.42042 148.92042 14892.04200 2020-01-01 2020-01-02 2020-01-01 00:02:20 2020-01-02 03:30:41 2020-01-01 00:02:20.000 2020-01-02 03:30:41.000 140 99041 49590.5 4959050 140 99041 49590.5 4959050 -32429 32506 5026.02 502602 -124 127 3.3 330 +141 101 10131 99042 0.42342 297.42342 148.92342 14892.34234 0.42342 297.42343 148.92342 14892.34215 0.42342 297.42342 148.92342 14892.34200 2020-01-01 2020-01-02 2020-01-01 00:02:21 2020-01-02 03:30:42 2020-01-01 00:02:21.000 2020-01-02 03:30:42.000 141 99042 49591.5 4959150 141 99042 49591.5 4959150 -32428 32507 5027.02 502702 -128 127 1.74 174 +142 101 10132 99043 0.42642 297.42642 148.92642 14892.64264 0.42642 297.42642 148.92642 14892.64246 0.42642 297.42642 148.92642 14892.64200 2020-01-01 2020-01-02 2020-01-01 00:02:22 2020-01-02 03:30:43 2020-01-01 00:02:22.000 2020-01-02 03:30:43.000 142 99043 49592.5 4959250 142 99043 49592.5 4959250 -32427 32508 5028.02 502802 -128 123 0.18 18 +143 101 10133 99044 0.42942 297.42942 148.92942 14892.94294 0.42942 297.42944 148.92943 14892.94304 0.42942 297.42942 148.92942 14892.94200 2020-01-01 2020-01-02 2020-01-01 00:02:23 2020-01-02 03:30:44 2020-01-01 00:02:23.000 2020-01-02 03:30:44.000 143 99044 49593.5 4959350 143 99044 49593.5 4959350 -32426 32509 5029.02 502902 -127 124 1.18 118 +144 101 10134 99045 0.43243 297.43243 148.93243 14893.24324 0.43243 297.43243 148.93243 14893.24338 0.43243 297.43243 148.93243 14893.24300 2020-01-01 2020-01-02 2020-01-01 00:02:24 2020-01-02 03:30:45 2020-01-01 00:02:24.000 2020-01-02 03:30:45.000 144 99045 49594.5 4959450 144 99045 49594.5 4959450 -32425 32510 5030.02 503002 -126 125 2.18 218 +145 101 10135 99046 0.43543 297.43543 148.93543 14893.54354 0.43543 297.43542 148.93543 14893.54354 0.43543 297.43543 148.93543 14893.54300 2020-01-01 2020-01-02 2020-01-01 00:02:25 2020-01-02 03:30:46 2020-01-01 00:02:25.000 2020-01-02 03:30:46.000 145 99046 49595.5 4959550 145 99046 49595.5 4959550 -32424 32511 5031.02 503102 -125 126 3.18 318 +146 101 10136 99047 0.43843 297.43843 148.93843 14893.84384 0.43843 297.43845 148.93844 14893.84427 0.43843 297.43843 148.93843 14893.84300 2020-01-01 2020-01-02 2020-01-01 00:02:26 2020-01-02 03:30:47 2020-01-01 00:02:26.000 2020-01-02 03:30:47.000 146 99047 49596.5 4959650 146 99047 49596.5 4959650 -32423 32512 5032.02 503202 -124 127 4.18 418 +147 101 10137 99048 0.44144 297.44144 148.94144 14894.14414 0.44144 297.44144 148.94143 14894.14392 0.44144 297.44144 148.94144 14894.14400 2020-01-01 2020-01-02 2020-01-01 00:02:27 2020-01-02 03:30:48 2020-01-01 00:02:27.000 2020-01-02 03:30:48.000 147 99048 49597.5 4959750 147 99048 49597.5 4959750 -32422 32513 5033.02 503302 -128 127 2.62 262 +148 101 10138 99049 0.44444 297.44444 148.94444 14894.44444 0.44444 297.44446 148.94444 14894.4445 0.44444 297.44444 148.94444 14894.44400 2020-01-01 2020-01-02 2020-01-01 00:02:28 2020-01-02 03:30:49 2020-01-01 00:02:28.000 2020-01-02 03:30:49.000 148 99049 49598.5 4959850 148 99049 49598.5 4959850 -32421 32514 5034.02 503402 -128 127 1.06 106 +149 101 10139 99050 0.44744 297.44744 148.94744 14894.74474 0.44744 297.44745 148.94744 14894.74485 0.44744 297.44744 148.94744 14894.74400 2020-01-01 2020-01-02 2020-01-01 00:02:29 2020-01-02 03:30:50 2020-01-01 00:02:29.000 2020-01-02 03:30:50.000 149 99050 49599.5 4959950 149 99050 49599.5 4959950 -32420 32515 5035.02 503502 -128 124 -0.5 -50 +15 102 10005 99915 0.04504 300.04504 150.04504 15154.54954 0.04504 300.04504 150.04504 15154.54945 0.04504 300.04504 150.04504 15154.54904 2020-01-01 2020-01-02 2020-01-01 00:00:15 2020-01-02 03:45:15 2020-01-01 00:00:15.000 2020-01-02 03:45:15.000 15 99915 49965 5046465 15 99915 49965 5046465 -32554 32381 4544.009900990099 458945 -124 127 1.9108910891089108 193 +150 101 10140 99051 0.45045 297.45045 148.95045 14895.04504 0.45045 297.45044 148.95045 14895.04501 0.45045 297.45045 148.95045 14895.04500 2020-01-01 2020-01-02 2020-01-01 00:02:30 2020-01-02 03:30:51 2020-01-01 00:02:30.000 2020-01-02 03:30:51.000 150 99051 49600.5 4960050 150 99051 49600.5 4960050 -32419 32516 5036.02 503602 -127 125 0.5 50 +151 101 10141 99052 0.45345 297.45345 148.95345 14895.34534 0.45345 297.45346 148.95345 14895.34574 0.45345 297.45345 148.95345 14895.34500 2020-01-01 2020-01-02 2020-01-01 00:02:31 2020-01-02 03:30:52 2020-01-01 00:02:31.000 2020-01-02 03:30:52.000 151 99052 49601.5 4960150 151 99052 49601.5 4960150 -32418 32517 5037.02 503702 -126 126 1.5 150 +152 101 10142 99053 0.45645 297.45645 148.95645 14895.64564 0.45645 297.45645 148.95645 14895.6454 0.45645 297.45645 148.95645 14895.64500 2020-01-01 2020-01-02 2020-01-01 00:02:32 2020-01-02 03:30:53 2020-01-01 00:02:32.000 2020-01-02 03:30:53.000 152 99053 49602.5 4960250 152 99053 49602.5 4960250 -32417 32518 5038.02 503802 -125 127 2.5 250 +153 101 10143 99054 0.45945 297.45945 148.95945 14895.94594 0.45945 297.45947 148.95946 14895.94601 0.45945 297.45945 148.95945 14895.94500 2020-01-01 2020-01-02 2020-01-01 00:02:33 2020-01-02 03:30:54 2020-01-01 00:02:33.000 2020-01-02 03:30:54.000 153 99054 49603.5 4960350 153 99054 49603.5 4960350 -32416 32519 5039.02 503902 -128 127 0.94 94 +154 101 10144 99055 0.46246 297.46246 148.96246 14896.24624 0.46246 297.46246 148.96246 14896.24633 0.46246 297.46246 148.96246 14896.24600 2020-01-01 2020-01-02 2020-01-01 00:02:34 2020-01-02 03:30:55 2020-01-01 00:02:34.000 2020-01-02 03:30:55.000 154 99055 49604.5 4960450 154 99055 49604.5 4960450 -32415 32520 5040.02 504002 -128 127 -0.62 -62 +155 101 10145 99056 0.46546 297.46546 148.96546 14896.54654 0.46546 297.46545 148.96546 14896.54647 0.46546 297.46546 148.96546 14896.54600 2020-01-01 2020-01-02 2020-01-01 00:02:35 2020-01-02 03:30:56 2020-01-01 00:02:35.000 2020-01-02 03:30:56.000 155 99056 49605.5 4960550 155 99056 49605.5 4960550 -32414 32521 5041.02 504102 -128 123 -2.18 -218 +156 101 10146 99057 0.46846 297.46846 148.96846 14896.84684 0.46846 297.46848 148.96847 14896.84721 0.46846 297.46846 148.96846 14896.84600 2020-01-01 2020-01-02 2020-01-01 00:02:36 2020-01-02 03:30:57 2020-01-01 00:02:36.000 2020-01-02 03:30:57.000 156 99057 49606.5 4960650 156 99057 49606.5 4960650 -32413 32522 5042.02 504202 -127 124 -1.18 -118 +157 101 10147 99058 0.47147 297.47147 148.97147 14897.14714 0.47147 297.47147 148.97146 14897.14687 0.47147 297.47147 148.97147 14897.14700 2020-01-01 2020-01-02 2020-01-01 00:02:37 2020-01-02 03:30:58 2020-01-01 00:02:37.000 2020-01-02 03:30:58.000 157 99058 49607.5 4960750 157 99058 49607.5 4960750 -32412 32523 5043.02 504302 -126 125 -0.18 -18 +158 101 10148 99059 0.47447 297.47447 148.97447 14897.44744 0.47447 297.4745 148.97447 14897.44748 0.47447 297.47447 148.97447 14897.44700 2020-01-01 2020-01-02 2020-01-01 00:02:38 2020-01-02 03:30:59 2020-01-01 00:02:38.000 2020-01-02 03:30:59.000 158 99059 49608.5 4960850 158 99059 49608.5 4960850 -32411 32524 5044.02 504402 -125 126 0.82 82 +159 101 10149 99060 0.47747 297.47747 148.97747 14897.74774 0.47747 297.47748 148.97747 14897.74779 0.47747 297.47747 148.97747 14897.74700 2020-01-01 2020-01-02 2020-01-01 00:02:39 2020-01-02 03:31:00 2020-01-01 00:02:39.000 2020-01-02 03:31:00.000 159 99060 49609.5 4960950 159 99060 49609.5 4960950 -32410 32525 5045.02 504502 -124 127 1.82 182 +16 102 10006 99916 0.04804 300.04804 150.04804 15154.85285 0.04804 300.04803 150.04804 15154.85279 0.04804 300.04804 150.04804 15154.85204 2020-01-01 2020-01-02 2020-01-01 00:00:16 2020-01-02 03:45:16 2020-01-01 00:00:16.000 2020-01-02 03:45:16.000 16 99916 49966 5046566 16 99916 49966 5046566 -32553 32382 4545.009900990099 459046 -128 127 0.37623762376237624 38 +160 101 10150 99061 0.48048 297.48048 148.98048 14898.04804 0.48048 297.48047 148.98048 14898.0481 0.48048 297.48048 148.98048 14898.04800 2020-01-01 2020-01-02 2020-01-01 00:02:40 2020-01-02 03:31:01 2020-01-01 00:02:40.000 2020-01-02 03:31:01.000 160 99061 49610.5 4961050 160 99061 49610.5 4961050 -32409 32526 5046.02 504602 -128 127 0.26 26 +161 101 10151 99062 0.48348 297.48348 148.98348 14898.34834 0.48348 297.4835 148.98348 14898.34868 0.48348 297.48348 148.98348 14898.34800 2020-01-01 2020-01-02 2020-01-01 00:02:41 2020-01-02 03:31:02 2020-01-01 00:02:41.000 2020-01-02 03:31:02.000 161 99062 49611.5 4961150 161 99062 49611.5 4961150 -32408 32527 5047.02 504702 -128 123 -1.3 -130 +162 101 10152 99063 0.48648 297.48648 148.98648 14898.64864 0.48648 297.48648 148.98648 14898.64837 0.48648 297.48648 148.98648 14898.64800 2020-01-01 2020-01-02 2020-01-01 00:02:42 2020-01-02 03:31:03 2020-01-01 00:02:42.000 2020-01-02 03:31:03.000 162 99063 49612.5 4961250 162 99063 49612.5 4961250 -32407 32528 5048.02 504802 -127 124 -0.3 -30 +163 101 10153 99064 0.48948 297.48948 148.98948 14898.94894 0.48948 297.4895 148.98948 14898.94895 0.48948 297.48948 148.98948 14898.94800 2020-01-01 2020-01-02 2020-01-01 00:02:43 2020-01-02 03:31:04 2020-01-01 00:02:43.000 2020-01-02 03:31:04.000 163 99064 49613.5 4961350 163 99064 49613.5 4961350 -32406 32529 5049.02 504902 -126 125 0.7 70 +164 101 10154 99065 0.49249 297.49249 148.99249 14899.24924 0.49249 297.4925 148.99249 14899.24926 0.49249 297.49249 148.99249 14899.24900 2020-01-01 2020-01-02 2020-01-01 00:02:44 2020-01-02 03:31:05 2020-01-01 00:02:44.000 2020-01-02 03:31:05.000 164 99065 49614.5 4961450 164 99065 49614.5 4961450 -32405 32530 5050.02 505002 -125 126 1.7 170 +165 101 10155 99066 0.49549 297.49549 148.99549 14899.54954 0.49549 297.49548 148.99549 14899.54957 0.49549 297.49549 148.99549 14899.54900 2020-01-01 2020-01-02 2020-01-01 00:02:45 2020-01-02 03:31:06 2020-01-01 00:02:45.000 2020-01-02 03:31:06.000 165 99066 49615.5 4961550 165 99066 49615.5 4961550 -32404 32531 5051.02 505102 -124 127 2.7 270 +166 101 10156 99067 0.49849 297.49849 148.99849 14899.84984 0.49849 297.4985 148.9985 14899.85015 0.49849 297.49849 148.99849 14899.84900 2020-01-01 2020-01-02 2020-01-01 00:02:46 2020-01-02 03:31:07 2020-01-01 00:02:46.000 2020-01-02 03:31:07.000 166 99067 49616.5 4961650 166 99067 49616.5 4961650 -32403 32532 5052.02 505202 -128 127 1.14 114 +167 101 10157 99068 0.5015 297.5015 149.0015 14900.15015 0.5015 297.5015 149.00149 14900.14984 0.50150 297.50150 149.00150 14900.15000 2020-01-01 2020-01-02 2020-01-01 00:02:47 2020-01-02 03:31:08 2020-01-01 00:02:47.000 2020-01-02 03:31:08.000 167 99068 49617.5 4961750 167 99068 49617.5 4961750 -32402 32533 5053.02 505302 -128 123 -0.42 -42 +168 101 10158 99069 0.5045 297.5045 149.0045 14900.45045 0.5045 297.50452 149.0045 14900.45042 0.50450 297.50450 149.00450 14900.45000 2020-01-01 2020-01-02 2020-01-01 00:02:48 2020-01-02 03:31:09 2020-01-01 00:02:48.000 2020-01-02 03:31:09.000 168 99069 49618.5 4961850 168 99069 49618.5 4961850 -32401 32534 5054.02 505402 -127 124 0.58 58 +169 101 10159 99070 0.5075 297.5075 149.0075 14900.75075 0.5075 297.5075 149.0075 14900.75073 0.50750 297.50750 149.00750 14900.75000 2020-01-01 2020-01-02 2020-01-01 00:02:49 2020-01-02 03:31:10 2020-01-01 00:02:49.000 2020-01-02 03:31:10.000 169 99070 49619.5 4961950 169 99070 49619.5 4961950 -32400 32535 5055.02 505502 -126 125 1.58 158 +17 102 10007 99917 0.05105 300.05105 150.05105 15155.15615 0.05105 300.05106 150.05105 15155.15638 0.05105 300.05105 150.05105 15155.15605 2020-01-01 2020-01-02 2020-01-01 00:00:17 2020-01-02 03:45:17 2020-01-01 00:00:17.000 2020-01-02 03:45:17.000 17 99917 49967 5046667 17 99917 49967 5046667 -32552 32383 4546.009900990099 459147 -128 127 -1.1584158415841583 -117 +170 101 10160 99071 0.51051 297.51051 149.01051 14901.05105 0.51051 297.5105 149.01051 14901.05104 0.51051 297.51051 149.01051 14901.05100 2020-01-01 2020-01-02 2020-01-01 00:02:50 2020-01-02 03:31:11 2020-01-01 00:02:50.000 2020-01-02 03:31:11.000 170 99071 49620.5 4962050 170 99071 49620.5 4962050 -32399 32536 5056.02 505602 -125 126 2.58 258 +171 101 10161 99072 0.51351 297.51351 149.01351 14901.35135 0.51351 297.51352 149.01351 14901.35162 0.51351 297.51351 149.01351 14901.35100 2020-01-01 2020-01-02 2020-01-01 00:02:51 2020-01-02 03:31:12 2020-01-01 00:02:51.000 2020-01-02 03:31:12.000 171 99072 49621.5 4962150 171 99072 49621.5 4962150 -32398 32537 5057.02 505702 -124 127 3.58 358 +172 101 10162 99073 0.51651 297.51651 149.01651 14901.65165 0.51651 297.5165 149.01651 14901.65131 0.51651 297.51651 149.01651 14901.65100 2020-01-01 2020-01-02 2020-01-01 00:02:52 2020-01-02 03:31:13 2020-01-01 00:02:52.000 2020-01-02 03:31:13.000 172 99073 49622.5 4962250 172 99073 49622.5 4962250 -32397 32538 5058.02 505802 -128 127 2.02 202 +173 101 10163 99074 0.51951 297.51951 149.01951 14901.95195 0.51951 297.51953 149.01951 14901.95189 0.51951 297.51951 149.01951 14901.95100 2020-01-01 2020-01-02 2020-01-01 00:02:53 2020-01-02 03:31:14 2020-01-01 00:02:53.000 2020-01-02 03:31:14.000 173 99074 49623.5 4962350 173 99074 49623.5 4962350 -32396 32539 5059.02 505902 -128 127 0.46 46 +174 101 10164 99075 0.52252 297.52252 149.02252 14902.25225 0.52252 297.52252 149.02252 14902.2522 0.52252 297.52252 149.02252 14902.25200 2020-01-01 2020-01-02 2020-01-01 00:02:54 2020-01-02 03:31:15 2020-01-01 00:02:54.000 2020-01-02 03:31:15.000 174 99075 49624.5 4962450 174 99075 49624.5 4962450 -32395 32540 5060.02 506002 -128 124 -1.1 -110 +175 101 10165 99076 0.52552 297.52552 149.02552 14902.55255 0.52552 297.5255 149.02552 14902.55251 0.52552 297.52552 149.02552 14902.55200 2020-01-01 2020-01-02 2020-01-01 00:02:55 2020-01-02 03:31:16 2020-01-01 00:02:55.000 2020-01-02 03:31:16.000 175 99076 49625.5 4962550 175 99076 49625.5 4962550 -32394 32541 5061.02 506102 -127 125 -0.1 -10 +176 101 10166 99077 0.52852 297.52852 149.02852 14902.85285 0.52852 297.52853 149.02853 14902.85312 0.52852 297.52852 149.02852 14902.85200 2020-01-01 2020-01-02 2020-01-01 00:02:56 2020-01-02 03:31:17 2020-01-01 00:02:56.000 2020-01-02 03:31:17.000 176 99077 49626.5 4962650 176 99077 49626.5 4962650 -32393 32542 5062.02 506202 -126 126 0.9 90 +177 101 10167 99078 0.53153 297.53153 149.03153 14903.15315 0.53153 297.53152 149.03152 14903.15278 0.53153 297.53153 149.03153 14903.15300 2020-01-01 2020-01-02 2020-01-01 00:02:57 2020-01-02 03:31:18 2020-01-01 00:02:57.000 2020-01-02 03:31:18.000 177 99078 49627.5 4962750 177 99078 49627.5 4962750 -32392 32543 5063.02 506302 -125 127 1.9 190 +178 101 10168 99079 0.53453 297.53453 149.03453 14903.45345 0.53453 297.53455 149.03453 14903.45352 0.53453 297.53453 149.03453 14903.45300 2020-01-01 2020-01-02 2020-01-01 00:02:58 2020-01-02 03:31:19 2020-01-01 00:02:58.000 2020-01-02 03:31:19.000 178 99079 49628.5 4962850 178 99079 49628.5 4962850 -32391 32544 5064.02 506402 -128 127 0.34 34 +179 101 10169 99080 0.53753 297.53753 149.03753 14903.75375 0.53753 297.53754 149.03753 14903.75366 0.53753 297.53753 149.03753 14903.75300 2020-01-01 2020-01-02 2020-01-01 00:02:59 2020-01-02 03:31:20 2020-01-01 00:02:59.000 2020-01-02 03:31:20.000 179 99080 49629.5 4962950 179 99080 49629.5 4962950 -32390 32545 5065.02 506502 -128 127 -1.22 -122 +18 102 10008 99918 0.05405 300.05405 150.05405 15155.45945 0.05405 300.05405 150.05404 15155.45903 0.05405 300.05405 150.05405 15155.45905 2020-01-01 2020-01-02 2020-01-01 00:00:18 2020-01-02 03:45:18 2020-01-01 00:00:18.000 2020-01-02 03:45:18.000 18 99918 49968 5046768 18 99918 49968 5046768 -32551 32384 4547.009900990099 459248 -128 124 -2.6930693069306932 -272 +180 101 10170 99081 0.54054 297.54054 149.04054 14904.05405 0.54054 297.54053 149.04053 14904.05398 0.54054 297.54054 149.04054 14904.05400 2020-01-01 2020-01-02 2020-01-01 00:03:00 2020-01-02 03:31:21 2020-01-01 00:03:00.000 2020-01-02 03:31:21.000 180 99081 49630.5 4963050 180 99081 49630.5 4963050 -32389 32546 5066.02 506602 -128 123 -2.78 -278 +181 101 10171 99082 0.54354 297.54354 149.04354 14904.35435 0.54354 297.54355 149.04354 14904.35459 0.54354 297.54354 149.04354 14904.35400 2020-01-01 2020-01-02 2020-01-01 00:03:01 2020-01-02 03:31:22 2020-01-01 00:03:01.000 2020-01-02 03:31:22.000 181 99082 49631.5 4963150 181 99082 49631.5 4963150 -32388 32547 5067.02 506702 -127 124 -1.78 -178 +182 101 10172 99083 0.54654 297.54654 149.04654 14904.65465 0.54654 297.54654 149.04654 14904.65425 0.54654 297.54654 149.04654 14904.65400 2020-01-01 2020-01-02 2020-01-01 00:03:02 2020-01-02 03:31:23 2020-01-01 00:03:02.000 2020-01-02 03:31:23.000 182 99083 49632.5 4963250 182 99083 49632.5 4963250 -32387 32548 5068.02 506802 -126 125 -0.78 -78 +183 101 10173 99084 0.54954 297.54954 149.04954 14904.95495 0.54954 297.54956 149.04954 14904.95498 0.54954 297.54954 149.04954 14904.95400 2020-01-01 2020-01-02 2020-01-01 00:03:03 2020-01-02 03:31:24 2020-01-01 00:03:03.000 2020-01-02 03:31:24.000 183 99084 49633.5 4963350 183 99084 49633.5 4963350 -32386 32549 5069.02 506902 -125 126 0.22 22 +184 101 10174 99085 0.55255 297.55255 149.05255 14905.25525 0.55255 297.55255 149.05255 14905.25514 0.55255 297.55255 149.05255 14905.25500 2020-01-01 2020-01-02 2020-01-01 00:03:04 2020-01-02 03:31:25 2020-01-01 00:03:04.000 2020-01-02 03:31:25.000 184 99085 49634.5 4963450 184 99085 49634.5 4963450 -32385 32550 5070.02 507002 -124 127 1.22 122 +185 101 10175 99086 0.55555 297.55555 149.05555 14905.55555 0.55555 297.55554 149.05555 14905.55549 0.55555 297.55555 149.05555 14905.55500 2020-01-01 2020-01-02 2020-01-01 00:03:05 2020-01-02 03:31:26 2020-01-01 00:03:05.000 2020-01-02 03:31:26.000 185 99086 49635.5 4963550 185 99086 49635.5 4963550 -32384 32551 5071.02 507102 -128 127 -0.34 -34 +186 101 10176 99087 0.55855 297.55855 149.05855 14905.85585 0.55855 297.55856 149.05856 14905.85607 0.55855 297.55855 149.05855 14905.85500 2020-01-01 2020-01-02 2020-01-01 00:03:06 2020-01-02 03:31:27 2020-01-01 00:03:06.000 2020-01-02 03:31:27.000 186 99087 49636.5 4963650 186 99087 49636.5 4963650 -32383 32552 5072.02 507202 -128 123 -1.9 -190 +187 101 10177 99088 0.56156 297.56156 149.06156 14906.15615 0.56156 297.56155 149.06155 14906.15572 0.56156 297.56156 149.06156 14906.15600 2020-01-01 2020-01-02 2020-01-01 00:03:07 2020-01-02 03:31:28 2020-01-01 00:03:07.000 2020-01-02 03:31:28.000 187 99088 49637.5 4963750 187 99088 49637.5 4963750 -32382 32553 5073.02 507302 -127 124 -0.9 -90 +188 101 10178 99089 0.56456 297.56456 149.06456 14906.45645 0.56456 297.56458 149.06456 14906.45645 0.56456 297.56456 149.06456 14906.45600 2020-01-01 2020-01-02 2020-01-01 00:03:08 2020-01-02 03:31:29 2020-01-01 00:03:08.000 2020-01-02 03:31:29.000 188 99089 49638.5 4963850 188 99089 49638.5 4963850 -32381 32554 5074.02 507402 -126 125 0.1 10 +189 101 10179 99090 0.56756 297.56756 149.06756 14906.75675 0.56756 297.56757 149.06756 14906.75661 0.56756 297.56756 149.06756 14906.75600 2020-01-01 2020-01-02 2020-01-01 00:03:09 2020-01-02 03:31:30 2020-01-01 00:03:09.000 2020-01-02 03:31:30.000 189 99090 49639.5 4963950 189 99090 49639.5 4963950 -32380 32555 5075.02 507502 -125 126 1.1 110 +19 102 10009 99919 0.05705 300.05705 150.05705 15155.76276 0.05705 300.05707 150.05705 15155.76279 0.05705 300.05705 150.05705 15155.76205 2020-01-01 2020-01-02 2020-01-01 00:00:19 2020-01-02 03:45:19 2020-01-01 00:00:19.000 2020-01-02 03:45:19.000 19 99919 49969 5046869 19 99919 49969 5046869 -32550 32385 4548.009900990099 459349 -127 125 -1.693069306930693 -171 +190 101 10180 99091 0.57057 297.57057 149.07057 14907.05705 0.57057 297.57056 149.07056 14907.05695 0.57057 297.57057 149.07057 14907.05700 2020-01-01 2020-01-02 2020-01-01 00:03:10 2020-01-02 03:31:31 2020-01-01 00:03:10.000 2020-01-02 03:31:31.000 190 99091 49640.5 4964050 190 99091 49640.5 4964050 -32379 32556 5076.02 507602 -124 127 2.1 210 +191 101 10181 99092 0.57357 297.57357 149.07357 14907.35735 0.57357 297.57358 149.07357 14907.35753 0.57357 297.57357 149.07357 14907.35700 2020-01-01 2020-01-02 2020-01-01 00:03:11 2020-01-02 03:31:32 2020-01-01 00:03:11.000 2020-01-02 03:31:32.000 191 99092 49641.5 4964150 191 99092 49641.5 4964150 -32378 32557 5077.02 507702 -128 127 0.54 54 +192 101 10182 99093 0.57657 297.57657 149.07657 14907.65765 0.57657 297.57657 149.07657 14907.65784 0.57657 297.57657 149.07657 14907.65700 2020-01-01 2020-01-02 2020-01-01 00:03:12 2020-01-02 03:31:33 2020-01-01 00:03:12.000 2020-01-02 03:31:33.000 192 99093 49642.5 4964250 192 99093 49642.5 4964250 -32377 32558 5078.02 507802 -128 123 -1.02 -102 +193 101 10183 99094 0.57957 297.57957 149.07957 14907.95795 0.57957 297.5796 149.07957 14907.95793 0.57957 297.57957 149.07957 14907.95700 2020-01-01 2020-01-02 2020-01-01 00:03:13 2020-01-02 03:31:34 2020-01-01 00:03:13.000 2020-01-02 03:31:34.000 193 99094 49643.5 4964350 193 99094 49643.5 4964350 -32376 32559 5079.02 507902 -127 124 -0.02 -2 +194 101 10184 99095 0.58258 297.58258 149.08258 14908.25825 0.58258 297.58258 149.08258 14908.25811 0.58258 297.58258 149.08258 14908.25800 2020-01-01 2020-01-02 2020-01-01 00:03:14 2020-01-02 03:31:35 2020-01-01 00:03:14.000 2020-01-02 03:31:35.000 194 99095 49644.5 4964450 194 99095 49644.5 4964450 -32375 32560 5080.02 508002 -126 125 0.98 98 +195 101 10185 99096 0.58558 297.58558 149.08558 14908.55855 0.58558 297.58557 149.08558 14908.55842 0.58558 297.58558 149.08558 14908.55800 2020-01-01 2020-01-02 2020-01-01 00:03:15 2020-01-02 03:31:36 2020-01-01 00:03:15.000 2020-01-02 03:31:36.000 195 99096 49645.5 4964550 195 99096 49645.5 4964550 -32374 32561 5081.02 508102 -125 126 1.98 198 +196 101 10186 99097 0.58858 297.58858 149.08858 14908.85885 0.58858 297.5886 149.08859 14908.859 0.58858 297.58858 149.08858 14908.85800 2020-01-01 2020-01-02 2020-01-01 00:03:16 2020-01-02 03:31:37 2020-01-01 00:03:16.000 2020-01-02 03:31:37.000 196 99097 49646.5 4964650 196 99097 49646.5 4964650 -32373 32562 5082.02 508202 -124 127 2.98 298 +197 101 10187 99098 0.59159 297.59159 149.09159 14909.15915 0.59159 297.59158 149.09159 14909.15931 0.59159 297.59159 149.09159 14909.15900 2020-01-01 2020-01-02 2020-01-01 00:03:17 2020-01-02 03:31:38 2020-01-01 00:03:17.000 2020-01-02 03:31:38.000 197 99098 49647.5 4964750 197 99098 49647.5 4964750 -32372 32563 5083.02 508302 -128 127 1.42 142 +198 101 10188 99099 0.59459 297.59459 149.09459 14909.45945 0.59459 297.5946 149.09459 14909.4594 0.59459 297.59459 149.09459 14909.45900 2020-01-01 2020-01-02 2020-01-01 00:03:18 2020-01-02 03:31:39 2020-01-01 00:03:18.000 2020-01-02 03:31:39.000 198 99099 49648.5 4964850 198 99099 49648.5 4964850 -32371 32564 5084.02 508402 -128 127 -0.14 -14 +199 101 10189 99100 0.59759 297.59759 149.09759 14909.75975 0.59759 297.5976 149.09759 14909.75958 0.59759 297.59759 149.09759 14909.75900 2020-01-01 2020-01-02 2020-01-01 00:03:19 2020-01-02 03:31:40 2020-01-01 00:03:19.000 2020-01-02 03:31:40.000 199 99100 49649.5 4964950 199 99100 49649.5 4964950 -32370 32565 5085.02 508502 -128 124 -1.7 -170 +2 102 1001 9992 0.006 300.006 150.006 15150.6066 0.006 300.006 150.006 15150.6069 0.00600 300.00600 150.00600 15150.60600 2020-01-01 2020-01-02 2020-01-01 00:00:02 2020-01-02 03:45:02 2020-01-01 00:00:02.000 2020-01-02 03:45:02.000 2 99902 49952 5045152 2 99902 49952 5045152 -32567 32368 4531.009900990099 457632 -125 126 -0.9504950495049505 -96 +20 102 10010 99920 0.06006 300.06006 150.06006 15156.06606 0.06006 300.06006 150.06005 15156.06593 0.06006 300.06006 150.06006 15156.06606 2020-01-01 2020-01-02 2020-01-01 00:00:20 2020-01-02 03:45:20 2020-01-01 00:00:20.000 2020-01-02 03:45:20.000 20 99920 49970 5046970 20 99920 49970 5046970 -32549 32386 4549.009900990099 459450 -126 126 -0.693069306930693 -70 +200 101 10190 99101 0.6006 297.6006 149.1006 14910.06006 0.6006 297.6006 149.10059 14910.0599 0.60060 297.60060 149.10060 14910.06000 2020-01-01 2020-01-02 2020-01-01 00:03:20 2020-01-02 03:31:41 2020-01-01 00:03:20.000 2020-01-02 03:31:41.000 200 99101 49650.5 4965050 200 99101 49650.5 4965050 -32369 32566 5086.02 508602 -127 125 -0.7 -70 +201 101 10191 99102 0.6036 297.6036 149.1036 14910.36036 0.6036 297.6036 149.1036 14910.36063 0.60360 297.60360 149.10360 14910.36000 2020-01-01 2020-01-02 2020-01-01 00:03:21 2020-01-02 03:31:42 2020-01-01 00:03:21.000 2020-01-02 03:31:42.000 201 99102 49651.5 4965150 201 99102 49651.5 4965150 -32368 32567 5087.02 508702 -126 126 0.3 30 +202 101 10192 99103 0.6066 297.6066 149.1066 14910.66066 0.6066 297.6066 149.1066 14910.66078 0.60660 297.60660 149.10660 14910.66000 2020-01-01 2020-01-02 2020-01-01 00:03:22 2020-01-02 03:31:43 2020-01-01 00:03:22.000 2020-01-02 03:31:43.000 202 99103 49652.5 4965250 202 99103 49652.5 4965250 -32367 32568 5088.02 508802 -125 127 1.3 130 +203 101 10193 99104 0.6096 297.6096 149.1096 14910.96096 0.6096 297.60962 149.1096 14910.9609 0.60960 297.60960 149.10960 14910.96000 2020-01-01 2020-01-02 2020-01-01 00:03:23 2020-01-02 03:31:44 2020-01-01 00:03:23.000 2020-01-02 03:31:44.000 203 99104 49653.5 4965350 203 99104 49653.5 4965350 -32366 32569 5089.02 508902 -128 127 -0.26 -26 +204 101 10194 99105 0.61261 297.61261 149.11261 14911.26126 0.61261 297.6126 149.11261 14911.26105 0.61261 297.61261 149.11261 14911.26100 2020-01-01 2020-01-02 2020-01-01 00:03:24 2020-01-02 03:31:45 2020-01-01 00:03:24.000 2020-01-02 03:31:45.000 204 99105 49654.5 4965450 204 99105 49654.5 4965450 -32365 32570 5090.02 509002 -128 127 -1.82 -182 +205 101 10195 99106 0.61561 297.61561 149.11561 14911.56156 0.61561 297.6156 149.11561 14911.56137 0.61561 297.61561 149.11561 14911.56100 2020-01-01 2020-01-02 2020-01-01 00:03:25 2020-01-02 03:31:46 2020-01-01 00:03:25.000 2020-01-02 03:31:46.000 205 99106 49655.5 4965550 205 99106 49655.5 4965550 -32364 32571 5091.02 509102 -128 123 -3.38 -338 +206 101 10196 99107 0.61861 297.61861 149.11861 14911.86186 0.61861 297.61862 149.11862 14911.8621 0.61861 297.61861 149.11861 14911.86100 2020-01-01 2020-01-02 2020-01-01 00:03:26 2020-01-02 03:31:47 2020-01-01 00:03:26.000 2020-01-02 03:31:47.000 206 99107 49656.5 4965650 206 99107 49656.5 4965650 -32363 32572 5092.02 509202 -127 124 -2.38 -238 +207 101 10197 99108 0.62162 297.62162 149.12162 14912.16216 0.62162 297.6216 149.12162 14912.16225 0.62162 297.62162 149.12162 14912.16200 2020-01-01 2020-01-02 2020-01-01 00:03:27 2020-01-02 03:31:48 2020-01-01 00:03:27.000 2020-01-02 03:31:48.000 207 99108 49657.5 4965750 207 99108 49657.5 4965750 -32362 32573 5093.02 509302 -126 125 -1.38 -138 +208 101 10198 99109 0.62462 297.62462 149.12462 14912.46246 0.62462 297.62463 149.12462 14912.46237 0.62462 297.62462 149.12462 14912.46200 2020-01-01 2020-01-02 2020-01-01 00:03:28 2020-01-02 03:31:49 2020-01-01 00:03:28.000 2020-01-02 03:31:49.000 208 99109 49658.5 4965850 208 99109 49658.5 4965850 -32361 32574 5094.02 509402 -125 126 -0.38 -38 +209 101 10199 99110 0.62762 297.62762 149.12762 14912.76276 0.62762 297.62762 149.12762 14912.76253 0.62762 297.62762 149.12762 14912.76200 2020-01-01 2020-01-02 2020-01-01 00:03:29 2020-01-02 03:31:50 2020-01-01 00:03:29.000 2020-01-02 03:31:50.000 209 99110 49659.5 4965950 209 99110 49659.5 4965950 -32360 32575 5095.02 509502 -124 127 0.62 62 +21 102 10011 99921 0.06306 300.06306 150.06306 15156.36936 0.06306 300.06305 150.06306 15156.36927 0.06306 300.06306 150.06306 15156.36906 2020-01-01 2020-01-02 2020-01-01 00:00:21 2020-01-02 03:45:21 2020-01-01 00:00:21.000 2020-01-02 03:45:21.000 21 99921 49971 5047071 21 99921 49971 5047071 -32548 32387 4550.009900990099 459551 -125 127 0.3069306930693069 31 +210 101 10200 99111 0.63063 297.63063 149.13063 14913.06306 0.63063 297.63065 149.13063 14913.06326 0.63063 297.63063 149.13063 14913.06300 2020-01-01 2020-01-02 2020-01-01 00:03:30 2020-01-02 03:31:51 2020-01-01 00:03:30.000 2020-01-02 03:31:51.000 210 99111 49660.5 4966050 210 99111 49660.5 4966050 -32359 32576 5096.02 509602 -128 127 -0.94 -94 +211 101 10201 99112 0.63363 297.63363 149.13363 14913.36336 0.63363 297.63364 149.13363 14913.36357 0.63363 297.63363 149.13363 14913.36300 2020-01-01 2020-01-02 2020-01-01 00:03:31 2020-01-02 03:31:52 2020-01-01 00:03:31.000 2020-01-02 03:31:52.000 211 99112 49661.5 4966150 211 99112 49661.5 4966150 -32358 32577 5097.02 509702 -128 123 -2.5 -250 +212 101 10202 99113 0.63663 297.63663 149.13663 14913.66366 0.63663 297.63663 149.13663 14913.66372 0.63663 297.63663 149.13663 14913.66300 2020-01-01 2020-01-02 2020-01-01 00:03:32 2020-01-02 03:31:53 2020-01-01 00:03:32.000 2020-01-02 03:31:53.000 212 99113 49662.5 4966250 212 99113 49662.5 4966250 -32357 32578 5098.02 509802 -127 124 -1.5 -150 +213 101 10203 99114 0.63963 297.63963 149.13963 14913.96396 0.63963 297.63965 149.13963 14913.96384 0.63963 297.63963 149.13963 14913.96300 2020-01-01 2020-01-02 2020-01-01 00:03:33 2020-01-02 03:31:54 2020-01-01 00:03:33.000 2020-01-02 03:31:54.000 213 99114 49663.5 4966350 213 99114 49663.5 4966350 -32356 32579 5099.02 509902 -126 125 -0.5 -50 +214 101 10204 99115 0.64264 297.64264 149.14264 14914.26426 0.64264 297.64264 149.14263 14914.26399 0.64264 297.64264 149.14264 14914.26400 2020-01-01 2020-01-02 2020-01-01 00:03:34 2020-01-02 03:31:55 2020-01-01 00:03:34.000 2020-01-02 03:31:55.000 214 99115 49664.5 4966450 214 99115 49664.5 4966450 -32355 32580 5100.02 510002 -125 126 0.5 50 +215 101 10205 99116 0.64564 297.64564 149.14564 14914.56456 0.64564 297.64566 149.14564 14914.56473 0.64564 297.64564 149.14564 14914.56400 2020-01-01 2020-01-02 2020-01-01 00:03:35 2020-01-02 03:31:56 2020-01-01 00:03:35.000 2020-01-02 03:31:56.000 215 99116 49665.5 4966550 215 99116 49665.5 4966550 -32354 32581 5101.02 510102 -124 127 1.5 150 +216 101 10206 99117 0.64864 297.64864 149.14864 14914.86486 0.64864 297.64865 149.14865 14914.86504 0.64864 297.64864 149.14864 14914.86400 2020-01-01 2020-01-02 2020-01-01 00:03:36 2020-01-02 03:31:57 2020-01-01 00:03:36.000 2020-01-02 03:31:57.000 216 99117 49666.5 4966650 216 99117 49666.5 4966650 -32353 32582 5102.02 510202 -128 127 -0.06 -6 +217 101 10207 99118 0.65165 297.65165 149.15165 14915.16516 0.65165 297.65164 149.15165 14915.16523 0.65165 297.65165 149.15165 14915.16500 2020-01-01 2020-01-02 2020-01-01 00:03:37 2020-01-02 03:31:58 2020-01-01 00:03:37.000 2020-01-02 03:31:58.000 217 99118 49667.5 4966750 217 99118 49667.5 4966750 -32352 32583 5103.02 510302 -128 123 -1.62 -162 +218 101 10208 99119 0.65465 297.65465 149.15465 14915.46546 0.65465 297.65466 149.15465 14915.46531 0.65465 297.65465 149.15465 14915.46500 2020-01-01 2020-01-02 2020-01-01 00:03:38 2020-01-02 03:31:59 2020-01-01 00:03:38.000 2020-01-02 03:31:59.000 218 99119 49668.5 4966850 218 99119 49668.5 4966850 -32351 32584 5104.02 510402 -127 124 -0.62 -62 +219 101 10209 99120 0.65765 297.65765 149.15765 14915.76576 0.65765 297.65765 149.15765 14915.76562 0.65765 297.65765 149.15765 14915.76500 2020-01-01 2020-01-02 2020-01-01 00:03:39 2020-01-02 03:32:00 2020-01-01 00:03:39.000 2020-01-02 03:32:00.000 219 99120 49669.5 4966950 219 99120 49669.5 4966950 -32350 32585 5105.02 510502 -126 125 0.38 38 +22 102 10012 99922 0.06606 300.06606 150.06606 15156.67267 0.06606 300.06607 150.06606 15156.67287 0.06606 300.06606 150.06606 15156.67206 2020-01-01 2020-01-02 2020-01-01 00:00:22 2020-01-02 03:45:22 2020-01-01 00:00:22.000 2020-01-02 03:45:22.000 22 99922 49972 5047172 22 99922 49972 5047172 -32547 32388 4551.009900990099 459652 -128 127 -1.2277227722772277 -124 +220 101 10210 99121 0.66066 297.66066 149.16066 14916.06606 0.66066 297.66068 149.16066 14916.06619 0.66066 297.66066 149.16066 14916.06600 2020-01-01 2020-01-02 2020-01-01 00:03:40 2020-01-02 03:32:01 2020-01-01 00:03:40.000 2020-01-02 03:32:01.000 220 99121 49670.5 4967050 220 99121 49670.5 4967050 -32349 32586 5106.02 510602 -125 126 1.38 138 +221 101 10211 99122 0.66366 297.66366 149.16366 14916.36636 0.66366 297.66367 149.16366 14916.36651 0.66366 297.66366 149.16366 14916.36600 2020-01-01 2020-01-02 2020-01-01 00:03:41 2020-01-02 03:32:02 2020-01-01 00:03:41.000 2020-01-02 03:32:02.000 221 99122 49671.5 4967150 221 99122 49671.5 4967150 -32348 32587 5107.02 510702 -124 127 2.38 238 +222 101 10212 99123 0.66666 297.66666 149.16666 14916.66666 0.66666 297.66666 149.16666 14916.6667 0.66666 297.66666 149.16666 14916.66600 2020-01-01 2020-01-02 2020-01-01 00:03:42 2020-01-02 03:32:03 2020-01-01 00:03:42.000 2020-01-02 03:32:03.000 222 99123 49672.5 4967250 222 99123 49672.5 4967250 -32347 32588 5108.02 510802 -128 127 0.82 82 +223 101 10213 99124 0.66966 297.66966 149.16966 14916.96696 0.66966 297.66968 149.16966 14916.96678 0.66966 297.66966 149.16966 14916.96600 2020-01-01 2020-01-02 2020-01-01 00:03:43 2020-01-02 03:32:04 2020-01-01 00:03:43.000 2020-01-02 03:32:04.000 223 99124 49673.5 4967350 223 99124 49673.5 4967350 -32346 32589 5109.02 510902 -128 127 -0.74 -74 +224 101 10214 99125 0.67267 297.67267 149.17267 14917.26726 0.67267 297.67267 149.17267 14917.26709 0.67267 297.67267 149.17267 14917.26700 2020-01-01 2020-01-02 2020-01-01 00:03:44 2020-01-02 03:32:05 2020-01-01 00:03:44.000 2020-01-02 03:32:05.000 224 99125 49674.5 4967450 224 99125 49674.5 4967450 -32345 32590 5110.02 511002 -128 124 -2.3 -230 +225 101 10215 99126 0.67567 297.67567 149.17567 14917.56756 0.67567 297.6757 149.17567 14917.56767 0.67567 297.67567 149.17567 14917.56700 2020-01-01 2020-01-02 2020-01-01 00:03:45 2020-01-02 03:32:06 2020-01-01 00:03:45.000 2020-01-02 03:32:06.000 225 99126 49675.5 4967550 225 99126 49675.5 4967550 -32344 32591 5111.02 511102 -127 125 -1.3 -130 +226 101 10216 99127 0.67867 297.67867 149.17867 14917.86786 0.67867 297.67868 149.17868 14917.86802 0.67867 297.67867 149.17867 14917.86700 2020-01-01 2020-01-02 2020-01-01 00:03:46 2020-01-02 03:32:07 2020-01-01 00:03:46.000 2020-01-02 03:32:07.000 226 99127 49676.5 4967650 226 99127 49676.5 4967650 -32343 32592 5112.02 511202 -126 126 -0.3 -30 +227 101 10217 99128 0.68168 297.68168 149.18168 14918.16816 0.68168 297.68167 149.18168 14918.16817 0.68168 297.68168 149.18168 14918.16800 2020-01-01 2020-01-02 2020-01-01 00:03:47 2020-01-02 03:32:08 2020-01-01 00:03:47.000 2020-01-02 03:32:08.000 227 99128 49677.5 4967750 227 99128 49677.5 4967750 -32342 32593 5113.02 511302 -125 127 0.7 70 +228 101 10218 99129 0.68468 297.68468 149.18468 14918.46846 0.68468 297.6847 149.18468 14918.46825 0.68468 297.68468 149.18468 14918.46800 2020-01-01 2020-01-02 2020-01-01 00:03:48 2020-01-02 03:32:09 2020-01-01 00:03:48.000 2020-01-02 03:32:09.000 228 99129 49678.5 4967850 228 99129 49678.5 4967850 -32341 32594 5114.02 511402 -128 127 -0.86 -86 +229 101 10219 99130 0.68768 297.68768 149.18768 14918.76876 0.68768 297.68768 149.18768 14918.76855 0.68768 297.68768 149.18768 14918.76800 2020-01-01 2020-01-02 2020-01-01 00:03:49 2020-01-02 03:32:10 2020-01-01 00:03:49.000 2020-01-02 03:32:10.000 229 99130 49679.5 4967950 229 99130 49679.5 4967950 -32340 32595 5115.02 511502 -128 127 -2.42 -242 +23 102 10013 99923 0.06906 300.06906 150.06906 15156.97597 0.06906 300.06906 150.06907 15156.97617 0.06906 300.06906 150.06906 15156.97506 2020-01-01 2020-01-02 2020-01-01 00:00:23 2020-01-02 03:45:23 2020-01-01 00:00:23.000 2020-01-02 03:45:23.000 23 99923 49973 5047273 23 99923 49973 5047273 -32546 32389 4552.009900990099 459753 -128 127 -2.762376237623762 -279 +230 101 10220 99131 0.69069 297.69069 149.19069 14919.06906 0.69069 297.6907 149.19069 14919.06914 0.69069 297.69069 149.19069 14919.06900 2020-01-01 2020-01-02 2020-01-01 00:03:50 2020-01-02 03:32:11 2020-01-01 00:03:50.000 2020-01-02 03:32:11.000 230 99131 49680.5 4968050 230 99131 49680.5 4968050 -32339 32596 5116.02 511602 -128 123 -3.98 -398 +231 101 10221 99132 0.69369 297.69369 149.19369 14919.36936 0.69369 297.6937 149.19369 14919.36949 0.69369 297.69369 149.19369 14919.36900 2020-01-01 2020-01-02 2020-01-01 00:03:51 2020-01-02 03:32:12 2020-01-01 00:03:51.000 2020-01-02 03:32:12.000 231 99132 49681.5 4968150 231 99132 49681.5 4968150 -32338 32597 5117.02 511702 -127 124 -2.98 -298 +232 101 10222 99133 0.69669 297.69669 149.19669 14919.66966 0.69669 297.6967 149.19669 14919.66964 0.69669 297.69669 149.19669 14919.66900 2020-01-01 2020-01-02 2020-01-01 00:03:52 2020-01-02 03:32:13 2020-01-01 00:03:52.000 2020-01-02 03:32:13.000 232 99133 49682.5 4968250 232 99133 49682.5 4968250 -32337 32598 5118.02 511802 -126 125 -1.98 -198 +233 101 10223 99134 0.69969 297.69969 149.19969 14919.96996 0.69969 297.6997 149.1997 14919.97037 0.69969 297.69969 149.19969 14919.96900 2020-01-01 2020-01-02 2020-01-01 00:03:53 2020-01-02 03:32:14 2020-01-01 00:03:53.000 2020-01-02 03:32:14.000 233 99134 49683.5 4968350 233 99134 49683.5 4968350 -32336 32599 5119.02 511902 -125 126 -0.98 -98 +234 101 10224 99135 0.7027 297.7027 149.2027 14920.27027 0.7027 297.7027 149.2027 14920.27003 0.70270 297.70270 149.20270 14920.27000 2020-01-01 2020-01-02 2020-01-01 00:03:54 2020-01-02 03:32:15 2020-01-01 00:03:54.000 2020-01-02 03:32:15.000 234 99135 49684.5 4968450 234 99135 49684.5 4968450 -32335 32600 5120.02 512002 -124 127 0.02 2 +235 101 10225 99136 0.7057 297.7057 149.2057 14920.57057 0.7057 297.70572 149.2057 14920.57065 0.70570 297.70570 149.20570 14920.57000 2020-01-01 2020-01-02 2020-01-01 00:03:55 2020-01-02 03:32:16 2020-01-01 00:03:55.000 2020-01-02 03:32:16.000 235 99136 49685.5 4968550 235 99136 49685.5 4968550 -32334 32601 5121.02 512102 -128 127 -1.54 -154 +236 101 10226 99137 0.7087 297.7087 149.2087 14920.87087 0.7087 297.7087 149.2087 14920.87095 0.70870 297.70870 149.20870 14920.87000 2020-01-01 2020-01-02 2020-01-01 00:03:56 2020-01-02 03:32:17 2020-01-01 00:03:56.000 2020-01-02 03:32:17.000 236 99137 49686.5 4968650 236 99137 49686.5 4968650 -32333 32602 5122.02 512202 -128 123 -3.1 -310 +237 101 10227 99138 0.71171 297.71171 149.21171 14921.17117 0.71171 297.7117 149.21171 14921.17111 0.71171 297.71171 149.21171 14921.17100 2020-01-01 2020-01-02 2020-01-01 00:03:57 2020-01-02 03:32:18 2020-01-01 00:03:57.000 2020-01-02 03:32:18.000 237 99138 49687.5 4968750 237 99138 49687.5 4968750 -32332 32603 5123.02 512302 -127 124 -2.1 -210 +238 101 10228 99139 0.71471 297.71471 149.21471 14921.47147 0.71471 297.71472 149.21471 14921.47184 0.71471 297.71471 149.21471 14921.47100 2020-01-01 2020-01-02 2020-01-01 00:03:58 2020-01-02 03:32:19 2020-01-01 00:03:58.000 2020-01-02 03:32:19.000 238 99139 49688.5 4968850 238 99139 49688.5 4968850 -32331 32604 5124.02 512402 -126 125 -1.1 -110 +239 101 10229 99140 0.71771 297.71771 149.21771 14921.77177 0.71771 297.7177 149.21771 14921.7715 0.71771 297.71771 149.21771 14921.77100 2020-01-01 2020-01-02 2020-01-01 00:03:59 2020-01-02 03:32:20 2020-01-01 00:03:59.000 2020-01-02 03:32:20.000 239 99140 49689.5 4968950 239 99140 49689.5 4968950 -32330 32605 5125.02 512502 -125 126 -0.1 -10 +24 102 10014 99924 0.07207 300.07207 150.07207 15157.27927 0.07207 300.07208 150.07207 15157.27928 0.07207 300.07207 150.07207 15157.27907 2020-01-01 2020-01-02 2020-01-01 00:00:24 2020-01-02 03:45:24 2020-01-01 00:00:24.000 2020-01-02 03:45:24.000 24 99924 49974 5047374 24 99924 49974 5047374 -32545 32390 4553.009900990099 459854 -128 123 -4.297029702970297 -434 +240 101 10230 99141 0.72072 297.72072 149.22072 14922.07207 0.72072 297.72073 149.22072 14922.07211 0.72072 297.72072 149.22072 14922.07200 2020-01-01 2020-01-02 2020-01-01 00:04:00 2020-01-02 03:32:21 2020-01-01 00:04:00.000 2020-01-02 03:32:21.000 240 99141 49690.5 4969050 240 99141 49690.5 4969050 -32329 32606 5126.02 512602 -124 127 0.9 90 +241 101 10231 99142 0.72372 297.72372 149.22372 14922.37237 0.72372 297.72372 149.22372 14922.37243 0.72372 297.72372 149.22372 14922.37200 2020-01-01 2020-01-02 2020-01-01 00:04:01 2020-01-02 03:32:22 2020-01-01 00:04:01.000 2020-01-02 03:32:22.000 241 99142 49691.5 4969150 241 99142 49691.5 4969150 -32328 32607 5127.02 512702 -128 127 -0.66 -66 +242 101 10232 99143 0.72672 297.72672 149.22672 14922.67267 0.72672 297.7267 149.22672 14922.67273 0.72672 297.72672 149.22672 14922.67200 2020-01-01 2020-01-02 2020-01-01 00:04:02 2020-01-02 03:32:23 2020-01-01 00:04:02.000 2020-01-02 03:32:23.000 242 99143 49692.5 4969250 242 99143 49692.5 4969250 -32327 32608 5128.02 512802 -128 123 -2.22 -222 +243 101 10233 99144 0.72972 297.72972 149.22972 14922.97297 0.72972 297.72974 149.22973 14922.97332 0.72972 297.72972 149.22972 14922.97200 2020-01-01 2020-01-02 2020-01-01 00:04:03 2020-01-02 03:32:24 2020-01-01 00:04:03.000 2020-01-02 03:32:24.000 243 99144 49693.5 4969350 243 99144 49693.5 4969350 -32326 32609 5129.02 512902 -127 124 -1.22 -122 +244 101 10234 99145 0.73273 297.73273 149.23273 14923.27327 0.73273 297.73273 149.23272 14923.27297 0.73273 297.73273 149.23273 14923.27300 2020-01-01 2020-01-02 2020-01-01 00:04:04 2020-01-02 03:32:25 2020-01-01 00:04:04.000 2020-01-02 03:32:25.000 244 99145 49694.5 4969450 244 99145 49694.5 4969450 -32325 32610 5130.02 513002 -126 125 -0.22 -22 +245 101 10235 99146 0.73573 297.73573 149.23573 14923.57357 0.73573 297.73575 149.23573 14923.57358 0.73573 297.73573 149.23573 14923.57300 2020-01-01 2020-01-02 2020-01-01 00:04:05 2020-01-02 03:32:26 2020-01-01 00:04:05.000 2020-01-02 03:32:26.000 245 99146 49695.5 4969550 245 99146 49695.5 4969550 -32324 32611 5131.02 513102 -125 126 0.78 78 +246 101 10236 99147 0.73873 297.73873 149.23873 14923.87387 0.73873 297.73874 149.23873 14923.8739 0.73873 297.73873 149.23873 14923.87300 2020-01-01 2020-01-02 2020-01-01 00:04:06 2020-01-02 03:32:27 2020-01-01 00:04:06.000 2020-01-02 03:32:27.000 246 99147 49696.5 4969650 246 99147 49696.5 4969650 -32323 32612 5132.02 513202 -124 127 1.78 178 +247 101 10237 99148 0.74174 297.74174 149.24174 14924.17417 0.74174 297.74173 149.24174 14924.1742 0.74174 297.74174 149.24174 14924.17400 2020-01-01 2020-01-02 2020-01-01 00:04:07 2020-01-02 03:32:28 2020-01-01 00:04:07.000 2020-01-02 03:32:28.000 247 99148 49697.5 4969750 247 99148 49697.5 4969750 -32322 32613 5133.02 513302 -128 127 0.22 22 +248 101 10238 99149 0.74474 297.74474 149.24474 14924.47447 0.74474 297.74475 149.24474 14924.47478 0.74474 297.74474 149.24474 14924.47400 2020-01-01 2020-01-02 2020-01-01 00:04:08 2020-01-02 03:32:29 2020-01-01 00:04:08.000 2020-01-02 03:32:29.000 248 99149 49698.5 4969850 248 99149 49698.5 4969850 -32321 32614 5134.02 513402 -128 127 -1.34 -134 +249 101 10239 99150 0.74774 297.74774 149.24774 14924.77477 0.74774 297.74774 149.24774 14924.77447 0.74774 297.74774 149.24774 14924.77400 2020-01-01 2020-01-02 2020-01-01 00:04:09 2020-01-02 03:32:30 2020-01-01 00:04:09.000 2020-01-02 03:32:30.000 249 99150 49699.5 4969950 249 99150 49699.5 4969950 -32320 32615 5135.02 513502 -128 124 -2.9 -290 +25 102 10015 99925 0.07507 300.07507 150.07507 15157.58258 0.07507 300.07507 150.07507 15157.58241 0.07507 300.07507 150.07507 15157.58207 2020-01-01 2020-01-02 2020-01-01 00:00:25 2020-01-02 03:45:25 2020-01-01 00:00:25.000 2020-01-02 03:45:25.000 25 99925 49975 5047475 25 99925 49975 5047475 -32544 32391 4554.009900990099 459955 -127 124 -3.297029702970297 -333 +250 101 10240 99151 0.75075 297.75075 149.25075 14925.07507 0.75075 297.75076 149.25075 14925.07506 0.75075 297.75075 149.25075 14925.07500 2020-01-01 2020-01-02 2020-01-01 00:04:10 2020-01-02 03:32:31 2020-01-01 00:04:10.000 2020-01-02 03:32:31.000 250 99151 49700.5 4970050 250 99151 49700.5 4970050 -32319 32616 5136.02 513602 -127 125 -1.9 -190 +251 101 10241 99152 0.75375 297.75375 149.25375 14925.37537 0.75375 297.75375 149.25375 14925.37536 0.75375 297.75375 149.25375 14925.37500 2020-01-01 2020-01-02 2020-01-01 00:04:11 2020-01-02 03:32:32 2020-01-01 00:04:11.000 2020-01-02 03:32:32.000 251 99152 49701.5 4970150 251 99152 49701.5 4970150 -32318 32617 5137.02 513702 -126 126 -0.9 -90 +252 101 10242 99153 0.75675 297.75675 149.25675 14925.67567 0.75675 297.75674 149.25675 14925.67567 0.75675 297.75675 149.25675 14925.67500 2020-01-01 2020-01-02 2020-01-01 00:04:12 2020-01-02 03:32:33 2020-01-01 00:04:12.000 2020-01-02 03:32:33.000 252 99153 49702.5 4970250 252 99153 49702.5 4970250 -32317 32618 5138.02 513802 -125 127 0.1 10 +253 101 10243 99154 0.75975 297.75975 149.25975 14925.97597 0.75975 297.75977 149.25976 14925.97625 0.75975 297.75975 149.25975 14925.97500 2020-01-01 2020-01-02 2020-01-01 00:04:13 2020-01-02 03:32:34 2020-01-01 00:04:13.000 2020-01-02 03:32:34.000 253 99154 49703.5 4970350 253 99154 49703.5 4970350 -32316 32619 5139.02 513902 -128 127 -1.46 -146 +254 101 10244 99155 0.76276 297.76276 149.26276 14926.27627 0.76276 297.76276 149.26275 14926.27594 0.76276 297.76276 149.26276 14926.27600 2020-01-01 2020-01-02 2020-01-01 00:04:14 2020-01-02 03:32:35 2020-01-01 00:04:14.000 2020-01-02 03:32:35.000 254 99155 49704.5 4970450 254 99155 49704.5 4970450 -32315 32620 5140.02 514002 -128 127 -3.02 -302 +255 101 10245 99156 0.76576 297.76576 149.26576 14926.57657 0.76576 297.76578 149.26576 14926.57652 0.76576 297.76576 149.26576 14926.57600 2020-01-01 2020-01-02 2020-01-01 00:04:15 2020-01-02 03:32:36 2020-01-01 00:04:15.000 2020-01-02 03:32:36.000 255 99156 49705.5 4970550 255 99156 49705.5 4970550 -32314 32621 5141.02 514102 -128 123 -4.58 -458 +256 101 10246 99157 0.76876 297.76876 149.26876 14926.87687 0.76876 297.76877 149.26876 14926.87683 0.76876 297.76876 149.26876 14926.87600 2020-01-01 2020-01-02 2020-01-01 00:04:16 2020-01-02 03:32:37 2020-01-01 00:04:16.000 2020-01-02 03:32:37.000 256 99157 49706.5 4970650 256 99157 49706.5 4970650 -32313 32622 5142.02 514202 -127 124 -3.58 -358 +257 101 10247 99158 0.77177 297.77177 149.27177 14927.17717 0.77177 297.77176 149.27177 14927.17714 0.77177 297.77177 149.27177 14927.17700 2020-01-01 2020-01-02 2020-01-01 00:04:17 2020-01-02 03:32:38 2020-01-01 00:04:17.000 2020-01-02 03:32:38.000 257 99158 49707.5 4970750 257 99158 49707.5 4970750 -32312 32623 5143.02 514302 -126 125 -2.58 -258 +258 101 10248 99159 0.77477 297.77477 149.27477 14927.47747 0.77477 297.77478 149.27477 14927.47776 0.77477 297.77477 149.27477 14927.47700 2020-01-01 2020-01-02 2020-01-01 00:04:18 2020-01-02 03:32:39 2020-01-01 00:04:18.000 2020-01-02 03:32:39.000 258 99159 49708.5 4970850 258 99159 49708.5 4970850 -32311 32624 5144.02 514402 -125 126 -1.58 -158 +259 101 10249 99160 0.77777 297.77777 149.27777 14927.77777 0.77777 297.77777 149.27777 14927.77742 0.77777 297.77777 149.27777 14927.77700 2020-01-01 2020-01-02 2020-01-01 00:04:19 2020-01-02 03:32:40 2020-01-01 00:04:19.000 2020-01-02 03:32:40.000 259 99160 49709.5 4970950 259 99160 49709.5 4970950 -32310 32625 5145.02 514502 -124 127 -0.58 -58 +26 102 10016 99926 0.07807 300.07807 150.07807 15157.88588 0.07807 300.07806 150.07807 15157.88575 0.07807 300.07807 150.07807 15157.88507 2020-01-01 2020-01-02 2020-01-01 00:00:26 2020-01-02 03:45:26 2020-01-01 00:00:26.000 2020-01-02 03:45:26.000 26 99926 49976 5047576 26 99926 49976 5047576 -32543 32392 4555.009900990099 460056 -126 125 -2.297029702970297 -232 +260 101 10250 99161 0.78078 297.78078 149.28078 14928.07807 0.78078 297.7808 149.28077 14928.07799 0.78078 297.78078 149.28078 14928.07800 2020-01-01 2020-01-02 2020-01-01 00:04:20 2020-01-02 03:32:41 2020-01-01 00:04:20.000 2020-01-02 03:32:41.000 260 99161 49710.5 4971050 260 99161 49710.5 4971050 -32309 32626 5146.02 514602 -128 127 -2.14 -214 +261 101 10251 99162 0.78378 297.78378 149.28378 14928.37837 0.78378 297.78378 149.28378 14928.3783 0.78378 297.78378 149.28378 14928.37800 2020-01-01 2020-01-02 2020-01-01 00:04:21 2020-01-02 03:32:42 2020-01-01 00:04:21.000 2020-01-02 03:32:42.000 261 99162 49711.5 4971150 261 99162 49711.5 4971150 -32308 32627 5147.02 514702 -128 123 -3.7 -370 +262 101 10252 99163 0.78678 297.78678 149.28678 14928.67867 0.78678 297.78677 149.28678 14928.67861 0.78678 297.78678 149.28678 14928.67800 2020-01-01 2020-01-02 2020-01-01 00:04:22 2020-01-02 03:32:43 2020-01-01 00:04:22.000 2020-01-02 03:32:43.000 262 99163 49712.5 4971250 262 99163 49712.5 4971250 -32307 32628 5148.02 514802 -127 124 -2.7 -270 +263 101 10253 99164 0.78978 297.78978 149.28978 14928.97897 0.78978 297.7898 149.28979 14928.97923 0.78978 297.78978 149.28978 14928.97800 2020-01-01 2020-01-02 2020-01-01 00:04:23 2020-01-02 03:32:44 2020-01-01 00:04:23.000 2020-01-02 03:32:44.000 263 99164 49713.5 4971350 263 99164 49713.5 4971350 -32306 32629 5149.02 514902 -126 125 -1.7 -170 +264 101 10254 99165 0.79279 297.79279 149.29279 14929.27927 0.79279 297.7928 149.29278 14929.27888 0.79279 297.79279 149.29279 14929.27900 2020-01-01 2020-01-02 2020-01-01 00:04:24 2020-01-02 03:32:45 2020-01-01 00:04:24.000 2020-01-02 03:32:45.000 264 99165 49714.5 4971450 264 99165 49714.5 4971450 -32305 32630 5150.02 515002 -125 126 -0.7 -70 +265 101 10255 99166 0.79579 297.79579 149.29579 14929.57957 0.79579 297.7958 149.29579 14929.57962 0.79579 297.79579 149.29579 14929.57900 2020-01-01 2020-01-02 2020-01-01 00:04:25 2020-01-02 03:32:46 2020-01-01 00:04:25.000 2020-01-02 03:32:46.000 265 99166 49715.5 4971550 265 99166 49715.5 4971550 -32304 32631 5151.02 515102 -124 127 0.3 30 +266 101 10256 99167 0.79879 297.79879 149.29879 14929.87987 0.79879 297.7988 149.29879 14929.87977 0.79879 297.79879 149.29879 14929.87900 2020-01-01 2020-01-02 2020-01-01 00:04:26 2020-01-02 03:32:47 2020-01-01 00:04:26.000 2020-01-02 03:32:47.000 266 99167 49716.5 4971650 266 99167 49716.5 4971650 -32303 32632 5152.02 515202 -128 127 -1.26 -126 +267 101 10257 99168 0.8018 297.8018 149.3018 14930.18018 0.8018 297.8018 149.3018 14930.18012 0.80180 297.80180 149.30180 14930.18000 2020-01-01 2020-01-02 2020-01-01 00:04:27 2020-01-02 03:32:48 2020-01-01 00:04:27.000 2020-01-02 03:32:48.000 267 99168 49717.5 4971750 267 99168 49717.5 4971750 -32302 32633 5153.02 515302 -128 123 -2.82 -282 +268 101 10258 99169 0.8048 297.8048 149.3048 14930.48048 0.8048 297.8048 149.3048 14930.4807 0.80480 297.80480 149.30480 14930.48000 2020-01-01 2020-01-02 2020-01-01 00:04:28 2020-01-02 03:32:49 2020-01-01 00:04:28.000 2020-01-02 03:32:49.000 268 99169 49718.5 4971850 268 99169 49718.5 4971850 -32301 32634 5154.02 515402 -127 124 -1.82 -182 +269 101 10259 99170 0.8078 297.8078 149.3078 14930.78078 0.8078 297.8078 149.3078 14930.78035 0.80780 297.80780 149.30780 14930.78000 2020-01-01 2020-01-02 2020-01-01 00:04:29 2020-01-02 03:32:50 2020-01-01 00:04:29.000 2020-01-02 03:32:50.000 269 99170 49719.5 4971950 269 99170 49719.5 4971950 -32300 32635 5155.02 515502 -126 125 -0.82 -82 +27 102 10017 99927 0.08108 300.08108 150.08108 15158.18918 0.08108 300.0811 150.08108 15158.18936 0.08108 300.08108 150.08108 15158.18908 2020-01-01 2020-01-02 2020-01-01 00:00:27 2020-01-02 03:45:27 2020-01-01 00:00:27.000 2020-01-02 03:45:27.000 27 99927 49977 5047677 27 99927 49977 5047677 -32542 32393 4556.009900990099 460157 -125 126 -1.297029702970297 -131 +270 101 10260 99171 0.81081 297.81081 149.31081 14931.08108 0.81081 297.81082 149.31081 14931.08109 0.81081 297.81081 149.31081 14931.08100 2020-01-01 2020-01-02 2020-01-01 00:04:30 2020-01-02 03:32:51 2020-01-01 00:04:30.000 2020-01-02 03:32:51.000 270 99171 49720.5 4972050 270 99171 49720.5 4972050 -32299 32636 5156.02 515602 -125 126 0.18 18 +271 101 10261 99172 0.81381 297.81381 149.31381 14931.38138 0.81381 297.8138 149.31381 14931.38124 0.81381 297.81381 149.31381 14931.38100 2020-01-01 2020-01-02 2020-01-01 00:04:31 2020-01-02 03:32:52 2020-01-01 00:04:31.000 2020-01-02 03:32:52.000 271 99172 49721.5 4972150 271 99172 49721.5 4972150 -32298 32637 5157.02 515702 -124 127 1.18 118 +272 101 10262 99173 0.81681 297.81681 149.31681 14931.68168 0.81681 297.8168 149.31681 14931.68159 0.81681 297.81681 149.31681 14931.68100 2020-01-01 2020-01-02 2020-01-01 00:04:32 2020-01-02 03:32:53 2020-01-01 00:04:32.000 2020-01-02 03:32:53.000 272 99173 49722.5 4972250 272 99173 49722.5 4972250 -32297 32638 5158.02 515802 -128 127 -0.38 -38 +273 101 10263 99174 0.81981 297.81981 149.31981 14931.98198 0.81981 297.81982 149.31982 14931.98217 0.81981 297.81981 149.31981 14931.98100 2020-01-01 2020-01-02 2020-01-01 00:04:33 2020-01-02 03:32:54 2020-01-01 00:04:33.000 2020-01-02 03:32:54.000 273 99174 49723.5 4972350 273 99174 49723.5 4972350 -32296 32639 5159.02 515902 -128 127 -1.94 -194 +274 101 10264 99175 0.82282 297.82282 149.32282 14932.28228 0.82282 297.8228 149.32282 14932.28247 0.82282 297.82282 149.32282 14932.28200 2020-01-01 2020-01-02 2020-01-01 00:04:34 2020-01-02 03:32:55 2020-01-01 00:04:34.000 2020-01-02 03:32:55.000 274 99175 49724.5 4972450 274 99175 49724.5 4972450 -32295 32640 5160.02 516002 -128 124 -3.5 -350 +275 101 10265 99176 0.82582 297.82582 149.32582 14932.58258 0.82582 297.82584 149.32582 14932.58256 0.82582 297.82582 149.32582 14932.58200 2020-01-01 2020-01-02 2020-01-01 00:04:35 2020-01-02 03:32:56 2020-01-01 00:04:35.000 2020-01-02 03:32:56.000 275 99176 49725.5 4972550 275 99176 49725.5 4972550 -32294 32641 5161.02 516102 -127 125 -2.5 -250 +276 101 10266 99177 0.82882 297.82882 149.32882 14932.88288 0.82882 297.82883 149.32882 14932.88275 0.82882 297.82882 149.32882 14932.88200 2020-01-01 2020-01-02 2020-01-01 00:04:36 2020-01-02 03:32:57 2020-01-01 00:04:36.000 2020-01-02 03:32:57.000 276 99177 49726.5 4972650 276 99177 49726.5 4972650 -32293 32642 5162.02 516202 -126 126 -1.5 -150 +277 101 10267 99178 0.83183 297.83183 149.33183 14933.18318 0.83183 297.83182 149.33183 14933.18305 0.83183 297.83183 149.33183 14933.18300 2020-01-01 2020-01-02 2020-01-01 00:04:37 2020-01-02 03:32:58 2020-01-01 00:04:37.000 2020-01-02 03:32:58.000 277 99178 49727.5 4972750 277 99178 49727.5 4972750 -32292 32643 5163.02 516302 -125 127 -0.5 -50 +278 101 10268 99179 0.83483 297.83483 149.33483 14933.48348 0.83483 297.83484 149.33483 14933.48364 0.83483 297.83483 149.33483 14933.48300 2020-01-01 2020-01-02 2020-01-01 00:04:38 2020-01-02 03:32:59 2020-01-01 00:04:38.000 2020-01-02 03:32:59.000 278 99179 49728.5 4972850 278 99179 49728.5 4972850 -32291 32644 5164.02 516402 -128 127 -2.06 -206 +279 101 10269 99180 0.83783 297.83783 149.33783 14933.78378 0.83783 297.83783 149.33783 14933.78394 0.83783 297.83783 149.33783 14933.78300 2020-01-01 2020-01-02 2020-01-01 00:04:39 2020-01-02 03:33:00 2020-01-01 00:04:39.000 2020-01-02 03:33:00.000 279 99180 49729.5 4972950 279 99180 49729.5 4972950 -32290 32645 5165.02 516502 -128 127 -3.62 -362 +28 102 10018 99928 0.08408 300.08408 150.08408 15158.49249 0.08408 300.08408 150.08408 15158.49265 0.08408 300.08408 150.08408 15158.49208 2020-01-01 2020-01-02 2020-01-01 00:00:28 2020-01-02 03:45:28 2020-01-01 00:00:28.000 2020-01-02 03:45:28.000 28 99928 49978 5047778 28 99928 49978 5047778 -32541 32394 4557.009900990099 460258 -124 127 -0.297029702970297 -30 +280 101 10270 99181 0.84084 297.84084 149.34084 14934.08408 0.84084 297.84085 149.34084 14934.08403 0.84084 297.84084 149.34084 14934.08400 2020-01-01 2020-01-02 2020-01-01 00:04:40 2020-01-02 03:33:01 2020-01-01 00:04:40.000 2020-01-02 03:33:01.000 280 99181 49730.5 4973050 280 99181 49730.5 4973050 -32289 32646 5166.02 516602 -128 123 -5.18 -518 +281 101 10271 99182 0.84384 297.84384 149.34384 14934.38438 0.84384 297.84384 149.34384 14934.38421 0.84384 297.84384 149.34384 14934.38400 2020-01-01 2020-01-02 2020-01-01 00:04:41 2020-01-02 03:33:02 2020-01-01 00:04:41.000 2020-01-02 03:33:02.000 281 99182 49731.5 4973150 281 99182 49731.5 4973150 -32288 32647 5167.02 516702 -127 124 -4.18 -418 +282 101 10272 99183 0.84684 297.84684 149.34684 14934.68468 0.84684 297.84683 149.34684 14934.68453 0.84684 297.84684 149.34684 14934.68400 2020-01-01 2020-01-02 2020-01-01 00:04:42 2020-01-02 03:33:03 2020-01-01 00:04:42.000 2020-01-02 03:33:03.000 282 99183 49732.5 4973250 282 99183 49732.5 4973250 -32287 32648 5168.02 516802 -126 125 -3.18 -318 +283 101 10273 99184 0.84984 297.84984 149.34984 14934.98498 0.84984 297.84985 149.34985 14934.98526 0.84984 297.84984 149.34984 14934.98400 2020-01-01 2020-01-02 2020-01-01 00:04:43 2020-01-02 03:33:04 2020-01-01 00:04:43.000 2020-01-02 03:33:04.000 283 99184 49733.5 4973350 283 99184 49733.5 4973350 -32286 32649 5169.02 516902 -125 126 -2.18 -218 +284 101 10274 99185 0.85285 297.85285 149.35285 14935.28528 0.85285 297.85284 149.35285 14935.28542 0.85285 297.85285 149.35285 14935.28500 2020-01-01 2020-01-02 2020-01-01 00:04:44 2020-01-02 03:33:05 2020-01-01 00:04:44.000 2020-01-02 03:33:05.000 284 99185 49734.5 4973450 284 99185 49734.5 4973450 -32285 32650 5170.02 517002 -124 127 -1.18 -118 +285 101 10275 99186 0.85585 297.85585 149.35585 14935.58558 0.85585 297.85587 149.35585 14935.5855 0.85585 297.85585 149.35585 14935.58500 2020-01-01 2020-01-02 2020-01-01 00:04:45 2020-01-02 03:33:06 2020-01-01 00:04:45.000 2020-01-02 03:33:06.000 285 99186 49735.5 4973550 285 99186 49735.5 4973550 -32284 32651 5171.02 517102 -128 127 -2.74 -274 +286 101 10276 99187 0.85885 297.85885 149.35885 14935.88588 0.85885 297.85886 149.35885 14935.88568 0.85885 297.85885 149.35885 14935.88500 2020-01-01 2020-01-02 2020-01-01 00:04:46 2020-01-02 03:33:07 2020-01-01 00:04:46.000 2020-01-02 03:33:07.000 286 99187 49736.5 4973650 286 99187 49736.5 4973650 -32283 32652 5172.02 517202 -128 123 -4.3 -430 +287 101 10277 99188 0.86186 297.86186 149.36186 14936.18618 0.86186 297.86185 149.36186 14936.186 0.86186 297.86186 149.36186 14936.18600 2020-01-01 2020-01-02 2020-01-01 00:04:47 2020-01-02 03:33:08 2020-01-01 00:04:47.000 2020-01-02 03:33:08.000 287 99188 49737.5 4973750 287 99188 49737.5 4973750 -32282 32653 5173.02 517302 -127 124 -3.3 -330 +288 101 10278 99189 0.86486 297.86486 149.36486 14936.48648 0.86486 297.86487 149.36486 14936.48673 0.86486 297.86486 149.36486 14936.48600 2020-01-01 2020-01-02 2020-01-01 00:04:48 2020-01-02 03:33:09 2020-01-01 00:04:48.000 2020-01-02 03:33:09.000 288 99189 49738.5 4973850 288 99189 49738.5 4973850 -32281 32654 5174.02 517402 -126 125 -2.3 -230 +289 101 10279 99190 0.86786 297.86786 149.36786 14936.78678 0.86786 297.86786 149.36786 14936.78688 0.86786 297.86786 149.36786 14936.78600 2020-01-01 2020-01-02 2020-01-01 00:04:49 2020-01-02 03:33:10 2020-01-01 00:04:49.000 2020-01-02 03:33:10.000 289 99190 49739.5 4973950 289 99190 49739.5 4973950 -32280 32655 5175.02 517502 -125 126 -1.3 -130 +29 102 10019 99929 0.08708 300.08708 150.08708 15158.79579 0.08708 300.0871 150.08708 15158.79576 0.08708 300.08708 150.08708 15158.79508 2020-01-01 2020-01-02 2020-01-01 00:00:29 2020-01-02 03:45:29 2020-01-01 00:00:29.000 2020-01-02 03:45:29.000 29 99929 49979 5047879 29 99929 49979 5047879 -32540 32395 4558.009900990099 460359 -128 127 -1.8316831683168318 -185 +290 101 10280 99191 0.87087 297.87087 149.37087 14937.08708 0.87087 297.87088 149.37087 14937.087 0.87087 297.87087 149.37087 14937.08700 2020-01-01 2020-01-02 2020-01-01 00:04:50 2020-01-02 03:33:11 2020-01-01 00:04:50.000 2020-01-02 03:33:11.000 290 99191 49740.5 4974050 290 99191 49740.5 4974050 -32279 32656 5176.02 517602 -124 127 -0.3 -30 +291 101 10281 99192 0.87387 297.87387 149.37387 14937.38738 0.87387 297.87387 149.37387 14937.38716 0.87387 297.87387 149.37387 14937.38700 2020-01-01 2020-01-02 2020-01-01 00:04:51 2020-01-02 03:33:12 2020-01-01 00:04:51.000 2020-01-02 03:33:12.000 291 99192 49741.5 4974150 291 99192 49741.5 4974150 -32278 32657 5177.02 517702 -128 127 -1.86 -186 +292 101 10282 99193 0.87687 297.87687 149.37687 14937.68768 0.87687 297.8769 149.37687 14937.68789 0.87687 297.87687 149.37687 14937.68700 2020-01-01 2020-01-02 2020-01-01 00:04:52 2020-01-02 03:33:13 2020-01-01 00:04:52.000 2020-01-02 03:33:13.000 292 99193 49742.5 4974250 292 99193 49742.5 4974250 -32277 32658 5178.02 517802 -128 123 -3.42 -342 +293 101 10283 99194 0.87987 297.87987 149.37987 14937.98798 0.87987 297.87988 149.37988 14937.9882 0.87987 297.87987 149.37987 14937.98700 2020-01-01 2020-01-02 2020-01-01 00:04:53 2020-01-02 03:33:14 2020-01-01 00:04:53.000 2020-01-02 03:33:14.000 293 99194 49743.5 4974350 293 99194 49743.5 4974350 -32276 32659 5179.02 517902 -127 124 -2.42 -242 +294 101 10284 99195 0.88288 297.88288 149.38288 14938.28828 0.88288 297.88287 149.38288 14938.28835 0.88288 297.88288 149.38288 14938.28800 2020-01-01 2020-01-02 2020-01-01 00:04:54 2020-01-02 03:33:15 2020-01-01 00:04:54.000 2020-01-02 03:33:15.000 294 99195 49744.5 4974450 294 99195 49744.5 4974450 -32275 32660 5180.02 518002 -126 125 -1.42 -142 +295 101 10285 99196 0.88588 297.88588 149.38588 14938.58858 0.88588 297.8859 149.38588 14938.58847 0.88588 297.88588 149.38588 14938.58800 2020-01-01 2020-01-02 2020-01-01 00:04:55 2020-01-02 03:33:16 2020-01-01 00:04:55.000 2020-01-02 03:33:16.000 295 99196 49745.5 4974550 295 99196 49745.5 4974550 -32274 32661 5181.02 518102 -125 126 -0.42 -42 +296 101 10286 99197 0.88888 297.88888 149.38888 14938.88888 0.88888 297.8889 149.38888 14938.88863 0.88888 297.88888 149.38888 14938.88800 2020-01-01 2020-01-02 2020-01-01 00:04:56 2020-01-02 03:33:17 2020-01-01 00:04:56.000 2020-01-02 03:33:17.000 296 99197 49746.5 4974650 296 99197 49746.5 4974650 -32273 32662 5182.02 518202 -124 127 0.58 58 +297 101 10287 99198 0.89189 297.89189 149.39189 14939.18918 0.89189 297.8919 149.39189 14939.18936 0.89189 297.89189 149.39189 14939.18900 2020-01-01 2020-01-02 2020-01-01 00:04:57 2020-01-02 03:33:18 2020-01-01 00:04:57.000 2020-01-02 03:33:18.000 297 99198 49747.5 4974750 297 99198 49747.5 4974750 -32272 32663 5183.02 518302 -128 127 -0.98 -98 +298 101 10288 99199 0.89489 297.89489 149.39489 14939.48948 0.89489 297.8949 149.39489 14939.48967 0.89489 297.89489 149.39489 14939.48900 2020-01-01 2020-01-02 2020-01-01 00:04:58 2020-01-02 03:33:19 2020-01-01 00:04:58.000 2020-01-02 03:33:19.000 298 99199 49748.5 4974850 298 99199 49748.5 4974850 -32271 32664 5184.02 518402 -128 127 -2.54 -254 +299 101 10289 99200 0.89789 297.89789 149.39789 14939.78978 0.89789 297.8979 149.39789 14939.78986 0.89789 297.89789 149.39789 14939.78900 2020-01-01 2020-01-02 2020-01-01 00:04:59 2020-01-02 03:33:20 2020-01-01 00:04:59.000 2020-01-02 03:33:20.000 299 99200 49749.5 4974950 299 99200 49749.5 4974950 -32270 32665 5185.02 518502 -128 124 -4.1 -410 +3 102 1002 9993 0.009 300.009 150.009 15150.9099 0.009 300.009 150.009 15150.90958 0.00900 300.00900 150.00900 15150.90900 2020-01-01 2020-01-02 2020-01-01 00:00:03 2020-01-02 03:45:03 2020-01-01 00:00:03.000 2020-01-02 03:45:03.000 3 99903 49953 5045253 3 99903 49953 5045253 -32566 32369 4532.009900990099 457733 -124 127 0.04950495049504951 5 +30 102 10020 99930 0.09009 300.09009 150.09009 15159.09909 0.09009 300.0901 150.09008 15159.09894 0.09009 300.09009 150.09009 15159.09909 2020-01-01 2020-01-02 2020-01-01 00:00:30 2020-01-02 03:45:30 2020-01-01 00:00:30.000 2020-01-02 03:45:30.000 30 99930 49980 5047980 30 99930 49980 5047980 -32539 32396 4559.009900990099 460460 -128 123 -3.366336633663366 -340 +300 101 10290 99201 0.9009 297.9009 149.4009 14940.09009 0.9009 297.9009 149.40089 14940.08995 0.90090 297.90090 149.40090 14940.09000 2020-01-01 2020-01-02 2020-01-01 00:05:00 2020-01-02 03:33:21 2020-01-01 00:05:00.000 2020-01-02 03:33:21.000 300 99201 49750.5 4975050 300 99201 49750.5 4975050 -32269 32666 5186.02 518602 -127 125 -3.1 -310 +301 101 10291 99202 0.9039 297.9039 149.4039 14940.39039 0.9039 297.9039 149.4039 14940.39009 0.90390 297.90390 149.40390 14940.39000 2020-01-01 2020-01-02 2020-01-01 00:05:01 2020-01-02 03:33:22 2020-01-01 00:05:01.000 2020-01-02 03:33:22.000 301 99202 49751.5 4975150 301 99202 49751.5 4975150 -32268 32667 5187.02 518702 -126 126 -2.1 -210 +302 101 10292 99203 0.9069 297.9069 149.4069 14940.69069 0.9069 297.90692 149.4069 14940.69083 0.90690 297.90690 149.40690 14940.69000 2020-01-01 2020-01-02 2020-01-01 00:05:02 2020-01-02 03:33:23 2020-01-01 00:05:02.000 2020-01-02 03:33:23.000 302 99203 49752.5 4975250 302 99203 49752.5 4975250 -32267 32668 5188.02 518802 -125 127 -1.1 -110 +303 101 10293 99204 0.9099 297.9099 149.4099 14940.99099 0.9099 297.9099 149.40991 14940.99114 0.90990 297.90990 149.40990 14940.99000 2020-01-01 2020-01-02 2020-01-01 00:05:03 2020-01-02 03:33:24 2020-01-01 00:05:03.000 2020-01-02 03:33:24.000 303 99204 49753.5 4975350 303 99204 49753.5 4975350 -32266 32669 5189.02 518902 -128 127 -2.66 -266 +304 101 10294 99205 0.91291 297.91291 149.41291 14941.29129 0.91291 297.9129 149.41291 14941.29133 0.91291 297.91291 149.41291 14941.29100 2020-01-01 2020-01-02 2020-01-01 00:05:04 2020-01-02 03:33:25 2020-01-01 00:05:04.000 2020-01-02 03:33:25.000 304 99205 49754.5 4975450 304 99205 49754.5 4975450 -32265 32670 5190.02 519002 -128 127 -4.22 -422 +305 101 10295 99206 0.91591 297.91591 149.41591 14941.59159 0.91591 297.91592 149.41591 14941.59141 0.91591 297.91591 149.41591 14941.59100 2020-01-01 2020-01-02 2020-01-01 00:05:05 2020-01-02 03:33:26 2020-01-01 00:05:05.000 2020-01-02 03:33:26.000 305 99206 49755.5 4975550 305 99206 49755.5 4975550 -32264 32671 5191.02 519102 -128 123 -5.78 -578 +306 101 10296 99207 0.91891 297.91891 149.41891 14941.89189 0.91891 297.9189 149.41891 14941.89172 0.91891 297.91891 149.41891 14941.89100 2020-01-01 2020-01-02 2020-01-01 00:05:06 2020-01-02 03:33:27 2020-01-01 00:05:06.000 2020-01-02 03:33:27.000 306 99207 49756.5 4975650 306 99207 49756.5 4975650 -32263 32672 5192.02 519202 -127 124 -4.78 -478 +307 101 10297 99208 0.92192 297.92192 149.42192 14942.19219 0.92192 297.92194 149.42192 14942.1923 0.92192 297.92192 149.42192 14942.19200 2020-01-01 2020-01-02 2020-01-01 00:05:07 2020-01-02 03:33:28 2020-01-01 00:05:07.000 2020-01-02 03:33:28.000 307 99208 49757.5 4975750 307 99208 49757.5 4975750 -32262 32673 5193.02 519302 -126 125 -3.78 -378 +308 101 10298 99209 0.92492 297.92492 149.42492 14942.49249 0.92492 297.92493 149.42492 14942.49265 0.92492 297.92492 149.42492 14942.49200 2020-01-01 2020-01-02 2020-01-01 00:05:08 2020-01-02 03:33:29 2020-01-01 00:05:08.000 2020-01-02 03:33:29.000 308 99209 49758.5 4975850 308 99209 49758.5 4975850 -32261 32674 5194.02 519402 -125 126 -2.78 -278 +309 101 10299 99210 0.92792 297.92792 149.42792 14942.79279 0.92792 297.92792 149.42792 14942.7928 0.92792 297.92792 149.42792 14942.79200 2020-01-01 2020-01-02 2020-01-01 00:05:09 2020-01-02 03:33:30 2020-01-01 00:05:09.000 2020-01-02 03:33:30.000 309 99210 49759.5 4975950 309 99210 49759.5 4975950 -32260 32675 5195.02 519502 -124 127 -1.78 -178 +31 102 10021 99931 0.09309 300.09309 150.09309 15159.4024 0.09309 300.09308 150.09309 15159.40224 0.09309 300.09309 150.09309 15159.40209 2020-01-01 2020-01-02 2020-01-01 00:00:31 2020-01-02 03:45:31 2020-01-01 00:00:31.000 2020-01-02 03:45:31.000 31 99931 49981 5048081 31 99931 49981 5048081 -32538 32397 4560.009900990099 460561 -127 124 -2.366336633663366 -239 +310 101 10300 99211 0.93093 297.93093 149.43093 14943.09309 0.93093 297.93094 149.43092 14943.09288 0.93093 297.93093 149.43093 14943.09300 2020-01-01 2020-01-02 2020-01-01 00:05:10 2020-01-02 03:33:31 2020-01-01 00:05:10.000 2020-01-02 03:33:31.000 310 99211 49760.5 4976050 310 99211 49760.5 4976050 -32259 32676 5196.02 519602 -128 127 -3.34 -334 +311 101 10301 99212 0.93393 297.93393 149.43393 14943.39339 0.93393 297.93393 149.43393 14943.39319 0.93393 297.93393 149.43393 14943.39300 2020-01-01 2020-01-02 2020-01-01 00:05:11 2020-01-02 03:33:32 2020-01-01 00:05:11.000 2020-01-02 03:33:32.000 311 99212 49761.5 4976150 311 99212 49761.5 4976150 -32258 32677 5197.02 519702 -128 123 -4.9 -490 +312 101 10302 99213 0.93693 297.93693 149.43693 14943.69369 0.93693 297.93695 149.43693 14943.69377 0.93693 297.93693 149.43693 14943.69300 2020-01-01 2020-01-02 2020-01-01 00:05:12 2020-01-02 03:33:33 2020-01-01 00:05:12.000 2020-01-02 03:33:33.000 312 99213 49762.5 4976250 312 99213 49762.5 4976250 -32257 32678 5198.02 519802 -127 124 -3.9 -390 +313 101 10303 99214 0.93993 297.93993 149.43993 14943.99399 0.93993 297.93994 149.43994 14943.99412 0.93993 297.93993 149.43993 14943.99300 2020-01-01 2020-01-02 2020-01-01 00:05:13 2020-01-02 03:33:34 2020-01-01 00:05:13.000 2020-01-02 03:33:34.000 313 99214 49763.5 4976350 313 99214 49763.5 4976350 -32256 32679 5199.02 519902 -126 125 -2.9 -290 +314 101 10304 99215 0.94294 297.94294 149.44294 14944.29429 0.94294 297.94293 149.44294 14944.29427 0.94294 297.94294 149.44294 14944.29400 2020-01-01 2020-01-02 2020-01-01 00:05:14 2020-01-02 03:33:35 2020-01-01 00:05:14.000 2020-01-02 03:33:35.000 314 99215 49764.5 4976450 314 99215 49764.5 4976450 -32255 32680 5200.02 520002 -125 126 -1.9 -190 +315 101 10305 99216 0.94594 297.94594 149.44594 14944.59459 0.94594 297.94595 149.44595 14944.595 0.94594 297.94594 149.44594 14944.59400 2020-01-01 2020-01-02 2020-01-01 00:05:15 2020-01-02 03:33:36 2020-01-01 00:05:15.000 2020-01-02 03:33:36.000 315 99216 49765.5 4976550 315 99216 49765.5 4976550 -32254 32681 5201.02 520102 -124 127 -0.9 -90 +316 101 10306 99217 0.94894 297.94894 149.44894 14944.89489 0.94894 297.94894 149.44894 14944.89466 0.94894 297.94894 149.44894 14944.89400 2020-01-01 2020-01-02 2020-01-01 00:05:16 2020-01-02 03:33:37 2020-01-01 00:05:16.000 2020-01-02 03:33:37.000 316 99217 49766.5 4976650 316 99217 49766.5 4976650 -32253 32682 5202.02 520202 -128 127 -2.46 -246 +317 101 10307 99218 0.95195 297.95195 149.45195 14945.19519 0.95195 297.95197 149.45195 14945.19524 0.95195 297.95195 149.45195 14945.19500 2020-01-01 2020-01-02 2020-01-01 00:05:17 2020-01-02 03:33:38 2020-01-01 00:05:17.000 2020-01-02 03:33:38.000 317 99218 49767.5 4976750 317 99218 49767.5 4976750 -32252 32683 5203.02 520302 -128 123 -4.02 -402 +318 101 10308 99219 0.95495 297.95495 149.45495 14945.49549 0.95495 297.95496 149.45495 14945.49558 0.95495 297.95495 149.45495 14945.49500 2020-01-01 2020-01-02 2020-01-01 00:05:18 2020-01-02 03:33:39 2020-01-01 00:05:18.000 2020-01-02 03:33:39.000 318 99219 49768.5 4976850 318 99219 49768.5 4976850 -32251 32684 5204.02 520402 -127 124 -3.02 -302 +319 101 10309 99220 0.95795 297.95795 149.45795 14945.79579 0.95795 297.95795 149.45795 14945.79574 0.95795 297.95795 149.45795 14945.79500 2020-01-01 2020-01-02 2020-01-01 00:05:19 2020-01-02 03:33:40 2020-01-01 00:05:19.000 2020-01-02 03:33:40.000 319 99220 49769.5 4976950 319 99220 49769.5 4976950 -32250 32685 5205.02 520502 -126 125 -2.02 -202 +32 102 10022 99932 0.09609 300.09609 150.09609 15159.7057 0.09609 300.0961 150.09609 15159.706 0.09609 300.09609 150.09609 15159.70509 2020-01-01 2020-01-02 2020-01-01 00:00:32 2020-01-02 03:45:32 2020-01-01 00:00:32.000 2020-01-02 03:45:32.000 32 99932 49982 5048182 32 99932 49982 5048182 -32537 32398 4561.009900990099 460662 -126 125 -1.3663366336633664 -138 +320 101 10310 99221 0.96096 297.96096 149.46096 14946.09609 0.96096 297.96097 149.46096 14946.09647 0.96096 297.96096 149.46096 14946.09600 2020-01-01 2020-01-02 2020-01-01 00:05:20 2020-01-02 03:33:41 2020-01-01 00:05:20.000 2020-01-02 03:33:41.000 320 99221 49770.5 4977050 320 99221 49770.5 4977050 -32249 32686 5206.02 520602 -125 126 -1.02 -102 +321 101 10311 99222 0.96396 297.96396 149.46396 14946.39639 0.96396 297.96396 149.46396 14946.39613 0.96396 297.96396 149.46396 14946.39600 2020-01-01 2020-01-02 2020-01-01 00:05:21 2020-01-02 03:33:42 2020-01-01 00:05:21.000 2020-01-02 03:33:42.000 321 99222 49771.5 4977150 321 99222 49771.5 4977150 -32248 32687 5207.02 520702 -124 127 -0.02 -2 +322 101 10312 99223 0.96696 297.96696 149.46696 14946.69669 0.96696 297.96698 149.46696 14946.69674 0.96696 297.96696 149.46696 14946.69600 2020-01-01 2020-01-02 2020-01-01 00:05:22 2020-01-02 03:33:43 2020-01-01 00:05:22.000 2020-01-02 03:33:43.000 322 99223 49772.5 4977250 322 99223 49772.5 4977250 -32247 32688 5208.02 520802 -128 127 -1.58 -158 +323 101 10313 99224 0.96996 297.96996 149.46996 14946.99699 0.96997 297.96997 149.46997 14946.99706 0.96996 297.96996 149.46996 14946.99600 2020-01-01 2020-01-02 2020-01-01 00:05:23 2020-01-02 03:33:44 2020-01-01 00:05:23.000 2020-01-02 03:33:44.000 323 99224 49773.5 4977350 323 99224 49773.5 4977350 -32246 32689 5209.02 520902 -128 123 -3.14 -314 +324 101 10314 99225 0.97297 297.97297 149.47297 14947.29729 0.97297 297.97296 149.47297 14947.29737 0.97297 297.97297 149.47297 14947.29700 2020-01-01 2020-01-02 2020-01-01 00:05:24 2020-01-02 03:33:45 2020-01-01 00:05:24.000 2020-01-02 03:33:45.000 324 99225 49774.5 4977450 324 99225 49774.5 4977450 -32245 32690 5210.02 521002 -127 124 -2.14 -214 +325 101 10315 99226 0.97597 297.97597 149.47597 14947.59759 0.97597 297.97598 149.47597 14947.59794 0.97597 297.97597 149.47597 14947.59700 2020-01-01 2020-01-02 2020-01-01 00:05:25 2020-01-02 03:33:46 2020-01-01 00:05:25.000 2020-01-02 03:33:46.000 325 99226 49775.5 4977550 325 99226 49775.5 4977550 -32244 32691 5211.02 521102 -126 125 -1.14 -114 +326 101 10316 99227 0.97897 297.97897 149.47897 14947.89789 0.97897 297.97897 149.47897 14947.8976 0.97897 297.97897 149.47897 14947.89700 2020-01-01 2020-01-02 2020-01-01 00:05:26 2020-01-02 03:33:47 2020-01-01 00:05:26.000 2020-01-02 03:33:47.000 326 99227 49776.5 4977650 326 99227 49776.5 4977650 -32243 32692 5212.02 521202 -125 126 -0.14 -14 +327 101 10317 99228 0.98198 297.98198 149.48198 14948.19819 0.98198 297.982 149.48198 14948.19821 0.98198 297.98198 149.48198 14948.19800 2020-01-01 2020-01-02 2020-01-01 00:05:27 2020-01-02 03:33:48 2020-01-01 00:05:27.000 2020-01-02 03:33:48.000 327 99228 49777.5 4977750 327 99228 49777.5 4977750 -32242 32693 5213.02 521302 -124 127 0.86 86 +328 101 10318 99229 0.98498 297.98498 149.48498 14948.49849 0.98498 297.985 149.48498 14948.49853 0.98498 297.98498 149.48498 14948.49800 2020-01-01 2020-01-02 2020-01-01 00:05:28 2020-01-02 03:33:49 2020-01-01 00:05:28.000 2020-01-02 03:33:49.000 328 99229 49778.5 4977850 328 99229 49778.5 4977850 -32241 32694 5214.02 521402 -128 127 -0.7 -70 +329 101 10319 99230 0.98798 297.98798 149.48798 14948.79879 0.98798 297.98798 149.48798 14948.79883 0.98798 297.98798 149.48798 14948.79800 2020-01-01 2020-01-02 2020-01-01 00:05:29 2020-01-02 03:33:50 2020-01-01 00:05:29.000 2020-01-02 03:33:50.000 329 99230 49779.5 4977950 329 99230 49779.5 4977950 -32240 32695 5215.02 521502 -128 127 -2.26 -226 +33 102 10023 99933 0.09909 300.09909 150.09909 15160.009 0.09909 300.0991 150.0991 15160.00913 0.09909 300.09909 150.09909 15160.00809 2020-01-01 2020-01-02 2020-01-01 00:00:33 2020-01-02 03:45:33 2020-01-01 00:00:33.000 2020-01-02 03:45:33.000 33 99933 49983 5048283 33 99933 49983 5048283 -32536 32399 4562.009900990099 460763 -125 126 -0.36633663366336633 -37 +330 101 10320 99231 0.99099 297.99099 149.49099 14949.09909 0.99099 297.991 149.49099 14949.09941 0.99099 297.99099 149.49099 14949.09900 2020-01-01 2020-01-02 2020-01-01 00:05:30 2020-01-02 03:33:51 2020-01-01 00:05:30.000 2020-01-02 03:33:51.000 330 99231 49780.5 4978050 330 99231 49780.5 4978050 -32239 32696 5216.02 521602 -128 123 -3.82 -382 +331 101 10321 99232 0.99399 297.99399 149.49399 14949.39939 0.99399 297.994 149.49399 14949.39911 0.99399 297.99399 149.49399 14949.39900 2020-01-01 2020-01-02 2020-01-01 00:05:31 2020-01-02 03:33:52 2020-01-01 00:05:31.000 2020-01-02 03:33:52.000 331 99232 49781.5 4978150 331 99232 49781.5 4978150 -32238 32697 5217.02 521702 -127 124 -2.82 -282 +332 101 10322 99233 0.99699 297.99699 149.49699 14949.69969 0.99699 297.997 149.49699 14949.69969 0.99699 297.99699 149.49699 14949.69900 2020-01-01 2020-01-02 2020-01-01 00:05:32 2020-01-02 03:33:53 2020-01-01 00:05:32.000 2020-01-02 03:33:53.000 332 99233 49782.5 4978250 332 99233 49782.5 4978250 -32237 32698 5218.02 521802 -126 125 -1.82 -182 +333 101 10323 99234 1 298 149.5 14950 1 298 149.5 14950 1.00000 298.00000 149.50000 14950.00000 2020-01-01 2020-01-02 2020-01-01 00:05:33 2020-01-02 03:33:54 2020-01-01 00:05:33.000 2020-01-02 03:33:54.000 333 99234 49783.5 4978350 333 99234 49783.5 4978350 -32236 32699 5219.02 521902 -125 126 -0.82 -82 +334 101 10324 99235 1.003 298.003 149.503 14950.3003 1.003 298.003 149.503 14950.30029 1.00300 298.00300 149.50300 14950.30000 2020-01-01 2020-01-02 2020-01-01 00:05:34 2020-01-02 03:33:55 2020-01-01 00:05:34.000 2020-01-02 03:33:55.000 334 99235 49784.5 4978450 334 99235 49784.5 4978450 -32235 32700 5220.02 522002 -124 127 0.18 18 +335 101 10325 99236 1.006 298.006 149.506 14950.6006 1.006 298.006 149.506 14950.60088 1.00600 298.00600 149.50600 14950.60000 2020-01-01 2020-01-02 2020-01-01 00:05:35 2020-01-02 03:33:56 2020-01-01 00:05:35.000 2020-01-02 03:33:56.000 335 99236 49785.5 4978550 335 99236 49785.5 4978550 -32234 32701 5221.02 522102 -128 127 -1.38 -138 +336 101 10326 99237 1.009 298.009 149.509 14950.9009 1.009 298.009 149.509 14950.90057 1.00900 298.00900 149.50900 14950.90000 2020-01-01 2020-01-02 2020-01-01 00:05:36 2020-01-02 03:33:57 2020-01-01 00:05:36.000 2020-01-02 03:33:57.000 336 99237 49786.5 4978650 336 99237 49786.5 4978650 -32233 32702 5222.02 522202 -128 123 -2.94 -294 +337 101 10327 99238 1.01201 298.01201 149.51201 14951.2012 1.01201 298.01202 149.51201 14951.20117 1.01201 298.01201 149.51201 14951.20100 2020-01-01 2020-01-02 2020-01-01 00:05:37 2020-01-02 03:33:58 2020-01-01 00:05:37.000 2020-01-02 03:33:58.000 337 99238 49787.5 4978750 337 99238 49787.5 4978750 -32232 32703 5223.02 522302 -127 124 -1.94 -194 +338 101 10328 99239 1.01501 298.01501 149.51501 14951.5015 1.01501 298.015 149.51501 14951.50146 1.01501 298.01501 149.51501 14951.50100 2020-01-01 2020-01-02 2020-01-01 00:05:38 2020-01-02 03:33:59 2020-01-01 00:05:38.000 2020-01-02 03:33:59.000 338 99239 49788.5 4978850 338 99239 49788.5 4978850 -32231 32704 5224.02 522402 -126 125 -0.94 -94 +339 101 10329 99240 1.01801 298.01801 149.51801 14951.8018 1.01801 298.018 149.51801 14951.80177 1.01801 298.01801 149.51801 14951.80100 2020-01-01 2020-01-02 2020-01-01 00:05:39 2020-01-02 03:34:00 2020-01-01 00:05:39.000 2020-01-02 03:34:00.000 339 99240 49789.5 4978950 339 99240 49789.5 4978950 -32230 32705 5225.02 522502 -125 126 0.06 6 +34 102 10024 99934 0.1021 300.1021 150.1021 15160.31231 0.1021 300.1021 150.1021 15160.31224 0.10210 300.10210 150.10210 15160.31210 2020-01-01 2020-01-02 2020-01-01 00:00:34 2020-01-02 03:45:34 2020-01-01 00:00:34.000 2020-01-02 03:45:34.000 34 99934 49984 5048384 34 99934 49984 5048384 -32535 32400 4563.009900990099 460864 -124 127 0.6336633663366337 64 +340 101 10330 99241 1.02102 298.02102 149.52102 14952.1021 1.02102 298.02103 149.52102 14952.10239 1.02102 298.02102 149.52102 14952.10200 2020-01-01 2020-01-02 2020-01-01 00:05:40 2020-01-02 03:34:01 2020-01-01 00:05:40.000 2020-01-02 03:34:01.000 340 99241 49790.5 4979050 340 99241 49790.5 4979050 -32229 32706 5226.02 522602 -124 127 1.06 106 +341 101 10331 99242 1.02402 298.02402 149.52402 14952.4024 1.02402 298.02402 149.52402 14952.40205 1.02402 298.02402 149.52402 14952.40200 2020-01-01 2020-01-02 2020-01-01 00:05:41 2020-01-02 03:34:02 2020-01-01 00:05:41.000 2020-01-02 03:34:02.000 341 99242 49791.5 4979150 341 99242 49791.5 4979150 -32228 32707 5227.02 522702 -128 127 -0.5 -50 +342 101 10332 99243 1.02702 298.02702 149.52702 14952.7027 1.02702 298.02704 149.52702 14952.70264 1.02702 298.02702 149.52702 14952.70200 2020-01-01 2020-01-02 2020-01-01 00:05:42 2020-01-02 03:34:03 2020-01-01 00:05:42.000 2020-01-02 03:34:03.000 342 99243 49792.5 4979250 342 99243 49792.5 4979250 -32227 32708 5228.02 522802 -128 123 -2.06 -206 +343 101 10333 99244 1.03003 298.03003 149.53003 14953.003 1.03003 298.03003 149.53002 14953.00293 1.03003 298.03003 149.53003 14953.00300 2020-01-01 2020-01-02 2020-01-01 00:05:43 2020-01-02 03:34:04 2020-01-01 00:05:43.000 2020-01-02 03:34:04.000 343 99244 49793.5 4979350 343 99244 49793.5 4979350 -32226 32709 5229.02 522902 -127 124 -1.06 -106 +344 101 10334 99245 1.03303 298.03303 149.53303 14953.3033 1.03303 298.03302 149.53303 14953.30323 1.03303 298.03303 149.53303 14953.30300 2020-01-01 2020-01-02 2020-01-01 00:05:44 2020-01-02 03:34:05 2020-01-01 00:05:44.000 2020-01-02 03:34:05.000 344 99245 49794.5 4979450 344 99245 49794.5 4979450 -32225 32710 5230.02 523002 -126 125 -0.06 -6 +345 101 10335 99246 1.03603 298.03603 149.53603 14953.6036 1.03603 298.03604 149.53603 14953.60386 1.03603 298.03603 149.53603 14953.60300 2020-01-01 2020-01-02 2020-01-01 00:05:45 2020-01-02 03:34:06 2020-01-01 00:05:45.000 2020-01-02 03:34:06.000 345 99246 49795.5 4979550 345 99246 49795.5 4979550 -32224 32711 5231.02 523102 -125 126 0.94 94 +346 101 10336 99247 1.03903 298.03903 149.53903 14953.9039 1.03903 298.03903 149.53903 14953.90352 1.03903 298.03903 149.53903 14953.90300 2020-01-01 2020-01-02 2020-01-01 00:05:46 2020-01-02 03:34:07 2020-01-01 00:05:46.000 2020-01-02 03:34:07.000 346 99247 49796.5 4979650 346 99247 49796.5 4979650 -32223 32712 5232.02 523202 -124 127 1.94 194 +347 101 10337 99248 1.04204 298.04204 149.54204 14954.2042 1.04204 298.04205 149.54204 14954.20427 1.04204 298.04204 149.54204 14954.20400 2020-01-01 2020-01-02 2020-01-01 00:05:47 2020-01-02 03:34:08 2020-01-01 00:05:47.000 2020-01-02 03:34:08.000 347 99248 49797.5 4979750 347 99248 49797.5 4979750 -32222 32713 5233.02 523302 -128 127 0.38 38 +348 101 10338 99249 1.04504 298.04504 149.54504 14954.5045 1.04504 298.04504 149.54504 14954.50441 1.04504 298.04504 149.54504 14954.50400 2020-01-01 2020-01-02 2020-01-01 00:05:48 2020-01-02 03:34:09 2020-01-01 00:05:48.000 2020-01-02 03:34:09.000 348 99249 49798.5 4979850 348 99249 49798.5 4979850 -32221 32714 5234.02 523402 -128 123 -1.18 -118 +349 101 10339 99250 1.04804 298.04804 149.54804 14954.8048 1.04804 298.04803 149.54804 14954.80474 1.04804 298.04804 149.54804 14954.80400 2020-01-01 2020-01-02 2020-01-01 00:05:49 2020-01-02 03:34:10 2020-01-01 00:05:49.000 2020-01-02 03:34:10.000 349 99250 49799.5 4979950 349 99250 49799.5 4979950 -32220 32715 5235.02 523502 -127 124 -0.18 -18 +35 102 10025 99935 0.1051 300.1051 150.1051 15160.61561 0.1051 300.1051 150.1051 15160.61542 0.10510 300.10510 150.10510 15160.61510 2020-01-01 2020-01-02 2020-01-01 00:00:35 2020-01-02 03:45:35 2020-01-01 00:00:35.000 2020-01-02 03:45:35.000 35 99935 49985 5048485 35 99935 49985 5048485 -32534 32401 4564.009900990099 460965 -128 127 -0.900990099009901 -91 +350 101 10340 99251 1.05105 298.05105 149.55105 14955.1051 1.05105 298.05106 149.55105 14955.10532 1.05105 298.05105 149.55105 14955.10500 2020-01-01 2020-01-02 2020-01-01 00:05:50 2020-01-02 03:34:11 2020-01-01 00:05:50.000 2020-01-02 03:34:11.000 350 99251 49800.5 4980050 350 99251 49800.5 4980050 -32219 32716 5236.02 523602 -126 125 0.82 82 +351 101 10341 99252 1.05405 298.05405 149.55405 14955.4054 1.05405 298.05405 149.55404 14955.40499 1.05405 298.05405 149.55405 14955.40500 2020-01-01 2020-01-02 2020-01-01 00:05:51 2020-01-02 03:34:12 2020-01-01 00:05:51.000 2020-01-02 03:34:12.000 351 99252 49801.5 4980150 351 99252 49801.5 4980150 -32218 32717 5237.02 523702 -125 126 1.82 182 +352 101 10342 99253 1.05705 298.05705 149.55705 14955.7057 1.05705 298.05707 149.55705 14955.70574 1.05705 298.05705 149.55705 14955.70500 2020-01-01 2020-01-02 2020-01-01 00:05:52 2020-01-02 03:34:13 2020-01-01 00:05:52.000 2020-01-02 03:34:13.000 352 99253 49802.5 4980250 352 99253 49802.5 4980250 -32217 32718 5238.02 523802 -124 127 2.82 282 +353 101 10343 99254 1.06006 298.06006 149.56006 14956.006 1.06006 298.06006 149.56005 14956.00587 1.06006 298.06006 149.56006 14956.00600 2020-01-01 2020-01-02 2020-01-01 00:05:53 2020-01-02 03:34:14 2020-01-01 00:05:53.000 2020-01-02 03:34:14.000 353 99254 49803.5 4980350 353 99254 49803.5 4980350 -32216 32719 5239.02 523902 -128 127 1.26 126 +354 101 10344 99255 1.06306 298.06306 149.56306 14956.3063 1.06306 298.06305 149.56306 14956.3062 1.06306 298.06306 149.56306 14956.30600 2020-01-01 2020-01-02 2020-01-01 00:05:54 2020-01-02 03:34:15 2020-01-01 00:05:54.000 2020-01-02 03:34:15.000 354 99255 49804.5 4980450 354 99255 49804.5 4980450 -32215 32720 5240.02 524002 -128 127 -0.3 -30 +355 101 10345 99256 1.06606 298.06606 149.56606 14956.6066 1.06606 298.06607 149.56606 14956.6068 1.06606 298.06606 149.56606 14956.60600 2020-01-01 2020-01-02 2020-01-01 00:05:55 2020-01-02 03:34:16 2020-01-01 00:05:55.000 2020-01-02 03:34:16.000 355 99256 49805.5 4980550 355 99256 49805.5 4980550 -32214 32721 5241.02 524102 -128 123 -1.86 -186 +356 101 10346 99257 1.06906 298.06906 149.56906 14956.9069 1.06906 298.06906 149.56907 14956.90709 1.06906 298.06906 149.56906 14956.90600 2020-01-01 2020-01-02 2020-01-01 00:05:56 2020-01-02 03:34:17 2020-01-01 00:05:56.000 2020-01-02 03:34:17.000 356 99257 49806.5 4980650 356 99257 49806.5 4980650 -32213 32722 5242.02 524202 -127 124 -0.86 -86 +357 101 10347 99258 1.07207 298.07207 149.57207 14957.2072 1.07207 298.07208 149.57207 14957.20721 1.07207 298.07207 149.57207 14957.20700 2020-01-01 2020-01-02 2020-01-01 00:05:57 2020-01-02 03:34:18 2020-01-01 00:05:57.000 2020-01-02 03:34:18.000 357 99258 49807.5 4980750 357 99258 49807.5 4980750 -32212 32723 5243.02 524302 -126 125 0.14 14 +358 101 10348 99259 1.07507 298.07507 149.57507 14957.5075 1.07507 298.07507 149.57507 14957.50734 1.07507 298.07507 149.57507 14957.50700 2020-01-01 2020-01-02 2020-01-01 00:05:58 2020-01-02 03:34:19 2020-01-01 00:05:58.000 2020-01-02 03:34:19.000 358 99259 49808.5 4980850 358 99259 49808.5 4980850 -32211 32724 5244.02 524402 -125 126 1.14 114 +359 101 10349 99260 1.07807 298.07807 149.57807 14957.8078 1.07807 298.07806 149.57807 14957.80767 1.07807 298.07807 149.57807 14957.80700 2020-01-01 2020-01-02 2020-01-01 00:05:59 2020-01-02 03:34:20 2020-01-01 00:05:59.000 2020-01-02 03:34:20.000 359 99260 49809.5 4980950 359 99260 49809.5 4980950 -32210 32725 5245.02 524502 -124 127 2.14 214 +36 102 10026 99936 0.1081 300.1081 150.1081 15160.91891 0.1081 300.1081 150.1081 15160.91873 0.10810 300.10810 150.10810 15160.91810 2020-01-01 2020-01-02 2020-01-01 00:00:36 2020-01-02 03:45:36 2020-01-01 00:00:36.000 2020-01-02 03:45:36.000 36 99936 49986 5048586 36 99936 49986 5048586 -32533 32402 4565.009900990099 461066 -128 123 -2.4356435643564356 -246 +360 101 10350 99261 1.08108 298.08108 149.58108 14958.1081 1.08108 298.0811 149.58108 14958.10827 1.08108 298.08108 149.58108 14958.10800 2020-01-01 2020-01-02 2020-01-01 00:06:00 2020-01-02 03:34:21 2020-01-01 00:06:00.000 2020-01-02 03:34:21.000 360 99261 49810.5 4981050 360 99261 49810.5 4981050 -32209 32726 5246.02 524602 -128 127 0.58 58 +361 101 10351 99262 1.08408 298.08408 149.58408 14958.4084 1.08408 298.08408 149.58408 14958.40856 1.08408 298.08408 149.58408 14958.40800 2020-01-01 2020-01-02 2020-01-01 00:06:01 2020-01-02 03:34:22 2020-01-01 00:06:01.000 2020-01-02 03:34:22.000 361 99262 49811.5 4981150 361 99262 49811.5 4981150 -32208 32727 5247.02 524702 -128 123 -0.98 -98 +362 101 10352 99263 1.08708 298.08708 149.58708 14958.7087 1.08708 298.0871 149.58708 14958.70868 1.08708 298.08708 149.58708 14958.70800 2020-01-01 2020-01-02 2020-01-01 00:06:02 2020-01-02 03:34:23 2020-01-01 00:06:02.000 2020-01-02 03:34:23.000 362 99263 49812.5 4981250 362 99263 49812.5 4981250 -32207 32728 5248.02 524802 -127 124 0.02 2 +363 101 10353 99264 1.09009 298.09009 149.59009 14959.009 1.09009 298.0901 149.59008 14959.00884 1.09009 298.09009 149.59009 14959.00900 2020-01-01 2020-01-02 2020-01-01 00:06:03 2020-01-02 03:34:24 2020-01-01 00:06:03.000 2020-01-02 03:34:24.000 363 99264 49813.5 4981350 363 99264 49813.5 4981350 -32206 32729 5249.02 524902 -126 125 1.02 102 +364 101 10354 99265 1.09309 298.09309 149.59309 14959.3093 1.09309 298.09308 149.59309 14959.30915 1.09309 298.09309 149.59309 14959.30900 2020-01-01 2020-01-02 2020-01-01 00:06:04 2020-01-02 03:34:25 2020-01-01 00:06:04.000 2020-01-02 03:34:25.000 364 99265 49814.5 4981450 364 99265 49814.5 4981450 -32205 32730 5250.02 525002 -125 126 2.02 202 +365 101 10355 99266 1.09609 298.09609 149.59609 14959.6096 1.09609 298.0961 149.59609 14959.6099 1.09609 298.09609 149.59609 14959.60900 2020-01-01 2020-01-02 2020-01-01 00:06:05 2020-01-02 03:34:26 2020-01-01 00:06:05.000 2020-01-02 03:34:26.000 365 99266 49815.5 4981550 365 99266 49815.5 4981550 -32204 32731 5251.02 525102 -124 127 3.02 302 +366 101 10356 99267 1.09909 298.09909 149.59909 14959.9099 1.09909 298.0991 149.5991 14959.91003 1.09909 298.09909 149.59909 14959.90900 2020-01-01 2020-01-02 2020-01-01 00:06:06 2020-01-02 03:34:27 2020-01-01 00:06:06.000 2020-01-02 03:34:27.000 366 99267 49816.5 4981650 366 99267 49816.5 4981650 -32203 32732 5252.02 525202 -128 127 1.46 146 +367 101 10357 99268 1.1021 298.1021 149.6021 14960.21021 1.1021 298.1021 149.6021 14960.21015 1.10210 298.10210 149.60210 14960.21000 2020-01-01 2020-01-02 2020-01-01 00:06:07 2020-01-02 03:34:28 2020-01-01 00:06:07.000 2020-01-02 03:34:28.000 367 99268 49817.5 4981750 367 99268 49817.5 4981750 -32202 32733 5253.02 525302 -128 123 -0.1 -10 +368 101 10358 99269 1.1051 298.1051 149.6051 14960.51051 1.1051 298.1051 149.6051 14960.51031 1.10510 298.10510 149.60510 14960.51000 2020-01-01 2020-01-02 2020-01-01 00:06:08 2020-01-02 03:34:29 2020-01-01 00:06:08.000 2020-01-02 03:34:29.000 368 99269 49818.5 4981850 368 99269 49818.5 4981850 -32201 32734 5254.02 525402 -127 124 0.9 90 +369 101 10359 99270 1.1081 298.1081 149.6081 14960.81081 1.1081 298.1081 149.6081 14960.81062 1.10810 298.10810 149.60810 14960.81000 2020-01-01 2020-01-02 2020-01-01 00:06:09 2020-01-02 03:34:30 2020-01-01 00:06:09.000 2020-01-02 03:34:30.000 369 99270 49819.5 4981950 369 99270 49819.5 4981950 -32200 32735 5255.02 525502 -126 125 1.9 190 +37 102 10027 99937 0.11111 300.11111 150.11111 15161.22222 0.11111 300.1111 150.11111 15161.22248 0.11111 300.11111 150.11111 15161.22211 2020-01-01 2020-01-02 2020-01-01 00:00:37 2020-01-02 03:45:37 2020-01-01 00:00:37.000 2020-01-02 03:45:37.000 37 99937 49987 5048687 37 99937 49987 5048687 -32532 32403 4566.009900990099 461167 -127 124 -1.4356435643564356 -145 +370 101 10360 99271 1.11111 298.11111 149.61111 14961.11111 1.11111 298.1111 149.61111 14961.11137 1.11111 298.11111 149.61111 14961.11100 2020-01-01 2020-01-02 2020-01-01 00:06:10 2020-01-02 03:34:31 2020-01-01 00:06:10.000 2020-01-02 03:34:31.000 370 99271 49820.5 4982050 370 99271 49820.5 4982050 -32199 32736 5256.02 525602 -125 126 2.9 290 +371 101 10361 99272 1.11411 298.11411 149.61411 14961.41141 1.11411 298.1141 149.61411 14961.4115 1.11411 298.11411 149.61411 14961.41100 2020-01-01 2020-01-02 2020-01-01 00:06:11 2020-01-02 03:34:32 2020-01-01 00:06:11.000 2020-01-02 03:34:32.000 371 99272 49821.5 4982150 371 99272 49821.5 4982150 -32198 32737 5257.02 525702 -124 127 3.9 390 +372 101 10362 99273 1.11711 298.11711 149.61711 14961.71171 1.11711 298.11713 149.61711 14961.71165 1.11711 298.11711 149.61711 14961.71100 2020-01-01 2020-01-02 2020-01-01 00:06:12 2020-01-02 03:34:33 2020-01-01 00:06:12.000 2020-01-02 03:34:33.000 372 99273 49822.5 4982250 372 99273 49822.5 4982250 -32197 32738 5258.02 525802 -128 127 2.34 234 +373 101 10363 99274 1.12012 298.12012 149.62012 14962.01201 1.12012 298.12012 149.62011 14962.01179 1.12012 298.12012 149.62012 14962.01200 2020-01-01 2020-01-02 2020-01-01 00:06:13 2020-01-02 03:34:34 2020-01-01 00:06:13.000 2020-01-02 03:34:34.000 373 99274 49823.5 4982350 373 99274 49823.5 4982350 -32196 32739 5259.02 525902 -128 123 0.78 78 +374 101 10364 99275 1.12312 298.12312 149.62312 14962.31231 1.12312 298.1231 149.62312 14962.31208 1.12312 298.12312 149.62312 14962.31200 2020-01-01 2020-01-02 2020-01-01 00:06:14 2020-01-02 03:34:35 2020-01-01 00:06:14.000 2020-01-02 03:34:35.000 374 99275 49824.5 4982450 374 99275 49824.5 4982450 -32195 32740 5260.02 526002 -127 124 1.78 178 +375 101 10365 99276 1.12612 298.12612 149.62612 14962.61261 1.12612 298.12613 149.62612 14962.61283 1.12612 298.12612 149.62612 14962.61200 2020-01-01 2020-01-02 2020-01-01 00:06:15 2020-01-02 03:34:36 2020-01-01 00:06:15.000 2020-01-02 03:34:36.000 375 99276 49825.5 4982550 375 99276 49825.5 4982550 -32194 32741 5261.02 526102 -126 125 2.78 278 +376 101 10366 99277 1.12912 298.12912 149.62912 14962.91291 1.12912 298.12912 149.62912 14962.91297 1.12912 298.12912 149.62912 14962.91200 2020-01-01 2020-01-02 2020-01-01 00:06:16 2020-01-02 03:34:37 2020-01-01 00:06:16.000 2020-01-02 03:34:37.000 376 99277 49826.5 4982650 376 99277 49826.5 4982650 -32193 32742 5262.02 526202 -125 126 3.78 378 +377 101 10367 99278 1.13213 298.13213 149.63213 14963.21321 1.13213 298.13214 149.63213 14963.21312 1.13213 298.13213 149.63213 14963.21300 2020-01-01 2020-01-02 2020-01-01 00:06:17 2020-01-02 03:34:38 2020-01-01 00:06:17.000 2020-01-02 03:34:38.000 377 99278 49827.5 4982750 377 99278 49827.5 4982750 -32192 32743 5263.02 526302 -124 127 4.78 478 +378 101 10368 99279 1.13513 298.13513 149.63513 14963.51351 1.13513 298.13513 149.63513 14963.51326 1.13513 298.13513 149.63513 14963.51300 2020-01-01 2020-01-02 2020-01-01 00:06:18 2020-01-02 03:34:39 2020-01-01 00:06:18.000 2020-01-02 03:34:39.000 378 99279 49828.5 4982850 378 99279 49828.5 4982850 -32191 32744 5264.02 526402 -128 127 3.22 322 +379 101 10369 99280 1.13813 298.13813 149.63813 14963.81381 1.13813 298.13815 149.63814 14963.81401 1.13813 298.13813 149.63813 14963.81300 2020-01-01 2020-01-02 2020-01-01 00:06:19 2020-01-02 03:34:40 2020-01-01 00:06:19.000 2020-01-02 03:34:40.000 379 99280 49829.5 4982950 379 99280 49829.5 4982950 -32190 32745 5265.02 526502 -128 127 1.66 166 +38 102 10028 99938 0.11411 300.11411 150.11411 15161.52552 0.11411 300.1141 150.11411 15161.52562 0.11411 300.11411 150.11411 15161.52511 2020-01-01 2020-01-02 2020-01-01 00:00:38 2020-01-02 03:45:38 2020-01-01 00:00:38.000 2020-01-02 03:45:38.000 38 99938 49988 5048788 38 99938 49988 5048788 -32531 32404 4567.009900990099 461268 -126 125 -0.43564356435643564 -44 +380 101 10370 99281 1.14114 298.14114 149.64114 14964.11411 1.14114 298.14114 149.64114 14964.11431 1.14114 298.14114 149.64114 14964.11400 2020-01-01 2020-01-02 2020-01-01 00:06:20 2020-01-02 03:34:41 2020-01-01 00:06:20.000 2020-01-02 03:34:41.000 380 99281 49830.5 4983050 380 99281 49830.5 4983050 -32189 32746 5266.02 526602 -128 124 0.1 10 +381 101 10371 99282 1.14414 298.14414 149.64414 14964.41441 1.14414 298.14413 149.64414 14964.41448 1.14414 298.14414 149.64414 14964.41400 2020-01-01 2020-01-02 2020-01-01 00:06:21 2020-01-02 03:34:42 2020-01-01 00:06:21.000 2020-01-02 03:34:42.000 381 99282 49831.5 4983150 381 99282 49831.5 4983150 -32188 32747 5267.02 526702 -127 125 1.1 110 +382 101 10372 99283 1.14714 298.14714 149.64714 14964.71471 1.14714 298.14716 149.64714 14964.71459 1.14714 298.14714 149.64714 14964.71400 2020-01-01 2020-01-02 2020-01-01 00:06:22 2020-01-02 03:34:43 2020-01-01 00:06:22.000 2020-01-02 03:34:43.000 382 99283 49832.5 4983250 382 99283 49832.5 4983250 -32187 32748 5268.02 526802 -126 126 2.1 210 +383 101 10373 99284 1.15015 298.15015 149.65015 14965.01501 1.15015 298.15015 149.65014 14965.01472 1.15015 298.15015 149.65015 14965.01500 2020-01-01 2020-01-02 2020-01-01 00:06:23 2020-01-02 03:34:44 2020-01-01 00:06:23.000 2020-01-02 03:34:44.000 383 99284 49833.5 4983350 383 99284 49833.5 4983350 -32186 32749 5269.02 526902 -125 127 3.1 310 +384 101 10374 99285 1.15315 298.15315 149.65315 14965.31531 1.15315 298.15317 149.65315 14965.31547 1.15315 298.15315 149.65315 14965.31500 2020-01-01 2020-01-02 2020-01-01 00:06:24 2020-01-02 03:34:45 2020-01-01 00:06:24.000 2020-01-02 03:34:45.000 384 99285 49834.5 4983450 384 99285 49834.5 4983450 -32185 32750 5270.02 527002 -128 127 1.54 154 +385 101 10375 99286 1.15615 298.15615 149.65615 14965.61561 1.15615 298.15616 149.65615 14965.61578 1.15615 298.15615 149.65615 14965.61500 2020-01-01 2020-01-02 2020-01-01 00:06:25 2020-01-02 03:34:46 2020-01-01 00:06:25.000 2020-01-02 03:34:46.000 385 99286 49835.5 4983550 385 99286 49835.5 4983550 -32184 32751 5271.02 527102 -128 127 -0.02 -2 +386 101 10376 99287 1.15915 298.15915 149.65915 14965.91591 1.15915 298.15915 149.65915 14965.91594 1.15915 298.15915 149.65915 14965.91500 2020-01-01 2020-01-02 2020-01-01 00:06:26 2020-01-02 03:34:47 2020-01-01 00:06:26.000 2020-01-02 03:34:47.000 386 99287 49836.5 4983650 386 99287 49836.5 4983650 -32183 32752 5272.02 527202 -128 123 -1.58 -158 +387 101 10377 99288 1.16216 298.16216 149.66216 14966.21621 1.16216 298.16217 149.66216 14966.21606 1.16216 298.16216 149.66216 14966.21600 2020-01-01 2020-01-02 2020-01-01 00:06:27 2020-01-02 03:34:48 2020-01-01 00:06:27.000 2020-01-02 03:34:48.000 387 99288 49837.5 4983750 387 99288 49837.5 4983750 -32182 32753 5273.02 527302 -127 124 -0.58 -58 +388 101 10378 99289 1.16516 298.16516 149.66516 14966.51651 1.16516 298.16516 149.66516 14966.51636 1.16516 298.16516 149.66516 14966.51600 2020-01-01 2020-01-02 2020-01-01 00:06:28 2020-01-02 03:34:49 2020-01-01 00:06:28.000 2020-01-02 03:34:49.000 388 99289 49838.5 4983850 388 99289 49838.5 4983850 -32181 32754 5274.02 527402 -126 125 0.42 42 +389 101 10379 99290 1.16816 298.16816 149.66816 14966.81681 1.16816 298.16818 149.66816 14966.81695 1.16816 298.16816 149.66816 14966.81600 2020-01-01 2020-01-02 2020-01-01 00:06:29 2020-01-02 03:34:50 2020-01-01 00:06:29.000 2020-01-02 03:34:50.000 389 99290 49839.5 4983950 389 99290 49839.5 4983950 -32180 32755 5275.02 527502 -125 126 1.42 142 +39 102 10029 99939 0.11711 300.11711 150.11711 15161.82882 0.11711 300.11713 150.11711 15161.82876 0.11711 300.11711 150.11711 15161.82811 2020-01-01 2020-01-02 2020-01-01 00:00:39 2020-01-02 03:45:39 2020-01-01 00:00:39.000 2020-01-02 03:45:39.000 39 99939 49989 5048889 39 99939 49989 5048889 -32530 32405 4568.009900990099 461369 -125 126 0.5643564356435643 57 +390 101 10380 99291 1.17117 298.17117 149.67117 14967.11711 1.17117 298.17117 149.67117 14967.11725 1.17117 298.17117 149.67117 14967.11700 2020-01-01 2020-01-02 2020-01-01 00:06:30 2020-01-02 03:34:51 2020-01-01 00:06:30.000 2020-01-02 03:34:51.000 390 99291 49840.5 4984050 390 99291 49840.5 4984050 -32179 32756 5276.02 527602 -124 127 2.42 242 +391 101 10381 99292 1.17417 298.17417 149.67417 14967.41741 1.17417 298.17416 149.67417 14967.41741 1.17417 298.17417 149.67417 14967.41700 2020-01-01 2020-01-02 2020-01-01 00:06:31 2020-01-02 03:34:52 2020-01-01 00:06:31.000 2020-01-02 03:34:52.000 391 99292 49841.5 4984150 391 99292 49841.5 4984150 -32178 32757 5277.02 527702 -128 127 0.86 86 +392 101 10382 99293 1.17717 298.17717 149.67717 14967.71771 1.17717 298.1772 149.67717 14967.71753 1.17717 298.17717 149.67717 14967.71700 2020-01-01 2020-01-02 2020-01-01 00:06:32 2020-01-02 03:34:53 2020-01-01 00:06:32.000 2020-01-02 03:34:53.000 392 99293 49842.5 4984250 392 99293 49842.5 4984250 -32177 32758 5278.02 527802 -128 123 -0.7 -70 +393 101 10383 99294 1.18018 298.18018 149.68018 14968.01801 1.18018 298.18018 149.68017 14968.01782 1.18018 298.18018 149.68018 14968.01800 2020-01-01 2020-01-02 2020-01-01 00:06:33 2020-01-02 03:34:54 2020-01-01 00:06:33.000 2020-01-02 03:34:54.000 393 99294 49843.5 4984350 393 99294 49843.5 4984350 -32176 32759 5279.02 527902 -127 124 0.3 30 +394 101 10384 99295 1.18318 298.18318 149.68318 14968.31831 1.18318 298.1832 149.68318 14968.31842 1.18318 298.18318 149.68318 14968.31800 2020-01-01 2020-01-02 2020-01-01 00:06:34 2020-01-02 03:34:55 2020-01-01 00:06:34.000 2020-01-02 03:34:55.000 394 99295 49844.5 4984450 394 99295 49844.5 4984450 -32175 32760 5280.02 528002 -126 125 1.3 130 +395 101 10385 99296 1.18618 298.18618 149.68618 14968.61861 1.18618 298.1862 149.68618 14968.61875 1.18618 298.18618 149.68618 14968.61800 2020-01-01 2020-01-02 2020-01-01 00:06:35 2020-01-02 03:34:56 2020-01-01 00:06:35.000 2020-01-02 03:34:56.000 395 99296 49845.5 4984550 395 99296 49845.5 4984550 -32174 32761 5281.02 528102 -125 126 2.3 230 +396 101 10386 99297 1.18918 298.18918 149.68918 14968.91891 1.18918 298.18918 149.68918 14968.91889 1.18918 298.18918 149.68918 14968.91800 2020-01-01 2020-01-02 2020-01-01 00:06:36 2020-01-02 03:34:57 2020-01-01 00:06:36.000 2020-01-02 03:34:57.000 396 99297 49846.5 4984650 396 99297 49846.5 4984650 -32173 32762 5282.02 528202 -124 127 3.3 330 +397 101 10387 99298 1.19219 298.19219 149.69219 14969.21921 1.19219 298.1922 149.69219 14969.21964 1.19219 298.19219 149.69219 14969.21900 2020-01-01 2020-01-02 2020-01-01 00:06:37 2020-01-02 03:34:58 2020-01-01 00:06:37.000 2020-01-02 03:34:58.000 397 99298 49847.5 4984750 397 99298 49847.5 4984750 -32172 32763 5283.02 528302 -128 127 1.74 174 +398 101 10388 99299 1.19519 298.19519 149.69519 14969.51951 1.19519 298.1952 149.69519 14969.51929 1.19519 298.19519 149.69519 14969.51900 2020-01-01 2020-01-02 2020-01-01 00:06:38 2020-01-02 03:34:59 2020-01-01 00:06:38.000 2020-01-02 03:34:59.000 398 99299 49848.5 4984850 398 99299 49848.5 4984850 -32171 32764 5284.02 528402 -128 123 0.18 18 +399 101 10389 99300 1.19819 298.19819 149.69819 14969.81981 1.19819 298.1982 149.69819 14969.81989 1.19819 298.19819 149.69819 14969.81900 2020-01-01 2020-01-02 2020-01-01 00:06:39 2020-01-02 03:35:00 2020-01-01 00:06:39.000 2020-01-02 03:35:00.000 399 99300 49849.5 4984950 399 99300 49849.5 4984950 -32170 32765 5285.02 528502 -127 124 1.18 118 +4 102 1003 9994 0.01201 300.01201 150.01201 15151.21321 0.01201 300.01202 150.01201 15151.21318 0.01201 300.01201 150.01201 15151.21301 2020-01-01 2020-01-02 2020-01-01 00:00:04 2020-01-02 03:45:04 2020-01-01 00:00:04.000 2020-01-02 03:45:04.000 4 99904 49954 5045354 4 99904 49954 5045354 -32565 32370 4533.009900990099 457834 -128 127 -1.4851485148514851 -150 +40 102 10030 99940 0.12012 300.12012 150.12012 15162.13213 0.12012 300.12012 150.12011 15162.13191 0.12012 300.12012 150.12012 15162.13212 2020-01-01 2020-01-02 2020-01-01 00:00:40 2020-01-02 03:45:40 2020-01-01 00:00:40.000 2020-01-02 03:45:40.000 40 99940 49990 5048990 40 99940 49990 5048990 -32529 32406 4569.009900990099 461470 -124 127 1.5643564356435644 158 +400 101 10390 99301 1.2012 298.2012 149.7012 14970.12012 1.2012 298.2012 149.7012 14970.12022 1.20120 298.20120 149.70120 14970.12000 2020-01-01 2020-01-02 2020-01-01 00:06:40 2020-01-02 03:35:01 2020-01-01 00:06:40.000 2020-01-02 03:35:01.000 400 99301 49850.5 4985050 400 99301 49850.5 4985050 -32169 32766 5286.02 528602 -126 125 2.18 218 +401 101 10391 99302 1.2042 298.2042 149.7042 14970.42042 1.2042 298.2042 149.7042 14970.42035 1.20420 298.20420 149.70420 14970.42000 2020-01-01 2020-01-02 2020-01-01 00:06:41 2020-01-02 03:35:02 2020-01-01 00:06:41.000 2020-01-02 03:35:02.000 401 99302 49851.5 4985150 401 99302 49851.5 4985150 -32168 32767 5287.02 528702 -125 126 3.18 318 +402 101 10392 99303 1.2072 298.2072 149.7072 14970.72072 1.2072 298.2072 149.70721 14970.72111 1.20720 298.20720 149.70720 14970.72000 2020-01-01 2020-01-02 2020-01-01 00:06:42 2020-01-02 03:35:03 2020-01-01 00:06:42.000 2020-01-02 03:35:03.000 402 99303 49852.5 4985250 402 99303 49852.5 4985250 -32768 32370 4632.66 463266 -124 127 4.18 418 +403 101 10393 99304 1.21021 298.21021 149.71021 14971.02102 1.21021 298.2102 149.7102 14971.02077 1.21021 298.21021 149.71021 14971.02100 2020-01-01 2020-01-02 2020-01-01 00:06:43 2020-01-02 03:35:04 2020-01-01 00:06:43.000 2020-01-02 03:35:04.000 403 99304 49853.5 4985350 403 99304 49853.5 4985350 -32767 32371 4633.66 463366 -128 127 2.62 262 +404 101 10394 99305 1.21321 298.21321 149.71321 14971.32132 1.21321 298.21323 149.71321 14971.32139 1.21321 298.21321 149.71321 14971.32100 2020-01-01 2020-01-02 2020-01-01 00:06:44 2020-01-02 03:35:05 2020-01-01 00:06:44.000 2020-01-02 03:35:05.000 404 99305 49854.5 4985450 404 99305 49854.5 4985450 -32766 32372 4634.66 463466 -128 127 1.06 106 +405 101 10395 99306 1.21621 298.21621 149.71621 14971.62162 1.21621 298.21622 149.71621 14971.62169 1.21621 298.21621 149.71621 14971.62100 2020-01-01 2020-01-02 2020-01-01 00:06:45 2020-01-02 03:35:06 2020-01-01 00:06:45.000 2020-01-02 03:35:06.000 405 99306 49855.5 4985550 405 99306 49855.5 4985550 -32765 32373 4635.66 463566 -128 124 -0.5 -50 +406 101 10396 99307 1.21921 298.21921 149.71921 14971.92192 1.21921 298.2192 149.71921 14971.92199 1.21921 298.21921 149.71921 14971.92100 2020-01-01 2020-01-02 2020-01-01 00:06:46 2020-01-02 03:35:07 2020-01-01 00:06:46.000 2020-01-02 03:35:07.000 406 99307 49856.5 4985650 406 99307 49856.5 4985650 -32764 32374 4636.66 463666 -127 125 0.5 50 +407 101 10397 99308 1.22222 298.22222 149.72222 14972.22222 1.22222 298.22223 149.72222 14972.22257 1.22222 298.22222 149.72222 14972.22200 2020-01-01 2020-01-02 2020-01-01 00:06:47 2020-01-02 03:35:08 2020-01-01 00:06:47.000 2020-01-02 03:35:08.000 407 99308 49857.5 4985750 407 99308 49857.5 4985750 -32763 32375 4637.66 463766 -126 126 1.5 150 +408 101 10398 99309 1.22522 298.22522 149.72522 14972.52252 1.22522 298.22522 149.72522 14972.52224 1.22522 298.22522 149.72522 14972.52200 2020-01-01 2020-01-02 2020-01-01 00:06:48 2020-01-02 03:35:09 2020-01-01 00:06:48.000 2020-01-02 03:35:09.000 408 99309 49858.5 4985850 408 99309 49858.5 4985850 -32762 32376 4638.66 463866 -125 127 2.5 250 +409 101 10399 99310 1.22822 298.22822 149.72822 14972.82282 1.22822 298.22824 149.72822 14972.82286 1.22822 298.22822 149.72822 14972.82200 2020-01-01 2020-01-02 2020-01-01 00:06:49 2020-01-02 03:35:10 2020-01-01 00:06:49.000 2020-01-02 03:35:10.000 409 99310 49859.5 4985950 409 99310 49859.5 4985950 -32761 32377 4639.66 463966 -128 127 0.94 94 +41 102 10031 99941 0.12312 300.12312 150.12312 15162.43543 0.12312 300.1231 150.12312 15162.43521 0.12312 300.12312 150.12312 15162.43512 2020-01-01 2020-01-02 2020-01-01 00:00:41 2020-01-02 03:45:41 2020-01-01 00:00:41.000 2020-01-02 03:45:41.000 41 99941 49991 5049091 41 99941 49991 5049091 -32528 32407 4570.009900990099 461571 -128 127 0.0297029702970297 3 +410 101 10400 99311 1.23123 298.23123 149.73123 14973.12312 1.23123 298.23123 149.73123 14973.12316 1.23123 298.23123 149.73123 14973.12300 2020-01-01 2020-01-02 2020-01-01 00:06:50 2020-01-02 03:35:11 2020-01-01 00:06:50.000 2020-01-02 03:35:11.000 410 99311 49860.5 4986050 410 99311 49860.5 4986050 -32760 32378 4640.66 464066 -128 127 -0.62 -62 +411 101 10401 99312 1.23423 298.23423 149.73423 14973.42342 1.23423 298.23422 149.73423 14973.42345 1.23423 298.23423 149.73423 14973.42300 2020-01-01 2020-01-02 2020-01-01 00:06:51 2020-01-02 03:35:12 2020-01-01 00:06:51.000 2020-01-02 03:35:12.000 411 99312 49861.5 4986150 411 99312 49861.5 4986150 -32759 32379 4641.66 464166 -128 123 -2.18 -218 +412 101 10402 99313 1.23723 298.23723 149.73723 14973.72372 1.23723 298.23724 149.73724 14973.72405 1.23723 298.23723 149.73723 14973.72300 2020-01-01 2020-01-02 2020-01-01 00:06:52 2020-01-02 03:35:13 2020-01-01 00:06:52.000 2020-01-02 03:35:13.000 412 99313 49862.5 4986250 412 99313 49862.5 4986250 -32758 32380 4642.66 464266 -127 124 -1.18 -118 +413 101 10403 99314 1.24024 298.24024 149.74024 14974.02402 1.24024 298.24023 149.74023 14974.02374 1.24024 298.24024 149.74024 14974.02400 2020-01-01 2020-01-02 2020-01-01 00:06:53 2020-01-02 03:35:14 2020-01-01 00:06:53.000 2020-01-02 03:35:14.000 413 99314 49863.5 4986350 413 99314 49863.5 4986350 -32757 32381 4643.66 464366 -126 125 -0.18 -18 +414 101 10404 99315 1.24324 298.24324 149.74324 14974.32432 1.24324 298.24326 149.74324 14974.32433 1.24324 298.24324 149.74324 14974.32400 2020-01-01 2020-01-02 2020-01-01 00:06:54 2020-01-02 03:35:15 2020-01-01 00:06:54.000 2020-01-02 03:35:15.000 414 99315 49864.5 4986450 414 99315 49864.5 4986450 -32756 32382 4644.66 464466 -125 126 0.82 82 +415 101 10405 99316 1.24624 298.24624 149.74624 14974.62462 1.24624 298.24625 149.74624 14974.62463 1.24624 298.24624 149.74624 14974.62400 2020-01-01 2020-01-02 2020-01-01 00:06:55 2020-01-02 03:35:16 2020-01-01 00:06:55.000 2020-01-02 03:35:16.000 415 99316 49865.5 4986550 415 99316 49865.5 4986550 -32755 32383 4645.66 464566 -124 127 1.82 182 +416 101 10406 99317 1.24924 298.24924 149.74924 14974.92492 1.24924 298.24924 149.74924 14974.92492 1.24924 298.24924 149.74924 14974.92400 2020-01-01 2020-01-02 2020-01-01 00:06:56 2020-01-02 03:35:17 2020-01-01 00:06:56.000 2020-01-02 03:35:17.000 416 99317 49866.5 4986650 416 99317 49866.5 4986650 -32754 32384 4646.66 464666 -128 127 0.26 26 +417 101 10407 99318 1.25225 298.25225 149.75225 14975.22522 1.25225 298.25226 149.75225 14975.22552 1.25225 298.25225 149.75225 14975.22500 2020-01-01 2020-01-02 2020-01-01 00:06:57 2020-01-02 03:35:18 2020-01-01 00:06:57.000 2020-01-02 03:35:18.000 417 99318 49867.5 4986750 417 99318 49867.5 4986750 -32753 32385 4647.66 464766 -128 123 -1.3 -130 +418 101 10408 99319 1.25525 298.25525 149.75525 14975.52552 1.25525 298.25525 149.75525 14975.52521 1.25525 298.25525 149.75525 14975.52500 2020-01-01 2020-01-02 2020-01-01 00:06:58 2020-01-02 03:35:19 2020-01-01 00:06:58.000 2020-01-02 03:35:19.000 418 99319 49868.5 4986850 418 99319 49868.5 4986850 -32752 32386 4648.66 464866 -127 124 -0.3 -30 +419 101 10409 99320 1.25825 298.25825 149.75825 14975.82582 1.25825 298.25827 149.75825 14975.8258 1.25825 298.25825 149.75825 14975.82500 2020-01-01 2020-01-02 2020-01-01 00:06:59 2020-01-02 03:35:20 2020-01-01 00:06:59.000 2020-01-02 03:35:20.000 419 99320 49869.5 4986950 419 99320 49869.5 4986950 -32751 32387 4649.66 464966 -126 125 0.7 70 +42 102 10032 99942 0.12612 300.12612 150.12612 15162.73873 0.12612 300.12613 150.12612 15162.73896 0.12612 300.12612 150.12612 15162.73812 2020-01-01 2020-01-02 2020-01-01 00:00:42 2020-01-02 03:45:42 2020-01-01 00:00:42.000 2020-01-02 03:45:42.000 42 99942 49992 5049192 42 99942 49992 5049192 -32527 32408 4571.009900990099 461672 -128 127 -1.504950495049505 -152 +420 101 10410 99321 1.26126 298.26126 149.76126 14976.12612 1.26126 298.26126 149.76126 14976.12609 1.26126 298.26126 149.76126 14976.12600 2020-01-01 2020-01-02 2020-01-01 00:07:00 2020-01-02 03:35:21 2020-01-01 00:07:00.000 2020-01-02 03:35:21.000 420 99321 49870.5 4987050 420 99321 49870.5 4987050 -32750 32388 4650.66 465066 -125 126 1.7 170 +421 101 10411 99322 1.26426 298.26426 149.76426 14976.42642 1.26426 298.26425 149.76426 14976.4264 1.26426 298.26426 149.76426 14976.42600 2020-01-01 2020-01-02 2020-01-01 00:07:01 2020-01-02 03:35:22 2020-01-01 00:07:01.000 2020-01-02 03:35:22.000 421 99322 49871.5 4987150 421 99322 49871.5 4987150 -32749 32389 4651.66 465166 -124 127 2.7 270 +422 101 10412 99323 1.26726 298.26726 149.76726 14976.72672 1.26726 298.26727 149.76727 14976.72702 1.26726 298.26726 149.76726 14976.72600 2020-01-01 2020-01-02 2020-01-01 00:07:02 2020-01-02 03:35:23 2020-01-01 00:07:02.000 2020-01-02 03:35:23.000 422 99323 49872.5 4987250 422 99323 49872.5 4987250 -32748 32390 4652.66 465266 -128 127 1.14 114 +423 101 10413 99324 1.27027 298.27027 149.77027 14977.02702 1.27027 298.27026 149.77026 14977.02667 1.27027 298.27027 149.77027 14977.02700 2020-01-01 2020-01-02 2020-01-01 00:07:03 2020-01-02 03:35:24 2020-01-01 00:07:03.000 2020-01-02 03:35:24.000 423 99324 49873.5 4987350 423 99324 49873.5 4987350 -32747 32391 4653.66 465366 -128 123 -0.42 -42 +424 101 10414 99325 1.27327 298.27327 149.77327 14977.32732 1.27327 298.2733 149.77327 14977.32727 1.27327 298.27327 149.77327 14977.32700 2020-01-01 2020-01-02 2020-01-01 00:07:04 2020-01-02 03:35:25 2020-01-01 00:07:04.000 2020-01-02 03:35:25.000 424 99325 49874.5 4987450 424 99325 49874.5 4987450 -32746 32392 4654.66 465466 -127 124 0.58 58 +425 101 10415 99326 1.27627 298.27627 149.77627 14977.62762 1.27627 298.27628 149.77627 14977.62756 1.27627 298.27627 149.77627 14977.62700 2020-01-01 2020-01-02 2020-01-01 00:07:05 2020-01-02 03:35:26 2020-01-01 00:07:05.000 2020-01-02 03:35:26.000 425 99326 49875.5 4987550 425 99326 49875.5 4987550 -32745 32393 4655.66 465566 -126 125 1.58 158 +426 101 10416 99327 1.27927 298.27927 149.77927 14977.92792 1.27927 298.27927 149.77927 14977.92787 1.27927 298.27927 149.77927 14977.92700 2020-01-01 2020-01-02 2020-01-01 00:07:06 2020-01-02 03:35:27 2020-01-01 00:07:06.000 2020-01-02 03:35:27.000 426 99327 49876.5 4987650 426 99327 49876.5 4987650 -32744 32394 4656.66 465666 -125 126 2.58 258 +427 101 10417 99328 1.28228 298.28228 149.78228 14978.22822 1.28228 298.2823 149.78228 14978.22849 1.28228 298.28228 149.78228 14978.22800 2020-01-01 2020-01-02 2020-01-01 00:07:07 2020-01-02 03:35:28 2020-01-01 00:07:07.000 2020-01-02 03:35:28.000 427 99328 49877.5 4987750 427 99328 49877.5 4987750 -32743 32395 4657.66 465766 -124 127 3.58 358 +428 101 10418 99329 1.28528 298.28528 149.78528 14978.52852 1.28528 298.28528 149.78528 14978.52815 1.28528 298.28528 149.78528 14978.52800 2020-01-01 2020-01-02 2020-01-01 00:07:08 2020-01-02 03:35:29 2020-01-01 00:07:08.000 2020-01-02 03:35:29.000 428 99329 49878.5 4987850 428 99329 49878.5 4987850 -32742 32396 4658.66 465866 -128 127 2.02 202 +429 101 10419 99330 1.28828 298.28828 149.78828 14978.82882 1.28828 298.2883 149.78828 14978.8289 1.28828 298.28828 149.78828 14978.82800 2020-01-01 2020-01-02 2020-01-01 00:07:09 2020-01-02 03:35:30 2020-01-01 00:07:09.000 2020-01-02 03:35:30.000 429 99330 49879.5 4987950 429 99330 49879.5 4987950 -32741 32397 4659.66 465966 -128 127 0.46 46 +43 102 10033 99943 0.12912 300.12912 150.12912 15163.04204 0.12912 300.12912 150.12912 15163.04211 0.12912 300.12912 150.12912 15163.04112 2020-01-01 2020-01-02 2020-01-01 00:00:43 2020-01-02 03:45:43 2020-01-01 00:00:43.000 2020-01-02 03:45:43.000 43 99943 49993 5049293 43 99943 49993 5049293 -32526 32409 4572.009900990099 461773 -128 124 -3.0396039603960396 -307 +430 101 10420 99331 1.29129 298.29129 149.79129 14979.12912 1.29129 298.2913 149.79129 14979.12904 1.29129 298.29129 149.79129 14979.12900 2020-01-01 2020-01-02 2020-01-01 00:07:10 2020-01-02 03:35:31 2020-01-01 00:07:10.000 2020-01-02 03:35:31.000 430 99331 49880.5 4988050 430 99331 49880.5 4988050 -32740 32398 4660.66 466066 -128 124 -1.1 -110 +431 101 10421 99332 1.29429 298.29429 149.79429 14979.42942 1.29429 298.29428 149.79429 14979.42933 1.29429 298.29429 149.79429 14979.42900 2020-01-01 2020-01-02 2020-01-01 00:07:11 2020-01-02 03:35:32 2020-01-01 00:07:11.000 2020-01-02 03:35:32.000 431 99332 49881.5 4988150 431 99332 49881.5 4988150 -32739 32399 4661.66 466166 -127 125 -0.1 -10 +432 101 10422 99333 1.29729 298.29729 149.79729 14979.72972 1.29729 298.2973 149.79729 14979.72996 1.29729 298.29729 149.79729 14979.72900 2020-01-01 2020-01-02 2020-01-01 00:07:12 2020-01-02 03:35:33 2020-01-01 00:07:12.000 2020-01-02 03:35:33.000 432 99333 49882.5 4988250 432 99333 49882.5 4988250 -32738 32400 4662.66 466266 -126 126 0.9 90 +433 101 10423 99334 1.3003 298.3003 149.8003 14980.03003 1.3003 298.3003 149.80029 14980.02962 1.30030 298.30030 149.80030 14980.03000 2020-01-01 2020-01-02 2020-01-01 00:07:13 2020-01-02 03:35:34 2020-01-01 00:07:13.000 2020-01-02 03:35:34.000 433 99334 49883.5 4988350 433 99334 49883.5 4988350 -32737 32401 4663.66 466366 -125 127 1.9 190 +434 101 10424 99335 1.3033 298.3033 149.8033 14980.33033 1.3033 298.3033 149.8033 14980.33037 1.30330 298.30330 149.80330 14980.33000 2020-01-01 2020-01-02 2020-01-01 00:07:14 2020-01-02 03:35:35 2020-01-01 00:07:14.000 2020-01-02 03:35:35.000 434 99335 49884.5 4988450 434 99335 49884.5 4988450 -32736 32402 4664.66 466466 -128 127 0.34 34 +435 101 10425 99336 1.3063 298.3063 149.8063 14980.63063 1.3063 298.3063 149.8063 14980.63051 1.30630 298.30630 149.80630 14980.63000 2020-01-01 2020-01-02 2020-01-01 00:07:15 2020-01-02 03:35:36 2020-01-01 00:07:15.000 2020-01-02 03:35:36.000 435 99336 49885.5 4988550 435 99336 49885.5 4988550 -32735 32403 4665.66 466566 -128 127 -1.22 -122 +436 101 10426 99337 1.3093 298.3093 149.8093 14980.93093 1.3093 298.3093 149.8093 14980.93084 1.30930 298.30930 149.80930 14980.93000 2020-01-01 2020-01-02 2020-01-01 00:07:16 2020-01-02 03:35:37 2020-01-01 00:07:16.000 2020-01-02 03:35:37.000 436 99337 49886.5 4988650 436 99337 49886.5 4988650 -32734 32404 4666.66 466666 -128 123 -2.78 -278 +437 101 10427 99338 1.31231 298.31231 149.81231 14981.23123 1.31231 298.31232 149.81231 14981.23143 1.31231 298.31231 149.81231 14981.23100 2020-01-01 2020-01-02 2020-01-01 00:07:17 2020-01-02 03:35:38 2020-01-01 00:07:17.000 2020-01-02 03:35:38.000 437 99338 49887.5 4988750 437 99338 49887.5 4988750 -32733 32405 4667.66 466766 -127 124 -1.78 -178 +438 101 10428 99339 1.31531 298.31531 149.81531 14981.53153 1.31531 298.3153 149.81531 14981.53173 1.31531 298.31531 149.81531 14981.53100 2020-01-01 2020-01-02 2020-01-01 00:07:18 2020-01-02 03:35:39 2020-01-01 00:07:18.000 2020-01-02 03:35:39.000 438 99339 49888.5 4988850 438 99339 49888.5 4988850 -32732 32406 4668.66 466866 -126 125 -0.78 -78 +439 101 10429 99340 1.31831 298.31831 149.81831 14981.83183 1.31831 298.31833 149.81831 14981.83184 1.31831 298.31831 149.81831 14981.83100 2020-01-01 2020-01-02 2020-01-01 00:07:19 2020-01-02 03:35:40 2020-01-01 00:07:19.000 2020-01-02 03:35:40.000 439 99340 49889.5 4988950 439 99340 49889.5 4988950 -32731 32407 4669.66 466966 -125 126 0.22 22 +44 102 10034 99944 0.13213 300.13213 150.13213 15163.34534 0.13213 300.13214 150.13213 15163.34525 0.13213 300.13213 150.13213 15163.34513 2020-01-01 2020-01-02 2020-01-01 00:00:44 2020-01-02 03:45:44 2020-01-01 00:00:44.000 2020-01-02 03:45:44.000 44 99944 49994 5049394 44 99944 49994 5049394 -32525 32410 4573.009900990099 461874 -127 125 -2.0396039603960396 -206 +440 101 10430 99341 1.32132 298.32132 149.82132 14982.13213 1.32132 298.32132 149.82131 14982.13197 1.32132 298.32132 149.82132 14982.13200 2020-01-01 2020-01-02 2020-01-01 00:07:20 2020-01-02 03:35:41 2020-01-01 00:07:20.000 2020-01-02 03:35:41.000 440 99341 49890.5 4989050 440 99341 49890.5 4989050 -32730 32408 4670.66 467066 -124 127 1.22 122 +441 101 10431 99342 1.32432 298.32432 149.82432 14982.43243 1.32432 298.3243 149.82432 14982.4323 1.32432 298.32432 149.82432 14982.43200 2020-01-01 2020-01-02 2020-01-01 00:07:21 2020-01-02 03:35:42 2020-01-01 00:07:21.000 2020-01-02 03:35:42.000 441 99342 49891.5 4989150 441 99342 49891.5 4989150 -32729 32409 4671.66 467166 -128 127 -0.34 -34 +442 101 10432 99343 1.32732 298.32732 149.82732 14982.73273 1.32732 298.32733 149.82732 14982.7329 1.32732 298.32732 149.82732 14982.73200 2020-01-01 2020-01-02 2020-01-01 00:07:22 2020-01-02 03:35:43 2020-01-01 00:07:22.000 2020-01-02 03:35:43.000 442 99343 49892.5 4989250 442 99343 49892.5 4989250 -32728 32410 4672.66 467266 -128 123 -1.9 -190 +443 101 10433 99344 1.33033 298.33033 149.83033 14983.03303 1.33033 298.33032 149.83033 14983.03319 1.33033 298.33033 149.83033 14983.03300 2020-01-01 2020-01-02 2020-01-01 00:07:23 2020-01-02 03:35:44 2020-01-01 00:07:23.000 2020-01-02 03:35:44.000 443 99344 49893.5 4989350 443 99344 49893.5 4989350 -32727 32411 4673.66 467366 -127 124 -0.9 -90 +444 101 10434 99345 1.33333 298.33333 149.83333 14983.33333 1.33333 298.33334 149.83333 14983.33331 1.33333 298.33333 149.83333 14983.33300 2020-01-01 2020-01-02 2020-01-01 00:07:24 2020-01-02 03:35:45 2020-01-01 00:07:24.000 2020-01-02 03:35:45.000 444 99345 49894.5 4989450 444 99345 49894.5 4989450 -32726 32412 4674.66 467466 -126 125 0.1 10 +445 101 10435 99346 1.33633 298.33633 149.83633 14983.63363 1.33633 298.33633 149.83633 14983.63348 1.33633 298.33633 149.83633 14983.63300 2020-01-01 2020-01-02 2020-01-01 00:07:25 2020-01-02 03:35:46 2020-01-01 00:07:25.000 2020-01-02 03:35:46.000 445 99346 49895.5 4989550 445 99346 49895.5 4989550 -32725 32413 4675.66 467566 -125 126 1.1 110 +446 101 10436 99347 1.33933 298.33933 149.83933 14983.93393 1.33933 298.33932 149.83933 14983.93378 1.33933 298.33933 149.83933 14983.93300 2020-01-01 2020-01-02 2020-01-01 00:07:26 2020-01-02 03:35:47 2020-01-01 00:07:26.000 2020-01-02 03:35:47.000 446 99347 49896.5 4989650 446 99347 49896.5 4989650 -32724 32414 4676.66 467666 -124 127 2.1 210 +447 101 10437 99348 1.34234 298.34234 149.84234 14984.23423 1.34234 298.34235 149.84234 14984.23437 1.34234 298.34234 149.84234 14984.23400 2020-01-01 2020-01-02 2020-01-01 00:07:27 2020-01-02 03:35:48 2020-01-01 00:07:27.000 2020-01-02 03:35:48.000 447 99348 49897.5 4989750 447 99348 49897.5 4989750 -32723 32415 4677.66 467766 -128 127 0.54 54 +448 101 10438 99349 1.34534 298.34534 149.84534 14984.53453 1.34534 298.34534 149.84534 14984.53466 1.34534 298.34534 149.84534 14984.53400 2020-01-01 2020-01-02 2020-01-01 00:07:28 2020-01-02 03:35:49 2020-01-01 00:07:28.000 2020-01-02 03:35:49.000 448 99349 49898.5 4989850 448 99349 49898.5 4989850 -32722 32416 4678.66 467866 -128 123 -1.02 -102 +449 101 10439 99350 1.34834 298.34834 149.84834 14984.83483 1.34834 298.34836 149.84834 14984.83478 1.34834 298.34834 149.84834 14984.83400 2020-01-01 2020-01-02 2020-01-01 00:07:29 2020-01-02 03:35:50 2020-01-01 00:07:29.000 2020-01-02 03:35:50.000 449 99350 49899.5 4989950 449 99350 49899.5 4989950 -32721 32417 4679.66 467966 -127 124 -0.02 -2 +45 102 10035 99945 0.13513 300.13513 150.13513 15163.64864 0.13513 300.13513 150.13513 15163.64839 0.13513 300.13513 150.13513 15163.64813 2020-01-01 2020-01-02 2020-01-01 00:00:45 2020-01-02 03:45:45 2020-01-01 00:00:45.000 2020-01-02 03:45:45.000 45 99945 49995 5049495 45 99945 49995 5049495 -32524 32411 4574.009900990099 461975 -126 126 -1.0396039603960396 -105 +450 101 10440 99351 1.35135 298.35135 149.85135 14985.13513 1.35135 298.35135 149.85134 14985.13495 1.35135 298.35135 149.85135 14985.13500 2020-01-01 2020-01-02 2020-01-01 00:07:30 2020-01-02 03:35:51 2020-01-01 00:07:30.000 2020-01-02 03:35:51.000 450 99351 49900.5 4990050 450 99351 49900.5 4990050 -32720 32418 4680.66 468066 -126 125 0.98 98 +451 101 10441 99352 1.35435 298.35435 149.85435 14985.43543 1.35435 298.35434 149.85435 14985.43525 1.35435 298.35435 149.85435 14985.43500 2020-01-01 2020-01-02 2020-01-01 00:07:31 2020-01-02 03:35:52 2020-01-01 00:07:31.000 2020-01-02 03:35:52.000 451 99352 49901.5 4990150 451 99352 49901.5 4990150 -32719 32419 4681.66 468166 -125 126 1.98 198 +452 101 10442 99353 1.35735 298.35735 149.85735 14985.73573 1.35735 298.35736 149.85736 14985.736 1.35735 298.35735 149.85735 14985.73500 2020-01-01 2020-01-02 2020-01-01 00:07:32 2020-01-02 03:35:53 2020-01-01 00:07:32.000 2020-01-02 03:35:53.000 452 99353 49902.5 4990250 452 99353 49902.5 4990250 -32718 32420 4682.66 468266 -124 127 2.98 298 +453 101 10443 99354 1.36036 298.36036 149.86036 14986.03603 1.36036 298.36035 149.86036 14986.03614 1.36036 298.36036 149.86036 14986.03600 2020-01-01 2020-01-02 2020-01-01 00:07:33 2020-01-02 03:35:54 2020-01-01 00:07:33.000 2020-01-02 03:35:54.000 453 99354 49903.5 4990350 453 99354 49903.5 4990350 -32717 32421 4683.66 468366 -128 127 1.42 142 +454 101 10444 99355 1.36336 298.36336 149.86336 14986.33633 1.36336 298.36337 149.86336 14986.33629 1.36336 298.36336 149.86336 14986.33600 2020-01-01 2020-01-02 2020-01-01 00:07:34 2020-01-02 03:35:55 2020-01-01 00:07:34.000 2020-01-02 03:35:55.000 454 99355 49904.5 4990450 454 99355 49904.5 4990450 -32716 32422 4684.66 468466 -128 127 -0.14 -14 +455 101 10445 99356 1.36636 298.36636 149.86636 14986.63663 1.36636 298.36636 149.86636 14986.63641 1.36636 298.36636 149.86636 14986.63600 2020-01-01 2020-01-02 2020-01-01 00:07:35 2020-01-02 03:35:56 2020-01-01 00:07:35.000 2020-01-02 03:35:56.000 455 99356 49905.5 4990550 455 99356 49905.5 4990550 -32715 32423 4685.66 468566 -128 124 -1.7 -170 +456 101 10446 99357 1.36936 298.36936 149.86936 14986.93693 1.36936 298.36935 149.86936 14986.93672 1.36936 298.36936 149.86936 14986.93600 2020-01-01 2020-01-02 2020-01-01 00:07:36 2020-01-02 03:35:57 2020-01-01 00:07:36.000 2020-01-02 03:35:57.000 456 99357 49906.5 4990650 456 99357 49906.5 4990650 -32714 32424 4686.66 468666 -127 125 -0.7 -70 +457 101 10447 99358 1.37237 298.37237 149.87237 14987.23723 1.37237 298.37238 149.87237 14987.23747 1.37237 298.37237 149.87237 14987.23700 2020-01-01 2020-01-02 2020-01-01 00:07:37 2020-01-02 03:35:58 2020-01-01 00:07:37.000 2020-01-02 03:35:58.000 457 99358 49907.5 4990750 457 99358 49907.5 4990750 -32713 32425 4687.66 468766 -126 126 0.3 30 +458 101 10448 99359 1.37537 298.37537 149.87537 14987.53753 1.37537 298.37537 149.87537 14987.5376 1.37537 298.37537 149.87537 14987.53700 2020-01-01 2020-01-02 2020-01-01 00:07:38 2020-01-02 03:35:59 2020-01-01 00:07:38.000 2020-01-02 03:35:59.000 458 99359 49908.5 4990850 458 99359 49908.5 4990850 -32712 32426 4688.66 468866 -125 127 1.3 130 +459 101 10449 99360 1.37837 298.37837 149.87837 14987.83783 1.37837 298.3784 149.87837 14987.83775 1.37837 298.37837 149.87837 14987.83700 2020-01-01 2020-01-02 2020-01-01 00:07:39 2020-01-02 03:36:00 2020-01-01 00:07:39.000 2020-01-02 03:36:00.000 459 99360 49909.5 4990950 459 99360 49909.5 4990950 -32711 32427 4689.66 468966 -128 127 -0.26 -26 +46 102 10036 99946 0.13813 300.13813 150.13813 15163.95195 0.13813 300.13815 150.13814 15163.95214 0.13813 300.13813 150.13813 15163.95113 2020-01-01 2020-01-02 2020-01-01 00:00:46 2020-01-02 03:45:46 2020-01-01 00:00:46.000 2020-01-02 03:45:46.000 46 99946 49996 5049596 46 99946 49996 5049596 -32523 32412 4575.009900990099 462076 -125 127 -0.039603960396039604 -4 +460 101 10450 99361 1.38138 298.38138 149.88138 14988.13813 1.38138 298.38138 149.88137 14988.13789 1.38138 298.38138 149.88138 14988.13800 2020-01-01 2020-01-02 2020-01-01 00:07:40 2020-01-02 03:36:01 2020-01-01 00:07:40.000 2020-01-02 03:36:01.000 460 99361 49910.5 4991050 460 99361 49910.5 4991050 -32710 32428 4690.66 469066 -128 127 -1.82 -182 +461 101 10451 99362 1.38438 298.38438 149.88438 14988.43843 1.38438 298.3844 149.88438 14988.43864 1.38438 298.38438 149.88438 14988.43800 2020-01-01 2020-01-02 2020-01-01 00:07:41 2020-01-02 03:36:02 2020-01-01 00:07:41.000 2020-01-02 03:36:02.000 461 99362 49911.5 4991150 461 99362 49911.5 4991150 -32709 32429 4691.66 469166 -128 123 -3.38 -338 +462 101 10452 99363 1.38738 298.38738 149.88738 14988.73873 1.38738 298.3874 149.88738 14988.73894 1.38738 298.38738 149.88738 14988.73800 2020-01-01 2020-01-02 2020-01-01 00:07:42 2020-01-02 03:36:03 2020-01-01 00:07:42.000 2020-01-02 03:36:03.000 462 99363 49912.5 4991250 462 99363 49912.5 4991250 -32708 32430 4692.66 469266 -127 124 -2.38 -238 +463 101 10453 99364 1.39039 298.39039 149.89039 14989.03903 1.39039 298.39038 149.89039 14989.03907 1.39039 298.39039 149.89039 14989.03900 2020-01-01 2020-01-02 2020-01-01 00:07:43 2020-01-02 03:36:04 2020-01-01 00:07:43.000 2020-01-02 03:36:04.000 463 99364 49913.5 4991350 463 99364 49913.5 4991350 -32707 32431 4693.66 469366 -126 125 -1.38 -138 +464 101 10454 99365 1.39339 298.39339 149.89339 14989.33933 1.39339 298.3934 149.89339 14989.33922 1.39339 298.39339 149.89339 14989.33900 2020-01-01 2020-01-02 2020-01-01 00:07:44 2020-01-02 03:36:05 2020-01-01 00:07:44.000 2020-01-02 03:36:05.000 464 99365 49914.5 4991450 464 99365 49914.5 4991450 -32706 32432 4694.66 469466 -125 126 -0.38 -38 +465 101 10455 99366 1.39639 298.39639 149.89639 14989.63963 1.39639 298.3964 149.89639 14989.63936 1.39639 298.39639 149.89639 14989.63900 2020-01-01 2020-01-02 2020-01-01 00:07:45 2020-01-02 03:36:06 2020-01-01 00:07:45.000 2020-01-02 03:36:06.000 465 99366 49915.5 4991550 465 99366 49915.5 4991550 -32705 32433 4695.66 469566 -124 127 0.62 62 +466 101 10456 99367 1.39939 298.39939 149.89939 14989.93993 1.39939 298.3994 149.8994 14989.94011 1.39939 298.39939 149.89939 14989.93900 2020-01-01 2020-01-02 2020-01-01 00:07:46 2020-01-02 03:36:07 2020-01-01 00:07:46.000 2020-01-02 03:36:07.000 466 99367 49916.5 4991650 466 99367 49916.5 4991650 -32704 32434 4696.66 469666 -128 127 -0.94 -94 +467 101 10457 99368 1.4024 298.4024 149.9024 14990.24024 1.4024 298.4024 149.9024 14990.24041 1.40240 298.40240 149.90240 14990.24000 2020-01-01 2020-01-02 2020-01-01 00:07:47 2020-01-02 03:36:08 2020-01-01 00:07:47.000 2020-01-02 03:36:08.000 467 99368 49917.5 4991750 467 99368 49917.5 4991750 -32703 32435 4697.66 469766 -128 123 -2.5 -250 +468 101 10458 99369 1.4054 298.4054 149.9054 14990.54054 1.4054 298.4054 149.9054 14990.54058 1.40540 298.40540 149.90540 14990.54000 2020-01-01 2020-01-02 2020-01-01 00:07:48 2020-01-02 03:36:09 2020-01-01 00:07:48.000 2020-01-02 03:36:09.000 468 99369 49918.5 4991850 468 99369 49918.5 4991850 -32702 32436 4698.66 469866 -127 124 -1.5 -150 +469 101 10459 99370 1.4084 298.4084 149.9084 14990.84084 1.4084 298.40842 149.9084 14990.8407 1.40840 298.40840 149.90840 14990.84000 2020-01-01 2020-01-02 2020-01-01 00:07:49 2020-01-02 03:36:10 2020-01-01 00:07:49.000 2020-01-02 03:36:10.000 469 99370 49919.5 4991950 469 99370 49919.5 4991950 -32701 32437 4699.66 469966 -126 125 -0.5 -50 +47 102 10037 99947 0.14114 300.14114 150.14114 15164.25525 0.14114 300.14114 150.14114 15164.25545 0.14114 300.14114 150.14114 15164.25514 2020-01-01 2020-01-02 2020-01-01 00:00:47 2020-01-02 03:45:47 2020-01-01 00:00:47.000 2020-01-02 03:45:47.000 47 99947 49997 5049697 47 99947 49997 5049697 -32522 32413 4576.009900990099 462177 -128 127 -1.5742574257425743 -159 +470 101 10460 99371 1.41141 298.41141 149.91141 14991.14114 1.41141 298.4114 149.9114 14991.14099 1.41141 298.41141 149.91141 14991.14100 2020-01-01 2020-01-02 2020-01-01 00:07:50 2020-01-02 03:36:11 2020-01-01 00:07:50.000 2020-01-02 03:36:11.000 470 99371 49920.5 4992050 470 99371 49920.5 4992050 -32700 32438 4700.66 470066 -125 126 0.5 50 +471 101 10461 99372 1.41441 298.41441 149.91441 14991.44144 1.41441 298.41443 149.91441 14991.44159 1.41441 298.41441 149.91441 14991.44100 2020-01-01 2020-01-02 2020-01-01 00:07:51 2020-01-02 03:36:12 2020-01-01 00:07:51.000 2020-01-02 03:36:12.000 471 99372 49921.5 4992150 471 99372 49921.5 4992150 -32699 32439 4701.66 470166 -124 127 1.5 150 +472 101 10462 99373 1.41741 298.41741 149.91741 14991.74174 1.41741 298.41742 149.91741 14991.74188 1.41741 298.41741 149.91741 14991.74100 2020-01-01 2020-01-02 2020-01-01 00:07:52 2020-01-02 03:36:13 2020-01-01 00:07:52.000 2020-01-02 03:36:13.000 472 99373 49922.5 4992250 472 99373 49922.5 4992250 -32698 32440 4702.66 470266 -128 127 -0.06 -6 +473 101 10463 99374 1.42042 298.42042 149.92042 14992.04204 1.42042 298.4204 149.92042 14992.04204 1.42042 298.42042 149.92042 14992.04200 2020-01-01 2020-01-02 2020-01-01 00:07:53 2020-01-02 03:36:14 2020-01-01 00:07:53.000 2020-01-02 03:36:14.000 473 99374 49923.5 4992350 473 99374 49923.5 4992350 -32697 32441 4703.66 470366 -128 123 -1.62 -162 +474 101 10464 99375 1.42342 298.42342 149.92342 14992.34234 1.42342 298.42343 149.92342 14992.34216 1.42342 298.42342 149.92342 14992.34200 2020-01-01 2020-01-02 2020-01-01 00:07:54 2020-01-02 03:36:15 2020-01-01 00:07:54.000 2020-01-02 03:36:15.000 474 99375 49924.5 4992450 474 99375 49924.5 4992450 -32696 32442 4704.66 470466 -127 124 -0.62 -62 +475 101 10465 99376 1.42642 298.42642 149.92642 14992.64264 1.42642 298.42642 149.92642 14992.64246 1.42642 298.42642 149.92642 14992.64200 2020-01-01 2020-01-02 2020-01-01 00:07:55 2020-01-02 03:36:16 2020-01-01 00:07:55.000 2020-01-02 03:36:16.000 475 99376 49925.5 4992550 475 99376 49925.5 4992550 -32695 32443 4705.66 470566 -126 125 0.38 38 +476 101 10466 99377 1.42942 298.42942 149.92942 14992.94294 1.42942 298.42944 149.92943 14992.94305 1.42942 298.42942 149.92942 14992.94200 2020-01-01 2020-01-02 2020-01-01 00:07:56 2020-01-02 03:36:17 2020-01-01 00:07:56.000 2020-01-02 03:36:17.000 476 99377 49926.5 4992650 476 99377 49926.5 4992650 -32694 32444 4706.66 470666 -125 126 1.38 138 +477 101 10467 99378 1.43243 298.43243 149.93243 14993.24324 1.43243 298.43243 149.93243 14993.24338 1.43243 298.43243 149.93243 14993.24300 2020-01-01 2020-01-02 2020-01-01 00:07:57 2020-01-02 03:36:18 2020-01-01 00:07:57.000 2020-01-02 03:36:18.000 477 99378 49927.5 4992750 477 99378 49927.5 4992750 -32693 32445 4707.66 470766 -124 127 2.38 238 +478 101 10468 99379 1.43543 298.43543 149.93543 14993.54354 1.43543 298.43542 149.93543 14993.54352 1.43543 298.43543 149.93543 14993.54300 2020-01-01 2020-01-02 2020-01-01 00:07:58 2020-01-02 03:36:19 2020-01-01 00:07:58.000 2020-01-02 03:36:19.000 478 99379 49928.5 4992850 478 99379 49928.5 4992850 -32692 32446 4708.66 470866 -128 127 0.82 82 +479 101 10469 99380 1.43843 298.43843 149.93843 14993.84384 1.43843 298.43845 149.93844 14993.84427 1.43843 298.43843 149.93843 14993.84300 2020-01-01 2020-01-02 2020-01-01 00:07:59 2020-01-02 03:36:20 2020-01-01 00:07:59.000 2020-01-02 03:36:20.000 479 99380 49929.5 4992950 479 99380 49929.5 4992950 -32691 32447 4709.66 470966 -128 127 -0.74 -74 +48 102 10038 99948 0.14414 300.14414 150.14414 15164.55855 0.14414 300.14413 150.14414 15164.55863 0.14414 300.14414 150.14414 15164.55814 2020-01-01 2020-01-02 2020-01-01 00:00:48 2020-01-02 03:45:48 2020-01-01 00:00:48.000 2020-01-02 03:45:48.000 48 99948 49998 5049798 48 99948 49998 5049798 -32521 32414 4577.009900990099 462278 -128 127 -3.108910891089109 -314 +480 101 10470 99381 1.44144 298.44144 149.94144 14994.14414 1.44144 298.44144 149.94143 14994.14392 1.44144 298.44144 149.94144 14994.14400 2020-01-01 2020-01-02 2020-01-01 00:08:00 2020-01-02 03:36:21 2020-01-01 00:08:00.000 2020-01-02 03:36:21.000 480 99381 49930.5 4993050 480 99381 49930.5 4993050 -32690 32448 4710.66 471066 -128 124 -2.3 -230 +481 101 10471 99382 1.44444 298.44444 149.94444 14994.44444 1.44444 298.44446 149.94444 14994.44452 1.44444 298.44444 149.94444 14994.44400 2020-01-01 2020-01-02 2020-01-01 00:08:01 2020-01-02 03:36:22 2020-01-01 00:08:01.000 2020-01-02 03:36:22.000 481 99382 49931.5 4993150 481 99382 49931.5 4993150 -32689 32449 4711.66 471166 -127 125 -1.3 -130 +482 101 10472 99383 1.44744 298.44744 149.94744 14994.74474 1.44744 298.44745 149.94744 14994.74485 1.44744 298.44744 149.94744 14994.74400 2020-01-01 2020-01-02 2020-01-01 00:08:02 2020-01-02 03:36:23 2020-01-01 00:08:02.000 2020-01-02 03:36:23.000 482 99383 49932.5 4993250 482 99383 49932.5 4993250 -32688 32450 4712.66 471266 -126 126 -0.3 -30 +483 101 10473 99384 1.45045 298.45045 149.95045 14995.04504 1.45045 298.45044 149.95044 14995.04499 1.45045 298.45045 149.95045 14995.04500 2020-01-01 2020-01-02 2020-01-01 00:08:03 2020-01-02 03:36:24 2020-01-01 00:08:03.000 2020-01-02 03:36:24.000 483 99384 49933.5 4993350 483 99384 49933.5 4993350 -32687 32451 4713.66 471366 -125 127 0.7 70 +484 101 10474 99385 1.45345 298.45345 149.95345 14995.34534 1.45345 298.45346 149.95345 14995.34574 1.45345 298.45345 149.95345 14995.34500 2020-01-01 2020-01-02 2020-01-01 00:08:04 2020-01-02 03:36:25 2020-01-01 00:08:04.000 2020-01-02 03:36:25.000 484 99385 49934.5 4993450 484 99385 49934.5 4993450 -32686 32452 4714.66 471466 -128 127 -0.86 -86 +485 101 10475 99386 1.45645 298.45645 149.95645 14995.64564 1.45645 298.45645 149.95645 14995.6454 1.45645 298.45645 149.95645 14995.64500 2020-01-01 2020-01-02 2020-01-01 00:08:05 2020-01-02 03:36:26 2020-01-01 00:08:05.000 2020-01-02 03:36:26.000 485 99386 49935.5 4993550 485 99386 49935.5 4993550 -32685 32453 4715.66 471566 -128 127 -2.42 -242 +486 101 10476 99387 1.45945 298.45945 149.95945 14995.94594 1.45945 298.45947 149.95946 14995.94602 1.45945 298.45945 149.95945 14995.94500 2020-01-01 2020-01-02 2020-01-01 00:08:06 2020-01-02 03:36:27 2020-01-01 00:08:06.000 2020-01-02 03:36:27.000 486 99387 49936.5 4993650 486 99387 49936.5 4993650 -32684 32454 4716.66 471666 -128 123 -3.98 -398 +487 101 10477 99388 1.46246 298.46246 149.96246 14996.24624 1.46246 298.46246 149.96246 14996.24633 1.46246 298.46246 149.96246 14996.24600 2020-01-01 2020-01-02 2020-01-01 00:08:07 2020-01-02 03:36:28 2020-01-01 00:08:07.000 2020-01-02 03:36:28.000 487 99388 49937.5 4993750 487 99388 49937.5 4993750 -32683 32455 4717.66 471766 -127 124 -2.98 -298 +488 101 10478 99389 1.46546 298.46546 149.96546 14996.54654 1.46546 298.46545 149.96546 14996.54645 1.46546 298.46546 149.96546 14996.54600 2020-01-01 2020-01-02 2020-01-01 00:08:08 2020-01-02 03:36:29 2020-01-01 00:08:08.000 2020-01-02 03:36:29.000 488 99389 49938.5 4993850 488 99389 49938.5 4993850 -32682 32456 4718.66 471866 -126 125 -1.98 -198 +489 101 10479 99390 1.46846 298.46846 149.96846 14996.84684 1.46846 298.46848 149.96847 14996.84721 1.46846 298.46846 149.96846 14996.84600 2020-01-01 2020-01-02 2020-01-01 00:08:09 2020-01-02 03:36:30 2020-01-01 00:08:09.000 2020-01-02 03:36:30.000 489 99390 49939.5 4993950 489 99390 49939.5 4993950 -32681 32457 4719.66 471966 -125 126 -0.98 -98 +49 102 10039 99949 0.14714 300.14714 150.14714 15164.86186 0.14714 300.14716 150.14714 15164.86173 0.14714 300.14714 150.14714 15164.86114 2020-01-01 2020-01-02 2020-01-01 00:00:49 2020-01-02 03:45:49 2020-01-01 00:00:49.000 2020-01-02 03:45:49.000 49 99949 49999 5049899 49 99949 49999 5049899 -32520 32415 4578.009900990099 462379 -128 123 -4.643564356435643 -469 +490 101 10480 99391 1.47147 298.47147 149.97147 14997.14714 1.47147 298.47147 149.97146 14997.14687 1.47147 298.47147 149.97147 14997.14700 2020-01-01 2020-01-02 2020-01-01 00:08:10 2020-01-02 03:36:31 2020-01-01 00:08:10.000 2020-01-02 03:36:31.000 490 99391 49940.5 4994050 490 99391 49940.5 4994050 -32680 32458 4720.66 472066 -124 127 0.02 2 +491 101 10481 99392 1.47447 298.47447 149.97447 14997.44744 1.47447 298.4745 149.97447 14997.44749 1.47447 298.47447 149.97447 14997.44700 2020-01-01 2020-01-02 2020-01-01 00:08:11 2020-01-02 03:36:32 2020-01-01 00:08:11.000 2020-01-02 03:36:32.000 491 99392 49941.5 4994150 491 99392 49941.5 4994150 -32679 32459 4721.66 472166 -128 127 -1.54 -154 +492 101 10482 99393 1.47747 298.47747 149.97747 14997.74774 1.47747 298.47748 149.97747 14997.74779 1.47747 298.47747 149.97747 14997.74700 2020-01-01 2020-01-02 2020-01-01 00:08:12 2020-01-02 03:36:33 2020-01-01 00:08:12.000 2020-01-02 03:36:33.000 492 99393 49942.5 4994250 492 99393 49942.5 4994250 -32678 32460 4722.66 472266 -128 123 -3.1 -310 +493 101 10483 99394 1.48048 298.48048 149.98048 14998.04804 1.48048 298.48047 149.98048 14998.04809 1.48048 298.48048 149.98048 14998.04800 2020-01-01 2020-01-02 2020-01-01 00:08:13 2020-01-02 03:36:34 2020-01-01 00:08:13.000 2020-01-02 03:36:34.000 493 99394 49943.5 4994350 493 99394 49943.5 4994350 -32677 32461 4723.66 472366 -127 124 -2.1 -210 +494 101 10484 99395 1.48348 298.48348 149.98348 14998.34834 1.48348 298.4835 149.98348 14998.34868 1.48348 298.48348 149.98348 14998.34800 2020-01-01 2020-01-02 2020-01-01 00:08:14 2020-01-02 03:36:35 2020-01-01 00:08:14.000 2020-01-02 03:36:35.000 494 99395 49944.5 4994450 494 99395 49944.5 4994450 -32676 32462 4724.66 472466 -126 125 -1.1 -110 +495 100 10485 99396 1.48648 298.48648 149.98648 14998.64864 1.48648 298.48648 149.98648 14998.64837 1.48648 298.48648 149.98648 14998.64800 2020-01-01 2020-01-02 2020-01-01 00:08:15 2020-01-02 03:36:36 2020-01-01 00:08:15.000 2020-01-02 03:36:36.000 495 99396 49945.5 4994550 495 99396 49945.5 4994550 -32675 32463 4725.66 472566 -125 126 -0.1 -10 +496 100 10486 99397 1.48948 298.48948 149.98948 14998.94894 1.48948 298.4895 149.98948 14998.94896 1.48948 298.48948 149.98948 14998.94800 2020-01-01 2020-01-02 2020-01-01 00:08:16 2020-01-02 03:36:37 2020-01-01 00:08:16.000 2020-01-02 03:36:37.000 496 99397 49946.5 4994650 496 99397 49946.5 4994650 -32674 32464 4726.66 472666 -124 127 0.9 90 +497 100 10487 99398 1.49249 298.49249 149.99249 14999.24924 1.49249 298.4925 149.99249 14999.24926 1.49249 298.49249 149.99249 14999.24900 2020-01-01 2020-01-02 2020-01-01 00:08:17 2020-01-02 03:36:38 2020-01-01 00:08:17.000 2020-01-02 03:36:38.000 497 99398 49947.5 4994750 497 99398 49947.5 4994750 -32673 32465 4727.66 472766 -128 127 -0.66 -66 +498 100 10488 99399 1.49549 298.49549 149.99549 14999.54954 1.49549 298.49548 149.99549 14999.54956 1.49549 298.49549 149.99549 14999.54900 2020-01-01 2020-01-02 2020-01-01 00:08:18 2020-01-02 03:36:39 2020-01-01 00:08:18.000 2020-01-02 03:36:39.000 498 99399 49948.5 4994850 498 99399 49948.5 4994850 -32672 32466 4728.66 472866 -128 123 -2.22 -222 +499 100 10489 99400 1.49849 298.49849 149.99849 14999.84984 1.49849 298.4985 149.9985 14999.85015 1.49849 298.49849 149.99849 14999.84900 2020-01-01 2020-01-02 2020-01-01 00:08:19 2020-01-02 03:36:40 2020-01-01 00:08:19.000 2020-01-02 03:36:40.000 499 99400 49949.5 4994950 499 99400 49949.5 4994950 -32671 32467 4729.66 472966 -127 124 -1.22 -122 +5 102 1004 9995 0.01501 300.01501 150.01501 15151.51651 0.01501 300.015 150.01501 15151.51648 0.01501 300.01501 150.01501 15151.51601 2020-01-01 2020-01-02 2020-01-01 00:00:05 2020-01-02 03:45:05 2020-01-01 00:00:05.000 2020-01-02 03:45:05.000 5 99905 49955 5045455 5 99905 49955 5045455 -32564 32371 4534.009900990099 457935 -128 123 -3.01980198019802 -305 +50 102 10040 99950 0.15015 300.15015 150.15015 15165.16516 0.15015 300.15015 150.15014 15165.16487 0.15015 300.15015 150.15015 15165.16515 2020-01-01 2020-01-02 2020-01-01 00:00:50 2020-01-02 03:45:50 2020-01-01 00:00:50.000 2020-01-02 03:45:50.000 50 99950 50000 5050000 50 99950 50000 5050000 -32519 32416 4579.009900990099 462480 -127 124 -3.6435643564356437 -368 +500 100 10490 99401 1.5015 298.5015 150.0015 15000.15015 1.5015 298.5015 150.00149 15000.14984 1.50150 298.50150 150.00150 15000.15000 2020-01-01 2020-01-02 2020-01-01 00:08:20 2020-01-02 03:36:41 2020-01-01 00:08:20.000 2020-01-02 03:36:41.000 500 99401 49950.5 4995050 500 99401 49950.5 4995050 -32670 32468 4730.66 473066 -126 125 -0.22 -22 +501 100 10491 99402 1.5045 298.5045 150.0045 15000.45045 1.5045 298.50452 150.0045 15000.45043 1.50450 298.50450 150.00450 15000.45000 2020-01-01 2020-01-02 2020-01-01 00:08:21 2020-01-02 03:36:42 2020-01-01 00:08:21.000 2020-01-02 03:36:42.000 501 99402 49951.5 4995150 501 99402 49951.5 4995150 -32669 32469 4731.66 473166 -125 126 0.78 78 +502 100 10492 99403 1.5075 298.5075 150.0075 15000.75075 1.5075 298.5075 150.0075 15000.75073 1.50750 298.50750 150.00750 15000.75000 2020-01-01 2020-01-02 2020-01-01 00:08:22 2020-01-02 03:36:43 2020-01-01 00:08:22.000 2020-01-02 03:36:43.000 502 99403 49952.5 4995250 502 99403 49952.5 4995250 -32668 32470 4732.66 473266 -124 127 1.78 178 +503 100 10493 99404 1.51051 298.51051 150.01051 15001.05105 1.51051 298.5105 150.01051 15001.05103 1.51051 298.51051 150.01051 15001.05100 2020-01-01 2020-01-02 2020-01-01 00:08:23 2020-01-02 03:36:44 2020-01-01 00:08:23.000 2020-01-02 03:36:44.000 503 99404 49953.5 4995350 503 99404 49953.5 4995350 -32667 32471 4733.66 473366 -128 127 0.22 22 +504 100 10494 99405 1.51351 298.51351 150.01351 15001.35135 1.51351 298.51352 150.01351 15001.35162 1.51351 298.51351 150.01351 15001.35100 2020-01-01 2020-01-02 2020-01-01 00:08:24 2020-01-02 03:36:45 2020-01-01 00:08:24.000 2020-01-02 03:36:45.000 504 99405 49954.5 4995450 504 99405 49954.5 4995450 -32666 32472 4734.66 473466 -128 127 -1.34 -134 +505 100 10495 99406 1.51651 298.51651 150.01651 15001.65165 1.51651 298.5165 150.01651 15001.65131 1.51651 298.51651 150.01651 15001.65100 2020-01-01 2020-01-02 2020-01-01 00:08:25 2020-01-02 03:36:46 2020-01-01 00:08:25.000 2020-01-02 03:36:46.000 505 99406 49955.5 4995550 505 99406 49955.5 4995550 -32665 32473 4735.66 473566 -128 124 -2.9 -290 +506 100 10496 99407 1.51951 298.51951 150.01951 15001.95195 1.51951 298.51953 150.01951 15001.9519 1.51951 298.51951 150.01951 15001.95100 2020-01-01 2020-01-02 2020-01-01 00:08:26 2020-01-02 03:36:47 2020-01-01 00:08:26.000 2020-01-02 03:36:47.000 506 99407 49956.5 4995650 506 99407 49956.5 4995650 -32664 32474 4736.66 473666 -127 125 -1.9 -190 +507 100 10497 99408 1.52252 298.52252 150.02252 15002.25225 1.52252 298.52252 150.02252 15002.2522 1.52252 298.52252 150.02252 15002.25200 2020-01-01 2020-01-02 2020-01-01 00:08:27 2020-01-02 03:36:48 2020-01-01 00:08:27.000 2020-01-02 03:36:48.000 507 99408 49957.5 4995750 507 99408 49957.5 4995750 -32663 32475 4737.66 473766 -126 126 -0.9 -90 +508 100 10498 99409 1.52552 298.52552 150.02552 15002.55255 1.52552 298.5255 150.02552 15002.5525 1.52552 298.52552 150.02552 15002.55200 2020-01-01 2020-01-02 2020-01-01 00:08:28 2020-01-02 03:36:49 2020-01-01 00:08:28.000 2020-01-02 03:36:49.000 508 99409 49958.5 4995850 508 99409 49958.5 4995850 -32662 32476 4738.66 473866 -125 127 0.1 10 +509 100 10499 99410 1.52852 298.52852 150.02852 15002.85285 1.52852 298.52853 150.02853 15002.85312 1.52852 298.52852 150.02852 15002.85200 2020-01-01 2020-01-02 2020-01-01 00:08:29 2020-01-02 03:36:50 2020-01-01 00:08:29.000 2020-01-02 03:36:50.000 509 99410 49959.5 4995950 509 99410 49959.5 4995950 -32661 32477 4739.66 473966 -128 127 -1.46 -146 +51 102 10041 99951 0.15315 300.15315 150.15315 15165.46846 0.15315 300.15317 150.15315 15165.46863 0.15315 300.15315 150.15315 15165.46815 2020-01-01 2020-01-02 2020-01-01 00:00:51 2020-01-02 03:45:51 2020-01-01 00:00:51.000 2020-01-02 03:45:51.000 51 99951 50001 5050101 51 99951 50001 5050101 -32518 32417 4580.009900990099 462581 -126 125 -2.6435643564356437 -267 +510 100 10500 99411 1.53153 298.53153 150.03153 15003.15315 1.53153 298.53152 150.03152 15003.15278 1.53153 298.53153 150.03153 15003.15300 2020-01-01 2020-01-02 2020-01-01 00:08:30 2020-01-02 03:36:51 2020-01-01 00:08:30.000 2020-01-02 03:36:51.000 510 99411 49960.5 4996050 510 99411 49960.5 4996050 -32660 32478 4740.66 474066 -128 127 -3.02 -302 +511 100 10501 99412 1.53453 298.53453 150.03453 15003.45345 1.53453 298.53455 150.03453 15003.45354 1.53453 298.53453 150.03453 15003.45300 2020-01-01 2020-01-02 2020-01-01 00:08:31 2020-01-02 03:36:52 2020-01-01 00:08:31.000 2020-01-02 03:36:52.000 511 99412 49961.5 4996150 511 99412 49961.5 4996150 -32659 32479 4741.66 474166 -128 123 -4.58 -458 +512 100 10502 99413 1.53753 298.53753 150.03753 15003.75375 1.53753 298.53754 150.03753 15003.75366 1.53753 298.53753 150.03753 15003.75300 2020-01-01 2020-01-02 2020-01-01 00:08:32 2020-01-02 03:36:53 2020-01-01 00:08:32.000 2020-01-02 03:36:53.000 512 99413 49962.5 4996250 512 99413 49962.5 4996250 -32658 32480 4742.66 474266 -127 124 -3.58 -358 +513 100 10503 99414 1.54054 298.54054 150.04054 15004.05405 1.54054 298.54053 150.04053 15004.05397 1.54054 298.54054 150.04054 15004.05400 2020-01-01 2020-01-02 2020-01-01 00:08:33 2020-01-02 03:36:54 2020-01-01 00:08:33.000 2020-01-02 03:36:54.000 513 99414 49963.5 4996350 513 99414 49963.5 4996350 -32657 32481 4743.66 474366 -126 125 -2.58 -258 +514 100 10504 99415 1.54354 298.54354 150.04354 15004.35435 1.54354 298.54355 150.04354 15004.35459 1.54354 298.54354 150.04354 15004.35400 2020-01-01 2020-01-02 2020-01-01 00:08:34 2020-01-02 03:36:55 2020-01-01 00:08:34.000 2020-01-02 03:36:55.000 514 99415 49964.5 4996450 514 99415 49964.5 4996450 -32656 32482 4744.66 474466 -125 126 -1.58 -158 +515 100 10505 99416 1.54654 298.54654 150.04654 15004.65465 1.54654 298.54654 150.04654 15004.65425 1.54654 298.54654 150.04654 15004.65400 2020-01-01 2020-01-02 2020-01-01 00:08:35 2020-01-02 03:36:56 2020-01-01 00:08:35.000 2020-01-02 03:36:56.000 515 99416 49965.5 4996550 515 99416 49965.5 4996550 -32655 32483 4745.66 474566 -124 127 -0.58 -58 +516 100 10506 99417 1.54954 298.54954 150.04954 15004.95495 1.54954 298.54956 150.04955 15004.955 1.54954 298.54954 150.04954 15004.95400 2020-01-01 2020-01-02 2020-01-01 00:08:36 2020-01-02 03:36:57 2020-01-01 00:08:36.000 2020-01-02 03:36:57.000 516 99417 49966.5 4996650 516 99417 49966.5 4996650 -32654 32484 4746.66 474666 -128 127 -2.14 -214 +517 100 10507 99418 1.55255 298.55255 150.05255 15005.25525 1.55255 298.55255 150.05255 15005.25514 1.55255 298.55255 150.05255 15005.25500 2020-01-01 2020-01-02 2020-01-01 00:08:37 2020-01-02 03:36:58 2020-01-01 00:08:37.000 2020-01-02 03:36:58.000 517 99418 49967.5 4996750 517 99418 49967.5 4996750 -32653 32485 4747.66 474766 -128 123 -3.7 -370 +518 100 10508 99419 1.55555 298.55555 150.05555 15005.55555 1.55555 298.55554 150.05555 15005.55547 1.55555 298.55555 150.05555 15005.55500 2020-01-01 2020-01-02 2020-01-01 00:08:38 2020-01-02 03:36:59 2020-01-01 00:08:38.000 2020-01-02 03:36:59.000 518 99419 49968.5 4996850 518 99419 49968.5 4996850 -32652 32486 4748.66 474866 -127 124 -2.7 -270 +519 100 10509 99420 1.55855 298.55855 150.05855 15005.85585 1.55855 298.55856 150.05856 15005.85607 1.55855 298.55855 150.05855 15005.85500 2020-01-01 2020-01-02 2020-01-01 00:08:39 2020-01-02 03:37:00 2020-01-01 00:08:39.000 2020-01-02 03:37:00.000 519 99420 49969.5 4996950 519 99420 49969.5 4996950 -32651 32487 4749.66 474966 -126 125 -1.7 -170 +52 102 10042 99952 0.15615 300.15615 150.15615 15165.77177 0.15615 300.15616 150.15615 15165.77193 0.15615 300.15615 150.15615 15165.77115 2020-01-01 2020-01-02 2020-01-01 00:00:52 2020-01-02 03:45:52 2020-01-01 00:00:52.000 2020-01-02 03:45:52.000 52 99952 50002 5050202 52 99952 50002 5050202 -32517 32418 4581.009900990099 462682 -125 126 -1.6435643564356435 -166 +520 100 10510 99421 1.56156 298.56156 150.06156 15006.15615 1.56156 298.56155 150.06155 15006.15572 1.56156 298.56156 150.06156 15006.15600 2020-01-01 2020-01-02 2020-01-01 00:08:40 2020-01-02 03:37:01 2020-01-01 00:08:40.000 2020-01-02 03:37:01.000 520 99421 49970.5 4997050 520 99421 49970.5 4997050 -32650 32488 4750.66 475066 -125 126 -0.7 -70 +521 100 10511 99422 1.56456 298.56456 150.06456 15006.45645 1.56456 298.56458 150.06456 15006.45647 1.56456 298.56456 150.06456 15006.45600 2020-01-01 2020-01-02 2020-01-01 00:08:41 2020-01-02 03:37:02 2020-01-01 00:08:41.000 2020-01-02 03:37:02.000 521 99422 49971.5 4997150 521 99422 49971.5 4997150 -32649 32489 4751.66 475166 -124 127 0.3 30 +522 100 10512 99423 1.56756 298.56756 150.06756 15006.75675 1.56756 298.56757 150.06756 15006.75661 1.56756 298.56756 150.06756 15006.75600 2020-01-01 2020-01-02 2020-01-01 00:08:42 2020-01-02 03:37:03 2020-01-01 00:08:42.000 2020-01-02 03:37:03.000 522 99423 49972.5 4997250 522 99423 49972.5 4997250 -32648 32490 4752.66 475266 -128 127 -1.26 -126 +523 100 10513 99424 1.57057 298.57057 150.07057 15007.05705 1.57057 298.57056 150.07056 15007.05694 1.57057 298.57057 150.07057 15007.05700 2020-01-01 2020-01-02 2020-01-01 00:08:43 2020-01-02 03:37:04 2020-01-01 00:08:43.000 2020-01-02 03:37:04.000 523 99424 49973.5 4997350 523 99424 49973.5 4997350 -32647 32491 4753.66 475366 -128 123 -2.82 -282 +524 100 10514 99425 1.57357 298.57357 150.07357 15007.35735 1.57357 298.57358 150.07357 15007.35753 1.57357 298.57357 150.07357 15007.35700 2020-01-01 2020-01-02 2020-01-01 00:08:44 2020-01-02 03:37:05 2020-01-01 00:08:44.000 2020-01-02 03:37:05.000 524 99425 49974.5 4997450 524 99425 49974.5 4997450 -32646 32492 4754.66 475466 -127 124 -1.82 -182 +525 100 10515 99426 1.57657 298.57657 150.07657 15007.65765 1.57657 298.57657 150.07657 15007.65783 1.57657 298.57657 150.07657 15007.65700 2020-01-01 2020-01-02 2020-01-01 00:08:45 2020-01-02 03:37:06 2020-01-01 00:08:45.000 2020-01-02 03:37:06.000 525 99426 49975.5 4997550 525 99426 49975.5 4997550 -32645 32493 4755.66 475566 -126 125 -0.82 -82 +526 100 10516 99427 1.57957 298.57957 150.07957 15007.95795 1.57957 298.5796 150.07957 15007.95795 1.57957 298.57957 150.07957 15007.95700 2020-01-01 2020-01-02 2020-01-01 00:08:46 2020-01-02 03:37:07 2020-01-01 00:08:46.000 2020-01-02 03:37:07.000 526 99427 49976.5 4997650 526 99427 49976.5 4997650 -32644 32494 4756.66 475666 -125 126 0.18 18 +527 100 10517 99428 1.58258 298.58258 150.08258 15008.25825 1.58258 298.58258 150.08258 15008.25811 1.58258 298.58258 150.08258 15008.25800 2020-01-01 2020-01-02 2020-01-01 00:08:47 2020-01-02 03:37:08 2020-01-01 00:08:47.000 2020-01-02 03:37:08.000 527 99428 49977.5 4997750 527 99428 49977.5 4997750 -32643 32495 4757.66 475766 -124 127 1.18 118 +528 100 10518 99429 1.58558 298.58558 150.08558 15008.55855 1.58558 298.58557 150.08558 15008.5584 1.58558 298.58558 150.08558 15008.55800 2020-01-01 2020-01-02 2020-01-01 00:08:48 2020-01-02 03:37:09 2020-01-01 00:08:48.000 2020-01-02 03:37:09.000 528 99429 49978.5 4997850 528 99429 49978.5 4997850 -32642 32496 4758.66 475866 -128 127 -0.38 -38 +529 100 10519 99430 1.58858 298.58858 150.08858 15008.85885 1.58858 298.5886 150.08859 15008.859 1.58858 298.58858 150.08858 15008.85800 2020-01-01 2020-01-02 2020-01-01 00:08:49 2020-01-02 03:37:10 2020-01-01 00:08:49.000 2020-01-02 03:37:10.000 529 99430 49979.5 4997950 529 99430 49979.5 4997950 -32641 32497 4759.66 475966 -128 127 -1.94 -194 +53 102 10043 99953 0.15915 300.15915 150.15915 15166.07507 0.15915 300.15915 150.15915 15166.07511 0.15915 300.15915 150.15915 15166.07415 2020-01-01 2020-01-02 2020-01-01 00:00:53 2020-01-02 03:45:53 2020-01-01 00:00:53.000 2020-01-02 03:45:53.000 53 99953 50003 5050303 53 99953 50003 5050303 -32516 32419 4582.009900990099 462783 -124 127 -0.6435643564356436 -65 +530 100 10520 99431 1.59159 298.59159 150.09159 15009.15915 1.59159 298.59158 150.09159 15009.15929 1.59159 298.59159 150.09159 15009.15900 2020-01-01 2020-01-02 2020-01-01 00:08:50 2020-01-02 03:37:11 2020-01-01 00:08:50.000 2020-01-02 03:37:11.000 530 99431 49980.5 4998050 530 99431 49980.5 4998050 -32640 32498 4760.66 476066 -128 124 -3.5 -350 +531 100 10521 99432 1.59459 298.59459 150.09459 15009.45945 1.59459 298.5946 150.09459 15009.45941 1.59459 298.59459 150.09459 15009.45900 2020-01-01 2020-01-02 2020-01-01 00:08:51 2020-01-02 03:37:12 2020-01-01 00:08:51.000 2020-01-02 03:37:12.000 531 99432 49981.5 4998150 531 99432 49981.5 4998150 -32639 32499 4761.66 476166 -127 125 -2.5 -250 +532 100 10522 99433 1.59759 298.59759 150.09759 15009.75975 1.59759 298.5976 150.09759 15009.75958 1.59759 298.59759 150.09759 15009.75900 2020-01-01 2020-01-02 2020-01-01 00:08:52 2020-01-02 03:37:13 2020-01-01 00:08:52.000 2020-01-02 03:37:13.000 532 99433 49982.5 4998250 532 99433 49982.5 4998250 -32638 32500 4762.66 476266 -126 126 -1.5 -150 +533 100 10523 99434 1.6006 298.6006 150.1006 15010.06006 1.6006 298.6006 150.10059 15010.05988 1.60060 298.60060 150.10060 15010.06000 2020-01-01 2020-01-02 2020-01-01 00:08:53 2020-01-02 03:37:14 2020-01-01 00:08:53.000 2020-01-02 03:37:14.000 533 99434 49983.5 4998350 533 99434 49983.5 4998350 -32637 32501 4763.66 476366 -125 127 -0.5 -50 +534 100 10524 99435 1.6036 298.6036 150.1036 15010.36036 1.6036 298.6036 150.1036 15010.36063 1.60360 298.60360 150.10360 15010.36000 2020-01-01 2020-01-02 2020-01-01 00:08:54 2020-01-02 03:37:15 2020-01-01 00:08:54.000 2020-01-02 03:37:15.000 534 99435 49984.5 4998450 534 99435 49984.5 4998450 -32636 32502 4764.66 476466 -128 127 -2.06 -206 +535 100 10525 99436 1.6066 298.6066 150.1066 15010.66066 1.6066 298.6066 150.1066 15010.66077 1.60660 298.60660 150.10660 15010.66000 2020-01-01 2020-01-02 2020-01-01 00:08:55 2020-01-02 03:37:16 2020-01-01 00:08:55.000 2020-01-02 03:37:16.000 535 99436 49985.5 4998550 535 99436 49985.5 4998550 -32635 32503 4765.66 476566 -128 127 -3.62 -362 +536 100 10526 99437 1.6096 298.6096 150.1096 15010.96096 1.6096 298.60962 150.1096 15010.96092 1.60960 298.60960 150.10960 15010.96000 2020-01-01 2020-01-02 2020-01-01 00:08:56 2020-01-02 03:37:17 2020-01-01 00:08:56.000 2020-01-02 03:37:17.000 536 99437 49986.5 4998650 536 99437 49986.5 4998650 -32634 32504 4766.66 476666 -128 123 -5.18 -518 +537 100 10527 99438 1.61261 298.61261 150.11261 15011.26126 1.61261 298.6126 150.11261 15011.26105 1.61261 298.61261 150.11261 15011.26100 2020-01-01 2020-01-02 2020-01-01 00:08:57 2020-01-02 03:37:18 2020-01-01 00:08:57.000 2020-01-02 03:37:18.000 537 99438 49987.5 4998750 537 99438 49987.5 4998750 -32633 32505 4767.66 476766 -127 124 -4.18 -418 +538 100 10528 99439 1.61561 298.61561 150.11561 15011.56156 1.61561 298.6156 150.11561 15011.56135 1.61561 298.61561 150.11561 15011.56100 2020-01-01 2020-01-02 2020-01-01 00:08:58 2020-01-02 03:37:19 2020-01-01 00:08:58.000 2020-01-02 03:37:19.000 538 99439 49988.5 4998850 538 99439 49988.5 4998850 -32632 32506 4768.66 476866 -126 125 -3.18 -318 +539 100 10529 99440 1.61861 298.61861 150.11861 15011.86186 1.61861 298.61862 150.11862 15011.8621 1.61861 298.61861 150.11861 15011.86100 2020-01-01 2020-01-02 2020-01-01 00:08:59 2020-01-02 03:37:20 2020-01-01 00:08:59.000 2020-01-02 03:37:20.000 539 99440 49989.5 4998950 539 99440 49989.5 4998950 -32631 32507 4769.66 476966 -125 126 -2.18 -218 +54 102 10044 99954 0.16216 300.16216 150.16216 15166.37837 0.16216 300.16217 150.16216 15166.37822 0.16216 300.16216 150.16216 15166.37816 2020-01-01 2020-01-02 2020-01-01 00:00:54 2020-01-02 03:45:54 2020-01-01 00:00:54.000 2020-01-02 03:45:54.000 54 99954 50004 5050404 54 99954 50004 5050404 -32515 32420 4583.009900990099 462884 -128 127 -2.1782178217821784 -220 +540 100 10530 99441 1.62162 298.62162 150.12162 15012.16216 1.62162 298.6216 150.12162 15012.16224 1.62162 298.62162 150.12162 15012.16200 2020-01-01 2020-01-02 2020-01-01 00:09:00 2020-01-02 03:37:21 2020-01-01 00:09:00.000 2020-01-02 03:37:21.000 540 99441 49990.5 4999050 540 99441 49990.5 4999050 -32630 32508 4770.66 477066 -124 127 -1.18 -118 +541 100 10531 99442 1.62462 298.62462 150.12462 15012.46246 1.62462 298.62463 150.12462 15012.46239 1.62462 298.62462 150.12462 15012.46200 2020-01-01 2020-01-02 2020-01-01 00:09:01 2020-01-02 03:37:22 2020-01-01 00:09:01.000 2020-01-02 03:37:22.000 541 99442 49991.5 4999150 541 99442 49991.5 4999150 -32629 32509 4771.66 477166 -128 127 -2.74 -274 +542 100 10532 99443 1.62762 298.62762 150.12762 15012.76276 1.62762 298.62762 150.12762 15012.76252 1.62762 298.62762 150.12762 15012.76200 2020-01-01 2020-01-02 2020-01-01 00:09:02 2020-01-02 03:37:23 2020-01-01 00:09:02.000 2020-01-02 03:37:23.000 542 99443 49992.5 4999250 542 99443 49992.5 4999250 -32628 32510 4772.66 477266 -128 123 -4.3 -430 +543 100 10533 99444 1.63063 298.63063 150.13063 15013.06306 1.63063 298.63065 150.13063 15013.06327 1.63063 298.63063 150.13063 15013.06300 2020-01-01 2020-01-02 2020-01-01 00:09:03 2020-01-02 03:37:24 2020-01-01 00:09:03.000 2020-01-02 03:37:24.000 543 99444 49993.5 4999350 543 99444 49993.5 4999350 -32627 32511 4773.66 477366 -127 124 -3.3 -330 +544 100 10534 99445 1.63363 298.63363 150.13363 15013.36336 1.63363 298.63364 150.13363 15013.36358 1.63363 298.63363 150.13363 15013.36300 2020-01-01 2020-01-02 2020-01-01 00:09:04 2020-01-02 03:37:25 2020-01-01 00:09:04.000 2020-01-02 03:37:25.000 544 99445 49994.5 4999450 544 99445 49994.5 4999450 -32626 32512 4774.66 477466 -126 125 -2.3 -230 +545 100 10535 99446 1.63663 298.63663 150.13663 15013.66366 1.63663 298.63663 150.13663 15013.6637 1.63663 298.63663 150.13663 15013.66300 2020-01-01 2020-01-02 2020-01-01 00:09:05 2020-01-02 03:37:26 2020-01-01 00:09:05.000 2020-01-02 03:37:26.000 545 99446 49995.5 4999550 545 99446 49995.5 4999550 -32625 32513 4775.66 477566 -125 126 -1.3 -130 +546 100 10536 99447 1.63963 298.63963 150.13963 15013.96396 1.63963 298.63965 150.13963 15013.96385 1.63963 298.63963 150.13963 15013.96300 2020-01-01 2020-01-02 2020-01-01 00:09:06 2020-01-02 03:37:27 2020-01-01 00:09:06.000 2020-01-02 03:37:27.000 546 99447 49996.5 4999650 546 99447 49996.5 4999650 -32624 32514 4776.66 477666 -124 127 -0.3 -30 +547 100 10537 99448 1.64264 298.64264 150.14264 15014.26426 1.64264 298.64264 150.14263 15014.26399 1.64264 298.64264 150.14264 15014.26400 2020-01-01 2020-01-02 2020-01-01 00:09:07 2020-01-02 03:37:28 2020-01-01 00:09:07.000 2020-01-02 03:37:28.000 547 99448 49997.5 4999750 547 99448 49997.5 4999750 -32623 32515 4777.66 477766 -128 127 -1.86 -186 +548 100 10538 99449 1.64564 298.64564 150.14564 15014.56456 1.64564 298.64566 150.14564 15014.56474 1.64564 298.64564 150.14564 15014.56400 2020-01-01 2020-01-02 2020-01-01 00:09:08 2020-01-02 03:37:29 2020-01-01 00:09:08.000 2020-01-02 03:37:29.000 548 99449 49998.5 4999850 548 99449 49998.5 4999850 -32622 32516 4778.66 477866 -128 123 -3.42 -342 +549 100 10539 99450 1.64864 298.64864 150.14864 15014.86486 1.64864 298.64865 150.14865 15014.86504 1.64864 298.64864 150.14864 15014.86400 2020-01-01 2020-01-02 2020-01-01 00:09:09 2020-01-02 03:37:30 2020-01-01 00:09:09.000 2020-01-02 03:37:30.000 549 99450 49999.5 4999950 549 99450 49999.5 4999950 -32621 32517 4779.66 477966 -127 124 -2.42 -242 +55 102 10045 99955 0.16516 300.16516 150.16516 15166.68168 0.16516 300.16516 150.16516 15166.68151 0.16516 300.16516 150.16516 15166.68116 2020-01-01 2020-01-02 2020-01-01 00:00:55 2020-01-02 03:45:55 2020-01-01 00:00:55.000 2020-01-02 03:45:55.000 55 99955 50005 5050505 55 99955 50005 5050505 -32514 32421 4584.009900990099 462985 -128 123 -3.712871287128713 -375 +550 100 10540 99451 1.65165 298.65165 150.15165 15015.16516 1.65165 298.65164 150.15165 15015.16521 1.65165 298.65165 150.15165 15015.16500 2020-01-01 2020-01-02 2020-01-01 00:09:10 2020-01-02 03:37:31 2020-01-01 00:09:10.000 2020-01-02 03:37:31.000 550 99451 50000.5 5000050 550 99451 50000.5 5000050 -32620 32518 4780.66 478066 -126 125 -1.42 -142 +551 100 10541 99452 1.65465 298.65465 150.15465 15015.46546 1.65465 298.65466 150.15465 15015.46533 1.65465 298.65465 150.15465 15015.46500 2020-01-01 2020-01-02 2020-01-01 00:09:11 2020-01-02 03:37:32 2020-01-01 00:09:11.000 2020-01-02 03:37:32.000 551 99452 50001.5 5000150 551 99452 50001.5 5000150 -32619 32519 4781.66 478166 -125 126 -0.42 -42 +552 100 10542 99453 1.65765 298.65765 150.15765 15015.76576 1.65765 298.65765 150.15765 15015.76562 1.65765 298.65765 150.15765 15015.76500 2020-01-01 2020-01-02 2020-01-01 00:09:12 2020-01-02 03:37:33 2020-01-01 00:09:12.000 2020-01-02 03:37:33.000 552 99453 50002.5 5000250 552 99453 50002.5 5000250 -32618 32520 4782.66 478266 -124 127 0.58 58 +553 100 10543 99454 1.66066 298.66066 150.16066 15016.06606 1.66066 298.66068 150.16066 15016.06621 1.66066 298.66066 150.16066 15016.06600 2020-01-01 2020-01-02 2020-01-01 00:09:13 2020-01-02 03:37:34 2020-01-01 00:09:13.000 2020-01-02 03:37:34.000 553 99454 50003.5 5000350 553 99454 50003.5 5000350 -32617 32521 4783.66 478366 -128 127 -0.98 -98 +554 100 10544 99455 1.66366 298.66366 150.16366 15016.36636 1.66366 298.66367 150.16366 15016.36651 1.66366 298.66366 150.16366 15016.36600 2020-01-01 2020-01-02 2020-01-01 00:09:14 2020-01-02 03:37:35 2020-01-01 00:09:14.000 2020-01-02 03:37:35.000 554 99455 50004.5 5000450 554 99455 50004.5 5000450 -32616 32522 4784.66 478466 -128 127 -2.54 -254 +555 100 10545 99456 1.66666 298.66666 150.16666 15016.66666 1.66666 298.66666 150.16666 15016.66668 1.66666 298.66666 150.16666 15016.66600 2020-01-01 2020-01-02 2020-01-01 00:09:15 2020-01-02 03:37:36 2020-01-01 00:09:15.000 2020-01-02 03:37:36.000 555 99456 50005.5 5000550 555 99456 50005.5 5000550 -32615 32523 4785.66 478566 -128 124 -4.1 -410 +556 100 10546 99457 1.66966 298.66966 150.16966 15016.96696 1.66966 298.66968 150.16966 15016.9668 1.66966 298.66966 150.16966 15016.96600 2020-01-01 2020-01-02 2020-01-01 00:09:16 2020-01-02 03:37:37 2020-01-01 00:09:16.000 2020-01-02 03:37:37.000 556 99457 50006.5 5000650 556 99457 50006.5 5000650 -32614 32524 4786.66 478666 -127 125 -3.1 -310 +557 100 10547 99458 1.67267 298.67267 150.17267 15017.26726 1.67267 298.67267 150.17267 15017.26709 1.67267 298.67267 150.17267 15017.26700 2020-01-01 2020-01-02 2020-01-01 00:09:17 2020-01-02 03:37:38 2020-01-01 00:09:17.000 2020-01-02 03:37:38.000 557 99458 50007.5 5000750 557 99458 50007.5 5000750 -32613 32525 4787.66 478766 -126 126 -2.1 -210 +558 100 10548 99459 1.67567 298.67567 150.17567 15017.56756 1.67567 298.6757 150.17567 15017.56769 1.67567 298.67567 150.17567 15017.56700 2020-01-01 2020-01-02 2020-01-01 00:09:18 2020-01-02 03:37:39 2020-01-01 00:09:18.000 2020-01-02 03:37:39.000 558 99459 50008.5 5000850 558 99459 50008.5 5000850 -32612 32526 4788.66 478866 -125 127 -1.1 -110 +559 100 10549 99460 1.67867 298.67867 150.17867 15017.86786 1.67867 298.67868 150.17868 15017.86802 1.67867 298.67867 150.17867 15017.86700 2020-01-01 2020-01-02 2020-01-01 00:09:19 2020-01-02 03:37:40 2020-01-01 00:09:19.000 2020-01-02 03:37:40.000 559 99460 50009.5 5000950 559 99460 50009.5 5000950 -32611 32527 4789.66 478966 -128 127 -2.66 -266 +56 102 10046 99956 0.16816 300.16816 150.16816 15166.98498 0.16816 300.16818 150.16816 15166.98512 0.16816 300.16816 150.16816 15166.98416 2020-01-01 2020-01-02 2020-01-01 00:00:56 2020-01-02 03:45:56 2020-01-01 00:00:56.000 2020-01-02 03:45:56.000 56 99956 50006 5050606 56 99956 50006 5050606 -32513 32422 4585.009900990099 463086 -127 124 -2.712871287128713 -274 +560 100 10550 99461 1.68168 298.68168 150.18168 15018.16816 1.68168 298.68167 150.18168 15018.16815 1.68168 298.68168 150.18168 15018.16800 2020-01-01 2020-01-02 2020-01-01 00:09:20 2020-01-02 03:37:41 2020-01-01 00:09:20.000 2020-01-02 03:37:41.000 560 99461 50010.5 5001050 560 99461 50010.5 5001050 -32610 32528 4790.66 479066 -128 127 -4.22 -422 +561 100 10551 99462 1.68468 298.68468 150.18468 15018.46846 1.68468 298.6847 150.18468 15018.46826 1.68468 298.68468 150.18468 15018.46800 2020-01-01 2020-01-02 2020-01-01 00:09:21 2020-01-02 03:37:42 2020-01-01 00:09:21.000 2020-01-02 03:37:42.000 561 99462 50011.5 5001150 561 99462 50011.5 5001150 -32609 32529 4791.66 479166 -128 123 -5.78 -578 +562 100 10552 99463 1.68768 298.68768 150.18768 15018.76876 1.68768 298.68768 150.18768 15018.76856 1.68768 298.68768 150.18768 15018.76800 2020-01-01 2020-01-02 2020-01-01 00:09:22 2020-01-02 03:37:43 2020-01-01 00:09:22.000 2020-01-02 03:37:43.000 562 99463 50012.5 5001250 562 99463 50012.5 5001250 -32608 32530 4792.66 479266 -127 124 -4.78 -478 +563 100 10553 99464 1.69069 298.69069 150.19069 15019.06906 1.69069 298.6907 150.19069 15019.06915 1.69069 298.69069 150.19069 15019.06900 2020-01-01 2020-01-02 2020-01-01 00:09:23 2020-01-02 03:37:44 2020-01-01 00:09:23.000 2020-01-02 03:37:44.000 563 99464 50013.5 5001350 563 99464 50013.5 5001350 -32607 32531 4793.66 479366 -126 125 -3.78 -378 +564 100 10554 99465 1.69369 298.69369 150.19369 15019.36936 1.69369 298.6937 150.19369 15019.36948 1.69369 298.69369 150.19369 15019.36900 2020-01-01 2020-01-02 2020-01-01 00:09:24 2020-01-02 03:37:45 2020-01-01 00:09:24.000 2020-01-02 03:37:45.000 564 99465 50014.5 5001450 564 99465 50014.5 5001450 -32606 32532 4794.66 479466 -125 126 -2.78 -278 +565 100 10555 99466 1.69669 298.69669 150.19669 15019.66966 1.69669 298.6967 150.19669 15019.66962 1.69669 298.69669 150.19669 15019.66900 2020-01-01 2020-01-02 2020-01-01 00:09:25 2020-01-02 03:37:46 2020-01-01 00:09:25.000 2020-01-02 03:37:46.000 565 99466 50015.5 5001550 565 99466 50015.5 5001550 -32605 32533 4795.66 479566 -124 127 -1.78 -178 +566 100 10556 99467 1.69969 298.69969 150.19969 15019.96996 1.69969 298.6997 150.1997 15019.97037 1.69969 298.69969 150.19969 15019.96900 2020-01-01 2020-01-02 2020-01-01 00:09:26 2020-01-02 03:37:47 2020-01-01 00:09:26.000 2020-01-02 03:37:47.000 566 99467 50016.5 5001650 566 99467 50016.5 5001650 -32604 32534 4796.66 479666 -128 127 -3.34 -334 +567 100 10557 99468 1.7027 298.7027 150.2027 15020.27027 1.7027 298.7027 150.2027 15020.27003 1.70270 298.70270 150.20270 15020.27000 2020-01-01 2020-01-02 2020-01-01 00:09:27 2020-01-02 03:37:48 2020-01-01 00:09:27.000 2020-01-02 03:37:48.000 567 99468 50017.5 5001750 567 99468 50017.5 5001750 -32603 32535 4797.66 479766 -128 123 -4.9 -490 +568 100 10558 99469 1.7057 298.7057 150.2057 15020.57057 1.7057 298.70572 150.2057 15020.57066 1.70570 298.70570 150.20570 15020.57000 2020-01-01 2020-01-02 2020-01-01 00:09:28 2020-01-02 03:37:49 2020-01-01 00:09:28.000 2020-01-02 03:37:49.000 568 99469 50018.5 5001850 568 99469 50018.5 5001850 -32602 32536 4798.66 479866 -127 124 -3.9 -390 +569 100 10559 99470 1.7087 298.7087 150.2087 15020.87087 1.7087 298.7087 150.2087 15020.87095 1.70870 298.70870 150.20870 15020.87000 2020-01-01 2020-01-02 2020-01-01 00:09:29 2020-01-02 03:37:50 2020-01-01 00:09:29.000 2020-01-02 03:37:50.000 569 99470 50019.5 5001950 569 99470 50019.5 5001950 -32601 32537 4799.66 479966 -126 125 -2.9 -290 +57 102 10047 99957 0.17117 300.17117 150.17117 15167.28828 0.17117 300.17117 150.17117 15167.28841 0.17117 300.17117 150.17117 15167.28817 2020-01-01 2020-01-02 2020-01-01 00:00:57 2020-01-02 03:45:57 2020-01-01 00:00:57.000 2020-01-02 03:45:57.000 57 99957 50007 5050707 57 99957 50007 5050707 -32512 32423 4586.009900990099 463187 -126 125 -1.7128712871287128 -173 +570 100 10560 99471 1.71171 298.71171 150.21171 15021.17117 1.71171 298.7117 150.21171 15021.17109 1.71171 298.71171 150.21171 15021.17100 2020-01-01 2020-01-02 2020-01-01 00:09:30 2020-01-02 03:37:51 2020-01-01 00:09:30.000 2020-01-02 03:37:51.000 570 99471 50020.5 5002050 570 99471 50020.5 5002050 -32600 32538 4800.66 480066 -125 126 -1.9 -190 +571 100 10561 99472 1.71471 298.71471 150.21471 15021.47147 1.71471 298.71472 150.21471 15021.47184 1.71471 298.71471 150.21471 15021.47100 2020-01-01 2020-01-02 2020-01-01 00:09:31 2020-01-02 03:37:52 2020-01-01 00:09:31.000 2020-01-02 03:37:52.000 571 99472 50021.5 5002150 571 99472 50021.5 5002150 -32599 32539 4801.66 480166 -124 127 -0.9 -90 +572 100 10562 99473 1.71771 298.71771 150.21771 15021.77177 1.71771 298.7177 150.21771 15021.7715 1.71771 298.71771 150.21771 15021.77100 2020-01-01 2020-01-02 2020-01-01 00:09:32 2020-01-02 03:37:53 2020-01-01 00:09:32.000 2020-01-02 03:37:53.000 572 99473 50022.5 5002250 572 99473 50022.5 5002250 -32598 32540 4802.66 480266 -128 127 -2.46 -246 +573 100 10563 99474 1.72072 298.72072 150.22072 15022.07207 1.72072 298.72073 150.22072 15022.07212 1.72072 298.72072 150.22072 15022.07200 2020-01-01 2020-01-02 2020-01-01 00:09:33 2020-01-02 03:37:54 2020-01-01 00:09:33.000 2020-01-02 03:37:54.000 573 99474 50023.5 5002350 573 99474 50023.5 5002350 -32597 32541 4803.66 480366 -128 123 -4.02 -402 +574 100 10564 99475 1.72372 298.72372 150.22372 15022.37237 1.72372 298.72372 150.22372 15022.37243 1.72372 298.72372 150.22372 15022.37200 2020-01-01 2020-01-02 2020-01-01 00:09:34 2020-01-02 03:37:55 2020-01-01 00:09:34.000 2020-01-02 03:37:55.000 574 99475 50024.5 5002450 574 99475 50024.5 5002450 -32596 32542 4804.66 480466 -127 124 -3.02 -302 +575 100 10565 99476 1.72672 298.72672 150.22672 15022.67267 1.72672 298.7267 150.22672 15022.67272 1.72672 298.72672 150.22672 15022.67200 2020-01-01 2020-01-02 2020-01-01 00:09:35 2020-01-02 03:37:56 2020-01-01 00:09:35.000 2020-01-02 03:37:56.000 575 99476 50025.5 5002550 575 99476 50025.5 5002550 -32595 32543 4805.66 480566 -126 125 -2.02 -202 +576 100 10566 99477 1.72972 298.72972 150.22972 15022.97297 1.72972 298.72974 150.22973 15022.97332 1.72972 298.72972 150.22972 15022.97200 2020-01-01 2020-01-02 2020-01-01 00:09:36 2020-01-02 03:37:57 2020-01-01 00:09:36.000 2020-01-02 03:37:57.000 576 99477 50026.5 5002650 576 99477 50026.5 5002650 -32594 32544 4806.66 480666 -125 126 -1.02 -102 +577 100 10567 99478 1.73273 298.73273 150.23273 15023.27327 1.73273 298.73273 150.23272 15023.27297 1.73273 298.73273 150.23273 15023.27300 2020-01-01 2020-01-02 2020-01-01 00:09:37 2020-01-02 03:37:58 2020-01-01 00:09:37.000 2020-01-02 03:37:58.000 577 99478 50027.5 5002750 577 99478 50027.5 5002750 -32593 32545 4807.66 480766 -124 127 -0.02 -2 +578 100 10568 99479 1.73573 298.73573 150.23573 15023.57357 1.73573 298.73575 150.23573 15023.57359 1.73573 298.73573 150.23573 15023.57300 2020-01-01 2020-01-02 2020-01-01 00:09:38 2020-01-02 03:37:59 2020-01-01 00:09:38.000 2020-01-02 03:37:59.000 578 99479 50028.5 5002850 578 99479 50028.5 5002850 -32592 32546 4808.66 480866 -128 127 -1.58 -158 +579 100 10569 99480 1.73873 298.73873 150.23873 15023.87387 1.73873 298.73874 150.23873 15023.8739 1.73873 298.73873 150.23873 15023.87300 2020-01-01 2020-01-02 2020-01-01 00:09:39 2020-01-02 03:38:00 2020-01-01 00:09:39.000 2020-01-02 03:38:00.000 579 99480 50029.5 5002950 579 99480 50029.5 5002950 -32591 32547 4809.66 480966 -128 123 -3.14 -314 +58 102 10048 99958 0.17417 300.17417 150.17417 15167.59159 0.17417 300.17416 150.17417 15167.59159 0.17417 300.17417 150.17417 15167.59117 2020-01-01 2020-01-02 2020-01-01 00:00:58 2020-01-02 03:45:58 2020-01-01 00:00:58.000 2020-01-02 03:45:58.000 58 99958 50008 5050808 58 99958 50008 5050808 -32511 32424 4587.009900990099 463288 -125 126 -0.7128712871287128 -72 +580 100 10570 99481 1.74174 298.74174 150.24174 15024.17417 1.74174 298.74173 150.24174 15024.17419 1.74174 298.74174 150.24174 15024.17400 2020-01-01 2020-01-02 2020-01-01 00:09:40 2020-01-02 03:38:01 2020-01-01 00:09:40.000 2020-01-02 03:38:01.000 580 99481 50030.5 5003050 580 99481 50030.5 5003050 -32590 32548 4810.66 481066 -127 124 -2.14 -214 +581 100 10571 99482 1.74474 298.74474 150.24474 15024.47447 1.74474 298.74475 150.24474 15024.47478 1.74474 298.74474 150.24474 15024.47400 2020-01-01 2020-01-02 2020-01-01 00:09:41 2020-01-02 03:38:02 2020-01-01 00:09:41.000 2020-01-02 03:38:02.000 581 99482 50031.5 5003150 581 99482 50031.5 5003150 -32589 32549 4811.66 481166 -126 125 -1.14 -114 +582 100 10572 99483 1.74774 298.74774 150.24774 15024.77477 1.74774 298.74774 150.24774 15024.77447 1.74774 298.74774 150.24774 15024.77400 2020-01-01 2020-01-02 2020-01-01 00:09:42 2020-01-02 03:38:03 2020-01-01 00:09:42.000 2020-01-02 03:38:03.000 582 99483 50032.5 5003250 582 99483 50032.5 5003250 -32588 32550 4812.66 481266 -125 126 -0.14 -14 +583 100 10573 99484 1.75075 298.75075 150.25075 15025.07507 1.75075 298.75076 150.25075 15025.07507 1.75075 298.75075 150.25075 15025.07500 2020-01-01 2020-01-02 2020-01-01 00:09:43 2020-01-02 03:38:04 2020-01-01 00:09:43.000 2020-01-02 03:38:04.000 583 99484 50033.5 5003350 583 99484 50033.5 5003350 -32587 32551 4813.66 481366 -124 127 0.86 86 +584 100 10574 99485 1.75375 298.75375 150.25375 15025.37537 1.75375 298.75375 150.25375 15025.37536 1.75375 298.75375 150.25375 15025.37500 2020-01-01 2020-01-02 2020-01-01 00:09:44 2020-01-02 03:38:05 2020-01-01 00:09:44.000 2020-01-02 03:38:05.000 584 99485 50034.5 5003450 584 99485 50034.5 5003450 -32586 32552 4814.66 481466 -128 127 -0.7 -70 +585 100 10575 99486 1.75675 298.75675 150.25675 15025.67567 1.75675 298.75674 150.25675 15025.67566 1.75675 298.75675 150.25675 15025.67500 2020-01-01 2020-01-02 2020-01-01 00:09:45 2020-01-02 03:38:06 2020-01-01 00:09:45.000 2020-01-02 03:38:06.000 585 99486 50035.5 5003550 585 99486 50035.5 5003550 -32585 32553 4815.66 481566 -128 127 -2.26 -226 +586 100 10576 99487 1.75975 298.75975 150.25975 15025.97597 1.75975 298.75977 150.25976 15025.97625 1.75975 298.75975 150.25975 15025.97500 2020-01-01 2020-01-02 2020-01-01 00:09:46 2020-01-02 03:38:07 2020-01-01 00:09:46.000 2020-01-02 03:38:07.000 586 99487 50036.5 5003650 586 99487 50036.5 5003650 -32584 32554 4816.66 481666 -128 123 -3.82 -382 +587 100 10577 99488 1.76276 298.76276 150.26276 15026.27627 1.76276 298.76276 150.26275 15026.27594 1.76276 298.76276 150.26276 15026.27600 2020-01-01 2020-01-02 2020-01-01 00:09:47 2020-01-02 03:38:08 2020-01-01 00:09:47.000 2020-01-02 03:38:08.000 587 99488 50037.5 5003750 587 99488 50037.5 5003750 -32583 32555 4817.66 481766 -127 124 -2.82 -282 +588 100 10578 99489 1.76576 298.76576 150.26576 15026.57657 1.76576 298.76578 150.26576 15026.57654 1.76576 298.76576 150.26576 15026.57600 2020-01-01 2020-01-02 2020-01-01 00:09:48 2020-01-02 03:38:09 2020-01-01 00:09:48.000 2020-01-02 03:38:09.000 588 99489 50038.5 5003850 588 99489 50038.5 5003850 -32582 32556 4818.66 481866 -126 125 -1.82 -182 +589 100 10579 99490 1.76876 298.76876 150.26876 15026.87687 1.76876 298.76877 150.26876 15026.87683 1.76876 298.76876 150.26876 15026.87600 2020-01-01 2020-01-02 2020-01-01 00:09:49 2020-01-02 03:38:10 2020-01-01 00:09:49.000 2020-01-02 03:38:10.000 589 99490 50039.5 5003950 589 99490 50039.5 5003950 -32581 32557 4819.66 481966 -125 126 -0.82 -82 +59 102 10049 99959 0.17717 300.17717 150.17717 15167.89489 0.17717 300.1772 150.17717 15167.8947 0.17717 300.17717 150.17717 15167.89417 2020-01-01 2020-01-02 2020-01-01 00:00:59 2020-01-02 03:45:59 2020-01-01 00:00:59.000 2020-01-02 03:45:59.000 59 99959 50009 5050909 59 99959 50009 5050909 -32510 32425 4588.009900990099 463389 -124 127 0.2871287128712871 29 +590 100 10580 99491 1.77177 298.77177 150.27177 15027.17717 1.77177 298.77176 150.27177 15027.17713 1.77177 298.77177 150.27177 15027.17700 2020-01-01 2020-01-02 2020-01-01 00:09:50 2020-01-02 03:38:11 2020-01-01 00:09:50.000 2020-01-02 03:38:11.000 590 99491 50040.5 5004050 590 99491 50040.5 5004050 -32580 32558 4820.66 482066 -124 127 0.18 18 +591 100 10581 99492 1.77477 298.77477 150.27477 15027.47747 1.77477 298.77478 150.27477 15027.47775 1.77477 298.77477 150.27477 15027.47700 2020-01-01 2020-01-02 2020-01-01 00:09:51 2020-01-02 03:38:12 2020-01-01 00:09:51.000 2020-01-02 03:38:12.000 591 99492 50041.5 5004150 591 99492 50041.5 5004150 -32579 32559 4821.66 482166 -128 127 -1.38 -138 +592 100 10582 99493 1.77777 298.77777 150.27777 15027.77777 1.77777 298.77777 150.27777 15027.77742 1.77777 298.77777 150.27777 15027.77700 2020-01-01 2020-01-02 2020-01-01 00:09:52 2020-01-02 03:38:13 2020-01-01 00:09:52.000 2020-01-02 03:38:13.000 592 99493 50042.5 5004250 592 99493 50042.5 5004250 -32578 32560 4822.66 482266 -128 123 -2.94 -294 +593 100 10583 99494 1.78078 298.78078 150.28078 15028.07807 1.78078 298.7808 150.28078 15028.078 1.78078 298.78078 150.28078 15028.07800 2020-01-01 2020-01-02 2020-01-01 00:09:53 2020-01-02 03:38:14 2020-01-01 00:09:53.000 2020-01-02 03:38:14.000 593 99494 50043.5 5004350 593 99494 50043.5 5004350 -32577 32561 4823.66 482366 -127 124 -1.94 -194 +594 100 10584 99495 1.78378 298.78378 150.28378 15028.37837 1.78378 298.78378 150.28378 15028.3783 1.78378 298.78378 150.28378 15028.37800 2020-01-01 2020-01-02 2020-01-01 00:09:54 2020-01-02 03:38:15 2020-01-01 00:09:54.000 2020-01-02 03:38:15.000 594 99495 50044.5 5004450 594 99495 50044.5 5004450 -32576 32562 4824.66 482466 -126 125 -0.94 -94 +595 100 10585 99496 1.78678 298.78678 150.28678 15028.67867 1.78678 298.78677 150.28678 15028.6786 1.78678 298.78678 150.28678 15028.67800 2020-01-01 2020-01-02 2020-01-01 00:09:55 2020-01-02 03:38:16 2020-01-01 00:09:55.000 2020-01-02 03:38:16.000 595 99496 50045.5 5004550 595 99496 50045.5 5004550 -32575 32563 4825.66 482566 -125 126 0.06 6 +596 100 10586 99497 1.78978 298.78978 150.28978 15028.97897 1.78978 298.7898 150.28979 15028.97922 1.78978 298.78978 150.28978 15028.97800 2020-01-01 2020-01-02 2020-01-01 00:09:56 2020-01-02 03:38:17 2020-01-01 00:09:56.000 2020-01-02 03:38:17.000 596 99497 50046.5 5004650 596 99497 50046.5 5004650 -32574 32564 4826.66 482666 -124 127 1.06 106 +597 100 10587 99498 1.79279 298.79279 150.29279 15029.27927 1.79279 298.7928 150.29278 15029.27888 1.79279 298.79279 150.29279 15029.27900 2020-01-01 2020-01-02 2020-01-01 00:09:57 2020-01-02 03:38:18 2020-01-01 00:09:57.000 2020-01-02 03:38:18.000 597 99498 50047.5 5004750 597 99498 50047.5 5004750 -32573 32565 4827.66 482766 -128 127 -0.5 -50 +598 100 10588 99499 1.79579 298.79579 150.29579 15029.57957 1.79579 298.7958 150.29579 15029.57964 1.79579 298.79579 150.29579 15029.57900 2020-01-01 2020-01-02 2020-01-01 00:09:58 2020-01-02 03:38:19 2020-01-01 00:09:58.000 2020-01-02 03:38:19.000 598 99499 50048.5 5004850 598 99499 50048.5 5004850 -32572 32566 4828.66 482866 -128 123 -2.06 -206 +599 100 10589 99500 1.79879 298.79879 150.29879 15029.87987 1.79879 298.7988 150.29879 15029.87977 1.79879 298.79879 150.29879 15029.87900 2020-01-01 2020-01-02 2020-01-01 00:09:59 2020-01-02 03:38:20 2020-01-01 00:09:59.000 2020-01-02 03:38:20.000 599 99500 50049.5 5004950 599 99500 50049.5 5004950 -32571 32567 4829.66 482966 -127 124 -1.06 -106 +6 102 1005 9996 0.01801 300.01801 150.01801 15151.81981 0.01801 300.018 150.01801 15151.81978 0.01801 300.01801 150.01801 15151.81901 2020-01-01 2020-01-02 2020-01-01 00:00:06 2020-01-02 03:45:06 2020-01-01 00:00:06.000 2020-01-02 03:45:06.000 6 99906 49956 5045556 6 99906 49956 5045556 -32563 32372 4535.009900990099 458036 -127 124 -2.01980198019802 -204 +60 102 10050 99960 0.18018 300.18018 150.18018 15168.19819 0.18018 300.18018 150.18017 15168.198 0.18018 300.18018 150.18018 15168.19818 2020-01-01 2020-01-02 2020-01-01 00:01:00 2020-01-02 03:46:00 2020-01-01 00:01:00.000 2020-01-02 03:46:00.000 60 99960 50010 5051010 60 99960 50010 5051010 -32509 32426 4589.009900990099 463490 -128 127 -1.2475247524752475 -126 +600 100 10590 99501 1.8018 298.8018 150.3018 15030.18018 1.8018 298.8018 150.3018 15030.1801 1.80180 298.80180 150.30180 15030.18000 2020-01-01 2020-01-02 2020-01-01 00:10:00 2020-01-02 03:38:21 2020-01-01 00:10:00.000 2020-01-02 03:38:21.000 600 99501 50050.5 5005050 600 99501 50050.5 5005050 -32570 32568 4830.66 483066 -126 125 -0.06 -6 +601 100 10591 99502 1.8048 298.8048 150.3048 15030.48048 1.8048 298.8048 150.3048 15030.4807 1.80480 298.80480 150.30480 15030.48000 2020-01-01 2020-01-02 2020-01-01 00:10:01 2020-01-02 03:38:22 2020-01-01 00:10:01.000 2020-01-02 03:38:22.000 601 99502 50051.5 5005150 601 99502 50051.5 5005150 -32569 32569 4831.66 483166 -125 126 0.94 94 +602 100 10592 99503 1.8078 298.8078 150.3078 15030.78078 1.8078 298.8078 150.3078 15030.78035 1.80780 298.80780 150.30780 15030.78000 2020-01-01 2020-01-02 2020-01-01 00:10:02 2020-01-02 03:38:23 2020-01-01 00:10:02.000 2020-01-02 03:38:23.000 602 99503 50052.5 5005250 602 99503 50052.5 5005250 -32568 32570 4832.66 483266 -124 127 1.94 194 +603 100 10593 99504 1.81081 298.81081 150.31081 15031.08108 1.81081 298.81082 150.31081 15031.0811 1.81081 298.81081 150.31081 15031.08100 2020-01-01 2020-01-02 2020-01-01 00:10:03 2020-01-02 03:38:24 2020-01-01 00:10:03.000 2020-01-02 03:38:24.000 603 99504 50053.5 5005350 603 99504 50053.5 5005350 -32567 32571 4833.66 483366 -128 127 0.38 38 +604 100 10594 99505 1.81381 298.81381 150.31381 15031.38138 1.81381 298.8138 150.31381 15031.38124 1.81381 298.81381 150.31381 15031.38100 2020-01-01 2020-01-02 2020-01-01 00:10:04 2020-01-02 03:38:25 2020-01-01 00:10:04.000 2020-01-02 03:38:25.000 604 99505 50054.5 5005450 604 99505 50054.5 5005450 -32566 32572 4834.66 483466 -128 123 -1.18 -118 +605 100 10595 99506 1.81681 298.81681 150.31681 15031.68168 1.81681 298.8168 150.31681 15031.68157 1.81681 298.81681 150.31681 15031.68100 2020-01-01 2020-01-02 2020-01-01 00:10:05 2020-01-02 03:38:26 2020-01-01 00:10:05.000 2020-01-02 03:38:26.000 605 99506 50055.5 5005550 605 99506 50055.5 5005550 -32565 32573 4835.66 483566 -127 124 -0.18 -18 +606 100 10596 99507 1.81981 298.81981 150.31981 15031.98198 1.81981 298.81982 150.31982 15031.98217 1.81981 298.81981 150.31981 15031.98100 2020-01-01 2020-01-02 2020-01-01 00:10:06 2020-01-02 03:38:27 2020-01-01 00:10:06.000 2020-01-02 03:38:27.000 606 99507 50056.5 5005650 606 99507 50056.5 5005650 -32564 32574 4836.66 483666 -126 125 0.82 82 +607 100 10597 99508 1.82282 298.82282 150.32282 15032.28228 1.82282 298.8228 150.32282 15032.28246 1.82282 298.82282 150.32282 15032.28200 2020-01-01 2020-01-02 2020-01-01 00:10:07 2020-01-02 03:38:28 2020-01-01 00:10:07.000 2020-01-02 03:38:28.000 607 99508 50057.5 5005750 607 99508 50057.5 5005750 -32563 32575 4837.66 483766 -125 126 1.82 182 +608 100 10598 99509 1.82582 298.82582 150.32582 15032.58258 1.82582 298.82584 150.32582 15032.58258 1.82582 298.82582 150.32582 15032.58200 2020-01-01 2020-01-02 2020-01-01 00:10:08 2020-01-02 03:38:29 2020-01-01 00:10:08.000 2020-01-02 03:38:29.000 608 99509 50058.5 5005850 608 99509 50058.5 5005850 -32562 32576 4838.66 483866 -124 127 2.82 282 +609 100 10599 99510 1.82882 298.82882 150.32882 15032.88288 1.82882 298.82883 150.32882 15032.88274 1.82882 298.82882 150.32882 15032.88200 2020-01-01 2020-01-02 2020-01-01 00:10:09 2020-01-02 03:38:30 2020-01-01 00:10:09.000 2020-01-02 03:38:30.000 609 99510 50059.5 5005950 609 99510 50059.5 5005950 -32561 32577 4839.66 483966 -128 127 1.26 126 +61 102 10051 99961 0.18318 300.18318 150.18318 15168.5015 0.18318 300.1832 150.18318 15168.5016 0.18318 300.18318 150.18318 15168.50118 2020-01-01 2020-01-02 2020-01-01 00:01:01 2020-01-02 03:46:01 2020-01-01 00:01:01.000 2020-01-02 03:46:01.000 61 99961 50011 5051111 61 99961 50011 5051111 -32508 32427 4590.009900990099 463591 -128 123 -2.782178217821782 -281 +610 100 10600 99511 1.83183 298.83183 150.33183 15033.18318 1.83183 298.83182 150.33183 15033.18304 1.83183 298.83183 150.33183 15033.18300 2020-01-01 2020-01-02 2020-01-01 00:10:10 2020-01-02 03:38:31 2020-01-01 00:10:10.000 2020-01-02 03:38:31.000 610 99511 50060.5 5006050 610 99511 50060.5 5006050 -32560 32578 4840.66 484066 -128 127 -0.3 -30 +611 100 10601 99512 1.83483 298.83483 150.33483 15033.48348 1.83483 298.83484 150.33483 15033.48363 1.83483 298.83483 150.33483 15033.48300 2020-01-01 2020-01-02 2020-01-01 00:10:11 2020-01-02 03:38:32 2020-01-01 00:10:11.000 2020-01-02 03:38:32.000 611 99512 50061.5 5006150 611 99512 50061.5 5006150 -32559 32579 4841.66 484166 -128 123 -1.86 -186 +612 100 10602 99513 1.83783 298.83783 150.33783 15033.78378 1.83783 298.83783 150.33783 15033.78393 1.83783 298.83783 150.33783 15033.78300 2020-01-01 2020-01-02 2020-01-01 00:10:12 2020-01-02 03:38:33 2020-01-01 00:10:12.000 2020-01-02 03:38:33.000 612 99513 50062.5 5006250 612 99513 50062.5 5006250 -32558 32580 4842.66 484266 -127 124 -0.86 -86 +613 100 10603 99514 1.84084 298.84084 150.34084 15034.08408 1.84084 298.84085 150.34084 15034.08405 1.84084 298.84084 150.34084 15034.08400 2020-01-01 2020-01-02 2020-01-01 00:10:13 2020-01-02 03:38:34 2020-01-01 00:10:13.000 2020-01-02 03:38:34.000 613 99514 50063.5 5006350 613 99514 50063.5 5006350 -32557 32581 4843.66 484366 -126 125 0.14 14 +614 100 10604 99515 1.84384 298.84384 150.34384 15034.38438 1.84384 298.84384 150.34384 15034.38421 1.84384 298.84384 150.34384 15034.38400 2020-01-01 2020-01-02 2020-01-01 00:10:14 2020-01-02 03:38:35 2020-01-01 00:10:14.000 2020-01-02 03:38:35.000 614 99515 50064.5 5006450 614 99515 50064.5 5006450 -32556 32582 4844.66 484466 -125 126 1.14 114 +615 100 10605 99516 1.84684 298.84684 150.34684 15034.68468 1.84684 298.84683 150.34684 15034.68452 1.84684 298.84684 150.34684 15034.68400 2020-01-01 2020-01-02 2020-01-01 00:10:15 2020-01-02 03:38:36 2020-01-01 00:10:15.000 2020-01-02 03:38:36.000 615 99516 50065.5 5006550 615 99516 50065.5 5006550 -32555 32583 4845.66 484566 -124 127 2.14 214 +616 100 10606 99517 1.84984 298.84984 150.34984 15034.98498 1.84984 298.84985 150.34985 15034.98527 1.84984 298.84984 150.34984 15034.98400 2020-01-01 2020-01-02 2020-01-01 00:10:16 2020-01-02 03:38:37 2020-01-01 00:10:16.000 2020-01-02 03:38:37.000 616 99517 50066.5 5006650 616 99517 50066.5 5006650 -32554 32584 4846.66 484666 -128 127 0.58 58 +617 100 10607 99518 1.85285 298.85285 150.35285 15035.28528 1.85285 298.85284 150.35285 15035.2854 1.85285 298.85285 150.35285 15035.28500 2020-01-01 2020-01-02 2020-01-01 00:10:17 2020-01-02 03:38:38 2020-01-01 00:10:17.000 2020-01-02 03:38:38.000 617 99518 50067.5 5006750 617 99518 50067.5 5006750 -32553 32585 4847.66 484766 -128 123 -0.98 -98 +618 100 10608 99519 1.85585 298.85585 150.35585 15035.58558 1.85585 298.85587 150.35585 15035.58551 1.85585 298.85585 150.35585 15035.58500 2020-01-01 2020-01-02 2020-01-01 00:10:18 2020-01-02 03:38:39 2020-01-01 00:10:18.000 2020-01-02 03:38:39.000 618 99519 50068.5 5006850 618 99519 50068.5 5006850 -32552 32586 4848.66 484866 -127 124 0.02 2 +619 100 10609 99520 1.85885 298.85885 150.35885 15035.88588 1.85885 298.85886 150.35885 15035.88568 1.85885 298.85885 150.35885 15035.88500 2020-01-01 2020-01-02 2020-01-01 00:10:19 2020-01-02 03:38:40 2020-01-01 00:10:19.000 2020-01-02 03:38:40.000 619 99520 50069.5 5006950 619 99520 50069.5 5006950 -32551 32587 4849.66 484966 -126 125 1.02 102 +62 102 10052 99962 0.18618 300.18618 150.18618 15168.8048 0.18618 300.1862 150.18618 15168.80494 0.18618 300.18618 150.18618 15168.80418 2020-01-01 2020-01-02 2020-01-01 00:01:02 2020-01-02 03:46:02 2020-01-01 00:01:02.000 2020-01-02 03:46:02.000 62 99962 50012 5051212 62 99962 50012 5051212 -32507 32428 4591.009900990099 463692 -127 124 -1.7821782178217822 -180 +620 100 10610 99521 1.86186 298.86186 150.36186 15036.18618 1.86186 298.86185 150.36185 15036.18598 1.86186 298.86186 150.36186 15036.18600 2020-01-01 2020-01-02 2020-01-01 00:10:20 2020-01-02 03:38:41 2020-01-01 00:10:20.000 2020-01-02 03:38:41.000 620 99521 50070.5 5007050 620 99521 50070.5 5007050 -32550 32588 4850.66 485066 -125 126 2.02 202 +621 100 10611 99522 1.86486 298.86486 150.36486 15036.48648 1.86486 298.86487 150.36486 15036.48673 1.86486 298.86486 150.36486 15036.48600 2020-01-01 2020-01-02 2020-01-01 00:10:21 2020-01-02 03:38:42 2020-01-01 00:10:21.000 2020-01-02 03:38:42.000 621 99522 50071.5 5007150 621 99522 50071.5 5007150 -32549 32589 4851.66 485166 -124 127 3.02 302 +622 100 10612 99523 1.86786 298.86786 150.36786 15036.78678 1.86786 298.86786 150.36786 15036.78687 1.86786 298.86786 150.36786 15036.78600 2020-01-01 2020-01-02 2020-01-01 00:10:22 2020-01-02 03:38:43 2020-01-01 00:10:22.000 2020-01-02 03:38:43.000 622 99523 50072.5 5007250 622 99523 50072.5 5007250 -32548 32590 4852.66 485266 -128 127 1.46 146 +623 100 10613 99524 1.87087 298.87087 150.37087 15037.08708 1.87087 298.87088 150.37087 15037.08702 1.87087 298.87087 150.37087 15037.08700 2020-01-01 2020-01-02 2020-01-01 00:10:23 2020-01-02 03:38:44 2020-01-01 00:10:23.000 2020-01-02 03:38:44.000 623 99524 50073.5 5007350 623 99524 50073.5 5007350 -32547 32591 4853.66 485366 -128 123 -0.1 -10 +624 100 10614 99525 1.87387 298.87387 150.37387 15037.38738 1.87387 298.87387 150.37387 15037.38716 1.87387 298.87387 150.37387 15037.38700 2020-01-01 2020-01-02 2020-01-01 00:10:24 2020-01-02 03:38:45 2020-01-01 00:10:24.000 2020-01-02 03:38:45.000 624 99525 50074.5 5007450 624 99525 50074.5 5007450 -32546 32592 4854.66 485466 -127 124 0.9 90 +625 100 10615 99526 1.87687 298.87687 150.37687 15037.68768 1.87687 298.8769 150.37687 15037.68791 1.87687 298.87687 150.37687 15037.68700 2020-01-01 2020-01-02 2020-01-01 00:10:25 2020-01-02 03:38:46 2020-01-01 00:10:25.000 2020-01-02 03:38:46.000 625 99526 50075.5 5007550 625 99526 50075.5 5007550 -32545 32593 4855.66 485566 -126 125 1.9 190 +626 100 10616 99527 1.87987 298.87987 150.37987 15037.98798 1.87987 298.87988 150.37988 15037.9882 1.87987 298.87987 150.37987 15037.98700 2020-01-01 2020-01-02 2020-01-01 00:10:26 2020-01-02 03:38:47 2020-01-01 00:10:26.000 2020-01-02 03:38:47.000 626 99527 50076.5 5007650 626 99527 50076.5 5007650 -32544 32594 4856.66 485666 -125 126 2.9 290 +627 100 10617 99528 1.88288 298.88288 150.38288 15038.28828 1.88288 298.88287 150.38288 15038.28834 1.88288 298.88288 150.38288 15038.28800 2020-01-01 2020-01-02 2020-01-01 00:10:27 2020-01-02 03:38:48 2020-01-01 00:10:27.000 2020-01-02 03:38:48.000 627 99528 50077.5 5007750 627 99528 50077.5 5007750 -32543 32595 4857.66 485766 -124 127 3.9 390 +628 100 10618 99529 1.88588 298.88588 150.38588 15038.58858 1.88588 298.8859 150.38588 15038.58849 1.88588 298.88588 150.38588 15038.58800 2020-01-01 2020-01-02 2020-01-01 00:10:28 2020-01-02 03:38:49 2020-01-01 00:10:28.000 2020-01-02 03:38:49.000 628 99529 50078.5 5007850 628 99529 50078.5 5007850 -32542 32596 4858.66 485866 -128 127 2.34 234 +629 100 10619 99530 1.88888 298.88888 150.38888 15038.88888 1.88888 298.8889 150.38888 15038.88862 1.88888 298.88888 150.38888 15038.88800 2020-01-01 2020-01-02 2020-01-01 00:10:29 2020-01-02 03:38:50 2020-01-01 00:10:29.000 2020-01-02 03:38:50.000 629 99530 50079.5 5007950 629 99530 50079.5 5007950 -32541 32597 4859.66 485966 -128 123 0.78 78 +63 102 10053 99963 0.18918 300.18918 150.18918 15169.1081 0.18918 300.18918 150.18918 15169.10808 0.18918 300.18918 150.18918 15169.10718 2020-01-01 2020-01-02 2020-01-01 00:01:03 2020-01-02 03:46:03 2020-01-01 00:01:03.000 2020-01-02 03:46:03.000 63 99963 50013 5051313 63 99963 50013 5051313 -32506 32429 4592.009900990099 463793 -126 125 -0.7821782178217822 -79 +630 100 10620 99531 1.89189 298.89189 150.39189 15039.18918 1.89189 298.8919 150.39189 15039.18937 1.89189 298.89189 150.39189 15039.18900 2020-01-01 2020-01-02 2020-01-01 00:10:30 2020-01-02 03:38:51 2020-01-01 00:10:30.000 2020-01-02 03:38:51.000 630 99531 50080.5 5008050 630 99531 50080.5 5008050 -32540 32598 4860.66 486066 -127 124 1.78 178 +631 100 10621 99532 1.89489 298.89489 150.39489 15039.48948 1.89489 298.8949 150.39489 15039.48968 1.89489 298.89489 150.39489 15039.48900 2020-01-01 2020-01-02 2020-01-01 00:10:31 2020-01-02 03:38:52 2020-01-01 00:10:31.000 2020-01-02 03:38:52.000 631 99532 50081.5 5008150 631 99532 50081.5 5008150 -32539 32599 4861.66 486166 -126 125 2.78 278 +632 100 10622 99533 1.89789 298.89789 150.39789 15039.78978 1.89789 298.8979 150.39789 15039.78984 1.89789 298.89789 150.39789 15039.78900 2020-01-01 2020-01-02 2020-01-01 00:10:32 2020-01-02 03:38:53 2020-01-01 00:10:32.000 2020-01-02 03:38:53.000 632 99533 50082.5 5008250 632 99533 50082.5 5008250 -32538 32600 4862.66 486266 -125 126 3.78 378 +633 100 10623 99534 1.9009 298.9009 150.4009 15040.09009 1.9009 298.9009 150.40089 15040.08996 1.90090 298.90090 150.40090 15040.09000 2020-01-01 2020-01-02 2020-01-01 00:10:33 2020-01-02 03:38:54 2020-01-01 00:10:33.000 2020-01-02 03:38:54.000 633 99534 50083.5 5008350 633 99534 50083.5 5008350 -32537 32601 4863.66 486366 -124 127 4.78 478 +634 100 10624 99535 1.9039 298.9039 150.4039 15040.39039 1.9039 298.9039 150.4039 15040.39009 1.90390 298.90390 150.40390 15040.39000 2020-01-01 2020-01-02 2020-01-01 00:10:34 2020-01-02 03:38:55 2020-01-01 00:10:34.000 2020-01-02 03:38:55.000 634 99535 50084.5 5008450 634 99535 50084.5 5008450 -32536 32602 4864.66 486466 -128 127 3.22 322 +635 100 10625 99536 1.9069 298.9069 150.4069 15040.69069 1.9069 298.90692 150.4069 15040.69084 1.90690 298.90690 150.40690 15040.69000 2020-01-01 2020-01-02 2020-01-01 00:10:35 2020-01-02 03:38:56 2020-01-01 00:10:35.000 2020-01-02 03:38:56.000 635 99536 50085.5 5008550 635 99536 50085.5 5008550 -32535 32603 4865.66 486566 -128 127 1.66 166 +636 100 10626 99537 1.9099 298.9099 150.4099 15040.99099 1.90991 298.9099 150.40991 15040.99115 1.90990 298.90990 150.40990 15040.99000 2020-01-01 2020-01-02 2020-01-01 00:10:36 2020-01-02 03:38:57 2020-01-01 00:10:36.000 2020-01-02 03:38:57.000 636 99537 50086.5 5008650 636 99537 50086.5 5008650 -32534 32604 4866.66 486666 -128 124 0.1 10 +637 100 10627 99538 1.91291 298.91291 150.41291 15041.29129 1.91291 298.9129 150.41291 15041.29131 1.91291 298.91291 150.41291 15041.29100 2020-01-01 2020-01-02 2020-01-01 00:10:37 2020-01-02 03:38:58 2020-01-01 00:10:37.000 2020-01-02 03:38:58.000 637 99538 50087.5 5008750 637 99538 50087.5 5008750 -32533 32605 4867.66 486766 -127 125 1.1 110 +638 100 10628 99539 1.91591 298.91591 150.41591 15041.59159 1.91591 298.91592 150.41591 15041.59143 1.91591 298.91591 150.41591 15041.59100 2020-01-01 2020-01-02 2020-01-01 00:10:38 2020-01-02 03:38:59 2020-01-01 00:10:38.000 2020-01-02 03:38:59.000 638 99539 50088.5 5008850 638 99539 50088.5 5008850 -32532 32606 4868.66 486866 -126 126 2.1 210 +639 100 10629 99540 1.91891 298.91891 150.41891 15041.89189 1.91891 298.9189 150.41891 15041.89172 1.91891 298.91891 150.41891 15041.89100 2020-01-01 2020-01-02 2020-01-01 00:10:39 2020-01-02 03:39:00 2020-01-01 00:10:39.000 2020-01-02 03:39:00.000 639 99540 50089.5 5008950 639 99540 50089.5 5008950 -32531 32607 4869.66 486966 -125 127 3.1 310 +64 102 10054 99964 0.19219 300.19219 150.19219 15169.41141 0.19219 300.1922 150.19219 15169.41184 0.19219 300.19219 150.19219 15169.41119 2020-01-01 2020-01-02 2020-01-01 00:01:04 2020-01-02 03:46:04 2020-01-01 00:01:04.000 2020-01-02 03:46:04.000 64 99964 50014 5051414 64 99964 50014 5051414 -32505 32430 4593.009900990099 463894 -125 126 0.21782178217821782 22 +640 100 10630 99541 1.92192 298.92192 150.42192 15042.19219 1.92192 298.92194 150.42192 15042.19232 1.92192 298.92192 150.42192 15042.19200 2020-01-01 2020-01-02 2020-01-01 00:10:40 2020-01-02 03:39:01 2020-01-01 00:10:40.000 2020-01-02 03:39:01.000 640 99541 50090.5 5009050 640 99541 50090.5 5009050 -32530 32608 4870.66 487066 -128 127 1.54 154 +641 100 10631 99542 1.92492 298.92492 150.42492 15042.49249 1.92492 298.92493 150.42492 15042.49265 1.92492 298.92492 150.42492 15042.49200 2020-01-01 2020-01-02 2020-01-01 00:10:41 2020-01-02 03:39:02 2020-01-01 00:10:41.000 2020-01-02 03:39:02.000 641 99542 50091.5 5009150 641 99542 50091.5 5009150 -32529 32609 4871.66 487166 -128 127 -0.02 -2 +642 100 10632 99543 1.92792 298.92792 150.42792 15042.79279 1.92792 298.92792 150.42792 15042.79278 1.92792 298.92792 150.42792 15042.79200 2020-01-01 2020-01-02 2020-01-01 00:10:42 2020-01-02 03:39:03 2020-01-01 00:10:42.000 2020-01-02 03:39:03.000 642 99543 50092.5 5009250 642 99543 50092.5 5009250 -32528 32610 4872.66 487266 -128 123 -1.58 -158 +643 100 10633 99544 1.93093 298.93093 150.43093 15043.09309 1.93093 298.93094 150.43092 15043.0929 1.93093 298.93093 150.43093 15043.09300 2020-01-01 2020-01-02 2020-01-01 00:10:43 2020-01-02 03:39:04 2020-01-01 00:10:43.000 2020-01-02 03:39:04.000 643 99544 50093.5 5009350 643 99544 50093.5 5009350 -32527 32611 4873.66 487366 -127 124 -0.58 -58 +644 100 10634 99545 1.93393 298.93393 150.43393 15043.39339 1.93393 298.93393 150.43393 15043.39319 1.93393 298.93393 150.43393 15043.39300 2020-01-01 2020-01-02 2020-01-01 00:10:44 2020-01-02 03:39:05 2020-01-01 00:10:44.000 2020-01-02 03:39:05.000 644 99545 50094.5 5009450 644 99545 50094.5 5009450 -32526 32612 4874.66 487466 -126 125 0.42 42 +645 100 10635 99546 1.93693 298.93693 150.43693 15043.69369 1.93693 298.93695 150.43693 15043.69379 1.93693 298.93693 150.43693 15043.69300 2020-01-01 2020-01-02 2020-01-01 00:10:45 2020-01-02 03:39:06 2020-01-01 00:10:45.000 2020-01-02 03:39:06.000 645 99546 50095.5 5009550 645 99546 50095.5 5009550 -32525 32613 4875.66 487566 -125 126 1.42 142 +646 100 10636 99547 1.93993 298.93993 150.43993 15043.99399 1.93994 298.93994 150.43994 15043.99412 1.93993 298.93993 150.43993 15043.99300 2020-01-01 2020-01-02 2020-01-01 00:10:46 2020-01-02 03:39:07 2020-01-01 00:10:46.000 2020-01-02 03:39:07.000 646 99547 50096.5 5009650 646 99547 50096.5 5009650 -32524 32614 4876.66 487666 -124 127 2.42 242 +647 100 10637 99548 1.94294 298.94294 150.44294 15044.29429 1.94294 298.94293 150.44294 15044.29425 1.94294 298.94294 150.44294 15044.29400 2020-01-01 2020-01-02 2020-01-01 00:10:47 2020-01-02 03:39:08 2020-01-01 00:10:47.000 2020-01-02 03:39:08.000 647 99548 50097.5 5009750 647 99548 50097.5 5009750 -32523 32615 4877.66 487766 -128 127 0.86 86 +648 100 10638 99549 1.94594 298.94594 150.44594 15044.59459 1.94594 298.94595 150.44595 15044.595 1.94594 298.94594 150.44594 15044.59400 2020-01-01 2020-01-02 2020-01-01 00:10:48 2020-01-02 03:39:09 2020-01-01 00:10:48.000 2020-01-02 03:39:09.000 648 99549 50098.5 5009850 648 99549 50098.5 5009850 -32522 32616 4878.66 487866 -128 123 -0.7 -70 +649 100 10639 99550 1.94894 298.94894 150.44894 15044.89489 1.94894 298.94894 150.44894 15044.89467 1.94894 298.94894 150.44894 15044.89400 2020-01-01 2020-01-02 2020-01-01 00:10:49 2020-01-02 03:39:10 2020-01-01 00:10:49.000 2020-01-02 03:39:10.000 649 99550 50099.5 5009950 649 99550 50099.5 5009950 -32521 32617 4879.66 487966 -127 124 0.3 30 +65 102 10055 99965 0.19519 300.19519 150.19519 15169.71471 0.19519 300.1952 150.19519 15169.71448 0.19519 300.19519 150.19519 15169.71419 2020-01-01 2020-01-02 2020-01-01 00:01:05 2020-01-02 03:46:05 2020-01-01 00:01:05.000 2020-01-02 03:46:05.000 65 99965 50015 5051515 65 99965 50015 5051515 -32504 32431 4594.009900990099 463995 -124 127 1.2178217821782178 123 +650 100 10640 99551 1.95195 298.95195 150.45195 15045.19519 1.95195 298.95197 150.45195 15045.19525 1.95195 298.95195 150.45195 15045.19500 2020-01-01 2020-01-02 2020-01-01 00:10:50 2020-01-02 03:39:11 2020-01-01 00:10:50.000 2020-01-02 03:39:11.000 650 99551 50100.5 5010050 650 99551 50100.5 5010050 -32520 32618 4880.66 488066 -126 125 1.3 130 +651 100 10641 99552 1.95495 298.95495 150.45495 15045.49549 1.95495 298.95496 150.45495 15045.49558 1.95495 298.95495 150.45495 15045.49500 2020-01-01 2020-01-02 2020-01-01 00:10:51 2020-01-02 03:39:12 2020-01-01 00:10:51.000 2020-01-02 03:39:12.000 651 99552 50101.5 5010150 651 99552 50101.5 5010150 -32519 32619 4881.66 488166 -125 126 2.3 230 +652 100 10642 99553 1.95795 298.95795 150.45795 15045.79579 1.95795 298.95795 150.45795 15045.79572 1.95795 298.95795 150.45795 15045.79500 2020-01-01 2020-01-02 2020-01-01 00:10:52 2020-01-02 03:39:13 2020-01-01 00:10:52.000 2020-01-02 03:39:13.000 652 99553 50102.5 5010250 652 99553 50102.5 5010250 -32518 32620 4882.66 488266 -124 127 3.3 330 +653 100 10643 99554 1.96096 298.96096 150.46096 15046.09609 1.96096 298.96097 150.46096 15046.09647 1.96096 298.96096 150.46096 15046.09600 2020-01-01 2020-01-02 2020-01-01 00:10:53 2020-01-02 03:39:14 2020-01-01 00:10:53.000 2020-01-02 03:39:14.000 653 99554 50103.5 5010350 653 99554 50103.5 5010350 -32517 32621 4883.66 488366 -128 127 1.74 174 +654 100 10644 99555 1.96396 298.96396 150.46396 15046.39639 1.96396 298.96396 150.46396 15046.39613 1.96396 298.96396 150.46396 15046.39600 2020-01-01 2020-01-02 2020-01-01 00:10:54 2020-01-02 03:39:15 2020-01-01 00:10:54.000 2020-01-02 03:39:15.000 654 99555 50104.5 5010450 654 99555 50104.5 5010450 -32516 32622 4884.66 488466 -128 123 0.18 18 +655 100 10645 99556 1.96696 298.96696 150.46696 15046.69669 1.96696 298.96698 150.46696 15046.69676 1.96696 298.96696 150.46696 15046.69600 2020-01-01 2020-01-02 2020-01-01 00:10:55 2020-01-02 03:39:16 2020-01-01 00:10:55.000 2020-01-02 03:39:16.000 655 99556 50105.5 5010550 655 99556 50105.5 5010550 -32515 32623 4885.66 488566 -127 124 1.18 118 +656 100 10646 99557 1.96996 298.96996 150.46996 15046.99699 1.96997 298.96997 150.46997 15046.99706 1.96996 298.96996 150.46996 15046.99600 2020-01-01 2020-01-02 2020-01-01 00:10:56 2020-01-02 03:39:17 2020-01-01 00:10:56.000 2020-01-02 03:39:17.000 656 99557 50106.5 5010650 656 99557 50106.5 5010650 -32514 32624 4886.66 488666 -126 125 2.18 218 +657 100 10647 99558 1.97297 298.97297 150.47297 15047.29729 1.97297 298.97296 150.47297 15047.29735 1.97297 298.97297 150.47297 15047.29700 2020-01-01 2020-01-02 2020-01-01 00:10:57 2020-01-02 03:39:18 2020-01-01 00:10:57.000 2020-01-02 03:39:18.000 657 99558 50107.5 5010750 657 99558 50107.5 5010750 -32513 32625 4887.66 488766 -125 126 3.18 318 +658 100 10648 99559 1.97597 298.97597 150.47597 15047.59759 1.97597 298.97598 150.47597 15047.59794 1.97597 298.97597 150.47597 15047.59700 2020-01-01 2020-01-02 2020-01-01 00:10:58 2020-01-02 03:39:19 2020-01-01 00:10:58.000 2020-01-02 03:39:19.000 658 99559 50108.5 5010850 658 99559 50108.5 5010850 -32512 32626 4888.66 488866 -124 127 4.18 418 +659 100 10649 99560 1.97897 298.97897 150.47897 15047.89789 1.97897 298.97897 150.47897 15047.8976 1.97897 298.97897 150.47897 15047.89700 2020-01-01 2020-01-02 2020-01-01 00:10:59 2020-01-02 03:39:20 2020-01-01 00:10:59.000 2020-01-02 03:39:20.000 659 99560 50109.5 5010950 659 99560 50109.5 5010950 -32511 32627 4889.66 488966 -128 127 2.62 262 +66 102 10056 99966 0.19819 300.19819 150.19819 15170.01801 0.19819 300.1982 150.19819 15170.01808 0.19819 300.19819 150.19819 15170.01719 2020-01-01 2020-01-02 2020-01-01 00:01:06 2020-01-02 03:46:06 2020-01-01 00:01:06.000 2020-01-02 03:46:06.000 66 99966 50016 5051616 66 99966 50016 5051616 -32503 32432 4595.009900990099 464096 -128 127 -0.31683168316831684 -32 +660 100 10650 99561 1.98198 298.98198 150.48198 15048.19819 1.98198 298.982 150.48198 15048.19822 1.98198 298.98198 150.48198 15048.19800 2020-01-01 2020-01-02 2020-01-01 00:11:00 2020-01-02 03:39:21 2020-01-01 00:11:00.000 2020-01-02 03:39:21.000 660 99561 50110.5 5011050 660 99561 50110.5 5011050 -32510 32628 4890.66 489066 -128 127 1.06 106 +661 100 10651 99562 1.98498 298.98498 150.48498 15048.49849 1.98498 298.985 150.48498 15048.49853 1.98498 298.98498 150.48498 15048.49800 2020-01-01 2020-01-02 2020-01-01 00:11:01 2020-01-02 03:39:22 2020-01-01 00:11:01.000 2020-01-02 03:39:22.000 661 99562 50111.5 5011150 661 99562 50111.5 5011150 -32509 32629 4891.66 489166 -128 124 -0.5 -50 +662 100 10652 99563 1.98798 298.98798 150.48798 15048.79879 1.98798 298.98798 150.48798 15048.79882 1.98798 298.98798 150.48798 15048.79800 2020-01-01 2020-01-02 2020-01-01 00:11:02 2020-01-02 03:39:23 2020-01-01 00:11:02.000 2020-01-02 03:39:23.000 662 99563 50112.5 5011250 662 99563 50112.5 5011250 -32508 32630 4892.66 489266 -127 125 0.5 50 +663 100 10653 99564 1.99099 298.99099 150.49099 15049.09909 1.99099 298.991 150.49099 15049.09942 1.99099 298.99099 150.49099 15049.09900 2020-01-01 2020-01-02 2020-01-01 00:11:03 2020-01-02 03:39:24 2020-01-01 00:11:03.000 2020-01-02 03:39:24.000 663 99564 50113.5 5011350 663 99564 50113.5 5011350 -32507 32631 4893.66 489366 -126 126 1.5 150 +664 100 10654 99565 1.99399 298.99399 150.49399 15049.39939 1.99399 298.994 150.49399 15049.39911 1.99399 298.99399 150.49399 15049.39900 2020-01-01 2020-01-02 2020-01-01 00:11:04 2020-01-02 03:39:25 2020-01-01 00:11:04.000 2020-01-02 03:39:25.000 664 99565 50114.5 5011450 664 99565 50114.5 5011450 -32506 32632 4894.66 489466 -125 127 2.5 250 +665 100 10655 99566 1.99699 298.99699 150.49699 15049.69969 1.99699 298.997 150.49699 15049.6997 1.99699 298.99699 150.49699 15049.69900 2020-01-01 2020-01-02 2020-01-01 00:11:05 2020-01-02 03:39:26 2020-01-01 00:11:05.000 2020-01-02 03:39:26.000 665 99566 50115.5 5011550 665 99566 50115.5 5011550 -32505 32633 4895.66 489566 -128 127 0.94 94 +666 100 10656 99567 2 299 150.5 15050 2 299 150.5 15050 2.00000 299.00000 150.50000 15050.00000 2020-01-01 2020-01-02 2020-01-01 00:11:06 2020-01-02 03:39:27 2020-01-01 00:11:06.000 2020-01-02 03:39:27.000 666 99567 50116.5 5011650 666 99567 50116.5 5011650 -32504 32634 4896.66 489666 -128 127 -0.62 -62 +667 100 10657 99568 2.003 299.003 150.503 15050.3003 2.003 299.003 150.503 15050.30029 2.00300 299.00300 150.50300 15050.30000 2020-01-01 2020-01-02 2020-01-01 00:11:07 2020-01-02 03:39:28 2020-01-01 00:11:07.000 2020-01-02 03:39:28.000 667 99568 50117.5 5011750 667 99568 50117.5 5011750 -32503 32635 4897.66 489766 -128 123 -2.18 -218 +668 100 10658 99569 2.006 299.006 150.506 15050.6006 2.006 299.006 150.506 15050.60089 2.00600 299.00600 150.50600 15050.60000 2020-01-01 2020-01-02 2020-01-01 00:11:08 2020-01-02 03:39:29 2020-01-01 00:11:08.000 2020-01-02 03:39:29.000 668 99569 50118.5 5011850 668 99569 50118.5 5011850 -32502 32636 4898.66 489866 -127 124 -1.18 -118 +669 100 10659 99570 2.009 299.009 150.509 15050.9009 2.009 299.009 150.509 15050.90057 2.00900 299.00900 150.50900 15050.90000 2020-01-01 2020-01-02 2020-01-01 00:11:09 2020-01-02 03:39:30 2020-01-01 00:11:09.000 2020-01-02 03:39:30.000 669 99570 50119.5 5011950 669 99570 50119.5 5011950 -32501 32637 4899.66 489966 -126 125 -0.18 -18 +67 102 10057 99967 0.2012 300.2012 150.2012 15170.32132 0.2012 300.2012 150.2012 15170.32142 0.20120 300.20120 150.20120 15170.32120 2020-01-01 2020-01-02 2020-01-01 00:01:07 2020-01-02 03:46:07 2020-01-01 00:01:07.000 2020-01-02 03:46:07.000 67 99967 50017 5051717 67 99967 50017 5051717 -32502 32433 4596.009900990099 464197 -128 127 -1.8514851485148516 -187 +670 100 10660 99571 2.01201 299.01201 150.51201 15051.2012 2.01201 299.01202 150.51201 15051.20117 2.01201 299.01201 150.51201 15051.20100 2020-01-01 2020-01-02 2020-01-01 00:11:10 2020-01-02 03:39:31 2020-01-01 00:11:10.000 2020-01-02 03:39:31.000 670 99571 50120.5 5012050 670 99571 50120.5 5012050 -32500 32638 4900.66 490066 -125 126 0.82 82 +671 100 10661 99572 2.01501 299.01501 150.51501 15051.5015 2.01501 299.015 150.51501 15051.50146 2.01501 299.01501 150.51501 15051.50100 2020-01-01 2020-01-02 2020-01-01 00:11:11 2020-01-02 03:39:32 2020-01-01 00:11:11.000 2020-01-02 03:39:32.000 671 99572 50121.5 5012150 671 99572 50121.5 5012150 -32499 32639 4901.66 490166 -124 127 1.82 182 +672 100 10662 99573 2.01801 299.01801 150.51801 15051.8018 2.01801 299.018 150.51801 15051.80176 2.01801 299.01801 150.51801 15051.80100 2020-01-01 2020-01-02 2020-01-01 00:11:12 2020-01-02 03:39:33 2020-01-01 00:11:12.000 2020-01-02 03:39:33.000 672 99573 50122.5 5012250 672 99573 50122.5 5012250 -32498 32640 4902.66 490266 -128 127 0.26 26 +673 100 10663 99574 2.02102 299.02102 150.52102 15052.1021 2.02102 299.02103 150.52102 15052.1024 2.02102 299.02102 150.52102 15052.10200 2020-01-01 2020-01-02 2020-01-01 00:11:13 2020-01-02 03:39:34 2020-01-01 00:11:13.000 2020-01-02 03:39:34.000 673 99574 50123.5 5012350 673 99574 50123.5 5012350 -32497 32641 4903.66 490366 -128 123 -1.3 -130 +674 100 10664 99575 2.02402 299.02402 150.52402 15052.4024 2.02402 299.02402 150.52402 15052.40204 2.02402 299.02402 150.52402 15052.40200 2020-01-01 2020-01-02 2020-01-01 00:11:14 2020-01-02 03:39:35 2020-01-01 00:11:14.000 2020-01-02 03:39:35.000 674 99575 50124.5 5012450 674 99575 50124.5 5012450 -32496 32642 4904.66 490466 -127 124 -0.3 -30 +675 100 10665 99576 2.02702 299.02702 150.52702 15052.7027 2.02702 299.02704 150.52702 15052.70264 2.02702 299.02702 150.52702 15052.70200 2020-01-01 2020-01-02 2020-01-01 00:11:15 2020-01-02 03:39:36 2020-01-01 00:11:15.000 2020-01-02 03:39:36.000 675 99576 50125.5 5012550 675 99576 50125.5 5012550 -32495 32643 4905.66 490566 -126 125 0.7 70 +676 100 10666 99577 2.03003 299.03003 150.53003 15053.003 2.03003 299.03003 150.53002 15053.00293 2.03003 299.03003 150.53003 15053.00300 2020-01-01 2020-01-02 2020-01-01 00:11:16 2020-01-02 03:39:37 2020-01-01 00:11:16.000 2020-01-02 03:39:37.000 676 99577 50126.5 5012650 676 99577 50126.5 5012650 -32494 32644 4906.66 490666 -125 126 1.7 170 +677 100 10667 99578 2.03303 299.03303 150.53303 15053.3033 2.03303 299.03302 150.53303 15053.30323 2.03303 299.03303 150.53303 15053.30300 2020-01-01 2020-01-02 2020-01-01 00:11:17 2020-01-02 03:39:38 2020-01-01 00:11:17.000 2020-01-02 03:39:38.000 677 99578 50127.5 5012750 677 99578 50127.5 5012750 -32493 32645 4907.66 490766 -124 127 2.7 270 +678 100 10668 99579 2.03603 299.03603 150.53603 15053.6036 2.03603 299.03604 150.53603 15053.60387 2.03603 299.03603 150.53603 15053.60300 2020-01-01 2020-01-02 2020-01-01 00:11:18 2020-01-02 03:39:39 2020-01-01 00:11:18.000 2020-01-02 03:39:39.000 678 99579 50128.5 5012850 678 99579 50128.5 5012850 -32492 32646 4908.66 490866 -128 127 1.14 114 +679 100 10669 99580 2.03903 299.03903 150.53903 15053.9039 2.03903 299.03903 150.53903 15053.90351 2.03903 299.03903 150.53903 15053.90300 2020-01-01 2020-01-02 2020-01-01 00:11:19 2020-01-02 03:39:40 2020-01-01 00:11:19.000 2020-01-02 03:39:40.000 679 99580 50129.5 5012950 679 99580 50129.5 5012950 -32491 32647 4909.66 490966 -128 123 -0.42 -42 +68 102 10058 99968 0.2042 300.2042 150.2042 15170.62462 0.2042 300.2042 150.2042 15170.62457 0.20420 300.20420 150.20420 15170.62420 2020-01-01 2020-01-02 2020-01-01 00:01:08 2020-01-02 03:46:08 2020-01-01 00:01:08.000 2020-01-02 03:46:08.000 68 99968 50018 5051818 68 99968 50018 5051818 -32501 32434 4597.009900990099 464298 -128 124 -3.386138613861386 -342 +680 100 10670 99581 2.04204 299.04204 150.54204 15054.2042 2.04204 299.04205 150.54204 15054.20426 2.04204 299.04204 150.54204 15054.20400 2020-01-01 2020-01-02 2020-01-01 00:11:20 2020-01-02 03:39:41 2020-01-01 00:11:20.000 2020-01-02 03:39:41.000 680 99581 50130.5 5013050 680 99581 50130.5 5013050 -32490 32648 4910.66 491066 -127 124 0.58 58 +681 100 10671 99582 2.04504 299.04504 150.54504 15054.5045 2.04504 299.04504 150.54504 15054.5044 2.04504 299.04504 150.54504 15054.50400 2020-01-01 2020-01-02 2020-01-01 00:11:21 2020-01-02 03:39:42 2020-01-01 00:11:21.000 2020-01-02 03:39:42.000 681 99582 50131.5 5013150 681 99582 50131.5 5013150 -32489 32649 4911.66 491166 -126 125 1.58 158 +682 100 10672 99583 2.04804 299.04804 150.54804 15054.8048 2.04804 299.04803 150.54804 15054.80474 2.04804 299.04804 150.54804 15054.80400 2020-01-01 2020-01-02 2020-01-01 00:11:22 2020-01-02 03:39:43 2020-01-01 00:11:22.000 2020-01-02 03:39:43.000 682 99583 50132.5 5013250 682 99583 50132.5 5013250 -32488 32650 4912.66 491266 -125 126 2.58 258 +683 100 10673 99584 2.05105 299.05105 150.55105 15055.1051 2.05105 299.05106 150.55105 15055.10533 2.05105 299.05105 150.55105 15055.10500 2020-01-01 2020-01-02 2020-01-01 00:11:23 2020-01-02 03:39:44 2020-01-01 00:11:23.000 2020-01-02 03:39:44.000 683 99584 50133.5 5013350 683 99584 50133.5 5013350 -32487 32651 4913.66 491366 -124 127 3.58 358 +684 100 10674 99585 2.05405 299.05405 150.55405 15055.4054 2.05405 299.05405 150.55404 15055.40498 2.05405 299.05405 150.55405 15055.40500 2020-01-01 2020-01-02 2020-01-01 00:11:24 2020-01-02 03:39:45 2020-01-01 00:11:24.000 2020-01-02 03:39:45.000 684 99585 50134.5 5013450 684 99585 50134.5 5013450 -32486 32652 4914.66 491466 -128 127 2.02 202 +685 100 10675 99586 2.05705 299.05705 150.55705 15055.7057 2.05705 299.05707 150.55705 15055.70573 2.05705 299.05705 150.55705 15055.70500 2020-01-01 2020-01-02 2020-01-01 00:11:25 2020-01-02 03:39:46 2020-01-01 00:11:25.000 2020-01-02 03:39:46.000 685 99586 50135.5 5013550 685 99586 50135.5 5013550 -32485 32653 4915.66 491566 -128 127 0.46 46 +686 100 10676 99587 2.06006 299.06006 150.56006 15056.006 2.06006 299.06006 150.56005 15056.00587 2.06006 299.06006 150.56006 15056.00600 2020-01-01 2020-01-02 2020-01-01 00:11:26 2020-01-02 03:39:47 2020-01-01 00:11:26.000 2020-01-02 03:39:47.000 686 99587 50136.5 5013650 686 99587 50136.5 5013650 -32484 32654 4916.66 491666 -128 124 -1.1 -110 +687 100 10677 99588 2.06306 299.06306 150.56306 15056.3063 2.06306 299.06305 150.56306 15056.30621 2.06306 299.06306 150.56306 15056.30600 2020-01-01 2020-01-02 2020-01-01 00:11:27 2020-01-02 03:39:48 2020-01-01 00:11:27.000 2020-01-02 03:39:48.000 687 99588 50137.5 5013750 687 99588 50137.5 5013750 -32483 32655 4917.66 491766 -127 125 -0.1 -10 +688 100 10678 99589 2.06606 299.06606 150.56606 15056.6066 2.06606 299.06607 150.56606 15056.60681 2.06606 299.06606 150.56606 15056.60600 2020-01-01 2020-01-02 2020-01-01 00:11:28 2020-01-02 03:39:49 2020-01-01 00:11:28.000 2020-01-02 03:39:49.000 688 99589 50138.5 5013850 688 99589 50138.5 5013850 -32482 32656 4918.66 491866 -126 126 0.9 90 +689 100 10679 99590 2.06906 299.06906 150.56906 15056.9069 2.06906 299.06906 150.56907 15056.9071 2.06906 299.06906 150.56906 15056.90600 2020-01-01 2020-01-02 2020-01-01 00:11:29 2020-01-02 03:39:50 2020-01-01 00:11:29.000 2020-01-02 03:39:50.000 689 99590 50139.5 5013950 689 99590 50139.5 5013950 -32481 32657 4919.66 491966 -125 127 1.9 190 +69 102 10059 99969 0.2072 300.2072 150.2072 15170.92792 0.2072 300.2072 150.20721 15170.92832 0.20720 300.20720 150.20720 15170.92720 2020-01-01 2020-01-02 2020-01-01 00:01:09 2020-01-02 03:46:09 2020-01-01 00:01:09.000 2020-01-02 03:46:09.000 69 99969 50019 5051919 69 99969 50019 5051919 -32500 32435 4598.009900990099 464399 -127 125 -2.386138613861386 -241 +690 100 10680 99591 2.07207 299.07207 150.57207 15057.2072 2.07207 299.07208 150.57207 15057.2072 2.07207 299.07207 150.57207 15057.20700 2020-01-01 2020-01-02 2020-01-01 00:11:30 2020-01-02 03:39:51 2020-01-01 00:11:30.000 2020-01-02 03:39:51.000 690 99591 50140.5 5014050 690 99591 50140.5 5014050 -32480 32658 4920.66 492066 -128 127 0.34 34 +691 100 10681 99592 2.07507 299.07507 150.57507 15057.5075 2.07507 299.07507 150.57507 15057.50734 2.07507 299.07507 150.57507 15057.50700 2020-01-01 2020-01-02 2020-01-01 00:11:31 2020-01-02 03:39:52 2020-01-01 00:11:31.000 2020-01-02 03:39:52.000 691 99592 50141.5 5014150 691 99592 50141.5 5014150 -32479 32659 4921.66 492166 -128 127 -1.22 -122 +692 100 10682 99593 2.07807 299.07807 150.57807 15057.8078 2.07807 299.07806 150.57807 15057.80767 2.07807 299.07807 150.57807 15057.80700 2020-01-01 2020-01-02 2020-01-01 00:11:32 2020-01-02 03:39:53 2020-01-01 00:11:32.000 2020-01-02 03:39:53.000 692 99593 50142.5 5014250 692 99593 50142.5 5014250 -32478 32660 4922.66 492266 -128 123 -2.78 -278 +693 100 10683 99594 2.08108 299.08108 150.58108 15058.1081 2.08108 299.0811 150.58108 15058.10827 2.08108 299.08108 150.58108 15058.10800 2020-01-01 2020-01-02 2020-01-01 00:11:33 2020-01-02 03:39:54 2020-01-01 00:11:33.000 2020-01-02 03:39:54.000 693 99594 50143.5 5014350 693 99594 50143.5 5014350 -32477 32661 4923.66 492366 -127 124 -1.78 -178 +694 100 10684 99595 2.08408 299.08408 150.58408 15058.4084 2.08408 299.08408 150.58408 15058.40857 2.08408 299.08408 150.58408 15058.40800 2020-01-01 2020-01-02 2020-01-01 00:11:34 2020-01-02 03:39:55 2020-01-01 00:11:34.000 2020-01-02 03:39:55.000 694 99595 50144.5 5014450 694 99595 50144.5 5014450 -32476 32662 4924.66 492466 -126 125 -0.78 -78 +695 100 10685 99596 2.08708 299.08708 150.58708 15058.7087 2.08708 299.0871 150.58708 15058.70867 2.08708 299.08708 150.58708 15058.70800 2020-01-01 2020-01-02 2020-01-01 00:11:35 2020-01-02 03:39:56 2020-01-01 00:11:35.000 2020-01-02 03:39:56.000 695 99596 50145.5 5014550 695 99596 50145.5 5014550 -32475 32663 4925.66 492566 -125 126 0.22 22 +696 100 10686 99597 2.09009 299.09009 150.59009 15059.009 2.09009 299.0901 150.59008 15059.00885 2.09009 299.09009 150.59009 15059.00900 2020-01-01 2020-01-02 2020-01-01 00:11:36 2020-01-02 03:39:57 2020-01-01 00:11:36.000 2020-01-02 03:39:57.000 696 99597 50146.5 5014650 696 99597 50146.5 5014650 -32474 32664 4926.66 492666 -124 127 1.22 122 +697 100 10687 99598 2.09309 299.09309 150.59309 15059.3093 2.09309 299.09308 150.59309 15059.30915 2.09309 299.09309 150.59309 15059.30900 2020-01-01 2020-01-02 2020-01-01 00:11:37 2020-01-02 03:39:58 2020-01-01 00:11:37.000 2020-01-02 03:39:58.000 697 99598 50147.5 5014750 697 99598 50147.5 5014750 -32473 32665 4927.66 492766 -128 127 -0.34 -34 +698 100 10688 99599 2.09609 299.09609 150.59609 15059.6096 2.09609 299.0961 150.59609 15059.6099 2.09609 299.09609 150.59609 15059.60900 2020-01-01 2020-01-02 2020-01-01 00:11:38 2020-01-02 03:39:59 2020-01-01 00:11:38.000 2020-01-02 03:39:59.000 698 99599 50148.5 5014850 698 99599 50148.5 5014850 -32472 32666 4928.66 492866 -128 123 -1.9 -190 +699 100 10689 99600 2.09909 299.09909 150.59909 15059.9099 2.09909 299.0991 150.5991 15059.91003 2.09909 299.09909 150.59909 15059.90900 2020-01-01 2020-01-02 2020-01-01 00:11:39 2020-01-02 03:40:00 2020-01-01 00:11:39.000 2020-01-02 03:40:00.000 699 99600 50149.5 5014950 699 99600 50149.5 5014950 -32471 32667 4929.66 492966 -127 124 -0.9 -90 +7 102 1006 9997 0.02102 300.02102 150.02102 15152.12312 0.02102 300.02103 150.02102 15152.12342 0.02102 300.02102 150.02102 15152.12302 2020-01-01 2020-01-02 2020-01-01 00:00:07 2020-01-02 03:45:07 2020-01-01 00:00:07.000 2020-01-02 03:45:07.000 7 99907 49957 5045657 7 99907 49957 5045657 -32562 32373 4536.009900990099 458137 -126 125 -1.0198019801980198 -103 +70 102 10060 99970 0.21021 300.21021 150.21021 15171.23123 0.21021 300.2102 150.2102 15171.23097 0.21021 300.21021 150.21021 15171.23121 2020-01-01 2020-01-02 2020-01-01 00:01:10 2020-01-02 03:46:10 2020-01-01 00:01:10.000 2020-01-02 03:46:10.000 70 99970 50020 5052020 70 99970 50020 5052020 -32499 32436 4599.009900990099 464500 -126 126 -1.386138613861386 -140 +700 100 10690 99601 2.1021 299.1021 150.6021 15060.21021 2.1021 299.1021 150.6021 15060.21014 2.10210 299.10210 150.60210 15060.21000 2020-01-01 2020-01-02 2020-01-01 00:11:40 2020-01-02 03:40:01 2020-01-01 00:11:40.000 2020-01-02 03:40:01.000 700 99601 50150.5 5015050 700 99601 50150.5 5015050 -32470 32668 4930.66 493066 -126 125 0.1 10 +701 100 10691 99602 2.1051 299.1051 150.6051 15060.51051 2.1051 299.1051 150.6051 15060.51031 2.10510 299.10510 150.60510 15060.51000 2020-01-01 2020-01-02 2020-01-01 00:11:41 2020-01-02 03:40:02 2020-01-01 00:11:41.000 2020-01-02 03:40:02.000 701 99602 50151.5 5015150 701 99602 50151.5 5015150 -32469 32669 4931.66 493166 -125 126 1.1 110 +702 100 10692 99603 2.1081 299.1081 150.6081 15060.81081 2.1081 299.1081 150.6081 15060.81062 2.10810 299.10810 150.60810 15060.81000 2020-01-01 2020-01-02 2020-01-01 00:11:42 2020-01-02 03:40:03 2020-01-01 00:11:42.000 2020-01-02 03:40:03.000 702 99603 50152.5 5015250 702 99603 50152.5 5015250 -32468 32670 4932.66 493266 -124 127 2.1 210 +703 100 10693 99604 2.11111 299.11111 150.61111 15061.11111 2.11111 299.1111 150.61111 15061.11137 2.11111 299.11111 150.61111 15061.11100 2020-01-01 2020-01-02 2020-01-01 00:11:43 2020-01-02 03:40:04 2020-01-01 00:11:43.000 2020-01-02 03:40:04.000 703 99604 50153.5 5015350 703 99604 50153.5 5015350 -32467 32671 4933.66 493366 -128 127 0.54 54 +704 100 10694 99605 2.11411 299.11411 150.61411 15061.41141 2.11411 299.1141 150.61411 15061.41151 2.11411 299.11411 150.61411 15061.41100 2020-01-01 2020-01-02 2020-01-01 00:11:44 2020-01-02 03:40:05 2020-01-01 00:11:44.000 2020-01-02 03:40:05.000 704 99605 50154.5 5015450 704 99605 50154.5 5015450 -32466 32672 4934.66 493466 -128 123 -1.02 -102 +705 100 10695 99606 2.11711 299.11711 150.61711 15061.71171 2.11711 299.11713 150.61711 15061.71165 2.11711 299.11711 150.61711 15061.71100 2020-01-01 2020-01-02 2020-01-01 00:11:45 2020-01-02 03:40:06 2020-01-01 00:11:45.000 2020-01-02 03:40:06.000 705 99606 50155.5 5015550 705 99606 50155.5 5015550 -32465 32673 4935.66 493566 -127 124 -0.02 -2 +706 100 10696 99607 2.12012 299.12012 150.62012 15062.01201 2.12012 299.12012 150.62011 15062.01179 2.12012 299.12012 150.62012 15062.01200 2020-01-01 2020-01-02 2020-01-01 00:11:46 2020-01-02 03:40:07 2020-01-01 00:11:46.000 2020-01-02 03:40:07.000 706 99607 50156.5 5015650 706 99607 50156.5 5015650 -32464 32674 4936.66 493666 -126 125 0.98 98 +707 100 10697 99608 2.12312 299.12312 150.62312 15062.31231 2.12312 299.1231 150.62312 15062.31208 2.12312 299.12312 150.62312 15062.31200 2020-01-01 2020-01-02 2020-01-01 00:11:47 2020-01-02 03:40:08 2020-01-01 00:11:47.000 2020-01-02 03:40:08.000 707 99608 50157.5 5015750 707 99608 50157.5 5015750 -32463 32675 4937.66 493766 -125 126 1.98 198 +708 100 10698 99609 2.12612 299.12612 150.62612 15062.61261 2.12612 299.12613 150.62612 15062.61283 2.12612 299.12612 150.62612 15062.61200 2020-01-01 2020-01-02 2020-01-01 00:11:48 2020-01-02 03:40:09 2020-01-01 00:11:48.000 2020-01-02 03:40:09.000 708 99609 50158.5 5015850 708 99609 50158.5 5015850 -32462 32676 4938.66 493866 -124 127 2.98 298 +709 100 10699 99610 2.12912 299.12912 150.62912 15062.91291 2.12912 299.12912 150.62912 15062.91298 2.12912 299.12912 150.62912 15062.91200 2020-01-01 2020-01-02 2020-01-01 00:11:49 2020-01-02 03:40:10 2020-01-01 00:11:49.000 2020-01-02 03:40:10.000 709 99610 50159.5 5015950 709 99610 50159.5 5015950 -32461 32677 4939.66 493966 -128 127 1.42 142 +71 102 10061 99971 0.21321 300.21321 150.21321 15171.53453 0.21321 300.21323 150.21321 15171.5346 0.21321 300.21321 150.21321 15171.53421 2020-01-01 2020-01-02 2020-01-01 00:01:11 2020-01-02 03:46:11 2020-01-01 00:01:11.000 2020-01-02 03:46:11.000 71 99971 50021 5052121 71 99971 50021 5052121 -32498 32437 4600.009900990099 464601 -125 127 -0.38613861386138615 -39 +710 100 10700 99611 2.13213 299.13213 150.63213 15063.21321 2.13213 299.13214 150.63213 15063.21311 2.13213 299.13213 150.63213 15063.21300 2020-01-01 2020-01-02 2020-01-01 00:11:50 2020-01-02 03:40:11 2020-01-01 00:11:50.000 2020-01-02 03:40:11.000 710 99611 50160.5 5016050 710 99611 50160.5 5016050 -32460 32678 4940.66 494066 -128 127 -0.14 -14 +711 100 10701 99612 2.13513 299.13513 150.63513 15063.51351 2.13513 299.13513 150.63513 15063.51325 2.13513 299.13513 150.63513 15063.51300 2020-01-01 2020-01-02 2020-01-01 00:11:51 2020-01-02 03:40:12 2020-01-01 00:11:51.000 2020-01-02 03:40:12.000 711 99612 50161.5 5016150 711 99612 50161.5 5016150 -32459 32679 4941.66 494166 -128 124 -1.7 -170 +712 100 10702 99613 2.13813 299.13813 150.63813 15063.81381 2.13813 299.13815 150.63814 15063.81401 2.13813 299.13813 150.63813 15063.81300 2020-01-01 2020-01-02 2020-01-01 00:11:52 2020-01-02 03:40:13 2020-01-01 00:11:52.000 2020-01-02 03:40:13.000 712 99613 50162.5 5016250 712 99613 50162.5 5016250 -32458 32680 4942.66 494266 -127 125 -0.7 -70 +713 100 10703 99614 2.14114 299.14114 150.64114 15064.11411 2.14114 299.14114 150.64114 15064.11431 2.14114 299.14114 150.64114 15064.11400 2020-01-01 2020-01-02 2020-01-01 00:11:53 2020-01-02 03:40:14 2020-01-01 00:11:53.000 2020-01-02 03:40:14.000 713 99614 50163.5 5016350 713 99614 50163.5 5016350 -32457 32681 4943.66 494366 -126 126 0.3 30 +714 100 10704 99615 2.14414 299.14414 150.64414 15064.41441 2.14414 299.14413 150.64414 15064.41448 2.14414 299.14414 150.64414 15064.41400 2020-01-01 2020-01-02 2020-01-01 00:11:54 2020-01-02 03:40:15 2020-01-01 00:11:54.000 2020-01-02 03:40:15.000 714 99615 50164.5 5016450 714 99615 50164.5 5016450 -32456 32682 4944.66 494466 -125 127 1.3 130 +715 100 10705 99616 2.14714 299.14714 150.64714 15064.71471 2.14714 299.14716 150.64714 15064.71458 2.14714 299.14714 150.64714 15064.71400 2020-01-01 2020-01-02 2020-01-01 00:11:55 2020-01-02 03:40:16 2020-01-01 00:11:55.000 2020-01-02 03:40:16.000 715 99616 50165.5 5016550 715 99616 50165.5 5016550 -32455 32683 4945.66 494566 -128 127 -0.26 -26 +716 100 10706 99617 2.15015 299.15015 150.65015 15065.01501 2.15015 299.15015 150.65014 15065.01472 2.15015 299.15015 150.65015 15065.01500 2020-01-01 2020-01-02 2020-01-01 00:11:56 2020-01-02 03:40:17 2020-01-01 00:11:56.000 2020-01-02 03:40:17.000 716 99617 50166.5 5016650 716 99617 50166.5 5016650 -32454 32684 4946.66 494666 -128 127 -1.82 -182 +717 100 10707 99618 2.15315 299.15315 150.65315 15065.31531 2.15315 299.15317 150.65315 15065.31547 2.15315 299.15315 150.65315 15065.31500 2020-01-01 2020-01-02 2020-01-01 00:11:57 2020-01-02 03:40:18 2020-01-01 00:11:57.000 2020-01-02 03:40:18.000 717 99618 50167.5 5016750 717 99618 50167.5 5016750 -32453 32685 4947.66 494766 -128 123 -3.38 -338 +718 100 10708 99619 2.15615 299.15615 150.65615 15065.61561 2.15615 299.15616 150.65615 15065.61578 2.15615 299.15615 150.65615 15065.61500 2020-01-01 2020-01-02 2020-01-01 00:11:58 2020-01-02 03:40:19 2020-01-01 00:11:58.000 2020-01-02 03:40:19.000 718 99619 50168.5 5016850 718 99619 50168.5 5016850 -32452 32686 4948.66 494866 -127 124 -2.38 -238 +719 100 10709 99620 2.15915 299.15915 150.65915 15065.91591 2.15915 299.15915 150.65915 15065.91595 2.15915 299.15915 150.65915 15065.91500 2020-01-01 2020-01-02 2020-01-01 00:11:59 2020-01-02 03:40:20 2020-01-01 00:11:59.000 2020-01-02 03:40:20.000 719 99620 50169.5 5016950 719 99620 50169.5 5016950 -32451 32687 4949.66 494966 -126 125 -1.38 -138 +72 102 10062 99972 0.21621 300.21621 150.21621 15171.83783 0.21621 300.21622 150.21621 15171.83791 0.21621 300.21621 150.21621 15171.83721 2020-01-01 2020-01-02 2020-01-01 00:01:12 2020-01-02 03:46:12 2020-01-01 00:01:12.000 2020-01-02 03:46:12.000 72 99972 50022 5052222 72 99972 50022 5052222 -32497 32438 4601.009900990099 464702 -128 127 -1.9207920792079207 -194 +720 100 10710 99621 2.16216 299.16216 150.66216 15066.21621 2.16216 299.16217 150.66216 15066.21606 2.16216 299.16216 150.66216 15066.21600 2020-01-01 2020-01-02 2020-01-01 00:12:00 2020-01-02 03:40:21 2020-01-01 00:12:00.000 2020-01-02 03:40:21.000 720 99621 50170.5 5017050 720 99621 50170.5 5017050 -32450 32688 4950.66 495066 -125 126 -0.38 -38 +721 100 10711 99622 2.16516 299.16516 150.66516 15066.51651 2.16516 299.16516 150.66516 15066.51635 2.16516 299.16516 150.66516 15066.51600 2020-01-01 2020-01-02 2020-01-01 00:12:01 2020-01-02 03:40:22 2020-01-01 00:12:01.000 2020-01-02 03:40:22.000 721 99622 50171.5 5017150 721 99622 50171.5 5017150 -32449 32689 4951.66 495166 -124 127 0.62 62 +722 100 10712 99623 2.16816 299.16816 150.66816 15066.81681 2.16816 299.16818 150.66816 15066.81695 2.16816 299.16816 150.66816 15066.81600 2020-01-01 2020-01-02 2020-01-01 00:12:02 2020-01-02 03:40:23 2020-01-01 00:12:02.000 2020-01-02 03:40:23.000 722 99623 50172.5 5017250 722 99623 50172.5 5017250 -32448 32690 4952.66 495266 -128 127 -0.94 -94 +723 100 10713 99624 2.17117 299.17117 150.67117 15067.11711 2.17117 299.17117 150.67117 15067.11724 2.17117 299.17117 150.67117 15067.11700 2020-01-01 2020-01-02 2020-01-01 00:12:03 2020-01-02 03:40:24 2020-01-01 00:12:03.000 2020-01-02 03:40:24.000 723 99624 50173.5 5017350 723 99624 50173.5 5017350 -32447 32691 4953.66 495366 -128 123 -2.5 -250 +724 100 10714 99625 2.17417 299.17417 150.67417 15067.41741 2.17417 299.17416 150.67417 15067.41742 2.17417 299.17417 150.67417 15067.41700 2020-01-01 2020-01-02 2020-01-01 00:12:04 2020-01-02 03:40:25 2020-01-01 00:12:04.000 2020-01-02 03:40:25.000 724 99625 50174.5 5017450 724 99625 50174.5 5017450 -32446 32692 4954.66 495466 -127 124 -1.5 -150 +725 100 10715 99626 2.17717 299.17717 150.67717 15067.71771 2.17717 299.1772 150.67717 15067.71752 2.17717 299.17717 150.67717 15067.71700 2020-01-01 2020-01-02 2020-01-01 00:12:05 2020-01-02 03:40:26 2020-01-01 00:12:05.000 2020-01-02 03:40:26.000 725 99626 50175.5 5017550 725 99626 50175.5 5017550 -32445 32693 4955.66 495566 -126 125 -0.5 -50 +726 100 10716 99627 2.18018 299.18018 150.68018 15068.01801 2.18018 299.18018 150.68017 15068.01782 2.18018 299.18018 150.68018 15068.01800 2020-01-01 2020-01-02 2020-01-01 00:12:06 2020-01-02 03:40:27 2020-01-01 00:12:06.000 2020-01-02 03:40:27.000 726 99627 50176.5 5017650 726 99627 50176.5 5017650 -32444 32694 4956.66 495666 -125 126 0.5 50 +727 100 10717 99628 2.18318 299.18318 150.68318 15068.31831 2.18318 299.1832 150.68318 15068.31842 2.18318 299.18318 150.68318 15068.31800 2020-01-01 2020-01-02 2020-01-01 00:12:07 2020-01-02 03:40:28 2020-01-01 00:12:07.000 2020-01-02 03:40:28.000 727 99628 50177.5 5017750 727 99628 50177.5 5017750 -32443 32695 4957.66 495766 -124 127 1.5 150 +728 100 10718 99629 2.18618 299.18618 150.68618 15068.61861 2.18618 299.1862 150.68618 15068.61875 2.18618 299.18618 150.68618 15068.61800 2020-01-01 2020-01-02 2020-01-01 00:12:08 2020-01-02 03:40:29 2020-01-01 00:12:08.000 2020-01-02 03:40:29.000 728 99629 50178.5 5017850 728 99629 50178.5 5017850 -32442 32696 4958.66 495866 -128 127 -0.06 -6 +729 100 10719 99630 2.18918 299.18918 150.68918 15068.91891 2.18918 299.18918 150.68918 15068.91889 2.18918 299.18918 150.68918 15068.91800 2020-01-01 2020-01-02 2020-01-01 00:12:09 2020-01-02 03:40:30 2020-01-01 00:12:09.000 2020-01-02 03:40:30.000 729 99630 50179.5 5017950 729 99630 50179.5 5017950 -32441 32697 4959.66 495966 -128 123 -1.62 -162 +73 102 10063 99973 0.21921 300.21921 150.21921 15172.14114 0.21921 300.2192 150.21921 15172.14121 0.21921 300.21921 150.21921 15172.14021 2020-01-01 2020-01-02 2020-01-01 00:01:13 2020-01-02 03:46:13 2020-01-01 00:01:13.000 2020-01-02 03:46:13.000 73 99973 50023 5052323 73 99973 50023 5052323 -32496 32439 4602.009900990099 464803 -128 127 -3.4554455445544554 -349 +730 100 10720 99631 2.19219 299.19219 150.69219 15069.21921 2.19219 299.1922 150.69219 15069.21965 2.19219 299.19219 150.69219 15069.21900 2020-01-01 2020-01-02 2020-01-01 00:12:10 2020-01-02 03:40:31 2020-01-01 00:12:10.000 2020-01-02 03:40:31.000 730 99631 50180.5 5018050 730 99631 50180.5 5018050 -32440 32698 4960.66 496066 -127 124 -0.62 -62 +731 100 10721 99632 2.19519 299.19519 150.69519 15069.51951 2.19519 299.1952 150.69519 15069.51928 2.19519 299.19519 150.69519 15069.51900 2020-01-01 2020-01-02 2020-01-01 00:12:11 2020-01-02 03:40:32 2020-01-01 00:12:11.000 2020-01-02 03:40:32.000 731 99632 50181.5 5018150 731 99632 50181.5 5018150 -32439 32699 4961.66 496166 -126 125 0.38 38 +732 100 10722 99633 2.19819 299.19819 150.69819 15069.81981 2.19819 299.1982 150.69819 15069.81988 2.19819 299.19819 150.69819 15069.81900 2020-01-01 2020-01-02 2020-01-01 00:12:12 2020-01-02 03:40:33 2020-01-01 00:12:12.000 2020-01-02 03:40:33.000 732 99633 50182.5 5018250 732 99633 50182.5 5018250 -32438 32700 4962.66 496266 -125 126 1.38 138 +733 100 10723 99634 2.2012 299.2012 150.7012 15070.12012 2.2012 299.2012 150.7012 15070.12022 2.20120 299.20120 150.70120 15070.12000 2020-01-01 2020-01-02 2020-01-01 00:12:13 2020-01-02 03:40:34 2020-01-01 00:12:13.000 2020-01-02 03:40:34.000 733 99634 50183.5 5018350 733 99634 50183.5 5018350 -32437 32701 4963.66 496366 -124 127 2.38 238 +734 100 10724 99635 2.2042 299.2042 150.7042 15070.42042 2.2042 299.2042 150.7042 15070.42036 2.20420 299.20420 150.70420 15070.42000 2020-01-01 2020-01-02 2020-01-01 00:12:14 2020-01-02 03:40:35 2020-01-01 00:12:14.000 2020-01-02 03:40:35.000 734 99635 50184.5 5018450 734 99635 50184.5 5018450 -32436 32702 4964.66 496466 -128 127 0.82 82 +735 100 10725 99636 2.2072 299.2072 150.7072 15070.72072 2.2072 299.2072 150.70721 15070.72111 2.20720 299.20720 150.70720 15070.72000 2020-01-01 2020-01-02 2020-01-01 00:12:15 2020-01-02 03:40:36 2020-01-01 00:12:15.000 2020-01-02 03:40:36.000 735 99636 50185.5 5018550 735 99636 50185.5 5018550 -32435 32703 4965.66 496566 -128 127 -0.74 -74 +736 100 10726 99637 2.21021 299.21021 150.71021 15071.02102 2.21021 299.2102 150.7102 15071.02076 2.21021 299.21021 150.71021 15071.02100 2020-01-01 2020-01-02 2020-01-01 00:12:16 2020-01-02 03:40:37 2020-01-01 00:12:16.000 2020-01-02 03:40:37.000 736 99637 50186.5 5018650 736 99637 50186.5 5018650 -32434 32704 4966.66 496666 -128 124 -2.3 -230 +737 100 10727 99638 2.21321 299.21321 150.71321 15071.32132 2.21321 299.21323 150.71321 15071.32139 2.21321 299.21321 150.71321 15071.32100 2020-01-01 2020-01-02 2020-01-01 00:12:17 2020-01-02 03:40:38 2020-01-01 00:12:17.000 2020-01-02 03:40:38.000 737 99638 50187.5 5018750 737 99638 50187.5 5018750 -32433 32705 4967.66 496766 -127 125 -1.3 -130 +738 100 10728 99639 2.21621 299.21621 150.71621 15071.62162 2.21621 299.21622 150.71621 15071.62169 2.21621 299.21621 150.71621 15071.62100 2020-01-01 2020-01-02 2020-01-01 00:12:18 2020-01-02 03:40:39 2020-01-01 00:12:18.000 2020-01-02 03:40:39.000 738 99639 50188.5 5018850 738 99639 50188.5 5018850 -32432 32706 4968.66 496866 -126 126 -0.3 -30 +739 100 10729 99640 2.21921 299.21921 150.71921 15071.92192 2.21921 299.2192 150.71921 15071.92199 2.21921 299.21921 150.71921 15071.92100 2020-01-01 2020-01-02 2020-01-01 00:12:19 2020-01-02 03:40:40 2020-01-01 00:12:19.000 2020-01-02 03:40:40.000 739 99640 50189.5 5018950 739 99640 50189.5 5018950 -32431 32707 4969.66 496966 -125 127 0.7 70 +74 102 10064 99974 0.22222 300.22222 150.22222 15172.44444 0.22222 300.22223 150.22222 15172.4448 0.22222 300.22222 150.22222 15172.44422 2020-01-01 2020-01-02 2020-01-01 00:01:14 2020-01-02 03:46:14 2020-01-01 00:01:14.000 2020-01-02 03:46:14.000 74 99974 50024 5052424 74 99974 50024 5052424 -32495 32440 4603.009900990099 464904 -128 123 -4.99009900990099 -504 +740 100 10730 99641 2.22222 299.22222 150.72222 15072.22222 2.22222 299.22223 150.72222 15072.22258 2.22222 299.22222 150.72222 15072.22200 2020-01-01 2020-01-02 2020-01-01 00:12:20 2020-01-02 03:40:41 2020-01-01 00:12:20.000 2020-01-02 03:40:41.000 740 99641 50190.5 5019050 740 99641 50190.5 5019050 -32430 32708 4970.66 497066 -128 127 -0.86 -86 +741 100 10731 99642 2.22522 299.22522 150.72522 15072.52252 2.22522 299.22522 150.72522 15072.52223 2.22522 299.22522 150.72522 15072.52200 2020-01-01 2020-01-02 2020-01-01 00:12:21 2020-01-02 03:40:42 2020-01-01 00:12:21.000 2020-01-02 03:40:42.000 741 99642 50191.5 5019150 741 99642 50191.5 5019150 -32429 32709 4971.66 497166 -128 127 -2.42 -242 +742 100 10732 99643 2.22822 299.22822 150.72822 15072.82282 2.22822 299.22824 150.72822 15072.82286 2.22822 299.22822 150.72822 15072.82200 2020-01-01 2020-01-02 2020-01-01 00:12:22 2020-01-02 03:40:43 2020-01-01 00:12:22.000 2020-01-02 03:40:43.000 742 99643 50192.5 5019250 742 99643 50192.5 5019250 -32428 32710 4972.66 497266 -128 123 -3.98 -398 +743 100 10733 99644 2.23123 299.23123 150.73123 15073.12312 2.23123 299.23123 150.73123 15073.12316 2.23123 299.23123 150.73123 15073.12300 2020-01-01 2020-01-02 2020-01-01 00:12:23 2020-01-02 03:40:44 2020-01-01 00:12:23.000 2020-01-02 03:40:44.000 743 99644 50193.5 5019350 743 99644 50193.5 5019350 -32427 32711 4973.66 497366 -127 124 -2.98 -298 +744 100 10734 99645 2.23423 299.23423 150.73423 15073.42342 2.23423 299.23422 150.73423 15073.42345 2.23423 299.23423 150.73423 15073.42300 2020-01-01 2020-01-02 2020-01-01 00:12:24 2020-01-02 03:40:45 2020-01-01 00:12:24.000 2020-01-02 03:40:45.000 744 99645 50194.5 5019450 744 99645 50194.5 5019450 -32426 32712 4974.66 497466 -126 125 -1.98 -198 +745 100 10735 99646 2.23723 299.23723 150.73723 15073.72372 2.23723 299.23724 150.73724 15073.72405 2.23723 299.23723 150.73723 15073.72300 2020-01-01 2020-01-02 2020-01-01 00:12:25 2020-01-02 03:40:46 2020-01-01 00:12:25.000 2020-01-02 03:40:46.000 745 99646 50195.5 5019550 745 99646 50195.5 5019550 -32425 32713 4975.66 497566 -125 126 -0.98 -98 +746 100 10736 99647 2.24024 299.24024 150.74024 15074.02402 2.24024 299.24023 150.74023 15074.02373 2.24024 299.24024 150.74024 15074.02400 2020-01-01 2020-01-02 2020-01-01 00:12:26 2020-01-02 03:40:47 2020-01-01 00:12:26.000 2020-01-02 03:40:47.000 746 99647 50196.5 5019650 746 99647 50196.5 5019650 -32424 32714 4976.66 497666 -124 127 0.02 2 +747 100 10737 99648 2.24324 299.24324 150.74324 15074.32432 2.24324 299.24326 150.74324 15074.32433 2.24324 299.24324 150.74324 15074.32400 2020-01-01 2020-01-02 2020-01-01 00:12:27 2020-01-02 03:40:48 2020-01-01 00:12:27.000 2020-01-02 03:40:48.000 747 99648 50197.5 5019750 747 99648 50197.5 5019750 -32423 32715 4977.66 497766 -128 127 -1.54 -154 +748 100 10738 99649 2.24624 299.24624 150.74624 15074.62462 2.24624 299.24625 150.74624 15074.62463 2.24624 299.24624 150.74624 15074.62400 2020-01-01 2020-01-02 2020-01-01 00:12:28 2020-01-02 03:40:49 2020-01-01 00:12:28.000 2020-01-02 03:40:49.000 748 99649 50198.5 5019850 748 99649 50198.5 5019850 -32422 32716 4978.66 497866 -128 123 -3.1 -310 +749 100 10739 99650 2.24924 299.24924 150.74924 15074.92492 2.24924 299.24924 150.74924 15074.92492 2.24924 299.24924 150.74924 15074.92400 2020-01-01 2020-01-02 2020-01-01 00:12:29 2020-01-02 03:40:50 2020-01-01 00:12:29.000 2020-01-02 03:40:50.000 749 99650 50199.5 5019950 749 99650 50199.5 5019950 -32421 32717 4979.66 497966 -127 124 -2.1 -210 +75 102 10065 99975 0.22522 300.22522 150.22522 15172.74774 0.22522 300.22522 150.22522 15172.74745 0.22522 300.22522 150.22522 15172.74722 2020-01-01 2020-01-02 2020-01-01 00:01:15 2020-01-02 03:46:15 2020-01-01 00:01:15.000 2020-01-02 03:46:15.000 75 99975 50025 5052525 75 99975 50025 5052525 -32494 32441 4604.009900990099 465005 -127 124 -3.99009900990099 -403 +750 100 10740 99651 2.25225 299.25225 150.75225 15075.22522 2.25225 299.25226 150.75225 15075.22552 2.25225 299.25225 150.75225 15075.22500 2020-01-01 2020-01-02 2020-01-01 00:12:30 2020-01-02 03:40:51 2020-01-01 00:12:30.000 2020-01-02 03:40:51.000 750 99651 50200.5 5020050 750 99651 50200.5 5020050 -32420 32718 4980.66 498066 -126 125 -1.1 -110 +751 100 10741 99652 2.25525 299.25525 150.75525 15075.52552 2.25525 299.25525 150.75525 15075.5252 2.25525 299.25525 150.75525 15075.52500 2020-01-01 2020-01-02 2020-01-01 00:12:31 2020-01-02 03:40:52 2020-01-01 00:12:31.000 2020-01-02 03:40:52.000 751 99652 50201.5 5020150 751 99652 50201.5 5020150 -32419 32719 4981.66 498166 -125 126 -0.1 -10 +752 100 10742 99653 2.25825 299.25825 150.75825 15075.82582 2.25825 299.25827 150.75825 15075.8258 2.25825 299.25825 150.75825 15075.82500 2020-01-01 2020-01-02 2020-01-01 00:12:32 2020-01-02 03:40:53 2020-01-01 00:12:32.000 2020-01-02 03:40:53.000 752 99653 50202.5 5020250 752 99653 50202.5 5020250 -32418 32720 4982.66 498266 -124 127 0.9 90 +753 100 10743 99654 2.26126 299.26126 150.76126 15076.12612 2.26126 299.26126 150.76126 15076.12609 2.26126 299.26126 150.76126 15076.12600 2020-01-01 2020-01-02 2020-01-01 00:12:33 2020-01-02 03:40:54 2020-01-01 00:12:33.000 2020-01-02 03:40:54.000 753 99654 50203.5 5020350 753 99654 50203.5 5020350 -32417 32721 4983.66 498366 -128 127 -0.66 -66 +754 100 10744 99655 2.26426 299.26426 150.76426 15076.42642 2.26426 299.26425 150.76426 15076.4264 2.26426 299.26426 150.76426 15076.42600 2020-01-01 2020-01-02 2020-01-01 00:12:34 2020-01-02 03:40:55 2020-01-01 00:12:34.000 2020-01-02 03:40:55.000 754 99655 50204.5 5020450 754 99655 50204.5 5020450 -32416 32722 4984.66 498466 -128 123 -2.22 -222 +755 100 10745 99656 2.26726 299.26726 150.76726 15076.72672 2.26726 299.26727 150.76727 15076.72703 2.26726 299.26726 150.76726 15076.72600 2020-01-01 2020-01-02 2020-01-01 00:12:35 2020-01-02 03:40:56 2020-01-01 00:12:35.000 2020-01-02 03:40:56.000 755 99656 50205.5 5020550 755 99656 50205.5 5020550 -32415 32723 4985.66 498566 -127 124 -1.22 -122 +756 100 10746 99657 2.27027 299.27027 150.77027 15077.02702 2.27027 299.27026 150.77026 15077.02667 2.27027 299.27027 150.77027 15077.02700 2020-01-01 2020-01-02 2020-01-01 00:12:36 2020-01-02 03:40:57 2020-01-01 00:12:36.000 2020-01-02 03:40:57.000 756 99657 50206.5 5020650 756 99657 50206.5 5020650 -32414 32724 4986.66 498666 -126 125 -0.22 -22 +757 100 10747 99658 2.27327 299.27327 150.77327 15077.32732 2.27327 299.2733 150.77327 15077.32727 2.27327 299.27327 150.77327 15077.32700 2020-01-01 2020-01-02 2020-01-01 00:12:37 2020-01-02 03:40:58 2020-01-01 00:12:37.000 2020-01-02 03:40:58.000 757 99658 50207.5 5020750 757 99658 50207.5 5020750 -32413 32725 4987.66 498766 -125 126 0.78 78 +758 100 10748 99659 2.27627 299.27627 150.77627 15077.62762 2.27627 299.27628 150.77627 15077.62756 2.27627 299.27627 150.77627 15077.62700 2020-01-01 2020-01-02 2020-01-01 00:12:38 2020-01-02 03:40:59 2020-01-01 00:12:38.000 2020-01-02 03:40:59.000 758 99659 50208.5 5020850 758 99659 50208.5 5020850 -32412 32726 4988.66 498866 -124 127 1.78 178 +759 100 10749 99660 2.27927 299.27927 150.77927 15077.92792 2.27927 299.27927 150.77927 15077.92787 2.27927 299.27927 150.77927 15077.92700 2020-01-01 2020-01-02 2020-01-01 00:12:39 2020-01-02 03:41:00 2020-01-01 00:12:39.000 2020-01-02 03:41:00.000 759 99660 50209.5 5020950 759 99660 50209.5 5020950 -32411 32727 4989.66 498966 -128 127 0.22 22 +76 102 10066 99976 0.22822 300.22822 150.22822 15173.05105 0.22822 300.22824 150.22822 15173.05109 0.22822 300.22822 150.22822 15173.05022 2020-01-01 2020-01-02 2020-01-01 00:01:16 2020-01-02 03:46:16 2020-01-01 00:01:16.000 2020-01-02 03:46:16.000 76 99976 50026 5052626 76 99976 50026 5052626 -32493 32442 4605.009900990099 465106 -126 125 -2.99009900990099 -302 +760 100 10750 99661 2.28228 299.28228 150.78228 15078.22822 2.28228 299.2823 150.78228 15078.2285 2.28228 299.28228 150.78228 15078.22800 2020-01-01 2020-01-02 2020-01-01 00:12:40 2020-01-02 03:41:01 2020-01-01 00:12:40.000 2020-01-02 03:41:01.000 760 99661 50210.5 5021050 760 99661 50210.5 5021050 -32410 32728 4990.66 499066 -128 127 -1.34 -134 +761 100 10751 99662 2.28528 299.28528 150.78528 15078.52852 2.28528 299.28528 150.78528 15078.52814 2.28528 299.28528 150.78528 15078.52800 2020-01-01 2020-01-02 2020-01-01 00:12:41 2020-01-02 03:41:02 2020-01-01 00:12:41.000 2020-01-02 03:41:02.000 761 99662 50211.5 5021150 761 99662 50211.5 5021150 -32409 32729 4991.66 499166 -128 124 -2.9 -290 +762 100 10752 99663 2.28828 299.28828 150.78828 15078.82882 2.28828 299.2883 150.78828 15078.82889 2.28828 299.28828 150.78828 15078.82800 2020-01-01 2020-01-02 2020-01-01 00:12:42 2020-01-02 03:41:03 2020-01-01 00:12:42.000 2020-01-02 03:41:03.000 762 99663 50212.5 5021250 762 99663 50212.5 5021250 -32408 32730 4992.66 499266 -127 125 -1.9 -190 +763 100 10753 99664 2.29129 299.29129 150.79129 15079.12912 2.29129 299.2913 150.79129 15079.12904 2.29129 299.29129 150.79129 15079.12900 2020-01-01 2020-01-02 2020-01-01 00:12:43 2020-01-02 03:41:04 2020-01-01 00:12:43.000 2020-01-02 03:41:04.000 763 99664 50213.5 5021350 763 99664 50213.5 5021350 -32407 32731 4993.66 499366 -126 126 -0.9 -90 +764 100 10754 99665 2.29429 299.29429 150.79429 15079.42942 2.29429 299.29428 150.79429 15079.42933 2.29429 299.29429 150.79429 15079.42900 2020-01-01 2020-01-02 2020-01-01 00:12:44 2020-01-02 03:41:05 2020-01-01 00:12:44.000 2020-01-02 03:41:05.000 764 99665 50214.5 5021450 764 99665 50214.5 5021450 -32406 32732 4994.66 499466 -125 127 0.1 10 +765 100 10755 99666 2.29729 299.29729 150.79729 15079.72972 2.29729 299.2973 150.79729 15079.72996 2.29729 299.29729 150.79729 15079.72900 2020-01-01 2020-01-02 2020-01-01 00:12:45 2020-01-02 03:41:06 2020-01-01 00:12:45.000 2020-01-02 03:41:06.000 765 99666 50215.5 5021550 765 99666 50215.5 5021550 -32405 32733 4995.66 499566 -128 127 -1.46 -146 +766 100 10756 99667 2.3003 299.3003 150.8003 15080.03003 2.3003 299.3003 150.80029 15080.02961 2.30030 299.30030 150.80030 15080.03000 2020-01-01 2020-01-02 2020-01-01 00:12:46 2020-01-02 03:41:07 2020-01-01 00:12:46.000 2020-01-02 03:41:07.000 766 99667 50216.5 5021650 766 99667 50216.5 5021650 -32404 32734 4996.66 499666 -128 127 -3.02 -302 +767 100 10757 99668 2.3033 299.3033 150.8033 15080.33033 2.3033 299.3033 150.8033 15080.33036 2.30330 299.30330 150.80330 15080.33000 2020-01-01 2020-01-02 2020-01-01 00:12:47 2020-01-02 03:41:08 2020-01-01 00:12:47.000 2020-01-02 03:41:08.000 767 99668 50217.5 5021750 767 99668 50217.5 5021750 -32403 32735 4997.66 499766 -128 123 -4.58 -458 +768 100 10758 99669 2.3063 299.3063 150.8063 15080.63063 2.3063 299.3063 150.8063 15080.6305 2.30630 299.30630 150.80630 15080.63000 2020-01-01 2020-01-02 2020-01-01 00:12:48 2020-01-02 03:41:09 2020-01-01 00:12:48.000 2020-01-02 03:41:09.000 768 99669 50218.5 5021850 768 99669 50218.5 5021850 -32402 32736 4998.66 499866 -127 124 -3.58 -358 +769 100 10759 99670 2.3093 299.3093 150.8093 15080.93093 2.3093 299.3093 150.8093 15080.93084 2.30930 299.30930 150.80930 15080.93000 2020-01-01 2020-01-02 2020-01-01 00:12:49 2020-01-02 03:41:10 2020-01-01 00:12:49.000 2020-01-02 03:41:10.000 769 99670 50219.5 5021950 769 99670 50219.5 5021950 -32401 32737 4999.66 499966 -126 125 -2.58 -258 +77 102 10067 99977 0.23123 300.23123 150.23123 15173.35435 0.23123 300.23123 150.23123 15173.35439 0.23123 300.23123 150.23123 15173.35423 2020-01-01 2020-01-02 2020-01-01 00:01:17 2020-01-02 03:46:17 2020-01-01 00:01:17.000 2020-01-02 03:46:17.000 77 99977 50027 5052727 77 99977 50027 5052727 -32492 32443 4606.009900990099 465207 -125 126 -1.99009900990099 -201 +770 100 10760 99671 2.31231 299.31231 150.81231 15081.23123 2.31231 299.31232 150.81231 15081.23144 2.31231 299.31231 150.81231 15081.23100 2020-01-01 2020-01-02 2020-01-01 00:12:50 2020-01-02 03:41:11 2020-01-01 00:12:50.000 2020-01-02 03:41:11.000 770 99671 50220.5 5022050 770 99671 50220.5 5022050 -32400 32738 5000.66 500066 -125 126 -1.58 -158 +771 100 10761 99672 2.31531 299.31531 150.81531 15081.53153 2.31531 299.3153 150.81531 15081.53173 2.31531 299.31531 150.81531 15081.53100 2020-01-01 2020-01-02 2020-01-01 00:12:51 2020-01-02 03:41:12 2020-01-01 00:12:51.000 2020-01-02 03:41:12.000 771 99672 50221.5 5022150 771 99672 50221.5 5022150 -32399 32739 5001.66 500166 -124 127 -0.58 -58 +772 100 10762 99673 2.31831 299.31831 150.81831 15081.83183 2.31831 299.31833 150.81831 15081.83183 2.31831 299.31831 150.81831 15081.83100 2020-01-01 2020-01-02 2020-01-01 00:12:52 2020-01-02 03:41:13 2020-01-01 00:12:52.000 2020-01-02 03:41:13.000 772 99673 50222.5 5022250 772 99673 50222.5 5022250 -32398 32740 5002.66 500266 -128 127 -2.14 -214 +773 100 10763 99674 2.32132 299.32132 150.82132 15082.13213 2.32132 299.32132 150.82131 15082.13197 2.32132 299.32132 150.82132 15082.13200 2020-01-01 2020-01-02 2020-01-01 00:12:53 2020-01-02 03:41:14 2020-01-01 00:12:53.000 2020-01-02 03:41:14.000 773 99674 50223.5 5022350 773 99674 50223.5 5022350 -32397 32741 5003.66 500366 -128 123 -3.7 -370 +774 100 10764 99675 2.32432 299.32432 150.82432 15082.43243 2.32432 299.3243 150.82432 15082.43231 2.32432 299.32432 150.82432 15082.43200 2020-01-01 2020-01-02 2020-01-01 00:12:54 2020-01-02 03:41:15 2020-01-01 00:12:54.000 2020-01-02 03:41:15.000 774 99675 50224.5 5022450 774 99675 50224.5 5022450 -32396 32742 5004.66 500466 -127 124 -2.7 -270 +775 100 10765 99676 2.32732 299.32732 150.82732 15082.73273 2.32732 299.32733 150.82732 15082.73291 2.32732 299.32732 150.82732 15082.73200 2020-01-01 2020-01-02 2020-01-01 00:12:55 2020-01-02 03:41:16 2020-01-01 00:12:55.000 2020-01-02 03:41:16.000 775 99676 50225.5 5022550 775 99676 50225.5 5022550 -32395 32743 5005.66 500566 -126 125 -1.7 -170 +776 100 10766 99677 2.33033 299.33033 150.83033 15083.03303 2.33033 299.33032 150.83033 15083.0332 2.33033 299.33033 150.83033 15083.03300 2020-01-01 2020-01-02 2020-01-01 00:12:56 2020-01-02 03:41:17 2020-01-01 00:12:56.000 2020-01-02 03:41:17.000 776 99677 50226.5 5022650 776 99677 50226.5 5022650 -32394 32744 5006.66 500666 -125 126 -0.7 -70 +777 100 10767 99678 2.33333 299.33333 150.83333 15083.33333 2.33333 299.33334 150.83333 15083.3333 2.33333 299.33333 150.83333 15083.33300 2020-01-01 2020-01-02 2020-01-01 00:12:57 2020-01-02 03:41:18 2020-01-01 00:12:57.000 2020-01-02 03:41:18.000 777 99678 50227.5 5022750 777 99678 50227.5 5022750 -32393 32745 5007.66 500766 -124 127 0.3 30 +778 100 10768 99679 2.33633 299.33633 150.83633 15083.63363 2.33633 299.33633 150.83633 15083.63348 2.33633 299.33633 150.83633 15083.63300 2020-01-01 2020-01-02 2020-01-01 00:12:58 2020-01-02 03:41:19 2020-01-01 00:12:58.000 2020-01-02 03:41:19.000 778 99679 50228.5 5022850 778 99679 50228.5 5022850 -32392 32746 5008.66 500866 -128 127 -1.26 -126 +779 100 10769 99680 2.33933 299.33933 150.83933 15083.93393 2.33933 299.33932 150.83933 15083.93378 2.33933 299.33933 150.83933 15083.93300 2020-01-01 2020-01-02 2020-01-01 00:12:59 2020-01-02 03:41:20 2020-01-01 00:12:59.000 2020-01-02 03:41:20.000 779 99680 50229.5 5022950 779 99680 50229.5 5022950 -32391 32747 5009.66 500966 -128 123 -2.82 -282 +78 102 10068 99978 0.23423 300.23423 150.23423 15173.65765 0.23423 300.23422 150.23423 15173.65769 0.23423 300.23423 150.23423 15173.65723 2020-01-01 2020-01-02 2020-01-01 00:01:18 2020-01-02 03:46:18 2020-01-01 00:01:18.000 2020-01-02 03:46:18.000 78 99978 50028 5052828 78 99978 50028 5052828 -32491 32444 4607.009900990099 465308 -124 127 -0.9900990099009901 -100 +780 100 10770 99681 2.34234 299.34234 150.84234 15084.23423 2.34234 299.34235 150.84234 15084.23437 2.34234 299.34234 150.84234 15084.23400 2020-01-01 2020-01-02 2020-01-01 00:13:00 2020-01-02 03:41:21 2020-01-01 00:13:00.000 2020-01-02 03:41:21.000 780 99681 50230.5 5023050 780 99681 50230.5 5023050 -32390 32748 5010.66 501066 -127 124 -1.82 -182 +781 100 10771 99682 2.34534 299.34534 150.84534 15084.53453 2.34534 299.34534 150.84534 15084.53467 2.34534 299.34534 150.84534 15084.53400 2020-01-01 2020-01-02 2020-01-01 00:13:01 2020-01-02 03:41:22 2020-01-01 00:13:01.000 2020-01-02 03:41:22.000 781 99682 50231.5 5023150 781 99682 50231.5 5023150 -32389 32749 5011.66 501166 -126 125 -0.82 -82 +782 100 10772 99683 2.34834 299.34834 150.84834 15084.83483 2.34834 299.34836 150.84834 15084.83477 2.34834 299.34834 150.84834 15084.83400 2020-01-01 2020-01-02 2020-01-01 00:13:02 2020-01-02 03:41:23 2020-01-01 00:13:02.000 2020-01-02 03:41:23.000 782 99683 50232.5 5023250 782 99683 50232.5 5023250 -32388 32750 5012.66 501266 -125 126 0.18 18 +783 100 10773 99684 2.35135 299.35135 150.85135 15085.13513 2.35135 299.35135 150.85134 15085.13495 2.35135 299.35135 150.85135 15085.13500 2020-01-01 2020-01-02 2020-01-01 00:13:03 2020-01-02 03:41:24 2020-01-01 00:13:03.000 2020-01-02 03:41:24.000 783 99684 50233.5 5023350 783 99684 50233.5 5023350 -32387 32751 5013.66 501366 -124 127 1.18 118 +784 100 10774 99685 2.35435 299.35435 150.85435 15085.43543 2.35435 299.35434 150.85435 15085.43525 2.35435 299.35435 150.85435 15085.43500 2020-01-01 2020-01-02 2020-01-01 00:13:04 2020-01-02 03:41:25 2020-01-01 00:13:04.000 2020-01-02 03:41:25.000 784 99685 50234.5 5023450 784 99685 50234.5 5023450 -32386 32752 5014.66 501466 -128 127 -0.38 -38 +785 100 10775 99686 2.35735 299.35735 150.85735 15085.73573 2.35735 299.35736 150.85736 15085.736 2.35735 299.35735 150.85735 15085.73500 2020-01-01 2020-01-02 2020-01-01 00:13:05 2020-01-02 03:41:26 2020-01-01 00:13:05.000 2020-01-02 03:41:26.000 785 99686 50235.5 5023550 785 99686 50235.5 5023550 -32385 32753 5015.66 501566 -128 127 -1.94 -194 +786 100 10776 99687 2.36036 299.36036 150.86036 15086.03603 2.36036 299.36035 150.86036 15086.03614 2.36036 299.36036 150.86036 15086.03600 2020-01-01 2020-01-02 2020-01-01 00:13:06 2020-01-02 03:41:27 2020-01-01 00:13:06.000 2020-01-02 03:41:27.000 786 99687 50236.5 5023650 786 99687 50236.5 5023650 -32384 32754 5016.66 501666 -128 124 -3.5 -350 +787 100 10777 99688 2.36336 299.36336 150.86336 15086.33633 2.36336 299.36337 150.86336 15086.33628 2.36336 299.36336 150.86336 15086.33600 2020-01-01 2020-01-02 2020-01-01 00:13:07 2020-01-02 03:41:28 2020-01-01 00:13:07.000 2020-01-02 03:41:28.000 787 99688 50237.5 5023750 787 99688 50237.5 5023750 -32383 32755 5017.66 501766 -127 125 -2.5 -250 +788 100 10778 99689 2.36636 299.36636 150.86636 15086.63663 2.36636 299.36636 150.86636 15086.63641 2.36636 299.36636 150.86636 15086.63600 2020-01-01 2020-01-02 2020-01-01 00:13:08 2020-01-02 03:41:29 2020-01-01 00:13:08.000 2020-01-02 03:41:29.000 788 99689 50238.5 5023850 788 99689 50238.5 5023850 -32382 32756 5018.66 501866 -126 126 -1.5 -150 +789 100 10779 99690 2.36936 299.36936 150.86936 15086.93693 2.36936 299.36935 150.86936 15086.93672 2.36936 299.36936 150.86936 15086.93600 2020-01-01 2020-01-02 2020-01-01 00:13:09 2020-01-02 03:41:30 2020-01-01 00:13:09.000 2020-01-02 03:41:30.000 789 99690 50239.5 5023950 789 99690 50239.5 5023950 -32381 32757 5019.66 501966 -125 127 -0.5 -50 +79 102 10069 99979 0.23723 300.23723 150.23723 15173.96096 0.23723 300.23724 150.23724 15173.96129 0.23723 300.23723 150.23723 15173.96023 2020-01-01 2020-01-02 2020-01-01 00:01:19 2020-01-02 03:46:19 2020-01-01 00:01:19.000 2020-01-02 03:46:19.000 79 99979 50029 5052929 79 99979 50029 5052929 -32490 32445 4608.009900990099 465409 -128 127 -2.5247524752475248 -255 +790 100 10780 99691 2.37237 299.37237 150.87237 15087.23723 2.37237 299.37238 150.87237 15087.23747 2.37237 299.37237 150.87237 15087.23700 2020-01-01 2020-01-02 2020-01-01 00:13:10 2020-01-02 03:41:31 2020-01-01 00:13:10.000 2020-01-02 03:41:31.000 790 99691 50240.5 5024050 790 99691 50240.5 5024050 -32380 32758 5020.66 502066 -128 127 -2.06 -206 +791 100 10781 99692 2.37537 299.37537 150.87537 15087.53753 2.37537 299.37537 150.87537 15087.53761 2.37537 299.37537 150.87537 15087.53700 2020-01-01 2020-01-02 2020-01-01 00:13:11 2020-01-02 03:41:32 2020-01-01 00:13:11.000 2020-01-02 03:41:32.000 791 99692 50241.5 5024150 791 99692 50241.5 5024150 -32379 32759 5021.66 502166 -128 127 -3.62 -362 +792 100 10782 99693 2.37837 299.37837 150.87837 15087.83783 2.37837 299.3784 150.87837 15087.83775 2.37837 299.37837 150.87837 15087.83700 2020-01-01 2020-01-02 2020-01-01 00:13:12 2020-01-02 03:41:33 2020-01-01 00:13:12.000 2020-01-02 03:41:33.000 792 99693 50242.5 5024250 792 99693 50242.5 5024250 -32378 32760 5022.66 502266 -128 123 -5.18 -518 +793 100 10783 99694 2.38138 299.38138 150.88138 15088.13813 2.38138 299.38138 150.88137 15088.13789 2.38138 299.38138 150.88138 15088.13800 2020-01-01 2020-01-02 2020-01-01 00:13:13 2020-01-02 03:41:34 2020-01-01 00:13:13.000 2020-01-02 03:41:34.000 793 99694 50243.5 5024350 793 99694 50243.5 5024350 -32377 32761 5023.66 502366 -127 124 -4.18 -418 +794 100 10784 99695 2.38438 299.38438 150.88438 15088.43843 2.38438 299.3844 150.88438 15088.43864 2.38438 299.38438 150.88438 15088.43800 2020-01-01 2020-01-02 2020-01-01 00:13:14 2020-01-02 03:41:35 2020-01-01 00:13:14.000 2020-01-02 03:41:35.000 794 99695 50244.5 5024450 794 99695 50244.5 5024450 -32376 32762 5024.66 502466 -126 125 -3.18 -318 +795 100 10785 99696 2.38738 299.38738 150.88738 15088.73873 2.38738 299.3874 150.88738 15088.73894 2.38738 299.38738 150.88738 15088.73800 2020-01-01 2020-01-02 2020-01-01 00:13:15 2020-01-02 03:41:36 2020-01-01 00:13:15.000 2020-01-02 03:41:36.000 795 99696 50245.5 5024550 795 99696 50245.5 5024550 -32375 32763 5025.66 502566 -125 126 -2.18 -218 +796 100 10786 99697 2.39039 299.39039 150.89039 15089.03903 2.39039 299.39038 150.89039 15089.03908 2.39039 299.39039 150.89039 15089.03900 2020-01-01 2020-01-02 2020-01-01 00:13:16 2020-01-02 03:41:37 2020-01-01 00:13:16.000 2020-01-02 03:41:37.000 796 99697 50246.5 5024650 796 99697 50246.5 5024650 -32374 32764 5026.66 502666 -124 127 -1.18 -118 +797 100 10787 99698 2.39339 299.39339 150.89339 15089.33933 2.39339 299.3934 150.89339 15089.33921 2.39339 299.39339 150.89339 15089.33900 2020-01-01 2020-01-02 2020-01-01 00:13:17 2020-01-02 03:41:38 2020-01-01 00:13:17.000 2020-01-02 03:41:38.000 797 99698 50247.5 5024750 797 99698 50247.5 5024750 -32373 32765 5027.66 502766 -128 127 -2.74 -274 +798 100 10788 99699 2.39639 299.39639 150.89639 15089.63963 2.39639 299.3964 150.89639 15089.63936 2.39639 299.39639 150.89639 15089.63900 2020-01-01 2020-01-02 2020-01-01 00:13:18 2020-01-02 03:41:39 2020-01-01 00:13:18.000 2020-01-02 03:41:39.000 798 99699 50248.5 5024850 798 99699 50248.5 5024850 -32372 32766 5028.66 502866 -128 123 -4.3 -430 +799 100 10789 99700 2.39939 299.39939 150.89939 15089.93993 2.39939 299.3994 150.8994 15089.94011 2.39939 299.39939 150.89939 15089.93900 2020-01-01 2020-01-02 2020-01-01 00:13:19 2020-01-02 03:41:40 2020-01-01 00:13:19.000 2020-01-02 03:41:40.000 799 99700 50249.5 5024950 799 99700 50249.5 5024950 -32371 32767 5029.66 502966 -127 124 -3.3 -330 +8 102 1007 9998 0.02402 300.02402 150.02402 15152.42642 0.02402 300.02402 150.02402 15152.42607 0.02402 300.02402 150.02402 15152.42602 2020-01-01 2020-01-02 2020-01-01 00:00:08 2020-01-02 03:45:08 2020-01-01 00:00:08.000 2020-01-02 03:45:08.000 8 99908 49958 5045758 8 99908 49958 5045758 -32561 32374 4537.009900990099 458238 -125 126 -0.019801980198019802 -2 +80 102 10070 99980 0.24024 300.24024 150.24024 15174.26426 0.24024 300.24023 150.24023 15174.26397 0.24024 300.24024 150.24024 15174.26424 2020-01-01 2020-01-02 2020-01-01 00:01:20 2020-01-02 03:46:20 2020-01-01 00:01:20.000 2020-01-02 03:46:20.000 80 99980 50030 5053030 80 99980 50030 5053030 -32489 32446 4609.009900990099 465510 -128 123 -4.0594059405940595 -410 +800 100 10790 99701 2.4024 299.4024 150.9024 15090.24024 2.4024 299.4024 150.9024 15090.24041 2.40240 299.40240 150.90240 15090.24000 2020-01-01 2020-01-02 2020-01-01 00:13:20 2020-01-02 03:41:41 2020-01-01 00:13:20.000 2020-01-02 03:41:41.000 800 99701 50250.5 5025050 800 99701 50250.5 5025050 -32768 32167 4375.3 437530 -126 125 -2.3 -230 +801 100 10791 99702 2.4054 299.4054 150.9054 15090.54054 2.4054 299.4054 150.9054 15090.54058 2.40540 299.40540 150.90540 15090.54000 2020-01-01 2020-01-02 2020-01-01 00:13:21 2020-01-02 03:41:42 2020-01-01 00:13:21.000 2020-01-02 03:41:42.000 801 99702 50251.5 5025150 801 99702 50251.5 5025150 -32767 32168 4376.3 437630 -125 126 -1.3 -130 +802 100 10792 99703 2.4084 299.4084 150.9084 15090.84084 2.4084 299.40842 150.9084 15090.84069 2.40840 299.40840 150.90840 15090.84000 2020-01-01 2020-01-02 2020-01-01 00:13:22 2020-01-02 03:41:43 2020-01-01 00:13:22.000 2020-01-02 03:41:43.000 802 99703 50252.5 5025250 802 99703 50252.5 5025250 -32766 32169 4377.3 437730 -124 127 -0.3 -30 +803 100 10793 99704 2.41141 299.41141 150.91141 15091.14114 2.41141 299.4114 150.9114 15091.14098 2.41141 299.41141 150.91141 15091.14100 2020-01-01 2020-01-02 2020-01-01 00:13:23 2020-01-02 03:41:44 2020-01-01 00:13:23.000 2020-01-02 03:41:44.000 803 99704 50253.5 5025350 803 99704 50253.5 5025350 -32765 32170 4378.3 437830 -128 127 -1.86 -186 +804 100 10794 99705 2.41441 299.41441 150.91441 15091.44144 2.41441 299.41443 150.91441 15091.44158 2.41441 299.41441 150.91441 15091.44100 2020-01-01 2020-01-02 2020-01-01 00:13:24 2020-01-02 03:41:45 2020-01-01 00:13:24.000 2020-01-02 03:41:45.000 804 99705 50254.5 5025450 804 99705 50254.5 5025450 -32764 32171 4379.3 437930 -128 123 -3.42 -342 +805 100 10795 99706 2.41741 299.41741 150.91741 15091.74174 2.41741 299.41742 150.91741 15091.74188 2.41741 299.41741 150.91741 15091.74100 2020-01-01 2020-01-02 2020-01-01 00:13:25 2020-01-02 03:41:46 2020-01-01 00:13:25.000 2020-01-02 03:41:46.000 805 99706 50255.5 5025550 805 99706 50255.5 5025550 -32763 32172 4380.3 438030 -127 124 -2.42 -242 +806 100 10796 99707 2.42042 299.42042 150.92042 15092.04204 2.42042 299.4204 150.92042 15092.04205 2.42042 299.42042 150.92042 15092.04200 2020-01-01 2020-01-02 2020-01-01 00:13:26 2020-01-02 03:41:47 2020-01-01 00:13:26.000 2020-01-02 03:41:47.000 806 99707 50256.5 5025650 806 99707 50256.5 5025650 -32762 32173 4381.3 438130 -126 125 -1.42 -142 +807 100 10797 99708 2.42342 299.42342 150.92342 15092.34234 2.42342 299.42343 150.92342 15092.34216 2.42342 299.42342 150.92342 15092.34200 2020-01-01 2020-01-02 2020-01-01 00:13:27 2020-01-02 03:41:48 2020-01-01 00:13:27.000 2020-01-02 03:41:48.000 807 99708 50257.5 5025750 807 99708 50257.5 5025750 -32761 32174 4382.3 438230 -125 126 -0.42 -42 +808 100 10798 99709 2.42642 299.42642 150.92642 15092.64264 2.42642 299.42642 150.92642 15092.64245 2.42642 299.42642 150.92642 15092.64200 2020-01-01 2020-01-02 2020-01-01 00:13:28 2020-01-02 03:41:49 2020-01-01 00:13:28.000 2020-01-02 03:41:49.000 808 99709 50258.5 5025850 808 99709 50258.5 5025850 -32760 32175 4383.3 438330 -124 127 0.58 58 +809 100 10799 99710 2.42942 299.42942 150.92942 15092.94294 2.42942 299.42944 150.92943 15092.94305 2.42942 299.42942 150.92942 15092.94200 2020-01-01 2020-01-02 2020-01-01 00:13:29 2020-01-02 03:41:50 2020-01-01 00:13:29.000 2020-01-02 03:41:50.000 809 99710 50259.5 5025950 809 99710 50259.5 5025950 -32759 32176 4384.3 438430 -128 127 -0.98 -98 +81 102 10071 99981 0.24324 300.24324 150.24324 15174.56756 0.24324 300.24326 150.24324 15174.56758 0.24324 300.24324 150.24324 15174.56724 2020-01-01 2020-01-02 2020-01-01 00:01:21 2020-01-02 03:46:21 2020-01-01 00:01:21.000 2020-01-02 03:46:21.000 81 99981 50031 5053131 81 99981 50031 5053131 -32488 32447 4610.009900990099 465611 -127 124 -3.0594059405940595 -309 +810 100 10800 99711 2.43243 299.43243 150.93243 15093.24324 2.43243 299.43243 150.93243 15093.24338 2.43243 299.43243 150.93243 15093.24300 2020-01-01 2020-01-02 2020-01-01 00:13:30 2020-01-02 03:41:51 2020-01-01 00:13:30.000 2020-01-02 03:41:51.000 810 99711 50260.5 5026050 810 99711 50260.5 5026050 -32758 32177 4385.3 438530 -128 127 -2.54 -254 +811 100 10801 99712 2.43543 299.43543 150.93543 15093.54354 2.43543 299.43542 150.93543 15093.54353 2.43543 299.43543 150.93543 15093.54300 2020-01-01 2020-01-02 2020-01-01 00:13:31 2020-01-02 03:41:52 2020-01-01 00:13:31.000 2020-01-02 03:41:52.000 811 99712 50261.5 5026150 811 99712 50261.5 5026150 -32757 32178 4386.3 438630 -128 124 -4.1 -410 +812 100 10802 99713 2.43843 299.43843 150.93843 15093.84384 2.43843 299.43845 150.93844 15093.84428 2.43843 299.43843 150.93843 15093.84300 2020-01-01 2020-01-02 2020-01-01 00:13:32 2020-01-02 03:41:53 2020-01-01 00:13:32.000 2020-01-02 03:41:53.000 812 99713 50262.5 5026250 812 99713 50262.5 5026250 -32756 32179 4387.3 438730 -127 125 -3.1 -310 +813 100 10803 99714 2.44144 299.44144 150.94144 15094.14414 2.44144 299.44144 150.94143 15094.14392 2.44144 299.44144 150.94144 15094.14400 2020-01-01 2020-01-02 2020-01-01 00:13:33 2020-01-02 03:41:54 2020-01-01 00:13:33.000 2020-01-02 03:41:54.000 813 99714 50263.5 5026350 813 99714 50263.5 5026350 -32755 32180 4388.3 438830 -126 126 -2.1 -210 +814 100 10804 99715 2.44444 299.44444 150.94444 15094.44444 2.44444 299.44446 150.94444 15094.44452 2.44444 299.44444 150.94444 15094.44400 2020-01-01 2020-01-02 2020-01-01 00:13:34 2020-01-02 03:41:55 2020-01-01 00:13:34.000 2020-01-02 03:41:55.000 814 99715 50264.5 5026450 814 99715 50264.5 5026450 -32754 32181 4389.3 438930 -125 127 -1.1 -110 +815 100 10805 99716 2.44744 299.44744 150.94744 15094.74474 2.44744 299.44745 150.94744 15094.74485 2.44744 299.44744 150.94744 15094.74400 2020-01-01 2020-01-02 2020-01-01 00:13:35 2020-01-02 03:41:56 2020-01-01 00:13:35.000 2020-01-02 03:41:56.000 815 99716 50265.5 5026550 815 99716 50265.5 5026550 -32753 32182 4390.3 439030 -128 127 -2.66 -266 +816 100 10806 99717 2.45045 299.45045 150.95045 15095.04504 2.45045 299.45044 150.95045 15095.045 2.45045 299.45045 150.95045 15095.04500 2020-01-01 2020-01-02 2020-01-01 00:13:36 2020-01-02 03:41:57 2020-01-01 00:13:36.000 2020-01-02 03:41:57.000 816 99717 50266.5 5026650 816 99717 50266.5 5026650 -32752 32183 4391.3 439130 -128 127 -4.22 -422 +817 100 10807 99718 2.45345 299.45345 150.95345 15095.34534 2.45345 299.45346 150.95345 15095.34574 2.45345 299.45345 150.95345 15095.34500 2020-01-01 2020-01-02 2020-01-01 00:13:37 2020-01-02 03:41:58 2020-01-01 00:13:37.000 2020-01-02 03:41:58.000 817 99718 50267.5 5026750 817 99718 50267.5 5026750 -32751 32184 4392.3 439230 -128 123 -5.78 -578 +818 100 10808 99719 2.45645 299.45645 150.95645 15095.64564 2.45645 299.45645 150.95645 15095.64539 2.45645 299.45645 150.95645 15095.64500 2020-01-01 2020-01-02 2020-01-01 00:13:38 2020-01-02 03:41:59 2020-01-01 00:13:38.000 2020-01-02 03:41:59.000 818 99719 50268.5 5026850 818 99719 50268.5 5026850 -32750 32185 4393.3 439330 -127 124 -4.78 -478 +819 100 10809 99720 2.45945 299.45945 150.95945 15095.94594 2.45945 299.45947 150.95946 15095.94602 2.45945 299.45945 150.95945 15095.94500 2020-01-01 2020-01-02 2020-01-01 00:13:39 2020-01-02 03:42:00 2020-01-01 00:13:39.000 2020-01-02 03:42:00.000 819 99720 50269.5 5026950 819 99720 50269.5 5026950 -32749 32186 4394.3 439430 -126 125 -3.78 -378 +82 102 10072 99982 0.24624 300.24624 150.24624 15174.87087 0.24624 300.24625 150.24624 15174.87088 0.24624 300.24624 150.24624 15174.87024 2020-01-01 2020-01-02 2020-01-01 00:01:22 2020-01-02 03:46:22 2020-01-01 00:01:22.000 2020-01-02 03:46:22.000 82 99982 50032 5053232 82 99982 50032 5053232 -32487 32448 4611.009900990099 465712 -126 125 -2.0594059405940595 -208 +820 100 10810 99721 2.46246 299.46246 150.96246 15096.24624 2.46246 299.46246 150.96246 15096.24633 2.46246 299.46246 150.96246 15096.24600 2020-01-01 2020-01-02 2020-01-01 00:13:40 2020-01-02 03:42:01 2020-01-01 00:13:40.000 2020-01-02 03:42:01.000 820 99721 50270.5 5027050 820 99721 50270.5 5027050 -32748 32187 4395.3 439530 -125 126 -2.78 -278 +821 100 10811 99722 2.46546 299.46546 150.96546 15096.54654 2.46546 299.46545 150.96546 15096.54646 2.46546 299.46546 150.96546 15096.54600 2020-01-01 2020-01-02 2020-01-01 00:13:41 2020-01-02 03:42:02 2020-01-01 00:13:41.000 2020-01-02 03:42:02.000 821 99722 50271.5 5027150 821 99722 50271.5 5027150 -32747 32188 4396.3 439630 -124 127 -1.78 -178 +822 100 10812 99723 2.46846 299.46846 150.96846 15096.84684 2.46846 299.46848 150.96847 15096.84721 2.46846 299.46846 150.96846 15096.84600 2020-01-01 2020-01-02 2020-01-01 00:13:42 2020-01-02 03:42:03 2020-01-01 00:13:42.000 2020-01-02 03:42:03.000 822 99723 50272.5 5027250 822 99723 50272.5 5027250 -32746 32189 4397.3 439730 -128 127 -3.34 -334 +823 100 10813 99724 2.47147 299.47147 150.97147 15097.14714 2.47147 299.47147 150.97146 15097.14686 2.47147 299.47147 150.97147 15097.14700 2020-01-01 2020-01-02 2020-01-01 00:13:43 2020-01-02 03:42:04 2020-01-01 00:13:43.000 2020-01-02 03:42:04.000 823 99724 50273.5 5027350 823 99724 50273.5 5027350 -32745 32190 4398.3 439830 -128 123 -4.9 -490 +824 100 10814 99725 2.47447 299.47447 150.97447 15097.44744 2.47447 299.4745 150.97447 15097.44749 2.47447 299.47447 150.97447 15097.44700 2020-01-01 2020-01-02 2020-01-01 00:13:44 2020-01-02 03:42:05 2020-01-01 00:13:44.000 2020-01-02 03:42:05.000 824 99725 50274.5 5027450 824 99725 50274.5 5027450 -32744 32191 4399.3 439930 -127 124 -3.9 -390 +825 100 10815 99726 2.47747 299.47747 150.97747 15097.74774 2.47747 299.47748 150.97747 15097.74779 2.47747 299.47747 150.97747 15097.74700 2020-01-01 2020-01-02 2020-01-01 00:13:45 2020-01-02 03:42:06 2020-01-01 00:13:45.000 2020-01-02 03:42:06.000 825 99726 50275.5 5027550 825 99726 50275.5 5027550 -32743 32192 4400.3 440030 -126 125 -2.9 -290 +826 100 10816 99727 2.48048 299.48048 150.98048 15098.04804 2.48048 299.48047 150.98048 15098.04809 2.48048 299.48048 150.98048 15098.04800 2020-01-01 2020-01-02 2020-01-01 00:13:46 2020-01-02 03:42:07 2020-01-01 00:13:46.000 2020-01-02 03:42:07.000 826 99727 50276.5 5027650 826 99727 50276.5 5027650 -32742 32193 4401.3 440130 -125 126 -1.9 -190 +827 100 10817 99728 2.48348 299.48348 150.98348 15098.34834 2.48348 299.4835 150.98348 15098.34869 2.48348 299.48348 150.98348 15098.34800 2020-01-01 2020-01-02 2020-01-01 00:13:47 2020-01-02 03:42:08 2020-01-01 00:13:47.000 2020-01-02 03:42:08.000 827 99728 50277.5 5027750 827 99728 50277.5 5027750 -32741 32194 4402.3 440230 -124 127 -0.9 -90 +828 100 10818 99729 2.48648 299.48648 150.98648 15098.64864 2.48648 299.48648 150.98648 15098.64837 2.48648 299.48648 150.98648 15098.64800 2020-01-01 2020-01-02 2020-01-01 00:13:48 2020-01-02 03:42:09 2020-01-01 00:13:48.000 2020-01-02 03:42:09.000 828 99729 50278.5 5027850 828 99729 50278.5 5027850 -32740 32195 4403.3 440330 -128 127 -2.46 -246 +829 100 10819 99730 2.48948 299.48948 150.98948 15098.94894 2.48948 299.4895 150.98948 15098.94896 2.48948 299.48948 150.98948 15098.94800 2020-01-01 2020-01-02 2020-01-01 00:13:49 2020-01-02 03:42:10 2020-01-01 00:13:49.000 2020-01-02 03:42:10.000 829 99730 50279.5 5027950 829 99730 50279.5 5027950 -32739 32196 4404.3 440430 -128 123 -4.02 -402 +83 102 10073 99983 0.24924 300.24924 150.24924 15175.17417 0.24924 300.24924 150.24924 15175.17417 0.24924 300.24924 150.24924 15175.17324 2020-01-01 2020-01-02 2020-01-01 00:01:23 2020-01-02 03:46:23 2020-01-01 00:01:23.000 2020-01-02 03:46:23.000 83 99983 50033 5053333 83 99983 50033 5053333 -32486 32449 4612.009900990099 465813 -125 126 -1.0594059405940595 -107 +830 100 10820 99731 2.49249 299.49249 150.99249 15099.24924 2.49249 299.4925 150.99249 15099.24926 2.49249 299.49249 150.99249 15099.24900 2020-01-01 2020-01-02 2020-01-01 00:13:50 2020-01-02 03:42:11 2020-01-01 00:13:50.000 2020-01-02 03:42:11.000 830 99731 50280.5 5028050 830 99731 50280.5 5028050 -32738 32197 4405.3 440530 -127 124 -3.02 -302 +831 100 10821 99732 2.49549 299.49549 150.99549 15099.54954 2.49549 299.49548 150.99549 15099.54956 2.49549 299.49549 150.99549 15099.54900 2020-01-01 2020-01-02 2020-01-01 00:13:51 2020-01-02 03:42:12 2020-01-01 00:13:51.000 2020-01-02 03:42:12.000 831 99732 50281.5 5028150 831 99732 50281.5 5028150 -32737 32198 4406.3 440630 -126 125 -2.02 -202 +832 100 10822 99733 2.49849 299.49849 150.99849 15099.84984 2.49849 299.4985 150.9985 15099.85016 2.49849 299.49849 150.99849 15099.84900 2020-01-01 2020-01-02 2020-01-01 00:13:52 2020-01-02 03:42:13 2020-01-01 00:13:52.000 2020-01-02 03:42:13.000 832 99733 50282.5 5028250 832 99733 50282.5 5028250 -32736 32199 4407.3 440730 -125 126 -1.02 -102 +833 100 10823 99734 2.5015 299.5015 151.0015 15100.15015 2.5015 299.5015 151.00149 15100.14983 2.50150 299.50150 151.00150 15100.15000 2020-01-01 2020-01-02 2020-01-01 00:13:53 2020-01-02 03:42:14 2020-01-01 00:13:53.000 2020-01-02 03:42:14.000 833 99734 50283.5 5028350 833 99734 50283.5 5028350 -32735 32200 4408.3 440830 -124 127 -0.02 -2 +834 100 10824 99735 2.5045 299.5045 151.0045 15100.45045 2.5045 299.50452 151.0045 15100.45043 2.50450 299.50450 151.00450 15100.45000 2020-01-01 2020-01-02 2020-01-01 00:13:54 2020-01-02 03:42:15 2020-01-01 00:13:54.000 2020-01-02 03:42:15.000 834 99735 50284.5 5028450 834 99735 50284.5 5028450 -32734 32201 4409.3 440930 -128 127 -1.58 -158 +835 100 10825 99736 2.5075 299.5075 151.0075 15100.75075 2.5075 299.5075 151.0075 15100.75073 2.50750 299.50750 151.00750 15100.75000 2020-01-01 2020-01-02 2020-01-01 00:13:55 2020-01-02 03:42:16 2020-01-01 00:13:55.000 2020-01-02 03:42:16.000 835 99736 50285.5 5028550 835 99736 50285.5 5028550 -32733 32202 4410.3 441030 -128 123 -3.14 -314 +836 100 10826 99737 2.51051 299.51051 151.01051 15101.05105 2.51051 299.5105 151.01051 15101.05103 2.51051 299.51051 151.01051 15101.05100 2020-01-01 2020-01-02 2020-01-01 00:13:56 2020-01-02 03:42:17 2020-01-01 00:13:56.000 2020-01-02 03:42:17.000 836 99737 50286.5 5028650 836 99737 50286.5 5028650 -32732 32203 4411.3 441130 -127 124 -2.14 -214 +837 100 10827 99738 2.51351 299.51351 151.01351 15101.35135 2.51351 299.51352 151.01351 15101.35162 2.51351 299.51351 151.01351 15101.35100 2020-01-01 2020-01-02 2020-01-01 00:13:57 2020-01-02 03:42:18 2020-01-01 00:13:57.000 2020-01-02 03:42:18.000 837 99738 50287.5 5028750 837 99738 50287.5 5028750 -32731 32204 4412.3 441230 -126 125 -1.14 -114 +838 100 10828 99739 2.51651 299.51651 151.01651 15101.65165 2.51651 299.5165 151.01651 15101.6513 2.51651 299.51651 151.01651 15101.65100 2020-01-01 2020-01-02 2020-01-01 00:13:58 2020-01-02 03:42:19 2020-01-01 00:13:58.000 2020-01-02 03:42:19.000 838 99739 50288.5 5028850 838 99739 50288.5 5028850 -32730 32205 4413.3 441330 -125 126 -0.14 -14 +839 100 10829 99740 2.51951 299.51951 151.01951 15101.95195 2.51951 299.51953 151.01951 15101.9519 2.51951 299.51951 151.01951 15101.95100 2020-01-01 2020-01-02 2020-01-01 00:13:59 2020-01-02 03:42:20 2020-01-01 00:13:59.000 2020-01-02 03:42:20.000 839 99740 50289.5 5028950 839 99740 50289.5 5028950 -32729 32206 4414.3 441430 -124 127 0.86 86 +84 102 10074 99984 0.25225 300.25225 150.25225 15175.47747 0.25225 300.25226 150.25225 15175.47778 0.25225 300.25225 150.25225 15175.47725 2020-01-01 2020-01-02 2020-01-01 00:01:24 2020-01-02 03:46:24 2020-01-01 00:01:24.000 2020-01-02 03:46:24.000 84 99984 50034 5053434 84 99984 50034 5053434 -32485 32450 4613.009900990099 465914 -124 127 -0.0594059405940594 -6 +840 100 10830 99741 2.52252 299.52252 151.02252 15102.25225 2.52252 299.52252 151.02252 15102.2522 2.52252 299.52252 151.02252 15102.25200 2020-01-01 2020-01-02 2020-01-01 00:14:00 2020-01-02 03:42:21 2020-01-01 00:14:00.000 2020-01-02 03:42:21.000 840 99741 50290.5 5029050 840 99741 50290.5 5029050 -32728 32207 4415.3 441530 -128 127 -0.7 -70 +841 100 10831 99742 2.52552 299.52552 151.02552 15102.55255 2.52552 299.5255 151.02552 15102.5525 2.52552 299.52552 151.02552 15102.55200 2020-01-01 2020-01-02 2020-01-01 00:14:01 2020-01-02 03:42:22 2020-01-01 00:14:01.000 2020-01-02 03:42:22.000 841 99742 50291.5 5029150 841 99742 50291.5 5029150 -32727 32208 4416.3 441630 -128 127 -2.26 -226 +842 100 10832 99743 2.52852 299.52852 151.02852 15102.85285 2.52852 299.52853 151.02853 15102.85313 2.52852 299.52852 151.02852 15102.85200 2020-01-01 2020-01-02 2020-01-01 00:14:02 2020-01-02 03:42:23 2020-01-01 00:14:02.000 2020-01-02 03:42:23.000 842 99743 50292.5 5029250 842 99743 50292.5 5029250 -32726 32209 4417.3 441730 -128 123 -3.82 -382 +843 100 10833 99744 2.53153 299.53153 151.03153 15103.15315 2.53153 299.53152 151.03152 15103.15278 2.53153 299.53153 151.03153 15103.15300 2020-01-01 2020-01-02 2020-01-01 00:14:03 2020-01-02 03:42:24 2020-01-01 00:14:03.000 2020-01-02 03:42:24.000 843 99744 50293.5 5029350 843 99744 50293.5 5029350 -32725 32210 4418.3 441830 -127 124 -2.82 -282 +844 100 10834 99745 2.53453 299.53453 151.03453 15103.45345 2.53453 299.53455 151.03453 15103.45353 2.53453 299.53453 151.03453 15103.45300 2020-01-01 2020-01-02 2020-01-01 00:14:04 2020-01-02 03:42:25 2020-01-01 00:14:04.000 2020-01-02 03:42:25.000 844 99745 50294.5 5029450 844 99745 50294.5 5029450 -32724 32211 4419.3 441930 -126 125 -1.82 -182 +845 100 10835 99746 2.53753 299.53753 151.03753 15103.75375 2.53753 299.53754 151.03753 15103.75366 2.53753 299.53753 151.03753 15103.75300 2020-01-01 2020-01-02 2020-01-01 00:14:05 2020-01-02 03:42:26 2020-01-01 00:14:05.000 2020-01-02 03:42:26.000 845 99746 50295.5 5029550 845 99746 50295.5 5029550 -32723 32212 4420.3 442030 -125 126 -0.82 -82 +846 100 10836 99747 2.54054 299.54054 151.04054 15104.05405 2.54054 299.54053 151.04053 15104.05397 2.54054 299.54054 151.04054 15104.05400 2020-01-01 2020-01-02 2020-01-01 00:14:06 2020-01-02 03:42:27 2020-01-01 00:14:06.000 2020-01-02 03:42:27.000 846 99747 50296.5 5029650 846 99747 50296.5 5029650 -32722 32213 4421.3 442130 -124 127 0.18 18 +847 100 10837 99748 2.54354 299.54354 151.04354 15104.35435 2.54354 299.54355 151.04354 15104.3546 2.54354 299.54354 151.04354 15104.35400 2020-01-01 2020-01-02 2020-01-01 00:14:07 2020-01-02 03:42:28 2020-01-01 00:14:07.000 2020-01-02 03:42:28.000 847 99748 50297.5 5029750 847 99748 50297.5 5029750 -32721 32214 4422.3 442230 -128 127 -1.38 -138 +848 100 10838 99749 2.54654 299.54654 151.04654 15104.65465 2.54654 299.54654 151.04654 15104.65425 2.54654 299.54654 151.04654 15104.65400 2020-01-01 2020-01-02 2020-01-01 00:14:08 2020-01-02 03:42:29 2020-01-01 00:14:08.000 2020-01-02 03:42:29.000 848 99749 50298.5 5029850 848 99749 50298.5 5029850 -32720 32215 4423.3 442330 -128 123 -2.94 -294 +849 100 10839 99750 2.54954 299.54954 151.04954 15104.95495 2.54954 299.54956 151.04954 15104.95499 2.54954 299.54954 151.04954 15104.95400 2020-01-01 2020-01-02 2020-01-01 00:14:09 2020-01-02 03:42:30 2020-01-01 00:14:09.000 2020-01-02 03:42:30.000 849 99750 50299.5 5029950 849 99750 50299.5 5029950 -32719 32216 4424.3 442430 -127 124 -1.94 -194 +85 102 10075 99985 0.25525 300.25525 150.25525 15175.78078 0.25525 300.25525 150.25525 15175.78046 0.25525 300.25525 150.25525 15175.78025 2020-01-01 2020-01-02 2020-01-01 00:01:25 2020-01-02 03:46:25 2020-01-01 00:01:25.000 2020-01-02 03:46:25.000 85 99985 50035 5053535 85 99985 50035 5053535 -32484 32451 4614.009900990099 466015 -128 127 -1.5940594059405941 -161 +850 100 10840 99751 2.55255 299.55255 151.05255 15105.25525 2.55255 299.55255 151.05255 15105.25514 2.55255 299.55255 151.05255 15105.25500 2020-01-01 2020-01-02 2020-01-01 00:14:10 2020-01-02 03:42:31 2020-01-01 00:14:10.000 2020-01-02 03:42:31.000 850 99751 50300.5 5030050 850 99751 50300.5 5030050 -32718 32217 4425.3 442530 -126 125 -0.94 -94 +851 100 10841 99752 2.55555 299.55555 151.05555 15105.55555 2.55555 299.55554 151.05555 15105.55547 2.55555 299.55555 151.05555 15105.55500 2020-01-01 2020-01-02 2020-01-01 00:14:11 2020-01-02 03:42:32 2020-01-01 00:14:11.000 2020-01-02 03:42:32.000 851 99752 50301.5 5030150 851 99752 50301.5 5030150 -32717 32218 4426.3 442630 -125 126 0.06 6 +852 100 10842 99753 2.55855 299.55855 151.05855 15105.85585 2.55855 299.55856 151.05856 15105.85607 2.55855 299.55855 151.05855 15105.85500 2020-01-01 2020-01-02 2020-01-01 00:14:12 2020-01-02 03:42:33 2020-01-01 00:14:12.000 2020-01-02 03:42:33.000 852 99753 50302.5 5030250 852 99753 50302.5 5030250 -32716 32219 4427.3 442730 -124 127 1.06 106 +853 100 10843 99754 2.56156 299.56156 151.06156 15106.15615 2.56156 299.56155 151.06155 15106.15571 2.56156 299.56156 151.06156 15106.15600 2020-01-01 2020-01-02 2020-01-01 00:14:13 2020-01-02 03:42:34 2020-01-01 00:14:13.000 2020-01-02 03:42:34.000 853 99754 50303.5 5030350 853 99754 50303.5 5030350 -32715 32220 4428.3 442830 -128 127 -0.5 -50 +854 100 10844 99755 2.56456 299.56456 151.06456 15106.45645 2.56456 299.56458 151.06456 15106.45646 2.56456 299.56456 151.06456 15106.45600 2020-01-01 2020-01-02 2020-01-01 00:14:14 2020-01-02 03:42:35 2020-01-01 00:14:14.000 2020-01-02 03:42:35.000 854 99755 50304.5 5030450 854 99755 50304.5 5030450 -32714 32221 4429.3 442930 -128 123 -2.06 -206 +855 100 10845 99756 2.56756 299.56756 151.06756 15106.75675 2.56756 299.56757 151.06756 15106.75661 2.56756 299.56756 151.06756 15106.75600 2020-01-01 2020-01-02 2020-01-01 00:14:15 2020-01-02 03:42:36 2020-01-01 00:14:15.000 2020-01-02 03:42:36.000 855 99756 50305.5 5030550 855 99756 50305.5 5030550 -32713 32222 4430.3 443030 -127 124 -1.06 -106 +856 100 10846 99757 2.57057 299.57057 151.07057 15107.05705 2.57057 299.57056 151.07056 15107.05694 2.57057 299.57057 151.07057 15107.05700 2020-01-01 2020-01-02 2020-01-01 00:14:16 2020-01-02 03:42:37 2020-01-01 00:14:16.000 2020-01-02 03:42:37.000 856 99757 50306.5 5030650 856 99757 50306.5 5030650 -32712 32223 4431.3 443130 -126 125 -0.06 -6 +857 100 10847 99758 2.57357 299.57357 151.07357 15107.35735 2.57357 299.57358 151.07357 15107.35754 2.57357 299.57357 151.07357 15107.35700 2020-01-01 2020-01-02 2020-01-01 00:14:17 2020-01-02 03:42:38 2020-01-01 00:14:17.000 2020-01-02 03:42:38.000 857 99758 50307.5 5030750 857 99758 50307.5 5030750 -32711 32224 4432.3 443230 -125 126 0.94 94 +858 100 10848 99759 2.57657 299.57657 151.07657 15107.65765 2.57657 299.57657 151.07657 15107.65783 2.57657 299.57657 151.07657 15107.65700 2020-01-01 2020-01-02 2020-01-01 00:14:18 2020-01-02 03:42:39 2020-01-01 00:14:18.000 2020-01-02 03:42:39.000 858 99759 50308.5 5030850 858 99759 50308.5 5030850 -32710 32225 4433.3 443330 -124 127 1.94 194 +859 100 10849 99760 2.57957 299.57957 151.07957 15107.95795 2.57957 299.5796 151.07957 15107.95794 2.57957 299.57957 151.07957 15107.95700 2020-01-01 2020-01-02 2020-01-01 00:14:19 2020-01-02 03:42:40 2020-01-01 00:14:19.000 2020-01-02 03:42:40.000 859 99760 50309.5 5030950 859 99760 50309.5 5030950 -32709 32226 4434.3 443430 -128 127 0.38 38 +86 102 10076 99986 0.25825 300.25825 150.25825 15176.08408 0.25825 300.25827 150.25825 15176.08406 0.25825 300.25825 150.25825 15176.08325 2020-01-01 2020-01-02 2020-01-01 00:01:26 2020-01-02 03:46:26 2020-01-01 00:01:26.000 2020-01-02 03:46:26.000 86 99986 50036 5053636 86 99986 50036 5053636 -32483 32452 4615.009900990099 466116 -128 123 -3.128712871287129 -316 +860 100 10850 99761 2.58258 299.58258 151.08258 15108.25825 2.58258 299.58258 151.08258 15108.25811 2.58258 299.58258 151.08258 15108.25800 2020-01-01 2020-01-02 2020-01-01 00:14:20 2020-01-02 03:42:41 2020-01-01 00:14:20.000 2020-01-02 03:42:41.000 860 99761 50310.5 5031050 860 99761 50310.5 5031050 -32708 32227 4435.3 443530 -128 123 -1.18 -118 +861 100 10851 99762 2.58558 299.58558 151.08558 15108.55855 2.58558 299.58557 151.08558 15108.55841 2.58558 299.58558 151.08558 15108.55800 2020-01-01 2020-01-02 2020-01-01 00:14:21 2020-01-02 03:42:42 2020-01-01 00:14:21.000 2020-01-02 03:42:42.000 861 99762 50311.5 5031150 861 99762 50311.5 5031150 -32707 32228 4436.3 443630 -127 124 -0.18 -18 +862 100 10852 99763 2.58858 299.58858 151.08858 15108.85885 2.58858 299.5886 151.08859 15108.85901 2.58858 299.58858 151.08858 15108.85800 2020-01-01 2020-01-02 2020-01-01 00:14:22 2020-01-02 03:42:43 2020-01-01 00:14:22.000 2020-01-02 03:42:43.000 862 99763 50312.5 5031250 862 99763 50312.5 5031250 -32706 32229 4437.3 443730 -126 125 0.82 82 +863 100 10853 99764 2.59159 299.59159 151.09159 15109.15915 2.59159 299.59158 151.09159 15109.1593 2.59159 299.59159 151.09159 15109.15900 2020-01-01 2020-01-02 2020-01-01 00:14:23 2020-01-02 03:42:44 2020-01-01 00:14:23.000 2020-01-02 03:42:44.000 863 99764 50313.5 5031350 863 99764 50313.5 5031350 -32705 32230 4438.3 443830 -125 126 1.82 182 +864 100 10854 99765 2.59459 299.59459 151.09459 15109.45945 2.59459 299.5946 151.09459 15109.45941 2.59459 299.59459 151.09459 15109.45900 2020-01-01 2020-01-02 2020-01-01 00:14:24 2020-01-02 03:42:45 2020-01-01 00:14:24.000 2020-01-02 03:42:45.000 864 99765 50314.5 5031450 864 99765 50314.5 5031450 -32704 32231 4439.3 443930 -124 127 2.82 282 +865 100 10855 99766 2.59759 299.59759 151.09759 15109.75975 2.59759 299.5976 151.09759 15109.75958 2.59759 299.59759 151.09759 15109.75900 2020-01-01 2020-01-02 2020-01-01 00:14:25 2020-01-02 03:42:46 2020-01-01 00:14:25.000 2020-01-02 03:42:46.000 865 99766 50315.5 5031550 865 99766 50315.5 5031550 -32703 32232 4440.3 444030 -128 127 1.26 126 +866 100 10856 99767 2.6006 299.6006 151.1006 15110.06006 2.6006 299.6006 151.10059 15110.05988 2.60060 299.60060 151.10060 15110.06000 2020-01-01 2020-01-02 2020-01-01 00:14:26 2020-01-02 03:42:47 2020-01-01 00:14:26.000 2020-01-02 03:42:47.000 866 99767 50316.5 5031650 866 99767 50316.5 5031650 -32702 32233 4441.3 444130 -128 127 -0.3 -30 +867 100 10857 99768 2.6036 299.6036 151.1036 15110.36036 2.6036 299.6036 151.1036 15110.36063 2.60360 299.60360 151.10360 15110.36000 2020-01-01 2020-01-02 2020-01-01 00:14:27 2020-01-02 03:42:48 2020-01-01 00:14:27.000 2020-01-02 03:42:48.000 867 99768 50317.5 5031750 867 99768 50317.5 5031750 -32701 32234 4442.3 444230 -128 123 -1.86 -186 +868 100 10858 99769 2.6066 299.6066 151.1066 15110.66066 2.6066 299.6066 151.1066 15110.66078 2.60660 299.60660 151.10660 15110.66000 2020-01-01 2020-01-02 2020-01-01 00:14:28 2020-01-02 03:42:49 2020-01-01 00:14:28.000 2020-01-02 03:42:49.000 868 99769 50318.5 5031850 868 99769 50318.5 5031850 -32700 32235 4443.3 444330 -127 124 -0.86 -86 +869 100 10859 99770 2.6096 299.6096 151.1096 15110.96096 2.6096 299.60962 151.1096 15110.96091 2.60960 299.60960 151.10960 15110.96000 2020-01-01 2020-01-02 2020-01-01 00:14:29 2020-01-02 03:42:50 2020-01-01 00:14:29.000 2020-01-02 03:42:50.000 869 99770 50319.5 5031950 869 99770 50319.5 5031950 -32699 32236 4444.3 444430 -126 125 0.14 14 +87 102 10077 99987 0.26126 300.26126 150.26126 15176.38738 0.26126 300.26126 150.26126 15176.38736 0.26126 300.26126 150.26126 15176.38726 2020-01-01 2020-01-02 2020-01-01 00:01:27 2020-01-02 03:46:27 2020-01-01 00:01:27.000 2020-01-02 03:46:27.000 87 99987 50037 5053737 87 99987 50037 5053737 -32482 32453 4616.009900990099 466217 -127 124 -2.128712871287129 -215 +870 100 10860 99771 2.61261 299.61261 151.11261 15111.26126 2.61261 299.6126 151.11261 15111.26105 2.61261 299.61261 151.11261 15111.26100 2020-01-01 2020-01-02 2020-01-01 00:14:30 2020-01-02 03:42:51 2020-01-01 00:14:30.000 2020-01-02 03:42:51.000 870 99771 50320.5 5032050 870 99771 50320.5 5032050 -32698 32237 4445.3 444530 -125 126 1.14 114 +871 100 10861 99772 2.61561 299.61561 151.11561 15111.56156 2.61561 299.6156 151.11561 15111.56135 2.61561 299.61561 151.11561 15111.56100 2020-01-01 2020-01-02 2020-01-01 00:14:31 2020-01-02 03:42:52 2020-01-01 00:14:31.000 2020-01-02 03:42:52.000 871 99772 50321.5 5032150 871 99772 50321.5 5032150 -32697 32238 4446.3 444630 -124 127 2.14 214 +872 100 10862 99773 2.61861 299.61861 151.11861 15111.86186 2.61861 299.61862 151.11862 15111.8621 2.61861 299.61861 151.11861 15111.86100 2020-01-01 2020-01-02 2020-01-01 00:14:32 2020-01-02 03:42:53 2020-01-01 00:14:32.000 2020-01-02 03:42:53.000 872 99773 50322.5 5032250 872 99773 50322.5 5032250 -32696 32239 4447.3 444730 -128 127 0.58 58 +873 100 10863 99774 2.62162 299.62162 151.12162 15112.16216 2.62162 299.6216 151.12162 15112.16224 2.62162 299.62162 151.12162 15112.16200 2020-01-01 2020-01-02 2020-01-01 00:14:33 2020-01-02 03:42:54 2020-01-01 00:14:33.000 2020-01-02 03:42:54.000 873 99774 50323.5 5032350 873 99774 50323.5 5032350 -32695 32240 4448.3 444830 -128 123 -0.98 -98 +874 100 10864 99775 2.62462 299.62462 151.12462 15112.46246 2.62462 299.62463 151.12462 15112.46238 2.62462 299.62462 151.12462 15112.46200 2020-01-01 2020-01-02 2020-01-01 00:14:34 2020-01-02 03:42:55 2020-01-01 00:14:34.000 2020-01-02 03:42:55.000 874 99775 50324.5 5032450 874 99775 50324.5 5032450 -32694 32241 4449.3 444930 -127 124 0.02 2 +875 100 10865 99776 2.62762 299.62762 151.12762 15112.76276 2.62762 299.62762 151.12762 15112.76252 2.62762 299.62762 151.12762 15112.76200 2020-01-01 2020-01-02 2020-01-01 00:14:35 2020-01-02 03:42:56 2020-01-01 00:14:35.000 2020-01-02 03:42:56.000 875 99776 50325.5 5032550 875 99776 50325.5 5032550 -32693 32242 4450.3 445030 -126 125 1.02 102 +876 100 10866 99777 2.63063 299.63063 151.13063 15113.06306 2.63063 299.63065 151.13063 15113.06327 2.63063 299.63063 151.13063 15113.06300 2020-01-01 2020-01-02 2020-01-01 00:14:36 2020-01-02 03:42:57 2020-01-01 00:14:36.000 2020-01-02 03:42:57.000 876 99777 50326.5 5032650 876 99777 50326.5 5032650 -32692 32243 4451.3 445130 -125 126 2.02 202 +877 100 10867 99778 2.63363 299.63363 151.13363 15113.36336 2.63363 299.63364 151.13363 15113.36358 2.63363 299.63363 151.13363 15113.36300 2020-01-01 2020-01-02 2020-01-01 00:14:37 2020-01-02 03:42:58 2020-01-01 00:14:37.000 2020-01-02 03:42:58.000 877 99778 50327.5 5032750 877 99778 50327.5 5032750 -32691 32244 4452.3 445230 -124 127 3.02 302 +878 100 10868 99779 2.63663 299.63663 151.13663 15113.66366 2.63663 299.63663 151.13663 15113.66371 2.63663 299.63663 151.13663 15113.66300 2020-01-01 2020-01-02 2020-01-01 00:14:38 2020-01-02 03:42:59 2020-01-01 00:14:38.000 2020-01-02 03:42:59.000 878 99779 50328.5 5032850 878 99779 50328.5 5032850 -32690 32245 4453.3 445330 -128 127 1.46 146 +879 100 10869 99780 2.63963 299.63963 151.13963 15113.96396 2.63963 299.63965 151.13963 15113.96385 2.63963 299.63963 151.13963 15113.96300 2020-01-01 2020-01-02 2020-01-01 00:14:39 2020-01-02 03:43:00 2020-01-01 00:14:39.000 2020-01-02 03:43:00.000 879 99780 50329.5 5032950 879 99780 50329.5 5032950 -32689 32246 4454.3 445430 -128 123 -0.1 -10 +88 102 10078 99988 0.26426 300.26426 150.26426 15176.69069 0.26426 300.26425 150.26426 15176.69066 0.26426 300.26426 150.26426 15176.69026 2020-01-01 2020-01-02 2020-01-01 00:01:28 2020-01-02 03:46:28 2020-01-01 00:01:28.000 2020-01-02 03:46:28.000 88 99988 50038 5053838 88 99988 50038 5053838 -32481 32454 4617.009900990099 466318 -126 125 -1.1287128712871286 -114 +880 100 10870 99781 2.64264 299.64264 151.14264 15114.26426 2.64264 299.64264 151.14263 15114.26399 2.64264 299.64264 151.14264 15114.26400 2020-01-01 2020-01-02 2020-01-01 00:14:40 2020-01-02 03:43:01 2020-01-01 00:14:40.000 2020-01-02 03:43:01.000 880 99781 50330.5 5033050 880 99781 50330.5 5033050 -32688 32247 4455.3 445530 -127 124 0.9 90 +881 100 10871 99782 2.64564 299.64564 151.14564 15114.56456 2.64564 299.64566 151.14564 15114.56474 2.64564 299.64564 151.14564 15114.56400 2020-01-01 2020-01-02 2020-01-01 00:14:41 2020-01-02 03:43:02 2020-01-01 00:14:41.000 2020-01-02 03:43:02.000 881 99782 50331.5 5033150 881 99782 50331.5 5033150 -32687 32248 4456.3 445630 -126 125 1.9 190 +882 100 10872 99783 2.64864 299.64864 151.14864 15114.86486 2.64864 299.64865 151.14865 15114.86504 2.64864 299.64864 151.14864 15114.86400 2020-01-01 2020-01-02 2020-01-01 00:14:42 2020-01-02 03:43:03 2020-01-01 00:14:42.000 2020-01-02 03:43:03.000 882 99783 50332.5 5033250 882 99783 50332.5 5033250 -32686 32249 4457.3 445730 -125 126 2.9 290 +883 100 10873 99784 2.65165 299.65165 151.15165 15115.16516 2.65165 299.65164 151.15165 15115.16522 2.65165 299.65165 151.15165 15115.16500 2020-01-01 2020-01-02 2020-01-01 00:14:43 2020-01-02 03:43:04 2020-01-01 00:14:43.000 2020-01-02 03:43:04.000 883 99784 50333.5 5033350 883 99784 50333.5 5033350 -32685 32250 4458.3 445830 -124 127 3.9 390 +884 100 10874 99785 2.65465 299.65465 151.15465 15115.46546 2.65465 299.65466 151.15465 15115.46532 2.65465 299.65465 151.15465 15115.46500 2020-01-01 2020-01-02 2020-01-01 00:14:44 2020-01-02 03:43:05 2020-01-01 00:14:44.000 2020-01-02 03:43:05.000 884 99785 50334.5 5033450 884 99785 50334.5 5033450 -32684 32251 4459.3 445930 -128 127 2.34 234 +885 100 10875 99786 2.65765 299.65765 151.15765 15115.76576 2.65765 299.65765 151.15765 15115.76562 2.65765 299.65765 151.15765 15115.76500 2020-01-01 2020-01-02 2020-01-01 00:14:45 2020-01-02 03:43:06 2020-01-01 00:14:45.000 2020-01-02 03:43:06.000 885 99786 50335.5 5033550 885 99786 50335.5 5033550 -32683 32252 4460.3 446030 -128 123 0.78 78 +886 100 10876 99787 2.66066 299.66066 151.16066 15116.06606 2.66066 299.66068 151.16066 15116.06621 2.66066 299.66066 151.16066 15116.06600 2020-01-01 2020-01-02 2020-01-01 00:14:46 2020-01-02 03:43:07 2020-01-01 00:14:46.000 2020-01-02 03:43:07.000 886 99787 50336.5 5033650 886 99787 50336.5 5033650 -32682 32253 4461.3 446130 -127 124 1.78 178 +887 100 10877 99788 2.66366 299.66366 151.16366 15116.36636 2.66366 299.66367 151.16366 15116.36651 2.66366 299.66366 151.16366 15116.36600 2020-01-01 2020-01-02 2020-01-01 00:14:47 2020-01-02 03:43:08 2020-01-01 00:14:47.000 2020-01-02 03:43:08.000 887 99788 50337.5 5033750 887 99788 50337.5 5033750 -32681 32254 4462.3 446230 -126 125 2.78 278 +888 100 10878 99789 2.66666 299.66666 151.16666 15116.66666 2.66666 299.66666 151.16666 15116.66669 2.66666 299.66666 151.16666 15116.66600 2020-01-01 2020-01-02 2020-01-01 00:14:48 2020-01-02 03:43:09 2020-01-01 00:14:48.000 2020-01-02 03:43:09.000 888 99789 50338.5 5033850 888 99789 50338.5 5033850 -32680 32255 4463.3 446330 -125 126 3.78 378 +889 100 10879 99790 2.66966 299.66966 151.16966 15116.96696 2.66966 299.66968 151.16966 15116.96679 2.66966 299.66966 151.16966 15116.96600 2020-01-01 2020-01-02 2020-01-01 00:14:49 2020-01-02 03:43:10 2020-01-01 00:14:49.000 2020-01-02 03:43:10.000 889 99790 50339.5 5033950 889 99790 50339.5 5033950 -32679 32256 4464.3 446430 -124 127 4.78 478 +89 102 10079 99989 0.26726 300.26726 150.26726 15176.99399 0.26726 300.26727 150.26727 15176.9943 0.26726 300.26726 150.26726 15176.99326 2020-01-01 2020-01-02 2020-01-01 00:01:29 2020-01-02 03:46:29 2020-01-01 00:01:29.000 2020-01-02 03:46:29.000 89 99989 50039 5053939 89 99989 50039 5053939 -32480 32455 4618.009900990099 466419 -125 126 -0.12871287128712872 -13 +890 100 10880 99791 2.67267 299.67267 151.17267 15117.26726 2.67267 299.67267 151.17267 15117.26708 2.67267 299.67267 151.17267 15117.26700 2020-01-01 2020-01-02 2020-01-01 00:14:50 2020-01-02 03:43:11 2020-01-01 00:14:50.000 2020-01-02 03:43:11.000 890 99791 50340.5 5034050 890 99791 50340.5 5034050 -32678 32257 4465.3 446530 -128 127 3.22 322 +891 100 10881 99792 2.67567 299.67567 151.17567 15117.56756 2.67567 299.6757 151.17567 15117.56768 2.67567 299.67567 151.17567 15117.56700 2020-01-01 2020-01-02 2020-01-01 00:14:51 2020-01-02 03:43:12 2020-01-01 00:14:51.000 2020-01-02 03:43:12.000 891 99792 50341.5 5034150 891 99792 50341.5 5034150 -32677 32258 4466.3 446630 -128 127 1.66 166 +892 100 10882 99793 2.67867 299.67867 151.17867 15117.86786 2.67867 299.67868 151.17868 15117.86802 2.67867 299.67867 151.17867 15117.86700 2020-01-01 2020-01-02 2020-01-01 00:14:52 2020-01-02 03:43:13 2020-01-01 00:14:52.000 2020-01-02 03:43:13.000 892 99793 50342.5 5034250 892 99793 50342.5 5034250 -32676 32259 4467.3 446730 -128 124 0.1 10 +893 100 10883 99794 2.68168 299.68168 151.18168 15118.16816 2.68168 299.68167 151.18168 15118.16816 2.68168 299.68168 151.18168 15118.16800 2020-01-01 2020-01-02 2020-01-01 00:14:53 2020-01-02 03:43:14 2020-01-01 00:14:53.000 2020-01-02 03:43:14.000 893 99794 50343.5 5034350 893 99794 50343.5 5034350 -32675 32260 4468.3 446830 -127 125 1.1 110 +894 100 10884 99795 2.68468 299.68468 151.18468 15118.46846 2.68468 299.6847 151.18468 15118.46826 2.68468 299.68468 151.18468 15118.46800 2020-01-01 2020-01-02 2020-01-01 00:14:54 2020-01-02 03:43:15 2020-01-01 00:14:54.000 2020-01-02 03:43:15.000 894 99795 50344.5 5034450 894 99795 50344.5 5034450 -32674 32261 4469.3 446930 -126 126 2.1 210 +895 100 10885 99796 2.68768 299.68768 151.18768 15118.76876 2.68768 299.68768 151.18768 15118.76855 2.68768 299.68768 151.18768 15118.76800 2020-01-01 2020-01-02 2020-01-01 00:14:55 2020-01-02 03:43:16 2020-01-01 00:14:55.000 2020-01-02 03:43:16.000 895 99796 50345.5 5034550 895 99796 50345.5 5034550 -32673 32262 4470.3 447030 -125 127 3.1 310 +896 100 10886 99797 2.69069 299.69069 151.19069 15119.06906 2.69069 299.6907 151.19069 15119.06915 2.69069 299.69069 151.19069 15119.06900 2020-01-01 2020-01-02 2020-01-01 00:14:56 2020-01-02 03:43:17 2020-01-01 00:14:56.000 2020-01-02 03:43:17.000 896 99797 50346.5 5034650 896 99797 50346.5 5034650 -32672 32263 4471.3 447130 -128 127 1.54 154 +897 100 10887 99798 2.69369 299.69369 151.19369 15119.36936 2.69369 299.6937 151.19369 15119.36949 2.69369 299.69369 151.19369 15119.36900 2020-01-01 2020-01-02 2020-01-01 00:14:57 2020-01-02 03:43:18 2020-01-01 00:14:57.000 2020-01-02 03:43:18.000 897 99798 50347.5 5034750 897 99798 50347.5 5034750 -32671 32264 4472.3 447230 -128 127 -0.02 -2 +898 100 10888 99799 2.69669 299.69669 151.19669 15119.66966 2.69669 299.6967 151.19669 15119.66963 2.69669 299.69669 151.19669 15119.66900 2020-01-01 2020-01-02 2020-01-01 00:14:58 2020-01-02 03:43:19 2020-01-01 00:14:58.000 2020-01-02 03:43:19.000 898 99799 50348.5 5034850 898 99799 50348.5 5034850 -32670 32265 4473.3 447330 -128 123 -1.58 -158 +899 100 10889 99800 2.69969 299.69969 151.19969 15119.96996 2.69969 299.6997 151.1997 15119.97038 2.69969 299.69969 151.19969 15119.96900 2020-01-01 2020-01-02 2020-01-01 00:14:59 2020-01-02 03:43:20 2020-01-01 00:14:59.000 2020-01-02 03:43:20.000 899 99800 50349.5 5034950 899 99800 50349.5 5034950 -32669 32266 4474.3 447430 -127 124 -0.58 -58 +9 102 1008 9999 0.02702 300.02702 150.02702 15152.72972 0.02702 300.02704 150.02702 15152.72966 0.02702 300.02702 150.02702 15152.72902 2020-01-01 2020-01-02 2020-01-01 00:00:09 2020-01-02 03:45:09 2020-01-01 00:00:09.000 2020-01-02 03:45:09.000 9 99909 49959 5045859 9 99909 49959 5045859 -32560 32375 4538.009900990099 458339 -124 127 0.9801980198019802 99 +90 102 10080 99990 0.27027 300.27027 150.27027 15177.29729 0.27027 300.27026 150.27026 15177.29694 0.27027 300.27027 150.27027 15177.29727 2020-01-01 2020-01-02 2020-01-01 00:01:30 2020-01-02 03:46:30 2020-01-01 00:01:30.000 2020-01-02 03:46:30.000 90 99990 50040 5054040 90 99990 50040 5054040 -32479 32456 4619.009900990099 466520 -124 127 0.8712871287128713 88 +900 100 10890 99801 2.7027 299.7027 151.2027 15120.27027 2.7027 299.7027 151.2027 15120.27003 2.70270 299.70270 151.20270 15120.27000 2020-01-01 2020-01-02 2020-01-01 00:15:00 2020-01-02 03:43:21 2020-01-01 00:15:00.000 2020-01-02 03:43:21.000 900 99801 50350.5 5035050 900 99801 50350.5 5035050 -32668 32267 4475.3 447530 -126 125 0.42 42 +901 100 10891 99802 2.7057 299.7057 151.2057 15120.57057 2.7057 299.70572 151.2057 15120.57066 2.70570 299.70570 151.20570 15120.57000 2020-01-01 2020-01-02 2020-01-01 00:15:01 2020-01-02 03:43:22 2020-01-01 00:15:01.000 2020-01-02 03:43:22.000 901 99802 50351.5 5035150 901 99802 50351.5 5035150 -32667 32268 4476.3 447630 -125 126 1.42 142 +902 100 10892 99803 2.7087 299.7087 151.2087 15120.87087 2.7087 299.7087 151.2087 15120.87095 2.70870 299.70870 151.20870 15120.87000 2020-01-01 2020-01-02 2020-01-01 00:15:02 2020-01-02 03:43:23 2020-01-01 00:15:02.000 2020-01-02 03:43:23.000 902 99803 50352.5 5035250 902 99803 50352.5 5035250 -32666 32269 4477.3 447730 -124 127 2.42 242 +903 100 10893 99804 2.71171 299.71171 151.21171 15121.17117 2.71171 299.7117 151.21171 15121.1711 2.71171 299.71171 151.21171 15121.17100 2020-01-01 2020-01-02 2020-01-01 00:15:03 2020-01-02 03:43:24 2020-01-01 00:15:03.000 2020-01-02 03:43:24.000 903 99804 50353.5 5035350 903 99804 50353.5 5035350 -32665 32270 4478.3 447830 -128 127 0.86 86 +904 100 10894 99805 2.71471 299.71471 151.21471 15121.47147 2.71471 299.71472 151.21471 15121.47185 2.71471 299.71471 151.21471 15121.47100 2020-01-01 2020-01-02 2020-01-01 00:15:04 2020-01-02 03:43:25 2020-01-01 00:15:04.000 2020-01-02 03:43:25.000 904 99805 50354.5 5035450 904 99805 50354.5 5035450 -32664 32271 4479.3 447930 -128 123 -0.7 -70 +905 100 10895 99806 2.71771 299.71771 151.21771 15121.77177 2.71771 299.7177 151.21771 15121.77149 2.71771 299.71771 151.21771 15121.77100 2020-01-01 2020-01-02 2020-01-01 00:15:05 2020-01-02 03:43:26 2020-01-01 00:15:05.000 2020-01-02 03:43:26.000 905 99806 50355.5 5035550 905 99806 50355.5 5035550 -32663 32272 4480.3 448030 -127 124 0.3 30 +906 100 10896 99807 2.72072 299.72072 151.22072 15122.07207 2.72072 299.72073 151.22072 15122.07212 2.72072 299.72072 151.22072 15122.07200 2020-01-01 2020-01-02 2020-01-01 00:15:06 2020-01-02 03:43:27 2020-01-01 00:15:06.000 2020-01-02 03:43:27.000 906 99807 50356.5 5035650 906 99807 50356.5 5035650 -32662 32273 4481.3 448130 -126 125 1.3 130 +907 100 10897 99808 2.72372 299.72372 151.22372 15122.37237 2.72372 299.72372 151.22372 15122.37243 2.72372 299.72372 151.22372 15122.37200 2020-01-01 2020-01-02 2020-01-01 00:15:07 2020-01-02 03:43:28 2020-01-01 00:15:07.000 2020-01-02 03:43:28.000 907 99808 50357.5 5035750 907 99808 50357.5 5035750 -32661 32274 4482.3 448230 -125 126 2.3 230 +908 100 10898 99809 2.72672 299.72672 151.22672 15122.67267 2.72672 299.7267 151.22672 15122.67272 2.72672 299.72672 151.22672 15122.67200 2020-01-01 2020-01-02 2020-01-01 00:15:08 2020-01-02 03:43:29 2020-01-01 00:15:08.000 2020-01-02 03:43:29.000 908 99809 50358.5 5035850 908 99809 50358.5 5035850 -32660 32275 4483.3 448330 -124 127 3.3 330 +909 100 10899 99810 2.72972 299.72972 151.22972 15122.97297 2.72972 299.72974 151.22973 15122.97332 2.72972 299.72972 151.22972 15122.97200 2020-01-01 2020-01-02 2020-01-01 00:15:09 2020-01-02 03:43:30 2020-01-01 00:15:09.000 2020-01-02 03:43:30.000 909 99810 50359.5 5035950 909 99810 50359.5 5035950 -32659 32276 4484.3 448430 -128 127 1.74 174 +91 102 10081 99991 0.27327 300.27327 150.27327 15177.6006 0.27327 300.2733 150.27327 15177.60054 0.27327 300.27327 150.27327 15177.60027 2020-01-01 2020-01-02 2020-01-01 00:01:31 2020-01-02 03:46:31 2020-01-01 00:01:31.000 2020-01-02 03:46:31.000 91 99991 50041 5054141 91 99991 50041 5054141 -32478 32457 4620.009900990099 466621 -128 127 -0.6633663366336634 -67 +910 100 10900 99811 2.73273 299.73273 151.23273 15123.27327 2.73273 299.73273 151.23272 15123.27296 2.73273 299.73273 151.23273 15123.27300 2020-01-01 2020-01-02 2020-01-01 00:15:10 2020-01-02 03:43:31 2020-01-01 00:15:10.000 2020-01-02 03:43:31.000 910 99811 50360.5 5036050 910 99811 50360.5 5036050 -32658 32277 4485.3 448530 -128 123 0.18 18 +911 100 10901 99812 2.73573 299.73573 151.23573 15123.57357 2.73573 299.73575 151.23573 15123.57359 2.73573 299.73573 151.23573 15123.57300 2020-01-01 2020-01-02 2020-01-01 00:15:11 2020-01-02 03:43:32 2020-01-01 00:15:11.000 2020-01-02 03:43:32.000 911 99812 50361.5 5036150 911 99812 50361.5 5036150 -32657 32278 4486.3 448630 -127 124 1.18 118 +912 100 10902 99813 2.73873 299.73873 151.23873 15123.87387 2.73873 299.73874 151.23873 15123.8739 2.73873 299.73873 151.23873 15123.87300 2020-01-01 2020-01-02 2020-01-01 00:15:12 2020-01-02 03:43:33 2020-01-01 00:15:12.000 2020-01-02 03:43:33.000 912 99813 50362.5 5036250 912 99813 50362.5 5036250 -32656 32279 4487.3 448730 -126 125 2.18 218 +913 100 10903 99814 2.74174 299.74174 151.24174 15124.17417 2.74174 299.74173 151.24174 15124.17419 2.74174 299.74174 151.24174 15124.17400 2020-01-01 2020-01-02 2020-01-01 00:15:13 2020-01-02 03:43:34 2020-01-01 00:15:13.000 2020-01-02 03:43:34.000 913 99814 50363.5 5036350 913 99814 50363.5 5036350 -32655 32280 4488.3 448830 -125 126 3.18 318 +914 100 10904 99815 2.74474 299.74474 151.24474 15124.47447 2.74474 299.74475 151.24474 15124.47479 2.74474 299.74474 151.24474 15124.47400 2020-01-01 2020-01-02 2020-01-01 00:15:14 2020-01-02 03:43:35 2020-01-01 00:15:14.000 2020-01-02 03:43:35.000 914 99815 50364.5 5036450 914 99815 50364.5 5036450 -32654 32281 4489.3 448930 -124 127 4.18 418 +915 100 10905 99816 2.74774 299.74774 151.24774 15124.77477 2.74774 299.74774 151.24774 15124.77447 2.74774 299.74774 151.24774 15124.77400 2020-01-01 2020-01-02 2020-01-01 00:15:15 2020-01-02 03:43:36 2020-01-01 00:15:15.000 2020-01-02 03:43:36.000 915 99816 50365.5 5036550 915 99816 50365.5 5036550 -32653 32282 4490.3 449030 -128 127 2.62 262 +916 100 10906 99817 2.75075 299.75075 151.25075 15125.07507 2.75075 299.75076 151.25075 15125.07507 2.75075 299.75075 151.25075 15125.07500 2020-01-01 2020-01-02 2020-01-01 00:15:16 2020-01-02 03:43:37 2020-01-01 00:15:16.000 2020-01-02 03:43:37.000 916 99817 50366.5 5036650 916 99817 50366.5 5036650 -32652 32283 4491.3 449130 -128 127 1.06 106 +917 100 10907 99818 2.75375 299.75375 151.25375 15125.37537 2.75375 299.75375 151.25375 15125.37536 2.75375 299.75375 151.25375 15125.37500 2020-01-01 2020-01-02 2020-01-01 00:15:17 2020-01-02 03:43:38 2020-01-01 00:15:17.000 2020-01-02 03:43:38.000 917 99818 50367.5 5036750 917 99818 50367.5 5036750 -32651 32284 4492.3 449230 -128 124 -0.5 -50 +918 100 10908 99819 2.75675 299.75675 151.25675 15125.67567 2.75675 299.75674 151.25675 15125.67566 2.75675 299.75675 151.25675 15125.67500 2020-01-01 2020-01-02 2020-01-01 00:15:18 2020-01-02 03:43:39 2020-01-01 00:15:18.000 2020-01-02 03:43:39.000 918 99819 50368.5 5036850 918 99819 50368.5 5036850 -32650 32285 4493.3 449330 -127 125 0.5 50 +919 100 10909 99820 2.75975 299.75975 151.25975 15125.97597 2.75975 299.75977 151.25976 15125.97626 2.75975 299.75975 151.25975 15125.97500 2020-01-01 2020-01-02 2020-01-01 00:15:19 2020-01-02 03:43:40 2020-01-01 00:15:19.000 2020-01-02 03:43:40.000 919 99820 50369.5 5036950 919 99820 50369.5 5036950 -32649 32286 4494.3 449430 -126 126 1.5 150 +92 102 10082 99992 0.27627 300.27627 150.27627 15177.9039 0.27627 300.27628 150.27627 15177.90384 0.27627 300.27627 150.27627 15177.90327 2020-01-01 2020-01-02 2020-01-01 00:01:32 2020-01-02 03:46:32 2020-01-01 00:01:32.000 2020-01-02 03:46:32.000 92 99992 50042 5054242 92 99992 50042 5054242 -32477 32458 4621.009900990099 466722 -128 123 -2.198019801980198 -222 +920 100 10910 99821 2.76276 299.76276 151.26276 15126.27627 2.76276 299.76276 151.26275 15126.27594 2.76276 299.76276 151.26276 15126.27600 2020-01-01 2020-01-02 2020-01-01 00:15:20 2020-01-02 03:43:41 2020-01-01 00:15:20.000 2020-01-02 03:43:41.000 920 99821 50370.5 5037050 920 99821 50370.5 5037050 -32648 32287 4495.3 449530 -125 127 2.5 250 +921 100 10911 99822 2.76576 299.76576 151.26576 15126.57657 2.76576 299.76578 151.26576 15126.57654 2.76576 299.76576 151.26576 15126.57600 2020-01-01 2020-01-02 2020-01-01 00:15:21 2020-01-02 03:43:42 2020-01-01 00:15:21.000 2020-01-02 03:43:42.000 921 99822 50371.5 5037150 921 99822 50371.5 5037150 -32647 32288 4496.3 449630 -128 127 0.94 94 +922 100 10912 99823 2.76876 299.76876 151.26876 15126.87687 2.76876 299.76877 151.26876 15126.87683 2.76876 299.76876 151.26876 15126.87600 2020-01-01 2020-01-02 2020-01-01 00:15:22 2020-01-02 03:43:43 2020-01-01 00:15:22.000 2020-01-02 03:43:43.000 922 99823 50372.5 5037250 922 99823 50372.5 5037250 -32646 32289 4497.3 449730 -128 127 -0.62 -62 +923 100 10913 99824 2.77177 299.77177 151.27177 15127.17717 2.77177 299.77176 151.27177 15127.17713 2.77177 299.77177 151.27177 15127.17700 2020-01-01 2020-01-02 2020-01-01 00:15:23 2020-01-02 03:43:44 2020-01-01 00:15:23.000 2020-01-02 03:43:44.000 923 99824 50373.5 5037350 923 99824 50373.5 5037350 -32645 32290 4498.3 449830 -128 123 -2.18 -218 +924 100 10914 99825 2.77477 299.77477 151.27477 15127.47747 2.77477 299.77478 151.27477 15127.47776 2.77477 299.77477 151.27477 15127.47700 2020-01-01 2020-01-02 2020-01-01 00:15:24 2020-01-02 03:43:45 2020-01-01 00:15:24.000 2020-01-02 03:43:45.000 924 99825 50374.5 5037450 924 99825 50374.5 5037450 -32644 32291 4499.3 449930 -127 124 -1.18 -118 +925 100 10915 99826 2.77777 299.77777 151.27777 15127.77777 2.77777 299.77777 151.27777 15127.77741 2.77777 299.77777 151.27777 15127.77700 2020-01-01 2020-01-02 2020-01-01 00:15:25 2020-01-02 03:43:46 2020-01-01 00:15:25.000 2020-01-02 03:43:46.000 925 99826 50375.5 5037550 925 99826 50375.5 5037550 -32643 32292 4500.3 450030 -126 125 -0.18 -18 +926 100 10916 99827 2.78078 299.78078 151.28078 15128.07807 2.78078 299.7808 151.28078 15128.078 2.78078 299.78078 151.28078 15128.07800 2020-01-01 2020-01-02 2020-01-01 00:15:26 2020-01-02 03:43:47 2020-01-01 00:15:26.000 2020-01-02 03:43:47.000 926 99827 50376.5 5037650 926 99827 50376.5 5037650 -32642 32293 4501.3 450130 -125 126 0.82 82 +927 100 10917 99828 2.78378 299.78378 151.28378 15128.37837 2.78378 299.78378 151.28378 15128.3783 2.78378 299.78378 151.28378 15128.37800 2020-01-01 2020-01-02 2020-01-01 00:15:27 2020-01-02 03:43:48 2020-01-01 00:15:27.000 2020-01-02 03:43:48.000 927 99828 50377.5 5037750 927 99828 50377.5 5037750 -32641 32294 4502.3 450230 -124 127 1.82 182 +928 100 10918 99829 2.78678 299.78678 151.28678 15128.67867 2.78678 299.78677 151.28678 15128.6786 2.78678 299.78678 151.28678 15128.67800 2020-01-01 2020-01-02 2020-01-01 00:15:28 2020-01-02 03:43:49 2020-01-01 00:15:28.000 2020-01-02 03:43:49.000 928 99829 50378.5 5037850 928 99829 50378.5 5037850 -32640 32295 4503.3 450330 -128 127 0.26 26 +929 100 10919 99830 2.78978 299.78978 151.28978 15128.97897 2.78978 299.7898 151.28979 15128.97923 2.78978 299.78978 151.28978 15128.97800 2020-01-01 2020-01-02 2020-01-01 00:15:29 2020-01-02 03:43:50 2020-01-01 00:15:29.000 2020-01-02 03:43:50.000 929 99830 50379.5 5037950 929 99830 50379.5 5037950 -32639 32296 4504.3 450430 -128 123 -1.3 -130 +93 102 10083 99993 0.27927 300.27927 150.27927 15178.2072 0.27927 300.27927 150.27927 15178.20715 0.27927 300.27927 150.27927 15178.20627 2020-01-01 2020-01-02 2020-01-01 00:01:33 2020-01-02 03:46:33 2020-01-01 00:01:33.000 2020-01-02 03:46:33.000 93 99993 50043 5054343 93 99993 50043 5054343 -32476 32459 4622.009900990099 466823 -127 124 -1.198019801980198 -121 +930 100 10920 99831 2.79279 299.79279 151.29279 15129.27927 2.79279 299.7928 151.29278 15129.27888 2.79279 299.79279 151.29279 15129.27900 2020-01-01 2020-01-02 2020-01-01 00:15:30 2020-01-02 03:43:51 2020-01-01 00:15:30.000 2020-01-02 03:43:51.000 930 99831 50380.5 5038050 930 99831 50380.5 5038050 -32638 32297 4505.3 450530 -127 124 -0.3 -30 +931 100 10921 99832 2.79579 299.79579 151.29579 15129.57957 2.79579 299.7958 151.29579 15129.57963 2.79579 299.79579 151.29579 15129.57900 2020-01-01 2020-01-02 2020-01-01 00:15:31 2020-01-02 03:43:52 2020-01-01 00:15:31.000 2020-01-02 03:43:52.000 931 99832 50381.5 5038150 931 99832 50381.5 5038150 -32637 32298 4506.3 450630 -126 125 0.7 70 +932 100 10922 99833 2.79879 299.79879 151.29879 15129.87987 2.79879 299.7988 151.29879 15129.87977 2.79879 299.79879 151.29879 15129.87900 2020-01-01 2020-01-02 2020-01-01 00:15:32 2020-01-02 03:43:53 2020-01-01 00:15:32.000 2020-01-02 03:43:53.000 932 99833 50382.5 5038250 932 99833 50382.5 5038250 -32636 32299 4507.3 450730 -125 126 1.7 170 +933 100 10923 99834 2.8018 299.8018 151.3018 15130.18018 2.8018 299.8018 151.3018 15130.18011 2.80180 299.80180 151.30180 15130.18000 2020-01-01 2020-01-02 2020-01-01 00:15:33 2020-01-02 03:43:54 2020-01-01 00:15:33.000 2020-01-02 03:43:54.000 933 99834 50383.5 5038350 933 99834 50383.5 5038350 -32635 32300 4508.3 450830 -124 127 2.7 270 +934 100 10924 99835 2.8048 299.8048 151.3048 15130.48048 2.8048 299.8048 151.3048 15130.48071 2.80480 299.80480 151.30480 15130.48000 2020-01-01 2020-01-02 2020-01-01 00:15:34 2020-01-02 03:43:55 2020-01-01 00:15:34.000 2020-01-02 03:43:55.000 934 99835 50384.5 5038450 934 99835 50384.5 5038450 -32634 32301 4509.3 450930 -128 127 1.14 114 +935 100 10925 99836 2.8078 299.8078 151.3078 15130.78078 2.8078 299.8078 151.3078 15130.78034 2.80780 299.80780 151.30780 15130.78000 2020-01-01 2020-01-02 2020-01-01 00:15:35 2020-01-02 03:43:56 2020-01-01 00:15:35.000 2020-01-02 03:43:56.000 935 99836 50385.5 5038550 935 99836 50385.5 5038550 -32633 32302 4510.3 451030 -128 123 -0.42 -42 +936 100 10926 99837 2.81081 299.81081 151.31081 15131.08108 2.81081 299.81082 151.31081 15131.0811 2.81081 299.81081 151.31081 15131.08100 2020-01-01 2020-01-02 2020-01-01 00:15:36 2020-01-02 03:43:57 2020-01-01 00:15:36.000 2020-01-02 03:43:57.000 936 99837 50386.5 5038650 936 99837 50386.5 5038650 -32632 32303 4511.3 451130 -127 124 0.58 58 +937 100 10927 99838 2.81381 299.81381 151.31381 15131.38138 2.81381 299.8138 151.31381 15131.38124 2.81381 299.81381 151.31381 15131.38100 2020-01-01 2020-01-02 2020-01-01 00:15:37 2020-01-02 03:43:58 2020-01-01 00:15:37.000 2020-01-02 03:43:58.000 937 99838 50387.5 5038750 937 99838 50387.5 5038750 -32631 32304 4512.3 451230 -126 125 1.58 158 +938 100 10928 99839 2.81681 299.81681 151.31681 15131.68168 2.81681 299.8168 151.31681 15131.68157 2.81681 299.81681 151.31681 15131.68100 2020-01-01 2020-01-02 2020-01-01 00:15:38 2020-01-02 03:43:59 2020-01-01 00:15:38.000 2020-01-02 03:43:59.000 938 99839 50388.5 5038850 938 99839 50388.5 5038850 -32630 32305 4513.3 451330 -125 126 2.58 258 +939 100 10929 99840 2.81981 299.81981 151.31981 15131.98198 2.81982 299.81982 151.31982 15131.98217 2.81981 299.81981 151.31981 15131.98100 2020-01-01 2020-01-02 2020-01-01 00:15:39 2020-01-02 03:44:00 2020-01-01 00:15:39.000 2020-01-02 03:44:00.000 939 99840 50389.5 5038950 939 99840 50389.5 5038950 -32629 32306 4514.3 451430 -124 127 3.58 358 +94 102 10084 99994 0.28228 300.28228 150.28228 15178.51051 0.28228 300.2823 150.28228 15178.51078 0.28228 300.28228 150.28228 15178.51028 2020-01-01 2020-01-02 2020-01-01 00:01:34 2020-01-02 03:46:34 2020-01-01 00:01:34.000 2020-01-02 03:46:34.000 94 99994 50044 5054444 94 99994 50044 5054444 -32475 32460 4623.009900990099 466924 -126 125 -0.19801980198019803 -20 +940 100 10930 99841 2.82282 299.82282 151.32282 15132.28228 2.82282 299.8228 151.32282 15132.28247 2.82282 299.82282 151.32282 15132.28200 2020-01-01 2020-01-02 2020-01-01 00:15:40 2020-01-02 03:44:01 2020-01-01 00:15:40.000 2020-01-02 03:44:01.000 940 99841 50390.5 5039050 940 99841 50390.5 5039050 -32628 32307 4515.3 451530 -128 127 2.02 202 +941 100 10931 99842 2.82582 299.82582 151.32582 15132.58258 2.82582 299.82584 151.32582 15132.58257 2.82582 299.82582 151.32582 15132.58200 2020-01-01 2020-01-02 2020-01-01 00:15:41 2020-01-02 03:44:02 2020-01-01 00:15:41.000 2020-01-02 03:44:02.000 941 99842 50391.5 5039150 941 99842 50391.5 5039150 -32627 32308 4516.3 451630 -128 127 0.46 46 +942 100 10932 99843 2.82882 299.82882 151.32882 15132.88288 2.82882 299.82883 151.32882 15132.88275 2.82882 299.82882 151.32882 15132.88200 2020-01-01 2020-01-02 2020-01-01 00:15:42 2020-01-02 03:44:03 2020-01-01 00:15:42.000 2020-01-02 03:44:03.000 942 99843 50392.5 5039250 942 99843 50392.5 5039250 -32626 32309 4517.3 451730 -128 124 -1.1 -110 +943 100 10933 99844 2.83183 299.83183 151.33183 15133.18318 2.83183 299.83182 151.33183 15133.18304 2.83183 299.83183 151.33183 15133.18300 2020-01-01 2020-01-02 2020-01-01 00:15:43 2020-01-02 03:44:04 2020-01-01 00:15:43.000 2020-01-02 03:44:04.000 943 99844 50393.5 5039350 943 99844 50393.5 5039350 -32625 32310 4518.3 451830 -127 125 -0.1 -10 +944 100 10934 99845 2.83483 299.83483 151.33483 15133.48348 2.83483 299.83484 151.33483 15133.48364 2.83483 299.83483 151.33483 15133.48300 2020-01-01 2020-01-02 2020-01-01 00:15:44 2020-01-02 03:44:05 2020-01-01 00:15:44.000 2020-01-02 03:44:05.000 944 99845 50394.5 5039450 944 99845 50394.5 5039450 -32624 32311 4519.3 451930 -126 126 0.9 90 +945 100 10935 99846 2.83783 299.83783 151.33783 15133.78378 2.83783 299.83783 151.33783 15133.78393 2.83783 299.83783 151.33783 15133.78300 2020-01-01 2020-01-02 2020-01-01 00:15:45 2020-01-02 03:44:06 2020-01-01 00:15:45.000 2020-01-02 03:44:06.000 945 99846 50395.5 5039550 945 99846 50395.5 5039550 -32623 32312 4520.3 452030 -125 127 1.9 190 +946 100 10936 99847 2.84084 299.84084 151.34084 15134.08408 2.84084 299.84085 151.34084 15134.08404 2.84084 299.84084 151.34084 15134.08400 2020-01-01 2020-01-02 2020-01-01 00:15:46 2020-01-02 03:44:07 2020-01-01 00:15:46.000 2020-01-02 03:44:07.000 946 99847 50396.5 5039650 946 99847 50396.5 5039650 -32622 32313 4521.3 452130 -128 127 0.34 34 +947 100 10937 99848 2.84384 299.84384 151.34384 15134.38438 2.84384 299.84384 151.34384 15134.38421 2.84384 299.84384 151.34384 15134.38400 2020-01-01 2020-01-02 2020-01-01 00:15:47 2020-01-02 03:44:08 2020-01-01 00:15:47.000 2020-01-02 03:44:08.000 947 99848 50397.5 5039750 947 99848 50397.5 5039750 -32621 32314 4522.3 452230 -128 127 -1.22 -122 +948 100 10938 99849 2.84684 299.84684 151.34684 15134.68468 2.84684 299.84683 151.34684 15134.68452 2.84684 299.84684 151.34684 15134.68400 2020-01-01 2020-01-02 2020-01-01 00:15:48 2020-01-02 03:44:09 2020-01-01 00:15:48.000 2020-01-02 03:44:09.000 948 99849 50398.5 5039850 948 99849 50398.5 5039850 -32620 32315 4523.3 452330 -128 123 -2.78 -278 +949 100 10939 99850 2.84984 299.84984 151.34984 15134.98498 2.84985 299.84985 151.34985 15134.98527 2.84984 299.84984 151.34984 15134.98400 2020-01-01 2020-01-02 2020-01-01 00:15:49 2020-01-02 03:44:10 2020-01-01 00:15:49.000 2020-01-02 03:44:10.000 949 99850 50399.5 5039950 949 99850 50399.5 5039950 -32619 32316 4524.3 452430 -127 124 -1.78 -178 +95 102 10085 99995 0.28528 300.28528 150.28528 15178.81381 0.28528 300.28528 150.28528 15178.81343 0.28528 300.28528 150.28528 15178.81328 2020-01-01 2020-01-02 2020-01-01 00:01:35 2020-01-02 03:46:35 2020-01-01 00:01:35.000 2020-01-02 03:46:35.000 95 99995 50045 5054545 95 99995 50045 5054545 -32474 32461 4624.009900990099 467025 -125 126 0.801980198019802 81 +950 100 10940 99851 2.85285 299.85285 151.35285 15135.28528 2.85285 299.85284 151.35285 15135.28541 2.85285 299.85285 151.35285 15135.28500 2020-01-01 2020-01-02 2020-01-01 00:15:50 2020-01-02 03:44:11 2020-01-01 00:15:50.000 2020-01-02 03:44:11.000 950 99851 50400.5 5040050 950 99851 50400.5 5040050 -32618 32317 4525.3 452530 -126 125 -0.78 -78 +951 100 10941 99852 2.85585 299.85585 151.35585 15135.58558 2.85585 299.85587 151.35585 15135.58551 2.85585 299.85585 151.35585 15135.58500 2020-01-01 2020-01-02 2020-01-01 00:15:51 2020-01-02 03:44:12 2020-01-01 00:15:51.000 2020-01-02 03:44:12.000 951 99852 50401.5 5040150 951 99852 50401.5 5040150 -32617 32318 4526.3 452630 -125 126 0.22 22 +952 100 10942 99853 2.85885 299.85885 151.35885 15135.88588 2.85885 299.85886 151.35885 15135.88568 2.85885 299.85885 151.35885 15135.88500 2020-01-01 2020-01-02 2020-01-01 00:15:52 2020-01-02 03:44:13 2020-01-01 00:15:52.000 2020-01-02 03:44:13.000 952 99853 50402.5 5040250 952 99853 50402.5 5040250 -32616 32319 4527.3 452730 -124 127 1.22 122 +953 100 10943 99854 2.86186 299.86186 151.36186 15136.18618 2.86186 299.86185 151.36185 15136.18598 2.86186 299.86186 151.36186 15136.18600 2020-01-01 2020-01-02 2020-01-01 00:15:53 2020-01-02 03:44:14 2020-01-01 00:15:53.000 2020-01-02 03:44:14.000 953 99854 50403.5 5040350 953 99854 50403.5 5040350 -32615 32320 4528.3 452830 -128 127 -0.34 -34 +954 100 10944 99855 2.86486 299.86486 151.36486 15136.48648 2.86486 299.86487 151.36486 15136.48674 2.86486 299.86486 151.36486 15136.48600 2020-01-01 2020-01-02 2020-01-01 00:15:54 2020-01-02 03:44:15 2020-01-01 00:15:54.000 2020-01-02 03:44:15.000 954 99855 50404.5 5040450 954 99855 50404.5 5040450 -32614 32321 4529.3 452930 -128 123 -1.9 -190 +955 100 10945 99856 2.86786 299.86786 151.36786 15136.78678 2.86786 299.86786 151.36786 15136.78688 2.86786 299.86786 151.36786 15136.78600 2020-01-01 2020-01-02 2020-01-01 00:15:55 2020-01-02 03:44:16 2020-01-01 00:15:55.000 2020-01-02 03:44:16.000 955 99856 50405.5 5040550 955 99856 50405.5 5040550 -32613 32322 4530.3 453030 -127 124 -0.9 -90 +956 100 10946 99857 2.87087 299.87087 151.37087 15137.08708 2.87087 299.87088 151.37087 15137.08701 2.87087 299.87087 151.37087 15137.08700 2020-01-01 2020-01-02 2020-01-01 00:15:56 2020-01-02 03:44:17 2020-01-01 00:15:56.000 2020-01-02 03:44:17.000 956 99857 50406.5 5040650 956 99857 50406.5 5040650 -32612 32323 4531.3 453130 -126 125 0.1 10 +957 100 10947 99858 2.87387 299.87387 151.37387 15137.38738 2.87387 299.87387 151.37387 15137.38716 2.87387 299.87387 151.37387 15137.38700 2020-01-01 2020-01-02 2020-01-01 00:15:57 2020-01-02 03:44:18 2020-01-01 00:15:57.000 2020-01-02 03:44:18.000 957 99858 50407.5 5040750 957 99858 50407.5 5040750 -32611 32324 4532.3 453230 -125 126 1.1 110 +958 100 10948 99859 2.87687 299.87687 151.37687 15137.68768 2.87687 299.8769 151.37687 15137.68791 2.87687 299.87687 151.37687 15137.68700 2020-01-01 2020-01-02 2020-01-01 00:15:58 2020-01-02 03:44:19 2020-01-01 00:15:58.000 2020-01-02 03:44:19.000 958 99859 50408.5 5040850 958 99859 50408.5 5040850 -32610 32325 4533.3 453330 -124 127 2.1 210 +959 100 10949 99860 2.87987 299.87987 151.37987 15137.98798 2.87988 299.87988 151.37988 15137.9882 2.87987 299.87987 151.37987 15137.98700 2020-01-01 2020-01-02 2020-01-01 00:15:59 2020-01-02 03:44:20 2020-01-01 00:15:59.000 2020-01-02 03:44:20.000 959 99860 50409.5 5040950 959 99860 50409.5 5040950 -32609 32326 4534.3 453430 -128 127 0.54 54 +96 102 10086 99996 0.28828 300.28828 150.28828 15179.11711 0.28828 300.2883 150.28828 15179.11718 0.28828 300.28828 150.28828 15179.11628 2020-01-01 2020-01-02 2020-01-01 00:01:36 2020-01-02 03:46:36 2020-01-01 00:01:36.000 2020-01-02 03:46:36.000 96 99996 50046 5054646 96 99996 50046 5054646 -32473 32462 4625.009900990099 467126 -124 127 1.801980198019802 182 +960 100 10950 99861 2.88288 299.88288 151.38288 15138.28828 2.88288 299.88287 151.38288 15138.28834 2.88288 299.88288 151.38288 15138.28800 2020-01-01 2020-01-02 2020-01-01 00:16:00 2020-01-02 03:44:21 2020-01-01 00:16:00.000 2020-01-02 03:44:21.000 960 99861 50410.5 5041050 960 99861 50410.5 5041050 -32608 32327 4535.3 453530 -128 123 -1.02 -102 +961 100 10951 99862 2.88588 299.88588 151.38588 15138.58858 2.88588 299.8859 151.38588 15138.58848 2.88588 299.88588 151.38588 15138.58800 2020-01-01 2020-01-02 2020-01-01 00:16:01 2020-01-02 03:44:22 2020-01-01 00:16:01.000 2020-01-02 03:44:22.000 961 99862 50411.5 5041150 961 99862 50411.5 5041150 -32607 32328 4536.3 453630 -127 124 -0.02 -2 +962 100 10952 99863 2.88888 299.88888 151.38888 15138.88888 2.88888 299.8889 151.38888 15138.88862 2.88888 299.88888 151.38888 15138.88800 2020-01-01 2020-01-02 2020-01-01 00:16:02 2020-01-02 03:44:23 2020-01-01 00:16:02.000 2020-01-02 03:44:23.000 962 99863 50412.5 5041250 962 99863 50412.5 5041250 -32606 32329 4537.3 453730 -126 125 0.98 98 +963 100 10953 99864 2.89189 299.89189 151.39189 15139.18918 2.89189 299.8919 151.39189 15139.18937 2.89189 299.89189 151.39189 15139.18900 2020-01-01 2020-01-02 2020-01-01 00:16:03 2020-01-02 03:44:24 2020-01-01 00:16:03.000 2020-01-02 03:44:24.000 963 99864 50413.5 5041350 963 99864 50413.5 5041350 -32605 32330 4538.3 453830 -125 126 1.98 198 +964 100 10954 99865 2.89489 299.89489 151.39489 15139.48948 2.89489 299.8949 151.39489 15139.48968 2.89489 299.89489 151.39489 15139.48900 2020-01-01 2020-01-02 2020-01-01 00:16:04 2020-01-02 03:44:25 2020-01-01 00:16:04.000 2020-01-02 03:44:25.000 964 99865 50414.5 5041450 964 99865 50414.5 5041450 -32604 32331 4539.3 453930 -124 127 2.98 298 +965 100 10955 99866 2.89789 299.89789 151.39789 15139.78978 2.89789 299.8979 151.39789 15139.78985 2.89789 299.89789 151.39789 15139.78900 2020-01-01 2020-01-02 2020-01-01 00:16:05 2020-01-02 03:44:26 2020-01-01 00:16:05.000 2020-01-02 03:44:26.000 965 99866 50415.5 5041550 965 99866 50415.5 5041550 -32603 32332 4540.3 454030 -128 127 1.42 142 +966 100 10956 99867 2.9009 299.9009 151.4009 15140.09009 2.9009 299.9009 151.40089 15140.08996 2.90090 299.90090 151.40090 15140.09000 2020-01-01 2020-01-02 2020-01-01 00:16:06 2020-01-02 03:44:27 2020-01-01 00:16:06.000 2020-01-02 03:44:27.000 966 99867 50416.5 5041650 966 99867 50416.5 5041650 -32602 32333 4541.3 454130 -128 127 -0.14 -14 +967 100 10957 99868 2.9039 299.9039 151.4039 15140.39039 2.9039 299.9039 151.4039 15140.39009 2.90390 299.90390 151.40390 15140.39000 2020-01-01 2020-01-02 2020-01-01 00:16:07 2020-01-02 03:44:28 2020-01-01 00:16:07.000 2020-01-02 03:44:28.000 967 99868 50417.5 5041750 967 99868 50417.5 5041750 -32601 32334 4542.3 454230 -128 124 -1.7 -170 +968 100 10958 99869 2.9069 299.9069 151.4069 15140.69069 2.9069 299.90692 151.4069 15140.69084 2.90690 299.90690 151.40690 15140.69000 2020-01-01 2020-01-02 2020-01-01 00:16:08 2020-01-02 03:44:29 2020-01-01 00:16:08.000 2020-01-02 03:44:29.000 968 99869 50418.5 5041850 968 99869 50418.5 5041850 -32600 32335 4543.3 454330 -127 125 -0.7 -70 +969 100 10959 99870 2.9099 299.9099 151.4099 15140.99099 2.90991 299.9099 151.40991 15140.99114 2.90990 299.90990 151.40990 15140.99000 2020-01-01 2020-01-02 2020-01-01 00:16:09 2020-01-02 03:44:30 2020-01-01 00:16:09.000 2020-01-02 03:44:30.000 969 99870 50419.5 5041950 969 99870 50419.5 5041950 -32599 32336 4544.3 454430 -126 126 0.3 30 +97 102 10087 99997 0.29129 300.29129 150.29129 15179.42042 0.29129 300.2913 150.29129 15179.42033 0.29129 300.29129 150.29129 15179.42029 2020-01-01 2020-01-02 2020-01-01 00:01:37 2020-01-02 03:46:37 2020-01-01 00:01:37.000 2020-01-02 03:46:37.000 97 99997 50047 5054747 97 99997 50047 5054747 -32472 32463 4626.009900990099 467227 -128 127 0.26732673267326734 27 +970 100 10960 99871 2.91291 299.91291 151.41291 15141.29129 2.91291 299.9129 151.41291 15141.29132 2.91291 299.91291 151.41291 15141.29100 2020-01-01 2020-01-02 2020-01-01 00:16:10 2020-01-02 03:44:31 2020-01-01 00:16:10.000 2020-01-02 03:44:31.000 970 99871 50420.5 5042050 970 99871 50420.5 5042050 -32598 32337 4545.3 454530 -125 127 1.3 130 +971 100 10961 99872 2.91591 299.91591 151.41591 15141.59159 2.91591 299.91592 151.41591 15141.59142 2.91591 299.91591 151.41591 15141.59100 2020-01-01 2020-01-02 2020-01-01 00:16:11 2020-01-02 03:44:32 2020-01-01 00:16:11.000 2020-01-02 03:44:32.000 971 99872 50421.5 5042150 971 99872 50421.5 5042150 -32597 32338 4546.3 454630 -128 127 -0.26 -26 +972 100 10962 99873 2.91891 299.91891 151.41891 15141.89189 2.91891 299.9189 151.41891 15141.89172 2.91891 299.91891 151.41891 15141.89100 2020-01-01 2020-01-02 2020-01-01 00:16:12 2020-01-02 03:44:33 2020-01-01 00:16:12.000 2020-01-02 03:44:33.000 972 99873 50422.5 5042250 972 99873 50422.5 5042250 -32596 32339 4547.3 454730 -128 127 -1.82 -182 +973 100 10963 99874 2.92192 299.92192 151.42192 15142.19219 2.92192 299.92194 151.42192 15142.19232 2.92192 299.92192 151.42192 15142.19200 2020-01-01 2020-01-02 2020-01-01 00:16:13 2020-01-02 03:44:34 2020-01-01 00:16:13.000 2020-01-02 03:44:34.000 973 99874 50423.5 5042350 973 99874 50423.5 5042350 -32595 32340 4548.3 454830 -128 123 -3.38 -338 +974 100 10964 99875 2.92492 299.92492 151.42492 15142.49249 2.92492 299.92493 151.42492 15142.49265 2.92492 299.92492 151.42492 15142.49200 2020-01-01 2020-01-02 2020-01-01 00:16:14 2020-01-02 03:44:35 2020-01-01 00:16:14.000 2020-01-02 03:44:35.000 974 99875 50424.5 5042450 974 99875 50424.5 5042450 -32594 32341 4549.3 454930 -127 124 -2.38 -238 +975 100 10965 99876 2.92792 299.92792 151.42792 15142.79279 2.92792 299.92792 151.42792 15142.79279 2.92792 299.92792 151.42792 15142.79200 2020-01-01 2020-01-02 2020-01-01 00:16:15 2020-01-02 03:44:36 2020-01-01 00:16:15.000 2020-01-02 03:44:36.000 975 99876 50425.5 5042550 975 99876 50425.5 5042550 -32593 32342 4550.3 455030 -126 125 -1.38 -138 +976 100 10966 99877 2.93093 299.93093 151.43093 15143.09309 2.93093 299.93094 151.43092 15143.09289 2.93093 299.93093 151.43093 15143.09300 2020-01-01 2020-01-02 2020-01-01 00:16:16 2020-01-02 03:44:37 2020-01-01 00:16:16.000 2020-01-02 03:44:37.000 976 99877 50426.5 5042650 976 99877 50426.5 5042650 -32592 32343 4551.3 455130 -125 126 -0.38 -38 +977 100 10967 99878 2.93393 299.93393 151.43393 15143.39339 2.93393 299.93393 151.43393 15143.39318 2.93393 299.93393 151.43393 15143.39300 2020-01-01 2020-01-02 2020-01-01 00:16:17 2020-01-02 03:44:38 2020-01-01 00:16:17.000 2020-01-02 03:44:38.000 977 99878 50427.5 5042750 977 99878 50427.5 5042750 -32591 32344 4552.3 455230 -124 127 0.62 62 +978 100 10968 99879 2.93693 299.93693 151.43693 15143.69369 2.93693 299.93695 151.43693 15143.69378 2.93693 299.93693 151.43693 15143.69300 2020-01-01 2020-01-02 2020-01-01 00:16:18 2020-01-02 03:44:39 2020-01-01 00:16:18.000 2020-01-02 03:44:39.000 978 99879 50428.5 5042850 978 99879 50428.5 5042850 -32590 32345 4553.3 455330 -128 127 -0.94 -94 +979 100 10969 99880 2.93993 299.93993 151.43993 15143.99399 2.93994 299.93994 151.43994 15143.99412 2.93993 299.93993 151.43993 15143.99300 2020-01-01 2020-01-02 2020-01-01 00:16:19 2020-01-02 03:44:40 2020-01-01 00:16:19.000 2020-01-02 03:44:40.000 979 99880 50429.5 5042950 979 99880 50429.5 5042950 -32589 32346 4554.3 455430 -128 123 -2.5 -250 +98 102 10088 99998 0.29429 300.29429 150.29429 15179.72372 0.29429 300.29428 150.29429 15179.72363 0.29429 300.29429 150.29429 15179.72329 2020-01-01 2020-01-02 2020-01-01 00:01:38 2020-01-02 03:46:38 2020-01-01 00:01:38.000 2020-01-02 03:46:38.000 98 99998 50048 5054848 98 99998 50048 5054848 -32471 32464 4627.009900990099 467328 -128 127 -1.2673267326732673 -128 +980 100 10970 99881 2.94294 299.94294 151.44294 15144.29429 2.94294 299.94293 151.44294 15144.29426 2.94294 299.94294 151.44294 15144.29400 2020-01-01 2020-01-02 2020-01-01 00:16:20 2020-01-02 03:44:41 2020-01-01 00:16:20.000 2020-01-02 03:44:41.000 980 99881 50430.5 5043050 980 99881 50430.5 5043050 -32588 32347 4555.3 455530 -127 124 -1.5 -150 +981 100 10971 99882 2.94594 299.94594 151.44594 15144.59459 2.94594 299.94595 151.44595 15144.59501 2.94594 299.94594 151.44594 15144.59400 2020-01-01 2020-01-02 2020-01-01 00:16:21 2020-01-02 03:44:42 2020-01-01 00:16:21.000 2020-01-02 03:44:42.000 981 99882 50431.5 5043150 981 99882 50431.5 5043150 -32587 32348 4556.3 455630 -126 125 -0.5 -50 +982 100 10972 99883 2.94894 299.94894 151.44894 15144.89489 2.94894 299.94894 151.44894 15144.89466 2.94894 299.94894 151.44894 15144.89400 2020-01-01 2020-01-02 2020-01-01 00:16:22 2020-01-02 03:44:43 2020-01-01 00:16:22.000 2020-01-02 03:44:43.000 982 99883 50432.5 5043250 982 99883 50432.5 5043250 -32586 32349 4557.3 455730 -125 126 0.5 50 +983 100 10973 99884 2.95195 299.95195 151.45195 15145.19519 2.95195 299.95197 151.45195 15145.19525 2.95195 299.95195 151.45195 15145.19500 2020-01-01 2020-01-02 2020-01-01 00:16:23 2020-01-02 03:44:44 2020-01-01 00:16:23.000 2020-01-02 03:44:44.000 983 99884 50433.5 5043350 983 99884 50433.5 5043350 -32585 32350 4558.3 455830 -124 127 1.5 150 +984 100 10974 99885 2.95495 299.95495 151.45495 15145.49549 2.95495 299.95496 151.45495 15145.49559 2.95495 299.95495 151.45495 15145.49500 2020-01-01 2020-01-02 2020-01-01 00:16:24 2020-01-02 03:44:45 2020-01-01 00:16:24.000 2020-01-02 03:44:45.000 984 99885 50434.5 5043450 984 99885 50434.5 5043450 -32584 32351 4559.3 455930 -128 127 -0.06 -6 +985 100 10975 99886 2.95795 299.95795 151.45795 15145.79579 2.95795 299.95795 151.45795 15145.79573 2.95795 299.95795 151.45795 15145.79500 2020-01-01 2020-01-02 2020-01-01 00:16:25 2020-01-02 03:44:46 2020-01-01 00:16:25.000 2020-01-02 03:44:46.000 985 99886 50435.5 5043550 985 99886 50435.5 5043550 -32583 32352 4560.3 456030 -128 123 -1.62 -162 +986 100 10976 99887 2.96096 299.96096 151.46096 15146.09609 2.96096 299.96097 151.46096 15146.09648 2.96096 299.96096 151.46096 15146.09600 2020-01-01 2020-01-02 2020-01-01 00:16:26 2020-01-02 03:44:47 2020-01-01 00:16:26.000 2020-01-02 03:44:47.000 986 99887 50436.5 5043650 986 99887 50436.5 5043650 -32582 32353 4561.3 456130 -127 124 -0.62 -62 +987 100 10977 99888 2.96396 299.96396 151.46396 15146.39639 2.96396 299.96396 151.46396 15146.39612 2.96396 299.96396 151.46396 15146.39600 2020-01-01 2020-01-02 2020-01-01 00:16:27 2020-01-02 03:44:48 2020-01-01 00:16:27.000 2020-01-02 03:44:48.000 987 99888 50437.5 5043750 987 99888 50437.5 5043750 -32581 32354 4562.3 456230 -126 125 0.38 38 +988 100 10978 99889 2.96696 299.96696 151.46696 15146.69669 2.96696 299.96698 151.46696 15146.69676 2.96696 299.96696 151.46696 15146.69600 2020-01-01 2020-01-02 2020-01-01 00:16:28 2020-01-02 03:44:49 2020-01-01 00:16:28.000 2020-01-02 03:44:49.000 988 99889 50438.5 5043850 988 99889 50438.5 5043850 -32580 32355 4563.3 456330 -125 126 1.38 138 +989 100 10979 99890 2.96996 299.96996 151.46996 15146.99699 2.96997 299.96997 151.46997 15146.99706 2.96996 299.96996 151.46996 15146.99600 2020-01-01 2020-01-02 2020-01-01 00:16:29 2020-01-02 03:44:50 2020-01-01 00:16:29.000 2020-01-02 03:44:50.000 989 99890 50439.5 5043950 989 99890 50439.5 5043950 -32579 32356 4564.3 456430 -124 127 2.38 238 +99 102 10089 99999 0.29729 300.29729 150.29729 15180.02702 0.29729 300.2973 150.29729 15180.02726 0.29729 300.29729 150.29729 15180.02629 2020-01-01 2020-01-02 2020-01-01 00:01:39 2020-01-02 03:46:39 2020-01-01 00:01:39.000 2020-01-02 03:46:39.000 99 99999 50049 5054949 99 99999 50049 5054949 -32470 32465 4628.009900990099 467429 -128 123 -2.801980198019802 -283 +990 100 10980 99891 2.97297 299.97297 151.47297 15147.29729 2.97297 299.97296 151.47297 15147.29735 2.97297 299.97297 151.47297 15147.29700 2020-01-01 2020-01-02 2020-01-01 00:16:30 2020-01-02 03:44:51 2020-01-01 00:16:30.000 2020-01-02 03:44:51.000 990 99891 50440.5 5044050 990 99891 50440.5 5044050 -32578 32357 4565.3 456530 -128 127 0.82 82 +991 100 10981 99892 2.97597 299.97597 151.47597 15147.59759 2.97597 299.97598 151.47597 15147.59795 2.97597 299.97597 151.47597 15147.59700 2020-01-01 2020-01-02 2020-01-01 00:16:31 2020-01-02 03:44:52 2020-01-01 00:16:31.000 2020-01-02 03:44:52.000 991 99892 50441.5 5044150 991 99892 50441.5 5044150 -32577 32358 4566.3 456630 -128 127 -0.74 -74 +992 100 10982 99893 2.97897 299.97897 151.47897 15147.89789 2.97897 299.97897 151.47897 15147.89759 2.97897 299.97897 151.47897 15147.89700 2020-01-01 2020-01-02 2020-01-01 00:16:32 2020-01-02 03:44:53 2020-01-01 00:16:32.000 2020-01-02 03:44:53.000 992 99893 50442.5 5044250 992 99893 50442.5 5044250 -32576 32359 4567.3 456730 -128 124 -2.3 -230 +993 100 10983 99894 2.98198 299.98198 151.48198 15148.19819 2.98198 299.982 151.48198 15148.19823 2.98198 299.98198 151.48198 15148.19800 2020-01-01 2020-01-02 2020-01-01 00:16:33 2020-01-02 03:44:54 2020-01-01 00:16:33.000 2020-01-02 03:44:54.000 993 99894 50443.5 5044350 993 99894 50443.5 5044350 -32575 32360 4568.3 456830 -127 125 -1.3 -130 +994 100 10984 99895 2.98498 299.98498 151.48498 15148.49849 2.98498 299.985 151.48498 15148.49853 2.98498 299.98498 151.48498 15148.49800 2020-01-01 2020-01-02 2020-01-01 00:16:34 2020-01-02 03:44:55 2020-01-01 00:16:34.000 2020-01-02 03:44:55.000 994 99895 50444.5 5044450 994 99895 50444.5 5044450 -32574 32361 4569.3 456930 -126 126 -0.3 -30 +995 100 10985 99896 2.98798 299.98798 151.48798 15148.79879 2.98798 299.98798 151.48798 15148.79882 2.98798 299.98798 151.48798 15148.79800 2020-01-01 2020-01-02 2020-01-01 00:16:35 2020-01-02 03:44:56 2020-01-01 00:16:35.000 2020-01-02 03:44:56.000 995 99896 50445.5 5044550 995 99896 50445.5 5044550 -32573 32362 4570.3 457030 -125 127 0.7 70 +996 100 10986 99897 2.99099 299.99099 151.49099 15149.09909 2.99099 299.991 151.49099 15149.09942 2.99099 299.99099 151.49099 15149.09900 2020-01-01 2020-01-02 2020-01-01 00:16:36 2020-01-02 03:44:57 2020-01-01 00:16:36.000 2020-01-02 03:44:57.000 996 99897 50446.5 5044650 996 99897 50446.5 5044650 -32572 32363 4571.3 457130 -128 127 -0.86 -86 +997 100 10987 99898 2.99399 299.99399 151.49399 15149.39939 2.99399 299.994 151.49399 15149.3991 2.99399 299.99399 151.49399 15149.39900 2020-01-01 2020-01-02 2020-01-01 00:16:37 2020-01-02 03:44:58 2020-01-01 00:16:37.000 2020-01-02 03:44:58.000 997 99898 50447.5 5044750 997 99898 50447.5 5044750 -32571 32364 4572.3 457230 -128 127 -2.42 -242 +998 100 10988 99899 2.99699 299.99699 151.49699 15149.69969 2.99699 299.997 151.49699 15149.6997 2.99699 299.99699 151.49699 15149.69900 2020-01-01 2020-01-02 2020-01-01 00:16:38 2020-01-02 03:44:59 2020-01-01 00:16:38.000 2020-01-02 03:44:59.000 998 99899 50448.5 5044850 998 99899 50448.5 5044850 -32570 32365 4573.3 457330 -128 123 -3.98 -398 + ---- select with states ---- +-1 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N +-2 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N +-3 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N +-4 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N +-5 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N +0 2 0 99900 0 300 150 15150 0 300 150 15150 0.00000 300.00000 150.00000 15150.00000 2020-01-01 2020-01-02 2020-01-01 00:00:00 2020-01-02 03:45:00 2020-01-01 00:00:00.000 2020-01-02 03:45:00.000 0 99900 49950 5044950 0 99900 49950 5044950 -32569 32366 4529.009900990099 457430 -127 124 -2.9504950495049505 -298 +1 2 1 9991 0.003 300.003 150.003 15150.3033 0.003 300.003 150.003 15150.30329 0.00300 300.00300 150.00300 15150.30300 2020-01-01 2020-01-02 2020-01-01 00:00:01 2020-01-02 03:45:01 2020-01-01 00:00:01.000 2020-01-02 03:45:01.000 1 99901 49951 5045051 1 99901 49951 5045051 -32568 32367 4530.009900990099 457531 -126 125 -1.9504950495049505 -197 +10 2 10 99910 0.03003 300.03003 150.03003 15153.03303 0.03003 300.03003 150.03002 15153.03296 0.03003 300.03003 150.03003 15153.03303 2020-01-01 2020-01-02 2020-01-01 00:00:10 2020-01-02 03:45:10 2020-01-01 00:00:10.000 2020-01-02 03:45:10.000 10 99910 49960 5045960 10 99910 49960 5045960 -32559 32376 4539.009900990099 458440 -128 127 -0.5544554455445545 -56 +100 2 100 99001 0.3003 297.3003 148.8003 14880.03003 0.3003 297.3003 148.80029 14880.02962 0.30030 297.30030 148.80030 14880.03000 2020-01-01 2020-01-02 2020-01-01 00:01:40 2020-01-02 03:30:01 2020-01-01 00:01:40.000 2020-01-02 03:30:01.000 100 99001 49550.5 4955050 100 99001 49550.5 4955050 -32469 32466 4986.02 498602 -127 124 -0.86 -86 +101 2 10091 99002 0.3033 297.3033 148.8033 14880.33033 0.3033 297.3033 148.8033 14880.33035 0.30330 297.30330 148.80330 14880.33000 2020-01-01 2020-01-02 2020-01-01 00:01:41 2020-01-02 03:30:02 2020-01-01 00:01:41.000 2020-01-02 03:30:02.000 101 99002 49551.5 4955150 101 99002 49551.5 4955150 -32468 32467 4987.02 498702 -126 125 0.14 14 +102 2 10092 99003 0.3063 297.3063 148.8063 14880.63063 0.3063 297.3063 148.8063 14880.6305 0.30630 297.30630 148.80630 14880.63000 2020-01-01 2020-01-02 2020-01-01 00:01:42 2020-01-02 03:30:03 2020-01-01 00:01:42.000 2020-01-02 03:30:03.000 102 99003 49552.5 4955250 102 99003 49552.5 4955250 -32467 32468 4988.02 498802 -125 126 1.14 114 +103 2 10093 99004 0.3093 297.3093 148.8093 14880.93093 0.3093 297.3093 148.8093 14880.93085 0.30930 297.30930 148.80930 14880.93000 2020-01-01 2020-01-02 2020-01-01 00:01:43 2020-01-02 03:30:04 2020-01-01 00:01:43.000 2020-01-02 03:30:04.000 103 99004 49553.5 4955350 103 99004 49553.5 4955350 -32466 32469 4989.02 498902 -124 127 2.14 214 +104 2 10094 99005 0.31231 297.31231 148.81231 14881.23123 0.31231 297.31232 148.81231 14881.23144 0.31231 297.31231 148.81231 14881.23100 2020-01-01 2020-01-02 2020-01-01 00:01:44 2020-01-02 03:30:05 2020-01-01 00:01:44.000 2020-01-02 03:30:05.000 104 99005 49554.5 4955450 104 99005 49554.5 4955450 -32465 32470 4990.02 499002 -128 127 0.58 58 +105 2 10095 99006 0.31531 297.31531 148.81531 14881.53153 0.31531 297.3153 148.81531 14881.53174 0.31531 297.31531 148.81531 14881.53100 2020-01-01 2020-01-02 2020-01-01 00:01:45 2020-01-02 03:30:06 2020-01-01 00:01:45.000 2020-01-02 03:30:06.000 105 99006 49555.5 4955550 105 99006 49555.5 4955550 -32464 32471 4991.02 499102 -128 123 -0.98 -98 +106 2 10096 99007 0.31831 297.31831 148.81831 14881.83183 0.31831 297.31833 148.81831 14881.83182 0.31831 297.31831 148.81831 14881.83100 2020-01-01 2020-01-02 2020-01-01 00:01:46 2020-01-02 03:30:07 2020-01-01 00:01:46.000 2020-01-02 03:30:07.000 106 99007 49556.5 4955650 106 99007 49556.5 4955650 -32463 32472 4992.02 499202 -127 124 0.02 2 +107 2 10097 99008 0.32132 297.32132 148.82132 14882.13213 0.32132 297.32132 148.82131 14882.13197 0.32132 297.32132 148.82132 14882.13200 2020-01-01 2020-01-02 2020-01-01 00:01:47 2020-01-02 03:30:08 2020-01-01 00:01:47.000 2020-01-02 03:30:08.000 107 99008 49557.5 4955750 107 99008 49557.5 4955750 -32462 32473 4993.02 499302 -126 125 1.02 102 +108 2 10098 99009 0.32432 297.32432 148.82432 14882.43243 0.32432 297.3243 148.82432 14882.43232 0.32432 297.32432 148.82432 14882.43200 2020-01-01 2020-01-02 2020-01-01 00:01:48 2020-01-02 03:30:09 2020-01-01 00:01:48.000 2020-01-02 03:30:09.000 108 99009 49558.5 4955850 108 99009 49558.5 4955850 -32461 32474 4994.02 499402 -125 126 2.02 202 +109 2 10099 99010 0.32732 297.32732 148.82732 14882.73273 0.32732 297.32733 148.82732 14882.7329 0.32732 297.32732 148.82732 14882.73200 2020-01-01 2020-01-02 2020-01-01 00:01:49 2020-01-02 03:30:10 2020-01-01 00:01:49.000 2020-01-02 03:30:10.000 109 99010 49559.5 4955950 109 99010 49559.5 4955950 -32460 32475 4995.02 499502 -124 127 3.02 302 +11 2 10001 99911 0.03303 300.03303 150.03303 15153.33633 0.03303 300.03302 150.03303 15153.33627 0.03303 300.03303 150.03303 15153.33603 2020-01-01 2020-01-02 2020-01-01 00:00:11 2020-01-02 03:45:11 2020-01-01 00:00:11.000 2020-01-02 03:45:11.000 11 99911 49961 5046061 11 99911 49961 5046061 -32558 32377 4540.009900990099 458541 -128 123 -2.089108910891089 -211 +110 2 10100 99011 0.33033 297.33033 148.83033 14883.03303 0.33033 297.33032 148.83033 14883.03321 0.33033 297.33033 148.83033 14883.03300 2020-01-01 2020-01-02 2020-01-01 00:01:50 2020-01-02 03:30:11 2020-01-01 00:01:50.000 2020-01-02 03:30:11.000 110 99011 49560.5 4956050 110 99011 49560.5 4956050 -32459 32476 4996.02 499602 -128 127 1.46 146 +111 2 10101 99012 0.33333 297.33333 148.83333 14883.33333 0.33333 297.33334 148.83333 14883.33329 0.33333 297.33333 148.83333 14883.33300 2020-01-01 2020-01-02 2020-01-01 00:01:51 2020-01-02 03:30:12 2020-01-01 00:01:51.000 2020-01-02 03:30:12.000 111 99012 49561.5 4956150 111 99012 49561.5 4956150 -32458 32477 4997.02 499702 -128 123 -0.1 -10 +112 2 10102 99013 0.33633 297.33633 148.83633 14883.63363 0.33633 297.33633 148.83633 14883.63348 0.33633 297.33633 148.83633 14883.63300 2020-01-01 2020-01-02 2020-01-01 00:01:52 2020-01-02 03:30:13 2020-01-01 00:01:52.000 2020-01-02 03:30:13.000 112 99013 49562.5 4956250 112 99013 49562.5 4956250 -32457 32478 4998.02 499802 -127 124 0.9 90 +113 2 10103 99014 0.33933 297.33933 148.83933 14883.93393 0.33933 297.33932 148.83933 14883.9338 0.33933 297.33933 148.83933 14883.93300 2020-01-01 2020-01-02 2020-01-01 00:01:53 2020-01-02 03:30:14 2020-01-01 00:01:53.000 2020-01-02 03:30:14.000 113 99014 49563.5 4956350 113 99014 49563.5 4956350 -32456 32479 4999.02 499902 -126 125 1.9 190 +114 2 10104 99015 0.34234 297.34234 148.84234 14884.23423 0.34234 297.34235 148.84234 14884.23437 0.34234 297.34234 148.84234 14884.23400 2020-01-01 2020-01-02 2020-01-01 00:01:54 2020-01-02 03:30:15 2020-01-01 00:01:54.000 2020-01-02 03:30:15.000 114 99015 49564.5 4956450 114 99015 49564.5 4956450 -32455 32480 5000.02 500002 -125 126 2.9 290 +115 2 10105 99016 0.34534 297.34534 148.84534 14884.53453 0.34534 297.34534 148.84534 14884.53468 0.34534 297.34534 148.84534 14884.53400 2020-01-01 2020-01-02 2020-01-01 00:01:55 2020-01-02 03:30:16 2020-01-01 00:01:55.000 2020-01-02 03:30:16.000 115 99016 49565.5 4956550 115 99016 49565.5 4956550 -32454 32481 5001.02 500102 -124 127 3.9 390 +116 2 10106 99017 0.34834 297.34834 148.84834 14884.83483 0.34834 297.34836 148.84834 14884.83476 0.34834 297.34834 148.84834 14884.83400 2020-01-01 2020-01-02 2020-01-01 00:01:56 2020-01-02 03:30:17 2020-01-01 00:01:56.000 2020-01-02 03:30:17.000 116 99017 49566.5 4956650 116 99017 49566.5 4956650 -32453 32482 5002.02 500202 -128 127 2.34 234 +117 2 10107 99018 0.35135 297.35135 148.85135 14885.13513 0.35135 297.35135 148.85134 14885.13495 0.35135 297.35135 148.85135 14885.13500 2020-01-01 2020-01-02 2020-01-01 00:01:57 2020-01-02 03:30:18 2020-01-01 00:01:57.000 2020-01-02 03:30:18.000 117 99018 49567.5 4956750 117 99018 49567.5 4956750 -32452 32483 5003.02 500302 -128 123 0.78 78 +118 2 10108 99019 0.35435 297.35435 148.85435 14885.43543 0.35435 297.35434 148.85435 14885.43526 0.35435 297.35435 148.85435 14885.43500 2020-01-01 2020-01-02 2020-01-01 00:01:58 2020-01-02 03:30:19 2020-01-01 00:01:58.000 2020-01-02 03:30:19.000 118 99019 49568.5 4956850 118 99019 49568.5 4956850 -32451 32484 5004.02 500402 -127 124 1.78 178 +119 2 10109 99020 0.35735 297.35735 148.85735 14885.73573 0.35735 297.35736 148.85736 14885.736 0.35735 297.35735 148.85735 14885.73500 2020-01-01 2020-01-02 2020-01-01 00:01:59 2020-01-02 03:30:20 2020-01-01 00:01:59.000 2020-01-02 03:30:20.000 119 99020 49569.5 4956950 119 99020 49569.5 4956950 -32450 32485 5005.02 500502 -126 125 2.78 278 +12 2 10002 99912 0.03603 300.03603 150.03603 15153.63963 0.03603 300.03604 150.03603 15153.6399 0.03603 300.03603 150.03603 15153.63903 2020-01-01 2020-01-02 2020-01-01 00:00:12 2020-01-02 03:45:12 2020-01-01 00:00:12.000 2020-01-02 03:45:12.000 12 99912 49962 5046162 12 99912 49962 5046162 -32557 32378 4541.009900990099 458642 -127 124 -1.0891089108910892 -110 +120 2 10110 99021 0.36036 297.36036 148.86036 14886.03603 0.36036 297.36035 148.86036 14886.03615 0.36036 297.36036 148.86036 14886.03600 2020-01-01 2020-01-02 2020-01-01 00:02:00 2020-01-02 03:30:21 2020-01-01 00:02:00.000 2020-01-02 03:30:21.000 120 99021 49570.5 4957050 120 99021 49570.5 4957050 -32449 32486 5006.02 500602 -125 126 3.78 378 +121 2 10111 99022 0.36336 297.36336 148.86336 14886.33633 0.36336 297.36337 148.86336 14886.33627 0.36336 297.36336 148.86336 14886.33600 2020-01-01 2020-01-02 2020-01-01 00:02:01 2020-01-02 03:30:22 2020-01-01 00:02:01.000 2020-01-02 03:30:22.000 121 99022 49571.5 4957150 121 99022 49571.5 4957150 -32448 32487 5007.02 500702 -124 127 4.78 478 +122 2 10112 99023 0.36636 297.36636 148.86636 14886.63663 0.36636 297.36636 148.86636 14886.63642 0.36636 297.36636 148.86636 14886.63600 2020-01-01 2020-01-02 2020-01-01 00:02:02 2020-01-02 03:30:23 2020-01-01 00:02:02.000 2020-01-02 03:30:23.000 122 99023 49572.5 4957250 122 99023 49572.5 4957250 -32447 32488 5008.02 500802 -128 127 3.22 322 +123 2 10113 99024 0.36936 297.36936 148.86936 14886.93693 0.36936 297.36935 148.86936 14886.93673 0.36936 297.36936 148.86936 14886.93600 2020-01-01 2020-01-02 2020-01-01 00:02:03 2020-01-02 03:30:24 2020-01-01 00:02:03.000 2020-01-02 03:30:24.000 123 99024 49573.5 4957350 123 99024 49573.5 4957350 -32446 32489 5009.02 500902 -128 127 1.66 166 +124 2 10114 99025 0.37237 297.37237 148.87237 14887.23723 0.37237 297.37238 148.87237 14887.23746 0.37237 297.37237 148.87237 14887.23700 2020-01-01 2020-01-02 2020-01-01 00:02:04 2020-01-02 03:30:25 2020-01-01 00:02:04.000 2020-01-02 03:30:25.000 124 99025 49574.5 4957450 124 99025 49574.5 4957450 -32445 32490 5010.02 501002 -128 124 0.1 10 +125 2 10115 99026 0.37537 297.37537 148.87537 14887.53753 0.37537 297.37537 148.87537 14887.53762 0.37537 297.37537 148.87537 14887.53700 2020-01-01 2020-01-02 2020-01-01 00:02:05 2020-01-02 03:30:26 2020-01-01 00:02:05.000 2020-01-02 03:30:26.000 125 99026 49575.5 4957550 125 99026 49575.5 4957550 -32444 32491 5011.02 501102 -127 125 1.1 110 +126 2 10116 99027 0.37837 297.37837 148.87837 14887.83783 0.37837 297.3784 148.87837 14887.83774 0.37837 297.37837 148.87837 14887.83700 2020-01-01 2020-01-02 2020-01-01 00:02:06 2020-01-02 03:30:27 2020-01-01 00:02:06.000 2020-01-02 03:30:27.000 126 99027 49576.5 4957650 126 99027 49576.5 4957650 -32443 32492 5012.02 501202 -126 126 2.1 210 +127 2 10117 99028 0.38138 297.38138 148.88138 14888.13813 0.38138 297.38138 148.88137 14888.13789 0.38138 297.38138 148.88138 14888.13800 2020-01-01 2020-01-02 2020-01-01 00:02:07 2020-01-02 03:30:28 2020-01-01 00:02:07.000 2020-01-02 03:30:28.000 127 99028 49577.5 4957750 127 99028 49577.5 4957750 -32442 32493 5013.02 501302 -125 127 3.1 310 +128 2 10118 99029 0.38438 297.38438 148.88438 14888.43843 0.38438 297.3844 148.88438 14888.43862 0.38438 297.38438 148.88438 14888.43800 2020-01-01 2020-01-02 2020-01-01 00:02:08 2020-01-02 03:30:29 2020-01-01 00:02:08.000 2020-01-02 03:30:29.000 128 99029 49578.5 4957850 128 99029 49578.5 4957850 -32441 32494 5014.02 501402 -128 127 1.54 154 +129 2 10119 99030 0.38738 297.38738 148.88738 14888.73873 0.38738 297.3874 148.88738 14888.73894 0.38738 297.38738 148.88738 14888.73800 2020-01-01 2020-01-02 2020-01-01 00:02:09 2020-01-02 03:30:30 2020-01-01 00:02:09.000 2020-01-02 03:30:30.000 129 99030 49579.5 4957950 129 99030 49579.5 4957950 -32440 32495 5015.02 501502 -128 127 -0.02 -2 +13 2 10003 99913 0.03903 300.03903 150.03903 15153.94294 0.03903 300.03903 150.03903 15153.94255 0.03903 300.03903 150.03903 15153.94203 2020-01-01 2020-01-02 2020-01-01 00:00:13 2020-01-02 03:45:13 2020-01-01 00:00:13.000 2020-01-02 03:45:13.000 13 99913 49963 5046263 13 99913 49963 5046263 -32556 32379 4542.009900990099 458743 -126 125 -0.0891089108910891 -9 +130 2 10120 99031 0.39039 297.39039 148.89039 14889.03903 0.39039 297.39038 148.89039 14889.03909 0.39039 297.39039 148.89039 14889.03900 2020-01-01 2020-01-02 2020-01-01 00:02:10 2020-01-02 03:30:31 2020-01-01 00:02:10.000 2020-01-02 03:30:31.000 130 99031 49580.5 4958050 130 99031 49580.5 4958050 -32439 32496 5016.02 501602 -128 123 -1.58 -158 +131 2 10121 99032 0.39339 297.39339 148.89339 14889.33933 0.39339 297.3934 148.89339 14889.33921 0.39339 297.39339 148.89339 14889.33900 2020-01-01 2020-01-02 2020-01-01 00:02:11 2020-01-02 03:30:32 2020-01-01 00:02:11.000 2020-01-02 03:30:32.000 131 99032 49581.5 4958150 131 99032 49581.5 4958150 -32438 32497 5017.02 501702 -127 124 -0.58 -58 +132 2 10122 99033 0.39639 297.39639 148.89639 14889.63963 0.39639 297.3964 148.89639 14889.63936 0.39639 297.39639 148.89639 14889.63900 2020-01-01 2020-01-02 2020-01-01 00:02:12 2020-01-02 03:30:33 2020-01-01 00:02:12.000 2020-01-02 03:30:33.000 132 99033 49582.5 4958250 132 99033 49582.5 4958250 -32437 32498 5018.02 501802 -126 125 0.42 42 +133 2 10123 99034 0.39939 297.39939 148.89939 14889.93993 0.39939 297.3994 148.8994 14889.94009 0.39939 297.39939 148.89939 14889.93900 2020-01-01 2020-01-02 2020-01-01 00:02:13 2020-01-02 03:30:34 2020-01-01 00:02:13.000 2020-01-02 03:30:34.000 133 99034 49583.5 4958350 133 99034 49583.5 4958350 -32436 32499 5019.02 501902 -125 126 1.42 142 +134 2 10124 99035 0.4024 297.4024 148.9024 14890.24024 0.4024 297.4024 148.9024 14890.24041 0.40240 297.40240 148.90240 14890.24000 2020-01-01 2020-01-02 2020-01-01 00:02:14 2020-01-02 03:30:35 2020-01-01 00:02:14.000 2020-01-02 03:30:35.000 134 99035 49584.5 4958450 134 99035 49584.5 4958450 -32435 32500 5020.02 502002 -124 127 2.42 242 +135 2 10125 99036 0.4054 297.4054 148.9054 14890.54054 0.4054 297.4054 148.9054 14890.54059 0.40540 297.40540 148.90540 14890.54000 2020-01-01 2020-01-02 2020-01-01 00:02:15 2020-01-02 03:30:36 2020-01-01 00:02:15.000 2020-01-02 03:30:36.000 135 99036 49585.5 4958550 135 99036 49585.5 4958550 -32434 32501 5021.02 502102 -128 127 0.86 86 +136 2 10126 99037 0.4084 297.4084 148.9084 14890.84084 0.4084 297.40842 148.9084 14890.84068 0.40840 297.40840 148.90840 14890.84000 2020-01-01 2020-01-02 2020-01-01 00:02:16 2020-01-02 03:30:37 2020-01-01 00:02:16.000 2020-01-02 03:30:37.000 136 99037 49586.5 4958650 136 99037 49586.5 4958650 -32433 32502 5022.02 502202 -128 123 -0.7 -70 +137 2 10127 99038 0.41141 297.41141 148.91141 14891.14114 0.41141 297.4114 148.9114 14891.14099 0.41141 297.41141 148.91141 14891.14100 2020-01-01 2020-01-02 2020-01-01 00:02:17 2020-01-02 03:30:38 2020-01-01 00:02:17.000 2020-01-02 03:30:38.000 137 99038 49587.5 4958750 137 99038 49587.5 4958750 -32432 32503 5023.02 502302 -127 124 0.3 30 +138 2 10128 99039 0.41441 297.41441 148.91441 14891.44144 0.41441 297.41443 148.91441 14891.44157 0.41441 297.41441 148.91441 14891.44100 2020-01-01 2020-01-02 2020-01-01 00:02:18 2020-01-02 03:30:39 2020-01-01 00:02:18.000 2020-01-02 03:30:39.000 138 99039 49588.5 4958850 138 99039 49588.5 4958850 -32431 32504 5024.02 502402 -126 125 1.3 130 +139 2 10129 99040 0.41741 297.41741 148.91741 14891.74174 0.41741 297.41742 148.91741 14891.74188 0.41741 297.41741 148.91741 14891.74100 2020-01-01 2020-01-02 2020-01-01 00:02:19 2020-01-02 03:30:40 2020-01-01 00:02:19.000 2020-01-02 03:30:40.000 139 99040 49589.5 4958950 139 99040 49589.5 4958950 -32430 32505 5025.02 502502 -125 126 2.3 230 +14 2 10004 99914 0.04204 300.04204 150.04204 15154.24624 0.04204 300.04205 150.04204 15154.2463 0.04204 300.04204 150.04204 15154.24604 2020-01-01 2020-01-02 2020-01-01 00:00:14 2020-01-02 03:45:14 2020-01-01 00:00:14.000 2020-01-02 03:45:14.000 14 99914 49964 5046364 14 99914 49964 5046364 -32555 32380 4543.009900990099 458844 -125 126 0.9108910891089109 92 +140 2 10130 99041 0.42042 297.42042 148.92042 14892.04204 0.42042 297.4204 148.92042 14892.04206 0.42042 297.42042 148.92042 14892.04200 2020-01-01 2020-01-02 2020-01-01 00:02:20 2020-01-02 03:30:41 2020-01-01 00:02:20.000 2020-01-02 03:30:41.000 140 99041 49590.5 4959050 140 99041 49590.5 4959050 -32429 32506 5026.02 502602 -124 127 3.3 330 +141 2 10131 99042 0.42342 297.42342 148.92342 14892.34234 0.42342 297.42343 148.92342 14892.34215 0.42342 297.42342 148.92342 14892.34200 2020-01-01 2020-01-02 2020-01-01 00:02:21 2020-01-02 03:30:42 2020-01-01 00:02:21.000 2020-01-02 03:30:42.000 141 99042 49591.5 4959150 141 99042 49591.5 4959150 -32428 32507 5027.02 502702 -128 127 1.74 174 +142 2 10132 99043 0.42642 297.42642 148.92642 14892.64264 0.42642 297.42642 148.92642 14892.64246 0.42642 297.42642 148.92642 14892.64200 2020-01-01 2020-01-02 2020-01-01 00:02:22 2020-01-02 03:30:43 2020-01-01 00:02:22.000 2020-01-02 03:30:43.000 142 99043 49592.5 4959250 142 99043 49592.5 4959250 -32427 32508 5028.02 502802 -128 123 0.18 18 +143 2 10133 99044 0.42942 297.42942 148.92942 14892.94294 0.42942 297.42944 148.92943 14892.94304 0.42942 297.42942 148.92942 14892.94200 2020-01-01 2020-01-02 2020-01-01 00:02:23 2020-01-02 03:30:44 2020-01-01 00:02:23.000 2020-01-02 03:30:44.000 143 99044 49593.5 4959350 143 99044 49593.5 4959350 -32426 32509 5029.02 502902 -127 124 1.18 118 +144 2 10134 99045 0.43243 297.43243 148.93243 14893.24324 0.43243 297.43243 148.93243 14893.24338 0.43243 297.43243 148.93243 14893.24300 2020-01-01 2020-01-02 2020-01-01 00:02:24 2020-01-02 03:30:45 2020-01-01 00:02:24.000 2020-01-02 03:30:45.000 144 99045 49594.5 4959450 144 99045 49594.5 4959450 -32425 32510 5030.02 503002 -126 125 2.18 218 +145 2 10135 99046 0.43543 297.43543 148.93543 14893.54354 0.43543 297.43542 148.93543 14893.54354 0.43543 297.43543 148.93543 14893.54300 2020-01-01 2020-01-02 2020-01-01 00:02:25 2020-01-02 03:30:46 2020-01-01 00:02:25.000 2020-01-02 03:30:46.000 145 99046 49595.5 4959550 145 99046 49595.5 4959550 -32424 32511 5031.02 503102 -125 126 3.18 318 +146 2 10136 99047 0.43843 297.43843 148.93843 14893.84384 0.43843 297.43845 148.93844 14893.84427 0.43843 297.43843 148.93843 14893.84300 2020-01-01 2020-01-02 2020-01-01 00:02:26 2020-01-02 03:30:47 2020-01-01 00:02:26.000 2020-01-02 03:30:47.000 146 99047 49596.5 4959650 146 99047 49596.5 4959650 -32423 32512 5032.02 503202 -124 127 4.18 418 +147 2 10137 99048 0.44144 297.44144 148.94144 14894.14414 0.44144 297.44144 148.94143 14894.14392 0.44144 297.44144 148.94144 14894.14400 2020-01-01 2020-01-02 2020-01-01 00:02:27 2020-01-02 03:30:48 2020-01-01 00:02:27.000 2020-01-02 03:30:48.000 147 99048 49597.5 4959750 147 99048 49597.5 4959750 -32422 32513 5033.02 503302 -128 127 2.62 262 +148 2 10138 99049 0.44444 297.44444 148.94444 14894.44444 0.44444 297.44446 148.94444 14894.4445 0.44444 297.44444 148.94444 14894.44400 2020-01-01 2020-01-02 2020-01-01 00:02:28 2020-01-02 03:30:49 2020-01-01 00:02:28.000 2020-01-02 03:30:49.000 148 99049 49598.5 4959850 148 99049 49598.5 4959850 -32421 32514 5034.02 503402 -128 127 1.06 106 +149 2 10139 99050 0.44744 297.44744 148.94744 14894.74474 0.44744 297.44745 148.94744 14894.74485 0.44744 297.44744 148.94744 14894.74400 2020-01-01 2020-01-02 2020-01-01 00:02:29 2020-01-02 03:30:50 2020-01-01 00:02:29.000 2020-01-02 03:30:50.000 149 99050 49599.5 4959950 149 99050 49599.5 4959950 -32420 32515 5035.02 503502 -128 124 -0.5 -50 +15 2 10005 99915 0.04504 300.04504 150.04504 15154.54954 0.04504 300.04504 150.04504 15154.54945 0.04504 300.04504 150.04504 15154.54904 2020-01-01 2020-01-02 2020-01-01 00:00:15 2020-01-02 03:45:15 2020-01-01 00:00:15.000 2020-01-02 03:45:15.000 15 99915 49965 5046465 15 99915 49965 5046465 -32554 32381 4544.009900990099 458945 -124 127 1.9108910891089108 193 +150 2 10140 99051 0.45045 297.45045 148.95045 14895.04504 0.45045 297.45044 148.95045 14895.04501 0.45045 297.45045 148.95045 14895.04500 2020-01-01 2020-01-02 2020-01-01 00:02:30 2020-01-02 03:30:51 2020-01-01 00:02:30.000 2020-01-02 03:30:51.000 150 99051 49600.5 4960050 150 99051 49600.5 4960050 -32419 32516 5036.02 503602 -127 125 0.5 50 +151 2 10141 99052 0.45345 297.45345 148.95345 14895.34534 0.45345 297.45346 148.95345 14895.34574 0.45345 297.45345 148.95345 14895.34500 2020-01-01 2020-01-02 2020-01-01 00:02:31 2020-01-02 03:30:52 2020-01-01 00:02:31.000 2020-01-02 03:30:52.000 151 99052 49601.5 4960150 151 99052 49601.5 4960150 -32418 32517 5037.02 503702 -126 126 1.5 150 +152 2 10142 99053 0.45645 297.45645 148.95645 14895.64564 0.45645 297.45645 148.95645 14895.6454 0.45645 297.45645 148.95645 14895.64500 2020-01-01 2020-01-02 2020-01-01 00:02:32 2020-01-02 03:30:53 2020-01-01 00:02:32.000 2020-01-02 03:30:53.000 152 99053 49602.5 4960250 152 99053 49602.5 4960250 -32417 32518 5038.02 503802 -125 127 2.5 250 +153 2 10143 99054 0.45945 297.45945 148.95945 14895.94594 0.45945 297.45947 148.95946 14895.94601 0.45945 297.45945 148.95945 14895.94500 2020-01-01 2020-01-02 2020-01-01 00:02:33 2020-01-02 03:30:54 2020-01-01 00:02:33.000 2020-01-02 03:30:54.000 153 99054 49603.5 4960350 153 99054 49603.5 4960350 -32416 32519 5039.02 503902 -128 127 0.94 94 +154 2 10144 99055 0.46246 297.46246 148.96246 14896.24624 0.46246 297.46246 148.96246 14896.24633 0.46246 297.46246 148.96246 14896.24600 2020-01-01 2020-01-02 2020-01-01 00:02:34 2020-01-02 03:30:55 2020-01-01 00:02:34.000 2020-01-02 03:30:55.000 154 99055 49604.5 4960450 154 99055 49604.5 4960450 -32415 32520 5040.02 504002 -128 127 -0.62 -62 +155 2 10145 99056 0.46546 297.46546 148.96546 14896.54654 0.46546 297.46545 148.96546 14896.54647 0.46546 297.46546 148.96546 14896.54600 2020-01-01 2020-01-02 2020-01-01 00:02:35 2020-01-02 03:30:56 2020-01-01 00:02:35.000 2020-01-02 03:30:56.000 155 99056 49605.5 4960550 155 99056 49605.5 4960550 -32414 32521 5041.02 504102 -128 123 -2.18 -218 +156 2 10146 99057 0.46846 297.46846 148.96846 14896.84684 0.46846 297.46848 148.96847 14896.84721 0.46846 297.46846 148.96846 14896.84600 2020-01-01 2020-01-02 2020-01-01 00:02:36 2020-01-02 03:30:57 2020-01-01 00:02:36.000 2020-01-02 03:30:57.000 156 99057 49606.5 4960650 156 99057 49606.5 4960650 -32413 32522 5042.02 504202 -127 124 -1.18 -118 +157 2 10147 99058 0.47147 297.47147 148.97147 14897.14714 0.47147 297.47147 148.97146 14897.14687 0.47147 297.47147 148.97147 14897.14700 2020-01-01 2020-01-02 2020-01-01 00:02:37 2020-01-02 03:30:58 2020-01-01 00:02:37.000 2020-01-02 03:30:58.000 157 99058 49607.5 4960750 157 99058 49607.5 4960750 -32412 32523 5043.02 504302 -126 125 -0.18 -18 +158 2 10148 99059 0.47447 297.47447 148.97447 14897.44744 0.47447 297.4745 148.97447 14897.44748 0.47447 297.47447 148.97447 14897.44700 2020-01-01 2020-01-02 2020-01-01 00:02:38 2020-01-02 03:30:59 2020-01-01 00:02:38.000 2020-01-02 03:30:59.000 158 99059 49608.5 4960850 158 99059 49608.5 4960850 -32411 32524 5044.02 504402 -125 126 0.82 82 +159 2 10149 99060 0.47747 297.47747 148.97747 14897.74774 0.47747 297.47748 148.97747 14897.74779 0.47747 297.47747 148.97747 14897.74700 2020-01-01 2020-01-02 2020-01-01 00:02:39 2020-01-02 03:31:00 2020-01-01 00:02:39.000 2020-01-02 03:31:00.000 159 99060 49609.5 4960950 159 99060 49609.5 4960950 -32410 32525 5045.02 504502 -124 127 1.82 182 +16 2 10006 99916 0.04804 300.04804 150.04804 15154.85285 0.04804 300.04803 150.04804 15154.85279 0.04804 300.04804 150.04804 15154.85204 2020-01-01 2020-01-02 2020-01-01 00:00:16 2020-01-02 03:45:16 2020-01-01 00:00:16.000 2020-01-02 03:45:16.000 16 99916 49966 5046566 16 99916 49966 5046566 -32553 32382 4545.009900990099 459046 -128 127 0.37623762376237624 38 +160 2 10150 99061 0.48048 297.48048 148.98048 14898.04804 0.48048 297.48047 148.98048 14898.0481 0.48048 297.48048 148.98048 14898.04800 2020-01-01 2020-01-02 2020-01-01 00:02:40 2020-01-02 03:31:01 2020-01-01 00:02:40.000 2020-01-02 03:31:01.000 160 99061 49610.5 4961050 160 99061 49610.5 4961050 -32409 32526 5046.02 504602 -128 127 0.26 26 +161 2 10151 99062 0.48348 297.48348 148.98348 14898.34834 0.48348 297.4835 148.98348 14898.34868 0.48348 297.48348 148.98348 14898.34800 2020-01-01 2020-01-02 2020-01-01 00:02:41 2020-01-02 03:31:02 2020-01-01 00:02:41.000 2020-01-02 03:31:02.000 161 99062 49611.5 4961150 161 99062 49611.5 4961150 -32408 32527 5047.02 504702 -128 123 -1.3 -130 +162 2 10152 99063 0.48648 297.48648 148.98648 14898.64864 0.48648 297.48648 148.98648 14898.64837 0.48648 297.48648 148.98648 14898.64800 2020-01-01 2020-01-02 2020-01-01 00:02:42 2020-01-02 03:31:03 2020-01-01 00:02:42.000 2020-01-02 03:31:03.000 162 99063 49612.5 4961250 162 99063 49612.5 4961250 -32407 32528 5048.02 504802 -127 124 -0.3 -30 +163 2 10153 99064 0.48948 297.48948 148.98948 14898.94894 0.48948 297.4895 148.98948 14898.94895 0.48948 297.48948 148.98948 14898.94800 2020-01-01 2020-01-02 2020-01-01 00:02:43 2020-01-02 03:31:04 2020-01-01 00:02:43.000 2020-01-02 03:31:04.000 163 99064 49613.5 4961350 163 99064 49613.5 4961350 -32406 32529 5049.02 504902 -126 125 0.7 70 +164 2 10154 99065 0.49249 297.49249 148.99249 14899.24924 0.49249 297.4925 148.99249 14899.24926 0.49249 297.49249 148.99249 14899.24900 2020-01-01 2020-01-02 2020-01-01 00:02:44 2020-01-02 03:31:05 2020-01-01 00:02:44.000 2020-01-02 03:31:05.000 164 99065 49614.5 4961450 164 99065 49614.5 4961450 -32405 32530 5050.02 505002 -125 126 1.7 170 +165 2 10155 99066 0.49549 297.49549 148.99549 14899.54954 0.49549 297.49548 148.99549 14899.54957 0.49549 297.49549 148.99549 14899.54900 2020-01-01 2020-01-02 2020-01-01 00:02:45 2020-01-02 03:31:06 2020-01-01 00:02:45.000 2020-01-02 03:31:06.000 165 99066 49615.5 4961550 165 99066 49615.5 4961550 -32404 32531 5051.02 505102 -124 127 2.7 270 +166 2 10156 99067 0.49849 297.49849 148.99849 14899.84984 0.49849 297.4985 148.9985 14899.85015 0.49849 297.49849 148.99849 14899.84900 2020-01-01 2020-01-02 2020-01-01 00:02:46 2020-01-02 03:31:07 2020-01-01 00:02:46.000 2020-01-02 03:31:07.000 166 99067 49616.5 4961650 166 99067 49616.5 4961650 -32403 32532 5052.02 505202 -128 127 1.14 114 +167 2 10157 99068 0.5015 297.5015 149.0015 14900.15015 0.5015 297.5015 149.00149 14900.14984 0.50150 297.50150 149.00150 14900.15000 2020-01-01 2020-01-02 2020-01-01 00:02:47 2020-01-02 03:31:08 2020-01-01 00:02:47.000 2020-01-02 03:31:08.000 167 99068 49617.5 4961750 167 99068 49617.5 4961750 -32402 32533 5053.02 505302 -128 123 -0.42 -42 +168 2 10158 99069 0.5045 297.5045 149.0045 14900.45045 0.5045 297.50452 149.0045 14900.45042 0.50450 297.50450 149.00450 14900.45000 2020-01-01 2020-01-02 2020-01-01 00:02:48 2020-01-02 03:31:09 2020-01-01 00:02:48.000 2020-01-02 03:31:09.000 168 99069 49618.5 4961850 168 99069 49618.5 4961850 -32401 32534 5054.02 505402 -127 124 0.58 58 +169 2 10159 99070 0.5075 297.5075 149.0075 14900.75075 0.5075 297.5075 149.0075 14900.75073 0.50750 297.50750 149.00750 14900.75000 2020-01-01 2020-01-02 2020-01-01 00:02:49 2020-01-02 03:31:10 2020-01-01 00:02:49.000 2020-01-02 03:31:10.000 169 99070 49619.5 4961950 169 99070 49619.5 4961950 -32400 32535 5055.02 505502 -126 125 1.58 158 +17 2 10007 99917 0.05105 300.05105 150.05105 15155.15615 0.05105 300.05106 150.05105 15155.15638 0.05105 300.05105 150.05105 15155.15605 2020-01-01 2020-01-02 2020-01-01 00:00:17 2020-01-02 03:45:17 2020-01-01 00:00:17.000 2020-01-02 03:45:17.000 17 99917 49967 5046667 17 99917 49967 5046667 -32552 32383 4546.009900990099 459147 -128 127 -1.1584158415841583 -117 +170 2 10160 99071 0.51051 297.51051 149.01051 14901.05105 0.51051 297.5105 149.01051 14901.05104 0.51051 297.51051 149.01051 14901.05100 2020-01-01 2020-01-02 2020-01-01 00:02:50 2020-01-02 03:31:11 2020-01-01 00:02:50.000 2020-01-02 03:31:11.000 170 99071 49620.5 4962050 170 99071 49620.5 4962050 -32399 32536 5056.02 505602 -125 126 2.58 258 +171 2 10161 99072 0.51351 297.51351 149.01351 14901.35135 0.51351 297.51352 149.01351 14901.35162 0.51351 297.51351 149.01351 14901.35100 2020-01-01 2020-01-02 2020-01-01 00:02:51 2020-01-02 03:31:12 2020-01-01 00:02:51.000 2020-01-02 03:31:12.000 171 99072 49621.5 4962150 171 99072 49621.5 4962150 -32398 32537 5057.02 505702 -124 127 3.58 358 +172 2 10162 99073 0.51651 297.51651 149.01651 14901.65165 0.51651 297.5165 149.01651 14901.65131 0.51651 297.51651 149.01651 14901.65100 2020-01-01 2020-01-02 2020-01-01 00:02:52 2020-01-02 03:31:13 2020-01-01 00:02:52.000 2020-01-02 03:31:13.000 172 99073 49622.5 4962250 172 99073 49622.5 4962250 -32397 32538 5058.02 505802 -128 127 2.02 202 +173 2 10163 99074 0.51951 297.51951 149.01951 14901.95195 0.51951 297.51953 149.01951 14901.95189 0.51951 297.51951 149.01951 14901.95100 2020-01-01 2020-01-02 2020-01-01 00:02:53 2020-01-02 03:31:14 2020-01-01 00:02:53.000 2020-01-02 03:31:14.000 173 99074 49623.5 4962350 173 99074 49623.5 4962350 -32396 32539 5059.02 505902 -128 127 0.46 46 +174 2 10164 99075 0.52252 297.52252 149.02252 14902.25225 0.52252 297.52252 149.02252 14902.2522 0.52252 297.52252 149.02252 14902.25200 2020-01-01 2020-01-02 2020-01-01 00:02:54 2020-01-02 03:31:15 2020-01-01 00:02:54.000 2020-01-02 03:31:15.000 174 99075 49624.5 4962450 174 99075 49624.5 4962450 -32395 32540 5060.02 506002 -128 124 -1.1 -110 +175 2 10165 99076 0.52552 297.52552 149.02552 14902.55255 0.52552 297.5255 149.02552 14902.55251 0.52552 297.52552 149.02552 14902.55200 2020-01-01 2020-01-02 2020-01-01 00:02:55 2020-01-02 03:31:16 2020-01-01 00:02:55.000 2020-01-02 03:31:16.000 175 99076 49625.5 4962550 175 99076 49625.5 4962550 -32394 32541 5061.02 506102 -127 125 -0.1 -10 +176 2 10166 99077 0.52852 297.52852 149.02852 14902.85285 0.52852 297.52853 149.02853 14902.85312 0.52852 297.52852 149.02852 14902.85200 2020-01-01 2020-01-02 2020-01-01 00:02:56 2020-01-02 03:31:17 2020-01-01 00:02:56.000 2020-01-02 03:31:17.000 176 99077 49626.5 4962650 176 99077 49626.5 4962650 -32393 32542 5062.02 506202 -126 126 0.9 90 +177 2 10167 99078 0.53153 297.53153 149.03153 14903.15315 0.53153 297.53152 149.03152 14903.15278 0.53153 297.53153 149.03153 14903.15300 2020-01-01 2020-01-02 2020-01-01 00:02:57 2020-01-02 03:31:18 2020-01-01 00:02:57.000 2020-01-02 03:31:18.000 177 99078 49627.5 4962750 177 99078 49627.5 4962750 -32392 32543 5063.02 506302 -125 127 1.9 190 +178 2 10168 99079 0.53453 297.53453 149.03453 14903.45345 0.53453 297.53455 149.03453 14903.45352 0.53453 297.53453 149.03453 14903.45300 2020-01-01 2020-01-02 2020-01-01 00:02:58 2020-01-02 03:31:19 2020-01-01 00:02:58.000 2020-01-02 03:31:19.000 178 99079 49628.5 4962850 178 99079 49628.5 4962850 -32391 32544 5064.02 506402 -128 127 0.34 34 +179 2 10169 99080 0.53753 297.53753 149.03753 14903.75375 0.53753 297.53754 149.03753 14903.75366 0.53753 297.53753 149.03753 14903.75300 2020-01-01 2020-01-02 2020-01-01 00:02:59 2020-01-02 03:31:20 2020-01-01 00:02:59.000 2020-01-02 03:31:20.000 179 99080 49629.5 4962950 179 99080 49629.5 4962950 -32390 32545 5065.02 506502 -128 127 -1.22 -122 +18 2 10008 99918 0.05405 300.05405 150.05405 15155.45945 0.05405 300.05405 150.05404 15155.45903 0.05405 300.05405 150.05405 15155.45905 2020-01-01 2020-01-02 2020-01-01 00:00:18 2020-01-02 03:45:18 2020-01-01 00:00:18.000 2020-01-02 03:45:18.000 18 99918 49968 5046768 18 99918 49968 5046768 -32551 32384 4547.009900990099 459248 -128 124 -2.6930693069306932 -272 +180 2 10170 99081 0.54054 297.54054 149.04054 14904.05405 0.54054 297.54053 149.04053 14904.05398 0.54054 297.54054 149.04054 14904.05400 2020-01-01 2020-01-02 2020-01-01 00:03:00 2020-01-02 03:31:21 2020-01-01 00:03:00.000 2020-01-02 03:31:21.000 180 99081 49630.5 4963050 180 99081 49630.5 4963050 -32389 32546 5066.02 506602 -128 123 -2.78 -278 +181 2 10171 99082 0.54354 297.54354 149.04354 14904.35435 0.54354 297.54355 149.04354 14904.35459 0.54354 297.54354 149.04354 14904.35400 2020-01-01 2020-01-02 2020-01-01 00:03:01 2020-01-02 03:31:22 2020-01-01 00:03:01.000 2020-01-02 03:31:22.000 181 99082 49631.5 4963150 181 99082 49631.5 4963150 -32388 32547 5067.02 506702 -127 124 -1.78 -178 +182 2 10172 99083 0.54654 297.54654 149.04654 14904.65465 0.54654 297.54654 149.04654 14904.65425 0.54654 297.54654 149.04654 14904.65400 2020-01-01 2020-01-02 2020-01-01 00:03:02 2020-01-02 03:31:23 2020-01-01 00:03:02.000 2020-01-02 03:31:23.000 182 99083 49632.5 4963250 182 99083 49632.5 4963250 -32387 32548 5068.02 506802 -126 125 -0.78 -78 +183 2 10173 99084 0.54954 297.54954 149.04954 14904.95495 0.54954 297.54956 149.04954 14904.95498 0.54954 297.54954 149.04954 14904.95400 2020-01-01 2020-01-02 2020-01-01 00:03:03 2020-01-02 03:31:24 2020-01-01 00:03:03.000 2020-01-02 03:31:24.000 183 99084 49633.5 4963350 183 99084 49633.5 4963350 -32386 32549 5069.02 506902 -125 126 0.22 22 +184 2 10174 99085 0.55255 297.55255 149.05255 14905.25525 0.55255 297.55255 149.05255 14905.25514 0.55255 297.55255 149.05255 14905.25500 2020-01-01 2020-01-02 2020-01-01 00:03:04 2020-01-02 03:31:25 2020-01-01 00:03:04.000 2020-01-02 03:31:25.000 184 99085 49634.5 4963450 184 99085 49634.5 4963450 -32385 32550 5070.02 507002 -124 127 1.22 122 +185 2 10175 99086 0.55555 297.55555 149.05555 14905.55555 0.55555 297.55554 149.05555 14905.55549 0.55555 297.55555 149.05555 14905.55500 2020-01-01 2020-01-02 2020-01-01 00:03:05 2020-01-02 03:31:26 2020-01-01 00:03:05.000 2020-01-02 03:31:26.000 185 99086 49635.5 4963550 185 99086 49635.5 4963550 -32384 32551 5071.02 507102 -128 127 -0.34 -34 +186 2 10176 99087 0.55855 297.55855 149.05855 14905.85585 0.55855 297.55856 149.05856 14905.85607 0.55855 297.55855 149.05855 14905.85500 2020-01-01 2020-01-02 2020-01-01 00:03:06 2020-01-02 03:31:27 2020-01-01 00:03:06.000 2020-01-02 03:31:27.000 186 99087 49636.5 4963650 186 99087 49636.5 4963650 -32383 32552 5072.02 507202 -128 123 -1.9 -190 +187 2 10177 99088 0.56156 297.56156 149.06156 14906.15615 0.56156 297.56155 149.06155 14906.15572 0.56156 297.56156 149.06156 14906.15600 2020-01-01 2020-01-02 2020-01-01 00:03:07 2020-01-02 03:31:28 2020-01-01 00:03:07.000 2020-01-02 03:31:28.000 187 99088 49637.5 4963750 187 99088 49637.5 4963750 -32382 32553 5073.02 507302 -127 124 -0.9 -90 +188 2 10178 99089 0.56456 297.56456 149.06456 14906.45645 0.56456 297.56458 149.06456 14906.45645 0.56456 297.56456 149.06456 14906.45600 2020-01-01 2020-01-02 2020-01-01 00:03:08 2020-01-02 03:31:29 2020-01-01 00:03:08.000 2020-01-02 03:31:29.000 188 99089 49638.5 4963850 188 99089 49638.5 4963850 -32381 32554 5074.02 507402 -126 125 0.1 10 +189 2 10179 99090 0.56756 297.56756 149.06756 14906.75675 0.56756 297.56757 149.06756 14906.75661 0.56756 297.56756 149.06756 14906.75600 2020-01-01 2020-01-02 2020-01-01 00:03:09 2020-01-02 03:31:30 2020-01-01 00:03:09.000 2020-01-02 03:31:30.000 189 99090 49639.5 4963950 189 99090 49639.5 4963950 -32380 32555 5075.02 507502 -125 126 1.1 110 +19 2 10009 99919 0.05705 300.05705 150.05705 15155.76276 0.05705 300.05707 150.05705 15155.76279 0.05705 300.05705 150.05705 15155.76205 2020-01-01 2020-01-02 2020-01-01 00:00:19 2020-01-02 03:45:19 2020-01-01 00:00:19.000 2020-01-02 03:45:19.000 19 99919 49969 5046869 19 99919 49969 5046869 -32550 32385 4548.009900990099 459349 -127 125 -1.693069306930693 -171 +190 2 10180 99091 0.57057 297.57057 149.07057 14907.05705 0.57057 297.57056 149.07056 14907.05695 0.57057 297.57057 149.07057 14907.05700 2020-01-01 2020-01-02 2020-01-01 00:03:10 2020-01-02 03:31:31 2020-01-01 00:03:10.000 2020-01-02 03:31:31.000 190 99091 49640.5 4964050 190 99091 49640.5 4964050 -32379 32556 5076.02 507602 -124 127 2.1 210 +191 2 10181 99092 0.57357 297.57357 149.07357 14907.35735 0.57357 297.57358 149.07357 14907.35753 0.57357 297.57357 149.07357 14907.35700 2020-01-01 2020-01-02 2020-01-01 00:03:11 2020-01-02 03:31:32 2020-01-01 00:03:11.000 2020-01-02 03:31:32.000 191 99092 49641.5 4964150 191 99092 49641.5 4964150 -32378 32557 5077.02 507702 -128 127 0.54 54 +192 2 10182 99093 0.57657 297.57657 149.07657 14907.65765 0.57657 297.57657 149.07657 14907.65784 0.57657 297.57657 149.07657 14907.65700 2020-01-01 2020-01-02 2020-01-01 00:03:12 2020-01-02 03:31:33 2020-01-01 00:03:12.000 2020-01-02 03:31:33.000 192 99093 49642.5 4964250 192 99093 49642.5 4964250 -32377 32558 5078.02 507802 -128 123 -1.02 -102 +193 2 10183 99094 0.57957 297.57957 149.07957 14907.95795 0.57957 297.5796 149.07957 14907.95793 0.57957 297.57957 149.07957 14907.95700 2020-01-01 2020-01-02 2020-01-01 00:03:13 2020-01-02 03:31:34 2020-01-01 00:03:13.000 2020-01-02 03:31:34.000 193 99094 49643.5 4964350 193 99094 49643.5 4964350 -32376 32559 5079.02 507902 -127 124 -0.02 -2 +194 2 10184 99095 0.58258 297.58258 149.08258 14908.25825 0.58258 297.58258 149.08258 14908.25811 0.58258 297.58258 149.08258 14908.25800 2020-01-01 2020-01-02 2020-01-01 00:03:14 2020-01-02 03:31:35 2020-01-01 00:03:14.000 2020-01-02 03:31:35.000 194 99095 49644.5 4964450 194 99095 49644.5 4964450 -32375 32560 5080.02 508002 -126 125 0.98 98 +195 2 10185 99096 0.58558 297.58558 149.08558 14908.55855 0.58558 297.58557 149.08558 14908.55842 0.58558 297.58558 149.08558 14908.55800 2020-01-01 2020-01-02 2020-01-01 00:03:15 2020-01-02 03:31:36 2020-01-01 00:03:15.000 2020-01-02 03:31:36.000 195 99096 49645.5 4964550 195 99096 49645.5 4964550 -32374 32561 5081.02 508102 -125 126 1.98 198 +196 2 10186 99097 0.58858 297.58858 149.08858 14908.85885 0.58858 297.5886 149.08859 14908.859 0.58858 297.58858 149.08858 14908.85800 2020-01-01 2020-01-02 2020-01-01 00:03:16 2020-01-02 03:31:37 2020-01-01 00:03:16.000 2020-01-02 03:31:37.000 196 99097 49646.5 4964650 196 99097 49646.5 4964650 -32373 32562 5082.02 508202 -124 127 2.98 298 +197 2 10187 99098 0.59159 297.59159 149.09159 14909.15915 0.59159 297.59158 149.09159 14909.15931 0.59159 297.59159 149.09159 14909.15900 2020-01-01 2020-01-02 2020-01-01 00:03:17 2020-01-02 03:31:38 2020-01-01 00:03:17.000 2020-01-02 03:31:38.000 197 99098 49647.5 4964750 197 99098 49647.5 4964750 -32372 32563 5083.02 508302 -128 127 1.42 142 +198 2 10188 99099 0.59459 297.59459 149.09459 14909.45945 0.59459 297.5946 149.09459 14909.4594 0.59459 297.59459 149.09459 14909.45900 2020-01-01 2020-01-02 2020-01-01 00:03:18 2020-01-02 03:31:39 2020-01-01 00:03:18.000 2020-01-02 03:31:39.000 198 99099 49648.5 4964850 198 99099 49648.5 4964850 -32371 32564 5084.02 508402 -128 127 -0.14 -14 +199 2 10189 99100 0.59759 297.59759 149.09759 14909.75975 0.59759 297.5976 149.09759 14909.75958 0.59759 297.59759 149.09759 14909.75900 2020-01-01 2020-01-02 2020-01-01 00:03:19 2020-01-02 03:31:40 2020-01-01 00:03:19.000 2020-01-02 03:31:40.000 199 99100 49649.5 4964950 199 99100 49649.5 4964950 -32370 32565 5085.02 508502 -128 124 -1.7 -170 +2 2 1001 9992 0.006 300.006 150.006 15150.6066 0.006 300.006 150.006 15150.6069 0.00600 300.00600 150.00600 15150.60600 2020-01-01 2020-01-02 2020-01-01 00:00:02 2020-01-02 03:45:02 2020-01-01 00:00:02.000 2020-01-02 03:45:02.000 2 99902 49952 5045152 2 99902 49952 5045152 -32567 32368 4531.009900990099 457632 -125 126 -0.9504950495049505 -96 +20 2 10010 99920 0.06006 300.06006 150.06006 15156.06606 0.06006 300.06006 150.06005 15156.06593 0.06006 300.06006 150.06006 15156.06606 2020-01-01 2020-01-02 2020-01-01 00:00:20 2020-01-02 03:45:20 2020-01-01 00:00:20.000 2020-01-02 03:45:20.000 20 99920 49970 5046970 20 99920 49970 5046970 -32549 32386 4549.009900990099 459450 -126 126 -0.693069306930693 -70 +200 2 10190 99101 0.6006 297.6006 149.1006 14910.06006 0.6006 297.6006 149.10059 14910.0599 0.60060 297.60060 149.10060 14910.06000 2020-01-01 2020-01-02 2020-01-01 00:03:20 2020-01-02 03:31:41 2020-01-01 00:03:20.000 2020-01-02 03:31:41.000 200 99101 49650.5 4965050 200 99101 49650.5 4965050 -32369 32566 5086.02 508602 -127 125 -0.7 -70 +201 2 10191 99102 0.6036 297.6036 149.1036 14910.36036 0.6036 297.6036 149.1036 14910.36063 0.60360 297.60360 149.10360 14910.36000 2020-01-01 2020-01-02 2020-01-01 00:03:21 2020-01-02 03:31:42 2020-01-01 00:03:21.000 2020-01-02 03:31:42.000 201 99102 49651.5 4965150 201 99102 49651.5 4965150 -32368 32567 5087.02 508702 -126 126 0.3 30 +202 2 10192 99103 0.6066 297.6066 149.1066 14910.66066 0.6066 297.6066 149.1066 14910.66078 0.60660 297.60660 149.10660 14910.66000 2020-01-01 2020-01-02 2020-01-01 00:03:22 2020-01-02 03:31:43 2020-01-01 00:03:22.000 2020-01-02 03:31:43.000 202 99103 49652.5 4965250 202 99103 49652.5 4965250 -32367 32568 5088.02 508802 -125 127 1.3 130 +203 2 10193 99104 0.6096 297.6096 149.1096 14910.96096 0.6096 297.60962 149.1096 14910.9609 0.60960 297.60960 149.10960 14910.96000 2020-01-01 2020-01-02 2020-01-01 00:03:23 2020-01-02 03:31:44 2020-01-01 00:03:23.000 2020-01-02 03:31:44.000 203 99104 49653.5 4965350 203 99104 49653.5 4965350 -32366 32569 5089.02 508902 -128 127 -0.26 -26 +204 2 10194 99105 0.61261 297.61261 149.11261 14911.26126 0.61261 297.6126 149.11261 14911.26105 0.61261 297.61261 149.11261 14911.26100 2020-01-01 2020-01-02 2020-01-01 00:03:24 2020-01-02 03:31:45 2020-01-01 00:03:24.000 2020-01-02 03:31:45.000 204 99105 49654.5 4965450 204 99105 49654.5 4965450 -32365 32570 5090.02 509002 -128 127 -1.82 -182 +205 2 10195 99106 0.61561 297.61561 149.11561 14911.56156 0.61561 297.6156 149.11561 14911.56137 0.61561 297.61561 149.11561 14911.56100 2020-01-01 2020-01-02 2020-01-01 00:03:25 2020-01-02 03:31:46 2020-01-01 00:03:25.000 2020-01-02 03:31:46.000 205 99106 49655.5 4965550 205 99106 49655.5 4965550 -32364 32571 5091.02 509102 -128 123 -3.38 -338 +206 2 10196 99107 0.61861 297.61861 149.11861 14911.86186 0.61861 297.61862 149.11862 14911.8621 0.61861 297.61861 149.11861 14911.86100 2020-01-01 2020-01-02 2020-01-01 00:03:26 2020-01-02 03:31:47 2020-01-01 00:03:26.000 2020-01-02 03:31:47.000 206 99107 49656.5 4965650 206 99107 49656.5 4965650 -32363 32572 5092.02 509202 -127 124 -2.38 -238 +207 2 10197 99108 0.62162 297.62162 149.12162 14912.16216 0.62162 297.6216 149.12162 14912.16225 0.62162 297.62162 149.12162 14912.16200 2020-01-01 2020-01-02 2020-01-01 00:03:27 2020-01-02 03:31:48 2020-01-01 00:03:27.000 2020-01-02 03:31:48.000 207 99108 49657.5 4965750 207 99108 49657.5 4965750 -32362 32573 5093.02 509302 -126 125 -1.38 -138 +208 2 10198 99109 0.62462 297.62462 149.12462 14912.46246 0.62462 297.62463 149.12462 14912.46237 0.62462 297.62462 149.12462 14912.46200 2020-01-01 2020-01-02 2020-01-01 00:03:28 2020-01-02 03:31:49 2020-01-01 00:03:28.000 2020-01-02 03:31:49.000 208 99109 49658.5 4965850 208 99109 49658.5 4965850 -32361 32574 5094.02 509402 -125 126 -0.38 -38 +209 2 10199 99110 0.62762 297.62762 149.12762 14912.76276 0.62762 297.62762 149.12762 14912.76253 0.62762 297.62762 149.12762 14912.76200 2020-01-01 2020-01-02 2020-01-01 00:03:29 2020-01-02 03:31:50 2020-01-01 00:03:29.000 2020-01-02 03:31:50.000 209 99110 49659.5 4965950 209 99110 49659.5 4965950 -32360 32575 5095.02 509502 -124 127 0.62 62 +21 2 10011 99921 0.06306 300.06306 150.06306 15156.36936 0.06306 300.06305 150.06306 15156.36927 0.06306 300.06306 150.06306 15156.36906 2020-01-01 2020-01-02 2020-01-01 00:00:21 2020-01-02 03:45:21 2020-01-01 00:00:21.000 2020-01-02 03:45:21.000 21 99921 49971 5047071 21 99921 49971 5047071 -32548 32387 4550.009900990099 459551 -125 127 0.3069306930693069 31 +210 2 10200 99111 0.63063 297.63063 149.13063 14913.06306 0.63063 297.63065 149.13063 14913.06326 0.63063 297.63063 149.13063 14913.06300 2020-01-01 2020-01-02 2020-01-01 00:03:30 2020-01-02 03:31:51 2020-01-01 00:03:30.000 2020-01-02 03:31:51.000 210 99111 49660.5 4966050 210 99111 49660.5 4966050 -32359 32576 5096.02 509602 -128 127 -0.94 -94 +211 2 10201 99112 0.63363 297.63363 149.13363 14913.36336 0.63363 297.63364 149.13363 14913.36357 0.63363 297.63363 149.13363 14913.36300 2020-01-01 2020-01-02 2020-01-01 00:03:31 2020-01-02 03:31:52 2020-01-01 00:03:31.000 2020-01-02 03:31:52.000 211 99112 49661.5 4966150 211 99112 49661.5 4966150 -32358 32577 5097.02 509702 -128 123 -2.5 -250 +212 2 10202 99113 0.63663 297.63663 149.13663 14913.66366 0.63663 297.63663 149.13663 14913.66372 0.63663 297.63663 149.13663 14913.66300 2020-01-01 2020-01-02 2020-01-01 00:03:32 2020-01-02 03:31:53 2020-01-01 00:03:32.000 2020-01-02 03:31:53.000 212 99113 49662.5 4966250 212 99113 49662.5 4966250 -32357 32578 5098.02 509802 -127 124 -1.5 -150 +213 2 10203 99114 0.63963 297.63963 149.13963 14913.96396 0.63963 297.63965 149.13963 14913.96384 0.63963 297.63963 149.13963 14913.96300 2020-01-01 2020-01-02 2020-01-01 00:03:33 2020-01-02 03:31:54 2020-01-01 00:03:33.000 2020-01-02 03:31:54.000 213 99114 49663.5 4966350 213 99114 49663.5 4966350 -32356 32579 5099.02 509902 -126 125 -0.5 -50 +214 2 10204 99115 0.64264 297.64264 149.14264 14914.26426 0.64264 297.64264 149.14263 14914.26399 0.64264 297.64264 149.14264 14914.26400 2020-01-01 2020-01-02 2020-01-01 00:03:34 2020-01-02 03:31:55 2020-01-01 00:03:34.000 2020-01-02 03:31:55.000 214 99115 49664.5 4966450 214 99115 49664.5 4966450 -32355 32580 5100.02 510002 -125 126 0.5 50 +215 2 10205 99116 0.64564 297.64564 149.14564 14914.56456 0.64564 297.64566 149.14564 14914.56473 0.64564 297.64564 149.14564 14914.56400 2020-01-01 2020-01-02 2020-01-01 00:03:35 2020-01-02 03:31:56 2020-01-01 00:03:35.000 2020-01-02 03:31:56.000 215 99116 49665.5 4966550 215 99116 49665.5 4966550 -32354 32581 5101.02 510102 -124 127 1.5 150 +216 2 10206 99117 0.64864 297.64864 149.14864 14914.86486 0.64864 297.64865 149.14865 14914.86504 0.64864 297.64864 149.14864 14914.86400 2020-01-01 2020-01-02 2020-01-01 00:03:36 2020-01-02 03:31:57 2020-01-01 00:03:36.000 2020-01-02 03:31:57.000 216 99117 49666.5 4966650 216 99117 49666.5 4966650 -32353 32582 5102.02 510202 -128 127 -0.06 -6 +217 2 10207 99118 0.65165 297.65165 149.15165 14915.16516 0.65165 297.65164 149.15165 14915.16523 0.65165 297.65165 149.15165 14915.16500 2020-01-01 2020-01-02 2020-01-01 00:03:37 2020-01-02 03:31:58 2020-01-01 00:03:37.000 2020-01-02 03:31:58.000 217 99118 49667.5 4966750 217 99118 49667.5 4966750 -32352 32583 5103.02 510302 -128 123 -1.62 -162 +218 2 10208 99119 0.65465 297.65465 149.15465 14915.46546 0.65465 297.65466 149.15465 14915.46531 0.65465 297.65465 149.15465 14915.46500 2020-01-01 2020-01-02 2020-01-01 00:03:38 2020-01-02 03:31:59 2020-01-01 00:03:38.000 2020-01-02 03:31:59.000 218 99119 49668.5 4966850 218 99119 49668.5 4966850 -32351 32584 5104.02 510402 -127 124 -0.62 -62 +219 2 10209 99120 0.65765 297.65765 149.15765 14915.76576 0.65765 297.65765 149.15765 14915.76562 0.65765 297.65765 149.15765 14915.76500 2020-01-01 2020-01-02 2020-01-01 00:03:39 2020-01-02 03:32:00 2020-01-01 00:03:39.000 2020-01-02 03:32:00.000 219 99120 49669.5 4966950 219 99120 49669.5 4966950 -32350 32585 5105.02 510502 -126 125 0.38 38 +22 2 10012 99922 0.06606 300.06606 150.06606 15156.67267 0.06606 300.06607 150.06606 15156.67287 0.06606 300.06606 150.06606 15156.67206 2020-01-01 2020-01-02 2020-01-01 00:00:22 2020-01-02 03:45:22 2020-01-01 00:00:22.000 2020-01-02 03:45:22.000 22 99922 49972 5047172 22 99922 49972 5047172 -32547 32388 4551.009900990099 459652 -128 127 -1.2277227722772277 -124 +220 2 10210 99121 0.66066 297.66066 149.16066 14916.06606 0.66066 297.66068 149.16066 14916.06619 0.66066 297.66066 149.16066 14916.06600 2020-01-01 2020-01-02 2020-01-01 00:03:40 2020-01-02 03:32:01 2020-01-01 00:03:40.000 2020-01-02 03:32:01.000 220 99121 49670.5 4967050 220 99121 49670.5 4967050 -32349 32586 5106.02 510602 -125 126 1.38 138 +221 2 10211 99122 0.66366 297.66366 149.16366 14916.36636 0.66366 297.66367 149.16366 14916.36651 0.66366 297.66366 149.16366 14916.36600 2020-01-01 2020-01-02 2020-01-01 00:03:41 2020-01-02 03:32:02 2020-01-01 00:03:41.000 2020-01-02 03:32:02.000 221 99122 49671.5 4967150 221 99122 49671.5 4967150 -32348 32587 5107.02 510702 -124 127 2.38 238 +222 2 10212 99123 0.66666 297.66666 149.16666 14916.66666 0.66666 297.66666 149.16666 14916.6667 0.66666 297.66666 149.16666 14916.66600 2020-01-01 2020-01-02 2020-01-01 00:03:42 2020-01-02 03:32:03 2020-01-01 00:03:42.000 2020-01-02 03:32:03.000 222 99123 49672.5 4967250 222 99123 49672.5 4967250 -32347 32588 5108.02 510802 -128 127 0.82 82 +223 2 10213 99124 0.66966 297.66966 149.16966 14916.96696 0.66966 297.66968 149.16966 14916.96678 0.66966 297.66966 149.16966 14916.96600 2020-01-01 2020-01-02 2020-01-01 00:03:43 2020-01-02 03:32:04 2020-01-01 00:03:43.000 2020-01-02 03:32:04.000 223 99124 49673.5 4967350 223 99124 49673.5 4967350 -32346 32589 5109.02 510902 -128 127 -0.74 -74 +224 2 10214 99125 0.67267 297.67267 149.17267 14917.26726 0.67267 297.67267 149.17267 14917.26709 0.67267 297.67267 149.17267 14917.26700 2020-01-01 2020-01-02 2020-01-01 00:03:44 2020-01-02 03:32:05 2020-01-01 00:03:44.000 2020-01-02 03:32:05.000 224 99125 49674.5 4967450 224 99125 49674.5 4967450 -32345 32590 5110.02 511002 -128 124 -2.3 -230 +225 2 10215 99126 0.67567 297.67567 149.17567 14917.56756 0.67567 297.6757 149.17567 14917.56767 0.67567 297.67567 149.17567 14917.56700 2020-01-01 2020-01-02 2020-01-01 00:03:45 2020-01-02 03:32:06 2020-01-01 00:03:45.000 2020-01-02 03:32:06.000 225 99126 49675.5 4967550 225 99126 49675.5 4967550 -32344 32591 5111.02 511102 -127 125 -1.3 -130 +226 2 10216 99127 0.67867 297.67867 149.17867 14917.86786 0.67867 297.67868 149.17868 14917.86802 0.67867 297.67867 149.17867 14917.86700 2020-01-01 2020-01-02 2020-01-01 00:03:46 2020-01-02 03:32:07 2020-01-01 00:03:46.000 2020-01-02 03:32:07.000 226 99127 49676.5 4967650 226 99127 49676.5 4967650 -32343 32592 5112.02 511202 -126 126 -0.3 -30 +227 2 10217 99128 0.68168 297.68168 149.18168 14918.16816 0.68168 297.68167 149.18168 14918.16817 0.68168 297.68168 149.18168 14918.16800 2020-01-01 2020-01-02 2020-01-01 00:03:47 2020-01-02 03:32:08 2020-01-01 00:03:47.000 2020-01-02 03:32:08.000 227 99128 49677.5 4967750 227 99128 49677.5 4967750 -32342 32593 5113.02 511302 -125 127 0.7 70 +228 2 10218 99129 0.68468 297.68468 149.18468 14918.46846 0.68468 297.6847 149.18468 14918.46825 0.68468 297.68468 149.18468 14918.46800 2020-01-01 2020-01-02 2020-01-01 00:03:48 2020-01-02 03:32:09 2020-01-01 00:03:48.000 2020-01-02 03:32:09.000 228 99129 49678.5 4967850 228 99129 49678.5 4967850 -32341 32594 5114.02 511402 -128 127 -0.86 -86 +229 2 10219 99130 0.68768 297.68768 149.18768 14918.76876 0.68768 297.68768 149.18768 14918.76855 0.68768 297.68768 149.18768 14918.76800 2020-01-01 2020-01-02 2020-01-01 00:03:49 2020-01-02 03:32:10 2020-01-01 00:03:49.000 2020-01-02 03:32:10.000 229 99130 49679.5 4967950 229 99130 49679.5 4967950 -32340 32595 5115.02 511502 -128 127 -2.42 -242 +23 2 10013 99923 0.06906 300.06906 150.06906 15156.97597 0.06906 300.06906 150.06907 15156.97617 0.06906 300.06906 150.06906 15156.97506 2020-01-01 2020-01-02 2020-01-01 00:00:23 2020-01-02 03:45:23 2020-01-01 00:00:23.000 2020-01-02 03:45:23.000 23 99923 49973 5047273 23 99923 49973 5047273 -32546 32389 4552.009900990099 459753 -128 127 -2.762376237623762 -279 +230 2 10220 99131 0.69069 297.69069 149.19069 14919.06906 0.69069 297.6907 149.19069 14919.06914 0.69069 297.69069 149.19069 14919.06900 2020-01-01 2020-01-02 2020-01-01 00:03:50 2020-01-02 03:32:11 2020-01-01 00:03:50.000 2020-01-02 03:32:11.000 230 99131 49680.5 4968050 230 99131 49680.5 4968050 -32339 32596 5116.02 511602 -128 123 -3.98 -398 +231 2 10221 99132 0.69369 297.69369 149.19369 14919.36936 0.69369 297.6937 149.19369 14919.36949 0.69369 297.69369 149.19369 14919.36900 2020-01-01 2020-01-02 2020-01-01 00:03:51 2020-01-02 03:32:12 2020-01-01 00:03:51.000 2020-01-02 03:32:12.000 231 99132 49681.5 4968150 231 99132 49681.5 4968150 -32338 32597 5117.02 511702 -127 124 -2.98 -298 +232 2 10222 99133 0.69669 297.69669 149.19669 14919.66966 0.69669 297.6967 149.19669 14919.66964 0.69669 297.69669 149.19669 14919.66900 2020-01-01 2020-01-02 2020-01-01 00:03:52 2020-01-02 03:32:13 2020-01-01 00:03:52.000 2020-01-02 03:32:13.000 232 99133 49682.5 4968250 232 99133 49682.5 4968250 -32337 32598 5118.02 511802 -126 125 -1.98 -198 +233 2 10223 99134 0.69969 297.69969 149.19969 14919.96996 0.69969 297.6997 149.1997 14919.97037 0.69969 297.69969 149.19969 14919.96900 2020-01-01 2020-01-02 2020-01-01 00:03:53 2020-01-02 03:32:14 2020-01-01 00:03:53.000 2020-01-02 03:32:14.000 233 99134 49683.5 4968350 233 99134 49683.5 4968350 -32336 32599 5119.02 511902 -125 126 -0.98 -98 +234 2 10224 99135 0.7027 297.7027 149.2027 14920.27027 0.7027 297.7027 149.2027 14920.27003 0.70270 297.70270 149.20270 14920.27000 2020-01-01 2020-01-02 2020-01-01 00:03:54 2020-01-02 03:32:15 2020-01-01 00:03:54.000 2020-01-02 03:32:15.000 234 99135 49684.5 4968450 234 99135 49684.5 4968450 -32335 32600 5120.02 512002 -124 127 0.02 2 +235 2 10225 99136 0.7057 297.7057 149.2057 14920.57057 0.7057 297.70572 149.2057 14920.57065 0.70570 297.70570 149.20570 14920.57000 2020-01-01 2020-01-02 2020-01-01 00:03:55 2020-01-02 03:32:16 2020-01-01 00:03:55.000 2020-01-02 03:32:16.000 235 99136 49685.5 4968550 235 99136 49685.5 4968550 -32334 32601 5121.02 512102 -128 127 -1.54 -154 +236 2 10226 99137 0.7087 297.7087 149.2087 14920.87087 0.7087 297.7087 149.2087 14920.87095 0.70870 297.70870 149.20870 14920.87000 2020-01-01 2020-01-02 2020-01-01 00:03:56 2020-01-02 03:32:17 2020-01-01 00:03:56.000 2020-01-02 03:32:17.000 236 99137 49686.5 4968650 236 99137 49686.5 4968650 -32333 32602 5122.02 512202 -128 123 -3.1 -310 +237 2 10227 99138 0.71171 297.71171 149.21171 14921.17117 0.71171 297.7117 149.21171 14921.17111 0.71171 297.71171 149.21171 14921.17100 2020-01-01 2020-01-02 2020-01-01 00:03:57 2020-01-02 03:32:18 2020-01-01 00:03:57.000 2020-01-02 03:32:18.000 237 99138 49687.5 4968750 237 99138 49687.5 4968750 -32332 32603 5123.02 512302 -127 124 -2.1 -210 +238 2 10228 99139 0.71471 297.71471 149.21471 14921.47147 0.71471 297.71472 149.21471 14921.47184 0.71471 297.71471 149.21471 14921.47100 2020-01-01 2020-01-02 2020-01-01 00:03:58 2020-01-02 03:32:19 2020-01-01 00:03:58.000 2020-01-02 03:32:19.000 238 99139 49688.5 4968850 238 99139 49688.5 4968850 -32331 32604 5124.02 512402 -126 125 -1.1 -110 +239 2 10229 99140 0.71771 297.71771 149.21771 14921.77177 0.71771 297.7177 149.21771 14921.7715 0.71771 297.71771 149.21771 14921.77100 2020-01-01 2020-01-02 2020-01-01 00:03:59 2020-01-02 03:32:20 2020-01-01 00:03:59.000 2020-01-02 03:32:20.000 239 99140 49689.5 4968950 239 99140 49689.5 4968950 -32330 32605 5125.02 512502 -125 126 -0.1 -10 +24 2 10014 99924 0.07207 300.07207 150.07207 15157.27927 0.07207 300.07208 150.07207 15157.27928 0.07207 300.07207 150.07207 15157.27907 2020-01-01 2020-01-02 2020-01-01 00:00:24 2020-01-02 03:45:24 2020-01-01 00:00:24.000 2020-01-02 03:45:24.000 24 99924 49974 5047374 24 99924 49974 5047374 -32545 32390 4553.009900990099 459854 -128 123 -4.297029702970297 -434 +240 2 10230 99141 0.72072 297.72072 149.22072 14922.07207 0.72072 297.72073 149.22072 14922.07211 0.72072 297.72072 149.22072 14922.07200 2020-01-01 2020-01-02 2020-01-01 00:04:00 2020-01-02 03:32:21 2020-01-01 00:04:00.000 2020-01-02 03:32:21.000 240 99141 49690.5 4969050 240 99141 49690.5 4969050 -32329 32606 5126.02 512602 -124 127 0.9 90 +241 2 10231 99142 0.72372 297.72372 149.22372 14922.37237 0.72372 297.72372 149.22372 14922.37243 0.72372 297.72372 149.22372 14922.37200 2020-01-01 2020-01-02 2020-01-01 00:04:01 2020-01-02 03:32:22 2020-01-01 00:04:01.000 2020-01-02 03:32:22.000 241 99142 49691.5 4969150 241 99142 49691.5 4969150 -32328 32607 5127.02 512702 -128 127 -0.66 -66 +242 2 10232 99143 0.72672 297.72672 149.22672 14922.67267 0.72672 297.7267 149.22672 14922.67273 0.72672 297.72672 149.22672 14922.67200 2020-01-01 2020-01-02 2020-01-01 00:04:02 2020-01-02 03:32:23 2020-01-01 00:04:02.000 2020-01-02 03:32:23.000 242 99143 49692.5 4969250 242 99143 49692.5 4969250 -32327 32608 5128.02 512802 -128 123 -2.22 -222 +243 2 10233 99144 0.72972 297.72972 149.22972 14922.97297 0.72972 297.72974 149.22973 14922.97332 0.72972 297.72972 149.22972 14922.97200 2020-01-01 2020-01-02 2020-01-01 00:04:03 2020-01-02 03:32:24 2020-01-01 00:04:03.000 2020-01-02 03:32:24.000 243 99144 49693.5 4969350 243 99144 49693.5 4969350 -32326 32609 5129.02 512902 -127 124 -1.22 -122 +244 2 10234 99145 0.73273 297.73273 149.23273 14923.27327 0.73273 297.73273 149.23272 14923.27297 0.73273 297.73273 149.23273 14923.27300 2020-01-01 2020-01-02 2020-01-01 00:04:04 2020-01-02 03:32:25 2020-01-01 00:04:04.000 2020-01-02 03:32:25.000 244 99145 49694.5 4969450 244 99145 49694.5 4969450 -32325 32610 5130.02 513002 -126 125 -0.22 -22 +245 2 10235 99146 0.73573 297.73573 149.23573 14923.57357 0.73573 297.73575 149.23573 14923.57358 0.73573 297.73573 149.23573 14923.57300 2020-01-01 2020-01-02 2020-01-01 00:04:05 2020-01-02 03:32:26 2020-01-01 00:04:05.000 2020-01-02 03:32:26.000 245 99146 49695.5 4969550 245 99146 49695.5 4969550 -32324 32611 5131.02 513102 -125 126 0.78 78 +246 2 10236 99147 0.73873 297.73873 149.23873 14923.87387 0.73873 297.73874 149.23873 14923.8739 0.73873 297.73873 149.23873 14923.87300 2020-01-01 2020-01-02 2020-01-01 00:04:06 2020-01-02 03:32:27 2020-01-01 00:04:06.000 2020-01-02 03:32:27.000 246 99147 49696.5 4969650 246 99147 49696.5 4969650 -32323 32612 5132.02 513202 -124 127 1.78 178 +247 2 10237 99148 0.74174 297.74174 149.24174 14924.17417 0.74174 297.74173 149.24174 14924.1742 0.74174 297.74174 149.24174 14924.17400 2020-01-01 2020-01-02 2020-01-01 00:04:07 2020-01-02 03:32:28 2020-01-01 00:04:07.000 2020-01-02 03:32:28.000 247 99148 49697.5 4969750 247 99148 49697.5 4969750 -32322 32613 5133.02 513302 -128 127 0.22 22 +248 2 10238 99149 0.74474 297.74474 149.24474 14924.47447 0.74474 297.74475 149.24474 14924.47478 0.74474 297.74474 149.24474 14924.47400 2020-01-01 2020-01-02 2020-01-01 00:04:08 2020-01-02 03:32:29 2020-01-01 00:04:08.000 2020-01-02 03:32:29.000 248 99149 49698.5 4969850 248 99149 49698.5 4969850 -32321 32614 5134.02 513402 -128 127 -1.34 -134 +249 2 10239 99150 0.74774 297.74774 149.24774 14924.77477 0.74774 297.74774 149.24774 14924.77447 0.74774 297.74774 149.24774 14924.77400 2020-01-01 2020-01-02 2020-01-01 00:04:09 2020-01-02 03:32:30 2020-01-01 00:04:09.000 2020-01-02 03:32:30.000 249 99150 49699.5 4969950 249 99150 49699.5 4969950 -32320 32615 5135.02 513502 -128 124 -2.9 -290 +25 2 10015 99925 0.07507 300.07507 150.07507 15157.58258 0.07507 300.07507 150.07507 15157.58241 0.07507 300.07507 150.07507 15157.58207 2020-01-01 2020-01-02 2020-01-01 00:00:25 2020-01-02 03:45:25 2020-01-01 00:00:25.000 2020-01-02 03:45:25.000 25 99925 49975 5047475 25 99925 49975 5047475 -32544 32391 4554.009900990099 459955 -127 124 -3.297029702970297 -333 +250 2 10240 99151 0.75075 297.75075 149.25075 14925.07507 0.75075 297.75076 149.25075 14925.07506 0.75075 297.75075 149.25075 14925.07500 2020-01-01 2020-01-02 2020-01-01 00:04:10 2020-01-02 03:32:31 2020-01-01 00:04:10.000 2020-01-02 03:32:31.000 250 99151 49700.5 4970050 250 99151 49700.5 4970050 -32319 32616 5136.02 513602 -127 125 -1.9 -190 +251 2 10241 99152 0.75375 297.75375 149.25375 14925.37537 0.75375 297.75375 149.25375 14925.37536 0.75375 297.75375 149.25375 14925.37500 2020-01-01 2020-01-02 2020-01-01 00:04:11 2020-01-02 03:32:32 2020-01-01 00:04:11.000 2020-01-02 03:32:32.000 251 99152 49701.5 4970150 251 99152 49701.5 4970150 -32318 32617 5137.02 513702 -126 126 -0.9 -90 +252 2 10242 99153 0.75675 297.75675 149.25675 14925.67567 0.75675 297.75674 149.25675 14925.67567 0.75675 297.75675 149.25675 14925.67500 2020-01-01 2020-01-02 2020-01-01 00:04:12 2020-01-02 03:32:33 2020-01-01 00:04:12.000 2020-01-02 03:32:33.000 252 99153 49702.5 4970250 252 99153 49702.5 4970250 -32317 32618 5138.02 513802 -125 127 0.1 10 +253 2 10243 99154 0.75975 297.75975 149.25975 14925.97597 0.75975 297.75977 149.25976 14925.97625 0.75975 297.75975 149.25975 14925.97500 2020-01-01 2020-01-02 2020-01-01 00:04:13 2020-01-02 03:32:34 2020-01-01 00:04:13.000 2020-01-02 03:32:34.000 253 99154 49703.5 4970350 253 99154 49703.5 4970350 -32316 32619 5139.02 513902 -128 127 -1.46 -146 +254 2 10244 99155 0.76276 297.76276 149.26276 14926.27627 0.76276 297.76276 149.26275 14926.27594 0.76276 297.76276 149.26276 14926.27600 2020-01-01 2020-01-02 2020-01-01 00:04:14 2020-01-02 03:32:35 2020-01-01 00:04:14.000 2020-01-02 03:32:35.000 254 99155 49704.5 4970450 254 99155 49704.5 4970450 -32315 32620 5140.02 514002 -128 127 -3.02 -302 +255 2 10245 99156 0.76576 297.76576 149.26576 14926.57657 0.76576 297.76578 149.26576 14926.57652 0.76576 297.76576 149.26576 14926.57600 2020-01-01 2020-01-02 2020-01-01 00:04:15 2020-01-02 03:32:36 2020-01-01 00:04:15.000 2020-01-02 03:32:36.000 255 99156 49705.5 4970550 255 99156 49705.5 4970550 -32314 32621 5141.02 514102 -128 123 -4.58 -458 +256 2 10246 99157 0.76876 297.76876 149.26876 14926.87687 0.76876 297.76877 149.26876 14926.87683 0.76876 297.76876 149.26876 14926.87600 2020-01-01 2020-01-02 2020-01-01 00:04:16 2020-01-02 03:32:37 2020-01-01 00:04:16.000 2020-01-02 03:32:37.000 256 99157 49706.5 4970650 256 99157 49706.5 4970650 -32313 32622 5142.02 514202 -127 124 -3.58 -358 +257 2 10247 99158 0.77177 297.77177 149.27177 14927.17717 0.77177 297.77176 149.27177 14927.17714 0.77177 297.77177 149.27177 14927.17700 2020-01-01 2020-01-02 2020-01-01 00:04:17 2020-01-02 03:32:38 2020-01-01 00:04:17.000 2020-01-02 03:32:38.000 257 99158 49707.5 4970750 257 99158 49707.5 4970750 -32312 32623 5143.02 514302 -126 125 -2.58 -258 +258 2 10248 99159 0.77477 297.77477 149.27477 14927.47747 0.77477 297.77478 149.27477 14927.47776 0.77477 297.77477 149.27477 14927.47700 2020-01-01 2020-01-02 2020-01-01 00:04:18 2020-01-02 03:32:39 2020-01-01 00:04:18.000 2020-01-02 03:32:39.000 258 99159 49708.5 4970850 258 99159 49708.5 4970850 -32311 32624 5144.02 514402 -125 126 -1.58 -158 +259 2 10249 99160 0.77777 297.77777 149.27777 14927.77777 0.77777 297.77777 149.27777 14927.77742 0.77777 297.77777 149.27777 14927.77700 2020-01-01 2020-01-02 2020-01-01 00:04:19 2020-01-02 03:32:40 2020-01-01 00:04:19.000 2020-01-02 03:32:40.000 259 99160 49709.5 4970950 259 99160 49709.5 4970950 -32310 32625 5145.02 514502 -124 127 -0.58 -58 +26 2 10016 99926 0.07807 300.07807 150.07807 15157.88588 0.07807 300.07806 150.07807 15157.88575 0.07807 300.07807 150.07807 15157.88507 2020-01-01 2020-01-02 2020-01-01 00:00:26 2020-01-02 03:45:26 2020-01-01 00:00:26.000 2020-01-02 03:45:26.000 26 99926 49976 5047576 26 99926 49976 5047576 -32543 32392 4555.009900990099 460056 -126 125 -2.297029702970297 -232 +260 2 10250 99161 0.78078 297.78078 149.28078 14928.07807 0.78078 297.7808 149.28077 14928.07799 0.78078 297.78078 149.28078 14928.07800 2020-01-01 2020-01-02 2020-01-01 00:04:20 2020-01-02 03:32:41 2020-01-01 00:04:20.000 2020-01-02 03:32:41.000 260 99161 49710.5 4971050 260 99161 49710.5 4971050 -32309 32626 5146.02 514602 -128 127 -2.14 -214 +261 2 10251 99162 0.78378 297.78378 149.28378 14928.37837 0.78378 297.78378 149.28378 14928.3783 0.78378 297.78378 149.28378 14928.37800 2020-01-01 2020-01-02 2020-01-01 00:04:21 2020-01-02 03:32:42 2020-01-01 00:04:21.000 2020-01-02 03:32:42.000 261 99162 49711.5 4971150 261 99162 49711.5 4971150 -32308 32627 5147.02 514702 -128 123 -3.7 -370 +262 2 10252 99163 0.78678 297.78678 149.28678 14928.67867 0.78678 297.78677 149.28678 14928.67861 0.78678 297.78678 149.28678 14928.67800 2020-01-01 2020-01-02 2020-01-01 00:04:22 2020-01-02 03:32:43 2020-01-01 00:04:22.000 2020-01-02 03:32:43.000 262 99163 49712.5 4971250 262 99163 49712.5 4971250 -32307 32628 5148.02 514802 -127 124 -2.7 -270 +263 2 10253 99164 0.78978 297.78978 149.28978 14928.97897 0.78978 297.7898 149.28979 14928.97923 0.78978 297.78978 149.28978 14928.97800 2020-01-01 2020-01-02 2020-01-01 00:04:23 2020-01-02 03:32:44 2020-01-01 00:04:23.000 2020-01-02 03:32:44.000 263 99164 49713.5 4971350 263 99164 49713.5 4971350 -32306 32629 5149.02 514902 -126 125 -1.7 -170 +264 2 10254 99165 0.79279 297.79279 149.29279 14929.27927 0.79279 297.7928 149.29278 14929.27888 0.79279 297.79279 149.29279 14929.27900 2020-01-01 2020-01-02 2020-01-01 00:04:24 2020-01-02 03:32:45 2020-01-01 00:04:24.000 2020-01-02 03:32:45.000 264 99165 49714.5 4971450 264 99165 49714.5 4971450 -32305 32630 5150.02 515002 -125 126 -0.7 -70 +265 2 10255 99166 0.79579 297.79579 149.29579 14929.57957 0.79579 297.7958 149.29579 14929.57962 0.79579 297.79579 149.29579 14929.57900 2020-01-01 2020-01-02 2020-01-01 00:04:25 2020-01-02 03:32:46 2020-01-01 00:04:25.000 2020-01-02 03:32:46.000 265 99166 49715.5 4971550 265 99166 49715.5 4971550 -32304 32631 5151.02 515102 -124 127 0.3 30 +266 2 10256 99167 0.79879 297.79879 149.29879 14929.87987 0.79879 297.7988 149.29879 14929.87977 0.79879 297.79879 149.29879 14929.87900 2020-01-01 2020-01-02 2020-01-01 00:04:26 2020-01-02 03:32:47 2020-01-01 00:04:26.000 2020-01-02 03:32:47.000 266 99167 49716.5 4971650 266 99167 49716.5 4971650 -32303 32632 5152.02 515202 -128 127 -1.26 -126 +267 2 10257 99168 0.8018 297.8018 149.3018 14930.18018 0.8018 297.8018 149.3018 14930.18012 0.80180 297.80180 149.30180 14930.18000 2020-01-01 2020-01-02 2020-01-01 00:04:27 2020-01-02 03:32:48 2020-01-01 00:04:27.000 2020-01-02 03:32:48.000 267 99168 49717.5 4971750 267 99168 49717.5 4971750 -32302 32633 5153.02 515302 -128 123 -2.82 -282 +268 2 10258 99169 0.8048 297.8048 149.3048 14930.48048 0.8048 297.8048 149.3048 14930.4807 0.80480 297.80480 149.30480 14930.48000 2020-01-01 2020-01-02 2020-01-01 00:04:28 2020-01-02 03:32:49 2020-01-01 00:04:28.000 2020-01-02 03:32:49.000 268 99169 49718.5 4971850 268 99169 49718.5 4971850 -32301 32634 5154.02 515402 -127 124 -1.82 -182 +269 2 10259 99170 0.8078 297.8078 149.3078 14930.78078 0.8078 297.8078 149.3078 14930.78035 0.80780 297.80780 149.30780 14930.78000 2020-01-01 2020-01-02 2020-01-01 00:04:29 2020-01-02 03:32:50 2020-01-01 00:04:29.000 2020-01-02 03:32:50.000 269 99170 49719.5 4971950 269 99170 49719.5 4971950 -32300 32635 5155.02 515502 -126 125 -0.82 -82 +27 2 10017 99927 0.08108 300.08108 150.08108 15158.18918 0.08108 300.0811 150.08108 15158.18936 0.08108 300.08108 150.08108 15158.18908 2020-01-01 2020-01-02 2020-01-01 00:00:27 2020-01-02 03:45:27 2020-01-01 00:00:27.000 2020-01-02 03:45:27.000 27 99927 49977 5047677 27 99927 49977 5047677 -32542 32393 4556.009900990099 460157 -125 126 -1.297029702970297 -131 +270 2 10260 99171 0.81081 297.81081 149.31081 14931.08108 0.81081 297.81082 149.31081 14931.08109 0.81081 297.81081 149.31081 14931.08100 2020-01-01 2020-01-02 2020-01-01 00:04:30 2020-01-02 03:32:51 2020-01-01 00:04:30.000 2020-01-02 03:32:51.000 270 99171 49720.5 4972050 270 99171 49720.5 4972050 -32299 32636 5156.02 515602 -125 126 0.18 18 +271 2 10261 99172 0.81381 297.81381 149.31381 14931.38138 0.81381 297.8138 149.31381 14931.38124 0.81381 297.81381 149.31381 14931.38100 2020-01-01 2020-01-02 2020-01-01 00:04:31 2020-01-02 03:32:52 2020-01-01 00:04:31.000 2020-01-02 03:32:52.000 271 99172 49721.5 4972150 271 99172 49721.5 4972150 -32298 32637 5157.02 515702 -124 127 1.18 118 +272 2 10262 99173 0.81681 297.81681 149.31681 14931.68168 0.81681 297.8168 149.31681 14931.68159 0.81681 297.81681 149.31681 14931.68100 2020-01-01 2020-01-02 2020-01-01 00:04:32 2020-01-02 03:32:53 2020-01-01 00:04:32.000 2020-01-02 03:32:53.000 272 99173 49722.5 4972250 272 99173 49722.5 4972250 -32297 32638 5158.02 515802 -128 127 -0.38 -38 +273 2 10263 99174 0.81981 297.81981 149.31981 14931.98198 0.81981 297.81982 149.31982 14931.98217 0.81981 297.81981 149.31981 14931.98100 2020-01-01 2020-01-02 2020-01-01 00:04:33 2020-01-02 03:32:54 2020-01-01 00:04:33.000 2020-01-02 03:32:54.000 273 99174 49723.5 4972350 273 99174 49723.5 4972350 -32296 32639 5159.02 515902 -128 127 -1.94 -194 +274 2 10264 99175 0.82282 297.82282 149.32282 14932.28228 0.82282 297.8228 149.32282 14932.28247 0.82282 297.82282 149.32282 14932.28200 2020-01-01 2020-01-02 2020-01-01 00:04:34 2020-01-02 03:32:55 2020-01-01 00:04:34.000 2020-01-02 03:32:55.000 274 99175 49724.5 4972450 274 99175 49724.5 4972450 -32295 32640 5160.02 516002 -128 124 -3.5 -350 +275 2 10265 99176 0.82582 297.82582 149.32582 14932.58258 0.82582 297.82584 149.32582 14932.58256 0.82582 297.82582 149.32582 14932.58200 2020-01-01 2020-01-02 2020-01-01 00:04:35 2020-01-02 03:32:56 2020-01-01 00:04:35.000 2020-01-02 03:32:56.000 275 99176 49725.5 4972550 275 99176 49725.5 4972550 -32294 32641 5161.02 516102 -127 125 -2.5 -250 +276 2 10266 99177 0.82882 297.82882 149.32882 14932.88288 0.82882 297.82883 149.32882 14932.88275 0.82882 297.82882 149.32882 14932.88200 2020-01-01 2020-01-02 2020-01-01 00:04:36 2020-01-02 03:32:57 2020-01-01 00:04:36.000 2020-01-02 03:32:57.000 276 99177 49726.5 4972650 276 99177 49726.5 4972650 -32293 32642 5162.02 516202 -126 126 -1.5 -150 +277 2 10267 99178 0.83183 297.83183 149.33183 14933.18318 0.83183 297.83182 149.33183 14933.18305 0.83183 297.83183 149.33183 14933.18300 2020-01-01 2020-01-02 2020-01-01 00:04:37 2020-01-02 03:32:58 2020-01-01 00:04:37.000 2020-01-02 03:32:58.000 277 99178 49727.5 4972750 277 99178 49727.5 4972750 -32292 32643 5163.02 516302 -125 127 -0.5 -50 +278 2 10268 99179 0.83483 297.83483 149.33483 14933.48348 0.83483 297.83484 149.33483 14933.48364 0.83483 297.83483 149.33483 14933.48300 2020-01-01 2020-01-02 2020-01-01 00:04:38 2020-01-02 03:32:59 2020-01-01 00:04:38.000 2020-01-02 03:32:59.000 278 99179 49728.5 4972850 278 99179 49728.5 4972850 -32291 32644 5164.02 516402 -128 127 -2.06 -206 +279 2 10269 99180 0.83783 297.83783 149.33783 14933.78378 0.83783 297.83783 149.33783 14933.78394 0.83783 297.83783 149.33783 14933.78300 2020-01-01 2020-01-02 2020-01-01 00:04:39 2020-01-02 03:33:00 2020-01-01 00:04:39.000 2020-01-02 03:33:00.000 279 99180 49729.5 4972950 279 99180 49729.5 4972950 -32290 32645 5165.02 516502 -128 127 -3.62 -362 +28 2 10018 99928 0.08408 300.08408 150.08408 15158.49249 0.08408 300.08408 150.08408 15158.49265 0.08408 300.08408 150.08408 15158.49208 2020-01-01 2020-01-02 2020-01-01 00:00:28 2020-01-02 03:45:28 2020-01-01 00:00:28.000 2020-01-02 03:45:28.000 28 99928 49978 5047778 28 99928 49978 5047778 -32541 32394 4557.009900990099 460258 -124 127 -0.297029702970297 -30 +280 2 10270 99181 0.84084 297.84084 149.34084 14934.08408 0.84084 297.84085 149.34084 14934.08403 0.84084 297.84084 149.34084 14934.08400 2020-01-01 2020-01-02 2020-01-01 00:04:40 2020-01-02 03:33:01 2020-01-01 00:04:40.000 2020-01-02 03:33:01.000 280 99181 49730.5 4973050 280 99181 49730.5 4973050 -32289 32646 5166.02 516602 -128 123 -5.18 -518 +281 2 10271 99182 0.84384 297.84384 149.34384 14934.38438 0.84384 297.84384 149.34384 14934.38421 0.84384 297.84384 149.34384 14934.38400 2020-01-01 2020-01-02 2020-01-01 00:04:41 2020-01-02 03:33:02 2020-01-01 00:04:41.000 2020-01-02 03:33:02.000 281 99182 49731.5 4973150 281 99182 49731.5 4973150 -32288 32647 5167.02 516702 -127 124 -4.18 -418 +282 2 10272 99183 0.84684 297.84684 149.34684 14934.68468 0.84684 297.84683 149.34684 14934.68453 0.84684 297.84684 149.34684 14934.68400 2020-01-01 2020-01-02 2020-01-01 00:04:42 2020-01-02 03:33:03 2020-01-01 00:04:42.000 2020-01-02 03:33:03.000 282 99183 49732.5 4973250 282 99183 49732.5 4973250 -32287 32648 5168.02 516802 -126 125 -3.18 -318 +283 2 10273 99184 0.84984 297.84984 149.34984 14934.98498 0.84984 297.84985 149.34985 14934.98526 0.84984 297.84984 149.34984 14934.98400 2020-01-01 2020-01-02 2020-01-01 00:04:43 2020-01-02 03:33:04 2020-01-01 00:04:43.000 2020-01-02 03:33:04.000 283 99184 49733.5 4973350 283 99184 49733.5 4973350 -32286 32649 5169.02 516902 -125 126 -2.18 -218 +284 2 10274 99185 0.85285 297.85285 149.35285 14935.28528 0.85285 297.85284 149.35285 14935.28542 0.85285 297.85285 149.35285 14935.28500 2020-01-01 2020-01-02 2020-01-01 00:04:44 2020-01-02 03:33:05 2020-01-01 00:04:44.000 2020-01-02 03:33:05.000 284 99185 49734.5 4973450 284 99185 49734.5 4973450 -32285 32650 5170.02 517002 -124 127 -1.18 -118 +285 2 10275 99186 0.85585 297.85585 149.35585 14935.58558 0.85585 297.85587 149.35585 14935.5855 0.85585 297.85585 149.35585 14935.58500 2020-01-01 2020-01-02 2020-01-01 00:04:45 2020-01-02 03:33:06 2020-01-01 00:04:45.000 2020-01-02 03:33:06.000 285 99186 49735.5 4973550 285 99186 49735.5 4973550 -32284 32651 5171.02 517102 -128 127 -2.74 -274 +286 2 10276 99187 0.85885 297.85885 149.35885 14935.88588 0.85885 297.85886 149.35885 14935.88568 0.85885 297.85885 149.35885 14935.88500 2020-01-01 2020-01-02 2020-01-01 00:04:46 2020-01-02 03:33:07 2020-01-01 00:04:46.000 2020-01-02 03:33:07.000 286 99187 49736.5 4973650 286 99187 49736.5 4973650 -32283 32652 5172.02 517202 -128 123 -4.3 -430 +287 2 10277 99188 0.86186 297.86186 149.36186 14936.18618 0.86186 297.86185 149.36186 14936.186 0.86186 297.86186 149.36186 14936.18600 2020-01-01 2020-01-02 2020-01-01 00:04:47 2020-01-02 03:33:08 2020-01-01 00:04:47.000 2020-01-02 03:33:08.000 287 99188 49737.5 4973750 287 99188 49737.5 4973750 -32282 32653 5173.02 517302 -127 124 -3.3 -330 +288 2 10278 99189 0.86486 297.86486 149.36486 14936.48648 0.86486 297.86487 149.36486 14936.48673 0.86486 297.86486 149.36486 14936.48600 2020-01-01 2020-01-02 2020-01-01 00:04:48 2020-01-02 03:33:09 2020-01-01 00:04:48.000 2020-01-02 03:33:09.000 288 99189 49738.5 4973850 288 99189 49738.5 4973850 -32281 32654 5174.02 517402 -126 125 -2.3 -230 +289 2 10279 99190 0.86786 297.86786 149.36786 14936.78678 0.86786 297.86786 149.36786 14936.78688 0.86786 297.86786 149.36786 14936.78600 2020-01-01 2020-01-02 2020-01-01 00:04:49 2020-01-02 03:33:10 2020-01-01 00:04:49.000 2020-01-02 03:33:10.000 289 99190 49739.5 4973950 289 99190 49739.5 4973950 -32280 32655 5175.02 517502 -125 126 -1.3 -130 +29 2 10019 99929 0.08708 300.08708 150.08708 15158.79579 0.08708 300.0871 150.08708 15158.79576 0.08708 300.08708 150.08708 15158.79508 2020-01-01 2020-01-02 2020-01-01 00:00:29 2020-01-02 03:45:29 2020-01-01 00:00:29.000 2020-01-02 03:45:29.000 29 99929 49979 5047879 29 99929 49979 5047879 -32540 32395 4558.009900990099 460359 -128 127 -1.8316831683168318 -185 +290 2 10280 99191 0.87087 297.87087 149.37087 14937.08708 0.87087 297.87088 149.37087 14937.087 0.87087 297.87087 149.37087 14937.08700 2020-01-01 2020-01-02 2020-01-01 00:04:50 2020-01-02 03:33:11 2020-01-01 00:04:50.000 2020-01-02 03:33:11.000 290 99191 49740.5 4974050 290 99191 49740.5 4974050 -32279 32656 5176.02 517602 -124 127 -0.3 -30 +291 2 10281 99192 0.87387 297.87387 149.37387 14937.38738 0.87387 297.87387 149.37387 14937.38716 0.87387 297.87387 149.37387 14937.38700 2020-01-01 2020-01-02 2020-01-01 00:04:51 2020-01-02 03:33:12 2020-01-01 00:04:51.000 2020-01-02 03:33:12.000 291 99192 49741.5 4974150 291 99192 49741.5 4974150 -32278 32657 5177.02 517702 -128 127 -1.86 -186 +292 2 10282 99193 0.87687 297.87687 149.37687 14937.68768 0.87687 297.8769 149.37687 14937.68789 0.87687 297.87687 149.37687 14937.68700 2020-01-01 2020-01-02 2020-01-01 00:04:52 2020-01-02 03:33:13 2020-01-01 00:04:52.000 2020-01-02 03:33:13.000 292 99193 49742.5 4974250 292 99193 49742.5 4974250 -32277 32658 5178.02 517802 -128 123 -3.42 -342 +293 2 10283 99194 0.87987 297.87987 149.37987 14937.98798 0.87987 297.87988 149.37988 14937.9882 0.87987 297.87987 149.37987 14937.98700 2020-01-01 2020-01-02 2020-01-01 00:04:53 2020-01-02 03:33:14 2020-01-01 00:04:53.000 2020-01-02 03:33:14.000 293 99194 49743.5 4974350 293 99194 49743.5 4974350 -32276 32659 5179.02 517902 -127 124 -2.42 -242 +294 2 10284 99195 0.88288 297.88288 149.38288 14938.28828 0.88288 297.88287 149.38288 14938.28835 0.88288 297.88288 149.38288 14938.28800 2020-01-01 2020-01-02 2020-01-01 00:04:54 2020-01-02 03:33:15 2020-01-01 00:04:54.000 2020-01-02 03:33:15.000 294 99195 49744.5 4974450 294 99195 49744.5 4974450 -32275 32660 5180.02 518002 -126 125 -1.42 -142 +295 2 10285 99196 0.88588 297.88588 149.38588 14938.58858 0.88588 297.8859 149.38588 14938.58847 0.88588 297.88588 149.38588 14938.58800 2020-01-01 2020-01-02 2020-01-01 00:04:55 2020-01-02 03:33:16 2020-01-01 00:04:55.000 2020-01-02 03:33:16.000 295 99196 49745.5 4974550 295 99196 49745.5 4974550 -32274 32661 5181.02 518102 -125 126 -0.42 -42 +296 2 10286 99197 0.88888 297.88888 149.38888 14938.88888 0.88888 297.8889 149.38888 14938.88863 0.88888 297.88888 149.38888 14938.88800 2020-01-01 2020-01-02 2020-01-01 00:04:56 2020-01-02 03:33:17 2020-01-01 00:04:56.000 2020-01-02 03:33:17.000 296 99197 49746.5 4974650 296 99197 49746.5 4974650 -32273 32662 5182.02 518202 -124 127 0.58 58 +297 2 10287 99198 0.89189 297.89189 149.39189 14939.18918 0.89189 297.8919 149.39189 14939.18936 0.89189 297.89189 149.39189 14939.18900 2020-01-01 2020-01-02 2020-01-01 00:04:57 2020-01-02 03:33:18 2020-01-01 00:04:57.000 2020-01-02 03:33:18.000 297 99198 49747.5 4974750 297 99198 49747.5 4974750 -32272 32663 5183.02 518302 -128 127 -0.98 -98 +298 2 10288 99199 0.89489 297.89489 149.39489 14939.48948 0.89489 297.8949 149.39489 14939.48967 0.89489 297.89489 149.39489 14939.48900 2020-01-01 2020-01-02 2020-01-01 00:04:58 2020-01-02 03:33:19 2020-01-01 00:04:58.000 2020-01-02 03:33:19.000 298 99199 49748.5 4974850 298 99199 49748.5 4974850 -32271 32664 5184.02 518402 -128 127 -2.54 -254 +299 2 10289 99200 0.89789 297.89789 149.39789 14939.78978 0.89789 297.8979 149.39789 14939.78986 0.89789 297.89789 149.39789 14939.78900 2020-01-01 2020-01-02 2020-01-01 00:04:59 2020-01-02 03:33:20 2020-01-01 00:04:59.000 2020-01-02 03:33:20.000 299 99200 49749.5 4974950 299 99200 49749.5 4974950 -32270 32665 5185.02 518502 -128 124 -4.1 -410 +3 2 1002 9993 0.009 300.009 150.009 15150.9099 0.009 300.009 150.009 15150.90958 0.00900 300.00900 150.00900 15150.90900 2020-01-01 2020-01-02 2020-01-01 00:00:03 2020-01-02 03:45:03 2020-01-01 00:00:03.000 2020-01-02 03:45:03.000 3 99903 49953 5045253 3 99903 49953 5045253 -32566 32369 4532.009900990099 457733 -124 127 0.04950495049504951 5 +30 2 10020 99930 0.09009 300.09009 150.09009 15159.09909 0.09009 300.0901 150.09008 15159.09894 0.09009 300.09009 150.09009 15159.09909 2020-01-01 2020-01-02 2020-01-01 00:00:30 2020-01-02 03:45:30 2020-01-01 00:00:30.000 2020-01-02 03:45:30.000 30 99930 49980 5047980 30 99930 49980 5047980 -32539 32396 4559.009900990099 460460 -128 123 -3.366336633663366 -340 +300 2 10290 99201 0.9009 297.9009 149.4009 14940.09009 0.9009 297.9009 149.40089 14940.08995 0.90090 297.90090 149.40090 14940.09000 2020-01-01 2020-01-02 2020-01-01 00:05:00 2020-01-02 03:33:21 2020-01-01 00:05:00.000 2020-01-02 03:33:21.000 300 99201 49750.5 4975050 300 99201 49750.5 4975050 -32269 32666 5186.02 518602 -127 125 -3.1 -310 +301 2 10291 99202 0.9039 297.9039 149.4039 14940.39039 0.9039 297.9039 149.4039 14940.39009 0.90390 297.90390 149.40390 14940.39000 2020-01-01 2020-01-02 2020-01-01 00:05:01 2020-01-02 03:33:22 2020-01-01 00:05:01.000 2020-01-02 03:33:22.000 301 99202 49751.5 4975150 301 99202 49751.5 4975150 -32268 32667 5187.02 518702 -126 126 -2.1 -210 +302 2 10292 99203 0.9069 297.9069 149.4069 14940.69069 0.9069 297.90692 149.4069 14940.69083 0.90690 297.90690 149.40690 14940.69000 2020-01-01 2020-01-02 2020-01-01 00:05:02 2020-01-02 03:33:23 2020-01-01 00:05:02.000 2020-01-02 03:33:23.000 302 99203 49752.5 4975250 302 99203 49752.5 4975250 -32267 32668 5188.02 518802 -125 127 -1.1 -110 +303 2 10293 99204 0.9099 297.9099 149.4099 14940.99099 0.9099 297.9099 149.40991 14940.99114 0.90990 297.90990 149.40990 14940.99000 2020-01-01 2020-01-02 2020-01-01 00:05:03 2020-01-02 03:33:24 2020-01-01 00:05:03.000 2020-01-02 03:33:24.000 303 99204 49753.5 4975350 303 99204 49753.5 4975350 -32266 32669 5189.02 518902 -128 127 -2.66 -266 +304 2 10294 99205 0.91291 297.91291 149.41291 14941.29129 0.91291 297.9129 149.41291 14941.29133 0.91291 297.91291 149.41291 14941.29100 2020-01-01 2020-01-02 2020-01-01 00:05:04 2020-01-02 03:33:25 2020-01-01 00:05:04.000 2020-01-02 03:33:25.000 304 99205 49754.5 4975450 304 99205 49754.5 4975450 -32265 32670 5190.02 519002 -128 127 -4.22 -422 +305 2 10295 99206 0.91591 297.91591 149.41591 14941.59159 0.91591 297.91592 149.41591 14941.59141 0.91591 297.91591 149.41591 14941.59100 2020-01-01 2020-01-02 2020-01-01 00:05:05 2020-01-02 03:33:26 2020-01-01 00:05:05.000 2020-01-02 03:33:26.000 305 99206 49755.5 4975550 305 99206 49755.5 4975550 -32264 32671 5191.02 519102 -128 123 -5.78 -578 +306 2 10296 99207 0.91891 297.91891 149.41891 14941.89189 0.91891 297.9189 149.41891 14941.89172 0.91891 297.91891 149.41891 14941.89100 2020-01-01 2020-01-02 2020-01-01 00:05:06 2020-01-02 03:33:27 2020-01-01 00:05:06.000 2020-01-02 03:33:27.000 306 99207 49756.5 4975650 306 99207 49756.5 4975650 -32263 32672 5192.02 519202 -127 124 -4.78 -478 +307 2 10297 99208 0.92192 297.92192 149.42192 14942.19219 0.92192 297.92194 149.42192 14942.1923 0.92192 297.92192 149.42192 14942.19200 2020-01-01 2020-01-02 2020-01-01 00:05:07 2020-01-02 03:33:28 2020-01-01 00:05:07.000 2020-01-02 03:33:28.000 307 99208 49757.5 4975750 307 99208 49757.5 4975750 -32262 32673 5193.02 519302 -126 125 -3.78 -378 +308 2 10298 99209 0.92492 297.92492 149.42492 14942.49249 0.92492 297.92493 149.42492 14942.49265 0.92492 297.92492 149.42492 14942.49200 2020-01-01 2020-01-02 2020-01-01 00:05:08 2020-01-02 03:33:29 2020-01-01 00:05:08.000 2020-01-02 03:33:29.000 308 99209 49758.5 4975850 308 99209 49758.5 4975850 -32261 32674 5194.02 519402 -125 126 -2.78 -278 +309 2 10299 99210 0.92792 297.92792 149.42792 14942.79279 0.92792 297.92792 149.42792 14942.7928 0.92792 297.92792 149.42792 14942.79200 2020-01-01 2020-01-02 2020-01-01 00:05:09 2020-01-02 03:33:30 2020-01-01 00:05:09.000 2020-01-02 03:33:30.000 309 99210 49759.5 4975950 309 99210 49759.5 4975950 -32260 32675 5195.02 519502 -124 127 -1.78 -178 +31 2 10021 99931 0.09309 300.09309 150.09309 15159.4024 0.09309 300.09308 150.09309 15159.40224 0.09309 300.09309 150.09309 15159.40209 2020-01-01 2020-01-02 2020-01-01 00:00:31 2020-01-02 03:45:31 2020-01-01 00:00:31.000 2020-01-02 03:45:31.000 31 99931 49981 5048081 31 99931 49981 5048081 -32538 32397 4560.009900990099 460561 -127 124 -2.366336633663366 -239 +310 2 10300 99211 0.93093 297.93093 149.43093 14943.09309 0.93093 297.93094 149.43092 14943.09288 0.93093 297.93093 149.43093 14943.09300 2020-01-01 2020-01-02 2020-01-01 00:05:10 2020-01-02 03:33:31 2020-01-01 00:05:10.000 2020-01-02 03:33:31.000 310 99211 49760.5 4976050 310 99211 49760.5 4976050 -32259 32676 5196.02 519602 -128 127 -3.34 -334 +311 2 10301 99212 0.93393 297.93393 149.43393 14943.39339 0.93393 297.93393 149.43393 14943.39319 0.93393 297.93393 149.43393 14943.39300 2020-01-01 2020-01-02 2020-01-01 00:05:11 2020-01-02 03:33:32 2020-01-01 00:05:11.000 2020-01-02 03:33:32.000 311 99212 49761.5 4976150 311 99212 49761.5 4976150 -32258 32677 5197.02 519702 -128 123 -4.9 -490 +312 2 10302 99213 0.93693 297.93693 149.43693 14943.69369 0.93693 297.93695 149.43693 14943.69377 0.93693 297.93693 149.43693 14943.69300 2020-01-01 2020-01-02 2020-01-01 00:05:12 2020-01-02 03:33:33 2020-01-01 00:05:12.000 2020-01-02 03:33:33.000 312 99213 49762.5 4976250 312 99213 49762.5 4976250 -32257 32678 5198.02 519802 -127 124 -3.9 -390 +313 2 10303 99214 0.93993 297.93993 149.43993 14943.99399 0.93993 297.93994 149.43994 14943.99412 0.93993 297.93993 149.43993 14943.99300 2020-01-01 2020-01-02 2020-01-01 00:05:13 2020-01-02 03:33:34 2020-01-01 00:05:13.000 2020-01-02 03:33:34.000 313 99214 49763.5 4976350 313 99214 49763.5 4976350 -32256 32679 5199.02 519902 -126 125 -2.9 -290 +314 2 10304 99215 0.94294 297.94294 149.44294 14944.29429 0.94294 297.94293 149.44294 14944.29427 0.94294 297.94294 149.44294 14944.29400 2020-01-01 2020-01-02 2020-01-01 00:05:14 2020-01-02 03:33:35 2020-01-01 00:05:14.000 2020-01-02 03:33:35.000 314 99215 49764.5 4976450 314 99215 49764.5 4976450 -32255 32680 5200.02 520002 -125 126 -1.9 -190 +315 2 10305 99216 0.94594 297.94594 149.44594 14944.59459 0.94594 297.94595 149.44595 14944.595 0.94594 297.94594 149.44594 14944.59400 2020-01-01 2020-01-02 2020-01-01 00:05:15 2020-01-02 03:33:36 2020-01-01 00:05:15.000 2020-01-02 03:33:36.000 315 99216 49765.5 4976550 315 99216 49765.5 4976550 -32254 32681 5201.02 520102 -124 127 -0.9 -90 +316 2 10306 99217 0.94894 297.94894 149.44894 14944.89489 0.94894 297.94894 149.44894 14944.89466 0.94894 297.94894 149.44894 14944.89400 2020-01-01 2020-01-02 2020-01-01 00:05:16 2020-01-02 03:33:37 2020-01-01 00:05:16.000 2020-01-02 03:33:37.000 316 99217 49766.5 4976650 316 99217 49766.5 4976650 -32253 32682 5202.02 520202 -128 127 -2.46 -246 +317 2 10307 99218 0.95195 297.95195 149.45195 14945.19519 0.95195 297.95197 149.45195 14945.19524 0.95195 297.95195 149.45195 14945.19500 2020-01-01 2020-01-02 2020-01-01 00:05:17 2020-01-02 03:33:38 2020-01-01 00:05:17.000 2020-01-02 03:33:38.000 317 99218 49767.5 4976750 317 99218 49767.5 4976750 -32252 32683 5203.02 520302 -128 123 -4.02 -402 +318 2 10308 99219 0.95495 297.95495 149.45495 14945.49549 0.95495 297.95496 149.45495 14945.49558 0.95495 297.95495 149.45495 14945.49500 2020-01-01 2020-01-02 2020-01-01 00:05:18 2020-01-02 03:33:39 2020-01-01 00:05:18.000 2020-01-02 03:33:39.000 318 99219 49768.5 4976850 318 99219 49768.5 4976850 -32251 32684 5204.02 520402 -127 124 -3.02 -302 +319 2 10309 99220 0.95795 297.95795 149.45795 14945.79579 0.95795 297.95795 149.45795 14945.79574 0.95795 297.95795 149.45795 14945.79500 2020-01-01 2020-01-02 2020-01-01 00:05:19 2020-01-02 03:33:40 2020-01-01 00:05:19.000 2020-01-02 03:33:40.000 319 99220 49769.5 4976950 319 99220 49769.5 4976950 -32250 32685 5205.02 520502 -126 125 -2.02 -202 +32 2 10022 99932 0.09609 300.09609 150.09609 15159.7057 0.09609 300.0961 150.09609 15159.706 0.09609 300.09609 150.09609 15159.70509 2020-01-01 2020-01-02 2020-01-01 00:00:32 2020-01-02 03:45:32 2020-01-01 00:00:32.000 2020-01-02 03:45:32.000 32 99932 49982 5048182 32 99932 49982 5048182 -32537 32398 4561.009900990099 460662 -126 125 -1.3663366336633664 -138 +320 2 10310 99221 0.96096 297.96096 149.46096 14946.09609 0.96096 297.96097 149.46096 14946.09647 0.96096 297.96096 149.46096 14946.09600 2020-01-01 2020-01-02 2020-01-01 00:05:20 2020-01-02 03:33:41 2020-01-01 00:05:20.000 2020-01-02 03:33:41.000 320 99221 49770.5 4977050 320 99221 49770.5 4977050 -32249 32686 5206.02 520602 -125 126 -1.02 -102 +321 2 10311 99222 0.96396 297.96396 149.46396 14946.39639 0.96396 297.96396 149.46396 14946.39613 0.96396 297.96396 149.46396 14946.39600 2020-01-01 2020-01-02 2020-01-01 00:05:21 2020-01-02 03:33:42 2020-01-01 00:05:21.000 2020-01-02 03:33:42.000 321 99222 49771.5 4977150 321 99222 49771.5 4977150 -32248 32687 5207.02 520702 -124 127 -0.02 -2 +322 2 10312 99223 0.96696 297.96696 149.46696 14946.69669 0.96696 297.96698 149.46696 14946.69674 0.96696 297.96696 149.46696 14946.69600 2020-01-01 2020-01-02 2020-01-01 00:05:22 2020-01-02 03:33:43 2020-01-01 00:05:22.000 2020-01-02 03:33:43.000 322 99223 49772.5 4977250 322 99223 49772.5 4977250 -32247 32688 5208.02 520802 -128 127 -1.58 -158 +323 2 10313 99224 0.96996 297.96996 149.46996 14946.99699 0.96997 297.96997 149.46997 14946.99706 0.96996 297.96996 149.46996 14946.99600 2020-01-01 2020-01-02 2020-01-01 00:05:23 2020-01-02 03:33:44 2020-01-01 00:05:23.000 2020-01-02 03:33:44.000 323 99224 49773.5 4977350 323 99224 49773.5 4977350 -32246 32689 5209.02 520902 -128 123 -3.14 -314 +324 2 10314 99225 0.97297 297.97297 149.47297 14947.29729 0.97297 297.97296 149.47297 14947.29737 0.97297 297.97297 149.47297 14947.29700 2020-01-01 2020-01-02 2020-01-01 00:05:24 2020-01-02 03:33:45 2020-01-01 00:05:24.000 2020-01-02 03:33:45.000 324 99225 49774.5 4977450 324 99225 49774.5 4977450 -32245 32690 5210.02 521002 -127 124 -2.14 -214 +325 2 10315 99226 0.97597 297.97597 149.47597 14947.59759 0.97597 297.97598 149.47597 14947.59794 0.97597 297.97597 149.47597 14947.59700 2020-01-01 2020-01-02 2020-01-01 00:05:25 2020-01-02 03:33:46 2020-01-01 00:05:25.000 2020-01-02 03:33:46.000 325 99226 49775.5 4977550 325 99226 49775.5 4977550 -32244 32691 5211.02 521102 -126 125 -1.14 -114 +326 2 10316 99227 0.97897 297.97897 149.47897 14947.89789 0.97897 297.97897 149.47897 14947.8976 0.97897 297.97897 149.47897 14947.89700 2020-01-01 2020-01-02 2020-01-01 00:05:26 2020-01-02 03:33:47 2020-01-01 00:05:26.000 2020-01-02 03:33:47.000 326 99227 49776.5 4977650 326 99227 49776.5 4977650 -32243 32692 5212.02 521202 -125 126 -0.14 -14 +327 2 10317 99228 0.98198 297.98198 149.48198 14948.19819 0.98198 297.982 149.48198 14948.19821 0.98198 297.98198 149.48198 14948.19800 2020-01-01 2020-01-02 2020-01-01 00:05:27 2020-01-02 03:33:48 2020-01-01 00:05:27.000 2020-01-02 03:33:48.000 327 99228 49777.5 4977750 327 99228 49777.5 4977750 -32242 32693 5213.02 521302 -124 127 0.86 86 +328 2 10318 99229 0.98498 297.98498 149.48498 14948.49849 0.98498 297.985 149.48498 14948.49853 0.98498 297.98498 149.48498 14948.49800 2020-01-01 2020-01-02 2020-01-01 00:05:28 2020-01-02 03:33:49 2020-01-01 00:05:28.000 2020-01-02 03:33:49.000 328 99229 49778.5 4977850 328 99229 49778.5 4977850 -32241 32694 5214.02 521402 -128 127 -0.7 -70 +329 2 10319 99230 0.98798 297.98798 149.48798 14948.79879 0.98798 297.98798 149.48798 14948.79883 0.98798 297.98798 149.48798 14948.79800 2020-01-01 2020-01-02 2020-01-01 00:05:29 2020-01-02 03:33:50 2020-01-01 00:05:29.000 2020-01-02 03:33:50.000 329 99230 49779.5 4977950 329 99230 49779.5 4977950 -32240 32695 5215.02 521502 -128 127 -2.26 -226 +33 2 10023 99933 0.09909 300.09909 150.09909 15160.009 0.09909 300.0991 150.0991 15160.00913 0.09909 300.09909 150.09909 15160.00809 2020-01-01 2020-01-02 2020-01-01 00:00:33 2020-01-02 03:45:33 2020-01-01 00:00:33.000 2020-01-02 03:45:33.000 33 99933 49983 5048283 33 99933 49983 5048283 -32536 32399 4562.009900990099 460763 -125 126 -0.36633663366336633 -37 +330 2 10320 99231 0.99099 297.99099 149.49099 14949.09909 0.99099 297.991 149.49099 14949.09941 0.99099 297.99099 149.49099 14949.09900 2020-01-01 2020-01-02 2020-01-01 00:05:30 2020-01-02 03:33:51 2020-01-01 00:05:30.000 2020-01-02 03:33:51.000 330 99231 49780.5 4978050 330 99231 49780.5 4978050 -32239 32696 5216.02 521602 -128 123 -3.82 -382 +331 2 10321 99232 0.99399 297.99399 149.49399 14949.39939 0.99399 297.994 149.49399 14949.39911 0.99399 297.99399 149.49399 14949.39900 2020-01-01 2020-01-02 2020-01-01 00:05:31 2020-01-02 03:33:52 2020-01-01 00:05:31.000 2020-01-02 03:33:52.000 331 99232 49781.5 4978150 331 99232 49781.5 4978150 -32238 32697 5217.02 521702 -127 124 -2.82 -282 +332 2 10322 99233 0.99699 297.99699 149.49699 14949.69969 0.99699 297.997 149.49699 14949.69969 0.99699 297.99699 149.49699 14949.69900 2020-01-01 2020-01-02 2020-01-01 00:05:32 2020-01-02 03:33:53 2020-01-01 00:05:32.000 2020-01-02 03:33:53.000 332 99233 49782.5 4978250 332 99233 49782.5 4978250 -32237 32698 5218.02 521802 -126 125 -1.82 -182 +333 2 10323 99234 1 298 149.5 14950 1 298 149.5 14950 1.00000 298.00000 149.50000 14950.00000 2020-01-01 2020-01-02 2020-01-01 00:05:33 2020-01-02 03:33:54 2020-01-01 00:05:33.000 2020-01-02 03:33:54.000 333 99234 49783.5 4978350 333 99234 49783.5 4978350 -32236 32699 5219.02 521902 -125 126 -0.82 -82 +334 2 10324 99235 1.003 298.003 149.503 14950.3003 1.003 298.003 149.503 14950.30029 1.00300 298.00300 149.50300 14950.30000 2020-01-01 2020-01-02 2020-01-01 00:05:34 2020-01-02 03:33:55 2020-01-01 00:05:34.000 2020-01-02 03:33:55.000 334 99235 49784.5 4978450 334 99235 49784.5 4978450 -32235 32700 5220.02 522002 -124 127 0.18 18 +335 2 10325 99236 1.006 298.006 149.506 14950.6006 1.006 298.006 149.506 14950.60088 1.00600 298.00600 149.50600 14950.60000 2020-01-01 2020-01-02 2020-01-01 00:05:35 2020-01-02 03:33:56 2020-01-01 00:05:35.000 2020-01-02 03:33:56.000 335 99236 49785.5 4978550 335 99236 49785.5 4978550 -32234 32701 5221.02 522102 -128 127 -1.38 -138 +336 2 10326 99237 1.009 298.009 149.509 14950.9009 1.009 298.009 149.509 14950.90057 1.00900 298.00900 149.50900 14950.90000 2020-01-01 2020-01-02 2020-01-01 00:05:36 2020-01-02 03:33:57 2020-01-01 00:05:36.000 2020-01-02 03:33:57.000 336 99237 49786.5 4978650 336 99237 49786.5 4978650 -32233 32702 5222.02 522202 -128 123 -2.94 -294 +337 2 10327 99238 1.01201 298.01201 149.51201 14951.2012 1.01201 298.01202 149.51201 14951.20117 1.01201 298.01201 149.51201 14951.20100 2020-01-01 2020-01-02 2020-01-01 00:05:37 2020-01-02 03:33:58 2020-01-01 00:05:37.000 2020-01-02 03:33:58.000 337 99238 49787.5 4978750 337 99238 49787.5 4978750 -32232 32703 5223.02 522302 -127 124 -1.94 -194 +338 2 10328 99239 1.01501 298.01501 149.51501 14951.5015 1.01501 298.015 149.51501 14951.50146 1.01501 298.01501 149.51501 14951.50100 2020-01-01 2020-01-02 2020-01-01 00:05:38 2020-01-02 03:33:59 2020-01-01 00:05:38.000 2020-01-02 03:33:59.000 338 99239 49788.5 4978850 338 99239 49788.5 4978850 -32231 32704 5224.02 522402 -126 125 -0.94 -94 +339 2 10329 99240 1.01801 298.01801 149.51801 14951.8018 1.01801 298.018 149.51801 14951.80177 1.01801 298.01801 149.51801 14951.80100 2020-01-01 2020-01-02 2020-01-01 00:05:39 2020-01-02 03:34:00 2020-01-01 00:05:39.000 2020-01-02 03:34:00.000 339 99240 49789.5 4978950 339 99240 49789.5 4978950 -32230 32705 5225.02 522502 -125 126 0.06 6 +34 2 10024 99934 0.1021 300.1021 150.1021 15160.31231 0.1021 300.1021 150.1021 15160.31224 0.10210 300.10210 150.10210 15160.31210 2020-01-01 2020-01-02 2020-01-01 00:00:34 2020-01-02 03:45:34 2020-01-01 00:00:34.000 2020-01-02 03:45:34.000 34 99934 49984 5048384 34 99934 49984 5048384 -32535 32400 4563.009900990099 460864 -124 127 0.6336633663366337 64 +340 2 10330 99241 1.02102 298.02102 149.52102 14952.1021 1.02102 298.02103 149.52102 14952.10239 1.02102 298.02102 149.52102 14952.10200 2020-01-01 2020-01-02 2020-01-01 00:05:40 2020-01-02 03:34:01 2020-01-01 00:05:40.000 2020-01-02 03:34:01.000 340 99241 49790.5 4979050 340 99241 49790.5 4979050 -32229 32706 5226.02 522602 -124 127 1.06 106 +341 2 10331 99242 1.02402 298.02402 149.52402 14952.4024 1.02402 298.02402 149.52402 14952.40205 1.02402 298.02402 149.52402 14952.40200 2020-01-01 2020-01-02 2020-01-01 00:05:41 2020-01-02 03:34:02 2020-01-01 00:05:41.000 2020-01-02 03:34:02.000 341 99242 49791.5 4979150 341 99242 49791.5 4979150 -32228 32707 5227.02 522702 -128 127 -0.5 -50 +342 2 10332 99243 1.02702 298.02702 149.52702 14952.7027 1.02702 298.02704 149.52702 14952.70264 1.02702 298.02702 149.52702 14952.70200 2020-01-01 2020-01-02 2020-01-01 00:05:42 2020-01-02 03:34:03 2020-01-01 00:05:42.000 2020-01-02 03:34:03.000 342 99243 49792.5 4979250 342 99243 49792.5 4979250 -32227 32708 5228.02 522802 -128 123 -2.06 -206 +343 2 10333 99244 1.03003 298.03003 149.53003 14953.003 1.03003 298.03003 149.53002 14953.00293 1.03003 298.03003 149.53003 14953.00300 2020-01-01 2020-01-02 2020-01-01 00:05:43 2020-01-02 03:34:04 2020-01-01 00:05:43.000 2020-01-02 03:34:04.000 343 99244 49793.5 4979350 343 99244 49793.5 4979350 -32226 32709 5229.02 522902 -127 124 -1.06 -106 +344 2 10334 99245 1.03303 298.03303 149.53303 14953.3033 1.03303 298.03302 149.53303 14953.30323 1.03303 298.03303 149.53303 14953.30300 2020-01-01 2020-01-02 2020-01-01 00:05:44 2020-01-02 03:34:05 2020-01-01 00:05:44.000 2020-01-02 03:34:05.000 344 99245 49794.5 4979450 344 99245 49794.5 4979450 -32225 32710 5230.02 523002 -126 125 -0.06 -6 +345 2 10335 99246 1.03603 298.03603 149.53603 14953.6036 1.03603 298.03604 149.53603 14953.60386 1.03603 298.03603 149.53603 14953.60300 2020-01-01 2020-01-02 2020-01-01 00:05:45 2020-01-02 03:34:06 2020-01-01 00:05:45.000 2020-01-02 03:34:06.000 345 99246 49795.5 4979550 345 99246 49795.5 4979550 -32224 32711 5231.02 523102 -125 126 0.94 94 +346 2 10336 99247 1.03903 298.03903 149.53903 14953.9039 1.03903 298.03903 149.53903 14953.90352 1.03903 298.03903 149.53903 14953.90300 2020-01-01 2020-01-02 2020-01-01 00:05:46 2020-01-02 03:34:07 2020-01-01 00:05:46.000 2020-01-02 03:34:07.000 346 99247 49796.5 4979650 346 99247 49796.5 4979650 -32223 32712 5232.02 523202 -124 127 1.94 194 +347 2 10337 99248 1.04204 298.04204 149.54204 14954.2042 1.04204 298.04205 149.54204 14954.20427 1.04204 298.04204 149.54204 14954.20400 2020-01-01 2020-01-02 2020-01-01 00:05:47 2020-01-02 03:34:08 2020-01-01 00:05:47.000 2020-01-02 03:34:08.000 347 99248 49797.5 4979750 347 99248 49797.5 4979750 -32222 32713 5233.02 523302 -128 127 0.38 38 +348 2 10338 99249 1.04504 298.04504 149.54504 14954.5045 1.04504 298.04504 149.54504 14954.50441 1.04504 298.04504 149.54504 14954.50400 2020-01-01 2020-01-02 2020-01-01 00:05:48 2020-01-02 03:34:09 2020-01-01 00:05:48.000 2020-01-02 03:34:09.000 348 99249 49798.5 4979850 348 99249 49798.5 4979850 -32221 32714 5234.02 523402 -128 123 -1.18 -118 +349 2 10339 99250 1.04804 298.04804 149.54804 14954.8048 1.04804 298.04803 149.54804 14954.80474 1.04804 298.04804 149.54804 14954.80400 2020-01-01 2020-01-02 2020-01-01 00:05:49 2020-01-02 03:34:10 2020-01-01 00:05:49.000 2020-01-02 03:34:10.000 349 99250 49799.5 4979950 349 99250 49799.5 4979950 -32220 32715 5235.02 523502 -127 124 -0.18 -18 +35 2 10025 99935 0.1051 300.1051 150.1051 15160.61561 0.1051 300.1051 150.1051 15160.61542 0.10510 300.10510 150.10510 15160.61510 2020-01-01 2020-01-02 2020-01-01 00:00:35 2020-01-02 03:45:35 2020-01-01 00:00:35.000 2020-01-02 03:45:35.000 35 99935 49985 5048485 35 99935 49985 5048485 -32534 32401 4564.009900990099 460965 -128 127 -0.900990099009901 -91 +350 2 10340 99251 1.05105 298.05105 149.55105 14955.1051 1.05105 298.05106 149.55105 14955.10532 1.05105 298.05105 149.55105 14955.10500 2020-01-01 2020-01-02 2020-01-01 00:05:50 2020-01-02 03:34:11 2020-01-01 00:05:50.000 2020-01-02 03:34:11.000 350 99251 49800.5 4980050 350 99251 49800.5 4980050 -32219 32716 5236.02 523602 -126 125 0.82 82 +351 2 10341 99252 1.05405 298.05405 149.55405 14955.4054 1.05405 298.05405 149.55404 14955.40499 1.05405 298.05405 149.55405 14955.40500 2020-01-01 2020-01-02 2020-01-01 00:05:51 2020-01-02 03:34:12 2020-01-01 00:05:51.000 2020-01-02 03:34:12.000 351 99252 49801.5 4980150 351 99252 49801.5 4980150 -32218 32717 5237.02 523702 -125 126 1.82 182 +352 2 10342 99253 1.05705 298.05705 149.55705 14955.7057 1.05705 298.05707 149.55705 14955.70574 1.05705 298.05705 149.55705 14955.70500 2020-01-01 2020-01-02 2020-01-01 00:05:52 2020-01-02 03:34:13 2020-01-01 00:05:52.000 2020-01-02 03:34:13.000 352 99253 49802.5 4980250 352 99253 49802.5 4980250 -32217 32718 5238.02 523802 -124 127 2.82 282 +353 2 10343 99254 1.06006 298.06006 149.56006 14956.006 1.06006 298.06006 149.56005 14956.00587 1.06006 298.06006 149.56006 14956.00600 2020-01-01 2020-01-02 2020-01-01 00:05:53 2020-01-02 03:34:14 2020-01-01 00:05:53.000 2020-01-02 03:34:14.000 353 99254 49803.5 4980350 353 99254 49803.5 4980350 -32216 32719 5239.02 523902 -128 127 1.26 126 +354 2 10344 99255 1.06306 298.06306 149.56306 14956.3063 1.06306 298.06305 149.56306 14956.3062 1.06306 298.06306 149.56306 14956.30600 2020-01-01 2020-01-02 2020-01-01 00:05:54 2020-01-02 03:34:15 2020-01-01 00:05:54.000 2020-01-02 03:34:15.000 354 99255 49804.5 4980450 354 99255 49804.5 4980450 -32215 32720 5240.02 524002 -128 127 -0.3 -30 +355 2 10345 99256 1.06606 298.06606 149.56606 14956.6066 1.06606 298.06607 149.56606 14956.6068 1.06606 298.06606 149.56606 14956.60600 2020-01-01 2020-01-02 2020-01-01 00:05:55 2020-01-02 03:34:16 2020-01-01 00:05:55.000 2020-01-02 03:34:16.000 355 99256 49805.5 4980550 355 99256 49805.5 4980550 -32214 32721 5241.02 524102 -128 123 -1.86 -186 +356 2 10346 99257 1.06906 298.06906 149.56906 14956.9069 1.06906 298.06906 149.56907 14956.90709 1.06906 298.06906 149.56906 14956.90600 2020-01-01 2020-01-02 2020-01-01 00:05:56 2020-01-02 03:34:17 2020-01-01 00:05:56.000 2020-01-02 03:34:17.000 356 99257 49806.5 4980650 356 99257 49806.5 4980650 -32213 32722 5242.02 524202 -127 124 -0.86 -86 +357 2 10347 99258 1.07207 298.07207 149.57207 14957.2072 1.07207 298.07208 149.57207 14957.20721 1.07207 298.07207 149.57207 14957.20700 2020-01-01 2020-01-02 2020-01-01 00:05:57 2020-01-02 03:34:18 2020-01-01 00:05:57.000 2020-01-02 03:34:18.000 357 99258 49807.5 4980750 357 99258 49807.5 4980750 -32212 32723 5243.02 524302 -126 125 0.14 14 +358 2 10348 99259 1.07507 298.07507 149.57507 14957.5075 1.07507 298.07507 149.57507 14957.50734 1.07507 298.07507 149.57507 14957.50700 2020-01-01 2020-01-02 2020-01-01 00:05:58 2020-01-02 03:34:19 2020-01-01 00:05:58.000 2020-01-02 03:34:19.000 358 99259 49808.5 4980850 358 99259 49808.5 4980850 -32211 32724 5244.02 524402 -125 126 1.14 114 +359 2 10349 99260 1.07807 298.07807 149.57807 14957.8078 1.07807 298.07806 149.57807 14957.80767 1.07807 298.07807 149.57807 14957.80700 2020-01-01 2020-01-02 2020-01-01 00:05:59 2020-01-02 03:34:20 2020-01-01 00:05:59.000 2020-01-02 03:34:20.000 359 99260 49809.5 4980950 359 99260 49809.5 4980950 -32210 32725 5245.02 524502 -124 127 2.14 214 +36 2 10026 99936 0.1081 300.1081 150.1081 15160.91891 0.1081 300.1081 150.1081 15160.91873 0.10810 300.10810 150.10810 15160.91810 2020-01-01 2020-01-02 2020-01-01 00:00:36 2020-01-02 03:45:36 2020-01-01 00:00:36.000 2020-01-02 03:45:36.000 36 99936 49986 5048586 36 99936 49986 5048586 -32533 32402 4565.009900990099 461066 -128 123 -2.4356435643564356 -246 +360 2 10350 99261 1.08108 298.08108 149.58108 14958.1081 1.08108 298.0811 149.58108 14958.10827 1.08108 298.08108 149.58108 14958.10800 2020-01-01 2020-01-02 2020-01-01 00:06:00 2020-01-02 03:34:21 2020-01-01 00:06:00.000 2020-01-02 03:34:21.000 360 99261 49810.5 4981050 360 99261 49810.5 4981050 -32209 32726 5246.02 524602 -128 127 0.58 58 +361 2 10351 99262 1.08408 298.08408 149.58408 14958.4084 1.08408 298.08408 149.58408 14958.40856 1.08408 298.08408 149.58408 14958.40800 2020-01-01 2020-01-02 2020-01-01 00:06:01 2020-01-02 03:34:22 2020-01-01 00:06:01.000 2020-01-02 03:34:22.000 361 99262 49811.5 4981150 361 99262 49811.5 4981150 -32208 32727 5247.02 524702 -128 123 -0.98 -98 +362 2 10352 99263 1.08708 298.08708 149.58708 14958.7087 1.08708 298.0871 149.58708 14958.70868 1.08708 298.08708 149.58708 14958.70800 2020-01-01 2020-01-02 2020-01-01 00:06:02 2020-01-02 03:34:23 2020-01-01 00:06:02.000 2020-01-02 03:34:23.000 362 99263 49812.5 4981250 362 99263 49812.5 4981250 -32207 32728 5248.02 524802 -127 124 0.02 2 +363 2 10353 99264 1.09009 298.09009 149.59009 14959.009 1.09009 298.0901 149.59008 14959.00884 1.09009 298.09009 149.59009 14959.00900 2020-01-01 2020-01-02 2020-01-01 00:06:03 2020-01-02 03:34:24 2020-01-01 00:06:03.000 2020-01-02 03:34:24.000 363 99264 49813.5 4981350 363 99264 49813.5 4981350 -32206 32729 5249.02 524902 -126 125 1.02 102 +364 2 10354 99265 1.09309 298.09309 149.59309 14959.3093 1.09309 298.09308 149.59309 14959.30915 1.09309 298.09309 149.59309 14959.30900 2020-01-01 2020-01-02 2020-01-01 00:06:04 2020-01-02 03:34:25 2020-01-01 00:06:04.000 2020-01-02 03:34:25.000 364 99265 49814.5 4981450 364 99265 49814.5 4981450 -32205 32730 5250.02 525002 -125 126 2.02 202 +365 2 10355 99266 1.09609 298.09609 149.59609 14959.6096 1.09609 298.0961 149.59609 14959.6099 1.09609 298.09609 149.59609 14959.60900 2020-01-01 2020-01-02 2020-01-01 00:06:05 2020-01-02 03:34:26 2020-01-01 00:06:05.000 2020-01-02 03:34:26.000 365 99266 49815.5 4981550 365 99266 49815.5 4981550 -32204 32731 5251.02 525102 -124 127 3.02 302 +366 2 10356 99267 1.09909 298.09909 149.59909 14959.9099 1.09909 298.0991 149.5991 14959.91003 1.09909 298.09909 149.59909 14959.90900 2020-01-01 2020-01-02 2020-01-01 00:06:06 2020-01-02 03:34:27 2020-01-01 00:06:06.000 2020-01-02 03:34:27.000 366 99267 49816.5 4981650 366 99267 49816.5 4981650 -32203 32732 5252.02 525202 -128 127 1.46 146 +367 2 10357 99268 1.1021 298.1021 149.6021 14960.21021 1.1021 298.1021 149.6021 14960.21015 1.10210 298.10210 149.60210 14960.21000 2020-01-01 2020-01-02 2020-01-01 00:06:07 2020-01-02 03:34:28 2020-01-01 00:06:07.000 2020-01-02 03:34:28.000 367 99268 49817.5 4981750 367 99268 49817.5 4981750 -32202 32733 5253.02 525302 -128 123 -0.1 -10 +368 2 10358 99269 1.1051 298.1051 149.6051 14960.51051 1.1051 298.1051 149.6051 14960.51031 1.10510 298.10510 149.60510 14960.51000 2020-01-01 2020-01-02 2020-01-01 00:06:08 2020-01-02 03:34:29 2020-01-01 00:06:08.000 2020-01-02 03:34:29.000 368 99269 49818.5 4981850 368 99269 49818.5 4981850 -32201 32734 5254.02 525402 -127 124 0.9 90 +369 2 10359 99270 1.1081 298.1081 149.6081 14960.81081 1.1081 298.1081 149.6081 14960.81062 1.10810 298.10810 149.60810 14960.81000 2020-01-01 2020-01-02 2020-01-01 00:06:09 2020-01-02 03:34:30 2020-01-01 00:06:09.000 2020-01-02 03:34:30.000 369 99270 49819.5 4981950 369 99270 49819.5 4981950 -32200 32735 5255.02 525502 -126 125 1.9 190 +37 2 10027 99937 0.11111 300.11111 150.11111 15161.22222 0.11111 300.1111 150.11111 15161.22248 0.11111 300.11111 150.11111 15161.22211 2020-01-01 2020-01-02 2020-01-01 00:00:37 2020-01-02 03:45:37 2020-01-01 00:00:37.000 2020-01-02 03:45:37.000 37 99937 49987 5048687 37 99937 49987 5048687 -32532 32403 4566.009900990099 461167 -127 124 -1.4356435643564356 -145 +370 2 10360 99271 1.11111 298.11111 149.61111 14961.11111 1.11111 298.1111 149.61111 14961.11137 1.11111 298.11111 149.61111 14961.11100 2020-01-01 2020-01-02 2020-01-01 00:06:10 2020-01-02 03:34:31 2020-01-01 00:06:10.000 2020-01-02 03:34:31.000 370 99271 49820.5 4982050 370 99271 49820.5 4982050 -32199 32736 5256.02 525602 -125 126 2.9 290 +371 2 10361 99272 1.11411 298.11411 149.61411 14961.41141 1.11411 298.1141 149.61411 14961.4115 1.11411 298.11411 149.61411 14961.41100 2020-01-01 2020-01-02 2020-01-01 00:06:11 2020-01-02 03:34:32 2020-01-01 00:06:11.000 2020-01-02 03:34:32.000 371 99272 49821.5 4982150 371 99272 49821.5 4982150 -32198 32737 5257.02 525702 -124 127 3.9 390 +372 2 10362 99273 1.11711 298.11711 149.61711 14961.71171 1.11711 298.11713 149.61711 14961.71165 1.11711 298.11711 149.61711 14961.71100 2020-01-01 2020-01-02 2020-01-01 00:06:12 2020-01-02 03:34:33 2020-01-01 00:06:12.000 2020-01-02 03:34:33.000 372 99273 49822.5 4982250 372 99273 49822.5 4982250 -32197 32738 5258.02 525802 -128 127 2.34 234 +373 2 10363 99274 1.12012 298.12012 149.62012 14962.01201 1.12012 298.12012 149.62011 14962.01179 1.12012 298.12012 149.62012 14962.01200 2020-01-01 2020-01-02 2020-01-01 00:06:13 2020-01-02 03:34:34 2020-01-01 00:06:13.000 2020-01-02 03:34:34.000 373 99274 49823.5 4982350 373 99274 49823.5 4982350 -32196 32739 5259.02 525902 -128 123 0.78 78 +374 2 10364 99275 1.12312 298.12312 149.62312 14962.31231 1.12312 298.1231 149.62312 14962.31208 1.12312 298.12312 149.62312 14962.31200 2020-01-01 2020-01-02 2020-01-01 00:06:14 2020-01-02 03:34:35 2020-01-01 00:06:14.000 2020-01-02 03:34:35.000 374 99275 49824.5 4982450 374 99275 49824.5 4982450 -32195 32740 5260.02 526002 -127 124 1.78 178 +375 2 10365 99276 1.12612 298.12612 149.62612 14962.61261 1.12612 298.12613 149.62612 14962.61283 1.12612 298.12612 149.62612 14962.61200 2020-01-01 2020-01-02 2020-01-01 00:06:15 2020-01-02 03:34:36 2020-01-01 00:06:15.000 2020-01-02 03:34:36.000 375 99276 49825.5 4982550 375 99276 49825.5 4982550 -32194 32741 5261.02 526102 -126 125 2.78 278 +376 2 10366 99277 1.12912 298.12912 149.62912 14962.91291 1.12912 298.12912 149.62912 14962.91297 1.12912 298.12912 149.62912 14962.91200 2020-01-01 2020-01-02 2020-01-01 00:06:16 2020-01-02 03:34:37 2020-01-01 00:06:16.000 2020-01-02 03:34:37.000 376 99277 49826.5 4982650 376 99277 49826.5 4982650 -32193 32742 5262.02 526202 -125 126 3.78 378 +377 2 10367 99278 1.13213 298.13213 149.63213 14963.21321 1.13213 298.13214 149.63213 14963.21312 1.13213 298.13213 149.63213 14963.21300 2020-01-01 2020-01-02 2020-01-01 00:06:17 2020-01-02 03:34:38 2020-01-01 00:06:17.000 2020-01-02 03:34:38.000 377 99278 49827.5 4982750 377 99278 49827.5 4982750 -32192 32743 5263.02 526302 -124 127 4.78 478 +378 2 10368 99279 1.13513 298.13513 149.63513 14963.51351 1.13513 298.13513 149.63513 14963.51326 1.13513 298.13513 149.63513 14963.51300 2020-01-01 2020-01-02 2020-01-01 00:06:18 2020-01-02 03:34:39 2020-01-01 00:06:18.000 2020-01-02 03:34:39.000 378 99279 49828.5 4982850 378 99279 49828.5 4982850 -32191 32744 5264.02 526402 -128 127 3.22 322 +379 2 10369 99280 1.13813 298.13813 149.63813 14963.81381 1.13813 298.13815 149.63814 14963.81401 1.13813 298.13813 149.63813 14963.81300 2020-01-01 2020-01-02 2020-01-01 00:06:19 2020-01-02 03:34:40 2020-01-01 00:06:19.000 2020-01-02 03:34:40.000 379 99280 49829.5 4982950 379 99280 49829.5 4982950 -32190 32745 5265.02 526502 -128 127 1.66 166 +38 2 10028 99938 0.11411 300.11411 150.11411 15161.52552 0.11411 300.1141 150.11411 15161.52562 0.11411 300.11411 150.11411 15161.52511 2020-01-01 2020-01-02 2020-01-01 00:00:38 2020-01-02 03:45:38 2020-01-01 00:00:38.000 2020-01-02 03:45:38.000 38 99938 49988 5048788 38 99938 49988 5048788 -32531 32404 4567.009900990099 461268 -126 125 -0.43564356435643564 -44 +380 2 10370 99281 1.14114 298.14114 149.64114 14964.11411 1.14114 298.14114 149.64114 14964.11431 1.14114 298.14114 149.64114 14964.11400 2020-01-01 2020-01-02 2020-01-01 00:06:20 2020-01-02 03:34:41 2020-01-01 00:06:20.000 2020-01-02 03:34:41.000 380 99281 49830.5 4983050 380 99281 49830.5 4983050 -32189 32746 5266.02 526602 -128 124 0.1 10 +381 2 10371 99282 1.14414 298.14414 149.64414 14964.41441 1.14414 298.14413 149.64414 14964.41448 1.14414 298.14414 149.64414 14964.41400 2020-01-01 2020-01-02 2020-01-01 00:06:21 2020-01-02 03:34:42 2020-01-01 00:06:21.000 2020-01-02 03:34:42.000 381 99282 49831.5 4983150 381 99282 49831.5 4983150 -32188 32747 5267.02 526702 -127 125 1.1 110 +382 2 10372 99283 1.14714 298.14714 149.64714 14964.71471 1.14714 298.14716 149.64714 14964.71459 1.14714 298.14714 149.64714 14964.71400 2020-01-01 2020-01-02 2020-01-01 00:06:22 2020-01-02 03:34:43 2020-01-01 00:06:22.000 2020-01-02 03:34:43.000 382 99283 49832.5 4983250 382 99283 49832.5 4983250 -32187 32748 5268.02 526802 -126 126 2.1 210 +383 2 10373 99284 1.15015 298.15015 149.65015 14965.01501 1.15015 298.15015 149.65014 14965.01472 1.15015 298.15015 149.65015 14965.01500 2020-01-01 2020-01-02 2020-01-01 00:06:23 2020-01-02 03:34:44 2020-01-01 00:06:23.000 2020-01-02 03:34:44.000 383 99284 49833.5 4983350 383 99284 49833.5 4983350 -32186 32749 5269.02 526902 -125 127 3.1 310 +384 2 10374 99285 1.15315 298.15315 149.65315 14965.31531 1.15315 298.15317 149.65315 14965.31547 1.15315 298.15315 149.65315 14965.31500 2020-01-01 2020-01-02 2020-01-01 00:06:24 2020-01-02 03:34:45 2020-01-01 00:06:24.000 2020-01-02 03:34:45.000 384 99285 49834.5 4983450 384 99285 49834.5 4983450 -32185 32750 5270.02 527002 -128 127 1.54 154 +385 2 10375 99286 1.15615 298.15615 149.65615 14965.61561 1.15615 298.15616 149.65615 14965.61578 1.15615 298.15615 149.65615 14965.61500 2020-01-01 2020-01-02 2020-01-01 00:06:25 2020-01-02 03:34:46 2020-01-01 00:06:25.000 2020-01-02 03:34:46.000 385 99286 49835.5 4983550 385 99286 49835.5 4983550 -32184 32751 5271.02 527102 -128 127 -0.02 -2 +386 2 10376 99287 1.15915 298.15915 149.65915 14965.91591 1.15915 298.15915 149.65915 14965.91594 1.15915 298.15915 149.65915 14965.91500 2020-01-01 2020-01-02 2020-01-01 00:06:26 2020-01-02 03:34:47 2020-01-01 00:06:26.000 2020-01-02 03:34:47.000 386 99287 49836.5 4983650 386 99287 49836.5 4983650 -32183 32752 5272.02 527202 -128 123 -1.58 -158 +387 2 10377 99288 1.16216 298.16216 149.66216 14966.21621 1.16216 298.16217 149.66216 14966.21606 1.16216 298.16216 149.66216 14966.21600 2020-01-01 2020-01-02 2020-01-01 00:06:27 2020-01-02 03:34:48 2020-01-01 00:06:27.000 2020-01-02 03:34:48.000 387 99288 49837.5 4983750 387 99288 49837.5 4983750 -32182 32753 5273.02 527302 -127 124 -0.58 -58 +388 2 10378 99289 1.16516 298.16516 149.66516 14966.51651 1.16516 298.16516 149.66516 14966.51636 1.16516 298.16516 149.66516 14966.51600 2020-01-01 2020-01-02 2020-01-01 00:06:28 2020-01-02 03:34:49 2020-01-01 00:06:28.000 2020-01-02 03:34:49.000 388 99289 49838.5 4983850 388 99289 49838.5 4983850 -32181 32754 5274.02 527402 -126 125 0.42 42 +389 2 10379 99290 1.16816 298.16816 149.66816 14966.81681 1.16816 298.16818 149.66816 14966.81695 1.16816 298.16816 149.66816 14966.81600 2020-01-01 2020-01-02 2020-01-01 00:06:29 2020-01-02 03:34:50 2020-01-01 00:06:29.000 2020-01-02 03:34:50.000 389 99290 49839.5 4983950 389 99290 49839.5 4983950 -32180 32755 5275.02 527502 -125 126 1.42 142 +39 2 10029 99939 0.11711 300.11711 150.11711 15161.82882 0.11711 300.11713 150.11711 15161.82876 0.11711 300.11711 150.11711 15161.82811 2020-01-01 2020-01-02 2020-01-01 00:00:39 2020-01-02 03:45:39 2020-01-01 00:00:39.000 2020-01-02 03:45:39.000 39 99939 49989 5048889 39 99939 49989 5048889 -32530 32405 4568.009900990099 461369 -125 126 0.5643564356435643 57 +390 2 10380 99291 1.17117 298.17117 149.67117 14967.11711 1.17117 298.17117 149.67117 14967.11725 1.17117 298.17117 149.67117 14967.11700 2020-01-01 2020-01-02 2020-01-01 00:06:30 2020-01-02 03:34:51 2020-01-01 00:06:30.000 2020-01-02 03:34:51.000 390 99291 49840.5 4984050 390 99291 49840.5 4984050 -32179 32756 5276.02 527602 -124 127 2.42 242 +391 2 10381 99292 1.17417 298.17417 149.67417 14967.41741 1.17417 298.17416 149.67417 14967.41741 1.17417 298.17417 149.67417 14967.41700 2020-01-01 2020-01-02 2020-01-01 00:06:31 2020-01-02 03:34:52 2020-01-01 00:06:31.000 2020-01-02 03:34:52.000 391 99292 49841.5 4984150 391 99292 49841.5 4984150 -32178 32757 5277.02 527702 -128 127 0.86 86 +392 2 10382 99293 1.17717 298.17717 149.67717 14967.71771 1.17717 298.1772 149.67717 14967.71753 1.17717 298.17717 149.67717 14967.71700 2020-01-01 2020-01-02 2020-01-01 00:06:32 2020-01-02 03:34:53 2020-01-01 00:06:32.000 2020-01-02 03:34:53.000 392 99293 49842.5 4984250 392 99293 49842.5 4984250 -32177 32758 5278.02 527802 -128 123 -0.7 -70 +393 2 10383 99294 1.18018 298.18018 149.68018 14968.01801 1.18018 298.18018 149.68017 14968.01782 1.18018 298.18018 149.68018 14968.01800 2020-01-01 2020-01-02 2020-01-01 00:06:33 2020-01-02 03:34:54 2020-01-01 00:06:33.000 2020-01-02 03:34:54.000 393 99294 49843.5 4984350 393 99294 49843.5 4984350 -32176 32759 5279.02 527902 -127 124 0.3 30 +394 2 10384 99295 1.18318 298.18318 149.68318 14968.31831 1.18318 298.1832 149.68318 14968.31842 1.18318 298.18318 149.68318 14968.31800 2020-01-01 2020-01-02 2020-01-01 00:06:34 2020-01-02 03:34:55 2020-01-01 00:06:34.000 2020-01-02 03:34:55.000 394 99295 49844.5 4984450 394 99295 49844.5 4984450 -32175 32760 5280.02 528002 -126 125 1.3 130 +395 2 10385 99296 1.18618 298.18618 149.68618 14968.61861 1.18618 298.1862 149.68618 14968.61875 1.18618 298.18618 149.68618 14968.61800 2020-01-01 2020-01-02 2020-01-01 00:06:35 2020-01-02 03:34:56 2020-01-01 00:06:35.000 2020-01-02 03:34:56.000 395 99296 49845.5 4984550 395 99296 49845.5 4984550 -32174 32761 5281.02 528102 -125 126 2.3 230 +396 2 10386 99297 1.18918 298.18918 149.68918 14968.91891 1.18918 298.18918 149.68918 14968.91889 1.18918 298.18918 149.68918 14968.91800 2020-01-01 2020-01-02 2020-01-01 00:06:36 2020-01-02 03:34:57 2020-01-01 00:06:36.000 2020-01-02 03:34:57.000 396 99297 49846.5 4984650 396 99297 49846.5 4984650 -32173 32762 5282.02 528202 -124 127 3.3 330 +397 2 10387 99298 1.19219 298.19219 149.69219 14969.21921 1.19219 298.1922 149.69219 14969.21964 1.19219 298.19219 149.69219 14969.21900 2020-01-01 2020-01-02 2020-01-01 00:06:37 2020-01-02 03:34:58 2020-01-01 00:06:37.000 2020-01-02 03:34:58.000 397 99298 49847.5 4984750 397 99298 49847.5 4984750 -32172 32763 5283.02 528302 -128 127 1.74 174 +398 2 10388 99299 1.19519 298.19519 149.69519 14969.51951 1.19519 298.1952 149.69519 14969.51929 1.19519 298.19519 149.69519 14969.51900 2020-01-01 2020-01-02 2020-01-01 00:06:38 2020-01-02 03:34:59 2020-01-01 00:06:38.000 2020-01-02 03:34:59.000 398 99299 49848.5 4984850 398 99299 49848.5 4984850 -32171 32764 5284.02 528402 -128 123 0.18 18 +399 2 10389 99300 1.19819 298.19819 149.69819 14969.81981 1.19819 298.1982 149.69819 14969.81989 1.19819 298.19819 149.69819 14969.81900 2020-01-01 2020-01-02 2020-01-01 00:06:39 2020-01-02 03:35:00 2020-01-01 00:06:39.000 2020-01-02 03:35:00.000 399 99300 49849.5 4984950 399 99300 49849.5 4984950 -32170 32765 5285.02 528502 -127 124 1.18 118 +4 2 1003 9994 0.01201 300.01201 150.01201 15151.21321 0.01201 300.01202 150.01201 15151.21318 0.01201 300.01201 150.01201 15151.21301 2020-01-01 2020-01-02 2020-01-01 00:00:04 2020-01-02 03:45:04 2020-01-01 00:00:04.000 2020-01-02 03:45:04.000 4 99904 49954 5045354 4 99904 49954 5045354 -32565 32370 4533.009900990099 457834 -128 127 -1.4851485148514851 -150 +40 2 10030 99940 0.12012 300.12012 150.12012 15162.13213 0.12012 300.12012 150.12011 15162.13191 0.12012 300.12012 150.12012 15162.13212 2020-01-01 2020-01-02 2020-01-01 00:00:40 2020-01-02 03:45:40 2020-01-01 00:00:40.000 2020-01-02 03:45:40.000 40 99940 49990 5048990 40 99940 49990 5048990 -32529 32406 4569.009900990099 461470 -124 127 1.5643564356435644 158 +400 2 10390 99301 1.2012 298.2012 149.7012 14970.12012 1.2012 298.2012 149.7012 14970.12022 1.20120 298.20120 149.70120 14970.12000 2020-01-01 2020-01-02 2020-01-01 00:06:40 2020-01-02 03:35:01 2020-01-01 00:06:40.000 2020-01-02 03:35:01.000 400 99301 49850.5 4985050 400 99301 49850.5 4985050 -32169 32766 5286.02 528602 -126 125 2.18 218 +401 2 10391 99302 1.2042 298.2042 149.7042 14970.42042 1.2042 298.2042 149.7042 14970.42035 1.20420 298.20420 149.70420 14970.42000 2020-01-01 2020-01-02 2020-01-01 00:06:41 2020-01-02 03:35:02 2020-01-01 00:06:41.000 2020-01-02 03:35:02.000 401 99302 49851.5 4985150 401 99302 49851.5 4985150 -32168 32767 5287.02 528702 -125 126 3.18 318 +402 2 10392 99303 1.2072 298.2072 149.7072 14970.72072 1.2072 298.2072 149.70721 14970.72111 1.20720 298.20720 149.70720 14970.72000 2020-01-01 2020-01-02 2020-01-01 00:06:42 2020-01-02 03:35:03 2020-01-01 00:06:42.000 2020-01-02 03:35:03.000 402 99303 49852.5 4985250 402 99303 49852.5 4985250 -32768 32370 4632.66 463266 -124 127 4.18 418 +403 2 10393 99304 1.21021 298.21021 149.71021 14971.02102 1.21021 298.2102 149.7102 14971.02077 1.21021 298.21021 149.71021 14971.02100 2020-01-01 2020-01-02 2020-01-01 00:06:43 2020-01-02 03:35:04 2020-01-01 00:06:43.000 2020-01-02 03:35:04.000 403 99304 49853.5 4985350 403 99304 49853.5 4985350 -32767 32371 4633.66 463366 -128 127 2.62 262 +404 2 10394 99305 1.21321 298.21321 149.71321 14971.32132 1.21321 298.21323 149.71321 14971.32139 1.21321 298.21321 149.71321 14971.32100 2020-01-01 2020-01-02 2020-01-01 00:06:44 2020-01-02 03:35:05 2020-01-01 00:06:44.000 2020-01-02 03:35:05.000 404 99305 49854.5 4985450 404 99305 49854.5 4985450 -32766 32372 4634.66 463466 -128 127 1.06 106 +405 2 10395 99306 1.21621 298.21621 149.71621 14971.62162 1.21621 298.21622 149.71621 14971.62169 1.21621 298.21621 149.71621 14971.62100 2020-01-01 2020-01-02 2020-01-01 00:06:45 2020-01-02 03:35:06 2020-01-01 00:06:45.000 2020-01-02 03:35:06.000 405 99306 49855.5 4985550 405 99306 49855.5 4985550 -32765 32373 4635.66 463566 -128 124 -0.5 -50 +406 2 10396 99307 1.21921 298.21921 149.71921 14971.92192 1.21921 298.2192 149.71921 14971.92199 1.21921 298.21921 149.71921 14971.92100 2020-01-01 2020-01-02 2020-01-01 00:06:46 2020-01-02 03:35:07 2020-01-01 00:06:46.000 2020-01-02 03:35:07.000 406 99307 49856.5 4985650 406 99307 49856.5 4985650 -32764 32374 4636.66 463666 -127 125 0.5 50 +407 2 10397 99308 1.22222 298.22222 149.72222 14972.22222 1.22222 298.22223 149.72222 14972.22257 1.22222 298.22222 149.72222 14972.22200 2020-01-01 2020-01-02 2020-01-01 00:06:47 2020-01-02 03:35:08 2020-01-01 00:06:47.000 2020-01-02 03:35:08.000 407 99308 49857.5 4985750 407 99308 49857.5 4985750 -32763 32375 4637.66 463766 -126 126 1.5 150 +408 2 10398 99309 1.22522 298.22522 149.72522 14972.52252 1.22522 298.22522 149.72522 14972.52224 1.22522 298.22522 149.72522 14972.52200 2020-01-01 2020-01-02 2020-01-01 00:06:48 2020-01-02 03:35:09 2020-01-01 00:06:48.000 2020-01-02 03:35:09.000 408 99309 49858.5 4985850 408 99309 49858.5 4985850 -32762 32376 4638.66 463866 -125 127 2.5 250 +409 2 10399 99310 1.22822 298.22822 149.72822 14972.82282 1.22822 298.22824 149.72822 14972.82286 1.22822 298.22822 149.72822 14972.82200 2020-01-01 2020-01-02 2020-01-01 00:06:49 2020-01-02 03:35:10 2020-01-01 00:06:49.000 2020-01-02 03:35:10.000 409 99310 49859.5 4985950 409 99310 49859.5 4985950 -32761 32377 4639.66 463966 -128 127 0.94 94 +41 2 10031 99941 0.12312 300.12312 150.12312 15162.43543 0.12312 300.1231 150.12312 15162.43521 0.12312 300.12312 150.12312 15162.43512 2020-01-01 2020-01-02 2020-01-01 00:00:41 2020-01-02 03:45:41 2020-01-01 00:00:41.000 2020-01-02 03:45:41.000 41 99941 49991 5049091 41 99941 49991 5049091 -32528 32407 4570.009900990099 461571 -128 127 0.0297029702970297 3 +410 2 10400 99311 1.23123 298.23123 149.73123 14973.12312 1.23123 298.23123 149.73123 14973.12316 1.23123 298.23123 149.73123 14973.12300 2020-01-01 2020-01-02 2020-01-01 00:06:50 2020-01-02 03:35:11 2020-01-01 00:06:50.000 2020-01-02 03:35:11.000 410 99311 49860.5 4986050 410 99311 49860.5 4986050 -32760 32378 4640.66 464066 -128 127 -0.62 -62 +411 2 10401 99312 1.23423 298.23423 149.73423 14973.42342 1.23423 298.23422 149.73423 14973.42345 1.23423 298.23423 149.73423 14973.42300 2020-01-01 2020-01-02 2020-01-01 00:06:51 2020-01-02 03:35:12 2020-01-01 00:06:51.000 2020-01-02 03:35:12.000 411 99312 49861.5 4986150 411 99312 49861.5 4986150 -32759 32379 4641.66 464166 -128 123 -2.18 -218 +412 2 10402 99313 1.23723 298.23723 149.73723 14973.72372 1.23723 298.23724 149.73724 14973.72405 1.23723 298.23723 149.73723 14973.72300 2020-01-01 2020-01-02 2020-01-01 00:06:52 2020-01-02 03:35:13 2020-01-01 00:06:52.000 2020-01-02 03:35:13.000 412 99313 49862.5 4986250 412 99313 49862.5 4986250 -32758 32380 4642.66 464266 -127 124 -1.18 -118 +413 2 10403 99314 1.24024 298.24024 149.74024 14974.02402 1.24024 298.24023 149.74023 14974.02374 1.24024 298.24024 149.74024 14974.02400 2020-01-01 2020-01-02 2020-01-01 00:06:53 2020-01-02 03:35:14 2020-01-01 00:06:53.000 2020-01-02 03:35:14.000 413 99314 49863.5 4986350 413 99314 49863.5 4986350 -32757 32381 4643.66 464366 -126 125 -0.18 -18 +414 2 10404 99315 1.24324 298.24324 149.74324 14974.32432 1.24324 298.24326 149.74324 14974.32433 1.24324 298.24324 149.74324 14974.32400 2020-01-01 2020-01-02 2020-01-01 00:06:54 2020-01-02 03:35:15 2020-01-01 00:06:54.000 2020-01-02 03:35:15.000 414 99315 49864.5 4986450 414 99315 49864.5 4986450 -32756 32382 4644.66 464466 -125 126 0.82 82 +415 2 10405 99316 1.24624 298.24624 149.74624 14974.62462 1.24624 298.24625 149.74624 14974.62463 1.24624 298.24624 149.74624 14974.62400 2020-01-01 2020-01-02 2020-01-01 00:06:55 2020-01-02 03:35:16 2020-01-01 00:06:55.000 2020-01-02 03:35:16.000 415 99316 49865.5 4986550 415 99316 49865.5 4986550 -32755 32383 4645.66 464566 -124 127 1.82 182 +416 2 10406 99317 1.24924 298.24924 149.74924 14974.92492 1.24924 298.24924 149.74924 14974.92492 1.24924 298.24924 149.74924 14974.92400 2020-01-01 2020-01-02 2020-01-01 00:06:56 2020-01-02 03:35:17 2020-01-01 00:06:56.000 2020-01-02 03:35:17.000 416 99317 49866.5 4986650 416 99317 49866.5 4986650 -32754 32384 4646.66 464666 -128 127 0.26 26 +417 2 10407 99318 1.25225 298.25225 149.75225 14975.22522 1.25225 298.25226 149.75225 14975.22552 1.25225 298.25225 149.75225 14975.22500 2020-01-01 2020-01-02 2020-01-01 00:06:57 2020-01-02 03:35:18 2020-01-01 00:06:57.000 2020-01-02 03:35:18.000 417 99318 49867.5 4986750 417 99318 49867.5 4986750 -32753 32385 4647.66 464766 -128 123 -1.3 -130 +418 2 10408 99319 1.25525 298.25525 149.75525 14975.52552 1.25525 298.25525 149.75525 14975.52521 1.25525 298.25525 149.75525 14975.52500 2020-01-01 2020-01-02 2020-01-01 00:06:58 2020-01-02 03:35:19 2020-01-01 00:06:58.000 2020-01-02 03:35:19.000 418 99319 49868.5 4986850 418 99319 49868.5 4986850 -32752 32386 4648.66 464866 -127 124 -0.3 -30 +419 2 10409 99320 1.25825 298.25825 149.75825 14975.82582 1.25825 298.25827 149.75825 14975.8258 1.25825 298.25825 149.75825 14975.82500 2020-01-01 2020-01-02 2020-01-01 00:06:59 2020-01-02 03:35:20 2020-01-01 00:06:59.000 2020-01-02 03:35:20.000 419 99320 49869.5 4986950 419 99320 49869.5 4986950 -32751 32387 4649.66 464966 -126 125 0.7 70 +42 2 10032 99942 0.12612 300.12612 150.12612 15162.73873 0.12612 300.12613 150.12612 15162.73896 0.12612 300.12612 150.12612 15162.73812 2020-01-01 2020-01-02 2020-01-01 00:00:42 2020-01-02 03:45:42 2020-01-01 00:00:42.000 2020-01-02 03:45:42.000 42 99942 49992 5049192 42 99942 49992 5049192 -32527 32408 4571.009900990099 461672 -128 127 -1.504950495049505 -152 +420 2 10410 99321 1.26126 298.26126 149.76126 14976.12612 1.26126 298.26126 149.76126 14976.12609 1.26126 298.26126 149.76126 14976.12600 2020-01-01 2020-01-02 2020-01-01 00:07:00 2020-01-02 03:35:21 2020-01-01 00:07:00.000 2020-01-02 03:35:21.000 420 99321 49870.5 4987050 420 99321 49870.5 4987050 -32750 32388 4650.66 465066 -125 126 1.7 170 +421 2 10411 99322 1.26426 298.26426 149.76426 14976.42642 1.26426 298.26425 149.76426 14976.4264 1.26426 298.26426 149.76426 14976.42600 2020-01-01 2020-01-02 2020-01-01 00:07:01 2020-01-02 03:35:22 2020-01-01 00:07:01.000 2020-01-02 03:35:22.000 421 99322 49871.5 4987150 421 99322 49871.5 4987150 -32749 32389 4651.66 465166 -124 127 2.7 270 +422 2 10412 99323 1.26726 298.26726 149.76726 14976.72672 1.26726 298.26727 149.76727 14976.72702 1.26726 298.26726 149.76726 14976.72600 2020-01-01 2020-01-02 2020-01-01 00:07:02 2020-01-02 03:35:23 2020-01-01 00:07:02.000 2020-01-02 03:35:23.000 422 99323 49872.5 4987250 422 99323 49872.5 4987250 -32748 32390 4652.66 465266 -128 127 1.14 114 +423 2 10413 99324 1.27027 298.27027 149.77027 14977.02702 1.27027 298.27026 149.77026 14977.02667 1.27027 298.27027 149.77027 14977.02700 2020-01-01 2020-01-02 2020-01-01 00:07:03 2020-01-02 03:35:24 2020-01-01 00:07:03.000 2020-01-02 03:35:24.000 423 99324 49873.5 4987350 423 99324 49873.5 4987350 -32747 32391 4653.66 465366 -128 123 -0.42 -42 +424 2 10414 99325 1.27327 298.27327 149.77327 14977.32732 1.27327 298.2733 149.77327 14977.32727 1.27327 298.27327 149.77327 14977.32700 2020-01-01 2020-01-02 2020-01-01 00:07:04 2020-01-02 03:35:25 2020-01-01 00:07:04.000 2020-01-02 03:35:25.000 424 99325 49874.5 4987450 424 99325 49874.5 4987450 -32746 32392 4654.66 465466 -127 124 0.58 58 +425 2 10415 99326 1.27627 298.27627 149.77627 14977.62762 1.27627 298.27628 149.77627 14977.62756 1.27627 298.27627 149.77627 14977.62700 2020-01-01 2020-01-02 2020-01-01 00:07:05 2020-01-02 03:35:26 2020-01-01 00:07:05.000 2020-01-02 03:35:26.000 425 99326 49875.5 4987550 425 99326 49875.5 4987550 -32745 32393 4655.66 465566 -126 125 1.58 158 +426 2 10416 99327 1.27927 298.27927 149.77927 14977.92792 1.27927 298.27927 149.77927 14977.92787 1.27927 298.27927 149.77927 14977.92700 2020-01-01 2020-01-02 2020-01-01 00:07:06 2020-01-02 03:35:27 2020-01-01 00:07:06.000 2020-01-02 03:35:27.000 426 99327 49876.5 4987650 426 99327 49876.5 4987650 -32744 32394 4656.66 465666 -125 126 2.58 258 +427 2 10417 99328 1.28228 298.28228 149.78228 14978.22822 1.28228 298.2823 149.78228 14978.22849 1.28228 298.28228 149.78228 14978.22800 2020-01-01 2020-01-02 2020-01-01 00:07:07 2020-01-02 03:35:28 2020-01-01 00:07:07.000 2020-01-02 03:35:28.000 427 99328 49877.5 4987750 427 99328 49877.5 4987750 -32743 32395 4657.66 465766 -124 127 3.58 358 +428 2 10418 99329 1.28528 298.28528 149.78528 14978.52852 1.28528 298.28528 149.78528 14978.52815 1.28528 298.28528 149.78528 14978.52800 2020-01-01 2020-01-02 2020-01-01 00:07:08 2020-01-02 03:35:29 2020-01-01 00:07:08.000 2020-01-02 03:35:29.000 428 99329 49878.5 4987850 428 99329 49878.5 4987850 -32742 32396 4658.66 465866 -128 127 2.02 202 +429 2 10419 99330 1.28828 298.28828 149.78828 14978.82882 1.28828 298.2883 149.78828 14978.8289 1.28828 298.28828 149.78828 14978.82800 2020-01-01 2020-01-02 2020-01-01 00:07:09 2020-01-02 03:35:30 2020-01-01 00:07:09.000 2020-01-02 03:35:30.000 429 99330 49879.5 4987950 429 99330 49879.5 4987950 -32741 32397 4659.66 465966 -128 127 0.46 46 +43 2 10033 99943 0.12912 300.12912 150.12912 15163.04204 0.12912 300.12912 150.12912 15163.04211 0.12912 300.12912 150.12912 15163.04112 2020-01-01 2020-01-02 2020-01-01 00:00:43 2020-01-02 03:45:43 2020-01-01 00:00:43.000 2020-01-02 03:45:43.000 43 99943 49993 5049293 43 99943 49993 5049293 -32526 32409 4572.009900990099 461773 -128 124 -3.0396039603960396 -307 +430 2 10420 99331 1.29129 298.29129 149.79129 14979.12912 1.29129 298.2913 149.79129 14979.12904 1.29129 298.29129 149.79129 14979.12900 2020-01-01 2020-01-02 2020-01-01 00:07:10 2020-01-02 03:35:31 2020-01-01 00:07:10.000 2020-01-02 03:35:31.000 430 99331 49880.5 4988050 430 99331 49880.5 4988050 -32740 32398 4660.66 466066 -128 124 -1.1 -110 +431 2 10421 99332 1.29429 298.29429 149.79429 14979.42942 1.29429 298.29428 149.79429 14979.42933 1.29429 298.29429 149.79429 14979.42900 2020-01-01 2020-01-02 2020-01-01 00:07:11 2020-01-02 03:35:32 2020-01-01 00:07:11.000 2020-01-02 03:35:32.000 431 99332 49881.5 4988150 431 99332 49881.5 4988150 -32739 32399 4661.66 466166 -127 125 -0.1 -10 +432 2 10422 99333 1.29729 298.29729 149.79729 14979.72972 1.29729 298.2973 149.79729 14979.72996 1.29729 298.29729 149.79729 14979.72900 2020-01-01 2020-01-02 2020-01-01 00:07:12 2020-01-02 03:35:33 2020-01-01 00:07:12.000 2020-01-02 03:35:33.000 432 99333 49882.5 4988250 432 99333 49882.5 4988250 -32738 32400 4662.66 466266 -126 126 0.9 90 +433 2 10423 99334 1.3003 298.3003 149.8003 14980.03003 1.3003 298.3003 149.80029 14980.02962 1.30030 298.30030 149.80030 14980.03000 2020-01-01 2020-01-02 2020-01-01 00:07:13 2020-01-02 03:35:34 2020-01-01 00:07:13.000 2020-01-02 03:35:34.000 433 99334 49883.5 4988350 433 99334 49883.5 4988350 -32737 32401 4663.66 466366 -125 127 1.9 190 +434 2 10424 99335 1.3033 298.3033 149.8033 14980.33033 1.3033 298.3033 149.8033 14980.33037 1.30330 298.30330 149.80330 14980.33000 2020-01-01 2020-01-02 2020-01-01 00:07:14 2020-01-02 03:35:35 2020-01-01 00:07:14.000 2020-01-02 03:35:35.000 434 99335 49884.5 4988450 434 99335 49884.5 4988450 -32736 32402 4664.66 466466 -128 127 0.34 34 +435 2 10425 99336 1.3063 298.3063 149.8063 14980.63063 1.3063 298.3063 149.8063 14980.63051 1.30630 298.30630 149.80630 14980.63000 2020-01-01 2020-01-02 2020-01-01 00:07:15 2020-01-02 03:35:36 2020-01-01 00:07:15.000 2020-01-02 03:35:36.000 435 99336 49885.5 4988550 435 99336 49885.5 4988550 -32735 32403 4665.66 466566 -128 127 -1.22 -122 +436 2 10426 99337 1.3093 298.3093 149.8093 14980.93093 1.3093 298.3093 149.8093 14980.93084 1.30930 298.30930 149.80930 14980.93000 2020-01-01 2020-01-02 2020-01-01 00:07:16 2020-01-02 03:35:37 2020-01-01 00:07:16.000 2020-01-02 03:35:37.000 436 99337 49886.5 4988650 436 99337 49886.5 4988650 -32734 32404 4666.66 466666 -128 123 -2.78 -278 +437 2 10427 99338 1.31231 298.31231 149.81231 14981.23123 1.31231 298.31232 149.81231 14981.23143 1.31231 298.31231 149.81231 14981.23100 2020-01-01 2020-01-02 2020-01-01 00:07:17 2020-01-02 03:35:38 2020-01-01 00:07:17.000 2020-01-02 03:35:38.000 437 99338 49887.5 4988750 437 99338 49887.5 4988750 -32733 32405 4667.66 466766 -127 124 -1.78 -178 +438 2 10428 99339 1.31531 298.31531 149.81531 14981.53153 1.31531 298.3153 149.81531 14981.53173 1.31531 298.31531 149.81531 14981.53100 2020-01-01 2020-01-02 2020-01-01 00:07:18 2020-01-02 03:35:39 2020-01-01 00:07:18.000 2020-01-02 03:35:39.000 438 99339 49888.5 4988850 438 99339 49888.5 4988850 -32732 32406 4668.66 466866 -126 125 -0.78 -78 +439 2 10429 99340 1.31831 298.31831 149.81831 14981.83183 1.31831 298.31833 149.81831 14981.83184 1.31831 298.31831 149.81831 14981.83100 2020-01-01 2020-01-02 2020-01-01 00:07:19 2020-01-02 03:35:40 2020-01-01 00:07:19.000 2020-01-02 03:35:40.000 439 99340 49889.5 4988950 439 99340 49889.5 4988950 -32731 32407 4669.66 466966 -125 126 0.22 22 +44 2 10034 99944 0.13213 300.13213 150.13213 15163.34534 0.13213 300.13214 150.13213 15163.34525 0.13213 300.13213 150.13213 15163.34513 2020-01-01 2020-01-02 2020-01-01 00:00:44 2020-01-02 03:45:44 2020-01-01 00:00:44.000 2020-01-02 03:45:44.000 44 99944 49994 5049394 44 99944 49994 5049394 -32525 32410 4573.009900990099 461874 -127 125 -2.0396039603960396 -206 +440 2 10430 99341 1.32132 298.32132 149.82132 14982.13213 1.32132 298.32132 149.82131 14982.13197 1.32132 298.32132 149.82132 14982.13200 2020-01-01 2020-01-02 2020-01-01 00:07:20 2020-01-02 03:35:41 2020-01-01 00:07:20.000 2020-01-02 03:35:41.000 440 99341 49890.5 4989050 440 99341 49890.5 4989050 -32730 32408 4670.66 467066 -124 127 1.22 122 +441 2 10431 99342 1.32432 298.32432 149.82432 14982.43243 1.32432 298.3243 149.82432 14982.4323 1.32432 298.32432 149.82432 14982.43200 2020-01-01 2020-01-02 2020-01-01 00:07:21 2020-01-02 03:35:42 2020-01-01 00:07:21.000 2020-01-02 03:35:42.000 441 99342 49891.5 4989150 441 99342 49891.5 4989150 -32729 32409 4671.66 467166 -128 127 -0.34 -34 +442 2 10432 99343 1.32732 298.32732 149.82732 14982.73273 1.32732 298.32733 149.82732 14982.7329 1.32732 298.32732 149.82732 14982.73200 2020-01-01 2020-01-02 2020-01-01 00:07:22 2020-01-02 03:35:43 2020-01-01 00:07:22.000 2020-01-02 03:35:43.000 442 99343 49892.5 4989250 442 99343 49892.5 4989250 -32728 32410 4672.66 467266 -128 123 -1.9 -190 +443 2 10433 99344 1.33033 298.33033 149.83033 14983.03303 1.33033 298.33032 149.83033 14983.03319 1.33033 298.33033 149.83033 14983.03300 2020-01-01 2020-01-02 2020-01-01 00:07:23 2020-01-02 03:35:44 2020-01-01 00:07:23.000 2020-01-02 03:35:44.000 443 99344 49893.5 4989350 443 99344 49893.5 4989350 -32727 32411 4673.66 467366 -127 124 -0.9 -90 +444 2 10434 99345 1.33333 298.33333 149.83333 14983.33333 1.33333 298.33334 149.83333 14983.33331 1.33333 298.33333 149.83333 14983.33300 2020-01-01 2020-01-02 2020-01-01 00:07:24 2020-01-02 03:35:45 2020-01-01 00:07:24.000 2020-01-02 03:35:45.000 444 99345 49894.5 4989450 444 99345 49894.5 4989450 -32726 32412 4674.66 467466 -126 125 0.1 10 +445 2 10435 99346 1.33633 298.33633 149.83633 14983.63363 1.33633 298.33633 149.83633 14983.63348 1.33633 298.33633 149.83633 14983.63300 2020-01-01 2020-01-02 2020-01-01 00:07:25 2020-01-02 03:35:46 2020-01-01 00:07:25.000 2020-01-02 03:35:46.000 445 99346 49895.5 4989550 445 99346 49895.5 4989550 -32725 32413 4675.66 467566 -125 126 1.1 110 +446 2 10436 99347 1.33933 298.33933 149.83933 14983.93393 1.33933 298.33932 149.83933 14983.93378 1.33933 298.33933 149.83933 14983.93300 2020-01-01 2020-01-02 2020-01-01 00:07:26 2020-01-02 03:35:47 2020-01-01 00:07:26.000 2020-01-02 03:35:47.000 446 99347 49896.5 4989650 446 99347 49896.5 4989650 -32724 32414 4676.66 467666 -124 127 2.1 210 +447 2 10437 99348 1.34234 298.34234 149.84234 14984.23423 1.34234 298.34235 149.84234 14984.23437 1.34234 298.34234 149.84234 14984.23400 2020-01-01 2020-01-02 2020-01-01 00:07:27 2020-01-02 03:35:48 2020-01-01 00:07:27.000 2020-01-02 03:35:48.000 447 99348 49897.5 4989750 447 99348 49897.5 4989750 -32723 32415 4677.66 467766 -128 127 0.54 54 +448 2 10438 99349 1.34534 298.34534 149.84534 14984.53453 1.34534 298.34534 149.84534 14984.53466 1.34534 298.34534 149.84534 14984.53400 2020-01-01 2020-01-02 2020-01-01 00:07:28 2020-01-02 03:35:49 2020-01-01 00:07:28.000 2020-01-02 03:35:49.000 448 99349 49898.5 4989850 448 99349 49898.5 4989850 -32722 32416 4678.66 467866 -128 123 -1.02 -102 +449 2 10439 99350 1.34834 298.34834 149.84834 14984.83483 1.34834 298.34836 149.84834 14984.83478 1.34834 298.34834 149.84834 14984.83400 2020-01-01 2020-01-02 2020-01-01 00:07:29 2020-01-02 03:35:50 2020-01-01 00:07:29.000 2020-01-02 03:35:50.000 449 99350 49899.5 4989950 449 99350 49899.5 4989950 -32721 32417 4679.66 467966 -127 124 -0.02 -2 +45 2 10035 99945 0.13513 300.13513 150.13513 15163.64864 0.13513 300.13513 150.13513 15163.64839 0.13513 300.13513 150.13513 15163.64813 2020-01-01 2020-01-02 2020-01-01 00:00:45 2020-01-02 03:45:45 2020-01-01 00:00:45.000 2020-01-02 03:45:45.000 45 99945 49995 5049495 45 99945 49995 5049495 -32524 32411 4574.009900990099 461975 -126 126 -1.0396039603960396 -105 +450 2 10440 99351 1.35135 298.35135 149.85135 14985.13513 1.35135 298.35135 149.85134 14985.13495 1.35135 298.35135 149.85135 14985.13500 2020-01-01 2020-01-02 2020-01-01 00:07:30 2020-01-02 03:35:51 2020-01-01 00:07:30.000 2020-01-02 03:35:51.000 450 99351 49900.5 4990050 450 99351 49900.5 4990050 -32720 32418 4680.66 468066 -126 125 0.98 98 +451 2 10441 99352 1.35435 298.35435 149.85435 14985.43543 1.35435 298.35434 149.85435 14985.43525 1.35435 298.35435 149.85435 14985.43500 2020-01-01 2020-01-02 2020-01-01 00:07:31 2020-01-02 03:35:52 2020-01-01 00:07:31.000 2020-01-02 03:35:52.000 451 99352 49901.5 4990150 451 99352 49901.5 4990150 -32719 32419 4681.66 468166 -125 126 1.98 198 +452 2 10442 99353 1.35735 298.35735 149.85735 14985.73573 1.35735 298.35736 149.85736 14985.736 1.35735 298.35735 149.85735 14985.73500 2020-01-01 2020-01-02 2020-01-01 00:07:32 2020-01-02 03:35:53 2020-01-01 00:07:32.000 2020-01-02 03:35:53.000 452 99353 49902.5 4990250 452 99353 49902.5 4990250 -32718 32420 4682.66 468266 -124 127 2.98 298 +453 2 10443 99354 1.36036 298.36036 149.86036 14986.03603 1.36036 298.36035 149.86036 14986.03614 1.36036 298.36036 149.86036 14986.03600 2020-01-01 2020-01-02 2020-01-01 00:07:33 2020-01-02 03:35:54 2020-01-01 00:07:33.000 2020-01-02 03:35:54.000 453 99354 49903.5 4990350 453 99354 49903.5 4990350 -32717 32421 4683.66 468366 -128 127 1.42 142 +454 2 10444 99355 1.36336 298.36336 149.86336 14986.33633 1.36336 298.36337 149.86336 14986.33629 1.36336 298.36336 149.86336 14986.33600 2020-01-01 2020-01-02 2020-01-01 00:07:34 2020-01-02 03:35:55 2020-01-01 00:07:34.000 2020-01-02 03:35:55.000 454 99355 49904.5 4990450 454 99355 49904.5 4990450 -32716 32422 4684.66 468466 -128 127 -0.14 -14 +455 2 10445 99356 1.36636 298.36636 149.86636 14986.63663 1.36636 298.36636 149.86636 14986.63641 1.36636 298.36636 149.86636 14986.63600 2020-01-01 2020-01-02 2020-01-01 00:07:35 2020-01-02 03:35:56 2020-01-01 00:07:35.000 2020-01-02 03:35:56.000 455 99356 49905.5 4990550 455 99356 49905.5 4990550 -32715 32423 4685.66 468566 -128 124 -1.7 -170 +456 2 10446 99357 1.36936 298.36936 149.86936 14986.93693 1.36936 298.36935 149.86936 14986.93672 1.36936 298.36936 149.86936 14986.93600 2020-01-01 2020-01-02 2020-01-01 00:07:36 2020-01-02 03:35:57 2020-01-01 00:07:36.000 2020-01-02 03:35:57.000 456 99357 49906.5 4990650 456 99357 49906.5 4990650 -32714 32424 4686.66 468666 -127 125 -0.7 -70 +457 2 10447 99358 1.37237 298.37237 149.87237 14987.23723 1.37237 298.37238 149.87237 14987.23747 1.37237 298.37237 149.87237 14987.23700 2020-01-01 2020-01-02 2020-01-01 00:07:37 2020-01-02 03:35:58 2020-01-01 00:07:37.000 2020-01-02 03:35:58.000 457 99358 49907.5 4990750 457 99358 49907.5 4990750 -32713 32425 4687.66 468766 -126 126 0.3 30 +458 2 10448 99359 1.37537 298.37537 149.87537 14987.53753 1.37537 298.37537 149.87537 14987.5376 1.37537 298.37537 149.87537 14987.53700 2020-01-01 2020-01-02 2020-01-01 00:07:38 2020-01-02 03:35:59 2020-01-01 00:07:38.000 2020-01-02 03:35:59.000 458 99359 49908.5 4990850 458 99359 49908.5 4990850 -32712 32426 4688.66 468866 -125 127 1.3 130 +459 2 10449 99360 1.37837 298.37837 149.87837 14987.83783 1.37837 298.3784 149.87837 14987.83775 1.37837 298.37837 149.87837 14987.83700 2020-01-01 2020-01-02 2020-01-01 00:07:39 2020-01-02 03:36:00 2020-01-01 00:07:39.000 2020-01-02 03:36:00.000 459 99360 49909.5 4990950 459 99360 49909.5 4990950 -32711 32427 4689.66 468966 -128 127 -0.26 -26 +46 2 10036 99946 0.13813 300.13813 150.13813 15163.95195 0.13813 300.13815 150.13814 15163.95214 0.13813 300.13813 150.13813 15163.95113 2020-01-01 2020-01-02 2020-01-01 00:00:46 2020-01-02 03:45:46 2020-01-01 00:00:46.000 2020-01-02 03:45:46.000 46 99946 49996 5049596 46 99946 49996 5049596 -32523 32412 4575.009900990099 462076 -125 127 -0.039603960396039604 -4 +460 2 10450 99361 1.38138 298.38138 149.88138 14988.13813 1.38138 298.38138 149.88137 14988.13789 1.38138 298.38138 149.88138 14988.13800 2020-01-01 2020-01-02 2020-01-01 00:07:40 2020-01-02 03:36:01 2020-01-01 00:07:40.000 2020-01-02 03:36:01.000 460 99361 49910.5 4991050 460 99361 49910.5 4991050 -32710 32428 4690.66 469066 -128 127 -1.82 -182 +461 2 10451 99362 1.38438 298.38438 149.88438 14988.43843 1.38438 298.3844 149.88438 14988.43864 1.38438 298.38438 149.88438 14988.43800 2020-01-01 2020-01-02 2020-01-01 00:07:41 2020-01-02 03:36:02 2020-01-01 00:07:41.000 2020-01-02 03:36:02.000 461 99362 49911.5 4991150 461 99362 49911.5 4991150 -32709 32429 4691.66 469166 -128 123 -3.38 -338 +462 2 10452 99363 1.38738 298.38738 149.88738 14988.73873 1.38738 298.3874 149.88738 14988.73894 1.38738 298.38738 149.88738 14988.73800 2020-01-01 2020-01-02 2020-01-01 00:07:42 2020-01-02 03:36:03 2020-01-01 00:07:42.000 2020-01-02 03:36:03.000 462 99363 49912.5 4991250 462 99363 49912.5 4991250 -32708 32430 4692.66 469266 -127 124 -2.38 -238 +463 2 10453 99364 1.39039 298.39039 149.89039 14989.03903 1.39039 298.39038 149.89039 14989.03907 1.39039 298.39039 149.89039 14989.03900 2020-01-01 2020-01-02 2020-01-01 00:07:43 2020-01-02 03:36:04 2020-01-01 00:07:43.000 2020-01-02 03:36:04.000 463 99364 49913.5 4991350 463 99364 49913.5 4991350 -32707 32431 4693.66 469366 -126 125 -1.38 -138 +464 2 10454 99365 1.39339 298.39339 149.89339 14989.33933 1.39339 298.3934 149.89339 14989.33922 1.39339 298.39339 149.89339 14989.33900 2020-01-01 2020-01-02 2020-01-01 00:07:44 2020-01-02 03:36:05 2020-01-01 00:07:44.000 2020-01-02 03:36:05.000 464 99365 49914.5 4991450 464 99365 49914.5 4991450 -32706 32432 4694.66 469466 -125 126 -0.38 -38 +465 2 10455 99366 1.39639 298.39639 149.89639 14989.63963 1.39639 298.3964 149.89639 14989.63936 1.39639 298.39639 149.89639 14989.63900 2020-01-01 2020-01-02 2020-01-01 00:07:45 2020-01-02 03:36:06 2020-01-01 00:07:45.000 2020-01-02 03:36:06.000 465 99366 49915.5 4991550 465 99366 49915.5 4991550 -32705 32433 4695.66 469566 -124 127 0.62 62 +466 2 10456 99367 1.39939 298.39939 149.89939 14989.93993 1.39939 298.3994 149.8994 14989.94011 1.39939 298.39939 149.89939 14989.93900 2020-01-01 2020-01-02 2020-01-01 00:07:46 2020-01-02 03:36:07 2020-01-01 00:07:46.000 2020-01-02 03:36:07.000 466 99367 49916.5 4991650 466 99367 49916.5 4991650 -32704 32434 4696.66 469666 -128 127 -0.94 -94 +467 2 10457 99368 1.4024 298.4024 149.9024 14990.24024 1.4024 298.4024 149.9024 14990.24041 1.40240 298.40240 149.90240 14990.24000 2020-01-01 2020-01-02 2020-01-01 00:07:47 2020-01-02 03:36:08 2020-01-01 00:07:47.000 2020-01-02 03:36:08.000 467 99368 49917.5 4991750 467 99368 49917.5 4991750 -32703 32435 4697.66 469766 -128 123 -2.5 -250 +468 2 10458 99369 1.4054 298.4054 149.9054 14990.54054 1.4054 298.4054 149.9054 14990.54058 1.40540 298.40540 149.90540 14990.54000 2020-01-01 2020-01-02 2020-01-01 00:07:48 2020-01-02 03:36:09 2020-01-01 00:07:48.000 2020-01-02 03:36:09.000 468 99369 49918.5 4991850 468 99369 49918.5 4991850 -32702 32436 4698.66 469866 -127 124 -1.5 -150 +469 2 10459 99370 1.4084 298.4084 149.9084 14990.84084 1.4084 298.40842 149.9084 14990.8407 1.40840 298.40840 149.90840 14990.84000 2020-01-01 2020-01-02 2020-01-01 00:07:49 2020-01-02 03:36:10 2020-01-01 00:07:49.000 2020-01-02 03:36:10.000 469 99370 49919.5 4991950 469 99370 49919.5 4991950 -32701 32437 4699.66 469966 -126 125 -0.5 -50 +47 2 10037 99947 0.14114 300.14114 150.14114 15164.25525 0.14114 300.14114 150.14114 15164.25545 0.14114 300.14114 150.14114 15164.25514 2020-01-01 2020-01-02 2020-01-01 00:00:47 2020-01-02 03:45:47 2020-01-01 00:00:47.000 2020-01-02 03:45:47.000 47 99947 49997 5049697 47 99947 49997 5049697 -32522 32413 4576.009900990099 462177 -128 127 -1.5742574257425743 -159 +470 2 10460 99371 1.41141 298.41141 149.91141 14991.14114 1.41141 298.4114 149.9114 14991.14099 1.41141 298.41141 149.91141 14991.14100 2020-01-01 2020-01-02 2020-01-01 00:07:50 2020-01-02 03:36:11 2020-01-01 00:07:50.000 2020-01-02 03:36:11.000 470 99371 49920.5 4992050 470 99371 49920.5 4992050 -32700 32438 4700.66 470066 -125 126 0.5 50 +471 2 10461 99372 1.41441 298.41441 149.91441 14991.44144 1.41441 298.41443 149.91441 14991.44159 1.41441 298.41441 149.91441 14991.44100 2020-01-01 2020-01-02 2020-01-01 00:07:51 2020-01-02 03:36:12 2020-01-01 00:07:51.000 2020-01-02 03:36:12.000 471 99372 49921.5 4992150 471 99372 49921.5 4992150 -32699 32439 4701.66 470166 -124 127 1.5 150 +472 2 10462 99373 1.41741 298.41741 149.91741 14991.74174 1.41741 298.41742 149.91741 14991.74188 1.41741 298.41741 149.91741 14991.74100 2020-01-01 2020-01-02 2020-01-01 00:07:52 2020-01-02 03:36:13 2020-01-01 00:07:52.000 2020-01-02 03:36:13.000 472 99373 49922.5 4992250 472 99373 49922.5 4992250 -32698 32440 4702.66 470266 -128 127 -0.06 -6 +473 2 10463 99374 1.42042 298.42042 149.92042 14992.04204 1.42042 298.4204 149.92042 14992.04204 1.42042 298.42042 149.92042 14992.04200 2020-01-01 2020-01-02 2020-01-01 00:07:53 2020-01-02 03:36:14 2020-01-01 00:07:53.000 2020-01-02 03:36:14.000 473 99374 49923.5 4992350 473 99374 49923.5 4992350 -32697 32441 4703.66 470366 -128 123 -1.62 -162 +474 2 10464 99375 1.42342 298.42342 149.92342 14992.34234 1.42342 298.42343 149.92342 14992.34216 1.42342 298.42342 149.92342 14992.34200 2020-01-01 2020-01-02 2020-01-01 00:07:54 2020-01-02 03:36:15 2020-01-01 00:07:54.000 2020-01-02 03:36:15.000 474 99375 49924.5 4992450 474 99375 49924.5 4992450 -32696 32442 4704.66 470466 -127 124 -0.62 -62 +475 2 10465 99376 1.42642 298.42642 149.92642 14992.64264 1.42642 298.42642 149.92642 14992.64246 1.42642 298.42642 149.92642 14992.64200 2020-01-01 2020-01-02 2020-01-01 00:07:55 2020-01-02 03:36:16 2020-01-01 00:07:55.000 2020-01-02 03:36:16.000 475 99376 49925.5 4992550 475 99376 49925.5 4992550 -32695 32443 4705.66 470566 -126 125 0.38 38 +476 2 10466 99377 1.42942 298.42942 149.92942 14992.94294 1.42942 298.42944 149.92943 14992.94305 1.42942 298.42942 149.92942 14992.94200 2020-01-01 2020-01-02 2020-01-01 00:07:56 2020-01-02 03:36:17 2020-01-01 00:07:56.000 2020-01-02 03:36:17.000 476 99377 49926.5 4992650 476 99377 49926.5 4992650 -32694 32444 4706.66 470666 -125 126 1.38 138 +477 2 10467 99378 1.43243 298.43243 149.93243 14993.24324 1.43243 298.43243 149.93243 14993.24338 1.43243 298.43243 149.93243 14993.24300 2020-01-01 2020-01-02 2020-01-01 00:07:57 2020-01-02 03:36:18 2020-01-01 00:07:57.000 2020-01-02 03:36:18.000 477 99378 49927.5 4992750 477 99378 49927.5 4992750 -32693 32445 4707.66 470766 -124 127 2.38 238 +478 2 10468 99379 1.43543 298.43543 149.93543 14993.54354 1.43543 298.43542 149.93543 14993.54352 1.43543 298.43543 149.93543 14993.54300 2020-01-01 2020-01-02 2020-01-01 00:07:58 2020-01-02 03:36:19 2020-01-01 00:07:58.000 2020-01-02 03:36:19.000 478 99379 49928.5 4992850 478 99379 49928.5 4992850 -32692 32446 4708.66 470866 -128 127 0.82 82 +479 2 10469 99380 1.43843 298.43843 149.93843 14993.84384 1.43843 298.43845 149.93844 14993.84427 1.43843 298.43843 149.93843 14993.84300 2020-01-01 2020-01-02 2020-01-01 00:07:59 2020-01-02 03:36:20 2020-01-01 00:07:59.000 2020-01-02 03:36:20.000 479 99380 49929.5 4992950 479 99380 49929.5 4992950 -32691 32447 4709.66 470966 -128 127 -0.74 -74 +48 2 10038 99948 0.14414 300.14414 150.14414 15164.55855 0.14414 300.14413 150.14414 15164.55863 0.14414 300.14414 150.14414 15164.55814 2020-01-01 2020-01-02 2020-01-01 00:00:48 2020-01-02 03:45:48 2020-01-01 00:00:48.000 2020-01-02 03:45:48.000 48 99948 49998 5049798 48 99948 49998 5049798 -32521 32414 4577.009900990099 462278 -128 127 -3.108910891089109 -314 +480 2 10470 99381 1.44144 298.44144 149.94144 14994.14414 1.44144 298.44144 149.94143 14994.14392 1.44144 298.44144 149.94144 14994.14400 2020-01-01 2020-01-02 2020-01-01 00:08:00 2020-01-02 03:36:21 2020-01-01 00:08:00.000 2020-01-02 03:36:21.000 480 99381 49930.5 4993050 480 99381 49930.5 4993050 -32690 32448 4710.66 471066 -128 124 -2.3 -230 +481 2 10471 99382 1.44444 298.44444 149.94444 14994.44444 1.44444 298.44446 149.94444 14994.44452 1.44444 298.44444 149.94444 14994.44400 2020-01-01 2020-01-02 2020-01-01 00:08:01 2020-01-02 03:36:22 2020-01-01 00:08:01.000 2020-01-02 03:36:22.000 481 99382 49931.5 4993150 481 99382 49931.5 4993150 -32689 32449 4711.66 471166 -127 125 -1.3 -130 +482 2 10472 99383 1.44744 298.44744 149.94744 14994.74474 1.44744 298.44745 149.94744 14994.74485 1.44744 298.44744 149.94744 14994.74400 2020-01-01 2020-01-02 2020-01-01 00:08:02 2020-01-02 03:36:23 2020-01-01 00:08:02.000 2020-01-02 03:36:23.000 482 99383 49932.5 4993250 482 99383 49932.5 4993250 -32688 32450 4712.66 471266 -126 126 -0.3 -30 +483 2 10473 99384 1.45045 298.45045 149.95045 14995.04504 1.45045 298.45044 149.95044 14995.04499 1.45045 298.45045 149.95045 14995.04500 2020-01-01 2020-01-02 2020-01-01 00:08:03 2020-01-02 03:36:24 2020-01-01 00:08:03.000 2020-01-02 03:36:24.000 483 99384 49933.5 4993350 483 99384 49933.5 4993350 -32687 32451 4713.66 471366 -125 127 0.7 70 +484 2 10474 99385 1.45345 298.45345 149.95345 14995.34534 1.45345 298.45346 149.95345 14995.34574 1.45345 298.45345 149.95345 14995.34500 2020-01-01 2020-01-02 2020-01-01 00:08:04 2020-01-02 03:36:25 2020-01-01 00:08:04.000 2020-01-02 03:36:25.000 484 99385 49934.5 4993450 484 99385 49934.5 4993450 -32686 32452 4714.66 471466 -128 127 -0.86 -86 +485 2 10475 99386 1.45645 298.45645 149.95645 14995.64564 1.45645 298.45645 149.95645 14995.6454 1.45645 298.45645 149.95645 14995.64500 2020-01-01 2020-01-02 2020-01-01 00:08:05 2020-01-02 03:36:26 2020-01-01 00:08:05.000 2020-01-02 03:36:26.000 485 99386 49935.5 4993550 485 99386 49935.5 4993550 -32685 32453 4715.66 471566 -128 127 -2.42 -242 +486 2 10476 99387 1.45945 298.45945 149.95945 14995.94594 1.45945 298.45947 149.95946 14995.94602 1.45945 298.45945 149.95945 14995.94500 2020-01-01 2020-01-02 2020-01-01 00:08:06 2020-01-02 03:36:27 2020-01-01 00:08:06.000 2020-01-02 03:36:27.000 486 99387 49936.5 4993650 486 99387 49936.5 4993650 -32684 32454 4716.66 471666 -128 123 -3.98 -398 +487 2 10477 99388 1.46246 298.46246 149.96246 14996.24624 1.46246 298.46246 149.96246 14996.24633 1.46246 298.46246 149.96246 14996.24600 2020-01-01 2020-01-02 2020-01-01 00:08:07 2020-01-02 03:36:28 2020-01-01 00:08:07.000 2020-01-02 03:36:28.000 487 99388 49937.5 4993750 487 99388 49937.5 4993750 -32683 32455 4717.66 471766 -127 124 -2.98 -298 +488 2 10478 99389 1.46546 298.46546 149.96546 14996.54654 1.46546 298.46545 149.96546 14996.54645 1.46546 298.46546 149.96546 14996.54600 2020-01-01 2020-01-02 2020-01-01 00:08:08 2020-01-02 03:36:29 2020-01-01 00:08:08.000 2020-01-02 03:36:29.000 488 99389 49938.5 4993850 488 99389 49938.5 4993850 -32682 32456 4718.66 471866 -126 125 -1.98 -198 +489 2 10479 99390 1.46846 298.46846 149.96846 14996.84684 1.46846 298.46848 149.96847 14996.84721 1.46846 298.46846 149.96846 14996.84600 2020-01-01 2020-01-02 2020-01-01 00:08:09 2020-01-02 03:36:30 2020-01-01 00:08:09.000 2020-01-02 03:36:30.000 489 99390 49939.5 4993950 489 99390 49939.5 4993950 -32681 32457 4719.66 471966 -125 126 -0.98 -98 +49 2 10039 99949 0.14714 300.14714 150.14714 15164.86186 0.14714 300.14716 150.14714 15164.86173 0.14714 300.14714 150.14714 15164.86114 2020-01-01 2020-01-02 2020-01-01 00:00:49 2020-01-02 03:45:49 2020-01-01 00:00:49.000 2020-01-02 03:45:49.000 49 99949 49999 5049899 49 99949 49999 5049899 -32520 32415 4578.009900990099 462379 -128 123 -4.643564356435643 -469 +490 2 10480 99391 1.47147 298.47147 149.97147 14997.14714 1.47147 298.47147 149.97146 14997.14687 1.47147 298.47147 149.97147 14997.14700 2020-01-01 2020-01-02 2020-01-01 00:08:10 2020-01-02 03:36:31 2020-01-01 00:08:10.000 2020-01-02 03:36:31.000 490 99391 49940.5 4994050 490 99391 49940.5 4994050 -32680 32458 4720.66 472066 -124 127 0.02 2 +491 2 10481 99392 1.47447 298.47447 149.97447 14997.44744 1.47447 298.4745 149.97447 14997.44749 1.47447 298.47447 149.97447 14997.44700 2020-01-01 2020-01-02 2020-01-01 00:08:11 2020-01-02 03:36:32 2020-01-01 00:08:11.000 2020-01-02 03:36:32.000 491 99392 49941.5 4994150 491 99392 49941.5 4994150 -32679 32459 4721.66 472166 -128 127 -1.54 -154 +492 2 10482 99393 1.47747 298.47747 149.97747 14997.74774 1.47747 298.47748 149.97747 14997.74779 1.47747 298.47747 149.97747 14997.74700 2020-01-01 2020-01-02 2020-01-01 00:08:12 2020-01-02 03:36:33 2020-01-01 00:08:12.000 2020-01-02 03:36:33.000 492 99393 49942.5 4994250 492 99393 49942.5 4994250 -32678 32460 4722.66 472266 -128 123 -3.1 -310 +493 2 10483 99394 1.48048 298.48048 149.98048 14998.04804 1.48048 298.48047 149.98048 14998.04809 1.48048 298.48048 149.98048 14998.04800 2020-01-01 2020-01-02 2020-01-01 00:08:13 2020-01-02 03:36:34 2020-01-01 00:08:13.000 2020-01-02 03:36:34.000 493 99394 49943.5 4994350 493 99394 49943.5 4994350 -32677 32461 4723.66 472366 -127 124 -2.1 -210 +494 2 10484 99395 1.48348 298.48348 149.98348 14998.34834 1.48348 298.4835 149.98348 14998.34868 1.48348 298.48348 149.98348 14998.34800 2020-01-01 2020-01-02 2020-01-01 00:08:14 2020-01-02 03:36:35 2020-01-01 00:08:14.000 2020-01-02 03:36:35.000 494 99395 49944.5 4994450 494 99395 49944.5 4994450 -32676 32462 4724.66 472466 -126 125 -1.1 -110 +495 2 10485 99396 1.48648 298.48648 149.98648 14998.64864 1.48648 298.48648 149.98648 14998.64837 1.48648 298.48648 149.98648 14998.64800 2020-01-01 2020-01-02 2020-01-01 00:08:15 2020-01-02 03:36:36 2020-01-01 00:08:15.000 2020-01-02 03:36:36.000 495 99396 49945.5 4994550 495 99396 49945.5 4994550 -32675 32463 4725.66 472566 -125 126 -0.1 -10 +496 2 10486 99397 1.48948 298.48948 149.98948 14998.94894 1.48948 298.4895 149.98948 14998.94896 1.48948 298.48948 149.98948 14998.94800 2020-01-01 2020-01-02 2020-01-01 00:08:16 2020-01-02 03:36:37 2020-01-01 00:08:16.000 2020-01-02 03:36:37.000 496 99397 49946.5 4994650 496 99397 49946.5 4994650 -32674 32464 4726.66 472666 -124 127 0.9 90 +497 2 10487 99398 1.49249 298.49249 149.99249 14999.24924 1.49249 298.4925 149.99249 14999.24926 1.49249 298.49249 149.99249 14999.24900 2020-01-01 2020-01-02 2020-01-01 00:08:17 2020-01-02 03:36:38 2020-01-01 00:08:17.000 2020-01-02 03:36:38.000 497 99398 49947.5 4994750 497 99398 49947.5 4994750 -32673 32465 4727.66 472766 -128 127 -0.66 -66 +498 2 10488 99399 1.49549 298.49549 149.99549 14999.54954 1.49549 298.49548 149.99549 14999.54956 1.49549 298.49549 149.99549 14999.54900 2020-01-01 2020-01-02 2020-01-01 00:08:18 2020-01-02 03:36:39 2020-01-01 00:08:18.000 2020-01-02 03:36:39.000 498 99399 49948.5 4994850 498 99399 49948.5 4994850 -32672 32466 4728.66 472866 -128 123 -2.22 -222 +499 2 10489 99400 1.49849 298.49849 149.99849 14999.84984 1.49849 298.4985 149.9985 14999.85015 1.49849 298.49849 149.99849 14999.84900 2020-01-01 2020-01-02 2020-01-01 00:08:19 2020-01-02 03:36:40 2020-01-01 00:08:19.000 2020-01-02 03:36:40.000 499 99400 49949.5 4994950 499 99400 49949.5 4994950 -32671 32467 4729.66 472966 -127 124 -1.22 -122 +5 2 1004 9995 0.01501 300.01501 150.01501 15151.51651 0.01501 300.015 150.01501 15151.51648 0.01501 300.01501 150.01501 15151.51601 2020-01-01 2020-01-02 2020-01-01 00:00:05 2020-01-02 03:45:05 2020-01-01 00:00:05.000 2020-01-02 03:45:05.000 5 99905 49955 5045455 5 99905 49955 5045455 -32564 32371 4534.009900990099 457935 -128 123 -3.01980198019802 -305 +50 2 10040 99950 0.15015 300.15015 150.15015 15165.16516 0.15015 300.15015 150.15014 15165.16487 0.15015 300.15015 150.15015 15165.16515 2020-01-01 2020-01-02 2020-01-01 00:00:50 2020-01-02 03:45:50 2020-01-01 00:00:50.000 2020-01-02 03:45:50.000 50 99950 50000 5050000 50 99950 50000 5050000 -32519 32416 4579.009900990099 462480 -127 124 -3.6435643564356437 -368 +500 2 10490 99401 1.5015 298.5015 150.0015 15000.15015 1.5015 298.5015 150.00149 15000.14984 1.50150 298.50150 150.00150 15000.15000 2020-01-01 2020-01-02 2020-01-01 00:08:20 2020-01-02 03:36:41 2020-01-01 00:08:20.000 2020-01-02 03:36:41.000 500 99401 49950.5 4995050 500 99401 49950.5 4995050 -32670 32468 4730.66 473066 -126 125 -0.22 -22 +501 2 10491 99402 1.5045 298.5045 150.0045 15000.45045 1.5045 298.50452 150.0045 15000.45043 1.50450 298.50450 150.00450 15000.45000 2020-01-01 2020-01-02 2020-01-01 00:08:21 2020-01-02 03:36:42 2020-01-01 00:08:21.000 2020-01-02 03:36:42.000 501 99402 49951.5 4995150 501 99402 49951.5 4995150 -32669 32469 4731.66 473166 -125 126 0.78 78 +502 2 10492 99403 1.5075 298.5075 150.0075 15000.75075 1.5075 298.5075 150.0075 15000.75073 1.50750 298.50750 150.00750 15000.75000 2020-01-01 2020-01-02 2020-01-01 00:08:22 2020-01-02 03:36:43 2020-01-01 00:08:22.000 2020-01-02 03:36:43.000 502 99403 49952.5 4995250 502 99403 49952.5 4995250 -32668 32470 4732.66 473266 -124 127 1.78 178 +503 2 10493 99404 1.51051 298.51051 150.01051 15001.05105 1.51051 298.5105 150.01051 15001.05103 1.51051 298.51051 150.01051 15001.05100 2020-01-01 2020-01-02 2020-01-01 00:08:23 2020-01-02 03:36:44 2020-01-01 00:08:23.000 2020-01-02 03:36:44.000 503 99404 49953.5 4995350 503 99404 49953.5 4995350 -32667 32471 4733.66 473366 -128 127 0.22 22 +504 2 10494 99405 1.51351 298.51351 150.01351 15001.35135 1.51351 298.51352 150.01351 15001.35162 1.51351 298.51351 150.01351 15001.35100 2020-01-01 2020-01-02 2020-01-01 00:08:24 2020-01-02 03:36:45 2020-01-01 00:08:24.000 2020-01-02 03:36:45.000 504 99405 49954.5 4995450 504 99405 49954.5 4995450 -32666 32472 4734.66 473466 -128 127 -1.34 -134 +505 2 10495 99406 1.51651 298.51651 150.01651 15001.65165 1.51651 298.5165 150.01651 15001.65131 1.51651 298.51651 150.01651 15001.65100 2020-01-01 2020-01-02 2020-01-01 00:08:25 2020-01-02 03:36:46 2020-01-01 00:08:25.000 2020-01-02 03:36:46.000 505 99406 49955.5 4995550 505 99406 49955.5 4995550 -32665 32473 4735.66 473566 -128 124 -2.9 -290 +506 2 10496 99407 1.51951 298.51951 150.01951 15001.95195 1.51951 298.51953 150.01951 15001.9519 1.51951 298.51951 150.01951 15001.95100 2020-01-01 2020-01-02 2020-01-01 00:08:26 2020-01-02 03:36:47 2020-01-01 00:08:26.000 2020-01-02 03:36:47.000 506 99407 49956.5 4995650 506 99407 49956.5 4995650 -32664 32474 4736.66 473666 -127 125 -1.9 -190 +507 2 10497 99408 1.52252 298.52252 150.02252 15002.25225 1.52252 298.52252 150.02252 15002.2522 1.52252 298.52252 150.02252 15002.25200 2020-01-01 2020-01-02 2020-01-01 00:08:27 2020-01-02 03:36:48 2020-01-01 00:08:27.000 2020-01-02 03:36:48.000 507 99408 49957.5 4995750 507 99408 49957.5 4995750 -32663 32475 4737.66 473766 -126 126 -0.9 -90 +508 2 10498 99409 1.52552 298.52552 150.02552 15002.55255 1.52552 298.5255 150.02552 15002.5525 1.52552 298.52552 150.02552 15002.55200 2020-01-01 2020-01-02 2020-01-01 00:08:28 2020-01-02 03:36:49 2020-01-01 00:08:28.000 2020-01-02 03:36:49.000 508 99409 49958.5 4995850 508 99409 49958.5 4995850 -32662 32476 4738.66 473866 -125 127 0.1 10 +509 2 10499 99410 1.52852 298.52852 150.02852 15002.85285 1.52852 298.52853 150.02853 15002.85312 1.52852 298.52852 150.02852 15002.85200 2020-01-01 2020-01-02 2020-01-01 00:08:29 2020-01-02 03:36:50 2020-01-01 00:08:29.000 2020-01-02 03:36:50.000 509 99410 49959.5 4995950 509 99410 49959.5 4995950 -32661 32477 4739.66 473966 -128 127 -1.46 -146 +51 2 10041 99951 0.15315 300.15315 150.15315 15165.46846 0.15315 300.15317 150.15315 15165.46863 0.15315 300.15315 150.15315 15165.46815 2020-01-01 2020-01-02 2020-01-01 00:00:51 2020-01-02 03:45:51 2020-01-01 00:00:51.000 2020-01-02 03:45:51.000 51 99951 50001 5050101 51 99951 50001 5050101 -32518 32417 4580.009900990099 462581 -126 125 -2.6435643564356437 -267 +510 2 10500 99411 1.53153 298.53153 150.03153 15003.15315 1.53153 298.53152 150.03152 15003.15278 1.53153 298.53153 150.03153 15003.15300 2020-01-01 2020-01-02 2020-01-01 00:08:30 2020-01-02 03:36:51 2020-01-01 00:08:30.000 2020-01-02 03:36:51.000 510 99411 49960.5 4996050 510 99411 49960.5 4996050 -32660 32478 4740.66 474066 -128 127 -3.02 -302 +511 2 10501 99412 1.53453 298.53453 150.03453 15003.45345 1.53453 298.53455 150.03453 15003.45354 1.53453 298.53453 150.03453 15003.45300 2020-01-01 2020-01-02 2020-01-01 00:08:31 2020-01-02 03:36:52 2020-01-01 00:08:31.000 2020-01-02 03:36:52.000 511 99412 49961.5 4996150 511 99412 49961.5 4996150 -32659 32479 4741.66 474166 -128 123 -4.58 -458 +512 2 10502 99413 1.53753 298.53753 150.03753 15003.75375 1.53753 298.53754 150.03753 15003.75366 1.53753 298.53753 150.03753 15003.75300 2020-01-01 2020-01-02 2020-01-01 00:08:32 2020-01-02 03:36:53 2020-01-01 00:08:32.000 2020-01-02 03:36:53.000 512 99413 49962.5 4996250 512 99413 49962.5 4996250 -32658 32480 4742.66 474266 -127 124 -3.58 -358 +513 2 10503 99414 1.54054 298.54054 150.04054 15004.05405 1.54054 298.54053 150.04053 15004.05397 1.54054 298.54054 150.04054 15004.05400 2020-01-01 2020-01-02 2020-01-01 00:08:33 2020-01-02 03:36:54 2020-01-01 00:08:33.000 2020-01-02 03:36:54.000 513 99414 49963.5 4996350 513 99414 49963.5 4996350 -32657 32481 4743.66 474366 -126 125 -2.58 -258 +514 2 10504 99415 1.54354 298.54354 150.04354 15004.35435 1.54354 298.54355 150.04354 15004.35459 1.54354 298.54354 150.04354 15004.35400 2020-01-01 2020-01-02 2020-01-01 00:08:34 2020-01-02 03:36:55 2020-01-01 00:08:34.000 2020-01-02 03:36:55.000 514 99415 49964.5 4996450 514 99415 49964.5 4996450 -32656 32482 4744.66 474466 -125 126 -1.58 -158 +515 2 10505 99416 1.54654 298.54654 150.04654 15004.65465 1.54654 298.54654 150.04654 15004.65425 1.54654 298.54654 150.04654 15004.65400 2020-01-01 2020-01-02 2020-01-01 00:08:35 2020-01-02 03:36:56 2020-01-01 00:08:35.000 2020-01-02 03:36:56.000 515 99416 49965.5 4996550 515 99416 49965.5 4996550 -32655 32483 4745.66 474566 -124 127 -0.58 -58 +516 2 10506 99417 1.54954 298.54954 150.04954 15004.95495 1.54954 298.54956 150.04955 15004.955 1.54954 298.54954 150.04954 15004.95400 2020-01-01 2020-01-02 2020-01-01 00:08:36 2020-01-02 03:36:57 2020-01-01 00:08:36.000 2020-01-02 03:36:57.000 516 99417 49966.5 4996650 516 99417 49966.5 4996650 -32654 32484 4746.66 474666 -128 127 -2.14 -214 +517 2 10507 99418 1.55255 298.55255 150.05255 15005.25525 1.55255 298.55255 150.05255 15005.25514 1.55255 298.55255 150.05255 15005.25500 2020-01-01 2020-01-02 2020-01-01 00:08:37 2020-01-02 03:36:58 2020-01-01 00:08:37.000 2020-01-02 03:36:58.000 517 99418 49967.5 4996750 517 99418 49967.5 4996750 -32653 32485 4747.66 474766 -128 123 -3.7 -370 +518 2 10508 99419 1.55555 298.55555 150.05555 15005.55555 1.55555 298.55554 150.05555 15005.55547 1.55555 298.55555 150.05555 15005.55500 2020-01-01 2020-01-02 2020-01-01 00:08:38 2020-01-02 03:36:59 2020-01-01 00:08:38.000 2020-01-02 03:36:59.000 518 99419 49968.5 4996850 518 99419 49968.5 4996850 -32652 32486 4748.66 474866 -127 124 -2.7 -270 +519 2 10509 99420 1.55855 298.55855 150.05855 15005.85585 1.55855 298.55856 150.05856 15005.85607 1.55855 298.55855 150.05855 15005.85500 2020-01-01 2020-01-02 2020-01-01 00:08:39 2020-01-02 03:37:00 2020-01-01 00:08:39.000 2020-01-02 03:37:00.000 519 99420 49969.5 4996950 519 99420 49969.5 4996950 -32651 32487 4749.66 474966 -126 125 -1.7 -170 +52 2 10042 99952 0.15615 300.15615 150.15615 15165.77177 0.15615 300.15616 150.15615 15165.77193 0.15615 300.15615 150.15615 15165.77115 2020-01-01 2020-01-02 2020-01-01 00:00:52 2020-01-02 03:45:52 2020-01-01 00:00:52.000 2020-01-02 03:45:52.000 52 99952 50002 5050202 52 99952 50002 5050202 -32517 32418 4581.009900990099 462682 -125 126 -1.6435643564356435 -166 +520 2 10510 99421 1.56156 298.56156 150.06156 15006.15615 1.56156 298.56155 150.06155 15006.15572 1.56156 298.56156 150.06156 15006.15600 2020-01-01 2020-01-02 2020-01-01 00:08:40 2020-01-02 03:37:01 2020-01-01 00:08:40.000 2020-01-02 03:37:01.000 520 99421 49970.5 4997050 520 99421 49970.5 4997050 -32650 32488 4750.66 475066 -125 126 -0.7 -70 +521 2 10511 99422 1.56456 298.56456 150.06456 15006.45645 1.56456 298.56458 150.06456 15006.45647 1.56456 298.56456 150.06456 15006.45600 2020-01-01 2020-01-02 2020-01-01 00:08:41 2020-01-02 03:37:02 2020-01-01 00:08:41.000 2020-01-02 03:37:02.000 521 99422 49971.5 4997150 521 99422 49971.5 4997150 -32649 32489 4751.66 475166 -124 127 0.3 30 +522 2 10512 99423 1.56756 298.56756 150.06756 15006.75675 1.56756 298.56757 150.06756 15006.75661 1.56756 298.56756 150.06756 15006.75600 2020-01-01 2020-01-02 2020-01-01 00:08:42 2020-01-02 03:37:03 2020-01-01 00:08:42.000 2020-01-02 03:37:03.000 522 99423 49972.5 4997250 522 99423 49972.5 4997250 -32648 32490 4752.66 475266 -128 127 -1.26 -126 +523 2 10513 99424 1.57057 298.57057 150.07057 15007.05705 1.57057 298.57056 150.07056 15007.05694 1.57057 298.57057 150.07057 15007.05700 2020-01-01 2020-01-02 2020-01-01 00:08:43 2020-01-02 03:37:04 2020-01-01 00:08:43.000 2020-01-02 03:37:04.000 523 99424 49973.5 4997350 523 99424 49973.5 4997350 -32647 32491 4753.66 475366 -128 123 -2.82 -282 +524 2 10514 99425 1.57357 298.57357 150.07357 15007.35735 1.57357 298.57358 150.07357 15007.35753 1.57357 298.57357 150.07357 15007.35700 2020-01-01 2020-01-02 2020-01-01 00:08:44 2020-01-02 03:37:05 2020-01-01 00:08:44.000 2020-01-02 03:37:05.000 524 99425 49974.5 4997450 524 99425 49974.5 4997450 -32646 32492 4754.66 475466 -127 124 -1.82 -182 +525 2 10515 99426 1.57657 298.57657 150.07657 15007.65765 1.57657 298.57657 150.07657 15007.65783 1.57657 298.57657 150.07657 15007.65700 2020-01-01 2020-01-02 2020-01-01 00:08:45 2020-01-02 03:37:06 2020-01-01 00:08:45.000 2020-01-02 03:37:06.000 525 99426 49975.5 4997550 525 99426 49975.5 4997550 -32645 32493 4755.66 475566 -126 125 -0.82 -82 +526 2 10516 99427 1.57957 298.57957 150.07957 15007.95795 1.57957 298.5796 150.07957 15007.95795 1.57957 298.57957 150.07957 15007.95700 2020-01-01 2020-01-02 2020-01-01 00:08:46 2020-01-02 03:37:07 2020-01-01 00:08:46.000 2020-01-02 03:37:07.000 526 99427 49976.5 4997650 526 99427 49976.5 4997650 -32644 32494 4756.66 475666 -125 126 0.18 18 +527 2 10517 99428 1.58258 298.58258 150.08258 15008.25825 1.58258 298.58258 150.08258 15008.25811 1.58258 298.58258 150.08258 15008.25800 2020-01-01 2020-01-02 2020-01-01 00:08:47 2020-01-02 03:37:08 2020-01-01 00:08:47.000 2020-01-02 03:37:08.000 527 99428 49977.5 4997750 527 99428 49977.5 4997750 -32643 32495 4757.66 475766 -124 127 1.18 118 +528 2 10518 99429 1.58558 298.58558 150.08558 15008.55855 1.58558 298.58557 150.08558 15008.5584 1.58558 298.58558 150.08558 15008.55800 2020-01-01 2020-01-02 2020-01-01 00:08:48 2020-01-02 03:37:09 2020-01-01 00:08:48.000 2020-01-02 03:37:09.000 528 99429 49978.5 4997850 528 99429 49978.5 4997850 -32642 32496 4758.66 475866 -128 127 -0.38 -38 +529 2 10519 99430 1.58858 298.58858 150.08858 15008.85885 1.58858 298.5886 150.08859 15008.859 1.58858 298.58858 150.08858 15008.85800 2020-01-01 2020-01-02 2020-01-01 00:08:49 2020-01-02 03:37:10 2020-01-01 00:08:49.000 2020-01-02 03:37:10.000 529 99430 49979.5 4997950 529 99430 49979.5 4997950 -32641 32497 4759.66 475966 -128 127 -1.94 -194 +53 2 10043 99953 0.15915 300.15915 150.15915 15166.07507 0.15915 300.15915 150.15915 15166.07511 0.15915 300.15915 150.15915 15166.07415 2020-01-01 2020-01-02 2020-01-01 00:00:53 2020-01-02 03:45:53 2020-01-01 00:00:53.000 2020-01-02 03:45:53.000 53 99953 50003 5050303 53 99953 50003 5050303 -32516 32419 4582.009900990099 462783 -124 127 -0.6435643564356436 -65 +530 2 10520 99431 1.59159 298.59159 150.09159 15009.15915 1.59159 298.59158 150.09159 15009.15929 1.59159 298.59159 150.09159 15009.15900 2020-01-01 2020-01-02 2020-01-01 00:08:50 2020-01-02 03:37:11 2020-01-01 00:08:50.000 2020-01-02 03:37:11.000 530 99431 49980.5 4998050 530 99431 49980.5 4998050 -32640 32498 4760.66 476066 -128 124 -3.5 -350 +531 2 10521 99432 1.59459 298.59459 150.09459 15009.45945 1.59459 298.5946 150.09459 15009.45941 1.59459 298.59459 150.09459 15009.45900 2020-01-01 2020-01-02 2020-01-01 00:08:51 2020-01-02 03:37:12 2020-01-01 00:08:51.000 2020-01-02 03:37:12.000 531 99432 49981.5 4998150 531 99432 49981.5 4998150 -32639 32499 4761.66 476166 -127 125 -2.5 -250 +532 2 10522 99433 1.59759 298.59759 150.09759 15009.75975 1.59759 298.5976 150.09759 15009.75958 1.59759 298.59759 150.09759 15009.75900 2020-01-01 2020-01-02 2020-01-01 00:08:52 2020-01-02 03:37:13 2020-01-01 00:08:52.000 2020-01-02 03:37:13.000 532 99433 49982.5 4998250 532 99433 49982.5 4998250 -32638 32500 4762.66 476266 -126 126 -1.5 -150 +533 2 10523 99434 1.6006 298.6006 150.1006 15010.06006 1.6006 298.6006 150.10059 15010.05988 1.60060 298.60060 150.10060 15010.06000 2020-01-01 2020-01-02 2020-01-01 00:08:53 2020-01-02 03:37:14 2020-01-01 00:08:53.000 2020-01-02 03:37:14.000 533 99434 49983.5 4998350 533 99434 49983.5 4998350 -32637 32501 4763.66 476366 -125 127 -0.5 -50 +534 2 10524 99435 1.6036 298.6036 150.1036 15010.36036 1.6036 298.6036 150.1036 15010.36063 1.60360 298.60360 150.10360 15010.36000 2020-01-01 2020-01-02 2020-01-01 00:08:54 2020-01-02 03:37:15 2020-01-01 00:08:54.000 2020-01-02 03:37:15.000 534 99435 49984.5 4998450 534 99435 49984.5 4998450 -32636 32502 4764.66 476466 -128 127 -2.06 -206 +535 2 10525 99436 1.6066 298.6066 150.1066 15010.66066 1.6066 298.6066 150.1066 15010.66077 1.60660 298.60660 150.10660 15010.66000 2020-01-01 2020-01-02 2020-01-01 00:08:55 2020-01-02 03:37:16 2020-01-01 00:08:55.000 2020-01-02 03:37:16.000 535 99436 49985.5 4998550 535 99436 49985.5 4998550 -32635 32503 4765.66 476566 -128 127 -3.62 -362 +536 2 10526 99437 1.6096 298.6096 150.1096 15010.96096 1.6096 298.60962 150.1096 15010.96092 1.60960 298.60960 150.10960 15010.96000 2020-01-01 2020-01-02 2020-01-01 00:08:56 2020-01-02 03:37:17 2020-01-01 00:08:56.000 2020-01-02 03:37:17.000 536 99437 49986.5 4998650 536 99437 49986.5 4998650 -32634 32504 4766.66 476666 -128 123 -5.18 -518 +537 2 10527 99438 1.61261 298.61261 150.11261 15011.26126 1.61261 298.6126 150.11261 15011.26105 1.61261 298.61261 150.11261 15011.26100 2020-01-01 2020-01-02 2020-01-01 00:08:57 2020-01-02 03:37:18 2020-01-01 00:08:57.000 2020-01-02 03:37:18.000 537 99438 49987.5 4998750 537 99438 49987.5 4998750 -32633 32505 4767.66 476766 -127 124 -4.18 -418 +538 2 10528 99439 1.61561 298.61561 150.11561 15011.56156 1.61561 298.6156 150.11561 15011.56135 1.61561 298.61561 150.11561 15011.56100 2020-01-01 2020-01-02 2020-01-01 00:08:58 2020-01-02 03:37:19 2020-01-01 00:08:58.000 2020-01-02 03:37:19.000 538 99439 49988.5 4998850 538 99439 49988.5 4998850 -32632 32506 4768.66 476866 -126 125 -3.18 -318 +539 2 10529 99440 1.61861 298.61861 150.11861 15011.86186 1.61861 298.61862 150.11862 15011.8621 1.61861 298.61861 150.11861 15011.86100 2020-01-01 2020-01-02 2020-01-01 00:08:59 2020-01-02 03:37:20 2020-01-01 00:08:59.000 2020-01-02 03:37:20.000 539 99440 49989.5 4998950 539 99440 49989.5 4998950 -32631 32507 4769.66 476966 -125 126 -2.18 -218 +54 2 10044 99954 0.16216 300.16216 150.16216 15166.37837 0.16216 300.16217 150.16216 15166.37822 0.16216 300.16216 150.16216 15166.37816 2020-01-01 2020-01-02 2020-01-01 00:00:54 2020-01-02 03:45:54 2020-01-01 00:00:54.000 2020-01-02 03:45:54.000 54 99954 50004 5050404 54 99954 50004 5050404 -32515 32420 4583.009900990099 462884 -128 127 -2.1782178217821784 -220 +540 2 10530 99441 1.62162 298.62162 150.12162 15012.16216 1.62162 298.6216 150.12162 15012.16224 1.62162 298.62162 150.12162 15012.16200 2020-01-01 2020-01-02 2020-01-01 00:09:00 2020-01-02 03:37:21 2020-01-01 00:09:00.000 2020-01-02 03:37:21.000 540 99441 49990.5 4999050 540 99441 49990.5 4999050 -32630 32508 4770.66 477066 -124 127 -1.18 -118 +541 2 10531 99442 1.62462 298.62462 150.12462 15012.46246 1.62462 298.62463 150.12462 15012.46239 1.62462 298.62462 150.12462 15012.46200 2020-01-01 2020-01-02 2020-01-01 00:09:01 2020-01-02 03:37:22 2020-01-01 00:09:01.000 2020-01-02 03:37:22.000 541 99442 49991.5 4999150 541 99442 49991.5 4999150 -32629 32509 4771.66 477166 -128 127 -2.74 -274 +542 2 10532 99443 1.62762 298.62762 150.12762 15012.76276 1.62762 298.62762 150.12762 15012.76252 1.62762 298.62762 150.12762 15012.76200 2020-01-01 2020-01-02 2020-01-01 00:09:02 2020-01-02 03:37:23 2020-01-01 00:09:02.000 2020-01-02 03:37:23.000 542 99443 49992.5 4999250 542 99443 49992.5 4999250 -32628 32510 4772.66 477266 -128 123 -4.3 -430 +543 2 10533 99444 1.63063 298.63063 150.13063 15013.06306 1.63063 298.63065 150.13063 15013.06327 1.63063 298.63063 150.13063 15013.06300 2020-01-01 2020-01-02 2020-01-01 00:09:03 2020-01-02 03:37:24 2020-01-01 00:09:03.000 2020-01-02 03:37:24.000 543 99444 49993.5 4999350 543 99444 49993.5 4999350 -32627 32511 4773.66 477366 -127 124 -3.3 -330 +544 2 10534 99445 1.63363 298.63363 150.13363 15013.36336 1.63363 298.63364 150.13363 15013.36358 1.63363 298.63363 150.13363 15013.36300 2020-01-01 2020-01-02 2020-01-01 00:09:04 2020-01-02 03:37:25 2020-01-01 00:09:04.000 2020-01-02 03:37:25.000 544 99445 49994.5 4999450 544 99445 49994.5 4999450 -32626 32512 4774.66 477466 -126 125 -2.3 -230 +545 2 10535 99446 1.63663 298.63663 150.13663 15013.66366 1.63663 298.63663 150.13663 15013.6637 1.63663 298.63663 150.13663 15013.66300 2020-01-01 2020-01-02 2020-01-01 00:09:05 2020-01-02 03:37:26 2020-01-01 00:09:05.000 2020-01-02 03:37:26.000 545 99446 49995.5 4999550 545 99446 49995.5 4999550 -32625 32513 4775.66 477566 -125 126 -1.3 -130 +546 2 10536 99447 1.63963 298.63963 150.13963 15013.96396 1.63963 298.63965 150.13963 15013.96385 1.63963 298.63963 150.13963 15013.96300 2020-01-01 2020-01-02 2020-01-01 00:09:06 2020-01-02 03:37:27 2020-01-01 00:09:06.000 2020-01-02 03:37:27.000 546 99447 49996.5 4999650 546 99447 49996.5 4999650 -32624 32514 4776.66 477666 -124 127 -0.3 -30 +547 2 10537 99448 1.64264 298.64264 150.14264 15014.26426 1.64264 298.64264 150.14263 15014.26399 1.64264 298.64264 150.14264 15014.26400 2020-01-01 2020-01-02 2020-01-01 00:09:07 2020-01-02 03:37:28 2020-01-01 00:09:07.000 2020-01-02 03:37:28.000 547 99448 49997.5 4999750 547 99448 49997.5 4999750 -32623 32515 4777.66 477766 -128 127 -1.86 -186 +548 2 10538 99449 1.64564 298.64564 150.14564 15014.56456 1.64564 298.64566 150.14564 15014.56474 1.64564 298.64564 150.14564 15014.56400 2020-01-01 2020-01-02 2020-01-01 00:09:08 2020-01-02 03:37:29 2020-01-01 00:09:08.000 2020-01-02 03:37:29.000 548 99449 49998.5 4999850 548 99449 49998.5 4999850 -32622 32516 4778.66 477866 -128 123 -3.42 -342 +549 2 10539 99450 1.64864 298.64864 150.14864 15014.86486 1.64864 298.64865 150.14865 15014.86504 1.64864 298.64864 150.14864 15014.86400 2020-01-01 2020-01-02 2020-01-01 00:09:09 2020-01-02 03:37:30 2020-01-01 00:09:09.000 2020-01-02 03:37:30.000 549 99450 49999.5 4999950 549 99450 49999.5 4999950 -32621 32517 4779.66 477966 -127 124 -2.42 -242 +55 2 10045 99955 0.16516 300.16516 150.16516 15166.68168 0.16516 300.16516 150.16516 15166.68151 0.16516 300.16516 150.16516 15166.68116 2020-01-01 2020-01-02 2020-01-01 00:00:55 2020-01-02 03:45:55 2020-01-01 00:00:55.000 2020-01-02 03:45:55.000 55 99955 50005 5050505 55 99955 50005 5050505 -32514 32421 4584.009900990099 462985 -128 123 -3.712871287128713 -375 +550 2 10540 99451 1.65165 298.65165 150.15165 15015.16516 1.65165 298.65164 150.15165 15015.16521 1.65165 298.65165 150.15165 15015.16500 2020-01-01 2020-01-02 2020-01-01 00:09:10 2020-01-02 03:37:31 2020-01-01 00:09:10.000 2020-01-02 03:37:31.000 550 99451 50000.5 5000050 550 99451 50000.5 5000050 -32620 32518 4780.66 478066 -126 125 -1.42 -142 +551 2 10541 99452 1.65465 298.65465 150.15465 15015.46546 1.65465 298.65466 150.15465 15015.46533 1.65465 298.65465 150.15465 15015.46500 2020-01-01 2020-01-02 2020-01-01 00:09:11 2020-01-02 03:37:32 2020-01-01 00:09:11.000 2020-01-02 03:37:32.000 551 99452 50001.5 5000150 551 99452 50001.5 5000150 -32619 32519 4781.66 478166 -125 126 -0.42 -42 +552 2 10542 99453 1.65765 298.65765 150.15765 15015.76576 1.65765 298.65765 150.15765 15015.76562 1.65765 298.65765 150.15765 15015.76500 2020-01-01 2020-01-02 2020-01-01 00:09:12 2020-01-02 03:37:33 2020-01-01 00:09:12.000 2020-01-02 03:37:33.000 552 99453 50002.5 5000250 552 99453 50002.5 5000250 -32618 32520 4782.66 478266 -124 127 0.58 58 +553 2 10543 99454 1.66066 298.66066 150.16066 15016.06606 1.66066 298.66068 150.16066 15016.06621 1.66066 298.66066 150.16066 15016.06600 2020-01-01 2020-01-02 2020-01-01 00:09:13 2020-01-02 03:37:34 2020-01-01 00:09:13.000 2020-01-02 03:37:34.000 553 99454 50003.5 5000350 553 99454 50003.5 5000350 -32617 32521 4783.66 478366 -128 127 -0.98 -98 +554 2 10544 99455 1.66366 298.66366 150.16366 15016.36636 1.66366 298.66367 150.16366 15016.36651 1.66366 298.66366 150.16366 15016.36600 2020-01-01 2020-01-02 2020-01-01 00:09:14 2020-01-02 03:37:35 2020-01-01 00:09:14.000 2020-01-02 03:37:35.000 554 99455 50004.5 5000450 554 99455 50004.5 5000450 -32616 32522 4784.66 478466 -128 127 -2.54 -254 +555 2 10545 99456 1.66666 298.66666 150.16666 15016.66666 1.66666 298.66666 150.16666 15016.66668 1.66666 298.66666 150.16666 15016.66600 2020-01-01 2020-01-02 2020-01-01 00:09:15 2020-01-02 03:37:36 2020-01-01 00:09:15.000 2020-01-02 03:37:36.000 555 99456 50005.5 5000550 555 99456 50005.5 5000550 -32615 32523 4785.66 478566 -128 124 -4.1 -410 +556 2 10546 99457 1.66966 298.66966 150.16966 15016.96696 1.66966 298.66968 150.16966 15016.9668 1.66966 298.66966 150.16966 15016.96600 2020-01-01 2020-01-02 2020-01-01 00:09:16 2020-01-02 03:37:37 2020-01-01 00:09:16.000 2020-01-02 03:37:37.000 556 99457 50006.5 5000650 556 99457 50006.5 5000650 -32614 32524 4786.66 478666 -127 125 -3.1 -310 +557 2 10547 99458 1.67267 298.67267 150.17267 15017.26726 1.67267 298.67267 150.17267 15017.26709 1.67267 298.67267 150.17267 15017.26700 2020-01-01 2020-01-02 2020-01-01 00:09:17 2020-01-02 03:37:38 2020-01-01 00:09:17.000 2020-01-02 03:37:38.000 557 99458 50007.5 5000750 557 99458 50007.5 5000750 -32613 32525 4787.66 478766 -126 126 -2.1 -210 +558 2 10548 99459 1.67567 298.67567 150.17567 15017.56756 1.67567 298.6757 150.17567 15017.56769 1.67567 298.67567 150.17567 15017.56700 2020-01-01 2020-01-02 2020-01-01 00:09:18 2020-01-02 03:37:39 2020-01-01 00:09:18.000 2020-01-02 03:37:39.000 558 99459 50008.5 5000850 558 99459 50008.5 5000850 -32612 32526 4788.66 478866 -125 127 -1.1 -110 +559 2 10549 99460 1.67867 298.67867 150.17867 15017.86786 1.67867 298.67868 150.17868 15017.86802 1.67867 298.67867 150.17867 15017.86700 2020-01-01 2020-01-02 2020-01-01 00:09:19 2020-01-02 03:37:40 2020-01-01 00:09:19.000 2020-01-02 03:37:40.000 559 99460 50009.5 5000950 559 99460 50009.5 5000950 -32611 32527 4789.66 478966 -128 127 -2.66 -266 +56 2 10046 99956 0.16816 300.16816 150.16816 15166.98498 0.16816 300.16818 150.16816 15166.98512 0.16816 300.16816 150.16816 15166.98416 2020-01-01 2020-01-02 2020-01-01 00:00:56 2020-01-02 03:45:56 2020-01-01 00:00:56.000 2020-01-02 03:45:56.000 56 99956 50006 5050606 56 99956 50006 5050606 -32513 32422 4585.009900990099 463086 -127 124 -2.712871287128713 -274 +560 2 10550 99461 1.68168 298.68168 150.18168 15018.16816 1.68168 298.68167 150.18168 15018.16815 1.68168 298.68168 150.18168 15018.16800 2020-01-01 2020-01-02 2020-01-01 00:09:20 2020-01-02 03:37:41 2020-01-01 00:09:20.000 2020-01-02 03:37:41.000 560 99461 50010.5 5001050 560 99461 50010.5 5001050 -32610 32528 4790.66 479066 -128 127 -4.22 -422 +561 2 10551 99462 1.68468 298.68468 150.18468 15018.46846 1.68468 298.6847 150.18468 15018.46826 1.68468 298.68468 150.18468 15018.46800 2020-01-01 2020-01-02 2020-01-01 00:09:21 2020-01-02 03:37:42 2020-01-01 00:09:21.000 2020-01-02 03:37:42.000 561 99462 50011.5 5001150 561 99462 50011.5 5001150 -32609 32529 4791.66 479166 -128 123 -5.78 -578 +562 2 10552 99463 1.68768 298.68768 150.18768 15018.76876 1.68768 298.68768 150.18768 15018.76856 1.68768 298.68768 150.18768 15018.76800 2020-01-01 2020-01-02 2020-01-01 00:09:22 2020-01-02 03:37:43 2020-01-01 00:09:22.000 2020-01-02 03:37:43.000 562 99463 50012.5 5001250 562 99463 50012.5 5001250 -32608 32530 4792.66 479266 -127 124 -4.78 -478 +563 2 10553 99464 1.69069 298.69069 150.19069 15019.06906 1.69069 298.6907 150.19069 15019.06915 1.69069 298.69069 150.19069 15019.06900 2020-01-01 2020-01-02 2020-01-01 00:09:23 2020-01-02 03:37:44 2020-01-01 00:09:23.000 2020-01-02 03:37:44.000 563 99464 50013.5 5001350 563 99464 50013.5 5001350 -32607 32531 4793.66 479366 -126 125 -3.78 -378 +564 2 10554 99465 1.69369 298.69369 150.19369 15019.36936 1.69369 298.6937 150.19369 15019.36948 1.69369 298.69369 150.19369 15019.36900 2020-01-01 2020-01-02 2020-01-01 00:09:24 2020-01-02 03:37:45 2020-01-01 00:09:24.000 2020-01-02 03:37:45.000 564 99465 50014.5 5001450 564 99465 50014.5 5001450 -32606 32532 4794.66 479466 -125 126 -2.78 -278 +565 2 10555 99466 1.69669 298.69669 150.19669 15019.66966 1.69669 298.6967 150.19669 15019.66962 1.69669 298.69669 150.19669 15019.66900 2020-01-01 2020-01-02 2020-01-01 00:09:25 2020-01-02 03:37:46 2020-01-01 00:09:25.000 2020-01-02 03:37:46.000 565 99466 50015.5 5001550 565 99466 50015.5 5001550 -32605 32533 4795.66 479566 -124 127 -1.78 -178 +566 2 10556 99467 1.69969 298.69969 150.19969 15019.96996 1.69969 298.6997 150.1997 15019.97037 1.69969 298.69969 150.19969 15019.96900 2020-01-01 2020-01-02 2020-01-01 00:09:26 2020-01-02 03:37:47 2020-01-01 00:09:26.000 2020-01-02 03:37:47.000 566 99467 50016.5 5001650 566 99467 50016.5 5001650 -32604 32534 4796.66 479666 -128 127 -3.34 -334 +567 2 10557 99468 1.7027 298.7027 150.2027 15020.27027 1.7027 298.7027 150.2027 15020.27003 1.70270 298.70270 150.20270 15020.27000 2020-01-01 2020-01-02 2020-01-01 00:09:27 2020-01-02 03:37:48 2020-01-01 00:09:27.000 2020-01-02 03:37:48.000 567 99468 50017.5 5001750 567 99468 50017.5 5001750 -32603 32535 4797.66 479766 -128 123 -4.9 -490 +568 2 10558 99469 1.7057 298.7057 150.2057 15020.57057 1.7057 298.70572 150.2057 15020.57066 1.70570 298.70570 150.20570 15020.57000 2020-01-01 2020-01-02 2020-01-01 00:09:28 2020-01-02 03:37:49 2020-01-01 00:09:28.000 2020-01-02 03:37:49.000 568 99469 50018.5 5001850 568 99469 50018.5 5001850 -32602 32536 4798.66 479866 -127 124 -3.9 -390 +569 2 10559 99470 1.7087 298.7087 150.2087 15020.87087 1.7087 298.7087 150.2087 15020.87095 1.70870 298.70870 150.20870 15020.87000 2020-01-01 2020-01-02 2020-01-01 00:09:29 2020-01-02 03:37:50 2020-01-01 00:09:29.000 2020-01-02 03:37:50.000 569 99470 50019.5 5001950 569 99470 50019.5 5001950 -32601 32537 4799.66 479966 -126 125 -2.9 -290 +57 2 10047 99957 0.17117 300.17117 150.17117 15167.28828 0.17117 300.17117 150.17117 15167.28841 0.17117 300.17117 150.17117 15167.28817 2020-01-01 2020-01-02 2020-01-01 00:00:57 2020-01-02 03:45:57 2020-01-01 00:00:57.000 2020-01-02 03:45:57.000 57 99957 50007 5050707 57 99957 50007 5050707 -32512 32423 4586.009900990099 463187 -126 125 -1.7128712871287128 -173 +570 2 10560 99471 1.71171 298.71171 150.21171 15021.17117 1.71171 298.7117 150.21171 15021.17109 1.71171 298.71171 150.21171 15021.17100 2020-01-01 2020-01-02 2020-01-01 00:09:30 2020-01-02 03:37:51 2020-01-01 00:09:30.000 2020-01-02 03:37:51.000 570 99471 50020.5 5002050 570 99471 50020.5 5002050 -32600 32538 4800.66 480066 -125 126 -1.9 -190 +571 2 10561 99472 1.71471 298.71471 150.21471 15021.47147 1.71471 298.71472 150.21471 15021.47184 1.71471 298.71471 150.21471 15021.47100 2020-01-01 2020-01-02 2020-01-01 00:09:31 2020-01-02 03:37:52 2020-01-01 00:09:31.000 2020-01-02 03:37:52.000 571 99472 50021.5 5002150 571 99472 50021.5 5002150 -32599 32539 4801.66 480166 -124 127 -0.9 -90 +572 2 10562 99473 1.71771 298.71771 150.21771 15021.77177 1.71771 298.7177 150.21771 15021.7715 1.71771 298.71771 150.21771 15021.77100 2020-01-01 2020-01-02 2020-01-01 00:09:32 2020-01-02 03:37:53 2020-01-01 00:09:32.000 2020-01-02 03:37:53.000 572 99473 50022.5 5002250 572 99473 50022.5 5002250 -32598 32540 4802.66 480266 -128 127 -2.46 -246 +573 2 10563 99474 1.72072 298.72072 150.22072 15022.07207 1.72072 298.72073 150.22072 15022.07212 1.72072 298.72072 150.22072 15022.07200 2020-01-01 2020-01-02 2020-01-01 00:09:33 2020-01-02 03:37:54 2020-01-01 00:09:33.000 2020-01-02 03:37:54.000 573 99474 50023.5 5002350 573 99474 50023.5 5002350 -32597 32541 4803.66 480366 -128 123 -4.02 -402 +574 2 10564 99475 1.72372 298.72372 150.22372 15022.37237 1.72372 298.72372 150.22372 15022.37243 1.72372 298.72372 150.22372 15022.37200 2020-01-01 2020-01-02 2020-01-01 00:09:34 2020-01-02 03:37:55 2020-01-01 00:09:34.000 2020-01-02 03:37:55.000 574 99475 50024.5 5002450 574 99475 50024.5 5002450 -32596 32542 4804.66 480466 -127 124 -3.02 -302 +575 2 10565 99476 1.72672 298.72672 150.22672 15022.67267 1.72672 298.7267 150.22672 15022.67272 1.72672 298.72672 150.22672 15022.67200 2020-01-01 2020-01-02 2020-01-01 00:09:35 2020-01-02 03:37:56 2020-01-01 00:09:35.000 2020-01-02 03:37:56.000 575 99476 50025.5 5002550 575 99476 50025.5 5002550 -32595 32543 4805.66 480566 -126 125 -2.02 -202 +576 2 10566 99477 1.72972 298.72972 150.22972 15022.97297 1.72972 298.72974 150.22973 15022.97332 1.72972 298.72972 150.22972 15022.97200 2020-01-01 2020-01-02 2020-01-01 00:09:36 2020-01-02 03:37:57 2020-01-01 00:09:36.000 2020-01-02 03:37:57.000 576 99477 50026.5 5002650 576 99477 50026.5 5002650 -32594 32544 4806.66 480666 -125 126 -1.02 -102 +577 2 10567 99478 1.73273 298.73273 150.23273 15023.27327 1.73273 298.73273 150.23272 15023.27297 1.73273 298.73273 150.23273 15023.27300 2020-01-01 2020-01-02 2020-01-01 00:09:37 2020-01-02 03:37:58 2020-01-01 00:09:37.000 2020-01-02 03:37:58.000 577 99478 50027.5 5002750 577 99478 50027.5 5002750 -32593 32545 4807.66 480766 -124 127 -0.02 -2 +578 2 10568 99479 1.73573 298.73573 150.23573 15023.57357 1.73573 298.73575 150.23573 15023.57359 1.73573 298.73573 150.23573 15023.57300 2020-01-01 2020-01-02 2020-01-01 00:09:38 2020-01-02 03:37:59 2020-01-01 00:09:38.000 2020-01-02 03:37:59.000 578 99479 50028.5 5002850 578 99479 50028.5 5002850 -32592 32546 4808.66 480866 -128 127 -1.58 -158 +579 2 10569 99480 1.73873 298.73873 150.23873 15023.87387 1.73873 298.73874 150.23873 15023.8739 1.73873 298.73873 150.23873 15023.87300 2020-01-01 2020-01-02 2020-01-01 00:09:39 2020-01-02 03:38:00 2020-01-01 00:09:39.000 2020-01-02 03:38:00.000 579 99480 50029.5 5002950 579 99480 50029.5 5002950 -32591 32547 4809.66 480966 -128 123 -3.14 -314 +58 2 10048 99958 0.17417 300.17417 150.17417 15167.59159 0.17417 300.17416 150.17417 15167.59159 0.17417 300.17417 150.17417 15167.59117 2020-01-01 2020-01-02 2020-01-01 00:00:58 2020-01-02 03:45:58 2020-01-01 00:00:58.000 2020-01-02 03:45:58.000 58 99958 50008 5050808 58 99958 50008 5050808 -32511 32424 4587.009900990099 463288 -125 126 -0.7128712871287128 -72 +580 2 10570 99481 1.74174 298.74174 150.24174 15024.17417 1.74174 298.74173 150.24174 15024.17419 1.74174 298.74174 150.24174 15024.17400 2020-01-01 2020-01-02 2020-01-01 00:09:40 2020-01-02 03:38:01 2020-01-01 00:09:40.000 2020-01-02 03:38:01.000 580 99481 50030.5 5003050 580 99481 50030.5 5003050 -32590 32548 4810.66 481066 -127 124 -2.14 -214 +581 2 10571 99482 1.74474 298.74474 150.24474 15024.47447 1.74474 298.74475 150.24474 15024.47478 1.74474 298.74474 150.24474 15024.47400 2020-01-01 2020-01-02 2020-01-01 00:09:41 2020-01-02 03:38:02 2020-01-01 00:09:41.000 2020-01-02 03:38:02.000 581 99482 50031.5 5003150 581 99482 50031.5 5003150 -32589 32549 4811.66 481166 -126 125 -1.14 -114 +582 2 10572 99483 1.74774 298.74774 150.24774 15024.77477 1.74774 298.74774 150.24774 15024.77447 1.74774 298.74774 150.24774 15024.77400 2020-01-01 2020-01-02 2020-01-01 00:09:42 2020-01-02 03:38:03 2020-01-01 00:09:42.000 2020-01-02 03:38:03.000 582 99483 50032.5 5003250 582 99483 50032.5 5003250 -32588 32550 4812.66 481266 -125 126 -0.14 -14 +583 2 10573 99484 1.75075 298.75075 150.25075 15025.07507 1.75075 298.75076 150.25075 15025.07507 1.75075 298.75075 150.25075 15025.07500 2020-01-01 2020-01-02 2020-01-01 00:09:43 2020-01-02 03:38:04 2020-01-01 00:09:43.000 2020-01-02 03:38:04.000 583 99484 50033.5 5003350 583 99484 50033.5 5003350 -32587 32551 4813.66 481366 -124 127 0.86 86 +584 2 10574 99485 1.75375 298.75375 150.25375 15025.37537 1.75375 298.75375 150.25375 15025.37536 1.75375 298.75375 150.25375 15025.37500 2020-01-01 2020-01-02 2020-01-01 00:09:44 2020-01-02 03:38:05 2020-01-01 00:09:44.000 2020-01-02 03:38:05.000 584 99485 50034.5 5003450 584 99485 50034.5 5003450 -32586 32552 4814.66 481466 -128 127 -0.7 -70 +585 2 10575 99486 1.75675 298.75675 150.25675 15025.67567 1.75675 298.75674 150.25675 15025.67566 1.75675 298.75675 150.25675 15025.67500 2020-01-01 2020-01-02 2020-01-01 00:09:45 2020-01-02 03:38:06 2020-01-01 00:09:45.000 2020-01-02 03:38:06.000 585 99486 50035.5 5003550 585 99486 50035.5 5003550 -32585 32553 4815.66 481566 -128 127 -2.26 -226 +586 2 10576 99487 1.75975 298.75975 150.25975 15025.97597 1.75975 298.75977 150.25976 15025.97625 1.75975 298.75975 150.25975 15025.97500 2020-01-01 2020-01-02 2020-01-01 00:09:46 2020-01-02 03:38:07 2020-01-01 00:09:46.000 2020-01-02 03:38:07.000 586 99487 50036.5 5003650 586 99487 50036.5 5003650 -32584 32554 4816.66 481666 -128 123 -3.82 -382 +587 2 10577 99488 1.76276 298.76276 150.26276 15026.27627 1.76276 298.76276 150.26275 15026.27594 1.76276 298.76276 150.26276 15026.27600 2020-01-01 2020-01-02 2020-01-01 00:09:47 2020-01-02 03:38:08 2020-01-01 00:09:47.000 2020-01-02 03:38:08.000 587 99488 50037.5 5003750 587 99488 50037.5 5003750 -32583 32555 4817.66 481766 -127 124 -2.82 -282 +588 2 10578 99489 1.76576 298.76576 150.26576 15026.57657 1.76576 298.76578 150.26576 15026.57654 1.76576 298.76576 150.26576 15026.57600 2020-01-01 2020-01-02 2020-01-01 00:09:48 2020-01-02 03:38:09 2020-01-01 00:09:48.000 2020-01-02 03:38:09.000 588 99489 50038.5 5003850 588 99489 50038.5 5003850 -32582 32556 4818.66 481866 -126 125 -1.82 -182 +589 2 10579 99490 1.76876 298.76876 150.26876 15026.87687 1.76876 298.76877 150.26876 15026.87683 1.76876 298.76876 150.26876 15026.87600 2020-01-01 2020-01-02 2020-01-01 00:09:49 2020-01-02 03:38:10 2020-01-01 00:09:49.000 2020-01-02 03:38:10.000 589 99490 50039.5 5003950 589 99490 50039.5 5003950 -32581 32557 4819.66 481966 -125 126 -0.82 -82 +59 2 10049 99959 0.17717 300.17717 150.17717 15167.89489 0.17717 300.1772 150.17717 15167.8947 0.17717 300.17717 150.17717 15167.89417 2020-01-01 2020-01-02 2020-01-01 00:00:59 2020-01-02 03:45:59 2020-01-01 00:00:59.000 2020-01-02 03:45:59.000 59 99959 50009 5050909 59 99959 50009 5050909 -32510 32425 4588.009900990099 463389 -124 127 0.2871287128712871 29 +590 2 10580 99491 1.77177 298.77177 150.27177 15027.17717 1.77177 298.77176 150.27177 15027.17713 1.77177 298.77177 150.27177 15027.17700 2020-01-01 2020-01-02 2020-01-01 00:09:50 2020-01-02 03:38:11 2020-01-01 00:09:50.000 2020-01-02 03:38:11.000 590 99491 50040.5 5004050 590 99491 50040.5 5004050 -32580 32558 4820.66 482066 -124 127 0.18 18 +591 2 10581 99492 1.77477 298.77477 150.27477 15027.47747 1.77477 298.77478 150.27477 15027.47775 1.77477 298.77477 150.27477 15027.47700 2020-01-01 2020-01-02 2020-01-01 00:09:51 2020-01-02 03:38:12 2020-01-01 00:09:51.000 2020-01-02 03:38:12.000 591 99492 50041.5 5004150 591 99492 50041.5 5004150 -32579 32559 4821.66 482166 -128 127 -1.38 -138 +592 2 10582 99493 1.77777 298.77777 150.27777 15027.77777 1.77777 298.77777 150.27777 15027.77742 1.77777 298.77777 150.27777 15027.77700 2020-01-01 2020-01-02 2020-01-01 00:09:52 2020-01-02 03:38:13 2020-01-01 00:09:52.000 2020-01-02 03:38:13.000 592 99493 50042.5 5004250 592 99493 50042.5 5004250 -32578 32560 4822.66 482266 -128 123 -2.94 -294 +593 2 10583 99494 1.78078 298.78078 150.28078 15028.07807 1.78078 298.7808 150.28078 15028.078 1.78078 298.78078 150.28078 15028.07800 2020-01-01 2020-01-02 2020-01-01 00:09:53 2020-01-02 03:38:14 2020-01-01 00:09:53.000 2020-01-02 03:38:14.000 593 99494 50043.5 5004350 593 99494 50043.5 5004350 -32577 32561 4823.66 482366 -127 124 -1.94 -194 +594 2 10584 99495 1.78378 298.78378 150.28378 15028.37837 1.78378 298.78378 150.28378 15028.3783 1.78378 298.78378 150.28378 15028.37800 2020-01-01 2020-01-02 2020-01-01 00:09:54 2020-01-02 03:38:15 2020-01-01 00:09:54.000 2020-01-02 03:38:15.000 594 99495 50044.5 5004450 594 99495 50044.5 5004450 -32576 32562 4824.66 482466 -126 125 -0.94 -94 +595 2 10585 99496 1.78678 298.78678 150.28678 15028.67867 1.78678 298.78677 150.28678 15028.6786 1.78678 298.78678 150.28678 15028.67800 2020-01-01 2020-01-02 2020-01-01 00:09:55 2020-01-02 03:38:16 2020-01-01 00:09:55.000 2020-01-02 03:38:16.000 595 99496 50045.5 5004550 595 99496 50045.5 5004550 -32575 32563 4825.66 482566 -125 126 0.06 6 +596 2 10586 99497 1.78978 298.78978 150.28978 15028.97897 1.78978 298.7898 150.28979 15028.97922 1.78978 298.78978 150.28978 15028.97800 2020-01-01 2020-01-02 2020-01-01 00:09:56 2020-01-02 03:38:17 2020-01-01 00:09:56.000 2020-01-02 03:38:17.000 596 99497 50046.5 5004650 596 99497 50046.5 5004650 -32574 32564 4826.66 482666 -124 127 1.06 106 +597 2 10587 99498 1.79279 298.79279 150.29279 15029.27927 1.79279 298.7928 150.29278 15029.27888 1.79279 298.79279 150.29279 15029.27900 2020-01-01 2020-01-02 2020-01-01 00:09:57 2020-01-02 03:38:18 2020-01-01 00:09:57.000 2020-01-02 03:38:18.000 597 99498 50047.5 5004750 597 99498 50047.5 5004750 -32573 32565 4827.66 482766 -128 127 -0.5 -50 +598 2 10588 99499 1.79579 298.79579 150.29579 15029.57957 1.79579 298.7958 150.29579 15029.57964 1.79579 298.79579 150.29579 15029.57900 2020-01-01 2020-01-02 2020-01-01 00:09:58 2020-01-02 03:38:19 2020-01-01 00:09:58.000 2020-01-02 03:38:19.000 598 99499 50048.5 5004850 598 99499 50048.5 5004850 -32572 32566 4828.66 482866 -128 123 -2.06 -206 +599 2 10589 99500 1.79879 298.79879 150.29879 15029.87987 1.79879 298.7988 150.29879 15029.87977 1.79879 298.79879 150.29879 15029.87900 2020-01-01 2020-01-02 2020-01-01 00:09:59 2020-01-02 03:38:20 2020-01-01 00:09:59.000 2020-01-02 03:38:20.000 599 99500 50049.5 5004950 599 99500 50049.5 5004950 -32571 32567 4829.66 482966 -127 124 -1.06 -106 +6 2 1005 9996 0.01801 300.01801 150.01801 15151.81981 0.01801 300.018 150.01801 15151.81978 0.01801 300.01801 150.01801 15151.81901 2020-01-01 2020-01-02 2020-01-01 00:00:06 2020-01-02 03:45:06 2020-01-01 00:00:06.000 2020-01-02 03:45:06.000 6 99906 49956 5045556 6 99906 49956 5045556 -32563 32372 4535.009900990099 458036 -127 124 -2.01980198019802 -204 +60 2 10050 99960 0.18018 300.18018 150.18018 15168.19819 0.18018 300.18018 150.18017 15168.198 0.18018 300.18018 150.18018 15168.19818 2020-01-01 2020-01-02 2020-01-01 00:01:00 2020-01-02 03:46:00 2020-01-01 00:01:00.000 2020-01-02 03:46:00.000 60 99960 50010 5051010 60 99960 50010 5051010 -32509 32426 4589.009900990099 463490 -128 127 -1.2475247524752475 -126 +600 2 10590 99501 1.8018 298.8018 150.3018 15030.18018 1.8018 298.8018 150.3018 15030.1801 1.80180 298.80180 150.30180 15030.18000 2020-01-01 2020-01-02 2020-01-01 00:10:00 2020-01-02 03:38:21 2020-01-01 00:10:00.000 2020-01-02 03:38:21.000 600 99501 50050.5 5005050 600 99501 50050.5 5005050 -32570 32568 4830.66 483066 -126 125 -0.06 -6 +601 2 10591 99502 1.8048 298.8048 150.3048 15030.48048 1.8048 298.8048 150.3048 15030.4807 1.80480 298.80480 150.30480 15030.48000 2020-01-01 2020-01-02 2020-01-01 00:10:01 2020-01-02 03:38:22 2020-01-01 00:10:01.000 2020-01-02 03:38:22.000 601 99502 50051.5 5005150 601 99502 50051.5 5005150 -32569 32569 4831.66 483166 -125 126 0.94 94 +602 2 10592 99503 1.8078 298.8078 150.3078 15030.78078 1.8078 298.8078 150.3078 15030.78035 1.80780 298.80780 150.30780 15030.78000 2020-01-01 2020-01-02 2020-01-01 00:10:02 2020-01-02 03:38:23 2020-01-01 00:10:02.000 2020-01-02 03:38:23.000 602 99503 50052.5 5005250 602 99503 50052.5 5005250 -32568 32570 4832.66 483266 -124 127 1.94 194 +603 2 10593 99504 1.81081 298.81081 150.31081 15031.08108 1.81081 298.81082 150.31081 15031.0811 1.81081 298.81081 150.31081 15031.08100 2020-01-01 2020-01-02 2020-01-01 00:10:03 2020-01-02 03:38:24 2020-01-01 00:10:03.000 2020-01-02 03:38:24.000 603 99504 50053.5 5005350 603 99504 50053.5 5005350 -32567 32571 4833.66 483366 -128 127 0.38 38 +604 2 10594 99505 1.81381 298.81381 150.31381 15031.38138 1.81381 298.8138 150.31381 15031.38124 1.81381 298.81381 150.31381 15031.38100 2020-01-01 2020-01-02 2020-01-01 00:10:04 2020-01-02 03:38:25 2020-01-01 00:10:04.000 2020-01-02 03:38:25.000 604 99505 50054.5 5005450 604 99505 50054.5 5005450 -32566 32572 4834.66 483466 -128 123 -1.18 -118 +605 2 10595 99506 1.81681 298.81681 150.31681 15031.68168 1.81681 298.8168 150.31681 15031.68157 1.81681 298.81681 150.31681 15031.68100 2020-01-01 2020-01-02 2020-01-01 00:10:05 2020-01-02 03:38:26 2020-01-01 00:10:05.000 2020-01-02 03:38:26.000 605 99506 50055.5 5005550 605 99506 50055.5 5005550 -32565 32573 4835.66 483566 -127 124 -0.18 -18 +606 2 10596 99507 1.81981 298.81981 150.31981 15031.98198 1.81981 298.81982 150.31982 15031.98217 1.81981 298.81981 150.31981 15031.98100 2020-01-01 2020-01-02 2020-01-01 00:10:06 2020-01-02 03:38:27 2020-01-01 00:10:06.000 2020-01-02 03:38:27.000 606 99507 50056.5 5005650 606 99507 50056.5 5005650 -32564 32574 4836.66 483666 -126 125 0.82 82 +607 2 10597 99508 1.82282 298.82282 150.32282 15032.28228 1.82282 298.8228 150.32282 15032.28246 1.82282 298.82282 150.32282 15032.28200 2020-01-01 2020-01-02 2020-01-01 00:10:07 2020-01-02 03:38:28 2020-01-01 00:10:07.000 2020-01-02 03:38:28.000 607 99508 50057.5 5005750 607 99508 50057.5 5005750 -32563 32575 4837.66 483766 -125 126 1.82 182 +608 2 10598 99509 1.82582 298.82582 150.32582 15032.58258 1.82582 298.82584 150.32582 15032.58258 1.82582 298.82582 150.32582 15032.58200 2020-01-01 2020-01-02 2020-01-01 00:10:08 2020-01-02 03:38:29 2020-01-01 00:10:08.000 2020-01-02 03:38:29.000 608 99509 50058.5 5005850 608 99509 50058.5 5005850 -32562 32576 4838.66 483866 -124 127 2.82 282 +609 2 10599 99510 1.82882 298.82882 150.32882 15032.88288 1.82882 298.82883 150.32882 15032.88274 1.82882 298.82882 150.32882 15032.88200 2020-01-01 2020-01-02 2020-01-01 00:10:09 2020-01-02 03:38:30 2020-01-01 00:10:09.000 2020-01-02 03:38:30.000 609 99510 50059.5 5005950 609 99510 50059.5 5005950 -32561 32577 4839.66 483966 -128 127 1.26 126 +61 2 10051 99961 0.18318 300.18318 150.18318 15168.5015 0.18318 300.1832 150.18318 15168.5016 0.18318 300.18318 150.18318 15168.50118 2020-01-01 2020-01-02 2020-01-01 00:01:01 2020-01-02 03:46:01 2020-01-01 00:01:01.000 2020-01-02 03:46:01.000 61 99961 50011 5051111 61 99961 50011 5051111 -32508 32427 4590.009900990099 463591 -128 123 -2.782178217821782 -281 +610 2 10600 99511 1.83183 298.83183 150.33183 15033.18318 1.83183 298.83182 150.33183 15033.18304 1.83183 298.83183 150.33183 15033.18300 2020-01-01 2020-01-02 2020-01-01 00:10:10 2020-01-02 03:38:31 2020-01-01 00:10:10.000 2020-01-02 03:38:31.000 610 99511 50060.5 5006050 610 99511 50060.5 5006050 -32560 32578 4840.66 484066 -128 127 -0.3 -30 +611 2 10601 99512 1.83483 298.83483 150.33483 15033.48348 1.83483 298.83484 150.33483 15033.48363 1.83483 298.83483 150.33483 15033.48300 2020-01-01 2020-01-02 2020-01-01 00:10:11 2020-01-02 03:38:32 2020-01-01 00:10:11.000 2020-01-02 03:38:32.000 611 99512 50061.5 5006150 611 99512 50061.5 5006150 -32559 32579 4841.66 484166 -128 123 -1.86 -186 +612 2 10602 99513 1.83783 298.83783 150.33783 15033.78378 1.83783 298.83783 150.33783 15033.78393 1.83783 298.83783 150.33783 15033.78300 2020-01-01 2020-01-02 2020-01-01 00:10:12 2020-01-02 03:38:33 2020-01-01 00:10:12.000 2020-01-02 03:38:33.000 612 99513 50062.5 5006250 612 99513 50062.5 5006250 -32558 32580 4842.66 484266 -127 124 -0.86 -86 +613 2 10603 99514 1.84084 298.84084 150.34084 15034.08408 1.84084 298.84085 150.34084 15034.08405 1.84084 298.84084 150.34084 15034.08400 2020-01-01 2020-01-02 2020-01-01 00:10:13 2020-01-02 03:38:34 2020-01-01 00:10:13.000 2020-01-02 03:38:34.000 613 99514 50063.5 5006350 613 99514 50063.5 5006350 -32557 32581 4843.66 484366 -126 125 0.14 14 +614 2 10604 99515 1.84384 298.84384 150.34384 15034.38438 1.84384 298.84384 150.34384 15034.38421 1.84384 298.84384 150.34384 15034.38400 2020-01-01 2020-01-02 2020-01-01 00:10:14 2020-01-02 03:38:35 2020-01-01 00:10:14.000 2020-01-02 03:38:35.000 614 99515 50064.5 5006450 614 99515 50064.5 5006450 -32556 32582 4844.66 484466 -125 126 1.14 114 +615 2 10605 99516 1.84684 298.84684 150.34684 15034.68468 1.84684 298.84683 150.34684 15034.68452 1.84684 298.84684 150.34684 15034.68400 2020-01-01 2020-01-02 2020-01-01 00:10:15 2020-01-02 03:38:36 2020-01-01 00:10:15.000 2020-01-02 03:38:36.000 615 99516 50065.5 5006550 615 99516 50065.5 5006550 -32555 32583 4845.66 484566 -124 127 2.14 214 +616 2 10606 99517 1.84984 298.84984 150.34984 15034.98498 1.84984 298.84985 150.34985 15034.98527 1.84984 298.84984 150.34984 15034.98400 2020-01-01 2020-01-02 2020-01-01 00:10:16 2020-01-02 03:38:37 2020-01-01 00:10:16.000 2020-01-02 03:38:37.000 616 99517 50066.5 5006650 616 99517 50066.5 5006650 -32554 32584 4846.66 484666 -128 127 0.58 58 +617 2 10607 99518 1.85285 298.85285 150.35285 15035.28528 1.85285 298.85284 150.35285 15035.2854 1.85285 298.85285 150.35285 15035.28500 2020-01-01 2020-01-02 2020-01-01 00:10:17 2020-01-02 03:38:38 2020-01-01 00:10:17.000 2020-01-02 03:38:38.000 617 99518 50067.5 5006750 617 99518 50067.5 5006750 -32553 32585 4847.66 484766 -128 123 -0.98 -98 +618 2 10608 99519 1.85585 298.85585 150.35585 15035.58558 1.85585 298.85587 150.35585 15035.58551 1.85585 298.85585 150.35585 15035.58500 2020-01-01 2020-01-02 2020-01-01 00:10:18 2020-01-02 03:38:39 2020-01-01 00:10:18.000 2020-01-02 03:38:39.000 618 99519 50068.5 5006850 618 99519 50068.5 5006850 -32552 32586 4848.66 484866 -127 124 0.02 2 +619 2 10609 99520 1.85885 298.85885 150.35885 15035.88588 1.85885 298.85886 150.35885 15035.88568 1.85885 298.85885 150.35885 15035.88500 2020-01-01 2020-01-02 2020-01-01 00:10:19 2020-01-02 03:38:40 2020-01-01 00:10:19.000 2020-01-02 03:38:40.000 619 99520 50069.5 5006950 619 99520 50069.5 5006950 -32551 32587 4849.66 484966 -126 125 1.02 102 +62 2 10052 99962 0.18618 300.18618 150.18618 15168.8048 0.18618 300.1862 150.18618 15168.80494 0.18618 300.18618 150.18618 15168.80418 2020-01-01 2020-01-02 2020-01-01 00:01:02 2020-01-02 03:46:02 2020-01-01 00:01:02.000 2020-01-02 03:46:02.000 62 99962 50012 5051212 62 99962 50012 5051212 -32507 32428 4591.009900990099 463692 -127 124 -1.7821782178217822 -180 +620 2 10610 99521 1.86186 298.86186 150.36186 15036.18618 1.86186 298.86185 150.36185 15036.18598 1.86186 298.86186 150.36186 15036.18600 2020-01-01 2020-01-02 2020-01-01 00:10:20 2020-01-02 03:38:41 2020-01-01 00:10:20.000 2020-01-02 03:38:41.000 620 99521 50070.5 5007050 620 99521 50070.5 5007050 -32550 32588 4850.66 485066 -125 126 2.02 202 +621 2 10611 99522 1.86486 298.86486 150.36486 15036.48648 1.86486 298.86487 150.36486 15036.48673 1.86486 298.86486 150.36486 15036.48600 2020-01-01 2020-01-02 2020-01-01 00:10:21 2020-01-02 03:38:42 2020-01-01 00:10:21.000 2020-01-02 03:38:42.000 621 99522 50071.5 5007150 621 99522 50071.5 5007150 -32549 32589 4851.66 485166 -124 127 3.02 302 +622 2 10612 99523 1.86786 298.86786 150.36786 15036.78678 1.86786 298.86786 150.36786 15036.78687 1.86786 298.86786 150.36786 15036.78600 2020-01-01 2020-01-02 2020-01-01 00:10:22 2020-01-02 03:38:43 2020-01-01 00:10:22.000 2020-01-02 03:38:43.000 622 99523 50072.5 5007250 622 99523 50072.5 5007250 -32548 32590 4852.66 485266 -128 127 1.46 146 +623 2 10613 99524 1.87087 298.87087 150.37087 15037.08708 1.87087 298.87088 150.37087 15037.08702 1.87087 298.87087 150.37087 15037.08700 2020-01-01 2020-01-02 2020-01-01 00:10:23 2020-01-02 03:38:44 2020-01-01 00:10:23.000 2020-01-02 03:38:44.000 623 99524 50073.5 5007350 623 99524 50073.5 5007350 -32547 32591 4853.66 485366 -128 123 -0.1 -10 +624 2 10614 99525 1.87387 298.87387 150.37387 15037.38738 1.87387 298.87387 150.37387 15037.38716 1.87387 298.87387 150.37387 15037.38700 2020-01-01 2020-01-02 2020-01-01 00:10:24 2020-01-02 03:38:45 2020-01-01 00:10:24.000 2020-01-02 03:38:45.000 624 99525 50074.5 5007450 624 99525 50074.5 5007450 -32546 32592 4854.66 485466 -127 124 0.9 90 +625 2 10615 99526 1.87687 298.87687 150.37687 15037.68768 1.87687 298.8769 150.37687 15037.68791 1.87687 298.87687 150.37687 15037.68700 2020-01-01 2020-01-02 2020-01-01 00:10:25 2020-01-02 03:38:46 2020-01-01 00:10:25.000 2020-01-02 03:38:46.000 625 99526 50075.5 5007550 625 99526 50075.5 5007550 -32545 32593 4855.66 485566 -126 125 1.9 190 +626 2 10616 99527 1.87987 298.87987 150.37987 15037.98798 1.87987 298.87988 150.37988 15037.9882 1.87987 298.87987 150.37987 15037.98700 2020-01-01 2020-01-02 2020-01-01 00:10:26 2020-01-02 03:38:47 2020-01-01 00:10:26.000 2020-01-02 03:38:47.000 626 99527 50076.5 5007650 626 99527 50076.5 5007650 -32544 32594 4856.66 485666 -125 126 2.9 290 +627 2 10617 99528 1.88288 298.88288 150.38288 15038.28828 1.88288 298.88287 150.38288 15038.28834 1.88288 298.88288 150.38288 15038.28800 2020-01-01 2020-01-02 2020-01-01 00:10:27 2020-01-02 03:38:48 2020-01-01 00:10:27.000 2020-01-02 03:38:48.000 627 99528 50077.5 5007750 627 99528 50077.5 5007750 -32543 32595 4857.66 485766 -124 127 3.9 390 +628 2 10618 99529 1.88588 298.88588 150.38588 15038.58858 1.88588 298.8859 150.38588 15038.58849 1.88588 298.88588 150.38588 15038.58800 2020-01-01 2020-01-02 2020-01-01 00:10:28 2020-01-02 03:38:49 2020-01-01 00:10:28.000 2020-01-02 03:38:49.000 628 99529 50078.5 5007850 628 99529 50078.5 5007850 -32542 32596 4858.66 485866 -128 127 2.34 234 +629 2 10619 99530 1.88888 298.88888 150.38888 15038.88888 1.88888 298.8889 150.38888 15038.88862 1.88888 298.88888 150.38888 15038.88800 2020-01-01 2020-01-02 2020-01-01 00:10:29 2020-01-02 03:38:50 2020-01-01 00:10:29.000 2020-01-02 03:38:50.000 629 99530 50079.5 5007950 629 99530 50079.5 5007950 -32541 32597 4859.66 485966 -128 123 0.78 78 +63 2 10053 99963 0.18918 300.18918 150.18918 15169.1081 0.18918 300.18918 150.18918 15169.10808 0.18918 300.18918 150.18918 15169.10718 2020-01-01 2020-01-02 2020-01-01 00:01:03 2020-01-02 03:46:03 2020-01-01 00:01:03.000 2020-01-02 03:46:03.000 63 99963 50013 5051313 63 99963 50013 5051313 -32506 32429 4592.009900990099 463793 -126 125 -0.7821782178217822 -79 +630 2 10620 99531 1.89189 298.89189 150.39189 15039.18918 1.89189 298.8919 150.39189 15039.18937 1.89189 298.89189 150.39189 15039.18900 2020-01-01 2020-01-02 2020-01-01 00:10:30 2020-01-02 03:38:51 2020-01-01 00:10:30.000 2020-01-02 03:38:51.000 630 99531 50080.5 5008050 630 99531 50080.5 5008050 -32540 32598 4860.66 486066 -127 124 1.78 178 +631 2 10621 99532 1.89489 298.89489 150.39489 15039.48948 1.89489 298.8949 150.39489 15039.48968 1.89489 298.89489 150.39489 15039.48900 2020-01-01 2020-01-02 2020-01-01 00:10:31 2020-01-02 03:38:52 2020-01-01 00:10:31.000 2020-01-02 03:38:52.000 631 99532 50081.5 5008150 631 99532 50081.5 5008150 -32539 32599 4861.66 486166 -126 125 2.78 278 +632 2 10622 99533 1.89789 298.89789 150.39789 15039.78978 1.89789 298.8979 150.39789 15039.78984 1.89789 298.89789 150.39789 15039.78900 2020-01-01 2020-01-02 2020-01-01 00:10:32 2020-01-02 03:38:53 2020-01-01 00:10:32.000 2020-01-02 03:38:53.000 632 99533 50082.5 5008250 632 99533 50082.5 5008250 -32538 32600 4862.66 486266 -125 126 3.78 378 +633 2 10623 99534 1.9009 298.9009 150.4009 15040.09009 1.9009 298.9009 150.40089 15040.08996 1.90090 298.90090 150.40090 15040.09000 2020-01-01 2020-01-02 2020-01-01 00:10:33 2020-01-02 03:38:54 2020-01-01 00:10:33.000 2020-01-02 03:38:54.000 633 99534 50083.5 5008350 633 99534 50083.5 5008350 -32537 32601 4863.66 486366 -124 127 4.78 478 +634 2 10624 99535 1.9039 298.9039 150.4039 15040.39039 1.9039 298.9039 150.4039 15040.39009 1.90390 298.90390 150.40390 15040.39000 2020-01-01 2020-01-02 2020-01-01 00:10:34 2020-01-02 03:38:55 2020-01-01 00:10:34.000 2020-01-02 03:38:55.000 634 99535 50084.5 5008450 634 99535 50084.5 5008450 -32536 32602 4864.66 486466 -128 127 3.22 322 +635 2 10625 99536 1.9069 298.9069 150.4069 15040.69069 1.9069 298.90692 150.4069 15040.69084 1.90690 298.90690 150.40690 15040.69000 2020-01-01 2020-01-02 2020-01-01 00:10:35 2020-01-02 03:38:56 2020-01-01 00:10:35.000 2020-01-02 03:38:56.000 635 99536 50085.5 5008550 635 99536 50085.5 5008550 -32535 32603 4865.66 486566 -128 127 1.66 166 +636 2 10626 99537 1.9099 298.9099 150.4099 15040.99099 1.90991 298.9099 150.40991 15040.99115 1.90990 298.90990 150.40990 15040.99000 2020-01-01 2020-01-02 2020-01-01 00:10:36 2020-01-02 03:38:57 2020-01-01 00:10:36.000 2020-01-02 03:38:57.000 636 99537 50086.5 5008650 636 99537 50086.5 5008650 -32534 32604 4866.66 486666 -128 124 0.1 10 +637 2 10627 99538 1.91291 298.91291 150.41291 15041.29129 1.91291 298.9129 150.41291 15041.29131 1.91291 298.91291 150.41291 15041.29100 2020-01-01 2020-01-02 2020-01-01 00:10:37 2020-01-02 03:38:58 2020-01-01 00:10:37.000 2020-01-02 03:38:58.000 637 99538 50087.5 5008750 637 99538 50087.5 5008750 -32533 32605 4867.66 486766 -127 125 1.1 110 +638 2 10628 99539 1.91591 298.91591 150.41591 15041.59159 1.91591 298.91592 150.41591 15041.59143 1.91591 298.91591 150.41591 15041.59100 2020-01-01 2020-01-02 2020-01-01 00:10:38 2020-01-02 03:38:59 2020-01-01 00:10:38.000 2020-01-02 03:38:59.000 638 99539 50088.5 5008850 638 99539 50088.5 5008850 -32532 32606 4868.66 486866 -126 126 2.1 210 +639 2 10629 99540 1.91891 298.91891 150.41891 15041.89189 1.91891 298.9189 150.41891 15041.89172 1.91891 298.91891 150.41891 15041.89100 2020-01-01 2020-01-02 2020-01-01 00:10:39 2020-01-02 03:39:00 2020-01-01 00:10:39.000 2020-01-02 03:39:00.000 639 99540 50089.5 5008950 639 99540 50089.5 5008950 -32531 32607 4869.66 486966 -125 127 3.1 310 +64 2 10054 99964 0.19219 300.19219 150.19219 15169.41141 0.19219 300.1922 150.19219 15169.41184 0.19219 300.19219 150.19219 15169.41119 2020-01-01 2020-01-02 2020-01-01 00:01:04 2020-01-02 03:46:04 2020-01-01 00:01:04.000 2020-01-02 03:46:04.000 64 99964 50014 5051414 64 99964 50014 5051414 -32505 32430 4593.009900990099 463894 -125 126 0.21782178217821782 22 +640 2 10630 99541 1.92192 298.92192 150.42192 15042.19219 1.92192 298.92194 150.42192 15042.19232 1.92192 298.92192 150.42192 15042.19200 2020-01-01 2020-01-02 2020-01-01 00:10:40 2020-01-02 03:39:01 2020-01-01 00:10:40.000 2020-01-02 03:39:01.000 640 99541 50090.5 5009050 640 99541 50090.5 5009050 -32530 32608 4870.66 487066 -128 127 1.54 154 +641 2 10631 99542 1.92492 298.92492 150.42492 15042.49249 1.92492 298.92493 150.42492 15042.49265 1.92492 298.92492 150.42492 15042.49200 2020-01-01 2020-01-02 2020-01-01 00:10:41 2020-01-02 03:39:02 2020-01-01 00:10:41.000 2020-01-02 03:39:02.000 641 99542 50091.5 5009150 641 99542 50091.5 5009150 -32529 32609 4871.66 487166 -128 127 -0.02 -2 +642 2 10632 99543 1.92792 298.92792 150.42792 15042.79279 1.92792 298.92792 150.42792 15042.79278 1.92792 298.92792 150.42792 15042.79200 2020-01-01 2020-01-02 2020-01-01 00:10:42 2020-01-02 03:39:03 2020-01-01 00:10:42.000 2020-01-02 03:39:03.000 642 99543 50092.5 5009250 642 99543 50092.5 5009250 -32528 32610 4872.66 487266 -128 123 -1.58 -158 +643 2 10633 99544 1.93093 298.93093 150.43093 15043.09309 1.93093 298.93094 150.43092 15043.0929 1.93093 298.93093 150.43093 15043.09300 2020-01-01 2020-01-02 2020-01-01 00:10:43 2020-01-02 03:39:04 2020-01-01 00:10:43.000 2020-01-02 03:39:04.000 643 99544 50093.5 5009350 643 99544 50093.5 5009350 -32527 32611 4873.66 487366 -127 124 -0.58 -58 +644 2 10634 99545 1.93393 298.93393 150.43393 15043.39339 1.93393 298.93393 150.43393 15043.39319 1.93393 298.93393 150.43393 15043.39300 2020-01-01 2020-01-02 2020-01-01 00:10:44 2020-01-02 03:39:05 2020-01-01 00:10:44.000 2020-01-02 03:39:05.000 644 99545 50094.5 5009450 644 99545 50094.5 5009450 -32526 32612 4874.66 487466 -126 125 0.42 42 +645 2 10635 99546 1.93693 298.93693 150.43693 15043.69369 1.93693 298.93695 150.43693 15043.69379 1.93693 298.93693 150.43693 15043.69300 2020-01-01 2020-01-02 2020-01-01 00:10:45 2020-01-02 03:39:06 2020-01-01 00:10:45.000 2020-01-02 03:39:06.000 645 99546 50095.5 5009550 645 99546 50095.5 5009550 -32525 32613 4875.66 487566 -125 126 1.42 142 +646 2 10636 99547 1.93993 298.93993 150.43993 15043.99399 1.93994 298.93994 150.43994 15043.99412 1.93993 298.93993 150.43993 15043.99300 2020-01-01 2020-01-02 2020-01-01 00:10:46 2020-01-02 03:39:07 2020-01-01 00:10:46.000 2020-01-02 03:39:07.000 646 99547 50096.5 5009650 646 99547 50096.5 5009650 -32524 32614 4876.66 487666 -124 127 2.42 242 +647 2 10637 99548 1.94294 298.94294 150.44294 15044.29429 1.94294 298.94293 150.44294 15044.29425 1.94294 298.94294 150.44294 15044.29400 2020-01-01 2020-01-02 2020-01-01 00:10:47 2020-01-02 03:39:08 2020-01-01 00:10:47.000 2020-01-02 03:39:08.000 647 99548 50097.5 5009750 647 99548 50097.5 5009750 -32523 32615 4877.66 487766 -128 127 0.86 86 +648 2 10638 99549 1.94594 298.94594 150.44594 15044.59459 1.94594 298.94595 150.44595 15044.595 1.94594 298.94594 150.44594 15044.59400 2020-01-01 2020-01-02 2020-01-01 00:10:48 2020-01-02 03:39:09 2020-01-01 00:10:48.000 2020-01-02 03:39:09.000 648 99549 50098.5 5009850 648 99549 50098.5 5009850 -32522 32616 4878.66 487866 -128 123 -0.7 -70 +649 2 10639 99550 1.94894 298.94894 150.44894 15044.89489 1.94894 298.94894 150.44894 15044.89467 1.94894 298.94894 150.44894 15044.89400 2020-01-01 2020-01-02 2020-01-01 00:10:49 2020-01-02 03:39:10 2020-01-01 00:10:49.000 2020-01-02 03:39:10.000 649 99550 50099.5 5009950 649 99550 50099.5 5009950 -32521 32617 4879.66 487966 -127 124 0.3 30 +65 2 10055 99965 0.19519 300.19519 150.19519 15169.71471 0.19519 300.1952 150.19519 15169.71448 0.19519 300.19519 150.19519 15169.71419 2020-01-01 2020-01-02 2020-01-01 00:01:05 2020-01-02 03:46:05 2020-01-01 00:01:05.000 2020-01-02 03:46:05.000 65 99965 50015 5051515 65 99965 50015 5051515 -32504 32431 4594.009900990099 463995 -124 127 1.2178217821782178 123 +650 2 10640 99551 1.95195 298.95195 150.45195 15045.19519 1.95195 298.95197 150.45195 15045.19525 1.95195 298.95195 150.45195 15045.19500 2020-01-01 2020-01-02 2020-01-01 00:10:50 2020-01-02 03:39:11 2020-01-01 00:10:50.000 2020-01-02 03:39:11.000 650 99551 50100.5 5010050 650 99551 50100.5 5010050 -32520 32618 4880.66 488066 -126 125 1.3 130 +651 2 10641 99552 1.95495 298.95495 150.45495 15045.49549 1.95495 298.95496 150.45495 15045.49558 1.95495 298.95495 150.45495 15045.49500 2020-01-01 2020-01-02 2020-01-01 00:10:51 2020-01-02 03:39:12 2020-01-01 00:10:51.000 2020-01-02 03:39:12.000 651 99552 50101.5 5010150 651 99552 50101.5 5010150 -32519 32619 4881.66 488166 -125 126 2.3 230 +652 2 10642 99553 1.95795 298.95795 150.45795 15045.79579 1.95795 298.95795 150.45795 15045.79572 1.95795 298.95795 150.45795 15045.79500 2020-01-01 2020-01-02 2020-01-01 00:10:52 2020-01-02 03:39:13 2020-01-01 00:10:52.000 2020-01-02 03:39:13.000 652 99553 50102.5 5010250 652 99553 50102.5 5010250 -32518 32620 4882.66 488266 -124 127 3.3 330 +653 2 10643 99554 1.96096 298.96096 150.46096 15046.09609 1.96096 298.96097 150.46096 15046.09647 1.96096 298.96096 150.46096 15046.09600 2020-01-01 2020-01-02 2020-01-01 00:10:53 2020-01-02 03:39:14 2020-01-01 00:10:53.000 2020-01-02 03:39:14.000 653 99554 50103.5 5010350 653 99554 50103.5 5010350 -32517 32621 4883.66 488366 -128 127 1.74 174 +654 2 10644 99555 1.96396 298.96396 150.46396 15046.39639 1.96396 298.96396 150.46396 15046.39613 1.96396 298.96396 150.46396 15046.39600 2020-01-01 2020-01-02 2020-01-01 00:10:54 2020-01-02 03:39:15 2020-01-01 00:10:54.000 2020-01-02 03:39:15.000 654 99555 50104.5 5010450 654 99555 50104.5 5010450 -32516 32622 4884.66 488466 -128 123 0.18 18 +655 2 10645 99556 1.96696 298.96696 150.46696 15046.69669 1.96696 298.96698 150.46696 15046.69676 1.96696 298.96696 150.46696 15046.69600 2020-01-01 2020-01-02 2020-01-01 00:10:55 2020-01-02 03:39:16 2020-01-01 00:10:55.000 2020-01-02 03:39:16.000 655 99556 50105.5 5010550 655 99556 50105.5 5010550 -32515 32623 4885.66 488566 -127 124 1.18 118 +656 2 10646 99557 1.96996 298.96996 150.46996 15046.99699 1.96997 298.96997 150.46997 15046.99706 1.96996 298.96996 150.46996 15046.99600 2020-01-01 2020-01-02 2020-01-01 00:10:56 2020-01-02 03:39:17 2020-01-01 00:10:56.000 2020-01-02 03:39:17.000 656 99557 50106.5 5010650 656 99557 50106.5 5010650 -32514 32624 4886.66 488666 -126 125 2.18 218 +657 2 10647 99558 1.97297 298.97297 150.47297 15047.29729 1.97297 298.97296 150.47297 15047.29735 1.97297 298.97297 150.47297 15047.29700 2020-01-01 2020-01-02 2020-01-01 00:10:57 2020-01-02 03:39:18 2020-01-01 00:10:57.000 2020-01-02 03:39:18.000 657 99558 50107.5 5010750 657 99558 50107.5 5010750 -32513 32625 4887.66 488766 -125 126 3.18 318 +658 2 10648 99559 1.97597 298.97597 150.47597 15047.59759 1.97597 298.97598 150.47597 15047.59794 1.97597 298.97597 150.47597 15047.59700 2020-01-01 2020-01-02 2020-01-01 00:10:58 2020-01-02 03:39:19 2020-01-01 00:10:58.000 2020-01-02 03:39:19.000 658 99559 50108.5 5010850 658 99559 50108.5 5010850 -32512 32626 4888.66 488866 -124 127 4.18 418 +659 2 10649 99560 1.97897 298.97897 150.47897 15047.89789 1.97897 298.97897 150.47897 15047.8976 1.97897 298.97897 150.47897 15047.89700 2020-01-01 2020-01-02 2020-01-01 00:10:59 2020-01-02 03:39:20 2020-01-01 00:10:59.000 2020-01-02 03:39:20.000 659 99560 50109.5 5010950 659 99560 50109.5 5010950 -32511 32627 4889.66 488966 -128 127 2.62 262 +66 2 10056 99966 0.19819 300.19819 150.19819 15170.01801 0.19819 300.1982 150.19819 15170.01808 0.19819 300.19819 150.19819 15170.01719 2020-01-01 2020-01-02 2020-01-01 00:01:06 2020-01-02 03:46:06 2020-01-01 00:01:06.000 2020-01-02 03:46:06.000 66 99966 50016 5051616 66 99966 50016 5051616 -32503 32432 4595.009900990099 464096 -128 127 -0.31683168316831684 -32 +660 2 10650 99561 1.98198 298.98198 150.48198 15048.19819 1.98198 298.982 150.48198 15048.19822 1.98198 298.98198 150.48198 15048.19800 2020-01-01 2020-01-02 2020-01-01 00:11:00 2020-01-02 03:39:21 2020-01-01 00:11:00.000 2020-01-02 03:39:21.000 660 99561 50110.5 5011050 660 99561 50110.5 5011050 -32510 32628 4890.66 489066 -128 127 1.06 106 +661 2 10651 99562 1.98498 298.98498 150.48498 15048.49849 1.98498 298.985 150.48498 15048.49853 1.98498 298.98498 150.48498 15048.49800 2020-01-01 2020-01-02 2020-01-01 00:11:01 2020-01-02 03:39:22 2020-01-01 00:11:01.000 2020-01-02 03:39:22.000 661 99562 50111.5 5011150 661 99562 50111.5 5011150 -32509 32629 4891.66 489166 -128 124 -0.5 -50 +662 2 10652 99563 1.98798 298.98798 150.48798 15048.79879 1.98798 298.98798 150.48798 15048.79882 1.98798 298.98798 150.48798 15048.79800 2020-01-01 2020-01-02 2020-01-01 00:11:02 2020-01-02 03:39:23 2020-01-01 00:11:02.000 2020-01-02 03:39:23.000 662 99563 50112.5 5011250 662 99563 50112.5 5011250 -32508 32630 4892.66 489266 -127 125 0.5 50 +663 2 10653 99564 1.99099 298.99099 150.49099 15049.09909 1.99099 298.991 150.49099 15049.09942 1.99099 298.99099 150.49099 15049.09900 2020-01-01 2020-01-02 2020-01-01 00:11:03 2020-01-02 03:39:24 2020-01-01 00:11:03.000 2020-01-02 03:39:24.000 663 99564 50113.5 5011350 663 99564 50113.5 5011350 -32507 32631 4893.66 489366 -126 126 1.5 150 +664 2 10654 99565 1.99399 298.99399 150.49399 15049.39939 1.99399 298.994 150.49399 15049.39911 1.99399 298.99399 150.49399 15049.39900 2020-01-01 2020-01-02 2020-01-01 00:11:04 2020-01-02 03:39:25 2020-01-01 00:11:04.000 2020-01-02 03:39:25.000 664 99565 50114.5 5011450 664 99565 50114.5 5011450 -32506 32632 4894.66 489466 -125 127 2.5 250 +665 2 10655 99566 1.99699 298.99699 150.49699 15049.69969 1.99699 298.997 150.49699 15049.6997 1.99699 298.99699 150.49699 15049.69900 2020-01-01 2020-01-02 2020-01-01 00:11:05 2020-01-02 03:39:26 2020-01-01 00:11:05.000 2020-01-02 03:39:26.000 665 99566 50115.5 5011550 665 99566 50115.5 5011550 -32505 32633 4895.66 489566 -128 127 0.94 94 +666 2 10656 99567 2 299 150.5 15050 2 299 150.5 15050 2.00000 299.00000 150.50000 15050.00000 2020-01-01 2020-01-02 2020-01-01 00:11:06 2020-01-02 03:39:27 2020-01-01 00:11:06.000 2020-01-02 03:39:27.000 666 99567 50116.5 5011650 666 99567 50116.5 5011650 -32504 32634 4896.66 489666 -128 127 -0.62 -62 +667 2 10657 99568 2.003 299.003 150.503 15050.3003 2.003 299.003 150.503 15050.30029 2.00300 299.00300 150.50300 15050.30000 2020-01-01 2020-01-02 2020-01-01 00:11:07 2020-01-02 03:39:28 2020-01-01 00:11:07.000 2020-01-02 03:39:28.000 667 99568 50117.5 5011750 667 99568 50117.5 5011750 -32503 32635 4897.66 489766 -128 123 -2.18 -218 +668 2 10658 99569 2.006 299.006 150.506 15050.6006 2.006 299.006 150.506 15050.60089 2.00600 299.00600 150.50600 15050.60000 2020-01-01 2020-01-02 2020-01-01 00:11:08 2020-01-02 03:39:29 2020-01-01 00:11:08.000 2020-01-02 03:39:29.000 668 99569 50118.5 5011850 668 99569 50118.5 5011850 -32502 32636 4898.66 489866 -127 124 -1.18 -118 +669 2 10659 99570 2.009 299.009 150.509 15050.9009 2.009 299.009 150.509 15050.90057 2.00900 299.00900 150.50900 15050.90000 2020-01-01 2020-01-02 2020-01-01 00:11:09 2020-01-02 03:39:30 2020-01-01 00:11:09.000 2020-01-02 03:39:30.000 669 99570 50119.5 5011950 669 99570 50119.5 5011950 -32501 32637 4899.66 489966 -126 125 -0.18 -18 +67 2 10057 99967 0.2012 300.2012 150.2012 15170.32132 0.2012 300.2012 150.2012 15170.32142 0.20120 300.20120 150.20120 15170.32120 2020-01-01 2020-01-02 2020-01-01 00:01:07 2020-01-02 03:46:07 2020-01-01 00:01:07.000 2020-01-02 03:46:07.000 67 99967 50017 5051717 67 99967 50017 5051717 -32502 32433 4596.009900990099 464197 -128 127 -1.8514851485148516 -187 +670 2 10660 99571 2.01201 299.01201 150.51201 15051.2012 2.01201 299.01202 150.51201 15051.20117 2.01201 299.01201 150.51201 15051.20100 2020-01-01 2020-01-02 2020-01-01 00:11:10 2020-01-02 03:39:31 2020-01-01 00:11:10.000 2020-01-02 03:39:31.000 670 99571 50120.5 5012050 670 99571 50120.5 5012050 -32500 32638 4900.66 490066 -125 126 0.82 82 +671 2 10661 99572 2.01501 299.01501 150.51501 15051.5015 2.01501 299.015 150.51501 15051.50146 2.01501 299.01501 150.51501 15051.50100 2020-01-01 2020-01-02 2020-01-01 00:11:11 2020-01-02 03:39:32 2020-01-01 00:11:11.000 2020-01-02 03:39:32.000 671 99572 50121.5 5012150 671 99572 50121.5 5012150 -32499 32639 4901.66 490166 -124 127 1.82 182 +672 2 10662 99573 2.01801 299.01801 150.51801 15051.8018 2.01801 299.018 150.51801 15051.80176 2.01801 299.01801 150.51801 15051.80100 2020-01-01 2020-01-02 2020-01-01 00:11:12 2020-01-02 03:39:33 2020-01-01 00:11:12.000 2020-01-02 03:39:33.000 672 99573 50122.5 5012250 672 99573 50122.5 5012250 -32498 32640 4902.66 490266 -128 127 0.26 26 +673 2 10663 99574 2.02102 299.02102 150.52102 15052.1021 2.02102 299.02103 150.52102 15052.1024 2.02102 299.02102 150.52102 15052.10200 2020-01-01 2020-01-02 2020-01-01 00:11:13 2020-01-02 03:39:34 2020-01-01 00:11:13.000 2020-01-02 03:39:34.000 673 99574 50123.5 5012350 673 99574 50123.5 5012350 -32497 32641 4903.66 490366 -128 123 -1.3 -130 +674 2 10664 99575 2.02402 299.02402 150.52402 15052.4024 2.02402 299.02402 150.52402 15052.40204 2.02402 299.02402 150.52402 15052.40200 2020-01-01 2020-01-02 2020-01-01 00:11:14 2020-01-02 03:39:35 2020-01-01 00:11:14.000 2020-01-02 03:39:35.000 674 99575 50124.5 5012450 674 99575 50124.5 5012450 -32496 32642 4904.66 490466 -127 124 -0.3 -30 +675 2 10665 99576 2.02702 299.02702 150.52702 15052.7027 2.02702 299.02704 150.52702 15052.70264 2.02702 299.02702 150.52702 15052.70200 2020-01-01 2020-01-02 2020-01-01 00:11:15 2020-01-02 03:39:36 2020-01-01 00:11:15.000 2020-01-02 03:39:36.000 675 99576 50125.5 5012550 675 99576 50125.5 5012550 -32495 32643 4905.66 490566 -126 125 0.7 70 +676 2 10666 99577 2.03003 299.03003 150.53003 15053.003 2.03003 299.03003 150.53002 15053.00293 2.03003 299.03003 150.53003 15053.00300 2020-01-01 2020-01-02 2020-01-01 00:11:16 2020-01-02 03:39:37 2020-01-01 00:11:16.000 2020-01-02 03:39:37.000 676 99577 50126.5 5012650 676 99577 50126.5 5012650 -32494 32644 4906.66 490666 -125 126 1.7 170 +677 2 10667 99578 2.03303 299.03303 150.53303 15053.3033 2.03303 299.03302 150.53303 15053.30323 2.03303 299.03303 150.53303 15053.30300 2020-01-01 2020-01-02 2020-01-01 00:11:17 2020-01-02 03:39:38 2020-01-01 00:11:17.000 2020-01-02 03:39:38.000 677 99578 50127.5 5012750 677 99578 50127.5 5012750 -32493 32645 4907.66 490766 -124 127 2.7 270 +678 2 10668 99579 2.03603 299.03603 150.53603 15053.6036 2.03603 299.03604 150.53603 15053.60387 2.03603 299.03603 150.53603 15053.60300 2020-01-01 2020-01-02 2020-01-01 00:11:18 2020-01-02 03:39:39 2020-01-01 00:11:18.000 2020-01-02 03:39:39.000 678 99579 50128.5 5012850 678 99579 50128.5 5012850 -32492 32646 4908.66 490866 -128 127 1.14 114 +679 2 10669 99580 2.03903 299.03903 150.53903 15053.9039 2.03903 299.03903 150.53903 15053.90351 2.03903 299.03903 150.53903 15053.90300 2020-01-01 2020-01-02 2020-01-01 00:11:19 2020-01-02 03:39:40 2020-01-01 00:11:19.000 2020-01-02 03:39:40.000 679 99580 50129.5 5012950 679 99580 50129.5 5012950 -32491 32647 4909.66 490966 -128 123 -0.42 -42 +68 2 10058 99968 0.2042 300.2042 150.2042 15170.62462 0.2042 300.2042 150.2042 15170.62457 0.20420 300.20420 150.20420 15170.62420 2020-01-01 2020-01-02 2020-01-01 00:01:08 2020-01-02 03:46:08 2020-01-01 00:01:08.000 2020-01-02 03:46:08.000 68 99968 50018 5051818 68 99968 50018 5051818 -32501 32434 4597.009900990099 464298 -128 124 -3.386138613861386 -342 +680 2 10670 99581 2.04204 299.04204 150.54204 15054.2042 2.04204 299.04205 150.54204 15054.20426 2.04204 299.04204 150.54204 15054.20400 2020-01-01 2020-01-02 2020-01-01 00:11:20 2020-01-02 03:39:41 2020-01-01 00:11:20.000 2020-01-02 03:39:41.000 680 99581 50130.5 5013050 680 99581 50130.5 5013050 -32490 32648 4910.66 491066 -127 124 0.58 58 +681 2 10671 99582 2.04504 299.04504 150.54504 15054.5045 2.04504 299.04504 150.54504 15054.5044 2.04504 299.04504 150.54504 15054.50400 2020-01-01 2020-01-02 2020-01-01 00:11:21 2020-01-02 03:39:42 2020-01-01 00:11:21.000 2020-01-02 03:39:42.000 681 99582 50131.5 5013150 681 99582 50131.5 5013150 -32489 32649 4911.66 491166 -126 125 1.58 158 +682 2 10672 99583 2.04804 299.04804 150.54804 15054.8048 2.04804 299.04803 150.54804 15054.80474 2.04804 299.04804 150.54804 15054.80400 2020-01-01 2020-01-02 2020-01-01 00:11:22 2020-01-02 03:39:43 2020-01-01 00:11:22.000 2020-01-02 03:39:43.000 682 99583 50132.5 5013250 682 99583 50132.5 5013250 -32488 32650 4912.66 491266 -125 126 2.58 258 +683 2 10673 99584 2.05105 299.05105 150.55105 15055.1051 2.05105 299.05106 150.55105 15055.10533 2.05105 299.05105 150.55105 15055.10500 2020-01-01 2020-01-02 2020-01-01 00:11:23 2020-01-02 03:39:44 2020-01-01 00:11:23.000 2020-01-02 03:39:44.000 683 99584 50133.5 5013350 683 99584 50133.5 5013350 -32487 32651 4913.66 491366 -124 127 3.58 358 +684 2 10674 99585 2.05405 299.05405 150.55405 15055.4054 2.05405 299.05405 150.55404 15055.40498 2.05405 299.05405 150.55405 15055.40500 2020-01-01 2020-01-02 2020-01-01 00:11:24 2020-01-02 03:39:45 2020-01-01 00:11:24.000 2020-01-02 03:39:45.000 684 99585 50134.5 5013450 684 99585 50134.5 5013450 -32486 32652 4914.66 491466 -128 127 2.02 202 +685 2 10675 99586 2.05705 299.05705 150.55705 15055.7057 2.05705 299.05707 150.55705 15055.70573 2.05705 299.05705 150.55705 15055.70500 2020-01-01 2020-01-02 2020-01-01 00:11:25 2020-01-02 03:39:46 2020-01-01 00:11:25.000 2020-01-02 03:39:46.000 685 99586 50135.5 5013550 685 99586 50135.5 5013550 -32485 32653 4915.66 491566 -128 127 0.46 46 +686 2 10676 99587 2.06006 299.06006 150.56006 15056.006 2.06006 299.06006 150.56005 15056.00587 2.06006 299.06006 150.56006 15056.00600 2020-01-01 2020-01-02 2020-01-01 00:11:26 2020-01-02 03:39:47 2020-01-01 00:11:26.000 2020-01-02 03:39:47.000 686 99587 50136.5 5013650 686 99587 50136.5 5013650 -32484 32654 4916.66 491666 -128 124 -1.1 -110 +687 2 10677 99588 2.06306 299.06306 150.56306 15056.3063 2.06306 299.06305 150.56306 15056.30621 2.06306 299.06306 150.56306 15056.30600 2020-01-01 2020-01-02 2020-01-01 00:11:27 2020-01-02 03:39:48 2020-01-01 00:11:27.000 2020-01-02 03:39:48.000 687 99588 50137.5 5013750 687 99588 50137.5 5013750 -32483 32655 4917.66 491766 -127 125 -0.1 -10 +688 2 10678 99589 2.06606 299.06606 150.56606 15056.6066 2.06606 299.06607 150.56606 15056.60681 2.06606 299.06606 150.56606 15056.60600 2020-01-01 2020-01-02 2020-01-01 00:11:28 2020-01-02 03:39:49 2020-01-01 00:11:28.000 2020-01-02 03:39:49.000 688 99589 50138.5 5013850 688 99589 50138.5 5013850 -32482 32656 4918.66 491866 -126 126 0.9 90 +689 2 10679 99590 2.06906 299.06906 150.56906 15056.9069 2.06906 299.06906 150.56907 15056.9071 2.06906 299.06906 150.56906 15056.90600 2020-01-01 2020-01-02 2020-01-01 00:11:29 2020-01-02 03:39:50 2020-01-01 00:11:29.000 2020-01-02 03:39:50.000 689 99590 50139.5 5013950 689 99590 50139.5 5013950 -32481 32657 4919.66 491966 -125 127 1.9 190 +69 2 10059 99969 0.2072 300.2072 150.2072 15170.92792 0.2072 300.2072 150.20721 15170.92832 0.20720 300.20720 150.20720 15170.92720 2020-01-01 2020-01-02 2020-01-01 00:01:09 2020-01-02 03:46:09 2020-01-01 00:01:09.000 2020-01-02 03:46:09.000 69 99969 50019 5051919 69 99969 50019 5051919 -32500 32435 4598.009900990099 464399 -127 125 -2.386138613861386 -241 +690 2 10680 99591 2.07207 299.07207 150.57207 15057.2072 2.07207 299.07208 150.57207 15057.2072 2.07207 299.07207 150.57207 15057.20700 2020-01-01 2020-01-02 2020-01-01 00:11:30 2020-01-02 03:39:51 2020-01-01 00:11:30.000 2020-01-02 03:39:51.000 690 99591 50140.5 5014050 690 99591 50140.5 5014050 -32480 32658 4920.66 492066 -128 127 0.34 34 +691 2 10681 99592 2.07507 299.07507 150.57507 15057.5075 2.07507 299.07507 150.57507 15057.50734 2.07507 299.07507 150.57507 15057.50700 2020-01-01 2020-01-02 2020-01-01 00:11:31 2020-01-02 03:39:52 2020-01-01 00:11:31.000 2020-01-02 03:39:52.000 691 99592 50141.5 5014150 691 99592 50141.5 5014150 -32479 32659 4921.66 492166 -128 127 -1.22 -122 +692 2 10682 99593 2.07807 299.07807 150.57807 15057.8078 2.07807 299.07806 150.57807 15057.80767 2.07807 299.07807 150.57807 15057.80700 2020-01-01 2020-01-02 2020-01-01 00:11:32 2020-01-02 03:39:53 2020-01-01 00:11:32.000 2020-01-02 03:39:53.000 692 99593 50142.5 5014250 692 99593 50142.5 5014250 -32478 32660 4922.66 492266 -128 123 -2.78 -278 +693 2 10683 99594 2.08108 299.08108 150.58108 15058.1081 2.08108 299.0811 150.58108 15058.10827 2.08108 299.08108 150.58108 15058.10800 2020-01-01 2020-01-02 2020-01-01 00:11:33 2020-01-02 03:39:54 2020-01-01 00:11:33.000 2020-01-02 03:39:54.000 693 99594 50143.5 5014350 693 99594 50143.5 5014350 -32477 32661 4923.66 492366 -127 124 -1.78 -178 +694 2 10684 99595 2.08408 299.08408 150.58408 15058.4084 2.08408 299.08408 150.58408 15058.40857 2.08408 299.08408 150.58408 15058.40800 2020-01-01 2020-01-02 2020-01-01 00:11:34 2020-01-02 03:39:55 2020-01-01 00:11:34.000 2020-01-02 03:39:55.000 694 99595 50144.5 5014450 694 99595 50144.5 5014450 -32476 32662 4924.66 492466 -126 125 -0.78 -78 +695 2 10685 99596 2.08708 299.08708 150.58708 15058.7087 2.08708 299.0871 150.58708 15058.70867 2.08708 299.08708 150.58708 15058.70800 2020-01-01 2020-01-02 2020-01-01 00:11:35 2020-01-02 03:39:56 2020-01-01 00:11:35.000 2020-01-02 03:39:56.000 695 99596 50145.5 5014550 695 99596 50145.5 5014550 -32475 32663 4925.66 492566 -125 126 0.22 22 +696 2 10686 99597 2.09009 299.09009 150.59009 15059.009 2.09009 299.0901 150.59008 15059.00885 2.09009 299.09009 150.59009 15059.00900 2020-01-01 2020-01-02 2020-01-01 00:11:36 2020-01-02 03:39:57 2020-01-01 00:11:36.000 2020-01-02 03:39:57.000 696 99597 50146.5 5014650 696 99597 50146.5 5014650 -32474 32664 4926.66 492666 -124 127 1.22 122 +697 2 10687 99598 2.09309 299.09309 150.59309 15059.3093 2.09309 299.09308 150.59309 15059.30915 2.09309 299.09309 150.59309 15059.30900 2020-01-01 2020-01-02 2020-01-01 00:11:37 2020-01-02 03:39:58 2020-01-01 00:11:37.000 2020-01-02 03:39:58.000 697 99598 50147.5 5014750 697 99598 50147.5 5014750 -32473 32665 4927.66 492766 -128 127 -0.34 -34 +698 2 10688 99599 2.09609 299.09609 150.59609 15059.6096 2.09609 299.0961 150.59609 15059.6099 2.09609 299.09609 150.59609 15059.60900 2020-01-01 2020-01-02 2020-01-01 00:11:38 2020-01-02 03:39:59 2020-01-01 00:11:38.000 2020-01-02 03:39:59.000 698 99599 50148.5 5014850 698 99599 50148.5 5014850 -32472 32666 4928.66 492866 -128 123 -1.9 -190 +699 2 10689 99600 2.09909 299.09909 150.59909 15059.9099 2.09909 299.0991 150.5991 15059.91003 2.09909 299.09909 150.59909 15059.90900 2020-01-01 2020-01-02 2020-01-01 00:11:39 2020-01-02 03:40:00 2020-01-01 00:11:39.000 2020-01-02 03:40:00.000 699 99600 50149.5 5014950 699 99600 50149.5 5014950 -32471 32667 4929.66 492966 -127 124 -0.9 -90 +7 2 1006 9997 0.02102 300.02102 150.02102 15152.12312 0.02102 300.02103 150.02102 15152.12342 0.02102 300.02102 150.02102 15152.12302 2020-01-01 2020-01-02 2020-01-01 00:00:07 2020-01-02 03:45:07 2020-01-01 00:00:07.000 2020-01-02 03:45:07.000 7 99907 49957 5045657 7 99907 49957 5045657 -32562 32373 4536.009900990099 458137 -126 125 -1.0198019801980198 -103 +70 2 10060 99970 0.21021 300.21021 150.21021 15171.23123 0.21021 300.2102 150.2102 15171.23097 0.21021 300.21021 150.21021 15171.23121 2020-01-01 2020-01-02 2020-01-01 00:01:10 2020-01-02 03:46:10 2020-01-01 00:01:10.000 2020-01-02 03:46:10.000 70 99970 50020 5052020 70 99970 50020 5052020 -32499 32436 4599.009900990099 464500 -126 126 -1.386138613861386 -140 +700 2 10690 99601 2.1021 299.1021 150.6021 15060.21021 2.1021 299.1021 150.6021 15060.21014 2.10210 299.10210 150.60210 15060.21000 2020-01-01 2020-01-02 2020-01-01 00:11:40 2020-01-02 03:40:01 2020-01-01 00:11:40.000 2020-01-02 03:40:01.000 700 99601 50150.5 5015050 700 99601 50150.5 5015050 -32470 32668 4930.66 493066 -126 125 0.1 10 +701 2 10691 99602 2.1051 299.1051 150.6051 15060.51051 2.1051 299.1051 150.6051 15060.51031 2.10510 299.10510 150.60510 15060.51000 2020-01-01 2020-01-02 2020-01-01 00:11:41 2020-01-02 03:40:02 2020-01-01 00:11:41.000 2020-01-02 03:40:02.000 701 99602 50151.5 5015150 701 99602 50151.5 5015150 -32469 32669 4931.66 493166 -125 126 1.1 110 +702 2 10692 99603 2.1081 299.1081 150.6081 15060.81081 2.1081 299.1081 150.6081 15060.81062 2.10810 299.10810 150.60810 15060.81000 2020-01-01 2020-01-02 2020-01-01 00:11:42 2020-01-02 03:40:03 2020-01-01 00:11:42.000 2020-01-02 03:40:03.000 702 99603 50152.5 5015250 702 99603 50152.5 5015250 -32468 32670 4932.66 493266 -124 127 2.1 210 +703 2 10693 99604 2.11111 299.11111 150.61111 15061.11111 2.11111 299.1111 150.61111 15061.11137 2.11111 299.11111 150.61111 15061.11100 2020-01-01 2020-01-02 2020-01-01 00:11:43 2020-01-02 03:40:04 2020-01-01 00:11:43.000 2020-01-02 03:40:04.000 703 99604 50153.5 5015350 703 99604 50153.5 5015350 -32467 32671 4933.66 493366 -128 127 0.54 54 +704 2 10694 99605 2.11411 299.11411 150.61411 15061.41141 2.11411 299.1141 150.61411 15061.41151 2.11411 299.11411 150.61411 15061.41100 2020-01-01 2020-01-02 2020-01-01 00:11:44 2020-01-02 03:40:05 2020-01-01 00:11:44.000 2020-01-02 03:40:05.000 704 99605 50154.5 5015450 704 99605 50154.5 5015450 -32466 32672 4934.66 493466 -128 123 -1.02 -102 +705 2 10695 99606 2.11711 299.11711 150.61711 15061.71171 2.11711 299.11713 150.61711 15061.71165 2.11711 299.11711 150.61711 15061.71100 2020-01-01 2020-01-02 2020-01-01 00:11:45 2020-01-02 03:40:06 2020-01-01 00:11:45.000 2020-01-02 03:40:06.000 705 99606 50155.5 5015550 705 99606 50155.5 5015550 -32465 32673 4935.66 493566 -127 124 -0.02 -2 +706 2 10696 99607 2.12012 299.12012 150.62012 15062.01201 2.12012 299.12012 150.62011 15062.01179 2.12012 299.12012 150.62012 15062.01200 2020-01-01 2020-01-02 2020-01-01 00:11:46 2020-01-02 03:40:07 2020-01-01 00:11:46.000 2020-01-02 03:40:07.000 706 99607 50156.5 5015650 706 99607 50156.5 5015650 -32464 32674 4936.66 493666 -126 125 0.98 98 +707 2 10697 99608 2.12312 299.12312 150.62312 15062.31231 2.12312 299.1231 150.62312 15062.31208 2.12312 299.12312 150.62312 15062.31200 2020-01-01 2020-01-02 2020-01-01 00:11:47 2020-01-02 03:40:08 2020-01-01 00:11:47.000 2020-01-02 03:40:08.000 707 99608 50157.5 5015750 707 99608 50157.5 5015750 -32463 32675 4937.66 493766 -125 126 1.98 198 +708 2 10698 99609 2.12612 299.12612 150.62612 15062.61261 2.12612 299.12613 150.62612 15062.61283 2.12612 299.12612 150.62612 15062.61200 2020-01-01 2020-01-02 2020-01-01 00:11:48 2020-01-02 03:40:09 2020-01-01 00:11:48.000 2020-01-02 03:40:09.000 708 99609 50158.5 5015850 708 99609 50158.5 5015850 -32462 32676 4938.66 493866 -124 127 2.98 298 +709 2 10699 99610 2.12912 299.12912 150.62912 15062.91291 2.12912 299.12912 150.62912 15062.91298 2.12912 299.12912 150.62912 15062.91200 2020-01-01 2020-01-02 2020-01-01 00:11:49 2020-01-02 03:40:10 2020-01-01 00:11:49.000 2020-01-02 03:40:10.000 709 99610 50159.5 5015950 709 99610 50159.5 5015950 -32461 32677 4939.66 493966 -128 127 1.42 142 +71 2 10061 99971 0.21321 300.21321 150.21321 15171.53453 0.21321 300.21323 150.21321 15171.5346 0.21321 300.21321 150.21321 15171.53421 2020-01-01 2020-01-02 2020-01-01 00:01:11 2020-01-02 03:46:11 2020-01-01 00:01:11.000 2020-01-02 03:46:11.000 71 99971 50021 5052121 71 99971 50021 5052121 -32498 32437 4600.009900990099 464601 -125 127 -0.38613861386138615 -39 +710 2 10700 99611 2.13213 299.13213 150.63213 15063.21321 2.13213 299.13214 150.63213 15063.21311 2.13213 299.13213 150.63213 15063.21300 2020-01-01 2020-01-02 2020-01-01 00:11:50 2020-01-02 03:40:11 2020-01-01 00:11:50.000 2020-01-02 03:40:11.000 710 99611 50160.5 5016050 710 99611 50160.5 5016050 -32460 32678 4940.66 494066 -128 127 -0.14 -14 +711 2 10701 99612 2.13513 299.13513 150.63513 15063.51351 2.13513 299.13513 150.63513 15063.51325 2.13513 299.13513 150.63513 15063.51300 2020-01-01 2020-01-02 2020-01-01 00:11:51 2020-01-02 03:40:12 2020-01-01 00:11:51.000 2020-01-02 03:40:12.000 711 99612 50161.5 5016150 711 99612 50161.5 5016150 -32459 32679 4941.66 494166 -128 124 -1.7 -170 +712 2 10702 99613 2.13813 299.13813 150.63813 15063.81381 2.13813 299.13815 150.63814 15063.81401 2.13813 299.13813 150.63813 15063.81300 2020-01-01 2020-01-02 2020-01-01 00:11:52 2020-01-02 03:40:13 2020-01-01 00:11:52.000 2020-01-02 03:40:13.000 712 99613 50162.5 5016250 712 99613 50162.5 5016250 -32458 32680 4942.66 494266 -127 125 -0.7 -70 +713 2 10703 99614 2.14114 299.14114 150.64114 15064.11411 2.14114 299.14114 150.64114 15064.11431 2.14114 299.14114 150.64114 15064.11400 2020-01-01 2020-01-02 2020-01-01 00:11:53 2020-01-02 03:40:14 2020-01-01 00:11:53.000 2020-01-02 03:40:14.000 713 99614 50163.5 5016350 713 99614 50163.5 5016350 -32457 32681 4943.66 494366 -126 126 0.3 30 +714 2 10704 99615 2.14414 299.14414 150.64414 15064.41441 2.14414 299.14413 150.64414 15064.41448 2.14414 299.14414 150.64414 15064.41400 2020-01-01 2020-01-02 2020-01-01 00:11:54 2020-01-02 03:40:15 2020-01-01 00:11:54.000 2020-01-02 03:40:15.000 714 99615 50164.5 5016450 714 99615 50164.5 5016450 -32456 32682 4944.66 494466 -125 127 1.3 130 +715 2 10705 99616 2.14714 299.14714 150.64714 15064.71471 2.14714 299.14716 150.64714 15064.71458 2.14714 299.14714 150.64714 15064.71400 2020-01-01 2020-01-02 2020-01-01 00:11:55 2020-01-02 03:40:16 2020-01-01 00:11:55.000 2020-01-02 03:40:16.000 715 99616 50165.5 5016550 715 99616 50165.5 5016550 -32455 32683 4945.66 494566 -128 127 -0.26 -26 +716 2 10706 99617 2.15015 299.15015 150.65015 15065.01501 2.15015 299.15015 150.65014 15065.01472 2.15015 299.15015 150.65015 15065.01500 2020-01-01 2020-01-02 2020-01-01 00:11:56 2020-01-02 03:40:17 2020-01-01 00:11:56.000 2020-01-02 03:40:17.000 716 99617 50166.5 5016650 716 99617 50166.5 5016650 -32454 32684 4946.66 494666 -128 127 -1.82 -182 +717 2 10707 99618 2.15315 299.15315 150.65315 15065.31531 2.15315 299.15317 150.65315 15065.31547 2.15315 299.15315 150.65315 15065.31500 2020-01-01 2020-01-02 2020-01-01 00:11:57 2020-01-02 03:40:18 2020-01-01 00:11:57.000 2020-01-02 03:40:18.000 717 99618 50167.5 5016750 717 99618 50167.5 5016750 -32453 32685 4947.66 494766 -128 123 -3.38 -338 +718 2 10708 99619 2.15615 299.15615 150.65615 15065.61561 2.15615 299.15616 150.65615 15065.61578 2.15615 299.15615 150.65615 15065.61500 2020-01-01 2020-01-02 2020-01-01 00:11:58 2020-01-02 03:40:19 2020-01-01 00:11:58.000 2020-01-02 03:40:19.000 718 99619 50168.5 5016850 718 99619 50168.5 5016850 -32452 32686 4948.66 494866 -127 124 -2.38 -238 +719 2 10709 99620 2.15915 299.15915 150.65915 15065.91591 2.15915 299.15915 150.65915 15065.91595 2.15915 299.15915 150.65915 15065.91500 2020-01-01 2020-01-02 2020-01-01 00:11:59 2020-01-02 03:40:20 2020-01-01 00:11:59.000 2020-01-02 03:40:20.000 719 99620 50169.5 5016950 719 99620 50169.5 5016950 -32451 32687 4949.66 494966 -126 125 -1.38 -138 +72 2 10062 99972 0.21621 300.21621 150.21621 15171.83783 0.21621 300.21622 150.21621 15171.83791 0.21621 300.21621 150.21621 15171.83721 2020-01-01 2020-01-02 2020-01-01 00:01:12 2020-01-02 03:46:12 2020-01-01 00:01:12.000 2020-01-02 03:46:12.000 72 99972 50022 5052222 72 99972 50022 5052222 -32497 32438 4601.009900990099 464702 -128 127 -1.9207920792079207 -194 +720 2 10710 99621 2.16216 299.16216 150.66216 15066.21621 2.16216 299.16217 150.66216 15066.21606 2.16216 299.16216 150.66216 15066.21600 2020-01-01 2020-01-02 2020-01-01 00:12:00 2020-01-02 03:40:21 2020-01-01 00:12:00.000 2020-01-02 03:40:21.000 720 99621 50170.5 5017050 720 99621 50170.5 5017050 -32450 32688 4950.66 495066 -125 126 -0.38 -38 +721 2 10711 99622 2.16516 299.16516 150.66516 15066.51651 2.16516 299.16516 150.66516 15066.51635 2.16516 299.16516 150.66516 15066.51600 2020-01-01 2020-01-02 2020-01-01 00:12:01 2020-01-02 03:40:22 2020-01-01 00:12:01.000 2020-01-02 03:40:22.000 721 99622 50171.5 5017150 721 99622 50171.5 5017150 -32449 32689 4951.66 495166 -124 127 0.62 62 +722 2 10712 99623 2.16816 299.16816 150.66816 15066.81681 2.16816 299.16818 150.66816 15066.81695 2.16816 299.16816 150.66816 15066.81600 2020-01-01 2020-01-02 2020-01-01 00:12:02 2020-01-02 03:40:23 2020-01-01 00:12:02.000 2020-01-02 03:40:23.000 722 99623 50172.5 5017250 722 99623 50172.5 5017250 -32448 32690 4952.66 495266 -128 127 -0.94 -94 +723 2 10713 99624 2.17117 299.17117 150.67117 15067.11711 2.17117 299.17117 150.67117 15067.11724 2.17117 299.17117 150.67117 15067.11700 2020-01-01 2020-01-02 2020-01-01 00:12:03 2020-01-02 03:40:24 2020-01-01 00:12:03.000 2020-01-02 03:40:24.000 723 99624 50173.5 5017350 723 99624 50173.5 5017350 -32447 32691 4953.66 495366 -128 123 -2.5 -250 +724 2 10714 99625 2.17417 299.17417 150.67417 15067.41741 2.17417 299.17416 150.67417 15067.41742 2.17417 299.17417 150.67417 15067.41700 2020-01-01 2020-01-02 2020-01-01 00:12:04 2020-01-02 03:40:25 2020-01-01 00:12:04.000 2020-01-02 03:40:25.000 724 99625 50174.5 5017450 724 99625 50174.5 5017450 -32446 32692 4954.66 495466 -127 124 -1.5 -150 +725 2 10715 99626 2.17717 299.17717 150.67717 15067.71771 2.17717 299.1772 150.67717 15067.71752 2.17717 299.17717 150.67717 15067.71700 2020-01-01 2020-01-02 2020-01-01 00:12:05 2020-01-02 03:40:26 2020-01-01 00:12:05.000 2020-01-02 03:40:26.000 725 99626 50175.5 5017550 725 99626 50175.5 5017550 -32445 32693 4955.66 495566 -126 125 -0.5 -50 +726 2 10716 99627 2.18018 299.18018 150.68018 15068.01801 2.18018 299.18018 150.68017 15068.01782 2.18018 299.18018 150.68018 15068.01800 2020-01-01 2020-01-02 2020-01-01 00:12:06 2020-01-02 03:40:27 2020-01-01 00:12:06.000 2020-01-02 03:40:27.000 726 99627 50176.5 5017650 726 99627 50176.5 5017650 -32444 32694 4956.66 495666 -125 126 0.5 50 +727 2 10717 99628 2.18318 299.18318 150.68318 15068.31831 2.18318 299.1832 150.68318 15068.31842 2.18318 299.18318 150.68318 15068.31800 2020-01-01 2020-01-02 2020-01-01 00:12:07 2020-01-02 03:40:28 2020-01-01 00:12:07.000 2020-01-02 03:40:28.000 727 99628 50177.5 5017750 727 99628 50177.5 5017750 -32443 32695 4957.66 495766 -124 127 1.5 150 +728 2 10718 99629 2.18618 299.18618 150.68618 15068.61861 2.18618 299.1862 150.68618 15068.61875 2.18618 299.18618 150.68618 15068.61800 2020-01-01 2020-01-02 2020-01-01 00:12:08 2020-01-02 03:40:29 2020-01-01 00:12:08.000 2020-01-02 03:40:29.000 728 99629 50178.5 5017850 728 99629 50178.5 5017850 -32442 32696 4958.66 495866 -128 127 -0.06 -6 +729 2 10719 99630 2.18918 299.18918 150.68918 15068.91891 2.18918 299.18918 150.68918 15068.91889 2.18918 299.18918 150.68918 15068.91800 2020-01-01 2020-01-02 2020-01-01 00:12:09 2020-01-02 03:40:30 2020-01-01 00:12:09.000 2020-01-02 03:40:30.000 729 99630 50179.5 5017950 729 99630 50179.5 5017950 -32441 32697 4959.66 495966 -128 123 -1.62 -162 +73 2 10063 99973 0.21921 300.21921 150.21921 15172.14114 0.21921 300.2192 150.21921 15172.14121 0.21921 300.21921 150.21921 15172.14021 2020-01-01 2020-01-02 2020-01-01 00:01:13 2020-01-02 03:46:13 2020-01-01 00:01:13.000 2020-01-02 03:46:13.000 73 99973 50023 5052323 73 99973 50023 5052323 -32496 32439 4602.009900990099 464803 -128 127 -3.4554455445544554 -349 +730 2 10720 99631 2.19219 299.19219 150.69219 15069.21921 2.19219 299.1922 150.69219 15069.21965 2.19219 299.19219 150.69219 15069.21900 2020-01-01 2020-01-02 2020-01-01 00:12:10 2020-01-02 03:40:31 2020-01-01 00:12:10.000 2020-01-02 03:40:31.000 730 99631 50180.5 5018050 730 99631 50180.5 5018050 -32440 32698 4960.66 496066 -127 124 -0.62 -62 +731 2 10721 99632 2.19519 299.19519 150.69519 15069.51951 2.19519 299.1952 150.69519 15069.51928 2.19519 299.19519 150.69519 15069.51900 2020-01-01 2020-01-02 2020-01-01 00:12:11 2020-01-02 03:40:32 2020-01-01 00:12:11.000 2020-01-02 03:40:32.000 731 99632 50181.5 5018150 731 99632 50181.5 5018150 -32439 32699 4961.66 496166 -126 125 0.38 38 +732 2 10722 99633 2.19819 299.19819 150.69819 15069.81981 2.19819 299.1982 150.69819 15069.81988 2.19819 299.19819 150.69819 15069.81900 2020-01-01 2020-01-02 2020-01-01 00:12:12 2020-01-02 03:40:33 2020-01-01 00:12:12.000 2020-01-02 03:40:33.000 732 99633 50182.5 5018250 732 99633 50182.5 5018250 -32438 32700 4962.66 496266 -125 126 1.38 138 +733 2 10723 99634 2.2012 299.2012 150.7012 15070.12012 2.2012 299.2012 150.7012 15070.12022 2.20120 299.20120 150.70120 15070.12000 2020-01-01 2020-01-02 2020-01-01 00:12:13 2020-01-02 03:40:34 2020-01-01 00:12:13.000 2020-01-02 03:40:34.000 733 99634 50183.5 5018350 733 99634 50183.5 5018350 -32437 32701 4963.66 496366 -124 127 2.38 238 +734 2 10724 99635 2.2042 299.2042 150.7042 15070.42042 2.2042 299.2042 150.7042 15070.42036 2.20420 299.20420 150.70420 15070.42000 2020-01-01 2020-01-02 2020-01-01 00:12:14 2020-01-02 03:40:35 2020-01-01 00:12:14.000 2020-01-02 03:40:35.000 734 99635 50184.5 5018450 734 99635 50184.5 5018450 -32436 32702 4964.66 496466 -128 127 0.82 82 +735 2 10725 99636 2.2072 299.2072 150.7072 15070.72072 2.2072 299.2072 150.70721 15070.72111 2.20720 299.20720 150.70720 15070.72000 2020-01-01 2020-01-02 2020-01-01 00:12:15 2020-01-02 03:40:36 2020-01-01 00:12:15.000 2020-01-02 03:40:36.000 735 99636 50185.5 5018550 735 99636 50185.5 5018550 -32435 32703 4965.66 496566 -128 127 -0.74 -74 +736 2 10726 99637 2.21021 299.21021 150.71021 15071.02102 2.21021 299.2102 150.7102 15071.02076 2.21021 299.21021 150.71021 15071.02100 2020-01-01 2020-01-02 2020-01-01 00:12:16 2020-01-02 03:40:37 2020-01-01 00:12:16.000 2020-01-02 03:40:37.000 736 99637 50186.5 5018650 736 99637 50186.5 5018650 -32434 32704 4966.66 496666 -128 124 -2.3 -230 +737 2 10727 99638 2.21321 299.21321 150.71321 15071.32132 2.21321 299.21323 150.71321 15071.32139 2.21321 299.21321 150.71321 15071.32100 2020-01-01 2020-01-02 2020-01-01 00:12:17 2020-01-02 03:40:38 2020-01-01 00:12:17.000 2020-01-02 03:40:38.000 737 99638 50187.5 5018750 737 99638 50187.5 5018750 -32433 32705 4967.66 496766 -127 125 -1.3 -130 +738 2 10728 99639 2.21621 299.21621 150.71621 15071.62162 2.21621 299.21622 150.71621 15071.62169 2.21621 299.21621 150.71621 15071.62100 2020-01-01 2020-01-02 2020-01-01 00:12:18 2020-01-02 03:40:39 2020-01-01 00:12:18.000 2020-01-02 03:40:39.000 738 99639 50188.5 5018850 738 99639 50188.5 5018850 -32432 32706 4968.66 496866 -126 126 -0.3 -30 +739 2 10729 99640 2.21921 299.21921 150.71921 15071.92192 2.21921 299.2192 150.71921 15071.92199 2.21921 299.21921 150.71921 15071.92100 2020-01-01 2020-01-02 2020-01-01 00:12:19 2020-01-02 03:40:40 2020-01-01 00:12:19.000 2020-01-02 03:40:40.000 739 99640 50189.5 5018950 739 99640 50189.5 5018950 -32431 32707 4969.66 496966 -125 127 0.7 70 +74 2 10064 99974 0.22222 300.22222 150.22222 15172.44444 0.22222 300.22223 150.22222 15172.4448 0.22222 300.22222 150.22222 15172.44422 2020-01-01 2020-01-02 2020-01-01 00:01:14 2020-01-02 03:46:14 2020-01-01 00:01:14.000 2020-01-02 03:46:14.000 74 99974 50024 5052424 74 99974 50024 5052424 -32495 32440 4603.009900990099 464904 -128 123 -4.99009900990099 -504 +740 2 10730 99641 2.22222 299.22222 150.72222 15072.22222 2.22222 299.22223 150.72222 15072.22258 2.22222 299.22222 150.72222 15072.22200 2020-01-01 2020-01-02 2020-01-01 00:12:20 2020-01-02 03:40:41 2020-01-01 00:12:20.000 2020-01-02 03:40:41.000 740 99641 50190.5 5019050 740 99641 50190.5 5019050 -32430 32708 4970.66 497066 -128 127 -0.86 -86 +741 2 10731 99642 2.22522 299.22522 150.72522 15072.52252 2.22522 299.22522 150.72522 15072.52223 2.22522 299.22522 150.72522 15072.52200 2020-01-01 2020-01-02 2020-01-01 00:12:21 2020-01-02 03:40:42 2020-01-01 00:12:21.000 2020-01-02 03:40:42.000 741 99642 50191.5 5019150 741 99642 50191.5 5019150 -32429 32709 4971.66 497166 -128 127 -2.42 -242 +742 2 10732 99643 2.22822 299.22822 150.72822 15072.82282 2.22822 299.22824 150.72822 15072.82286 2.22822 299.22822 150.72822 15072.82200 2020-01-01 2020-01-02 2020-01-01 00:12:22 2020-01-02 03:40:43 2020-01-01 00:12:22.000 2020-01-02 03:40:43.000 742 99643 50192.5 5019250 742 99643 50192.5 5019250 -32428 32710 4972.66 497266 -128 123 -3.98 -398 +743 2 10733 99644 2.23123 299.23123 150.73123 15073.12312 2.23123 299.23123 150.73123 15073.12316 2.23123 299.23123 150.73123 15073.12300 2020-01-01 2020-01-02 2020-01-01 00:12:23 2020-01-02 03:40:44 2020-01-01 00:12:23.000 2020-01-02 03:40:44.000 743 99644 50193.5 5019350 743 99644 50193.5 5019350 -32427 32711 4973.66 497366 -127 124 -2.98 -298 +744 2 10734 99645 2.23423 299.23423 150.73423 15073.42342 2.23423 299.23422 150.73423 15073.42345 2.23423 299.23423 150.73423 15073.42300 2020-01-01 2020-01-02 2020-01-01 00:12:24 2020-01-02 03:40:45 2020-01-01 00:12:24.000 2020-01-02 03:40:45.000 744 99645 50194.5 5019450 744 99645 50194.5 5019450 -32426 32712 4974.66 497466 -126 125 -1.98 -198 +745 2 10735 99646 2.23723 299.23723 150.73723 15073.72372 2.23723 299.23724 150.73724 15073.72405 2.23723 299.23723 150.73723 15073.72300 2020-01-01 2020-01-02 2020-01-01 00:12:25 2020-01-02 03:40:46 2020-01-01 00:12:25.000 2020-01-02 03:40:46.000 745 99646 50195.5 5019550 745 99646 50195.5 5019550 -32425 32713 4975.66 497566 -125 126 -0.98 -98 +746 2 10736 99647 2.24024 299.24024 150.74024 15074.02402 2.24024 299.24023 150.74023 15074.02373 2.24024 299.24024 150.74024 15074.02400 2020-01-01 2020-01-02 2020-01-01 00:12:26 2020-01-02 03:40:47 2020-01-01 00:12:26.000 2020-01-02 03:40:47.000 746 99647 50196.5 5019650 746 99647 50196.5 5019650 -32424 32714 4976.66 497666 -124 127 0.02 2 +747 2 10737 99648 2.24324 299.24324 150.74324 15074.32432 2.24324 299.24326 150.74324 15074.32433 2.24324 299.24324 150.74324 15074.32400 2020-01-01 2020-01-02 2020-01-01 00:12:27 2020-01-02 03:40:48 2020-01-01 00:12:27.000 2020-01-02 03:40:48.000 747 99648 50197.5 5019750 747 99648 50197.5 5019750 -32423 32715 4977.66 497766 -128 127 -1.54 -154 +748 2 10738 99649 2.24624 299.24624 150.74624 15074.62462 2.24624 299.24625 150.74624 15074.62463 2.24624 299.24624 150.74624 15074.62400 2020-01-01 2020-01-02 2020-01-01 00:12:28 2020-01-02 03:40:49 2020-01-01 00:12:28.000 2020-01-02 03:40:49.000 748 99649 50198.5 5019850 748 99649 50198.5 5019850 -32422 32716 4978.66 497866 -128 123 -3.1 -310 +749 2 10739 99650 2.24924 299.24924 150.74924 15074.92492 2.24924 299.24924 150.74924 15074.92492 2.24924 299.24924 150.74924 15074.92400 2020-01-01 2020-01-02 2020-01-01 00:12:29 2020-01-02 03:40:50 2020-01-01 00:12:29.000 2020-01-02 03:40:50.000 749 99650 50199.5 5019950 749 99650 50199.5 5019950 -32421 32717 4979.66 497966 -127 124 -2.1 -210 +75 2 10065 99975 0.22522 300.22522 150.22522 15172.74774 0.22522 300.22522 150.22522 15172.74745 0.22522 300.22522 150.22522 15172.74722 2020-01-01 2020-01-02 2020-01-01 00:01:15 2020-01-02 03:46:15 2020-01-01 00:01:15.000 2020-01-02 03:46:15.000 75 99975 50025 5052525 75 99975 50025 5052525 -32494 32441 4604.009900990099 465005 -127 124 -3.99009900990099 -403 +750 2 10740 99651 2.25225 299.25225 150.75225 15075.22522 2.25225 299.25226 150.75225 15075.22552 2.25225 299.25225 150.75225 15075.22500 2020-01-01 2020-01-02 2020-01-01 00:12:30 2020-01-02 03:40:51 2020-01-01 00:12:30.000 2020-01-02 03:40:51.000 750 99651 50200.5 5020050 750 99651 50200.5 5020050 -32420 32718 4980.66 498066 -126 125 -1.1 -110 +751 2 10741 99652 2.25525 299.25525 150.75525 15075.52552 2.25525 299.25525 150.75525 15075.5252 2.25525 299.25525 150.75525 15075.52500 2020-01-01 2020-01-02 2020-01-01 00:12:31 2020-01-02 03:40:52 2020-01-01 00:12:31.000 2020-01-02 03:40:52.000 751 99652 50201.5 5020150 751 99652 50201.5 5020150 -32419 32719 4981.66 498166 -125 126 -0.1 -10 +752 2 10742 99653 2.25825 299.25825 150.75825 15075.82582 2.25825 299.25827 150.75825 15075.8258 2.25825 299.25825 150.75825 15075.82500 2020-01-01 2020-01-02 2020-01-01 00:12:32 2020-01-02 03:40:53 2020-01-01 00:12:32.000 2020-01-02 03:40:53.000 752 99653 50202.5 5020250 752 99653 50202.5 5020250 -32418 32720 4982.66 498266 -124 127 0.9 90 +753 2 10743 99654 2.26126 299.26126 150.76126 15076.12612 2.26126 299.26126 150.76126 15076.12609 2.26126 299.26126 150.76126 15076.12600 2020-01-01 2020-01-02 2020-01-01 00:12:33 2020-01-02 03:40:54 2020-01-01 00:12:33.000 2020-01-02 03:40:54.000 753 99654 50203.5 5020350 753 99654 50203.5 5020350 -32417 32721 4983.66 498366 -128 127 -0.66 -66 +754 2 10744 99655 2.26426 299.26426 150.76426 15076.42642 2.26426 299.26425 150.76426 15076.4264 2.26426 299.26426 150.76426 15076.42600 2020-01-01 2020-01-02 2020-01-01 00:12:34 2020-01-02 03:40:55 2020-01-01 00:12:34.000 2020-01-02 03:40:55.000 754 99655 50204.5 5020450 754 99655 50204.5 5020450 -32416 32722 4984.66 498466 -128 123 -2.22 -222 +755 2 10745 99656 2.26726 299.26726 150.76726 15076.72672 2.26726 299.26727 150.76727 15076.72703 2.26726 299.26726 150.76726 15076.72600 2020-01-01 2020-01-02 2020-01-01 00:12:35 2020-01-02 03:40:56 2020-01-01 00:12:35.000 2020-01-02 03:40:56.000 755 99656 50205.5 5020550 755 99656 50205.5 5020550 -32415 32723 4985.66 498566 -127 124 -1.22 -122 +756 2 10746 99657 2.27027 299.27027 150.77027 15077.02702 2.27027 299.27026 150.77026 15077.02667 2.27027 299.27027 150.77027 15077.02700 2020-01-01 2020-01-02 2020-01-01 00:12:36 2020-01-02 03:40:57 2020-01-01 00:12:36.000 2020-01-02 03:40:57.000 756 99657 50206.5 5020650 756 99657 50206.5 5020650 -32414 32724 4986.66 498666 -126 125 -0.22 -22 +757 2 10747 99658 2.27327 299.27327 150.77327 15077.32732 2.27327 299.2733 150.77327 15077.32727 2.27327 299.27327 150.77327 15077.32700 2020-01-01 2020-01-02 2020-01-01 00:12:37 2020-01-02 03:40:58 2020-01-01 00:12:37.000 2020-01-02 03:40:58.000 757 99658 50207.5 5020750 757 99658 50207.5 5020750 -32413 32725 4987.66 498766 -125 126 0.78 78 +758 2 10748 99659 2.27627 299.27627 150.77627 15077.62762 2.27627 299.27628 150.77627 15077.62756 2.27627 299.27627 150.77627 15077.62700 2020-01-01 2020-01-02 2020-01-01 00:12:38 2020-01-02 03:40:59 2020-01-01 00:12:38.000 2020-01-02 03:40:59.000 758 99659 50208.5 5020850 758 99659 50208.5 5020850 -32412 32726 4988.66 498866 -124 127 1.78 178 +759 2 10749 99660 2.27927 299.27927 150.77927 15077.92792 2.27927 299.27927 150.77927 15077.92787 2.27927 299.27927 150.77927 15077.92700 2020-01-01 2020-01-02 2020-01-01 00:12:39 2020-01-02 03:41:00 2020-01-01 00:12:39.000 2020-01-02 03:41:00.000 759 99660 50209.5 5020950 759 99660 50209.5 5020950 -32411 32727 4989.66 498966 -128 127 0.22 22 +76 2 10066 99976 0.22822 300.22822 150.22822 15173.05105 0.22822 300.22824 150.22822 15173.05109 0.22822 300.22822 150.22822 15173.05022 2020-01-01 2020-01-02 2020-01-01 00:01:16 2020-01-02 03:46:16 2020-01-01 00:01:16.000 2020-01-02 03:46:16.000 76 99976 50026 5052626 76 99976 50026 5052626 -32493 32442 4605.009900990099 465106 -126 125 -2.99009900990099 -302 +760 2 10750 99661 2.28228 299.28228 150.78228 15078.22822 2.28228 299.2823 150.78228 15078.2285 2.28228 299.28228 150.78228 15078.22800 2020-01-01 2020-01-02 2020-01-01 00:12:40 2020-01-02 03:41:01 2020-01-01 00:12:40.000 2020-01-02 03:41:01.000 760 99661 50210.5 5021050 760 99661 50210.5 5021050 -32410 32728 4990.66 499066 -128 127 -1.34 -134 +761 2 10751 99662 2.28528 299.28528 150.78528 15078.52852 2.28528 299.28528 150.78528 15078.52814 2.28528 299.28528 150.78528 15078.52800 2020-01-01 2020-01-02 2020-01-01 00:12:41 2020-01-02 03:41:02 2020-01-01 00:12:41.000 2020-01-02 03:41:02.000 761 99662 50211.5 5021150 761 99662 50211.5 5021150 -32409 32729 4991.66 499166 -128 124 -2.9 -290 +762 2 10752 99663 2.28828 299.28828 150.78828 15078.82882 2.28828 299.2883 150.78828 15078.82889 2.28828 299.28828 150.78828 15078.82800 2020-01-01 2020-01-02 2020-01-01 00:12:42 2020-01-02 03:41:03 2020-01-01 00:12:42.000 2020-01-02 03:41:03.000 762 99663 50212.5 5021250 762 99663 50212.5 5021250 -32408 32730 4992.66 499266 -127 125 -1.9 -190 +763 2 10753 99664 2.29129 299.29129 150.79129 15079.12912 2.29129 299.2913 150.79129 15079.12904 2.29129 299.29129 150.79129 15079.12900 2020-01-01 2020-01-02 2020-01-01 00:12:43 2020-01-02 03:41:04 2020-01-01 00:12:43.000 2020-01-02 03:41:04.000 763 99664 50213.5 5021350 763 99664 50213.5 5021350 -32407 32731 4993.66 499366 -126 126 -0.9 -90 +764 2 10754 99665 2.29429 299.29429 150.79429 15079.42942 2.29429 299.29428 150.79429 15079.42933 2.29429 299.29429 150.79429 15079.42900 2020-01-01 2020-01-02 2020-01-01 00:12:44 2020-01-02 03:41:05 2020-01-01 00:12:44.000 2020-01-02 03:41:05.000 764 99665 50214.5 5021450 764 99665 50214.5 5021450 -32406 32732 4994.66 499466 -125 127 0.1 10 +765 2 10755 99666 2.29729 299.29729 150.79729 15079.72972 2.29729 299.2973 150.79729 15079.72996 2.29729 299.29729 150.79729 15079.72900 2020-01-01 2020-01-02 2020-01-01 00:12:45 2020-01-02 03:41:06 2020-01-01 00:12:45.000 2020-01-02 03:41:06.000 765 99666 50215.5 5021550 765 99666 50215.5 5021550 -32405 32733 4995.66 499566 -128 127 -1.46 -146 +766 2 10756 99667 2.3003 299.3003 150.8003 15080.03003 2.3003 299.3003 150.80029 15080.02961 2.30030 299.30030 150.80030 15080.03000 2020-01-01 2020-01-02 2020-01-01 00:12:46 2020-01-02 03:41:07 2020-01-01 00:12:46.000 2020-01-02 03:41:07.000 766 99667 50216.5 5021650 766 99667 50216.5 5021650 -32404 32734 4996.66 499666 -128 127 -3.02 -302 +767 2 10757 99668 2.3033 299.3033 150.8033 15080.33033 2.3033 299.3033 150.8033 15080.33036 2.30330 299.30330 150.80330 15080.33000 2020-01-01 2020-01-02 2020-01-01 00:12:47 2020-01-02 03:41:08 2020-01-01 00:12:47.000 2020-01-02 03:41:08.000 767 99668 50217.5 5021750 767 99668 50217.5 5021750 -32403 32735 4997.66 499766 -128 123 -4.58 -458 +768 2 10758 99669 2.3063 299.3063 150.8063 15080.63063 2.3063 299.3063 150.8063 15080.6305 2.30630 299.30630 150.80630 15080.63000 2020-01-01 2020-01-02 2020-01-01 00:12:48 2020-01-02 03:41:09 2020-01-01 00:12:48.000 2020-01-02 03:41:09.000 768 99669 50218.5 5021850 768 99669 50218.5 5021850 -32402 32736 4998.66 499866 -127 124 -3.58 -358 +769 2 10759 99670 2.3093 299.3093 150.8093 15080.93093 2.3093 299.3093 150.8093 15080.93084 2.30930 299.30930 150.80930 15080.93000 2020-01-01 2020-01-02 2020-01-01 00:12:49 2020-01-02 03:41:10 2020-01-01 00:12:49.000 2020-01-02 03:41:10.000 769 99670 50219.5 5021950 769 99670 50219.5 5021950 -32401 32737 4999.66 499966 -126 125 -2.58 -258 +77 2 10067 99977 0.23123 300.23123 150.23123 15173.35435 0.23123 300.23123 150.23123 15173.35439 0.23123 300.23123 150.23123 15173.35423 2020-01-01 2020-01-02 2020-01-01 00:01:17 2020-01-02 03:46:17 2020-01-01 00:01:17.000 2020-01-02 03:46:17.000 77 99977 50027 5052727 77 99977 50027 5052727 -32492 32443 4606.009900990099 465207 -125 126 -1.99009900990099 -201 +770 2 10760 99671 2.31231 299.31231 150.81231 15081.23123 2.31231 299.31232 150.81231 15081.23144 2.31231 299.31231 150.81231 15081.23100 2020-01-01 2020-01-02 2020-01-01 00:12:50 2020-01-02 03:41:11 2020-01-01 00:12:50.000 2020-01-02 03:41:11.000 770 99671 50220.5 5022050 770 99671 50220.5 5022050 -32400 32738 5000.66 500066 -125 126 -1.58 -158 +771 2 10761 99672 2.31531 299.31531 150.81531 15081.53153 2.31531 299.3153 150.81531 15081.53173 2.31531 299.31531 150.81531 15081.53100 2020-01-01 2020-01-02 2020-01-01 00:12:51 2020-01-02 03:41:12 2020-01-01 00:12:51.000 2020-01-02 03:41:12.000 771 99672 50221.5 5022150 771 99672 50221.5 5022150 -32399 32739 5001.66 500166 -124 127 -0.58 -58 +772 2 10762 99673 2.31831 299.31831 150.81831 15081.83183 2.31831 299.31833 150.81831 15081.83183 2.31831 299.31831 150.81831 15081.83100 2020-01-01 2020-01-02 2020-01-01 00:12:52 2020-01-02 03:41:13 2020-01-01 00:12:52.000 2020-01-02 03:41:13.000 772 99673 50222.5 5022250 772 99673 50222.5 5022250 -32398 32740 5002.66 500266 -128 127 -2.14 -214 +773 2 10763 99674 2.32132 299.32132 150.82132 15082.13213 2.32132 299.32132 150.82131 15082.13197 2.32132 299.32132 150.82132 15082.13200 2020-01-01 2020-01-02 2020-01-01 00:12:53 2020-01-02 03:41:14 2020-01-01 00:12:53.000 2020-01-02 03:41:14.000 773 99674 50223.5 5022350 773 99674 50223.5 5022350 -32397 32741 5003.66 500366 -128 123 -3.7 -370 +774 2 10764 99675 2.32432 299.32432 150.82432 15082.43243 2.32432 299.3243 150.82432 15082.43231 2.32432 299.32432 150.82432 15082.43200 2020-01-01 2020-01-02 2020-01-01 00:12:54 2020-01-02 03:41:15 2020-01-01 00:12:54.000 2020-01-02 03:41:15.000 774 99675 50224.5 5022450 774 99675 50224.5 5022450 -32396 32742 5004.66 500466 -127 124 -2.7 -270 +775 2 10765 99676 2.32732 299.32732 150.82732 15082.73273 2.32732 299.32733 150.82732 15082.73291 2.32732 299.32732 150.82732 15082.73200 2020-01-01 2020-01-02 2020-01-01 00:12:55 2020-01-02 03:41:16 2020-01-01 00:12:55.000 2020-01-02 03:41:16.000 775 99676 50225.5 5022550 775 99676 50225.5 5022550 -32395 32743 5005.66 500566 -126 125 -1.7 -170 +776 2 10766 99677 2.33033 299.33033 150.83033 15083.03303 2.33033 299.33032 150.83033 15083.0332 2.33033 299.33033 150.83033 15083.03300 2020-01-01 2020-01-02 2020-01-01 00:12:56 2020-01-02 03:41:17 2020-01-01 00:12:56.000 2020-01-02 03:41:17.000 776 99677 50226.5 5022650 776 99677 50226.5 5022650 -32394 32744 5006.66 500666 -125 126 -0.7 -70 +777 2 10767 99678 2.33333 299.33333 150.83333 15083.33333 2.33333 299.33334 150.83333 15083.3333 2.33333 299.33333 150.83333 15083.33300 2020-01-01 2020-01-02 2020-01-01 00:12:57 2020-01-02 03:41:18 2020-01-01 00:12:57.000 2020-01-02 03:41:18.000 777 99678 50227.5 5022750 777 99678 50227.5 5022750 -32393 32745 5007.66 500766 -124 127 0.3 30 +778 2 10768 99679 2.33633 299.33633 150.83633 15083.63363 2.33633 299.33633 150.83633 15083.63348 2.33633 299.33633 150.83633 15083.63300 2020-01-01 2020-01-02 2020-01-01 00:12:58 2020-01-02 03:41:19 2020-01-01 00:12:58.000 2020-01-02 03:41:19.000 778 99679 50228.5 5022850 778 99679 50228.5 5022850 -32392 32746 5008.66 500866 -128 127 -1.26 -126 +779 2 10769 99680 2.33933 299.33933 150.83933 15083.93393 2.33933 299.33932 150.83933 15083.93378 2.33933 299.33933 150.83933 15083.93300 2020-01-01 2020-01-02 2020-01-01 00:12:59 2020-01-02 03:41:20 2020-01-01 00:12:59.000 2020-01-02 03:41:20.000 779 99680 50229.5 5022950 779 99680 50229.5 5022950 -32391 32747 5009.66 500966 -128 123 -2.82 -282 +78 2 10068 99978 0.23423 300.23423 150.23423 15173.65765 0.23423 300.23422 150.23423 15173.65769 0.23423 300.23423 150.23423 15173.65723 2020-01-01 2020-01-02 2020-01-01 00:01:18 2020-01-02 03:46:18 2020-01-01 00:01:18.000 2020-01-02 03:46:18.000 78 99978 50028 5052828 78 99978 50028 5052828 -32491 32444 4607.009900990099 465308 -124 127 -0.9900990099009901 -100 +780 2 10770 99681 2.34234 299.34234 150.84234 15084.23423 2.34234 299.34235 150.84234 15084.23437 2.34234 299.34234 150.84234 15084.23400 2020-01-01 2020-01-02 2020-01-01 00:13:00 2020-01-02 03:41:21 2020-01-01 00:13:00.000 2020-01-02 03:41:21.000 780 99681 50230.5 5023050 780 99681 50230.5 5023050 -32390 32748 5010.66 501066 -127 124 -1.82 -182 +781 2 10771 99682 2.34534 299.34534 150.84534 15084.53453 2.34534 299.34534 150.84534 15084.53467 2.34534 299.34534 150.84534 15084.53400 2020-01-01 2020-01-02 2020-01-01 00:13:01 2020-01-02 03:41:22 2020-01-01 00:13:01.000 2020-01-02 03:41:22.000 781 99682 50231.5 5023150 781 99682 50231.5 5023150 -32389 32749 5011.66 501166 -126 125 -0.82 -82 +782 2 10772 99683 2.34834 299.34834 150.84834 15084.83483 2.34834 299.34836 150.84834 15084.83477 2.34834 299.34834 150.84834 15084.83400 2020-01-01 2020-01-02 2020-01-01 00:13:02 2020-01-02 03:41:23 2020-01-01 00:13:02.000 2020-01-02 03:41:23.000 782 99683 50232.5 5023250 782 99683 50232.5 5023250 -32388 32750 5012.66 501266 -125 126 0.18 18 +783 2 10773 99684 2.35135 299.35135 150.85135 15085.13513 2.35135 299.35135 150.85134 15085.13495 2.35135 299.35135 150.85135 15085.13500 2020-01-01 2020-01-02 2020-01-01 00:13:03 2020-01-02 03:41:24 2020-01-01 00:13:03.000 2020-01-02 03:41:24.000 783 99684 50233.5 5023350 783 99684 50233.5 5023350 -32387 32751 5013.66 501366 -124 127 1.18 118 +784 2 10774 99685 2.35435 299.35435 150.85435 15085.43543 2.35435 299.35434 150.85435 15085.43525 2.35435 299.35435 150.85435 15085.43500 2020-01-01 2020-01-02 2020-01-01 00:13:04 2020-01-02 03:41:25 2020-01-01 00:13:04.000 2020-01-02 03:41:25.000 784 99685 50234.5 5023450 784 99685 50234.5 5023450 -32386 32752 5014.66 501466 -128 127 -0.38 -38 +785 2 10775 99686 2.35735 299.35735 150.85735 15085.73573 2.35735 299.35736 150.85736 15085.736 2.35735 299.35735 150.85735 15085.73500 2020-01-01 2020-01-02 2020-01-01 00:13:05 2020-01-02 03:41:26 2020-01-01 00:13:05.000 2020-01-02 03:41:26.000 785 99686 50235.5 5023550 785 99686 50235.5 5023550 -32385 32753 5015.66 501566 -128 127 -1.94 -194 +786 2 10776 99687 2.36036 299.36036 150.86036 15086.03603 2.36036 299.36035 150.86036 15086.03614 2.36036 299.36036 150.86036 15086.03600 2020-01-01 2020-01-02 2020-01-01 00:13:06 2020-01-02 03:41:27 2020-01-01 00:13:06.000 2020-01-02 03:41:27.000 786 99687 50236.5 5023650 786 99687 50236.5 5023650 -32384 32754 5016.66 501666 -128 124 -3.5 -350 +787 2 10777 99688 2.36336 299.36336 150.86336 15086.33633 2.36336 299.36337 150.86336 15086.33628 2.36336 299.36336 150.86336 15086.33600 2020-01-01 2020-01-02 2020-01-01 00:13:07 2020-01-02 03:41:28 2020-01-01 00:13:07.000 2020-01-02 03:41:28.000 787 99688 50237.5 5023750 787 99688 50237.5 5023750 -32383 32755 5017.66 501766 -127 125 -2.5 -250 +788 2 10778 99689 2.36636 299.36636 150.86636 15086.63663 2.36636 299.36636 150.86636 15086.63641 2.36636 299.36636 150.86636 15086.63600 2020-01-01 2020-01-02 2020-01-01 00:13:08 2020-01-02 03:41:29 2020-01-01 00:13:08.000 2020-01-02 03:41:29.000 788 99689 50238.5 5023850 788 99689 50238.5 5023850 -32382 32756 5018.66 501866 -126 126 -1.5 -150 +789 2 10779 99690 2.36936 299.36936 150.86936 15086.93693 2.36936 299.36935 150.86936 15086.93672 2.36936 299.36936 150.86936 15086.93600 2020-01-01 2020-01-02 2020-01-01 00:13:09 2020-01-02 03:41:30 2020-01-01 00:13:09.000 2020-01-02 03:41:30.000 789 99690 50239.5 5023950 789 99690 50239.5 5023950 -32381 32757 5019.66 501966 -125 127 -0.5 -50 +79 2 10069 99979 0.23723 300.23723 150.23723 15173.96096 0.23723 300.23724 150.23724 15173.96129 0.23723 300.23723 150.23723 15173.96023 2020-01-01 2020-01-02 2020-01-01 00:01:19 2020-01-02 03:46:19 2020-01-01 00:01:19.000 2020-01-02 03:46:19.000 79 99979 50029 5052929 79 99979 50029 5052929 -32490 32445 4608.009900990099 465409 -128 127 -2.5247524752475248 -255 +790 2 10780 99691 2.37237 299.37237 150.87237 15087.23723 2.37237 299.37238 150.87237 15087.23747 2.37237 299.37237 150.87237 15087.23700 2020-01-01 2020-01-02 2020-01-01 00:13:10 2020-01-02 03:41:31 2020-01-01 00:13:10.000 2020-01-02 03:41:31.000 790 99691 50240.5 5024050 790 99691 50240.5 5024050 -32380 32758 5020.66 502066 -128 127 -2.06 -206 +791 2 10781 99692 2.37537 299.37537 150.87537 15087.53753 2.37537 299.37537 150.87537 15087.53761 2.37537 299.37537 150.87537 15087.53700 2020-01-01 2020-01-02 2020-01-01 00:13:11 2020-01-02 03:41:32 2020-01-01 00:13:11.000 2020-01-02 03:41:32.000 791 99692 50241.5 5024150 791 99692 50241.5 5024150 -32379 32759 5021.66 502166 -128 127 -3.62 -362 +792 2 10782 99693 2.37837 299.37837 150.87837 15087.83783 2.37837 299.3784 150.87837 15087.83775 2.37837 299.37837 150.87837 15087.83700 2020-01-01 2020-01-02 2020-01-01 00:13:12 2020-01-02 03:41:33 2020-01-01 00:13:12.000 2020-01-02 03:41:33.000 792 99693 50242.5 5024250 792 99693 50242.5 5024250 -32378 32760 5022.66 502266 -128 123 -5.18 -518 +793 2 10783 99694 2.38138 299.38138 150.88138 15088.13813 2.38138 299.38138 150.88137 15088.13789 2.38138 299.38138 150.88138 15088.13800 2020-01-01 2020-01-02 2020-01-01 00:13:13 2020-01-02 03:41:34 2020-01-01 00:13:13.000 2020-01-02 03:41:34.000 793 99694 50243.5 5024350 793 99694 50243.5 5024350 -32377 32761 5023.66 502366 -127 124 -4.18 -418 +794 2 10784 99695 2.38438 299.38438 150.88438 15088.43843 2.38438 299.3844 150.88438 15088.43864 2.38438 299.38438 150.88438 15088.43800 2020-01-01 2020-01-02 2020-01-01 00:13:14 2020-01-02 03:41:35 2020-01-01 00:13:14.000 2020-01-02 03:41:35.000 794 99695 50244.5 5024450 794 99695 50244.5 5024450 -32376 32762 5024.66 502466 -126 125 -3.18 -318 +795 2 10785 99696 2.38738 299.38738 150.88738 15088.73873 2.38738 299.3874 150.88738 15088.73894 2.38738 299.38738 150.88738 15088.73800 2020-01-01 2020-01-02 2020-01-01 00:13:15 2020-01-02 03:41:36 2020-01-01 00:13:15.000 2020-01-02 03:41:36.000 795 99696 50245.5 5024550 795 99696 50245.5 5024550 -32375 32763 5025.66 502566 -125 126 -2.18 -218 +796 2 10786 99697 2.39039 299.39039 150.89039 15089.03903 2.39039 299.39038 150.89039 15089.03908 2.39039 299.39039 150.89039 15089.03900 2020-01-01 2020-01-02 2020-01-01 00:13:16 2020-01-02 03:41:37 2020-01-01 00:13:16.000 2020-01-02 03:41:37.000 796 99697 50246.5 5024650 796 99697 50246.5 5024650 -32374 32764 5026.66 502666 -124 127 -1.18 -118 +797 2 10787 99698 2.39339 299.39339 150.89339 15089.33933 2.39339 299.3934 150.89339 15089.33921 2.39339 299.39339 150.89339 15089.33900 2020-01-01 2020-01-02 2020-01-01 00:13:17 2020-01-02 03:41:38 2020-01-01 00:13:17.000 2020-01-02 03:41:38.000 797 99698 50247.5 5024750 797 99698 50247.5 5024750 -32373 32765 5027.66 502766 -128 127 -2.74 -274 +798 2 10788 99699 2.39639 299.39639 150.89639 15089.63963 2.39639 299.3964 150.89639 15089.63936 2.39639 299.39639 150.89639 15089.63900 2020-01-01 2020-01-02 2020-01-01 00:13:18 2020-01-02 03:41:39 2020-01-01 00:13:18.000 2020-01-02 03:41:39.000 798 99699 50248.5 5024850 798 99699 50248.5 5024850 -32372 32766 5028.66 502866 -128 123 -4.3 -430 +799 2 10789 99700 2.39939 299.39939 150.89939 15089.93993 2.39939 299.3994 150.8994 15089.94011 2.39939 299.39939 150.89939 15089.93900 2020-01-01 2020-01-02 2020-01-01 00:13:19 2020-01-02 03:41:40 2020-01-01 00:13:19.000 2020-01-02 03:41:40.000 799 99700 50249.5 5024950 799 99700 50249.5 5024950 -32371 32767 5029.66 502966 -127 124 -3.3 -330 +8 2 1007 9998 0.02402 300.02402 150.02402 15152.42642 0.02402 300.02402 150.02402 15152.42607 0.02402 300.02402 150.02402 15152.42602 2020-01-01 2020-01-02 2020-01-01 00:00:08 2020-01-02 03:45:08 2020-01-01 00:00:08.000 2020-01-02 03:45:08.000 8 99908 49958 5045758 8 99908 49958 5045758 -32561 32374 4537.009900990099 458238 -125 126 -0.019801980198019802 -2 +80 2 10070 99980 0.24024 300.24024 150.24024 15174.26426 0.24024 300.24023 150.24023 15174.26397 0.24024 300.24024 150.24024 15174.26424 2020-01-01 2020-01-02 2020-01-01 00:01:20 2020-01-02 03:46:20 2020-01-01 00:01:20.000 2020-01-02 03:46:20.000 80 99980 50030 5053030 80 99980 50030 5053030 -32489 32446 4609.009900990099 465510 -128 123 -4.0594059405940595 -410 +800 2 10790 99701 2.4024 299.4024 150.9024 15090.24024 2.4024 299.4024 150.9024 15090.24041 2.40240 299.40240 150.90240 15090.24000 2020-01-01 2020-01-02 2020-01-01 00:13:20 2020-01-02 03:41:41 2020-01-01 00:13:20.000 2020-01-02 03:41:41.000 800 99701 50250.5 5025050 800 99701 50250.5 5025050 -32768 32167 4375.3 437530 -126 125 -2.3 -230 +801 2 10791 99702 2.4054 299.4054 150.9054 15090.54054 2.4054 299.4054 150.9054 15090.54058 2.40540 299.40540 150.90540 15090.54000 2020-01-01 2020-01-02 2020-01-01 00:13:21 2020-01-02 03:41:42 2020-01-01 00:13:21.000 2020-01-02 03:41:42.000 801 99702 50251.5 5025150 801 99702 50251.5 5025150 -32767 32168 4376.3 437630 -125 126 -1.3 -130 +802 2 10792 99703 2.4084 299.4084 150.9084 15090.84084 2.4084 299.40842 150.9084 15090.84069 2.40840 299.40840 150.90840 15090.84000 2020-01-01 2020-01-02 2020-01-01 00:13:22 2020-01-02 03:41:43 2020-01-01 00:13:22.000 2020-01-02 03:41:43.000 802 99703 50252.5 5025250 802 99703 50252.5 5025250 -32766 32169 4377.3 437730 -124 127 -0.3 -30 +803 2 10793 99704 2.41141 299.41141 150.91141 15091.14114 2.41141 299.4114 150.9114 15091.14098 2.41141 299.41141 150.91141 15091.14100 2020-01-01 2020-01-02 2020-01-01 00:13:23 2020-01-02 03:41:44 2020-01-01 00:13:23.000 2020-01-02 03:41:44.000 803 99704 50253.5 5025350 803 99704 50253.5 5025350 -32765 32170 4378.3 437830 -128 127 -1.86 -186 +804 2 10794 99705 2.41441 299.41441 150.91441 15091.44144 2.41441 299.41443 150.91441 15091.44158 2.41441 299.41441 150.91441 15091.44100 2020-01-01 2020-01-02 2020-01-01 00:13:24 2020-01-02 03:41:45 2020-01-01 00:13:24.000 2020-01-02 03:41:45.000 804 99705 50254.5 5025450 804 99705 50254.5 5025450 -32764 32171 4379.3 437930 -128 123 -3.42 -342 +805 2 10795 99706 2.41741 299.41741 150.91741 15091.74174 2.41741 299.41742 150.91741 15091.74188 2.41741 299.41741 150.91741 15091.74100 2020-01-01 2020-01-02 2020-01-01 00:13:25 2020-01-02 03:41:46 2020-01-01 00:13:25.000 2020-01-02 03:41:46.000 805 99706 50255.5 5025550 805 99706 50255.5 5025550 -32763 32172 4380.3 438030 -127 124 -2.42 -242 +806 2 10796 99707 2.42042 299.42042 150.92042 15092.04204 2.42042 299.4204 150.92042 15092.04205 2.42042 299.42042 150.92042 15092.04200 2020-01-01 2020-01-02 2020-01-01 00:13:26 2020-01-02 03:41:47 2020-01-01 00:13:26.000 2020-01-02 03:41:47.000 806 99707 50256.5 5025650 806 99707 50256.5 5025650 -32762 32173 4381.3 438130 -126 125 -1.42 -142 +807 2 10797 99708 2.42342 299.42342 150.92342 15092.34234 2.42342 299.42343 150.92342 15092.34216 2.42342 299.42342 150.92342 15092.34200 2020-01-01 2020-01-02 2020-01-01 00:13:27 2020-01-02 03:41:48 2020-01-01 00:13:27.000 2020-01-02 03:41:48.000 807 99708 50257.5 5025750 807 99708 50257.5 5025750 -32761 32174 4382.3 438230 -125 126 -0.42 -42 +808 2 10798 99709 2.42642 299.42642 150.92642 15092.64264 2.42642 299.42642 150.92642 15092.64245 2.42642 299.42642 150.92642 15092.64200 2020-01-01 2020-01-02 2020-01-01 00:13:28 2020-01-02 03:41:49 2020-01-01 00:13:28.000 2020-01-02 03:41:49.000 808 99709 50258.5 5025850 808 99709 50258.5 5025850 -32760 32175 4383.3 438330 -124 127 0.58 58 +809 2 10799 99710 2.42942 299.42942 150.92942 15092.94294 2.42942 299.42944 150.92943 15092.94305 2.42942 299.42942 150.92942 15092.94200 2020-01-01 2020-01-02 2020-01-01 00:13:29 2020-01-02 03:41:50 2020-01-01 00:13:29.000 2020-01-02 03:41:50.000 809 99710 50259.5 5025950 809 99710 50259.5 5025950 -32759 32176 4384.3 438430 -128 127 -0.98 -98 +81 2 10071 99981 0.24324 300.24324 150.24324 15174.56756 0.24324 300.24326 150.24324 15174.56758 0.24324 300.24324 150.24324 15174.56724 2020-01-01 2020-01-02 2020-01-01 00:01:21 2020-01-02 03:46:21 2020-01-01 00:01:21.000 2020-01-02 03:46:21.000 81 99981 50031 5053131 81 99981 50031 5053131 -32488 32447 4610.009900990099 465611 -127 124 -3.0594059405940595 -309 +810 2 10800 99711 2.43243 299.43243 150.93243 15093.24324 2.43243 299.43243 150.93243 15093.24338 2.43243 299.43243 150.93243 15093.24300 2020-01-01 2020-01-02 2020-01-01 00:13:30 2020-01-02 03:41:51 2020-01-01 00:13:30.000 2020-01-02 03:41:51.000 810 99711 50260.5 5026050 810 99711 50260.5 5026050 -32758 32177 4385.3 438530 -128 127 -2.54 -254 +811 2 10801 99712 2.43543 299.43543 150.93543 15093.54354 2.43543 299.43542 150.93543 15093.54353 2.43543 299.43543 150.93543 15093.54300 2020-01-01 2020-01-02 2020-01-01 00:13:31 2020-01-02 03:41:52 2020-01-01 00:13:31.000 2020-01-02 03:41:52.000 811 99712 50261.5 5026150 811 99712 50261.5 5026150 -32757 32178 4386.3 438630 -128 124 -4.1 -410 +812 2 10802 99713 2.43843 299.43843 150.93843 15093.84384 2.43843 299.43845 150.93844 15093.84428 2.43843 299.43843 150.93843 15093.84300 2020-01-01 2020-01-02 2020-01-01 00:13:32 2020-01-02 03:41:53 2020-01-01 00:13:32.000 2020-01-02 03:41:53.000 812 99713 50262.5 5026250 812 99713 50262.5 5026250 -32756 32179 4387.3 438730 -127 125 -3.1 -310 +813 2 10803 99714 2.44144 299.44144 150.94144 15094.14414 2.44144 299.44144 150.94143 15094.14392 2.44144 299.44144 150.94144 15094.14400 2020-01-01 2020-01-02 2020-01-01 00:13:33 2020-01-02 03:41:54 2020-01-01 00:13:33.000 2020-01-02 03:41:54.000 813 99714 50263.5 5026350 813 99714 50263.5 5026350 -32755 32180 4388.3 438830 -126 126 -2.1 -210 +814 2 10804 99715 2.44444 299.44444 150.94444 15094.44444 2.44444 299.44446 150.94444 15094.44452 2.44444 299.44444 150.94444 15094.44400 2020-01-01 2020-01-02 2020-01-01 00:13:34 2020-01-02 03:41:55 2020-01-01 00:13:34.000 2020-01-02 03:41:55.000 814 99715 50264.5 5026450 814 99715 50264.5 5026450 -32754 32181 4389.3 438930 -125 127 -1.1 -110 +815 2 10805 99716 2.44744 299.44744 150.94744 15094.74474 2.44744 299.44745 150.94744 15094.74485 2.44744 299.44744 150.94744 15094.74400 2020-01-01 2020-01-02 2020-01-01 00:13:35 2020-01-02 03:41:56 2020-01-01 00:13:35.000 2020-01-02 03:41:56.000 815 99716 50265.5 5026550 815 99716 50265.5 5026550 -32753 32182 4390.3 439030 -128 127 -2.66 -266 +816 2 10806 99717 2.45045 299.45045 150.95045 15095.04504 2.45045 299.45044 150.95045 15095.045 2.45045 299.45045 150.95045 15095.04500 2020-01-01 2020-01-02 2020-01-01 00:13:36 2020-01-02 03:41:57 2020-01-01 00:13:36.000 2020-01-02 03:41:57.000 816 99717 50266.5 5026650 816 99717 50266.5 5026650 -32752 32183 4391.3 439130 -128 127 -4.22 -422 +817 2 10807 99718 2.45345 299.45345 150.95345 15095.34534 2.45345 299.45346 150.95345 15095.34574 2.45345 299.45345 150.95345 15095.34500 2020-01-01 2020-01-02 2020-01-01 00:13:37 2020-01-02 03:41:58 2020-01-01 00:13:37.000 2020-01-02 03:41:58.000 817 99718 50267.5 5026750 817 99718 50267.5 5026750 -32751 32184 4392.3 439230 -128 123 -5.78 -578 +818 2 10808 99719 2.45645 299.45645 150.95645 15095.64564 2.45645 299.45645 150.95645 15095.64539 2.45645 299.45645 150.95645 15095.64500 2020-01-01 2020-01-02 2020-01-01 00:13:38 2020-01-02 03:41:59 2020-01-01 00:13:38.000 2020-01-02 03:41:59.000 818 99719 50268.5 5026850 818 99719 50268.5 5026850 -32750 32185 4393.3 439330 -127 124 -4.78 -478 +819 2 10809 99720 2.45945 299.45945 150.95945 15095.94594 2.45945 299.45947 150.95946 15095.94602 2.45945 299.45945 150.95945 15095.94500 2020-01-01 2020-01-02 2020-01-01 00:13:39 2020-01-02 03:42:00 2020-01-01 00:13:39.000 2020-01-02 03:42:00.000 819 99720 50269.5 5026950 819 99720 50269.5 5026950 -32749 32186 4394.3 439430 -126 125 -3.78 -378 +82 2 10072 99982 0.24624 300.24624 150.24624 15174.87087 0.24624 300.24625 150.24624 15174.87088 0.24624 300.24624 150.24624 15174.87024 2020-01-01 2020-01-02 2020-01-01 00:01:22 2020-01-02 03:46:22 2020-01-01 00:01:22.000 2020-01-02 03:46:22.000 82 99982 50032 5053232 82 99982 50032 5053232 -32487 32448 4611.009900990099 465712 -126 125 -2.0594059405940595 -208 +820 2 10810 99721 2.46246 299.46246 150.96246 15096.24624 2.46246 299.46246 150.96246 15096.24633 2.46246 299.46246 150.96246 15096.24600 2020-01-01 2020-01-02 2020-01-01 00:13:40 2020-01-02 03:42:01 2020-01-01 00:13:40.000 2020-01-02 03:42:01.000 820 99721 50270.5 5027050 820 99721 50270.5 5027050 -32748 32187 4395.3 439530 -125 126 -2.78 -278 +821 2 10811 99722 2.46546 299.46546 150.96546 15096.54654 2.46546 299.46545 150.96546 15096.54646 2.46546 299.46546 150.96546 15096.54600 2020-01-01 2020-01-02 2020-01-01 00:13:41 2020-01-02 03:42:02 2020-01-01 00:13:41.000 2020-01-02 03:42:02.000 821 99722 50271.5 5027150 821 99722 50271.5 5027150 -32747 32188 4396.3 439630 -124 127 -1.78 -178 +822 2 10812 99723 2.46846 299.46846 150.96846 15096.84684 2.46846 299.46848 150.96847 15096.84721 2.46846 299.46846 150.96846 15096.84600 2020-01-01 2020-01-02 2020-01-01 00:13:42 2020-01-02 03:42:03 2020-01-01 00:13:42.000 2020-01-02 03:42:03.000 822 99723 50272.5 5027250 822 99723 50272.5 5027250 -32746 32189 4397.3 439730 -128 127 -3.34 -334 +823 2 10813 99724 2.47147 299.47147 150.97147 15097.14714 2.47147 299.47147 150.97146 15097.14686 2.47147 299.47147 150.97147 15097.14700 2020-01-01 2020-01-02 2020-01-01 00:13:43 2020-01-02 03:42:04 2020-01-01 00:13:43.000 2020-01-02 03:42:04.000 823 99724 50273.5 5027350 823 99724 50273.5 5027350 -32745 32190 4398.3 439830 -128 123 -4.9 -490 +824 2 10814 99725 2.47447 299.47447 150.97447 15097.44744 2.47447 299.4745 150.97447 15097.44749 2.47447 299.47447 150.97447 15097.44700 2020-01-01 2020-01-02 2020-01-01 00:13:44 2020-01-02 03:42:05 2020-01-01 00:13:44.000 2020-01-02 03:42:05.000 824 99725 50274.5 5027450 824 99725 50274.5 5027450 -32744 32191 4399.3 439930 -127 124 -3.9 -390 +825 2 10815 99726 2.47747 299.47747 150.97747 15097.74774 2.47747 299.47748 150.97747 15097.74779 2.47747 299.47747 150.97747 15097.74700 2020-01-01 2020-01-02 2020-01-01 00:13:45 2020-01-02 03:42:06 2020-01-01 00:13:45.000 2020-01-02 03:42:06.000 825 99726 50275.5 5027550 825 99726 50275.5 5027550 -32743 32192 4400.3 440030 -126 125 -2.9 -290 +826 2 10816 99727 2.48048 299.48048 150.98048 15098.04804 2.48048 299.48047 150.98048 15098.04809 2.48048 299.48048 150.98048 15098.04800 2020-01-01 2020-01-02 2020-01-01 00:13:46 2020-01-02 03:42:07 2020-01-01 00:13:46.000 2020-01-02 03:42:07.000 826 99727 50276.5 5027650 826 99727 50276.5 5027650 -32742 32193 4401.3 440130 -125 126 -1.9 -190 +827 2 10817 99728 2.48348 299.48348 150.98348 15098.34834 2.48348 299.4835 150.98348 15098.34869 2.48348 299.48348 150.98348 15098.34800 2020-01-01 2020-01-02 2020-01-01 00:13:47 2020-01-02 03:42:08 2020-01-01 00:13:47.000 2020-01-02 03:42:08.000 827 99728 50277.5 5027750 827 99728 50277.5 5027750 -32741 32194 4402.3 440230 -124 127 -0.9 -90 +828 2 10818 99729 2.48648 299.48648 150.98648 15098.64864 2.48648 299.48648 150.98648 15098.64837 2.48648 299.48648 150.98648 15098.64800 2020-01-01 2020-01-02 2020-01-01 00:13:48 2020-01-02 03:42:09 2020-01-01 00:13:48.000 2020-01-02 03:42:09.000 828 99729 50278.5 5027850 828 99729 50278.5 5027850 -32740 32195 4403.3 440330 -128 127 -2.46 -246 +829 2 10819 99730 2.48948 299.48948 150.98948 15098.94894 2.48948 299.4895 150.98948 15098.94896 2.48948 299.48948 150.98948 15098.94800 2020-01-01 2020-01-02 2020-01-01 00:13:49 2020-01-02 03:42:10 2020-01-01 00:13:49.000 2020-01-02 03:42:10.000 829 99730 50279.5 5027950 829 99730 50279.5 5027950 -32739 32196 4404.3 440430 -128 123 -4.02 -402 +83 2 10073 99983 0.24924 300.24924 150.24924 15175.17417 0.24924 300.24924 150.24924 15175.17417 0.24924 300.24924 150.24924 15175.17324 2020-01-01 2020-01-02 2020-01-01 00:01:23 2020-01-02 03:46:23 2020-01-01 00:01:23.000 2020-01-02 03:46:23.000 83 99983 50033 5053333 83 99983 50033 5053333 -32486 32449 4612.009900990099 465813 -125 126 -1.0594059405940595 -107 +830 2 10820 99731 2.49249 299.49249 150.99249 15099.24924 2.49249 299.4925 150.99249 15099.24926 2.49249 299.49249 150.99249 15099.24900 2020-01-01 2020-01-02 2020-01-01 00:13:50 2020-01-02 03:42:11 2020-01-01 00:13:50.000 2020-01-02 03:42:11.000 830 99731 50280.5 5028050 830 99731 50280.5 5028050 -32738 32197 4405.3 440530 -127 124 -3.02 -302 +831 2 10821 99732 2.49549 299.49549 150.99549 15099.54954 2.49549 299.49548 150.99549 15099.54956 2.49549 299.49549 150.99549 15099.54900 2020-01-01 2020-01-02 2020-01-01 00:13:51 2020-01-02 03:42:12 2020-01-01 00:13:51.000 2020-01-02 03:42:12.000 831 99732 50281.5 5028150 831 99732 50281.5 5028150 -32737 32198 4406.3 440630 -126 125 -2.02 -202 +832 2 10822 99733 2.49849 299.49849 150.99849 15099.84984 2.49849 299.4985 150.9985 15099.85016 2.49849 299.49849 150.99849 15099.84900 2020-01-01 2020-01-02 2020-01-01 00:13:52 2020-01-02 03:42:13 2020-01-01 00:13:52.000 2020-01-02 03:42:13.000 832 99733 50282.5 5028250 832 99733 50282.5 5028250 -32736 32199 4407.3 440730 -125 126 -1.02 -102 +833 2 10823 99734 2.5015 299.5015 151.0015 15100.15015 2.5015 299.5015 151.00149 15100.14983 2.50150 299.50150 151.00150 15100.15000 2020-01-01 2020-01-02 2020-01-01 00:13:53 2020-01-02 03:42:14 2020-01-01 00:13:53.000 2020-01-02 03:42:14.000 833 99734 50283.5 5028350 833 99734 50283.5 5028350 -32735 32200 4408.3 440830 -124 127 -0.02 -2 +834 2 10824 99735 2.5045 299.5045 151.0045 15100.45045 2.5045 299.50452 151.0045 15100.45043 2.50450 299.50450 151.00450 15100.45000 2020-01-01 2020-01-02 2020-01-01 00:13:54 2020-01-02 03:42:15 2020-01-01 00:13:54.000 2020-01-02 03:42:15.000 834 99735 50284.5 5028450 834 99735 50284.5 5028450 -32734 32201 4409.3 440930 -128 127 -1.58 -158 +835 2 10825 99736 2.5075 299.5075 151.0075 15100.75075 2.5075 299.5075 151.0075 15100.75073 2.50750 299.50750 151.00750 15100.75000 2020-01-01 2020-01-02 2020-01-01 00:13:55 2020-01-02 03:42:16 2020-01-01 00:13:55.000 2020-01-02 03:42:16.000 835 99736 50285.5 5028550 835 99736 50285.5 5028550 -32733 32202 4410.3 441030 -128 123 -3.14 -314 +836 2 10826 99737 2.51051 299.51051 151.01051 15101.05105 2.51051 299.5105 151.01051 15101.05103 2.51051 299.51051 151.01051 15101.05100 2020-01-01 2020-01-02 2020-01-01 00:13:56 2020-01-02 03:42:17 2020-01-01 00:13:56.000 2020-01-02 03:42:17.000 836 99737 50286.5 5028650 836 99737 50286.5 5028650 -32732 32203 4411.3 441130 -127 124 -2.14 -214 +837 2 10827 99738 2.51351 299.51351 151.01351 15101.35135 2.51351 299.51352 151.01351 15101.35162 2.51351 299.51351 151.01351 15101.35100 2020-01-01 2020-01-02 2020-01-01 00:13:57 2020-01-02 03:42:18 2020-01-01 00:13:57.000 2020-01-02 03:42:18.000 837 99738 50287.5 5028750 837 99738 50287.5 5028750 -32731 32204 4412.3 441230 -126 125 -1.14 -114 +838 2 10828 99739 2.51651 299.51651 151.01651 15101.65165 2.51651 299.5165 151.01651 15101.6513 2.51651 299.51651 151.01651 15101.65100 2020-01-01 2020-01-02 2020-01-01 00:13:58 2020-01-02 03:42:19 2020-01-01 00:13:58.000 2020-01-02 03:42:19.000 838 99739 50288.5 5028850 838 99739 50288.5 5028850 -32730 32205 4413.3 441330 -125 126 -0.14 -14 +839 2 10829 99740 2.51951 299.51951 151.01951 15101.95195 2.51951 299.51953 151.01951 15101.9519 2.51951 299.51951 151.01951 15101.95100 2020-01-01 2020-01-02 2020-01-01 00:13:59 2020-01-02 03:42:20 2020-01-01 00:13:59.000 2020-01-02 03:42:20.000 839 99740 50289.5 5028950 839 99740 50289.5 5028950 -32729 32206 4414.3 441430 -124 127 0.86 86 +84 2 10074 99984 0.25225 300.25225 150.25225 15175.47747 0.25225 300.25226 150.25225 15175.47778 0.25225 300.25225 150.25225 15175.47725 2020-01-01 2020-01-02 2020-01-01 00:01:24 2020-01-02 03:46:24 2020-01-01 00:01:24.000 2020-01-02 03:46:24.000 84 99984 50034 5053434 84 99984 50034 5053434 -32485 32450 4613.009900990099 465914 -124 127 -0.0594059405940594 -6 +840 2 10830 99741 2.52252 299.52252 151.02252 15102.25225 2.52252 299.52252 151.02252 15102.2522 2.52252 299.52252 151.02252 15102.25200 2020-01-01 2020-01-02 2020-01-01 00:14:00 2020-01-02 03:42:21 2020-01-01 00:14:00.000 2020-01-02 03:42:21.000 840 99741 50290.5 5029050 840 99741 50290.5 5029050 -32728 32207 4415.3 441530 -128 127 -0.7 -70 +841 2 10831 99742 2.52552 299.52552 151.02552 15102.55255 2.52552 299.5255 151.02552 15102.5525 2.52552 299.52552 151.02552 15102.55200 2020-01-01 2020-01-02 2020-01-01 00:14:01 2020-01-02 03:42:22 2020-01-01 00:14:01.000 2020-01-02 03:42:22.000 841 99742 50291.5 5029150 841 99742 50291.5 5029150 -32727 32208 4416.3 441630 -128 127 -2.26 -226 +842 2 10832 99743 2.52852 299.52852 151.02852 15102.85285 2.52852 299.52853 151.02853 15102.85313 2.52852 299.52852 151.02852 15102.85200 2020-01-01 2020-01-02 2020-01-01 00:14:02 2020-01-02 03:42:23 2020-01-01 00:14:02.000 2020-01-02 03:42:23.000 842 99743 50292.5 5029250 842 99743 50292.5 5029250 -32726 32209 4417.3 441730 -128 123 -3.82 -382 +843 2 10833 99744 2.53153 299.53153 151.03153 15103.15315 2.53153 299.53152 151.03152 15103.15278 2.53153 299.53153 151.03153 15103.15300 2020-01-01 2020-01-02 2020-01-01 00:14:03 2020-01-02 03:42:24 2020-01-01 00:14:03.000 2020-01-02 03:42:24.000 843 99744 50293.5 5029350 843 99744 50293.5 5029350 -32725 32210 4418.3 441830 -127 124 -2.82 -282 +844 2 10834 99745 2.53453 299.53453 151.03453 15103.45345 2.53453 299.53455 151.03453 15103.45353 2.53453 299.53453 151.03453 15103.45300 2020-01-01 2020-01-02 2020-01-01 00:14:04 2020-01-02 03:42:25 2020-01-01 00:14:04.000 2020-01-02 03:42:25.000 844 99745 50294.5 5029450 844 99745 50294.5 5029450 -32724 32211 4419.3 441930 -126 125 -1.82 -182 +845 2 10835 99746 2.53753 299.53753 151.03753 15103.75375 2.53753 299.53754 151.03753 15103.75366 2.53753 299.53753 151.03753 15103.75300 2020-01-01 2020-01-02 2020-01-01 00:14:05 2020-01-02 03:42:26 2020-01-01 00:14:05.000 2020-01-02 03:42:26.000 845 99746 50295.5 5029550 845 99746 50295.5 5029550 -32723 32212 4420.3 442030 -125 126 -0.82 -82 +846 2 10836 99747 2.54054 299.54054 151.04054 15104.05405 2.54054 299.54053 151.04053 15104.05397 2.54054 299.54054 151.04054 15104.05400 2020-01-01 2020-01-02 2020-01-01 00:14:06 2020-01-02 03:42:27 2020-01-01 00:14:06.000 2020-01-02 03:42:27.000 846 99747 50296.5 5029650 846 99747 50296.5 5029650 -32722 32213 4421.3 442130 -124 127 0.18 18 +847 2 10837 99748 2.54354 299.54354 151.04354 15104.35435 2.54354 299.54355 151.04354 15104.3546 2.54354 299.54354 151.04354 15104.35400 2020-01-01 2020-01-02 2020-01-01 00:14:07 2020-01-02 03:42:28 2020-01-01 00:14:07.000 2020-01-02 03:42:28.000 847 99748 50297.5 5029750 847 99748 50297.5 5029750 -32721 32214 4422.3 442230 -128 127 -1.38 -138 +848 2 10838 99749 2.54654 299.54654 151.04654 15104.65465 2.54654 299.54654 151.04654 15104.65425 2.54654 299.54654 151.04654 15104.65400 2020-01-01 2020-01-02 2020-01-01 00:14:08 2020-01-02 03:42:29 2020-01-01 00:14:08.000 2020-01-02 03:42:29.000 848 99749 50298.5 5029850 848 99749 50298.5 5029850 -32720 32215 4423.3 442330 -128 123 -2.94 -294 +849 2 10839 99750 2.54954 299.54954 151.04954 15104.95495 2.54954 299.54956 151.04954 15104.95499 2.54954 299.54954 151.04954 15104.95400 2020-01-01 2020-01-02 2020-01-01 00:14:09 2020-01-02 03:42:30 2020-01-01 00:14:09.000 2020-01-02 03:42:30.000 849 99750 50299.5 5029950 849 99750 50299.5 5029950 -32719 32216 4424.3 442430 -127 124 -1.94 -194 +85 2 10075 99985 0.25525 300.25525 150.25525 15175.78078 0.25525 300.25525 150.25525 15175.78046 0.25525 300.25525 150.25525 15175.78025 2020-01-01 2020-01-02 2020-01-01 00:01:25 2020-01-02 03:46:25 2020-01-01 00:01:25.000 2020-01-02 03:46:25.000 85 99985 50035 5053535 85 99985 50035 5053535 -32484 32451 4614.009900990099 466015 -128 127 -1.5940594059405941 -161 +850 2 10840 99751 2.55255 299.55255 151.05255 15105.25525 2.55255 299.55255 151.05255 15105.25514 2.55255 299.55255 151.05255 15105.25500 2020-01-01 2020-01-02 2020-01-01 00:14:10 2020-01-02 03:42:31 2020-01-01 00:14:10.000 2020-01-02 03:42:31.000 850 99751 50300.5 5030050 850 99751 50300.5 5030050 -32718 32217 4425.3 442530 -126 125 -0.94 -94 +851 2 10841 99752 2.55555 299.55555 151.05555 15105.55555 2.55555 299.55554 151.05555 15105.55547 2.55555 299.55555 151.05555 15105.55500 2020-01-01 2020-01-02 2020-01-01 00:14:11 2020-01-02 03:42:32 2020-01-01 00:14:11.000 2020-01-02 03:42:32.000 851 99752 50301.5 5030150 851 99752 50301.5 5030150 -32717 32218 4426.3 442630 -125 126 0.06 6 +852 2 10842 99753 2.55855 299.55855 151.05855 15105.85585 2.55855 299.55856 151.05856 15105.85607 2.55855 299.55855 151.05855 15105.85500 2020-01-01 2020-01-02 2020-01-01 00:14:12 2020-01-02 03:42:33 2020-01-01 00:14:12.000 2020-01-02 03:42:33.000 852 99753 50302.5 5030250 852 99753 50302.5 5030250 -32716 32219 4427.3 442730 -124 127 1.06 106 +853 2 10843 99754 2.56156 299.56156 151.06156 15106.15615 2.56156 299.56155 151.06155 15106.15571 2.56156 299.56156 151.06156 15106.15600 2020-01-01 2020-01-02 2020-01-01 00:14:13 2020-01-02 03:42:34 2020-01-01 00:14:13.000 2020-01-02 03:42:34.000 853 99754 50303.5 5030350 853 99754 50303.5 5030350 -32715 32220 4428.3 442830 -128 127 -0.5 -50 +854 2 10844 99755 2.56456 299.56456 151.06456 15106.45645 2.56456 299.56458 151.06456 15106.45646 2.56456 299.56456 151.06456 15106.45600 2020-01-01 2020-01-02 2020-01-01 00:14:14 2020-01-02 03:42:35 2020-01-01 00:14:14.000 2020-01-02 03:42:35.000 854 99755 50304.5 5030450 854 99755 50304.5 5030450 -32714 32221 4429.3 442930 -128 123 -2.06 -206 +855 2 10845 99756 2.56756 299.56756 151.06756 15106.75675 2.56756 299.56757 151.06756 15106.75661 2.56756 299.56756 151.06756 15106.75600 2020-01-01 2020-01-02 2020-01-01 00:14:15 2020-01-02 03:42:36 2020-01-01 00:14:15.000 2020-01-02 03:42:36.000 855 99756 50305.5 5030550 855 99756 50305.5 5030550 -32713 32222 4430.3 443030 -127 124 -1.06 -106 +856 2 10846 99757 2.57057 299.57057 151.07057 15107.05705 2.57057 299.57056 151.07056 15107.05694 2.57057 299.57057 151.07057 15107.05700 2020-01-01 2020-01-02 2020-01-01 00:14:16 2020-01-02 03:42:37 2020-01-01 00:14:16.000 2020-01-02 03:42:37.000 856 99757 50306.5 5030650 856 99757 50306.5 5030650 -32712 32223 4431.3 443130 -126 125 -0.06 -6 +857 2 10847 99758 2.57357 299.57357 151.07357 15107.35735 2.57357 299.57358 151.07357 15107.35754 2.57357 299.57357 151.07357 15107.35700 2020-01-01 2020-01-02 2020-01-01 00:14:17 2020-01-02 03:42:38 2020-01-01 00:14:17.000 2020-01-02 03:42:38.000 857 99758 50307.5 5030750 857 99758 50307.5 5030750 -32711 32224 4432.3 443230 -125 126 0.94 94 +858 2 10848 99759 2.57657 299.57657 151.07657 15107.65765 2.57657 299.57657 151.07657 15107.65783 2.57657 299.57657 151.07657 15107.65700 2020-01-01 2020-01-02 2020-01-01 00:14:18 2020-01-02 03:42:39 2020-01-01 00:14:18.000 2020-01-02 03:42:39.000 858 99759 50308.5 5030850 858 99759 50308.5 5030850 -32710 32225 4433.3 443330 -124 127 1.94 194 +859 2 10849 99760 2.57957 299.57957 151.07957 15107.95795 2.57957 299.5796 151.07957 15107.95794 2.57957 299.57957 151.07957 15107.95700 2020-01-01 2020-01-02 2020-01-01 00:14:19 2020-01-02 03:42:40 2020-01-01 00:14:19.000 2020-01-02 03:42:40.000 859 99760 50309.5 5030950 859 99760 50309.5 5030950 -32709 32226 4434.3 443430 -128 127 0.38 38 +86 2 10076 99986 0.25825 300.25825 150.25825 15176.08408 0.25825 300.25827 150.25825 15176.08406 0.25825 300.25825 150.25825 15176.08325 2020-01-01 2020-01-02 2020-01-01 00:01:26 2020-01-02 03:46:26 2020-01-01 00:01:26.000 2020-01-02 03:46:26.000 86 99986 50036 5053636 86 99986 50036 5053636 -32483 32452 4615.009900990099 466116 -128 123 -3.128712871287129 -316 +860 2 10850 99761 2.58258 299.58258 151.08258 15108.25825 2.58258 299.58258 151.08258 15108.25811 2.58258 299.58258 151.08258 15108.25800 2020-01-01 2020-01-02 2020-01-01 00:14:20 2020-01-02 03:42:41 2020-01-01 00:14:20.000 2020-01-02 03:42:41.000 860 99761 50310.5 5031050 860 99761 50310.5 5031050 -32708 32227 4435.3 443530 -128 123 -1.18 -118 +861 2 10851 99762 2.58558 299.58558 151.08558 15108.55855 2.58558 299.58557 151.08558 15108.55841 2.58558 299.58558 151.08558 15108.55800 2020-01-01 2020-01-02 2020-01-01 00:14:21 2020-01-02 03:42:42 2020-01-01 00:14:21.000 2020-01-02 03:42:42.000 861 99762 50311.5 5031150 861 99762 50311.5 5031150 -32707 32228 4436.3 443630 -127 124 -0.18 -18 +862 2 10852 99763 2.58858 299.58858 151.08858 15108.85885 2.58858 299.5886 151.08859 15108.85901 2.58858 299.58858 151.08858 15108.85800 2020-01-01 2020-01-02 2020-01-01 00:14:22 2020-01-02 03:42:43 2020-01-01 00:14:22.000 2020-01-02 03:42:43.000 862 99763 50312.5 5031250 862 99763 50312.5 5031250 -32706 32229 4437.3 443730 -126 125 0.82 82 +863 2 10853 99764 2.59159 299.59159 151.09159 15109.15915 2.59159 299.59158 151.09159 15109.1593 2.59159 299.59159 151.09159 15109.15900 2020-01-01 2020-01-02 2020-01-01 00:14:23 2020-01-02 03:42:44 2020-01-01 00:14:23.000 2020-01-02 03:42:44.000 863 99764 50313.5 5031350 863 99764 50313.5 5031350 -32705 32230 4438.3 443830 -125 126 1.82 182 +864 2 10854 99765 2.59459 299.59459 151.09459 15109.45945 2.59459 299.5946 151.09459 15109.45941 2.59459 299.59459 151.09459 15109.45900 2020-01-01 2020-01-02 2020-01-01 00:14:24 2020-01-02 03:42:45 2020-01-01 00:14:24.000 2020-01-02 03:42:45.000 864 99765 50314.5 5031450 864 99765 50314.5 5031450 -32704 32231 4439.3 443930 -124 127 2.82 282 +865 2 10855 99766 2.59759 299.59759 151.09759 15109.75975 2.59759 299.5976 151.09759 15109.75958 2.59759 299.59759 151.09759 15109.75900 2020-01-01 2020-01-02 2020-01-01 00:14:25 2020-01-02 03:42:46 2020-01-01 00:14:25.000 2020-01-02 03:42:46.000 865 99766 50315.5 5031550 865 99766 50315.5 5031550 -32703 32232 4440.3 444030 -128 127 1.26 126 +866 2 10856 99767 2.6006 299.6006 151.1006 15110.06006 2.6006 299.6006 151.10059 15110.05988 2.60060 299.60060 151.10060 15110.06000 2020-01-01 2020-01-02 2020-01-01 00:14:26 2020-01-02 03:42:47 2020-01-01 00:14:26.000 2020-01-02 03:42:47.000 866 99767 50316.5 5031650 866 99767 50316.5 5031650 -32702 32233 4441.3 444130 -128 127 -0.3 -30 +867 2 10857 99768 2.6036 299.6036 151.1036 15110.36036 2.6036 299.6036 151.1036 15110.36063 2.60360 299.60360 151.10360 15110.36000 2020-01-01 2020-01-02 2020-01-01 00:14:27 2020-01-02 03:42:48 2020-01-01 00:14:27.000 2020-01-02 03:42:48.000 867 99768 50317.5 5031750 867 99768 50317.5 5031750 -32701 32234 4442.3 444230 -128 123 -1.86 -186 +868 2 10858 99769 2.6066 299.6066 151.1066 15110.66066 2.6066 299.6066 151.1066 15110.66078 2.60660 299.60660 151.10660 15110.66000 2020-01-01 2020-01-02 2020-01-01 00:14:28 2020-01-02 03:42:49 2020-01-01 00:14:28.000 2020-01-02 03:42:49.000 868 99769 50318.5 5031850 868 99769 50318.5 5031850 -32700 32235 4443.3 444330 -127 124 -0.86 -86 +869 2 10859 99770 2.6096 299.6096 151.1096 15110.96096 2.6096 299.60962 151.1096 15110.96091 2.60960 299.60960 151.10960 15110.96000 2020-01-01 2020-01-02 2020-01-01 00:14:29 2020-01-02 03:42:50 2020-01-01 00:14:29.000 2020-01-02 03:42:50.000 869 99770 50319.5 5031950 869 99770 50319.5 5031950 -32699 32236 4444.3 444430 -126 125 0.14 14 +87 2 10077 99987 0.26126 300.26126 150.26126 15176.38738 0.26126 300.26126 150.26126 15176.38736 0.26126 300.26126 150.26126 15176.38726 2020-01-01 2020-01-02 2020-01-01 00:01:27 2020-01-02 03:46:27 2020-01-01 00:01:27.000 2020-01-02 03:46:27.000 87 99987 50037 5053737 87 99987 50037 5053737 -32482 32453 4616.009900990099 466217 -127 124 -2.128712871287129 -215 +870 2 10860 99771 2.61261 299.61261 151.11261 15111.26126 2.61261 299.6126 151.11261 15111.26105 2.61261 299.61261 151.11261 15111.26100 2020-01-01 2020-01-02 2020-01-01 00:14:30 2020-01-02 03:42:51 2020-01-01 00:14:30.000 2020-01-02 03:42:51.000 870 99771 50320.5 5032050 870 99771 50320.5 5032050 -32698 32237 4445.3 444530 -125 126 1.14 114 +871 2 10861 99772 2.61561 299.61561 151.11561 15111.56156 2.61561 299.6156 151.11561 15111.56135 2.61561 299.61561 151.11561 15111.56100 2020-01-01 2020-01-02 2020-01-01 00:14:31 2020-01-02 03:42:52 2020-01-01 00:14:31.000 2020-01-02 03:42:52.000 871 99772 50321.5 5032150 871 99772 50321.5 5032150 -32697 32238 4446.3 444630 -124 127 2.14 214 +872 2 10862 99773 2.61861 299.61861 151.11861 15111.86186 2.61861 299.61862 151.11862 15111.8621 2.61861 299.61861 151.11861 15111.86100 2020-01-01 2020-01-02 2020-01-01 00:14:32 2020-01-02 03:42:53 2020-01-01 00:14:32.000 2020-01-02 03:42:53.000 872 99773 50322.5 5032250 872 99773 50322.5 5032250 -32696 32239 4447.3 444730 -128 127 0.58 58 +873 2 10863 99774 2.62162 299.62162 151.12162 15112.16216 2.62162 299.6216 151.12162 15112.16224 2.62162 299.62162 151.12162 15112.16200 2020-01-01 2020-01-02 2020-01-01 00:14:33 2020-01-02 03:42:54 2020-01-01 00:14:33.000 2020-01-02 03:42:54.000 873 99774 50323.5 5032350 873 99774 50323.5 5032350 -32695 32240 4448.3 444830 -128 123 -0.98 -98 +874 2 10864 99775 2.62462 299.62462 151.12462 15112.46246 2.62462 299.62463 151.12462 15112.46238 2.62462 299.62462 151.12462 15112.46200 2020-01-01 2020-01-02 2020-01-01 00:14:34 2020-01-02 03:42:55 2020-01-01 00:14:34.000 2020-01-02 03:42:55.000 874 99775 50324.5 5032450 874 99775 50324.5 5032450 -32694 32241 4449.3 444930 -127 124 0.02 2 +875 2 10865 99776 2.62762 299.62762 151.12762 15112.76276 2.62762 299.62762 151.12762 15112.76252 2.62762 299.62762 151.12762 15112.76200 2020-01-01 2020-01-02 2020-01-01 00:14:35 2020-01-02 03:42:56 2020-01-01 00:14:35.000 2020-01-02 03:42:56.000 875 99776 50325.5 5032550 875 99776 50325.5 5032550 -32693 32242 4450.3 445030 -126 125 1.02 102 +876 2 10866 99777 2.63063 299.63063 151.13063 15113.06306 2.63063 299.63065 151.13063 15113.06327 2.63063 299.63063 151.13063 15113.06300 2020-01-01 2020-01-02 2020-01-01 00:14:36 2020-01-02 03:42:57 2020-01-01 00:14:36.000 2020-01-02 03:42:57.000 876 99777 50326.5 5032650 876 99777 50326.5 5032650 -32692 32243 4451.3 445130 -125 126 2.02 202 +877 2 10867 99778 2.63363 299.63363 151.13363 15113.36336 2.63363 299.63364 151.13363 15113.36358 2.63363 299.63363 151.13363 15113.36300 2020-01-01 2020-01-02 2020-01-01 00:14:37 2020-01-02 03:42:58 2020-01-01 00:14:37.000 2020-01-02 03:42:58.000 877 99778 50327.5 5032750 877 99778 50327.5 5032750 -32691 32244 4452.3 445230 -124 127 3.02 302 +878 2 10868 99779 2.63663 299.63663 151.13663 15113.66366 2.63663 299.63663 151.13663 15113.66371 2.63663 299.63663 151.13663 15113.66300 2020-01-01 2020-01-02 2020-01-01 00:14:38 2020-01-02 03:42:59 2020-01-01 00:14:38.000 2020-01-02 03:42:59.000 878 99779 50328.5 5032850 878 99779 50328.5 5032850 -32690 32245 4453.3 445330 -128 127 1.46 146 +879 2 10869 99780 2.63963 299.63963 151.13963 15113.96396 2.63963 299.63965 151.13963 15113.96385 2.63963 299.63963 151.13963 15113.96300 2020-01-01 2020-01-02 2020-01-01 00:14:39 2020-01-02 03:43:00 2020-01-01 00:14:39.000 2020-01-02 03:43:00.000 879 99780 50329.5 5032950 879 99780 50329.5 5032950 -32689 32246 4454.3 445430 -128 123 -0.1 -10 +88 2 10078 99988 0.26426 300.26426 150.26426 15176.69069 0.26426 300.26425 150.26426 15176.69066 0.26426 300.26426 150.26426 15176.69026 2020-01-01 2020-01-02 2020-01-01 00:01:28 2020-01-02 03:46:28 2020-01-01 00:01:28.000 2020-01-02 03:46:28.000 88 99988 50038 5053838 88 99988 50038 5053838 -32481 32454 4617.009900990099 466318 -126 125 -1.1287128712871286 -114 +880 2 10870 99781 2.64264 299.64264 151.14264 15114.26426 2.64264 299.64264 151.14263 15114.26399 2.64264 299.64264 151.14264 15114.26400 2020-01-01 2020-01-02 2020-01-01 00:14:40 2020-01-02 03:43:01 2020-01-01 00:14:40.000 2020-01-02 03:43:01.000 880 99781 50330.5 5033050 880 99781 50330.5 5033050 -32688 32247 4455.3 445530 -127 124 0.9 90 +881 2 10871 99782 2.64564 299.64564 151.14564 15114.56456 2.64564 299.64566 151.14564 15114.56474 2.64564 299.64564 151.14564 15114.56400 2020-01-01 2020-01-02 2020-01-01 00:14:41 2020-01-02 03:43:02 2020-01-01 00:14:41.000 2020-01-02 03:43:02.000 881 99782 50331.5 5033150 881 99782 50331.5 5033150 -32687 32248 4456.3 445630 -126 125 1.9 190 +882 2 10872 99783 2.64864 299.64864 151.14864 15114.86486 2.64864 299.64865 151.14865 15114.86504 2.64864 299.64864 151.14864 15114.86400 2020-01-01 2020-01-02 2020-01-01 00:14:42 2020-01-02 03:43:03 2020-01-01 00:14:42.000 2020-01-02 03:43:03.000 882 99783 50332.5 5033250 882 99783 50332.5 5033250 -32686 32249 4457.3 445730 -125 126 2.9 290 +883 2 10873 99784 2.65165 299.65165 151.15165 15115.16516 2.65165 299.65164 151.15165 15115.16522 2.65165 299.65165 151.15165 15115.16500 2020-01-01 2020-01-02 2020-01-01 00:14:43 2020-01-02 03:43:04 2020-01-01 00:14:43.000 2020-01-02 03:43:04.000 883 99784 50333.5 5033350 883 99784 50333.5 5033350 -32685 32250 4458.3 445830 -124 127 3.9 390 +884 2 10874 99785 2.65465 299.65465 151.15465 15115.46546 2.65465 299.65466 151.15465 15115.46532 2.65465 299.65465 151.15465 15115.46500 2020-01-01 2020-01-02 2020-01-01 00:14:44 2020-01-02 03:43:05 2020-01-01 00:14:44.000 2020-01-02 03:43:05.000 884 99785 50334.5 5033450 884 99785 50334.5 5033450 -32684 32251 4459.3 445930 -128 127 2.34 234 +885 2 10875 99786 2.65765 299.65765 151.15765 15115.76576 2.65765 299.65765 151.15765 15115.76562 2.65765 299.65765 151.15765 15115.76500 2020-01-01 2020-01-02 2020-01-01 00:14:45 2020-01-02 03:43:06 2020-01-01 00:14:45.000 2020-01-02 03:43:06.000 885 99786 50335.5 5033550 885 99786 50335.5 5033550 -32683 32252 4460.3 446030 -128 123 0.78 78 +886 2 10876 99787 2.66066 299.66066 151.16066 15116.06606 2.66066 299.66068 151.16066 15116.06621 2.66066 299.66066 151.16066 15116.06600 2020-01-01 2020-01-02 2020-01-01 00:14:46 2020-01-02 03:43:07 2020-01-01 00:14:46.000 2020-01-02 03:43:07.000 886 99787 50336.5 5033650 886 99787 50336.5 5033650 -32682 32253 4461.3 446130 -127 124 1.78 178 +887 2 10877 99788 2.66366 299.66366 151.16366 15116.36636 2.66366 299.66367 151.16366 15116.36651 2.66366 299.66366 151.16366 15116.36600 2020-01-01 2020-01-02 2020-01-01 00:14:47 2020-01-02 03:43:08 2020-01-01 00:14:47.000 2020-01-02 03:43:08.000 887 99788 50337.5 5033750 887 99788 50337.5 5033750 -32681 32254 4462.3 446230 -126 125 2.78 278 +888 2 10878 99789 2.66666 299.66666 151.16666 15116.66666 2.66666 299.66666 151.16666 15116.66669 2.66666 299.66666 151.16666 15116.66600 2020-01-01 2020-01-02 2020-01-01 00:14:48 2020-01-02 03:43:09 2020-01-01 00:14:48.000 2020-01-02 03:43:09.000 888 99789 50338.5 5033850 888 99789 50338.5 5033850 -32680 32255 4463.3 446330 -125 126 3.78 378 +889 2 10879 99790 2.66966 299.66966 151.16966 15116.96696 2.66966 299.66968 151.16966 15116.96679 2.66966 299.66966 151.16966 15116.96600 2020-01-01 2020-01-02 2020-01-01 00:14:49 2020-01-02 03:43:10 2020-01-01 00:14:49.000 2020-01-02 03:43:10.000 889 99790 50339.5 5033950 889 99790 50339.5 5033950 -32679 32256 4464.3 446430 -124 127 4.78 478 +89 2 10079 99989 0.26726 300.26726 150.26726 15176.99399 0.26726 300.26727 150.26727 15176.9943 0.26726 300.26726 150.26726 15176.99326 2020-01-01 2020-01-02 2020-01-01 00:01:29 2020-01-02 03:46:29 2020-01-01 00:01:29.000 2020-01-02 03:46:29.000 89 99989 50039 5053939 89 99989 50039 5053939 -32480 32455 4618.009900990099 466419 -125 126 -0.12871287128712872 -13 +890 2 10880 99791 2.67267 299.67267 151.17267 15117.26726 2.67267 299.67267 151.17267 15117.26708 2.67267 299.67267 151.17267 15117.26700 2020-01-01 2020-01-02 2020-01-01 00:14:50 2020-01-02 03:43:11 2020-01-01 00:14:50.000 2020-01-02 03:43:11.000 890 99791 50340.5 5034050 890 99791 50340.5 5034050 -32678 32257 4465.3 446530 -128 127 3.22 322 +891 2 10881 99792 2.67567 299.67567 151.17567 15117.56756 2.67567 299.6757 151.17567 15117.56768 2.67567 299.67567 151.17567 15117.56700 2020-01-01 2020-01-02 2020-01-01 00:14:51 2020-01-02 03:43:12 2020-01-01 00:14:51.000 2020-01-02 03:43:12.000 891 99792 50341.5 5034150 891 99792 50341.5 5034150 -32677 32258 4466.3 446630 -128 127 1.66 166 +892 2 10882 99793 2.67867 299.67867 151.17867 15117.86786 2.67867 299.67868 151.17868 15117.86802 2.67867 299.67867 151.17867 15117.86700 2020-01-01 2020-01-02 2020-01-01 00:14:52 2020-01-02 03:43:13 2020-01-01 00:14:52.000 2020-01-02 03:43:13.000 892 99793 50342.5 5034250 892 99793 50342.5 5034250 -32676 32259 4467.3 446730 -128 124 0.1 10 +893 2 10883 99794 2.68168 299.68168 151.18168 15118.16816 2.68168 299.68167 151.18168 15118.16816 2.68168 299.68168 151.18168 15118.16800 2020-01-01 2020-01-02 2020-01-01 00:14:53 2020-01-02 03:43:14 2020-01-01 00:14:53.000 2020-01-02 03:43:14.000 893 99794 50343.5 5034350 893 99794 50343.5 5034350 -32675 32260 4468.3 446830 -127 125 1.1 110 +894 2 10884 99795 2.68468 299.68468 151.18468 15118.46846 2.68468 299.6847 151.18468 15118.46826 2.68468 299.68468 151.18468 15118.46800 2020-01-01 2020-01-02 2020-01-01 00:14:54 2020-01-02 03:43:15 2020-01-01 00:14:54.000 2020-01-02 03:43:15.000 894 99795 50344.5 5034450 894 99795 50344.5 5034450 -32674 32261 4469.3 446930 -126 126 2.1 210 +895 2 10885 99796 2.68768 299.68768 151.18768 15118.76876 2.68768 299.68768 151.18768 15118.76855 2.68768 299.68768 151.18768 15118.76800 2020-01-01 2020-01-02 2020-01-01 00:14:55 2020-01-02 03:43:16 2020-01-01 00:14:55.000 2020-01-02 03:43:16.000 895 99796 50345.5 5034550 895 99796 50345.5 5034550 -32673 32262 4470.3 447030 -125 127 3.1 310 +896 2 10886 99797 2.69069 299.69069 151.19069 15119.06906 2.69069 299.6907 151.19069 15119.06915 2.69069 299.69069 151.19069 15119.06900 2020-01-01 2020-01-02 2020-01-01 00:14:56 2020-01-02 03:43:17 2020-01-01 00:14:56.000 2020-01-02 03:43:17.000 896 99797 50346.5 5034650 896 99797 50346.5 5034650 -32672 32263 4471.3 447130 -128 127 1.54 154 +897 2 10887 99798 2.69369 299.69369 151.19369 15119.36936 2.69369 299.6937 151.19369 15119.36949 2.69369 299.69369 151.19369 15119.36900 2020-01-01 2020-01-02 2020-01-01 00:14:57 2020-01-02 03:43:18 2020-01-01 00:14:57.000 2020-01-02 03:43:18.000 897 99798 50347.5 5034750 897 99798 50347.5 5034750 -32671 32264 4472.3 447230 -128 127 -0.02 -2 +898 2 10888 99799 2.69669 299.69669 151.19669 15119.66966 2.69669 299.6967 151.19669 15119.66963 2.69669 299.69669 151.19669 15119.66900 2020-01-01 2020-01-02 2020-01-01 00:14:58 2020-01-02 03:43:19 2020-01-01 00:14:58.000 2020-01-02 03:43:19.000 898 99799 50348.5 5034850 898 99799 50348.5 5034850 -32670 32265 4473.3 447330 -128 123 -1.58 -158 +899 2 10889 99800 2.69969 299.69969 151.19969 15119.96996 2.69969 299.6997 151.1997 15119.97038 2.69969 299.69969 151.19969 15119.96900 2020-01-01 2020-01-02 2020-01-01 00:14:59 2020-01-02 03:43:20 2020-01-01 00:14:59.000 2020-01-02 03:43:20.000 899 99800 50349.5 5034950 899 99800 50349.5 5034950 -32669 32266 4474.3 447430 -127 124 -0.58 -58 +9 2 1008 9999 0.02702 300.02702 150.02702 15152.72972 0.02702 300.02704 150.02702 15152.72966 0.02702 300.02702 150.02702 15152.72902 2020-01-01 2020-01-02 2020-01-01 00:00:09 2020-01-02 03:45:09 2020-01-01 00:00:09.000 2020-01-02 03:45:09.000 9 99909 49959 5045859 9 99909 49959 5045859 -32560 32375 4538.009900990099 458339 -124 127 0.9801980198019802 99 +90 2 10080 99990 0.27027 300.27027 150.27027 15177.29729 0.27027 300.27026 150.27026 15177.29694 0.27027 300.27027 150.27027 15177.29727 2020-01-01 2020-01-02 2020-01-01 00:01:30 2020-01-02 03:46:30 2020-01-01 00:01:30.000 2020-01-02 03:46:30.000 90 99990 50040 5054040 90 99990 50040 5054040 -32479 32456 4619.009900990099 466520 -124 127 0.8712871287128713 88 +900 2 10890 99801 2.7027 299.7027 151.2027 15120.27027 2.7027 299.7027 151.2027 15120.27003 2.70270 299.70270 151.20270 15120.27000 2020-01-01 2020-01-02 2020-01-01 00:15:00 2020-01-02 03:43:21 2020-01-01 00:15:00.000 2020-01-02 03:43:21.000 900 99801 50350.5 5035050 900 99801 50350.5 5035050 -32668 32267 4475.3 447530 -126 125 0.42 42 +901 2 10891 99802 2.7057 299.7057 151.2057 15120.57057 2.7057 299.70572 151.2057 15120.57066 2.70570 299.70570 151.20570 15120.57000 2020-01-01 2020-01-02 2020-01-01 00:15:01 2020-01-02 03:43:22 2020-01-01 00:15:01.000 2020-01-02 03:43:22.000 901 99802 50351.5 5035150 901 99802 50351.5 5035150 -32667 32268 4476.3 447630 -125 126 1.42 142 +902 2 10892 99803 2.7087 299.7087 151.2087 15120.87087 2.7087 299.7087 151.2087 15120.87095 2.70870 299.70870 151.20870 15120.87000 2020-01-01 2020-01-02 2020-01-01 00:15:02 2020-01-02 03:43:23 2020-01-01 00:15:02.000 2020-01-02 03:43:23.000 902 99803 50352.5 5035250 902 99803 50352.5 5035250 -32666 32269 4477.3 447730 -124 127 2.42 242 +903 2 10893 99804 2.71171 299.71171 151.21171 15121.17117 2.71171 299.7117 151.21171 15121.1711 2.71171 299.71171 151.21171 15121.17100 2020-01-01 2020-01-02 2020-01-01 00:15:03 2020-01-02 03:43:24 2020-01-01 00:15:03.000 2020-01-02 03:43:24.000 903 99804 50353.5 5035350 903 99804 50353.5 5035350 -32665 32270 4478.3 447830 -128 127 0.86 86 +904 2 10894 99805 2.71471 299.71471 151.21471 15121.47147 2.71471 299.71472 151.21471 15121.47185 2.71471 299.71471 151.21471 15121.47100 2020-01-01 2020-01-02 2020-01-01 00:15:04 2020-01-02 03:43:25 2020-01-01 00:15:04.000 2020-01-02 03:43:25.000 904 99805 50354.5 5035450 904 99805 50354.5 5035450 -32664 32271 4479.3 447930 -128 123 -0.7 -70 +905 2 10895 99806 2.71771 299.71771 151.21771 15121.77177 2.71771 299.7177 151.21771 15121.77149 2.71771 299.71771 151.21771 15121.77100 2020-01-01 2020-01-02 2020-01-01 00:15:05 2020-01-02 03:43:26 2020-01-01 00:15:05.000 2020-01-02 03:43:26.000 905 99806 50355.5 5035550 905 99806 50355.5 5035550 -32663 32272 4480.3 448030 -127 124 0.3 30 +906 2 10896 99807 2.72072 299.72072 151.22072 15122.07207 2.72072 299.72073 151.22072 15122.07212 2.72072 299.72072 151.22072 15122.07200 2020-01-01 2020-01-02 2020-01-01 00:15:06 2020-01-02 03:43:27 2020-01-01 00:15:06.000 2020-01-02 03:43:27.000 906 99807 50356.5 5035650 906 99807 50356.5 5035650 -32662 32273 4481.3 448130 -126 125 1.3 130 +907 2 10897 99808 2.72372 299.72372 151.22372 15122.37237 2.72372 299.72372 151.22372 15122.37243 2.72372 299.72372 151.22372 15122.37200 2020-01-01 2020-01-02 2020-01-01 00:15:07 2020-01-02 03:43:28 2020-01-01 00:15:07.000 2020-01-02 03:43:28.000 907 99808 50357.5 5035750 907 99808 50357.5 5035750 -32661 32274 4482.3 448230 -125 126 2.3 230 +908 2 10898 99809 2.72672 299.72672 151.22672 15122.67267 2.72672 299.7267 151.22672 15122.67272 2.72672 299.72672 151.22672 15122.67200 2020-01-01 2020-01-02 2020-01-01 00:15:08 2020-01-02 03:43:29 2020-01-01 00:15:08.000 2020-01-02 03:43:29.000 908 99809 50358.5 5035850 908 99809 50358.5 5035850 -32660 32275 4483.3 448330 -124 127 3.3 330 +909 2 10899 99810 2.72972 299.72972 151.22972 15122.97297 2.72972 299.72974 151.22973 15122.97332 2.72972 299.72972 151.22972 15122.97200 2020-01-01 2020-01-02 2020-01-01 00:15:09 2020-01-02 03:43:30 2020-01-01 00:15:09.000 2020-01-02 03:43:30.000 909 99810 50359.5 5035950 909 99810 50359.5 5035950 -32659 32276 4484.3 448430 -128 127 1.74 174 +91 2 10081 99991 0.27327 300.27327 150.27327 15177.6006 0.27327 300.2733 150.27327 15177.60054 0.27327 300.27327 150.27327 15177.60027 2020-01-01 2020-01-02 2020-01-01 00:01:31 2020-01-02 03:46:31 2020-01-01 00:01:31.000 2020-01-02 03:46:31.000 91 99991 50041 5054141 91 99991 50041 5054141 -32478 32457 4620.009900990099 466621 -128 127 -0.6633663366336634 -67 +910 2 10900 99811 2.73273 299.73273 151.23273 15123.27327 2.73273 299.73273 151.23272 15123.27296 2.73273 299.73273 151.23273 15123.27300 2020-01-01 2020-01-02 2020-01-01 00:15:10 2020-01-02 03:43:31 2020-01-01 00:15:10.000 2020-01-02 03:43:31.000 910 99811 50360.5 5036050 910 99811 50360.5 5036050 -32658 32277 4485.3 448530 -128 123 0.18 18 +911 2 10901 99812 2.73573 299.73573 151.23573 15123.57357 2.73573 299.73575 151.23573 15123.57359 2.73573 299.73573 151.23573 15123.57300 2020-01-01 2020-01-02 2020-01-01 00:15:11 2020-01-02 03:43:32 2020-01-01 00:15:11.000 2020-01-02 03:43:32.000 911 99812 50361.5 5036150 911 99812 50361.5 5036150 -32657 32278 4486.3 448630 -127 124 1.18 118 +912 2 10902 99813 2.73873 299.73873 151.23873 15123.87387 2.73873 299.73874 151.23873 15123.8739 2.73873 299.73873 151.23873 15123.87300 2020-01-01 2020-01-02 2020-01-01 00:15:12 2020-01-02 03:43:33 2020-01-01 00:15:12.000 2020-01-02 03:43:33.000 912 99813 50362.5 5036250 912 99813 50362.5 5036250 -32656 32279 4487.3 448730 -126 125 2.18 218 +913 2 10903 99814 2.74174 299.74174 151.24174 15124.17417 2.74174 299.74173 151.24174 15124.17419 2.74174 299.74174 151.24174 15124.17400 2020-01-01 2020-01-02 2020-01-01 00:15:13 2020-01-02 03:43:34 2020-01-01 00:15:13.000 2020-01-02 03:43:34.000 913 99814 50363.5 5036350 913 99814 50363.5 5036350 -32655 32280 4488.3 448830 -125 126 3.18 318 +914 2 10904 99815 2.74474 299.74474 151.24474 15124.47447 2.74474 299.74475 151.24474 15124.47479 2.74474 299.74474 151.24474 15124.47400 2020-01-01 2020-01-02 2020-01-01 00:15:14 2020-01-02 03:43:35 2020-01-01 00:15:14.000 2020-01-02 03:43:35.000 914 99815 50364.5 5036450 914 99815 50364.5 5036450 -32654 32281 4489.3 448930 -124 127 4.18 418 +915 2 10905 99816 2.74774 299.74774 151.24774 15124.77477 2.74774 299.74774 151.24774 15124.77447 2.74774 299.74774 151.24774 15124.77400 2020-01-01 2020-01-02 2020-01-01 00:15:15 2020-01-02 03:43:36 2020-01-01 00:15:15.000 2020-01-02 03:43:36.000 915 99816 50365.5 5036550 915 99816 50365.5 5036550 -32653 32282 4490.3 449030 -128 127 2.62 262 +916 2 10906 99817 2.75075 299.75075 151.25075 15125.07507 2.75075 299.75076 151.25075 15125.07507 2.75075 299.75075 151.25075 15125.07500 2020-01-01 2020-01-02 2020-01-01 00:15:16 2020-01-02 03:43:37 2020-01-01 00:15:16.000 2020-01-02 03:43:37.000 916 99817 50366.5 5036650 916 99817 50366.5 5036650 -32652 32283 4491.3 449130 -128 127 1.06 106 +917 2 10907 99818 2.75375 299.75375 151.25375 15125.37537 2.75375 299.75375 151.25375 15125.37536 2.75375 299.75375 151.25375 15125.37500 2020-01-01 2020-01-02 2020-01-01 00:15:17 2020-01-02 03:43:38 2020-01-01 00:15:17.000 2020-01-02 03:43:38.000 917 99818 50367.5 5036750 917 99818 50367.5 5036750 -32651 32284 4492.3 449230 -128 124 -0.5 -50 +918 2 10908 99819 2.75675 299.75675 151.25675 15125.67567 2.75675 299.75674 151.25675 15125.67566 2.75675 299.75675 151.25675 15125.67500 2020-01-01 2020-01-02 2020-01-01 00:15:18 2020-01-02 03:43:39 2020-01-01 00:15:18.000 2020-01-02 03:43:39.000 918 99819 50368.5 5036850 918 99819 50368.5 5036850 -32650 32285 4493.3 449330 -127 125 0.5 50 +919 2 10909 99820 2.75975 299.75975 151.25975 15125.97597 2.75975 299.75977 151.25976 15125.97626 2.75975 299.75975 151.25975 15125.97500 2020-01-01 2020-01-02 2020-01-01 00:15:19 2020-01-02 03:43:40 2020-01-01 00:15:19.000 2020-01-02 03:43:40.000 919 99820 50369.5 5036950 919 99820 50369.5 5036950 -32649 32286 4494.3 449430 -126 126 1.5 150 +92 2 10082 99992 0.27627 300.27627 150.27627 15177.9039 0.27627 300.27628 150.27627 15177.90384 0.27627 300.27627 150.27627 15177.90327 2020-01-01 2020-01-02 2020-01-01 00:01:32 2020-01-02 03:46:32 2020-01-01 00:01:32.000 2020-01-02 03:46:32.000 92 99992 50042 5054242 92 99992 50042 5054242 -32477 32458 4621.009900990099 466722 -128 123 -2.198019801980198 -222 +920 2 10910 99821 2.76276 299.76276 151.26276 15126.27627 2.76276 299.76276 151.26275 15126.27594 2.76276 299.76276 151.26276 15126.27600 2020-01-01 2020-01-02 2020-01-01 00:15:20 2020-01-02 03:43:41 2020-01-01 00:15:20.000 2020-01-02 03:43:41.000 920 99821 50370.5 5037050 920 99821 50370.5 5037050 -32648 32287 4495.3 449530 -125 127 2.5 250 +921 2 10911 99822 2.76576 299.76576 151.26576 15126.57657 2.76576 299.76578 151.26576 15126.57654 2.76576 299.76576 151.26576 15126.57600 2020-01-01 2020-01-02 2020-01-01 00:15:21 2020-01-02 03:43:42 2020-01-01 00:15:21.000 2020-01-02 03:43:42.000 921 99822 50371.5 5037150 921 99822 50371.5 5037150 -32647 32288 4496.3 449630 -128 127 0.94 94 +922 2 10912 99823 2.76876 299.76876 151.26876 15126.87687 2.76876 299.76877 151.26876 15126.87683 2.76876 299.76876 151.26876 15126.87600 2020-01-01 2020-01-02 2020-01-01 00:15:22 2020-01-02 03:43:43 2020-01-01 00:15:22.000 2020-01-02 03:43:43.000 922 99823 50372.5 5037250 922 99823 50372.5 5037250 -32646 32289 4497.3 449730 -128 127 -0.62 -62 +923 2 10913 99824 2.77177 299.77177 151.27177 15127.17717 2.77177 299.77176 151.27177 15127.17713 2.77177 299.77177 151.27177 15127.17700 2020-01-01 2020-01-02 2020-01-01 00:15:23 2020-01-02 03:43:44 2020-01-01 00:15:23.000 2020-01-02 03:43:44.000 923 99824 50373.5 5037350 923 99824 50373.5 5037350 -32645 32290 4498.3 449830 -128 123 -2.18 -218 +924 2 10914 99825 2.77477 299.77477 151.27477 15127.47747 2.77477 299.77478 151.27477 15127.47776 2.77477 299.77477 151.27477 15127.47700 2020-01-01 2020-01-02 2020-01-01 00:15:24 2020-01-02 03:43:45 2020-01-01 00:15:24.000 2020-01-02 03:43:45.000 924 99825 50374.5 5037450 924 99825 50374.5 5037450 -32644 32291 4499.3 449930 -127 124 -1.18 -118 +925 2 10915 99826 2.77777 299.77777 151.27777 15127.77777 2.77777 299.77777 151.27777 15127.77741 2.77777 299.77777 151.27777 15127.77700 2020-01-01 2020-01-02 2020-01-01 00:15:25 2020-01-02 03:43:46 2020-01-01 00:15:25.000 2020-01-02 03:43:46.000 925 99826 50375.5 5037550 925 99826 50375.5 5037550 -32643 32292 4500.3 450030 -126 125 -0.18 -18 +926 2 10916 99827 2.78078 299.78078 151.28078 15128.07807 2.78078 299.7808 151.28078 15128.078 2.78078 299.78078 151.28078 15128.07800 2020-01-01 2020-01-02 2020-01-01 00:15:26 2020-01-02 03:43:47 2020-01-01 00:15:26.000 2020-01-02 03:43:47.000 926 99827 50376.5 5037650 926 99827 50376.5 5037650 -32642 32293 4501.3 450130 -125 126 0.82 82 +927 2 10917 99828 2.78378 299.78378 151.28378 15128.37837 2.78378 299.78378 151.28378 15128.3783 2.78378 299.78378 151.28378 15128.37800 2020-01-01 2020-01-02 2020-01-01 00:15:27 2020-01-02 03:43:48 2020-01-01 00:15:27.000 2020-01-02 03:43:48.000 927 99828 50377.5 5037750 927 99828 50377.5 5037750 -32641 32294 4502.3 450230 -124 127 1.82 182 +928 2 10918 99829 2.78678 299.78678 151.28678 15128.67867 2.78678 299.78677 151.28678 15128.6786 2.78678 299.78678 151.28678 15128.67800 2020-01-01 2020-01-02 2020-01-01 00:15:28 2020-01-02 03:43:49 2020-01-01 00:15:28.000 2020-01-02 03:43:49.000 928 99829 50378.5 5037850 928 99829 50378.5 5037850 -32640 32295 4503.3 450330 -128 127 0.26 26 +929 2 10919 99830 2.78978 299.78978 151.28978 15128.97897 2.78978 299.7898 151.28979 15128.97923 2.78978 299.78978 151.28978 15128.97800 2020-01-01 2020-01-02 2020-01-01 00:15:29 2020-01-02 03:43:50 2020-01-01 00:15:29.000 2020-01-02 03:43:50.000 929 99830 50379.5 5037950 929 99830 50379.5 5037950 -32639 32296 4504.3 450430 -128 123 -1.3 -130 +93 2 10083 99993 0.27927 300.27927 150.27927 15178.2072 0.27927 300.27927 150.27927 15178.20715 0.27927 300.27927 150.27927 15178.20627 2020-01-01 2020-01-02 2020-01-01 00:01:33 2020-01-02 03:46:33 2020-01-01 00:01:33.000 2020-01-02 03:46:33.000 93 99993 50043 5054343 93 99993 50043 5054343 -32476 32459 4622.009900990099 466823 -127 124 -1.198019801980198 -121 +930 2 10920 99831 2.79279 299.79279 151.29279 15129.27927 2.79279 299.7928 151.29278 15129.27888 2.79279 299.79279 151.29279 15129.27900 2020-01-01 2020-01-02 2020-01-01 00:15:30 2020-01-02 03:43:51 2020-01-01 00:15:30.000 2020-01-02 03:43:51.000 930 99831 50380.5 5038050 930 99831 50380.5 5038050 -32638 32297 4505.3 450530 -127 124 -0.3 -30 +931 2 10921 99832 2.79579 299.79579 151.29579 15129.57957 2.79579 299.7958 151.29579 15129.57963 2.79579 299.79579 151.29579 15129.57900 2020-01-01 2020-01-02 2020-01-01 00:15:31 2020-01-02 03:43:52 2020-01-01 00:15:31.000 2020-01-02 03:43:52.000 931 99832 50381.5 5038150 931 99832 50381.5 5038150 -32637 32298 4506.3 450630 -126 125 0.7 70 +932 2 10922 99833 2.79879 299.79879 151.29879 15129.87987 2.79879 299.7988 151.29879 15129.87977 2.79879 299.79879 151.29879 15129.87900 2020-01-01 2020-01-02 2020-01-01 00:15:32 2020-01-02 03:43:53 2020-01-01 00:15:32.000 2020-01-02 03:43:53.000 932 99833 50382.5 5038250 932 99833 50382.5 5038250 -32636 32299 4507.3 450730 -125 126 1.7 170 +933 2 10923 99834 2.8018 299.8018 151.3018 15130.18018 2.8018 299.8018 151.3018 15130.18011 2.80180 299.80180 151.30180 15130.18000 2020-01-01 2020-01-02 2020-01-01 00:15:33 2020-01-02 03:43:54 2020-01-01 00:15:33.000 2020-01-02 03:43:54.000 933 99834 50383.5 5038350 933 99834 50383.5 5038350 -32635 32300 4508.3 450830 -124 127 2.7 270 +934 2 10924 99835 2.8048 299.8048 151.3048 15130.48048 2.8048 299.8048 151.3048 15130.48071 2.80480 299.80480 151.30480 15130.48000 2020-01-01 2020-01-02 2020-01-01 00:15:34 2020-01-02 03:43:55 2020-01-01 00:15:34.000 2020-01-02 03:43:55.000 934 99835 50384.5 5038450 934 99835 50384.5 5038450 -32634 32301 4509.3 450930 -128 127 1.14 114 +935 2 10925 99836 2.8078 299.8078 151.3078 15130.78078 2.8078 299.8078 151.3078 15130.78034 2.80780 299.80780 151.30780 15130.78000 2020-01-01 2020-01-02 2020-01-01 00:15:35 2020-01-02 03:43:56 2020-01-01 00:15:35.000 2020-01-02 03:43:56.000 935 99836 50385.5 5038550 935 99836 50385.5 5038550 -32633 32302 4510.3 451030 -128 123 -0.42 -42 +936 2 10926 99837 2.81081 299.81081 151.31081 15131.08108 2.81081 299.81082 151.31081 15131.0811 2.81081 299.81081 151.31081 15131.08100 2020-01-01 2020-01-02 2020-01-01 00:15:36 2020-01-02 03:43:57 2020-01-01 00:15:36.000 2020-01-02 03:43:57.000 936 99837 50386.5 5038650 936 99837 50386.5 5038650 -32632 32303 4511.3 451130 -127 124 0.58 58 +937 2 10927 99838 2.81381 299.81381 151.31381 15131.38138 2.81381 299.8138 151.31381 15131.38124 2.81381 299.81381 151.31381 15131.38100 2020-01-01 2020-01-02 2020-01-01 00:15:37 2020-01-02 03:43:58 2020-01-01 00:15:37.000 2020-01-02 03:43:58.000 937 99838 50387.5 5038750 937 99838 50387.5 5038750 -32631 32304 4512.3 451230 -126 125 1.58 158 +938 2 10928 99839 2.81681 299.81681 151.31681 15131.68168 2.81681 299.8168 151.31681 15131.68157 2.81681 299.81681 151.31681 15131.68100 2020-01-01 2020-01-02 2020-01-01 00:15:38 2020-01-02 03:43:59 2020-01-01 00:15:38.000 2020-01-02 03:43:59.000 938 99839 50388.5 5038850 938 99839 50388.5 5038850 -32630 32305 4513.3 451330 -125 126 2.58 258 +939 2 10929 99840 2.81981 299.81981 151.31981 15131.98198 2.81982 299.81982 151.31982 15131.98217 2.81981 299.81981 151.31981 15131.98100 2020-01-01 2020-01-02 2020-01-01 00:15:39 2020-01-02 03:44:00 2020-01-01 00:15:39.000 2020-01-02 03:44:00.000 939 99840 50389.5 5038950 939 99840 50389.5 5038950 -32629 32306 4514.3 451430 -124 127 3.58 358 +94 2 10084 99994 0.28228 300.28228 150.28228 15178.51051 0.28228 300.2823 150.28228 15178.51078 0.28228 300.28228 150.28228 15178.51028 2020-01-01 2020-01-02 2020-01-01 00:01:34 2020-01-02 03:46:34 2020-01-01 00:01:34.000 2020-01-02 03:46:34.000 94 99994 50044 5054444 94 99994 50044 5054444 -32475 32460 4623.009900990099 466924 -126 125 -0.19801980198019803 -20 +940 2 10930 99841 2.82282 299.82282 151.32282 15132.28228 2.82282 299.8228 151.32282 15132.28247 2.82282 299.82282 151.32282 15132.28200 2020-01-01 2020-01-02 2020-01-01 00:15:40 2020-01-02 03:44:01 2020-01-01 00:15:40.000 2020-01-02 03:44:01.000 940 99841 50390.5 5039050 940 99841 50390.5 5039050 -32628 32307 4515.3 451530 -128 127 2.02 202 +941 2 10931 99842 2.82582 299.82582 151.32582 15132.58258 2.82582 299.82584 151.32582 15132.58257 2.82582 299.82582 151.32582 15132.58200 2020-01-01 2020-01-02 2020-01-01 00:15:41 2020-01-02 03:44:02 2020-01-01 00:15:41.000 2020-01-02 03:44:02.000 941 99842 50391.5 5039150 941 99842 50391.5 5039150 -32627 32308 4516.3 451630 -128 127 0.46 46 +942 2 10932 99843 2.82882 299.82882 151.32882 15132.88288 2.82882 299.82883 151.32882 15132.88275 2.82882 299.82882 151.32882 15132.88200 2020-01-01 2020-01-02 2020-01-01 00:15:42 2020-01-02 03:44:03 2020-01-01 00:15:42.000 2020-01-02 03:44:03.000 942 99843 50392.5 5039250 942 99843 50392.5 5039250 -32626 32309 4517.3 451730 -128 124 -1.1 -110 +943 2 10933 99844 2.83183 299.83183 151.33183 15133.18318 2.83183 299.83182 151.33183 15133.18304 2.83183 299.83183 151.33183 15133.18300 2020-01-01 2020-01-02 2020-01-01 00:15:43 2020-01-02 03:44:04 2020-01-01 00:15:43.000 2020-01-02 03:44:04.000 943 99844 50393.5 5039350 943 99844 50393.5 5039350 -32625 32310 4518.3 451830 -127 125 -0.1 -10 +944 2 10934 99845 2.83483 299.83483 151.33483 15133.48348 2.83483 299.83484 151.33483 15133.48364 2.83483 299.83483 151.33483 15133.48300 2020-01-01 2020-01-02 2020-01-01 00:15:44 2020-01-02 03:44:05 2020-01-01 00:15:44.000 2020-01-02 03:44:05.000 944 99845 50394.5 5039450 944 99845 50394.5 5039450 -32624 32311 4519.3 451930 -126 126 0.9 90 +945 2 10935 99846 2.83783 299.83783 151.33783 15133.78378 2.83783 299.83783 151.33783 15133.78393 2.83783 299.83783 151.33783 15133.78300 2020-01-01 2020-01-02 2020-01-01 00:15:45 2020-01-02 03:44:06 2020-01-01 00:15:45.000 2020-01-02 03:44:06.000 945 99846 50395.5 5039550 945 99846 50395.5 5039550 -32623 32312 4520.3 452030 -125 127 1.9 190 +946 2 10936 99847 2.84084 299.84084 151.34084 15134.08408 2.84084 299.84085 151.34084 15134.08404 2.84084 299.84084 151.34084 15134.08400 2020-01-01 2020-01-02 2020-01-01 00:15:46 2020-01-02 03:44:07 2020-01-01 00:15:46.000 2020-01-02 03:44:07.000 946 99847 50396.5 5039650 946 99847 50396.5 5039650 -32622 32313 4521.3 452130 -128 127 0.34 34 +947 2 10937 99848 2.84384 299.84384 151.34384 15134.38438 2.84384 299.84384 151.34384 15134.38421 2.84384 299.84384 151.34384 15134.38400 2020-01-01 2020-01-02 2020-01-01 00:15:47 2020-01-02 03:44:08 2020-01-01 00:15:47.000 2020-01-02 03:44:08.000 947 99848 50397.5 5039750 947 99848 50397.5 5039750 -32621 32314 4522.3 452230 -128 127 -1.22 -122 +948 2 10938 99849 2.84684 299.84684 151.34684 15134.68468 2.84684 299.84683 151.34684 15134.68452 2.84684 299.84684 151.34684 15134.68400 2020-01-01 2020-01-02 2020-01-01 00:15:48 2020-01-02 03:44:09 2020-01-01 00:15:48.000 2020-01-02 03:44:09.000 948 99849 50398.5 5039850 948 99849 50398.5 5039850 -32620 32315 4523.3 452330 -128 123 -2.78 -278 +949 2 10939 99850 2.84984 299.84984 151.34984 15134.98498 2.84985 299.84985 151.34985 15134.98527 2.84984 299.84984 151.34984 15134.98400 2020-01-01 2020-01-02 2020-01-01 00:15:49 2020-01-02 03:44:10 2020-01-01 00:15:49.000 2020-01-02 03:44:10.000 949 99850 50399.5 5039950 949 99850 50399.5 5039950 -32619 32316 4524.3 452430 -127 124 -1.78 -178 +95 2 10085 99995 0.28528 300.28528 150.28528 15178.81381 0.28528 300.28528 150.28528 15178.81343 0.28528 300.28528 150.28528 15178.81328 2020-01-01 2020-01-02 2020-01-01 00:01:35 2020-01-02 03:46:35 2020-01-01 00:01:35.000 2020-01-02 03:46:35.000 95 99995 50045 5054545 95 99995 50045 5054545 -32474 32461 4624.009900990099 467025 -125 126 0.801980198019802 81 +950 2 10940 99851 2.85285 299.85285 151.35285 15135.28528 2.85285 299.85284 151.35285 15135.28541 2.85285 299.85285 151.35285 15135.28500 2020-01-01 2020-01-02 2020-01-01 00:15:50 2020-01-02 03:44:11 2020-01-01 00:15:50.000 2020-01-02 03:44:11.000 950 99851 50400.5 5040050 950 99851 50400.5 5040050 -32618 32317 4525.3 452530 -126 125 -0.78 -78 +951 2 10941 99852 2.85585 299.85585 151.35585 15135.58558 2.85585 299.85587 151.35585 15135.58551 2.85585 299.85585 151.35585 15135.58500 2020-01-01 2020-01-02 2020-01-01 00:15:51 2020-01-02 03:44:12 2020-01-01 00:15:51.000 2020-01-02 03:44:12.000 951 99852 50401.5 5040150 951 99852 50401.5 5040150 -32617 32318 4526.3 452630 -125 126 0.22 22 +952 2 10942 99853 2.85885 299.85885 151.35885 15135.88588 2.85885 299.85886 151.35885 15135.88568 2.85885 299.85885 151.35885 15135.88500 2020-01-01 2020-01-02 2020-01-01 00:15:52 2020-01-02 03:44:13 2020-01-01 00:15:52.000 2020-01-02 03:44:13.000 952 99853 50402.5 5040250 952 99853 50402.5 5040250 -32616 32319 4527.3 452730 -124 127 1.22 122 +953 2 10943 99854 2.86186 299.86186 151.36186 15136.18618 2.86186 299.86185 151.36185 15136.18598 2.86186 299.86186 151.36186 15136.18600 2020-01-01 2020-01-02 2020-01-01 00:15:53 2020-01-02 03:44:14 2020-01-01 00:15:53.000 2020-01-02 03:44:14.000 953 99854 50403.5 5040350 953 99854 50403.5 5040350 -32615 32320 4528.3 452830 -128 127 -0.34 -34 +954 2 10944 99855 2.86486 299.86486 151.36486 15136.48648 2.86486 299.86487 151.36486 15136.48674 2.86486 299.86486 151.36486 15136.48600 2020-01-01 2020-01-02 2020-01-01 00:15:54 2020-01-02 03:44:15 2020-01-01 00:15:54.000 2020-01-02 03:44:15.000 954 99855 50404.5 5040450 954 99855 50404.5 5040450 -32614 32321 4529.3 452930 -128 123 -1.9 -190 +955 2 10945 99856 2.86786 299.86786 151.36786 15136.78678 2.86786 299.86786 151.36786 15136.78688 2.86786 299.86786 151.36786 15136.78600 2020-01-01 2020-01-02 2020-01-01 00:15:55 2020-01-02 03:44:16 2020-01-01 00:15:55.000 2020-01-02 03:44:16.000 955 99856 50405.5 5040550 955 99856 50405.5 5040550 -32613 32322 4530.3 453030 -127 124 -0.9 -90 +956 2 10946 99857 2.87087 299.87087 151.37087 15137.08708 2.87087 299.87088 151.37087 15137.08701 2.87087 299.87087 151.37087 15137.08700 2020-01-01 2020-01-02 2020-01-01 00:15:56 2020-01-02 03:44:17 2020-01-01 00:15:56.000 2020-01-02 03:44:17.000 956 99857 50406.5 5040650 956 99857 50406.5 5040650 -32612 32323 4531.3 453130 -126 125 0.1 10 +957 2 10947 99858 2.87387 299.87387 151.37387 15137.38738 2.87387 299.87387 151.37387 15137.38716 2.87387 299.87387 151.37387 15137.38700 2020-01-01 2020-01-02 2020-01-01 00:15:57 2020-01-02 03:44:18 2020-01-01 00:15:57.000 2020-01-02 03:44:18.000 957 99858 50407.5 5040750 957 99858 50407.5 5040750 -32611 32324 4532.3 453230 -125 126 1.1 110 +958 2 10948 99859 2.87687 299.87687 151.37687 15137.68768 2.87687 299.8769 151.37687 15137.68791 2.87687 299.87687 151.37687 15137.68700 2020-01-01 2020-01-02 2020-01-01 00:15:58 2020-01-02 03:44:19 2020-01-01 00:15:58.000 2020-01-02 03:44:19.000 958 99859 50408.5 5040850 958 99859 50408.5 5040850 -32610 32325 4533.3 453330 -124 127 2.1 210 +959 2 10949 99860 2.87987 299.87987 151.37987 15137.98798 2.87988 299.87988 151.37988 15137.9882 2.87987 299.87987 151.37987 15137.98700 2020-01-01 2020-01-02 2020-01-01 00:15:59 2020-01-02 03:44:20 2020-01-01 00:15:59.000 2020-01-02 03:44:20.000 959 99860 50409.5 5040950 959 99860 50409.5 5040950 -32609 32326 4534.3 453430 -128 127 0.54 54 +96 2 10086 99996 0.28828 300.28828 150.28828 15179.11711 0.28828 300.2883 150.28828 15179.11718 0.28828 300.28828 150.28828 15179.11628 2020-01-01 2020-01-02 2020-01-01 00:01:36 2020-01-02 03:46:36 2020-01-01 00:01:36.000 2020-01-02 03:46:36.000 96 99996 50046 5054646 96 99996 50046 5054646 -32473 32462 4625.009900990099 467126 -124 127 1.801980198019802 182 +960 2 10950 99861 2.88288 299.88288 151.38288 15138.28828 2.88288 299.88287 151.38288 15138.28834 2.88288 299.88288 151.38288 15138.28800 2020-01-01 2020-01-02 2020-01-01 00:16:00 2020-01-02 03:44:21 2020-01-01 00:16:00.000 2020-01-02 03:44:21.000 960 99861 50410.5 5041050 960 99861 50410.5 5041050 -32608 32327 4535.3 453530 -128 123 -1.02 -102 +961 2 10951 99862 2.88588 299.88588 151.38588 15138.58858 2.88588 299.8859 151.38588 15138.58848 2.88588 299.88588 151.38588 15138.58800 2020-01-01 2020-01-02 2020-01-01 00:16:01 2020-01-02 03:44:22 2020-01-01 00:16:01.000 2020-01-02 03:44:22.000 961 99862 50411.5 5041150 961 99862 50411.5 5041150 -32607 32328 4536.3 453630 -127 124 -0.02 -2 +962 2 10952 99863 2.88888 299.88888 151.38888 15138.88888 2.88888 299.8889 151.38888 15138.88862 2.88888 299.88888 151.38888 15138.88800 2020-01-01 2020-01-02 2020-01-01 00:16:02 2020-01-02 03:44:23 2020-01-01 00:16:02.000 2020-01-02 03:44:23.000 962 99863 50412.5 5041250 962 99863 50412.5 5041250 -32606 32329 4537.3 453730 -126 125 0.98 98 +963 2 10953 99864 2.89189 299.89189 151.39189 15139.18918 2.89189 299.8919 151.39189 15139.18937 2.89189 299.89189 151.39189 15139.18900 2020-01-01 2020-01-02 2020-01-01 00:16:03 2020-01-02 03:44:24 2020-01-01 00:16:03.000 2020-01-02 03:44:24.000 963 99864 50413.5 5041350 963 99864 50413.5 5041350 -32605 32330 4538.3 453830 -125 126 1.98 198 +964 2 10954 99865 2.89489 299.89489 151.39489 15139.48948 2.89489 299.8949 151.39489 15139.48968 2.89489 299.89489 151.39489 15139.48900 2020-01-01 2020-01-02 2020-01-01 00:16:04 2020-01-02 03:44:25 2020-01-01 00:16:04.000 2020-01-02 03:44:25.000 964 99865 50414.5 5041450 964 99865 50414.5 5041450 -32604 32331 4539.3 453930 -124 127 2.98 298 +965 2 10955 99866 2.89789 299.89789 151.39789 15139.78978 2.89789 299.8979 151.39789 15139.78985 2.89789 299.89789 151.39789 15139.78900 2020-01-01 2020-01-02 2020-01-01 00:16:05 2020-01-02 03:44:26 2020-01-01 00:16:05.000 2020-01-02 03:44:26.000 965 99866 50415.5 5041550 965 99866 50415.5 5041550 -32603 32332 4540.3 454030 -128 127 1.42 142 +966 2 10956 99867 2.9009 299.9009 151.4009 15140.09009 2.9009 299.9009 151.40089 15140.08996 2.90090 299.90090 151.40090 15140.09000 2020-01-01 2020-01-02 2020-01-01 00:16:06 2020-01-02 03:44:27 2020-01-01 00:16:06.000 2020-01-02 03:44:27.000 966 99867 50416.5 5041650 966 99867 50416.5 5041650 -32602 32333 4541.3 454130 -128 127 -0.14 -14 +967 2 10957 99868 2.9039 299.9039 151.4039 15140.39039 2.9039 299.9039 151.4039 15140.39009 2.90390 299.90390 151.40390 15140.39000 2020-01-01 2020-01-02 2020-01-01 00:16:07 2020-01-02 03:44:28 2020-01-01 00:16:07.000 2020-01-02 03:44:28.000 967 99868 50417.5 5041750 967 99868 50417.5 5041750 -32601 32334 4542.3 454230 -128 124 -1.7 -170 +968 2 10958 99869 2.9069 299.9069 151.4069 15140.69069 2.9069 299.90692 151.4069 15140.69084 2.90690 299.90690 151.40690 15140.69000 2020-01-01 2020-01-02 2020-01-01 00:16:08 2020-01-02 03:44:29 2020-01-01 00:16:08.000 2020-01-02 03:44:29.000 968 99869 50418.5 5041850 968 99869 50418.5 5041850 -32600 32335 4543.3 454330 -127 125 -0.7 -70 +969 2 10959 99870 2.9099 299.9099 151.4099 15140.99099 2.90991 299.9099 151.40991 15140.99114 2.90990 299.90990 151.40990 15140.99000 2020-01-01 2020-01-02 2020-01-01 00:16:09 2020-01-02 03:44:30 2020-01-01 00:16:09.000 2020-01-02 03:44:30.000 969 99870 50419.5 5041950 969 99870 50419.5 5041950 -32599 32336 4544.3 454430 -126 126 0.3 30 +97 2 10087 99997 0.29129 300.29129 150.29129 15179.42042 0.29129 300.2913 150.29129 15179.42033 0.29129 300.29129 150.29129 15179.42029 2020-01-01 2020-01-02 2020-01-01 00:01:37 2020-01-02 03:46:37 2020-01-01 00:01:37.000 2020-01-02 03:46:37.000 97 99997 50047 5054747 97 99997 50047 5054747 -32472 32463 4626.009900990099 467227 -128 127 0.26732673267326734 27 +970 2 10960 99871 2.91291 299.91291 151.41291 15141.29129 2.91291 299.9129 151.41291 15141.29132 2.91291 299.91291 151.41291 15141.29100 2020-01-01 2020-01-02 2020-01-01 00:16:10 2020-01-02 03:44:31 2020-01-01 00:16:10.000 2020-01-02 03:44:31.000 970 99871 50420.5 5042050 970 99871 50420.5 5042050 -32598 32337 4545.3 454530 -125 127 1.3 130 +971 2 10961 99872 2.91591 299.91591 151.41591 15141.59159 2.91591 299.91592 151.41591 15141.59142 2.91591 299.91591 151.41591 15141.59100 2020-01-01 2020-01-02 2020-01-01 00:16:11 2020-01-02 03:44:32 2020-01-01 00:16:11.000 2020-01-02 03:44:32.000 971 99872 50421.5 5042150 971 99872 50421.5 5042150 -32597 32338 4546.3 454630 -128 127 -0.26 -26 +972 2 10962 99873 2.91891 299.91891 151.41891 15141.89189 2.91891 299.9189 151.41891 15141.89172 2.91891 299.91891 151.41891 15141.89100 2020-01-01 2020-01-02 2020-01-01 00:16:12 2020-01-02 03:44:33 2020-01-01 00:16:12.000 2020-01-02 03:44:33.000 972 99873 50422.5 5042250 972 99873 50422.5 5042250 -32596 32339 4547.3 454730 -128 127 -1.82 -182 +973 2 10963 99874 2.92192 299.92192 151.42192 15142.19219 2.92192 299.92194 151.42192 15142.19232 2.92192 299.92192 151.42192 15142.19200 2020-01-01 2020-01-02 2020-01-01 00:16:13 2020-01-02 03:44:34 2020-01-01 00:16:13.000 2020-01-02 03:44:34.000 973 99874 50423.5 5042350 973 99874 50423.5 5042350 -32595 32340 4548.3 454830 -128 123 -3.38 -338 +974 2 10964 99875 2.92492 299.92492 151.42492 15142.49249 2.92492 299.92493 151.42492 15142.49265 2.92492 299.92492 151.42492 15142.49200 2020-01-01 2020-01-02 2020-01-01 00:16:14 2020-01-02 03:44:35 2020-01-01 00:16:14.000 2020-01-02 03:44:35.000 974 99875 50424.5 5042450 974 99875 50424.5 5042450 -32594 32341 4549.3 454930 -127 124 -2.38 -238 +975 2 10965 99876 2.92792 299.92792 151.42792 15142.79279 2.92792 299.92792 151.42792 15142.79279 2.92792 299.92792 151.42792 15142.79200 2020-01-01 2020-01-02 2020-01-01 00:16:15 2020-01-02 03:44:36 2020-01-01 00:16:15.000 2020-01-02 03:44:36.000 975 99876 50425.5 5042550 975 99876 50425.5 5042550 -32593 32342 4550.3 455030 -126 125 -1.38 -138 +976 2 10966 99877 2.93093 299.93093 151.43093 15143.09309 2.93093 299.93094 151.43092 15143.09289 2.93093 299.93093 151.43093 15143.09300 2020-01-01 2020-01-02 2020-01-01 00:16:16 2020-01-02 03:44:37 2020-01-01 00:16:16.000 2020-01-02 03:44:37.000 976 99877 50426.5 5042650 976 99877 50426.5 5042650 -32592 32343 4551.3 455130 -125 126 -0.38 -38 +977 2 10967 99878 2.93393 299.93393 151.43393 15143.39339 2.93393 299.93393 151.43393 15143.39318 2.93393 299.93393 151.43393 15143.39300 2020-01-01 2020-01-02 2020-01-01 00:16:17 2020-01-02 03:44:38 2020-01-01 00:16:17.000 2020-01-02 03:44:38.000 977 99878 50427.5 5042750 977 99878 50427.5 5042750 -32591 32344 4552.3 455230 -124 127 0.62 62 +978 2 10968 99879 2.93693 299.93693 151.43693 15143.69369 2.93693 299.93695 151.43693 15143.69378 2.93693 299.93693 151.43693 15143.69300 2020-01-01 2020-01-02 2020-01-01 00:16:18 2020-01-02 03:44:39 2020-01-01 00:16:18.000 2020-01-02 03:44:39.000 978 99879 50428.5 5042850 978 99879 50428.5 5042850 -32590 32345 4553.3 455330 -128 127 -0.94 -94 +979 2 10969 99880 2.93993 299.93993 151.43993 15143.99399 2.93994 299.93994 151.43994 15143.99412 2.93993 299.93993 151.43993 15143.99300 2020-01-01 2020-01-02 2020-01-01 00:16:19 2020-01-02 03:44:40 2020-01-01 00:16:19.000 2020-01-02 03:44:40.000 979 99880 50429.5 5042950 979 99880 50429.5 5042950 -32589 32346 4554.3 455430 -128 123 -2.5 -250 +98 2 10088 99998 0.29429 300.29429 150.29429 15179.72372 0.29429 300.29428 150.29429 15179.72363 0.29429 300.29429 150.29429 15179.72329 2020-01-01 2020-01-02 2020-01-01 00:01:38 2020-01-02 03:46:38 2020-01-01 00:01:38.000 2020-01-02 03:46:38.000 98 99998 50048 5054848 98 99998 50048 5054848 -32471 32464 4627.009900990099 467328 -128 127 -1.2673267326732673 -128 +980 2 10970 99881 2.94294 299.94294 151.44294 15144.29429 2.94294 299.94293 151.44294 15144.29426 2.94294 299.94294 151.44294 15144.29400 2020-01-01 2020-01-02 2020-01-01 00:16:20 2020-01-02 03:44:41 2020-01-01 00:16:20.000 2020-01-02 03:44:41.000 980 99881 50430.5 5043050 980 99881 50430.5 5043050 -32588 32347 4555.3 455530 -127 124 -1.5 -150 +981 2 10971 99882 2.94594 299.94594 151.44594 15144.59459 2.94594 299.94595 151.44595 15144.59501 2.94594 299.94594 151.44594 15144.59400 2020-01-01 2020-01-02 2020-01-01 00:16:21 2020-01-02 03:44:42 2020-01-01 00:16:21.000 2020-01-02 03:44:42.000 981 99882 50431.5 5043150 981 99882 50431.5 5043150 -32587 32348 4556.3 455630 -126 125 -0.5 -50 +982 2 10972 99883 2.94894 299.94894 151.44894 15144.89489 2.94894 299.94894 151.44894 15144.89466 2.94894 299.94894 151.44894 15144.89400 2020-01-01 2020-01-02 2020-01-01 00:16:22 2020-01-02 03:44:43 2020-01-01 00:16:22.000 2020-01-02 03:44:43.000 982 99883 50432.5 5043250 982 99883 50432.5 5043250 -32586 32349 4557.3 455730 -125 126 0.5 50 +983 2 10973 99884 2.95195 299.95195 151.45195 15145.19519 2.95195 299.95197 151.45195 15145.19525 2.95195 299.95195 151.45195 15145.19500 2020-01-01 2020-01-02 2020-01-01 00:16:23 2020-01-02 03:44:44 2020-01-01 00:16:23.000 2020-01-02 03:44:44.000 983 99884 50433.5 5043350 983 99884 50433.5 5043350 -32585 32350 4558.3 455830 -124 127 1.5 150 +984 2 10974 99885 2.95495 299.95495 151.45495 15145.49549 2.95495 299.95496 151.45495 15145.49559 2.95495 299.95495 151.45495 15145.49500 2020-01-01 2020-01-02 2020-01-01 00:16:24 2020-01-02 03:44:45 2020-01-01 00:16:24.000 2020-01-02 03:44:45.000 984 99885 50434.5 5043450 984 99885 50434.5 5043450 -32584 32351 4559.3 455930 -128 127 -0.06 -6 +985 2 10975 99886 2.95795 299.95795 151.45795 15145.79579 2.95795 299.95795 151.45795 15145.79573 2.95795 299.95795 151.45795 15145.79500 2020-01-01 2020-01-02 2020-01-01 00:16:25 2020-01-02 03:44:46 2020-01-01 00:16:25.000 2020-01-02 03:44:46.000 985 99886 50435.5 5043550 985 99886 50435.5 5043550 -32583 32352 4560.3 456030 -128 123 -1.62 -162 +986 2 10976 99887 2.96096 299.96096 151.46096 15146.09609 2.96096 299.96097 151.46096 15146.09648 2.96096 299.96096 151.46096 15146.09600 2020-01-01 2020-01-02 2020-01-01 00:16:26 2020-01-02 03:44:47 2020-01-01 00:16:26.000 2020-01-02 03:44:47.000 986 99887 50436.5 5043650 986 99887 50436.5 5043650 -32582 32353 4561.3 456130 -127 124 -0.62 -62 +987 2 10977 99888 2.96396 299.96396 151.46396 15146.39639 2.96396 299.96396 151.46396 15146.39612 2.96396 299.96396 151.46396 15146.39600 2020-01-01 2020-01-02 2020-01-01 00:16:27 2020-01-02 03:44:48 2020-01-01 00:16:27.000 2020-01-02 03:44:48.000 987 99888 50437.5 5043750 987 99888 50437.5 5043750 -32581 32354 4562.3 456230 -126 125 0.38 38 +988 2 10978 99889 2.96696 299.96696 151.46696 15146.69669 2.96696 299.96698 151.46696 15146.69676 2.96696 299.96696 151.46696 15146.69600 2020-01-01 2020-01-02 2020-01-01 00:16:28 2020-01-02 03:44:49 2020-01-01 00:16:28.000 2020-01-02 03:44:49.000 988 99889 50438.5 5043850 988 99889 50438.5 5043850 -32580 32355 4563.3 456330 -125 126 1.38 138 +989 2 10979 99890 2.96996 299.96996 151.46996 15146.99699 2.96997 299.96997 151.46997 15146.99706 2.96996 299.96996 151.46996 15146.99600 2020-01-01 2020-01-02 2020-01-01 00:16:29 2020-01-02 03:44:50 2020-01-01 00:16:29.000 2020-01-02 03:44:50.000 989 99890 50439.5 5043950 989 99890 50439.5 5043950 -32579 32356 4564.3 456430 -124 127 2.38 238 +99 2 10089 99999 0.29729 300.29729 150.29729 15180.02702 0.29729 300.2973 150.29729 15180.02726 0.29729 300.29729 150.29729 15180.02629 2020-01-01 2020-01-02 2020-01-01 00:01:39 2020-01-02 03:46:39 2020-01-01 00:01:39.000 2020-01-02 03:46:39.000 99 99999 50049 5054949 99 99999 50049 5054949 -32470 32465 4628.009900990099 467429 -128 123 -2.801980198019802 -283 +990 2 10980 99891 2.97297 299.97297 151.47297 15147.29729 2.97297 299.97296 151.47297 15147.29735 2.97297 299.97297 151.47297 15147.29700 2020-01-01 2020-01-02 2020-01-01 00:16:30 2020-01-02 03:44:51 2020-01-01 00:16:30.000 2020-01-02 03:44:51.000 990 99891 50440.5 5044050 990 99891 50440.5 5044050 -32578 32357 4565.3 456530 -128 127 0.82 82 +991 2 10981 99892 2.97597 299.97597 151.47597 15147.59759 2.97597 299.97598 151.47597 15147.59795 2.97597 299.97597 151.47597 15147.59700 2020-01-01 2020-01-02 2020-01-01 00:16:31 2020-01-02 03:44:52 2020-01-01 00:16:31.000 2020-01-02 03:44:52.000 991 99892 50441.5 5044150 991 99892 50441.5 5044150 -32577 32358 4566.3 456630 -128 127 -0.74 -74 +992 2 10982 99893 2.97897 299.97897 151.47897 15147.89789 2.97897 299.97897 151.47897 15147.89759 2.97897 299.97897 151.47897 15147.89700 2020-01-01 2020-01-02 2020-01-01 00:16:32 2020-01-02 03:44:53 2020-01-01 00:16:32.000 2020-01-02 03:44:53.000 992 99893 50442.5 5044250 992 99893 50442.5 5044250 -32576 32359 4567.3 456730 -128 124 -2.3 -230 +993 2 10983 99894 2.98198 299.98198 151.48198 15148.19819 2.98198 299.982 151.48198 15148.19823 2.98198 299.98198 151.48198 15148.19800 2020-01-01 2020-01-02 2020-01-01 00:16:33 2020-01-02 03:44:54 2020-01-01 00:16:33.000 2020-01-02 03:44:54.000 993 99894 50443.5 5044350 993 99894 50443.5 5044350 -32575 32360 4568.3 456830 -127 125 -1.3 -130 +994 2 10984 99895 2.98498 299.98498 151.48498 15148.49849 2.98498 299.985 151.48498 15148.49853 2.98498 299.98498 151.48498 15148.49800 2020-01-01 2020-01-02 2020-01-01 00:16:34 2020-01-02 03:44:55 2020-01-01 00:16:34.000 2020-01-02 03:44:55.000 994 99895 50444.5 5044450 994 99895 50444.5 5044450 -32574 32361 4569.3 456930 -126 126 -0.3 -30 +995 2 10985 99896 2.98798 299.98798 151.48798 15148.79879 2.98798 299.98798 151.48798 15148.79882 2.98798 299.98798 151.48798 15148.79800 2020-01-01 2020-01-02 2020-01-01 00:16:35 2020-01-02 03:44:56 2020-01-01 00:16:35.000 2020-01-02 03:44:56.000 995 99896 50445.5 5044550 995 99896 50445.5 5044550 -32573 32362 4570.3 457030 -125 127 0.7 70 +996 2 10986 99897 2.99099 299.99099 151.49099 15149.09909 2.99099 299.991 151.49099 15149.09942 2.99099 299.99099 151.49099 15149.09900 2020-01-01 2020-01-02 2020-01-01 00:16:36 2020-01-02 03:44:57 2020-01-01 00:16:36.000 2020-01-02 03:44:57.000 996 99897 50446.5 5044650 996 99897 50446.5 5044650 -32572 32363 4571.3 457130 -128 127 -0.86 -86 +997 2 10987 99898 2.99399 299.99399 151.49399 15149.39939 2.99399 299.994 151.49399 15149.3991 2.99399 299.99399 151.49399 15149.39900 2020-01-01 2020-01-02 2020-01-01 00:16:37 2020-01-02 03:44:58 2020-01-01 00:16:37.000 2020-01-02 03:44:58.000 997 99898 50447.5 5044750 997 99898 50447.5 5044750 -32571 32364 4572.3 457230 -128 127 -2.42 -242 +998 2 10988 99899 2.99699 299.99699 151.49699 15149.69969 2.99699 299.997 151.49699 15149.6997 2.99699 299.99699 151.49699 15149.69900 2020-01-01 2020-01-02 2020-01-01 00:16:38 2020-01-02 03:44:59 2020-01-01 00:16:38.000 2020-01-02 03:44:59.000 998 99899 50448.5 5044850 998 99899 50448.5 5044850 -32570 32365 4573.3 457330 -128 123 -3.98 -398 + ---- select row with nulls without states ---- +-2 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N + ---- select row with nulls with states ---- +-2 1 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N + ---- select no rows without states ---- +0 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N + ---- select no rows with states ---- +0 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N diff --git a/tests/queries/0_stateless/01518_nullable_aggregate_states2.sql b/tests/queries/0_stateless/01518_nullable_aggregate_states2.sql new file mode 100644 index 00000000000..11de58282d1 --- /dev/null +++ b/tests/queries/0_stateless/01518_nullable_aggregate_states2.sql @@ -0,0 +1,411 @@ +DROP TABLE IF EXISTS testNullableStates; +DROP TABLE IF EXISTS testNullableStatesAgg; + +CREATE TABLE testNullableStates ( + ts DateTime, + id String, + string Nullable(String), + float64 Nullable(Float64), + float32 Nullable(Float32), + decimal325 Nullable(Decimal32(5)), + date Nullable(Date), + datetime Nullable(DateTime), + datetime64 Nullable(DateTime64), + int64 Nullable(Int64), + int32 Nullable(Int32), + int16 Nullable(Int16), + int8 Nullable(Int8)) +ENGINE=MergeTree PARTITION BY toStartOfDay(ts) ORDER BY id; + +INSERT INTO testNullableStates SELECT + toDateTime('2020-01-01 00:00:00') + number AS ts, + toString(number % 999) AS id, + toString(number) AS string, + number / 333 AS float64, + number / 333 AS float32, + number / 333 AS decimal325, + toDate(ts), + ts, + ts, + number, + toInt32(number), + toInt16(number), + toInt8(number) +FROM numbers(100000); + +INSERT INTO testNullableStates SELECT + toDateTime('2020-01-01 00:00:00') + number AS ts, + toString(number % 999 - 5) AS id, + NULL AS string, + NULL AS float64, + NULL AS float32, + NULL AS decimal325, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +FROM numbers(500); + + +CREATE TABLE testNullableStatesAgg +( + `ts` DateTime, + `id` String, + `stringMin` AggregateFunction(min, Nullable(String)), + `stringMax` AggregateFunction(max, Nullable(String)), + `float64Min` AggregateFunction(min, Nullable(Float64)), + `float64Max` AggregateFunction(max, Nullable(Float64)), + `float64Avg` AggregateFunction(avg, Nullable(Float64)), + `float64Sum` AggregateFunction(sum, Nullable(Float64)), + `float32Min` AggregateFunction(min, Nullable(Float32)), + `float32Max` AggregateFunction(max, Nullable(Float32)), + `float32Avg` AggregateFunction(avg, Nullable(Float32)), + `float32Sum` AggregateFunction(sum, Nullable(Float32)), + `decimal325Min` AggregateFunction(min, Nullable(Decimal32(5))), + `decimal325Max` AggregateFunction(max, Nullable(Decimal32(5))), + `decimal325Avg` AggregateFunction(avg, Nullable(Decimal32(5))), + `decimal325Sum` AggregateFunction(sum, Nullable(Decimal32(5))), + `dateMin` AggregateFunction(min, Nullable(Date)), + `dateMax` AggregateFunction(max, Nullable(Date)), + `datetimeMin` AggregateFunction(min, Nullable(DateTime)), + `datetimeMax` AggregateFunction(max, Nullable(DateTime)), + `datetime64Min` AggregateFunction(min, Nullable(datetime64)), + `datetime64Max` AggregateFunction(max, Nullable(datetime64)), + `int64Min` AggregateFunction(min, Nullable(Int64)), + `int64Max` AggregateFunction(max, Nullable(Int64)), + `int64Avg` AggregateFunction(avg, Nullable(Int64)), + `int64Sum` AggregateFunction(sum, Nullable(Int64)), + `int32Min` AggregateFunction(min, Nullable(Int32)), + `int32Max` AggregateFunction(max, Nullable(Int32)), + `int32Avg` AggregateFunction(avg, Nullable(Int32)), + `int32Sum` AggregateFunction(sum, Nullable(Int32)), + `int16Min` AggregateFunction(min, Nullable(Int16)), + `int16Max` AggregateFunction(max, Nullable(Int16)), + `int16Avg` AggregateFunction(avg, Nullable(Int16)), + `int16Sum` AggregateFunction(sum, Nullable(Int16)), + `int8Min` AggregateFunction(min, Nullable(Int8)), + `int8Max` AggregateFunction(max, Nullable(Int8)), + `int8Avg` AggregateFunction(avg, Nullable(Int8)), + `int8Sum` AggregateFunction(sum, Nullable(Int8)) +) +ENGINE = AggregatingMergeTree() +PARTITION BY toStartOfDay(ts) +ORDER BY id; + + + + +insert into testNullableStatesAgg +select + ts DateTime, + id String, + minState(string) stringMin, + maxState(string) stringMax, + minState(float64) float64Min, + maxState(float64) float64Max, + avgState(float64) float64Avg, + sumState(float64) float64Sum, + minState(float32) float32Min, + maxState(float32) float32Max, + avgState(float32) float32Avg, + sumState(float32) float32Sum, + minState(decimal325) decimal325Min, + maxState(decimal325) decimal325Max, + avgState(decimal325) decimal325Avg, + sumState(decimal325) decimal325Sum, + minState(date) dateMin, + maxState(date) dateMax, + minState(datetime) datetimeMin, + maxState(datetime) datetimeMax, + minState(datetime64) datetime64Min, + maxState(datetime64) datetime64Max, + minState(int64) int64Min, + maxState(int64) int64Max, + avgState(int64) int64Avg, + sumState(int64) int64Sum, + minState(int32) int32Min, + maxState(int32) int32Max, + avgState(int32) int32Avg, + sumState(int32) int32Sum, + minState(int16) int16Min, + maxState(int16) int16Max, + avgState(int16) int16Avg, + sumState(int16) int16Sum, + minState(int8) int8Min, + maxState(int8) int8Max, + avgState(int8) int8Avg, + sumState(int8) int8Sum +from testNullableStates +group by ts, id; + +OPTIMIZE TABLE testNullableStatesAgg FINAL; + +select count() from testNullableStates; + +select count() from testNullableStatesAgg; + +select ' ---- select without states ---- '; + +SELECT id, count(), + min(string), + max(string), + floor(min(float64),5), + floor(max(float64),5), + floor(avg(float64),5), + floor(sum(float64),5), + floor(min(float32),5), + floor(max(float32),5), + floor(avg(float32),5), + floor(sum(float32),5), + min(decimal325), + max(decimal325), + avg(decimal325), + sum(decimal325), + min(date), + max(date), + min(datetime), + max(datetime), + min(datetime64), + max(datetime64), + min(int64), + max(int64), + avg(int64), + sum(int64), + min(int32), + max(int32), + avg(int32), + sum(int32), + min(int16), + max(int16), + avg(int16), + sum(int16), + min(int8), + max(int8), + avg(int8), + sum(int8) +FROM testNullableStates +GROUP BY id +ORDER BY id ASC; + +select ' ---- select with states ---- '; + +SELECT id, count(), + minMerge(stringMin), + maxMerge(stringMax), + floor(minMerge(float64Min),5), + floor(maxMerge(float64Max),5), + floor(avgMerge(float64Avg),5), + floor(sumMerge(float64Sum),5), + floor(minMerge(float32Min),5), + floor(maxMerge(float32Max),5), + floor(avgMerge(float32Avg),5), + floor(sumMerge(float32Sum),5), + minMerge(decimal325Min), + maxMerge(decimal325Max), + avgMerge(decimal325Avg), + sumMerge(decimal325Sum), + minMerge(dateMin), + maxMerge(dateMax), + minMerge(datetimeMin), + maxMerge(datetimeMax), + minMerge(datetime64Min), + maxMerge(datetime64Max), + minMerge(int64Min), + maxMerge(int64Max), + avgMerge(int64Avg), + sumMerge(int64Sum), + minMerge(int32Min), + maxMerge(int32Max), + avgMerge(int32Avg), + sumMerge(int32Sum), + minMerge(int16Min), + maxMerge(int16Max), + avgMerge(int16Avg), + sumMerge(int16Sum), + minMerge(int8Min), + maxMerge(int8Max), + avgMerge(int8Avg), + sumMerge(int8Sum) +FROM testNullableStatesAgg +GROUP BY id +ORDER BY id ASC; + + +select ' ---- select row with nulls without states ---- '; + +SELECT id, count(), + min(string), + max(string), + floor(min(float64),5), + floor(max(float64),5), + floor(avg(float64),5), + floor(sum(float64),5), + floor(min(float32),5), + floor(max(float32),5), + floor(avg(float32),5), + floor(sum(float32),5), + min(decimal325), + max(decimal325), + avg(decimal325), + sum(decimal325), + min(date), + max(date), + min(datetime), + max(datetime), + min(datetime64), + max(datetime64), + min(int64), + max(int64), + avg(int64), + sum(int64), + min(int32), + max(int32), + avg(int32), + sum(int32), + min(int16), + max(int16), + avg(int16), + sum(int16), + min(int8), + max(int8), + avg(int8), + sum(int8) +FROM testNullableStates +WHERE id = '-2' +GROUP BY id +ORDER BY id ASC; + +select ' ---- select row with nulls with states ---- '; + +SELECT id, count(), + minMerge(stringMin), + maxMerge(stringMax), + floor(minMerge(float64Min),5), + floor(maxMerge(float64Max),5), + floor(avgMerge(float64Avg),5), + floor(sumMerge(float64Sum),5), + floor(minMerge(float32Min),5), + floor(maxMerge(float32Max),5), + floor(avgMerge(float32Avg),5), + floor(sumMerge(float32Sum),5), + minMerge(decimal325Min), + maxMerge(decimal325Max), + avgMerge(decimal325Avg), + sumMerge(decimal325Sum), + minMerge(dateMin), + maxMerge(dateMax), + minMerge(datetimeMin), + maxMerge(datetimeMax), + minMerge(datetime64Min), + maxMerge(datetime64Max), + minMerge(int64Min), + maxMerge(int64Max), + avgMerge(int64Avg), + sumMerge(int64Sum), + minMerge(int32Min), + maxMerge(int32Max), + avgMerge(int32Avg), + sumMerge(int32Sum), + minMerge(int16Min), + maxMerge(int16Max), + avgMerge(int16Avg), + sumMerge(int16Sum), + minMerge(int8Min), + maxMerge(int8Max), + avgMerge(int8Avg), + sumMerge(int8Sum) +FROM testNullableStatesAgg +WHERE id = '-2' +GROUP BY id +ORDER BY id ASC; + + +select ' ---- select no rows without states ---- '; + +SELECT count(), + min(string), + max(string), + floor(min(float64),5), + floor(max(float64),5), + floor(avg(float64),5), + floor(sum(float64),5), + floor(min(float32),5), + floor(max(float32),5), + floor(avg(float32),5), + floor(sum(float32),5), + min(decimal325), + max(decimal325), + avg(decimal325), + sum(decimal325), + min(date), + max(date), + min(datetime), + max(datetime), + min(datetime64), + max(datetime64), + min(int64), + max(int64), + avg(int64), + sum(int64), + min(int32), + max(int32), + avg(int32), + sum(int32), + min(int16), + max(int16), + avg(int16), + sum(int16), + min(int8), + max(int8), + avg(int8), + sum(int8) +FROM testNullableStates +WHERE id = '-22'; + +select ' ---- select no rows with states ---- '; + +SELECT count(), + minMerge(stringMin), + maxMerge(stringMax), + floor(minMerge(float64Min),5), + floor(maxMerge(float64Max),5), + floor(avgMerge(float64Avg),5), + floor(sumMerge(float64Sum),5), + floor(minMerge(float32Min),5), + floor(maxMerge(float32Max),5), + floor(avgMerge(float32Avg),5), + floor(sumMerge(float32Sum),5), + minMerge(decimal325Min), + maxMerge(decimal325Max), + avgMerge(decimal325Avg), + sumMerge(decimal325Sum), + minMerge(dateMin), + maxMerge(dateMax), + minMerge(datetimeMin), + maxMerge(datetimeMax), + minMerge(datetime64Min), + maxMerge(datetime64Max), + minMerge(int64Min), + maxMerge(int64Max), + avgMerge(int64Avg), + sumMerge(int64Sum), + minMerge(int32Min), + maxMerge(int32Max), + avgMerge(int32Avg), + sumMerge(int32Sum), + minMerge(int16Min), + maxMerge(int16Max), + avgMerge(int16Avg), + sumMerge(int16Sum), + minMerge(int8Min), + maxMerge(int8Max), + avgMerge(int8Avg), + sumMerge(int8Sum) +FROM testNullableStatesAgg +WHERE id = '-22'; + +DROP TABLE testNullableStates; +DROP TABLE testNullableStatesAgg; diff --git a/tests/queries/0_stateless/01519_topK_distributed_parametrized.reference b/tests/queries/0_stateless/01519_topK_distributed_parametrized.reference new file mode 100644 index 00000000000..9de83e04b5b --- /dev/null +++ b/tests/queries/0_stateless/01519_topK_distributed_parametrized.reference @@ -0,0 +1,6 @@ +30 +30 +10 +10 +3 +3 diff --git a/tests/queries/0_stateless/01519_topK_distributed_parametrized.sql b/tests/queries/0_stateless/01519_topK_distributed_parametrized.sql new file mode 100644 index 00000000000..9963823023d --- /dev/null +++ b/tests/queries/0_stateless/01519_topK_distributed_parametrized.sql @@ -0,0 +1,16 @@ +CREATE TABLE IF NOT EXISTS topXtest(A Int64) ENGINE = Memory; +INSERT INTO topXtest SELECT number FROM numbers(100); +INSERT INTO topXtest SELECT number FROM numbers(30); +INSERT INTO topXtest SELECT number FROM numbers(10); + +SELECT length(topK(30)(A)) FROM topXtest; +SELECT length(topK(30)(A)) FROM remote('localhost,127.0.0.1', currentDatabase(), topXtest); + +SELECT length(topK(A)) FROM topXtest; +SELECT length(topK(A)) FROM remote('localhost,127.0.0.1', currentDatabase(), topXtest); + +SELECT length(topK(3)(A)) FROM topXtest; +SELECT length(topK(3)(A)) FROM remote('localhost,127.0.0.1', currentDatabase(), topXtest); + +DROP TABLE topXtest; + diff --git a/tests/queries/0_stateless/01521_global_in_prewhere_15792.reference b/tests/queries/0_stateless/01521_global_in_prewhere_15792.reference new file mode 100644 index 00000000000..f7393e847d3 --- /dev/null +++ b/tests/queries/0_stateless/01521_global_in_prewhere_15792.reference @@ -0,0 +1 @@ +100000 diff --git a/tests/queries/0_stateless/01521_global_in_prewhere_15792.sql b/tests/queries/0_stateless/01521_global_in_prewhere_15792.sql new file mode 100644 index 00000000000..adb7bccd0df --- /dev/null +++ b/tests/queries/0_stateless/01521_global_in_prewhere_15792.sql @@ -0,0 +1,12 @@ +drop table if exists xp; +drop table if exists xp_d; + +create table xp(A Date, B Int64, S String) Engine=MergeTree partition by toYYYYMM(A) order by B; +insert into xp select '2020-01-01', number , '' from numbers(100000); + +create table xp_d as xp Engine=Distributed(test_shard_localhost, currentDatabase(), xp); + +select count() from xp_d prewhere toYYYYMM(A) global in (select toYYYYMM(min(A)) from xp_d) where B > -1; + +drop table if exists xp; +drop table if exists xp_d; diff --git a/tests/queries/0_stateless/01528_allow_nondeterministic_optimize_skip_unused_shards.reference b/tests/queries/0_stateless/01528_allow_nondeterministic_optimize_skip_unused_shards.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/01528_allow_nondeterministic_optimize_skip_unused_shards.sql b/tests/queries/0_stateless/01528_allow_nondeterministic_optimize_skip_unused_shards.sql new file mode 100644 index 00000000000..b0bfb2aae3f --- /dev/null +++ b/tests/queries/0_stateless/01528_allow_nondeterministic_optimize_skip_unused_shards.sql @@ -0,0 +1,7 @@ +drop table if exists dist_01528; +create table dist_01528 as system.one engine=Distributed('test_cluster_two_shards', system, one, rand()+dummy); + +set optimize_skip_unused_shards=1; +set force_optimize_skip_unused_shards=1; +select * from dist_01528 where dummy = 2; -- { serverError 507; } +select * from dist_01528 where dummy = 2 settings allow_nondeterministic_optimize_skip_unused_shards=1; diff --git a/tests/queries/0_stateless/01528_play.reference b/tests/queries/0_stateless/01528_play.reference new file mode 100644 index 00000000000..11d6850993f --- /dev/null +++ b/tests/queries/0_stateless/01528_play.reference @@ -0,0 +1 @@ +🌞 diff --git a/tests/queries/0_stateless/01528_play.sh b/tests/queries/0_stateless/01528_play.sh new file mode 100755 index 00000000000..7182f4dd6e5 --- /dev/null +++ b/tests/queries/0_stateless/01528_play.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +. "$CURDIR"/../shell_config.sh + +${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_PORT_HTTP_PROTO}://${CLICKHOUSE_HOST}:${CLICKHOUSE_PORT_HTTP}/play" | grep -o '🌞' diff --git a/tests/queries/0_stateless/01529_bad_memory_tracking.reference b/tests/queries/0_stateless/01529_bad_memory_tracking.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/01529_bad_memory_tracking.sh b/tests/queries/0_stateless/01529_bad_memory_tracking.sh new file mode 100755 index 00000000000..f91f6ebaf80 --- /dev/null +++ b/tests/queries/0_stateless/01529_bad_memory_tracking.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +CLICKHOUSE_CLIENT_SERVER_LOGS_LEVEL=fatal + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +. "$CURDIR"/../shell_config.sh + +for _ in {1..10}; do + ${CLICKHOUSE_CLIENT} --max_memory_usage '10G' --query "SELECT i FROM generateRandom('i Array(Int8)', 1, 1, 1048577) LIMIT 65536" 2>&1 | grep -v -P '^(Received exception from server|Code: 241)' ||: +done diff --git a/tests/queries/0_stateless/01531_query_log_query_comment.reference b/tests/queries/0_stateless/01531_query_log_query_comment.reference new file mode 100644 index 00000000000..8347b144a35 --- /dev/null +++ b/tests/queries/0_stateless/01531_query_log_query_comment.reference @@ -0,0 +1,4 @@ +2 +1 +2 +1 diff --git a/tests/queries/0_stateless/01531_query_log_query_comment.sql b/tests/queries/0_stateless/01531_query_log_query_comment.sql new file mode 100644 index 00000000000..19942669a44 --- /dev/null +++ b/tests/queries/0_stateless/01531_query_log_query_comment.sql @@ -0,0 +1,12 @@ +set log_queries=1; +set log_queries_min_type='QUERY_FINISH'; + +set enable_global_with_statement=1; +select /* test=01531, enable_global_with_statement=0 */ 2; +system flush logs; +select count() from system.query_log where event_time >= now() - interval 5 minute and query = 'select /* test=01531, enable_global_with_statement=0 */ 2;\n'; + +set enable_global_with_statement=1; +select /* test=01531 enable_global_with_statement=1 */ 2; +system flush logs; +select count() from system.query_log where event_time >= now() - interval 5 minute and query = 'select /* test=01531 enable_global_with_statement=1 */ 2;\n'; diff --git a/tests/queries/query_test.py b/tests/queries/query_test.py index bac38d0334e..d0fc5759667 100644 --- a/tests/queries/query_test.py +++ b/tests/queries/query_test.py @@ -11,19 +11,21 @@ import sys def run_client(bin_prefix, port, query, reference, replace_map={}): client = subprocess.Popen([bin_prefix + '-client', '--port', str(port), '-m', '-n', '--testmode'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - result, error = client.communicate(query) + result, error = client.communicate(query.encode('utf-8')) assert client.returncode is not None, "Client should exit after processing all queries" for old, new in replace_map.items(): - result = result.replace(old, new) + result = result.replace(old.encode('utf-8'), new.encode('utf-8')) if client.returncode != 0: - print(error, file=sys.stderr) + print(error.decode('utf-8'), file=sys.stderr) pytest.fail('Client died unexpectedly with code {code}'.format(code=client.returncode), pytrace=False) elif result != reference: pytest.fail("Query output doesn't match reference:{eol}{diff}".format( eol=os.linesep, - diff=os.linesep.join(l.strip() for l in difflib.unified_diff(reference.splitlines(), result.splitlines(), fromfile='expected', tofile='actual'))), + diff=os.linesep.join(l.strip() for l in difflib.unified_diff(reference.decode('utf-8').splitlines(), + result.decode('utf-8').splitlines(), + fromfile='expected', tofile='actual'))), pytrace=False) @@ -32,7 +34,7 @@ def random_str(length=10): return ''.join(random.choice(alphabet) for _ in range(length)) -@pytest.mark.timeout(timeout=10, method='signal') +@pytest.mark.timeout(timeout=30, method='signal') def test_query(bin_prefix, sql_query, standalone_server): tcp_port = standalone_server.tcp_port @@ -44,7 +46,7 @@ def test_query(bin_prefix, sql_query, standalone_server): with open(query_path, 'r') as file: query = file.read() - with open(reference_path, 'r') as file: + with open(reference_path, 'rb') as file: reference = file.read() random_name = 'test_{random}'.format(random=random_str()) @@ -52,9 +54,9 @@ def test_query(bin_prefix, sql_query, standalone_server): run_client(bin_prefix, tcp_port, query, reference, {random_name: 'default'}) query = "SELECT 'SHOW ORPHANED TABLES'; SELECT name FROM system.tables WHERE database != 'system' ORDER BY (database, name);" - run_client(bin_prefix, tcp_port, query, 'SHOW ORPHANED TABLES\n') + run_client(bin_prefix, tcp_port, query, b'SHOW ORPHANED TABLES\n') - run_client(bin_prefix, tcp_port, 'DROP DATABASE {random};'.format(random=random_name), '') + run_client(bin_prefix, tcp_port, 'DROP DATABASE {random};'.format(random=random_name), b'') query = "SELECT 'SHOW ORPHANED DATABASES'; SHOW DATABASES;" - run_client(bin_prefix, tcp_port, query, 'SHOW ORPHANED DATABASES\n_temporary_and_external_tables\ndefault\nsystem\n') + run_client(bin_prefix, tcp_port, query, b'SHOW ORPHANED DATABASES\n_temporary_and_external_tables\ndefault\nsystem\n') diff --git a/tests/queries/server.py b/tests/queries/server.py index cb0755db6ae..e9f7361a6fe 100644 --- a/tests/queries/server.py +++ b/tests/queries/server.py @@ -63,7 +63,7 @@ class ServerThread(threading.Thread): try: time.sleep(ServerThread.DEFAULT_SERVER_DELAY) s = socket.create_connection(('localhost', self.tcp_port), ServerThread.DEFAULT_CONNECTION_TIMEOUT) - s.sendall('G') # trigger expected "bad" HELLO response + s.sendall(b'G') # trigger expected "bad" HELLO response print('Successful server response:', s.recv(1024)) # FIXME: read whole buffered response s.shutdown(socket.SHUT_RDWR) s.close() @@ -76,8 +76,8 @@ class ServerThread(threading.Thread): # If process has died then try to fetch output before releasing lock if self._proc.returncode is not None: stdout, stderr = self._proc.communicate() - print(stdout, file=sys.stderr) - print(stderr, file=sys.stderr) + print(stdout.decode('utf-8'), file=sys.stderr) + print(stderr.decode('utf-8'), file=sys.stderr) if self._proc.returncode == 70: # Address already in use retries -= 1 diff --git a/tests/testflows/ldap/configs/clickhouse/common.xml b/tests/testflows/aes_encryption/configs/clickhouse/common.xml similarity index 100% rename from tests/testflows/ldap/configs/clickhouse/common.xml rename to tests/testflows/aes_encryption/configs/clickhouse/common.xml diff --git a/tests/testflows/ldap/configs/clickhouse/config.d/logs.xml b/tests/testflows/aes_encryption/configs/clickhouse/config.d/logs.xml similarity index 100% rename from tests/testflows/ldap/configs/clickhouse/config.d/logs.xml rename to tests/testflows/aes_encryption/configs/clickhouse/config.d/logs.xml diff --git a/tests/testflows/ldap/configs/clickhouse/config.d/ports.xml b/tests/testflows/aes_encryption/configs/clickhouse/config.d/ports.xml similarity index 100% rename from tests/testflows/ldap/configs/clickhouse/config.d/ports.xml rename to tests/testflows/aes_encryption/configs/clickhouse/config.d/ports.xml diff --git a/tests/testflows/ldap/configs/clickhouse/config.d/remote.xml b/tests/testflows/aes_encryption/configs/clickhouse/config.d/remote.xml similarity index 100% rename from tests/testflows/ldap/configs/clickhouse/config.d/remote.xml rename to tests/testflows/aes_encryption/configs/clickhouse/config.d/remote.xml diff --git a/tests/testflows/ldap/configs/clickhouse/config.d/ssl.xml b/tests/testflows/aes_encryption/configs/clickhouse/config.d/ssl.xml similarity index 100% rename from tests/testflows/ldap/configs/clickhouse/config.d/ssl.xml rename to tests/testflows/aes_encryption/configs/clickhouse/config.d/ssl.xml diff --git a/tests/testflows/ldap/configs/clickhouse/config.d/storage.xml b/tests/testflows/aes_encryption/configs/clickhouse/config.d/storage.xml similarity index 100% rename from tests/testflows/ldap/configs/clickhouse/config.d/storage.xml rename to tests/testflows/aes_encryption/configs/clickhouse/config.d/storage.xml diff --git a/tests/testflows/ldap/configs/clickhouse/config.d/zookeeper.xml b/tests/testflows/aes_encryption/configs/clickhouse/config.d/zookeeper.xml similarity index 100% rename from tests/testflows/ldap/configs/clickhouse/config.d/zookeeper.xml rename to tests/testflows/aes_encryption/configs/clickhouse/config.d/zookeeper.xml diff --git a/tests/testflows/ldap/configs/clickhouse/config.xml b/tests/testflows/aes_encryption/configs/clickhouse/config.xml similarity index 100% rename from tests/testflows/ldap/configs/clickhouse/config.xml rename to tests/testflows/aes_encryption/configs/clickhouse/config.xml diff --git a/tests/testflows/ldap/configs/clickhouse/ssl/dhparam.pem b/tests/testflows/aes_encryption/configs/clickhouse/ssl/dhparam.pem similarity index 100% rename from tests/testflows/ldap/configs/clickhouse/ssl/dhparam.pem rename to tests/testflows/aes_encryption/configs/clickhouse/ssl/dhparam.pem diff --git a/tests/testflows/ldap/configs/clickhouse/ssl/server.crt b/tests/testflows/aes_encryption/configs/clickhouse/ssl/server.crt similarity index 100% rename from tests/testflows/ldap/configs/clickhouse/ssl/server.crt rename to tests/testflows/aes_encryption/configs/clickhouse/ssl/server.crt diff --git a/tests/testflows/ldap/configs/clickhouse/ssl/server.key b/tests/testflows/aes_encryption/configs/clickhouse/ssl/server.key similarity index 100% rename from tests/testflows/ldap/configs/clickhouse/ssl/server.key rename to tests/testflows/aes_encryption/configs/clickhouse/ssl/server.key diff --git a/tests/testflows/ldap/configs/clickhouse/users.xml b/tests/testflows/aes_encryption/configs/clickhouse/users.xml similarity index 100% rename from tests/testflows/ldap/configs/clickhouse/users.xml rename to tests/testflows/aes_encryption/configs/clickhouse/users.xml diff --git a/tests/testflows/ldap/configs/clickhouse1/config.d/macros.xml b/tests/testflows/aes_encryption/configs/clickhouse1/config.d/macros.xml similarity index 100% rename from tests/testflows/ldap/configs/clickhouse1/config.d/macros.xml rename to tests/testflows/aes_encryption/configs/clickhouse1/config.d/macros.xml diff --git a/tests/testflows/ldap/configs/clickhouse2/config.d/macros.xml b/tests/testflows/aes_encryption/configs/clickhouse2/config.d/macros.xml similarity index 100% rename from tests/testflows/ldap/configs/clickhouse2/config.d/macros.xml rename to tests/testflows/aes_encryption/configs/clickhouse2/config.d/macros.xml diff --git a/tests/testflows/ldap/configs/clickhouse3/config.d/macros.xml b/tests/testflows/aes_encryption/configs/clickhouse3/config.d/macros.xml similarity index 100% rename from tests/testflows/ldap/configs/clickhouse3/config.d/macros.xml rename to tests/testflows/aes_encryption/configs/clickhouse3/config.d/macros.xml diff --git a/tests/testflows/aes_encryption/docker-compose/clickhouse-service.yml b/tests/testflows/aes_encryption/docker-compose/clickhouse-service.yml new file mode 100644 index 00000000000..9787b37abbb --- /dev/null +++ b/tests/testflows/aes_encryption/docker-compose/clickhouse-service.yml @@ -0,0 +1,28 @@ +version: '2.3' + +services: + clickhouse: + image: yandex/clickhouse-integration-test + expose: + - "9000" + - "9009" + - "8123" + volumes: + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse/config.d:/etc/clickhouse-server/config.d" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse/users.d/:/etc/clickhouse-server/users.d" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse/ssl:/etc/clickhouse-server/ssl" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse/config.xml:/etc/clickhouse-server/config.xml" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse/users.xml:/etc/clickhouse-server/users.xml" + - "${CLICKHOUSE_TESTS_SERVER_BIN_PATH:-/usr/bin/clickhouse}:/usr/bin/clickhouse" + - "${CLICKHOUSE_TESTS_ODBC_BRIDGE_BIN_PATH:-/usr/bin/clickhouse-odbc-bridge}:/usr/bin/clickhouse-odbc-bridge" + entrypoint: bash -c "clickhouse server --config-file=/etc/clickhouse-server/config.xml --log-file=/var/log/clickhouse-server/clickhouse-server.log --errorlog-file=/var/log/clickhouse-server/clickhouse-server.err.log" + healthcheck: + test: clickhouse client --query='select 1' + interval: 3s + timeout: 2s + retries: 40 + start_period: 2s + cap_add: + - SYS_PTRACE + security_opt: + - label:disable diff --git a/tests/testflows/aes_encryption/docker-compose/docker-compose.yml b/tests/testflows/aes_encryption/docker-compose/docker-compose.yml new file mode 100644 index 00000000000..04a51ad7ec0 --- /dev/null +++ b/tests/testflows/aes_encryption/docker-compose/docker-compose.yml @@ -0,0 +1,73 @@ +version: '2.3' + +services: + zookeeper: + extends: + file: zookeeper-service.yml + service: zookeeper + + mysql1: + extends: + file: mysql-service.yml + service: mysql + hostname: mysql1 + volumes: + - "${CLICKHOUSE_TESTS_DIR}/_instances/mysql1/database:/var/lib/mysql" + + clickhouse1: + extends: + file: clickhouse-service.yml + service: clickhouse + hostname: clickhouse1 + volumes: + - "${CLICKHOUSE_TESTS_DIR}/_instances/clickhouse1/database/:/var/lib/clickhouse/" + - "${CLICKHOUSE_TESTS_DIR}/_instances/clickhouse1/logs/:/var/log/clickhouse-server/" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse1/config.d:/etc/clickhouse-server/config.d" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse1/users.d:/etc/clickhouse-server/users.d" + depends_on: + zookeeper: + condition: service_healthy + + clickhouse2: + extends: + file: clickhouse-service.yml + service: clickhouse + hostname: clickhouse2 + volumes: + - "${CLICKHOUSE_TESTS_DIR}/_instances/clickhouse2/database/:/var/lib/clickhouse/" + - "${CLICKHOUSE_TESTS_DIR}/_instances/clickhouse2/logs/:/var/log/clickhouse-server/" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse2/config.d:/etc/clickhouse-server/config.d" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse2/users.d:/etc/clickhouse-server/users.d" + depends_on: + zookeeper: + condition: service_healthy + + clickhouse3: + extends: + file: clickhouse-service.yml + service: clickhouse + hostname: clickhouse3 + volumes: + - "${CLICKHOUSE_TESTS_DIR}/_instances/clickhouse3/database/:/var/lib/clickhouse/" + - "${CLICKHOUSE_TESTS_DIR}/_instances/clickhouse3/logs/:/var/log/clickhouse-server/" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse3/config.d:/etc/clickhouse-server/config.d" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse3/users.d:/etc/clickhouse-server/users.d" + depends_on: + zookeeper: + condition: service_healthy + + # dummy service which does nothing, but allows to postpone + # 'docker-compose up -d' till all dependecies will go healthy + all_services_ready: + image: hello-world + depends_on: + mysql1: + condition: service_healthy + clickhouse1: + condition: service_healthy + clickhouse2: + condition: service_healthy + clickhouse3: + condition: service_healthy + zookeeper: + condition: service_healthy diff --git a/tests/testflows/aes_encryption/docker-compose/mysql-service.yml b/tests/testflows/aes_encryption/docker-compose/mysql-service.yml new file mode 100644 index 00000000000..6924bccfad5 --- /dev/null +++ b/tests/testflows/aes_encryption/docker-compose/mysql-service.yml @@ -0,0 +1,19 @@ +version: '2.3' + +services: + mysql: + image: mysql:5.7.30 + restart: always + environment: + MYSQL_DATABASE: 'db' + MYSQL_USER: 'user' + MYSQL_PASSWORD: 'password' + MYSQL_ROOT_PASSWORD: 'password' + expose: + - '3306' + healthcheck: + test: mysql -D db -u user --password=password -e "select 1;" + interval: 3s + timeout: 2s + retries: 40 + start_period: 2s diff --git a/tests/testflows/aes_encryption/docker-compose/zookeeper-service.yml b/tests/testflows/aes_encryption/docker-compose/zookeeper-service.yml new file mode 100644 index 00000000000..f3df33358be --- /dev/null +++ b/tests/testflows/aes_encryption/docker-compose/zookeeper-service.yml @@ -0,0 +1,18 @@ +version: '2.3' + +services: + zookeeper: + image: zookeeper:3.4.12 + expose: + - "2181" + environment: + ZOO_TICK_TIME: 500 + ZOO_MY_ID: 1 + healthcheck: + test: echo stat | nc localhost 2181 + interval: 3s + timeout: 2s + retries: 5 + start_period: 2s + security_opt: + - label:disable diff --git a/tests/testflows/aes_encryption/regression.py b/tests/testflows/aes_encryption/regression.py new file mode 100755 index 00000000000..e50ac0a3f8b --- /dev/null +++ b/tests/testflows/aes_encryption/regression.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +import sys +from testflows.core import * + +append_path(sys.path, "..") + +from helpers.cluster import Cluster +from helpers.argparser import argparser +from aes_encryption.requirements import * + +xfails = { + # encrypt + "encrypt/invalid key or iv length for mode/mode=\"'aes-???-gcm'\", key_len=??, iv_len=12, aad=True/iv is too short": + [(Fail, "known issue")], + "encrypt/invalid key or iv length for mode/mode=\"'aes-???-gcm'\", key_len=??, iv_len=12, aad=True/iv is too long": + [(Fail, "known issue")], + # encrypt_mysql + "encrypt_mysql/key or iv length for mode/mode=\"'aes-???-ecb'\", key_len=??, iv_len=None": + [(Fail, "https://altinity.atlassian.net/browse/CH-190")], + "encrypt_mysql/invalid parameters/iv not valid for mode": + [(Fail, "https://altinity.atlassian.net/browse/CH-190")], + "encrypt_mysql/invalid parameters/no parameters": + [(Fail, "https://altinity.atlassian.net/browse/CH-191")], + # decrypt_mysql + "decrypt_mysql/key or iv length for mode/mode=\"'aes-???-ecb'\", key_len=??, iv_len=None:": + [(Fail, "https://altinity.atlassian.net/browse/CH-190")], + # compatibility + "compatibility/insert/encrypt using materialized view/:": + [(Fail, "https://altinity.atlassian.net/browse/CH-193")], + "compatibility/insert/decrypt using materialized view/:": + [(Error, "https://altinity.atlassian.net/browse/CH-193")], + "compatibility/insert/aes encrypt mysql using materialized view/:": + [(Fail, "https://altinity.atlassian.net/browse/CH-193")], + "compatibility/insert/aes decrypt mysql using materialized view/:": + [(Error, "https://altinity.atlassian.net/browse/CH-193")], + "compatibility/select/decrypt unique": + [(Fail, "https://altinity.atlassian.net/browse/CH-193")], + "compatibility/mysql/:engine/decrypt/mysql_datatype='TEXT'/:": + [(Fail, "https://altinity.atlassian.net/browse/CH-194")], + "compatibility/mysql/:engine/decrypt/mysql_datatype='VARCHAR(100)'/:": + [(Fail, "https://altinity.atlassian.net/browse/CH-194")], + "compatibility/mysql/:engine/encrypt/mysql_datatype='TEXT'/:": + [(Fail, "https://altinity.atlassian.net/browse/CH-194")], + "compatibility/mysql/:engine/encrypt/mysql_datatype='VARCHAR(100)'/:": + [(Fail, "https://altinity.atlassian.net/browse/CH-194")] +} + +@TestFeature +@Name("aes encryption") +@ArgumentParser(argparser) +@Requirements( + RQ_SRS008_AES_Functions("1.0"), + RQ_SRS008_AES_Functions_DifferentModes("1.0") +) +@XFails(xfails) +def regression(self, local, clickhouse_binary_path): + """ClickHouse AES encryption functions regression module. + """ + nodes = { + "clickhouse": ("clickhouse1", "clickhouse2", "clickhouse3"), + } + + with Cluster(local, clickhouse_binary_path, nodes=nodes) as cluster: + self.context.cluster = cluster + + Feature(run=load("aes_encryption.tests.encrypt", "feature"), flags=TE) + Feature(run=load("aes_encryption.tests.decrypt", "feature"), flags=TE) + Feature(run=load("aes_encryption.tests.encrypt_mysql", "feature"), flags=TE) + Feature(run=load("aes_encryption.tests.decrypt_mysql", "feature"), flags=TE) + Feature(run=load("aes_encryption.tests.compatibility.feature", "feature"), flags=TE) + +if main(): + regression() diff --git a/tests/testflows/ldap/requirements/__init__.py b/tests/testflows/aes_encryption/requirements/__init__.py similarity index 100% rename from tests/testflows/ldap/requirements/__init__.py rename to tests/testflows/aes_encryption/requirements/__init__.py diff --git a/tests/testflows/aes_encryption/requirements/requirements.md b/tests/testflows/aes_encryption/requirements/requirements.md new file mode 100644 index 00000000000..da61c85893e --- /dev/null +++ b/tests/testflows/aes_encryption/requirements/requirements.md @@ -0,0 +1,1926 @@ +# SRS-008 ClickHouse AES Encryption Functions +# Software Requirements Specification + +## Table of Contents +* 1 [Revision History](#revision-history) +* 2 [Introduction](#introduction) +* 3 [Terminology](#terminology) +* 4 [Requirements](#requirements) + * 4.1 [Generic](#generic) + * 4.1.1 [RQ.SRS008.AES.Functions](#rqsrs008aesfunctions) + * 4.1.2 [RQ.SRS008.AES.Functions.Compatability.MySQL](#rqsrs008aesfunctionscompatabilitymysql) + * 4.1.3 [RQ.SRS008.AES.Functions.Compatability.Dictionaries](#rqsrs008aesfunctionscompatabilitydictionaries) + * 4.1.4 [RQ.SRS008.AES.Functions.Compatability.Engine.Database.MySQL](#rqsrs008aesfunctionscompatabilityenginedatabasemysql) + * 4.1.5 [RQ.SRS008.AES.Functions.Compatability.Engine.Table.MySQL](#rqsrs008aesfunctionscompatabilityenginetablemysql) + * 4.1.6 [RQ.SRS008.AES.Functions.Compatability.TableFunction.MySQL](#rqsrs008aesfunctionscompatabilitytablefunctionmysql) + * 4.1.7 [RQ.SRS008.AES.Functions.DifferentModes](#rqsrs008aesfunctionsdifferentmodes) + * 4.1.8 [RQ.SRS008.AES.Functions.DataFromMultipleSources](#rqsrs008aesfunctionsdatafrommultiplesources) + * 4.1.9 [RQ.SRS008.AES.Functions.SuppressOutputOfSensitiveValues](#rqsrs008aesfunctionssuppressoutputofsensitivevalues) + * 4.1.10 [RQ.SRS008.AES.Functions.InvalidParameters](#rqsrs008aesfunctionsinvalidparameters) + * 4.1.11 [RQ.SRS008.AES.Functions.MismatchedKey](#rqsrs008aesfunctionsmismatchedkey) + * 4.1.12 [RQ.SRS008.AES.Functions.Check.Performance](#rqsrs008aesfunctionscheckperformance) + * 4.1.13 [RQ.SRS008.AES.Function.Check.Performance.BestCase](#rqsrs008aesfunctioncheckperformancebestcase) + * 4.1.14 [RQ.SRS008.AES.Function.Check.Performance.WorstCase](#rqsrs008aesfunctioncheckperformanceworstcase) + * 4.1.15 [RQ.SRS008.AES.Functions.Check.Compression](#rqsrs008aesfunctionscheckcompression) + * 4.1.16 [RQ.SRS008.AES.Functions.Check.Compression.LowCardinality](#rqsrs008aesfunctionscheckcompressionlowcardinality) + * 4.2 [Specific](#specific) + * 4.2.1 [RQ.SRS008.AES.Encrypt.Function](#rqsrs008aesencryptfunction) + * 4.2.2 [RQ.SRS008.AES.Encrypt.Function.Syntax](#rqsrs008aesencryptfunctionsyntax) + * 4.2.3 [RQ.SRS008.AES.Encrypt.Function.NIST.TestVectors](#rqsrs008aesencryptfunctionnisttestvectors) + * 4.2.4 [RQ.SRS008.AES.Encrypt.Function.Parameters.PlainText](#rqsrs008aesencryptfunctionparametersplaintext) + * 4.2.5 [RQ.SRS008.AES.Encrypt.Function.Parameters.Key](#rqsrs008aesencryptfunctionparameterskey) + * 4.2.6 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode](#rqsrs008aesencryptfunctionparametersmode) + * 4.2.7 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.ValuesFormat](#rqsrs008aesencryptfunctionparametersmodevaluesformat) + * 4.2.8 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.Invalid](#rqsrs008aesencryptfunctionparametersmodevalueinvalid) + * 4.2.9 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-ECB](#rqsrs008aesencryptfunctionparametersmodevalueaes-128-ecb) + * 4.2.10 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-ECB](#rqsrs008aesencryptfunctionparametersmodevalueaes-192-ecb) + * 4.2.11 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-ECB](#rqsrs008aesencryptfunctionparametersmodevalueaes-256-ecb) + * 4.2.12 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-CBC](#rqsrs008aesencryptfunctionparametersmodevalueaes-128-cbc) + * 4.2.13 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-CBC](#rqsrs008aesencryptfunctionparametersmodevalueaes-192-cbc) + * 4.2.14 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-CBC](#rqsrs008aesencryptfunctionparametersmodevalueaes-256-cbc) + * 4.2.15 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-CFB1](#rqsrs008aesencryptfunctionparametersmodevalueaes-128-cfb1) + * 4.2.16 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-CFB1](#rqsrs008aesencryptfunctionparametersmodevalueaes-192-cfb1) + * 4.2.17 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-CFB1](#rqsrs008aesencryptfunctionparametersmodevalueaes-256-cfb1) + * 4.2.18 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-CFB8](#rqsrs008aesencryptfunctionparametersmodevalueaes-128-cfb8) + * 4.2.19 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-CFB8](#rqsrs008aesencryptfunctionparametersmodevalueaes-192-cfb8) + * 4.2.20 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-CFB8](#rqsrs008aesencryptfunctionparametersmodevalueaes-256-cfb8) + * 4.2.21 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-CFB128](#rqsrs008aesencryptfunctionparametersmodevalueaes-128-cfb128) + * 4.2.22 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-CFB128](#rqsrs008aesencryptfunctionparametersmodevalueaes-192-cfb128) + * 4.2.23 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-CFB128](#rqsrs008aesencryptfunctionparametersmodevalueaes-256-cfb128) + * 4.2.24 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-OFB](#rqsrs008aesencryptfunctionparametersmodevalueaes-128-ofb) + * 4.2.25 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-OFB](#rqsrs008aesencryptfunctionparametersmodevalueaes-192-ofb) + * 4.2.26 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-OFB](#rqsrs008aesencryptfunctionparametersmodevalueaes-256-ofb) + * 4.2.27 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-GCM](#rqsrs008aesencryptfunctionparametersmodevalueaes-128-gcm) + * 4.2.28 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-GCM](#rqsrs008aesencryptfunctionparametersmodevalueaes-192-gcm) + * 4.2.29 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-GCM](#rqsrs008aesencryptfunctionparametersmodevalueaes-256-gcm) + * 4.2.30 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-CTR](#rqsrs008aesencryptfunctionparametersmodevalueaes-128-ctr) + * 4.2.31 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-CTR](#rqsrs008aesencryptfunctionparametersmodevalueaes-192-ctr) + * 4.2.32 [RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-CTR](#rqsrs008aesencryptfunctionparametersmodevalueaes-256-ctr) + * 4.2.33 [RQ.SRS008.AES.Encrypt.Function.Parameters.InitializationVector](#rqsrs008aesencryptfunctionparametersinitializationvector) + * 4.2.34 [RQ.SRS008.AES.Encrypt.Function.Parameters.AdditionalAuthenticatedData](#rqsrs008aesencryptfunctionparametersadditionalauthenticateddata) + * 4.2.35 [RQ.SRS008.AES.Encrypt.Function.Parameters.ReturnValue](#rqsrs008aesencryptfunctionparametersreturnvalue) + * 4.2.36 [RQ.SRS008.AES.Encrypt.Function.Key.Length.InvalidLengthError](#rqsrs008aesencryptfunctionkeylengthinvalidlengtherror) + * 4.2.37 [RQ.SRS008.AES.Encrypt.Function.InitializationVector.Length.InvalidLengthError](#rqsrs008aesencryptfunctioninitializationvectorlengthinvalidlengtherror) + * 4.2.38 [RQ.SRS008.AES.Encrypt.Function.InitializationVector.NotValidForMode](#rqsrs008aesencryptfunctioninitializationvectornotvalidformode) + * 4.2.39 [RQ.SRS008.AES.Encrypt.Function.AdditionalAuthenticationData.NotValidForMode](#rqsrs008aesencryptfunctionadditionalauthenticationdatanotvalidformode) + * 4.2.40 [RQ.SRS008.AES.Encrypt.Function.AdditionalAuthenticationData.Length](#rqsrs008aesencryptfunctionadditionalauthenticationdatalength) + * 4.2.41 [RQ.SRS008.AES.Encrypt.Function.AES-128-ECB.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-128-ecbkeyandinitializationvectorlength) + * 4.2.42 [RQ.SRS008.AES.Encrypt.Function.AES-192-ECB.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-192-ecbkeyandinitializationvectorlength) + * 4.2.43 [RQ.SRS008.AES.Encrypt.Function.AES-256-ECB.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-256-ecbkeyandinitializationvectorlength) + * 4.2.44 [RQ.SRS008.AES.Encrypt.Function.AES-128-CBC.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-128-cbckeyandinitializationvectorlength) + * 4.2.45 [RQ.SRS008.AES.Encrypt.Function.AES-192-CBC.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-192-cbckeyandinitializationvectorlength) + * 4.2.46 [RQ.SRS008.AES.Encrypt.Function.AES-256-CBC.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-256-cbckeyandinitializationvectorlength) + * 4.2.47 [RQ.SRS008.AES.Encrypt.Function.AES-128-CFB1.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-128-cfb1keyandinitializationvectorlength) + * 4.2.48 [RQ.SRS008.AES.Encrypt.Function.AES-192-CFB1.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-192-cfb1keyandinitializationvectorlength) + * 4.2.49 [RQ.SRS008.AES.Encrypt.Function.AES-256-CFB1.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-256-cfb1keyandinitializationvectorlength) + * 4.2.50 [RQ.SRS008.AES.Encrypt.Function.AES-128-CFB8.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-128-cfb8keyandinitializationvectorlength) + * 4.2.51 [RQ.SRS008.AES.Encrypt.Function.AES-192-CFB8.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-192-cfb8keyandinitializationvectorlength) + * 4.2.52 [RQ.SRS008.AES.Encrypt.Function.AES-256-CFB8.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-256-cfb8keyandinitializationvectorlength) + * 4.2.53 [RQ.SRS008.AES.Encrypt.Function.AES-128-CFB128.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-128-cfb128keyandinitializationvectorlength) + * 4.2.54 [RQ.SRS008.AES.Encrypt.Function.AES-192-CFB128.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-192-cfb128keyandinitializationvectorlength) + * 4.2.55 [RQ.SRS008.AES.Encrypt.Function.AES-256-CFB128.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-256-cfb128keyandinitializationvectorlength) + * 4.2.56 [RQ.SRS008.AES.Encrypt.Function.AES-128-OFB.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-128-ofbkeyandinitializationvectorlength) + * 4.2.57 [RQ.SRS008.AES.Encrypt.Function.AES-192-OFB.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-192-ofbkeyandinitializationvectorlength) + * 4.2.58 [RQ.SRS008.AES.Encrypt.Function.AES-256-OFB.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-256-ofbkeyandinitializationvectorlength) + * 4.2.59 [RQ.SRS008.AES.Encrypt.Function.AES-128-GCM.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-128-gcmkeyandinitializationvectorlength) + * 4.2.60 [RQ.SRS008.AES.Encrypt.Function.AES-192-GCM.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-192-gcmkeyandinitializationvectorlength) + * 4.2.61 [RQ.SRS008.AES.Encrypt.Function.AES-256-GCM.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-256-gcmkeyandinitializationvectorlength) + * 4.2.62 [RQ.SRS008.AES.Encrypt.Function.AES-128-CTR.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-128-ctrkeyandinitializationvectorlength) + * 4.2.63 [RQ.SRS008.AES.Encrypt.Function.AES-192-CTR.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-192-ctrkeyandinitializationvectorlength) + * 4.2.64 [RQ.SRS008.AES.Encrypt.Function.AES-256-CTR.KeyAndInitializationVector.Length](#rqsrs008aesencryptfunctionaes-256-ctrkeyandinitializationvectorlength) + * 4.2.65 [RQ.SRS008.AES.Decrypt.Function](#rqsrs008aesdecryptfunction) + * 4.2.66 [RQ.SRS008.AES.Decrypt.Function.Syntax](#rqsrs008aesdecryptfunctionsyntax) + * 4.2.67 [RQ.SRS008.AES.Decrypt.Function.Parameters.CipherText](#rqsrs008aesdecryptfunctionparametersciphertext) + * 4.2.68 [RQ.SRS008.AES.Decrypt.Function.Parameters.Key](#rqsrs008aesdecryptfunctionparameterskey) + * 4.2.69 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode](#rqsrs008aesdecryptfunctionparametersmode) + * 4.2.70 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.ValuesFormat](#rqsrs008aesdecryptfunctionparametersmodevaluesformat) + * 4.2.71 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.Invalid](#rqsrs008aesdecryptfunctionparametersmodevalueinvalid) + * 4.2.72 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-ECB](#rqsrs008aesdecryptfunctionparametersmodevalueaes-128-ecb) + * 4.2.73 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-ECB](#rqsrs008aesdecryptfunctionparametersmodevalueaes-192-ecb) + * 4.2.74 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-ECB](#rqsrs008aesdecryptfunctionparametersmodevalueaes-256-ecb) + * 4.2.75 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-CBC](#rqsrs008aesdecryptfunctionparametersmodevalueaes-128-cbc) + * 4.2.76 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-CBC](#rqsrs008aesdecryptfunctionparametersmodevalueaes-192-cbc) + * 4.2.77 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-CBC](#rqsrs008aesdecryptfunctionparametersmodevalueaes-256-cbc) + * 4.2.78 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-CFB1](#rqsrs008aesdecryptfunctionparametersmodevalueaes-128-cfb1) + * 4.2.79 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-CFB1](#rqsrs008aesdecryptfunctionparametersmodevalueaes-192-cfb1) + * 4.2.80 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-CFB1](#rqsrs008aesdecryptfunctionparametersmodevalueaes-256-cfb1) + * 4.2.81 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-CFB8](#rqsrs008aesdecryptfunctionparametersmodevalueaes-128-cfb8) + * 4.2.82 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-CFB8](#rqsrs008aesdecryptfunctionparametersmodevalueaes-192-cfb8) + * 4.2.83 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-CFB8](#rqsrs008aesdecryptfunctionparametersmodevalueaes-256-cfb8) + * 4.2.84 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-CFB128](#rqsrs008aesdecryptfunctionparametersmodevalueaes-128-cfb128) + * 4.2.85 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-CFB128](#rqsrs008aesdecryptfunctionparametersmodevalueaes-192-cfb128) + * 4.2.86 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-CFB128](#rqsrs008aesdecryptfunctionparametersmodevalueaes-256-cfb128) + * 4.2.87 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-OFB](#rqsrs008aesdecryptfunctionparametersmodevalueaes-128-ofb) + * 4.2.88 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-OFB](#rqsrs008aesdecryptfunctionparametersmodevalueaes-192-ofb) + * 4.2.89 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-OFB](#rqsrs008aesdecryptfunctionparametersmodevalueaes-256-ofb) + * 4.2.90 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-GCM](#rqsrs008aesdecryptfunctionparametersmodevalueaes-128-gcm) + * 4.2.91 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-GCM](#rqsrs008aesdecryptfunctionparametersmodevalueaes-192-gcm) + * 4.2.92 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-GCM](#rqsrs008aesdecryptfunctionparametersmodevalueaes-256-gcm) + * 4.2.93 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-CTR](#rqsrs008aesdecryptfunctionparametersmodevalueaes-128-ctr) + * 4.2.94 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-CTR](#rqsrs008aesdecryptfunctionparametersmodevalueaes-192-ctr) + * 4.2.95 [RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-CTR](#rqsrs008aesdecryptfunctionparametersmodevalueaes-256-ctr) + * 4.2.96 [RQ.SRS008.AES.Decrypt.Function.Parameters.InitializationVector](#rqsrs008aesdecryptfunctionparametersinitializationvector) + * 4.2.97 [RQ.SRS008.AES.Decrypt.Function.Parameters.AdditionalAuthenticatedData](#rqsrs008aesdecryptfunctionparametersadditionalauthenticateddata) + * 4.2.98 [RQ.SRS008.AES.Decrypt.Function.Parameters.ReturnValue](#rqsrs008aesdecryptfunctionparametersreturnvalue) + * 4.2.99 [RQ.SRS008.AES.Decrypt.Function.Key.Length.InvalidLengthError](#rqsrs008aesdecryptfunctionkeylengthinvalidlengtherror) + * 4.2.100 [RQ.SRS008.AES.Decrypt.Function.InitializationVector.Length.InvalidLengthError](#rqsrs008aesdecryptfunctioninitializationvectorlengthinvalidlengtherror) + * 4.2.101 [RQ.SRS008.AES.Decrypt.Function.InitializationVector.NotValidForMode](#rqsrs008aesdecryptfunctioninitializationvectornotvalidformode) + * 4.2.102 [RQ.SRS008.AES.Decrypt.Function.AdditionalAuthenticationData.NotValidForMode](#rqsrs008aesdecryptfunctionadditionalauthenticationdatanotvalidformode) + * 4.2.103 [RQ.SRS008.AES.Decrypt.Function.AdditionalAuthenticationData.Length](#rqsrs008aesdecryptfunctionadditionalauthenticationdatalength) + * 4.2.104 [RQ.SRS008.AES.Decrypt.Function.AES-128-ECB.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-128-ecbkeyandinitializationvectorlength) + * 4.2.105 [RQ.SRS008.AES.Decrypt.Function.AES-192-ECB.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-192-ecbkeyandinitializationvectorlength) + * 4.2.106 [RQ.SRS008.AES.Decrypt.Function.AES-256-ECB.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-256-ecbkeyandinitializationvectorlength) + * 4.2.107 [RQ.SRS008.AES.Decrypt.Function.AES-128-CBC.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-128-cbckeyandinitializationvectorlength) + * 4.2.108 [RQ.SRS008.AES.Decrypt.Function.AES-192-CBC.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-192-cbckeyandinitializationvectorlength) + * 4.2.109 [RQ.SRS008.AES.Decrypt.Function.AES-256-CBC.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-256-cbckeyandinitializationvectorlength) + * 4.2.110 [RQ.SRS008.AES.Decrypt.Function.AES-128-CFB1.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-128-cfb1keyandinitializationvectorlength) + * 4.2.111 [RQ.SRS008.AES.Decrypt.Function.AES-192-CFB1.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-192-cfb1keyandinitializationvectorlength) + * 4.2.112 [RQ.SRS008.AES.Decrypt.Function.AES-256-CFB1.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-256-cfb1keyandinitializationvectorlength) + * 4.2.113 [RQ.SRS008.AES.Decrypt.Function.AES-128-CFB8.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-128-cfb8keyandinitializationvectorlength) + * 4.2.114 [RQ.SRS008.AES.Decrypt.Function.AES-192-CFB8.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-192-cfb8keyandinitializationvectorlength) + * 4.2.115 [RQ.SRS008.AES.Decrypt.Function.AES-256-CFB8.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-256-cfb8keyandinitializationvectorlength) + * 4.2.116 [RQ.SRS008.AES.Decrypt.Function.AES-128-CFB128.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-128-cfb128keyandinitializationvectorlength) + * 4.2.117 [RQ.SRS008.AES.Decrypt.Function.AES-192-CFB128.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-192-cfb128keyandinitializationvectorlength) + * 4.2.118 [RQ.SRS008.AES.Decrypt.Function.AES-256-CFB128.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-256-cfb128keyandinitializationvectorlength) + * 4.2.119 [RQ.SRS008.AES.Decrypt.Function.AES-128-OFB.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-128-ofbkeyandinitializationvectorlength) + * 4.2.120 [RQ.SRS008.AES.Decrypt.Function.AES-192-OFB.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-192-ofbkeyandinitializationvectorlength) + * 4.2.121 [RQ.SRS008.AES.Decrypt.Function.AES-256-OFB.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-256-ofbkeyandinitializationvectorlength) + * 4.2.122 [RQ.SRS008.AES.Decrypt.Function.AES-128-GCM.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-128-gcmkeyandinitializationvectorlength) + * 4.2.123 [RQ.SRS008.AES.Decrypt.Function.AES-192-GCM.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-192-gcmkeyandinitializationvectorlength) + * 4.2.124 [RQ.SRS008.AES.Decrypt.Function.AES-256-GCM.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-256-gcmkeyandinitializationvectorlength) + * 4.2.125 [RQ.SRS008.AES.Decrypt.Function.AES-128-CTR.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-128-ctrkeyandinitializationvectorlength) + * 4.2.126 [RQ.SRS008.AES.Decrypt.Function.AES-192-CTR.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-192-ctrkeyandinitializationvectorlength) + * 4.2.127 [RQ.SRS008.AES.Decrypt.Function.AES-256-CTR.KeyAndInitializationVector.Length](#rqsrs008aesdecryptfunctionaes-256-ctrkeyandinitializationvectorlength) + * 4.3 [MySQL Specific Functions](#mysql-specific-functions) + * 4.3.1 [RQ.SRS008.AES.MySQL.Encrypt.Function](#rqsrs008aesmysqlencryptfunction) + * 4.3.2 [RQ.SRS008.AES.MySQL.Encrypt.Function.Syntax](#rqsrs008aesmysqlencryptfunctionsyntax) + * 4.3.3 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.PlainText](#rqsrs008aesmysqlencryptfunctionparametersplaintext) + * 4.3.4 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Key](#rqsrs008aesmysqlencryptfunctionparameterskey) + * 4.3.5 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode](#rqsrs008aesmysqlencryptfunctionparametersmode) + * 4.3.6 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.ValuesFormat](#rqsrs008aesmysqlencryptfunctionparametersmodevaluesformat) + * 4.3.7 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.Invalid](#rqsrs008aesmysqlencryptfunctionparametersmodevalueinvalid) + * 4.3.8 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-ECB](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-128-ecb) + * 4.3.9 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-ECB](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-192-ecb) + * 4.3.10 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-ECB](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-256-ecb) + * 4.3.11 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-CBC](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-128-cbc) + * 4.3.12 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-CBC](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-192-cbc) + * 4.3.13 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-CBC](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-256-cbc) + * 4.3.14 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-CFB1](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-128-cfb1) + * 4.3.15 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-CFB1](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-192-cfb1) + * 4.3.16 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-CFB1](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-256-cfb1) + * 4.3.17 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-CFB8](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-128-cfb8) + * 4.3.18 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-CFB8](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-192-cfb8) + * 4.3.19 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-CFB8](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-256-cfb8) + * 4.3.20 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-CFB128](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-128-cfb128) + * 4.3.21 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-CFB128](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-192-cfb128) + * 4.3.22 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-CFB128](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-256-cfb128) + * 4.3.23 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-OFB](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-128-ofb) + * 4.3.24 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-OFB](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-192-ofb) + * 4.3.25 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-OFB](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-256-ofb) + * 4.3.26 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-GCM.Error](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-128-gcmerror) + * 4.3.27 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-GCM.Error](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-192-gcmerror) + * 4.3.28 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-GCM.Error](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-256-gcmerror) + * 4.3.29 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-CTR.Error](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-128-ctrerror) + * 4.3.30 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-CTR.Error](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-192-ctrerror) + * 4.3.31 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-CTR.Error](#rqsrs008aesmysqlencryptfunctionparametersmodevalueaes-256-ctrerror) + * 4.3.32 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.InitializationVector](#rqsrs008aesmysqlencryptfunctionparametersinitializationvector) + * 4.3.33 [RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.ReturnValue](#rqsrs008aesmysqlencryptfunctionparametersreturnvalue) + * 4.3.34 [RQ.SRS008.AES.MySQL.Encrypt.Function.Key.Length.TooShortError](#rqsrs008aesmysqlencryptfunctionkeylengthtooshorterror) + * 4.3.35 [RQ.SRS008.AES.MySQL.Encrypt.Function.Key.Length.TooLong](#rqsrs008aesmysqlencryptfunctionkeylengthtoolong) + * 4.3.36 [RQ.SRS008.AES.MySQL.Encrypt.Function.InitializationVector.Length.TooShortError](#rqsrs008aesmysqlencryptfunctioninitializationvectorlengthtooshorterror) + * 4.3.37 [RQ.SRS008.AES.MySQL.Encrypt.Function.InitializationVector.Length.TooLong](#rqsrs008aesmysqlencryptfunctioninitializationvectorlengthtoolong) + * 4.3.38 [RQ.SRS008.AES.MySQL.Encrypt.Function.InitializationVector.NotValidForMode](#rqsrs008aesmysqlencryptfunctioninitializationvectornotvalidformode) + * 4.3.39 [RQ.SRS008.AES.MySQL.Encrypt.Function.AES-128-ECB.KeyAndInitializationVector.Length](#rqsrs008aesmysqlencryptfunctionaes-128-ecbkeyandinitializationvectorlength) + * 4.3.40 [RQ.SRS008.AES.MySQL.Encrypt.Function.AES-192-ECB.KeyAndInitializationVector.Length](#rqsrs008aesmysqlencryptfunctionaes-192-ecbkeyandinitializationvectorlength) + * 4.3.41 [RQ.SRS008.AES.MySQL.Encrypt.Function.AES-256-ECB.KeyAndInitializationVector.Length](#rqsrs008aesmysqlencryptfunctionaes-256-ecbkeyandinitializationvectorlength) + * 4.3.42 [RQ.SRS008.AES.MySQL.Encrypt.Function.AES-128-CBC.KeyAndInitializationVector.Length](#rqsrs008aesmysqlencryptfunctionaes-128-cbckeyandinitializationvectorlength) + * 4.3.43 [RQ.SRS008.AES.MySQL.Encrypt.Function.AES-192-CBC.KeyAndInitializationVector.Length](#rqsrs008aesmysqlencryptfunctionaes-192-cbckeyandinitializationvectorlength) + * 4.3.44 [RQ.SRS008.AES.MySQL.Encrypt.Function.AES-256-CBC.KeyAndInitializationVector.Length](#rqsrs008aesmysqlencryptfunctionaes-256-cbckeyandinitializationvectorlength) + * 4.3.45 [RQ.SRS008.AES.MySQL.Encrypt.Function.AES-128-CFB1.KeyAndInitializationVector.Length](#rqsrs008aesmysqlencryptfunctionaes-128-cfb1keyandinitializationvectorlength) + * 4.3.46 [RQ.SRS008.AES.MySQL.Encrypt.Function.AES-192-CFB1.KeyAndInitializationVector.Length](#rqsrs008aesmysqlencryptfunctionaes-192-cfb1keyandinitializationvectorlength) + * 4.3.47 [RQ.SRS008.AES.MySQL.Encrypt.Function.AES-256-CFB1.KeyAndInitializationVector.Length](#rqsrs008aesmysqlencryptfunctionaes-256-cfb1keyandinitializationvectorlength) + * 4.3.48 [RQ.SRS008.AES.MySQL.Encrypt.Function.AES-128-CFB8.KeyAndInitializationVector.Length](#rqsrs008aesmysqlencryptfunctionaes-128-cfb8keyandinitializationvectorlength) + * 4.3.49 [RQ.SRS008.AES.MySQL.Encrypt.Function.AES-192-CFB8.KeyAndInitializationVector.Length](#rqsrs008aesmysqlencryptfunctionaes-192-cfb8keyandinitializationvectorlength) + * 4.3.50 [RQ.SRS008.AES.MySQL.Encrypt.Function.AES-256-CFB8.KeyAndInitializationVector.Length](#rqsrs008aesmysqlencryptfunctionaes-256-cfb8keyandinitializationvectorlength) + * 4.3.51 [RQ.SRS008.AES.MySQL.Encrypt.Function.AES-128-CFB128.KeyAndInitializationVector.Length](#rqsrs008aesmysqlencryptfunctionaes-128-cfb128keyandinitializationvectorlength) + * 4.3.52 [RQ.SRS008.AES.MySQL.Encrypt.Function.AES-192-CFB128.KeyAndInitializationVector.Length](#rqsrs008aesmysqlencryptfunctionaes-192-cfb128keyandinitializationvectorlength) + * 4.3.53 [RQ.SRS008.AES.MySQL.Encrypt.Function.AES-256-CFB128.KeyAndInitializationVector.Length](#rqsrs008aesmysqlencryptfunctionaes-256-cfb128keyandinitializationvectorlength) + * 4.3.54 [RQ.SRS008.AES.MySQL.Encrypt.Function.AES-128-OFB.KeyAndInitializationVector.Length](#rqsrs008aesmysqlencryptfunctionaes-128-ofbkeyandinitializationvectorlength) + * 4.3.55 [RQ.SRS008.AES.MySQL.Encrypt.Function.AES-192-OFB.KeyAndInitializationVector.Length](#rqsrs008aesmysqlencryptfunctionaes-192-ofbkeyandinitializationvectorlength) + * 4.3.56 [RQ.SRS008.AES.MySQL.Encrypt.Function.AES-256-OFB.KeyAndInitializationVector.Length](#rqsrs008aesmysqlencryptfunctionaes-256-ofbkeyandinitializationvectorlength) + * 4.3.57 [RQ.SRS008.AES.MySQL.Decrypt.Function](#rqsrs008aesmysqldecryptfunction) + * 4.3.58 [RQ.SRS008.AES.MySQL.Decrypt.Function.Syntax](#rqsrs008aesmysqldecryptfunctionsyntax) + * 4.3.59 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.CipherText](#rqsrs008aesmysqldecryptfunctionparametersciphertext) + * 4.3.60 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Key](#rqsrs008aesmysqldecryptfunctionparameterskey) + * 4.3.61 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode](#rqsrs008aesmysqldecryptfunctionparametersmode) + * 4.3.62 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.ValuesFormat](#rqsrs008aesmysqldecryptfunctionparametersmodevaluesformat) + * 4.3.63 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.Invalid](#rqsrs008aesmysqldecryptfunctionparametersmodevalueinvalid) + * 4.3.64 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-ECB](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-128-ecb) + * 4.3.65 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-ECB](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-192-ecb) + * 4.3.66 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-ECB](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-256-ecb) + * 4.3.67 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-CBC](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-128-cbc) + * 4.3.68 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-CBC](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-192-cbc) + * 4.3.69 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-CBC](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-256-cbc) + * 4.3.70 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-CFB1](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-128-cfb1) + * 4.3.71 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-CFB1](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-192-cfb1) + * 4.3.72 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-CFB1](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-256-cfb1) + * 4.3.73 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-CFB8](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-128-cfb8) + * 4.3.74 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-CFB8](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-192-cfb8) + * 4.3.75 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-CFB8](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-256-cfb8) + * 4.3.76 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-CFB128](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-128-cfb128) + * 4.3.77 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-CFB128](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-192-cfb128) + * 4.3.78 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-CFB128](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-256-cfb128) + * 4.3.79 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-OFB](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-128-ofb) + * 4.3.80 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-OFB](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-192-ofb) + * 4.3.81 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-OFB](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-256-ofb) + * 4.3.82 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-GCM.Error](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-128-gcmerror) + * 4.3.83 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-GCM.Error](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-192-gcmerror) + * 4.3.84 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-GCM.Error](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-256-gcmerror) + * 4.3.85 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-CTR.Error](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-128-ctrerror) + * 4.3.86 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-CTR.Error](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-192-ctrerror) + * 4.3.87 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-CTR.Error](#rqsrs008aesmysqldecryptfunctionparametersmodevalueaes-256-ctrerror) + * 4.3.88 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.InitializationVector](#rqsrs008aesmysqldecryptfunctionparametersinitializationvector) + * 4.3.89 [RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.ReturnValue](#rqsrs008aesmysqldecryptfunctionparametersreturnvalue) + * 4.3.90 [RQ.SRS008.AES.MySQL.Decrypt.Function.Key.Length.TooShortError](#rqsrs008aesmysqldecryptfunctionkeylengthtooshorterror) + * 4.3.91 [RQ.SRS008.AES.MySQL.Decrypt.Function.Key.Length.TooLong](#rqsrs008aesmysqldecryptfunctionkeylengthtoolong) + * 4.3.92 [RQ.SRS008.AES.MySQL.Decrypt.Function.InitializationVector.Length.TooShortError](#rqsrs008aesmysqldecryptfunctioninitializationvectorlengthtooshorterror) + * 4.3.93 [RQ.SRS008.AES.MySQL.Decrypt.Function.InitializationVector.Length.TooLong](#rqsrs008aesmysqldecryptfunctioninitializationvectorlengthtoolong) + * 4.3.94 [RQ.SRS008.AES.MySQL.Decrypt.Function.InitializationVector.NotValidForMode](#rqsrs008aesmysqldecryptfunctioninitializationvectornotvalidformode) + * 4.3.95 [RQ.SRS008.AES.MySQL.Decrypt.Function.AES-128-ECB.KeyAndInitializationVector.Length](#rqsrs008aesmysqldecryptfunctionaes-128-ecbkeyandinitializationvectorlength) + * 4.3.96 [RQ.SRS008.AES.MySQL.Decrypt.Function.AES-192-ECB.KeyAndInitializationVector.Length](#rqsrs008aesmysqldecryptfunctionaes-192-ecbkeyandinitializationvectorlength) + * 4.3.97 [RQ.SRS008.AES.MySQL.Decrypt.Function.AES-256-ECB.KeyAndInitializationVector.Length](#rqsrs008aesmysqldecryptfunctionaes-256-ecbkeyandinitializationvectorlength) + * 4.3.98 [RQ.SRS008.AES.MySQL.Decrypt.Function.AES-128-CBC.KeyAndInitializationVector.Length](#rqsrs008aesmysqldecryptfunctionaes-128-cbckeyandinitializationvectorlength) + * 4.3.99 [RQ.SRS008.AES.MySQL.Decrypt.Function.AES-192-CBC.KeyAndInitializationVector.Length](#rqsrs008aesmysqldecryptfunctionaes-192-cbckeyandinitializationvectorlength) + * 4.3.100 [RQ.SRS008.AES.MySQL.Decrypt.Function.AES-256-CBC.KeyAndInitializationVector.Length](#rqsrs008aesmysqldecryptfunctionaes-256-cbckeyandinitializationvectorlength) + * 4.3.101 [RQ.SRS008.AES.MySQL.Decrypt.Function.AES-128-CFB1.KeyAndInitializationVector.Length](#rqsrs008aesmysqldecryptfunctionaes-128-cfb1keyandinitializationvectorlength) + * 4.3.102 [RQ.SRS008.AES.MySQL.Decrypt.Function.AES-192-CFB1.KeyAndInitializationVector.Length](#rqsrs008aesmysqldecryptfunctionaes-192-cfb1keyandinitializationvectorlength) + * 4.3.103 [RQ.SRS008.AES.MySQL.Decrypt.Function.AES-256-CFB1.KeyAndInitializationVector.Length](#rqsrs008aesmysqldecryptfunctionaes-256-cfb1keyandinitializationvectorlength) + * 4.3.104 [RQ.SRS008.AES.MySQL.Decrypt.Function.AES-128-CFB8.KeyAndInitializationVector.Length](#rqsrs008aesmysqldecryptfunctionaes-128-cfb8keyandinitializationvectorlength) + * 4.3.105 [RQ.SRS008.AES.MySQL.Decrypt.Function.AES-192-CFB8.KeyAndInitializationVector.Length](#rqsrs008aesmysqldecryptfunctionaes-192-cfb8keyandinitializationvectorlength) + * 4.3.106 [RQ.SRS008.AES.MySQL.Decrypt.Function.AES-256-CFB8.KeyAndInitializationVector.Length](#rqsrs008aesmysqldecryptfunctionaes-256-cfb8keyandinitializationvectorlength) + * 4.3.107 [RQ.SRS008.AES.MySQL.Decrypt.Function.AES-128-CFB128.KeyAndInitializationVector.Length](#rqsrs008aesmysqldecryptfunctionaes-128-cfb128keyandinitializationvectorlength) + * 4.3.108 [RQ.SRS008.AES.MySQL.Decrypt.Function.AES-192-CFB128.KeyAndInitializationVector.Length](#rqsrs008aesmysqldecryptfunctionaes-192-cfb128keyandinitializationvectorlength) + * 4.3.109 [RQ.SRS008.AES.MySQL.Decrypt.Function.AES-256-CFB128.KeyAndInitializationVector.Length](#rqsrs008aesmysqldecryptfunctionaes-256-cfb128keyandinitializationvectorlength) + * 4.3.110 [RQ.SRS008.AES.MySQL.Decrypt.Function.AES-128-OFB.KeyAndInitializationVector.Length](#rqsrs008aesmysqldecryptfunctionaes-128-ofbkeyandinitializationvectorlength) + * 4.3.111 [RQ.SRS008.AES.MySQL.Decrypt.Function.AES-192-OFB.KeyAndInitializationVector.Length](#rqsrs008aesmysqldecryptfunctionaes-192-ofbkeyandinitializationvectorlength) + * 4.3.112 [RQ.SRS008.AES.MySQL.Decrypt.Function.AES-256-OFB.KeyAndInitializationVector.Length](#rqsrs008aesmysqldecryptfunctionaes-256-ofbkeyandinitializationvectorlength) +* 5 [References](#references) + +## Revision History + +This document is stored in an electronic form using [Git] source control management software +hosted in a [GitHub Repository]. +All the updates are tracked using the [Revision History]. + +## Introduction + +Users need an ability to encrypt and decrypt column data with tenant specific keys. +Use cases include protection of sensitive column values and [GDPR] right to forget policies. +The implementation will support capabilities of the [MySQL aes_encrypt] and [MySQL aes_decrypt] +functions which encrypt and decrypt values using the [AES] (Advanced Encryption Standard) +algorithm. This functionality will enable encryption and decryption of data +accessed on remote [MySQL] servers via [MySQL Dictionary] or [MySQL Database Engine], +[MySQL Table Engine], or [MySQL Table Function]. + +## Terminology + +* **AES** - + Advanced Encryption Standard ([AES]) + +## Requirements + +### Generic + +#### RQ.SRS008.AES.Functions +version: 1.0 + +[ClickHouse] SHALL support [AES] encryption functions to encrypt and decrypt data. + +#### RQ.SRS008.AES.Functions.Compatability.MySQL +version: 1.0 + +[ClickHouse] SHALL support [AES] encryption functions compatible with [MySQL 5.7]. + +#### RQ.SRS008.AES.Functions.Compatability.Dictionaries +version: 1.0 + +[ClickHouse] SHALL support encryption and decryption of data accessed on remote +[MySQL] servers using [MySQL Dictionary]. + +#### RQ.SRS008.AES.Functions.Compatability.Engine.Database.MySQL +version: 1.0 + +[ClickHouse] SHALL support encryption and decryption of data accessed using [MySQL Database Engine], + +#### RQ.SRS008.AES.Functions.Compatability.Engine.Table.MySQL +version: 1.0 + +[ClickHouse] SHALL support encryption and decryption of data accessed using [MySQL Table Engine]. + +#### RQ.SRS008.AES.Functions.Compatability.TableFunction.MySQL +version: 1.0 + +[ClickHouse] SHALL support encryption and decryption of data accessed using [MySQL Table Function]. + +#### RQ.SRS008.AES.Functions.DifferentModes +version: 1.0 + +[ClickHouse] SHALL allow different modes to be supported in a single SQL statement +using explicit function parameters. + +#### RQ.SRS008.AES.Functions.DataFromMultipleSources +version: 1.0 + +[ClickHouse] SHALL support handling encryption and decryption of data from multiple sources +in the `SELECT` statement, including [ClickHouse] [MergeTree] table as well as [MySQL Dictionary], +[MySQL Database Engine], [MySQL Table Engine], and [MySQL Table Function] +with possibly different encryption schemes. + +#### RQ.SRS008.AES.Functions.SuppressOutputOfSensitiveValues +version: 1.0 + +[ClickHouse] SHALL suppress output of [AES] `string` and `key` parameters to the system log, +error log, and `query_log` table to prevent leakage of sensitive values. + +#### RQ.SRS008.AES.Functions.InvalidParameters +version: 1.0 + +[ClickHouse] SHALL return an error when parameters are invalid. + +#### RQ.SRS008.AES.Functions.Mismatched.Key +version: 1.0 + +[ClickHouse] SHALL return garbage for mismatched keys. + +#### RQ.SRS008.AES.Functions.Mismatched.IV +version: 1.0 + +[ClickHouse] SHALL return garbage for mismatched initialization vector for the modes that use it. + +#### RQ.SRS008.AES.Functions.Mismatched.AAD +version: 1.0 + +[ClickHouse] SHALL return garbage for mismatched additional authentication data for the modes that use it. + +#### RQ.SRS008.AES.Functions.Mismatched.Mode +version: 1.0 + +[ClickHouse] SHALL return an error or garbage for mismatched mode. + +#### RQ.SRS008.AES.Functions.Check.Performance +version: 1.0 + +Performance of [AES] encryption functions SHALL be measured. + +#### RQ.SRS008.AES.Function.Check.Performance.BestCase +version: 1.0 + +Performance of [AES] encryption functions SHALL be checked for the best case +scenario where there is one key, one initialization vector, and one large stream of data. + +#### RQ.SRS008.AES.Function.Check.Performance.WorstCase +version: 1.0 + +Performance of [AES] encryption functions SHALL be checked for the worst case +where there are `N` keys, `N` initialization vectors and `N` very small streams of data. + +#### RQ.SRS008.AES.Functions.Check.Compression +version: 1.0 + +Effect of [AES] encryption on column compression SHALL be measured. + +#### RQ.SRS008.AES.Functions.Check.Compression.LowCardinality +version: 1.0 + +Effect of [AES] encryption on the compression of a column with [LowCardinality] data type +SHALL be measured. + +### Specific + +#### RQ.SRS008.AES.Encrypt.Function +version: 1.0 + +[ClickHouse] SHALL support `aes_encrypt` function to encrypt data using [AES]. + +#### RQ.SRS008.AES.Encrypt.Function.Syntax +version: 1.0 + +[ClickHouse] SHALL support the following syntax for the `aes_encrypt` function + +```sql +aes_encrypt(plaintext, key, mode, [iv, aad]) +``` + +#### RQ.SRS008.AES.Encrypt.Function.NIST.TestVectors +version: 1.0 + +[ClickHouse] `aes_encrypt` function output SHALL produce output that matches [NIST test vectors]. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.PlainText +version: 1.0 + +[ClickHouse] SHALL support `plaintext` accepting any data type as +the first parameter to the `aes_encrypt` function that SHALL specify the data to be encrypted. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Key +version: 1.0 + +[ClickHouse] SHALL support `key` with `String` or `FixedString` data types +as the second parameter to the `aes_encrypt` function that SHALL specify the encryption key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode +version: 1.0 + +[ClickHouse] SHALL support `mode` with `String` or `FixedString` data types as the third parameter +to the `aes_encrypt` function that SHALL specify encryption key length and block encryption mode. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.ValuesFormat +version: 1.0 + +[ClickHouse] SHALL support values of the form `aes-[key length]-[mode]` for the `mode` parameter +of the `aes_encrypt` function where +the `key_length` SHALL specifies the length of the key and SHALL accept +`128`, `192`, or `256` as the values and the `mode` SHALL specify the block encryption +mode and SHALL accept [ECB], [CBC], [CFB1], [CFB8], [CFB128], or [OFB] as well as +[CTR] and [GCM] as the values. For example, `aes-256-ofb`. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.Invalid +version: 1.0 + +[ClickHouse] SHALL return an error if the specified value for the `mode` parameter of the `aes_encrypt` +function is not valid with the exception where such a mode is supported by the underlying +[OpenSSL] implementation. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-ECB +version: 1.0 + +[ClickHouse] SHALL support `aes-128-ecb` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [ECB] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-ECB +version: 1.0 + +[ClickHouse] SHALL support `aes-192-ecb` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [ECB] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-ECB +version: 1.0 + +[ClickHouse] SHALL support `aes-256-ecb` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [ECB] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-CBC +version: 1.0 + +[ClickHouse] SHALL support `aes-128-cbc` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [CBC] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-CBC +version: 1.0 + +[ClickHouse] SHALL support `aes-192-cbc` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [CBC] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-CBC +version: 1.0 + +[ClickHouse] SHALL support `aes-256-cbc` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [CBC] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-CFB1 +version: 1.0 + +[ClickHouse] SHALL support `aes-128-cfb1` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-CFB1 +version: 1.0 + +[ClickHouse] SHALL support `aes-192-cfb1` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-CFB1 +version: 1.0 + +[ClickHouse] SHALL support `aes-256-cfb1` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-CFB8 +version: 1.0 + +[ClickHouse] SHALL support `aes-128-cfb8` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-CFB8 +version: 1.0 + +[ClickHouse] SHALL support `aes-192-cfb8` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-CFB8 +version: 1.0 + +[ClickHouse] SHALL support `aes-256-cfb8` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-CFB128 +version: 1.0 + +[ClickHouse] SHALL support `aes-128-cfb128` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-CFB128 +version: 1.0 + +[ClickHouse] SHALL support `aes-192-cfb128` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-CFB128 +version: 1.0 + +[ClickHouse] SHALL support `aes-256-cfb128` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-OFB +version: 1.0 + +[ClickHouse] SHALL support `aes-128-ofb` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [OFB] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-OFB +version: 1.0 + +[ClickHouse] SHALL support `aes-192-ofb` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [OFB] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-OFB +version: 1.0 + +[ClickHouse] SHALL support `aes-256-ofb` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [OFB] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-GCM +version: 1.0 + +[ClickHouse] SHALL support `aes-128-gcm` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [GCM] block mode encryption with a 128 bit key. +An `AEAD` 16-byte tag is appended to the resulting ciphertext according to +the [RFC5116]. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-GCM +version: 1.0 + +[ClickHouse] SHALL support `aes-192-gcm` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [GCM] block mode encryption with a 192 bit key. +An `AEAD` 16-byte tag is appended to the resulting ciphertext according to +the [RFC5116]. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-GCM +version: 1.0 + +[ClickHouse] SHALL support `aes-256-gcm` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [GCM] block mode encryption with a 256 bit key. +An `AEAD` 16-byte tag is appended to the resulting ciphertext according to +the [RFC5116]. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-CTR +version: 1.0 + +[ClickHouse] SHALL support `aes-128-ctr` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [CTR] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-CTR +version: 1.0 + +[ClickHouse] SHALL support `aes-192-ctr` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [CTR] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-CTR +version: 1.0 + +[ClickHouse] SHALL support `aes-256-ctr` as the value for the `mode` parameter of the `aes_encrypt` function +and [AES] algorithm SHALL use the [CTR] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.InitializationVector +version: 1.0 + +[ClickHouse] SHALL support `iv` with `String` or `FixedString` data types as the optional fourth +parameter to the `aes_encrypt` function that SHALL specify the initialization vector for block modes that require +it. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.AdditionalAuthenticatedData +version: 1.0 + +[ClickHouse] SHALL support `aad` with `String` or `FixedString` data types as the optional fifth +parameter to the `aes_encrypt` function that SHALL specify the additional authenticated data +for block modes that require it. + +#### RQ.SRS008.AES.Encrypt.Function.Parameters.ReturnValue +version: 1.0 + +[ClickHouse] SHALL return the encrypted value of the data +using `String` data type as the result of `aes_encrypt` function. + +#### RQ.SRS008.AES.Encrypt.Function.Key.Length.InvalidLengthError +version: 1.0 + +[ClickHouse] SHALL return an error if the `key` length is not exact for the `aes_encrypt` function for a given block mode. + +#### RQ.SRS008.AES.Encrypt.Function.InitializationVector.Length.InvalidLengthError +version: 1.0 + +[ClickHouse] SHALL return an error if the `iv` length is specified and not of the exact size for the `aes_encrypt` function for a given block mode. + +#### RQ.SRS008.AES.Encrypt.Function.InitializationVector.NotValidForMode +version: 1.0 + +[ClickHouse] SHALL return an error if the `iv` is specified for the `aes_encrypt` function for a mode that does not need it. + +#### RQ.SRS008.AES.Encrypt.Function.AdditionalAuthenticationData.NotValidForMode +version: 1.0 + +[ClickHouse] SHALL return an error if the `aad` is specified for the `aes_encrypt` function for a mode that does not need it. + +#### RQ.SRS008.AES.Encrypt.Function.AdditionalAuthenticationData.Length +version: 1.0 + +[ClickHouse] SHALL not limit the size of the `aad` parameter passed to the `aes_encrypt` function. + +#### RQ.SRS008.AES.Encrypt.Function.AES-128-ECB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-128-ecb` and `key` is not 16 bytes +or `iv` or `aad` is specified. + +#### RQ.SRS008.AES.Encrypt.Function.AES-192-ECB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-192-ecb` and `key` is not 24 bytes +or `iv` or `aad` is specified. + +#### RQ.SRS008.AES.Encrypt.Function.AES-256-ECB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-256-ecb` and `key` is not 32 bytes +or `iv` or `aad` is specified. + +#### RQ.SRS008.AES.Encrypt.Function.AES-128-CBC.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-128-cbc` and `key` is not 16 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Encrypt.Function.AES-192-CBC.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-192-cbc` and `key` is not 24 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Encrypt.Function.AES-256-CBC.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-256-cbc` and `key` is not 32 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Encrypt.Function.AES-128-CFB1.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-128-cfb1` and `key` is not 16 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Encrypt.Function.AES-192-CFB1.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-192-cfb1` and `key` is not 24 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Encrypt.Function.AES-256-CFB1.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-256-cfb1` and `key` is not 32 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Encrypt.Function.AES-128-CFB8.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-128-cfb8` and `key` is not 16 bytes +and if specified `iv` is not 16 bytes. + +#### RQ.SRS008.AES.Encrypt.Function.AES-192-CFB8.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-192-cfb8` and `key` is not 24 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Encrypt.Function.AES-256-CFB8.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-256-cfb8` and `key` is not 32 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Encrypt.Function.AES-128-CFB128.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-128-cfb128` and `key` is not 16 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Encrypt.Function.AES-192-CFB128.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-192-cfb128` and `key` is not 24 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Encrypt.Function.AES-256-CFB128.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-256-cfb128` and `key` is not 32 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Encrypt.Function.AES-128-OFB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-128-ofb` and `key` is not 16 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Encrypt.Function.AES-192-OFB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-192-ofb` and `key` is not 24 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Encrypt.Function.AES-256-OFB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-256-ofb` and `key` is not 32 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Encrypt.Function.AES-128-GCM.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-128-gcm` and `key` is not 16 bytes +or `iv` is not specified or is less than 8 bytes. + +#### RQ.SRS008.AES.Encrypt.Function.AES-192-GCM.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-192-gcm` and `key` is not 24 bytes +or `iv` is not specified or is less than 8 bytes. + +#### RQ.SRS008.AES.Encrypt.Function.AES-256-GCM.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-256-gcm` and `key` is not 32 bytes +or `iv` is not specified or is less than 8 bytes. + +#### RQ.SRS008.AES.Encrypt.Function.AES-128-CTR.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-128-ctr` and `key` is not 16 bytes +or if specified `iv` is not 16 bytes. + +#### RQ.SRS008.AES.Encrypt.Function.AES-192-CTR.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-192-ctr` and `key` is not 24 bytes +or if specified `iv` is not 16 bytes. + +#### RQ.SRS008.AES.Encrypt.Function.AES-256-CTR.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-256-ctr` and `key` is not 32 bytes +or if specified `iv` is not 16 bytes. + +#### RQ.SRS008.AES.Decrypt.Function +version: 1.0 + +[ClickHouse] SHALL support `aes_decrypt` function to decrypt data using [AES]. + +#### RQ.SRS008.AES.Decrypt.Function.Syntax +version: 1.0 + +[ClickHouse] SHALL support the following syntax for the `aes_decrypt` function + +```sql +aes_decrypt(ciphertext, key, mode, [iv, aad]) +``` + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.CipherText +version: 1.0 + +[ClickHouse] SHALL support `ciphertext` accepting `FixedString` or `String` data types as +the first parameter to the `aes_decrypt` function that SHALL specify the data to be decrypted. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Key +version: 1.0 + +[ClickHouse] SHALL support `key` with `String` or `FixedString` data types +as the second parameter to the `aes_decrypt` function that SHALL specify the encryption key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode +version: 1.0 + +[ClickHouse] SHALL support `mode` with `String` or `FixedString` data types as the third parameter +to the `aes_decrypt` function that SHALL specify encryption key length and block encryption mode. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.ValuesFormat +version: 1.0 + +[ClickHouse] SHALL support values of the form `aes-[key length]-[mode]` for the `mode` parameter +of the `aes_decrypt` function where +the `key_length` SHALL specifies the length of the key and SHALL accept +`128`, `192`, or `256` as the values and the `mode` SHALL specify the block encryption +mode and SHALL accept [ECB], [CBC], [CFB1], [CFB8], [CFB128], or [OFB] as well as +[CTR] and [GCM] as the values. For example, `aes-256-ofb`. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.Invalid +version: 1.0 + +[ClickHouse] SHALL return an error if the specified value for the `mode` parameter of the `aes_decrypt` +function is not valid with the exception where such a mode is supported by the underlying +[OpenSSL] implementation. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-ECB +version: 1.0 + +[ClickHouse] SHALL support `aes-128-ecb` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [ECB] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-ECB +version: 1.0 + +[ClickHouse] SHALL support `aes-192-ecb` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [ECB] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-ECB +version: 1.0 + +[ClickHouse] SHALL support `aes-256-ecb` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [ECB] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-CBC +version: 1.0 + +[ClickHouse] SHALL support `aes-128-cbc` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [CBC] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-CBC +version: 1.0 + +[ClickHouse] SHALL support `aes-192-cbc` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [CBC] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-CBC +version: 1.0 + +[ClickHouse] SHALL support `aes-256-cbc` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [CBC] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-CFB1 +version: 1.0 + +[ClickHouse] SHALL support `aes-128-cfb1` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-CFB1 +version: 1.0 + +[ClickHouse] SHALL support `aes-192-cfb1` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-CFB1 +version: 1.0 + +[ClickHouse] SHALL support `aes-256-cfb1` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-CFB8 +version: 1.0 + +[ClickHouse] SHALL support `aes-128-cfb8` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-CFB8 +version: 1.0 + +[ClickHouse] SHALL support `aes-192-cfb8` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-CFB8 +version: 1.0 + +[ClickHouse] SHALL support `aes-256-cfb8` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-CFB128 +version: 1.0 + +[ClickHouse] SHALL support `aes-128-cfb128` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-CFB128 +version: 1.0 + +[ClickHouse] SHALL support `aes-192-cfb128` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-CFB128 +version: 1.0 + +[ClickHouse] SHALL support `aes-256-cfb128` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-OFB +version: 1.0 + +[ClickHouse] SHALL support `aes-128-ofb` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [OFB] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-OFB +version: 1.0 + +[ClickHouse] SHALL support `aes-192-ofb` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [OFB] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-OFB +version: 1.0 + +[ClickHouse] SHALL support `aes-256-ofb` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [OFB] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-GCM +version: 1.0 + +[ClickHouse] SHALL support `aes-128-gcm` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [GCM] block mode encryption with a 128 bit key. +An [AEAD] 16-byte tag is expected present at the end of the ciphertext according to +the [RFC5116]. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-GCM +version: 1.0 + +[ClickHouse] SHALL support `aes-192-gcm` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [GCM] block mode encryption with a 192 bit key. +An [AEAD] 16-byte tag is expected present at the end of the ciphertext according to +the [RFC5116]. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-GCM +version: 1.0 + +[ClickHouse] SHALL support `aes-256-gcm` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [GCM] block mode encryption with a 256 bit key. +An [AEAD] 16-byte tag is expected present at the end of the ciphertext according to +the [RFC5116]. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-CTR +version: 1.0 + +[ClickHouse] SHALL support `aes-128-ctr` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [CTR] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-CTR +version: 1.0 + +[ClickHouse] SHALL support `aes-192-ctr` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [CTR] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-CTR +version: 1.0 + +[ClickHouse] SHALL support `aes-256-ctr` as the value for the `mode` parameter of the `aes_decrypt` function +and [AES] algorithm SHALL use the [CTR] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.InitializationVector +version: 1.0 + +[ClickHouse] SHALL support `iv` with `String` or `FixedString` data types as the optional fourth +parameter to the `aes_decrypt` function that SHALL specify the initialization vector for block modes that require +it. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.AdditionalAuthenticatedData +version: 1.0 + +[ClickHouse] SHALL support `aad` with `String` or `FixedString` data types as the optional fifth +parameter to the `aes_decrypt` function that SHALL specify the additional authenticated data +for block modes that require it. + +#### RQ.SRS008.AES.Decrypt.Function.Parameters.ReturnValue +version: 1.0 + +[ClickHouse] SHALL return the decrypted value of the data +using `String` data type as the result of `aes_decrypt` function. + +#### RQ.SRS008.AES.Decrypt.Function.Key.Length.InvalidLengthError +version: 1.0 + +[ClickHouse] SHALL return an error if the `key` length is not exact for the `aes_decrypt` function for a given block mode. + +#### RQ.SRS008.AES.Decrypt.Function.InitializationVector.Length.InvalidLengthError +version: 1.0 + +[ClickHouse] SHALL return an error if the `iv` is speficified and the length is not exact for the `aes_decrypt` function for a given block mode. + +#### RQ.SRS008.AES.Decrypt.Function.InitializationVector.NotValidForMode +version: 1.0 + +[ClickHouse] SHALL return an error if the `iv` is specified for the `aes_decrypt` function +for a mode that does not need it. + +#### RQ.SRS008.AES.Decrypt.Function.AdditionalAuthenticationData.NotValidForMode +version: 1.0 + +[ClickHouse] SHALL return an error if the `aad` is specified for the `aes_decrypt` function +for a mode that does not need it. + +#### RQ.SRS008.AES.Decrypt.Function.AdditionalAuthenticationData.Length +version: 1.0 + +[ClickHouse] SHALL not limit the size of the `aad` parameter passed to the `aes_decrypt` function. + +#### RQ.SRS008.AES.Decrypt.Function.AES-128-ECB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-128-ecb` and `key` is not 16 bytes +or `iv` or `aad` is specified. + +#### RQ.SRS008.AES.Decrypt.Function.AES-192-ECB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-192-ecb` and `key` is not 24 bytes +or `iv` or `aad` is specified. + +#### RQ.SRS008.AES.Decrypt.Function.AES-256-ECB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-256-ecb` and `key` is not 32 bytes +or `iv` or `aad` is specified. + +#### RQ.SRS008.AES.Decrypt.Function.AES-128-CBC.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-128-cbc` and `key` is not 16 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Decrypt.Function.AES-192-CBC.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-192-cbc` and `key` is not 24 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Decrypt.Function.AES-256-CBC.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-256-cbc` and `key` is not 32 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Decrypt.Function.AES-128-CFB1.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-128-cfb1` and `key` is not 16 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Decrypt.Function.AES-192-CFB1.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-192-cfb1` and `key` is not 24 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Decrypt.Function.AES-256-CFB1.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-256-cfb1` and `key` is not 32 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Decrypt.Function.AES-128-CFB8.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-128-cfb8` and `key` is not 16 bytes +and if specified `iv` is not 16 bytes. + +#### RQ.SRS008.AES.Decrypt.Function.AES-192-CFB8.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-192-cfb8` and `key` is not 24 bytes +or `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Decrypt.Function.AES-256-CFB8.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-256-cfb8` and `key` is not 32 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Decrypt.Function.AES-128-CFB128.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-128-cfb128` and `key` is not 16 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Decrypt.Function.AES-192-CFB128.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-192-cfb128` and `key` is not 24 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Decrypt.Function.AES-256-CFB128.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-256-cfb128` and `key` is not 32 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Decrypt.Function.AES-128-OFB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-128-ofb` and `key` is not 16 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Decrypt.Function.AES-192-OFB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-192-ofb` and `key` is not 24 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Decrypt.Function.AES-256-OFB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-256-ofb` and `key` is not 32 bytes +or if specified `iv` is not 16 bytes or `aad` is specified. + +#### RQ.SRS008.AES.Decrypt.Function.AES-128-GCM.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-128-gcm` and `key` is not 16 bytes +or `iv` is not specified or is less than 8 bytes. + +#### RQ.SRS008.AES.Decrypt.Function.AES-192-GCM.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-192-gcm` and `key` is not 24 bytes +or `iv` is not specified or is less than 8 bytes. + +#### RQ.SRS008.AES.Decrypt.Function.AES-256-GCM.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-256-gcm` and `key` is not 32 bytes +or `iv` is not specified or is less than 8 bytes. + +#### RQ.SRS008.AES.Decrypt.Function.AES-128-CTR.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-128-ctr` and `key` is not 16 bytes +or if specified `iv` is not 16 bytes. + +#### RQ.SRS008.AES.Decrypt.Function.AES-192-CTR.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-192-ctr` and `key` is not 24 bytes +or if specified `iv` is not 16 bytes. + +#### RQ.SRS008.AES.Decrypt.Function.AES-256-CTR.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-256-ctr` and `key` is not 32 bytes +or if specified `iv` is not 16 bytes. + +### MySQL Specific Functions + +#### RQ.SRS008.AES.MySQL.Encrypt.Function +version: 1.0 + +[ClickHouse] SHALL support `aes_encrypt_mysql` function to encrypt data using [AES]. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Syntax +version: 1.0 + +[ClickHouse] SHALL support the following syntax for the `aes_encrypt_mysql` function + +```sql +aes_encrypt_mysql(plaintext, key, mode, [iv]) +``` + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.PlainText +version: 1.0 + +[ClickHouse] SHALL support `plaintext` accepting any data type as +the first parameter to the `aes_encrypt_mysql` function that SHALL specify the data to be encrypted. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Key +version: 1.0 + +[ClickHouse] SHALL support `key` with `String` or `FixedString` data types +as the second parameter to the `aes_encrypt_mysql` function that SHALL specify the encryption key. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode +version: 1.0 + +[ClickHouse] SHALL support `mode` with `String` or `FixedString` data types as the third parameter +to the `aes_encrypt_mysql` function that SHALL specify encryption key length and block encryption mode. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.ValuesFormat +version: 1.0 + +[ClickHouse] SHALL support values of the form `aes-[key length]-[mode]` for the `mode` parameter +of the `aes_encrypt_mysql` function where +the `key_length` SHALL specifies the length of the key and SHALL accept +`128`, `192`, or `256` as the values and the `mode` SHALL specify the block encryption +mode and SHALL accept [ECB], [CBC], [CFB1], [CFB8], [CFB128], or [OFB]. For example, `aes-256-ofb`. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.Invalid +version: 1.0 + +[ClickHouse] SHALL return an error if the specified value for the `mode` parameter of the `aes_encrypt_mysql` +function is not valid with the exception where such a mode is supported by the underlying +[OpenSSL] implementation. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-ECB +version: 1.0 + +[ClickHouse] SHALL support `aes-128-ecb` as the value for the `mode` parameter of the `aes_encrypt_mysql` function +and [AES] algorithm SHALL use the [ECB] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-ECB +version: 1.0 + +[ClickHouse] SHALL support `aes-192-ecb` as the value for the `mode` parameter of the `aes_encrypt_mysql` function +and [AES] algorithm SHALL use the [ECB] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-ECB +version: 1.0 + +[ClickHouse] SHALL support `aes-256-ecb` as the value for the `mode` parameter of the `aes_encrypt_mysql` function +and [AES] algorithm SHALL use the [ECB] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-CBC +version: 1.0 + +[ClickHouse] SHALL support `aes-128-cbc` as the value for the `mode` parameter of the `aes_encrypt_mysql` function +and [AES] algorithm SHALL use the [CBC] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-CBC +version: 1.0 + +[ClickHouse] SHALL support `aes-192-cbc` as the value for the `mode` parameter of the `aes_encrypt_mysql` function +and [AES] algorithm SHALL use the [CBC] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-CBC +version: 1.0 + +[ClickHouse] SHALL support `aes-256-cbc` as the value for the `mode` parameter of the `aes_encrypt_mysql` function +and [AES] algorithm SHALL use the [CBC] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-CFB1 +version: 1.0 + +[ClickHouse] SHALL support `aes-128-cfb1` as the value for the `mode` parameter of the `aes_encrypt_mysql` function +and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-CFB1 +version: 1.0 + +[ClickHouse] SHALL support `aes-192-cfb1` as the value for the `mode` parameter of the `aes_encrypt_mysql` function +and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-CFB1 +version: 1.0 + +[ClickHouse] SHALL support `aes-256-cfb1` as the value for the `mode` parameter of the `aes_encrypt_mysql` function +and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-CFB8 +version: 1.0 + +[ClickHouse] SHALL support `aes-128-cfb8` as the value for the `mode` parameter of the `aes_encrypt_mysql` function +and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-CFB8 +version: 1.0 + +[ClickHouse] SHALL support `aes-192-cfb8` as the value for the `mode` parameter of the `aes_encrypt_mysql` function +and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-CFB8 +version: 1.0 + +[ClickHouse] SHALL support `aes-256-cfb8` as the value for the `mode` parameter of the `aes_encrypt_mysql` function +and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-CFB128 +version: 1.0 + +[ClickHouse] SHALL support `aes-128-cfb128` as the value for the `mode` parameter of the `aes_encrypt_mysql` function +and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-CFB128 +version: 1.0 + +[ClickHouse] SHALL support `aes-192-cfb128` as the value for the `mode` parameter of the `aes_encrypt_mysql` function +and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-CFB128 +version: 1.0 + +[ClickHouse] SHALL support `aes-256-cfb128` as the value for the `mode` parameter of the `aes_encrypt_mysql` function +and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-OFB +version: 1.0 + +[ClickHouse] SHALL support `aes-128-ofb` as the value for the `mode` parameter of the `aes_encrypt_mysql` function +and [AES] algorithm SHALL use the [OFB] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-OFB +version: 1.0 + +[ClickHouse] SHALL support `aes-192-ofb` as the value for the `mode` parameter of the `aes_encrypt_mysql` function +and [AES] algorithm SHALL use the [OFB] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-OFB +version: 1.0 + +[ClickHouse] SHALL support `aes-256-ofb` as the value for the `mode` parameter of the `aes_encrypt_mysql` function +and [AES] algorithm SHALL use the [OFB] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-GCM.Error +version: 1.0 + +[ClickHouse] SHALL return an error if `aes-128-gcm` is specified as the value for the `mode` parameter of the +`aes_encrypt_mysql` function. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-GCM.Error +version: 1.0 + +[ClickHouse] SHALL return an error if `aes-192-gcm` is specified as the value for the `mode` parameter of the +`aes_encrypt_mysql` function. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-GCM.Error +version: 1.0 + +[ClickHouse] SHALL return an error if `aes-256-gcm` is specified as the value for the `mode` parameter of the +`aes_encrypt_mysql` function. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-CTR.Error +version: 1.0 + +[ClickHouse] SHALL return an error if `aes-128-ctr` is specified as the value for the `mode` parameter of the +`aes_encrypt_mysql` function. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-CTR.Error +version: 1.0 + +[ClickHouse] SHALL return an error if `aes-192-ctr` is specified as the value for the `mode` parameter of the +`aes_encrypt_mysql` function. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-CTR.Error +version: 1.0 + +[ClickHouse] SHALL return an error if `aes-256-ctr` is specified as the value for the `mode` parameter of the +`aes_encrypt_mysql` function. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.InitializationVector +version: 1.0 + +[ClickHouse] SHALL support `iv` with `String` or `FixedString` data types as the optional fourth +parameter to the `aes_encrypt_mysql` function that SHALL specify the initialization vector for block modes that require +it. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.ReturnValue +version: 1.0 + +[ClickHouse] SHALL return the encrypted value of the data +using `String` data type as the result of `aes_encrypt_mysql` function. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Key.Length.TooShortError +version: 1.0 + +[ClickHouse] SHALL return an error if the `key` length is less than the minimum for the `aes_encrypt_mysql` +function for a given block mode. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.Key.Length.TooLong +version: 1.0 + +[ClickHouse] SHALL use folding algorithm specified below if the `key` length is longer than required +for the `aes_encrypt_mysql` function for a given block mode. + +```python +def fold_key(key, cipher_key_size): + key = list(key) if not isinstance(key, (list, tuple)) else key + folded_key = key[:cipher_key_size] + for i in range(cipher_key_size, len(key)): + print(i % cipher_key_size, i) + folded_key[i % cipher_key_size] ^= key[i] + return folded_key +``` + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.InitializationVector.Length.TooShortError +version: 1.0 + +[ClickHouse] SHALL return an error if the `iv` length is specified and is less than the minimum +that is required for the `aes_encrypt_mysql` function for a given block mode. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.InitializationVector.Length.TooLong +version: 1.0 + +[ClickHouse] SHALL use the first `N` bytes that are required if the `iv` is specified and +its length is longer than required for the `aes_encrypt_mysql` function for a given block mode. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.InitializationVector.NotValidForMode +version: 1.0 + +[ClickHouse] SHALL return an error if the `iv` is specified for the `aes_encrypt_mysql` +function for a mode that does not need it. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.AES-128-ECB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-128-ecb` and `key` is less than 16 bytes +or `iv` is specified. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.AES-192-ECB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-192-ecb` and `key` is less than 24 bytes +or `iv` is specified. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.AES-256-ECB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-256-ecb` and `key` is less than 32 bytes +or `iv` is specified. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.AES-128-CBC.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-128-cbc` and `key` is less than 16 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.AES-192-CBC.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-192-cbc` and `key` is less than 24 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.AES-256-CBC.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-256-cbc` and `key` is less than 32 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.AES-128-CFB1.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-128-cfb1` and `key` is less than 16 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.AES-192-CFB1.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-192-cfb1` and `key` is less than 24 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.AES-256-CFB1.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-256-cfb1` and `key` is less than 32 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.AES-128-CFB8.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-128-cfb8` and `key` is less than 16 bytes +and if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.AES-192-CFB8.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-192-cfb8` and `key` is less than 24 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.AES-256-CFB8.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-256-cfb8` and `key` is less than 32 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.AES-128-CFB128.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-128-cfb128` and `key` is less than 16 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.AES-192-CFB128.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-192-cfb128` and `key` is less than 24 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.AES-256-CFB128.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-256-cfb128` and `key` is less than 32 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.AES-128-OFB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-128-ofb` and `key` is less than 16 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.AES-192-OFB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-192-ofb` and `key` is less than 24 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Encrypt.Function.AES-256-OFB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-256-ofb` and `key` is less than 32 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function +version: 1.0 + +[ClickHouse] SHALL support `aes_decrypt_mysql` function to decrypt data using [AES]. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Syntax +version: 1.0 + +[ClickHouse] SHALL support the following syntax for the `aes_decrypt_mysql` function + +```sql +aes_decrypt_mysql(ciphertext, key, mode, [iv]) +``` + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.CipherText +version: 1.0 + +[ClickHouse] SHALL support `ciphertext` accepting any data type as +the first parameter to the `aes_decrypt_mysql` function that SHALL specify the data to be decrypted. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Key +version: 1.0 + +[ClickHouse] SHALL support `key` with `String` or `FixedString` data types +as the second parameter to the `aes_decrypt_mysql` function that SHALL specify the encryption key. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode +version: 1.0 + +[ClickHouse] SHALL support `mode` with `String` or `FixedString` data types as the third parameter +to the `aes_decrypt_mysql` function that SHALL specify encryption key length and block encryption mode. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.ValuesFormat +version: 1.0 + +[ClickHouse] SHALL support values of the form `aes-[key length]-[mode]` for the `mode` parameter +of the `aes_decrypt_mysql` function where +the `key_length` SHALL specifies the length of the key and SHALL accept +`128`, `192`, or `256` as the values and the `mode` SHALL specify the block encryption +mode and SHALL accept [ECB], [CBC], [CFB1], [CFB8], [CFB128], or [OFB]. For example, `aes-256-ofb`. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.Invalid +version: 1.0 + +[ClickHouse] SHALL return an error if the specified value for the `mode` parameter of the `aes_decrypt_mysql` +function is not valid with the exception where such a mode is supported by the underlying +[OpenSSL] implementation. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-ECB +version: 1.0 + +[ClickHouse] SHALL support `aes-128-ecb` as the value for the `mode` parameter of the `aes_decrypt_mysql` function +and [AES] algorithm SHALL use the [ECB] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-ECB +version: 1.0 + +[ClickHouse] SHALL support `aes-192-ecb` as the value for the `mode` parameter of the `aes_decrypt_mysql` function +and [AES] algorithm SHALL use the [ECB] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-ECB +version: 1.0 + +[ClickHouse] SHALL support `aes-256-ecb` as the value for the `mode` parameter of the `aes_decrypt_mysql` function +and [AES] algorithm SHALL use the [ECB] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-CBC +version: 1.0 + +[ClickHouse] SHALL support `aes-128-cbc` as the value for the `mode` parameter of the `aes_decrypt_mysql` function +and [AES] algorithm SHALL use the [CBC] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-CBC +version: 1.0 + +[ClickHouse] SHALL support `aes-192-cbc` as the value for the `mode` parameter of the `aes_decrypt_mysql` function +and [AES] algorithm SHALL use the [CBC] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-CBC +version: 1.0 + +[ClickHouse] SHALL support `aes-256-cbc` as the value for the `mode` parameter of the `aes_decrypt_mysql` function +and [AES] algorithm SHALL use the [CBC] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-CFB1 +version: 1.0 + +[ClickHouse] SHALL support `aes-128-cfb1` as the value for the `mode` parameter of the `aes_decrypt_mysql` function +and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-CFB1 +version: 1.0 + +[ClickHouse] SHALL support `aes-192-cfb1` as the value for the `mode` parameter of the `aes_decrypt_mysql` function +and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-CFB1 +version: 1.0 + +[ClickHouse] SHALL support `aes-256-cfb1` as the value for the `mode` parameter of the `aes_decrypt_mysql` function +and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-CFB8 +version: 1.0 + +[ClickHouse] SHALL support `aes-128-cfb8` as the value for the `mode` parameter of the `aes_decrypt_mysql` function +and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-CFB8 +version: 1.0 + +[ClickHouse] SHALL support `aes-192-cfb8` as the value for the `mode` parameter of the `aes_decrypt_mysql` function +and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-CFB8 +version: 1.0 + +[ClickHouse] SHALL support `aes-256-cfb8` as the value for the `mode` parameter of the `aes_decrypt_mysql` function +and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-CFB128 +version: 1.0 + +[ClickHouse] SHALL support `aes-128-cfb128` as the value for the `mode` parameter of the `aes_decrypt_mysql` function +and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-CFB128 +version: 1.0 + +[ClickHouse] SHALL support `aes-192-cfb128` as the value for the `mode` parameter of the `aes_decrypt_mysql` function +and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-CFB128 +version: 1.0 + +[ClickHouse] SHALL support `aes-256-cfb128` as the value for the `mode` parameter of the `aes_decrypt_mysql` function +and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-OFB +version: 1.0 + +[ClickHouse] SHALL support `aes-128-ofb` as the value for the `mode` parameter of the `aes_decrypt_mysql` function +and [AES] algorithm SHALL use the [OFB] block mode encryption with a 128 bit key. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-OFB +version: 1.0 + +[ClickHouse] SHALL support `aes-192-ofb` as the value for the `mode` parameter of the `aes_decrypt_mysql` function +and [AES] algorithm SHALL use the [OFB] block mode encryption with a 192 bit key. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-OFB +version: 1.0 + +[ClickHouse] SHALL support `aes-256-ofb` as the value for the `mode` parameter of the `aes_decrypt_mysql` function +and [AES] algorithm SHALL use the [OFB] block mode encryption with a 256 bit key. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-GCM.Error +version: 1.0 + +[ClickHouse] SHALL return an error if `aes-128-gcm` is specified as the value for the `mode` parameter of the +`aes_decrypt_mysql` function. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-GCM.Error +version: 1.0 + +[ClickHouse] SHALL return an error if `aes-192-gcm` is specified as the value for the `mode` parameter of the +`aes_decrypt_mysql` function. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-GCM.Error +version: 1.0 + +[ClickHouse] SHALL return an error if `aes-256-gcm` is specified as the value for the `mode` parameter of the +`aes_decrypt_mysql` function. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-CTR.Error +version: 1.0 + +[ClickHouse] SHALL return an error if `aes-128-ctr` is specified as the value for the `mode` parameter of the +`aes_decrypt_mysql` function. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-CTR.Error +version: 1.0 + +[ClickHouse] SHALL return an error if `aes-192-ctr` is specified as the value for the `mode` parameter of the +`aes_decrypt_mysql` function. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-CTR.Error +version: 1.0 + +[ClickHouse] SHALL return an error if `aes-256-ctr` is specified as the value for the `mode` parameter of the +`aes_decrypt_mysql` function. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.InitializationVector +version: 1.0 + +[ClickHouse] SHALL support `iv` with `String` or `FixedString` data types as the optional fourth +parameter to the `aes_decrypt_mysql` function that SHALL specify the initialization vector for block modes that require +it. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.ReturnValue +version: 1.0 + +[ClickHouse] SHALL return the decrypted value of the data +using `String` data type as the result of `aes_decrypt_mysql` function. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Key.Length.TooShortError +version: 1.0 + +[ClickHouse] SHALL return an error if the `key` length is less than the minimum for the `aes_decrypt_mysql` +function for a given block mode. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.Key.Length.TooLong +version: 1.0 + +[ClickHouse] SHALL use folding algorithm specified below if the `key` length is longer than required +for the `aes_decrypt_mysql` function for a given block mode. + +```python +def fold_key(key, cipher_key_size): + key = list(key) if not isinstance(key, (list, tuple)) else key + folded_key = key[:cipher_key_size] + for i in range(cipher_key_size, len(key)): + print(i % cipher_key_size, i) + folded_key[i % cipher_key_size] ^= key[i] + return folded_key +``` + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.InitializationVector.Length.TooShortError +version: 1.0 + +[ClickHouse] SHALL return an error if the `iv` length is specified and is less than the minimum +that is required for the `aes_decrypt_mysql` function for a given block mode. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.InitializationVector.Length.TooLong +version: 1.0 + +[ClickHouse] SHALL use the first `N` bytes that are required if the `iv` is specified and +its length is longer than required for the `aes_decrypt_mysql` function for a given block mode. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.InitializationVector.NotValidForMode +version: 1.0 + +[ClickHouse] SHALL return an error if the `iv` is specified for the `aes_decrypt_mysql` +function for a mode that does not need it. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.AES-128-ECB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-128-ecb` and `key` is less than 16 bytes +or `iv` is specified. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.AES-192-ECB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-192-ecb` and `key` is less than 24 bytes +or `iv` is specified. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.AES-256-ECB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-256-ecb` and `key` is less than 32 bytes +or `iv` is specified. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.AES-128-CBC.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-128-cbc` and `key` is less than 16 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.AES-192-CBC.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-192-cbc` and `key` is less than 24 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.AES-256-CBC.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-256-cbc` and `key` is less than 32 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.AES-128-CFB1.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-128-cfb1` and `key` is less than 16 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.AES-192-CFB1.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-192-cfb1` and `key` is less than 24 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.AES-256-CFB1.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-256-cfb1` and `key` is less than 32 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.AES-128-CFB8.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-128-cfb8` and `key` is less than 16 bytes +and if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.AES-192-CFB8.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-192-cfb8` and `key` is less than 24 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.AES-256-CFB8.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-256-cfb8` and `key` is less than 32 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.AES-128-CFB128.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-128-cfb128` and `key` is less than 16 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.AES-192-CFB128.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-192-cfb128` and `key` is less than 24 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.AES-256-CFB128.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-256-cfb128` and `key` is less than 32 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.AES-128-OFB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-128-ofb` and `key` is less than 16 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.AES-192-OFB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-192-ofb` and `key` is less than 24 bytes +or if specified `iv` is less than 16 bytes. + +#### RQ.SRS008.AES.MySQL.Decrypt.Function.AES-256-OFB.KeyAndInitializationVector.Length +version: 1.0 + +[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-256-ofb` and `key` is less than 32 bytes +or if specified `iv` is less than 16 bytes. + +## References + +* **GDPR:** https://en.wikipedia.org/wiki/General_Data_Protection_Regulation +* **MySQL:** https://www.mysql.com/ +* **AES:** https://en.wikipedia.org/wiki/Advanced_Encryption_Standard +* **ClickHouse:** https://clickhouse.tech +* **Git:** https://git-scm.com/ + +[OpenSSL]: https://www.openssl.org/ +[LowCardinality]: https://clickhouse.tech/docs/en/sql-reference/data-types/lowcardinality/ +[MergeTree]: https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/mergetree/ +[MySQL Database Engine]: https://clickhouse.tech/docs/en/engines/database-engines/mysql/ +[MySQL Table Engine]: https://clickhouse.tech/docs/en/engines/table-engines/integrations/mysql/ +[MySQL Table Function]: https://clickhouse.tech/docs/en/sql-reference/table-functions/mysql/ +[MySQL Dictionary]: https://clickhouse.tech/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources/#dicts-external_dicts_dict_sources-mysql +[GCM]: https://en.wikipedia.org/wiki/Galois/Counter_Mode +[CTR]: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Counter_(CTR) +[CBC]: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_block_chaining_(CBC) +[ECB]: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_codebook_(ECB) +[CFB]: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_feedback_(CFB) +[CFB1]: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_feedback_(CFB) +[CFB8]: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_feedback_(CFB) +[CFB128]: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_feedback_(CFB) +[OFB]: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Output_feedback_(OFB) +[GDPR]: https://en.wikipedia.org/wiki/General_Data_Protection_Regulation +[RFC5116]: https://tools.ietf.org/html/rfc5116#section-5.1 +[MySQL]: https://www.mysql.com/ +[MySQL 5.7]: https://dev.mysql.com/doc/refman/5.7/en/ +[MySQL aes_encrypt]: https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_aes-encrypt +[MySQL aes_decrypt]: https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_aes-decrypt +[AES]: https://en.wikipedia.org/wiki/Advanced_Encryption_Standard +[ClickHouse]: https://clickhouse.tech +[GitHub repository]: https://github.com/ClickHouse/ClickHouse/blob/master/tests/testflows/aes_encryption/requirements/requirements.md +[Revision history]: https://github.com/ClickHouse/ClickHouse/commits/master/tests/testflows/aes_encryption/requirements/requirements.md +[Git]: https://git-scm.com/ +[NIST test vectors]: https://csrc.nist.gov/Projects/Cryptographic-Algorithm-Validation-Program diff --git a/tests/testflows/aes_encryption/requirements/requirements.py b/tests/testflows/aes_encryption/requirements/requirements.py new file mode 100644 index 00000000000..bae8b5cc3c1 --- /dev/null +++ b/tests/testflows/aes_encryption/requirements/requirements.py @@ -0,0 +1,3663 @@ +# These requirements were auto generated +# from software requirements specification (SRS) +# document by TestFlows v1.6.200731.1222107. +# Do not edit by hand but re-generate instead +# using 'tfs requirements generate' command. +from testflows.core import Requirement + +RQ_SRS008_AES_Functions = Requirement( + name='RQ.SRS008.AES.Functions', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support [AES] encryption functions to encrypt and decrypt data.\n' + ), + link=None + ) + +RQ_SRS008_AES_Functions_Compatability_MySQL = Requirement( + name='RQ.SRS008.AES.Functions.Compatability.MySQL', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support [AES] encryption functions compatible with [MySQL 5.7].\n' + ), + link=None + ) + +RQ_SRS008_AES_Functions_Compatability_Dictionaries = Requirement( + name='RQ.SRS008.AES.Functions.Compatability.Dictionaries', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support encryption and decryption of data accessed on remote\n' + '[MySQL] servers using [MySQL Dictionary].\n' + ), + link=None + ) + +RQ_SRS008_AES_Functions_Compatability_Engine_Database_MySQL = Requirement( + name='RQ.SRS008.AES.Functions.Compatability.Engine.Database.MySQL', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support encryption and decryption of data accessed using [MySQL Database Engine],\n' + ), + link=None + ) + +RQ_SRS008_AES_Functions_Compatability_Engine_Table_MySQL = Requirement( + name='RQ.SRS008.AES.Functions.Compatability.Engine.Table.MySQL', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support encryption and decryption of data accessed using [MySQL Table Engine].\n' + ), + link=None + ) + +RQ_SRS008_AES_Functions_Compatability_TableFunction_MySQL = Requirement( + name='RQ.SRS008.AES.Functions.Compatability.TableFunction.MySQL', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support encryption and decryption of data accessed using [MySQL Table Function].\n' + ), + link=None + ) + +RQ_SRS008_AES_Functions_DifferentModes = Requirement( + name='RQ.SRS008.AES.Functions.DifferentModes', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL allow different modes to be supported in a single SQL statement\n' + 'using explicit function parameters.\n' + ), + link=None + ) + +RQ_SRS008_AES_Functions_DataFromMultipleSources = Requirement( + name='RQ.SRS008.AES.Functions.DataFromMultipleSources', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support handling encryption and decryption of data from multiple sources\n' + 'in the `SELECT` statement, including [ClickHouse] [MergeTree] table as well as [MySQL Dictionary],\n' + '[MySQL Database Engine], [MySQL Table Engine], and [MySQL Table Function]\n' + 'with possibly different encryption schemes.\n' + ), + link=None + ) + +RQ_SRS008_AES_Functions_SuppressOutputOfSensitiveValues = Requirement( + name='RQ.SRS008.AES.Functions.SuppressOutputOfSensitiveValues', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL suppress output of [AES] `string` and `key` parameters to the system log,\n' + 'error log, and `query_log` table to prevent leakage of sensitive values.\n' + ), + link=None + ) + +RQ_SRS008_AES_Functions_InvalidParameters = Requirement( + name='RQ.SRS008.AES.Functions.InvalidParameters', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when parameters are invalid.\n' + ), + link=None + ) + +RQ_SRS008_AES_Functions_Mismatched_Key = Requirement( + name='RQ.SRS008.AES.Functions.Mismatched.Key', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return garbage for mismatched keys.\n' + ), + link=None + ) + +RQ_SRS008_AES_Functions_Mismatched_IV = Requirement( + name='RQ.SRS008.AES.Functions.Mismatched.IV', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return garbage for mismatched initialization vector for the modes that use it.\n' + ), + link=None + ) + +RQ_SRS008_AES_Functions_Mismatched_AAD = Requirement( + name='RQ.SRS008.AES.Functions.Mismatched.AAD', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return garbage for mismatched additional authentication data for the modes that use it.\n' + ), + link=None + ) + +RQ_SRS008_AES_Functions_Mismatched_Mode = Requirement( + name='RQ.SRS008.AES.Functions.Mismatched.Mode', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error or garbage for mismatched mode.\n' + ), + link=None + ) + +RQ_SRS008_AES_Functions_Check_Performance = Requirement( + name='RQ.SRS008.AES.Functions.Check.Performance', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + 'Performance of [AES] encryption functions SHALL be measured.\n' + ), + link=None + ) + +RQ_SRS008_AES_Function_Check_Performance_BestCase = Requirement( + name='RQ.SRS008.AES.Function.Check.Performance.BestCase', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + 'Performance of [AES] encryption functions SHALL be checked for the best case\n' + 'scenario where there is one key, one initialization vector, and one large stream of data.\n' + ), + link=None + ) + +RQ_SRS008_AES_Function_Check_Performance_WorstCase = Requirement( + name='RQ.SRS008.AES.Function.Check.Performance.WorstCase', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + 'Performance of [AES] encryption functions SHALL be checked for the worst case\n' + 'where there are `N` keys, `N` initialization vectors and `N` very small streams of data.\n' + ), + link=None + ) + +RQ_SRS008_AES_Functions_Check_Compression = Requirement( + name='RQ.SRS008.AES.Functions.Check.Compression', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + 'Effect of [AES] encryption on column compression SHALL be measured.\n' + ), + link=None + ) + +RQ_SRS008_AES_Functions_Check_Compression_LowCardinality = Requirement( + name='RQ.SRS008.AES.Functions.Check.Compression.LowCardinality', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + 'Effect of [AES] encryption on the compression of a column with [LowCardinality] data type\n' + 'SHALL be measured.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function = Requirement( + name='RQ.SRS008.AES.Encrypt.Function', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes_encrypt` function to encrypt data using [AES].\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Syntax = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Syntax', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support the following syntax for the `aes_encrypt` function\n' + '\n' + '```sql\n' + 'aes_encrypt(plaintext, key, mode, [iv, aad])\n' + '```\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_NIST_TestVectors = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.NIST.TestVectors', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] `aes_encrypt` function output SHALL produce output that matches [NIST test vectors].\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_PlainText = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.PlainText', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `plaintext` accepting any data type as\n' + 'the first parameter to the `aes_encrypt` function that SHALL specify the data to be encrypted.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Key = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Key', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `key` with `String` or `FixedString` data types\n' + 'as the second parameter to the `aes_encrypt` function that SHALL specify the encryption key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `mode` with `String` or `FixedString` data types as the third parameter\n' + 'to the `aes_encrypt` function that SHALL specify encryption key length and block encryption mode.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_ValuesFormat = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.ValuesFormat', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support values of the form `aes-[key length]-[mode]` for the `mode` parameter\n' + 'of the `aes_encrypt` function where\n' + 'the `key_length` SHALL specifies the length of the key and SHALL accept\n' + '`128`, `192`, or `256` as the values and the `mode` SHALL specify the block encryption\n' + 'mode and SHALL accept [ECB], [CBC], [CFB1], [CFB8], [CFB128], or [OFB] as well as\n' + '[CTR] and [GCM] as the values. For example, `aes-256-ofb`.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_Invalid = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.Invalid', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the specified value for the `mode` parameter of the `aes_encrypt`\n' + 'function is not valid with the exception where such a mode is supported by the underlying\n' + '[OpenSSL] implementation.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_128_ECB = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-ECB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-ecb` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [ECB] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_192_ECB = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-ECB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-ecb` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [ECB] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_256_ECB = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-ECB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-ecb` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [ECB] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_128_CBC = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-CBC', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-cbc` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [CBC] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_192_CBC = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-CBC', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-cbc` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [CBC] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_256_CBC = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-CBC', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-cbc` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [CBC] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_128_CFB1 = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-CFB1', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-cfb1` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_192_CFB1 = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-CFB1', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-cfb1` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_256_CFB1 = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-CFB1', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-cfb1` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_128_CFB8 = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-CFB8', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-cfb8` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_192_CFB8 = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-CFB8', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-cfb8` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_256_CFB8 = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-CFB8', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-cfb8` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_128_CFB128 = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-CFB128', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-cfb128` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_192_CFB128 = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-CFB128', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-cfb128` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_256_CFB128 = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-CFB128', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-cfb128` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_128_OFB = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-OFB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-ofb` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [OFB] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_192_OFB = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-OFB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-ofb` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [OFB] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_256_OFB = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-OFB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-ofb` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [OFB] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_128_GCM = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-GCM', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-gcm` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [GCM] block mode encryption with a 128 bit key.\n' + 'An `AEAD` 16-byte tag is appended to the resulting ciphertext according to\n' + 'the [RFC5116].\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_192_GCM = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-GCM', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-gcm` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [GCM] block mode encryption with a 192 bit key.\n' + 'An `AEAD` 16-byte tag is appended to the resulting ciphertext according to\n' + 'the [RFC5116].\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_256_GCM = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-GCM', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-gcm` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [GCM] block mode encryption with a 256 bit key.\n' + 'An `AEAD` 16-byte tag is appended to the resulting ciphertext according to\n' + 'the [RFC5116].\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_128_CTR = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-128-CTR', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-ctr` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [CTR] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_192_CTR = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-192-CTR', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-ctr` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [CTR] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_AES_256_CTR = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.Mode.Value.AES-256-CTR', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-ctr` as the value for the `mode` parameter of the `aes_encrypt` function\n' + 'and [AES] algorithm SHALL use the [CTR] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_InitializationVector = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.InitializationVector', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `iv` with `String` or `FixedString` data types as the optional fourth\n' + 'parameter to the `aes_encrypt` function that SHALL specify the initialization vector for block modes that require\n' + 'it.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_AdditionalAuthenticatedData = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.AdditionalAuthenticatedData', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aad` with `String` or `FixedString` data types as the optional fifth\n' + 'parameter to the `aes_encrypt` function that SHALL specify the additional authenticated data\n' + 'for block modes that require it.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Parameters_ReturnValue = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Parameters.ReturnValue', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return the encrypted value of the data\n' + 'using `String` data type as the result of `aes_encrypt` function.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_Key_Length_InvalidLengthError = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.Key.Length.InvalidLengthError', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the `key` length is not exact for the `aes_encrypt` function for a given block mode.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_InitializationVector_Length_InvalidLengthError = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.InitializationVector.Length.InvalidLengthError', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the `iv` length is specified and not of the exact size for the `aes_encrypt` function for a given block mode.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_InitializationVector_NotValidForMode = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.InitializationVector.NotValidForMode', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the `iv` is specified for the `aes_encrypt` function for a mode that does not need it.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AdditionalAuthenticationData_NotValidForMode = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AdditionalAuthenticationData.NotValidForMode', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the `aad` is specified for the `aes_encrypt` function for a mode that does not need it.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AdditionalAuthenticationData_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AdditionalAuthenticationData.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL not limit the size of the `aad` parameter passed to the `aes_encrypt` function.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_128_ECB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-128-ECB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-128-ecb` and `key` is not 16 bytes\n' + 'or `iv` or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_192_ECB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-192-ECB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-192-ecb` and `key` is not 24 bytes\n' + 'or `iv` or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_256_ECB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-256-ECB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-256-ecb` and `key` is not 32 bytes\n' + 'or `iv` or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_128_CBC_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-128-CBC.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-128-cbc` and `key` is not 16 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_192_CBC_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-192-CBC.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-192-cbc` and `key` is not 24 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_256_CBC_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-256-CBC.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-256-cbc` and `key` is not 32 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_128_CFB1_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-128-CFB1.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-128-cfb1` and `key` is not 16 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_192_CFB1_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-192-CFB1.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-192-cfb1` and `key` is not 24 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_256_CFB1_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-256-CFB1.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-256-cfb1` and `key` is not 32 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_128_CFB8_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-128-CFB8.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-128-cfb8` and `key` is not 16 bytes\n' + 'and if specified `iv` is not 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_192_CFB8_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-192-CFB8.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-192-cfb8` and `key` is not 24 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_256_CFB8_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-256-CFB8.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-256-cfb8` and `key` is not 32 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_128_CFB128_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-128-CFB128.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-128-cfb128` and `key` is not 16 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_192_CFB128_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-192-CFB128.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-192-cfb128` and `key` is not 24 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_256_CFB128_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-256-CFB128.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-256-cfb128` and `key` is not 32 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_128_OFB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-128-OFB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-128-ofb` and `key` is not 16 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_192_OFB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-192-OFB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-192-ofb` and `key` is not 24 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_256_OFB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-256-OFB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-256-ofb` and `key` is not 32 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_128_GCM_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-128-GCM.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-128-gcm` and `key` is not 16 bytes\n' + 'or `iv` is not specified or is less than 8 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_192_GCM_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-192-GCM.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-192-gcm` and `key` is not 24 bytes\n' + 'or `iv` is not specified or is less than 8 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_256_GCM_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-256-GCM.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-256-gcm` and `key` is not 32 bytes\n' + 'or `iv` is not specified or is less than 8 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_128_CTR_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-128-CTR.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-128-ctr` and `key` is not 16 bytes\n' + 'or if specified `iv` is not 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_192_CTR_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-192-CTR.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-192-ctr` and `key` is not 24 bytes\n' + 'or if specified `iv` is not 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_Encrypt_Function_AES_256_CTR_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Encrypt.Function.AES-256-CTR.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt` function is set to `aes-256-ctr` and `key` is not 32 bytes\n' + 'or if specified `iv` is not 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function = Requirement( + name='RQ.SRS008.AES.Decrypt.Function', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes_decrypt` function to decrypt data using [AES].\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Syntax = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Syntax', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support the following syntax for the `aes_decrypt` function\n' + '\n' + '```sql\n' + 'aes_decrypt(ciphertext, key, mode, [iv, aad])\n' + '```\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_CipherText = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.CipherText', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `ciphertext` accepting `FixedString` or `String` data types as\n' + 'the first parameter to the `aes_decrypt` function that SHALL specify the data to be decrypted.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Key = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Key', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `key` with `String` or `FixedString` data types\n' + 'as the second parameter to the `aes_decrypt` function that SHALL specify the encryption key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `mode` with `String` or `FixedString` data types as the third parameter\n' + 'to the `aes_decrypt` function that SHALL specify encryption key length and block encryption mode.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_ValuesFormat = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.ValuesFormat', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support values of the form `aes-[key length]-[mode]` for the `mode` parameter\n' + 'of the `aes_decrypt` function where\n' + 'the `key_length` SHALL specifies the length of the key and SHALL accept\n' + '`128`, `192`, or `256` as the values and the `mode` SHALL specify the block encryption\n' + 'mode and SHALL accept [ECB], [CBC], [CFB1], [CFB8], [CFB128], or [OFB] as well as\n' + '[CTR] and [GCM] as the values. For example, `aes-256-ofb`.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_Invalid = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.Invalid', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the specified value for the `mode` parameter of the `aes_decrypt`\n' + 'function is not valid with the exception where such a mode is supported by the underlying\n' + '[OpenSSL] implementation.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_128_ECB = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-ECB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-ecb` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [ECB] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_192_ECB = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-ECB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-ecb` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [ECB] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_256_ECB = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-ECB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-ecb` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [ECB] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_128_CBC = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-CBC', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-cbc` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [CBC] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_192_CBC = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-CBC', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-cbc` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [CBC] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_256_CBC = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-CBC', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-cbc` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [CBC] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_128_CFB1 = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-CFB1', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-cfb1` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_192_CFB1 = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-CFB1', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-cfb1` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_256_CFB1 = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-CFB1', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-cfb1` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_128_CFB8 = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-CFB8', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-cfb8` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_192_CFB8 = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-CFB8', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-cfb8` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_256_CFB8 = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-CFB8', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-cfb8` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_128_CFB128 = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-CFB128', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-cfb128` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_192_CFB128 = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-CFB128', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-cfb128` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_256_CFB128 = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-CFB128', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-cfb128` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_128_OFB = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-OFB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-ofb` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [OFB] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_192_OFB = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-OFB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-ofb` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [OFB] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_256_OFB = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-OFB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-ofb` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [OFB] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_128_GCM = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-GCM', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-gcm` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [GCM] block mode encryption with a 128 bit key.\n' + 'An [AEAD] 16-byte tag is expected present at the end of the ciphertext according to\n' + 'the [RFC5116].\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_192_GCM = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-GCM', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-gcm` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [GCM] block mode encryption with a 192 bit key.\n' + 'An [AEAD] 16-byte tag is expected present at the end of the ciphertext according to\n' + 'the [RFC5116].\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_256_GCM = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-GCM', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-gcm` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [GCM] block mode encryption with a 256 bit key.\n' + 'An [AEAD] 16-byte tag is expected present at the end of the ciphertext according to\n' + 'the [RFC5116].\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_128_CTR = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-128-CTR', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-ctr` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [CTR] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_192_CTR = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-192-CTR', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-ctr` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [CTR] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_AES_256_CTR = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.Mode.Value.AES-256-CTR', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-ctr` as the value for the `mode` parameter of the `aes_decrypt` function\n' + 'and [AES] algorithm SHALL use the [CTR] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_InitializationVector = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.InitializationVector', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `iv` with `String` or `FixedString` data types as the optional fourth\n' + 'parameter to the `aes_decrypt` function that SHALL specify the initialization vector for block modes that require\n' + 'it.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_AdditionalAuthenticatedData = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.AdditionalAuthenticatedData', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aad` with `String` or `FixedString` data types as the optional fifth\n' + 'parameter to the `aes_decrypt` function that SHALL specify the additional authenticated data\n' + 'for block modes that require it.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Parameters_ReturnValue = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Parameters.ReturnValue', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return the decrypted value of the data\n' + 'using `String` data type as the result of `aes_decrypt` function.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_Key_Length_InvalidLengthError = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.Key.Length.InvalidLengthError', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the `key` length is not exact for the `aes_decrypt` function for a given block mode.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_InitializationVector_Length_InvalidLengthError = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.InitializationVector.Length.InvalidLengthError', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the `iv` is speficified and the length is not exact for the `aes_decrypt` function for a given block mode.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_InitializationVector_NotValidForMode = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.InitializationVector.NotValidForMode', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the `iv` is specified for the `aes_decrypt` function\n' + 'for a mode that does not need it.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AdditionalAuthenticationData_NotValidForMode = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AdditionalAuthenticationData.NotValidForMode', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the `aad` is specified for the `aes_decrypt` function\n' + 'for a mode that does not need it.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AdditionalAuthenticationData_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AdditionalAuthenticationData.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL not limit the size of the `aad` parameter passed to the `aes_decrypt` function.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_128_ECB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-128-ECB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-128-ecb` and `key` is not 16 bytes\n' + 'or `iv` or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_192_ECB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-192-ECB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-192-ecb` and `key` is not 24 bytes\n' + 'or `iv` or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_256_ECB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-256-ECB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-256-ecb` and `key` is not 32 bytes\n' + 'or `iv` or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_128_CBC_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-128-CBC.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-128-cbc` and `key` is not 16 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_192_CBC_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-192-CBC.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-192-cbc` and `key` is not 24 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_256_CBC_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-256-CBC.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-256-cbc` and `key` is not 32 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_128_CFB1_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-128-CFB1.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-128-cfb1` and `key` is not 16 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_192_CFB1_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-192-CFB1.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-192-cfb1` and `key` is not 24 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_256_CFB1_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-256-CFB1.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-256-cfb1` and `key` is not 32 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_128_CFB8_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-128-CFB8.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-128-cfb8` and `key` is not 16 bytes\n' + 'and if specified `iv` is not 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_192_CFB8_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-192-CFB8.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-192-cfb8` and `key` is not 24 bytes\n' + 'or `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_256_CFB8_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-256-CFB8.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-256-cfb8` and `key` is not 32 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_128_CFB128_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-128-CFB128.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-128-cfb128` and `key` is not 16 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_192_CFB128_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-192-CFB128.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-192-cfb128` and `key` is not 24 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_256_CFB128_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-256-CFB128.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-256-cfb128` and `key` is not 32 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_128_OFB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-128-OFB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-128-ofb` and `key` is not 16 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_192_OFB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-192-OFB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-192-ofb` and `key` is not 24 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_256_OFB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-256-OFB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-256-ofb` and `key` is not 32 bytes\n' + 'or if specified `iv` is not 16 bytes or `aad` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_128_GCM_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-128-GCM.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-128-gcm` and `key` is not 16 bytes\n' + 'or `iv` is not specified or is less than 8 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_192_GCM_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-192-GCM.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-192-gcm` and `key` is not 24 bytes\n' + 'or `iv` is not specified or is less than 8 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_256_GCM_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-256-GCM.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-256-gcm` and `key` is not 32 bytes\n' + 'or `iv` is not specified or is less than 8 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_128_CTR_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-128-CTR.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-128-ctr` and `key` is not 16 bytes\n' + 'or if specified `iv` is not 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_192_CTR_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-192-CTR.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-192-ctr` and `key` is not 24 bytes\n' + 'or if specified `iv` is not 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_Decrypt_Function_AES_256_CTR_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.Decrypt.Function.AES-256-CTR.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt` function is set to `aes-256-ctr` and `key` is not 32 bytes\n' + 'or if specified `iv` is not 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes_encrypt_mysql` function to encrypt data using [AES].\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Syntax = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Syntax', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support the following syntax for the `aes_encrypt_mysql` function\n' + '\n' + '```sql\n' + 'aes_encrypt_mysql(plaintext, key, mode, [iv])\n' + '```\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_PlainText = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.PlainText', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `plaintext` accepting any data type as\n' + 'the first parameter to the `aes_encrypt_mysql` function that SHALL specify the data to be encrypted.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Key = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Key', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `key` with `String` or `FixedString` data types\n' + 'as the second parameter to the `aes_encrypt_mysql` function that SHALL specify the encryption key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `mode` with `String` or `FixedString` data types as the third parameter\n' + 'to the `aes_encrypt_mysql` function that SHALL specify encryption key length and block encryption mode.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_ValuesFormat = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.ValuesFormat', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support values of the form `aes-[key length]-[mode]` for the `mode` parameter\n' + 'of the `aes_encrypt_mysql` function where\n' + 'the `key_length` SHALL specifies the length of the key and SHALL accept\n' + '`128`, `192`, or `256` as the values and the `mode` SHALL specify the block encryption\n' + 'mode and SHALL accept [ECB], [CBC], [CFB1], [CFB8], [CFB128], or [OFB]. For example, `aes-256-ofb`.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_Invalid = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.Invalid', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the specified value for the `mode` parameter of the `aes_encrypt_mysql`\n' + 'function is not valid with the exception where such a mode is supported by the underlying\n' + '[OpenSSL] implementation.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_128_ECB = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-ECB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-ecb` as the value for the `mode` parameter of the `aes_encrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [ECB] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_192_ECB = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-ECB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-ecb` as the value for the `mode` parameter of the `aes_encrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [ECB] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_256_ECB = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-ECB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-ecb` as the value for the `mode` parameter of the `aes_encrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [ECB] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_128_CBC = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-CBC', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-cbc` as the value for the `mode` parameter of the `aes_encrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CBC] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_192_CBC = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-CBC', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-cbc` as the value for the `mode` parameter of the `aes_encrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CBC] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_256_CBC = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-CBC', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-cbc` as the value for the `mode` parameter of the `aes_encrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CBC] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_128_CFB1 = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-CFB1', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-cfb1` as the value for the `mode` parameter of the `aes_encrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_192_CFB1 = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-CFB1', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-cfb1` as the value for the `mode` parameter of the `aes_encrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_256_CFB1 = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-CFB1', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-cfb1` as the value for the `mode` parameter of the `aes_encrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_128_CFB8 = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-CFB8', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-cfb8` as the value for the `mode` parameter of the `aes_encrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_192_CFB8 = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-CFB8', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-cfb8` as the value for the `mode` parameter of the `aes_encrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_256_CFB8 = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-CFB8', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-cfb8` as the value for the `mode` parameter of the `aes_encrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_128_CFB128 = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-CFB128', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-cfb128` as the value for the `mode` parameter of the `aes_encrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_192_CFB128 = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-CFB128', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-cfb128` as the value for the `mode` parameter of the `aes_encrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_256_CFB128 = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-CFB128', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-cfb128` as the value for the `mode` parameter of the `aes_encrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_128_OFB = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-OFB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-ofb` as the value for the `mode` parameter of the `aes_encrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [OFB] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_192_OFB = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-OFB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-ofb` as the value for the `mode` parameter of the `aes_encrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [OFB] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_256_OFB = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-OFB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-ofb` as the value for the `mode` parameter of the `aes_encrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [OFB] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_128_GCM_Error = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-GCM.Error', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if `aes-128-gcm` is specified as the value for the `mode` parameter of the\n' + '`aes_encrypt_mysql` function.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_192_GCM_Error = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-GCM.Error', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if `aes-192-gcm` is specified as the value for the `mode` parameter of the\n' + '`aes_encrypt_mysql` function.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_256_GCM_Error = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-GCM.Error', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if `aes-256-gcm` is specified as the value for the `mode` parameter of the\n' + '`aes_encrypt_mysql` function.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_128_CTR_Error = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-128-CTR.Error', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if `aes-128-ctr` is specified as the value for the `mode` parameter of the\n' + '`aes_encrypt_mysql` function.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_192_CTR_Error = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-192-CTR.Error', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if `aes-192-ctr` is specified as the value for the `mode` parameter of the\n' + '`aes_encrypt_mysql` function.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_256_CTR_Error = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.Mode.Value.AES-256-CTR.Error', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if `aes-256-ctr` is specified as the value for the `mode` parameter of the\n' + '`aes_encrypt_mysql` function.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_InitializationVector = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.InitializationVector', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `iv` with `String` or `FixedString` data types as the optional fourth\n' + 'parameter to the `aes_encrypt_mysql` function that SHALL specify the initialization vector for block modes that require\n' + 'it.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_ReturnValue = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Parameters.ReturnValue', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return the encrypted value of the data\n' + 'using `String` data type as the result of `aes_encrypt_mysql` function.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Key_Length_TooShortError = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Key.Length.TooShortError', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the `key` length is less than the minimum for the `aes_encrypt_mysql`\n' + 'function for a given block mode.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_Key_Length_TooLong = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.Key.Length.TooLong', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL use folding algorithm specified below if the `key` length is longer than required\n' + 'for the `aes_encrypt_mysql` function for a given block mode.\n' + '\n' + '```python\n' + 'def fold_key(key, cipher_key_size):\n' + ' key = list(key) if not isinstance(key, (list, tuple)) else key\n' + '\t folded_key = key[:cipher_key_size]\n' + '\t for i in range(cipher_key_size, len(key)):\n' + '\t\t print(i % cipher_key_size, i)\n' + '\t\t folded_key[i % cipher_key_size] ^= key[i]\n' + '\t return folded_key\n' + '```\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_InitializationVector_Length_TooShortError = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.InitializationVector.Length.TooShortError', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the `iv` length is specified and is less than the minimum\n' + 'that is required for the `aes_encrypt_mysql` function for a given block mode.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_InitializationVector_Length_TooLong = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.InitializationVector.Length.TooLong', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL use the first `N` bytes that are required if the `iv` is specified and\n' + 'its length is longer than required for the `aes_encrypt_mysql` function for a given block mode.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_InitializationVector_NotValidForMode = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.InitializationVector.NotValidForMode', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the `iv` is specified for the `aes_encrypt_mysql`\n' + 'function for a mode that does not need it.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_AES_128_ECB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.AES-128-ECB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-128-ecb` and `key` is less than 16 bytes\n' + 'or `iv` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_AES_192_ECB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.AES-192-ECB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-192-ecb` and `key` is less than 24 bytes\n' + 'or `iv` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_AES_256_ECB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.AES-256-ECB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-256-ecb` and `key` is less than 32 bytes\n' + 'or `iv` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_AES_128_CBC_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.AES-128-CBC.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-128-cbc` and `key` is less than 16 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_AES_192_CBC_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.AES-192-CBC.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-192-cbc` and `key` is less than 24 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_AES_256_CBC_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.AES-256-CBC.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-256-cbc` and `key` is less than 32 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_AES_128_CFB1_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.AES-128-CFB1.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-128-cfb1` and `key` is less than 16 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_AES_192_CFB1_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.AES-192-CFB1.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-192-cfb1` and `key` is less than 24 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_AES_256_CFB1_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.AES-256-CFB1.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-256-cfb1` and `key` is less than 32 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_AES_128_CFB8_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.AES-128-CFB8.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-128-cfb8` and `key` is less than 16 bytes\n' + 'and if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_AES_192_CFB8_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.AES-192-CFB8.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-192-cfb8` and `key` is less than 24 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_AES_256_CFB8_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.AES-256-CFB8.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-256-cfb8` and `key` is less than 32 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_AES_128_CFB128_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.AES-128-CFB128.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-128-cfb128` and `key` is less than 16 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_AES_192_CFB128_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.AES-192-CFB128.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-192-cfb128` and `key` is less than 24 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_AES_256_CFB128_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.AES-256-CFB128.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-256-cfb128` and `key` is less than 32 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_AES_128_OFB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.AES-128-OFB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-128-ofb` and `key` is less than 16 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_AES_192_OFB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.AES-192-OFB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-192-ofb` and `key` is less than 24 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Encrypt_Function_AES_256_OFB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Encrypt.Function.AES-256-OFB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_encrypt_mysql` function is set to `aes-256-ofb` and `key` is less than 32 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes_decrypt_mysql` function to decrypt data using [AES].\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Syntax = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Syntax', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support the following syntax for the `aes_decrypt_mysql` function\n' + '\n' + '```sql\n' + 'aes_decrypt_mysql(ciphertext, key, mode, [iv])\n' + '```\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_CipherText = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.CipherText', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `ciphertext` accepting any data type as\n' + 'the first parameter to the `aes_decrypt_mysql` function that SHALL specify the data to be decrypted.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Key = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Key', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `key` with `String` or `FixedString` data types\n' + 'as the second parameter to the `aes_decrypt_mysql` function that SHALL specify the encryption key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `mode` with `String` or `FixedString` data types as the third parameter\n' + 'to the `aes_decrypt_mysql` function that SHALL specify encryption key length and block encryption mode.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_ValuesFormat = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.ValuesFormat', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support values of the form `aes-[key length]-[mode]` for the `mode` parameter\n' + 'of the `aes_decrypt_mysql` function where\n' + 'the `key_length` SHALL specifies the length of the key and SHALL accept\n' + '`128`, `192`, or `256` as the values and the `mode` SHALL specify the block encryption\n' + 'mode and SHALL accept [ECB], [CBC], [CFB1], [CFB8], [CFB128], or [OFB]. For example, `aes-256-ofb`.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_Invalid = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.Invalid', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the specified value for the `mode` parameter of the `aes_decrypt_mysql`\n' + 'function is not valid with the exception where such a mode is supported by the underlying\n' + '[OpenSSL] implementation.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_128_ECB = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-ECB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-ecb` as the value for the `mode` parameter of the `aes_decrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [ECB] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_192_ECB = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-ECB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-ecb` as the value for the `mode` parameter of the `aes_decrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [ECB] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_256_ECB = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-ECB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-ecb` as the value for the `mode` parameter of the `aes_decrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [ECB] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_128_CBC = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-CBC', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-cbc` as the value for the `mode` parameter of the `aes_decrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CBC] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_192_CBC = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-CBC', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-cbc` as the value for the `mode` parameter of the `aes_decrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CBC] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_256_CBC = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-CBC', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-cbc` as the value for the `mode` parameter of the `aes_decrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CBC] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_128_CFB1 = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-CFB1', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-cfb1` as the value for the `mode` parameter of the `aes_decrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_192_CFB1 = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-CFB1', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-cfb1` as the value for the `mode` parameter of the `aes_decrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_256_CFB1 = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-CFB1', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-cfb1` as the value for the `mode` parameter of the `aes_decrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CFB1] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_128_CFB8 = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-CFB8', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-cfb8` as the value for the `mode` parameter of the `aes_decrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_192_CFB8 = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-CFB8', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-cfb8` as the value for the `mode` parameter of the `aes_decrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_256_CFB8 = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-CFB8', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-cfb8` as the value for the `mode` parameter of the `aes_decrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CFB8] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_128_CFB128 = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-CFB128', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-cfb128` as the value for the `mode` parameter of the `aes_decrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_192_CFB128 = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-CFB128', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-cfb128` as the value for the `mode` parameter of the `aes_decrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_256_CFB128 = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-CFB128', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-cfb128` as the value for the `mode` parameter of the `aes_decrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [CFB128] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_128_OFB = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-OFB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-128-ofb` as the value for the `mode` parameter of the `aes_decrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [OFB] block mode encryption with a 128 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_192_OFB = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-OFB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-192-ofb` as the value for the `mode` parameter of the `aes_decrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [OFB] block mode encryption with a 192 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_256_OFB = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-OFB', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `aes-256-ofb` as the value for the `mode` parameter of the `aes_decrypt_mysql` function\n' + 'and [AES] algorithm SHALL use the [OFB] block mode encryption with a 256 bit key.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_128_GCM_Error = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-GCM.Error', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if `aes-128-gcm` is specified as the value for the `mode` parameter of the\n' + '`aes_decrypt_mysql` function.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_192_GCM_Error = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-GCM.Error', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if `aes-192-gcm` is specified as the value for the `mode` parameter of the\n' + '`aes_decrypt_mysql` function.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_256_GCM_Error = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-GCM.Error', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if `aes-256-gcm` is specified as the value for the `mode` parameter of the\n' + '`aes_decrypt_mysql` function.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_128_CTR_Error = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-128-CTR.Error', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if `aes-128-ctr` is specified as the value for the `mode` parameter of the\n' + '`aes_decrypt_mysql` function.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_192_CTR_Error = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-192-CTR.Error', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if `aes-192-ctr` is specified as the value for the `mode` parameter of the\n' + '`aes_decrypt_mysql` function.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_256_CTR_Error = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.Mode.Value.AES-256-CTR.Error', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if `aes-256-ctr` is specified as the value for the `mode` parameter of the\n' + '`aes_decrypt_mysql` function.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_InitializationVector = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.InitializationVector', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `iv` with `String` or `FixedString` data types as the optional fourth\n' + 'parameter to the `aes_decrypt_mysql` function that SHALL specify the initialization vector for block modes that require\n' + 'it.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_ReturnValue = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Parameters.ReturnValue', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return the decrypted value of the data\n' + 'using `String` data type as the result of `aes_decrypt_mysql` function.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Key_Length_TooShortError = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Key.Length.TooShortError', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the `key` length is less than the minimum for the `aes_decrypt_mysql`\n' + 'function for a given block mode.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_Key_Length_TooLong = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.Key.Length.TooLong', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL use folding algorithm specified below if the `key` length is longer than required\n' + 'for the `aes_decrypt_mysql` function for a given block mode.\n' + '\n' + '```python\n' + 'def fold_key(key, cipher_key_size):\n' + ' key = list(key) if not isinstance(key, (list, tuple)) else key\n' + '\t folded_key = key[:cipher_key_size]\n' + '\t for i in range(cipher_key_size, len(key)):\n' + '\t\t print(i % cipher_key_size, i)\n' + '\t\t folded_key[i % cipher_key_size] ^= key[i]\n' + '\t return folded_key\n' + '```\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_InitializationVector_Length_TooShortError = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.InitializationVector.Length.TooShortError', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the `iv` length is specified and is less than the minimum\n' + 'that is required for the `aes_decrypt_mysql` function for a given block mode.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_InitializationVector_Length_TooLong = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.InitializationVector.Length.TooLong', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL use the first `N` bytes that are required if the `iv` is specified and\n' + 'its length is longer than required for the `aes_decrypt_mysql` function for a given block mode.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_InitializationVector_NotValidForMode = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.InitializationVector.NotValidForMode', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the `iv` is specified for the `aes_decrypt_mysql`\n' + 'function for a mode that does not need it.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_AES_128_ECB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.AES-128-ECB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-128-ecb` and `key` is less than 16 bytes\n' + 'or `iv` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_AES_192_ECB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.AES-192-ECB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-192-ecb` and `key` is less than 24 bytes\n' + 'or `iv` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_AES_256_ECB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.AES-256-ECB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-256-ecb` and `key` is less than 32 bytes\n' + 'or `iv` is specified.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_AES_128_CBC_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.AES-128-CBC.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-128-cbc` and `key` is less than 16 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_AES_192_CBC_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.AES-192-CBC.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-192-cbc` and `key` is less than 24 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_AES_256_CBC_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.AES-256-CBC.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-256-cbc` and `key` is less than 32 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_AES_128_CFB1_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.AES-128-CFB1.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-128-cfb1` and `key` is less than 16 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_AES_192_CFB1_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.AES-192-CFB1.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-192-cfb1` and `key` is less than 24 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_AES_256_CFB1_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.AES-256-CFB1.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-256-cfb1` and `key` is less than 32 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_AES_128_CFB8_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.AES-128-CFB8.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-128-cfb8` and `key` is less than 16 bytes\n' + 'and if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_AES_192_CFB8_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.AES-192-CFB8.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-192-cfb8` and `key` is less than 24 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_AES_256_CFB8_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.AES-256-CFB8.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-256-cfb8` and `key` is less than 32 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_AES_128_CFB128_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.AES-128-CFB128.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-128-cfb128` and `key` is less than 16 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_AES_192_CFB128_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.AES-192-CFB128.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-192-cfb128` and `key` is less than 24 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_AES_256_CFB128_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.AES-256-CFB128.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-256-cfb128` and `key` is less than 32 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_AES_128_OFB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.AES-128-OFB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-128-ofb` and `key` is less than 16 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_AES_192_OFB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.AES-192-OFB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-192-ofb` and `key` is less than 24 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) + +RQ_SRS008_AES_MySQL_Decrypt_Function_AES_256_OFB_KeyAndInitializationVector_Length = Requirement( + name='RQ.SRS008.AES.MySQL.Decrypt.Function.AES-256-OFB.KeyAndInitializationVector.Length', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error when `mode` for the `aes_decrypt_mysql` function is set to `aes-256-ofb` and `key` is less than 32 bytes\n' + 'or if specified `iv` is less than 16 bytes.\n' + ), + link=None + ) diff --git a/tests/testflows/aes_encryption/tests/common.py b/tests/testflows/aes_encryption/tests/common.py new file mode 100644 index 00000000000..5ed582563fb --- /dev/null +++ b/tests/testflows/aes_encryption/tests/common.py @@ -0,0 +1,162 @@ +# -*- coding: utf-8 -*- +modes = [ + # mode, key_len, iv_len, aad + ("'aes-128-ecb'", 16, None, None), + ("'aes-192-ecb'", 24, None, None), + ("'aes-256-ecb'", 32, None, None), + # cbc + ("'aes-128-cbc'", 16, None, None), + ("'aes-192-cbc'", 24, None, None), + ("'aes-256-cbc'", 32, None, None), + ("'aes-128-cbc'", 16, 16, None), + ("'aes-192-cbc'", 24, 16, None), + ("'aes-256-cbc'", 32, 16, None), + # cfb1 + ("'aes-128-cfb1'", 16, None, None), + ("'aes-192-cfb1'", 24, None, None), + ("'aes-256-cfb1'", 32, None, None), + ("'aes-128-cfb1'", 16, 16, None), + ("'aes-192-cfb1'", 24, 16, None), + ("'aes-256-cfb1'", 32, 16, None), + # cfb8 + ("'aes-128-cfb8'", 16, None, None), + ("'aes-192-cfb8'", 24, None, None), + ("'aes-256-cfb8'", 32, None, None), + ("'aes-128-cfb8'", 16, 16, None), + ("'aes-192-cfb8'", 24, 16, None), + ("'aes-256-cfb8'", 32, 16, None), + # cfb128 + ("'aes-128-cfb128'", 16, None, None), + ("'aes-192-cfb128'", 24, None, None), + ("'aes-256-cfb128'", 32, None, None), + ("'aes-128-cfb128'", 16, 16, None), + ("'aes-192-cfb128'", 24, 16, None), + ("'aes-256-cfb128'", 32, 16, None), + # ofb + ("'aes-128-ofb'", 16, None, None), + ("'aes-192-ofb'", 24, None, None), + ("'aes-256-ofb'", 32, None, None), + ("'aes-128-ofb'", 16, 16, None), + ("'aes-192-ofb'", 24, 16, None), + ("'aes-256-ofb'", 32, 16, None), + # gcm + ("'aes-128-gcm'", 16, 12, None), + ("'aes-192-gcm'", 24, 12, None), + ("'aes-256-gcm'", 32, 12, None), + ("'aes-128-gcm'", 16, 12, True), + ("'aes-192-gcm'", 24, 12, True), + ("'aes-256-gcm'", 32, 12, True), + # ctr + ("'aes-128-ctr'", 16, None, None), + ("'aes-192-ctr'", 24, None, None), + ("'aes-256-ctr'", 32, None, None), + ("'aes-128-ctr'", 16, 16, None), + ("'aes-192-ctr'", 24, 16, None), + ("'aes-256-ctr'", 32, 16, None), +] + +mysql_modes = [ + # mode, key_len, iv_len + ("'aes-128-ecb'", 16, None), + ("'aes-128-ecb'", 24, None), + ("'aes-192-ecb'", 24, None), + ("'aes-192-ecb'", 32, None), + ("'aes-256-ecb'", 32, None), + ("'aes-256-ecb'", 64, None), + # cbc + ("'aes-128-cbc'", 16, None), + ("'aes-192-cbc'", 24, None), + ("'aes-256-cbc'", 32, None), + ("'aes-128-cbc'", 16, 16), + ("'aes-128-cbc'", 24, 24), + ("'aes-192-cbc'", 24, 16), + ("'aes-192-cbc'", 32, 32), + ("'aes-256-cbc'", 32, 16), + ("'aes-256-cbc'", 64, 64), + # cfb1 + ("'aes-128-cfb1'", 16, None), + ("'aes-192-cfb1'", 24, None), + ("'aes-256-cfb1'", 32, None), + ("'aes-128-cfb1'", 16, 16), + ("'aes-128-cfb1'", 24, 24), + ("'aes-192-cfb1'", 24, 16), + ("'aes-192-cfb1'", 32, 32), + ("'aes-256-cfb1'", 32, 16), + ("'aes-256-cfb1'", 64, 64), + # cfb8 + ("'aes-128-cfb8'", 16, None), + ("'aes-192-cfb8'", 24, None), + ("'aes-256-cfb8'", 32, None), + ("'aes-128-cfb8'", 16, 16), + ("'aes-128-cfb8'", 24, 24), + ("'aes-192-cfb8'", 24, 16), + ("'aes-192-cfb8'", 32, 32), + ("'aes-256-cfb8'", 32, 16), + ("'aes-256-cfb8'", 64, 64), + # cfb128 + ("'aes-128-cfb128'", 16, None), + ("'aes-192-cfb128'", 24, None), + ("'aes-256-cfb128'", 32, None), + ("'aes-128-cfb128'", 16, 16), + ("'aes-128-cfb128'", 24, 24), + ("'aes-192-cfb128'", 24, 16), + ("'aes-192-cfb128'", 32, 32), + ("'aes-256-cfb128'", 32, 16), + ("'aes-256-cfb128'", 64, 64), + # ofb + ("'aes-128-ofb'", 16, None), + ("'aes-192-ofb'", 24, None), + ("'aes-256-ofb'", 32, None), + ("'aes-128-ofb'", 16, 16), + ("'aes-128-ofb'", 24, 24), + ("'aes-192-ofb'", 24, 16), + ("'aes-192-ofb'", 32, 32), + ("'aes-256-ofb'", 32, 16), + ("'aes-256-ofb'", 64, 64), +] + +plaintexts = [ + ("bytes", "unhex('0')"), + ("emptystring", "''"), + ("utf8string", "'Gãńdåłf_Thê_Gręât'"), + ("utf8fixedstring", "toFixedString('Gãńdåłf_Thê_Gręât', 24)"), + ("String", "'1'"), + ("FixedString", "toFixedString('1', 1)"), + ("UInt8", "toUInt8('1')"), + ("UInt16", "toUInt16('1')"), + ("UInt32", "toUInt32('1')"), + ("UInt64", "toUInt64('1')"), + ("Int8", "toInt8('1')"), + ("Int16", "toInt16('1')"), + ("Int32", "toInt32('1')"), + ("Int64", "toInt64('1')"), + ("Float32", "toFloat32('1')"), + ("Float64", "toFloat64('1')"), + ("Decimal32", "toDecimal32(2, 4)"), + ("Decimal64", "toDecimal64(2, 4)"), + ("Decimal128", "toDecimal128(2, 4)"), + ("UUID", "toUUID('61f0c404-5cb3-11e7-907b-a6006ad3dba0')"), + ("Date", "toDate('2020-01-01')"), + ("DateTime", "toDateTime('2020-01-01 20:01:02')"), + ("DateTime64", "toDateTime64('2020-01-01 20:01:02.123', 3)"), + ("LowCardinality", "toLowCardinality('1')"), + ("Array", "[1,2]"), + #("Tuple", "(1,'a')") - not supported + #("Nullable, "Nullable(X)") - not supported + ("NULL", "toDateOrNull('foo')"), + ("IPv4", "toIPv4('171.225.130.45')"), + ("IPv6", "toIPv6('2001:0db8:0000:85a3:0000:0000:ac1f:8001')"), + ("Enum8", r"CAST('a', 'Enum8(\'a\' = 1, \'b\' = 2)')"), + ("Enum16", r"CAST('a', 'Enum16(\'a\' = 1, \'b\' = 2)')"), +] + +_hex = hex + +def hex(s): + """Convert string to hex. + """ + if isinstance(s, str): + return "".join(['%X' % ord(c) for c in s]) + if isinstance(s, bytes): + return "".join(['%X' % c for c in s]) + return _hex(s) diff --git a/tests/testflows/aes_encryption/tests/compatibility/__init__.py b/tests/testflows/aes_encryption/tests/compatibility/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/testflows/aes_encryption/tests/compatibility/feature.py b/tests/testflows/aes_encryption/tests/compatibility/feature.py new file mode 100644 index 00000000000..5ef547e43f4 --- /dev/null +++ b/tests/testflows/aes_encryption/tests/compatibility/feature.py @@ -0,0 +1,17 @@ +from testflows.core import * + +from aes_encryption.requirements import * + +@TestFeature +@Name("compatibility") +@Requirements( + RQ_SRS008_AES_Functions_DataFromMultipleSources("1.0") +) +def feature(self, node="clickhouse1"): + """Check encryption functions usage compatibility. + """ + self.context.node = self.context.cluster.node(node) + + Feature(run=load("aes_encryption.tests.compatibility.insert", "feature"), flags=TE) + Feature(run=load("aes_encryption.tests.compatibility.select", "feature"), flags=TE) + Feature(run=load("aes_encryption.tests.compatibility.mysql.feature", "feature"), flags=TE) \ No newline at end of file diff --git a/tests/testflows/aes_encryption/tests/compatibility/insert.py b/tests/testflows/aes_encryption/tests/compatibility/insert.py new file mode 100644 index 00000000000..6ddcc11b584 --- /dev/null +++ b/tests/testflows/aes_encryption/tests/compatibility/insert.py @@ -0,0 +1,414 @@ +import os +import textwrap +from contextlib import contextmanager +from importlib.machinery import SourceFileLoader + +from testflows.core import * +from testflows.core.name import basename +from testflows.asserts.helpers import varname +from testflows.asserts import values, error, snapshot + +from aes_encryption.tests.common import modes, mysql_modes + +@contextmanager +def table(name): + node = current().context.node + try: + with Given("table"): + sql = f""" + CREATE TABLE {name} + ( + date Nullable(Date), + name Nullable(String), + secret Nullable(String) + ) + ENGINE = Memory() + """ + with By("dropping table if exists"): + node.query(f"DROP TABLE IF EXISTS {name}") + with And("creating a table"): + node.query(textwrap.dedent(sql)) + yield + finally: + with Finally("I drop the table", flags=TE): + node.query(f"DROP TABLE IF EXISTS {name}") + +@contextmanager +def mv_transform(table, transform): + node = current().context.node + try: + with Given("tables for input transformation"): + with By("creating Null input table"): + sql = f""" + CREATE TABLE {table}_input + ( + date Nullable(Date), + name Nullable(String), + secret Nullable(String), + mode String, + key String, + iv String, + aad String + ) + ENGINE=Null() + """ + node.query(textwrap.dedent(sql)) + + with And("creating materialized view table"): + sql = f""" + CREATE MATERIALIZED VIEW {table}_input_mv TO {table} AS + SELECT date, name, {transform} + FROM {table}_input + """ + node.query(textwrap.dedent(sql)) + yield + finally: + with Finally("I drop tables for input transformation", flags=TE): + with By("dropping materialized view table", flags=TE): + node.query(f"DROP TABLE IF EXISTS {table}_input_mv") + + with And("dropping Null input table", flags=TE): + node.query(f"DROP TABLE IF EXISTS {table}_input") + +@TestScenario +def encrypt_using_materialized_view(self): + """Check that we can use `encrypt` function when inserting + data into a table using a materialized view for input + data transformation. + """ + node = self.context.node + key = f"{'1' * 36}" + iv = f"{'2' * 16}" + aad = "some random aad" + + for mode, key_len, iv_len, aad_len in modes: + with Example(f"""mode={mode.strip("'")} iv={iv_len} aad={aad_len}""") as example: + example_key = f"'{key[:key_len]}'" + example_mode = mode + example_iv = None if not iv_len else f"'{iv[:iv_len]}'" + example_aad = None if not aad_len else f"'{aad}'" + example_transform = f"encrypt(mode, secret, key{', iv' if example_iv else ''}{', aad' if example_aad else ''})" + + with table("user_data"): + with mv_transform("user_data", example_transform): + with When("I insert encrypted data"): + node.query(f""" + INSERT INTO user_data_input + (date, name, secret, mode, key) + VALUES + ('2020-01-01', 'user0', 'user0_secret', {example_mode}, {example_key}{(", " + example_iv) if example_iv else ""}{(", " + example_aad) if example_aad else ""}), + ('2020-01-02', 'user1', 'user1_secret', {example_mode}, {example_key}{(", " + example_iv) if example_iv else ""}{(", " + example_aad) if example_aad else ""}), + ('2020-01-03', 'user2', 'user2_secret', {example_mode}, {example_key}{(", " + example_iv) if example_iv else ""}{(", " + example_aad) if example_aad else ""}) + """) + + with And("I read inserted data back"): + node.query("SELECT date, name, hex(secret) FROM user_data ORDER BY date") + + with Then("output must match the snapshot"): + with values() as that: + assert that(snapshot(r.output.strip(), "insert", name=f"encrypt_mv_example_{varname(basename(self.name))}")), error() + +@TestScenario +def aes_encrypt_mysql_using_materialized_view(self): + """Check that we can use `aes_encrypt_mysql` function when inserting + data into a table using a materialized view for input + data transformation. + """ + node = self.context.node + key = f"{'1' * 64}" + iv = f"{'2' * 64}" + aad = "some random aad" + + for mode, key_len, iv_len in mysql_modes: + with Example(f"""mode={mode.strip("'")} key={key_len} iv={iv_len}""") as example: + example_key = f"'{key[:key_len]}'" + example_mode = mode + example_iv = None if not iv_len else f"'{iv[:iv_len]}'" + example_transform = f"aes_encrypt_mysql(mode, secret, key{', iv' if example_iv else ''})" + + with table("user_data"): + with mv_transform("user_data", example_transform): + with When("I insert encrypted data"): + node.query(f""" + INSERT INTO user_data_input + (date, name, secret, mode, key) + VALUES + ('2020-01-01', 'user0', 'user0_secret', {example_mode}, {example_key}{(", " + example_iv) if example_iv else ""}), + ('2020-01-02', 'user1', 'user1_secret', {example_mode}, {example_key}{(", " + example_iv) if example_iv else ""}), + ('2020-01-03', 'user2', 'user2_secret', {example_mode}, {example_key}{(", " + example_iv) if example_iv else ""}) + """) + + with And("I read inserted data back"): + node.query("SELECT date, name, hex(secret) FROM user_data ORDER BY date") + + with Then("output must match the snapshot"): + with values() as that: + assert that(snapshot(r.output.strip(), "insert", name=f"aes_encrypt_mysql_mv_example_{varname(basename(self.name))}")), error() + +@TestScenario +def encrypt_using_input_table_function(self): + """Check that we can use `encrypt` function when inserting + data into a table using insert select and `input()` table + function. + """ + node = self.context.node + key = f"{'1' * 36}" + iv = f"{'2' * 16}" + aad = "some random aad" + + for mode, key_len, iv_len, aad_len in modes: + with Example(f"""mode={mode.strip("'")} iv={iv_len} aad={aad_len}""") as example: + example_key = f"'{key[:key_len]}'" + example_mode = mode + example_iv = None if not iv_len else f"'{iv[:iv_len]}'" + example_aad = None if not aad_len else f"'{aad}'" + example_transform = f"encrypt({mode}, secret, {example_key}{(', ' + example_iv) if example_iv else ''}{(', ' + example_aad) if example_aad else ''})" + + with table("user_data"): + with When("I insert encrypted data"): + node.query(f""" + INSERT INTO + user_data + SELECT + date, name, {example_transform} + FROM + input('date Date, name String, secret String') + FORMAT Values ('2020-01-01', 'user0', 'user0_secret'), ('2020-01-02', 'user1', 'user1_secret'), ('2020-01-03', 'user2', 'user2_secret') + """) + + with And("I read inserted data back"): + r = node.query("SELECT date, name, hex(secret) FROM user_data ORDER BY date") + + with Then("output must match the snapshot"): + with values() as that: + assert that(snapshot(r.output.strip(), "insert", name=f"encrypt_input_example_{varname(basename(example.name))}")), error() + +@TestScenario +def aes_encrypt_mysql_using_input_table_function(self): + """Check that we can use `aes_encrypt_mysql` function when inserting + data into a table using insert select and `input()` table + function. + """ + node = self.context.node + key = f"{'1' * 64}" + iv = f"{'2' * 64}" + aad = "some random aad" + + for mode, key_len, iv_len in mysql_modes: + with Example(f"""mode={mode.strip("'")} key={key_len} iv={iv_len}""") as example: + example_key = f"'{key[:key_len]}'" + example_mode = mode + example_iv = None if not iv_len else f"'{iv[:iv_len]}'" + example_transform = f"aes_encrypt_mysql({mode}, secret, {example_key}{(', ' + example_iv) if example_iv else ''})" + + with table("user_data"): + with When("I insert encrypted data"): + node.query(f""" + INSERT INTO + user_data + SELECT + date, name, {example_transform} + FROM + input('date Date, name String, secret String') + FORMAT Values ('2020-01-01', 'user0', 'user0_secret'), ('2020-01-02', 'user1', 'user1_secret'), ('2020-01-03', 'user2', 'user2_secret') + """) + + with And("I read inserted data back"): + r = node.query("SELECT date, name, hex(secret) FROM user_data ORDER BY date") + + with Then("output must match the snapshot"): + with values() as that: + assert that(snapshot(r.output.strip(), "insert", name=f"aes_encrypt_mysql_input_example_{varname(basename(example.name))}")), error() + +@TestScenario +def decrypt_using_materialized_view(self): + """Check that we can use `decrypt` function when inserting + data into a table using a materialized view for input + data transformation. + """ + node = self.context.node + key = f"{'1' * 36}" + iv = f"{'2' * 16}" + aad = "some random aad" + + with Given("I load encrypt snapshots"): + snapshot_module = SourceFileLoader("snapshot", os.path.join(current_dir(), "snapshots", "insert.py.insert.snapshot")).load_module() + + for mode, key_len, iv_len, aad_len in modes: + with Example(f"""mode={mode.strip("'")} iv={iv_len} aad={aad_len}""") as example: + example_key = f"'{key[:key_len]}'" + example_mode = mode + example_iv = None if not iv_len else f"'{iv[:iv_len]}'" + example_aad = None if not aad_len else f"'{aad}'" + example_transform = f"decrypt(mode, secret, key{', iv' if example_iv else ''}{', aad' if example_aad else ''})" + + with Given("I have ciphertexts"): + example_name = basename(example.name) + ciphertexts = getattr(snapshot_module, varname(f"encrypt_mv_example_{example_name}")) + example_ciphertexts = ["'{}'".format(l.split("\t")[-1].strup("'")) for l in ciphertexts.split("\n")] + + with table("user_data"): + with mv_transform("user_data", example_transform): + with When("I insert encrypted data"): + node.query(f""" + INSERT INTO user_data_input + (date, name, secret, mode, key) + VALUES + ('2020-01-01', 'user0', 'unhex({example_ciphertexts[0]})', {example_mode}, {example_key}{(", " + example_iv) if example_iv else ""}{(", " + example_aad) if example_aad else ""}), + ('2020-01-02', 'user1', 'unhex({example_ciphertexts[1]})', {example_mode}, {example_key}{(", " + example_iv) if example_iv else ""}{(", " + example_aad) if example_aad else ""}), + ('2020-01-03', 'user2', 'unhex({example_ciphertexts[2]})', {example_mode}, {example_key}{(", " + example_iv) if example_iv else ""}{(", " + example_aad) if example_aad else ""}) + """) + + with And("I read inserted data back"): + r = node.query("SELECT date, name, secret FROM user_data ORDER BY date") + + with Then("output must match the expected"): + expected = r"""'2020-01-01\tuser0\tuser0_secret\n2020-01-02\tuser1\tuser1_secret\n2020-01-03\tuser2\tuser2_secret'""" + assert r.output == expected, error() + +@TestScenario +def aes_decrypt_mysql_using_materialized_view(self): + """Check that we can use `aes_decrypt_mysql` function when inserting + data into a table using a materialized view for input + data transformation. + """ + node = self.context.node + key = f"{'1' * 36}" + iv = f"{'2' * 16}" + aad = "some random aad" + + with Given("I load encrypt snapshots"): + snapshot_module = SourceFileLoader("snapshot", os.path.join(current_dir(), "snapshots", "insert.py.insert.snapshot")).load_module() + + for mode, key_len, iv_len, aad_len in modes: + with Example(f"""mode={mode.strip("'")} key={key_len} iv={iv_len}""") as example: + example_key = f"'{key[:key_len]}'" + example_mode = mode + example_iv = None if not iv_len else f"'{iv[:iv_len]}'" + example_aad = None if not aad_len else f"'{aad}'" + example_transform = f"aes_decrypt_mysql(mode, secret, key{', iv' if example_iv else ''})" + + with Given("I have ciphertexts"): + example_name = basename(example.name) + ciphertexts = getattr(snapshot_module, varname(f"aes_encrypt_mysql_mv_example_{example_name}")) + example_ciphertexts = ["'{}'".format(l.split("\t")[-1].strup("'")) for l in ciphertexts.split("\n")] + + with table("user_data"): + with mv_transform("user_data", example_transform): + with When("I insert encrypted data"): + node.query(f""" + INSERT INTO user_data_input + (date, name, secret, mode, key) + VALUES + ('2020-01-01', 'user0', 'unhex({example_ciphertexts[0]})', {example_mode}, {example_key}{(", " + example_iv) if example_iv else ""}), + ('2020-01-02', 'user1', 'unhex({example_ciphertexts[1]})', {example_mode}, {example_key}{(", " + example_iv) if example_iv else ""}), + ('2020-01-03', 'user2', 'unhex({example_ciphertexts[2]})', {example_mode}, {example_key}{(", " + example_iv) if example_iv else ""}) + """) + + with And("I read inserted data back"): + r = node.query("SELECT date, name, secret FROM user_data ORDER BY date") + + with Then("output must match the expected"): + expected = r"""'2020-01-01\tuser0\tuser0_secret\n2020-01-02\tuser1\tuser1_secret\n2020-01-03\tuser2\tuser2_secret'""" + assert r.output == expected, error() + +@TestScenario +def decrypt_using_input_table_function(self): + """Check that we can use `decrypt` function when inserting + data into a table using insert select and `input()` table + function. + """ + node = self.context.node + key = f"{'1' * 36}" + iv = f"{'2' * 16}" + aad = "some random aad" + + with Given("I load encrypt snapshots"): + snapshot_module = SourceFileLoader("snapshot", os.path.join(current_dir(), "snapshots", "insert.py.insert.snapshot")).load_module() + + for mode, key_len, iv_len, aad_len in modes: + with Example(f"""mode={mode.strip("'")} iv={iv_len} aad={aad_len}""") as example: + example_key = f"'{key[:key_len]}'" + example_mode = mode + example_iv = None if not iv_len else f"'{iv[:iv_len]}'" + example_aad = None if not aad_len else f"'{aad}'" + example_transform = f"decrypt({mode}, unhex(secret), {example_key}{(', ' + example_iv) if example_iv else ''}{(', ' + example_aad) if example_aad else ''})" + + with Given("I have ciphertexts"): + example_name = basename(example.name) + ciphertexts = getattr(snapshot_module, varname(f"encrypt_input_example_{example_name}")) + example_ciphertexts = [l.split("\\t")[-1].strip("'") for l in ciphertexts.split("\\n")] + + with table("user_data"): + with When("I insert decrypted data"): + node.query(textwrap.dedent(f""" + INSERT INTO + user_data + SELECT + date, name, {example_transform} + FROM + input('date Date, name String, secret String') + FORMAT Values ('2020-01-01', 'user0', '{example_ciphertexts[0]}'), ('2020-01-02', 'user1', '{example_ciphertexts[1]}'), ('2020-01-03', 'user2', '{example_ciphertexts[2]}') + """)) + + with And("I read inserted data back"): + r = node.query("SELECT date, name, secret FROM user_data ORDER BY date") + + expected = """2020-01-01\tuser0\tuser0_secret\n2020-01-02\tuser1\tuser1_secret\n2020-01-03\tuser2\tuser2_secret""" + with Then("output must match the expected", description=expected): + assert r.output == expected, error() + +@TestScenario +def aes_decrypt_mysql_using_input_table_function(self): + """Check that we can use `aes_decrypt_mysql` function when inserting + data into a table using insert select and `input()` table + function. + """ + node = self.context.node + key = f"{'1' * 64}" + iv = f"{'2' * 64}" + aad = "some random aad" + + with Given("I load encrypt snapshots"): + snapshot_module = SourceFileLoader("snapshot", os.path.join(current_dir(), "snapshots", "insert.py.insert.snapshot")).load_module() + + for mode, key_len, iv_len in mysql_modes: + with Example(f"""mode={mode.strip("'")} key={key_len} iv={iv_len}""") as example: + example_key = f"'{key[:key_len]}'" + example_mode = mode + example_iv = None if not iv_len else f"'{iv[:iv_len]}'" + example_transform = f"aes_decrypt_mysql({mode}, unhex(secret), {example_key}{(', ' + example_iv) if example_iv else ''})" + + with Given("I have ciphertexts"): + example_name = basename(example.name) + ciphertexts = getattr(snapshot_module, varname(f"aes_encrypt_mysql_input_example_{example_name}")) + example_ciphertexts = [l.split("\\t")[-1].strip("'") for l in ciphertexts.split("\\n")] + + with table("user_data"): + with When("I insert decrypted data"): + node.query(textwrap.dedent(f""" + INSERT INTO + user_data + SELECT + date, name, {example_transform} + FROM + input('date Date, name String, secret String') + FORMAT Values ('2020-01-01', 'user0', '{example_ciphertexts[0]}'), ('2020-01-02', 'user1', '{example_ciphertexts[1]}'), ('2020-01-03', 'user2', '{example_ciphertexts[2]}') + """)) + + with And("I read inserted data back"): + r = node.query("SELECT date, name, secret FROM user_data ORDER BY date") + + expected = """2020-01-01\tuser0\tuser0_secret\n2020-01-02\tuser1\tuser1_secret\n2020-01-03\tuser2\tuser2_secret""" + with Then("output must match the expected", description=expected): + assert r.output == expected, error() + +@TestFeature +@Name("insert") +def feature(self, node="clickhouse1"): + """Check encryption functions when used during data insertion into a table. + """ + self.context.node = self.context.cluster.node(node) + + for scenario in loads(current_module(), Scenario): + Scenario(run=scenario, flags=TE) diff --git a/tests/testflows/aes_encryption/tests/compatibility/mysql/__init__.py b/tests/testflows/aes_encryption/tests/compatibility/mysql/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/testflows/aes_encryption/tests/compatibility/mysql/database_engine.py b/tests/testflows/aes_encryption/tests/compatibility/mysql/database_engine.py new file mode 100644 index 00000000000..3547dc95ab0 --- /dev/null +++ b/tests/testflows/aes_encryption/tests/compatibility/mysql/database_engine.py @@ -0,0 +1,196 @@ +import textwrap +from contextlib import contextmanager + +from testflows.core import * +from testflows.asserts import error + +from aes_encryption.requirements import * +from aes_encryption.tests.common import mysql_modes, hex + +@contextmanager +def table(name, node, mysql_node, secret_type): + """Create a table that can be accessed using MySQL database engine. + """ + try: + with Given("table in MySQL"): + sql = f""" + CREATE TABLE {name}( + id INT NOT NULL AUTO_INCREMENT, + date DATE, + name VARCHAR(100), + secret {secret_type}, + PRIMARY KEY ( id ) + ); + """ + with When("I drop the table if exists"): + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user -e \"DROP TABLE IF EXISTS {name};\"", exitcode=0) + with And("I create a table"): + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user <<'EOF'{textwrap.dedent(sql)}\nEOF", exitcode=0) + + with And("I create a database using MySQL database engine"): + sql = f""" + CREATE DATABASE mysql_db + ENGINE = MySQL('{mysql_node.name}:3306', 'db', 'user', 'password') + """ + with When("I drop database if exists"): + node.query(f"DROP DATABASE IF EXISTS mysql_db") + with And("I create database"): + node.query(textwrap.dedent(sql)) + yield + + finally: + with And("I drop the database that is using MySQL database engine", flags=TE): + node.query(f"DROP DATABASE IF EXISTS mysql_db") + + with And("I drop a table in MySQL", flags=TE): + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user -e \"DROP TABLE IF EXISTS {name};\"", exitcode=0) + +@TestOutline(Scenario) +@Examples("mysql_datatype", [ + ("VARBINARY(100)",), + #("VARCHAR(100)",), + ("BLOB", ), + #("TEXT",) +]) +def decrypt(self, mysql_datatype): + """Check that when using a table provided by MySQL database engine that + contains a column encrypted in MySQL stored using specified data type + I can decrypt data in the column using the `decrypt` and `aes_decrypt_mysql` + functions in the select query. + """ + node = self.context.node + mysql_node = self.context.mysql_node + key = f"{'1' * 64}" + iv = f"{'2' * 64}" + + for func in ["decrypt", "aes_decrypt_mysql"]: + for mode, key_len, iv_len in mysql_modes: + exact_key_size = int(mode.split("-")[1])//8 + + if "ecb" not in mode and not iv_len: + continue + if func == "decrypt": + if iv_len and iv_len != 16: + continue + if key_len != exact_key_size: + continue + + with Example(f"""{func} mode={mode.strip("'")} key={key_len} iv={iv_len}"""): + with table("user_data", node, mysql_node, mysql_datatype): + example_mode = mode + example_key = f"'{key[:key_len]}'" + example_iv = None if not iv_len else f"'{iv[:iv_len]}'" + + with When("I insert encrypted data in MySQL"): + sql = f""" + SET block_encryption_mode = {example_mode}; + INSERT INTO user_data VALUES (NULL, '2020-01-01', 'user0', AES_ENCRYPT('secret', {example_key}{(", " + example_iv) if example_iv else ", ''"})); + """ + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user <<'EOF'{textwrap.dedent(sql)}\nEOF", exitcode=0) + + with And("I read encrypted data in MySQL to make sure it is valid"): + sql = f""" + SET block_encryption_mode = {example_mode}; + SELECT id, date, name, AES_DECRYPT(secret, {example_key}{(", " + example_iv) if example_iv else ", ''"}) AS secret FROM user_data; + """ + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user <<'EOF'{textwrap.dedent(sql)}\nEOF", exitcode=0) + + with And("I read raw encrypted data in MySQL"): + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user -e \"SELECT id, date, name, hex(secret) as secret FROM user_data;\"", exitcode=0) + + with And("I read raw data using MySQL database engine"): + output = node.query("SELECT id, date, name, hex(secret) AS secret FROM mysql_db.user_data") + + with And("I read decrypted data using MySQL database engine"): + output = node.query(f"""SELECT hex({func}({example_mode}, secret, {example_key}{(", " + example_iv) if example_iv else ""})) FROM mysql_db.user_data""").output.strip() + + with Then("output should match the original plain text"): + assert output == hex("secret"), error() + +@TestOutline(Scenario) +@Examples("mysql_datatype", [ + ("VARBINARY(100)",), + #("VARCHAR(100)",), + ("BLOB", ), + #("TEXT",) +]) +def encrypt(self, mysql_datatype): + """Check that when using a table provided by MySQL database engine that + we can encrypt data during insert using the `aes_encrypt_mysql` function + and decrypt it in MySQL. + """ + node = self.context.node + mysql_node = self.context.mysql_node + key = f"{'1' * 64}" + iv = f"{'2' * 64}" + + for func in ["encrypt", "aes_encrypt_mysql"]: + for mode, key_len, iv_len in mysql_modes: + exact_key_size = int(mode.split("-")[1])//8 + + if "ecb" not in mode and not iv_len: + continue + if func == "encrypt": + if iv_len and iv_len != 16: + continue + if key_len != exact_key_size: + continue + + with Example(f"""{func} mode={mode.strip("'")} key={key_len} iv={iv_len}"""): + with table("user_data", node, mysql_node, mysql_datatype): + example_mode = mode + example_key = f"'{key[:key_len]}'" + example_iv = None if not iv_len else f"'{iv[:iv_len]}'" + example_transform = f"{func}({mode}, secret, {example_key}{(', ' + example_iv) if example_iv else ''})" + + with When("I insert encrypted data into a table provided by MySQL database engine"): + node.query(textwrap.dedent(f""" + INSERT INTO + mysql_db.user_data + SELECT + id, date, name, {example_transform} + FROM + input('id Int32, date Date, name String, secret String') + FORMAT Values (1, '2020-01-01', 'user0', 'secret') + """)) + + with And("I read decrypted data using MySQL database engine"): + output = node.query(f"""SELECT hex(aes_decrypt_mysql({example_mode}, secret, {example_key}{(", " + example_iv) if example_iv else ""})) FROM mysql_db.user_data""").output.strip() + + with Then("decrypted data from MySQL database engine should should match the original plain text"): + assert output == hex("secret"), error() + + with And("I read raw data using MySQL database engine to get expected raw data"): + expected_raw_data = node.query("SELECT hex(secret) AS secret FROM mysql_db.user_data").output.strip() + + with And("I read raw encrypted data in MySQL"): + output = mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user -e \"SELECT hex(secret) as secret FROM user_data;\"", exitcode=0).output.strip() + + with Then("check that raw encryted data in MySQL matches the expected"): + assert expected_raw_data in output, error() + + with And("I decrypt data in MySQL to make sure it is valid"): + sql = f""" + SET block_encryption_mode = {example_mode}; + SELECT id, date, name, hex(AES_DECRYPT(secret, {example_key}{(", " + example_iv) if example_iv else ", ''"})) AS secret FROM user_data; + """ + output = mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user <<'EOF'{textwrap.dedent(sql)}\nEOF", exitcode=0).output.strip() + + with Then("decryted data in MySQL should match the original plain text"): + assert hex("secret") in output, error() + +@TestFeature +@Name("database engine") +@Requirements( + RQ_SRS008_AES_Functions_Compatability_Engine_Database_MySQL("1.0") +) +def feature(self, node="clickhouse1", mysql_node="mysql1"): + """Check usage of encryption functions with [MySQL database engine]. + + [MySQL database engine]: https://clickhouse.tech/docs/en/engines/database-engines/mysql/ + """ + self.context.node = self.context.cluster.node(node) + self.context.mysql_node = self.context.cluster.node(mysql_node) + + for scenario in loads(current_module(), Scenario): + Scenario(run=scenario, flags=TE) diff --git a/tests/testflows/aes_encryption/tests/compatibility/mysql/dictionary.py b/tests/testflows/aes_encryption/tests/compatibility/mysql/dictionary.py new file mode 100644 index 00000000000..66b9e3acbf8 --- /dev/null +++ b/tests/testflows/aes_encryption/tests/compatibility/mysql/dictionary.py @@ -0,0 +1,251 @@ +import textwrap +from contextlib import contextmanager + +from testflows.core import * +from testflows.asserts import error + +from aes_encryption.requirements import * +from aes_encryption.tests.common import mysql_modes, hex + +@contextmanager +def dictionary(name, node, mysql_node, secret_type): + """Create a table in MySQL and use it a source for a dictionary. + """ + try: + with Given("table in MySQL"): + sql = f""" + CREATE TABLE {name}( + id INT NOT NULL AUTO_INCREMENT, + date DATE, + name VARCHAR(100), + secret {secret_type}, + PRIMARY KEY ( id ) + ); + """ + with When("I drop the table if exists"): + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user -e \"DROP TABLE IF EXISTS {name};\"", exitcode=0) + with And("I create a table"): + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user <<'EOF'{textwrap.dedent(sql)}\nEOF", exitcode=0) + + with And("dictionary that uses MySQL table as the external source"): + with When("I drop the dictionary if exists"): + node.query(f"DROP DICTIONARY IF EXISTS dict_{name}") + with And("I create the dictionary"): + sql = f""" + CREATE DICTIONARY dict_{name} + ( + id Int32, + date Date, + name String, + secret String + ) + PRIMARY KEY id + SOURCE(MYSQL( + USER 'user' + PASSWORD 'password' + DB 'db' + TABLE '{name}' + REPLICA(PRIORITY 1 HOST '{mysql_node.name}' PORT 3306) + )) + LAYOUT(HASHED()) + LIFETIME(0) + """ + node.query(textwrap.dedent(sql)) + + yield f"dict_{name}" + + finally: + with Finally("I drop the dictionary", flags=TE): + node.query(f"DROP DICTIONARY IF EXISTS dict_{name}") + + with And("I drop a table in MySQL", flags=TE): + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user -e \"DROP TABLE IF EXISTS {name};\"", exitcode=0) + +@contextmanager +def parameters_dictionary(name, node, mysql_node): + """Create a table in MySQL and use it a source for a dictionary + that stores parameters for the encryption functions. + """ + try: + with Given("table in MySQL"): + sql = f""" + CREATE TABLE {name}( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100), + `mode` VARCHAR(100), + `key` BLOB, + `iv` BLOB, + `text` BLOB, + PRIMARY KEY ( id ) + ); + """ + with When("I drop the table if exists"): + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user -e \"DROP TABLE IF EXISTS {name};\"", exitcode=0) + with And("I create a table"): + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user <<'EOF'{textwrap.dedent(sql)}\nEOF", exitcode=0) + + with And("dictionary that uses MySQL table as the external source"): + with When("I drop the dictionary if exists"): + node.query(f"DROP DICTIONARY IF EXISTS dict_{name}") + with And("I create the dictionary"): + sql = f""" + CREATE DICTIONARY dict_{name} + ( + id Int32, + name String, + mode String, + key String, + iv String, + text String + ) + PRIMARY KEY id + SOURCE(MYSQL( + USER 'user' + PASSWORD 'password' + DB 'db' + TABLE '{name}' + REPLICA(PRIORITY 1 HOST '{mysql_node.name}' PORT 3306) + )) + LAYOUT(HASHED()) + LIFETIME(0) + """ + node.query(textwrap.dedent(sql)) + + yield f"dict_{name}" + + finally: + with Finally("I drop the dictionary", flags=TE): + node.query(f"DROP DICTIONARY IF EXISTS dict_{name}") + + with And("I drop a table in MySQL", flags=TE): + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user -e \"DROP TABLE IF EXISTS {name};\"", exitcode=0) + +@TestScenario +def parameter_values(self): + """Check that we can use a dictionary that uses MySQL table as a source + can be used as a parameters store for the `encrypt`, `decrypt`, and + `aes_encrypt_mysql`, `aes_decrypt_mysql` functions. + """ + node = self.context.node + mysql_node = self.context.mysql_node + mode = "'aes-128-cbc'" + key = f"'{'1' * 16}'" + iv = f"'{'2' * 16}'" + plaintext = "'secret'" + + for encrypt, decrypt in [ + ("encrypt", "decrypt"), + ("aes_encrypt_mysql", "aes_decrypt_mysql") + ]: + with Example(f"{encrypt} and {decrypt}", description=f"Check using dictionary for parameters of {encrypt} and {decrypt} functions."): + with parameters_dictionary("parameters_data", node, mysql_node) as dict_name: + with When("I insert parameters values in MySQL"): + sql = f""" + INSERT INTO parameters_data VALUES (1, 'user0', {mode}, {key}, {iv}, {plaintext}); + """ + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user <<'EOF'{textwrap.dedent(sql)}\nEOF", exitcode=0) + + with And("I use dictionary values as parameters"): + sql = f""" + SELECT {decrypt}( + dictGet('default.{dict_name}', 'mode', toUInt64(1)), + {encrypt}( + dictGet('default.{dict_name}', 'mode', toUInt64(1)), + dictGet('default.{dict_name}', 'text', toUInt64(1)), + dictGet('default.{dict_name}', 'key', toUInt64(1)), + dictGet('default.{dict_name}', 'iv', toUInt64(1)) + ), + dictGet('default.{dict_name}', 'key', toUInt64(1)), + dictGet('default.{dict_name}', 'iv', toUInt64(1)) + ) + """ + output = node.query(textwrap.dedent(sql)).output.strip() + + with Then("output should match the plain text"): + assert f"'{output}'" == plaintext, error() + +@TestOutline(Scenario) +@Examples("mysql_datatype", [ + ("VARBINARY(100)",), + #("VARCHAR(100)",), + ("BLOB", ), + #("TEXT",) +]) +def decrypt(self, mysql_datatype): + """Check that when using a dictionary that uses MySQL table as a source and + contains a data encrypted in MySQL and stored using specified data type + that we can decrypt data from the dictionary using + the `aes_decrypt_mysql` or `decrypt` functions in the select query. + """ + node = self.context.node + mysql_node = self.context.mysql_node + key = f"{'1' * 64}" + iv = f"{'2' * 64}" + + for func in ["decrypt", "aes_decrypt_mysql"]: + for mode, key_len, iv_len in mysql_modes: + exact_key_size = int(mode.split("-")[1])//8 + + if "ecb" not in mode and not iv_len: + continue + if func == "decrypt": + if iv_len and iv_len != 16: + continue + if key_len != exact_key_size: + continue + + with Example(f"""{func} mode={mode.strip("'")} key={key_len} iv={iv_len}"""): + with dictionary("user_data", node, mysql_node, mysql_datatype) as dict_name: + example_mode = mode + example_key = f"'{key[:key_len]}'" + example_iv = None if not iv_len else f"'{iv[:iv_len]}'" + + with When("I insert encrypted data in MySQL"): + sql = f""" + SET block_encryption_mode = {example_mode}; + INSERT INTO user_data VALUES (NULL, '2020-01-01', 'user0', AES_ENCRYPT('secret', {example_key}{(", " + example_iv) if example_iv else ", ''"})); + """ + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user <<'EOF'{textwrap.dedent(sql)}\nEOF", exitcode=0) + + with And("I read encrypted data in MySQL to make sure it is valid"): + sql = f""" + SET block_encryption_mode = {example_mode}; + SELECT id, date, name, AES_DECRYPT(secret, {example_key}{(", " + example_iv) if example_iv else ", ''"}) AS secret FROM user_data; + """ + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user <<'EOF'{textwrap.dedent(sql)}\nEOF", exitcode=0) + + with And("I read raw encrypted data in MySQL"): + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user -e \"SELECT id, date, name, hex(secret) as secret FROM user_data;\"", exitcode=0) + + with And("I read raw data using MySQL dictionary"): + output = node.query(f"SELECT hex(dictGet('default.{dict_name}', 'secret', toUInt64(1))) AS secret") + + with And("I read decrypted data using MySQL dictionary"): + output = node.query(textwrap.dedent(f""" + SELECT hex( + {func}( + {example_mode}, + dictGet('default.{dict_name}', 'secret', toUInt64(1)), + {example_key}{(", " + example_iv) if example_iv else ""} + ) + ) + """)).output.strip() + + with Then("output should match the original plain text"): + assert output == hex("secret"), error() + +@TestFeature +@Name("dictionary") +@Requirements( + RQ_SRS008_AES_Functions_Compatability_Dictionaries("1.0") +) +def feature(self, node="clickhouse1", mysql_node="mysql1"): + """Check usage of encryption functions with [MySQL dictionary]. + + [MySQL dictionary]: https://clickhouse.tech/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources/#dicts-external_dicts_dict_sources-mysql + """ + self.context.node = self.context.cluster.node(node) + self.context.mysql_node = self.context.cluster.node(mysql_node) + + for scenario in loads(current_module(), Scenario): + Scenario(run=scenario, flags=TE) diff --git a/tests/testflows/aes_encryption/tests/compatibility/mysql/feature.py b/tests/testflows/aes_encryption/tests/compatibility/mysql/feature.py new file mode 100644 index 00000000000..5c6338bfdff --- /dev/null +++ b/tests/testflows/aes_encryption/tests/compatibility/mysql/feature.py @@ -0,0 +1,18 @@ +from testflows.core import * + +from aes_encryption.requirements import * + +@TestFeature +@Name("mysql") +@Requirements( + RQ_SRS008_AES_Functions_Compatability_MySQL("1.0") +) +def feature(self, node="clickhouse1"): + """Check encryption functions usage compatibility with MySQL. + """ + self.context.node = self.context.cluster.node(node) + + Feature(run=load("aes_encryption.tests.compatibility.mysql.table_engine", "feature"), flags=TE) + Feature(run=load("aes_encryption.tests.compatibility.mysql.database_engine", "feature"), flags=TE) + Feature(run=load("aes_encryption.tests.compatibility.mysql.table_function", "feature"), flags=TE) + Feature(run=load("aes_encryption.tests.compatibility.mysql.dictionary", "feature"), flags=TE) diff --git a/tests/testflows/aes_encryption/tests/compatibility/mysql/table_engine.py b/tests/testflows/aes_encryption/tests/compatibility/mysql/table_engine.py new file mode 100644 index 00000000000..5a5c7d9d58a --- /dev/null +++ b/tests/testflows/aes_encryption/tests/compatibility/mysql/table_engine.py @@ -0,0 +1,202 @@ +import textwrap +from contextlib import contextmanager + +from testflows.core import * +from testflows.asserts import error + +from aes_encryption.requirements import * +from aes_encryption.tests.common import mysql_modes, hex + +@contextmanager +def table(name, node, mysql_node, secret_type): + """Create a table that can be accessed using MySQL table engine. + """ + try: + with Given("table in MySQL"): + sql = f""" + CREATE TABLE {name}( + id INT NOT NULL AUTO_INCREMENT, + date DATE, + name VARCHAR(100), + secret {secret_type}, + PRIMARY KEY ( id ) + ); + """ + with When("I drop the table if exists"): + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user -e \"DROP TABLE IF EXISTS {name};\"", exitcode=0) + with And("I create a table"): + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user <<'EOF'{textwrap.dedent(sql)}\nEOF", exitcode=0) + + with And("I create a table using MySQL table engine"): + sql = f""" + CREATE TABLE mysql_{name} + ( + id Nullable(Int32), + date Nullable(Date), + name Nullable(String), + secret Nullable(String) + ) + ENGINE = MySQL('{mysql_node.name}:3306', 'db', '{name}', 'user', 'password') + """ + with When("I drop table if exists"): + node.query(f"DROP TABLE IF EXISTS mysql_{name}") + with And("I create table"): + node.query(textwrap.dedent(sql)) + yield + + finally: + with And("I drop a table using MySQL table engine", flags=TE): + node.query(f"DROP TABLE IF EXISTS mysql_{name}") + + with And("I drop a table in MySQL", flags=TE): + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user -e \"DROP TABLE IF EXISTS {name};\"", exitcode=0) + +@TestOutline(Scenario) +@Examples("mysql_datatype", [ + ("VARBINARY(100)",), + #("VARCHAR(100)",), + ("BLOB", ), + #("TEXT",) +]) +def decrypt(self, mysql_datatype): + """Check that when using a table with MySQL table engine that + contains a column encrypted in MySQL stored using specified data type + I can decrypt data in the column using the `decrypt` and `aes_decrypt_mysql` + functions in the select query. + """ + node = self.context.node + mysql_node = self.context.mysql_node + key = f"{'1' * 64}" + iv = f"{'2' * 64}" + + for func in ["decrypt", "aes_decrypt_mysql"]: + for mode, key_len, iv_len in mysql_modes: + exact_key_size = int(mode.split("-")[1])//8 + + if "ecb" not in mode and not iv_len: + continue + if func == "decrypt": + if iv_len and iv_len != 16: + continue + if key_len != exact_key_size: + continue + + with Example(f"""{func} mode={mode.strip("'")} key={key_len} iv={iv_len}"""): + with table("user_data", node, mysql_node, mysql_datatype): + example_mode = mode + example_key = f"'{key[:key_len]}'" + example_iv = None if not iv_len else f"'{iv[:iv_len]}'" + + with When("I insert encrypted data in MySQL"): + sql = f""" + SET block_encryption_mode = {example_mode}; + INSERT INTO user_data VALUES (NULL, '2020-01-01', 'user0', AES_ENCRYPT('secret', {example_key}{(", " + example_iv) if example_iv else ", ''"})); + """ + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user <<'EOF'{textwrap.dedent(sql)}\nEOF", exitcode=0) + + with And("I read encrypted data in MySQL to make sure it is valid"): + sql = f""" + SET block_encryption_mode = {example_mode}; + SELECT id, date, name, AES_DECRYPT(secret, {example_key}{(", " + example_iv) if example_iv else ", ''"}) AS secret FROM user_data; + """ + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user <<'EOF'{textwrap.dedent(sql)}\nEOF", exitcode=0) + + with And("I read raw encrypted data in MySQL"): + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user -e \"SELECT id, date, name, hex(secret) as secret FROM user_data;\"", exitcode=0) + + with And("I read raw data using MySQL table engine"): + output = node.query("SELECT id, date, name, hex(secret) AS secret FROM mysql_user_data") + + with And("I read decrypted data via MySQL table engine"): + output = node.query(f"""SELECT hex({func}({example_mode}, secret, {example_key}{(", " + example_iv) if example_iv else ""})) FROM mysql_user_data""").output.strip() + + with Then("the output should match the original plain text"): + assert output == hex("secret"), error() + +@TestOutline(Scenario) +@Examples("mysql_datatype", [ + ("VARBINARY(100)",), + #("VARCHAR(100)",), + ("BLOB", ), + #("TEXT",) +]) +def encrypt(self, mysql_datatype): + """Check that when using a table with MySQL table engine that + we can encrypt data during insert using the `encrypt` and `aes_encrypt_mysql` + functions and decrypt it in MySQL. + """ + node = self.context.node + mysql_node = self.context.mysql_node + key = f"{'1' * 64}" + iv = f"{'2' * 64}" + + for func in ["encrypt", "aes_encrypt_mysql"]: + for mode, key_len, iv_len in mysql_modes: + exact_key_size = int(mode.split("-")[1])//8 + + if "ecb" not in mode and not iv_len: + continue + if func == "encrypt": + if iv_len and iv_len != 16: + continue + if key_len != exact_key_size: + continue + + with Example(f"""mode={mode.strip("'")} key={key_len} iv={iv_len}"""): + with table("user_data", node, mysql_node, mysql_datatype): + example_mode = mode + example_key = f"'{key[:key_len]}'" + example_iv = None if not iv_len else f"'{iv[:iv_len]}'" + example_transform = f"{func}({mode}, secret, {example_key}{(', ' + example_iv) if example_iv else ''})" + + with When("I insert encrypted data into MySQL table engine"): + node.query(textwrap.dedent(f""" + INSERT INTO + mysql_user_data + SELECT + id, date, name, {example_transform} + FROM + input('id Nullable(Int32), date Date, name String, secret String') + FORMAT Values (null, '2020-01-01', 'user0', 'secret') + """)) + + with And("I read decrypted data via MySQL table engine"): + output = node.query(f"""SELECT hex(aes_decrypt_mysql({example_mode}, secret, {example_key}{(", " + example_iv) if example_iv else ""})) FROM mysql_user_data""").output.strip() + + with Then("decrypted data from MySQL table engine should should match the original plain text"): + assert output == hex("secret"), error() + + with And("I read raw data using MySQL table engine to get expected raw data"): + expected_raw_data = node.query("SELECT hex(secret) AS secret FROM mysql_user_data").output.strip() + + with And("I read raw encrypted data in MySQL"): + output = mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user -e \"SELECT hex(secret) as secret FROM user_data;\"", exitcode=0).output.strip() + + with Then("check that raw encryted data in MySQL matches the expected"): + assert expected_raw_data in output, error() + + with And("I decrypt data in MySQL to make sure it is valid"): + sql = f""" + SET block_encryption_mode = {example_mode}; + SELECT id, date, name, hex(AES_DECRYPT(secret, {example_key}{(", " + example_iv) if example_iv else ", ''"})) AS secret FROM user_data; + """ + output = mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user <<'EOF'{textwrap.dedent(sql)}\nEOF", exitcode=0).output.strip() + + with Then("decryted data in MySQL should match the original plain text"): + assert hex("secret") in output, error() + +@TestFeature +@Name("table engine") +@Requirements( + RQ_SRS008_AES_Functions_Compatability_Engine_Table_MySQL("1.0") +) +def feature(self, node="clickhouse1", mysql_node="mysql1"): + """Check usage of encryption functions with [MySQL table engine]. + + [MySQL table engine]: https://clickhouse.tech/docs/en/engines/table-engines/integrations/mysql/ + """ + self.context.node = self.context.cluster.node(node) + self.context.mysql_node = self.context.cluster.node(mysql_node) + + for scenario in loads(current_module(), Scenario): + Scenario(run=scenario, flags=TE) diff --git a/tests/testflows/aes_encryption/tests/compatibility/mysql/table_function.py b/tests/testflows/aes_encryption/tests/compatibility/mysql/table_function.py new file mode 100644 index 00000000000..cd3487c5c74 --- /dev/null +++ b/tests/testflows/aes_encryption/tests/compatibility/mysql/table_function.py @@ -0,0 +1,183 @@ +import textwrap +from contextlib import contextmanager + +from testflows.core import * +from testflows.asserts import error + +from aes_encryption.requirements import * +from aes_encryption.tests.common import mysql_modes, hex + +@contextmanager +def table(name, node, mysql_node, secret_type): + """Create a table that can be accessed using MySQL table function. + """ + try: + with Given("table in MySQL"): + sql = f""" + CREATE TABLE {name}( + id INT NOT NULL AUTO_INCREMENT, + date DATE, + name VARCHAR(100), + secret {secret_type}, + PRIMARY KEY ( id ) + ); + """ + with When("I drop the table if exists"): + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user -e \"DROP TABLE IF EXISTS {name};\"", exitcode=0) + with And("I create a table"): + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user <<'EOF'{textwrap.dedent(sql)}\nEOF", exitcode=0) + yield f"mysql('{mysql_node.name}:3306', 'db', 'user_data', 'user', 'password')" + + finally: + with And("I drop a table in MySQL", flags=TE): + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user -e \"DROP TABLE IF EXISTS {name};\"", exitcode=0) + +@TestOutline(Scenario) +@Examples("mysql_datatype", [ + ("VARBINARY(100)",), + #("VARCHAR(100)",), + ("BLOB", ), + #("TEXT",) +]) +def decrypt(self, mysql_datatype): + """Check that when using a table accessed through MySQL table function that + contains a column encrypted in MySQL stored using specified data type + I can decrypt data in the column using the `decrypt` and `aes_decrypt_mysql` + functions in the select query. + """ + node = self.context.node + mysql_node = self.context.mysql_node + key = f"{'1' * 64}" + iv = f"{'2' * 64}" + + for func in ["decrypt", "aes_decrypt_mysql"]: + for mode, key_len, iv_len in mysql_modes: + exact_key_size = int(mode.split("-")[1])//8 + + if "ecb" not in mode and not iv_len: + continue + if func == "decrypt": + if iv_len and iv_len != 16: + continue + if key_len != exact_key_size: + continue + + with Example(f"""{func} mode={mode.strip("'")} key={key_len} iv={iv_len}"""): + with table("user_data", node, mysql_node, mysql_datatype) as table_function: + example_mode = mode + example_key = f"'{key[:key_len]}'" + example_iv = None if not iv_len else f"'{iv[:iv_len]}'" + + with When("I insert encrypted data in MySQL"): + sql = f""" + SET block_encryption_mode = {example_mode}; + INSERT INTO user_data VALUES (NULL, '2020-01-01', 'user0', AES_ENCRYPT('secret', {example_key}{(", " + example_iv) if example_iv else ", ''"})); + """ + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user <<'EOF'{textwrap.dedent(sql)}\nEOF", exitcode=0) + + with And("I read encrypted data in MySQL to make sure it is valid"): + sql = f""" + SET block_encryption_mode = {example_mode}; + SELECT id, date, name, AES_DECRYPT(secret, {example_key}{(", " + example_iv) if example_iv else ", ''"}) AS secret FROM user_data; + """ + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user <<'EOF'{textwrap.dedent(sql)}\nEOF", exitcode=0) + + with And("I read raw encrypted data in MySQL"): + mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user -e \"SELECT id, date, name, hex(secret) as secret FROM user_data;\"", exitcode=0) + + with And("I read raw data using MySQL table function"): + output = node.query(f"SELECT id, date, name, hex(secret) AS secret FROM {table_function}") + + with And("I read decrypted data using MySQL table function"): + output = node.query(f"""SELECT hex({func}({example_mode}, secret, {example_key}{(", " + example_iv) if example_iv else ""})) FROM {table_function}""").output.strip() + + with Then("output should match the original plain text"): + assert output == hex("secret"), error() + +@TestOutline(Scenario) +@Examples("mysql_datatype", [ + ("VARBINARY(100)",), + #("VARCHAR(100)",), + ("BLOB", ), + #("TEXT",) +]) +def encrypt(self, mysql_datatype): + """Check that when using a table accessed through MySQL table function that + we can encrypt data during insert using the `aes_encrypt_mysql` function + and decrypt it in MySQL. + """ + node = self.context.node + mysql_node = self.context.mysql_node + key = f"{'1' * 64}" + iv = f"{'2' * 64}" + + for func in ["encrypt", "aes_encrypt_mysql"]: + for mode, key_len, iv_len in mysql_modes: + exact_key_size = int(mode.split("-")[1])//8 + + if "ecb" not in mode and not iv_len: + continue + if func == "encrypt": + if iv_len and iv_len != 16: + continue + if key_len != exact_key_size: + continue + + with Example(f"""{func} mode={mode.strip("'")} key={key_len} iv={iv_len}"""): + with table("user_data", node, mysql_node, mysql_datatype) as table_function: + example_mode = mode + example_key = f"'{key[:key_len]}'" + example_iv = None if not iv_len else f"'{iv[:iv_len]}'" + example_transform = f"{func}({mode}, secret, {example_key}{(', ' + example_iv) if example_iv else ''})" + + with When("I insert encrypted data into a table provided by MySQL database engine"): + node.query(textwrap.dedent(f""" + INSERT INTO TABLE FUNCTION + {table_function} + SELECT + id, date, name, {example_transform} + FROM + input('id Int32, date Date, name String, secret String') + FORMAT Values (1, '2020-01-01', 'user0', 'secret') + """)) + + with And("I read decrypted data using MySQL database engine"): + output = node.query(f"""SELECT hex(aes_decrypt_mysql({example_mode}, secret, {example_key}{(", " + example_iv) if example_iv else ""})) FROM {table_function}""").output.strip() + + with Then("decrypted data from MySQL database engine should should match the original plain text"): + assert output == hex("secret"), error() + + with And("I read raw data using MySQL database engine to get expected raw data"): + expected_raw_data = node.query(f"SELECT hex(secret) AS secret FROM {table_function}").output.strip() + + with And("I read raw encrypted data in MySQL"): + output = mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user -e \"SELECT hex(secret) as secret FROM user_data;\"", exitcode=0).output.strip() + + with Then("check that raw encryted data in MySQL matches the expected"): + assert expected_raw_data in output, error() + + with And("I decrypt data in MySQL to make sure it is valid"): + sql = f""" + SET block_encryption_mode = {example_mode}; + SELECT id, date, name, hex(AES_DECRYPT(secret, {example_key}{(", " + example_iv) if example_iv else ", ''"})) AS secret FROM user_data; + """ + output = mysql_node.command(f"MYSQL_PWD=password mysql -D db -u user <<'EOF'{textwrap.dedent(sql)}\nEOF", exitcode=0).output.strip() + + with Then("decryted data in MySQL should match the original plain text"): + assert hex("secret") in output, error() + +@TestFeature +@Name("table function") +@Requirements( + RQ_SRS008_AES_Functions_Compatability_TableFunction_MySQL("1.0") +) +def feature(self, node="clickhouse1", mysql_node="mysql1"): + """Check usage of encryption functions with [MySQL table function]. + + [MySQL table function]: https://clickhouse.tech/docs/en/sql-reference/table-functions/mysql/ + """ + self.context.node = self.context.cluster.node(node) + self.context.mysql_node = self.context.cluster.node(mysql_node) + + for scenario in loads(current_module(), Scenario): + Scenario(run=scenario, flags=TE) \ No newline at end of file diff --git a/tests/testflows/aes_encryption/tests/compatibility/select.py b/tests/testflows/aes_encryption/tests/compatibility/select.py new file mode 100644 index 00000000000..f81920c65d3 --- /dev/null +++ b/tests/testflows/aes_encryption/tests/compatibility/select.py @@ -0,0 +1,186 @@ +import textwrap +from contextlib import contextmanager + +from testflows.core import * +from testflows.asserts.helpers import varname +from testflows.asserts import values, error, snapshot + +from aes_encryption.tests.common import modes, mysql_modes + +@contextmanager +def table(name, sql): + node = current().context.node + try: + with Given("table"): + + with By("dropping table if exists"): + node.query(f"DROP TABLE IF EXISTS {name}") + with And("creating a table"): + node.query(textwrap.dedent(sql.format(name=name))) + yield + finally: + with Finally("I drop the table", flags=TE): + node.query(f"DROP TABLE IF EXISTS {name}") + +@TestScenario +def decrypt(self): + """Check decrypting column when reading data from a table. + """ + node = self.context.node + key = f"{'1' * 64}" + iv = f"{'2' * 64}" + aad = "some random aad" + + for mode, key_len, iv_len, aad_len in modes: + with Example(f"""mode={mode.strip("'")} key={key_len} iv={iv_len} aad={aad_len}""") as example: + with table("user_table", """ + CREATE TABLE {name} + ( + date Nullable(Date), + name Nullable(String), + secret Nullable(String) + ) + ENGINE = Memory() + """): + + example_mode = mode + example_key = f"'{key[:key_len]}'" + example_iv = None if not iv_len else f"'{iv[:iv_len]}'" + example_aad = None if not aad_len else f"'{aad}'" + + with When("I insert encrypted data"): + encrypted_secret = node.query(f"""SELECT hex(encrypt({example_mode}, 'secret', {example_key}{(", " + example_iv) if example_iv else ""}{(", " + example_aad) if example_aad else ""}))""").output.strip() + node.query(textwrap.dedent(f""" + INSERT INTO user_table + (date, name, secret) + VALUES + ('2020-01-01', 'user0', unhex('{encrypted_secret}')) + """)) + + with And("I decrypt data during query"): + output = node.query(f"""SELECT name, decrypt({example_mode}, secret, {example_key}{(", " + example_iv) if example_iv else ""}{(", " + example_aad) if example_aad else ""}) AS secret FROM user_table FORMAT JSONEachRow""").output.strip() + + with Then("I should get back the original plain text"): + assert output == '{"name":"user0","secret":"secret"}', error() + +@TestScenario +def decrypt_multiple(self, count=1000): + """Check decrypting column when reading multiple entries + encrypted with the same parameters for the same user + from a table. + """ + node = self.context.node + key = f"{'1' * 64}" + iv = f"{'2' * 64}" + aad = "some random aad" + + for mode, key_len, iv_len, aad_len in modes: + with Example(f"""mode={mode.strip("'")} key={key_len} iv={iv_len} aad={aad_len}""") as example: + with table("user_table", """ + CREATE TABLE {name} + ( + date Nullable(Date), + name Nullable(String), + secret Nullable(String) + ) + ENGINE = Memory() + """): + + example_mode = mode + example_key = f"'{key[:key_len]}'" + example_iv = None if not iv_len else f"'{iv[:iv_len]}'" + example_aad = None if not aad_len else f"'{aad}'" + + with When("I insert encrypted data"): + encrypted_secret = node.query(f"""SELECT hex(encrypt({example_mode}, 'secret', {example_key}{(", " + example_iv) if example_iv else ""}{(", " + example_aad) if example_aad else ""}))""").output.strip() + values = [f"('2020-01-01', 'user0', unhex('{encrypted_secret}'))"] * count + node.query( + "INSERT INTO user_table\n" + " (date, name, secret)\n" + f"VALUES {', '.join(values)}") + + with And("I decrypt data", description="using a subquery and get the number of entries that match the plaintext"): + output = node.query(f"""SELECT count() AS count FROM (SELECT name, decrypt({example_mode}, secret, {example_key}{(", " + example_iv) if example_iv else ""}{(", " + example_aad) if example_aad else ""}) AS secret FROM user_table) WHERE secret = 'secret' FORMAT JSONEachRow""").output.strip() + + with Then("I should get back the expected result", description=f"{count}"): + assert output == f'{{"count":"{count}"}}', error() + +@TestScenario +def decrypt_unique(self): + """Check decrypting column when reading multiple entries + encrypted with the different parameters for each user + from a table. + """ + node = self.context.node + key = f"{'1' * 64}" + iv = f"{'2' * 64}" + aad = "some random aad" + + with table("user_table", """ + CREATE TABLE {name} + ( + id UInt64, + date Nullable(Date), + name Nullable(String), + secret Nullable(String) + ) + ENGINE = Memory() + """): + + user_modes = [] + user_keys = [] + + with When("I get encrypted data"): + user_id = 0 + values = [] + + for mode, key_len, iv_len, aad_len in modes: + if "gcm" in mode: + continue + user_modes.append(mode) + user_keys.append(f"'{key[:key_len]}'") + + with When(f"I get encrypted data for user {user_id}"): + encrypted_secret = node.query( + f"""SELECT hex(encrypt({user_modes[-1]}, 'secret', {user_keys[-1]}))""" + ).output.strip() + values.append(f"({user_id}, '2020-01-01', 'user{user_id}', unhex('{encrypted_secret}'))") + + user_id += 1 + + with And("I insert encrypted data for all users"): + node.query( + "INSERT INTO user_table\n" + " (id, date, name, secret)\n" + f"VALUES {', '.join(values)}") + + with And("I read decrypted data for all users"): + output = node.query(textwrap.dedent(f""" + SELECT + count() AS count + FROM + ( + SELECT + [{",".join(user_modes)}] AS modes, + [{",".join(user_keys)}] AS keys, + name, + decrypt(modes[id], secret, keys[id]) AS secret + FROM user_table + ) + WHERE + secret = 'secret' + FORMAT JSONEachRow + """)).output.strip() + + with Then("I should get back the expected result", description=f"{count}"): + assert output == f'{{"count":"{count}"}}', error() + +@TestFeature +@Name("select") +def feature(self, node="clickhouse1"): + """Check encryption functions when used during table querying. + """ + self.context.node = self.context.cluster.node(node) + + for scenario in loads(current_module(), Scenario): + Scenario(run=scenario, flags=TE) diff --git a/tests/testflows/aes_encryption/tests/compatibility/snapshots/insert.py.insert.snapshot b/tests/testflows/aes_encryption/tests/compatibility/snapshots/insert.py.insert.snapshot new file mode 100644 index 00000000000..93d915bb9d6 --- /dev/null +++ b/tests/testflows/aes_encryption/tests/compatibility/snapshots/insert.py.insert.snapshot @@ -0,0 +1,192 @@ +aes_encrypt_mysql_input_example_mode_aes_128_ecb_key_16_iv_None = r"""'2020-01-01\tuser0\t8C9598C3C8D8AC241DDF0D1B22020104\n2020-01-02\tuser1\tC5ECE31A240069D8F169B9F8CF687779\n2020-01-03\tuser2\t9FCFA4B05DD49D2B24BA61091F963CE3'""" + +aes_encrypt_mysql_input_example_mode_aes_128_ecb_key_24_iv_None = r"""'2020-01-01\tuser0\tB418FF12BCBF9E42FA7C19D6EE26BF0B\n2020-01-02\tuser1\t3147A3FEE47DF418D1D75CBC1BC14DE6\n2020-01-03\tuser2\tAECEFD40C6632A0FC033D040E44CCBCC'""" + +aes_encrypt_mysql_input_example_mode_aes_192_ecb_key_24_iv_None = r"""'2020-01-01\tuser0\t897F14C4E497962D986A7E7EA57AA043\n2020-01-02\tuser1\tED84AF2B3447113DA451E4577F649E36\n2020-01-03\tuser2\t4976F9D5AE195E61694A9ADCDD8A076F'""" + +aes_encrypt_mysql_input_example_mode_aes_192_ecb_key_32_iv_None = r"""'2020-01-01\tuser0\t044E715357AF77234FD95359666CAFF3\n2020-01-02\tuser1\tB633EF852CE85B4C97827401FD9B606B\n2020-01-03\tuser2\t2AFF7052C748E4BC3BDA8460AFD5A21D'""" + +aes_encrypt_mysql_input_example_mode_aes_256_ecb_key_32_iv_None = r"""'2020-01-01\tuser0\tBABD6C071FDEE1C9A33877006FBB0BE6\n2020-01-02\tuser1\t7753E81D1DB9DC91FC8148E88B3E9526\n2020-01-03\tuser2\tD77D1A8DF82C2273BF0D19A14526531F'""" + +aes_encrypt_mysql_input_example_mode_aes_256_ecb_key_64_iv_None = r"""'2020-01-01\tuser0\tBFFEC9DF7285A3EC799C941E1450839C\n2020-01-02\tuser1\t3EA0ECBD06326D227A7B9519B1A2955D\n2020-01-03\tuser2\t1478C57DD49523ABDB83A0917F0EDA60'""" + +aes_encrypt_mysql_input_example_mode_aes_128_cbc_key_16_iv_None = r"""'2020-01-01\tuser0\t8C9598C3C8D8AC241DDF0D1B22020104\n2020-01-02\tuser1\tC5ECE31A240069D8F169B9F8CF687779\n2020-01-03\tuser2\t9FCFA4B05DD49D2B24BA61091F963CE3'""" + +aes_encrypt_mysql_input_example_mode_aes_192_cbc_key_24_iv_None = r"""'2020-01-01\tuser0\t897F14C4E497962D986A7E7EA57AA043\n2020-01-02\tuser1\tED84AF2B3447113DA451E4577F649E36\n2020-01-03\tuser2\t4976F9D5AE195E61694A9ADCDD8A076F'""" + +aes_encrypt_mysql_input_example_mode_aes_256_cbc_key_32_iv_None = r"""'2020-01-01\tuser0\tBABD6C071FDEE1C9A33877006FBB0BE6\n2020-01-02\tuser1\t7753E81D1DB9DC91FC8148E88B3E9526\n2020-01-03\tuser2\tD77D1A8DF82C2273BF0D19A14526531F'""" + +aes_encrypt_mysql_input_example_mode_aes_128_cbc_key_16_iv_16 = r"""'2020-01-01\tuser0\tFC93C1D5E5E3B054C1F3A5692AAC0A61\n2020-01-02\tuser1\tD6DBC76ABCB14B7C6D93F1A5FCA66B9C\n2020-01-03\tuser2\tD4F4158A650D01EB505CC72EFE455486'""" + +aes_encrypt_mysql_input_example_mode_aes_128_cbc_key_24_iv_24 = r"""'2020-01-01\tuser0\t26CEE6B6EBDDE1BF887FDEB75F28FB52\n2020-01-02\tuser1\tF9EC1A75BEEFF70B4DEB39AAD075CEFF\n2020-01-03\tuser2\t3FF84AB3BD40FAEEF70F06BCF6AF9C42'""" + +aes_encrypt_mysql_input_example_mode_aes_192_cbc_key_24_iv_16 = r"""'2020-01-01\tuser0\t0E3BAF7F4E0BFCFFAE2589B67F71E277\n2020-01-02\tuser1\t2581CCEE9ABE5770480901D65B3D9222\n2020-01-03\tuser2\tED9F3BD8DB12FDF9F2462FFA572361E7'""" + +aes_encrypt_mysql_input_example_mode_aes_192_cbc_key_32_iv_32 = r"""'2020-01-01\tuser0\t07371B5DE2E378EE08A3A8B6B9FEAD13\n2020-01-02\tuser1\t3C0BF5D187421ECFFD3E00474A154452\n2020-01-03\tuser2\t05B253FA783D78D864AF7C4D5E6A492D'""" + +aes_encrypt_mysql_input_example_mode_aes_256_cbc_key_32_iv_16 = r"""'2020-01-01\tuser0\t72AC7BA6F283EA94A3C33C4D3E51C7D3\n2020-01-02\tuser1\tDACBBE79062F1C721A01CEEE3E85524F\n2020-01-03\tuser2\tFF5A09D19E5EB2ADD94581308588E44A'""" + +aes_encrypt_mysql_input_example_mode_aes_256_cbc_key_64_iv_64 = r"""'2020-01-01\tuser0\t573924F0BB4AA1780D45DB6451F123D6\n2020-01-02\tuser1\t007A54AA7ADE8EF844D28936486D75BC\n2020-01-03\tuser2\tAA7249B514398FE1EE827C44402BCE57'""" + +aes_encrypt_mysql_input_example_mode_aes_128_cfb1_key_16_iv_None = r"""'2020-01-01\tuser0\t750BE8662F57A095EC0E610C\n2020-01-02\tuser1\t750BE8662E444A6284C0FC72\n2020-01-03\tuser2\t750BE8662C000B61CDCF1C94'""" + +aes_encrypt_mysql_input_example_mode_aes_192_cfb1_key_24_iv_None = r"""'2020-01-01\tuser0\t5DCC67A043EB776D8B7F5B70\n2020-01-02\tuser1\t5DCC67A042B46DFCC10EFD66\n2020-01-03\tuser2\t5DCC67A040243A8C1346D2DD'""" + +aes_encrypt_mysql_input_example_mode_aes_256_cfb1_key_32_iv_None = r"""'2020-01-01\tuser0\tFAAC1A7D2CE844F8DEB4C44E\n2020-01-02\tuser1\tFAAC1A7D2DF85A43828C0FF8\n2020-01-03\tuser2\tFAAC1A7D2FC7582CCEFCF330'""" + +aes_encrypt_mysql_input_example_mode_aes_128_cfb1_key_16_iv_16 = r"""'2020-01-01\tuser0\t7670A865D13B1B65AD46F8ED\n2020-01-02\tuser1\t7670A865D046007A1E218286\n2020-01-03\tuser2\t7670A865D2E5B091492ECCFB'""" + +aes_encrypt_mysql_input_example_mode_aes_128_cfb1_key_24_iv_24 = r"""'2020-01-01\tuser0\t51EADDE82195C31118D0C171\n2020-01-02\tuser1\t51EADDE82009A46518270271\n2020-01-03\tuser2\t51EADDE8235CB38F95766481'""" + +aes_encrypt_mysql_input_example_mode_aes_192_cfb1_key_24_iv_16 = r"""'2020-01-01\tuser0\t7F38C051539074C0A635C937\n2020-01-02\tuser1\t7F38C051520A30DFACBE9564\n2020-01-03\tuser2\t7F38C051500DA29FF0E7B799'""" + +aes_encrypt_mysql_input_example_mode_aes_192_cfb1_key_32_iv_32 = r"""'2020-01-01\tuser0\t2067186DB91666DE730D0708\n2020-01-02\tuser1\t2067186DB83E2E8B0019F839\n2020-01-03\tuser2\t2067186DBB540332BFC84955'""" + +aes_encrypt_mysql_input_example_mode_aes_256_cfb1_key_32_iv_16 = r"""'2020-01-01\tuser0\t0A216A58A5C0A33215E8E722\n2020-01-02\tuser1\t0A216A58A4E94067ABF030B6\n2020-01-03\tuser2\t0A216A58A6822CAB0318C632'""" + +aes_encrypt_mysql_input_example_mode_aes_256_cfb1_key_64_iv_64 = r"""'2020-01-01\tuser0\t81BD636E1BF4CA02399943E3\n2020-01-02\tuser1\t81BD636E1A93D5D6DD9DCD8D\n2020-01-03\tuser2\t81BD636E18F15168D19C8117'""" + +aes_encrypt_mysql_input_example_mode_aes_128_cfb8_key_16_iv_None = r"""'2020-01-01\tuser0\t650D96B9698D20DB12E2E437\n2020-01-02\tuser1\t650D96B968F00D16ABF2852E\n2020-01-03\tuser2\t650D96B96B8141F425E60D6B'""" + +aes_encrypt_mysql_input_example_mode_aes_192_cfb8_key_24_iv_None = r"""'2020-01-01\tuser0\t72C4724B2F528724A12041C0\n2020-01-02\tuser1\t72C4724B2EF3C6A6FF9E09A9\n2020-01-03\tuser2\t72C4724B2D6EAB1D47709E15'""" + +aes_encrypt_mysql_input_example_mode_aes_256_cfb8_key_32_iv_None = r"""'2020-01-01\tuser0\tC5FD6C94961765ED204F2BCA\n2020-01-02\tuser1\tC5FD6C9497AB1C1AF1DE671C\n2020-01-03\tuser2\tC5FD6C949491F4A3EA5069B3'""" + +aes_encrypt_mysql_input_example_mode_aes_128_cfb8_key_16_iv_16 = r"""'2020-01-01\tuser0\t471D217E9CA3593FFEC955C8\n2020-01-02\tuser1\t471D217E9D7F484D85F81F19\n2020-01-03\tuser2\t471D217E9EBBFD2EA9841008'""" + +aes_encrypt_mysql_input_example_mode_aes_128_cfb8_key_24_iv_24 = r"""'2020-01-01\tuser0\t2EE6147B830481BE36CBE350\n2020-01-02\tuser1\t2EE6147B82DE8F3197AF17A6\n2020-01-03\tuser2\t2EE6147B81FF826E798A0355'""" + +aes_encrypt_mysql_input_example_mode_aes_192_cfb8_key_24_iv_16 = r"""'2020-01-01\tuser0\t1D98EFFAEB9907457BD3FCB2\n2020-01-02\tuser1\t1D98EFFAEA2D930825C6AE22\n2020-01-03\tuser2\t1D98EFFAE92C1D018438B98B'""" + +aes_encrypt_mysql_input_example_mode_aes_192_cfb8_key_32_iv_32 = r"""'2020-01-01\tuser0\t4410165F7DCFDDBB1B15573F\n2020-01-02\tuser1\t4410165F7CFE6A0D2FD5CA9C\n2020-01-03\tuser2\t4410165F7FE8E0C081B3FB7B'""" + +aes_encrypt_mysql_input_example_mode_aes_256_cfb8_key_32_iv_16 = r"""'2020-01-01\tuser0\t1C07B443BB7D7D60E9999C1D\n2020-01-02\tuser1\t1C07B443BA9674A3F68FF3FE\n2020-01-03\tuser2\t1C07B443B95F4B68161A616F'""" + +aes_encrypt_mysql_input_example_mode_aes_256_cfb8_key_64_iv_64 = r"""'2020-01-01\tuser0\tA6D2368A5F177157D73FBD9D\n2020-01-02\tuser1\tA6D2368A5E695ADF99475359\n2020-01-03\tuser2\tA6D2368A5DB96AFD43311124'""" + +aes_encrypt_mysql_input_example_mode_aes_128_cfb128_key_16_iv_None = r"""'2020-01-01\tuser0\t65ACA4C7C6338E0F7EB60812\n2020-01-02\tuser1\t65ACA4C7C7338E0F7EB60812\n2020-01-03\tuser2\t65ACA4C7C4338E0F7EB60812'""" + +aes_encrypt_mysql_input_example_mode_aes_192_cfb128_key_24_iv_None = r"""'2020-01-01\tuser0\t72C47CEF0D63D2FB4FBC3CE4\n2020-01-02\tuser1\t72C47CEF0C63D2FB4FBC3CE4\n2020-01-03\tuser2\t72C47CEF0F63D2FB4FBC3CE4'""" + +aes_encrypt_mysql_input_example_mode_aes_256_cfb128_key_32_iv_None = r"""'2020-01-01\tuser0\tC5FDAAECF7B42C68180AA151\n2020-01-02\tuser1\tC5FDAAECF6B42C68180AA151\n2020-01-03\tuser2\tC5FDAAECF5B42C68180AA151'""" + +aes_encrypt_mysql_input_example_mode_aes_128_cfb128_key_16_iv_16 = r"""'2020-01-01\tuser0\t47FBCCF6ED598C3D8A4B05C5\n2020-01-02\tuser1\t47FBCCF6EC598C3D8A4B05C5\n2020-01-03\tuser2\t47FBCCF6EF598C3D8A4B05C5'""" + +aes_encrypt_mysql_input_example_mode_aes_128_cfb128_key_24_iv_24 = r"""'2020-01-01\tuser0\t2E046787D9EFFED25D69C908\n2020-01-02\tuser1\t2E046787D8EFFED25D69C908\n2020-01-03\tuser2\t2E046787DBEFFED25D69C908'""" + +aes_encrypt_mysql_input_example_mode_aes_192_cfb128_key_24_iv_16 = r"""'2020-01-01\tuser0\t1DB482E0874F04D4E734607A\n2020-01-02\tuser1\t1DB482E0864F04D4E734607A\n2020-01-03\tuser2\t1DB482E0854F04D4E734607A'""" + +aes_encrypt_mysql_input_example_mode_aes_192_cfb128_key_32_iv_32 = r"""'2020-01-01\tuser0\t44D3EB069FF443A121590842\n2020-01-02\tuser1\t44D3EB069EF443A121590842\n2020-01-03\tuser2\t44D3EB069DF443A121590842'""" + +aes_encrypt_mysql_input_example_mode_aes_256_cfb128_key_32_iv_16 = r"""'2020-01-01\tuser0\t1C2BED650C8137ED139226D3\n2020-01-02\tuser1\t1C2BED650D8137ED139226D3\n2020-01-03\tuser2\t1C2BED650E8137ED139226D3'""" + +aes_encrypt_mysql_input_example_mode_aes_256_cfb128_key_64_iv_64 = r"""'2020-01-01\tuser0\tA69DAA2E8B265618D25D5FE4\n2020-01-02\tuser1\tA69DAA2E8A265618D25D5FE4\n2020-01-03\tuser2\tA69DAA2E89265618D25D5FE4'""" + +aes_encrypt_mysql_input_example_mode_aes_128_ofb_key_16_iv_None = r"""'2020-01-01\tuser0\t65ACA4C7C6338E0F7EB60812\n2020-01-02\tuser1\t65ACA4C7C7338E0F7EB60812\n2020-01-03\tuser2\t65ACA4C7C4338E0F7EB60812'""" + +aes_encrypt_mysql_input_example_mode_aes_192_ofb_key_24_iv_None = r"""'2020-01-01\tuser0\t72C47CEF0D63D2FB4FBC3CE4\n2020-01-02\tuser1\t72C47CEF0C63D2FB4FBC3CE4\n2020-01-03\tuser2\t72C47CEF0F63D2FB4FBC3CE4'""" + +aes_encrypt_mysql_input_example_mode_aes_256_ofb_key_32_iv_None = r"""'2020-01-01\tuser0\tC5FDAAECF7B42C68180AA151\n2020-01-02\tuser1\tC5FDAAECF6B42C68180AA151\n2020-01-03\tuser2\tC5FDAAECF5B42C68180AA151'""" + +aes_encrypt_mysql_input_example_mode_aes_128_ofb_key_16_iv_16 = r"""'2020-01-01\tuser0\t47FBCCF6ED598C3D8A4B05C5\n2020-01-02\tuser1\t47FBCCF6EC598C3D8A4B05C5\n2020-01-03\tuser2\t47FBCCF6EF598C3D8A4B05C5'""" + +aes_encrypt_mysql_input_example_mode_aes_128_ofb_key_24_iv_24 = r"""'2020-01-01\tuser0\t2E046787D9EFFED25D69C908\n2020-01-02\tuser1\t2E046787D8EFFED25D69C908\n2020-01-03\tuser2\t2E046787DBEFFED25D69C908'""" + +aes_encrypt_mysql_input_example_mode_aes_192_ofb_key_24_iv_16 = r"""'2020-01-01\tuser0\t1DB482E0874F04D4E734607A\n2020-01-02\tuser1\t1DB482E0864F04D4E734607A\n2020-01-03\tuser2\t1DB482E0854F04D4E734607A'""" + +aes_encrypt_mysql_input_example_mode_aes_192_ofb_key_32_iv_32 = r"""'2020-01-01\tuser0\t44D3EB069FF443A121590842\n2020-01-02\tuser1\t44D3EB069EF443A121590842\n2020-01-03\tuser2\t44D3EB069DF443A121590842'""" + +aes_encrypt_mysql_input_example_mode_aes_256_ofb_key_32_iv_16 = r"""'2020-01-01\tuser0\t1C2BED650C8137ED139226D3\n2020-01-02\tuser1\t1C2BED650D8137ED139226D3\n2020-01-03\tuser2\t1C2BED650E8137ED139226D3'""" + +aes_encrypt_mysql_input_example_mode_aes_256_ofb_key_64_iv_64 = r"""'2020-01-01\tuser0\tA69DAA2E8B265618D25D5FE4\n2020-01-02\tuser1\tA69DAA2E8A265618D25D5FE4\n2020-01-03\tuser2\tA69DAA2E89265618D25D5FE4'""" + +encrypt_input_example_mode_aes_128_ecb_iv_None_aad_None = r"""'2020-01-01\tuser0\t8C9598C3C8D8AC241DDF0D1B22020104\n2020-01-02\tuser1\tC5ECE31A240069D8F169B9F8CF687779\n2020-01-03\tuser2\t9FCFA4B05DD49D2B24BA61091F963CE3'""" + +encrypt_input_example_mode_aes_192_ecb_iv_None_aad_None = r"""'2020-01-01\tuser0\t897F14C4E497962D986A7E7EA57AA043\n2020-01-02\tuser1\tED84AF2B3447113DA451E4577F649E36\n2020-01-03\tuser2\t4976F9D5AE195E61694A9ADCDD8A076F'""" + +encrypt_input_example_mode_aes_256_ecb_iv_None_aad_None = r"""'2020-01-01\tuser0\tBABD6C071FDEE1C9A33877006FBB0BE6\n2020-01-02\tuser1\t7753E81D1DB9DC91FC8148E88B3E9526\n2020-01-03\tuser2\tD77D1A8DF82C2273BF0D19A14526531F'""" + +encrypt_input_example_mode_aes_128_cbc_iv_None_aad_None = r"""'2020-01-01\tuser0\t8C9598C3C8D8AC241DDF0D1B22020104\n2020-01-02\tuser1\tC5ECE31A240069D8F169B9F8CF687779\n2020-01-03\tuser2\t9FCFA4B05DD49D2B24BA61091F963CE3'""" + +encrypt_input_example_mode_aes_192_cbc_iv_None_aad_None = r"""'2020-01-01\tuser0\t897F14C4E497962D986A7E7EA57AA043\n2020-01-02\tuser1\tED84AF2B3447113DA451E4577F649E36\n2020-01-03\tuser2\t4976F9D5AE195E61694A9ADCDD8A076F'""" + +encrypt_input_example_mode_aes_256_cbc_iv_None_aad_None = r"""'2020-01-01\tuser0\tBABD6C071FDEE1C9A33877006FBB0BE6\n2020-01-02\tuser1\t7753E81D1DB9DC91FC8148E88B3E9526\n2020-01-03\tuser2\tD77D1A8DF82C2273BF0D19A14526531F'""" + +encrypt_input_example_mode_aes_128_cbc_iv_16_aad_None = r"""'2020-01-01\tuser0\tFC93C1D5E5E3B054C1F3A5692AAC0A61\n2020-01-02\tuser1\tD6DBC76ABCB14B7C6D93F1A5FCA66B9C\n2020-01-03\tuser2\tD4F4158A650D01EB505CC72EFE455486'""" + +encrypt_input_example_mode_aes_192_cbc_iv_16_aad_None = r"""'2020-01-01\tuser0\t0E3BAF7F4E0BFCFFAE2589B67F71E277\n2020-01-02\tuser1\t2581CCEE9ABE5770480901D65B3D9222\n2020-01-03\tuser2\tED9F3BD8DB12FDF9F2462FFA572361E7'""" + +encrypt_input_example_mode_aes_256_cbc_iv_16_aad_None = r"""'2020-01-01\tuser0\t72AC7BA6F283EA94A3C33C4D3E51C7D3\n2020-01-02\tuser1\tDACBBE79062F1C721A01CEEE3E85524F\n2020-01-03\tuser2\tFF5A09D19E5EB2ADD94581308588E44A'""" + +encrypt_input_example_mode_aes_128_cfb1_iv_None_aad_None = r"""'2020-01-01\tuser0\t750BE8662F57A095EC0E610C\n2020-01-02\tuser1\t750BE8662E444A6284C0FC72\n2020-01-03\tuser2\t750BE8662C000B61CDCF1C94'""" + +encrypt_input_example_mode_aes_192_cfb1_iv_None_aad_None = r"""'2020-01-01\tuser0\t5DCC67A043EB776D8B7F5B70\n2020-01-02\tuser1\t5DCC67A042B46DFCC10EFD66\n2020-01-03\tuser2\t5DCC67A040243A8C1346D2DD'""" + +encrypt_input_example_mode_aes_256_cfb1_iv_None_aad_None = r"""'2020-01-01\tuser0\tFAAC1A7D2CE844F8DEB4C44E\n2020-01-02\tuser1\tFAAC1A7D2DF85A43828C0FF8\n2020-01-03\tuser2\tFAAC1A7D2FC7582CCEFCF330'""" + +encrypt_input_example_mode_aes_128_cfb1_iv_16_aad_None = r"""'2020-01-01\tuser0\t7670A865D13B1B65AD46F8ED\n2020-01-02\tuser1\t7670A865D046007A1E218286\n2020-01-03\tuser2\t7670A865D2E5B091492ECCFB'""" + +encrypt_input_example_mode_aes_192_cfb1_iv_16_aad_None = r"""'2020-01-01\tuser0\t7F38C051539074C0A635C937\n2020-01-02\tuser1\t7F38C051520A30DFACBE9564\n2020-01-03\tuser2\t7F38C051500DA29FF0E7B799'""" + +encrypt_input_example_mode_aes_256_cfb1_iv_16_aad_None = r"""'2020-01-01\tuser0\t0A216A58A5C0A33215E8E722\n2020-01-02\tuser1\t0A216A58A4E94067ABF030B6\n2020-01-03\tuser2\t0A216A58A6822CAB0318C632'""" + +encrypt_input_example_mode_aes_128_cfb8_iv_None_aad_None = r"""'2020-01-01\tuser0\t650D96B9698D20DB12E2E437\n2020-01-02\tuser1\t650D96B968F00D16ABF2852E\n2020-01-03\tuser2\t650D96B96B8141F425E60D6B'""" + +encrypt_input_example_mode_aes_192_cfb8_iv_None_aad_None = r"""'2020-01-01\tuser0\t72C4724B2F528724A12041C0\n2020-01-02\tuser1\t72C4724B2EF3C6A6FF9E09A9\n2020-01-03\tuser2\t72C4724B2D6EAB1D47709E15'""" + +encrypt_input_example_mode_aes_256_cfb8_iv_None_aad_None = r"""'2020-01-01\tuser0\tC5FD6C94961765ED204F2BCA\n2020-01-02\tuser1\tC5FD6C9497AB1C1AF1DE671C\n2020-01-03\tuser2\tC5FD6C949491F4A3EA5069B3'""" + +encrypt_input_example_mode_aes_128_cfb8_iv_16_aad_None = r"""'2020-01-01\tuser0\t471D217E9CA3593FFEC955C8\n2020-01-02\tuser1\t471D217E9D7F484D85F81F19\n2020-01-03\tuser2\t471D217E9EBBFD2EA9841008'""" + +encrypt_input_example_mode_aes_192_cfb8_iv_16_aad_None = r"""'2020-01-01\tuser0\t1D98EFFAEB9907457BD3FCB2\n2020-01-02\tuser1\t1D98EFFAEA2D930825C6AE22\n2020-01-03\tuser2\t1D98EFFAE92C1D018438B98B'""" + +encrypt_input_example_mode_aes_256_cfb8_iv_16_aad_None = r"""'2020-01-01\tuser0\t1C07B443BB7D7D60E9999C1D\n2020-01-02\tuser1\t1C07B443BA9674A3F68FF3FE\n2020-01-03\tuser2\t1C07B443B95F4B68161A616F'""" + +encrypt_input_example_mode_aes_128_cfb128_iv_None_aad_None = r"""'2020-01-01\tuser0\t65ACA4C7C6338E0F7EB60812\n2020-01-02\tuser1\t65ACA4C7C7338E0F7EB60812\n2020-01-03\tuser2\t65ACA4C7C4338E0F7EB60812'""" + +encrypt_input_example_mode_aes_192_cfb128_iv_None_aad_None = r"""'2020-01-01\tuser0\t72C47CEF0D63D2FB4FBC3CE4\n2020-01-02\tuser1\t72C47CEF0C63D2FB4FBC3CE4\n2020-01-03\tuser2\t72C47CEF0F63D2FB4FBC3CE4'""" + +encrypt_input_example_mode_aes_256_cfb128_iv_None_aad_None = r"""'2020-01-01\tuser0\tC5FDAAECF7B42C68180AA151\n2020-01-02\tuser1\tC5FDAAECF6B42C68180AA151\n2020-01-03\tuser2\tC5FDAAECF5B42C68180AA151'""" + +encrypt_input_example_mode_aes_128_cfb128_iv_16_aad_None = r"""'2020-01-01\tuser0\t47FBCCF6ED598C3D8A4B05C5\n2020-01-02\tuser1\t47FBCCF6EC598C3D8A4B05C5\n2020-01-03\tuser2\t47FBCCF6EF598C3D8A4B05C5'""" + +encrypt_input_example_mode_aes_192_cfb128_iv_16_aad_None = r"""'2020-01-01\tuser0\t1DB482E0874F04D4E734607A\n2020-01-02\tuser1\t1DB482E0864F04D4E734607A\n2020-01-03\tuser2\t1DB482E0854F04D4E734607A'""" + +encrypt_input_example_mode_aes_256_cfb128_iv_16_aad_None = r"""'2020-01-01\tuser0\t1C2BED650C8137ED139226D3\n2020-01-02\tuser1\t1C2BED650D8137ED139226D3\n2020-01-03\tuser2\t1C2BED650E8137ED139226D3'""" + +encrypt_input_example_mode_aes_128_ofb_iv_None_aad_None = r"""'2020-01-01\tuser0\t65ACA4C7C6338E0F7EB60812\n2020-01-02\tuser1\t65ACA4C7C7338E0F7EB60812\n2020-01-03\tuser2\t65ACA4C7C4338E0F7EB60812'""" + +encrypt_input_example_mode_aes_192_ofb_iv_None_aad_None = r"""'2020-01-01\tuser0\t72C47CEF0D63D2FB4FBC3CE4\n2020-01-02\tuser1\t72C47CEF0C63D2FB4FBC3CE4\n2020-01-03\tuser2\t72C47CEF0F63D2FB4FBC3CE4'""" + +encrypt_input_example_mode_aes_256_ofb_iv_None_aad_None = r"""'2020-01-01\tuser0\tC5FDAAECF7B42C68180AA151\n2020-01-02\tuser1\tC5FDAAECF6B42C68180AA151\n2020-01-03\tuser2\tC5FDAAECF5B42C68180AA151'""" + +encrypt_input_example_mode_aes_128_ofb_iv_16_aad_None = r"""'2020-01-01\tuser0\t47FBCCF6ED598C3D8A4B05C5\n2020-01-02\tuser1\t47FBCCF6EC598C3D8A4B05C5\n2020-01-03\tuser2\t47FBCCF6EF598C3D8A4B05C5'""" + +encrypt_input_example_mode_aes_192_ofb_iv_16_aad_None = r"""'2020-01-01\tuser0\t1DB482E0874F04D4E734607A\n2020-01-02\tuser1\t1DB482E0864F04D4E734607A\n2020-01-03\tuser2\t1DB482E0854F04D4E734607A'""" + +encrypt_input_example_mode_aes_256_ofb_iv_16_aad_None = r"""'2020-01-01\tuser0\t1C2BED650C8137ED139226D3\n2020-01-02\tuser1\t1C2BED650D8137ED139226D3\n2020-01-03\tuser2\t1C2BED650E8137ED139226D3'""" + +encrypt_input_example_mode_aes_128_gcm_iv_12_aad_None = r"""'2020-01-01\tuser0\t98E5A430C4A01C4429B0F37A4B3CDBC2BDB491651A36D7F904E231E0\n2020-01-02\tuser1\t98E5A430C5A01C4429B0F37A6E108322C2863C1ABF9BC7098CD369DB\n2020-01-03\tuser2\t98E5A430C6A01C4429B0F37A01646A0243D1CB9A516CF61814808196'""" + +encrypt_input_example_mode_aes_192_gcm_iv_12_aad_None = r"""'2020-01-01\tuser0\t3F89C3B657596C86202B59F4350807B364DA1E94682EAB679617575D\n2020-01-02\tuser1\t3F89C3B656596C86202B59F4FA03602ED37788B312FDE2AFDBB7F097\n2020-01-03\tuser2\t3F89C3B655596C86202B59F4691EC8880B8132DA9D8838F70D5618C8'""" + +encrypt_input_example_mode_aes_256_gcm_iv_12_aad_None = r"""'2020-01-01\tuser0\t23B80948CCDB54DC6D0B62F215132A07B30BA6F15593B4F946726B11\n2020-01-02\tuser1\t23B80948CDDB54DC6D0B62F2A01C1BAE07B8D6B26F60116040CDDB55\n2020-01-03\tuser2\t23B80948CEDB54DC6D0B62F2BD0D4954DA6D46772074FFCB4B0D0B98'""" + +encrypt_input_example_mode_aes_128_gcm_iv_12_aad_True = r"""'2020-01-01\tuser0\t98E5A430C4A01C4429B0F37AF9758E0EA4B44A50A7F964C8E51A913C\n2020-01-02\tuser1\t98E5A430C5A01C4429B0F37ADC59D6EEDB86E72F025474386D2BC907\n2020-01-03\tuser2\t98E5A430C6A01C4429B0F37AB32D3FCE5AD110AFECA34529F578214A'""" + +encrypt_input_example_mode_aes_192_gcm_iv_12_aad_True = r"""'2020-01-01\tuser0\t3F89C3B657596C86202B59F4B6C662DFF6347EF3B46C170A2F80E946\n2020-01-02\tuser1\t3F89C3B656596C86202B59F479CD05424199E8D4CEBF5EC262204E8C\n2020-01-03\tuser2\t3F89C3B655596C86202B59F4EAD0ADE4996F52BD41CA849AB4C1A6D3'""" + +encrypt_input_example_mode_aes_256_gcm_iv_12_aad_True = r"""'2020-01-01\tuser0\t23B80948CCDB54DC6D0B62F28787710BBF3F9A594C387B9F7CA2372B\n2020-01-02\tuser1\t23B80948CDDB54DC6D0B62F2328840A20B8CEA1A76CBDE067A1D876F\n2020-01-03\tuser2\t23B80948CEDB54DC6D0B62F22F991258D6597ADF39DF30AD71DD57A2'""" + +encrypt_input_example_mode_aes_128_ctr_iv_None_aad_None = r"""'2020-01-01\tuser0\t65ACA4C7C6338E0F7EB60812\n2020-01-02\tuser1\t65ACA4C7C7338E0F7EB60812\n2020-01-03\tuser2\t65ACA4C7C4338E0F7EB60812'""" + +encrypt_input_example_mode_aes_192_ctr_iv_None_aad_None = r"""'2020-01-01\tuser0\t72C47CEF0D63D2FB4FBC3CE4\n2020-01-02\tuser1\t72C47CEF0C63D2FB4FBC3CE4\n2020-01-03\tuser2\t72C47CEF0F63D2FB4FBC3CE4'""" + +encrypt_input_example_mode_aes_256_ctr_iv_None_aad_None = r"""'2020-01-01\tuser0\tC5FDAAECF7B42C68180AA151\n2020-01-02\tuser1\tC5FDAAECF6B42C68180AA151\n2020-01-03\tuser2\tC5FDAAECF5B42C68180AA151'""" + +encrypt_input_example_mode_aes_128_ctr_iv_16_aad_None = r"""'2020-01-01\tuser0\t47FBCCF6ED598C3D8A4B05C5\n2020-01-02\tuser1\t47FBCCF6EC598C3D8A4B05C5\n2020-01-03\tuser2\t47FBCCF6EF598C3D8A4B05C5'""" + +encrypt_input_example_mode_aes_192_ctr_iv_16_aad_None = r"""'2020-01-01\tuser0\t1DB482E0874F04D4E734607A\n2020-01-02\tuser1\t1DB482E0864F04D4E734607A\n2020-01-03\tuser2\t1DB482E0854F04D4E734607A'""" + +encrypt_input_example_mode_aes_256_ctr_iv_16_aad_None = r"""'2020-01-01\tuser0\t1C2BED650C8137ED139226D3\n2020-01-02\tuser1\t1C2BED650D8137ED139226D3\n2020-01-03\tuser2\t1C2BED650E8137ED139226D3'""" + diff --git a/tests/testflows/aes_encryption/tests/decrypt.py b/tests/testflows/aes_encryption/tests/decrypt.py new file mode 100644 index 00000000000..9571d965c0e --- /dev/null +++ b/tests/testflows/aes_encryption/tests/decrypt.py @@ -0,0 +1,634 @@ +# -*- coding: utf-8 -*- +import os +from importlib.machinery import SourceFileLoader + +from testflows.core import * +from testflows.core.name import basename +from testflows.asserts.helpers import varname +from testflows.asserts import error + +from aes_encryption.requirements.requirements import * +from aes_encryption.tests.common import * + +@TestOutline +def decrypt(self, ciphertext=None, key=None, mode=None, iv=None, aad=None, exitcode=0, message=None, step=When, cast=None, endcast=None, compare=None, no_checks=False): + """Execute `decrypt` function with the specified parameters. + """ + params = [] + if mode is not None: + params.append(mode) + if ciphertext is not None: + params.append(ciphertext) + if key is not None: + params.append(key) + if iv is not None: + params.append(iv) + if aad is not None: + params.append(aad) + + sql = f"decrypt(" + ", ".join(params) + ")" + if cast: + sql = f"{cast}({sql}){endcast or ''}" + if compare: + sql = f"{compare} = {sql}" + sql = f"SELECT {sql}" + + return current().context.node.query(sql, step=step, exitcode=exitcode, message=message, no_checks=no_checks) + +@TestScenario +@Requirements( + RQ_SRS008_AES_Decrypt_Function_Parameters_CipherText("1.0"), +) +def invalid_ciphertext(self): + """Check that `decrypt` function does not crash when invalid + `ciphertext` is passed as the first parameter. + """ + key = f"{'1' * 36}" + iv = f"{'2' * 16}" + aad = "some random aad" + invalid_ciphertexts = plaintexts + + for mode, key_len, iv_len, aad_len in modes: + with Example(f"""mode={mode.strip("'")} iv={iv_len} aad={aad_len}"""): + d_iv = None if not iv_len else f"'{iv[:iv_len]}'" + d_aad = None if not aad_len else f"'{aad}'" + + for datatype, ciphertext in invalid_ciphertexts: + if datatype in ["NULL"]: + continue + with When(f"invalid ciphertext={ciphertext}"): + if "cfb" in mode or "ofb" in mode or "ctr" in mode: + decrypt(ciphertext=ciphertext, key=f"'{key[:key_len]}'", mode=mode, iv=d_iv, aad=d_aad, cast="hex") + else: + with When("I execute decrypt function"): + r = decrypt(ciphertext=ciphertext, key=f"'{key[:key_len]}'", mode=mode, iv=d_iv, aad=d_aad, no_checks=True, step=By) + with Then("exitcode is not zero"): + assert r.exitcode in [198, 36] + with And("exception is present in the output"): + assert "DB::Exception:" in r.output + +@TestScenario +@Requirements( + RQ_SRS008_AES_Functions_InvalidParameters("1.0") +) +def invalid_parameters(self): + """Check that `decrypt` function returns an error when + we call it with invalid parameters. + """ + ciphertext = "unhex('AA1826B5F66A903C888D5DCDA9FB63D1D9CCA10EC55F59D6C00D37')" + + with Example("no parameters"): + decrypt(exitcode=42, message="DB::Exception: Incorrect number of arguments for function decrypt provided 0, expected 3 to 5") + + with Example("missing key and mode"): + decrypt(ciphertext=ciphertext, exitcode=42, + message="DB::Exception: Incorrect number of arguments for function decrypt provided 1") + + with Example("missing mode"): + decrypt(ciphertext=ciphertext, key="'123'", exitcode=42, + message="DB::Exception: Incorrect number of arguments for function decrypt provided 2") + + with Example("bad key type - UInt8"): + decrypt(ciphertext=ciphertext, key="123", mode="'aes-128-ecb'", exitcode=43, + message="DB::Exception: Received from localhost:9000. DB::Exception: Illegal type of argument #3") + + with Example("bad mode type - forgot quotes"): + decrypt(ciphertext=ciphertext, key="'0123456789123456'", mode="aes-128-ecb", exitcode=47, + message="DB::Exception: Missing columns: 'ecb' 'aes' while processing query") + + with Example("bad mode type - UInt8"): + decrypt(ciphertext=ciphertext, key="'0123456789123456'", mode="128", exitcode=43, + message="DB::Exception: Illegal type of argument #1 'mode'") + + with Example("bad iv type - UInt8"): + decrypt(ciphertext=ciphertext, key="'0123456789123456'", mode="'aes-128-cbc'", iv='128', exitcode=43, + message="DB::Exception: Illegal type of argument") + + with Example("bad aad type - UInt8"): + decrypt(ciphertext=ciphertext, key="'0123456789123456'", mode="'aes-128-gcm'", iv="'012345678912'", aad="123", exitcode=43, + message="DB::Exception: Illegal type of argument") + + with Example("iv not valid for mode", requirements=[RQ_SRS008_AES_Decrypt_Function_InitializationVector_NotValidForMode("1.0")]): + decrypt(ciphertext=ciphertext, key="'0123456789123456'", mode="'aes-128-ecb'", iv="'012345678912'", exitcode=36, + message="DB::Exception: aes-128-ecb does not support IV") + + with Example("iv not valid for mode - size 0", requirements=[RQ_SRS008_AES_Decrypt_Function_InitializationVector_NotValidForMode("1.0")]): + decrypt(ciphertext="unhex('49C9ADB81BA9B58C485E7ADB90E70576')", key="'0123456789123456'", mode="'aes-128-ecb'", iv="''", exitcode=36, + message="DB::Exception: aes-128-ecb does not support IV") + + with Example("aad not valid for mode", requirements=[RQ_SRS008_AES_Decrypt_Function_AdditionalAuthenticationData_NotValidForMode("1.0")]): + decrypt(ciphertext=ciphertext, key="'0123456789123456'", mode="'aes-128-cbc'", iv="'0123456789123456'", aad="'aad'", exitcode=36, + message="DB::Exception: AAD can be only set for GCM-mode") + + with Example("invalid mode value", requirements=[RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_Invalid("1.0")]): + with When("typo in the block algorithm"): + decrypt(ciphertext=ciphertext, key="'0123456789123456'", mode="'aes-128-eeb'", exitcode=36, + message="DB::Exception: Invalid mode: aes-128-eeb") + + with When("typo in the key size"): + decrypt(ciphertext=ciphertext, key="'0123456789123456'", mode="'aes-127-ecb'", exitcode=36, + message="DB::Exception: Invalid mode: aes-127-ecb") + + with When("typo in the aes prefix"): + decrypt(ciphertext=ciphertext, key="'0123456789123456'", mode="'aee-128-ecb'", exitcode=36, + message="DB::Exception: Invalid mode: aee-128-ecb") + + with When("missing last dash"): + decrypt(ciphertext=ciphertext, key="'0123456789123456'", mode="'aes-128ecb'", exitcode=36, + message="DB::Exception: Invalid mode: aes-128ecb") + + with When("missing first dash"): + decrypt(ciphertext=ciphertext, key="'0123456789123456'", mode="'aes128-ecb'", exitcode=36, + message="DB::Exception: Invalid mode: aes128-ecb") + + with When("all capitals"): + decrypt(ciphertext=ciphertext, key="'0123456789123456'", mode="'AES-128-ECB'", exitcode=36, + message="DB::Exception: Invalid mode: AES-128-ECB") + +@TestOutline(Scenario) +@Requirements( + RQ_SRS008_AES_Decrypt_Function_Key_Length_InvalidLengthError("1.0"), + RQ_SRS008_AES_Decrypt_Function_InitializationVector_Length_InvalidLengthError("1.0"), + RQ_SRS008_AES_Decrypt_Function_AdditionalAuthenticationData_NotValidForMode("1.0") +) +@Examples("mode key_len iv_len aad", [ + # ECB + ("'aes-128-ecb'", 16, None, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_128_ECB_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-ecb'", 24, None, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_192_ECB_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-ecb'", 32, None, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_256_ECB_KeyAndInitializationVector_Length("1.0"))), + # CBC + ("'aes-128-cbc'", 16, 16, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_128_CBC_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-cbc'", 24, 16, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_192_CBC_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-cbc'", 32, 16, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_256_CBC_KeyAndInitializationVector_Length("1.0"))), + # CFB1 + ("'aes-128-cfb1'", 16, 16, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_128_CFB1_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-cfb1'", 24, 16, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_192_CFB1_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-cfb1'", 32, 16, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_256_CFB1_KeyAndInitializationVector_Length("1.0"))), + # CFB8 + ("'aes-128-cfb8'", 16, 16, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_128_CFB8_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-cfb8'", 24, 16, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_192_CFB8_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-cfb8'", 32, 16, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_256_CFB8_KeyAndInitializationVector_Length("1.0"))), + # CFB128 + ("'aes-128-cfb128'", 16, 16, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_128_CFB128_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-cfb128'", 24, 16, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_192_CFB128_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-cfb128'", 32, 16, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_256_CFB128_KeyAndInitializationVector_Length("1.0"))), + # OFB + ("'aes-128-ofb'", 16, 16, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_128_OFB_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-ofb'", 24, 16, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_192_OFB_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-ofb'", 32, 16, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_256_OFB_KeyAndInitializationVector_Length("1.0"))), + # CTR + ("'aes-128-ctr'", 16, 16, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_128_CTR_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-ctr'", 24, 16, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_192_CTR_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-ctr'", 32, 16, None, + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_256_CTR_KeyAndInitializationVector_Length("1.0"))), +], "%-16s %-10s %-10s %-10s") +def invalid_key_or_iv_length_for_mode_non_gcm(self, mode, key_len, iv_len, aad): + """Check that an error is returned when key or iv length does not match + the expected value for the mode. + """ + ciphertext = "unhex('AA1826B5F66A903C888D5DCDA9FB63D1D9CCA10EC55F59D6C00D37')" + key = "0123456789" * 4 + iv = "0123456789" * 4 + + with When("key is too short"): + decrypt(ciphertext=ciphertext, key=f"'{key[:key_len-1]}'", mode=mode, exitcode=36, message="DB::Exception: Invalid key size") + + with When("key is too long"): + decrypt(ciphertext=ciphertext, key=f"'{key[:key_len+1]}'", mode=mode, exitcode=36, message="DB::Exception: Invalid key size") + + if iv_len is not None: + with When("iv is too short"): + decrypt(ciphertext=ciphertext, key=f"'{key[:key_len]}'", iv=f"'{iv[:iv_len-1]}'", mode=mode, exitcode=36, message="DB::Exception: Invalid IV size") + + with When("iv is too long"): + decrypt(ciphertext=ciphertext, key=f"'{key[:key_len]}'", iv=f"'{iv[:iv_len+1]}'", mode=mode, exitcode=36, message="DB::Exception: Invalid IV size") + + if aad is None: + with When("aad is specified but not needed"): + decrypt(ciphertext=ciphertext, key=f"'{key[:key_len]}'", iv=f"'{iv[:iv_len+1] if iv_len is not None else ''}'", aad="'AAD'", mode=mode, exitcode=36, message="DB::Exception: AAD can be only set for GCM-mode") + + else: + with When("iv is specified but not needed"): + decrypt(ciphertext=ciphertext, key=f"'{key[:key_len]}'", iv=f"'{iv}'", mode=mode, exitcode=36, message="DB::Exception: {} does not support IV".format(mode.strip("'"))) + +@TestOutline(Scenario) +@Requirements( + RQ_SRS008_AES_Decrypt_Function_Key_Length_InvalidLengthError("1.0"), + RQ_SRS008_AES_Decrypt_Function_InitializationVector_Length_InvalidLengthError("1.0"), + RQ_SRS008_AES_Decrypt_Function_AdditionalAuthenticationData_NotValidForMode("1.0") +) +@Examples("mode key_len iv_len aad", [ + # GCM + ("'aes-128-gcm'", 16, 8, "'hello there aad'", + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_128_GCM_KeyAndInitializationVector_Length("1.0"))), + ("'aes-128-gcm'", 16, None, "'hello there aad'", + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_128_GCM_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-gcm'", 24, 8, "''", + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_192_GCM_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-gcm'", 24, None, "''", + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_192_GCM_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-gcm'", 32, 8, "'a'", + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_256_GCM_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-gcm'", 32, None, "'a'", + Requirements(RQ_SRS008_AES_Decrypt_Function_AES_256_GCM_KeyAndInitializationVector_Length("1.0"))), +], "%-16s %-10s %-10s %-10s") +def invalid_key_or_iv_length_for_gcm(self, mode, key_len, iv_len, aad): + """Check that an error is returned when key or iv length does not match + the expected value for the GCM mode. + """ + ciphertext = "'hello there'" + plaintext = "hello there" + key = "0123456789" * 4 + iv = "0123456789" * 4 + + with When("key is too short"): + ciphertext = "unhex('AA1826B5F66A903C888D5DCDA9FB63D1D9CCA10EC55F59D6C00D37')" + decrypt(ciphertext=ciphertext, key=f"'{key[:key_len-1]}'", iv=f"'{iv[:iv_len]}'", mode=mode, exitcode=36, message="DB::Exception: Invalid key size") + + with When("key is too long"): + ciphertext = "unhex('24AEBFEA049D6F4CF85AAB8CADEDF39CCCAA1C3C2AFF99E194789D')" + decrypt(ciphertext=ciphertext, key=f"'{key[:key_len+1]}'", iv=f"'{iv[:iv_len]}'", mode=mode, exitcode=36, message="DB::Exception: Invalid key size") + + if iv_len is not None: + with When(f"iv is too short"): + ciphertext = "unhex('24AEBFEA049D6F4CF85AAB8CADEDF39CCCAA1C3C2AFF99E194789D')" + decrypt(ciphertext=ciphertext, key=f"'{key[:key_len]}'", iv=f"'{iv[:iv_len-1]}'", mode=mode, exitcode=198, message="DB::Exception:") + else: + with When("iv is not specified"): + ciphertext = "unhex('1CD4EC93A4B0C687926E8F8C2AA3B4CE1943D006DAE3A774CB1AE5')" + decrypt(ciphertext=ciphertext, key=f"'{key[:key_len]}'", mode=mode, exitcode=36, message="DB::Exception: Invalid IV size 0 != expected size 12") + +@TestScenario +@Requirements( + RQ_SRS008_AES_Decrypt_Function_Parameters_AdditionalAuthenticatedData("1.0"), + RQ_SRS008_AES_Decrypt_Function_AdditionalAuthenticationData_Length("1.0") +) +def aad_parameter_types_and_length(self): + """Check that `decrypt` function accepts `aad` parameter as the fifth argument + of either `String` or `FixedString` types and that the length is not limited. + """ + plaintext = "hello there" + iv = "'012345678912'" + mode = "'aes-128-gcm'" + key = "'0123456789123456'" + + with When("aad is specified using String type"): + ciphertext = "unhex('19A1183335B374C626B24208AAEC97F148732CE05621AC87B21526')" + decrypt(ciphertext=ciphertext, key=key, mode=mode, iv=iv, aad="'aad'", message=plaintext) + + with When("aad is specified using String with UTF8 characters"): + ciphertext = "unhex('19A1183335B374C626B242C68D9618A8C2664D7B6A3FE978104B39')" + decrypt(ciphertext=ciphertext, key=key, mode=mode, iv=iv, aad="'Gãńdåłf_Thê_Gręât'", message=plaintext) + + with When("aad is specified using FixedString type"): + ciphertext = "unhex('19A1183335B374C626B24208AAEC97F148732CE05621AC87B21526')" + decrypt(ciphertext=ciphertext, key=key, mode=mode, iv=iv, aad="toFixedString('aad', 3)", message=plaintext) + + with When("aad is specified using FixedString with UTF8 characters"): + ciphertext = "unhex('19A1183335B374C626B242C68D9618A8C2664D7B6A3FE978104B39')" + decrypt(ciphertext=ciphertext, key=key, mode=mode, iv=iv, aad="toFixedString('Gãńdåłf_Thê_Gręât', 24)", message=plaintext) + + with When("aad is 0 bytes"): + ciphertext = "unhex('19A1183335B374C626B242DF92BB3F57F5D82BEDF41FD5D49F8BC9')" + decrypt(ciphertext=ciphertext, key=key, mode=mode, iv=iv, aad="''", message=plaintext) + + with When("aad is 1 byte"): + ciphertext = "unhex('19A1183335B374C626B242D1BCFC63B09CFE9EAD20285044A01035')" + decrypt(ciphertext=ciphertext, key=key, mode=mode, iv=iv, aad="'1'", message=plaintext) + + with When("aad is 256 bytes"): + ciphertext = "unhex('19A1183335B374C626B242355AD3DD2C5D7E36AEECBB847BF9E8A7')" + decrypt(ciphertext=ciphertext, key=key, mode=mode, iv=iv, aad=f"'{'1' * 256}'", message=plaintext) + +@TestScenario +@Requirements( + RQ_SRS008_AES_Decrypt_Function_Parameters_InitializationVector("1.0") +) +def iv_parameter_types(self): + """Check that `decrypt` function accepts `iv` parameter as the fourth argument + of either `String` or `FixedString` types. + """ + iv = "'0123456789123456'" + mode = "'aes-128-cbc'" + key = "'0123456789123456'" + + with When("iv is specified using String type"): + decrypt(ciphertext="unhex('F024F9372FA0D8B974894D29FFB8A7F7')", key=key, mode=mode, iv=iv, message="hello there") + + with When("iv is specified using String with UTF8 characters"): + decrypt(ciphertext="unhex('7A4EC0FF3796F46BED281F4778ACE1DC')", key=key, mode=mode, iv="'Gãńdåłf_Thê'", message="hello there") + + with When("iv is specified using FixedString type"): + decrypt(ciphertext="unhex('F024F9372FA0D8B974894D29FFB8A7F7')", key=key, mode=mode, iv=f"toFixedString({iv}, 16)", message="hello there") + + with When("iv is specified using FixedString with UTF8 characters"): + decrypt(ciphertext="unhex('7A4EC0FF3796F46BED281F4778ACE1DC')", key=key, mode=mode, iv=f"toFixedString('Gãńdåłf_Thê', 16)", message="hello there") + +@TestScenario +@Requirements( + RQ_SRS008_AES_Decrypt_Function_Parameters_Key("1.0") +) +def key_parameter_types(self): + """Check that `decrypt` function accepts `key` parameter as the second argument + of either `String` or `FixedString` types. + """ + iv = "'0123456789123456'" + mode = "'aes-128-cbc'" + key = "'0123456789123456'" + + with When("key is specified using String type"): + decrypt(ciphertext="unhex('49C9ADB81BA9B58C485E7ADB90E70576')", key=key, mode=mode, message="hello there") + + with When("key is specified using String with UTF8 characters"): + decrypt(ciphertext="unhex('180086AA42AD57B71C706EEC372D0C3D')", key="'Gãńdåłf_Thê'", mode=mode, message="hello there") + + with When("key is specified using FixedString type"): + decrypt(ciphertext="unhex('49C9ADB81BA9B58C485E7ADB90E70576')", key=f"toFixedString({key}, 16)", mode=mode, message="hello there") + + with When("key is specified using FixedString with UTF8 characters"): + decrypt(ciphertext="unhex('180086AA42AD57B71C706EEC372D0C3D')", key=f"toFixedString('Gãńdåłf_Thê', 16)", mode=mode, message="hello there") + +@TestScenario +@Requirements( + RQ_SRS008_AES_Decrypt_Function_Parameters_Mode("1.0"), +) +def mode_parameter_types(self): + """Check that `decrypt` function accepts `mode` parameter as the third argument + of either `String` or `FixedString` types. + """ + mode = "'aes-128-cbc'" + key = "'0123456789123456'" + + with When("mode is specified using String type"): + decrypt(ciphertext="unhex('49C9ADB81BA9B58C485E7ADB90E70576')", key=key, mode=mode, message="hello there") + + with When("mode is specified using FixedString type"): + decrypt(ciphertext="unhex('49C9ADB81BA9B58C485E7ADB90E70576')", key=key, mode=f"toFixedString({mode}, 12)", message="hello there") + +@TestScenario +@Requirements( + RQ_SRS008_AES_Decrypt_Function_Parameters_ReturnValue("1.0") +) +def return_value(self): + """Check that `decrypt` functions returns String data type. + """ + ciphertext = "unhex('F024F9372FA0D8B974894D29FFB8A7F7')" + iv = "'0123456789123456'" + mode = "'aes-128-cbc'" + key = "'0123456789123456'" + + with When("I get type of the return value"): + sql = "SELECT toTypeName(decrypt(" + mode + "," + ciphertext + "," + key + "," + iv + "))" + r = self.context.node.query(sql) + + with Then("type should be String"): + assert r.output.strip() == "String", error() + + with When("I get the return value"): + decrypt(ciphertext=ciphertext, key=key, mode=mode, iv=iv, message="hello there") + +@TestScenario +@Requirements( + RQ_SRS008_AES_Decrypt_Function_Syntax("1.0"), +) +def syntax(self): + """Check that `decrypt` function supports syntax + + ```sql + decrypt(ciphertext, key, mode, [iv, aad]) + ``` + """ + ciphertext = "19A1183335B374C626B242A6F6E8712E2B64DCDC6A468B2F654614" + sql = f"SELECT decrypt('aes-128-gcm', unhex('{ciphertext}'), '0123456789123456', '012345678912', 'AAD')" + self.context.node.query(sql, step=When, message="hello there") + +@TestScenario +@Requirements( + RQ_SRS008_AES_Decrypt_Function_Parameters_CipherText("1.0"), + RQ_SRS008_AES_Decrypt_Function_Parameters_Mode("1.0"), + RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_ValuesFormat("1.0"), +) +def decryption(self): + """Check that `decrypt` functions accepts `ciphertext` as the second parameter + and `mode` as the first parameter and we can convert the decrypted value into the original + value with the original data type. + """ + key = f"{'1' * 36}" + iv = f"{'2' * 16}" + aad = "some random aad" + + with Given("I load encrypt snapshots"): + snapshot_module = SourceFileLoader("snapshot", os.path.join(current_dir(), "snapshots", "encrypt.py.encrypt.snapshot")).load_module() + + for mode, key_len, iv_len, aad_len in modes: + for datatype, plaintext in plaintexts: + + requirement = globals().get(f"""RQ_SRS008_AES_Decrypt_Function_Parameters_Mode_Value_{mode.strip("'").replace("-","_").upper()}""")("1.0") + + with Example(f"""mode={mode.strip("'")} datatype={datatype.strip("'")} iv={iv_len} aad={aad_len}""", + requirements=[requirement]) as example: + + with Given("I have ciphertext"): + example_name = basename(example.name) + ciphertext = getattr(snapshot_module, varname(f"example_{example_name}")) + + cast = None + endcast = None + ciphertext = f"unhex({ciphertext})" + compare = plaintext + + if datatype == "IPv4": + cast = "toIPv4(IPv4NumToString(reinterpretAsUInt32" + endcast = "))" + elif datatype in ["DateTime64", "UUID", "IPv6", "LowCardinality", "Enum8", "Enum16", "Decimal32", "Decimal64", "Decimal128", "Array"]: + xfail(reason="no conversion") + elif datatype == "NULL": + ciphertext = "NULL" + cast = "isNull" + compare = None + elif datatype in ["Float32", "Float64", "Date", "DateTime"] or "Int" in datatype: + cast = f"reinterpretAs{datatype}" + + decrypt(ciphertext=ciphertext, key=f"'{key[:key_len]}'", mode=mode, + iv=(None if not iv_len else f"'{iv[:iv_len]}'"), + aad=(None if not aad_len else f"'{aad}'"), + cast=cast, endcast=endcast, compare=compare, message="1") + +@TestScenario +@Requirements( + RQ_SRS008_AES_Functions_Mismatched_Key("1.0") +) +def mismatched_key(self): + """Check that `decrypt` function returns garbage or an error when key parameter does not match. + """ + key = f"{'1' * 36}" + iv = f"{'2' * 16}" + aad = "some random aad" + datatype = "String" + plaintext = "'1'" + + with Given("I load encrypt snapshots"): + snapshot_module = SourceFileLoader("snapshot", os.path.join(current_dir(), "snapshots", "encrypt.py.encrypt.snapshot")).load_module() + + for mode, key_len, iv_len, aad_len in modes: + with Example(f"""mode={mode.strip("'")} datatype={datatype.strip("'")} iv={iv_len} aad={aad_len}""") as example: + with Given("I have ciphertext"): + example_name = basename(example.name) + ciphertext = getattr(snapshot_module, varname(f"example_{example_name}")) + + with When("I decrypt using a mismatched key"): + r = decrypt(ciphertext=f"unhex({ciphertext})", key=f"'a{key[:key_len-1]}'", mode=mode, + iv=(None if not iv_len else f"'{iv[:iv_len]}'"), + aad=(None if not aad_len else f"'{aad}'"), no_checks=True, cast="hex") + + with Then("exitcode shoud be 0 or 198"): + assert r.exitcode in [0, 198], error() + + with And("output should be garbage or an error"): + output = r.output.strip() + assert "Exception: Failed to decrypt" in output or output != "31", error() + +@TestScenario +@Requirements( + RQ_SRS008_AES_Functions_Mismatched_IV("1.0") +) +def mismatched_iv(self): + """Check that `decrypt` function returns garbage or an error when iv parameter does not match. + """ + key = f"{'1' * 36}" + iv = f"{'2' * 16}" + aad = "some random aad" + datatype = "String" + plaintext = "'1'" + + with Given("I load encrypt snapshots"): + snapshot_module = SourceFileLoader("snapshot", os.path.join(current_dir(), "snapshots", "encrypt.py.encrypt.snapshot")).load_module() + + for mode, key_len, iv_len, aad_len in modes: + if not iv_len: + continue + with Example(f"""mode={mode.strip("'")} datatype={datatype.strip("'")} iv={iv_len} aad={aad_len}""") as example: + with Given("I have ciphertext"): + example_name = basename(example.name) + ciphertext = getattr(snapshot_module, varname(f"example_{example_name}")) + + with When("I decrypt using a mismatched iv"): + r = decrypt(ciphertext=f"unhex({ciphertext})", key=f"'{key[:key_len]}'", mode=mode, + iv=f"'a{iv[:iv_len-1]}'", + aad=(None if not aad_len else f"'{aad}'"), no_checks=True, cast="hex") + + with Then("exitcode shoud be 0 or 198"): + assert r.exitcode in [0, 198], error() + + with And("output should be garbage or an error"): + output = r.output.strip() + assert "Exception: Failed to decrypt" in output or output != "31", error() + +@TestScenario +@Requirements( + RQ_SRS008_AES_Functions_Mismatched_AAD("1.0") +) +def mismatched_aad(self): + """Check that `decrypt` function returns garbage or an error when aad parameter does not match. + """ + key = f"{'1' * 36}" + iv = f"{'2' * 16}" + aad = "some random aad" + datatype = "String" + plaintext = "'1'" + + with Given("I load encrypt snapshots"): + snapshot_module = SourceFileLoader("snapshot", os.path.join(current_dir(), "snapshots", "encrypt.py.encrypt.snapshot")).load_module() + + for mode, key_len, iv_len, aad_len in modes: + if not aad_len: + continue + with Example(f"""mode={mode.strip("'")} datatype={datatype.strip("'")} iv={iv_len} aad={aad_len}""") as example: + with Given("I have ciphertext"): + example_name = basename(example.name) + ciphertext = getattr(snapshot_module, varname(f"example_{example_name}")) + + with When("I decrypt using a mismatched aad"): + r = decrypt(ciphertext=f"unhex({ciphertext})", key=f"'{key[:key_len]}'", mode=mode, + iv=(None if not iv_len else f"'{iv[:iv_len]}'"), + aad=(None if not aad_len else f"'a{aad}'"), no_checks=True, cast="hex") + + with Then("exitcode shoud be 0 or 198"): + assert r.exitcode in [0, 198], error() + + with And("output should be garbage or an error"): + output = r.output.strip() + assert "Exception: Failed to decrypt" in output or output != "31", error() + +@TestScenario +@Requirements( + RQ_SRS008_AES_Functions_Mismatched_Mode("1.0") +) +def mismatched_mode(self): + """Check that `decrypt` function returns garbage or an error when mode parameter does not match. + """ + key = f"{'1' * 36}" + iv = f"{'2' * 16}" + aad = "some random aad" + plaintext = hex('Gãńdåłf_Thê_Gręât'.encode("utf-8")) + + with Given("I load encrypt snapshots"): + snapshot_module = SourceFileLoader("snapshot", os.path.join(current_dir(), "snapshots", "encrypt.py.encrypt.snapshot")).load_module() + + for mode, key_len, iv_len, aad_len in modes: + with Example(f"""mode={mode.strip("'")} datatype=utf8string iv={iv_len} aad={aad_len}""") as example: + with Given("I have ciphertext"): + example_name = basename(example.name) + ciphertext = getattr(snapshot_module, varname(f"example_{example_name}")) + + for mismatched_mode, _, _, _ in modes: + if mismatched_mode == mode: + continue + + with When(f"I decrypt using mismatched mode {mismatched_mode}"): + r = decrypt(ciphertext=f"unhex({ciphertext})", key=f"'{key[:key_len]}'", mode=mismatched_mode, + iv=(None if not iv_len else f"'{iv[:iv_len]}'"), + aad=(None if not aad_len else f"'{aad}'"), no_checks=True, cast="hex") + + with Then("exitcode shoud be 0 or 36 or 198"): + assert r.exitcode in [0, 36, 198], error() + + with And("output should be garbage or an error"): + output = r.output.strip() + condition = "Exception: Failed to decrypt" in output \ + or 'Exception: Invalid key size' in output \ + or output != plaintext + assert condition, error() + +@TestFeature +@Name("decrypt") +@Requirements( + RQ_SRS008_AES_Decrypt_Function("1.0") +) +def feature(self, node="clickhouse1"): + """Check the behavior of the `decrypt` function. + """ + self.context.node = self.context.cluster.node(node) + + for scenario in loads(current_module(), Scenario): + Scenario(run=scenario, flags=TE) diff --git a/tests/testflows/aes_encryption/tests/decrypt_mysql.py b/tests/testflows/aes_encryption/tests/decrypt_mysql.py new file mode 100644 index 00000000000..b3df2121cd4 --- /dev/null +++ b/tests/testflows/aes_encryption/tests/decrypt_mysql.py @@ -0,0 +1,521 @@ +# -*- coding: utf-8 -*- +import os +from importlib.machinery import SourceFileLoader + +from testflows.core import * +from testflows.core.name import basename +from testflows.asserts.helpers import varname +from testflows.asserts import error + +from aes_encryption.requirements.requirements import * +from aes_encryption.tests.common import * + +@TestOutline +def aes_decrypt_mysql(self, ciphertext=None, key=None, mode=None, iv=None, aad=None, exitcode=0, message=None, + step=When, cast=None, endcast=None, compare=None, no_checks=False): + """Execute `aes_decrypt_mysql` function with the specified parameters. + """ + params = [] + if mode is not None: + params.append(mode) + if ciphertext is not None: + params.append(ciphertext) + if key is not None: + params.append(key) + if iv is not None: + params.append(iv) + if aad is not None: + params.append(aad) + + sql = f"aes_decrypt_mysql(" + ", ".join(params) + ")" + if cast: + sql = f"{cast}({sql}){endcast or ''}" + if compare: + sql = f"{compare} = {sql}" + sql = f"SELECT {sql}" + + return current().context.node.query(sql, step=step, exitcode=exitcode, message=message, no_checks=no_checks) + +@TestScenario +@Requirements( + RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_CipherText("1.0"), +) +def invalid_ciphertext(self): + """Check that `aes_decrypt_mysql` function does not crash when invalid + `ciphertext` is passed as the first parameter. + """ + key = f"{'1' * 36}" + iv = f"{'2' * 16}" + invalid_ciphertexts = plaintexts + + for mode, key_len, iv_len in mysql_modes: + with Example(f"""mode={mode.strip("'")} iv={iv_len}"""): + d_iv = None if not iv_len else f"'{iv[:iv_len]}'" + + for datatype, ciphertext in invalid_ciphertexts: + if datatype in ["NULL"]: + continue + with When(f"invalid ciphertext={ciphertext}"): + if "cfb" in mode or "ofb" in mode or "ctr" in mode: + aes_decrypt_mysql(ciphertext=ciphertext, key=f"'{key[:key_len]}'", mode=mode, iv=d_iv, cast="hex") + else: + with When("I execute aes_decrypt_mysql function"): + r = aes_decrypt_mysql(ciphertext=ciphertext, key=f"'{key[:key_len]}'", mode=mode, iv=d_iv, no_checks=True, step=By) + with Then("exitcode is not zero"): + assert r.exitcode in [198, 36] + with And("exception is present in the output"): + assert "DB::Exception:" in r.output + +@TestOutline(Scenario) +@Examples("mode", [ + ("'aes-128-gcm'", Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_128_GCM_Error("1.0"))), + ("'aes-192-gcm'", Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_192_GCM_Error("1.0"))), + ("'aes-256-gcm'", Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_256_GCM_Error("1.0"))), + ("'aes-128-ctr'", Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_128_CTR_Error("1.0"))), + ("'aes-192-ctr'", Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_192_CTR_Error("1.0"))), + ("'aes-256-ctr'", Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_AES_256_CTR_Error("1.0"))), +]) +def unsupported_modes(self, mode): + """Check that `aes_decrypt_mysql` function returns an error when unsupported modes are specified. + """ + ciphertext = "unhex('AA1826B5F66A903C888D5DCDA9FB63D1D9CCA10EC55F59D6C00D37')" + + aes_decrypt_mysql(ciphertext=ciphertext, mode=mode, key=f"'{'1'* 32}'", exitcode=36, message="DB::Exception: Unsupported cipher mode") + +@TestScenario +@Requirements( + RQ_SRS008_AES_Functions_InvalidParameters("1.0") +) +def invalid_parameters(self): + """Check that `aes_decrypt_mysql` function returns an error when + we call it with invalid parameters. + """ + ciphertext = "unhex('AA1826B5F66A903C888D5DCDA9FB63D1D9CCA10EC55F59D6C00D37')" + + with Example("no parameters"): + aes_decrypt_mysql(exitcode=42, message="DB::Exception: Incorrect number of arguments for function aes_decrypt_mysql provided 0, expected 3 to 4") + + with Example("missing key and mode"): + aes_decrypt_mysql(ciphertext=ciphertext, exitcode=42, + message="DB::Exception: Incorrect number of arguments for function aes_decrypt_mysql provided 1") + + with Example("missing mode"): + aes_decrypt_mysql(ciphertext=ciphertext, key="'123'", exitcode=42, + message="DB::Exception: Incorrect number of arguments for function aes_decrypt_mysql provided 2") + + with Example("bad key type - UInt8"): + aes_decrypt_mysql(ciphertext=ciphertext, key="123", mode="'aes-128-ecb'", exitcode=43, + message="DB::Exception: Received from localhost:9000. DB::Exception: Illegal type of argument #3") + + with Example("bad mode type - forgot quotes"): + aes_decrypt_mysql(ciphertext=ciphertext, key="'0123456789123456'", mode="aes-128-ecb", exitcode=47, + message="DB::Exception: Missing columns: 'ecb' 'aes' while processing query") + + with Example("bad mode type - UInt8"): + aes_decrypt_mysql(ciphertext=ciphertext, key="'0123456789123456'", mode="128", exitcode=43, + message="DB::Exception: Illegal type of argument #1 'mode'") + + with Example("bad iv type - UInt8"): + aes_decrypt_mysql(ciphertext=ciphertext, key="'0123456789123456'", mode="'aes-128-cbc'", iv='128', exitcode=43, + message="DB::Exception: Illegal type of argument") + + with Example("iv not valid for mode", requirements=[RQ_SRS008_AES_MySQL_Decrypt_Function_InitializationVector_NotValidForMode("1.0")]): + aes_decrypt_mysql(ciphertext="unhex('49C9ADB81BA9B58C485E7ADB90E70576')", key="'0123456789123456'", mode="'aes-128-ecb'", iv="'012345678912'", exitcode=0, + message=None) + + with Example("iv not valid for mode - size 0", requirements=[RQ_SRS008_AES_MySQL_Decrypt_Function_InitializationVector_NotValidForMode("1.0")]): + aes_decrypt_mysql(ciphertext="unhex('49C9ADB81BA9B58C485E7ADB90E70576')", key="'0123456789123456'", mode="'aes-128-ecb'", iv="''", exitcode=0, + message=None) + + with Example("aad passed by mistake"): + aes_decrypt_mysql(ciphertext=ciphertext, key="'0123456789123456'", mode="'aes-128-cbc'", iv="'0123456789123456'", aad="'aad'", exitcode=42, + message="DB::Exception: Incorrect number of arguments for function aes_decrypt_mysql provided 5") + + with Example("aad passed by mistake type - UInt8"): + aes_decrypt_mysql(ciphertext=ciphertext, key="'0123456789123456'", mode="'aes-128-gcm'", iv="'012345678912'", aad="123", exitcode=42, + message="DB::Exception: Incorrect number of arguments for function aes_decrypt_mysql provided 5") + + with Example("invalid mode value", requirements=[RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_Invalid("1.0")]): + with When("typo in the block algorithm"): + aes_decrypt_mysql(ciphertext=ciphertext, key="'0123456789123456'", mode="'aes-128-eeb'", exitcode=36, + message="DB::Exception: Invalid mode: aes-128-eeb") + + with When("typo in the key size"): + aes_decrypt_mysql(ciphertext=ciphertext, key="'0123456789123456'", mode="'aes-127-ecb'", exitcode=36, + message="DB::Exception: Invalid mode: aes-127-ecb") + + with When("typo in the aes prefix"): + aes_decrypt_mysql(ciphertext=ciphertext, key="'0123456789123456'", mode="'aee-128-ecb'", exitcode=36, + message="DB::Exception: Invalid mode: aee-128-ecb") + + with When("missing last dash"): + aes_decrypt_mysql(ciphertext=ciphertext, key="'0123456789123456'", mode="'aes-128ecb'", exitcode=36, + message="DB::Exception: Invalid mode: aes-128ecb") + + with When("missing first dash"): + aes_decrypt_mysql(ciphertext=ciphertext, key="'0123456789123456'", mode="'aes128-ecb'", exitcode=36, + message="DB::Exception: Invalid mode: aes128-ecb") + + with When("all capitals"): + aes_decrypt_mysql(ciphertext=ciphertext, key="'0123456789123456'", mode="'AES-128-ECB'", exitcode=36, + message="DB::Exception: Invalid mode: AES-128-ECB") + +@TestOutline(Scenario) +@Requirements( + RQ_SRS008_AES_MySQL_Decrypt_Function_Key_Length_TooShortError("1.0"), + RQ_SRS008_AES_MySQL_Decrypt_Function_Key_Length_TooLong("1.0"), + RQ_SRS008_AES_MySQL_Decrypt_Function_InitializationVector_Length_TooShortError("1.0"), + RQ_SRS008_AES_MySQL_Decrypt_Function_InitializationVector_Length_TooLong("1.0"), + RQ_SRS008_AES_MySQL_Decrypt_Function_InitializationVector_NotValidForMode("1.0") +) +@Examples("mode key_len iv_len", [ + # ECB + ("'aes-128-ecb'", 16, None, + Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_AES_128_ECB_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-ecb'", 24, None, + Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_AES_192_ECB_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-ecb'", 32, None, + Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_AES_256_ECB_KeyAndInitializationVector_Length("1.0"))), + # CBC + ("'aes-128-cbc'", 16, 16, + Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_AES_128_CBC_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-cbc'", 24, 16, + Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_AES_192_CBC_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-cbc'", 32, 16, + Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_AES_256_CBC_KeyAndInitializationVector_Length("1.0"))), + # CFB1 + ("'aes-128-cfb1'", 16, 16, + Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_AES_128_CFB1_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-cfb1'", 24, 16, + Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_AES_192_CFB1_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-cfb1'", 32, 16, + Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_AES_256_CFB1_KeyAndInitializationVector_Length("1.0"))), + # CFB8 + ("'aes-128-cfb8'", 16, 16, + Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_AES_128_CFB8_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-cfb8'", 24, 16, + Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_AES_192_CFB8_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-cfb8'", 32, 16, + Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_AES_256_CFB8_KeyAndInitializationVector_Length("1.0"))), + # CFB128 + ("'aes-128-cfb128'", 16, 16, + Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_AES_128_CFB128_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-cfb128'", 24, 16, + Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_AES_192_CFB128_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-cfb128'", 32, 16, + Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_AES_256_CFB128_KeyAndInitializationVector_Length("1.0"))), + # OFB + ("'aes-128-ofb'", 16, 16, + Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_AES_128_OFB_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-ofb'", 24, 16, + Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_AES_192_OFB_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-ofb'", 32, 16, + Requirements(RQ_SRS008_AES_MySQL_Decrypt_Function_AES_256_OFB_KeyAndInitializationVector_Length("1.0"))), +], "%-16s %-10s %-10s") +def key_or_iv_length_for_mode(self, mode, key_len, iv_len): + """Check that key or iv length for mode. + """ + ciphertext = "unhex('31F4C847CAB873AB34584368E3E85E3A')" + if mode == "'aes-128-ecb'": + ciphertext = "unhex('31F4C847CAB873AB34584368E3E85E3B')" + elif mode == "'aes-192-ecb'": + ciphertext = "unhex('073868ECDECA94133A61A0FFA282E877')" + elif mode == "'aes-256-ecb'": + ciphertext = "unhex('1729E5354D6EC44D89900ABDB09DC297')" + key = "0123456789" * 4 + iv = "0123456789" * 4 + + with When("key is too short"): + aes_decrypt_mysql(ciphertext=ciphertext, key=f"'{key[:key_len-1]}'", mode=mode, exitcode=36, message="DB::Exception: Invalid key size") + + with When("key is too long"): + if "ecb" in mode or "cbc" in mode: + aes_decrypt_mysql(ciphertext=ciphertext, key=f"'{key[:key_len+1]}'", mode=mode, exitcode=198, message="DB::Exception: Failed to decrypt") + else: + aes_decrypt_mysql(ciphertext=ciphertext, key=f"'{key[:key_len+1]}'", mode=mode, cast="hex") + + if iv_len is not None: + with When("iv is too short"): + aes_decrypt_mysql(ciphertext=ciphertext, key=f"'{key[:key_len]}'", iv=f"'{iv[:iv_len-1]}'", mode=mode, exitcode=36, message="DB::Exception: Invalid IV size") + + with When("iv is too long"): + if "ecb" in mode or "cbc" in mode: + aes_decrypt_mysql(ciphertext=ciphertext, key=f"'{key[:key_len]}'", iv=f"'{iv[:iv_len+1]}'", mode=mode, exitcode=198, message="DB::Exception: Failed to decrypt") + else: + aes_decrypt_mysql(ciphertext=ciphertext, key=f"'{key[:key_len]}'", iv=f"'{iv[:iv_len+1]}'", mode=mode, cast="hex") + else: + with When("iv is specified but not needed"): + if "ecb" in mode or "cbc" in mode: + aes_decrypt_mysql(ciphertext=ciphertext, key=f"'{key[:key_len]}'", iv=f"'{iv}'", mode=mode, exitcode=198, message="DB::Exception: Failed to decrypt") + else: + aes_decrypt_mysql(ciphertext=ciphertext, key=f"'{key[:key_len]}'", iv=f"'{iv}'", mode=mode) + +@TestScenario +@Requirements( + RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_InitializationVector("1.0") +) +def iv_parameter_types(self): + """Check that `aes_decrypt_mysql` function accepts `iv` parameter as the fourth argument + of either `String` or `FixedString` types. + """ + iv = "'0123456789123456'" + mode = "'aes-128-cbc'" + key = "'0123456789123456'" + + with When("iv is specified using String type"): + aes_decrypt_mysql(ciphertext="unhex('F024F9372FA0D8B974894D29FFB8A7F7')", key=key, mode=mode, iv=iv, message="hello there") + + with When("iv is specified using String with UTF8 characters"): + aes_decrypt_mysql(ciphertext="unhex('7A4EC0FF3796F46BED281F4778ACE1DC')", key=key, mode=mode, iv="'Gãńdåłf_Thê'", message="hello there") + + with When("iv is specified using FixedString type"): + aes_decrypt_mysql(ciphertext="unhex('F024F9372FA0D8B974894D29FFB8A7F7')", key=key, mode=mode, iv=f"toFixedString({iv}, 16)", message="hello there") + + with When("iv is specified using FixedString with UTF8 characters"): + aes_decrypt_mysql(ciphertext="unhex('7A4EC0FF3796F46BED281F4778ACE1DC')", key=key, mode=mode, iv=f"toFixedString('Gãńdåłf_Thê', 16)", message="hello there") + +@TestScenario +@Requirements( + RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Key("1.0") +) +def key_parameter_types(self): + """Check that `aes_decrypt` function accepts `key` parameter as the second argument + of either `String` or `FixedString` types. + """ + iv = "'0123456789123456'" + mode = "'aes-128-cbc'" + key = "'0123456789123456'" + + with When("key is specified using String type"): + aes_decrypt_mysql(ciphertext="unhex('49C9ADB81BA9B58C485E7ADB90E70576')", key=key, mode=mode, message="hello there") + + with When("key is specified using String with UTF8 characters"): + aes_decrypt_mysql(ciphertext="unhex('180086AA42AD57B71C706EEC372D0C3D')", key="'Gãńdåłf_Thê'", mode=mode, message="hello there") + + with When("key is specified using FixedString type"): + aes_decrypt_mysql(ciphertext="unhex('49C9ADB81BA9B58C485E7ADB90E70576')", key=f"toFixedString({key}, 16)", mode=mode, message="hello there") + + with When("key is specified using FixedString with UTF8 characters"): + aes_decrypt_mysql(ciphertext="unhex('180086AA42AD57B71C706EEC372D0C3D')", key=f"toFixedString('Gãńdåłf_Thê', 16)", mode=mode, message="hello there") + + +@TestScenario +@Requirements( + RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode("1.0"), +) +def mode_parameter_types(self): + """Check that `aes_decrypt_mysql` function accepts `mode` parameter as the third argument + of either `String` or `FixedString` types. + """ + mode = "'aes-128-cbc'" + key = "'0123456789123456'" + + with When("mode is specified using String type"): + aes_decrypt_mysql(ciphertext="unhex('49C9ADB81BA9B58C485E7ADB90E70576')", key=key, mode=mode, message="hello there") + + with When("mode is specified using FixedString type"): + aes_decrypt_mysql(ciphertext="unhex('49C9ADB81BA9B58C485E7ADB90E70576')", key=key, mode=f"toFixedString({mode}, 12)", message="hello there") + + +@TestScenario +@Requirements( + RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_ReturnValue("1.0") +) +def return_value(self): + """Check that `aes_decrypt_mysql` functions returns String data type. + """ + ciphertext = "unhex('F024F9372FA0D8B974894D29FFB8A7F7')" + iv = "'0123456789123456'" + mode = "'aes-128-cbc'" + key = "'0123456789123456'" + + with When("I get type of the return value"): + sql = "SELECT toTypeName(aes_decrypt_mysql(" + mode + "," + ciphertext + "," + key + "," + iv + "))" + r = self.context.node.query(sql) + + with Then("type should be String"): + assert r.output.strip() == "String", error() + + with When("I get the return value"): + aes_decrypt_mysql(ciphertext=ciphertext, key=key, mode=mode, iv=iv, message="hello there") + +@TestScenario +@Requirements( + RQ_SRS008_AES_MySQL_Decrypt_Function_Syntax("1.0"), +) +def syntax(self): + """Check that `aes_decrypt_mysql` function supports syntax + + ```sql + aes_decrypt_mysql(ciphertext, key, mode, [iv]) + ``` + """ + ciphertext = "70FE78410D6EE237C2DE4A" + sql = f"SELECT aes_decrypt_mysql('aes-128-ofb', unhex('{ciphertext}'), '0123456789123456', '0123456789123456')" + self.context.node.query(sql, step=When, message="hello there") + +@TestScenario +@Requirements( + RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_CipherText("1.0"), + RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode("1.0"), + RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_ValuesFormat("1.0"), +) +def decryption(self): + """Check that `aes_decrypt_mysql` functions accepts `mode` as the first parameter + and `ciphertext` as the second parameter and we can convert the decrypted value into the original + value with the original data type. + """ + key = f"{'1' * 64}" + iv = f"{'2' * 64}" + + with Given("I load encrypt snapshots"): + snapshot_module = SourceFileLoader("snapshot", os.path.join(current_dir(), "snapshots", "encrypt_mysql.py.encrypt_mysql.snapshot")).load_module() + + for mode, key_len, iv_len in mysql_modes: + for datatype, plaintext in plaintexts: + + requirement = globals().get(f"""RQ_SRS008_AES_MySQL_Decrypt_Function_Parameters_Mode_Value_{mode.strip("'").replace("-","_").upper()}""")("1.0") + + with Example(f"""mode={mode.strip("'")} datatype={datatype.strip("'")} key={key_len} iv={iv_len}""", + requirements=[requirement]) as example: + + with Given("I have ciphertext"): + example_name = basename(example.name) + ciphertext = getattr(snapshot_module, varname(f"example_{example_name}")) + + cast = None + endcast = None + ciphertext = f"unhex({ciphertext})" + compare = plaintext + + if datatype == "IPv4": + cast = "toIPv4(IPv4NumToString(reinterpretAsUInt32" + endcast = "))" + elif datatype in ["DateTime64", "UUID", "IPv6", "LowCardinality", "Enum8", "Enum16", "Decimal32", "Decimal64", "Decimal128", "Array"]: + xfail(reason="no conversion") + elif datatype == "NULL": + ciphertext = "NULL" + cast = "isNull" + compare = None + elif datatype in ["Float32", "Float64", "Date", "DateTime"] or "Int" in datatype: + cast = f"reinterpretAs{datatype}" + + aes_decrypt_mysql(ciphertext=ciphertext, key=f"'{key[:key_len]}'", mode=mode, + iv=(None if not iv_len else f"'{iv[:iv_len]}'"), + cast=cast, endcast=endcast, compare=compare, message="1") + +@TestScenario +@Requirements( + RQ_SRS008_AES_Functions_Mismatched_Key("1.0") +) +def mismatched_key(self): + """Check that `aes_decrypt_mysql` function returns garbage or an error when key parameter does not match. + """ + key = f"{'1' * 64}" + iv = f"{'2' * 64}" + + with Given("I load encrypt snapshots"): + snapshot_module = SourceFileLoader("snapshot", os.path.join(current_dir(), "snapshots", "encrypt_mysql.py.encrypt_mysql.snapshot")).load_module() + + for mode, key_len, iv_len in mysql_modes: + with Example(f"""mode={mode.strip("'")} datatype=String key={key_len} iv={iv_len}""") as example: + with Given("I have ciphertext"): + example_name = basename(example.name) + ciphertext = getattr(snapshot_module, varname(f"example_{example_name}")) + + with When("I decrypt using a mismatched key"): + r = aes_decrypt_mysql(ciphertext=f"unhex({ciphertext})", key=f"'a{key[:key_len-1]}'", mode=mode, + iv=(None if not iv_len else f"'{iv[:iv_len]}'"), + cast="hex", no_checks=True) + + with Then("exitcode shoud be 0 or 198"): + assert r.exitcode in [0, 198], error() + + with And("output should be garbage or an error"): + output = r.output.strip() + assert "Exception: Failed to decrypt" in output or output != "31", error() + +@TestScenario +@Requirements( + RQ_SRS008_AES_Functions_Mismatched_IV("1.0") +) +def mismatched_iv(self): + """Check that `aes_decrypt_mysql` function returns garbage or an error when iv parameter does not match. + """ + key = f"{'1' * 64}" + iv = f"{'2' * 64}" + + with Given("I load encrypt snapshots"): + snapshot_module = SourceFileLoader("snapshot", os.path.join(current_dir(), "snapshots", "encrypt_mysql.py.encrypt_mysql.snapshot")).load_module() + + for mode, key_len, iv_len in mysql_modes: + if not iv_len: + continue + with Example(f"""mode={mode.strip("'")} datatype=String key={key_len} iv={iv_len}""") as example: + with Given("I have ciphertext"): + example_name = basename(example.name) + ciphertext = getattr(snapshot_module, varname(f"example_{example_name}")) + + with When("I decrypt using a mismatched key"): + r = aes_decrypt_mysql(ciphertext=f"unhex({ciphertext})", key=f"'{key[:key_len]}'", mode=mode, + iv=f"'a{iv[:iv_len-1]}'", + cast="hex", no_checks=True) + + with Then("exitcode shoud be 0 or 198"): + assert r.exitcode in [0, 198], error() + + with And("output should be garbage or an error"): + output = r.output.strip() + assert "Exception: Failed to decrypt" in output or output != "31", error() + +@TestScenario +@Requirements( + RQ_SRS008_AES_Functions_Mismatched_Mode("1.0") +) +def mismatched_mode(self): + """Check that `aes_decrypt_mysql` function returns garbage or an error when mode parameter does not match. + """ + key = f"{'1' * 64}" + iv = f"{'2' * 64}" + plaintext = hex('Gãńdåłf_Thê_Gręât'.encode("utf-8")) + + with Given("I load encrypt snapshots"): + snapshot_module = SourceFileLoader("snapshot", os.path.join(current_dir(), "snapshots", "encrypt_mysql.py.encrypt_mysql.snapshot")).load_module() + + for mode, key_len, iv_len in mysql_modes: + if not iv_len: + continue + + with Example(f"""mode={mode.strip("'")} datatype=utf8string key={key_len} iv={iv_len}""") as example: + with Given("I have ciphertext"): + example_name = basename(example.name) + ciphertext = getattr(snapshot_module, varname(f"example_{example_name}")) + + for mismatched_mode, _, _ in mysql_modes: + if mismatched_mode == mode: + continue + + with When(f"I decrypt using a mismatched mode {mismatched_mode}"): + r = aes_decrypt_mysql(ciphertext=f"unhex({ciphertext})", key=f"'{key[:key_len]}'", mode=mismatched_mode, + iv=f"'{iv[:iv_len]}'", + cast="hex", no_checks=True) + + with Then("exitcode shoud be 0 or 36 or 198"): + assert r.exitcode in [0, 36, 198], error() + + with And("output should be garbage or an error"): + output = r.output.strip() + assert "Exception: Failed to decrypt" in output or output != plaintext, error() + +@TestFeature +@Name("decrypt_mysql") +@Requirements( + RQ_SRS008_AES_MySQL_Decrypt_Function("1.0") +) +def feature(self, node="clickhouse1"): + """Check the behavior of the `aes_decrypt_mysql` function. + """ + self.context.node = self.context.cluster.node(node) + + for scenario in loads(current_module(), Scenario): + Scenario(run=scenario, flags=TE) \ No newline at end of file diff --git a/tests/testflows/aes_encryption/tests/encrypt.py b/tests/testflows/aes_encryption/tests/encrypt.py new file mode 100644 index 00000000000..2fdd75fa0c8 --- /dev/null +++ b/tests/testflows/aes_encryption/tests/encrypt.py @@ -0,0 +1,408 @@ +# -*- coding: utf-8 -*- +from testflows.core import * +from testflows.core.name import basename +from testflows.asserts import values, error, snapshot + +from aes_encryption.requirements.requirements import * +from aes_encryption.tests.common import * + +@TestOutline +def encrypt(self, plaintext=None, key=None, mode=None, iv=None, aad=None, exitcode=0, message=None, step=When): + """Execute `encrypt` function with the specified parameters. + """ + params = [] + if mode is not None: + params.append(mode) + if plaintext is not None: + params.append(plaintext) + if key is not None: + params.append(key) + if iv is not None: + params.append(iv) + if aad is not None: + params.append(aad) + + sql = "SELECT hex(encrypt(" + ", ".join(params) + "))" + + return current().context.node.query(sql, step=step, exitcode=exitcode, message=message) + +@TestScenario +@Requirements( + RQ_SRS008_AES_Functions_InvalidParameters("1.0") +) +def invalid_parameters(self): + """Check that `encrypt` function returns an error when + we call it with invalid parameters. + """ + with Example("no parameters"): + encrypt(exitcode=42, message="DB::Exception: Incorrect number of arguments for function encrypt provided 0, expected 3 to 5") + + with Example("missing key and mode"): + encrypt(plaintext="'hello there'", exitcode=42, message="DB::Exception: Incorrect number of arguments for function encrypt provided 1") + + with Example("missing mode"): + encrypt(plaintext="'hello there'", key="'123'", exitcode=42, message="DB::Exception: Incorrect number of arguments for function encrypt provided 2") + + with Example("bad key type - UInt8"): + encrypt(plaintext="'hello there'", key="123", mode="'aes-128-ecb'", exitcode=43, + message="DB::Exception: Received from localhost:9000. DB::Exception: Illegal type of argument #3") + + with Example("bad mode type - forgot quotes"): + encrypt(plaintext="'hello there'", key="'0123456789123456'", mode="aes-128-ecb", exitcode=47, + message="DB::Exception: Missing columns: 'ecb' 'aes' while processing query") + + with Example("bad mode type - UInt8"): + encrypt(plaintext="'hello there'", key="'0123456789123456'", mode="128", exitcode=43, + message="DB::Exception: Illegal type of argument #1 'mode'") + + with Example("bad iv type - UInt8"): + encrypt(plaintext="'hello there'", key="'0123456789123456'", mode="'aes-128-cbc'", iv='128', exitcode=43, + message="DB::Exception: Illegal type of argument") + + with Example("bad aad type - UInt8"): + encrypt(plaintext="'hello there'", key="'0123456789123456'", mode="'aes-128-gcm'", iv="'012345678912'", aad="123", exitcode=43, + message="DB::Exception: Illegal type of argument") + + with Example("iv not valid for mode", requirements=[RQ_SRS008_AES_Encrypt_Function_InitializationVector_NotValidForMode("1.0")]): + encrypt(plaintext="'hello there'", key="'0123456789123456'", mode="'aes-128-ecb'", iv="'012345678912'", exitcode=36, + message="DB::Exception: aes-128-ecb does not support IV") + + with Example("iv not valid for mode - size 0", requirements=[RQ_SRS008_AES_Encrypt_Function_InitializationVector_NotValidForMode("1.0")]): + encrypt(plaintext="'hello there'", key="'0123456789123456'", mode="'aes-128-ecb'", iv="''", exitcode=36, + message="DB::Exception: aes-128-ecb does not support IV") + + with Example("aad not valid for mode", requirements=[RQ_SRS008_AES_Encrypt_Function_AdditionalAuthenticationData_NotValidForMode("1.0")]): + encrypt(plaintext="'hello there'", key="'0123456789123456'", mode="'aes-128-cbc'", iv="'0123456789123456'", aad="'aad'", exitcode=36, + message="DB::Exception: AAD can be only set for GCM-mode") + + with Example("invalid mode value", requirements=[RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_Invalid("1.0")]): + with When("typo in the block algorithm"): + encrypt(plaintext="'hello there'", key="'0123456789123456'", mode="'aes-128-eeb'", exitcode=36, + message="DB::Exception: Invalid mode: aes-128-eeb") + + with When("typo in the key size"): + encrypt(plaintext="'hello there'", key="'0123456789123456'", mode="'aes-127-ecb'", exitcode=36, + message="DB::Exception: Invalid mode: aes-127-ecb") + + with When("typo in the aes prefix"): + encrypt(plaintext="'hello there'", key="'0123456789123456'", mode="'aee-128-ecb'", exitcode=36, + message="DB::Exception: Invalid mode: aee-128-ecb") + + with When("missing last dash"): + encrypt(plaintext="'hello there'", key="'0123456789123456'", mode="'aes-128ecb'", exitcode=36, + message="DB::Exception: Invalid mode: aes-128ecb") + + with When("missing first dash"): + encrypt(plaintext="'hello there'", key="'0123456789123456'", mode="'aes128-ecb'", exitcode=36, + message="DB::Exception: Invalid mode: aes128-ecb") + + with When("all capitals"): + encrypt(plaintext="'hello there'", key="'0123456789123456'", mode="'AES-128-ECB'", exitcode=36, + message="DB::Exception: Invalid mode: AES-128-ECB") + +@TestOutline(Scenario) +@Requirements( + RQ_SRS008_AES_Encrypt_Function_Key_Length_InvalidLengthError("1.0"), + RQ_SRS008_AES_Encrypt_Function_InitializationVector_Length_InvalidLengthError("1.0"), + RQ_SRS008_AES_Encrypt_Function_AdditionalAuthenticationData_NotValidForMode("1.0") +) +@Examples("mode key_len iv_len aad", [ + # ECB + ("'aes-128-ecb'", 16, None, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_128_ECB_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-ecb'", 24, None, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_192_ECB_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-ecb'", 32, None, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_256_ECB_KeyAndInitializationVector_Length("1.0"))), + # CBC + ("'aes-128-cbc'", 16, 16, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_128_CBC_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-cbc'", 24, 16, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_192_CBC_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-cbc'", 32, 16, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_256_CBC_KeyAndInitializationVector_Length("1.0"))), + # CFB1 + ("'aes-128-cfb1'", 16, 16, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_128_CFB1_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-cfb1'", 24, 16, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_192_CFB1_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-cfb1'", 32, 16, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_256_CFB1_KeyAndInitializationVector_Length("1.0"))), + # CFB8 + ("'aes-128-cfb8'", 16, 16, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_128_CFB8_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-cfb8'", 24, 16, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_192_CFB8_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-cfb8'", 32, 16, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_256_CFB8_KeyAndInitializationVector_Length("1.0"))), + # CFB128 + ("'aes-128-cfb128'", 16, 16, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_128_CFB128_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-cfb128'", 24, 16, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_192_CFB128_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-cfb128'", 32, 16, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_256_CFB128_KeyAndInitializationVector_Length("1.0"))), + # OFB + ("'aes-128-ofb'", 16, 16, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_128_OFB_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-ofb'", 24, 16, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_192_OFB_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-ofb'", 32, 16, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_256_OFB_KeyAndInitializationVector_Length("1.0"))), + # CTR + ("'aes-128-ctr'", 16, 16, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_128_CTR_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-ctr'", 24, 16, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_192_CTR_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-ctr'", 32, 16, None, + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_256_CTR_KeyAndInitializationVector_Length("1.0"))), +], "%-16s %-10s %-10s %-10s") +def invalid_key_or_iv_length_for_mode_non_gcm(self, mode, key_len, iv_len, aad): + """Check that an error is returned when key or iv length does not match + the expected value for the mode. + """ + plaintext = "'hello there'" + key = "0123456789" * 4 + iv = "0123456789" * 4 + + with When("key is too short"): + encrypt(plaintext=plaintext, key=f"'{key[:key_len-1]}'", mode=mode, exitcode=36, message="DB::Exception: Invalid key size") + + with When("key is too long"): + encrypt(plaintext=plaintext, key=f"'{key[:key_len+1]}'", mode=mode, exitcode=36, message="DB::Exception: Invalid key size") + + if iv_len is not None: + with When("iv is too short"): + encrypt(plaintext=plaintext, key=f"'{key[:key_len]}'", iv=f"'{iv[:iv_len-1]}'", mode=mode, exitcode=36, message="DB::Exception: Invalid IV size") + + with When("iv is too long"): + encrypt(plaintext=plaintext, key=f"'{key[:key_len]}'", iv=f"'{iv[:iv_len+1]}'", mode=mode, exitcode=36, message="DB::Exception: Invalid IV size") + + if aad is None: + with When("aad is specified but not needed"): + encrypt(plaintext=plaintext, key=f"'{key[:key_len]}'", iv=f"'{iv[:iv_len+1] if iv_len is not None else ''}'", aad="'AAD'", mode=mode, exitcode=36, message="DB::Exception: AAD can be only set for GCM-mode") + + else: + with When("iv is specified but not needed"): + encrypt(plaintext=plaintext, key=f"'{key[:key_len]}'", iv=f"'{iv}'", mode=mode, exitcode=36, message="DB::Exception: {} does not support IV".format(mode.strip("'"))) + +@TestOutline(Scenario) +@Requirements( + RQ_SRS008_AES_Encrypt_Function_Key_Length_InvalidLengthError("1.0"), + RQ_SRS008_AES_Encrypt_Function_InitializationVector_Length_InvalidLengthError("1.0"), + RQ_SRS008_AES_Encrypt_Function_AdditionalAuthenticationData_NotValidForMode("1.0") +) +@Examples("mode key_len iv_len aad", [ + # GCM + ("'aes-128-gcm'", 16, 8, "'hello there aad'", + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_128_GCM_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-gcm'", 24, 8, "''", + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_192_GCM_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-gcm'", 32, 8, "'a'", + Requirements(RQ_SRS008_AES_Encrypt_Function_AES_256_GCM_KeyAndInitializationVector_Length("1.0"))), +], "%-16s %-10s %-10s %-10s") +def invalid_key_or_iv_length_for_gcm(self, mode, key_len, iv_len, aad): + """Check that an error is returned when key or iv length does not match + the expected value for the GCM mode. + """ + plaintext = "'hello there'" + key = "0123456789" * 4 + iv = "0123456789" * 4 + + with When("key is too short"): + encrypt(plaintext=plaintext, key=f"'{key[:key_len-1]}'", iv=f"'{iv[:iv_len]}'", mode=mode, exitcode=36, message="DB::Exception: Invalid key size") + + with When("key is too long"): + encrypt(plaintext=plaintext, key=f"'{key[:key_len+1]}'", iv=f"'{iv[:iv_len]}'", mode=mode, exitcode=36, message="DB::Exception: Invalid key size") + + if iv_len is not None: + with When(f"iv is too short"): + encrypt(plaintext=plaintext, key=f"'{key[:key_len]}'", iv=f"'{iv[:iv_len-1]}'", mode=mode, exitcode=198, message="DB::Exception:") + else: + with When("iv is not specified"): + encrypt(plaintext=plaintext, key=f"'{key[:key_len]}'", mode=mode, exitcode=36, message="DB::Exception: Invalid IV size") + + if aad is not None: + with When(f"aad is {aad}"): + encrypt(plaintext=plaintext, key=f"'{key[:key_len]}'", iv=f"'{iv[:iv_len]}'", aad=f"{aad}", mode=mode) + +@TestScenario +@Requirements( + RQ_SRS008_AES_Encrypt_Function_Parameters_AdditionalAuthenticatedData("1.0"), + RQ_SRS008_AES_Encrypt_Function_AdditionalAuthenticationData_Length("1.0") +) +def aad_parameter_types_and_length(self): + """Check that `encrypt` function accepts `aad` parameter as the fifth argument + of either `String` or `FixedString` types and that the length is not limited. + """ + plaintext = "'hello there'" + iv = "'012345678912'" + mode = "'aes-128-gcm'" + key = "'0123456789123456'" + + with When("aad is specified using String type"): + encrypt(plaintext=plaintext, key=key, mode=mode, iv=iv, aad="'aad'", message="19A1183335B374C626B24208AAEC97F148732CE05621AC87B21526") + + with When("aad is specified using String with UTF8 characters"): + encrypt(plaintext=plaintext, key=key, mode=mode, iv=iv, aad="'Gãńdåłf_Thê_Gręât'", message="19A1183335B374C626B242C68D9618A8C2664D7B6A3FE978104B39") + + with When("aad is specified using FixedString type"): + encrypt(plaintext=plaintext, key=key, mode=mode, iv=iv, aad="toFixedString('aad', 3)", message="19A1183335B374C626B24208AAEC97F148732CE05621AC87B21526") + + with When("aad is specified using FixedString with UTF8 characters"): + encrypt(plaintext=plaintext, key=key, mode=mode, iv=iv, aad="toFixedString('Gãńdåłf_Thê_Gręât', 24)", message="19A1183335B374C626B242C68D9618A8C2664D7B6A3FE978104B39") + + with When("aad is 0 bytes"): + encrypt(plaintext=plaintext, key=key, mode=mode, iv=iv, aad="''", message="19A1183335B374C626B242DF92BB3F57F5D82BEDF41FD5D49F8BC9") + + with When("aad is 1 byte"): + encrypt(plaintext=plaintext, key=key, mode=mode, iv=iv, aad="'1'", message="19A1183335B374C626B242D1BCFC63B09CFE9EAD20285044A01035") + + with When("aad is 256 bytes"): + encrypt(plaintext=plaintext, key=key, mode=mode, iv=iv, aad=f"'{'1' * 256}'", message="19A1183335B374C626B242355AD3DD2C5D7E36AEECBB847BF9E8A7") + +@TestScenario +@Requirements( + RQ_SRS008_AES_Encrypt_Function_Parameters_InitializationVector("1.0") +) +def iv_parameter_types(self): + """Check that `encrypt` function accepts `iv` parameter as the fourth argument + of either `String` or `FixedString` types. + """ + plaintext = "'hello there'" + iv = "'0123456789123456'" + mode = "'aes-128-cbc'" + key = "'0123456789123456'" + + with When("iv is specified using String type"): + encrypt(plaintext=plaintext, key=key, mode=mode, iv=iv, message="F024F9372FA0D8B974894D29FFB8A7F7") + + with When("iv is specified using String with UTF8 characters"): + encrypt(plaintext=plaintext, key=key, mode=mode, iv="'Gãńdåłf_Thê'", message="7A4EC0FF3796F46BED281F4778ACE1DC") + + with When("iv is specified using FixedString type"): + encrypt(plaintext=plaintext, key=key, mode=mode, iv=f"toFixedString({iv}, 16)", message="F024F9372FA0D8B974894D29FFB8A7F7") + + with When("iv is specified using FixedString with UTF8 characters"): + encrypt(plaintext=plaintext, key=key, mode=mode, iv="toFixedString('Gãńdåłf_Thê', 16)", message="7A4EC0FF3796F46BED281F4778ACE1DC") + +@TestScenario +@Requirements( + RQ_SRS008_AES_Encrypt_Function_Parameters_Key("1.0") +) +def key_parameter_types(self): + """Check that `encrypt` function accepts `key` parameter as the second argument + of either `String` or `FixedString` types. + """ + plaintext = "'hello there'" + iv = "'0123456789123456'" + mode = "'aes-128-cbc'" + key = "'0123456789123456'" + + with When("key is specified using String type"): + encrypt(plaintext=plaintext, key=key, mode=mode, message="49C9ADB81BA9B58C485E7ADB90E70576") + + with When("key is specified using String with UTF8 characters"): + encrypt(plaintext=plaintext, key="'Gãńdåłf_Thê'", mode=mode, message="180086AA42AD57B71C706EEC372D0C3D") + + with When("key is specified using FixedString type"): + encrypt(plaintext=plaintext, key=f"toFixedString({key}, 16)", mode=mode, message="49C9ADB81BA9B58C485E7ADB90E70576") + + with When("key is specified using FixedString with UTF8 characters"): + encrypt(plaintext=plaintext, key="toFixedString('Gãńdåłf_Thê', 16)", mode=mode, message="180086AA42AD57B71C706EEC372D0C3D") + +@TestScenario +@Requirements( + RQ_SRS008_AES_Encrypt_Function_Parameters_Mode("1.0"), +) +def mode_parameter_types(self): + """Check that `encrypt` function accepts `mode` parameter as the third argument + of either `String` or `FixedString` types. + """ + plaintext = "'hello there'" + mode = "'aes-128-cbc'" + key = "'0123456789123456'" + + with When("mode is specified using String type"): + encrypt(plaintext=plaintext, key=key, mode=mode, message="49C9ADB81BA9B58C485E7ADB90E70576") + + with When("mode is specified using FixedString type"): + encrypt(plaintext=plaintext, key=key, mode=f"toFixedString({mode}, 12)", message="49C9ADB81BA9B58C485E7ADB90E70576") + +@TestScenario +@Requirements( + RQ_SRS008_AES_Encrypt_Function_Parameters_PlainText("1.0"), + RQ_SRS008_AES_Encrypt_Function_Parameters_Mode("1.0"), + RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_ValuesFormat("1.0"), +) +def encryption(self): + """Check that `encrypt` functions accepts `plaintext` as the second parameter + with any data type and `mode` as the first parameter. + """ + key = f"{'1' * 36}" + iv = f"{'2' * 16}" + aad = "some random aad" + + for mode, key_len, iv_len, aad_len in modes: + for datatype, plaintext in plaintexts: + + requirement = globals().get(f"""RQ_SRS008_AES_Encrypt_Function_Parameters_Mode_Value_{mode.strip("'").replace("-","_").upper()}""")("1.0") + + with Example(f"""mode={mode.strip("'")} datatype={datatype.strip("'")} iv={iv_len} aad={aad_len}""", + requirements=[requirement]) as example: + r = encrypt(plaintext=plaintext, key=f"'{key[:key_len]}'", mode=mode, + iv=(None if not iv_len else f"'{iv[:iv_len]}'"), aad=(None if not aad_len else f"'{aad}'")) + + with Then("I check output against snapshot"): + with values() as that: + example_name = basename(example.name) + assert that(snapshot(r.output.strip(), "encrypt", name=f"example_{example_name.replace(' ', '_')}")), error() + +@TestScenario +@Requirements( + RQ_SRS008_AES_Encrypt_Function_Parameters_ReturnValue("1.0") +) +def return_value(self): + """Check that `encrypt` functions returns String data type. + """ + plaintext = "'hello there'" + iv = "'0123456789123456'" + mode = "'aes-128-cbc'" + key = "'0123456789123456'" + + with When("I get type of the return value"): + sql = "SELECT toTypeName(encrypt(" + mode + "," + plaintext + "," + key + "," + iv + "))" + r = self.context.node.query(sql) + + with Then("type should be String"): + assert r.output.strip() == "String", error() + + with When("I get return ciphertext as hex"): + encrypt(plaintext=plaintext, key=key, mode=mode, iv=iv, message="F024F9372FA0D8B974894D29FFB8A7F7") + +@TestScenario +@Requirements( + RQ_SRS008_AES_Encrypt_Function_Syntax("1.0"), +) +def syntax(self): + """Check that `encrypt` function supports syntax + + ```sql + encrypt(plaintext, key, mode, [iv, aad]) + ``` + """ + sql = "SELECT hex(encrypt('aes-128-gcm', 'hello there', '0123456789123456', '012345678912', 'AAD'))" + self.context.node.query(sql, step=When, message="19A1183335B374C626B242A6F6E8712E2B64DCDC6A468B2F654614") + +@TestFeature +@Name("encrypt") +@Requirements( + RQ_SRS008_AES_Encrypt_Function("1.0") +) +def feature(self, node="clickhouse1"): + """Check the behavior of the `encrypt` function. + """ + self.context.node = self.context.cluster.node(node) + + for scenario in loads(current_module(), Scenario): + Scenario(run=scenario, flags=TE) diff --git a/tests/testflows/aes_encryption/tests/encrypt_mysql.py b/tests/testflows/aes_encryption/tests/encrypt_mysql.py new file mode 100644 index 00000000000..56183aff125 --- /dev/null +++ b/tests/testflows/aes_encryption/tests/encrypt_mysql.py @@ -0,0 +1,326 @@ +from testflows.core import * +from testflows.core.name import basename +from testflows.asserts import values, error, snapshot + +from aes_encryption.requirements.requirements import * +from aes_encryption.tests.common import * + +@TestOutline +def aes_encrypt_mysql(self, plaintext=None, key=None, mode=None, iv=None, exitcode=0, message=None, step=When): + """Execute `aes_encrypt_mysql` function with the specified parameters. + """ + params = [] + if mode is not None: + params.append(mode) + if plaintext is not None: + params.append(plaintext) + if key is not None: + params.append(key) + if iv is not None: + params.append(iv) + + sql = "SELECT hex(aes_encrypt_mysql(" + ", ".join(params) + "))" + + return current().context.node.query(sql, step=step, exitcode=exitcode, message=message) + +@TestOutline(Scenario) +@Examples("mode", [ + ("'aes-128-gcm'", Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_128_GCM_Error("1.0"))), + ("'aes-192-gcm'", Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_192_GCM_Error("1.0"))), + ("'aes-256-gcm'", Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_256_GCM_Error("1.0"))), + ("'aes-128-ctr'", Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_128_CTR_Error("1.0"))), + ("'aes-192-ctr'", Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_192_CTR_Error("1.0"))), + ("'aes-256-ctr'", Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_AES_256_CTR_Error("1.0"))), +]) +def unsupported_modes(self, mode): + """Check that `aes_encrypt_mysql` function returns an error when unsupported modes are specified. + """ + aes_encrypt_mysql(plaintext="'hello there'", mode=mode, key=f"'{'1'* 32}'", exitcode=36, message="DB::Exception: Unsupported cipher mode") + +@TestScenario +@Requirements( + RQ_SRS008_AES_Functions_InvalidParameters("1.0") +) +def invalid_parameters(self): + """Check that `aes_encrypt_mysql` function returns an error when + we call it with invalid parameters. + """ + with Example("no parameters"): + aes_encrypt_mysql(exitcode=42, message="DB::Exception: Incorrect number of arguments for function aes_encrypt provided 0, expected 3 to 4") + + with Example("missing key and mode"): + aes_encrypt_mysql(plaintext="'hello there'", exitcode=42, message="DB::Exception: Incorrect number of arguments for function aes_encrypt_mysql provided 1") + + with Example("missing mode"): + aes_encrypt_mysql(plaintext="'hello there'", key="'123'", exitcode=42, message="DB::Exception: Incorrect number of arguments for function aes_encrypt_mysql provided 2") + + with Example("bad key type - UInt8"): + aes_encrypt_mysql(plaintext="'hello there'", key="123", mode="'aes-128-ecb'", exitcode=43, + message="DB::Exception: Received from localhost:9000. DB::Exception: Illegal type of argument #3") + + with Example("bad mode type - forgot quotes"): + aes_encrypt_mysql(plaintext="'hello there'", key="'0123456789123456'", mode="aes-128-ecb", exitcode=47, + message="DB::Exception: Missing columns: 'ecb' 'aes' while processing query") + + with Example("bad mode type - UInt8"): + aes_encrypt_mysql(plaintext="'hello there'", key="'0123456789123456'", mode="128", exitcode=43, + message="DB::Exception: Illegal type of argument #1 'mode'") + + with Example("bad iv type - UInt8"): + aes_encrypt_mysql(plaintext="'hello there'", key="'0123456789123456'", mode="'aes-128-cbc'", iv='128', exitcode=43, + message="DB::Exception: Illegal type of argument") + + with Example("iv not valid for mode", requirements=[RQ_SRS008_AES_MySQL_Encrypt_Function_InitializationVector_NotValidForMode("1.0")]): + aes_encrypt_mysql(plaintext="'hello there'", key="'0123456789123456'", mode="'aes-128-ecb'", iv="'012345678912'", exitcode=36, + message="DB::Exception: aes-128-ecb does not support IV") + + with Example("iv not valid for mode - size 0", requirements=[RQ_SRS008_AES_MySQL_Encrypt_Function_InitializationVector_NotValidForMode("1.0")]): + aes_encrypt_mysql(plaintext="'hello there'", key="'0123456789123456'", mode="'aes-128-ecb'", iv="''", exitcode=0, + message=None) + + with Example("invalid mode value", requirements=[RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_Invalid("1.0")]): + with When("typo in the block algorithm"): + aes_encrypt_mysql(plaintext="'hello there'", key="'0123456789123456'", mode="'aes-128-eeb'", exitcode=36, + message="DB::Exception: Invalid mode: aes-128-eeb") + + with When("typo in the key size"): + aes_encrypt_mysql(plaintext="'hello there'", key="'0123456789123456'", mode="'aes-127-ecb'", exitcode=36, + message="DB::Exception: Invalid mode: aes-127-ecb") + + with When("typo in the aes prefix"): + aes_encrypt_mysql(plaintext="'hello there'", key="'0123456789123456'", mode="'aee-128-ecb'", exitcode=36, + message="DB::Exception: Invalid mode: aee-128-ecb") + + with When("missing last dash"): + aes_encrypt_mysql(plaintext="'hello there'", key="'0123456789123456'", mode="'aes-128ecb'", exitcode=36, + message="DB::Exception: Invalid mode: aes-128ecb") + + with When("missing first dash"): + aes_encrypt_mysql(plaintext="'hello there'", key="'0123456789123456'", mode="'aes128-ecb'", exitcode=36, + message="DB::Exception: Invalid mode: aes128-ecb") + + with When("all capitals"): + aes_encrypt_mysql(plaintext="'hello there'", key="'0123456789123456'", mode="'AES-128-ECB'", exitcode=36, + message="DB::Exception: Invalid mode: AES-128-ECB") + +@TestOutline(Scenario) +@Requirements( + RQ_SRS008_AES_MySQL_Encrypt_Function_Key_Length_TooShortError("1.0"), + RQ_SRS008_AES_MySQL_Encrypt_Function_Key_Length_TooLong("1.0"), + RQ_SRS008_AES_MySQL_Encrypt_Function_InitializationVector_Length_TooShortError("1.0"), + RQ_SRS008_AES_MySQL_Encrypt_Function_InitializationVector_Length_TooLong("1.0"), + RQ_SRS008_AES_MySQL_Encrypt_Function_InitializationVector_NotValidForMode("1.0") +) +@Examples("mode key_len iv_len", [ + # ECB + ("'aes-128-ecb'", 16, None, + Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_AES_128_ECB_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-ecb'", 24, None, + Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_AES_192_ECB_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-ecb'", 32, None, + Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_AES_256_ECB_KeyAndInitializationVector_Length("1.0"))), + # CBC + ("'aes-128-cbc'", 16, 16, + Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_AES_128_CBC_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-cbc'", 24, 16, + Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_AES_192_CBC_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-cbc'", 32, 16, + Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_AES_256_CBC_KeyAndInitializationVector_Length("1.0"))), + # CFB1 + ("'aes-128-cfb1'", 16, 16, + Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_AES_128_CFB1_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-cfb1'", 24, 16, + Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_AES_192_CFB1_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-cfb1'", 32, 16, + Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_AES_256_CFB1_KeyAndInitializationVector_Length("1.0"))), + # CFB8 + ("'aes-128-cfb8'", 16, 16, + Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_AES_128_CFB8_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-cfb8'", 24, 16, + Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_AES_192_CFB8_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-cfb8'", 32, 16, + Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_AES_256_CFB8_KeyAndInitializationVector_Length("1.0"))), + # CFB128 + ("'aes-128-cfb128'", 16, 16, + Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_AES_128_CFB128_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-cfb128'", 24, 16, + Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_AES_192_CFB128_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-cfb128'", 32, 16, + Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_AES_256_CFB128_KeyAndInitializationVector_Length("1.0"))), + # OFB + ("'aes-128-ofb'", 16, 16, + Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_AES_128_OFB_KeyAndInitializationVector_Length("1.0"))), + ("'aes-192-ofb'", 24, 16, + Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_AES_192_OFB_KeyAndInitializationVector_Length("1.0"))), + ("'aes-256-ofb'", 32, 16, + Requirements(RQ_SRS008_AES_MySQL_Encrypt_Function_AES_256_OFB_KeyAndInitializationVector_Length("1.0"))), +], "%-16s %-10s %-10s") +def key_or_iv_length_for_mode(self, mode, key_len, iv_len): + """Check that key or iv length for mode. + """ + plaintext = "'hello there'" + key = "0123456789" * 4 + iv = "0123456789" * 4 + + with When("key is too short"): + aes_encrypt_mysql(plaintext=plaintext, key=f"'{key[:key_len-1]}'", mode=mode, exitcode=36, message="DB::Exception: Invalid key size") + + with When("key is too long"): + aes_encrypt_mysql(plaintext=plaintext, key=f"'{key[:key_len+1]}'", mode=mode) + + if iv_len is not None: + with When("iv is too short"): + aes_encrypt_mysql(plaintext=plaintext, key=f"'{key[:key_len]}'", iv=f"'{iv[:iv_len-1]}'", mode=mode, exitcode=36, message="DB::Exception: Invalid IV size") + + with When("iv is too long"): + aes_encrypt_mysql(plaintext=plaintext, key=f"'{key[:key_len]}'", iv=f"'{iv[:iv_len+1]}'", mode=mode) + else: + with When("iv is specified but not needed"): + aes_encrypt_mysql(plaintext=plaintext, key=f"'{key[:key_len]}'", iv=f"'{iv}'", mode=mode, exitcode=36, message="DB::Exception: Invalid IV size") + +@TestScenario +@Requirements( + RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_InitializationVector("1.0") +) +def iv_parameter_types(self): + """Check that `aes_encrypt_mysql` function accepts `iv` parameter as the fourth argument + of either `String` or `FixedString` types. + """ + plaintext = "'hello there'" + iv = "'0123456789123456'" + mode = "'aes-128-cbc'" + key = "'0123456789123456'" + + with When("iv is specified using String type"): + aes_encrypt_mysql(plaintext=plaintext, key=key, mode=mode, iv=iv, message="F024F9372FA0D8B974894D29FFB8A7F7") + + with When("iv is specified using String with UTF8 characters"): + aes_encrypt_mysql(plaintext=plaintext, key=key, mode=mode, iv="'Gãńdåłf_Thê'", message="7A4EC0FF3796F46BED281F4778ACE1DC") + + with When("iv is specified using FixedString type"): + aes_encrypt_mysql(plaintext=plaintext, key=key, mode=mode, iv=f"toFixedString({iv}, 16)", message="F024F9372FA0D8B974894D29FFB8A7F7") + + with When("iv is specified using FixedString with UTF8 characters"): + aes_encrypt_mysql(plaintext=plaintext, key=key, mode=mode, iv="toFixedString('Gãńdåłf_Thê', 16)", message="7A4EC0FF3796F46BED281F4778ACE1DC") + + +@TestScenario +@Requirements( + RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Key("1.0") +) +def key_parameter_types(self): + """Check that `aes_encrypt_mysql` function accepts `key` parameter as the second argument + of either `String` or `FixedString` types. + """ + plaintext = "'hello there'" + iv = "'0123456789123456'" + mode = "'aes-128-cbc'" + key = "'0123456789123456'" + + with When("key is specified using String type"): + aes_encrypt_mysql(plaintext=plaintext, key=key, mode=mode, message="49C9ADB81BA9B58C485E7ADB90E70576") + + with When("key is specified using String with UTF8 characters"): + aes_encrypt_mysql(plaintext=plaintext, key="'Gãńdåłf_Thê'", mode=mode, message="180086AA42AD57B71C706EEC372D0C3D") + + with When("key is specified using FixedString type"): + aes_encrypt_mysql(plaintext=plaintext, key=f"toFixedString({key}, 16)", mode=mode, message="49C9ADB81BA9B58C485E7ADB90E70576") + + with When("key is specified using FixedString with UTF8 characters"): + aes_encrypt_mysql(plaintext=plaintext, key="toFixedString('Gãńdåłf_Thê', 16)", mode=mode, message="180086AA42AD57B71C706EEC372D0C3D") + + +@TestScenario +@Requirements( + RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode("1.0"), +) +def mode_parameter_types(self): + """Check that `aes_encrypt_mysql` function accepts `mode` parameter as the third argument + of either `String` or `FixedString` types. + """ + plaintext = "'hello there'" + mode = "'aes-128-cbc'" + key = "'0123456789123456'" + + with When("mode is specified using String type"): + aes_encrypt_mysql(plaintext=plaintext, key=key, mode=mode, message="49C9ADB81BA9B58C485E7ADB90E70576") + + with When("mode is specified using FixedString type"): + aes_encrypt_mysql(plaintext=plaintext, key=key, mode=f"toFixedString({mode}, 12)", message="49C9ADB81BA9B58C485E7ADB90E70576") + +@TestScenario +@Requirements( + RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_ReturnValue("1.0") +) +def return_value(self): + """Check that `aes_encrypt_mysql` functions returns String data type. + """ + plaintext = "'hello there'" + iv = "'0123456789123456'" + mode = "'aes-128-cbc'" + key = "'0123456789123456'" + + with When("I get type of the return value"): + sql = "SELECT toTypeName(aes_encrypt_mysql("+ mode + "," + plaintext + "," + key + "," + iv + "))" + r = self.context.node.query(sql) + + with Then("type should be String"): + assert r.output.strip() == "String", error() + + with When("I get return ciphertext as hex"): + aes_encrypt_mysql(plaintext=plaintext, key=key, mode=mode, iv=iv, message="F024F9372FA0D8B974894D29FFB8A7F7") + +@TestScenario +@Requirements( + RQ_SRS008_AES_MySQL_Encrypt_Function_Syntax("1.0"), +) +def syntax(self): + """Check that `aes_encrypt_mysql` function supports syntax + + ```sql + aes_encrypt_mysql(plaintext, key, mode, [iv]) + ``` + """ + sql = "SELECT hex(aes_encrypt_mysql('aes-128-ofb', 'hello there', '0123456789123456', '0123456789123456'))" + self.context.node.query(sql, step=When, message="70FE78410D6EE237C2DE4A") + +@TestScenario +@Requirements( + RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_PlainText("1.0"), + RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode("1.0"), + RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_ValuesFormat("1.0"), +) +def encryption(self): + """Check that `aes_encrypt_mysql` functions accepts `plaintext` as the second parameter + with any data type and `mode` as the first parameter. + """ + key = f"{'1' * 64}" + iv = f"{'2' * 64}" + + for mode, key_len, iv_len in mysql_modes: + for datatype, plaintext in plaintexts: + requirement = globals().get(f"""RQ_SRS008_AES_MySQL_Encrypt_Function_Parameters_Mode_Value_{mode.strip("'").replace("-","_").upper()}""")("1.0") + + with Example(f"""mode={mode.strip("'")} datatype={datatype.strip("'")} key={key_len} iv={iv_len}""", + requirements=[requirement]) as example: + + r = aes_encrypt_mysql(plaintext=plaintext, key=f"'{key[:key_len]}'", mode=mode, + iv=(None if not iv_len else f"'{iv[:iv_len]}'")) + + with Then("I check output against snapshot"): + with values() as that: + example_name = basename(example.name) + assert that(snapshot(r.output.strip(), "encrypt_mysql", name=f"example_{example_name.replace(' ', '_')}")), error() + +@TestFeature +@Name("encrypt_mysql") +@Requirements( + RQ_SRS008_AES_MySQL_Encrypt_Function("1.0") +) +def feature(self, node="clickhouse1"): + """Check the behavior of the `aes_encrypt_mysql` function. + """ + self.context.node = self.context.cluster.node(node) + + for scenario in loads(current_module(), Scenario): + Scenario(run=scenario, flags=TE) diff --git a/tests/testflows/aes_encryption/tests/snapshots/encrypt.py.encrypt.snapshot b/tests/testflows/aes_encryption/tests/snapshots/encrypt.py.encrypt.snapshot new file mode 100644 index 00000000000..566c1074efb --- /dev/null +++ b/tests/testflows/aes_encryption/tests/snapshots/encrypt.py.encrypt.snapshot @@ -0,0 +1,2700 @@ +example_mode_aes_128_ecb_datatype_String_iv_None_aad_None = r"""'7C51909F95C1E9B886A3487CD3EBED69'""" + +example_mode_aes_128_ecb_datatype_FixedString_iv_None_aad_None = r"""'7C51909F95C1E9B886A3487CD3EBED69'""" + +example_mode_aes_128_ecb_datatype_UInt8_iv_None_aad_None = r"""'4CDF8A192A06AC6EDBDCE2BFB53B7D73'""" + +example_mode_aes_128_ecb_datatype_UInt16_iv_None_aad_None = r"""'12FB5B75B1CB5DF0DC70D8039758691D'""" + +example_mode_aes_128_ecb_datatype_UInt32_iv_None_aad_None = r"""'E86C0858C6D9CCD970BA6DC320038306'""" + +example_mode_aes_128_ecb_datatype_UInt64_iv_None_aad_None = r"""'2D43D83E0250AE8AC4403551B639F694'""" + +example_mode_aes_128_ecb_datatype_Int8_iv_None_aad_None = r"""'4CDF8A192A06AC6EDBDCE2BFB53B7D73'""" + +example_mode_aes_128_ecb_datatype_Int16_iv_None_aad_None = r"""'12FB5B75B1CB5DF0DC70D8039758691D'""" + +example_mode_aes_128_ecb_datatype_Int32_iv_None_aad_None = r"""'E86C0858C6D9CCD970BA6DC320038306'""" + +example_mode_aes_128_ecb_datatype_Int64_iv_None_aad_None = r"""'2D43D83E0250AE8AC4403551B639F694'""" + +example_mode_aes_128_ecb_datatype_Float32_iv_None_aad_None = r"""'FF4D70D9A1050E6BBDD0325FC45CC22D'""" + +example_mode_aes_128_ecb_datatype_Float64_iv_None_aad_None = r"""'75FE6B4A722A31D7760680CC1B9F131D'""" + +example_mode_aes_128_ecb_datatype_Decimal32_iv_None_aad_None = r"""'83BBD7CCE7E5A38071653870475D48D2'""" + +example_mode_aes_128_ecb_datatype_Decimal64_iv_None_aad_None = r"""'BE0DD9302B2952CE9CC3721DD85C8E66'""" + +example_mode_aes_128_ecb_datatype_Decimal128_iv_None_aad_None = r"""'5F3DBFA74809E45E03980357B26787AFF30C69C4F945E654EBD4B388B1C8F790'""" + +example_mode_aes_128_ecb_datatype_UUID_iv_None_aad_None = r"""'FF9161B222B4A67481271035745F06D9F30C69C4F945E654EBD4B388B1C8F790'""" + +example_mode_aes_128_ecb_datatype_Date_iv_None_aad_None = r"""'1E4FBE33752D96D147E890C29A409BFE'""" + +example_mode_aes_128_ecb_datatype_DateTime_iv_None_aad_None = r"""'384F3D97B78D52C73CD06C0E1B6DE399'""" + +example_mode_aes_128_ecb_datatype_DateTime64_iv_None_aad_None = r"""'C7F50A2D0175F3ED280AD42FF01FF5F2'""" + +example_mode_aes_128_ecb_datatype_LowCardinality_iv_None_aad_None = r"""'7C51909F95C1E9B886A3487CD3EBED69'""" + +example_mode_aes_128_ecb_datatype_Array_iv_None_aad_None = r"""'D9152D05CFA9E162983A5A2E883109B4'""" + +example_mode_aes_128_ecb_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_128_ecb_datatype_IPv4_iv_None_aad_None = r"""'4F32782638C1F33C6A7202CA83F0C12C'""" + +example_mode_aes_128_ecb_datatype_IPv6_iv_None_aad_None = r"""'F54700FF04ADAD342BA6830DB12AD7E9F30C69C4F945E654EBD4B388B1C8F790'""" + +example_mode_aes_128_ecb_datatype_Enum8_iv_None_aad_None = r"""'4CDF8A192A06AC6EDBDCE2BFB53B7D73'""" + +example_mode_aes_128_ecb_datatype_Enum16_iv_None_aad_None = r"""'12FB5B75B1CB5DF0DC70D8039758691D'""" + +example_mode_aes_192_ecb_datatype_String_iv_None_aad_None = r"""'1AE38A541D466EDFED572EE839B0907F'""" + +example_mode_aes_192_ecb_datatype_FixedString_iv_None_aad_None = r"""'1AE38A541D466EDFED572EE839B0907F'""" + +example_mode_aes_192_ecb_datatype_UInt8_iv_None_aad_None = r"""'01CC3C67F07C3FA6E5EFB7AE5F19130B'""" + +example_mode_aes_192_ecb_datatype_UInt16_iv_None_aad_None = r"""'B50A3019F16B9C643FB40259E4B09308'""" + +example_mode_aes_192_ecb_datatype_UInt32_iv_None_aad_None = r"""'9F32F3F6B3C3B1830F56B5B94C93875D'""" + +example_mode_aes_192_ecb_datatype_UInt64_iv_None_aad_None = r"""'8DE807D54B7717BFC773567D9FFE292D'""" + +example_mode_aes_192_ecb_datatype_Int8_iv_None_aad_None = r"""'01CC3C67F07C3FA6E5EFB7AE5F19130B'""" + +example_mode_aes_192_ecb_datatype_Int16_iv_None_aad_None = r"""'B50A3019F16B9C643FB40259E4B09308'""" + +example_mode_aes_192_ecb_datatype_Int32_iv_None_aad_None = r"""'9F32F3F6B3C3B1830F56B5B94C93875D'""" + +example_mode_aes_192_ecb_datatype_Int64_iv_None_aad_None = r"""'8DE807D54B7717BFC773567D9FFE292D'""" + +example_mode_aes_192_ecb_datatype_Float32_iv_None_aad_None = r"""'4E0C122631ED64EAD726833291A81878'""" + +example_mode_aes_192_ecb_datatype_Float64_iv_None_aad_None = r"""'3F723599278E22E4692CE7D7D5F9A12F'""" + +example_mode_aes_192_ecb_datatype_Decimal32_iv_None_aad_None = r"""'2420D49DBAA5CEF7D853C98DA1BD33BF'""" + +example_mode_aes_192_ecb_datatype_Decimal64_iv_None_aad_None = r"""'FDF594113FCC2776653ED109A51FADF1'""" + +example_mode_aes_192_ecb_datatype_Decimal128_iv_None_aad_None = r"""'79207931793E374FB5A3A2AC1ECA857AD8ED6FC305C161EFCF57A383DAF31A83'""" + +example_mode_aes_192_ecb_datatype_UUID_iv_None_aad_None = r"""'9FDB738E78D0D2F774C484ED82A854E4D8ED6FC305C161EFCF57A383DAF31A83'""" + +example_mode_aes_192_ecb_datatype_Date_iv_None_aad_None = r"""'2CDD4685168FA3E2A7FA2092E86F44D4'""" + +example_mode_aes_192_ecb_datatype_DateTime_iv_None_aad_None = r"""'A4BEE097872E44FAD94D6707D6643DF5'""" + +example_mode_aes_192_ecb_datatype_DateTime64_iv_None_aad_None = r"""'1798B23C09F783623943560DF142E0F3'""" + +example_mode_aes_192_ecb_datatype_LowCardinality_iv_None_aad_None = r"""'1AE38A541D466EDFED572EE839B0907F'""" + +example_mode_aes_192_ecb_datatype_Array_iv_None_aad_None = r"""'7C0B9021CAF2CBBB06DBF589740DCC65'""" + +example_mode_aes_192_ecb_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_192_ecb_datatype_IPv4_iv_None_aad_None = r"""'B20465C932A0719BA04E2F76371510D8'""" + +example_mode_aes_192_ecb_datatype_IPv6_iv_None_aad_None = r"""'CCCDC9B9C3F182254591DFEDDCE9F232D8ED6FC305C161EFCF57A383DAF31A83'""" + +example_mode_aes_192_ecb_datatype_Enum8_iv_None_aad_None = r"""'01CC3C67F07C3FA6E5EFB7AE5F19130B'""" + +example_mode_aes_192_ecb_datatype_Enum16_iv_None_aad_None = r"""'B50A3019F16B9C643FB40259E4B09308'""" + +example_mode_aes_256_ecb_datatype_String_iv_None_aad_None = r"""'C91184ED1E67F0CDED89B097D5D3B130'""" + +example_mode_aes_256_ecb_datatype_FixedString_iv_None_aad_None = r"""'C91184ED1E67F0CDED89B097D5D3B130'""" + +example_mode_aes_256_ecb_datatype_UInt8_iv_None_aad_None = r"""'3605C5E38A448F5FEFABADF3B9983FDF'""" + +example_mode_aes_256_ecb_datatype_UInt16_iv_None_aad_None = r"""'2E5299C7A5672D8779BA9DDDE1DBCE00'""" + +example_mode_aes_256_ecb_datatype_UInt32_iv_None_aad_None = r"""'D8876CDF9B97DD110E780F958C1EA2AA'""" + +example_mode_aes_256_ecb_datatype_UInt64_iv_None_aad_None = r"""'F6E11A48B6D830F7B8D0817885C05D3C'""" + +example_mode_aes_256_ecb_datatype_Int8_iv_None_aad_None = r"""'3605C5E38A448F5FEFABADF3B9983FDF'""" + +example_mode_aes_256_ecb_datatype_Int16_iv_None_aad_None = r"""'2E5299C7A5672D8779BA9DDDE1DBCE00'""" + +example_mode_aes_256_ecb_datatype_Int32_iv_None_aad_None = r"""'D8876CDF9B97DD110E780F958C1EA2AA'""" + +example_mode_aes_256_ecb_datatype_Int64_iv_None_aad_None = r"""'F6E11A48B6D830F7B8D0817885C05D3C'""" + +example_mode_aes_256_ecb_datatype_Float32_iv_None_aad_None = r"""'A11ED1B75CF1C04C6CA3A31E76627D4C'""" + +example_mode_aes_256_ecb_datatype_Float64_iv_None_aad_None = r"""'464C85EB7DB36D95CF48A3431CC7B2BC'""" + +example_mode_aes_256_ecb_datatype_Decimal32_iv_None_aad_None = r"""'988C793BD81036C1D05EC47F43851269'""" + +example_mode_aes_256_ecb_datatype_Decimal64_iv_None_aad_None = r"""'50FFB9C104DBFF3F415F12BA73D6FF1C'""" + +example_mode_aes_256_ecb_datatype_Decimal128_iv_None_aad_None = r"""'B04C40C085A262E3AA27F8E7F6831DCB217E121CBD32CEC1F6FD3EBDF414BC34'""" + +example_mode_aes_256_ecb_datatype_UUID_iv_None_aad_None = r"""'6A36D74ACB38B95FA77BC757A7AB2C34217E121CBD32CEC1F6FD3EBDF414BC34'""" + +example_mode_aes_256_ecb_datatype_Date_iv_None_aad_None = r"""'F1CFA361A9B08FC101F3A4707A3E04D2'""" + +example_mode_aes_256_ecb_datatype_DateTime_iv_None_aad_None = r"""'D58178485CD1AE1C30F68383307B8BC5'""" + +example_mode_aes_256_ecb_datatype_DateTime64_iv_None_aad_None = r"""'A19B65BCB740B2AF4D421CE1DEC43608'""" + +example_mode_aes_256_ecb_datatype_LowCardinality_iv_None_aad_None = r"""'C91184ED1E67F0CDED89B097D5D3B130'""" + +example_mode_aes_256_ecb_datatype_Array_iv_None_aad_None = r"""'C4071E4FD44F004347EA9932326B7038'""" + +example_mode_aes_256_ecb_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_256_ecb_datatype_IPv4_iv_None_aad_None = r"""'6C7950041CB4041D4D8036FCD22E3B06'""" + +example_mode_aes_256_ecb_datatype_IPv6_iv_None_aad_None = r"""'8CBF2DC164F4086B8DD14B75E3065621217E121CBD32CEC1F6FD3EBDF414BC34'""" + +example_mode_aes_256_ecb_datatype_Enum8_iv_None_aad_None = r"""'3605C5E38A448F5FEFABADF3B9983FDF'""" + +example_mode_aes_256_ecb_datatype_Enum16_iv_None_aad_None = r"""'2E5299C7A5672D8779BA9DDDE1DBCE00'""" + +example_mode_aes_128_cbc_datatype_String_iv_None_aad_None = r"""'7C51909F95C1E9B886A3487CD3EBED69'""" + +example_mode_aes_128_cbc_datatype_FixedString_iv_None_aad_None = r"""'7C51909F95C1E9B886A3487CD3EBED69'""" + +example_mode_aes_128_cbc_datatype_UInt8_iv_None_aad_None = r"""'4CDF8A192A06AC6EDBDCE2BFB53B7D73'""" + +example_mode_aes_128_cbc_datatype_UInt16_iv_None_aad_None = r"""'12FB5B75B1CB5DF0DC70D8039758691D'""" + +example_mode_aes_128_cbc_datatype_UInt32_iv_None_aad_None = r"""'E86C0858C6D9CCD970BA6DC320038306'""" + +example_mode_aes_128_cbc_datatype_UInt64_iv_None_aad_None = r"""'2D43D83E0250AE8AC4403551B639F694'""" + +example_mode_aes_128_cbc_datatype_Int8_iv_None_aad_None = r"""'4CDF8A192A06AC6EDBDCE2BFB53B7D73'""" + +example_mode_aes_128_cbc_datatype_Int16_iv_None_aad_None = r"""'12FB5B75B1CB5DF0DC70D8039758691D'""" + +example_mode_aes_128_cbc_datatype_Int32_iv_None_aad_None = r"""'E86C0858C6D9CCD970BA6DC320038306'""" + +example_mode_aes_128_cbc_datatype_Int64_iv_None_aad_None = r"""'2D43D83E0250AE8AC4403551B639F694'""" + +example_mode_aes_128_cbc_datatype_Float32_iv_None_aad_None = r"""'FF4D70D9A1050E6BBDD0325FC45CC22D'""" + +example_mode_aes_128_cbc_datatype_Float64_iv_None_aad_None = r"""'75FE6B4A722A31D7760680CC1B9F131D'""" + +example_mode_aes_128_cbc_datatype_Decimal32_iv_None_aad_None = r"""'83BBD7CCE7E5A38071653870475D48D2'""" + +example_mode_aes_128_cbc_datatype_Decimal64_iv_None_aad_None = r"""'BE0DD9302B2952CE9CC3721DD85C8E66'""" + +example_mode_aes_128_cbc_datatype_Decimal128_iv_None_aad_None = r"""'5F3DBFA74809E45E03980357B26787AF0D55B905F5525D3F5916FF811D8A6E7E'""" + +example_mode_aes_128_cbc_datatype_UUID_iv_None_aad_None = r"""'FF9161B222B4A67481271035745F06D991B6833DF67CBA9BC6E1AAEADBE363BB'""" + +example_mode_aes_128_cbc_datatype_Date_iv_None_aad_None = r"""'1E4FBE33752D96D147E890C29A409BFE'""" + +example_mode_aes_128_cbc_datatype_DateTime_iv_None_aad_None = r"""'384F3D97B78D52C73CD06C0E1B6DE399'""" + +example_mode_aes_128_cbc_datatype_DateTime64_iv_None_aad_None = r"""'C7F50A2D0175F3ED280AD42FF01FF5F2'""" + +example_mode_aes_128_cbc_datatype_LowCardinality_iv_None_aad_None = r"""'7C51909F95C1E9B886A3487CD3EBED69'""" + +example_mode_aes_128_cbc_datatype_Array_iv_None_aad_None = r"""'D9152D05CFA9E162983A5A2E883109B4'""" + +example_mode_aes_128_cbc_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_128_cbc_datatype_IPv4_iv_None_aad_None = r"""'4F32782638C1F33C6A7202CA83F0C12C'""" + +example_mode_aes_128_cbc_datatype_IPv6_iv_None_aad_None = r"""'F54700FF04ADAD342BA6830DB12AD7E9B1B4BE8B15BAE0B2C9196D69E3D53C6C'""" + +example_mode_aes_128_cbc_datatype_Enum8_iv_None_aad_None = r"""'4CDF8A192A06AC6EDBDCE2BFB53B7D73'""" + +example_mode_aes_128_cbc_datatype_Enum16_iv_None_aad_None = r"""'12FB5B75B1CB5DF0DC70D8039758691D'""" + +example_mode_aes_192_cbc_datatype_String_iv_None_aad_None = r"""'1AE38A541D466EDFED572EE839B0907F'""" + +example_mode_aes_192_cbc_datatype_FixedString_iv_None_aad_None = r"""'1AE38A541D466EDFED572EE839B0907F'""" + +example_mode_aes_192_cbc_datatype_UInt8_iv_None_aad_None = r"""'01CC3C67F07C3FA6E5EFB7AE5F19130B'""" + +example_mode_aes_192_cbc_datatype_UInt16_iv_None_aad_None = r"""'B50A3019F16B9C643FB40259E4B09308'""" + +example_mode_aes_192_cbc_datatype_UInt32_iv_None_aad_None = r"""'9F32F3F6B3C3B1830F56B5B94C93875D'""" + +example_mode_aes_192_cbc_datatype_UInt64_iv_None_aad_None = r"""'8DE807D54B7717BFC773567D9FFE292D'""" + +example_mode_aes_192_cbc_datatype_Int8_iv_None_aad_None = r"""'01CC3C67F07C3FA6E5EFB7AE5F19130B'""" + +example_mode_aes_192_cbc_datatype_Int16_iv_None_aad_None = r"""'B50A3019F16B9C643FB40259E4B09308'""" + +example_mode_aes_192_cbc_datatype_Int32_iv_None_aad_None = r"""'9F32F3F6B3C3B1830F56B5B94C93875D'""" + +example_mode_aes_192_cbc_datatype_Int64_iv_None_aad_None = r"""'8DE807D54B7717BFC773567D9FFE292D'""" + +example_mode_aes_192_cbc_datatype_Float32_iv_None_aad_None = r"""'4E0C122631ED64EAD726833291A81878'""" + +example_mode_aes_192_cbc_datatype_Float64_iv_None_aad_None = r"""'3F723599278E22E4692CE7D7D5F9A12F'""" + +example_mode_aes_192_cbc_datatype_Decimal32_iv_None_aad_None = r"""'2420D49DBAA5CEF7D853C98DA1BD33BF'""" + +example_mode_aes_192_cbc_datatype_Decimal64_iv_None_aad_None = r"""'FDF594113FCC2776653ED109A51FADF1'""" + +example_mode_aes_192_cbc_datatype_Decimal128_iv_None_aad_None = r"""'79207931793E374FB5A3A2AC1ECA857A583603B3047000A843425EECA4C35311'""" + +example_mode_aes_192_cbc_datatype_UUID_iv_None_aad_None = r"""'9FDB738E78D0D2F774C484ED82A854E46B580C61DBE08478DC523DA6AD605078'""" + +example_mode_aes_192_cbc_datatype_Date_iv_None_aad_None = r"""'2CDD4685168FA3E2A7FA2092E86F44D4'""" + +example_mode_aes_192_cbc_datatype_DateTime_iv_None_aad_None = r"""'A4BEE097872E44FAD94D6707D6643DF5'""" + +example_mode_aes_192_cbc_datatype_DateTime64_iv_None_aad_None = r"""'1798B23C09F783623943560DF142E0F3'""" + +example_mode_aes_192_cbc_datatype_LowCardinality_iv_None_aad_None = r"""'1AE38A541D466EDFED572EE839B0907F'""" + +example_mode_aes_192_cbc_datatype_Array_iv_None_aad_None = r"""'7C0B9021CAF2CBBB06DBF589740DCC65'""" + +example_mode_aes_192_cbc_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_192_cbc_datatype_IPv4_iv_None_aad_None = r"""'B20465C932A0719BA04E2F76371510D8'""" + +example_mode_aes_192_cbc_datatype_IPv6_iv_None_aad_None = r"""'CCCDC9B9C3F182254591DFEDDCE9F2326879326F3973401A6293A92BCB8EDFC4'""" + +example_mode_aes_192_cbc_datatype_Enum8_iv_None_aad_None = r"""'01CC3C67F07C3FA6E5EFB7AE5F19130B'""" + +example_mode_aes_192_cbc_datatype_Enum16_iv_None_aad_None = r"""'B50A3019F16B9C643FB40259E4B09308'""" + +example_mode_aes_256_cbc_datatype_String_iv_None_aad_None = r"""'C91184ED1E67F0CDED89B097D5D3B130'""" + +example_mode_aes_256_cbc_datatype_FixedString_iv_None_aad_None = r"""'C91184ED1E67F0CDED89B097D5D3B130'""" + +example_mode_aes_256_cbc_datatype_UInt8_iv_None_aad_None = r"""'3605C5E38A448F5FEFABADF3B9983FDF'""" + +example_mode_aes_256_cbc_datatype_UInt16_iv_None_aad_None = r"""'2E5299C7A5672D8779BA9DDDE1DBCE00'""" + +example_mode_aes_256_cbc_datatype_UInt32_iv_None_aad_None = r"""'D8876CDF9B97DD110E780F958C1EA2AA'""" + +example_mode_aes_256_cbc_datatype_UInt64_iv_None_aad_None = r"""'F6E11A48B6D830F7B8D0817885C05D3C'""" + +example_mode_aes_256_cbc_datatype_Int8_iv_None_aad_None = r"""'3605C5E38A448F5FEFABADF3B9983FDF'""" + +example_mode_aes_256_cbc_datatype_Int16_iv_None_aad_None = r"""'2E5299C7A5672D8779BA9DDDE1DBCE00'""" + +example_mode_aes_256_cbc_datatype_Int32_iv_None_aad_None = r"""'D8876CDF9B97DD110E780F958C1EA2AA'""" + +example_mode_aes_256_cbc_datatype_Int64_iv_None_aad_None = r"""'F6E11A48B6D830F7B8D0817885C05D3C'""" + +example_mode_aes_256_cbc_datatype_Float32_iv_None_aad_None = r"""'A11ED1B75CF1C04C6CA3A31E76627D4C'""" + +example_mode_aes_256_cbc_datatype_Float64_iv_None_aad_None = r"""'464C85EB7DB36D95CF48A3431CC7B2BC'""" + +example_mode_aes_256_cbc_datatype_Decimal32_iv_None_aad_None = r"""'988C793BD81036C1D05EC47F43851269'""" + +example_mode_aes_256_cbc_datatype_Decimal64_iv_None_aad_None = r"""'50FFB9C104DBFF3F415F12BA73D6FF1C'""" + +example_mode_aes_256_cbc_datatype_Decimal128_iv_None_aad_None = r"""'B04C40C085A262E3AA27F8E7F6831DCB36585C228B0286E7A8D8DBAF754C4C38'""" + +example_mode_aes_256_cbc_datatype_UUID_iv_None_aad_None = r"""'6A36D74ACB38B95FA77BC757A7AB2C3428548E6132D69A22B320775A21ABA11F'""" + +example_mode_aes_256_cbc_datatype_Date_iv_None_aad_None = r"""'F1CFA361A9B08FC101F3A4707A3E04D2'""" + +example_mode_aes_256_cbc_datatype_DateTime_iv_None_aad_None = r"""'D58178485CD1AE1C30F68383307B8BC5'""" + +example_mode_aes_256_cbc_datatype_DateTime64_iv_None_aad_None = r"""'A19B65BCB740B2AF4D421CE1DEC43608'""" + +example_mode_aes_256_cbc_datatype_LowCardinality_iv_None_aad_None = r"""'C91184ED1E67F0CDED89B097D5D3B130'""" + +example_mode_aes_256_cbc_datatype_Array_iv_None_aad_None = r"""'C4071E4FD44F004347EA9932326B7038'""" + +example_mode_aes_256_cbc_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_256_cbc_datatype_IPv4_iv_None_aad_None = r"""'6C7950041CB4041D4D8036FCD22E3B06'""" + +example_mode_aes_256_cbc_datatype_IPv6_iv_None_aad_None = r"""'8CBF2DC164F4086B8DD14B75E3065621393DE8421BAA5AE5E87096AEA7087507'""" + +example_mode_aes_256_cbc_datatype_Enum8_iv_None_aad_None = r"""'3605C5E38A448F5FEFABADF3B9983FDF'""" + +example_mode_aes_256_cbc_datatype_Enum16_iv_None_aad_None = r"""'2E5299C7A5672D8779BA9DDDE1DBCE00'""" + +example_mode_aes_128_cbc_datatype_String_iv_16_aad_None = r"""'D017D171B3865D6EA347E14167261F41'""" + +example_mode_aes_128_cbc_datatype_FixedString_iv_16_aad_None = r"""'D017D171B3865D6EA347E14167261F41'""" + +example_mode_aes_128_cbc_datatype_UInt8_iv_16_aad_None = r"""'A5BD67663C14A01DC9AB3B5F7B0F9383'""" + +example_mode_aes_128_cbc_datatype_UInt16_iv_16_aad_None = r"""'02D98283BEADCA1AC6EF925F9BF86960'""" + +example_mode_aes_128_cbc_datatype_UInt32_iv_16_aad_None = r"""'E72BD2245C3B2B7474300D09DBD85F3F'""" + +example_mode_aes_128_cbc_datatype_UInt64_iv_16_aad_None = r"""'C9032C59328DEA2EE03ACDBEDFAE7475'""" + +example_mode_aes_128_cbc_datatype_Int8_iv_16_aad_None = r"""'A5BD67663C14A01DC9AB3B5F7B0F9383'""" + +example_mode_aes_128_cbc_datatype_Int16_iv_16_aad_None = r"""'02D98283BEADCA1AC6EF925F9BF86960'""" + +example_mode_aes_128_cbc_datatype_Int32_iv_16_aad_None = r"""'E72BD2245C3B2B7474300D09DBD85F3F'""" + +example_mode_aes_128_cbc_datatype_Int64_iv_16_aad_None = r"""'C9032C59328DEA2EE03ACDBEDFAE7475'""" + +example_mode_aes_128_cbc_datatype_Float32_iv_16_aad_None = r"""'A5425BDEB6B83E311C45249DAF3153F5'""" + +example_mode_aes_128_cbc_datatype_Float64_iv_16_aad_None = r"""'EEDA98EC4045C7D351F3905313073B79'""" + +example_mode_aes_128_cbc_datatype_Decimal32_iv_16_aad_None = r"""'52EBB74292ECD37A29E9809166CC77DB'""" + +example_mode_aes_128_cbc_datatype_Decimal64_iv_16_aad_None = r"""'95EF455767EC8FBD32BAAEFFB44FEEB7'""" + +example_mode_aes_128_cbc_datatype_Decimal128_iv_16_aad_None = r"""'94C066884FA09B0D3C750F20A2823304A2FE20B6B69AB18373E3F58623E0D7FB'""" + +example_mode_aes_128_cbc_datatype_UUID_iv_16_aad_None = r"""'1D909C15BB882E89AD68B1EFEAC72148DCD05E2303B6BE19007A945AFB778B42'""" + +example_mode_aes_128_cbc_datatype_Date_iv_16_aad_None = r"""'24A4F8CE8A9FAE48A0AFEB8A6203EFEA'""" + +example_mode_aes_128_cbc_datatype_DateTime_iv_16_aad_None = r"""'0DD5554819E3995B1B6B00362AEE9424'""" + +example_mode_aes_128_cbc_datatype_DateTime64_iv_16_aad_None = r"""'0E55319903957C9D1FDA4FB65C3871CB'""" + +example_mode_aes_128_cbc_datatype_LowCardinality_iv_16_aad_None = r"""'D017D171B3865D6EA347E14167261F41'""" + +example_mode_aes_128_cbc_datatype_Array_iv_16_aad_None = r"""'D53C82A5D13256B88DF41C1C1D924E40'""" + +example_mode_aes_128_cbc_datatype_NULL_iv_16_aad_None = r"""'\\N'""" + +example_mode_aes_128_cbc_datatype_IPv4_iv_16_aad_None = r"""'C0D81AAB3134EAB5B1F190958C6A29F9'""" + +example_mode_aes_128_cbc_datatype_IPv6_iv_16_aad_None = r"""'AE1A36F75C9BB387121445069A9968CA247FA4459ED3C8809089FEE334EB1EC7'""" + +example_mode_aes_128_cbc_datatype_Enum8_iv_16_aad_None = r"""'A5BD67663C14A01DC9AB3B5F7B0F9383'""" + +example_mode_aes_128_cbc_datatype_Enum16_iv_16_aad_None = r"""'02D98283BEADCA1AC6EF925F9BF86960'""" + +example_mode_aes_192_cbc_datatype_String_iv_16_aad_None = r"""'A3DB45D129A5C9FDB5ED66E782B28BD2'""" + +example_mode_aes_192_cbc_datatype_FixedString_iv_16_aad_None = r"""'A3DB45D129A5C9FDB5ED66E782B28BD2'""" + +example_mode_aes_192_cbc_datatype_UInt8_iv_16_aad_None = r"""'F2A751470B32C58822F23B1417C11279'""" + +example_mode_aes_192_cbc_datatype_UInt16_iv_16_aad_None = r"""'CA1ECFEA89CF520D8FA14A38235E5FA5'""" + +example_mode_aes_192_cbc_datatype_UInt32_iv_16_aad_None = r"""'57F211370522621F23B59C8304878904'""" + +example_mode_aes_192_cbc_datatype_UInt64_iv_16_aad_None = r"""'DCF974CD88752B215284625F9164F5D4'""" + +example_mode_aes_192_cbc_datatype_Int8_iv_16_aad_None = r"""'F2A751470B32C58822F23B1417C11279'""" + +example_mode_aes_192_cbc_datatype_Int16_iv_16_aad_None = r"""'CA1ECFEA89CF520D8FA14A38235E5FA5'""" + +example_mode_aes_192_cbc_datatype_Int32_iv_16_aad_None = r"""'57F211370522621F23B59C8304878904'""" + +example_mode_aes_192_cbc_datatype_Int64_iv_16_aad_None = r"""'DCF974CD88752B215284625F9164F5D4'""" + +example_mode_aes_192_cbc_datatype_Float32_iv_16_aad_None = r"""'62EBE4FD1035D405BBD6C41436780E13'""" + +example_mode_aes_192_cbc_datatype_Float64_iv_16_aad_None = r"""'5706FC9892A4C1AB48FC93E13C9C72FE'""" + +example_mode_aes_192_cbc_datatype_Decimal32_iv_16_aad_None = r"""'BB056843D369A5E55982C92AD52EEC07'""" + +example_mode_aes_192_cbc_datatype_Decimal64_iv_16_aad_None = r"""'70ACD4156F9AC1444A75EFCB9202CA00'""" + +example_mode_aes_192_cbc_datatype_Decimal128_iv_16_aad_None = r"""'04748A45840A0CAAC83F139DB01C504B01FC56631A8B2FFBE68F2FC85B6FEEDE'""" + +example_mode_aes_192_cbc_datatype_UUID_iv_16_aad_None = r"""'D7B2ABC08F67823F61C3E8F680C12B3A8AA3E3711D412CB55ACFBC89C14949A8'""" + +example_mode_aes_192_cbc_datatype_Date_iv_16_aad_None = r"""'734BBE526E56B280E90E53DDEA7DB69B'""" + +example_mode_aes_192_cbc_datatype_DateTime_iv_16_aad_None = r"""'9B9BE7CC20F75DA3F39F688DE3A1ADAA'""" + +example_mode_aes_192_cbc_datatype_DateTime64_iv_16_aad_None = r"""'554FCAAF985378A561F7C6ED91E20C89'""" + +example_mode_aes_192_cbc_datatype_LowCardinality_iv_16_aad_None = r"""'A3DB45D129A5C9FDB5ED66E782B28BD2'""" + +example_mode_aes_192_cbc_datatype_Array_iv_16_aad_None = r"""'D85AF1078F110329896EFC462340171E'""" + +example_mode_aes_192_cbc_datatype_NULL_iv_16_aad_None = r"""'\\N'""" + +example_mode_aes_192_cbc_datatype_IPv4_iv_16_aad_None = r"""'6AF45078B1E924B6C107D4C0236EA937'""" + +example_mode_aes_192_cbc_datatype_IPv6_iv_16_aad_None = r"""'9E4F8E54B265A340090DC7FE4F53BB50048442F5632A7B1630AE80DFD938E9AA'""" + +example_mode_aes_192_cbc_datatype_Enum8_iv_16_aad_None = r"""'F2A751470B32C58822F23B1417C11279'""" + +example_mode_aes_192_cbc_datatype_Enum16_iv_16_aad_None = r"""'CA1ECFEA89CF520D8FA14A38235E5FA5'""" + +example_mode_aes_256_cbc_datatype_String_iv_16_aad_None = r"""'5E22454D9AC4F1A47B04E2FD98A76140'""" + +example_mode_aes_256_cbc_datatype_FixedString_iv_16_aad_None = r"""'5E22454D9AC4F1A47B04E2FD98A76140'""" + +example_mode_aes_256_cbc_datatype_UInt8_iv_16_aad_None = r"""'FE35EEF14D6AA67AA2EBA474253CA19A'""" + +example_mode_aes_256_cbc_datatype_UInt16_iv_16_aad_None = r"""'2D22C6B58140E591BEF7986C7770FF21'""" + +example_mode_aes_256_cbc_datatype_UInt32_iv_16_aad_None = r"""'4EB4923E19AA24206B135D5B25CB31AB'""" + +example_mode_aes_256_cbc_datatype_UInt64_iv_16_aad_None = r"""'173B7CAFFCBED9B814C0ECD50A9477F6'""" + +example_mode_aes_256_cbc_datatype_Int8_iv_16_aad_None = r"""'FE35EEF14D6AA67AA2EBA474253CA19A'""" + +example_mode_aes_256_cbc_datatype_Int16_iv_16_aad_None = r"""'2D22C6B58140E591BEF7986C7770FF21'""" + +example_mode_aes_256_cbc_datatype_Int32_iv_16_aad_None = r"""'4EB4923E19AA24206B135D5B25CB31AB'""" + +example_mode_aes_256_cbc_datatype_Int64_iv_16_aad_None = r"""'173B7CAFFCBED9B814C0ECD50A9477F6'""" + +example_mode_aes_256_cbc_datatype_Float32_iv_16_aad_None = r"""'E639AA3E45D8C2759181FD736CD58EDC'""" + +example_mode_aes_256_cbc_datatype_Float64_iv_16_aad_None = r"""'CFEF3FDC054997559DF5DCFB5F215B58'""" + +example_mode_aes_256_cbc_datatype_Decimal32_iv_16_aad_None = r"""'E2F57A092A1759D39F4AE67C9543FAB8'""" + +example_mode_aes_256_cbc_datatype_Decimal64_iv_16_aad_None = r"""'6259A2CFD3D83352A44C03DB050077B3'""" + +example_mode_aes_256_cbc_datatype_Decimal128_iv_16_aad_None = r"""'AEC71CA2D87098392689F9EB2ED93A84FA5787E643E28CB3C2013F8FCC24E387'""" + +example_mode_aes_256_cbc_datatype_UUID_iv_16_aad_None = r"""'88BA86B14A468DC92084B7152B172E142D88CBFB639A8FF2F480F1727972251C'""" + +example_mode_aes_256_cbc_datatype_Date_iv_16_aad_None = r"""'C67C84B1C6BF4527A7E730499FF39C86'""" + +example_mode_aes_256_cbc_datatype_DateTime_iv_16_aad_None = r"""'7FDC1B0797A5F3C04CDA82729A1EA4AA'""" + +example_mode_aes_256_cbc_datatype_DateTime64_iv_16_aad_None = r"""'B1B7401FB2B65BCB3448C1BE179F6AA6'""" + +example_mode_aes_256_cbc_datatype_LowCardinality_iv_16_aad_None = r"""'5E22454D9AC4F1A47B04E2FD98A76140'""" + +example_mode_aes_256_cbc_datatype_Array_iv_16_aad_None = r"""'6BB1E8429CC612B0AA74282B81D4FE8A'""" + +example_mode_aes_256_cbc_datatype_NULL_iv_16_aad_None = r"""'\\N'""" + +example_mode_aes_256_cbc_datatype_IPv4_iv_16_aad_None = r"""'51364C8DC6882CA1F03CF7FB45117EEF'""" + +example_mode_aes_256_cbc_datatype_IPv6_iv_16_aad_None = r"""'87A1C4D4672EFE64DC98E040EAD6B3126C899C263577B3D8EE8A3952BE5CDC1B'""" + +example_mode_aes_256_cbc_datatype_Enum8_iv_16_aad_None = r"""'FE35EEF14D6AA67AA2EBA474253CA19A'""" + +example_mode_aes_256_cbc_datatype_Enum16_iv_16_aad_None = r"""'2D22C6B58140E591BEF7986C7770FF21'""" + +example_mode_aes_128_cfb1_datatype_String_iv_None_aad_None = r"""'32'""" + +example_mode_aes_128_cfb1_datatype_FixedString_iv_None_aad_None = r"""'32'""" + +example_mode_aes_128_cfb1_datatype_UInt8_iv_None_aad_None = r"""'01'""" + +example_mode_aes_128_cfb1_datatype_UInt16_iv_None_aad_None = r"""'0173'""" + +example_mode_aes_128_cfb1_datatype_UInt32_iv_None_aad_None = r"""'01732E6B'""" + +example_mode_aes_128_cfb1_datatype_UInt64_iv_None_aad_None = r"""'01732E6B82FCBDF6'""" + +example_mode_aes_128_cfb1_datatype_Int8_iv_None_aad_None = r"""'01'""" + +example_mode_aes_128_cfb1_datatype_Int16_iv_None_aad_None = r"""'0173'""" + +example_mode_aes_128_cfb1_datatype_Int32_iv_None_aad_None = r"""'01732E6B'""" + +example_mode_aes_128_cfb1_datatype_Int64_iv_None_aad_None = r"""'01732E6B82FCBDF6'""" + +example_mode_aes_128_cfb1_datatype_Float32_iv_None_aad_None = r"""'0000B9AB'""" + +example_mode_aes_128_cfb1_datatype_Float64_iv_None_aad_None = r"""'000000000000FFF6'""" + +example_mode_aes_128_cfb1_datatype_Decimal32_iv_None_aad_None = r"""'2E09CA6A'""" + +example_mode_aes_128_cfb1_datatype_Decimal64_iv_None_aad_None = r"""'2E09CA6A6DBEE799'""" + +example_mode_aes_128_cfb1_datatype_Decimal128_iv_None_aad_None = r"""'2E09CA6A6DBEE79923BA65C6B78FD199'""" + +example_mode_aes_128_cfb1_datatype_UUID_iv_None_aad_None = r"""'E590DFB515D3A518F85C66A6A5EC9C6E'""" + +example_mode_aes_128_cfb1_datatype_Date_iv_None_aad_None = r"""'42F0'""" + +example_mode_aes_128_cfb1_datatype_DateTime_iv_None_aad_None = r"""'5475EC3D'""" + +example_mode_aes_128_cfb1_datatype_DateTime64_iv_None_aad_None = r"""'21CDF1128AE44A37'""" + +example_mode_aes_128_cfb1_datatype_LowCardinality_iv_None_aad_None = r"""'32'""" + +example_mode_aes_128_cfb1_datatype_Array_iv_None_aad_None = r"""'0170'""" + +example_mode_aes_128_cfb1_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_128_cfb1_datatype_IPv4_iv_None_aad_None = r"""'240A9E43'""" + +example_mode_aes_128_cfb1_datatype_IPv6_iv_None_aad_None = r"""'2E642EF4B07D9B1251BE3B3CBDBCC6F6'""" + +example_mode_aes_128_cfb1_datatype_Enum8_iv_None_aad_None = r"""'01'""" + +example_mode_aes_128_cfb1_datatype_Enum16_iv_None_aad_None = r"""'0173'""" + +example_mode_aes_192_cfb1_datatype_String_iv_None_aad_None = r"""'23'""" + +example_mode_aes_192_cfb1_datatype_FixedString_iv_None_aad_None = r"""'23'""" + +example_mode_aes_192_cfb1_datatype_UInt8_iv_None_aad_None = r"""'01'""" + +example_mode_aes_192_cfb1_datatype_UInt16_iv_None_aad_None = r"""'01F9'""" + +example_mode_aes_192_cfb1_datatype_UInt32_iv_None_aad_None = r"""'01F92AD3'""" + +example_mode_aes_192_cfb1_datatype_UInt64_iv_None_aad_None = r"""'01F92AD38CB10028'""" + +example_mode_aes_192_cfb1_datatype_Int8_iv_None_aad_None = r"""'01'""" + +example_mode_aes_192_cfb1_datatype_Int16_iv_None_aad_None = r"""'01F9'""" + +example_mode_aes_192_cfb1_datatype_Int32_iv_None_aad_None = r"""'01F92AD3'""" + +example_mode_aes_192_cfb1_datatype_Int64_iv_None_aad_None = r"""'01F92AD38CB10028'""" + +example_mode_aes_192_cfb1_datatype_Float32_iv_None_aad_None = r"""'0000FCAE'""" + +example_mode_aes_192_cfb1_datatype_Float64_iv_None_aad_None = r"""'000000000000A79C'""" + +example_mode_aes_192_cfb1_datatype_Decimal32_iv_None_aad_None = r"""'3F406C3F'""" + +example_mode_aes_192_cfb1_datatype_Decimal64_iv_None_aad_None = r"""'3F406C3F3A41B134'""" + +example_mode_aes_192_cfb1_datatype_Decimal128_iv_None_aad_None = r"""'3F406C3F3A41B134310D6B68BEBC5708'""" + +example_mode_aes_192_cfb1_datatype_UUID_iv_None_aad_None = r"""'B7F80F1BDCA1C4193E5AB11078FEA213'""" + +example_mode_aes_192_cfb1_datatype_Date_iv_None_aad_None = r"""'6FF6'""" + +example_mode_aes_192_cfb1_datatype_DateTime_iv_None_aad_None = r"""'7013E555'""" + +example_mode_aes_192_cfb1_datatype_DateTime64_iv_None_aad_None = r"""'371AF0291536F5B7'""" + +example_mode_aes_192_cfb1_datatype_LowCardinality_iv_None_aad_None = r"""'23'""" + +example_mode_aes_192_cfb1_datatype_Array_iv_None_aad_None = r"""'01FA'""" + +example_mode_aes_192_cfb1_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_192_cfb1_datatype_IPv4_iv_None_aad_None = r"""'33895F70'""" + +example_mode_aes_192_cfb1_datatype_IPv6_iv_None_aad_None = r"""'3F24552946522B931290F904186B055A'""" + +example_mode_aes_192_cfb1_datatype_Enum8_iv_None_aad_None = r"""'01'""" + +example_mode_aes_192_cfb1_datatype_Enum16_iv_None_aad_None = r"""'01F9'""" + +example_mode_aes_256_cfb1_datatype_String_iv_None_aad_None = r"""'9E'""" + +example_mode_aes_256_cfb1_datatype_FixedString_iv_None_aad_None = r"""'9E'""" + +example_mode_aes_256_cfb1_datatype_UInt8_iv_None_aad_None = r"""'B9'""" + +example_mode_aes_256_cfb1_datatype_UInt16_iv_None_aad_None = r"""'B9ED'""" + +example_mode_aes_256_cfb1_datatype_UInt32_iv_None_aad_None = r"""'B9ED4764'""" + +example_mode_aes_256_cfb1_datatype_UInt64_iv_None_aad_None = r"""'B9ED4764E7BF3C1C'""" + +example_mode_aes_256_cfb1_datatype_Int8_iv_None_aad_None = r"""'B9'""" + +example_mode_aes_256_cfb1_datatype_Int16_iv_None_aad_None = r"""'B9ED'""" + +example_mode_aes_256_cfb1_datatype_Int32_iv_None_aad_None = r"""'B9ED4764'""" + +example_mode_aes_256_cfb1_datatype_Int64_iv_None_aad_None = r"""'B9ED4764E7BF3C1C'""" + +example_mode_aes_256_cfb1_datatype_Float32_iv_None_aad_None = r"""'B85F0E63'""" + +example_mode_aes_256_cfb1_datatype_Float64_iv_None_aad_None = r"""'B85FDB5A8FE0C0BB'""" + +example_mode_aes_256_cfb1_datatype_Decimal32_iv_None_aad_None = r"""'891B85B3'""" + +example_mode_aes_256_cfb1_datatype_Decimal64_iv_None_aad_None = r"""'891B85B3C1BA6EE1'""" + +example_mode_aes_256_cfb1_datatype_Decimal128_iv_None_aad_None = r"""'891B85B3C1BA6EE137EF658F618D1F3F'""" + +example_mode_aes_256_cfb1_datatype_UUID_iv_None_aad_None = r"""'121B5EE9929417BC1CDBDB390BC93B4A'""" + +example_mode_aes_256_cfb1_datatype_Date_iv_None_aad_None = r"""'D40F'""" + +example_mode_aes_256_cfb1_datatype_DateTime_iv_None_aad_None = r"""'CF27297C'""" + +example_mode_aes_256_cfb1_datatype_DateTime64_iv_None_aad_None = r"""'8773F350CD394D36'""" + +example_mode_aes_256_cfb1_datatype_LowCardinality_iv_None_aad_None = r"""'9E'""" + +example_mode_aes_256_cfb1_datatype_Array_iv_None_aad_None = r"""'B9EE'""" + +example_mode_aes_256_cfb1_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_256_cfb1_datatype_IPv4_iv_None_aad_None = r"""'8383FD3C'""" + +example_mode_aes_256_cfb1_datatype_IPv6_iv_None_aad_None = r"""'897A84A02FD451D3DDB92FF290BF9B7C'""" + +example_mode_aes_256_cfb1_datatype_Enum8_iv_None_aad_None = r"""'B9'""" + +example_mode_aes_256_cfb1_datatype_Enum16_iv_None_aad_None = r"""'B9ED'""" + +example_mode_aes_128_cfb1_datatype_String_iv_16_aad_None = r"""'37'""" + +example_mode_aes_128_cfb1_datatype_FixedString_iv_16_aad_None = r"""'37'""" + +example_mode_aes_128_cfb1_datatype_UInt8_iv_16_aad_None = r"""'01'""" + +example_mode_aes_128_cfb1_datatype_UInt16_iv_16_aad_None = r"""'0188'""" + +example_mode_aes_128_cfb1_datatype_UInt32_iv_16_aad_None = r"""'01882D46'""" + +example_mode_aes_128_cfb1_datatype_UInt64_iv_16_aad_None = r"""'01882D46FCCCD695'""" + +example_mode_aes_128_cfb1_datatype_Int8_iv_16_aad_None = r"""'01'""" + +example_mode_aes_128_cfb1_datatype_Int16_iv_16_aad_None = r"""'0188'""" + +example_mode_aes_128_cfb1_datatype_Int32_iv_16_aad_None = r"""'01882D46'""" + +example_mode_aes_128_cfb1_datatype_Int64_iv_16_aad_None = r"""'01882D46FCCCD695'""" + +example_mode_aes_128_cfb1_datatype_Float32_iv_16_aad_None = r"""'00B931F2'""" + +example_mode_aes_128_cfb1_datatype_Float64_iv_16_aad_None = r"""'00B99AAE199C3C93'""" + +example_mode_aes_128_cfb1_datatype_Decimal32_iv_16_aad_None = r"""'2D557511'""" + +example_mode_aes_128_cfb1_datatype_Decimal64_iv_16_aad_None = r"""'2D557511511F90FB'""" + +example_mode_aes_128_cfb1_datatype_Decimal128_iv_16_aad_None = r"""'2D557511511F90FBC464352E8A02FC51'""" + +example_mode_aes_128_cfb1_datatype_UUID_iv_16_aad_None = r"""'8AE269086C72AD682EB92ABA6CA58E49'""" + +example_mode_aes_128_cfb1_datatype_Date_iv_16_aad_None = r"""'5FC9'""" + +example_mode_aes_128_cfb1_datatype_DateTime_iv_16_aad_None = r"""'42970865'""" + +example_mode_aes_128_cfb1_datatype_DateTime64_iv_16_aad_None = r"""'20B310A2F7EF8460'""" + +example_mode_aes_128_cfb1_datatype_LowCardinality_iv_16_aad_None = r"""'37'""" + +example_mode_aes_128_cfb1_datatype_Array_iv_16_aad_None = r"""'018A'""" + +example_mode_aes_128_cfb1_datatype_NULL_iv_16_aad_None = r"""'\\N'""" + +example_mode_aes_128_cfb1_datatype_IPv4_iv_16_aad_None = r"""'27476DAF'""" + +example_mode_aes_128_cfb1_datatype_IPv6_iv_16_aad_None = r"""'2D311FBDC0A5C652AAD863398F94C5C3'""" + +example_mode_aes_128_cfb1_datatype_Enum8_iv_16_aad_None = r"""'01'""" + +example_mode_aes_128_cfb1_datatype_Enum16_iv_16_aad_None = r"""'0188'""" + +example_mode_aes_192_cfb1_datatype_String_iv_16_aad_None = r"""'38'""" + +example_mode_aes_192_cfb1_datatype_FixedString_iv_16_aad_None = r"""'38'""" + +example_mode_aes_192_cfb1_datatype_UInt8_iv_16_aad_None = r"""'06'""" + +example_mode_aes_192_cfb1_datatype_UInt16_iv_16_aad_None = r"""'069E'""" + +example_mode_aes_192_cfb1_datatype_UInt32_iv_16_aad_None = r"""'069E2E37'""" + +example_mode_aes_192_cfb1_datatype_UInt64_iv_16_aad_None = r"""'069E2E370A6D9872'""" + +example_mode_aes_192_cfb1_datatype_Int8_iv_16_aad_None = r"""'06'""" + +example_mode_aes_192_cfb1_datatype_Int16_iv_16_aad_None = r"""'069E'""" + +example_mode_aes_192_cfb1_datatype_Int32_iv_16_aad_None = r"""'069E2E37'""" + +example_mode_aes_192_cfb1_datatype_Int64_iv_16_aad_None = r"""'069E2E370A6D9872'""" + +example_mode_aes_192_cfb1_datatype_Float32_iv_16_aad_None = r"""'07955BCF'""" + +example_mode_aes_192_cfb1_datatype_Float64_iv_16_aad_None = r"""'0795A57CA222A36E'""" + +example_mode_aes_192_cfb1_datatype_Decimal32_iv_16_aad_None = r"""'2A15BB86'""" + +example_mode_aes_192_cfb1_datatype_Decimal64_iv_16_aad_None = r"""'2A15BB86FB961E7D'""" + +example_mode_aes_192_cfb1_datatype_Decimal128_iv_16_aad_None = r"""'2A15BB86FB961E7D0DD5055987176AF4'""" + +example_mode_aes_192_cfb1_datatype_UUID_iv_16_aad_None = r"""'DA2338793C7B9E0F6722E272062F5EA1'""" + +example_mode_aes_192_cfb1_datatype_Date_iv_16_aad_None = r"""'4AAB'""" + +example_mode_aes_192_cfb1_datatype_DateTime_iv_16_aad_None = r"""'5B6A8EE6'""" + +example_mode_aes_192_cfb1_datatype_DateTime64_iv_16_aad_None = r"""'23C4E2A707F73EF4'""" + +example_mode_aes_192_cfb1_datatype_LowCardinality_iv_16_aad_None = r"""'38'""" + +example_mode_aes_192_cfb1_datatype_Array_iv_16_aad_None = r"""'069C'""" + +example_mode_aes_192_cfb1_datatype_NULL_iv_16_aad_None = r"""'\\N'""" + +example_mode_aes_192_cfb1_datatype_IPv4_iv_16_aad_None = r"""'2470A839'""" + +example_mode_aes_192_cfb1_datatype_IPv6_iv_16_aad_None = r"""'2A712A746781131B2DC4EB92E31C72FA'""" + +example_mode_aes_192_cfb1_datatype_Enum8_iv_16_aad_None = r"""'06'""" + +example_mode_aes_192_cfb1_datatype_Enum16_iv_16_aad_None = r"""'069E'""" + +example_mode_aes_256_cfb1_datatype_String_iv_16_aad_None = r"""'5A'""" + +example_mode_aes_256_cfb1_datatype_FixedString_iv_16_aad_None = r"""'5A'""" + +example_mode_aes_256_cfb1_datatype_UInt8_iv_16_aad_None = r"""'7E'""" + +example_mode_aes_256_cfb1_datatype_UInt16_iv_16_aad_None = r"""'7EA1'""" + +example_mode_aes_256_cfb1_datatype_UInt32_iv_16_aad_None = r"""'7EA17214'""" + +example_mode_aes_256_cfb1_datatype_UInt64_iv_16_aad_None = r"""'7EA172144C6F5578'""" + +example_mode_aes_256_cfb1_datatype_Int8_iv_16_aad_None = r"""'7E'""" + +example_mode_aes_256_cfb1_datatype_Int16_iv_16_aad_None = r"""'7EA1'""" + +example_mode_aes_256_cfb1_datatype_Int32_iv_16_aad_None = r"""'7EA17214'""" + +example_mode_aes_256_cfb1_datatype_Int64_iv_16_aad_None = r"""'7EA172144C6F5578'""" + +example_mode_aes_256_cfb1_datatype_Float32_iv_16_aad_None = r"""'7F630BBA'""" + +example_mode_aes_256_cfb1_datatype_Float64_iv_16_aad_None = r"""'7F638DFAAA434E6B'""" + +example_mode_aes_256_cfb1_datatype_Decimal32_iv_16_aad_None = r"""'4F430FBA'""" + +example_mode_aes_256_cfb1_datatype_Decimal64_iv_16_aad_None = r"""'4F430FBAA3AAF884'""" + +example_mode_aes_256_cfb1_datatype_Decimal128_iv_16_aad_None = r"""'4F430FBAA3AAF8845DB7BBA7F98F49C4'""" + +example_mode_aes_256_cfb1_datatype_UUID_iv_16_aad_None = r"""'B06F4A8C3BF3A8D32D113D0D40397C8F'""" + +example_mode_aes_256_cfb1_datatype_Date_iv_16_aad_None = r"""'30CE'""" + +example_mode_aes_256_cfb1_datatype_DateTime_iv_16_aad_None = r"""'206545FA'""" + +example_mode_aes_256_cfb1_datatype_DateTime64_iv_16_aad_None = r"""'43756F28C68E3D55'""" + +example_mode_aes_256_cfb1_datatype_LowCardinality_iv_16_aad_None = r"""'5A'""" + +example_mode_aes_256_cfb1_datatype_Array_iv_16_aad_None = r"""'7EA3'""" + +example_mode_aes_256_cfb1_datatype_NULL_iv_16_aad_None = r"""'\\N'""" + +example_mode_aes_256_cfb1_datatype_IPv4_iv_16_aad_None = r"""'4526FCCF'""" + +example_mode_aes_256_cfb1_datatype_IPv6_iv_16_aad_None = r"""'4F23BDAC741DB8767CE6AE24888545A2'""" + +example_mode_aes_256_cfb1_datatype_Enum8_iv_16_aad_None = r"""'7E'""" + +example_mode_aes_256_cfb1_datatype_Enum16_iv_16_aad_None = r"""'7EA1'""" + +example_mode_aes_128_cfb8_datatype_String_iv_None_aad_None = r"""'21'""" + +example_mode_aes_128_cfb8_datatype_FixedString_iv_None_aad_None = r"""'21'""" + +example_mode_aes_128_cfb8_datatype_UInt8_iv_None_aad_None = r"""'11'""" + +example_mode_aes_128_cfb8_datatype_UInt16_iv_None_aad_None = r"""'11FF'""" + +example_mode_aes_128_cfb8_datatype_UInt32_iv_None_aad_None = r"""'11FF20C0'""" + +example_mode_aes_128_cfb8_datatype_UInt64_iv_None_aad_None = r"""'11FF20C07A65C524'""" + +example_mode_aes_128_cfb8_datatype_Int8_iv_None_aad_None = r"""'11'""" + +example_mode_aes_128_cfb8_datatype_Int16_iv_None_aad_None = r"""'11FF'""" + +example_mode_aes_128_cfb8_datatype_Int32_iv_None_aad_None = r"""'11FF20C0'""" + +example_mode_aes_128_cfb8_datatype_Int64_iv_None_aad_None = r"""'11FF20C07A65C524'""" + +example_mode_aes_128_cfb8_datatype_Float32_iv_None_aad_None = r"""'10671940'""" + +example_mode_aes_128_cfb8_datatype_Float64_iv_None_aad_None = r"""'106799607DBF56DA'""" + +example_mode_aes_128_cfb8_datatype_Decimal32_iv_None_aad_None = r"""'30756C94'""" + +example_mode_aes_128_cfb8_datatype_Decimal64_iv_None_aad_None = r"""'30756C9417D3C023'""" + +example_mode_aes_128_cfb8_datatype_Decimal128_iv_None_aad_None = r"""'30756C9417D3C023705550B7BEF872FF'""" + +example_mode_aes_128_cfb8_datatype_UUID_iv_None_aad_None = r"""'F7FE50CF0647659CB0D401B5C0E259D3'""" + +example_mode_aes_128_cfb8_datatype_Date_iv_None_aad_None = r"""'46EA'""" + +example_mode_aes_128_cfb8_datatype_DateTime_iv_None_aad_None = r"""'5EB4905E'""" + +example_mode_aes_128_cfb8_datatype_DateTime64_iv_None_aad_None = r"""'3BB70F8E64D7C6A7'""" + +example_mode_aes_128_cfb8_datatype_LowCardinality_iv_None_aad_None = r"""'21'""" + +example_mode_aes_128_cfb8_datatype_Array_iv_None_aad_None = r"""'11FD'""" + +example_mode_aes_128_cfb8_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_128_cfb8_datatype_IPv4_iv_None_aad_None = r"""'3DC2BE9E'""" + +example_mode_aes_128_cfb8_datatype_IPv6_iv_None_aad_None = r"""'303ABAC6F4F380D9F077DFC79C82D1A1'""" + +example_mode_aes_128_cfb8_datatype_Enum8_iv_None_aad_None = r"""'11'""" + +example_mode_aes_128_cfb8_datatype_Enum16_iv_None_aad_None = r"""'11FF'""" + +example_mode_aes_192_cfb8_datatype_String_iv_None_aad_None = r"""'36'""" + +example_mode_aes_192_cfb8_datatype_FixedString_iv_None_aad_None = r"""'36'""" + +example_mode_aes_192_cfb8_datatype_UInt8_iv_None_aad_None = r"""'06'""" + +example_mode_aes_192_cfb8_datatype_UInt16_iv_None_aad_None = r"""'0683'""" + +example_mode_aes_192_cfb8_datatype_UInt32_iv_None_aad_None = r"""'0683139D'""" + +example_mode_aes_192_cfb8_datatype_UInt64_iv_None_aad_None = r"""'0683139D83E2EFAC'""" + +example_mode_aes_192_cfb8_datatype_Int8_iv_None_aad_None = r"""'06'""" + +example_mode_aes_192_cfb8_datatype_Int16_iv_None_aad_None = r"""'0683'""" + +example_mode_aes_192_cfb8_datatype_Int32_iv_None_aad_None = r"""'0683139D'""" + +example_mode_aes_192_cfb8_datatype_Int64_iv_None_aad_None = r"""'0683139D83E2EFAC'""" + +example_mode_aes_192_cfb8_datatype_Float32_iv_None_aad_None = r"""'07EDB300'""" + +example_mode_aes_192_cfb8_datatype_Float64_iv_None_aad_None = r"""'07ED3359B91DEF3B'""" + +example_mode_aes_192_cfb8_datatype_Decimal32_iv_None_aad_None = r"""'275947FE'""" + +example_mode_aes_192_cfb8_datatype_Decimal64_iv_None_aad_None = r"""'275947FE4B3390EE'""" + +example_mode_aes_192_cfb8_datatype_Decimal128_iv_None_aad_None = r"""'275947FE4B3390EE7A2541BC8E2F58D7'""" + +example_mode_aes_192_cfb8_datatype_UUID_iv_None_aad_None = r"""'E0C082C032FB8ED756F9345E270A283B'""" + +example_mode_aes_192_cfb8_datatype_Date_iv_None_aad_None = r"""'5109'""" + +example_mode_aes_192_cfb8_datatype_DateTime_iv_None_aad_None = r"""'49713150'""" + +example_mode_aes_192_cfb8_datatype_DateTime64_iv_None_aad_None = r"""'2C10FB4FEC471EF7'""" + +example_mode_aes_192_cfb8_datatype_LowCardinality_iv_None_aad_None = r"""'36'""" + +example_mode_aes_192_cfb8_datatype_Array_iv_None_aad_None = r"""'0681'""" + +example_mode_aes_192_cfb8_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_192_cfb8_datatype_IPv4_iv_None_aad_None = r"""'2A41C8F2'""" + +example_mode_aes_192_cfb8_datatype_IPv6_iv_None_aad_None = r"""'271682C9379C5A46C68488DC33D0C278'""" + +example_mode_aes_192_cfb8_datatype_Enum8_iv_None_aad_None = r"""'06'""" + +example_mode_aes_192_cfb8_datatype_Enum16_iv_None_aad_None = r"""'0683'""" + +example_mode_aes_256_cfb8_datatype_String_iv_None_aad_None = r"""'81'""" + +example_mode_aes_256_cfb8_datatype_FixedString_iv_None_aad_None = r"""'81'""" + +example_mode_aes_256_cfb8_datatype_UInt8_iv_None_aad_None = r"""'B1'""" + +example_mode_aes_256_cfb8_datatype_UInt16_iv_None_aad_None = r"""'B15F'""" + +example_mode_aes_256_cfb8_datatype_UInt32_iv_None_aad_None = r"""'B15FD91F'""" + +example_mode_aes_256_cfb8_datatype_UInt64_iv_None_aad_None = r"""'B15FD91F702960CB'""" + +example_mode_aes_256_cfb8_datatype_Int8_iv_None_aad_None = r"""'B1'""" + +example_mode_aes_256_cfb8_datatype_Int16_iv_None_aad_None = r"""'B15F'""" + +example_mode_aes_256_cfb8_datatype_Int32_iv_None_aad_None = r"""'B15FD91F'""" + +example_mode_aes_256_cfb8_datatype_Int64_iv_None_aad_None = r"""'B15FD91F702960CB'""" + +example_mode_aes_256_cfb8_datatype_Float32_iv_None_aad_None = r"""'B05A05BE'""" + +example_mode_aes_256_cfb8_datatype_Float64_iv_None_aad_None = r"""'B05A8510DB2F16A0'""" + +example_mode_aes_256_cfb8_datatype_Decimal32_iv_None_aad_None = r"""'906B5777'""" + +example_mode_aes_256_cfb8_datatype_Decimal64_iv_None_aad_None = r"""'906B57771CB81F37'""" + +example_mode_aes_256_cfb8_datatype_Decimal128_iv_None_aad_None = r"""'906B57771CB81F378D932AE788527DE2'""" + +example_mode_aes_256_cfb8_datatype_UUID_iv_None_aad_None = r"""'57FB06BA6F4BA51D7A61D65A7827A18D'""" + +example_mode_aes_256_cfb8_datatype_Date_iv_None_aad_None = r"""'E652'""" + +example_mode_aes_256_cfb8_datatype_DateTime_iv_None_aad_None = r"""'FEEEADA4'""" + +example_mode_aes_256_cfb8_datatype_DateTime64_iv_None_aad_None = r"""'9BB36DEF05FF5975'""" + +example_mode_aes_256_cfb8_datatype_LowCardinality_iv_None_aad_None = r"""'81'""" + +example_mode_aes_256_cfb8_datatype_Array_iv_None_aad_None = r"""'B15D'""" + +example_mode_aes_256_cfb8_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_256_cfb8_datatype_IPv4_iv_None_aad_None = r"""'9DC836F3'""" + +example_mode_aes_256_cfb8_datatype_IPv6_iv_None_aad_None = r"""'90242F0083C8B0221DF3B5755EC8D99C'""" + +example_mode_aes_256_cfb8_datatype_Enum8_iv_None_aad_None = r"""'B1'""" + +example_mode_aes_256_cfb8_datatype_Enum16_iv_None_aad_None = r"""'B15F'""" + +example_mode_aes_128_cfb8_datatype_String_iv_16_aad_None = r"""'03'""" + +example_mode_aes_128_cfb8_datatype_FixedString_iv_16_aad_None = r"""'03'""" + +example_mode_aes_128_cfb8_datatype_UInt8_iv_16_aad_None = r"""'33'""" + +example_mode_aes_128_cfb8_datatype_UInt16_iv_16_aad_None = r"""'3368'""" + +example_mode_aes_128_cfb8_datatype_UInt32_iv_16_aad_None = r"""'3368AB64'""" + +example_mode_aes_128_cfb8_datatype_UInt64_iv_16_aad_None = r"""'3368AB6421744B7E'""" + +example_mode_aes_128_cfb8_datatype_Int8_iv_16_aad_None = r"""'33'""" + +example_mode_aes_128_cfb8_datatype_Int16_iv_16_aad_None = r"""'3368'""" + +example_mode_aes_128_cfb8_datatype_Int32_iv_16_aad_None = r"""'3368AB64'""" + +example_mode_aes_128_cfb8_datatype_Int64_iv_16_aad_None = r"""'3368AB6421744B7E'""" + +example_mode_aes_128_cfb8_datatype_Float32_iv_16_aad_None = r"""'3232B23D'""" + +example_mode_aes_128_cfb8_datatype_Float64_iv_16_aad_None = r"""'323232323232C2A6'""" + +example_mode_aes_128_cfb8_datatype_Decimal32_iv_16_aad_None = r"""'12ABA873'""" + +example_mode_aes_128_cfb8_datatype_Decimal64_iv_16_aad_None = r"""'12ABA873E2E24473'""" + +example_mode_aes_128_cfb8_datatype_Decimal128_iv_16_aad_None = r"""'12ABA873E2E24473166434D82270A19C'""" + +example_mode_aes_128_cfb8_datatype_UUID_iv_16_aad_None = r"""'D529D970A38CCB794F856E4458D0E2D4'""" + +example_mode_aes_128_cfb8_datatype_Date_iv_16_aad_None = r"""'6445'""" + +example_mode_aes_128_cfb8_datatype_DateTime_iv_16_aad_None = r"""'7CBF2FDA'""" + +example_mode_aes_128_cfb8_datatype_DateTime64_iv_16_aad_None = r"""'191C7B5A063F562D'""" + +example_mode_aes_128_cfb8_datatype_LowCardinality_iv_16_aad_None = r"""'03'""" + +example_mode_aes_128_cfb8_datatype_Array_iv_16_aad_None = r"""'336A'""" + +example_mode_aes_128_cfb8_datatype_NULL_iv_16_aad_None = r"""'\\N'""" + +example_mode_aes_128_cfb8_datatype_IPv4_iv_16_aad_None = r"""'1F0A367A'""" + +example_mode_aes_128_cfb8_datatype_IPv6_iv_16_aad_None = r"""'12E4B19D97DC9F2C61A671C51B1201D2'""" + +example_mode_aes_128_cfb8_datatype_Enum8_iv_16_aad_None = r"""'33'""" + +example_mode_aes_128_cfb8_datatype_Enum16_iv_16_aad_None = r"""'3368'""" + +example_mode_aes_192_cfb8_datatype_String_iv_16_aad_None = r"""'59'""" + +example_mode_aes_192_cfb8_datatype_FixedString_iv_16_aad_None = r"""'59'""" + +example_mode_aes_192_cfb8_datatype_UInt8_iv_16_aad_None = r"""'69'""" + +example_mode_aes_192_cfb8_datatype_UInt16_iv_16_aad_None = r"""'6924'""" + +example_mode_aes_192_cfb8_datatype_UInt32_iv_16_aad_None = r"""'6924A086'""" + +example_mode_aes_192_cfb8_datatype_UInt64_iv_16_aad_None = r"""'6924A086F8F61C3C'""" + +example_mode_aes_192_cfb8_datatype_Int8_iv_16_aad_None = r"""'69'""" + +example_mode_aes_192_cfb8_datatype_Int16_iv_16_aad_None = r"""'6924'""" + +example_mode_aes_192_cfb8_datatype_Int32_iv_16_aad_None = r"""'6924A086'""" + +example_mode_aes_192_cfb8_datatype_Int64_iv_16_aad_None = r"""'6924A086F8F61C3C'""" + +example_mode_aes_192_cfb8_datatype_Float32_iv_16_aad_None = r"""'6861DF7A'""" + +example_mode_aes_192_cfb8_datatype_Float64_iv_16_aad_None = r"""'68615FBC184B8D50'""" + +example_mode_aes_192_cfb8_datatype_Decimal32_iv_16_aad_None = r"""'48041B5C'""" + +example_mode_aes_192_cfb8_datatype_Decimal64_iv_16_aad_None = r"""'48041B5C6BEF70DD'""" + +example_mode_aes_192_cfb8_datatype_Decimal128_iv_16_aad_None = r"""'48041B5C6BEF70DD4CDABC1FC8C2C684'""" + +example_mode_aes_192_cfb8_datatype_UUID_iv_16_aad_None = r"""'8FF1142976A9808C0F475A3D2A34D06D'""" + +example_mode_aes_192_cfb8_datatype_Date_iv_16_aad_None = r"""'3E6D'""" + +example_mode_aes_192_cfb8_datatype_DateTime_iv_16_aad_None = r"""'269AFDC7'""" + +example_mode_aes_192_cfb8_datatype_DateTime64_iv_16_aad_None = r"""'4350703E05F43A50'""" + +example_mode_aes_192_cfb8_datatype_LowCardinality_iv_16_aad_None = r"""'59'""" + +example_mode_aes_192_cfb8_datatype_Array_iv_16_aad_None = r"""'6926'""" + +example_mode_aes_192_cfb8_datatype_NULL_iv_16_aad_None = r"""'\\N'""" + +example_mode_aes_192_cfb8_datatype_IPv4_iv_16_aad_None = r"""'45979A4C'""" + +example_mode_aes_192_cfb8_datatype_IPv6_iv_16_aad_None = r"""'484BFA49756D837181B7EE03EBCF2B79'""" + +example_mode_aes_192_cfb8_datatype_Enum8_iv_16_aad_None = r"""'69'""" + +example_mode_aes_192_cfb8_datatype_Enum16_iv_16_aad_None = r"""'6924'""" + +example_mode_aes_256_cfb8_datatype_String_iv_16_aad_None = r"""'58'""" + +example_mode_aes_256_cfb8_datatype_FixedString_iv_16_aad_None = r"""'58'""" + +example_mode_aes_256_cfb8_datatype_UInt8_iv_16_aad_None = r"""'68'""" + +example_mode_aes_256_cfb8_datatype_UInt16_iv_16_aad_None = r"""'682C'""" + +example_mode_aes_256_cfb8_datatype_UInt32_iv_16_aad_None = r"""'682CE0A9'""" + +example_mode_aes_256_cfb8_datatype_UInt64_iv_16_aad_None = r"""'682CE0A9FFAF55AE'""" + +example_mode_aes_256_cfb8_datatype_Int8_iv_16_aad_None = r"""'68'""" + +example_mode_aes_256_cfb8_datatype_Int16_iv_16_aad_None = r"""'682C'""" + +example_mode_aes_256_cfb8_datatype_Int32_iv_16_aad_None = r"""'682CE0A9'""" + +example_mode_aes_256_cfb8_datatype_Int64_iv_16_aad_None = r"""'682CE0A9FFAF55AE'""" + +example_mode_aes_256_cfb8_datatype_Float32_iv_16_aad_None = r"""'69B127F9'""" + +example_mode_aes_256_cfb8_datatype_Float64_iv_16_aad_None = r"""'69B1A72CB81A0FFF'""" + +example_mode_aes_256_cfb8_datatype_Decimal32_iv_16_aad_None = r"""'49378750'""" + +example_mode_aes_256_cfb8_datatype_Decimal64_iv_16_aad_None = r"""'493787505DFF5606'""" + +example_mode_aes_256_cfb8_datatype_Decimal128_iv_16_aad_None = r"""'493787505DFF5606774649C631E6E0E7'""" + +example_mode_aes_256_cfb8_datatype_UUID_iv_16_aad_None = r"""'8E09A60AA21565C888B2D92942896930'""" + +example_mode_aes_256_cfb8_datatype_Date_iv_16_aad_None = r"""'3FF1'""" + +example_mode_aes_256_cfb8_datatype_DateTime_iv_16_aad_None = r"""'274E13D8'""" + +example_mode_aes_256_cfb8_datatype_DateTime64_iv_16_aad_None = r"""'4211DFF611769F37'""" + +example_mode_aes_256_cfb8_datatype_LowCardinality_iv_16_aad_None = r"""'58'""" + +example_mode_aes_256_cfb8_datatype_Array_iv_16_aad_None = r"""'682E'""" + +example_mode_aes_256_cfb8_datatype_NULL_iv_16_aad_None = r"""'\\N'""" + +example_mode_aes_256_cfb8_datatype_IPv4_iv_16_aad_None = r"""'442DB771'""" + +example_mode_aes_256_cfb8_datatype_IPv6_iv_16_aad_None = r"""'4978AF3EED91F4AD14F7C326CCD96804'""" + +example_mode_aes_256_cfb8_datatype_Enum8_iv_16_aad_None = r"""'68'""" + +example_mode_aes_256_cfb8_datatype_Enum16_iv_16_aad_None = r"""'682C'""" + +example_mode_aes_128_cfb128_datatype_String_iv_None_aad_None = r"""'21'""" + +example_mode_aes_128_cfb128_datatype_FixedString_iv_None_aad_None = r"""'21'""" + +example_mode_aes_128_cfb128_datatype_UInt8_iv_None_aad_None = r"""'11'""" + +example_mode_aes_128_cfb128_datatype_UInt16_iv_None_aad_None = r"""'11DF'""" + +example_mode_aes_128_cfb128_datatype_UInt32_iv_None_aad_None = r"""'11DFC1B5'""" + +example_mode_aes_128_cfb128_datatype_UInt64_iv_None_aad_None = r"""'11DFC1B5F66CFD6A'""" + +example_mode_aes_128_cfb128_datatype_Int8_iv_None_aad_None = r"""'11'""" + +example_mode_aes_128_cfb128_datatype_Int16_iv_None_aad_None = r"""'11DF'""" + +example_mode_aes_128_cfb128_datatype_Int32_iv_None_aad_None = r"""'11DFC1B5'""" + +example_mode_aes_128_cfb128_datatype_Int64_iv_None_aad_None = r"""'11DFC1B5F66CFD6A'""" + +example_mode_aes_128_cfb128_datatype_Float32_iv_None_aad_None = r"""'10DF418A'""" + +example_mode_aes_128_cfb128_datatype_Float64_iv_None_aad_None = r"""'10DFC1B5F66C0D55'""" + +example_mode_aes_128_cfb128_datatype_Decimal32_iv_None_aad_None = r"""'3091C1B5'""" + +example_mode_aes_128_cfb128_datatype_Decimal64_iv_None_aad_None = r"""'3091C1B5F66CFD6A'""" + +example_mode_aes_128_cfb128_datatype_Decimal128_iv_None_aad_None = r"""'3091C1B5F66CFD6A1DC46D66907BEEB1'""" + +example_mode_aes_128_cfb128_datatype_UUID_iv_None_aad_None = r"""'F7CE72E9F2A80D0BBD1FBE0C90DD9521'""" + +example_mode_aes_128_cfb128_datatype_Date_iv_None_aad_None = r"""'4698'""" + +example_mode_aes_128_cfb128_datatype_DateTime_iv_None_aad_None = r"""'5E0FCDEB'""" + +example_mode_aes_128_cfb128_datatype_DateTime64_iv_None_aad_None = r"""'3B6ECCD7996DFD6A'""" + +example_mode_aes_128_cfb128_datatype_LowCardinality_iv_None_aad_None = r"""'21'""" + +example_mode_aes_128_cfb128_datatype_Array_iv_None_aad_None = r"""'11DD'""" + +example_mode_aes_128_cfb128_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_128_cfb128_datatype_IPv4_iv_None_aad_None = r"""'3D5D201E'""" + +example_mode_aes_128_cfb128_datatype_IPv6_iv_None_aad_None = r"""'30DECC0DF66C78C91DC46D663C646EB0'""" + +example_mode_aes_128_cfb128_datatype_Enum8_iv_None_aad_None = r"""'11'""" + +example_mode_aes_128_cfb128_datatype_Enum16_iv_None_aad_None = r"""'11DF'""" + +example_mode_aes_192_cfb128_datatype_String_iv_None_aad_None = r"""'36'""" + +example_mode_aes_192_cfb128_datatype_FixedString_iv_None_aad_None = r"""'36'""" + +example_mode_aes_192_cfb128_datatype_UInt8_iv_None_aad_None = r"""'06'""" + +example_mode_aes_192_cfb128_datatype_UInt16_iv_None_aad_None = r"""'06B7'""" + +example_mode_aes_192_cfb128_datatype_UInt32_iv_None_aad_None = r"""'06B7199D'""" + +example_mode_aes_192_cfb128_datatype_UInt64_iv_None_aad_None = r"""'06B7199D3D3CA19E'""" + +example_mode_aes_192_cfb128_datatype_Int8_iv_None_aad_None = r"""'06'""" + +example_mode_aes_192_cfb128_datatype_Int16_iv_None_aad_None = r"""'06B7'""" + +example_mode_aes_192_cfb128_datatype_Int32_iv_None_aad_None = r"""'06B7199D'""" + +example_mode_aes_192_cfb128_datatype_Int64_iv_None_aad_None = r"""'06B7199D3D3CA19E'""" + +example_mode_aes_192_cfb128_datatype_Float32_iv_None_aad_None = r"""'07B799A2'""" + +example_mode_aes_192_cfb128_datatype_Float64_iv_None_aad_None = r"""'07B7199D3D3C51A1'""" + +example_mode_aes_192_cfb128_datatype_Decimal32_iv_None_aad_None = r"""'27F9199D'""" + +example_mode_aes_192_cfb128_datatype_Decimal64_iv_None_aad_None = r"""'27F9199D3D3CA19E'""" + +example_mode_aes_192_cfb128_datatype_Decimal128_iv_None_aad_None = r"""'27F9199D3D3CA19E2CCE5990D7551E73'""" + +example_mode_aes_192_cfb128_datatype_UUID_iv_None_aad_None = r"""'E0A6AAC139F851FF8C158AFAD7F365E3'""" + +example_mode_aes_192_cfb128_datatype_Date_iv_None_aad_None = r"""'51F0'""" + +example_mode_aes_192_cfb128_datatype_DateTime_iv_None_aad_None = r"""'496715C3'""" + +example_mode_aes_192_cfb128_datatype_DateTime64_iv_None_aad_None = r"""'2C0614FF523DA19E'""" + +example_mode_aes_192_cfb128_datatype_LowCardinality_iv_None_aad_None = r"""'36'""" + +example_mode_aes_192_cfb128_datatype_Array_iv_None_aad_None = r"""'06B5'""" + +example_mode_aes_192_cfb128_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_192_cfb128_datatype_IPv4_iv_None_aad_None = r"""'2A35F836'""" + +example_mode_aes_192_cfb128_datatype_IPv6_iv_None_aad_None = r"""'27B614253D3C243D2CCE59907B4A9E72'""" + +example_mode_aes_192_cfb128_datatype_Enum8_iv_None_aad_None = r"""'06'""" + +example_mode_aes_192_cfb128_datatype_Enum16_iv_None_aad_None = r"""'06B7'""" + +example_mode_aes_256_cfb128_datatype_String_iv_None_aad_None = r"""'81'""" + +example_mode_aes_256_cfb128_datatype_FixedString_iv_None_aad_None = r"""'81'""" + +example_mode_aes_256_cfb128_datatype_UInt8_iv_None_aad_None = r"""'B1'""" + +example_mode_aes_256_cfb128_datatype_UInt16_iv_None_aad_None = r"""'B18E'""" + +example_mode_aes_256_cfb128_datatype_UInt32_iv_None_aad_None = r"""'B18ECF9E'""" + +example_mode_aes_256_cfb128_datatype_UInt64_iv_None_aad_None = r"""'B18ECF9EC7EB5F0D'""" + +example_mode_aes_256_cfb128_datatype_Int8_iv_None_aad_None = r"""'B1'""" + +example_mode_aes_256_cfb128_datatype_Int16_iv_None_aad_None = r"""'B18E'""" + +example_mode_aes_256_cfb128_datatype_Int32_iv_None_aad_None = r"""'B18ECF9E'""" + +example_mode_aes_256_cfb128_datatype_Int64_iv_None_aad_None = r"""'B18ECF9EC7EB5F0D'""" + +example_mode_aes_256_cfb128_datatype_Float32_iv_None_aad_None = r"""'B08E4FA1'""" + +example_mode_aes_256_cfb128_datatype_Float64_iv_None_aad_None = r"""'B08ECF9EC7EBAF32'""" + +example_mode_aes_256_cfb128_datatype_Decimal32_iv_None_aad_None = r"""'90C0CF9E'""" + +example_mode_aes_256_cfb128_datatype_Decimal64_iv_None_aad_None = r"""'90C0CF9EC7EB5F0D'""" + +example_mode_aes_256_cfb128_datatype_Decimal128_iv_None_aad_None = r"""'90C0CF9EC7EB5F0D7B78C42556D668AC'""" + +example_mode_aes_256_cfb128_datatype_UUID_iv_None_aad_None = r"""'579F7CC2C32FAF6CDBA3174F5670133C'""" + +example_mode_aes_256_cfb128_datatype_Date_iv_None_aad_None = r"""'E6C9'""" + +example_mode_aes_256_cfb128_datatype_DateTime_iv_None_aad_None = r"""'FE5EC3C0'""" + +example_mode_aes_256_cfb128_datatype_DateTime64_iv_None_aad_None = r"""'9B3FC2FCA8EA5F0D'""" + +example_mode_aes_256_cfb128_datatype_LowCardinality_iv_None_aad_None = r"""'81'""" + +example_mode_aes_256_cfb128_datatype_Array_iv_None_aad_None = r"""'B18C'""" + +example_mode_aes_256_cfb128_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_256_cfb128_datatype_IPv4_iv_None_aad_None = r"""'9D0C2E35'""" + +example_mode_aes_256_cfb128_datatype_IPv6_iv_None_aad_None = r"""'908FC226C7EBDAAE7B78C425FAC9E8AD'""" + +example_mode_aes_256_cfb128_datatype_Enum8_iv_None_aad_None = r"""'B1'""" + +example_mode_aes_256_cfb128_datatype_Enum16_iv_None_aad_None = r"""'B18E'""" + +example_mode_aes_128_cfb128_datatype_String_iv_16_aad_None = r"""'03'""" + +example_mode_aes_128_cfb128_datatype_FixedString_iv_16_aad_None = r"""'03'""" + +example_mode_aes_128_cfb128_datatype_UInt8_iv_16_aad_None = r"""'33'""" + +example_mode_aes_128_cfb128_datatype_UInt16_iv_16_aad_None = r"""'3388'""" + +example_mode_aes_128_cfb128_datatype_UInt32_iv_16_aad_None = r"""'3388A984'""" + +example_mode_aes_128_cfb128_datatype_UInt64_iv_16_aad_None = r"""'3388A984DD06FF58'""" + +example_mode_aes_128_cfb128_datatype_Int8_iv_16_aad_None = r"""'33'""" + +example_mode_aes_128_cfb128_datatype_Int16_iv_16_aad_None = r"""'3388'""" + +example_mode_aes_128_cfb128_datatype_Int32_iv_16_aad_None = r"""'3388A984'""" + +example_mode_aes_128_cfb128_datatype_Int64_iv_16_aad_None = r"""'3388A984DD06FF58'""" + +example_mode_aes_128_cfb128_datatype_Float32_iv_16_aad_None = r"""'328829BB'""" + +example_mode_aes_128_cfb128_datatype_Float64_iv_16_aad_None = r"""'3288A984DD060F67'""" + +example_mode_aes_128_cfb128_datatype_Decimal32_iv_16_aad_None = r"""'12C6A984'""" + +example_mode_aes_128_cfb128_datatype_Decimal64_iv_16_aad_None = r"""'12C6A984DD06FF58'""" + +example_mode_aes_128_cfb128_datatype_Decimal128_iv_16_aad_None = r"""'12C6A984DD06FF58E93960B1DEC50F1E'""" + +example_mode_aes_128_cfb128_datatype_UUID_iv_16_aad_None = r"""'D5991AD8D9C20F3949E2B3DBDE63748E'""" + +example_mode_aes_128_cfb128_datatype_Date_iv_16_aad_None = r"""'64CF'""" + +example_mode_aes_128_cfb128_datatype_DateTime_iv_16_aad_None = r"""'7C58A5DA'""" + +example_mode_aes_128_cfb128_datatype_DateTime64_iv_16_aad_None = r"""'1939A4E6B207FF58'""" + +example_mode_aes_128_cfb128_datatype_LowCardinality_iv_16_aad_None = r"""'03'""" + +example_mode_aes_128_cfb128_datatype_Array_iv_16_aad_None = r"""'338A'""" + +example_mode_aes_128_cfb128_datatype_NULL_iv_16_aad_None = r"""'\\N'""" + +example_mode_aes_128_cfb128_datatype_IPv4_iv_16_aad_None = r"""'1F0A482F'""" + +example_mode_aes_128_cfb128_datatype_IPv6_iv_16_aad_None = r"""'1289A43CDD067AFBE93960B172DA8F1F'""" + +example_mode_aes_128_cfb128_datatype_Enum8_iv_16_aad_None = r"""'33'""" + +example_mode_aes_128_cfb128_datatype_Enum16_iv_16_aad_None = r"""'3388'""" + +example_mode_aes_192_cfb128_datatype_String_iv_16_aad_None = r"""'59'""" + +example_mode_aes_192_cfb128_datatype_FixedString_iv_16_aad_None = r"""'59'""" + +example_mode_aes_192_cfb128_datatype_UInt8_iv_16_aad_None = r"""'69'""" + +example_mode_aes_192_cfb128_datatype_UInt16_iv_16_aad_None = r"""'69C7'""" + +example_mode_aes_192_cfb128_datatype_UInt32_iv_16_aad_None = r"""'69C7E792'""" + +example_mode_aes_192_cfb128_datatype_UInt64_iv_16_aad_None = r"""'69C7E792B71077B1'""" + +example_mode_aes_192_cfb128_datatype_Int8_iv_16_aad_None = r"""'69'""" + +example_mode_aes_192_cfb128_datatype_Int16_iv_16_aad_None = r"""'69C7'""" + +example_mode_aes_192_cfb128_datatype_Int32_iv_16_aad_None = r"""'69C7E792'""" + +example_mode_aes_192_cfb128_datatype_Int64_iv_16_aad_None = r"""'69C7E792B71077B1'""" + +example_mode_aes_192_cfb128_datatype_Float32_iv_16_aad_None = r"""'68C767AD'""" + +example_mode_aes_192_cfb128_datatype_Float64_iv_16_aad_None = r"""'68C7E792B710878E'""" + +example_mode_aes_192_cfb128_datatype_Decimal32_iv_16_aad_None = r"""'4889E792'""" + +example_mode_aes_192_cfb128_datatype_Decimal64_iv_16_aad_None = r"""'4889E792B71077B1'""" + +example_mode_aes_192_cfb128_datatype_Decimal128_iv_16_aad_None = r"""'4889E792B71077B18446050EBFD861B5'""" + +example_mode_aes_192_cfb128_datatype_UUID_iv_16_aad_None = r"""'8FD654CEB3D487D0249DD664BF7E1A25'""" + +example_mode_aes_192_cfb128_datatype_Date_iv_16_aad_None = r"""'3E80'""" + +example_mode_aes_192_cfb128_datatype_DateTime_iv_16_aad_None = r"""'2617EBCC'""" + +example_mode_aes_192_cfb128_datatype_DateTime64_iv_16_aad_None = r"""'4376EAF0D81177B1'""" + +example_mode_aes_192_cfb128_datatype_LowCardinality_iv_16_aad_None = r"""'59'""" + +example_mode_aes_192_cfb128_datatype_Array_iv_16_aad_None = r"""'69C5'""" + +example_mode_aes_192_cfb128_datatype_NULL_iv_16_aad_None = r"""'\\N'""" + +example_mode_aes_192_cfb128_datatype_IPv4_iv_16_aad_None = r"""'45450639'""" + +example_mode_aes_192_cfb128_datatype_IPv6_iv_16_aad_None = r"""'48C6EA2AB710F2128446050E13C7E1B4'""" + +example_mode_aes_192_cfb128_datatype_Enum8_iv_16_aad_None = r"""'69'""" + +example_mode_aes_192_cfb128_datatype_Enum16_iv_16_aad_None = r"""'69C7'""" + +example_mode_aes_256_cfb128_datatype_String_iv_16_aad_None = r"""'58'""" + +example_mode_aes_256_cfb128_datatype_FixedString_iv_16_aad_None = r"""'58'""" + +example_mode_aes_256_cfb128_datatype_UInt8_iv_16_aad_None = r"""'68'""" + +example_mode_aes_256_cfb128_datatype_UInt16_iv_16_aad_None = r"""'6858'""" + +example_mode_aes_256_cfb128_datatype_UInt32_iv_16_aad_None = r"""'68588817'""" + +example_mode_aes_256_cfb128_datatype_UInt64_iv_16_aad_None = r"""'685888173CDE4488'""" + +example_mode_aes_256_cfb128_datatype_Int8_iv_16_aad_None = r"""'68'""" + +example_mode_aes_256_cfb128_datatype_Int16_iv_16_aad_None = r"""'6858'""" + +example_mode_aes_256_cfb128_datatype_Int32_iv_16_aad_None = r"""'68588817'""" + +example_mode_aes_256_cfb128_datatype_Int64_iv_16_aad_None = r"""'685888173CDE4488'""" + +example_mode_aes_256_cfb128_datatype_Float32_iv_16_aad_None = r"""'69580828'""" + +example_mode_aes_256_cfb128_datatype_Float64_iv_16_aad_None = r"""'695888173CDEB4B7'""" + +example_mode_aes_256_cfb128_datatype_Decimal32_iv_16_aad_None = r"""'49168817'""" + +example_mode_aes_256_cfb128_datatype_Decimal64_iv_16_aad_None = r"""'491688173CDE4488'""" + +example_mode_aes_256_cfb128_datatype_Decimal128_iv_16_aad_None = r"""'491688173CDE448870E043A7733CC726'""" + +example_mode_aes_256_cfb128_datatype_UUID_iv_16_aad_None = r"""'8E493B4B381AB4E9D03B90CD739ABCB6'""" + +example_mode_aes_256_cfb128_datatype_Date_iv_16_aad_None = r"""'3F1F'""" + +example_mode_aes_256_cfb128_datatype_DateTime_iv_16_aad_None = r"""'27888449'""" + +example_mode_aes_256_cfb128_datatype_DateTime64_iv_16_aad_None = r"""'42E9857553DF4488'""" + +example_mode_aes_256_cfb128_datatype_LowCardinality_iv_16_aad_None = r"""'58'""" + +example_mode_aes_256_cfb128_datatype_Array_iv_16_aad_None = r"""'685A'""" + +example_mode_aes_256_cfb128_datatype_NULL_iv_16_aad_None = r"""'\\N'""" + +example_mode_aes_256_cfb128_datatype_IPv4_iv_16_aad_None = r"""'44DA69BC'""" + +example_mode_aes_256_cfb128_datatype_IPv6_iv_16_aad_None = r"""'495985AF3CDEC12B70E043A7DF234727'""" + +example_mode_aes_256_cfb128_datatype_Enum8_iv_16_aad_None = r"""'68'""" + +example_mode_aes_256_cfb128_datatype_Enum16_iv_16_aad_None = r"""'6858'""" + +example_mode_aes_128_ofb_datatype_String_iv_None_aad_None = r"""'21'""" + +example_mode_aes_128_ofb_datatype_FixedString_iv_None_aad_None = r"""'21'""" + +example_mode_aes_128_ofb_datatype_UInt8_iv_None_aad_None = r"""'11'""" + +example_mode_aes_128_ofb_datatype_UInt16_iv_None_aad_None = r"""'11DF'""" + +example_mode_aes_128_ofb_datatype_UInt32_iv_None_aad_None = r"""'11DFC1B5'""" + +example_mode_aes_128_ofb_datatype_UInt64_iv_None_aad_None = r"""'11DFC1B5F66CFD6A'""" + +example_mode_aes_128_ofb_datatype_Int8_iv_None_aad_None = r"""'11'""" + +example_mode_aes_128_ofb_datatype_Int16_iv_None_aad_None = r"""'11DF'""" + +example_mode_aes_128_ofb_datatype_Int32_iv_None_aad_None = r"""'11DFC1B5'""" + +example_mode_aes_128_ofb_datatype_Int64_iv_None_aad_None = r"""'11DFC1B5F66CFD6A'""" + +example_mode_aes_128_ofb_datatype_Float32_iv_None_aad_None = r"""'10DF418A'""" + +example_mode_aes_128_ofb_datatype_Float64_iv_None_aad_None = r"""'10DFC1B5F66C0D55'""" + +example_mode_aes_128_ofb_datatype_Decimal32_iv_None_aad_None = r"""'3091C1B5'""" + +example_mode_aes_128_ofb_datatype_Decimal64_iv_None_aad_None = r"""'3091C1B5F66CFD6A'""" + +example_mode_aes_128_ofb_datatype_Decimal128_iv_None_aad_None = r"""'3091C1B5F66CFD6A1DC46D66907BEEB1'""" + +example_mode_aes_128_ofb_datatype_UUID_iv_None_aad_None = r"""'F7CE72E9F2A80D0BBD1FBE0C90DD9521'""" + +example_mode_aes_128_ofb_datatype_Date_iv_None_aad_None = r"""'4698'""" + +example_mode_aes_128_ofb_datatype_DateTime_iv_None_aad_None = r"""'5E0FCDEB'""" + +example_mode_aes_128_ofb_datatype_DateTime64_iv_None_aad_None = r"""'3B6ECCD7996DFD6A'""" + +example_mode_aes_128_ofb_datatype_LowCardinality_iv_None_aad_None = r"""'21'""" + +example_mode_aes_128_ofb_datatype_Array_iv_None_aad_None = r"""'11DD'""" + +example_mode_aes_128_ofb_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_128_ofb_datatype_IPv4_iv_None_aad_None = r"""'3D5D201E'""" + +example_mode_aes_128_ofb_datatype_IPv6_iv_None_aad_None = r"""'30DECC0DF66C78C91DC46D663C646EB0'""" + +example_mode_aes_128_ofb_datatype_Enum8_iv_None_aad_None = r"""'11'""" + +example_mode_aes_128_ofb_datatype_Enum16_iv_None_aad_None = r"""'11DF'""" + +example_mode_aes_192_ofb_datatype_String_iv_None_aad_None = r"""'36'""" + +example_mode_aes_192_ofb_datatype_FixedString_iv_None_aad_None = r"""'36'""" + +example_mode_aes_192_ofb_datatype_UInt8_iv_None_aad_None = r"""'06'""" + +example_mode_aes_192_ofb_datatype_UInt16_iv_None_aad_None = r"""'06B7'""" + +example_mode_aes_192_ofb_datatype_UInt32_iv_None_aad_None = r"""'06B7199D'""" + +example_mode_aes_192_ofb_datatype_UInt64_iv_None_aad_None = r"""'06B7199D3D3CA19E'""" + +example_mode_aes_192_ofb_datatype_Int8_iv_None_aad_None = r"""'06'""" + +example_mode_aes_192_ofb_datatype_Int16_iv_None_aad_None = r"""'06B7'""" + +example_mode_aes_192_ofb_datatype_Int32_iv_None_aad_None = r"""'06B7199D'""" + +example_mode_aes_192_ofb_datatype_Int64_iv_None_aad_None = r"""'06B7199D3D3CA19E'""" + +example_mode_aes_192_ofb_datatype_Float32_iv_None_aad_None = r"""'07B799A2'""" + +example_mode_aes_192_ofb_datatype_Float64_iv_None_aad_None = r"""'07B7199D3D3C51A1'""" + +example_mode_aes_192_ofb_datatype_Decimal32_iv_None_aad_None = r"""'27F9199D'""" + +example_mode_aes_192_ofb_datatype_Decimal64_iv_None_aad_None = r"""'27F9199D3D3CA19E'""" + +example_mode_aes_192_ofb_datatype_Decimal128_iv_None_aad_None = r"""'27F9199D3D3CA19E2CCE5990D7551E73'""" + +example_mode_aes_192_ofb_datatype_UUID_iv_None_aad_None = r"""'E0A6AAC139F851FF8C158AFAD7F365E3'""" + +example_mode_aes_192_ofb_datatype_Date_iv_None_aad_None = r"""'51F0'""" + +example_mode_aes_192_ofb_datatype_DateTime_iv_None_aad_None = r"""'496715C3'""" + +example_mode_aes_192_ofb_datatype_DateTime64_iv_None_aad_None = r"""'2C0614FF523DA19E'""" + +example_mode_aes_192_ofb_datatype_LowCardinality_iv_None_aad_None = r"""'36'""" + +example_mode_aes_192_ofb_datatype_Array_iv_None_aad_None = r"""'06B5'""" + +example_mode_aes_192_ofb_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_192_ofb_datatype_IPv4_iv_None_aad_None = r"""'2A35F836'""" + +example_mode_aes_192_ofb_datatype_IPv6_iv_None_aad_None = r"""'27B614253D3C243D2CCE59907B4A9E72'""" + +example_mode_aes_192_ofb_datatype_Enum8_iv_None_aad_None = r"""'06'""" + +example_mode_aes_192_ofb_datatype_Enum16_iv_None_aad_None = r"""'06B7'""" + +example_mode_aes_256_ofb_datatype_String_iv_None_aad_None = r"""'81'""" + +example_mode_aes_256_ofb_datatype_FixedString_iv_None_aad_None = r"""'81'""" + +example_mode_aes_256_ofb_datatype_UInt8_iv_None_aad_None = r"""'B1'""" + +example_mode_aes_256_ofb_datatype_UInt16_iv_None_aad_None = r"""'B18E'""" + +example_mode_aes_256_ofb_datatype_UInt32_iv_None_aad_None = r"""'B18ECF9E'""" + +example_mode_aes_256_ofb_datatype_UInt64_iv_None_aad_None = r"""'B18ECF9EC7EB5F0D'""" + +example_mode_aes_256_ofb_datatype_Int8_iv_None_aad_None = r"""'B1'""" + +example_mode_aes_256_ofb_datatype_Int16_iv_None_aad_None = r"""'B18E'""" + +example_mode_aes_256_ofb_datatype_Int32_iv_None_aad_None = r"""'B18ECF9E'""" + +example_mode_aes_256_ofb_datatype_Int64_iv_None_aad_None = r"""'B18ECF9EC7EB5F0D'""" + +example_mode_aes_256_ofb_datatype_Float32_iv_None_aad_None = r"""'B08E4FA1'""" + +example_mode_aes_256_ofb_datatype_Float64_iv_None_aad_None = r"""'B08ECF9EC7EBAF32'""" + +example_mode_aes_256_ofb_datatype_Decimal32_iv_None_aad_None = r"""'90C0CF9E'""" + +example_mode_aes_256_ofb_datatype_Decimal64_iv_None_aad_None = r"""'90C0CF9EC7EB5F0D'""" + +example_mode_aes_256_ofb_datatype_Decimal128_iv_None_aad_None = r"""'90C0CF9EC7EB5F0D7B78C42556D668AC'""" + +example_mode_aes_256_ofb_datatype_UUID_iv_None_aad_None = r"""'579F7CC2C32FAF6CDBA3174F5670133C'""" + +example_mode_aes_256_ofb_datatype_Date_iv_None_aad_None = r"""'E6C9'""" + +example_mode_aes_256_ofb_datatype_DateTime_iv_None_aad_None = r"""'FE5EC3C0'""" + +example_mode_aes_256_ofb_datatype_DateTime64_iv_None_aad_None = r"""'9B3FC2FCA8EA5F0D'""" + +example_mode_aes_256_ofb_datatype_LowCardinality_iv_None_aad_None = r"""'81'""" + +example_mode_aes_256_ofb_datatype_Array_iv_None_aad_None = r"""'B18C'""" + +example_mode_aes_256_ofb_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_256_ofb_datatype_IPv4_iv_None_aad_None = r"""'9D0C2E35'""" + +example_mode_aes_256_ofb_datatype_IPv6_iv_None_aad_None = r"""'908FC226C7EBDAAE7B78C425FAC9E8AD'""" + +example_mode_aes_256_ofb_datatype_Enum8_iv_None_aad_None = r"""'B1'""" + +example_mode_aes_256_ofb_datatype_Enum16_iv_None_aad_None = r"""'B18E'""" + +example_mode_aes_128_ofb_datatype_String_iv_16_aad_None = r"""'03'""" + +example_mode_aes_128_ofb_datatype_FixedString_iv_16_aad_None = r"""'03'""" + +example_mode_aes_128_ofb_datatype_UInt8_iv_16_aad_None = r"""'33'""" + +example_mode_aes_128_ofb_datatype_UInt16_iv_16_aad_None = r"""'3388'""" + +example_mode_aes_128_ofb_datatype_UInt32_iv_16_aad_None = r"""'3388A984'""" + +example_mode_aes_128_ofb_datatype_UInt64_iv_16_aad_None = r"""'3388A984DD06FF58'""" + +example_mode_aes_128_ofb_datatype_Int8_iv_16_aad_None = r"""'33'""" + +example_mode_aes_128_ofb_datatype_Int16_iv_16_aad_None = r"""'3388'""" + +example_mode_aes_128_ofb_datatype_Int32_iv_16_aad_None = r"""'3388A984'""" + +example_mode_aes_128_ofb_datatype_Int64_iv_16_aad_None = r"""'3388A984DD06FF58'""" + +example_mode_aes_128_ofb_datatype_Float32_iv_16_aad_None = r"""'328829BB'""" + +example_mode_aes_128_ofb_datatype_Float64_iv_16_aad_None = r"""'3288A984DD060F67'""" + +example_mode_aes_128_ofb_datatype_Decimal32_iv_16_aad_None = r"""'12C6A984'""" + +example_mode_aes_128_ofb_datatype_Decimal64_iv_16_aad_None = r"""'12C6A984DD06FF58'""" + +example_mode_aes_128_ofb_datatype_Decimal128_iv_16_aad_None = r"""'12C6A984DD06FF58E93960B1DEC50F1E'""" + +example_mode_aes_128_ofb_datatype_UUID_iv_16_aad_None = r"""'D5991AD8D9C20F3949E2B3DBDE63748E'""" + +example_mode_aes_128_ofb_datatype_Date_iv_16_aad_None = r"""'64CF'""" + +example_mode_aes_128_ofb_datatype_DateTime_iv_16_aad_None = r"""'7C58A5DA'""" + +example_mode_aes_128_ofb_datatype_DateTime64_iv_16_aad_None = r"""'1939A4E6B207FF58'""" + +example_mode_aes_128_ofb_datatype_LowCardinality_iv_16_aad_None = r"""'03'""" + +example_mode_aes_128_ofb_datatype_Array_iv_16_aad_None = r"""'338A'""" + +example_mode_aes_128_ofb_datatype_NULL_iv_16_aad_None = r"""'\\N'""" + +example_mode_aes_128_ofb_datatype_IPv4_iv_16_aad_None = r"""'1F0A482F'""" + +example_mode_aes_128_ofb_datatype_IPv6_iv_16_aad_None = r"""'1289A43CDD067AFBE93960B172DA8F1F'""" + +example_mode_aes_128_ofb_datatype_Enum8_iv_16_aad_None = r"""'33'""" + +example_mode_aes_128_ofb_datatype_Enum16_iv_16_aad_None = r"""'3388'""" + +example_mode_aes_192_ofb_datatype_String_iv_16_aad_None = r"""'59'""" + +example_mode_aes_192_ofb_datatype_FixedString_iv_16_aad_None = r"""'59'""" + +example_mode_aes_192_ofb_datatype_UInt8_iv_16_aad_None = r"""'69'""" + +example_mode_aes_192_ofb_datatype_UInt16_iv_16_aad_None = r"""'69C7'""" + +example_mode_aes_192_ofb_datatype_UInt32_iv_16_aad_None = r"""'69C7E792'""" + +example_mode_aes_192_ofb_datatype_UInt64_iv_16_aad_None = r"""'69C7E792B71077B1'""" + +example_mode_aes_192_ofb_datatype_Int8_iv_16_aad_None = r"""'69'""" + +example_mode_aes_192_ofb_datatype_Int16_iv_16_aad_None = r"""'69C7'""" + +example_mode_aes_192_ofb_datatype_Int32_iv_16_aad_None = r"""'69C7E792'""" + +example_mode_aes_192_ofb_datatype_Int64_iv_16_aad_None = r"""'69C7E792B71077B1'""" + +example_mode_aes_192_ofb_datatype_Float32_iv_16_aad_None = r"""'68C767AD'""" + +example_mode_aes_192_ofb_datatype_Float64_iv_16_aad_None = r"""'68C7E792B710878E'""" + +example_mode_aes_192_ofb_datatype_Decimal32_iv_16_aad_None = r"""'4889E792'""" + +example_mode_aes_192_ofb_datatype_Decimal64_iv_16_aad_None = r"""'4889E792B71077B1'""" + +example_mode_aes_192_ofb_datatype_Decimal128_iv_16_aad_None = r"""'4889E792B71077B18446050EBFD861B5'""" + +example_mode_aes_192_ofb_datatype_UUID_iv_16_aad_None = r"""'8FD654CEB3D487D0249DD664BF7E1A25'""" + +example_mode_aes_192_ofb_datatype_Date_iv_16_aad_None = r"""'3E80'""" + +example_mode_aes_192_ofb_datatype_DateTime_iv_16_aad_None = r"""'2617EBCC'""" + +example_mode_aes_192_ofb_datatype_DateTime64_iv_16_aad_None = r"""'4376EAF0D81177B1'""" + +example_mode_aes_192_ofb_datatype_LowCardinality_iv_16_aad_None = r"""'59'""" + +example_mode_aes_192_ofb_datatype_Array_iv_16_aad_None = r"""'69C5'""" + +example_mode_aes_192_ofb_datatype_NULL_iv_16_aad_None = r"""'\\N'""" + +example_mode_aes_192_ofb_datatype_IPv4_iv_16_aad_None = r"""'45450639'""" + +example_mode_aes_192_ofb_datatype_IPv6_iv_16_aad_None = r"""'48C6EA2AB710F2128446050E13C7E1B4'""" + +example_mode_aes_192_ofb_datatype_Enum8_iv_16_aad_None = r"""'69'""" + +example_mode_aes_192_ofb_datatype_Enum16_iv_16_aad_None = r"""'69C7'""" + +example_mode_aes_256_ofb_datatype_String_iv_16_aad_None = r"""'58'""" + +example_mode_aes_256_ofb_datatype_FixedString_iv_16_aad_None = r"""'58'""" + +example_mode_aes_256_ofb_datatype_UInt8_iv_16_aad_None = r"""'68'""" + +example_mode_aes_256_ofb_datatype_UInt16_iv_16_aad_None = r"""'6858'""" + +example_mode_aes_256_ofb_datatype_UInt32_iv_16_aad_None = r"""'68588817'""" + +example_mode_aes_256_ofb_datatype_UInt64_iv_16_aad_None = r"""'685888173CDE4488'""" + +example_mode_aes_256_ofb_datatype_Int8_iv_16_aad_None = r"""'68'""" + +example_mode_aes_256_ofb_datatype_Int16_iv_16_aad_None = r"""'6858'""" + +example_mode_aes_256_ofb_datatype_Int32_iv_16_aad_None = r"""'68588817'""" + +example_mode_aes_256_ofb_datatype_Int64_iv_16_aad_None = r"""'685888173CDE4488'""" + +example_mode_aes_256_ofb_datatype_Float32_iv_16_aad_None = r"""'69580828'""" + +example_mode_aes_256_ofb_datatype_Float64_iv_16_aad_None = r"""'695888173CDEB4B7'""" + +example_mode_aes_256_ofb_datatype_Decimal32_iv_16_aad_None = r"""'49168817'""" + +example_mode_aes_256_ofb_datatype_Decimal64_iv_16_aad_None = r"""'491688173CDE4488'""" + +example_mode_aes_256_ofb_datatype_Decimal128_iv_16_aad_None = r"""'491688173CDE448870E043A7733CC726'""" + +example_mode_aes_256_ofb_datatype_UUID_iv_16_aad_None = r"""'8E493B4B381AB4E9D03B90CD739ABCB6'""" + +example_mode_aes_256_ofb_datatype_Date_iv_16_aad_None = r"""'3F1F'""" + +example_mode_aes_256_ofb_datatype_DateTime_iv_16_aad_None = r"""'27888449'""" + +example_mode_aes_256_ofb_datatype_DateTime64_iv_16_aad_None = r"""'42E9857553DF4488'""" + +example_mode_aes_256_ofb_datatype_LowCardinality_iv_16_aad_None = r"""'58'""" + +example_mode_aes_256_ofb_datatype_Array_iv_16_aad_None = r"""'685A'""" + +example_mode_aes_256_ofb_datatype_NULL_iv_16_aad_None = r"""'\\N'""" + +example_mode_aes_256_ofb_datatype_IPv4_iv_16_aad_None = r"""'44DA69BC'""" + +example_mode_aes_256_ofb_datatype_IPv6_iv_16_aad_None = r"""'495985AF3CDEC12B70E043A7DF234727'""" + +example_mode_aes_256_ofb_datatype_Enum8_iv_16_aad_None = r"""'68'""" + +example_mode_aes_256_ofb_datatype_Enum16_iv_16_aad_None = r"""'6858'""" + +example_mode_aes_128_gcm_datatype_String_iv_12_aad_None = r"""'DC48B85D412AEF42C46DA18E25139D5D9D'""" + +example_mode_aes_128_gcm_datatype_FixedString_iv_12_aad_None = r"""'DC48B85D412AEF42C46DA18E25139D5D9D'""" + +example_mode_aes_128_gcm_datatype_UInt8_iv_12_aad_None = r"""'EC55C7254FC59C53DDE89F0AF034F08A19'""" + +example_mode_aes_128_gcm_datatype_UInt16_iv_12_aad_None = r"""'EC9644C4CEFA3BB71CD48C619B03BD238C18'""" + +example_mode_aes_128_gcm_datatype_UInt32_iv_12_aad_None = r"""'EC96C142DE5B4B621603E2ADD041DBAEB3F54F50'""" + +example_mode_aes_128_gcm_datatype_UInt64_iv_12_aad_None = r"""'EC96C142F4FF6F21DA0515DBB392E4C83187679A10F9D879'""" + +example_mode_aes_128_gcm_datatype_Int8_iv_12_aad_None = r"""'EC55C7254FC59C53DDE89F0AF034F08A19'""" + +example_mode_aes_128_gcm_datatype_Int16_iv_12_aad_None = r"""'EC9644C4CEFA3BB71CD48C619B03BD238C18'""" + +example_mode_aes_128_gcm_datatype_Int32_iv_12_aad_None = r"""'EC96C142DE5B4B621603E2ADD041DBAEB3F54F50'""" + +example_mode_aes_128_gcm_datatype_Int64_iv_12_aad_None = r"""'EC96C142F4FF6F21DA0515DBB392E4C83187679A10F9D879'""" + +example_mode_aes_128_gcm_datatype_Float32_iv_12_aad_None = r"""'ED96417D9A89D5DA7B2DA96F78D0D545BD724061'""" + +example_mode_aes_128_gcm_datatype_Float64_iv_12_aad_None = r"""'ED96C142F4FF9F1E36E4396725C81E2B56D2E0A42CB04CE9'""" + +example_mode_aes_128_gcm_datatype_Decimal32_iv_12_aad_None = r"""'CDD8C142960BD83213972E95DB26FFEC37308C56'""" + +example_mode_aes_128_gcm_datatype_Decimal64_iv_12_aad_None = r"""'CDD8C142F4FF6F219255868BB60628F03AE043D8943C1B7F'""" + +example_mode_aes_128_gcm_datatype_Decimal128_iv_12_aad_None = r"""'CDD8C142F4FF6F214AC2960E7EA36A6B1B1FC500659A9E81A843F13DCFC70751'""" + +example_mode_aes_128_gcm_datatype_UUID_iv_12_aad_None = r"""'0A87721EF03B9F40EA1945647E0511FB0552FE1E5264499B02AE50562A94AFF7'""" + +example_mode_aes_128_gcm_datatype_Date_iv_12_aad_None = r"""'BBD12669328AE5725A634A005E5B2C4BA877'""" + +example_mode_aes_128_gcm_datatype_DateTime_iv_12_aad_None = r"""'A346CD1C097FB5A48C84628E9C0C9F3BF4E3CBB2'""" + +example_mode_aes_128_gcm_datatype_DateTime64_iv_12_aad_None = r"""'C627CC209BFE6F21638D7F1465C11D12578CF38254273DC9'""" + +example_mode_aes_128_gcm_datatype_LowCardinality_iv_12_aad_None = r"""'DC48B85D412AEF42C46DA18E25139D5D9D'""" + +example_mode_aes_128_gcm_datatype_Array_iv_12_aad_None = r"""'EC94283AABA0C4FC46F56D71F9B3CB40288E'""" + +example_mode_aes_128_gcm_datatype_NULL_iv_12_aad_None = r"""'\\N'""" + +example_mode_aes_128_gcm_datatype_IPv4_iv_12_aad_None = r"""'C01420E9B1BBD6ED16DC1CC0ED7AE9773CD72297'""" + +example_mode_aes_128_gcm_datatype_IPv6_iv_12_aad_None = r"""'CD97CCFAF4FFEA824AC2960ED2BCEA6AC9427AAD6328E977BF356C8AEF93B556'""" + +example_mode_aes_128_gcm_datatype_Enum8_iv_12_aad_None = r"""'EC55C7254FC59C53DDE89F0AF034F08A19'""" + +example_mode_aes_128_gcm_datatype_Enum16_iv_12_aad_None = r"""'EC9644C4CEFA3BB71CD48C619B03BD238C18'""" + +example_mode_aes_192_gcm_datatype_String_iv_12_aad_None = r"""'7B34E3F4BAFCD2F3D493F843FFEBF9A415'""" + +example_mode_aes_192_gcm_datatype_FixedString_iv_12_aad_None = r"""'7B34E3F4BAFCD2F3D493F843FFEBF9A415'""" + +example_mode_aes_192_gcm_datatype_UInt8_iv_12_aad_None = r"""'4B5F8852220B8F5659FDE6C603D1C7E127'""" + +example_mode_aes_192_gcm_datatype_UInt16_iv_12_aad_None = r"""'4BFA728CD0043E08485EF39EEFEF8554BDD1'""" + +example_mode_aes_192_gcm_datatype_UInt32_iv_12_aad_None = r"""'4BFAA6C499D3637CF257889C690120FA80FBDBFD'""" + +example_mode_aes_192_gcm_datatype_UInt64_iv_12_aad_None = r"""'4BFAA6C467061FE32600E6AE21DD8A6D7AA0A38D2BE318EE'""" + +example_mode_aes_192_gcm_datatype_Int8_iv_12_aad_None = r"""'4B5F8852220B8F5659FDE6C603D1C7E127'""" + +example_mode_aes_192_gcm_datatype_Int16_iv_12_aad_None = r"""'4BFA728CD0043E08485EF39EEFEF8554BDD1'""" + +example_mode_aes_192_gcm_datatype_Int32_iv_12_aad_None = r"""'4BFAA6C499D3637CF257889C690120FA80FBDBFD'""" + +example_mode_aes_192_gcm_datatype_Int64_iv_12_aad_None = r"""'4BFAA6C467061FE32600E6AE21DD8A6D7AA0A38D2BE318EE'""" + +example_mode_aes_192_gcm_datatype_Float32_iv_12_aad_None = r"""'4AFA26FB812573A4DCCCFFB53F91E180A3F6EB95'""" + +example_mode_aes_192_gcm_datatype_Float64_iv_12_aad_None = r"""'4AFAA6C46706EFDC2968FA31495521544C0E792959D3DBA7'""" + +example_mode_aes_192_gcm_datatype_Decimal32_iv_12_aad_None = r"""'6AB4A6C4382BD5F8E4915BD5701D917BA8651BCA'""" + +example_mode_aes_192_gcm_datatype_Decimal64_iv_12_aad_None = r"""'6AB4A6C467061FE387F8502A371B592463BC120C037DD8D9'""" + +example_mode_aes_192_gcm_datatype_Decimal128_iv_12_aad_None = r"""'6AB4A6C467061FE343593C80B73515B94130370E40D09BDBE9EDB5BEAF29C541'""" + +example_mode_aes_192_gcm_datatype_UUID_iv_12_aad_None = r"""'ADEB159863C2EF82E382EFEAB7936E296A91D29B6A49269870CC866604C82451'""" + +example_mode_aes_192_gcm_datatype_Date_iv_12_aad_None = r"""'1CBD949DFC326906B13FCB565C1B28516877'""" + +example_mode_aes_192_gcm_datatype_DateTime_iv_12_aad_None = r"""'042AAA9AB3B5BBD234DF77B8C35BD4EBF561AEC0'""" + +example_mode_aes_192_gcm_datatype_DateTime64_iv_12_aad_None = r"""'614BABA608071FE304B3939091C0CFC91D1371D5FBD3F6BE'""" + +example_mode_aes_192_gcm_datatype_LowCardinality_iv_12_aad_None = r"""'7B34E3F4BAFCD2F3D493F843FFEBF9A415'""" + +example_mode_aes_192_gcm_datatype_Array_iv_12_aad_None = r"""'4BF887E38B2870FDEECD6305AEA010298096'""" + +example_mode_aes_192_gcm_datatype_NULL_iv_12_aad_None = r"""'\\N'""" + +example_mode_aes_192_gcm_datatype_IPv4_iv_12_aad_None = r"""'6778476F9B3687FD4D022727F4641E697D35D8D5'""" + +example_mode_aes_192_gcm_datatype_IPv6_iv_12_aad_None = r"""'6AFBAB7C67069A4043593C801B2A95B81CF6DF4E6D63A84A0DF7939A3FBE5B2D'""" + +example_mode_aes_192_gcm_datatype_Enum8_iv_12_aad_None = r"""'4B5F8852220B8F5659FDE6C603D1C7E127'""" + +example_mode_aes_192_gcm_datatype_Enum16_iv_12_aad_None = r"""'4BFA728CD0043E08485EF39EEFEF8554BDD1'""" + +example_mode_aes_256_gcm_datatype_String_iv_12_aad_None = r"""'67B83EFC31C169D7613D6881E954F624C2'""" + +example_mode_aes_256_gcm_datatype_FixedString_iv_12_aad_None = r"""'67B83EFC31C169D7613D6881E954F624C2'""" + +example_mode_aes_256_gcm_datatype_UInt8_iv_12_aad_None = r"""'574B67F06530273DD181658D384D73A2F5'""" + +example_mode_aes_256_gcm_datatype_UInt16_iv_12_aad_None = r"""'57CBC5BA7DF134BBAE0153E139EB9D7B8D18'""" + +example_mode_aes_256_gcm_datatype_UInt32_iv_12_aad_None = r"""'57CB6C3A286A4C6BDCEBF8ECEE345F12B5F44729'""" + +example_mode_aes_256_gcm_datatype_UInt64_iv_12_aad_None = r"""'57CB6C3AFC8427B9E3A61ABE0A227F1C2ADB2694F324393D'""" + +example_mode_aes_256_gcm_datatype_Int8_iv_12_aad_None = r"""'574B67F06530273DD181658D384D73A2F5'""" + +example_mode_aes_256_gcm_datatype_Int16_iv_12_aad_None = r"""'57CBC5BA7DF134BBAE0153E139EB9D7B8D18'""" + +example_mode_aes_256_gcm_datatype_Int32_iv_12_aad_None = r"""'57CB6C3A286A4C6BDCEBF8ECEE345F12B5F44729'""" + +example_mode_aes_256_gcm_datatype_Int64_iv_12_aad_None = r"""'57CB6C3AFC8427B9E3A61ABE0A227F1C2ADB2694F324393D'""" + +example_mode_aes_256_gcm_datatype_Float32_iv_12_aad_None = r"""'56CBEC055F35D9E71D5AA0252DB60716A99B1CA2'""" + +example_mode_aes_256_gcm_datatype_Float64_iv_12_aad_None = r"""'56CB6C3AFC84D786DF3A9796E0FDCECFCBBC26274A60F542'""" + +example_mode_aes_256_gcm_datatype_Decimal32_iv_12_aad_None = r"""'76856C3AE585D8FCE599B3C2E0F077FAD5FFF7D4'""" + +example_mode_aes_256_gcm_datatype_Decimal64_iv_12_aad_None = r"""'76856C3AFC8427B92E498E2933503432241F0E7C932F89C0'""" + +example_mode_aes_256_gcm_datatype_Decimal128_iv_12_aad_None = r"""'76856C3AFC8427B90E79078689172F14CAA5CA7BDC5F7FCD915CAE4EC302FF1C'""" + +example_mode_aes_256_gcm_datatype_UUID_iv_12_aad_None = r"""'B1DADF66F840D7D8AEA2D4EC89B1548437C22BB5B8D92A3A139ACED61DB3F2B3'""" + +example_mode_aes_256_gcm_datatype_Date_iv_12_aad_None = r"""'008CFC6AFC8484AADA010876EF4686BC3528'""" + +example_mode_aes_256_gcm_datatype_DateTime_iv_12_aad_None = r"""'181B606489B8E56FEB8D9950EAE27205E36C94FB'""" + +example_mode_aes_256_gcm_datatype_DateTime64_iv_12_aad_None = r"""'7D7A6158938527B9F938A05622B5957BD801AE303908AD22'""" + +example_mode_aes_256_gcm_datatype_LowCardinality_iv_12_aad_None = r"""'67B83EFC31C169D7613D6881E954F624C2'""" + +example_mode_aes_256_gcm_datatype_Array_iv_12_aad_None = r"""'57C908D31B11B2CE494A61EC468B149A9D77'""" + +example_mode_aes_256_gcm_datatype_NULL_iv_12_aad_None = r"""'\\N'""" + +example_mode_aes_256_gcm_datatype_IPv4_iv_12_aad_None = r"""'7B498D91B274D5D6748C43E4345552318BD05DA6'""" + +example_mode_aes_256_gcm_datatype_IPv6_iv_12_aad_None = r"""'76CA6182FC84A21A0E7907862508AF15CCE4089698265E4B0656598079CE56CC'""" + +example_mode_aes_256_gcm_datatype_Enum8_iv_12_aad_None = r"""'574B67F06530273DD181658D384D73A2F5'""" + +example_mode_aes_256_gcm_datatype_Enum16_iv_12_aad_None = r"""'57CBC5BA7DF134BBAE0153E139EB9D7B8D18'""" + +example_mode_aes_128_gcm_datatype_String_iv_12_aad_True = r"""'DCFAF1088D33EF99F1D06E3D14F265FD41'""" + +example_mode_aes_128_gcm_datatype_FixedString_iv_12_aad_True = r"""'DCFAF1088D33EF99F1D06E3D14F265FD41'""" + +example_mode_aes_128_gcm_datatype_UInt8_iv_12_aad_True = r"""'ECE78E7083DC9C88E85550B9C1D5082AC5'""" + +example_mode_aes_128_gcm_datatype_UInt16_iv_12_aad_True = r"""'EC96F68D9B3622B7C7E131AE28325CDB2CC4'""" + +example_mode_aes_128_gcm_datatype_UInt32_iv_12_aad_True = r"""'EC96C1426C121EAE0F0339986D8E689F520DEF8C'""" + +example_mode_aes_128_gcm_datatype_UInt64_iv_12_aad_True = r"""'EC96C142F4FF6F21684C4017AA923FFD8C48D4ABF10178A5'""" + +example_mode_aes_128_gcm_datatype_Int8_iv_12_aad_True = r"""'ECE78E7083DC9C88E85550B9C1D5082AC5'""" + +example_mode_aes_128_gcm_datatype_Int16_iv_12_aad_True = r"""'EC96F68D9B3622B7C7E131AE28325CDB2CC4'""" + +example_mode_aes_128_gcm_datatype_Int32_iv_12_aad_True = r"""'EC96C1426C121EAE0F0339986D8E689F520DEF8C'""" + +example_mode_aes_128_gcm_datatype_Int64_iv_12_aad_True = r"""'EC96C142F4FF6F21684C4017AA923FFD8C48D4ABF10178A5'""" + +example_mode_aes_128_gcm_datatype_Float32_iv_12_aad_True = r"""'ED96417D28C08016622D725AC51F66745C8AE0BD'""" + +example_mode_aes_128_gcm_datatype_Float64_iv_12_aad_True = r"""'ED96C142F4FF9F1E84AD6CAB3CC8C51EEB1D5395CD48EC35'""" + +example_mode_aes_128_gcm_datatype_Decimal32_iv_12_aad_True = r"""'CDD8C14224428DFE0A97F5A066E94CDDD6C82C8A'""" + +example_mode_aes_128_gcm_datatype_Decimal64_iv_12_aad_True = r"""'CDD8C142F4FF6F21201CD347AF06F3C5872FF0E975C4BBA3'""" + +example_mode_aes_128_gcm_datatype_Decimal128_iv_12_aad_True = r"""'CDD8C142F4FF6F214AC2960E7EA36A6BA95690CC7C9A45B4158C420C2E3FA78D'""" + +example_mode_aes_128_gcm_datatype_UUID_iv_12_aad_True = r"""'0A87721EF03B9F40EA1945647E0511FBB71BABD24B6492AEBF61E367CB6C0F2B'""" + +example_mode_aes_128_gcm_datatype_Date_iv_12_aad_True = r"""'BBD194206746FC728156F7CFED6ACDB308AB'""" + +example_mode_aes_128_gcm_datatype_DateTime_iv_12_aad_True = r"""'A346CD1CBB36E0689584B9BB21C32C0A151B6B6E'""" + +example_mode_aes_128_gcm_datatype_DateTime64_iv_12_aad_True = r"""'C627CC209BFE6F21D1C42AD87CC1C627EA4340B3B5DF9D15'""" + +example_mode_aes_128_gcm_datatype_LowCardinality_iv_12_aad_True = r"""'DCFAF1088D33EF99F1D06E3D14F265FD41'""" + +example_mode_aes_128_gcm_datatype_Array_iv_12_aad_True = r"""'EC949A73FE6CDDFC9DC0D0BE4A822AB88852'""" + +example_mode_aes_128_gcm_datatype_NULL_iv_12_aad_True = r"""'\\N'""" + +example_mode_aes_128_gcm_datatype_IPv4_iv_12_aad_True = r"""'C01420E903F283210FDCC7F550B55A46DD2F824B'""" + +example_mode_aes_128_gcm_datatype_IPv6_iv_12_aad_True = r"""'CD97CCFAF4FFEA824AC2960ED2BCEA6A7B0B2F617A28324202FADFBB0E6B158A'""" + +example_mode_aes_128_gcm_datatype_Enum8_iv_12_aad_True = r"""'ECE78E7083DC9C88E85550B9C1D5082AC5'""" + +example_mode_aes_128_gcm_datatype_Enum16_iv_12_aad_True = r"""'EC96F68D9B3622B7C7E131AE28325CDB2CC4'""" + +example_mode_aes_192_gcm_datatype_String_iv_12_aad_True = r"""'7BB72D91D66E3C93B34FBAFF92526E1A0E'""" + +example_mode_aes_192_gcm_datatype_FixedString_iv_12_aad_True = r"""'7BB72D91D66E3C93B34FBAFF92526E1A0E'""" + +example_mode_aes_192_gcm_datatype_UInt8_iv_12_aad_True = r"""'4BDC46374E9961363E21A47A6E68505F3C'""" + +example_mode_aes_192_gcm_datatype_UInt16_iv_12_aad_True = r"""'4BFAF142B568ACE628392FDC53823CC303CA'""" + +example_mode_aes_192_gcm_datatype_UInt32_iv_12_aad_True = r"""'4BFAA6C41A1D061060B9E8FBB5439C97396C65E6'""" + +example_mode_aes_192_gcm_datatype_UInt64_iv_12_aad_True = r"""'4BFAA6C467061FE3A5CE83C2B333EA0AA6E21FE09274A6F5'""" + +example_mode_aes_192_gcm_datatype_Int8_iv_12_aad_True = r"""'4BDC46374E9961363E21A47A6E68505F3C'""" + +example_mode_aes_192_gcm_datatype_Int16_iv_12_aad_True = r"""'4BFAF142B568ACE628392FDC53823CC303CA'""" + +example_mode_aes_192_gcm_datatype_Int32_iv_12_aad_True = r"""'4BFAA6C41A1D061060B9E8FBB5439C97396C65E6'""" + +example_mode_aes_192_gcm_datatype_Int64_iv_12_aad_True = r"""'4BFAA6C467061FE3A5CE83C2B333EA0AA6E21FE09274A6F5'""" + +example_mode_aes_192_gcm_datatype_Float32_iv_12_aad_True = r"""'4AFA26FB02EB16C84E229FD2E3D35DED1A61558E'""" + +example_mode_aes_192_gcm_datatype_Float64_iv_12_aad_True = r"""'4AFAA6C46706EFDCAAA69F5DDBBB4133904CC544E04465BC'""" + +example_mode_aes_192_gcm_datatype_Decimal32_iv_12_aad_True = r"""'6AB4A6C4BBE5B094767F3BB2AC5F2D1611F2A5D1'""" + +example_mode_aes_192_gcm_datatype_Decimal64_iv_12_aad_True = r"""'6AB4A6C467061FE304363546A5F53943BFFEAE61BAEA66C2'""" + +example_mode_aes_192_gcm_datatype_Decimal128_iv_12_aad_True = r"""'6AB4A6C467061FE343593C80B73515B9C2FE5262D23EFBBC35AF09D316BE7B5A'""" + +example_mode_aes_192_gcm_datatype_UUID_iv_12_aad_True = r"""'ADEB159863C2EF82E382EFEAB7936E29E95FB7F7F8A746FFAC8E3A0BBD5F9A4A'""" + +example_mode_aes_192_gcm_datatype_Date_iv_12_aad_True = r"""'1CBD1753995EFBE8D1581714E07691C6D66C'""" + +example_mode_aes_192_gcm_datatype_DateTime_iv_12_aad_True = r"""'042AAA9A307BDEBEA63117DF1F1968864CF610DB'""" + +example_mode_aes_192_gcm_datatype_DateTime64_iv_12_aad_True = r"""'614BABA608071FE3877DF6FC032EAFAEC151CDB8424448A5'""" + +example_mode_aes_192_gcm_datatype_LowCardinality_iv_12_aad_True = r"""'7BB72D91D66E3C93B34FBAFF92526E1A0E'""" + +example_mode_aes_192_gcm_datatype_Array_iv_12_aad_True = r"""'4BF8042DEE44E2138EAABF4712CDA9BE3E8D'""" + +example_mode_aes_192_gcm_datatype_NULL_iv_12_aad_True = r"""'\\N'""" + +example_mode_aes_192_gcm_datatype_IPv4_iv_12_aad_True = r"""'6778476F18F8E291DFEC47402826A204C4A266CE'""" + +example_mode_aes_192_gcm_datatype_IPv6_iv_12_aad_True = r"""'6AFBAB7C67069A4043593C801B2A95B89F38BA22FF8DC82DD1B52FF78629E536'""" + +example_mode_aes_192_gcm_datatype_Enum8_iv_12_aad_True = r"""'4BDC46374E9961363E21A47A6E68505F3C'""" + +example_mode_aes_192_gcm_datatype_Enum16_iv_12_aad_True = r"""'4BFAF142B568ACE628392FDC53823CC303CA'""" + +example_mode_aes_256_gcm_datatype_String_iv_12_aad_True = r"""'672AAAA73DCD5DEBC924C34E8F6E2678F8'""" + +example_mode_aes_256_gcm_datatype_FixedString_iv_12_aad_True = r"""'672AAAA73DCD5DEBC924C34E8F6E2678F8'""" + +example_mode_aes_256_gcm_datatype_UInt8_iv_12_aad_True = r"""'57D9F3AB693C13017998CE425E77A3FECF'""" + +example_mode_aes_256_gcm_datatype_UInt16_iv_12_aad_True = r"""'57CB572E26FD388F92A94A4AF68DA7ABD122'""" + +example_mode_aes_256_gcm_datatype_UInt32_iv_12_aad_True = r"""'57CB6C3ABAFE1767D0DFC444F79F90748F241B13'""" + +example_mode_aes_256_gcm_datatype_UInt64_iv_12_aad_True = r"""'57CB6C3AFC8427B9713241B2061643B43370E9F2C9F46507'""" + +example_mode_aes_256_gcm_datatype_Int8_iv_12_aad_True = r"""'57D9F3AB693C13017998CE425E77A3FECF'""" + +example_mode_aes_256_gcm_datatype_Int16_iv_12_aad_True = r"""'57CB572E26FD388F92A94A4AF68DA7ABD122'""" + +example_mode_aes_256_gcm_datatype_Int32_iv_12_aad_True = r"""'57CB6C3ABAFE1767D0DFC444F79F90748F241B13'""" + +example_mode_aes_256_gcm_datatype_Int64_iv_12_aad_True = r"""'57CB6C3AFC8427B9713241B2061643B43370E9F2C9F46507'""" + +example_mode_aes_256_gcm_datatype_Float32_iv_12_aad_True = r"""'56CBEC05CDA182EB116E9C8D341DC870934B4098'""" + +example_mode_aes_256_gcm_datatype_Float64_iv_12_aad_True = r"""'56CB6C3AFC84D7864DAECC9AECC9F267D217E94170B0A978'""" + +example_mode_aes_256_gcm_datatype_Decimal32_iv_12_aad_True = r"""'76856C3A771183F0E9AD8F6AF95BB89CEF2FABEE'""" + +example_mode_aes_256_gcm_datatype_Decimal64_iv_12_aad_True = r"""'76856C3AFC8427B9BCDDD5253F64089A3DB4C11AA9FFD5FA'""" + +example_mode_aes_256_gcm_datatype_Decimal128_iv_12_aad_True = r"""'76856C3AFC8427B90E79078689172F1458319177D06B436588F76128F9D2A326'""" + +example_mode_aes_256_gcm_datatype_UUID_iv_12_aad_True = r"""'B1DADF66F840D7D8AEA2D4EC89B15484A55670B9B4ED16920A3101B02763AE89'""" + +example_mode_aes_256_gcm_datatype_Date_iv_12_aad_True = r"""'008C6EFEA788889EE6A911DD2020BC6C6912'""" + +example_mode_aes_256_gcm_datatype_DateTime_iv_12_aad_True = r"""'181B60641B2CBE63E7B9A5F8F349BD63D9BCC8C1'""" + +example_mode_aes_256_gcm_datatype_DateTime64_iv_12_aad_True = r"""'7D7A6158938527B96BACFB5A2E81A9D3C1AA615603D8F118'""" + +example_mode_aes_256_gcm_datatype_LowCardinality_iv_12_aad_True = r"""'672AAAA73DCD5DEBC924C34E8F6E2678F8'""" + +example_mode_aes_256_gcm_datatype_Array_iv_12_aad_True = r"""'57C99A47401DBEFA75E2784789ED2E4AC14D'""" + +example_mode_aes_256_gcm_datatype_NULL_iv_12_aad_True = r"""'\\N'""" + +example_mode_aes_256_gcm_datatype_IPv4_iv_12_aad_True = r"""'7B498D9120E08EDA78B87F4C2DFE9D57B100019C'""" + +example_mode_aes_256_gcm_datatype_IPv6_iv_12_aad_True = r"""'76CA6182FC84A21A0E7907862508AF155E70539A941262E31FFD96E6431E0AF6'""" + +example_mode_aes_256_gcm_datatype_Enum8_iv_12_aad_True = r"""'57D9F3AB693C13017998CE425E77A3FECF'""" + +example_mode_aes_256_gcm_datatype_Enum16_iv_12_aad_True = r"""'57CB572E26FD388F92A94A4AF68DA7ABD122'""" + +example_mode_aes_128_ctr_datatype_String_iv_None_aad_None = r"""'21'""" + +example_mode_aes_128_ctr_datatype_FixedString_iv_None_aad_None = r"""'21'""" + +example_mode_aes_128_ctr_datatype_UInt8_iv_None_aad_None = r"""'11'""" + +example_mode_aes_128_ctr_datatype_UInt16_iv_None_aad_None = r"""'11DF'""" + +example_mode_aes_128_ctr_datatype_UInt32_iv_None_aad_None = r"""'11DFC1B5'""" + +example_mode_aes_128_ctr_datatype_UInt64_iv_None_aad_None = r"""'11DFC1B5F66CFD6A'""" + +example_mode_aes_128_ctr_datatype_Int8_iv_None_aad_None = r"""'11'""" + +example_mode_aes_128_ctr_datatype_Int16_iv_None_aad_None = r"""'11DF'""" + +example_mode_aes_128_ctr_datatype_Int32_iv_None_aad_None = r"""'11DFC1B5'""" + +example_mode_aes_128_ctr_datatype_Int64_iv_None_aad_None = r"""'11DFC1B5F66CFD6A'""" + +example_mode_aes_128_ctr_datatype_Float32_iv_None_aad_None = r"""'10DF418A'""" + +example_mode_aes_128_ctr_datatype_Float64_iv_None_aad_None = r"""'10DFC1B5F66C0D55'""" + +example_mode_aes_128_ctr_datatype_Decimal32_iv_None_aad_None = r"""'3091C1B5'""" + +example_mode_aes_128_ctr_datatype_Decimal64_iv_None_aad_None = r"""'3091C1B5F66CFD6A'""" + +example_mode_aes_128_ctr_datatype_Decimal128_iv_None_aad_None = r"""'3091C1B5F66CFD6A1DC46D66907BEEB1'""" + +example_mode_aes_128_ctr_datatype_UUID_iv_None_aad_None = r"""'F7CE72E9F2A80D0BBD1FBE0C90DD9521'""" + +example_mode_aes_128_ctr_datatype_Date_iv_None_aad_None = r"""'4698'""" + +example_mode_aes_128_ctr_datatype_DateTime_iv_None_aad_None = r"""'5E0FCDEB'""" + +example_mode_aes_128_ctr_datatype_DateTime64_iv_None_aad_None = r"""'3B6ECCD7996DFD6A'""" + +example_mode_aes_128_ctr_datatype_LowCardinality_iv_None_aad_None = r"""'21'""" + +example_mode_aes_128_ctr_datatype_Array_iv_None_aad_None = r"""'11DD'""" + +example_mode_aes_128_ctr_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_128_ctr_datatype_IPv4_iv_None_aad_None = r"""'3D5D201E'""" + +example_mode_aes_128_ctr_datatype_IPv6_iv_None_aad_None = r"""'30DECC0DF66C78C91DC46D663C646EB0'""" + +example_mode_aes_128_ctr_datatype_Enum8_iv_None_aad_None = r"""'11'""" + +example_mode_aes_128_ctr_datatype_Enum16_iv_None_aad_None = r"""'11DF'""" + +example_mode_aes_192_ctr_datatype_String_iv_None_aad_None = r"""'36'""" + +example_mode_aes_192_ctr_datatype_FixedString_iv_None_aad_None = r"""'36'""" + +example_mode_aes_192_ctr_datatype_UInt8_iv_None_aad_None = r"""'06'""" + +example_mode_aes_192_ctr_datatype_UInt16_iv_None_aad_None = r"""'06B7'""" + +example_mode_aes_192_ctr_datatype_UInt32_iv_None_aad_None = r"""'06B7199D'""" + +example_mode_aes_192_ctr_datatype_UInt64_iv_None_aad_None = r"""'06B7199D3D3CA19E'""" + +example_mode_aes_192_ctr_datatype_Int8_iv_None_aad_None = r"""'06'""" + +example_mode_aes_192_ctr_datatype_Int16_iv_None_aad_None = r"""'06B7'""" + +example_mode_aes_192_ctr_datatype_Int32_iv_None_aad_None = r"""'06B7199D'""" + +example_mode_aes_192_ctr_datatype_Int64_iv_None_aad_None = r"""'06B7199D3D3CA19E'""" + +example_mode_aes_192_ctr_datatype_Float32_iv_None_aad_None = r"""'07B799A2'""" + +example_mode_aes_192_ctr_datatype_Float64_iv_None_aad_None = r"""'07B7199D3D3C51A1'""" + +example_mode_aes_192_ctr_datatype_Decimal32_iv_None_aad_None = r"""'27F9199D'""" + +example_mode_aes_192_ctr_datatype_Decimal64_iv_None_aad_None = r"""'27F9199D3D3CA19E'""" + +example_mode_aes_192_ctr_datatype_Decimal128_iv_None_aad_None = r"""'27F9199D3D3CA19E2CCE5990D7551E73'""" + +example_mode_aes_192_ctr_datatype_UUID_iv_None_aad_None = r"""'E0A6AAC139F851FF8C158AFAD7F365E3'""" + +example_mode_aes_192_ctr_datatype_Date_iv_None_aad_None = r"""'51F0'""" + +example_mode_aes_192_ctr_datatype_DateTime_iv_None_aad_None = r"""'496715C3'""" + +example_mode_aes_192_ctr_datatype_DateTime64_iv_None_aad_None = r"""'2C0614FF523DA19E'""" + +example_mode_aes_192_ctr_datatype_LowCardinality_iv_None_aad_None = r"""'36'""" + +example_mode_aes_192_ctr_datatype_Array_iv_None_aad_None = r"""'06B5'""" + +example_mode_aes_192_ctr_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_192_ctr_datatype_IPv4_iv_None_aad_None = r"""'2A35F836'""" + +example_mode_aes_192_ctr_datatype_IPv6_iv_None_aad_None = r"""'27B614253D3C243D2CCE59907B4A9E72'""" + +example_mode_aes_192_ctr_datatype_Enum8_iv_None_aad_None = r"""'06'""" + +example_mode_aes_192_ctr_datatype_Enum16_iv_None_aad_None = r"""'06B7'""" + +example_mode_aes_256_ctr_datatype_String_iv_None_aad_None = r"""'81'""" + +example_mode_aes_256_ctr_datatype_FixedString_iv_None_aad_None = r"""'81'""" + +example_mode_aes_256_ctr_datatype_UInt8_iv_None_aad_None = r"""'B1'""" + +example_mode_aes_256_ctr_datatype_UInt16_iv_None_aad_None = r"""'B18E'""" + +example_mode_aes_256_ctr_datatype_UInt32_iv_None_aad_None = r"""'B18ECF9E'""" + +example_mode_aes_256_ctr_datatype_UInt64_iv_None_aad_None = r"""'B18ECF9EC7EB5F0D'""" + +example_mode_aes_256_ctr_datatype_Int8_iv_None_aad_None = r"""'B1'""" + +example_mode_aes_256_ctr_datatype_Int16_iv_None_aad_None = r"""'B18E'""" + +example_mode_aes_256_ctr_datatype_Int32_iv_None_aad_None = r"""'B18ECF9E'""" + +example_mode_aes_256_ctr_datatype_Int64_iv_None_aad_None = r"""'B18ECF9EC7EB5F0D'""" + +example_mode_aes_256_ctr_datatype_Float32_iv_None_aad_None = r"""'B08E4FA1'""" + +example_mode_aes_256_ctr_datatype_Float64_iv_None_aad_None = r"""'B08ECF9EC7EBAF32'""" + +example_mode_aes_256_ctr_datatype_Decimal32_iv_None_aad_None = r"""'90C0CF9E'""" + +example_mode_aes_256_ctr_datatype_Decimal64_iv_None_aad_None = r"""'90C0CF9EC7EB5F0D'""" + +example_mode_aes_256_ctr_datatype_Decimal128_iv_None_aad_None = r"""'90C0CF9EC7EB5F0D7B78C42556D668AC'""" + +example_mode_aes_256_ctr_datatype_UUID_iv_None_aad_None = r"""'579F7CC2C32FAF6CDBA3174F5670133C'""" + +example_mode_aes_256_ctr_datatype_Date_iv_None_aad_None = r"""'E6C9'""" + +example_mode_aes_256_ctr_datatype_DateTime_iv_None_aad_None = r"""'FE5EC3C0'""" + +example_mode_aes_256_ctr_datatype_DateTime64_iv_None_aad_None = r"""'9B3FC2FCA8EA5F0D'""" + +example_mode_aes_256_ctr_datatype_LowCardinality_iv_None_aad_None = r"""'81'""" + +example_mode_aes_256_ctr_datatype_Array_iv_None_aad_None = r"""'B18C'""" + +example_mode_aes_256_ctr_datatype_NULL_iv_None_aad_None = r"""'\\N'""" + +example_mode_aes_256_ctr_datatype_IPv4_iv_None_aad_None = r"""'9D0C2E35'""" + +example_mode_aes_256_ctr_datatype_IPv6_iv_None_aad_None = r"""'908FC226C7EBDAAE7B78C425FAC9E8AD'""" + +example_mode_aes_256_ctr_datatype_Enum8_iv_None_aad_None = r"""'B1'""" + +example_mode_aes_256_ctr_datatype_Enum16_iv_None_aad_None = r"""'B18E'""" + +example_mode_aes_128_ctr_datatype_String_iv_16_aad_None = r"""'03'""" + +example_mode_aes_128_ctr_datatype_FixedString_iv_16_aad_None = r"""'03'""" + +example_mode_aes_128_ctr_datatype_UInt8_iv_16_aad_None = r"""'33'""" + +example_mode_aes_128_ctr_datatype_UInt16_iv_16_aad_None = r"""'3388'""" + +example_mode_aes_128_ctr_datatype_UInt32_iv_16_aad_None = r"""'3388A984'""" + +example_mode_aes_128_ctr_datatype_UInt64_iv_16_aad_None = r"""'3388A984DD06FF58'""" + +example_mode_aes_128_ctr_datatype_Int8_iv_16_aad_None = r"""'33'""" + +example_mode_aes_128_ctr_datatype_Int16_iv_16_aad_None = r"""'3388'""" + +example_mode_aes_128_ctr_datatype_Int32_iv_16_aad_None = r"""'3388A984'""" + +example_mode_aes_128_ctr_datatype_Int64_iv_16_aad_None = r"""'3388A984DD06FF58'""" + +example_mode_aes_128_ctr_datatype_Float32_iv_16_aad_None = r"""'328829BB'""" + +example_mode_aes_128_ctr_datatype_Float64_iv_16_aad_None = r"""'3288A984DD060F67'""" + +example_mode_aes_128_ctr_datatype_Decimal32_iv_16_aad_None = r"""'12C6A984'""" + +example_mode_aes_128_ctr_datatype_Decimal64_iv_16_aad_None = r"""'12C6A984DD06FF58'""" + +example_mode_aes_128_ctr_datatype_Decimal128_iv_16_aad_None = r"""'12C6A984DD06FF58E93960B1DEC50F1E'""" + +example_mode_aes_128_ctr_datatype_UUID_iv_16_aad_None = r"""'D5991AD8D9C20F3949E2B3DBDE63748E'""" + +example_mode_aes_128_ctr_datatype_Date_iv_16_aad_None = r"""'64CF'""" + +example_mode_aes_128_ctr_datatype_DateTime_iv_16_aad_None = r"""'7C58A5DA'""" + +example_mode_aes_128_ctr_datatype_DateTime64_iv_16_aad_None = r"""'1939A4E6B207FF58'""" + +example_mode_aes_128_ctr_datatype_LowCardinality_iv_16_aad_None = r"""'03'""" + +example_mode_aes_128_ctr_datatype_Array_iv_16_aad_None = r"""'338A'""" + +example_mode_aes_128_ctr_datatype_NULL_iv_16_aad_None = r"""'\\N'""" + +example_mode_aes_128_ctr_datatype_IPv4_iv_16_aad_None = r"""'1F0A482F'""" + +example_mode_aes_128_ctr_datatype_IPv6_iv_16_aad_None = r"""'1289A43CDD067AFBE93960B172DA8F1F'""" + +example_mode_aes_128_ctr_datatype_Enum8_iv_16_aad_None = r"""'33'""" + +example_mode_aes_128_ctr_datatype_Enum16_iv_16_aad_None = r"""'3388'""" + +example_mode_aes_192_ctr_datatype_String_iv_16_aad_None = r"""'59'""" + +example_mode_aes_192_ctr_datatype_FixedString_iv_16_aad_None = r"""'59'""" + +example_mode_aes_192_ctr_datatype_UInt8_iv_16_aad_None = r"""'69'""" + +example_mode_aes_192_ctr_datatype_UInt16_iv_16_aad_None = r"""'69C7'""" + +example_mode_aes_192_ctr_datatype_UInt32_iv_16_aad_None = r"""'69C7E792'""" + +example_mode_aes_192_ctr_datatype_UInt64_iv_16_aad_None = r"""'69C7E792B71077B1'""" + +example_mode_aes_192_ctr_datatype_Int8_iv_16_aad_None = r"""'69'""" + +example_mode_aes_192_ctr_datatype_Int16_iv_16_aad_None = r"""'69C7'""" + +example_mode_aes_192_ctr_datatype_Int32_iv_16_aad_None = r"""'69C7E792'""" + +example_mode_aes_192_ctr_datatype_Int64_iv_16_aad_None = r"""'69C7E792B71077B1'""" + +example_mode_aes_192_ctr_datatype_Float32_iv_16_aad_None = r"""'68C767AD'""" + +example_mode_aes_192_ctr_datatype_Float64_iv_16_aad_None = r"""'68C7E792B710878E'""" + +example_mode_aes_192_ctr_datatype_Decimal32_iv_16_aad_None = r"""'4889E792'""" + +example_mode_aes_192_ctr_datatype_Decimal64_iv_16_aad_None = r"""'4889E792B71077B1'""" + +example_mode_aes_192_ctr_datatype_Decimal128_iv_16_aad_None = r"""'4889E792B71077B18446050EBFD861B5'""" + +example_mode_aes_192_ctr_datatype_UUID_iv_16_aad_None = r"""'8FD654CEB3D487D0249DD664BF7E1A25'""" + +example_mode_aes_192_ctr_datatype_Date_iv_16_aad_None = r"""'3E80'""" + +example_mode_aes_192_ctr_datatype_DateTime_iv_16_aad_None = r"""'2617EBCC'""" + +example_mode_aes_192_ctr_datatype_DateTime64_iv_16_aad_None = r"""'4376EAF0D81177B1'""" + +example_mode_aes_192_ctr_datatype_LowCardinality_iv_16_aad_None = r"""'59'""" + +example_mode_aes_192_ctr_datatype_Array_iv_16_aad_None = r"""'69C5'""" + +example_mode_aes_192_ctr_datatype_NULL_iv_16_aad_None = r"""'\\N'""" + +example_mode_aes_192_ctr_datatype_IPv4_iv_16_aad_None = r"""'45450639'""" + +example_mode_aes_192_ctr_datatype_IPv6_iv_16_aad_None = r"""'48C6EA2AB710F2128446050E13C7E1B4'""" + +example_mode_aes_192_ctr_datatype_Enum8_iv_16_aad_None = r"""'69'""" + +example_mode_aes_192_ctr_datatype_Enum16_iv_16_aad_None = r"""'69C7'""" + +example_mode_aes_256_ctr_datatype_String_iv_16_aad_None = r"""'58'""" + +example_mode_aes_256_ctr_datatype_FixedString_iv_16_aad_None = r"""'58'""" + +example_mode_aes_256_ctr_datatype_UInt8_iv_16_aad_None = r"""'68'""" + +example_mode_aes_256_ctr_datatype_UInt16_iv_16_aad_None = r"""'6858'""" + +example_mode_aes_256_ctr_datatype_UInt32_iv_16_aad_None = r"""'68588817'""" + +example_mode_aes_256_ctr_datatype_UInt64_iv_16_aad_None = r"""'685888173CDE4488'""" + +example_mode_aes_256_ctr_datatype_Int8_iv_16_aad_None = r"""'68'""" + +example_mode_aes_256_ctr_datatype_Int16_iv_16_aad_None = r"""'6858'""" + +example_mode_aes_256_ctr_datatype_Int32_iv_16_aad_None = r"""'68588817'""" + +example_mode_aes_256_ctr_datatype_Int64_iv_16_aad_None = r"""'685888173CDE4488'""" + +example_mode_aes_256_ctr_datatype_Float32_iv_16_aad_None = r"""'69580828'""" + +example_mode_aes_256_ctr_datatype_Float64_iv_16_aad_None = r"""'695888173CDEB4B7'""" + +example_mode_aes_256_ctr_datatype_Decimal32_iv_16_aad_None = r"""'49168817'""" + +example_mode_aes_256_ctr_datatype_Decimal64_iv_16_aad_None = r"""'491688173CDE4488'""" + +example_mode_aes_256_ctr_datatype_Decimal128_iv_16_aad_None = r"""'491688173CDE448870E043A7733CC726'""" + +example_mode_aes_256_ctr_datatype_UUID_iv_16_aad_None = r"""'8E493B4B381AB4E9D03B90CD739ABCB6'""" + +example_mode_aes_256_ctr_datatype_Date_iv_16_aad_None = r"""'3F1F'""" + +example_mode_aes_256_ctr_datatype_DateTime_iv_16_aad_None = r"""'27888449'""" + +example_mode_aes_256_ctr_datatype_DateTime64_iv_16_aad_None = r"""'42E9857553DF4488'""" + +example_mode_aes_256_ctr_datatype_LowCardinality_iv_16_aad_None = r"""'58'""" + +example_mode_aes_256_ctr_datatype_Array_iv_16_aad_None = r"""'685A'""" + +example_mode_aes_256_ctr_datatype_NULL_iv_16_aad_None = r"""'\\N'""" + +example_mode_aes_256_ctr_datatype_IPv4_iv_16_aad_None = r"""'44DA69BC'""" + +example_mode_aes_256_ctr_datatype_IPv6_iv_16_aad_None = r"""'495985AF3CDEC12B70E043A7DF234727'""" + +example_mode_aes_256_ctr_datatype_Enum8_iv_16_aad_None = r"""'68'""" + +example_mode_aes_256_ctr_datatype_Enum16_iv_16_aad_None = r"""'6858'""" + +example_mode_aes_128_ecb_datatype_bytes_iv_None_aad_None = r"""'7B62A15720E13327948BF706B89CF2BE'""" + +example_mode_aes_128_ecb_datatype_emptystring_iv_None_aad_None = r"""'F30C69C4F945E654EBD4B388B1C8F790'""" + +example_mode_aes_192_ecb_datatype_bytes_iv_None_aad_None = r"""'C60D7A90C41260E3CD03422E9163144A'""" + +example_mode_aes_192_ecb_datatype_emptystring_iv_None_aad_None = r"""'D8ED6FC305C161EFCF57A383DAF31A83'""" + +example_mode_aes_256_ecb_datatype_bytes_iv_None_aad_None = r"""'B73CDD4E7705F0C516612F860715EBE3'""" + +example_mode_aes_256_ecb_datatype_emptystring_iv_None_aad_None = r"""'217E121CBD32CEC1F6FD3EBDF414BC34'""" + +example_mode_aes_128_cbc_datatype_bytes_iv_None_aad_None = r"""'7B62A15720E13327948BF706B89CF2BE'""" + +example_mode_aes_128_cbc_datatype_emptystring_iv_None_aad_None = r"""'F30C69C4F945E654EBD4B388B1C8F790'""" + +example_mode_aes_192_cbc_datatype_bytes_iv_None_aad_None = r"""'C60D7A90C41260E3CD03422E9163144A'""" + +example_mode_aes_192_cbc_datatype_emptystring_iv_None_aad_None = r"""'D8ED6FC305C161EFCF57A383DAF31A83'""" + +example_mode_aes_256_cbc_datatype_bytes_iv_None_aad_None = r"""'B73CDD4E7705F0C516612F860715EBE3'""" + +example_mode_aes_256_cbc_datatype_emptystring_iv_None_aad_None = r"""'217E121CBD32CEC1F6FD3EBDF414BC34'""" + +example_mode_aes_128_cbc_datatype_bytes_iv_16_aad_None = r"""'CDA4B7027137998B9A33C2096C9A50DD'""" + +example_mode_aes_128_cbc_datatype_emptystring_iv_16_aad_None = r"""'56A77308430BA344FFBF016999795ED5'""" + +example_mode_aes_192_cbc_datatype_bytes_iv_16_aad_None = r"""'67771349942D4F812553F2E1E3FFB276'""" + +example_mode_aes_192_cbc_datatype_emptystring_iv_16_aad_None = r"""'62E9214DB5E239F0CAD31ADF26AB313F'""" + +example_mode_aes_256_cbc_datatype_bytes_iv_16_aad_None = r"""'6046ECF8094941C6DEC9278FF6F137E9'""" + +example_mode_aes_256_cbc_datatype_emptystring_iv_16_aad_None = r"""'4EC7785DA650D55B71B52816B1DB5AD3'""" + +example_mode_aes_128_cfb1_datatype_bytes_iv_None_aad_None = r"""'00'""" + +example_mode_aes_128_cfb1_datatype_emptystring_iv_None_aad_None = r"""''""" + +example_mode_aes_192_cfb1_datatype_bytes_iv_None_aad_None = r"""'00'""" + +example_mode_aes_192_cfb1_datatype_emptystring_iv_None_aad_None = r"""''""" + +example_mode_aes_256_cfb1_datatype_bytes_iv_None_aad_None = r"""'B8'""" + +example_mode_aes_256_cfb1_datatype_emptystring_iv_None_aad_None = r"""''""" + +example_mode_aes_128_cfb1_datatype_bytes_iv_16_aad_None = r"""'00'""" + +example_mode_aes_128_cfb1_datatype_emptystring_iv_16_aad_None = r"""''""" + +example_mode_aes_192_cfb1_datatype_bytes_iv_16_aad_None = r"""'07'""" + +example_mode_aes_192_cfb1_datatype_emptystring_iv_16_aad_None = r"""''""" + +example_mode_aes_256_cfb1_datatype_bytes_iv_16_aad_None = r"""'7F'""" + +example_mode_aes_256_cfb1_datatype_emptystring_iv_16_aad_None = r"""''""" + +example_mode_aes_128_cfb8_datatype_bytes_iv_None_aad_None = r"""'10'""" + +example_mode_aes_128_cfb8_datatype_emptystring_iv_None_aad_None = r"""''""" + +example_mode_aes_192_cfb8_datatype_bytes_iv_None_aad_None = r"""'07'""" + +example_mode_aes_192_cfb8_datatype_emptystring_iv_None_aad_None = r"""''""" + +example_mode_aes_256_cfb8_datatype_bytes_iv_None_aad_None = r"""'B0'""" + +example_mode_aes_256_cfb8_datatype_emptystring_iv_None_aad_None = r"""''""" + +example_mode_aes_128_cfb8_datatype_bytes_iv_16_aad_None = r"""'32'""" + +example_mode_aes_128_cfb8_datatype_emptystring_iv_16_aad_None = r"""''""" + +example_mode_aes_192_cfb8_datatype_bytes_iv_16_aad_None = r"""'68'""" + +example_mode_aes_192_cfb8_datatype_emptystring_iv_16_aad_None = r"""''""" + +example_mode_aes_256_cfb8_datatype_bytes_iv_16_aad_None = r"""'69'""" + +example_mode_aes_256_cfb8_datatype_emptystring_iv_16_aad_None = r"""''""" + +example_mode_aes_128_cfb128_datatype_bytes_iv_None_aad_None = r"""'10'""" + +example_mode_aes_128_cfb128_datatype_emptystring_iv_None_aad_None = r"""''""" + +example_mode_aes_192_cfb128_datatype_bytes_iv_None_aad_None = r"""'07'""" + +example_mode_aes_192_cfb128_datatype_emptystring_iv_None_aad_None = r"""''""" + +example_mode_aes_256_cfb128_datatype_bytes_iv_None_aad_None = r"""'B0'""" + +example_mode_aes_256_cfb128_datatype_emptystring_iv_None_aad_None = r"""''""" + +example_mode_aes_128_cfb128_datatype_bytes_iv_16_aad_None = r"""'32'""" + +example_mode_aes_128_cfb128_datatype_emptystring_iv_16_aad_None = r"""''""" + +example_mode_aes_192_cfb128_datatype_bytes_iv_16_aad_None = r"""'68'""" + +example_mode_aes_192_cfb128_datatype_emptystring_iv_16_aad_None = r"""''""" + +example_mode_aes_256_cfb128_datatype_bytes_iv_16_aad_None = r"""'69'""" + +example_mode_aes_256_cfb128_datatype_emptystring_iv_16_aad_None = r"""''""" + +example_mode_aes_128_ofb_datatype_bytes_iv_None_aad_None = r"""'10'""" + +example_mode_aes_128_ofb_datatype_emptystring_iv_None_aad_None = r"""''""" + +example_mode_aes_192_ofb_datatype_bytes_iv_None_aad_None = r"""'07'""" + +example_mode_aes_192_ofb_datatype_emptystring_iv_None_aad_None = r"""''""" + +example_mode_aes_256_ofb_datatype_bytes_iv_None_aad_None = r"""'B0'""" + +example_mode_aes_256_ofb_datatype_emptystring_iv_None_aad_None = r"""''""" + +example_mode_aes_128_ofb_datatype_bytes_iv_16_aad_None = r"""'32'""" + +example_mode_aes_128_ofb_datatype_emptystring_iv_16_aad_None = r"""''""" + +example_mode_aes_192_ofb_datatype_bytes_iv_16_aad_None = r"""'68'""" + +example_mode_aes_192_ofb_datatype_emptystring_iv_16_aad_None = r"""''""" + +example_mode_aes_256_ofb_datatype_bytes_iv_16_aad_None = r"""'69'""" + +example_mode_aes_256_ofb_datatype_emptystring_iv_16_aad_None = r"""''""" + +example_mode_aes_128_gcm_datatype_bytes_iv_12_aad_None = r"""'ED7AF588306031432D60AE52CB0522C131'""" + +example_mode_aes_128_gcm_datatype_emptystring_iv_12_aad_None = r"""'BF165C92C4F89A189DCD3A9CCD549D64'""" + +example_mode_aes_192_gcm_datatype_bytes_iv_12_aad_None = r"""'4AF425C405715C1F91B04661C96F5942E9'""" + +example_mode_aes_192_gcm_datatype_emptystring_iv_12_aad_None = r"""'F95400D38FC8B708F21C1A5CC97E2611'""" + +example_mode_aes_256_gcm_datatype_bytes_iv_12_aad_None = r"""'56C3D480260AD4984887DA3D7CBDFB952B'""" + +example_mode_aes_256_gcm_datatype_emptystring_iv_12_aad_None = r"""'4C24D7C3019165A77A8AE2FB9E130FBB'""" + +example_mode_aes_128_gcm_datatype_bytes_iv_12_aad_True = r"""'EDC8BCDDFC79319818DD61E1FAE4DA61ED'""" + +example_mode_aes_128_gcm_datatype_emptystring_iv_12_aad_True = r"""'9E4606A8AD25466858006BD90DA530F5'""" + +example_mode_aes_192_gcm_datatype_bytes_iv_12_aad_True = r"""'4A77EBA169E3B27FF66C04DDA4D6CEFCF2'""" + +example_mode_aes_192_gcm_datatype_emptystring_iv_12_aad_True = r"""'43B2949BA8DFB2A1511C294394E0DFB4'""" + +example_mode_aes_256_gcm_datatype_bytes_iv_12_aad_True = r"""'565140DB2A06E0A4E09E71F21A872BC911'""" + +example_mode_aes_256_gcm_datatype_emptystring_iv_12_aad_True = r"""'555A1764B65804E27174F272CF88FC11'""" + +example_mode_aes_128_ctr_datatype_bytes_iv_None_aad_None = r"""'10'""" + +example_mode_aes_128_ctr_datatype_emptystring_iv_None_aad_None = r"""''""" + +example_mode_aes_192_ctr_datatype_bytes_iv_None_aad_None = r"""'07'""" + +example_mode_aes_192_ctr_datatype_emptystring_iv_None_aad_None = r"""''""" + +example_mode_aes_256_ctr_datatype_bytes_iv_None_aad_None = r"""'B0'""" + +example_mode_aes_256_ctr_datatype_emptystring_iv_None_aad_None = r"""''""" + +example_mode_aes_128_ctr_datatype_bytes_iv_16_aad_None = r"""'32'""" + +example_mode_aes_128_ctr_datatype_emptystring_iv_16_aad_None = r"""''""" + +example_mode_aes_192_ctr_datatype_bytes_iv_16_aad_None = r"""'68'""" + +example_mode_aes_192_ctr_datatype_emptystring_iv_16_aad_None = r"""''""" + +example_mode_aes_256_ctr_datatype_bytes_iv_16_aad_None = r"""'69'""" + +example_mode_aes_256_ctr_datatype_emptystring_iv_16_aad_None = r"""''""" + +example_mode_aes_128_ecb_datatype_utf8string_iv_None_aad_None = r"""'4F5025E938F215F36B4EFEBD8A328B5CB8D530E00C83AD075E2D845A2425D8B5'""" + +example_mode_aes_128_ecb_datatype_utf8fixedstring_iv_None_aad_None = r"""'4F5025E938F215F36B4EFEBD8A328B5CB8D530E00C83AD075E2D845A2425D8B5'""" + +example_mode_aes_192_ecb_datatype_utf8string_iv_None_aad_None = r"""'7C1CE735A57407291267928DE0E2E479822D3586BD475686D9DAB17103D7B162'""" + +example_mode_aes_192_ecb_datatype_utf8fixedstring_iv_None_aad_None = r"""'7C1CE735A57407291267928DE0E2E479822D3586BD475686D9DAB17103D7B162'""" + +example_mode_aes_256_ecb_datatype_utf8string_iv_None_aad_None = r"""'3303F819796DDB5046AAFAB8A39FC3AB8A858B18916A30D2E2C3C9C9BBC961FD'""" + +example_mode_aes_256_ecb_datatype_utf8fixedstring_iv_None_aad_None = r"""'3303F819796DDB5046AAFAB8A39FC3AB8A858B18916A30D2E2C3C9C9BBC961FD'""" + +example_mode_aes_128_cbc_datatype_utf8string_iv_None_aad_None = r"""'4F5025E938F215F36B4EFEBD8A328B5C00AF476CA1EE03B7C0D297C2BF287339'""" + +example_mode_aes_128_cbc_datatype_utf8fixedstring_iv_None_aad_None = r"""'4F5025E938F215F36B4EFEBD8A328B5C00AF476CA1EE03B7C0D297C2BF287339'""" + +example_mode_aes_192_cbc_datatype_utf8string_iv_None_aad_None = r"""'7C1CE735A57407291267928DE0E2E47918C12F093BCD530F69669FC25B23195A'""" + +example_mode_aes_192_cbc_datatype_utf8fixedstring_iv_None_aad_None = r"""'7C1CE735A57407291267928DE0E2E47918C12F093BCD530F69669FC25B23195A'""" + +example_mode_aes_256_cbc_datatype_utf8string_iv_None_aad_None = r"""'3303F819796DDB5046AAFAB8A39FC3ABC19300E0966158A167939EDD20D39907'""" + +example_mode_aes_256_cbc_datatype_utf8fixedstring_iv_None_aad_None = r"""'3303F819796DDB5046AAFAB8A39FC3ABC19300E0966158A167939EDD20D39907'""" + +example_mode_aes_128_cbc_datatype_utf8string_iv_16_aad_None = r"""'0BD95BFF6DE2DC43D936DAF23937B06D602786A6770B627EB56BC7F681B1C9DB'""" + +example_mode_aes_128_cbc_datatype_utf8fixedstring_iv_16_aad_None = r"""'0BD95BFF6DE2DC43D936DAF23937B06D602786A6770B627EB56BC7F681B1C9DB'""" + +example_mode_aes_192_cbc_datatype_utf8string_iv_16_aad_None = r"""'D619039D0956015C34336196DB3EB5A4710B2B8860344AB2625E9269C5E4A6CC'""" + +example_mode_aes_192_cbc_datatype_utf8fixedstring_iv_16_aad_None = r"""'D619039D0956015C34336196DB3EB5A4710B2B8860344AB2625E9269C5E4A6CC'""" + +example_mode_aes_256_cbc_datatype_utf8string_iv_16_aad_None = r"""'A7663A9F621A26398B51DFBC099A6FA09032C25FE48CB9D2DE29A8DFD581714D'""" + +example_mode_aes_256_cbc_datatype_utf8fixedstring_iv_16_aad_None = r"""'A7663A9F621A26398B51DFBC099A6FA09032C25FE48CB9D2DE29A8DFD581714D'""" + +example_mode_aes_128_cfb1_datatype_utf8string_iv_None_aad_None = r"""'5BA033EA7B9901874F4F863E229069EBA414B7C317D37DF0'""" + +example_mode_aes_128_cfb1_datatype_utf8fixedstring_iv_None_aad_None = r"""'5BA033EA7B9901874F4F863E229069EBA414B7C317D37DF0'""" + +example_mode_aes_192_cfb1_datatype_utf8string_iv_None_aad_None = r"""'7B69A097857549357D008DB662730D8735DE1673D9E8CFF9'""" + +example_mode_aes_192_cfb1_datatype_utf8fixedstring_iv_None_aad_None = r"""'7B69A097857549357D008DB662730D8735DE1673D9E8CFF9'""" + +example_mode_aes_256_cfb1_datatype_utf8string_iv_None_aad_None = r"""'C797191D9D99944E674425A4275A8A3263E1E1357DF8E11E'""" + +example_mode_aes_256_cfb1_datatype_utf8fixedstring_iv_None_aad_None = r"""'C797191D9D99944E674425A4275A8A3263E1E1357DF8E11E'""" + +example_mode_aes_128_cfb1_datatype_utf8string_iv_16_aad_None = r"""'49CFD4F9B884A17F67C8CDD639EB4D367BE2B1656CA442A4'""" + +example_mode_aes_128_cfb1_datatype_utf8fixedstring_iv_16_aad_None = r"""'49CFD4F9B884A17F67C8CDD639EB4D367BE2B1656CA442A4'""" + +example_mode_aes_192_cfb1_datatype_utf8string_iv_16_aad_None = r"""'54C01F88A909EC7B2AEE59F81C138B8EE2DF205E2ED74210'""" + +example_mode_aes_192_cfb1_datatype_utf8fixedstring_iv_16_aad_None = r"""'54C01F88A909EC7B2AEE59F81C138B8EE2DF205E2ED74210'""" + +example_mode_aes_256_cfb1_datatype_utf8string_iv_16_aad_None = r"""'2E1863FFF5FEC47DBB3F50BCC912976E2777442C693EB1B5'""" + +example_mode_aes_256_cfb1_datatype_utf8fixedstring_iv_16_aad_None = r"""'2E1863FFF5FEC47DBB3F50BCC912976E2777442C693EB1B5'""" + +example_mode_aes_128_cfb8_datatype_utf8string_iv_None_aad_None = r"""'5716349E99199E0EF18EB43C06B54AB2F3E0C4CEA0BC11F9'""" + +example_mode_aes_128_cfb8_datatype_utf8fixedstring_iv_None_aad_None = r"""'5716349E99199E0EF18EB43C06B54AB2F3E0C4CEA0BC11F9'""" + +example_mode_aes_192_cfb8_datatype_utf8string_iv_None_aad_None = r"""'40541136D8EEE5DCFC55722D8FB56ED9D4CCDF0CB104B14D'""" + +example_mode_aes_192_cfb8_datatype_utf8fixedstring_iv_None_aad_None = r"""'40541136D8EEE5DCFC55722D8FB56ED9D4CCDF0CB104B14D'""" + +example_mode_aes_256_cfb8_datatype_utf8string_iv_None_aad_None = r"""'F796638AA3A076EA9816324AE8A93F420280C33AA2DE4AF8'""" + +example_mode_aes_256_cfb8_datatype_utf8fixedstring_iv_None_aad_None = r"""'F796638AA3A076EA9816324AE8A93F420280C33AA2DE4AF8'""" + +example_mode_aes_128_cfb8_datatype_utf8string_iv_16_aad_None = r"""'75BA4CC259943AF0B6E20E8FCC78C0427601F60930A5F980'""" + +example_mode_aes_128_cfb8_datatype_utf8fixedstring_iv_16_aad_None = r"""'75BA4CC259943AF0B6E20E8FCC78C0427601F60930A5F980'""" + +example_mode_aes_192_cfb8_datatype_utf8string_iv_16_aad_None = r"""'2F48574D4D12E6B2C1EF1B43346E437333FFD386067A9398'""" + +example_mode_aes_192_cfb8_datatype_utf8fixedstring_iv_16_aad_None = r"""'2F48574D4D12E6B2C1EF1B43346E437333FFD386067A9398'""" + +example_mode_aes_256_cfb8_datatype_utf8string_iv_16_aad_None = r"""'2E79EE96B485FC5BF3BE56AD461AAC2B1CCB425F51679553'""" + +example_mode_aes_256_cfb8_datatype_utf8fixedstring_iv_16_aad_None = r"""'2E79EE96B485FC5BF3BE56AD461AAC2B1CCB425F51679553'""" + +example_mode_aes_128_cfb128_datatype_utf8string_iv_None_aad_None = r"""'571C627072083ECFD8460B39C4132D1B2802275B5B24EF73'""" + +example_mode_aes_128_cfb128_datatype_utf8fixedstring_iv_None_aad_None = r"""'571C627072083ECFD8460B39C4132D1B2802275B5B24EF73'""" + +example_mode_aes_192_cfb128_datatype_utf8string_iv_None_aad_None = r"""'4074BA58B958623BE94C3FCF833DDDD9AC9F875CC2784719'""" + +example_mode_aes_192_cfb128_datatype_utf8fixedstring_iv_None_aad_None = r"""'4074BA58B958623BE94C3FCF833DDDD9AC9F875CC2784719'""" + +example_mode_aes_256_cfb128_datatype_utf8string_iv_None_aad_None = r"""'F74D6C5B438F9CA8BEFAA27A02BEAB06F5E4BB666EC25FE2'""" + +example_mode_aes_256_cfb128_datatype_utf8fixedstring_iv_None_aad_None = r"""'F74D6C5B438F9CA8BEFAA27A02BEAB06F5E4BB666EC25FE2'""" + +example_mode_aes_128_cfb128_datatype_utf8string_iv_16_aad_None = r"""'754B0A4159623CFD2CBB06EE8AADCCB4581E4F5FB9F091DD'""" + +example_mode_aes_128_cfb128_datatype_utf8fixedstring_iv_16_aad_None = r"""'754B0A4159623CFD2CBB06EE8AADCCB4581E4F5FB9F091DD'""" + +example_mode_aes_192_cfb128_datatype_utf8string_iv_16_aad_None = r"""'2F0444573374B41441C46351EBB0A21FD2D5B29B19D817D8'""" + +example_mode_aes_192_cfb128_datatype_utf8fixedstring_iv_16_aad_None = r"""'2F0444573374B41441C46351EBB0A21FD2D5B29B19D817D8'""" + +example_mode_aes_256_cfb128_datatype_utf8string_iv_16_aad_None = r"""'2E9B2BD2B8BA872DB56225F82754048C22AA31B7F22AD276'""" + +example_mode_aes_256_cfb128_datatype_utf8fixedstring_iv_16_aad_None = r"""'2E9B2BD2B8BA872DB56225F82754048C22AA31B7F22AD276'""" + +example_mode_aes_128_ofb_datatype_utf8string_iv_None_aad_None = r"""'571C627072083ECFD8460B39C4132D1B1EFEEBE7197398AE'""" + +example_mode_aes_128_ofb_datatype_utf8fixedstring_iv_None_aad_None = r"""'571C627072083ECFD8460B39C4132D1B1EFEEBE7197398AE'""" + +example_mode_aes_192_ofb_datatype_utf8string_iv_None_aad_None = r"""'4074BA58B958623BE94C3FCF833DDDD95F6EFF17F7823E17'""" + +example_mode_aes_192_ofb_datatype_utf8fixedstring_iv_None_aad_None = r"""'4074BA58B958623BE94C3FCF833DDDD95F6EFF17F7823E17'""" + +example_mode_aes_256_ofb_datatype_utf8string_iv_None_aad_None = r"""'F74D6C5B438F9CA8BEFAA27A02BEAB06B24181EFC9F2663B'""" + +example_mode_aes_256_ofb_datatype_utf8fixedstring_iv_None_aad_None = r"""'F74D6C5B438F9CA8BEFAA27A02BEAB06B24181EFC9F2663B'""" + +example_mode_aes_128_ofb_datatype_utf8string_iv_16_aad_None = r"""'754B0A4159623CFD2CBB06EE8AADCCB46A1C2A356E7D91D8'""" + +example_mode_aes_128_ofb_datatype_utf8fixedstring_iv_16_aad_None = r"""'754B0A4159623CFD2CBB06EE8AADCCB46A1C2A356E7D91D8'""" + +example_mode_aes_192_ofb_datatype_utf8string_iv_16_aad_None = r"""'2F0444573374B41441C46351EBB0A21F81C68E6CF92A6AF3'""" + +example_mode_aes_192_ofb_datatype_utf8fixedstring_iv_16_aad_None = r"""'2F0444573374B41441C46351EBB0A21F81C68E6CF92A6AF3'""" + +example_mode_aes_256_ofb_datatype_utf8string_iv_16_aad_None = r"""'2E9B2BD2B8BA872DB56225F82754048CE38E2C23393CF6FD'""" + +example_mode_aes_256_ofb_datatype_utf8fixedstring_iv_16_aad_None = r"""'2E9B2BD2B8BA872DB56225F82754048CE38E2C23393CF6FD'""" + +example_mode_aes_128_gcm_datatype_utf8string_iv_12_aad_None = r"""'AA556287709BAC848F40F0512ACBA9C1D3324C9C90260B0CDDC3AD7EBB18C53625907FE8745D8FFA'""" + +example_mode_aes_128_gcm_datatype_utf8fixedstring_iv_12_aad_None = r"""'AA556287709BAC848F40F0512ACBA9C1D3324C9C90260B0CDDC3AD7EBB18C53625907FE8745D8FFA'""" + +example_mode_aes_192_gcm_datatype_utf8string_iv_12_aad_None = r"""'0D390501E362DC4686DB5ADFE35DD613EA762CEE8E06DB20D0A9639BEF09294270D1352D22DB2CAF'""" + +example_mode_aes_192_gcm_datatype_utf8fixedstring_iv_12_aad_None = r"""'0D390501E362DC4686DB5ADFE35DD613EA762CEE8E06DB20D0A9639BEF09294270D1352D22DB2CAF'""" + +example_mode_aes_256_gcm_datatype_utf8string_iv_12_aad_None = r"""'1108CFFF78E0E41CCBFB61D9DD7FECBEF8AE22FF80D345FCAC905BDB791BC316A9A7D21FB34951F0'""" + +example_mode_aes_256_gcm_datatype_utf8fixedstring_iv_12_aad_None = r"""'1108CFFF78E0E41CCBFB61D9DD7FECBEF8AE22FF80D345FCAC905BDB791BC316A9A7D21FB34951F0'""" + +example_mode_aes_128_gcm_datatype_utf8string_iv_12_aad_True = r"""'AA556287709BAC848F40F0512ACBA9C1D3324C9C90260B0CD181E1471DC596491F22269EF75F4E5F'""" + +example_mode_aes_128_gcm_datatype_utf8fixedstring_iv_12_aad_True = r"""'AA556287709BAC848F40F0512ACBA9C1D3324C9C90260B0CD181E1471DC596491F22269EF75F4E5F'""" + +example_mode_aes_192_gcm_datatype_utf8string_iv_12_aad_True = r"""'0D390501E362DC4686DB5ADFE35DD613EA762CEE8E06DB20936BD43E66BAD9322C30B6E5D64110BB'""" + +example_mode_aes_192_gcm_datatype_utf8fixedstring_iv_12_aad_True = r"""'0D390501E362DC4686DB5ADFE35DD613EA762CEE8E06DB20936BD43E66BAD9322C30B6E5D64110BB'""" + +example_mode_aes_256_gcm_datatype_utf8string_iv_12_aad_True = r"""'1108CFFF78E0E41CCBFB61D9DD7FECBEF8AE22FF80D345FC92F054FDB351668A3790BE74D20869DD'""" + +example_mode_aes_256_gcm_datatype_utf8fixedstring_iv_12_aad_True = r"""'1108CFFF78E0E41CCBFB61D9DD7FECBEF8AE22FF80D345FC92F054FDB351668A3790BE74D20869DD'""" + +example_mode_aes_128_ctr_datatype_utf8string_iv_None_aad_None = r"""'571C627072083ECFD8460B39C4132D1B60215F9423235540'""" + +example_mode_aes_128_ctr_datatype_utf8fixedstring_iv_None_aad_None = r"""'571C627072083ECFD8460B39C4132D1B60215F9423235540'""" + +example_mode_aes_192_ctr_datatype_utf8string_iv_None_aad_None = r"""'4074BA58B958623BE94C3FCF833DDDD9EE89664A09F10327'""" + +example_mode_aes_192_ctr_datatype_utf8fixedstring_iv_None_aad_None = r"""'4074BA58B958623BE94C3FCF833DDDD9EE89664A09F10327'""" + +example_mode_aes_256_ctr_datatype_utf8string_iv_None_aad_None = r"""'F74D6C5B438F9CA8BEFAA27A02BEAB06519900DEC1DB5CF5'""" + +example_mode_aes_256_ctr_datatype_utf8fixedstring_iv_None_aad_None = r"""'F74D6C5B438F9CA8BEFAA27A02BEAB06519900DEC1DB5CF5'""" + +example_mode_aes_128_ctr_datatype_utf8string_iv_16_aad_None = r"""'754B0A4159623CFD2CBB06EE8AADCCB437EE2D5260EB4958'""" + +example_mode_aes_128_ctr_datatype_utf8fixedstring_iv_16_aad_None = r"""'754B0A4159623CFD2CBB06EE8AADCCB437EE2D5260EB4958'""" + +example_mode_aes_192_ctr_datatype_utf8string_iv_16_aad_None = r"""'2F0444573374B41441C46351EBB0A21F039E1E85A0813F1D'""" + +example_mode_aes_192_ctr_datatype_utf8fixedstring_iv_16_aad_None = r"""'2F0444573374B41441C46351EBB0A21F039E1E85A0813F1D'""" + +example_mode_aes_256_ctr_datatype_utf8string_iv_16_aad_None = r"""'2E9B2BD2B8BA872DB56225F82754048C944F1E670DF94BAA'""" + +example_mode_aes_256_ctr_datatype_utf8fixedstring_iv_16_aad_None = r"""'2E9B2BD2B8BA872DB56225F82754048C944F1E670DF94BAA'""" + diff --git a/tests/testflows/aes_encryption/tests/snapshots/encrypt_mysql.py.encrypt_mysql.snapshot b/tests/testflows/aes_encryption/tests/snapshots/encrypt_mysql.py.encrypt_mysql.snapshot new file mode 100644 index 00000000000..280dbf35be2 --- /dev/null +++ b/tests/testflows/aes_encryption/tests/snapshots/encrypt_mysql.py.encrypt_mysql.snapshot @@ -0,0 +1,3060 @@ +example_mode_aes_128_ecb_datatype_bytes_key_16_iv_None = r"""'7B62A15720E13327948BF706B89CF2BE'""" + +example_mode_aes_128_ecb_datatype_emptystring_key_16_iv_None = r"""'F30C69C4F945E654EBD4B388B1C8F790'""" + +example_mode_aes_128_ecb_datatype_utf8string_key_16_iv_None = r"""'4F5025E938F215F36B4EFEBD8A328B5CB8D530E00C83AD075E2D845A2425D8B5'""" + +example_mode_aes_128_ecb_datatype_utf8fixedstring_key_16_iv_None = r"""'4F5025E938F215F36B4EFEBD8A328B5CB8D530E00C83AD075E2D845A2425D8B5'""" + +example_mode_aes_128_ecb_datatype_String_key_16_iv_None = r"""'7C51909F95C1E9B886A3487CD3EBED69'""" + +example_mode_aes_128_ecb_datatype_FixedString_key_16_iv_None = r"""'7C51909F95C1E9B886A3487CD3EBED69'""" + +example_mode_aes_128_ecb_datatype_UInt8_key_16_iv_None = r"""'4CDF8A192A06AC6EDBDCE2BFB53B7D73'""" + +example_mode_aes_128_ecb_datatype_UInt16_key_16_iv_None = r"""'12FB5B75B1CB5DF0DC70D8039758691D'""" + +example_mode_aes_128_ecb_datatype_UInt32_key_16_iv_None = r"""'E86C0858C6D9CCD970BA6DC320038306'""" + +example_mode_aes_128_ecb_datatype_UInt64_key_16_iv_None = r"""'2D43D83E0250AE8AC4403551B639F694'""" + +example_mode_aes_128_ecb_datatype_Int8_key_16_iv_None = r"""'4CDF8A192A06AC6EDBDCE2BFB53B7D73'""" + +example_mode_aes_128_ecb_datatype_Int16_key_16_iv_None = r"""'12FB5B75B1CB5DF0DC70D8039758691D'""" + +example_mode_aes_128_ecb_datatype_Int32_key_16_iv_None = r"""'E86C0858C6D9CCD970BA6DC320038306'""" + +example_mode_aes_128_ecb_datatype_Int64_key_16_iv_None = r"""'2D43D83E0250AE8AC4403551B639F694'""" + +example_mode_aes_128_ecb_datatype_Float32_key_16_iv_None = r"""'FF4D70D9A1050E6BBDD0325FC45CC22D'""" + +example_mode_aes_128_ecb_datatype_Float64_key_16_iv_None = r"""'75FE6B4A722A31D7760680CC1B9F131D'""" + +example_mode_aes_128_ecb_datatype_Decimal32_key_16_iv_None = r"""'83BBD7CCE7E5A38071653870475D48D2'""" + +example_mode_aes_128_ecb_datatype_Decimal64_key_16_iv_None = r"""'BE0DD9302B2952CE9CC3721DD85C8E66'""" + +example_mode_aes_128_ecb_datatype_Decimal128_key_16_iv_None = r"""'5F3DBFA74809E45E03980357B26787AFF30C69C4F945E654EBD4B388B1C8F790'""" + +example_mode_aes_128_ecb_datatype_UUID_key_16_iv_None = r"""'FF9161B222B4A67481271035745F06D9F30C69C4F945E654EBD4B388B1C8F790'""" + +example_mode_aes_128_ecb_datatype_Date_key_16_iv_None = r"""'1E4FBE33752D96D147E890C29A409BFE'""" + +example_mode_aes_128_ecb_datatype_DateTime_key_16_iv_None = r"""'384F3D97B78D52C73CD06C0E1B6DE399'""" + +example_mode_aes_128_ecb_datatype_DateTime64_key_16_iv_None = r"""'C7F50A2D0175F3ED280AD42FF01FF5F2'""" + +example_mode_aes_128_ecb_datatype_LowCardinality_key_16_iv_None = r"""'7C51909F95C1E9B886A3487CD3EBED69'""" + +example_mode_aes_128_ecb_datatype_Array_key_16_iv_None = r"""'D9152D05CFA9E162983A5A2E883109B4'""" + +example_mode_aes_128_ecb_datatype_NULL_key_16_iv_None = r"""'\\N'""" + +example_mode_aes_128_ecb_datatype_IPv4_key_16_iv_None = r"""'4F32782638C1F33C6A7202CA83F0C12C'""" + +example_mode_aes_128_ecb_datatype_IPv6_key_16_iv_None = r"""'F54700FF04ADAD342BA6830DB12AD7E9F30C69C4F945E654EBD4B388B1C8F790'""" + +example_mode_aes_128_ecb_datatype_Enum8_key_16_iv_None = r"""'4CDF8A192A06AC6EDBDCE2BFB53B7D73'""" + +example_mode_aes_128_ecb_datatype_Enum16_key_16_iv_None = r"""'12FB5B75B1CB5DF0DC70D8039758691D'""" + +example_mode_aes_128_ecb_datatype_bytes_key_24_iv_None = r"""'0E7A1A2ED5C8BCC0B811B44D7FEA9E51'""" + +example_mode_aes_128_ecb_datatype_emptystring_key_24_iv_None = r"""'644DD62B737880C0203A16C9844616A6'""" + +example_mode_aes_128_ecb_datatype_utf8string_key_24_iv_None = r"""'4A970096F9F40F5507A678BF07F22B6B0644E044B974D161C223EA94DCB43B5D'""" + +example_mode_aes_128_ecb_datatype_utf8fixedstring_key_24_iv_None = r"""'4A970096F9F40F5507A678BF07F22B6B0644E044B974D161C223EA94DCB43B5D'""" + +example_mode_aes_128_ecb_datatype_String_key_24_iv_None = r"""'697175286BC73A26C572DBD9480738F3'""" + +example_mode_aes_128_ecb_datatype_FixedString_key_24_iv_None = r"""'697175286BC73A26C572DBD9480738F3'""" + +example_mode_aes_128_ecb_datatype_UInt8_key_24_iv_None = r"""'113A22E44AC1C4B397CC8204C069F5F4'""" + +example_mode_aes_128_ecb_datatype_UInt16_key_24_iv_None = r"""'94DD57978311932F2E9FED922796A023'""" + +example_mode_aes_128_ecb_datatype_UInt32_key_24_iv_None = r"""'CB84F00C70A72890AF6F7106AE8109CB'""" + +example_mode_aes_128_ecb_datatype_UInt64_key_24_iv_None = r"""'973944561BDA0D954449BEBD64C9ED7A'""" + +example_mode_aes_128_ecb_datatype_Int8_key_24_iv_None = r"""'113A22E44AC1C4B397CC8204C069F5F4'""" + +example_mode_aes_128_ecb_datatype_Int16_key_24_iv_None = r"""'94DD57978311932F2E9FED922796A023'""" + +example_mode_aes_128_ecb_datatype_Int32_key_24_iv_None = r"""'CB84F00C70A72890AF6F7106AE8109CB'""" + +example_mode_aes_128_ecb_datatype_Int64_key_24_iv_None = r"""'973944561BDA0D954449BEBD64C9ED7A'""" + +example_mode_aes_128_ecb_datatype_Float32_key_24_iv_None = r"""'7BCD3C1EB87CDA7BBA4B19929367243E'""" + +example_mode_aes_128_ecb_datatype_Float64_key_24_iv_None = r"""'3712B5B24D8F17CA7BE784AB7D57514E'""" + +example_mode_aes_128_ecb_datatype_Decimal32_key_24_iv_None = r"""'37BE2C0520C1A4C6F88CCBA2EEC020E5'""" + +example_mode_aes_128_ecb_datatype_Decimal64_key_24_iv_None = r"""'9ACC742A0FD36A80FEA2DBA2D73C4BFA'""" + +example_mode_aes_128_ecb_datatype_Decimal128_key_24_iv_None = r"""'EE8E9F15CAE8C5B6F2E0547636DEAF14644DD62B737880C0203A16C9844616A6'""" + +example_mode_aes_128_ecb_datatype_UUID_key_24_iv_None = r"""'6FD5580CC0B329922B575B79D4AD6E70644DD62B737880C0203A16C9844616A6'""" + +example_mode_aes_128_ecb_datatype_Date_key_24_iv_None = r"""'B0ADFA31B83C5B33B277097C33B06CB4'""" + +example_mode_aes_128_ecb_datatype_DateTime_key_24_iv_None = r"""'0632CF6416213B4153D247F4A85EAB19'""" + +example_mode_aes_128_ecb_datatype_DateTime64_key_24_iv_None = r"""'3D1049375E6EA3599E7AC2C753B1AA7F'""" + +example_mode_aes_128_ecb_datatype_LowCardinality_key_24_iv_None = r"""'697175286BC73A26C572DBD9480738F3'""" + +example_mode_aes_128_ecb_datatype_Array_key_24_iv_None = r"""'129253539B09D45C2147884BB2B866BD'""" + +example_mode_aes_128_ecb_datatype_NULL_key_24_iv_None = r"""'\\N'""" + +example_mode_aes_128_ecb_datatype_IPv4_key_24_iv_None = r"""'B0D8302DB6F6B772E883A9353CDC28F0'""" + +example_mode_aes_128_ecb_datatype_IPv6_key_24_iv_None = r"""'781ABF0C605281F93A00B9BADD2CD1E3644DD62B737880C0203A16C9844616A6'""" + +example_mode_aes_128_ecb_datatype_Enum8_key_24_iv_None = r"""'113A22E44AC1C4B397CC8204C069F5F4'""" + +example_mode_aes_128_ecb_datatype_Enum16_key_24_iv_None = r"""'94DD57978311932F2E9FED922796A023'""" + +example_mode_aes_192_ecb_datatype_bytes_key_24_iv_None = r"""'C60D7A90C41260E3CD03422E9163144A'""" + +example_mode_aes_192_ecb_datatype_emptystring_key_24_iv_None = r"""'D8ED6FC305C161EFCF57A383DAF31A83'""" + +example_mode_aes_192_ecb_datatype_utf8string_key_24_iv_None = r"""'7C1CE735A57407291267928DE0E2E479822D3586BD475686D9DAB17103D7B162'""" + +example_mode_aes_192_ecb_datatype_utf8fixedstring_key_24_iv_None = r"""'7C1CE735A57407291267928DE0E2E479822D3586BD475686D9DAB17103D7B162'""" + +example_mode_aes_192_ecb_datatype_String_key_24_iv_None = r"""'1AE38A541D466EDFED572EE839B0907F'""" + +example_mode_aes_192_ecb_datatype_FixedString_key_24_iv_None = r"""'1AE38A541D466EDFED572EE839B0907F'""" + +example_mode_aes_192_ecb_datatype_UInt8_key_24_iv_None = r"""'01CC3C67F07C3FA6E5EFB7AE5F19130B'""" + +example_mode_aes_192_ecb_datatype_UInt16_key_24_iv_None = r"""'B50A3019F16B9C643FB40259E4B09308'""" + +example_mode_aes_192_ecb_datatype_UInt32_key_24_iv_None = r"""'9F32F3F6B3C3B1830F56B5B94C93875D'""" + +example_mode_aes_192_ecb_datatype_UInt64_key_24_iv_None = r"""'8DE807D54B7717BFC773567D9FFE292D'""" + +example_mode_aes_192_ecb_datatype_Int8_key_24_iv_None = r"""'01CC3C67F07C3FA6E5EFB7AE5F19130B'""" + +example_mode_aes_192_ecb_datatype_Int16_key_24_iv_None = r"""'B50A3019F16B9C643FB40259E4B09308'""" + +example_mode_aes_192_ecb_datatype_Int32_key_24_iv_None = r"""'9F32F3F6B3C3B1830F56B5B94C93875D'""" + +example_mode_aes_192_ecb_datatype_Int64_key_24_iv_None = r"""'8DE807D54B7717BFC773567D9FFE292D'""" + +example_mode_aes_192_ecb_datatype_Float32_key_24_iv_None = r"""'4E0C122631ED64EAD726833291A81878'""" + +example_mode_aes_192_ecb_datatype_Float64_key_24_iv_None = r"""'3F723599278E22E4692CE7D7D5F9A12F'""" + +example_mode_aes_192_ecb_datatype_Decimal32_key_24_iv_None = r"""'2420D49DBAA5CEF7D853C98DA1BD33BF'""" + +example_mode_aes_192_ecb_datatype_Decimal64_key_24_iv_None = r"""'FDF594113FCC2776653ED109A51FADF1'""" + +example_mode_aes_192_ecb_datatype_Decimal128_key_24_iv_None = r"""'79207931793E374FB5A3A2AC1ECA857AD8ED6FC305C161EFCF57A383DAF31A83'""" + +example_mode_aes_192_ecb_datatype_UUID_key_24_iv_None = r"""'9FDB738E78D0D2F774C484ED82A854E4D8ED6FC305C161EFCF57A383DAF31A83'""" + +example_mode_aes_192_ecb_datatype_Date_key_24_iv_None = r"""'2CDD4685168FA3E2A7FA2092E86F44D4'""" + +example_mode_aes_192_ecb_datatype_DateTime_key_24_iv_None = r"""'A4BEE097872E44FAD94D6707D6643DF5'""" + +example_mode_aes_192_ecb_datatype_DateTime64_key_24_iv_None = r"""'1798B23C09F783623943560DF142E0F3'""" + +example_mode_aes_192_ecb_datatype_LowCardinality_key_24_iv_None = r"""'1AE38A541D466EDFED572EE839B0907F'""" + +example_mode_aes_192_ecb_datatype_Array_key_24_iv_None = r"""'7C0B9021CAF2CBBB06DBF589740DCC65'""" + +example_mode_aes_192_ecb_datatype_NULL_key_24_iv_None = r"""'\\N'""" + +example_mode_aes_192_ecb_datatype_IPv4_key_24_iv_None = r"""'B20465C932A0719BA04E2F76371510D8'""" + +example_mode_aes_192_ecb_datatype_IPv6_key_24_iv_None = r"""'CCCDC9B9C3F182254591DFEDDCE9F232D8ED6FC305C161EFCF57A383DAF31A83'""" + +example_mode_aes_192_ecb_datatype_Enum8_key_24_iv_None = r"""'01CC3C67F07C3FA6E5EFB7AE5F19130B'""" + +example_mode_aes_192_ecb_datatype_Enum16_key_24_iv_None = r"""'B50A3019F16B9C643FB40259E4B09308'""" + +example_mode_aes_192_ecb_datatype_bytes_key_32_iv_None = r"""'4977677DCA6485E59B6D2AEC781DB50E'""" + +example_mode_aes_192_ecb_datatype_emptystring_key_32_iv_None = r"""'4F9776A389026F399064946440DF432F'""" + +example_mode_aes_192_ecb_datatype_utf8string_key_32_iv_None = r"""'718D9D0FCE92DF4C73C6ADF970082475F5B91A80060E2F74BDB70F4D61D51128'""" + +example_mode_aes_192_ecb_datatype_utf8fixedstring_key_32_iv_None = r"""'718D9D0FCE92DF4C73C6ADF970082475F5B91A80060E2F74BDB70F4D61D51128'""" + +example_mode_aes_192_ecb_datatype_String_key_32_iv_None = r"""'851106E40808E28682DAC1AD840A7E92'""" + +example_mode_aes_192_ecb_datatype_FixedString_key_32_iv_None = r"""'851106E40808E28682DAC1AD840A7E92'""" + +example_mode_aes_192_ecb_datatype_UInt8_key_32_iv_None = r"""'077626FAA6FD46322732E0A107849CBE'""" + +example_mode_aes_192_ecb_datatype_UInt16_key_32_iv_None = r"""'C55FFF6925F48B2DDDD3F8696A6EE21A'""" + +example_mode_aes_192_ecb_datatype_UInt32_key_32_iv_None = r"""'7F3A3604968AC5BB1578D256A221442A'""" + +example_mode_aes_192_ecb_datatype_UInt64_key_32_iv_None = r"""'FCC1BC19F3A2F8F0484BD2BF3A069BB9'""" + +example_mode_aes_192_ecb_datatype_Int8_key_32_iv_None = r"""'077626FAA6FD46322732E0A107849CBE'""" + +example_mode_aes_192_ecb_datatype_Int16_key_32_iv_None = r"""'C55FFF6925F48B2DDDD3F8696A6EE21A'""" + +example_mode_aes_192_ecb_datatype_Int32_key_32_iv_None = r"""'7F3A3604968AC5BB1578D256A221442A'""" + +example_mode_aes_192_ecb_datatype_Int64_key_32_iv_None = r"""'FCC1BC19F3A2F8F0484BD2BF3A069BB9'""" + +example_mode_aes_192_ecb_datatype_Float32_key_32_iv_None = r"""'57AC570C827D0B10A340A635080E4BED'""" + +example_mode_aes_192_ecb_datatype_Float64_key_32_iv_None = r"""'EB761A3EB9A06676C875E70C6323B6D3'""" + +example_mode_aes_192_ecb_datatype_Decimal32_key_32_iv_None = r"""'07757D905A8DF38EEC7EAC2436BC883D'""" + +example_mode_aes_192_ecb_datatype_Decimal64_key_32_iv_None = r"""'B3DD7C625F5C9CAEB24B014AAF1660CF'""" + +example_mode_aes_192_ecb_datatype_Decimal128_key_32_iv_None = r"""'AF4EE89B714CBB6ED41802268A6C291F4F9776A389026F399064946440DF432F'""" + +example_mode_aes_192_ecb_datatype_UUID_key_32_iv_None = r"""'6DDADFA4AD0FEA6DD4AE756F5E13E0EE4F9776A389026F399064946440DF432F'""" + +example_mode_aes_192_ecb_datatype_Date_key_32_iv_None = r"""'D2212BB509C49D9DCBE970F86D34C4BE'""" + +example_mode_aes_192_ecb_datatype_DateTime_key_32_iv_None = r"""'C3AB19DCEFE1F61019484A2589D69037'""" + +example_mode_aes_192_ecb_datatype_DateTime64_key_32_iv_None = r"""'FB427597072B72E5C3D1D65247DB6A8C'""" + +example_mode_aes_192_ecb_datatype_LowCardinality_key_32_iv_None = r"""'851106E40808E28682DAC1AD840A7E92'""" + +example_mode_aes_192_ecb_datatype_Array_key_32_iv_None = r"""'D0FE4D4B34CFA03960FA609F1AA18D79'""" + +example_mode_aes_192_ecb_datatype_NULL_key_32_iv_None = r"""'\\N'""" + +example_mode_aes_192_ecb_datatype_IPv4_key_32_iv_None = r"""'F07B737C70748F1ACDF5DBB874B4D78B'""" + +example_mode_aes_192_ecb_datatype_IPv6_key_32_iv_None = r"""'C95A36120328FDE78278655287FF91F44F9776A389026F399064946440DF432F'""" + +example_mode_aes_192_ecb_datatype_Enum8_key_32_iv_None = r"""'077626FAA6FD46322732E0A107849CBE'""" + +example_mode_aes_192_ecb_datatype_Enum16_key_32_iv_None = r"""'C55FFF6925F48B2DDDD3F8696A6EE21A'""" + +example_mode_aes_256_ecb_datatype_bytes_key_32_iv_None = r"""'B73CDD4E7705F0C516612F860715EBE3'""" + +example_mode_aes_256_ecb_datatype_emptystring_key_32_iv_None = r"""'217E121CBD32CEC1F6FD3EBDF414BC34'""" + +example_mode_aes_256_ecb_datatype_utf8string_key_32_iv_None = r"""'3303F819796DDB5046AAFAB8A39FC3AB8A858B18916A30D2E2C3C9C9BBC961FD'""" + +example_mode_aes_256_ecb_datatype_utf8fixedstring_key_32_iv_None = r"""'3303F819796DDB5046AAFAB8A39FC3AB8A858B18916A30D2E2C3C9C9BBC961FD'""" + +example_mode_aes_256_ecb_datatype_String_key_32_iv_None = r"""'C91184ED1E67F0CDED89B097D5D3B130'""" + +example_mode_aes_256_ecb_datatype_FixedString_key_32_iv_None = r"""'C91184ED1E67F0CDED89B097D5D3B130'""" + +example_mode_aes_256_ecb_datatype_UInt8_key_32_iv_None = r"""'3605C5E38A448F5FEFABADF3B9983FDF'""" + +example_mode_aes_256_ecb_datatype_UInt16_key_32_iv_None = r"""'2E5299C7A5672D8779BA9DDDE1DBCE00'""" + +example_mode_aes_256_ecb_datatype_UInt32_key_32_iv_None = r"""'D8876CDF9B97DD110E780F958C1EA2AA'""" + +example_mode_aes_256_ecb_datatype_UInt64_key_32_iv_None = r"""'F6E11A48B6D830F7B8D0817885C05D3C'""" + +example_mode_aes_256_ecb_datatype_Int8_key_32_iv_None = r"""'3605C5E38A448F5FEFABADF3B9983FDF'""" + +example_mode_aes_256_ecb_datatype_Int16_key_32_iv_None = r"""'2E5299C7A5672D8779BA9DDDE1DBCE00'""" + +example_mode_aes_256_ecb_datatype_Int32_key_32_iv_None = r"""'D8876CDF9B97DD110E780F958C1EA2AA'""" + +example_mode_aes_256_ecb_datatype_Int64_key_32_iv_None = r"""'F6E11A48B6D830F7B8D0817885C05D3C'""" + +example_mode_aes_256_ecb_datatype_Float32_key_32_iv_None = r"""'A11ED1B75CF1C04C6CA3A31E76627D4C'""" + +example_mode_aes_256_ecb_datatype_Float64_key_32_iv_None = r"""'464C85EB7DB36D95CF48A3431CC7B2BC'""" + +example_mode_aes_256_ecb_datatype_Decimal32_key_32_iv_None = r"""'988C793BD81036C1D05EC47F43851269'""" + +example_mode_aes_256_ecb_datatype_Decimal64_key_32_iv_None = r"""'50FFB9C104DBFF3F415F12BA73D6FF1C'""" + +example_mode_aes_256_ecb_datatype_Decimal128_key_32_iv_None = r"""'B04C40C085A262E3AA27F8E7F6831DCB217E121CBD32CEC1F6FD3EBDF414BC34'""" + +example_mode_aes_256_ecb_datatype_UUID_key_32_iv_None = r"""'6A36D74ACB38B95FA77BC757A7AB2C34217E121CBD32CEC1F6FD3EBDF414BC34'""" + +example_mode_aes_256_ecb_datatype_Date_key_32_iv_None = r"""'F1CFA361A9B08FC101F3A4707A3E04D2'""" + +example_mode_aes_256_ecb_datatype_DateTime_key_32_iv_None = r"""'D58178485CD1AE1C30F68383307B8BC5'""" + +example_mode_aes_256_ecb_datatype_DateTime64_key_32_iv_None = r"""'A19B65BCB740B2AF4D421CE1DEC43608'""" + +example_mode_aes_256_ecb_datatype_LowCardinality_key_32_iv_None = r"""'C91184ED1E67F0CDED89B097D5D3B130'""" + +example_mode_aes_256_ecb_datatype_Array_key_32_iv_None = r"""'C4071E4FD44F004347EA9932326B7038'""" + +example_mode_aes_256_ecb_datatype_NULL_key_32_iv_None = r"""'\\N'""" + +example_mode_aes_256_ecb_datatype_IPv4_key_32_iv_None = r"""'6C7950041CB4041D4D8036FCD22E3B06'""" + +example_mode_aes_256_ecb_datatype_IPv6_key_32_iv_None = r"""'8CBF2DC164F4086B8DD14B75E3065621217E121CBD32CEC1F6FD3EBDF414BC34'""" + +example_mode_aes_256_ecb_datatype_Enum8_key_32_iv_None = r"""'3605C5E38A448F5FEFABADF3B9983FDF'""" + +example_mode_aes_256_ecb_datatype_Enum16_key_32_iv_None = r"""'2E5299C7A5672D8779BA9DDDE1DBCE00'""" + +example_mode_aes_256_ecb_datatype_bytes_key_64_iv_None = r"""'2600697679EF0B3989C4EA3C0323CB8B'""" + +example_mode_aes_256_ecb_datatype_emptystring_key_64_iv_None = r"""'1F788FE6D86C317549697FBF0C07FA43'""" + +example_mode_aes_256_ecb_datatype_utf8string_key_64_iv_None = r"""'AB49D11AECD4A57A8BB4155C9F6733FBC9E3E51C40CDF6FA420050B461F48FA7'""" + +example_mode_aes_256_ecb_datatype_utf8fixedstring_key_64_iv_None = r"""'AB49D11AECD4A57A8BB4155C9F6733FBC9E3E51C40CDF6FA420050B461F48FA7'""" + +example_mode_aes_256_ecb_datatype_String_key_64_iv_None = r"""'7492B9A2D0E86DAF1DBCAEDBAD9E3D7E'""" + +example_mode_aes_256_ecb_datatype_FixedString_key_64_iv_None = r"""'7492B9A2D0E86DAF1DBCAEDBAD9E3D7E'""" + +example_mode_aes_256_ecb_datatype_UInt8_key_64_iv_None = r"""'FE2DE0EEF32A0510DC312ED77D1293EB'""" + +example_mode_aes_256_ecb_datatype_UInt16_key_64_iv_None = r"""'6805EDF8559E85ECBC4CA0AC3E241CB5'""" + +example_mode_aes_256_ecb_datatype_UInt32_key_64_iv_None = r"""'B2E6C9CE7EB187B7F56E754587C6BDBE'""" + +example_mode_aes_256_ecb_datatype_UInt64_key_64_iv_None = r"""'4F805F6D67E44124754951AEC9FDCEF3'""" + +example_mode_aes_256_ecb_datatype_Int8_key_64_iv_None = r"""'FE2DE0EEF32A0510DC312ED77D1293EB'""" + +example_mode_aes_256_ecb_datatype_Int16_key_64_iv_None = r"""'6805EDF8559E85ECBC4CA0AC3E241CB5'""" + +example_mode_aes_256_ecb_datatype_Int32_key_64_iv_None = r"""'B2E6C9CE7EB187B7F56E754587C6BDBE'""" + +example_mode_aes_256_ecb_datatype_Int64_key_64_iv_None = r"""'4F805F6D67E44124754951AEC9FDCEF3'""" + +example_mode_aes_256_ecb_datatype_Float32_key_64_iv_None = r"""'8014D3F1CFF0B7A66AE06FBDFA006FA6'""" + +example_mode_aes_256_ecb_datatype_Float64_key_64_iv_None = r"""'2C734E3A5A82C65E8918FA329B936114'""" + +example_mode_aes_256_ecb_datatype_Decimal32_key_64_iv_None = r"""'95245BC3292B4749E8CC7B5FDD26CAD9'""" + +example_mode_aes_256_ecb_datatype_Decimal64_key_64_iv_None = r"""'443682D0541F666078718D4790C3CE4E'""" + +example_mode_aes_256_ecb_datatype_Decimal128_key_64_iv_None = r"""'BE7F01084B171062CB4CCCCF9BB77D671F788FE6D86C317549697FBF0C07FA43'""" + +example_mode_aes_256_ecb_datatype_UUID_key_64_iv_None = r"""'65F2B1003C30A2E7148652BA06EF09FC1F788FE6D86C317549697FBF0C07FA43'""" + +example_mode_aes_256_ecb_datatype_Date_key_64_iv_None = r"""'D72724C85F90712153FC49FB33432644'""" + +example_mode_aes_256_ecb_datatype_DateTime_key_64_iv_None = r"""'B734143D37365E5C3325E0396BABC2AB'""" + +example_mode_aes_256_ecb_datatype_DateTime64_key_64_iv_None = r"""'78DDC273BE606E8F546538FC02508360'""" + +example_mode_aes_256_ecb_datatype_LowCardinality_key_64_iv_None = r"""'7492B9A2D0E86DAF1DBCAEDBAD9E3D7E'""" + +example_mode_aes_256_ecb_datatype_Array_key_64_iv_None = r"""'592C364BE5AEBE911096DEB1F6C75AB9'""" + +example_mode_aes_256_ecb_datatype_NULL_key_64_iv_None = r"""'\\N'""" + +example_mode_aes_256_ecb_datatype_IPv4_key_64_iv_None = r"""'F5401B3B979784C3FF4C86DD726872F9'""" + +example_mode_aes_256_ecb_datatype_IPv6_key_64_iv_None = r"""'3F810185F7D07B5E5A897E96BCA930ED1F788FE6D86C317549697FBF0C07FA43'""" + +example_mode_aes_256_ecb_datatype_Enum8_key_64_iv_None = r"""'FE2DE0EEF32A0510DC312ED77D1293EB'""" + +example_mode_aes_256_ecb_datatype_Enum16_key_64_iv_None = r"""'6805EDF8559E85ECBC4CA0AC3E241CB5'""" + +example_mode_aes_128_cbc_datatype_bytes_key_16_iv_None = r"""'7B62A15720E13327948BF706B89CF2BE'""" + +example_mode_aes_128_cbc_datatype_emptystring_key_16_iv_None = r"""'F30C69C4F945E654EBD4B388B1C8F790'""" + +example_mode_aes_128_cbc_datatype_utf8string_key_16_iv_None = r"""'4F5025E938F215F36B4EFEBD8A328B5C00AF476CA1EE03B7C0D297C2BF287339'""" + +example_mode_aes_128_cbc_datatype_utf8fixedstring_key_16_iv_None = r"""'4F5025E938F215F36B4EFEBD8A328B5C00AF476CA1EE03B7C0D297C2BF287339'""" + +example_mode_aes_128_cbc_datatype_String_key_16_iv_None = r"""'7C51909F95C1E9B886A3487CD3EBED69'""" + +example_mode_aes_128_cbc_datatype_FixedString_key_16_iv_None = r"""'7C51909F95C1E9B886A3487CD3EBED69'""" + +example_mode_aes_128_cbc_datatype_UInt8_key_16_iv_None = r"""'4CDF8A192A06AC6EDBDCE2BFB53B7D73'""" + +example_mode_aes_128_cbc_datatype_UInt16_key_16_iv_None = r"""'12FB5B75B1CB5DF0DC70D8039758691D'""" + +example_mode_aes_128_cbc_datatype_UInt32_key_16_iv_None = r"""'E86C0858C6D9CCD970BA6DC320038306'""" + +example_mode_aes_128_cbc_datatype_UInt64_key_16_iv_None = r"""'2D43D83E0250AE8AC4403551B639F694'""" + +example_mode_aes_128_cbc_datatype_Int8_key_16_iv_None = r"""'4CDF8A192A06AC6EDBDCE2BFB53B7D73'""" + +example_mode_aes_128_cbc_datatype_Int16_key_16_iv_None = r"""'12FB5B75B1CB5DF0DC70D8039758691D'""" + +example_mode_aes_128_cbc_datatype_Int32_key_16_iv_None = r"""'E86C0858C6D9CCD970BA6DC320038306'""" + +example_mode_aes_128_cbc_datatype_Int64_key_16_iv_None = r"""'2D43D83E0250AE8AC4403551B639F694'""" + +example_mode_aes_128_cbc_datatype_Float32_key_16_iv_None = r"""'FF4D70D9A1050E6BBDD0325FC45CC22D'""" + +example_mode_aes_128_cbc_datatype_Float64_key_16_iv_None = r"""'75FE6B4A722A31D7760680CC1B9F131D'""" + +example_mode_aes_128_cbc_datatype_Decimal32_key_16_iv_None = r"""'83BBD7CCE7E5A38071653870475D48D2'""" + +example_mode_aes_128_cbc_datatype_Decimal64_key_16_iv_None = r"""'BE0DD9302B2952CE9CC3721DD85C8E66'""" + +example_mode_aes_128_cbc_datatype_Decimal128_key_16_iv_None = r"""'5F3DBFA74809E45E03980357B26787AF0D55B905F5525D3F5916FF811D8A6E7E'""" + +example_mode_aes_128_cbc_datatype_UUID_key_16_iv_None = r"""'FF9161B222B4A67481271035745F06D991B6833DF67CBA9BC6E1AAEADBE363BB'""" + +example_mode_aes_128_cbc_datatype_Date_key_16_iv_None = r"""'1E4FBE33752D96D147E890C29A409BFE'""" + +example_mode_aes_128_cbc_datatype_DateTime_key_16_iv_None = r"""'384F3D97B78D52C73CD06C0E1B6DE399'""" + +example_mode_aes_128_cbc_datatype_DateTime64_key_16_iv_None = r"""'C7F50A2D0175F3ED280AD42FF01FF5F2'""" + +example_mode_aes_128_cbc_datatype_LowCardinality_key_16_iv_None = r"""'7C51909F95C1E9B886A3487CD3EBED69'""" + +example_mode_aes_128_cbc_datatype_Array_key_16_iv_None = r"""'D9152D05CFA9E162983A5A2E883109B4'""" + +example_mode_aes_128_cbc_datatype_NULL_key_16_iv_None = r"""'\\N'""" + +example_mode_aes_128_cbc_datatype_IPv4_key_16_iv_None = r"""'4F32782638C1F33C6A7202CA83F0C12C'""" + +example_mode_aes_128_cbc_datatype_IPv6_key_16_iv_None = r"""'F54700FF04ADAD342BA6830DB12AD7E9B1B4BE8B15BAE0B2C9196D69E3D53C6C'""" + +example_mode_aes_128_cbc_datatype_Enum8_key_16_iv_None = r"""'4CDF8A192A06AC6EDBDCE2BFB53B7D73'""" + +example_mode_aes_128_cbc_datatype_Enum16_key_16_iv_None = r"""'12FB5B75B1CB5DF0DC70D8039758691D'""" + +example_mode_aes_192_cbc_datatype_bytes_key_24_iv_None = r"""'C60D7A90C41260E3CD03422E9163144A'""" + +example_mode_aes_192_cbc_datatype_emptystring_key_24_iv_None = r"""'D8ED6FC305C161EFCF57A383DAF31A83'""" + +example_mode_aes_192_cbc_datatype_utf8string_key_24_iv_None = r"""'7C1CE735A57407291267928DE0E2E47918C12F093BCD530F69669FC25B23195A'""" + +example_mode_aes_192_cbc_datatype_utf8fixedstring_key_24_iv_None = r"""'7C1CE735A57407291267928DE0E2E47918C12F093BCD530F69669FC25B23195A'""" + +example_mode_aes_192_cbc_datatype_String_key_24_iv_None = r"""'1AE38A541D466EDFED572EE839B0907F'""" + +example_mode_aes_192_cbc_datatype_FixedString_key_24_iv_None = r"""'1AE38A541D466EDFED572EE839B0907F'""" + +example_mode_aes_192_cbc_datatype_UInt8_key_24_iv_None = r"""'01CC3C67F07C3FA6E5EFB7AE5F19130B'""" + +example_mode_aes_192_cbc_datatype_UInt16_key_24_iv_None = r"""'B50A3019F16B9C643FB40259E4B09308'""" + +example_mode_aes_192_cbc_datatype_UInt32_key_24_iv_None = r"""'9F32F3F6B3C3B1830F56B5B94C93875D'""" + +example_mode_aes_192_cbc_datatype_UInt64_key_24_iv_None = r"""'8DE807D54B7717BFC773567D9FFE292D'""" + +example_mode_aes_192_cbc_datatype_Int8_key_24_iv_None = r"""'01CC3C67F07C3FA6E5EFB7AE5F19130B'""" + +example_mode_aes_192_cbc_datatype_Int16_key_24_iv_None = r"""'B50A3019F16B9C643FB40259E4B09308'""" + +example_mode_aes_192_cbc_datatype_Int32_key_24_iv_None = r"""'9F32F3F6B3C3B1830F56B5B94C93875D'""" + +example_mode_aes_192_cbc_datatype_Int64_key_24_iv_None = r"""'8DE807D54B7717BFC773567D9FFE292D'""" + +example_mode_aes_192_cbc_datatype_Float32_key_24_iv_None = r"""'4E0C122631ED64EAD726833291A81878'""" + +example_mode_aes_192_cbc_datatype_Float64_key_24_iv_None = r"""'3F723599278E22E4692CE7D7D5F9A12F'""" + +example_mode_aes_192_cbc_datatype_Decimal32_key_24_iv_None = r"""'2420D49DBAA5CEF7D853C98DA1BD33BF'""" + +example_mode_aes_192_cbc_datatype_Decimal64_key_24_iv_None = r"""'FDF594113FCC2776653ED109A51FADF1'""" + +example_mode_aes_192_cbc_datatype_Decimal128_key_24_iv_None = r"""'79207931793E374FB5A3A2AC1ECA857A583603B3047000A843425EECA4C35311'""" + +example_mode_aes_192_cbc_datatype_UUID_key_24_iv_None = r"""'9FDB738E78D0D2F774C484ED82A854E46B580C61DBE08478DC523DA6AD605078'""" + +example_mode_aes_192_cbc_datatype_Date_key_24_iv_None = r"""'2CDD4685168FA3E2A7FA2092E86F44D4'""" + +example_mode_aes_192_cbc_datatype_DateTime_key_24_iv_None = r"""'A4BEE097872E44FAD94D6707D6643DF5'""" + +example_mode_aes_192_cbc_datatype_DateTime64_key_24_iv_None = r"""'1798B23C09F783623943560DF142E0F3'""" + +example_mode_aes_192_cbc_datatype_LowCardinality_key_24_iv_None = r"""'1AE38A541D466EDFED572EE839B0907F'""" + +example_mode_aes_192_cbc_datatype_Array_key_24_iv_None = r"""'7C0B9021CAF2CBBB06DBF589740DCC65'""" + +example_mode_aes_192_cbc_datatype_NULL_key_24_iv_None = r"""'\\N'""" + +example_mode_aes_192_cbc_datatype_IPv4_key_24_iv_None = r"""'B20465C932A0719BA04E2F76371510D8'""" + +example_mode_aes_192_cbc_datatype_IPv6_key_24_iv_None = r"""'CCCDC9B9C3F182254591DFEDDCE9F2326879326F3973401A6293A92BCB8EDFC4'""" + +example_mode_aes_192_cbc_datatype_Enum8_key_24_iv_None = r"""'01CC3C67F07C3FA6E5EFB7AE5F19130B'""" + +example_mode_aes_192_cbc_datatype_Enum16_key_24_iv_None = r"""'B50A3019F16B9C643FB40259E4B09308'""" + +example_mode_aes_256_cbc_datatype_bytes_key_32_iv_None = r"""'B73CDD4E7705F0C516612F860715EBE3'""" + +example_mode_aes_256_cbc_datatype_emptystring_key_32_iv_None = r"""'217E121CBD32CEC1F6FD3EBDF414BC34'""" + +example_mode_aes_256_cbc_datatype_utf8string_key_32_iv_None = r"""'3303F819796DDB5046AAFAB8A39FC3ABC19300E0966158A167939EDD20D39907'""" + +example_mode_aes_256_cbc_datatype_utf8fixedstring_key_32_iv_None = r"""'3303F819796DDB5046AAFAB8A39FC3ABC19300E0966158A167939EDD20D39907'""" + +example_mode_aes_256_cbc_datatype_String_key_32_iv_None = r"""'C91184ED1E67F0CDED89B097D5D3B130'""" + +example_mode_aes_256_cbc_datatype_FixedString_key_32_iv_None = r"""'C91184ED1E67F0CDED89B097D5D3B130'""" + +example_mode_aes_256_cbc_datatype_UInt8_key_32_iv_None = r"""'3605C5E38A448F5FEFABADF3B9983FDF'""" + +example_mode_aes_256_cbc_datatype_UInt16_key_32_iv_None = r"""'2E5299C7A5672D8779BA9DDDE1DBCE00'""" + +example_mode_aes_256_cbc_datatype_UInt32_key_32_iv_None = r"""'D8876CDF9B97DD110E780F958C1EA2AA'""" + +example_mode_aes_256_cbc_datatype_UInt64_key_32_iv_None = r"""'F6E11A48B6D830F7B8D0817885C05D3C'""" + +example_mode_aes_256_cbc_datatype_Int8_key_32_iv_None = r"""'3605C5E38A448F5FEFABADF3B9983FDF'""" + +example_mode_aes_256_cbc_datatype_Int16_key_32_iv_None = r"""'2E5299C7A5672D8779BA9DDDE1DBCE00'""" + +example_mode_aes_256_cbc_datatype_Int32_key_32_iv_None = r"""'D8876CDF9B97DD110E780F958C1EA2AA'""" + +example_mode_aes_256_cbc_datatype_Int64_key_32_iv_None = r"""'F6E11A48B6D830F7B8D0817885C05D3C'""" + +example_mode_aes_256_cbc_datatype_Float32_key_32_iv_None = r"""'A11ED1B75CF1C04C6CA3A31E76627D4C'""" + +example_mode_aes_256_cbc_datatype_Float64_key_32_iv_None = r"""'464C85EB7DB36D95CF48A3431CC7B2BC'""" + +example_mode_aes_256_cbc_datatype_Decimal32_key_32_iv_None = r"""'988C793BD81036C1D05EC47F43851269'""" + +example_mode_aes_256_cbc_datatype_Decimal64_key_32_iv_None = r"""'50FFB9C104DBFF3F415F12BA73D6FF1C'""" + +example_mode_aes_256_cbc_datatype_Decimal128_key_32_iv_None = r"""'B04C40C085A262E3AA27F8E7F6831DCB36585C228B0286E7A8D8DBAF754C4C38'""" + +example_mode_aes_256_cbc_datatype_UUID_key_32_iv_None = r"""'6A36D74ACB38B95FA77BC757A7AB2C3428548E6132D69A22B320775A21ABA11F'""" + +example_mode_aes_256_cbc_datatype_Date_key_32_iv_None = r"""'F1CFA361A9B08FC101F3A4707A3E04D2'""" + +example_mode_aes_256_cbc_datatype_DateTime_key_32_iv_None = r"""'D58178485CD1AE1C30F68383307B8BC5'""" + +example_mode_aes_256_cbc_datatype_DateTime64_key_32_iv_None = r"""'A19B65BCB740B2AF4D421CE1DEC43608'""" + +example_mode_aes_256_cbc_datatype_LowCardinality_key_32_iv_None = r"""'C91184ED1E67F0CDED89B097D5D3B130'""" + +example_mode_aes_256_cbc_datatype_Array_key_32_iv_None = r"""'C4071E4FD44F004347EA9932326B7038'""" + +example_mode_aes_256_cbc_datatype_NULL_key_32_iv_None = r"""'\\N'""" + +example_mode_aes_256_cbc_datatype_IPv4_key_32_iv_None = r"""'6C7950041CB4041D4D8036FCD22E3B06'""" + +example_mode_aes_256_cbc_datatype_IPv6_key_32_iv_None = r"""'8CBF2DC164F4086B8DD14B75E3065621393DE8421BAA5AE5E87096AEA7087507'""" + +example_mode_aes_256_cbc_datatype_Enum8_key_32_iv_None = r"""'3605C5E38A448F5FEFABADF3B9983FDF'""" + +example_mode_aes_256_cbc_datatype_Enum16_key_32_iv_None = r"""'2E5299C7A5672D8779BA9DDDE1DBCE00'""" + +example_mode_aes_128_cbc_datatype_bytes_key_16_iv_16 = r"""'CDA4B7027137998B9A33C2096C9A50DD'""" + +example_mode_aes_128_cbc_datatype_emptystring_key_16_iv_16 = r"""'56A77308430BA344FFBF016999795ED5'""" + +example_mode_aes_128_cbc_datatype_utf8string_key_16_iv_16 = r"""'0BD95BFF6DE2DC43D936DAF23937B06D602786A6770B627EB56BC7F681B1C9DB'""" + +example_mode_aes_128_cbc_datatype_utf8fixedstring_key_16_iv_16 = r"""'0BD95BFF6DE2DC43D936DAF23937B06D602786A6770B627EB56BC7F681B1C9DB'""" + +example_mode_aes_128_cbc_datatype_String_key_16_iv_16 = r"""'D017D171B3865D6EA347E14167261F41'""" + +example_mode_aes_128_cbc_datatype_FixedString_key_16_iv_16 = r"""'D017D171B3865D6EA347E14167261F41'""" + +example_mode_aes_128_cbc_datatype_UInt8_key_16_iv_16 = r"""'A5BD67663C14A01DC9AB3B5F7B0F9383'""" + +example_mode_aes_128_cbc_datatype_UInt16_key_16_iv_16 = r"""'02D98283BEADCA1AC6EF925F9BF86960'""" + +example_mode_aes_128_cbc_datatype_UInt32_key_16_iv_16 = r"""'E72BD2245C3B2B7474300D09DBD85F3F'""" + +example_mode_aes_128_cbc_datatype_UInt64_key_16_iv_16 = r"""'C9032C59328DEA2EE03ACDBEDFAE7475'""" + +example_mode_aes_128_cbc_datatype_Int8_key_16_iv_16 = r"""'A5BD67663C14A01DC9AB3B5F7B0F9383'""" + +example_mode_aes_128_cbc_datatype_Int16_key_16_iv_16 = r"""'02D98283BEADCA1AC6EF925F9BF86960'""" + +example_mode_aes_128_cbc_datatype_Int32_key_16_iv_16 = r"""'E72BD2245C3B2B7474300D09DBD85F3F'""" + +example_mode_aes_128_cbc_datatype_Int64_key_16_iv_16 = r"""'C9032C59328DEA2EE03ACDBEDFAE7475'""" + +example_mode_aes_128_cbc_datatype_Float32_key_16_iv_16 = r"""'A5425BDEB6B83E311C45249DAF3153F5'""" + +example_mode_aes_128_cbc_datatype_Float64_key_16_iv_16 = r"""'EEDA98EC4045C7D351F3905313073B79'""" + +example_mode_aes_128_cbc_datatype_Decimal32_key_16_iv_16 = r"""'52EBB74292ECD37A29E9809166CC77DB'""" + +example_mode_aes_128_cbc_datatype_Decimal64_key_16_iv_16 = r"""'95EF455767EC8FBD32BAAEFFB44FEEB7'""" + +example_mode_aes_128_cbc_datatype_Decimal128_key_16_iv_16 = r"""'94C066884FA09B0D3C750F20A2823304A2FE20B6B69AB18373E3F58623E0D7FB'""" + +example_mode_aes_128_cbc_datatype_UUID_key_16_iv_16 = r"""'1D909C15BB882E89AD68B1EFEAC72148DCD05E2303B6BE19007A945AFB778B42'""" + +example_mode_aes_128_cbc_datatype_Date_key_16_iv_16 = r"""'24A4F8CE8A9FAE48A0AFEB8A6203EFEA'""" + +example_mode_aes_128_cbc_datatype_DateTime_key_16_iv_16 = r"""'0DD5554819E3995B1B6B00362AEE9424'""" + +example_mode_aes_128_cbc_datatype_DateTime64_key_16_iv_16 = r"""'0E55319903957C9D1FDA4FB65C3871CB'""" + +example_mode_aes_128_cbc_datatype_LowCardinality_key_16_iv_16 = r"""'D017D171B3865D6EA347E14167261F41'""" + +example_mode_aes_128_cbc_datatype_Array_key_16_iv_16 = r"""'D53C82A5D13256B88DF41C1C1D924E40'""" + +example_mode_aes_128_cbc_datatype_NULL_key_16_iv_16 = r"""'\\N'""" + +example_mode_aes_128_cbc_datatype_IPv4_key_16_iv_16 = r"""'C0D81AAB3134EAB5B1F190958C6A29F9'""" + +example_mode_aes_128_cbc_datatype_IPv6_key_16_iv_16 = r"""'AE1A36F75C9BB387121445069A9968CA247FA4459ED3C8809089FEE334EB1EC7'""" + +example_mode_aes_128_cbc_datatype_Enum8_key_16_iv_16 = r"""'A5BD67663C14A01DC9AB3B5F7B0F9383'""" + +example_mode_aes_128_cbc_datatype_Enum16_key_16_iv_16 = r"""'02D98283BEADCA1AC6EF925F9BF86960'""" + +example_mode_aes_128_cbc_datatype_bytes_key_24_iv_24 = r"""'FD4D81969EDCB22A5B5DE4E21BDFE267'""" + +example_mode_aes_128_cbc_datatype_emptystring_key_24_iv_24 = r"""'BEFE724909AC17B32920D0400312227E'""" + +example_mode_aes_128_cbc_datatype_utf8string_key_24_iv_24 = r"""'A4FBBF549A9D453212CB69882DF12D34DAA659D7D176B78DE14F6AF36E0BE2C9'""" + +example_mode_aes_128_cbc_datatype_utf8fixedstring_key_24_iv_24 = r"""'A4FBBF549A9D453212CB69882DF12D34DAA659D7D176B78DE14F6AF36E0BE2C9'""" + +example_mode_aes_128_cbc_datatype_String_key_24_iv_24 = r"""'73C9874744984892250CCCEC8541D690'""" + +example_mode_aes_128_cbc_datatype_FixedString_key_24_iv_24 = r"""'73C9874744984892250CCCEC8541D690'""" + +example_mode_aes_128_cbc_datatype_UInt8_key_24_iv_24 = r"""'0E97B8F125240D96125B8AC23A798981'""" + +example_mode_aes_128_cbc_datatype_UInt16_key_24_iv_24 = r"""'9118F2C6B4E17730C62F85CB22E9A446'""" + +example_mode_aes_128_cbc_datatype_UInt32_key_24_iv_24 = r"""'2A189EB114A9487142573673C0F30929'""" + +example_mode_aes_128_cbc_datatype_UInt64_key_24_iv_24 = r"""'B6CA3E3C1C7830203FABD429664E81B3'""" + +example_mode_aes_128_cbc_datatype_Int8_key_24_iv_24 = r"""'0E97B8F125240D96125B8AC23A798981'""" + +example_mode_aes_128_cbc_datatype_Int16_key_24_iv_24 = r"""'9118F2C6B4E17730C62F85CB22E9A446'""" + +example_mode_aes_128_cbc_datatype_Int32_key_24_iv_24 = r"""'2A189EB114A9487142573673C0F30929'""" + +example_mode_aes_128_cbc_datatype_Int64_key_24_iv_24 = r"""'B6CA3E3C1C7830203FABD429664E81B3'""" + +example_mode_aes_128_cbc_datatype_Float32_key_24_iv_24 = r"""'79B44B6E26BC4BBACBBE312329F8C86D'""" + +example_mode_aes_128_cbc_datatype_Float64_key_24_iv_24 = r"""'C23864E616278AD006ED806C1EF89F71'""" + +example_mode_aes_128_cbc_datatype_Decimal32_key_24_iv_24 = r"""'4E14763E17CD954A2754768FF664CECE'""" + +example_mode_aes_128_cbc_datatype_Decimal64_key_24_iv_24 = r"""'A5D655F79EA638ECD6879A515853DD50'""" + +example_mode_aes_128_cbc_datatype_Decimal128_key_24_iv_24 = r"""'5C1C88BE7B68B91167BD317D3E6291A0D7920AEDA123237D0223EFB15F9C8ADC'""" + +example_mode_aes_128_cbc_datatype_UUID_key_24_iv_24 = r"""'ADF1CF6C8AF83CBD4BB3313E7E88FE8C377730890CC89DD91E95436ABC5E4F3A'""" + +example_mode_aes_128_cbc_datatype_Date_key_24_iv_24 = r"""'3127F80211A13ED02CED473BF2BFC28B'""" + +example_mode_aes_128_cbc_datatype_DateTime_key_24_iv_24 = r"""'A6B567CCFCE4F693BD6575D2D4DF498B'""" + +example_mode_aes_128_cbc_datatype_DateTime64_key_24_iv_24 = r"""'410F1A2A9E39722A1D0B549C3ADF9526'""" + +example_mode_aes_128_cbc_datatype_LowCardinality_key_24_iv_24 = r"""'73C9874744984892250CCCEC8541D690'""" + +example_mode_aes_128_cbc_datatype_Array_key_24_iv_24 = r"""'14A8202D2CACBE584BE9313C72F0478D'""" + +example_mode_aes_128_cbc_datatype_NULL_key_24_iv_24 = r"""'\\N'""" + +example_mode_aes_128_cbc_datatype_IPv4_key_24_iv_24 = r"""'9C554B2C04C5C9EAC0E7E36F1BD5CB80'""" + +example_mode_aes_128_cbc_datatype_IPv6_key_24_iv_24 = r"""'D548D293E5F41FE72A940A6A29EDBCDA8AAEBAC8BA27FB0B4DB65DAD63895B9F'""" + +example_mode_aes_128_cbc_datatype_Enum8_key_24_iv_24 = r"""'0E97B8F125240D96125B8AC23A798981'""" + +example_mode_aes_128_cbc_datatype_Enum16_key_24_iv_24 = r"""'9118F2C6B4E17730C62F85CB22E9A446'""" + +example_mode_aes_192_cbc_datatype_bytes_key_24_iv_16 = r"""'67771349942D4F812553F2E1E3FFB276'""" + +example_mode_aes_192_cbc_datatype_emptystring_key_24_iv_16 = r"""'62E9214DB5E239F0CAD31ADF26AB313F'""" + +example_mode_aes_192_cbc_datatype_utf8string_key_24_iv_16 = r"""'D619039D0956015C34336196DB3EB5A4710B2B8860344AB2625E9269C5E4A6CC'""" + +example_mode_aes_192_cbc_datatype_utf8fixedstring_key_24_iv_16 = r"""'D619039D0956015C34336196DB3EB5A4710B2B8860344AB2625E9269C5E4A6CC'""" + +example_mode_aes_192_cbc_datatype_String_key_24_iv_16 = r"""'A3DB45D129A5C9FDB5ED66E782B28BD2'""" + +example_mode_aes_192_cbc_datatype_FixedString_key_24_iv_16 = r"""'A3DB45D129A5C9FDB5ED66E782B28BD2'""" + +example_mode_aes_192_cbc_datatype_UInt8_key_24_iv_16 = r"""'F2A751470B32C58822F23B1417C11279'""" + +example_mode_aes_192_cbc_datatype_UInt16_key_24_iv_16 = r"""'CA1ECFEA89CF520D8FA14A38235E5FA5'""" + +example_mode_aes_192_cbc_datatype_UInt32_key_24_iv_16 = r"""'57F211370522621F23B59C8304878904'""" + +example_mode_aes_192_cbc_datatype_UInt64_key_24_iv_16 = r"""'DCF974CD88752B215284625F9164F5D4'""" + +example_mode_aes_192_cbc_datatype_Int8_key_24_iv_16 = r"""'F2A751470B32C58822F23B1417C11279'""" + +example_mode_aes_192_cbc_datatype_Int16_key_24_iv_16 = r"""'CA1ECFEA89CF520D8FA14A38235E5FA5'""" + +example_mode_aes_192_cbc_datatype_Int32_key_24_iv_16 = r"""'57F211370522621F23B59C8304878904'""" + +example_mode_aes_192_cbc_datatype_Int64_key_24_iv_16 = r"""'DCF974CD88752B215284625F9164F5D4'""" + +example_mode_aes_192_cbc_datatype_Float32_key_24_iv_16 = r"""'62EBE4FD1035D405BBD6C41436780E13'""" + +example_mode_aes_192_cbc_datatype_Float64_key_24_iv_16 = r"""'5706FC9892A4C1AB48FC93E13C9C72FE'""" + +example_mode_aes_192_cbc_datatype_Decimal32_key_24_iv_16 = r"""'BB056843D369A5E55982C92AD52EEC07'""" + +example_mode_aes_192_cbc_datatype_Decimal64_key_24_iv_16 = r"""'70ACD4156F9AC1444A75EFCB9202CA00'""" + +example_mode_aes_192_cbc_datatype_Decimal128_key_24_iv_16 = r"""'04748A45840A0CAAC83F139DB01C504B01FC56631A8B2FFBE68F2FC85B6FEEDE'""" + +example_mode_aes_192_cbc_datatype_UUID_key_24_iv_16 = r"""'D7B2ABC08F67823F61C3E8F680C12B3A8AA3E3711D412CB55ACFBC89C14949A8'""" + +example_mode_aes_192_cbc_datatype_Date_key_24_iv_16 = r"""'734BBE526E56B280E90E53DDEA7DB69B'""" + +example_mode_aes_192_cbc_datatype_DateTime_key_24_iv_16 = r"""'9B9BE7CC20F75DA3F39F688DE3A1ADAA'""" + +example_mode_aes_192_cbc_datatype_DateTime64_key_24_iv_16 = r"""'554FCAAF985378A561F7C6ED91E20C89'""" + +example_mode_aes_192_cbc_datatype_LowCardinality_key_24_iv_16 = r"""'A3DB45D129A5C9FDB5ED66E782B28BD2'""" + +example_mode_aes_192_cbc_datatype_Array_key_24_iv_16 = r"""'D85AF1078F110329896EFC462340171E'""" + +example_mode_aes_192_cbc_datatype_NULL_key_24_iv_16 = r"""'\\N'""" + +example_mode_aes_192_cbc_datatype_IPv4_key_24_iv_16 = r"""'6AF45078B1E924B6C107D4C0236EA937'""" + +example_mode_aes_192_cbc_datatype_IPv6_key_24_iv_16 = r"""'9E4F8E54B265A340090DC7FE4F53BB50048442F5632A7B1630AE80DFD938E9AA'""" + +example_mode_aes_192_cbc_datatype_Enum8_key_24_iv_16 = r"""'F2A751470B32C58822F23B1417C11279'""" + +example_mode_aes_192_cbc_datatype_Enum16_key_24_iv_16 = r"""'CA1ECFEA89CF520D8FA14A38235E5FA5'""" + +example_mode_aes_192_cbc_datatype_bytes_key_32_iv_32 = r"""'34FFC84A0D7CAD43F6BDB7F0C57CE511'""" + +example_mode_aes_192_cbc_datatype_emptystring_key_32_iv_32 = r"""'B9937ECA1C6EADCCA37CD7E8BA89D939'""" + +example_mode_aes_192_cbc_datatype_utf8string_key_32_iv_32 = r"""'00A1C691A68F5BF50BA973D72A5DBFBD579279FD953AE222F41FD0DAF48A3C90'""" + +example_mode_aes_192_cbc_datatype_utf8fixedstring_key_32_iv_32 = r"""'00A1C691A68F5BF50BA973D72A5DBFBD579279FD953AE222F41FD0DAF48A3C90'""" + +example_mode_aes_192_cbc_datatype_String_key_32_iv_32 = r"""'508551DA505F6538F90DC607423CFAD4'""" + +example_mode_aes_192_cbc_datatype_FixedString_key_32_iv_32 = r"""'508551DA505F6538F90DC607423CFAD4'""" + +example_mode_aes_192_cbc_datatype_UInt8_key_32_iv_32 = r"""'C2D3A1603DBAC305D8180F85A3830300'""" + +example_mode_aes_192_cbc_datatype_UInt16_key_32_iv_32 = r"""'A7EEA5561C4BB75015632824CAE9AC1E'""" + +example_mode_aes_192_cbc_datatype_UInt32_key_32_iv_32 = r"""'97EE21986E9A9F3A4F67851D05C93830'""" + +example_mode_aes_192_cbc_datatype_UInt64_key_32_iv_32 = r"""'474F106EAC813E4B432B2CA58D11F0E1'""" + +example_mode_aes_192_cbc_datatype_Int8_key_32_iv_32 = r"""'C2D3A1603DBAC305D8180F85A3830300'""" + +example_mode_aes_192_cbc_datatype_Int16_key_32_iv_32 = r"""'A7EEA5561C4BB75015632824CAE9AC1E'""" + +example_mode_aes_192_cbc_datatype_Int32_key_32_iv_32 = r"""'97EE21986E9A9F3A4F67851D05C93830'""" + +example_mode_aes_192_cbc_datatype_Int64_key_32_iv_32 = r"""'474F106EAC813E4B432B2CA58D11F0E1'""" + +example_mode_aes_192_cbc_datatype_Float32_key_32_iv_32 = r"""'3C76B134B1FF458CBE4430DCDF3EE8F9'""" + +example_mode_aes_192_cbc_datatype_Float64_key_32_iv_32 = r"""'0C2C54B82F3B7A889696EACBBBC5AA96'""" + +example_mode_aes_192_cbc_datatype_Decimal32_key_32_iv_32 = r"""'A038F21DD2F3C6FE3382C849E6BCC6B8'""" + +example_mode_aes_192_cbc_datatype_Decimal64_key_32_iv_32 = r"""'CE5E44EF4BAC3455C1FE57C82498FC32'""" + +example_mode_aes_192_cbc_datatype_Decimal128_key_32_iv_32 = r"""'DF51ED3C3BE2A229F07C4C9BB64902DD9383D2999BDD4E3FEFE023671B90CA88'""" + +example_mode_aes_192_cbc_datatype_UUID_key_32_iv_32 = r"""'B4A04107B9945309227C08EEE5516367F2C64F1587FEB4720620AA04485CA18C'""" + +example_mode_aes_192_cbc_datatype_Date_key_32_iv_32 = r"""'60253CED16ECAB1D34A5CC131E55B769'""" + +example_mode_aes_192_cbc_datatype_DateTime_key_32_iv_32 = r"""'99C6EE6DF7A06D02FE4D60018784F129'""" + +example_mode_aes_192_cbc_datatype_DateTime64_key_32_iv_32 = r"""'C0329F9CB5CFDDDEA74275618A099FAE'""" + +example_mode_aes_192_cbc_datatype_LowCardinality_key_32_iv_32 = r"""'508551DA505F6538F90DC607423CFAD4'""" + +example_mode_aes_192_cbc_datatype_Array_key_32_iv_32 = r"""'53161975B2A33AAFB8379B39B255D45A'""" + +example_mode_aes_192_cbc_datatype_NULL_key_32_iv_32 = r"""'\\N'""" + +example_mode_aes_192_cbc_datatype_IPv4_key_32_iv_32 = r"""'2B2ACE9C2914F3F2F9E206D25CD29429'""" + +example_mode_aes_192_cbc_datatype_IPv6_key_32_iv_32 = r"""'16AF2466967A2705EC5D588C0C155457A3EC9F82C1C5FB98CE86AC5697EF7223'""" + +example_mode_aes_192_cbc_datatype_Enum8_key_32_iv_32 = r"""'C2D3A1603DBAC305D8180F85A3830300'""" + +example_mode_aes_192_cbc_datatype_Enum16_key_32_iv_32 = r"""'A7EEA5561C4BB75015632824CAE9AC1E'""" + +example_mode_aes_256_cbc_datatype_bytes_key_32_iv_16 = r"""'6046ECF8094941C6DEC9278FF6F137E9'""" + +example_mode_aes_256_cbc_datatype_emptystring_key_32_iv_16 = r"""'4EC7785DA650D55B71B52816B1DB5AD3'""" + +example_mode_aes_256_cbc_datatype_utf8string_key_32_iv_16 = r"""'A7663A9F621A26398B51DFBC099A6FA09032C25FE48CB9D2DE29A8DFD581714D'""" + +example_mode_aes_256_cbc_datatype_utf8fixedstring_key_32_iv_16 = r"""'A7663A9F621A26398B51DFBC099A6FA09032C25FE48CB9D2DE29A8DFD581714D'""" + +example_mode_aes_256_cbc_datatype_String_key_32_iv_16 = r"""'5E22454D9AC4F1A47B04E2FD98A76140'""" + +example_mode_aes_256_cbc_datatype_FixedString_key_32_iv_16 = r"""'5E22454D9AC4F1A47B04E2FD98A76140'""" + +example_mode_aes_256_cbc_datatype_UInt8_key_32_iv_16 = r"""'FE35EEF14D6AA67AA2EBA474253CA19A'""" + +example_mode_aes_256_cbc_datatype_UInt16_key_32_iv_16 = r"""'2D22C6B58140E591BEF7986C7770FF21'""" + +example_mode_aes_256_cbc_datatype_UInt32_key_32_iv_16 = r"""'4EB4923E19AA24206B135D5B25CB31AB'""" + +example_mode_aes_256_cbc_datatype_UInt64_key_32_iv_16 = r"""'173B7CAFFCBED9B814C0ECD50A9477F6'""" + +example_mode_aes_256_cbc_datatype_Int8_key_32_iv_16 = r"""'FE35EEF14D6AA67AA2EBA474253CA19A'""" + +example_mode_aes_256_cbc_datatype_Int16_key_32_iv_16 = r"""'2D22C6B58140E591BEF7986C7770FF21'""" + +example_mode_aes_256_cbc_datatype_Int32_key_32_iv_16 = r"""'4EB4923E19AA24206B135D5B25CB31AB'""" + +example_mode_aes_256_cbc_datatype_Int64_key_32_iv_16 = r"""'173B7CAFFCBED9B814C0ECD50A9477F6'""" + +example_mode_aes_256_cbc_datatype_Float32_key_32_iv_16 = r"""'E639AA3E45D8C2759181FD736CD58EDC'""" + +example_mode_aes_256_cbc_datatype_Float64_key_32_iv_16 = r"""'CFEF3FDC054997559DF5DCFB5F215B58'""" + +example_mode_aes_256_cbc_datatype_Decimal32_key_32_iv_16 = r"""'E2F57A092A1759D39F4AE67C9543FAB8'""" + +example_mode_aes_256_cbc_datatype_Decimal64_key_32_iv_16 = r"""'6259A2CFD3D83352A44C03DB050077B3'""" + +example_mode_aes_256_cbc_datatype_Decimal128_key_32_iv_16 = r"""'AEC71CA2D87098392689F9EB2ED93A84FA5787E643E28CB3C2013F8FCC24E387'""" + +example_mode_aes_256_cbc_datatype_UUID_key_32_iv_16 = r"""'88BA86B14A468DC92084B7152B172E142D88CBFB639A8FF2F480F1727972251C'""" + +example_mode_aes_256_cbc_datatype_Date_key_32_iv_16 = r"""'C67C84B1C6BF4527A7E730499FF39C86'""" + +example_mode_aes_256_cbc_datatype_DateTime_key_32_iv_16 = r"""'7FDC1B0797A5F3C04CDA82729A1EA4AA'""" + +example_mode_aes_256_cbc_datatype_DateTime64_key_32_iv_16 = r"""'B1B7401FB2B65BCB3448C1BE179F6AA6'""" + +example_mode_aes_256_cbc_datatype_LowCardinality_key_32_iv_16 = r"""'5E22454D9AC4F1A47B04E2FD98A76140'""" + +example_mode_aes_256_cbc_datatype_Array_key_32_iv_16 = r"""'6BB1E8429CC612B0AA74282B81D4FE8A'""" + +example_mode_aes_256_cbc_datatype_NULL_key_32_iv_16 = r"""'\\N'""" + +example_mode_aes_256_cbc_datatype_IPv4_key_32_iv_16 = r"""'51364C8DC6882CA1F03CF7FB45117EEF'""" + +example_mode_aes_256_cbc_datatype_IPv6_key_32_iv_16 = r"""'87A1C4D4672EFE64DC98E040EAD6B3126C899C263577B3D8EE8A3952BE5CDC1B'""" + +example_mode_aes_256_cbc_datatype_Enum8_key_32_iv_16 = r"""'FE35EEF14D6AA67AA2EBA474253CA19A'""" + +example_mode_aes_256_cbc_datatype_Enum16_key_32_iv_16 = r"""'2D22C6B58140E591BEF7986C7770FF21'""" + +example_mode_aes_256_cbc_datatype_bytes_key_64_iv_64 = r"""'BC91CDADF0BD3A8E9FF014B1E494FE7E'""" + +example_mode_aes_256_cbc_datatype_emptystring_key_64_iv_64 = r"""'A574B24357860C4B9C580D4CBE6C22C7'""" + +example_mode_aes_256_cbc_datatype_utf8string_key_64_iv_64 = r"""'3DA0F0C80E8067C1A0B5C82EF7A2D12A1EAD3C258827367A46D13D522B4D85DC'""" + +example_mode_aes_256_cbc_datatype_utf8fixedstring_key_64_iv_64 = r"""'3DA0F0C80E8067C1A0B5C82EF7A2D12A1EAD3C258827367A46D13D522B4D85DC'""" + +example_mode_aes_256_cbc_datatype_String_key_64_iv_64 = r"""'4CE9C9AFDC1E1E1EF2D1F4C141CE1874'""" + +example_mode_aes_256_cbc_datatype_FixedString_key_64_iv_64 = r"""'4CE9C9AFDC1E1E1EF2D1F4C141CE1874'""" + +example_mode_aes_256_cbc_datatype_UInt8_key_64_iv_64 = r"""'89E81101BF6A6E1DBEB6C0EAA67BEF14'""" + +example_mode_aes_256_cbc_datatype_UInt16_key_64_iv_64 = r"""'3124E8A62599D6C8A0C16A7ED0F01C58'""" + +example_mode_aes_256_cbc_datatype_UInt32_key_64_iv_64 = r"""'DD8866C2B2E443073D2F7B5A6FEE92E9'""" + +example_mode_aes_256_cbc_datatype_UInt64_key_64_iv_64 = r"""'C45A6D56D06F8A3A6A753D9BADBE88A4'""" + +example_mode_aes_256_cbc_datatype_Int8_key_64_iv_64 = r"""'89E81101BF6A6E1DBEB6C0EAA67BEF14'""" + +example_mode_aes_256_cbc_datatype_Int16_key_64_iv_64 = r"""'3124E8A62599D6C8A0C16A7ED0F01C58'""" + +example_mode_aes_256_cbc_datatype_Int32_key_64_iv_64 = r"""'DD8866C2B2E443073D2F7B5A6FEE92E9'""" + +example_mode_aes_256_cbc_datatype_Int64_key_64_iv_64 = r"""'C45A6D56D06F8A3A6A753D9BADBE88A4'""" + +example_mode_aes_256_cbc_datatype_Float32_key_64_iv_64 = r"""'66778B8F543C2C8402865CFB41187A09'""" + +example_mode_aes_256_cbc_datatype_Float64_key_64_iv_64 = r"""'F05D98EC189434B1F9177D0915FE939F'""" + +example_mode_aes_256_cbc_datatype_Decimal32_key_64_iv_64 = r"""'81190FEC7ADDBD8B919DD85AD71FF0B3'""" + +example_mode_aes_256_cbc_datatype_Decimal64_key_64_iv_64 = r"""'AB8B69F837890ED5684B071FF2359BED'""" + +example_mode_aes_256_cbc_datatype_Decimal128_key_64_iv_64 = r"""'765BDA3E9FA6177EB1839155F9C55A856315AB458B1DC334DF821A6FD768BFC8'""" + +example_mode_aes_256_cbc_datatype_UUID_key_64_iv_64 = r"""'99588BF38D9D6A2ABBEBD22E02F4D0F1CD5787AF78FE18679B8CF02A53D2600E'""" + +example_mode_aes_256_cbc_datatype_Date_key_64_iv_64 = r"""'ABEEA4FD2E771A3936EB591F674E4CDA'""" + +example_mode_aes_256_cbc_datatype_DateTime_key_64_iv_64 = r"""'C7EC851BCD2FBA03E58AC9F027E06444'""" + +example_mode_aes_256_cbc_datatype_DateTime64_key_64_iv_64 = r"""'53D42045D02E68F0D565EB8E093C83B8'""" + +example_mode_aes_256_cbc_datatype_LowCardinality_key_64_iv_64 = r"""'4CE9C9AFDC1E1E1EF2D1F4C141CE1874'""" + +example_mode_aes_256_cbc_datatype_Array_key_64_iv_64 = r"""'5A3063DCD98C7C59B41068F26DA0CC52'""" + +example_mode_aes_256_cbc_datatype_NULL_key_64_iv_64 = r"""'\\N'""" + +example_mode_aes_256_cbc_datatype_IPv4_key_64_iv_64 = r"""'1F12AE92E01133B2BB3F4F5AC6041FC9'""" + +example_mode_aes_256_cbc_datatype_IPv6_key_64_iv_64 = r"""'32406EB5546AECA4EE235A586577B14A5F6070FE879D6E07E6431748E3C2E80F'""" + +example_mode_aes_256_cbc_datatype_Enum8_key_64_iv_64 = r"""'89E81101BF6A6E1DBEB6C0EAA67BEF14'""" + +example_mode_aes_256_cbc_datatype_Enum16_key_64_iv_64 = r"""'3124E8A62599D6C8A0C16A7ED0F01C58'""" + +example_mode_aes_128_cfb1_datatype_bytes_key_16_iv_None = r"""'00'""" + +example_mode_aes_128_cfb1_datatype_emptystring_key_16_iv_None = r"""''""" + +example_mode_aes_128_cfb1_datatype_utf8string_key_16_iv_None = r"""'5BA033EA7B9901874F4F863E229069EBA414B7C317D37DF0'""" + +example_mode_aes_128_cfb1_datatype_utf8fixedstring_key_16_iv_None = r"""'5BA033EA7B9901874F4F863E229069EBA414B7C317D37DF0'""" + +example_mode_aes_128_cfb1_datatype_String_key_16_iv_None = r"""'32'""" + +example_mode_aes_128_cfb1_datatype_FixedString_key_16_iv_None = r"""'32'""" + +example_mode_aes_128_cfb1_datatype_UInt8_key_16_iv_None = r"""'01'""" + +example_mode_aes_128_cfb1_datatype_UInt16_key_16_iv_None = r"""'0173'""" + +example_mode_aes_128_cfb1_datatype_UInt32_key_16_iv_None = r"""'01732E6B'""" + +example_mode_aes_128_cfb1_datatype_UInt64_key_16_iv_None = r"""'01732E6B82FCBDF6'""" + +example_mode_aes_128_cfb1_datatype_Int8_key_16_iv_None = r"""'01'""" + +example_mode_aes_128_cfb1_datatype_Int16_key_16_iv_None = r"""'0173'""" + +example_mode_aes_128_cfb1_datatype_Int32_key_16_iv_None = r"""'01732E6B'""" + +example_mode_aes_128_cfb1_datatype_Int64_key_16_iv_None = r"""'01732E6B82FCBDF6'""" + +example_mode_aes_128_cfb1_datatype_Float32_key_16_iv_None = r"""'0000B9AB'""" + +example_mode_aes_128_cfb1_datatype_Float64_key_16_iv_None = r"""'000000000000FFF6'""" + +example_mode_aes_128_cfb1_datatype_Decimal32_key_16_iv_None = r"""'2E09CA6A'""" + +example_mode_aes_128_cfb1_datatype_Decimal64_key_16_iv_None = r"""'2E09CA6A6DBEE799'""" + +example_mode_aes_128_cfb1_datatype_Decimal128_key_16_iv_None = r"""'2E09CA6A6DBEE79923BA65C6B78FD199'""" + +example_mode_aes_128_cfb1_datatype_UUID_key_16_iv_None = r"""'E590DFB515D3A518F85C66A6A5EC9C6E'""" + +example_mode_aes_128_cfb1_datatype_Date_key_16_iv_None = r"""'42F0'""" + +example_mode_aes_128_cfb1_datatype_DateTime_key_16_iv_None = r"""'5475EC3D'""" + +example_mode_aes_128_cfb1_datatype_DateTime64_key_16_iv_None = r"""'21CDF1128AE44A37'""" + +example_mode_aes_128_cfb1_datatype_LowCardinality_key_16_iv_None = r"""'32'""" + +example_mode_aes_128_cfb1_datatype_Array_key_16_iv_None = r"""'0170'""" + +example_mode_aes_128_cfb1_datatype_NULL_key_16_iv_None = r"""'\\N'""" + +example_mode_aes_128_cfb1_datatype_IPv4_key_16_iv_None = r"""'240A9E43'""" + +example_mode_aes_128_cfb1_datatype_IPv6_key_16_iv_None = r"""'2E642EF4B07D9B1251BE3B3CBDBCC6F6'""" + +example_mode_aes_128_cfb1_datatype_Enum8_key_16_iv_None = r"""'01'""" + +example_mode_aes_128_cfb1_datatype_Enum16_key_16_iv_None = r"""'0173'""" + +example_mode_aes_192_cfb1_datatype_bytes_key_24_iv_None = r"""'00'""" + +example_mode_aes_192_cfb1_datatype_emptystring_key_24_iv_None = r"""''""" + +example_mode_aes_192_cfb1_datatype_utf8string_key_24_iv_None = r"""'7B69A097857549357D008DB662730D8735DE1673D9E8CFF9'""" + +example_mode_aes_192_cfb1_datatype_utf8fixedstring_key_24_iv_None = r"""'7B69A097857549357D008DB662730D8735DE1673D9E8CFF9'""" + +example_mode_aes_192_cfb1_datatype_String_key_24_iv_None = r"""'23'""" + +example_mode_aes_192_cfb1_datatype_FixedString_key_24_iv_None = r"""'23'""" + +example_mode_aes_192_cfb1_datatype_UInt8_key_24_iv_None = r"""'01'""" + +example_mode_aes_192_cfb1_datatype_UInt16_key_24_iv_None = r"""'01F9'""" + +example_mode_aes_192_cfb1_datatype_UInt32_key_24_iv_None = r"""'01F92AD3'""" + +example_mode_aes_192_cfb1_datatype_UInt64_key_24_iv_None = r"""'01F92AD38CB10028'""" + +example_mode_aes_192_cfb1_datatype_Int8_key_24_iv_None = r"""'01'""" + +example_mode_aes_192_cfb1_datatype_Int16_key_24_iv_None = r"""'01F9'""" + +example_mode_aes_192_cfb1_datatype_Int32_key_24_iv_None = r"""'01F92AD3'""" + +example_mode_aes_192_cfb1_datatype_Int64_key_24_iv_None = r"""'01F92AD38CB10028'""" + +example_mode_aes_192_cfb1_datatype_Float32_key_24_iv_None = r"""'0000FCAE'""" + +example_mode_aes_192_cfb1_datatype_Float64_key_24_iv_None = r"""'000000000000A79C'""" + +example_mode_aes_192_cfb1_datatype_Decimal32_key_24_iv_None = r"""'3F406C3F'""" + +example_mode_aes_192_cfb1_datatype_Decimal64_key_24_iv_None = r"""'3F406C3F3A41B134'""" + +example_mode_aes_192_cfb1_datatype_Decimal128_key_24_iv_None = r"""'3F406C3F3A41B134310D6B68BEBC5708'""" + +example_mode_aes_192_cfb1_datatype_UUID_key_24_iv_None = r"""'B7F80F1BDCA1C4193E5AB11078FEA213'""" + +example_mode_aes_192_cfb1_datatype_Date_key_24_iv_None = r"""'6FF6'""" + +example_mode_aes_192_cfb1_datatype_DateTime_key_24_iv_None = r"""'7013E555'""" + +example_mode_aes_192_cfb1_datatype_DateTime64_key_24_iv_None = r"""'371AF0291536F5B7'""" + +example_mode_aes_192_cfb1_datatype_LowCardinality_key_24_iv_None = r"""'23'""" + +example_mode_aes_192_cfb1_datatype_Array_key_24_iv_None = r"""'01FA'""" + +example_mode_aes_192_cfb1_datatype_NULL_key_24_iv_None = r"""'\\N'""" + +example_mode_aes_192_cfb1_datatype_IPv4_key_24_iv_None = r"""'33895F70'""" + +example_mode_aes_192_cfb1_datatype_IPv6_key_24_iv_None = r"""'3F24552946522B931290F904186B055A'""" + +example_mode_aes_192_cfb1_datatype_Enum8_key_24_iv_None = r"""'01'""" + +example_mode_aes_192_cfb1_datatype_Enum16_key_24_iv_None = r"""'01F9'""" + +example_mode_aes_256_cfb1_datatype_bytes_key_32_iv_None = r"""'B8'""" + +example_mode_aes_256_cfb1_datatype_emptystring_key_32_iv_None = r"""''""" + +example_mode_aes_256_cfb1_datatype_utf8string_key_32_iv_None = r"""'C797191D9D99944E674425A4275A8A3263E1E1357DF8E11E'""" + +example_mode_aes_256_cfb1_datatype_utf8fixedstring_key_32_iv_None = r"""'C797191D9D99944E674425A4275A8A3263E1E1357DF8E11E'""" + +example_mode_aes_256_cfb1_datatype_String_key_32_iv_None = r"""'9E'""" + +example_mode_aes_256_cfb1_datatype_FixedString_key_32_iv_None = r"""'9E'""" + +example_mode_aes_256_cfb1_datatype_UInt8_key_32_iv_None = r"""'B9'""" + +example_mode_aes_256_cfb1_datatype_UInt16_key_32_iv_None = r"""'B9ED'""" + +example_mode_aes_256_cfb1_datatype_UInt32_key_32_iv_None = r"""'B9ED4764'""" + +example_mode_aes_256_cfb1_datatype_UInt64_key_32_iv_None = r"""'B9ED4764E7BF3C1C'""" + +example_mode_aes_256_cfb1_datatype_Int8_key_32_iv_None = r"""'B9'""" + +example_mode_aes_256_cfb1_datatype_Int16_key_32_iv_None = r"""'B9ED'""" + +example_mode_aes_256_cfb1_datatype_Int32_key_32_iv_None = r"""'B9ED4764'""" + +example_mode_aes_256_cfb1_datatype_Int64_key_32_iv_None = r"""'B9ED4764E7BF3C1C'""" + +example_mode_aes_256_cfb1_datatype_Float32_key_32_iv_None = r"""'B85F0E63'""" + +example_mode_aes_256_cfb1_datatype_Float64_key_32_iv_None = r"""'B85FDB5A8FE0C0BB'""" + +example_mode_aes_256_cfb1_datatype_Decimal32_key_32_iv_None = r"""'891B85B3'""" + +example_mode_aes_256_cfb1_datatype_Decimal64_key_32_iv_None = r"""'891B85B3C1BA6EE1'""" + +example_mode_aes_256_cfb1_datatype_Decimal128_key_32_iv_None = r"""'891B85B3C1BA6EE137EF658F618D1F3F'""" + +example_mode_aes_256_cfb1_datatype_UUID_key_32_iv_None = r"""'121B5EE9929417BC1CDBDB390BC93B4A'""" + +example_mode_aes_256_cfb1_datatype_Date_key_32_iv_None = r"""'D40F'""" + +example_mode_aes_256_cfb1_datatype_DateTime_key_32_iv_None = r"""'CF27297C'""" + +example_mode_aes_256_cfb1_datatype_DateTime64_key_32_iv_None = r"""'8773F350CD394D36'""" + +example_mode_aes_256_cfb1_datatype_LowCardinality_key_32_iv_None = r"""'9E'""" + +example_mode_aes_256_cfb1_datatype_Array_key_32_iv_None = r"""'B9EE'""" + +example_mode_aes_256_cfb1_datatype_NULL_key_32_iv_None = r"""'\\N'""" + +example_mode_aes_256_cfb1_datatype_IPv4_key_32_iv_None = r"""'8383FD3C'""" + +example_mode_aes_256_cfb1_datatype_IPv6_key_32_iv_None = r"""'897A84A02FD451D3DDB92FF290BF9B7C'""" + +example_mode_aes_256_cfb1_datatype_Enum8_key_32_iv_None = r"""'B9'""" + +example_mode_aes_256_cfb1_datatype_Enum16_key_32_iv_None = r"""'B9ED'""" + +example_mode_aes_128_cfb1_datatype_bytes_key_16_iv_16 = r"""'00'""" + +example_mode_aes_128_cfb1_datatype_emptystring_key_16_iv_16 = r"""''""" + +example_mode_aes_128_cfb1_datatype_utf8string_key_16_iv_16 = r"""'49CFD4F9B884A17F67C8CDD639EB4D367BE2B1656CA442A4'""" + +example_mode_aes_128_cfb1_datatype_utf8fixedstring_key_16_iv_16 = r"""'49CFD4F9B884A17F67C8CDD639EB4D367BE2B1656CA442A4'""" + +example_mode_aes_128_cfb1_datatype_String_key_16_iv_16 = r"""'37'""" + +example_mode_aes_128_cfb1_datatype_FixedString_key_16_iv_16 = r"""'37'""" + +example_mode_aes_128_cfb1_datatype_UInt8_key_16_iv_16 = r"""'01'""" + +example_mode_aes_128_cfb1_datatype_UInt16_key_16_iv_16 = r"""'0188'""" + +example_mode_aes_128_cfb1_datatype_UInt32_key_16_iv_16 = r"""'01882D46'""" + +example_mode_aes_128_cfb1_datatype_UInt64_key_16_iv_16 = r"""'01882D46FCCCD695'""" + +example_mode_aes_128_cfb1_datatype_Int8_key_16_iv_16 = r"""'01'""" + +example_mode_aes_128_cfb1_datatype_Int16_key_16_iv_16 = r"""'0188'""" + +example_mode_aes_128_cfb1_datatype_Int32_key_16_iv_16 = r"""'01882D46'""" + +example_mode_aes_128_cfb1_datatype_Int64_key_16_iv_16 = r"""'01882D46FCCCD695'""" + +example_mode_aes_128_cfb1_datatype_Float32_key_16_iv_16 = r"""'00B931F2'""" + +example_mode_aes_128_cfb1_datatype_Float64_key_16_iv_16 = r"""'00B99AAE199C3C93'""" + +example_mode_aes_128_cfb1_datatype_Decimal32_key_16_iv_16 = r"""'2D557511'""" + +example_mode_aes_128_cfb1_datatype_Decimal64_key_16_iv_16 = r"""'2D557511511F90FB'""" + +example_mode_aes_128_cfb1_datatype_Decimal128_key_16_iv_16 = r"""'2D557511511F90FBC464352E8A02FC51'""" + +example_mode_aes_128_cfb1_datatype_UUID_key_16_iv_16 = r"""'8AE269086C72AD682EB92ABA6CA58E49'""" + +example_mode_aes_128_cfb1_datatype_Date_key_16_iv_16 = r"""'5FC9'""" + +example_mode_aes_128_cfb1_datatype_DateTime_key_16_iv_16 = r"""'42970865'""" + +example_mode_aes_128_cfb1_datatype_DateTime64_key_16_iv_16 = r"""'20B310A2F7EF8460'""" + +example_mode_aes_128_cfb1_datatype_LowCardinality_key_16_iv_16 = r"""'37'""" + +example_mode_aes_128_cfb1_datatype_Array_key_16_iv_16 = r"""'018A'""" + +example_mode_aes_128_cfb1_datatype_NULL_key_16_iv_16 = r"""'\\N'""" + +example_mode_aes_128_cfb1_datatype_IPv4_key_16_iv_16 = r"""'27476DAF'""" + +example_mode_aes_128_cfb1_datatype_IPv6_key_16_iv_16 = r"""'2D311FBDC0A5C652AAD863398F94C5C3'""" + +example_mode_aes_128_cfb1_datatype_Enum8_key_16_iv_16 = r"""'01'""" + +example_mode_aes_128_cfb1_datatype_Enum16_key_16_iv_16 = r"""'0188'""" + +example_mode_aes_128_cfb1_datatype_bytes_key_24_iv_24 = r"""'1C'""" + +example_mode_aes_128_cfb1_datatype_emptystring_key_24_iv_24 = r"""''""" + +example_mode_aes_128_cfb1_datatype_utf8string_key_24_iv_24 = r"""'612A502D86BAEA94E98C1381AE057BD8606FB3776DC79E52'""" + +example_mode_aes_128_cfb1_datatype_utf8fixedstring_key_24_iv_24 = r"""'612A502D86BAEA94E98C1381AE057BD8606FB3776DC79E52'""" + +example_mode_aes_128_cfb1_datatype_String_key_24_iv_24 = r"""'30'""" + +example_mode_aes_128_cfb1_datatype_FixedString_key_24_iv_24 = r"""'30'""" + +example_mode_aes_128_cfb1_datatype_UInt8_key_24_iv_24 = r"""'1D'""" + +example_mode_aes_128_cfb1_datatype_UInt16_key_24_iv_24 = r"""'1D52'""" + +example_mode_aes_128_cfb1_datatype_UInt32_key_24_iv_24 = r"""'1D52BAD5'""" + +example_mode_aes_128_cfb1_datatype_UInt64_key_24_iv_24 = r"""'1D52BAD5E209AC18'""" + +example_mode_aes_128_cfb1_datatype_Int8_key_24_iv_24 = r"""'1D'""" + +example_mode_aes_128_cfb1_datatype_Int16_key_24_iv_24 = r"""'1D52'""" + +example_mode_aes_128_cfb1_datatype_Int32_key_24_iv_24 = r"""'1D52BAD5'""" + +example_mode_aes_128_cfb1_datatype_Int64_key_24_iv_24 = r"""'1D52BAD5E209AC18'""" + +example_mode_aes_128_cfb1_datatype_Float32_key_24_iv_24 = r"""'1C3165A0'""" + +example_mode_aes_128_cfb1_datatype_Float64_key_24_iv_24 = r"""'1C31E017FDE1A7AC'""" + +example_mode_aes_128_cfb1_datatype_Decimal32_key_24_iv_24 = r"""'2CCB18B8'""" + +example_mode_aes_128_cfb1_datatype_Decimal64_key_24_iv_24 = r"""'2CCB18B874E51783'""" + +example_mode_aes_128_cfb1_datatype_Decimal128_key_24_iv_24 = r"""'2CCB18B874E51783A6ADE353B5D95026'""" + +example_mode_aes_128_cfb1_datatype_UUID_key_24_iv_24 = r"""'EF014A2E68CFB6C3BE44AE59F4A58888'""" + +example_mode_aes_128_cfb1_datatype_Date_key_24_iv_24 = r"""'70F3'""" + +example_mode_aes_128_cfb1_datatype_DateTime_key_24_iv_24 = r"""'6FF3F637'""" + +example_mode_aes_128_cfb1_datatype_DateTime64_key_24_iv_24 = r"""'2432F8327D29D7FF'""" + +example_mode_aes_128_cfb1_datatype_LowCardinality_key_24_iv_24 = r"""'30'""" + +example_mode_aes_128_cfb1_datatype_Array_key_24_iv_24 = r"""'1D50'""" + +example_mode_aes_128_cfb1_datatype_NULL_key_24_iv_24 = r"""'\\N'""" + +example_mode_aes_128_cfb1_datatype_IPv4_key_24_iv_24 = r"""'20BA7FDE'""" + +example_mode_aes_128_cfb1_datatype_IPv6_key_24_iv_24 = r"""'2C8F73DFF566693C8E482419FAC24837'""" + +example_mode_aes_128_cfb1_datatype_Enum8_key_24_iv_24 = r"""'1D'""" + +example_mode_aes_128_cfb1_datatype_Enum16_key_24_iv_24 = r"""'1D52'""" + +example_mode_aes_192_cfb1_datatype_bytes_key_24_iv_16 = r"""'07'""" + +example_mode_aes_192_cfb1_datatype_emptystring_key_24_iv_16 = r"""''""" + +example_mode_aes_192_cfb1_datatype_utf8string_key_24_iv_16 = r"""'54C01F88A909EC7B2AEE59F81C138B8EE2DF205E2ED74210'""" + +example_mode_aes_192_cfb1_datatype_utf8fixedstring_key_24_iv_16 = r"""'54C01F88A909EC7B2AEE59F81C138B8EE2DF205E2ED74210'""" + +example_mode_aes_192_cfb1_datatype_String_key_24_iv_16 = r"""'38'""" + +example_mode_aes_192_cfb1_datatype_FixedString_key_24_iv_16 = r"""'38'""" + +example_mode_aes_192_cfb1_datatype_UInt8_key_24_iv_16 = r"""'06'""" + +example_mode_aes_192_cfb1_datatype_UInt16_key_24_iv_16 = r"""'069E'""" + +example_mode_aes_192_cfb1_datatype_UInt32_key_24_iv_16 = r"""'069E2E37'""" + +example_mode_aes_192_cfb1_datatype_UInt64_key_24_iv_16 = r"""'069E2E370A6D9872'""" + +example_mode_aes_192_cfb1_datatype_Int8_key_24_iv_16 = r"""'06'""" + +example_mode_aes_192_cfb1_datatype_Int16_key_24_iv_16 = r"""'069E'""" + +example_mode_aes_192_cfb1_datatype_Int32_key_24_iv_16 = r"""'069E2E37'""" + +example_mode_aes_192_cfb1_datatype_Int64_key_24_iv_16 = r"""'069E2E370A6D9872'""" + +example_mode_aes_192_cfb1_datatype_Float32_key_24_iv_16 = r"""'07955BCF'""" + +example_mode_aes_192_cfb1_datatype_Float64_key_24_iv_16 = r"""'0795A57CA222A36E'""" + +example_mode_aes_192_cfb1_datatype_Decimal32_key_24_iv_16 = r"""'2A15BB86'""" + +example_mode_aes_192_cfb1_datatype_Decimal64_key_24_iv_16 = r"""'2A15BB86FB961E7D'""" + +example_mode_aes_192_cfb1_datatype_Decimal128_key_24_iv_16 = r"""'2A15BB86FB961E7D0DD5055987176AF4'""" + +example_mode_aes_192_cfb1_datatype_UUID_key_24_iv_16 = r"""'DA2338793C7B9E0F6722E272062F5EA1'""" + +example_mode_aes_192_cfb1_datatype_Date_key_24_iv_16 = r"""'4AAB'""" + +example_mode_aes_192_cfb1_datatype_DateTime_key_24_iv_16 = r"""'5B6A8EE6'""" + +example_mode_aes_192_cfb1_datatype_DateTime64_key_24_iv_16 = r"""'23C4E2A707F73EF4'""" + +example_mode_aes_192_cfb1_datatype_LowCardinality_key_24_iv_16 = r"""'38'""" + +example_mode_aes_192_cfb1_datatype_Array_key_24_iv_16 = r"""'069C'""" + +example_mode_aes_192_cfb1_datatype_NULL_key_24_iv_16 = r"""'\\N'""" + +example_mode_aes_192_cfb1_datatype_IPv4_key_24_iv_16 = r"""'2470A839'""" + +example_mode_aes_192_cfb1_datatype_IPv6_key_24_iv_16 = r"""'2A712A746781131B2DC4EB92E31C72FA'""" + +example_mode_aes_192_cfb1_datatype_Enum8_key_24_iv_16 = r"""'06'""" + +example_mode_aes_192_cfb1_datatype_Enum16_key_24_iv_16 = r"""'069E'""" + +example_mode_aes_192_cfb1_datatype_bytes_key_32_iv_32 = r"""'6A'""" + +example_mode_aes_192_cfb1_datatype_emptystring_key_32_iv_32 = r"""''""" + +example_mode_aes_192_cfb1_datatype_utf8string_key_32_iv_32 = r"""'1317B03E3411FE499C234D87DD44014E46B15B10C9F76A3C'""" + +example_mode_aes_192_cfb1_datatype_utf8fixedstring_key_32_iv_32 = r"""'1317B03E3411FE499C234D87DD44014E46B15B10C9F76A3C'""" + +example_mode_aes_192_cfb1_datatype_String_key_32_iv_32 = r"""'45'""" + +example_mode_aes_192_cfb1_datatype_FixedString_key_32_iv_32 = r"""'45'""" + +example_mode_aes_192_cfb1_datatype_UInt8_key_32_iv_32 = r"""'6B'""" + +example_mode_aes_192_cfb1_datatype_UInt16_key_32_iv_32 = r"""'6B43'""" + +example_mode_aes_192_cfb1_datatype_UInt32_key_32_iv_32 = r"""'6B43D96E'""" + +example_mode_aes_192_cfb1_datatype_UInt64_key_32_iv_32 = r"""'6B43D96E7D63C177'""" + +example_mode_aes_192_cfb1_datatype_Int8_key_32_iv_32 = r"""'6B'""" + +example_mode_aes_192_cfb1_datatype_Int16_key_32_iv_32 = r"""'6B43'""" + +example_mode_aes_192_cfb1_datatype_Int32_key_32_iv_32 = r"""'6B43D96E'""" + +example_mode_aes_192_cfb1_datatype_Int64_key_32_iv_32 = r"""'6B43D96E7D63C177'""" + +example_mode_aes_192_cfb1_datatype_Float32_key_32_iv_32 = r"""'6AF301CD'""" + +example_mode_aes_192_cfb1_datatype_Float64_key_32_iv_32 = r"""'6AF3B787907E47A9'""" + +example_mode_aes_192_cfb1_datatype_Decimal32_key_32_iv_32 = r"""'515FA59C'""" + +example_mode_aes_192_cfb1_datatype_Decimal64_key_32_iv_32 = r"""'515FA59C52E93CA7'""" + +example_mode_aes_192_cfb1_datatype_Decimal128_key_32_iv_32 = r"""'515FA59C52E93CA74BFFFC3D5F3D3163'""" + +example_mode_aes_192_cfb1_datatype_UUID_key_32_iv_32 = r"""'E5F370149365AFB35B9245146396A914'""" + +example_mode_aes_192_cfb1_datatype_Date_key_32_iv_32 = r"""'0685'""" + +example_mode_aes_192_cfb1_datatype_DateTime_key_32_iv_32 = r"""'1D0054E1'""" + +example_mode_aes_192_cfb1_datatype_DateTime64_key_32_iv_32 = r"""'5BD19E5F525FA135'""" + +example_mode_aes_192_cfb1_datatype_LowCardinality_key_32_iv_32 = r"""'45'""" + +example_mode_aes_192_cfb1_datatype_Array_key_32_iv_32 = r"""'6B40'""" + +example_mode_aes_192_cfb1_datatype_NULL_key_32_iv_32 = r"""'\\N'""" + +example_mode_aes_192_cfb1_datatype_IPv4_key_32_iv_32 = r"""'5D77DE04'""" + +example_mode_aes_192_cfb1_datatype_IPv6_key_32_iv_32 = r"""'513F29EF9D609D6DBD12084B5E11D796'""" + +example_mode_aes_192_cfb1_datatype_Enum8_key_32_iv_32 = r"""'6B'""" + +example_mode_aes_192_cfb1_datatype_Enum16_key_32_iv_32 = r"""'6B43'""" + +example_mode_aes_256_cfb1_datatype_bytes_key_32_iv_16 = r"""'7F'""" + +example_mode_aes_256_cfb1_datatype_emptystring_key_32_iv_16 = r"""''""" + +example_mode_aes_256_cfb1_datatype_utf8string_key_32_iv_16 = r"""'2E1863FFF5FEC47DBB3F50BCC912976E2777442C693EB1B5'""" + +example_mode_aes_256_cfb1_datatype_utf8fixedstring_key_32_iv_16 = r"""'2E1863FFF5FEC47DBB3F50BCC912976E2777442C693EB1B5'""" + +example_mode_aes_256_cfb1_datatype_String_key_32_iv_16 = r"""'5A'""" + +example_mode_aes_256_cfb1_datatype_FixedString_key_32_iv_16 = r"""'5A'""" + +example_mode_aes_256_cfb1_datatype_UInt8_key_32_iv_16 = r"""'7E'""" + +example_mode_aes_256_cfb1_datatype_UInt16_key_32_iv_16 = r"""'7EA1'""" + +example_mode_aes_256_cfb1_datatype_UInt32_key_32_iv_16 = r"""'7EA17214'""" + +example_mode_aes_256_cfb1_datatype_UInt64_key_32_iv_16 = r"""'7EA172144C6F5578'""" + +example_mode_aes_256_cfb1_datatype_Int8_key_32_iv_16 = r"""'7E'""" + +example_mode_aes_256_cfb1_datatype_Int16_key_32_iv_16 = r"""'7EA1'""" + +example_mode_aes_256_cfb1_datatype_Int32_key_32_iv_16 = r"""'7EA17214'""" + +example_mode_aes_256_cfb1_datatype_Int64_key_32_iv_16 = r"""'7EA172144C6F5578'""" + +example_mode_aes_256_cfb1_datatype_Float32_key_32_iv_16 = r"""'7F630BBA'""" + +example_mode_aes_256_cfb1_datatype_Float64_key_32_iv_16 = r"""'7F638DFAAA434E6B'""" + +example_mode_aes_256_cfb1_datatype_Decimal32_key_32_iv_16 = r"""'4F430FBA'""" + +example_mode_aes_256_cfb1_datatype_Decimal64_key_32_iv_16 = r"""'4F430FBAA3AAF884'""" + +example_mode_aes_256_cfb1_datatype_Decimal128_key_32_iv_16 = r"""'4F430FBAA3AAF8845DB7BBA7F98F49C4'""" + +example_mode_aes_256_cfb1_datatype_UUID_key_32_iv_16 = r"""'B06F4A8C3BF3A8D32D113D0D40397C8F'""" + +example_mode_aes_256_cfb1_datatype_Date_key_32_iv_16 = r"""'30CE'""" + +example_mode_aes_256_cfb1_datatype_DateTime_key_32_iv_16 = r"""'206545FA'""" + +example_mode_aes_256_cfb1_datatype_DateTime64_key_32_iv_16 = r"""'43756F28C68E3D55'""" + +example_mode_aes_256_cfb1_datatype_LowCardinality_key_32_iv_16 = r"""'5A'""" + +example_mode_aes_256_cfb1_datatype_Array_key_32_iv_16 = r"""'7EA3'""" + +example_mode_aes_256_cfb1_datatype_NULL_key_32_iv_16 = r"""'\\N'""" + +example_mode_aes_256_cfb1_datatype_IPv4_key_32_iv_16 = r"""'4526FCCF'""" + +example_mode_aes_256_cfb1_datatype_IPv6_key_32_iv_16 = r"""'4F23BDAC741DB8767CE6AE24888545A2'""" + +example_mode_aes_256_cfb1_datatype_Enum8_key_32_iv_16 = r"""'7E'""" + +example_mode_aes_256_cfb1_datatype_Enum16_key_32_iv_16 = r"""'7EA1'""" + +example_mode_aes_256_cfb1_datatype_bytes_key_64_iv_64 = r"""'DF'""" + +example_mode_aes_256_cfb1_datatype_emptystring_key_64_iv_64 = r"""''""" + +example_mode_aes_256_cfb1_datatype_utf8string_key_64_iv_64 = r"""'A72DF5A969944B55E9D33B4E5207FB80DAB5BA6787ACB19F'""" + +example_mode_aes_256_cfb1_datatype_utf8fixedstring_key_64_iv_64 = r"""'A72DF5A969944B55E9D33B4E5207FB80DAB5BA6787ACB19F'""" + +example_mode_aes_256_cfb1_datatype_String_key_64_iv_64 = r"""'E9'""" + +example_mode_aes_256_cfb1_datatype_FixedString_key_64_iv_64 = r"""'E9'""" + +example_mode_aes_256_cfb1_datatype_UInt8_key_64_iv_64 = r"""'DE'""" + +example_mode_aes_256_cfb1_datatype_UInt16_key_64_iv_64 = r"""'DEBD'""" + +example_mode_aes_256_cfb1_datatype_UInt32_key_64_iv_64 = r"""'DEBD9C91'""" + +example_mode_aes_256_cfb1_datatype_UInt64_key_64_iv_64 = r"""'DEBD9C915CAA4813'""" + +example_mode_aes_256_cfb1_datatype_Int8_key_64_iv_64 = r"""'DE'""" + +example_mode_aes_256_cfb1_datatype_Int16_key_64_iv_64 = r"""'DEBD'""" + +example_mode_aes_256_cfb1_datatype_Int32_key_64_iv_64 = r"""'DEBD9C91'""" + +example_mode_aes_256_cfb1_datatype_Int64_key_64_iv_64 = r"""'DEBD9C915CAA4813'""" + +example_mode_aes_256_cfb1_datatype_Float32_key_64_iv_64 = r"""'DF845158'""" + +example_mode_aes_256_cfb1_datatype_Float64_key_64_iv_64 = r"""'DF84903EDD435363'""" + +example_mode_aes_256_cfb1_datatype_Decimal32_key_64_iv_64 = r"""'F2FE11DD'""" + +example_mode_aes_256_cfb1_datatype_Decimal64_key_64_iv_64 = r"""'F2FE11DDDF1B0FB8'""" + +example_mode_aes_256_cfb1_datatype_Decimal128_key_64_iv_64 = r"""'F2FE11DDDF1B0FB8F5BA32A48936DF25'""" + +example_mode_aes_256_cfb1_datatype_UUID_key_64_iv_64 = r"""'580073A89DF8ED751F3E63D07B5AAE93'""" + +example_mode_aes_256_cfb1_datatype_Date_key_64_iv_64 = r"""'BCC3'""" + +example_mode_aes_256_cfb1_datatype_DateTime_key_64_iv_64 = r"""'AF6825D1'""" + +example_mode_aes_256_cfb1_datatype_DateTime64_key_64_iv_64 = r"""'FD4A027DF5DD3405'""" + +example_mode_aes_256_cfb1_datatype_LowCardinality_key_64_iv_64 = r"""'E9'""" + +example_mode_aes_256_cfb1_datatype_Array_key_64_iv_64 = r"""'DEBE'""" + +example_mode_aes_256_cfb1_datatype_NULL_key_64_iv_64 = r"""'\\N'""" + +example_mode_aes_256_cfb1_datatype_IPv4_key_64_iv_64 = r"""'FB2ABD13'""" + +example_mode_aes_256_cfb1_datatype_IPv6_key_64_iv_64 = r"""'F2B6BE1E1DC716AD0490FF91D509F72B'""" + +example_mode_aes_256_cfb1_datatype_Enum8_key_64_iv_64 = r"""'DE'""" + +example_mode_aes_256_cfb1_datatype_Enum16_key_64_iv_64 = r"""'DEBD'""" + +example_mode_aes_128_cfb8_datatype_bytes_key_16_iv_None = r"""'10'""" + +example_mode_aes_128_cfb8_datatype_emptystring_key_16_iv_None = r"""''""" + +example_mode_aes_128_cfb8_datatype_utf8string_key_16_iv_None = r"""'5716349E99199E0EF18EB43C06B54AB2F3E0C4CEA0BC11F9'""" + +example_mode_aes_128_cfb8_datatype_utf8fixedstring_key_16_iv_None = r"""'5716349E99199E0EF18EB43C06B54AB2F3E0C4CEA0BC11F9'""" + +example_mode_aes_128_cfb8_datatype_String_key_16_iv_None = r"""'21'""" + +example_mode_aes_128_cfb8_datatype_FixedString_key_16_iv_None = r"""'21'""" + +example_mode_aes_128_cfb8_datatype_UInt8_key_16_iv_None = r"""'11'""" + +example_mode_aes_128_cfb8_datatype_UInt16_key_16_iv_None = r"""'11FF'""" + +example_mode_aes_128_cfb8_datatype_UInt32_key_16_iv_None = r"""'11FF20C0'""" + +example_mode_aes_128_cfb8_datatype_UInt64_key_16_iv_None = r"""'11FF20C07A65C524'""" + +example_mode_aes_128_cfb8_datatype_Int8_key_16_iv_None = r"""'11'""" + +example_mode_aes_128_cfb8_datatype_Int16_key_16_iv_None = r"""'11FF'""" + +example_mode_aes_128_cfb8_datatype_Int32_key_16_iv_None = r"""'11FF20C0'""" + +example_mode_aes_128_cfb8_datatype_Int64_key_16_iv_None = r"""'11FF20C07A65C524'""" + +example_mode_aes_128_cfb8_datatype_Float32_key_16_iv_None = r"""'10671940'""" + +example_mode_aes_128_cfb8_datatype_Float64_key_16_iv_None = r"""'106799607DBF56DA'""" + +example_mode_aes_128_cfb8_datatype_Decimal32_key_16_iv_None = r"""'30756C94'""" + +example_mode_aes_128_cfb8_datatype_Decimal64_key_16_iv_None = r"""'30756C9417D3C023'""" + +example_mode_aes_128_cfb8_datatype_Decimal128_key_16_iv_None = r"""'30756C9417D3C023705550B7BEF872FF'""" + +example_mode_aes_128_cfb8_datatype_UUID_key_16_iv_None = r"""'F7FE50CF0647659CB0D401B5C0E259D3'""" + +example_mode_aes_128_cfb8_datatype_Date_key_16_iv_None = r"""'46EA'""" + +example_mode_aes_128_cfb8_datatype_DateTime_key_16_iv_None = r"""'5EB4905E'""" + +example_mode_aes_128_cfb8_datatype_DateTime64_key_16_iv_None = r"""'3BB70F8E64D7C6A7'""" + +example_mode_aes_128_cfb8_datatype_LowCardinality_key_16_iv_None = r"""'21'""" + +example_mode_aes_128_cfb8_datatype_Array_key_16_iv_None = r"""'11FD'""" + +example_mode_aes_128_cfb8_datatype_NULL_key_16_iv_None = r"""'\\N'""" + +example_mode_aes_128_cfb8_datatype_IPv4_key_16_iv_None = r"""'3DC2BE9E'""" + +example_mode_aes_128_cfb8_datatype_IPv6_key_16_iv_None = r"""'303ABAC6F4F380D9F077DFC79C82D1A1'""" + +example_mode_aes_128_cfb8_datatype_Enum8_key_16_iv_None = r"""'11'""" + +example_mode_aes_128_cfb8_datatype_Enum16_key_16_iv_None = r"""'11FF'""" + +example_mode_aes_192_cfb8_datatype_bytes_key_24_iv_None = r"""'07'""" + +example_mode_aes_192_cfb8_datatype_emptystring_key_24_iv_None = r"""''""" + +example_mode_aes_192_cfb8_datatype_utf8string_key_24_iv_None = r"""'40541136D8EEE5DCFC55722D8FB56ED9D4CCDF0CB104B14D'""" + +example_mode_aes_192_cfb8_datatype_utf8fixedstring_key_24_iv_None = r"""'40541136D8EEE5DCFC55722D8FB56ED9D4CCDF0CB104B14D'""" + +example_mode_aes_192_cfb8_datatype_String_key_24_iv_None = r"""'36'""" + +example_mode_aes_192_cfb8_datatype_FixedString_key_24_iv_None = r"""'36'""" + +example_mode_aes_192_cfb8_datatype_UInt8_key_24_iv_None = r"""'06'""" + +example_mode_aes_192_cfb8_datatype_UInt16_key_24_iv_None = r"""'0683'""" + +example_mode_aes_192_cfb8_datatype_UInt32_key_24_iv_None = r"""'0683139D'""" + +example_mode_aes_192_cfb8_datatype_UInt64_key_24_iv_None = r"""'0683139D83E2EFAC'""" + +example_mode_aes_192_cfb8_datatype_Int8_key_24_iv_None = r"""'06'""" + +example_mode_aes_192_cfb8_datatype_Int16_key_24_iv_None = r"""'0683'""" + +example_mode_aes_192_cfb8_datatype_Int32_key_24_iv_None = r"""'0683139D'""" + +example_mode_aes_192_cfb8_datatype_Int64_key_24_iv_None = r"""'0683139D83E2EFAC'""" + +example_mode_aes_192_cfb8_datatype_Float32_key_24_iv_None = r"""'07EDB300'""" + +example_mode_aes_192_cfb8_datatype_Float64_key_24_iv_None = r"""'07ED3359B91DEF3B'""" + +example_mode_aes_192_cfb8_datatype_Decimal32_key_24_iv_None = r"""'275947FE'""" + +example_mode_aes_192_cfb8_datatype_Decimal64_key_24_iv_None = r"""'275947FE4B3390EE'""" + +example_mode_aes_192_cfb8_datatype_Decimal128_key_24_iv_None = r"""'275947FE4B3390EE7A2541BC8E2F58D7'""" + +example_mode_aes_192_cfb8_datatype_UUID_key_24_iv_None = r"""'E0C082C032FB8ED756F9345E270A283B'""" + +example_mode_aes_192_cfb8_datatype_Date_key_24_iv_None = r"""'5109'""" + +example_mode_aes_192_cfb8_datatype_DateTime_key_24_iv_None = r"""'49713150'""" + +example_mode_aes_192_cfb8_datatype_DateTime64_key_24_iv_None = r"""'2C10FB4FEC471EF7'""" + +example_mode_aes_192_cfb8_datatype_LowCardinality_key_24_iv_None = r"""'36'""" + +example_mode_aes_192_cfb8_datatype_Array_key_24_iv_None = r"""'0681'""" + +example_mode_aes_192_cfb8_datatype_NULL_key_24_iv_None = r"""'\\N'""" + +example_mode_aes_192_cfb8_datatype_IPv4_key_24_iv_None = r"""'2A41C8F2'""" + +example_mode_aes_192_cfb8_datatype_IPv6_key_24_iv_None = r"""'271682C9379C5A46C68488DC33D0C278'""" + +example_mode_aes_192_cfb8_datatype_Enum8_key_24_iv_None = r"""'06'""" + +example_mode_aes_192_cfb8_datatype_Enum16_key_24_iv_None = r"""'0683'""" + +example_mode_aes_256_cfb8_datatype_bytes_key_32_iv_None = r"""'B0'""" + +example_mode_aes_256_cfb8_datatype_emptystring_key_32_iv_None = r"""''""" + +example_mode_aes_256_cfb8_datatype_utf8string_key_32_iv_None = r"""'F796638AA3A076EA9816324AE8A93F420280C33AA2DE4AF8'""" + +example_mode_aes_256_cfb8_datatype_utf8fixedstring_key_32_iv_None = r"""'F796638AA3A076EA9816324AE8A93F420280C33AA2DE4AF8'""" + +example_mode_aes_256_cfb8_datatype_String_key_32_iv_None = r"""'81'""" + +example_mode_aes_256_cfb8_datatype_FixedString_key_32_iv_None = r"""'81'""" + +example_mode_aes_256_cfb8_datatype_UInt8_key_32_iv_None = r"""'B1'""" + +example_mode_aes_256_cfb8_datatype_UInt16_key_32_iv_None = r"""'B15F'""" + +example_mode_aes_256_cfb8_datatype_UInt32_key_32_iv_None = r"""'B15FD91F'""" + +example_mode_aes_256_cfb8_datatype_UInt64_key_32_iv_None = r"""'B15FD91F702960CB'""" + +example_mode_aes_256_cfb8_datatype_Int8_key_32_iv_None = r"""'B1'""" + +example_mode_aes_256_cfb8_datatype_Int16_key_32_iv_None = r"""'B15F'""" + +example_mode_aes_256_cfb8_datatype_Int32_key_32_iv_None = r"""'B15FD91F'""" + +example_mode_aes_256_cfb8_datatype_Int64_key_32_iv_None = r"""'B15FD91F702960CB'""" + +example_mode_aes_256_cfb8_datatype_Float32_key_32_iv_None = r"""'B05A05BE'""" + +example_mode_aes_256_cfb8_datatype_Float64_key_32_iv_None = r"""'B05A8510DB2F16A0'""" + +example_mode_aes_256_cfb8_datatype_Decimal32_key_32_iv_None = r"""'906B5777'""" + +example_mode_aes_256_cfb8_datatype_Decimal64_key_32_iv_None = r"""'906B57771CB81F37'""" + +example_mode_aes_256_cfb8_datatype_Decimal128_key_32_iv_None = r"""'906B57771CB81F378D932AE788527DE2'""" + +example_mode_aes_256_cfb8_datatype_UUID_key_32_iv_None = r"""'57FB06BA6F4BA51D7A61D65A7827A18D'""" + +example_mode_aes_256_cfb8_datatype_Date_key_32_iv_None = r"""'E652'""" + +example_mode_aes_256_cfb8_datatype_DateTime_key_32_iv_None = r"""'FEEEADA4'""" + +example_mode_aes_256_cfb8_datatype_DateTime64_key_32_iv_None = r"""'9BB36DEF05FF5975'""" + +example_mode_aes_256_cfb8_datatype_LowCardinality_key_32_iv_None = r"""'81'""" + +example_mode_aes_256_cfb8_datatype_Array_key_32_iv_None = r"""'B15D'""" + +example_mode_aes_256_cfb8_datatype_NULL_key_32_iv_None = r"""'\\N'""" + +example_mode_aes_256_cfb8_datatype_IPv4_key_32_iv_None = r"""'9DC836F3'""" + +example_mode_aes_256_cfb8_datatype_IPv6_key_32_iv_None = r"""'90242F0083C8B0221DF3B5755EC8D99C'""" + +example_mode_aes_256_cfb8_datatype_Enum8_key_32_iv_None = r"""'B1'""" + +example_mode_aes_256_cfb8_datatype_Enum16_key_32_iv_None = r"""'B15F'""" + +example_mode_aes_128_cfb8_datatype_bytes_key_16_iv_16 = r"""'32'""" + +example_mode_aes_128_cfb8_datatype_emptystring_key_16_iv_16 = r"""''""" + +example_mode_aes_128_cfb8_datatype_utf8string_key_16_iv_16 = r"""'75BA4CC259943AF0B6E20E8FCC78C0427601F60930A5F980'""" + +example_mode_aes_128_cfb8_datatype_utf8fixedstring_key_16_iv_16 = r"""'75BA4CC259943AF0B6E20E8FCC78C0427601F60930A5F980'""" + +example_mode_aes_128_cfb8_datatype_String_key_16_iv_16 = r"""'03'""" + +example_mode_aes_128_cfb8_datatype_FixedString_key_16_iv_16 = r"""'03'""" + +example_mode_aes_128_cfb8_datatype_UInt8_key_16_iv_16 = r"""'33'""" + +example_mode_aes_128_cfb8_datatype_UInt16_key_16_iv_16 = r"""'3368'""" + +example_mode_aes_128_cfb8_datatype_UInt32_key_16_iv_16 = r"""'3368AB64'""" + +example_mode_aes_128_cfb8_datatype_UInt64_key_16_iv_16 = r"""'3368AB6421744B7E'""" + +example_mode_aes_128_cfb8_datatype_Int8_key_16_iv_16 = r"""'33'""" + +example_mode_aes_128_cfb8_datatype_Int16_key_16_iv_16 = r"""'3368'""" + +example_mode_aes_128_cfb8_datatype_Int32_key_16_iv_16 = r"""'3368AB64'""" + +example_mode_aes_128_cfb8_datatype_Int64_key_16_iv_16 = r"""'3368AB6421744B7E'""" + +example_mode_aes_128_cfb8_datatype_Float32_key_16_iv_16 = r"""'3232B23D'""" + +example_mode_aes_128_cfb8_datatype_Float64_key_16_iv_16 = r"""'323232323232C2A6'""" + +example_mode_aes_128_cfb8_datatype_Decimal32_key_16_iv_16 = r"""'12ABA873'""" + +example_mode_aes_128_cfb8_datatype_Decimal64_key_16_iv_16 = r"""'12ABA873E2E24473'""" + +example_mode_aes_128_cfb8_datatype_Decimal128_key_16_iv_16 = r"""'12ABA873E2E24473166434D82270A19C'""" + +example_mode_aes_128_cfb8_datatype_UUID_key_16_iv_16 = r"""'D529D970A38CCB794F856E4458D0E2D4'""" + +example_mode_aes_128_cfb8_datatype_Date_key_16_iv_16 = r"""'6445'""" + +example_mode_aes_128_cfb8_datatype_DateTime_key_16_iv_16 = r"""'7CBF2FDA'""" + +example_mode_aes_128_cfb8_datatype_DateTime64_key_16_iv_16 = r"""'191C7B5A063F562D'""" + +example_mode_aes_128_cfb8_datatype_LowCardinality_key_16_iv_16 = r"""'03'""" + +example_mode_aes_128_cfb8_datatype_Array_key_16_iv_16 = r"""'336A'""" + +example_mode_aes_128_cfb8_datatype_NULL_key_16_iv_16 = r"""'\\N'""" + +example_mode_aes_128_cfb8_datatype_IPv4_key_16_iv_16 = r"""'1F0A367A'""" + +example_mode_aes_128_cfb8_datatype_IPv6_key_16_iv_16 = r"""'12E4B19D97DC9F2C61A671C51B1201D2'""" + +example_mode_aes_128_cfb8_datatype_Enum8_key_16_iv_16 = r"""'33'""" + +example_mode_aes_128_cfb8_datatype_Enum16_key_16_iv_16 = r"""'3368'""" + +example_mode_aes_128_cfb8_datatype_bytes_key_24_iv_24 = r"""'5B'""" + +example_mode_aes_128_cfb8_datatype_emptystring_key_24_iv_24 = r"""''""" + +example_mode_aes_128_cfb8_datatype_utf8string_key_24_iv_24 = r"""'1CE086607CFD8523D699E2588307E8F47EB1C6DB33141C6A'""" + +example_mode_aes_128_cfb8_datatype_utf8fixedstring_key_24_iv_24 = r"""'1CE086607CFD8523D699E2588307E8F47EB1C6DB33141C6A'""" + +example_mode_aes_128_cfb8_datatype_String_key_24_iv_24 = r"""'6A'""" + +example_mode_aes_128_cfb8_datatype_FixedString_key_24_iv_24 = r"""'6A'""" + +example_mode_aes_128_cfb8_datatype_UInt8_key_24_iv_24 = r"""'5A'""" + +example_mode_aes_128_cfb8_datatype_UInt16_key_24_iv_24 = r"""'5A37'""" + +example_mode_aes_128_cfb8_datatype_UInt32_key_24_iv_24 = r"""'5A37BD02'""" + +example_mode_aes_128_cfb8_datatype_UInt64_key_24_iv_24 = r"""'5A37BD02ECFA56DB'""" + +example_mode_aes_128_cfb8_datatype_Int8_key_24_iv_24 = r"""'5A'""" + +example_mode_aes_128_cfb8_datatype_Int16_key_24_iv_24 = r"""'5A37'""" + +example_mode_aes_128_cfb8_datatype_Int32_key_24_iv_24 = r"""'5A37BD02'""" + +example_mode_aes_128_cfb8_datatype_Int64_key_24_iv_24 = r"""'5A37BD02ECFA56DB'""" + +example_mode_aes_128_cfb8_datatype_Float32_key_24_iv_24 = r"""'5BC333D3'""" + +example_mode_aes_128_cfb8_datatype_Float64_key_24_iv_24 = r"""'5BC3B3495464BBE8'""" + +example_mode_aes_128_cfb8_datatype_Decimal32_key_24_iv_24 = r"""'7BE3C6D3'""" + +example_mode_aes_128_cfb8_datatype_Decimal64_key_24_iv_24 = r"""'7BE3C6D356A31F6E'""" + +example_mode_aes_128_cfb8_datatype_Decimal128_key_24_iv_24 = r"""'7BE3C6D356A31F6E1A17102C88C40C85'""" + +example_mode_aes_128_cfb8_datatype_UUID_key_24_iv_24 = r"""'BC30ED9E33095BED0825C18860C622AC'""" + +example_mode_aes_128_cfb8_datatype_Date_key_24_iv_24 = r"""'0D03'""" + +example_mode_aes_128_cfb8_datatype_DateTime_key_24_iv_24 = r"""'15F76197'""" + +example_mode_aes_128_cfb8_datatype_DateTime64_key_24_iv_24 = r"""'7035C3E2D0F5F702'""" + +example_mode_aes_128_cfb8_datatype_LowCardinality_key_24_iv_24 = r"""'6A'""" + +example_mode_aes_128_cfb8_datatype_Array_key_24_iv_24 = r"""'5A35'""" + +example_mode_aes_128_cfb8_datatype_NULL_key_24_iv_24 = r"""'\\N'""" + +example_mode_aes_128_cfb8_datatype_IPv4_key_24_iv_24 = r"""'769533D5'""" + +example_mode_aes_128_cfb8_datatype_IPv6_key_24_iv_24 = r"""'7BAC6FE32B92AB3A07AA8D90F0E175BA'""" + +example_mode_aes_128_cfb8_datatype_Enum8_key_24_iv_24 = r"""'5A'""" + +example_mode_aes_128_cfb8_datatype_Enum16_key_24_iv_24 = r"""'5A37'""" + +example_mode_aes_192_cfb8_datatype_bytes_key_24_iv_16 = r"""'68'""" + +example_mode_aes_192_cfb8_datatype_emptystring_key_24_iv_16 = r"""''""" + +example_mode_aes_192_cfb8_datatype_utf8string_key_24_iv_16 = r"""'2F48574D4D12E6B2C1EF1B43346E437333FFD386067A9398'""" + +example_mode_aes_192_cfb8_datatype_utf8fixedstring_key_24_iv_16 = r"""'2F48574D4D12E6B2C1EF1B43346E437333FFD386067A9398'""" + +example_mode_aes_192_cfb8_datatype_String_key_24_iv_16 = r"""'59'""" + +example_mode_aes_192_cfb8_datatype_FixedString_key_24_iv_16 = r"""'59'""" + +example_mode_aes_192_cfb8_datatype_UInt8_key_24_iv_16 = r"""'69'""" + +example_mode_aes_192_cfb8_datatype_UInt16_key_24_iv_16 = r"""'6924'""" + +example_mode_aes_192_cfb8_datatype_UInt32_key_24_iv_16 = r"""'6924A086'""" + +example_mode_aes_192_cfb8_datatype_UInt64_key_24_iv_16 = r"""'6924A086F8F61C3C'""" + +example_mode_aes_192_cfb8_datatype_Int8_key_24_iv_16 = r"""'69'""" + +example_mode_aes_192_cfb8_datatype_Int16_key_24_iv_16 = r"""'6924'""" + +example_mode_aes_192_cfb8_datatype_Int32_key_24_iv_16 = r"""'6924A086'""" + +example_mode_aes_192_cfb8_datatype_Int64_key_24_iv_16 = r"""'6924A086F8F61C3C'""" + +example_mode_aes_192_cfb8_datatype_Float32_key_24_iv_16 = r"""'6861DF7A'""" + +example_mode_aes_192_cfb8_datatype_Float64_key_24_iv_16 = r"""'68615FBC184B8D50'""" + +example_mode_aes_192_cfb8_datatype_Decimal32_key_24_iv_16 = r"""'48041B5C'""" + +example_mode_aes_192_cfb8_datatype_Decimal64_key_24_iv_16 = r"""'48041B5C6BEF70DD'""" + +example_mode_aes_192_cfb8_datatype_Decimal128_key_24_iv_16 = r"""'48041B5C6BEF70DD4CDABC1FC8C2C684'""" + +example_mode_aes_192_cfb8_datatype_UUID_key_24_iv_16 = r"""'8FF1142976A9808C0F475A3D2A34D06D'""" + +example_mode_aes_192_cfb8_datatype_Date_key_24_iv_16 = r"""'3E6D'""" + +example_mode_aes_192_cfb8_datatype_DateTime_key_24_iv_16 = r"""'269AFDC7'""" + +example_mode_aes_192_cfb8_datatype_DateTime64_key_24_iv_16 = r"""'4350703E05F43A50'""" + +example_mode_aes_192_cfb8_datatype_LowCardinality_key_24_iv_16 = r"""'59'""" + +example_mode_aes_192_cfb8_datatype_Array_key_24_iv_16 = r"""'6926'""" + +example_mode_aes_192_cfb8_datatype_NULL_key_24_iv_16 = r"""'\\N'""" + +example_mode_aes_192_cfb8_datatype_IPv4_key_24_iv_16 = r"""'45979A4C'""" + +example_mode_aes_192_cfb8_datatype_IPv6_key_24_iv_16 = r"""'484BFA49756D837181B7EE03EBCF2B79'""" + +example_mode_aes_192_cfb8_datatype_Enum8_key_24_iv_16 = r"""'69'""" + +example_mode_aes_192_cfb8_datatype_Enum16_key_24_iv_16 = r"""'6924'""" + +example_mode_aes_192_cfb8_datatype_bytes_key_32_iv_32 = r"""'31'""" + +example_mode_aes_192_cfb8_datatype_emptystring_key_32_iv_32 = r"""''""" + +example_mode_aes_192_cfb8_datatype_utf8string_key_32_iv_32 = r"""'7625D50FBB8F39E353302002F643A769A00CA77A81D316AB'""" + +example_mode_aes_192_cfb8_datatype_utf8fixedstring_key_32_iv_32 = r"""'7625D50FBB8F39E353302002F643A769A00CA77A81D316AB'""" + +example_mode_aes_192_cfb8_datatype_String_key_32_iv_32 = r"""'00'""" + +example_mode_aes_192_cfb8_datatype_FixedString_key_32_iv_32 = r"""'00'""" + +example_mode_aes_192_cfb8_datatype_UInt8_key_32_iv_32 = r"""'30'""" + +example_mode_aes_192_cfb8_datatype_UInt16_key_32_iv_32 = r"""'3032'""" + +example_mode_aes_192_cfb8_datatype_UInt32_key_32_iv_32 = r"""'30325F8E'""" + +example_mode_aes_192_cfb8_datatype_UInt64_key_32_iv_32 = r"""'30325F8E9BE4C241'""" + +example_mode_aes_192_cfb8_datatype_Int8_key_32_iv_32 = r"""'30'""" + +example_mode_aes_192_cfb8_datatype_Int16_key_32_iv_32 = r"""'3032'""" + +example_mode_aes_192_cfb8_datatype_Int32_key_32_iv_32 = r"""'30325F8E'""" + +example_mode_aes_192_cfb8_datatype_Int64_key_32_iv_32 = r"""'30325F8E9BE4C241'""" + +example_mode_aes_192_cfb8_datatype_Float32_key_32_iv_32 = r"""'3132C141'""" + +example_mode_aes_192_cfb8_datatype_Float64_key_32_iv_32 = r"""'3132410E0E8B4763'""" + +example_mode_aes_192_cfb8_datatype_Decimal32_key_32_iv_32 = r"""'1143551C'""" + +example_mode_aes_192_cfb8_datatype_Decimal64_key_32_iv_32 = r"""'1143551CF390615B'""" + +example_mode_aes_192_cfb8_datatype_Decimal128_key_32_iv_32 = r"""'1143551CF390615BB25617FAD1010676'""" + +example_mode_aes_192_cfb8_datatype_UUID_key_32_iv_32 = r"""'D63F190E24A3EF3805EF4E394CD5C620'""" + +example_mode_aes_192_cfb8_datatype_Date_key_32_iv_32 = r"""'67FC'""" + +example_mode_aes_192_cfb8_datatype_DateTime_key_32_iv_32 = r"""'7FDB8ABC'""" + +example_mode_aes_192_cfb8_datatype_DateTime64_key_32_iv_32 = r"""'1A304FE168BFC721'""" + +example_mode_aes_192_cfb8_datatype_LowCardinality_key_32_iv_32 = r"""'00'""" + +example_mode_aes_192_cfb8_datatype_Array_key_32_iv_32 = r"""'3030'""" + +example_mode_aes_192_cfb8_datatype_NULL_key_32_iv_32 = r"""'\\N'""" + +example_mode_aes_192_cfb8_datatype_IPv4_key_32_iv_32 = r"""'1CE26C68'""" + +example_mode_aes_192_cfb8_datatype_IPv6_key_32_iv_32 = r"""'110CAE7AAE3AF3436C8D155FD4DFACB9'""" + +example_mode_aes_192_cfb8_datatype_Enum8_key_32_iv_32 = r"""'30'""" + +example_mode_aes_192_cfb8_datatype_Enum16_key_32_iv_32 = r"""'3032'""" + +example_mode_aes_256_cfb8_datatype_bytes_key_32_iv_16 = r"""'69'""" + +example_mode_aes_256_cfb8_datatype_emptystring_key_32_iv_16 = r"""''""" + +example_mode_aes_256_cfb8_datatype_utf8string_key_32_iv_16 = r"""'2E79EE96B485FC5BF3BE56AD461AAC2B1CCB425F51679553'""" + +example_mode_aes_256_cfb8_datatype_utf8fixedstring_key_32_iv_16 = r"""'2E79EE96B485FC5BF3BE56AD461AAC2B1CCB425F51679553'""" + +example_mode_aes_256_cfb8_datatype_String_key_32_iv_16 = r"""'58'""" + +example_mode_aes_256_cfb8_datatype_FixedString_key_32_iv_16 = r"""'58'""" + +example_mode_aes_256_cfb8_datatype_UInt8_key_32_iv_16 = r"""'68'""" + +example_mode_aes_256_cfb8_datatype_UInt16_key_32_iv_16 = r"""'682C'""" + +example_mode_aes_256_cfb8_datatype_UInt32_key_32_iv_16 = r"""'682CE0A9'""" + +example_mode_aes_256_cfb8_datatype_UInt64_key_32_iv_16 = r"""'682CE0A9FFAF55AE'""" + +example_mode_aes_256_cfb8_datatype_Int8_key_32_iv_16 = r"""'68'""" + +example_mode_aes_256_cfb8_datatype_Int16_key_32_iv_16 = r"""'682C'""" + +example_mode_aes_256_cfb8_datatype_Int32_key_32_iv_16 = r"""'682CE0A9'""" + +example_mode_aes_256_cfb8_datatype_Int64_key_32_iv_16 = r"""'682CE0A9FFAF55AE'""" + +example_mode_aes_256_cfb8_datatype_Float32_key_32_iv_16 = r"""'69B127F9'""" + +example_mode_aes_256_cfb8_datatype_Float64_key_32_iv_16 = r"""'69B1A72CB81A0FFF'""" + +example_mode_aes_256_cfb8_datatype_Decimal32_key_32_iv_16 = r"""'49378750'""" + +example_mode_aes_256_cfb8_datatype_Decimal64_key_32_iv_16 = r"""'493787505DFF5606'""" + +example_mode_aes_256_cfb8_datatype_Decimal128_key_32_iv_16 = r"""'493787505DFF5606774649C631E6E0E7'""" + +example_mode_aes_256_cfb8_datatype_UUID_key_32_iv_16 = r"""'8E09A60AA21565C888B2D92942896930'""" + +example_mode_aes_256_cfb8_datatype_Date_key_32_iv_16 = r"""'3FF1'""" + +example_mode_aes_256_cfb8_datatype_DateTime_key_32_iv_16 = r"""'274E13D8'""" + +example_mode_aes_256_cfb8_datatype_DateTime64_key_32_iv_16 = r"""'4211DFF611769F37'""" + +example_mode_aes_256_cfb8_datatype_LowCardinality_key_32_iv_16 = r"""'58'""" + +example_mode_aes_256_cfb8_datatype_Array_key_32_iv_16 = r"""'682E'""" + +example_mode_aes_256_cfb8_datatype_NULL_key_32_iv_16 = r"""'\\N'""" + +example_mode_aes_256_cfb8_datatype_IPv4_key_32_iv_16 = r"""'442DB771'""" + +example_mode_aes_256_cfb8_datatype_IPv6_key_32_iv_16 = r"""'4978AF3EED91F4AD14F7C326CCD96804'""" + +example_mode_aes_256_cfb8_datatype_Enum8_key_32_iv_16 = r"""'68'""" + +example_mode_aes_256_cfb8_datatype_Enum16_key_32_iv_16 = r"""'682C'""" + +example_mode_aes_256_cfb8_datatype_bytes_key_64_iv_64 = r"""'D3'""" + +example_mode_aes_256_cfb8_datatype_emptystring_key_64_iv_64 = r"""''""" + +example_mode_aes_256_cfb8_datatype_utf8string_key_64_iv_64 = r"""'94336E21D7AF28FAA2179962917236281AB6CA2EB17A5F52'""" + +example_mode_aes_256_cfb8_datatype_utf8fixedstring_key_64_iv_64 = r"""'94336E21D7AF28FAA2179962917236281AB6CA2EB17A5F52'""" + +example_mode_aes_256_cfb8_datatype_String_key_64_iv_64 = r"""'E2'""" + +example_mode_aes_256_cfb8_datatype_FixedString_key_64_iv_64 = r"""'E2'""" + +example_mode_aes_256_cfb8_datatype_UInt8_key_64_iv_64 = r"""'D2'""" + +example_mode_aes_256_cfb8_datatype_UInt16_key_64_iv_64 = r"""'D2F0'""" + +example_mode_aes_256_cfb8_datatype_UInt32_key_64_iv_64 = r"""'D2F009AE'""" + +example_mode_aes_256_cfb8_datatype_UInt64_key_64_iv_64 = r"""'D2F009AE234CE3B2'""" + +example_mode_aes_256_cfb8_datatype_Int8_key_64_iv_64 = r"""'D2'""" + +example_mode_aes_256_cfb8_datatype_Int16_key_64_iv_64 = r"""'D2F0'""" + +example_mode_aes_256_cfb8_datatype_Int32_key_64_iv_64 = r"""'D2F009AE'""" + +example_mode_aes_256_cfb8_datatype_Int64_key_64_iv_64 = r"""'D2F009AE234CE3B2'""" + +example_mode_aes_256_cfb8_datatype_Float32_key_64_iv_64 = r"""'D323A6EE'""" + +example_mode_aes_256_cfb8_datatype_Float64_key_64_iv_64 = r"""'D32326952E7D73B6'""" + +example_mode_aes_256_cfb8_datatype_Decimal32_key_64_iv_64 = r"""'F3600DB1'""" + +example_mode_aes_256_cfb8_datatype_Decimal64_key_64_iv_64 = r"""'F3600DB150D7A5EF'""" + +example_mode_aes_256_cfb8_datatype_Decimal128_key_64_iv_64 = r"""'F3600DB150D7A5EFA1934028A5BDD856'""" + +example_mode_aes_256_cfb8_datatype_UUID_key_64_iv_64 = r"""'34B0729B2D7A5D08043DBF031FE464BC'""" + +example_mode_aes_256_cfb8_datatype_Date_key_64_iv_64 = r"""'85A9'""" + +example_mode_aes_256_cfb8_datatype_DateTime_key_64_iv_64 = r"""'9D298352'""" + +example_mode_aes_256_cfb8_datatype_DateTime64_key_64_iv_64 = r"""'F8BC2B190E2139CC'""" + +example_mode_aes_256_cfb8_datatype_LowCardinality_key_64_iv_64 = r"""'E2'""" + +example_mode_aes_256_cfb8_datatype_Array_key_64_iv_64 = r"""'D2F2'""" + +example_mode_aes_256_cfb8_datatype_NULL_key_64_iv_64 = r"""'\\N'""" + +example_mode_aes_256_cfb8_datatype_IPv4_key_64_iv_64 = r"""'FEEA2143'""" + +example_mode_aes_256_cfb8_datatype_IPv6_key_64_iv_64 = r"""'F32F6C4967EF6EFF9975263D9074D4E1'""" + +example_mode_aes_256_cfb8_datatype_Enum8_key_64_iv_64 = r"""'D2'""" + +example_mode_aes_256_cfb8_datatype_Enum16_key_64_iv_64 = r"""'D2F0'""" + +example_mode_aes_128_cfb128_datatype_bytes_key_16_iv_None = r"""'10'""" + +example_mode_aes_128_cfb128_datatype_emptystring_key_16_iv_None = r"""''""" + +example_mode_aes_128_cfb128_datatype_utf8string_key_16_iv_None = r"""'571C627072083ECFD8460B39C4132D1B2802275B5B24EF73'""" + +example_mode_aes_128_cfb128_datatype_utf8fixedstring_key_16_iv_None = r"""'571C627072083ECFD8460B39C4132D1B2802275B5B24EF73'""" + +example_mode_aes_128_cfb128_datatype_String_key_16_iv_None = r"""'21'""" + +example_mode_aes_128_cfb128_datatype_FixedString_key_16_iv_None = r"""'21'""" + +example_mode_aes_128_cfb128_datatype_UInt8_key_16_iv_None = r"""'11'""" + +example_mode_aes_128_cfb128_datatype_UInt16_key_16_iv_None = r"""'11DF'""" + +example_mode_aes_128_cfb128_datatype_UInt32_key_16_iv_None = r"""'11DFC1B5'""" + +example_mode_aes_128_cfb128_datatype_UInt64_key_16_iv_None = r"""'11DFC1B5F66CFD6A'""" + +example_mode_aes_128_cfb128_datatype_Int8_key_16_iv_None = r"""'11'""" + +example_mode_aes_128_cfb128_datatype_Int16_key_16_iv_None = r"""'11DF'""" + +example_mode_aes_128_cfb128_datatype_Int32_key_16_iv_None = r"""'11DFC1B5'""" + +example_mode_aes_128_cfb128_datatype_Int64_key_16_iv_None = r"""'11DFC1B5F66CFD6A'""" + +example_mode_aes_128_cfb128_datatype_Float32_key_16_iv_None = r"""'10DF418A'""" + +example_mode_aes_128_cfb128_datatype_Float64_key_16_iv_None = r"""'10DFC1B5F66C0D55'""" + +example_mode_aes_128_cfb128_datatype_Decimal32_key_16_iv_None = r"""'3091C1B5'""" + +example_mode_aes_128_cfb128_datatype_Decimal64_key_16_iv_None = r"""'3091C1B5F66CFD6A'""" + +example_mode_aes_128_cfb128_datatype_Decimal128_key_16_iv_None = r"""'3091C1B5F66CFD6A1DC46D66907BEEB1'""" + +example_mode_aes_128_cfb128_datatype_UUID_key_16_iv_None = r"""'F7CE72E9F2A80D0BBD1FBE0C90DD9521'""" + +example_mode_aes_128_cfb128_datatype_Date_key_16_iv_None = r"""'4698'""" + +example_mode_aes_128_cfb128_datatype_DateTime_key_16_iv_None = r"""'5E0FCDEB'""" + +example_mode_aes_128_cfb128_datatype_DateTime64_key_16_iv_None = r"""'3B6ECCD7996DFD6A'""" + +example_mode_aes_128_cfb128_datatype_LowCardinality_key_16_iv_None = r"""'21'""" + +example_mode_aes_128_cfb128_datatype_Array_key_16_iv_None = r"""'11DD'""" + +example_mode_aes_128_cfb128_datatype_NULL_key_16_iv_None = r"""'\\N'""" + +example_mode_aes_128_cfb128_datatype_IPv4_key_16_iv_None = r"""'3D5D201E'""" + +example_mode_aes_128_cfb128_datatype_IPv6_key_16_iv_None = r"""'30DECC0DF66C78C91DC46D663C646EB0'""" + +example_mode_aes_128_cfb128_datatype_Enum8_key_16_iv_None = r"""'11'""" + +example_mode_aes_128_cfb128_datatype_Enum16_key_16_iv_None = r"""'11DF'""" + +example_mode_aes_192_cfb128_datatype_bytes_key_24_iv_None = r"""'07'""" + +example_mode_aes_192_cfb128_datatype_emptystring_key_24_iv_None = r"""''""" + +example_mode_aes_192_cfb128_datatype_utf8string_key_24_iv_None = r"""'4074BA58B958623BE94C3FCF833DDDD9AC9F875CC2784719'""" + +example_mode_aes_192_cfb128_datatype_utf8fixedstring_key_24_iv_None = r"""'4074BA58B958623BE94C3FCF833DDDD9AC9F875CC2784719'""" + +example_mode_aes_192_cfb128_datatype_String_key_24_iv_None = r"""'36'""" + +example_mode_aes_192_cfb128_datatype_FixedString_key_24_iv_None = r"""'36'""" + +example_mode_aes_192_cfb128_datatype_UInt8_key_24_iv_None = r"""'06'""" + +example_mode_aes_192_cfb128_datatype_UInt16_key_24_iv_None = r"""'06B7'""" + +example_mode_aes_192_cfb128_datatype_UInt32_key_24_iv_None = r"""'06B7199D'""" + +example_mode_aes_192_cfb128_datatype_UInt64_key_24_iv_None = r"""'06B7199D3D3CA19E'""" + +example_mode_aes_192_cfb128_datatype_Int8_key_24_iv_None = r"""'06'""" + +example_mode_aes_192_cfb128_datatype_Int16_key_24_iv_None = r"""'06B7'""" + +example_mode_aes_192_cfb128_datatype_Int32_key_24_iv_None = r"""'06B7199D'""" + +example_mode_aes_192_cfb128_datatype_Int64_key_24_iv_None = r"""'06B7199D3D3CA19E'""" + +example_mode_aes_192_cfb128_datatype_Float32_key_24_iv_None = r"""'07B799A2'""" + +example_mode_aes_192_cfb128_datatype_Float64_key_24_iv_None = r"""'07B7199D3D3C51A1'""" + +example_mode_aes_192_cfb128_datatype_Decimal32_key_24_iv_None = r"""'27F9199D'""" + +example_mode_aes_192_cfb128_datatype_Decimal64_key_24_iv_None = r"""'27F9199D3D3CA19E'""" + +example_mode_aes_192_cfb128_datatype_Decimal128_key_24_iv_None = r"""'27F9199D3D3CA19E2CCE5990D7551E73'""" + +example_mode_aes_192_cfb128_datatype_UUID_key_24_iv_None = r"""'E0A6AAC139F851FF8C158AFAD7F365E3'""" + +example_mode_aes_192_cfb128_datatype_Date_key_24_iv_None = r"""'51F0'""" + +example_mode_aes_192_cfb128_datatype_DateTime_key_24_iv_None = r"""'496715C3'""" + +example_mode_aes_192_cfb128_datatype_DateTime64_key_24_iv_None = r"""'2C0614FF523DA19E'""" + +example_mode_aes_192_cfb128_datatype_LowCardinality_key_24_iv_None = r"""'36'""" + +example_mode_aes_192_cfb128_datatype_Array_key_24_iv_None = r"""'06B5'""" + +example_mode_aes_192_cfb128_datatype_NULL_key_24_iv_None = r"""'\\N'""" + +example_mode_aes_192_cfb128_datatype_IPv4_key_24_iv_None = r"""'2A35F836'""" + +example_mode_aes_192_cfb128_datatype_IPv6_key_24_iv_None = r"""'27B614253D3C243D2CCE59907B4A9E72'""" + +example_mode_aes_192_cfb128_datatype_Enum8_key_24_iv_None = r"""'06'""" + +example_mode_aes_192_cfb128_datatype_Enum16_key_24_iv_None = r"""'06B7'""" + +example_mode_aes_256_cfb128_datatype_bytes_key_32_iv_None = r"""'B0'""" + +example_mode_aes_256_cfb128_datatype_emptystring_key_32_iv_None = r"""''""" + +example_mode_aes_256_cfb128_datatype_utf8string_key_32_iv_None = r"""'F74D6C5B438F9CA8BEFAA27A02BEAB06F5E4BB666EC25FE2'""" + +example_mode_aes_256_cfb128_datatype_utf8fixedstring_key_32_iv_None = r"""'F74D6C5B438F9CA8BEFAA27A02BEAB06F5E4BB666EC25FE2'""" + +example_mode_aes_256_cfb128_datatype_String_key_32_iv_None = r"""'81'""" + +example_mode_aes_256_cfb128_datatype_FixedString_key_32_iv_None = r"""'81'""" + +example_mode_aes_256_cfb128_datatype_UInt8_key_32_iv_None = r"""'B1'""" + +example_mode_aes_256_cfb128_datatype_UInt16_key_32_iv_None = r"""'B18E'""" + +example_mode_aes_256_cfb128_datatype_UInt32_key_32_iv_None = r"""'B18ECF9E'""" + +example_mode_aes_256_cfb128_datatype_UInt64_key_32_iv_None = r"""'B18ECF9EC7EB5F0D'""" + +example_mode_aes_256_cfb128_datatype_Int8_key_32_iv_None = r"""'B1'""" + +example_mode_aes_256_cfb128_datatype_Int16_key_32_iv_None = r"""'B18E'""" + +example_mode_aes_256_cfb128_datatype_Int32_key_32_iv_None = r"""'B18ECF9E'""" + +example_mode_aes_256_cfb128_datatype_Int64_key_32_iv_None = r"""'B18ECF9EC7EB5F0D'""" + +example_mode_aes_256_cfb128_datatype_Float32_key_32_iv_None = r"""'B08E4FA1'""" + +example_mode_aes_256_cfb128_datatype_Float64_key_32_iv_None = r"""'B08ECF9EC7EBAF32'""" + +example_mode_aes_256_cfb128_datatype_Decimal32_key_32_iv_None = r"""'90C0CF9E'""" + +example_mode_aes_256_cfb128_datatype_Decimal64_key_32_iv_None = r"""'90C0CF9EC7EB5F0D'""" + +example_mode_aes_256_cfb128_datatype_Decimal128_key_32_iv_None = r"""'90C0CF9EC7EB5F0D7B78C42556D668AC'""" + +example_mode_aes_256_cfb128_datatype_UUID_key_32_iv_None = r"""'579F7CC2C32FAF6CDBA3174F5670133C'""" + +example_mode_aes_256_cfb128_datatype_Date_key_32_iv_None = r"""'E6C9'""" + +example_mode_aes_256_cfb128_datatype_DateTime_key_32_iv_None = r"""'FE5EC3C0'""" + +example_mode_aes_256_cfb128_datatype_DateTime64_key_32_iv_None = r"""'9B3FC2FCA8EA5F0D'""" + +example_mode_aes_256_cfb128_datatype_LowCardinality_key_32_iv_None = r"""'81'""" + +example_mode_aes_256_cfb128_datatype_Array_key_32_iv_None = r"""'B18C'""" + +example_mode_aes_256_cfb128_datatype_NULL_key_32_iv_None = r"""'\\N'""" + +example_mode_aes_256_cfb128_datatype_IPv4_key_32_iv_None = r"""'9D0C2E35'""" + +example_mode_aes_256_cfb128_datatype_IPv6_key_32_iv_None = r"""'908FC226C7EBDAAE7B78C425FAC9E8AD'""" + +example_mode_aes_256_cfb128_datatype_Enum8_key_32_iv_None = r"""'B1'""" + +example_mode_aes_256_cfb128_datatype_Enum16_key_32_iv_None = r"""'B18E'""" + +example_mode_aes_128_cfb128_datatype_bytes_key_16_iv_16 = r"""'32'""" + +example_mode_aes_128_cfb128_datatype_emptystring_key_16_iv_16 = r"""''""" + +example_mode_aes_128_cfb128_datatype_utf8string_key_16_iv_16 = r"""'754B0A4159623CFD2CBB06EE8AADCCB4581E4F5FB9F091DD'""" + +example_mode_aes_128_cfb128_datatype_utf8fixedstring_key_16_iv_16 = r"""'754B0A4159623CFD2CBB06EE8AADCCB4581E4F5FB9F091DD'""" + +example_mode_aes_128_cfb128_datatype_String_key_16_iv_16 = r"""'03'""" + +example_mode_aes_128_cfb128_datatype_FixedString_key_16_iv_16 = r"""'03'""" + +example_mode_aes_128_cfb128_datatype_UInt8_key_16_iv_16 = r"""'33'""" + +example_mode_aes_128_cfb128_datatype_UInt16_key_16_iv_16 = r"""'3388'""" + +example_mode_aes_128_cfb128_datatype_UInt32_key_16_iv_16 = r"""'3388A984'""" + +example_mode_aes_128_cfb128_datatype_UInt64_key_16_iv_16 = r"""'3388A984DD06FF58'""" + +example_mode_aes_128_cfb128_datatype_Int8_key_16_iv_16 = r"""'33'""" + +example_mode_aes_128_cfb128_datatype_Int16_key_16_iv_16 = r"""'3388'""" + +example_mode_aes_128_cfb128_datatype_Int32_key_16_iv_16 = r"""'3388A984'""" + +example_mode_aes_128_cfb128_datatype_Int64_key_16_iv_16 = r"""'3388A984DD06FF58'""" + +example_mode_aes_128_cfb128_datatype_Float32_key_16_iv_16 = r"""'328829BB'""" + +example_mode_aes_128_cfb128_datatype_Float64_key_16_iv_16 = r"""'3288A984DD060F67'""" + +example_mode_aes_128_cfb128_datatype_Decimal32_key_16_iv_16 = r"""'12C6A984'""" + +example_mode_aes_128_cfb128_datatype_Decimal64_key_16_iv_16 = r"""'12C6A984DD06FF58'""" + +example_mode_aes_128_cfb128_datatype_Decimal128_key_16_iv_16 = r"""'12C6A984DD06FF58E93960B1DEC50F1E'""" + +example_mode_aes_128_cfb128_datatype_UUID_key_16_iv_16 = r"""'D5991AD8D9C20F3949E2B3DBDE63748E'""" + +example_mode_aes_128_cfb128_datatype_Date_key_16_iv_16 = r"""'64CF'""" + +example_mode_aes_128_cfb128_datatype_DateTime_key_16_iv_16 = r"""'7C58A5DA'""" + +example_mode_aes_128_cfb128_datatype_DateTime64_key_16_iv_16 = r"""'1939A4E6B207FF58'""" + +example_mode_aes_128_cfb128_datatype_LowCardinality_key_16_iv_16 = r"""'03'""" + +example_mode_aes_128_cfb128_datatype_Array_key_16_iv_16 = r"""'338A'""" + +example_mode_aes_128_cfb128_datatype_NULL_key_16_iv_16 = r"""'\\N'""" + +example_mode_aes_128_cfb128_datatype_IPv4_key_16_iv_16 = r"""'1F0A482F'""" + +example_mode_aes_128_cfb128_datatype_IPv6_key_16_iv_16 = r"""'1289A43CDD067AFBE93960B172DA8F1F'""" + +example_mode_aes_128_cfb128_datatype_Enum8_key_16_iv_16 = r"""'33'""" + +example_mode_aes_128_cfb128_datatype_Enum16_key_16_iv_16 = r"""'3388'""" + +example_mode_aes_128_cfb128_datatype_bytes_key_24_iv_24 = r"""'5B'""" + +example_mode_aes_128_cfb128_datatype_emptystring_key_24_iv_24 = r"""''""" + +example_mode_aes_128_cfb128_datatype_utf8string_key_24_iv_24 = r"""'1CB4A1306DD44E12FB99CA2398A56D5C6FFFA5BE700B5B9B'""" + +example_mode_aes_128_cfb128_datatype_utf8fixedstring_key_24_iv_24 = r"""'1CB4A1306DD44E12FB99CA2398A56D5C6FFFA5BE700B5B9B'""" + +example_mode_aes_128_cfb128_datatype_String_key_24_iv_24 = r"""'6A'""" + +example_mode_aes_128_cfb128_datatype_FixedString_key_24_iv_24 = r"""'6A'""" + +example_mode_aes_128_cfb128_datatype_UInt8_key_24_iv_24 = r"""'5A'""" + +example_mode_aes_128_cfb128_datatype_UInt16_key_24_iv_24 = r"""'5A77'""" + +example_mode_aes_128_cfb128_datatype_UInt32_key_24_iv_24 = r"""'5A7702F5'""" + +example_mode_aes_128_cfb128_datatype_UInt64_key_24_iv_24 = r"""'5A7702F5E9B08DB7'""" + +example_mode_aes_128_cfb128_datatype_Int8_key_24_iv_24 = r"""'5A'""" + +example_mode_aes_128_cfb128_datatype_Int16_key_24_iv_24 = r"""'5A77'""" + +example_mode_aes_128_cfb128_datatype_Int32_key_24_iv_24 = r"""'5A7702F5'""" + +example_mode_aes_128_cfb128_datatype_Int64_key_24_iv_24 = r"""'5A7702F5E9B08DB7'""" + +example_mode_aes_128_cfb128_datatype_Float32_key_24_iv_24 = r"""'5B7782CA'""" + +example_mode_aes_128_cfb128_datatype_Float64_key_24_iv_24 = r"""'5B7702F5E9B07D88'""" + +example_mode_aes_128_cfb128_datatype_Decimal32_key_24_iv_24 = r"""'7B3902F5'""" + +example_mode_aes_128_cfb128_datatype_Decimal64_key_24_iv_24 = r"""'7B3902F5E9B08DB7'""" + +example_mode_aes_128_cfb128_datatype_Decimal128_key_24_iv_24 = r"""'7B3902F5E9B08DB73E1BAC7CCCCDAEF6'""" + +example_mode_aes_128_cfb128_datatype_UUID_key_24_iv_24 = r"""'BC66B1A9ED747DD69EC07F16CC6BD566'""" + +example_mode_aes_128_cfb128_datatype_Date_key_24_iv_24 = r"""'0D30'""" + +example_mode_aes_128_cfb128_datatype_DateTime_key_24_iv_24 = r"""'15A70EAB'""" + +example_mode_aes_128_cfb128_datatype_DateTime64_key_24_iv_24 = r"""'70C60F9786B18DB7'""" + +example_mode_aes_128_cfb128_datatype_LowCardinality_key_24_iv_24 = r"""'6A'""" + +example_mode_aes_128_cfb128_datatype_Array_key_24_iv_24 = r"""'5A75'""" + +example_mode_aes_128_cfb128_datatype_NULL_key_24_iv_24 = r"""'\\N'""" + +example_mode_aes_128_cfb128_datatype_IPv4_key_24_iv_24 = r"""'76F5E35E'""" + +example_mode_aes_128_cfb128_datatype_IPv6_key_24_iv_24 = r"""'7B760F4DE9B008143E1BAC7C60D22EF7'""" + +example_mode_aes_128_cfb128_datatype_Enum8_key_24_iv_24 = r"""'5A'""" + +example_mode_aes_128_cfb128_datatype_Enum16_key_24_iv_24 = r"""'5A77'""" + +example_mode_aes_192_cfb128_datatype_bytes_key_24_iv_16 = r"""'68'""" + +example_mode_aes_192_cfb128_datatype_emptystring_key_24_iv_16 = r"""''""" + +example_mode_aes_192_cfb128_datatype_utf8string_key_24_iv_16 = r"""'2F0444573374B41441C46351EBB0A21FD2D5B29B19D817D8'""" + +example_mode_aes_192_cfb128_datatype_utf8fixedstring_key_24_iv_16 = r"""'2F0444573374B41441C46351EBB0A21FD2D5B29B19D817D8'""" + +example_mode_aes_192_cfb128_datatype_String_key_24_iv_16 = r"""'59'""" + +example_mode_aes_192_cfb128_datatype_FixedString_key_24_iv_16 = r"""'59'""" + +example_mode_aes_192_cfb128_datatype_UInt8_key_24_iv_16 = r"""'69'""" + +example_mode_aes_192_cfb128_datatype_UInt16_key_24_iv_16 = r"""'69C7'""" + +example_mode_aes_192_cfb128_datatype_UInt32_key_24_iv_16 = r"""'69C7E792'""" + +example_mode_aes_192_cfb128_datatype_UInt64_key_24_iv_16 = r"""'69C7E792B71077B1'""" + +example_mode_aes_192_cfb128_datatype_Int8_key_24_iv_16 = r"""'69'""" + +example_mode_aes_192_cfb128_datatype_Int16_key_24_iv_16 = r"""'69C7'""" + +example_mode_aes_192_cfb128_datatype_Int32_key_24_iv_16 = r"""'69C7E792'""" + +example_mode_aes_192_cfb128_datatype_Int64_key_24_iv_16 = r"""'69C7E792B71077B1'""" + +example_mode_aes_192_cfb128_datatype_Float32_key_24_iv_16 = r"""'68C767AD'""" + +example_mode_aes_192_cfb128_datatype_Float64_key_24_iv_16 = r"""'68C7E792B710878E'""" + +example_mode_aes_192_cfb128_datatype_Decimal32_key_24_iv_16 = r"""'4889E792'""" + +example_mode_aes_192_cfb128_datatype_Decimal64_key_24_iv_16 = r"""'4889E792B71077B1'""" + +example_mode_aes_192_cfb128_datatype_Decimal128_key_24_iv_16 = r"""'4889E792B71077B18446050EBFD861B5'""" + +example_mode_aes_192_cfb128_datatype_UUID_key_24_iv_16 = r"""'8FD654CEB3D487D0249DD664BF7E1A25'""" + +example_mode_aes_192_cfb128_datatype_Date_key_24_iv_16 = r"""'3E80'""" + +example_mode_aes_192_cfb128_datatype_DateTime_key_24_iv_16 = r"""'2617EBCC'""" + +example_mode_aes_192_cfb128_datatype_DateTime64_key_24_iv_16 = r"""'4376EAF0D81177B1'""" + +example_mode_aes_192_cfb128_datatype_LowCardinality_key_24_iv_16 = r"""'59'""" + +example_mode_aes_192_cfb128_datatype_Array_key_24_iv_16 = r"""'69C5'""" + +example_mode_aes_192_cfb128_datatype_NULL_key_24_iv_16 = r"""'\\N'""" + +example_mode_aes_192_cfb128_datatype_IPv4_key_24_iv_16 = r"""'45450639'""" + +example_mode_aes_192_cfb128_datatype_IPv6_key_24_iv_16 = r"""'48C6EA2AB710F2128446050E13C7E1B4'""" + +example_mode_aes_192_cfb128_datatype_Enum8_key_24_iv_16 = r"""'69'""" + +example_mode_aes_192_cfb128_datatype_Enum16_key_24_iv_16 = r"""'69C7'""" + +example_mode_aes_192_cfb128_datatype_bytes_key_32_iv_32 = r"""'31'""" + +example_mode_aes_192_cfb128_datatype_emptystring_key_32_iv_32 = r"""''""" + +example_mode_aes_192_cfb128_datatype_utf8string_key_32_iv_32 = r"""'76632DB12BCFF36187A90B6990CFA6D8D9CFB425308D13E0'""" + +example_mode_aes_192_cfb128_datatype_utf8fixedstring_key_32_iv_32 = r"""'76632DB12BCFF36187A90B6990CFA6D8D9CFB425308D13E0'""" + +example_mode_aes_192_cfb128_datatype_String_key_32_iv_32 = r"""'00'""" + +example_mode_aes_192_cfb128_datatype_FixedString_key_32_iv_32 = r"""'00'""" + +example_mode_aes_192_cfb128_datatype_UInt8_key_32_iv_32 = r"""'30'""" + +example_mode_aes_192_cfb128_datatype_UInt16_key_32_iv_32 = r"""'30A0'""" + +example_mode_aes_192_cfb128_datatype_UInt32_key_32_iv_32 = r"""'30A08E74'""" + +example_mode_aes_192_cfb128_datatype_UInt64_key_32_iv_32 = r"""'30A08E74AFAB30C4'""" + +example_mode_aes_192_cfb128_datatype_Int8_key_32_iv_32 = r"""'30'""" + +example_mode_aes_192_cfb128_datatype_Int16_key_32_iv_32 = r"""'30A0'""" + +example_mode_aes_192_cfb128_datatype_Int32_key_32_iv_32 = r"""'30A08E74'""" + +example_mode_aes_192_cfb128_datatype_Int64_key_32_iv_32 = r"""'30A08E74AFAB30C4'""" + +example_mode_aes_192_cfb128_datatype_Float32_key_32_iv_32 = r"""'31A00E4B'""" + +example_mode_aes_192_cfb128_datatype_Float64_key_32_iv_32 = r"""'31A08E74AFABC0FB'""" + +example_mode_aes_192_cfb128_datatype_Decimal32_key_32_iv_32 = r"""'11EE8E74'""" + +example_mode_aes_192_cfb128_datatype_Decimal64_key_32_iv_32 = r"""'11EE8E74AFAB30C4'""" + +example_mode_aes_192_cfb128_datatype_Decimal128_key_32_iv_32 = r"""'11EE8E74AFAB30C4422B6D36C4A76572'""" + +example_mode_aes_192_cfb128_datatype_UUID_key_32_iv_32 = r"""'D6B13D28AB6FC0A5E2F0BE5CC4011EE2'""" + +example_mode_aes_192_cfb128_datatype_Date_key_32_iv_32 = r"""'67E7'""" + +example_mode_aes_192_cfb128_datatype_DateTime_key_32_iv_32 = r"""'7F70822A'""" + +example_mode_aes_192_cfb128_datatype_DateTime64_key_32_iv_32 = r"""'1A118316C0AA30C4'""" + +example_mode_aes_192_cfb128_datatype_LowCardinality_key_32_iv_32 = r"""'00'""" + +example_mode_aes_192_cfb128_datatype_Array_key_32_iv_32 = r"""'30A2'""" + +example_mode_aes_192_cfb128_datatype_NULL_key_32_iv_32 = r"""'\\N'""" + +example_mode_aes_192_cfb128_datatype_IPv4_key_32_iv_32 = r"""'1C226FDF'""" + +example_mode_aes_192_cfb128_datatype_IPv6_key_32_iv_32 = r"""'11A183CCAFABB567422B6D3668B8E573'""" + +example_mode_aes_192_cfb128_datatype_Enum8_key_32_iv_32 = r"""'30'""" + +example_mode_aes_192_cfb128_datatype_Enum16_key_32_iv_32 = r"""'30A0'""" + +example_mode_aes_256_cfb128_datatype_bytes_key_32_iv_16 = r"""'69'""" + +example_mode_aes_256_cfb128_datatype_emptystring_key_32_iv_16 = r"""''""" + +example_mode_aes_256_cfb128_datatype_utf8string_key_32_iv_16 = r"""'2E9B2BD2B8BA872DB56225F82754048C22AA31B7F22AD276'""" + +example_mode_aes_256_cfb128_datatype_utf8fixedstring_key_32_iv_16 = r"""'2E9B2BD2B8BA872DB56225F82754048C22AA31B7F22AD276'""" + +example_mode_aes_256_cfb128_datatype_String_key_32_iv_16 = r"""'58'""" + +example_mode_aes_256_cfb128_datatype_FixedString_key_32_iv_16 = r"""'58'""" + +example_mode_aes_256_cfb128_datatype_UInt8_key_32_iv_16 = r"""'68'""" + +example_mode_aes_256_cfb128_datatype_UInt16_key_32_iv_16 = r"""'6858'""" + +example_mode_aes_256_cfb128_datatype_UInt32_key_32_iv_16 = r"""'68588817'""" + +example_mode_aes_256_cfb128_datatype_UInt64_key_32_iv_16 = r"""'685888173CDE4488'""" + +example_mode_aes_256_cfb128_datatype_Int8_key_32_iv_16 = r"""'68'""" + +example_mode_aes_256_cfb128_datatype_Int16_key_32_iv_16 = r"""'6858'""" + +example_mode_aes_256_cfb128_datatype_Int32_key_32_iv_16 = r"""'68588817'""" + +example_mode_aes_256_cfb128_datatype_Int64_key_32_iv_16 = r"""'685888173CDE4488'""" + +example_mode_aes_256_cfb128_datatype_Float32_key_32_iv_16 = r"""'69580828'""" + +example_mode_aes_256_cfb128_datatype_Float64_key_32_iv_16 = r"""'695888173CDEB4B7'""" + +example_mode_aes_256_cfb128_datatype_Decimal32_key_32_iv_16 = r"""'49168817'""" + +example_mode_aes_256_cfb128_datatype_Decimal64_key_32_iv_16 = r"""'491688173CDE4488'""" + +example_mode_aes_256_cfb128_datatype_Decimal128_key_32_iv_16 = r"""'491688173CDE448870E043A7733CC726'""" + +example_mode_aes_256_cfb128_datatype_UUID_key_32_iv_16 = r"""'8E493B4B381AB4E9D03B90CD739ABCB6'""" + +example_mode_aes_256_cfb128_datatype_Date_key_32_iv_16 = r"""'3F1F'""" + +example_mode_aes_256_cfb128_datatype_DateTime_key_32_iv_16 = r"""'27888449'""" + +example_mode_aes_256_cfb128_datatype_DateTime64_key_32_iv_16 = r"""'42E9857553DF4488'""" + +example_mode_aes_256_cfb128_datatype_LowCardinality_key_32_iv_16 = r"""'58'""" + +example_mode_aes_256_cfb128_datatype_Array_key_32_iv_16 = r"""'685A'""" + +example_mode_aes_256_cfb128_datatype_NULL_key_32_iv_16 = r"""'\\N'""" + +example_mode_aes_256_cfb128_datatype_IPv4_key_32_iv_16 = r"""'44DA69BC'""" + +example_mode_aes_256_cfb128_datatype_IPv6_key_32_iv_16 = r"""'495985AF3CDEC12B70E043A7DF234727'""" + +example_mode_aes_256_cfb128_datatype_Enum8_key_32_iv_16 = r"""'68'""" + +example_mode_aes_256_cfb128_datatype_Enum16_key_32_iv_16 = r"""'6858'""" + +example_mode_aes_256_cfb128_datatype_bytes_key_64_iv_64 = r"""'D3'""" + +example_mode_aes_256_cfb128_datatype_emptystring_key_64_iv_64 = r"""''""" + +example_mode_aes_256_cfb128_datatype_utf8string_key_64_iv_64 = r"""'942D6C993F1DE6D874AD5CCF2109CE7D9EC333A5AE718F82'""" + +example_mode_aes_256_cfb128_datatype_utf8fixedstring_key_64_iv_64 = r"""'942D6C993F1DE6D874AD5CCF2109CE7D9EC333A5AE718F82'""" + +example_mode_aes_256_cfb128_datatype_String_key_64_iv_64 = r"""'E2'""" + +example_mode_aes_256_cfb128_datatype_FixedString_key_64_iv_64 = r"""'E2'""" + +example_mode_aes_256_cfb128_datatype_UInt8_key_64_iv_64 = r"""'D2'""" + +example_mode_aes_256_cfb128_datatype_UInt16_key_64_iv_64 = r"""'D2EE'""" + +example_mode_aes_256_cfb128_datatype_UInt32_key_64_iv_64 = r"""'D2EECF5C'""" + +example_mode_aes_256_cfb128_datatype_UInt64_key_64_iv_64 = r"""'D2EECF5CBB79257D'""" + +example_mode_aes_256_cfb128_datatype_Int8_key_64_iv_64 = r"""'D2'""" + +example_mode_aes_256_cfb128_datatype_Int16_key_64_iv_64 = r"""'D2EE'""" + +example_mode_aes_256_cfb128_datatype_Int32_key_64_iv_64 = r"""'D2EECF5C'""" + +example_mode_aes_256_cfb128_datatype_Int64_key_64_iv_64 = r"""'D2EECF5CBB79257D'""" + +example_mode_aes_256_cfb128_datatype_Float32_key_64_iv_64 = r"""'D3EE4F63'""" + +example_mode_aes_256_cfb128_datatype_Float64_key_64_iv_64 = r"""'D3EECF5CBB79D542'""" + +example_mode_aes_256_cfb128_datatype_Decimal32_key_64_iv_64 = r"""'F3A0CF5C'""" + +example_mode_aes_256_cfb128_datatype_Decimal64_key_64_iv_64 = r"""'F3A0CF5CBB79257D'""" + +example_mode_aes_256_cfb128_datatype_Decimal128_key_64_iv_64 = r"""'F3A0CF5CBB79257DB12F3A9075610DD7'""" + +example_mode_aes_256_cfb128_datatype_UUID_key_64_iv_64 = r"""'34FF7C00BFBDD51C11F4E9FA75C77647'""" + +example_mode_aes_256_cfb128_datatype_Date_key_64_iv_64 = r"""'85A9'""" + +example_mode_aes_256_cfb128_datatype_DateTime_key_64_iv_64 = r"""'9D3EC302'""" + +example_mode_aes_256_cfb128_datatype_DateTime64_key_64_iv_64 = r"""'F85FC23ED478257D'""" + +example_mode_aes_256_cfb128_datatype_LowCardinality_key_64_iv_64 = r"""'E2'""" + +example_mode_aes_256_cfb128_datatype_Array_key_64_iv_64 = r"""'D2EC'""" + +example_mode_aes_256_cfb128_datatype_NULL_key_64_iv_64 = r"""'\\N'""" + +example_mode_aes_256_cfb128_datatype_IPv4_key_64_iv_64 = r"""'FE6C2EF7'""" + +example_mode_aes_256_cfb128_datatype_IPv6_key_64_iv_64 = r"""'F3EFC2E4BB79A0DEB12F3A90D97E8DD6'""" + +example_mode_aes_256_cfb128_datatype_Enum8_key_64_iv_64 = r"""'D2'""" + +example_mode_aes_256_cfb128_datatype_Enum16_key_64_iv_64 = r"""'D2EE'""" + +example_mode_aes_128_ofb_datatype_bytes_key_16_iv_None = r"""'10'""" + +example_mode_aes_128_ofb_datatype_emptystring_key_16_iv_None = r"""''""" + +example_mode_aes_128_ofb_datatype_utf8string_key_16_iv_None = r"""'571C627072083ECFD8460B39C4132D1B1EFEEBE7197398AE'""" + +example_mode_aes_128_ofb_datatype_utf8fixedstring_key_16_iv_None = r"""'571C627072083ECFD8460B39C4132D1B1EFEEBE7197398AE'""" + +example_mode_aes_128_ofb_datatype_String_key_16_iv_None = r"""'21'""" + +example_mode_aes_128_ofb_datatype_FixedString_key_16_iv_None = r"""'21'""" + +example_mode_aes_128_ofb_datatype_UInt8_key_16_iv_None = r"""'11'""" + +example_mode_aes_128_ofb_datatype_UInt16_key_16_iv_None = r"""'11DF'""" + +example_mode_aes_128_ofb_datatype_UInt32_key_16_iv_None = r"""'11DFC1B5'""" + +example_mode_aes_128_ofb_datatype_UInt64_key_16_iv_None = r"""'11DFC1B5F66CFD6A'""" + +example_mode_aes_128_ofb_datatype_Int8_key_16_iv_None = r"""'11'""" + +example_mode_aes_128_ofb_datatype_Int16_key_16_iv_None = r"""'11DF'""" + +example_mode_aes_128_ofb_datatype_Int32_key_16_iv_None = r"""'11DFC1B5'""" + +example_mode_aes_128_ofb_datatype_Int64_key_16_iv_None = r"""'11DFC1B5F66CFD6A'""" + +example_mode_aes_128_ofb_datatype_Float32_key_16_iv_None = r"""'10DF418A'""" + +example_mode_aes_128_ofb_datatype_Float64_key_16_iv_None = r"""'10DFC1B5F66C0D55'""" + +example_mode_aes_128_ofb_datatype_Decimal32_key_16_iv_None = r"""'3091C1B5'""" + +example_mode_aes_128_ofb_datatype_Decimal64_key_16_iv_None = r"""'3091C1B5F66CFD6A'""" + +example_mode_aes_128_ofb_datatype_Decimal128_key_16_iv_None = r"""'3091C1B5F66CFD6A1DC46D66907BEEB1'""" + +example_mode_aes_128_ofb_datatype_UUID_key_16_iv_None = r"""'F7CE72E9F2A80D0BBD1FBE0C90DD9521'""" + +example_mode_aes_128_ofb_datatype_Date_key_16_iv_None = r"""'4698'""" + +example_mode_aes_128_ofb_datatype_DateTime_key_16_iv_None = r"""'5E0FCDEB'""" + +example_mode_aes_128_ofb_datatype_DateTime64_key_16_iv_None = r"""'3B6ECCD7996DFD6A'""" + +example_mode_aes_128_ofb_datatype_LowCardinality_key_16_iv_None = r"""'21'""" + +example_mode_aes_128_ofb_datatype_Array_key_16_iv_None = r"""'11DD'""" + +example_mode_aes_128_ofb_datatype_NULL_key_16_iv_None = r"""'\\N'""" + +example_mode_aes_128_ofb_datatype_IPv4_key_16_iv_None = r"""'3D5D201E'""" + +example_mode_aes_128_ofb_datatype_IPv6_key_16_iv_None = r"""'30DECC0DF66C78C91DC46D663C646EB0'""" + +example_mode_aes_128_ofb_datatype_Enum8_key_16_iv_None = r"""'11'""" + +example_mode_aes_128_ofb_datatype_Enum16_key_16_iv_None = r"""'11DF'""" + +example_mode_aes_192_ofb_datatype_bytes_key_24_iv_None = r"""'07'""" + +example_mode_aes_192_ofb_datatype_emptystring_key_24_iv_None = r"""''""" + +example_mode_aes_192_ofb_datatype_utf8string_key_24_iv_None = r"""'4074BA58B958623BE94C3FCF833DDDD95F6EFF17F7823E17'""" + +example_mode_aes_192_ofb_datatype_utf8fixedstring_key_24_iv_None = r"""'4074BA58B958623BE94C3FCF833DDDD95F6EFF17F7823E17'""" + +example_mode_aes_192_ofb_datatype_String_key_24_iv_None = r"""'36'""" + +example_mode_aes_192_ofb_datatype_FixedString_key_24_iv_None = r"""'36'""" + +example_mode_aes_192_ofb_datatype_UInt8_key_24_iv_None = r"""'06'""" + +example_mode_aes_192_ofb_datatype_UInt16_key_24_iv_None = r"""'06B7'""" + +example_mode_aes_192_ofb_datatype_UInt32_key_24_iv_None = r"""'06B7199D'""" + +example_mode_aes_192_ofb_datatype_UInt64_key_24_iv_None = r"""'06B7199D3D3CA19E'""" + +example_mode_aes_192_ofb_datatype_Int8_key_24_iv_None = r"""'06'""" + +example_mode_aes_192_ofb_datatype_Int16_key_24_iv_None = r"""'06B7'""" + +example_mode_aes_192_ofb_datatype_Int32_key_24_iv_None = r"""'06B7199D'""" + +example_mode_aes_192_ofb_datatype_Int64_key_24_iv_None = r"""'06B7199D3D3CA19E'""" + +example_mode_aes_192_ofb_datatype_Float32_key_24_iv_None = r"""'07B799A2'""" + +example_mode_aes_192_ofb_datatype_Float64_key_24_iv_None = r"""'07B7199D3D3C51A1'""" + +example_mode_aes_192_ofb_datatype_Decimal32_key_24_iv_None = r"""'27F9199D'""" + +example_mode_aes_192_ofb_datatype_Decimal64_key_24_iv_None = r"""'27F9199D3D3CA19E'""" + +example_mode_aes_192_ofb_datatype_Decimal128_key_24_iv_None = r"""'27F9199D3D3CA19E2CCE5990D7551E73'""" + +example_mode_aes_192_ofb_datatype_UUID_key_24_iv_None = r"""'E0A6AAC139F851FF8C158AFAD7F365E3'""" + +example_mode_aes_192_ofb_datatype_Date_key_24_iv_None = r"""'51F0'""" + +example_mode_aes_192_ofb_datatype_DateTime_key_24_iv_None = r"""'496715C3'""" + +example_mode_aes_192_ofb_datatype_DateTime64_key_24_iv_None = r"""'2C0614FF523DA19E'""" + +example_mode_aes_192_ofb_datatype_LowCardinality_key_24_iv_None = r"""'36'""" + +example_mode_aes_192_ofb_datatype_Array_key_24_iv_None = r"""'06B5'""" + +example_mode_aes_192_ofb_datatype_NULL_key_24_iv_None = r"""'\\N'""" + +example_mode_aes_192_ofb_datatype_IPv4_key_24_iv_None = r"""'2A35F836'""" + +example_mode_aes_192_ofb_datatype_IPv6_key_24_iv_None = r"""'27B614253D3C243D2CCE59907B4A9E72'""" + +example_mode_aes_192_ofb_datatype_Enum8_key_24_iv_None = r"""'06'""" + +example_mode_aes_192_ofb_datatype_Enum16_key_24_iv_None = r"""'06B7'""" + +example_mode_aes_256_ofb_datatype_bytes_key_32_iv_None = r"""'B0'""" + +example_mode_aes_256_ofb_datatype_emptystring_key_32_iv_None = r"""''""" + +example_mode_aes_256_ofb_datatype_utf8string_key_32_iv_None = r"""'F74D6C5B438F9CA8BEFAA27A02BEAB06B24181EFC9F2663B'""" + +example_mode_aes_256_ofb_datatype_utf8fixedstring_key_32_iv_None = r"""'F74D6C5B438F9CA8BEFAA27A02BEAB06B24181EFC9F2663B'""" + +example_mode_aes_256_ofb_datatype_String_key_32_iv_None = r"""'81'""" + +example_mode_aes_256_ofb_datatype_FixedString_key_32_iv_None = r"""'81'""" + +example_mode_aes_256_ofb_datatype_UInt8_key_32_iv_None = r"""'B1'""" + +example_mode_aes_256_ofb_datatype_UInt16_key_32_iv_None = r"""'B18E'""" + +example_mode_aes_256_ofb_datatype_UInt32_key_32_iv_None = r"""'B18ECF9E'""" + +example_mode_aes_256_ofb_datatype_UInt64_key_32_iv_None = r"""'B18ECF9EC7EB5F0D'""" + +example_mode_aes_256_ofb_datatype_Int8_key_32_iv_None = r"""'B1'""" + +example_mode_aes_256_ofb_datatype_Int16_key_32_iv_None = r"""'B18E'""" + +example_mode_aes_256_ofb_datatype_Int32_key_32_iv_None = r"""'B18ECF9E'""" + +example_mode_aes_256_ofb_datatype_Int64_key_32_iv_None = r"""'B18ECF9EC7EB5F0D'""" + +example_mode_aes_256_ofb_datatype_Float32_key_32_iv_None = r"""'B08E4FA1'""" + +example_mode_aes_256_ofb_datatype_Float64_key_32_iv_None = r"""'B08ECF9EC7EBAF32'""" + +example_mode_aes_256_ofb_datatype_Decimal32_key_32_iv_None = r"""'90C0CF9E'""" + +example_mode_aes_256_ofb_datatype_Decimal64_key_32_iv_None = r"""'90C0CF9EC7EB5F0D'""" + +example_mode_aes_256_ofb_datatype_Decimal128_key_32_iv_None = r"""'90C0CF9EC7EB5F0D7B78C42556D668AC'""" + +example_mode_aes_256_ofb_datatype_UUID_key_32_iv_None = r"""'579F7CC2C32FAF6CDBA3174F5670133C'""" + +example_mode_aes_256_ofb_datatype_Date_key_32_iv_None = r"""'E6C9'""" + +example_mode_aes_256_ofb_datatype_DateTime_key_32_iv_None = r"""'FE5EC3C0'""" + +example_mode_aes_256_ofb_datatype_DateTime64_key_32_iv_None = r"""'9B3FC2FCA8EA5F0D'""" + +example_mode_aes_256_ofb_datatype_LowCardinality_key_32_iv_None = r"""'81'""" + +example_mode_aes_256_ofb_datatype_Array_key_32_iv_None = r"""'B18C'""" + +example_mode_aes_256_ofb_datatype_NULL_key_32_iv_None = r"""'\\N'""" + +example_mode_aes_256_ofb_datatype_IPv4_key_32_iv_None = r"""'9D0C2E35'""" + +example_mode_aes_256_ofb_datatype_IPv6_key_32_iv_None = r"""'908FC226C7EBDAAE7B78C425FAC9E8AD'""" + +example_mode_aes_256_ofb_datatype_Enum8_key_32_iv_None = r"""'B1'""" + +example_mode_aes_256_ofb_datatype_Enum16_key_32_iv_None = r"""'B18E'""" + +example_mode_aes_128_ofb_datatype_bytes_key_16_iv_16 = r"""'32'""" + +example_mode_aes_128_ofb_datatype_emptystring_key_16_iv_16 = r"""''""" + +example_mode_aes_128_ofb_datatype_utf8string_key_16_iv_16 = r"""'754B0A4159623CFD2CBB06EE8AADCCB46A1C2A356E7D91D8'""" + +example_mode_aes_128_ofb_datatype_utf8fixedstring_key_16_iv_16 = r"""'754B0A4159623CFD2CBB06EE8AADCCB46A1C2A356E7D91D8'""" + +example_mode_aes_128_ofb_datatype_String_key_16_iv_16 = r"""'03'""" + +example_mode_aes_128_ofb_datatype_FixedString_key_16_iv_16 = r"""'03'""" + +example_mode_aes_128_ofb_datatype_UInt8_key_16_iv_16 = r"""'33'""" + +example_mode_aes_128_ofb_datatype_UInt16_key_16_iv_16 = r"""'3388'""" + +example_mode_aes_128_ofb_datatype_UInt32_key_16_iv_16 = r"""'3388A984'""" + +example_mode_aes_128_ofb_datatype_UInt64_key_16_iv_16 = r"""'3388A984DD06FF58'""" + +example_mode_aes_128_ofb_datatype_Int8_key_16_iv_16 = r"""'33'""" + +example_mode_aes_128_ofb_datatype_Int16_key_16_iv_16 = r"""'3388'""" + +example_mode_aes_128_ofb_datatype_Int32_key_16_iv_16 = r"""'3388A984'""" + +example_mode_aes_128_ofb_datatype_Int64_key_16_iv_16 = r"""'3388A984DD06FF58'""" + +example_mode_aes_128_ofb_datatype_Float32_key_16_iv_16 = r"""'328829BB'""" + +example_mode_aes_128_ofb_datatype_Float64_key_16_iv_16 = r"""'3288A984DD060F67'""" + +example_mode_aes_128_ofb_datatype_Decimal32_key_16_iv_16 = r"""'12C6A984'""" + +example_mode_aes_128_ofb_datatype_Decimal64_key_16_iv_16 = r"""'12C6A984DD06FF58'""" + +example_mode_aes_128_ofb_datatype_Decimal128_key_16_iv_16 = r"""'12C6A984DD06FF58E93960B1DEC50F1E'""" + +example_mode_aes_128_ofb_datatype_UUID_key_16_iv_16 = r"""'D5991AD8D9C20F3949E2B3DBDE63748E'""" + +example_mode_aes_128_ofb_datatype_Date_key_16_iv_16 = r"""'64CF'""" + +example_mode_aes_128_ofb_datatype_DateTime_key_16_iv_16 = r"""'7C58A5DA'""" + +example_mode_aes_128_ofb_datatype_DateTime64_key_16_iv_16 = r"""'1939A4E6B207FF58'""" + +example_mode_aes_128_ofb_datatype_LowCardinality_key_16_iv_16 = r"""'03'""" + +example_mode_aes_128_ofb_datatype_Array_key_16_iv_16 = r"""'338A'""" + +example_mode_aes_128_ofb_datatype_NULL_key_16_iv_16 = r"""'\\N'""" + +example_mode_aes_128_ofb_datatype_IPv4_key_16_iv_16 = r"""'1F0A482F'""" + +example_mode_aes_128_ofb_datatype_IPv6_key_16_iv_16 = r"""'1289A43CDD067AFBE93960B172DA8F1F'""" + +example_mode_aes_128_ofb_datatype_Enum8_key_16_iv_16 = r"""'33'""" + +example_mode_aes_128_ofb_datatype_Enum16_key_16_iv_16 = r"""'3388'""" + +example_mode_aes_128_ofb_datatype_bytes_key_24_iv_24 = r"""'5B'""" + +example_mode_aes_128_ofb_datatype_emptystring_key_24_iv_24 = r"""''""" + +example_mode_aes_128_ofb_datatype_utf8string_key_24_iv_24 = r"""'1CB4A1306DD44E12FB99CA2398A56D5CE691EFBA49066039'""" + +example_mode_aes_128_ofb_datatype_utf8fixedstring_key_24_iv_24 = r"""'1CB4A1306DD44E12FB99CA2398A56D5CE691EFBA49066039'""" + +example_mode_aes_128_ofb_datatype_String_key_24_iv_24 = r"""'6A'""" + +example_mode_aes_128_ofb_datatype_FixedString_key_24_iv_24 = r"""'6A'""" + +example_mode_aes_128_ofb_datatype_UInt8_key_24_iv_24 = r"""'5A'""" + +example_mode_aes_128_ofb_datatype_UInt16_key_24_iv_24 = r"""'5A77'""" + +example_mode_aes_128_ofb_datatype_UInt32_key_24_iv_24 = r"""'5A7702F5'""" + +example_mode_aes_128_ofb_datatype_UInt64_key_24_iv_24 = r"""'5A7702F5E9B08DB7'""" + +example_mode_aes_128_ofb_datatype_Int8_key_24_iv_24 = r"""'5A'""" + +example_mode_aes_128_ofb_datatype_Int16_key_24_iv_24 = r"""'5A77'""" + +example_mode_aes_128_ofb_datatype_Int32_key_24_iv_24 = r"""'5A7702F5'""" + +example_mode_aes_128_ofb_datatype_Int64_key_24_iv_24 = r"""'5A7702F5E9B08DB7'""" + +example_mode_aes_128_ofb_datatype_Float32_key_24_iv_24 = r"""'5B7782CA'""" + +example_mode_aes_128_ofb_datatype_Float64_key_24_iv_24 = r"""'5B7702F5E9B07D88'""" + +example_mode_aes_128_ofb_datatype_Decimal32_key_24_iv_24 = r"""'7B3902F5'""" + +example_mode_aes_128_ofb_datatype_Decimal64_key_24_iv_24 = r"""'7B3902F5E9B08DB7'""" + +example_mode_aes_128_ofb_datatype_Decimal128_key_24_iv_24 = r"""'7B3902F5E9B08DB73E1BAC7CCCCDAEF6'""" + +example_mode_aes_128_ofb_datatype_UUID_key_24_iv_24 = r"""'BC66B1A9ED747DD69EC07F16CC6BD566'""" + +example_mode_aes_128_ofb_datatype_Date_key_24_iv_24 = r"""'0D30'""" + +example_mode_aes_128_ofb_datatype_DateTime_key_24_iv_24 = r"""'15A70EAB'""" + +example_mode_aes_128_ofb_datatype_DateTime64_key_24_iv_24 = r"""'70C60F9786B18DB7'""" + +example_mode_aes_128_ofb_datatype_LowCardinality_key_24_iv_24 = r"""'6A'""" + +example_mode_aes_128_ofb_datatype_Array_key_24_iv_24 = r"""'5A75'""" + +example_mode_aes_128_ofb_datatype_NULL_key_24_iv_24 = r"""'\\N'""" + +example_mode_aes_128_ofb_datatype_IPv4_key_24_iv_24 = r"""'76F5E35E'""" + +example_mode_aes_128_ofb_datatype_IPv6_key_24_iv_24 = r"""'7B760F4DE9B008143E1BAC7C60D22EF7'""" + +example_mode_aes_128_ofb_datatype_Enum8_key_24_iv_24 = r"""'5A'""" + +example_mode_aes_128_ofb_datatype_Enum16_key_24_iv_24 = r"""'5A77'""" + +example_mode_aes_192_ofb_datatype_bytes_key_24_iv_16 = r"""'68'""" + +example_mode_aes_192_ofb_datatype_emptystring_key_24_iv_16 = r"""''""" + +example_mode_aes_192_ofb_datatype_utf8string_key_24_iv_16 = r"""'2F0444573374B41441C46351EBB0A21F81C68E6CF92A6AF3'""" + +example_mode_aes_192_ofb_datatype_utf8fixedstring_key_24_iv_16 = r"""'2F0444573374B41441C46351EBB0A21F81C68E6CF92A6AF3'""" + +example_mode_aes_192_ofb_datatype_String_key_24_iv_16 = r"""'59'""" + +example_mode_aes_192_ofb_datatype_FixedString_key_24_iv_16 = r"""'59'""" + +example_mode_aes_192_ofb_datatype_UInt8_key_24_iv_16 = r"""'69'""" + +example_mode_aes_192_ofb_datatype_UInt16_key_24_iv_16 = r"""'69C7'""" + +example_mode_aes_192_ofb_datatype_UInt32_key_24_iv_16 = r"""'69C7E792'""" + +example_mode_aes_192_ofb_datatype_UInt64_key_24_iv_16 = r"""'69C7E792B71077B1'""" + +example_mode_aes_192_ofb_datatype_Int8_key_24_iv_16 = r"""'69'""" + +example_mode_aes_192_ofb_datatype_Int16_key_24_iv_16 = r"""'69C7'""" + +example_mode_aes_192_ofb_datatype_Int32_key_24_iv_16 = r"""'69C7E792'""" + +example_mode_aes_192_ofb_datatype_Int64_key_24_iv_16 = r"""'69C7E792B71077B1'""" + +example_mode_aes_192_ofb_datatype_Float32_key_24_iv_16 = r"""'68C767AD'""" + +example_mode_aes_192_ofb_datatype_Float64_key_24_iv_16 = r"""'68C7E792B710878E'""" + +example_mode_aes_192_ofb_datatype_Decimal32_key_24_iv_16 = r"""'4889E792'""" + +example_mode_aes_192_ofb_datatype_Decimal64_key_24_iv_16 = r"""'4889E792B71077B1'""" + +example_mode_aes_192_ofb_datatype_Decimal128_key_24_iv_16 = r"""'4889E792B71077B18446050EBFD861B5'""" + +example_mode_aes_192_ofb_datatype_UUID_key_24_iv_16 = r"""'8FD654CEB3D487D0249DD664BF7E1A25'""" + +example_mode_aes_192_ofb_datatype_Date_key_24_iv_16 = r"""'3E80'""" + +example_mode_aes_192_ofb_datatype_DateTime_key_24_iv_16 = r"""'2617EBCC'""" + +example_mode_aes_192_ofb_datatype_DateTime64_key_24_iv_16 = r"""'4376EAF0D81177B1'""" + +example_mode_aes_192_ofb_datatype_LowCardinality_key_24_iv_16 = r"""'59'""" + +example_mode_aes_192_ofb_datatype_Array_key_24_iv_16 = r"""'69C5'""" + +example_mode_aes_192_ofb_datatype_NULL_key_24_iv_16 = r"""'\\N'""" + +example_mode_aes_192_ofb_datatype_IPv4_key_24_iv_16 = r"""'45450639'""" + +example_mode_aes_192_ofb_datatype_IPv6_key_24_iv_16 = r"""'48C6EA2AB710F2128446050E13C7E1B4'""" + +example_mode_aes_192_ofb_datatype_Enum8_key_24_iv_16 = r"""'69'""" + +example_mode_aes_192_ofb_datatype_Enum16_key_24_iv_16 = r"""'69C7'""" + +example_mode_aes_192_ofb_datatype_bytes_key_32_iv_32 = r"""'31'""" + +example_mode_aes_192_ofb_datatype_emptystring_key_32_iv_32 = r"""''""" + +example_mode_aes_192_ofb_datatype_utf8string_key_32_iv_32 = r"""'76632DB12BCFF36187A90B6990CFA6D86DA0963C4A14697B'""" + +example_mode_aes_192_ofb_datatype_utf8fixedstring_key_32_iv_32 = r"""'76632DB12BCFF36187A90B6990CFA6D86DA0963C4A14697B'""" + +example_mode_aes_192_ofb_datatype_String_key_32_iv_32 = r"""'00'""" + +example_mode_aes_192_ofb_datatype_FixedString_key_32_iv_32 = r"""'00'""" + +example_mode_aes_192_ofb_datatype_UInt8_key_32_iv_32 = r"""'30'""" + +example_mode_aes_192_ofb_datatype_UInt16_key_32_iv_32 = r"""'30A0'""" + +example_mode_aes_192_ofb_datatype_UInt32_key_32_iv_32 = r"""'30A08E74'""" + +example_mode_aes_192_ofb_datatype_UInt64_key_32_iv_32 = r"""'30A08E74AFAB30C4'""" + +example_mode_aes_192_ofb_datatype_Int8_key_32_iv_32 = r"""'30'""" + +example_mode_aes_192_ofb_datatype_Int16_key_32_iv_32 = r"""'30A0'""" + +example_mode_aes_192_ofb_datatype_Int32_key_32_iv_32 = r"""'30A08E74'""" + +example_mode_aes_192_ofb_datatype_Int64_key_32_iv_32 = r"""'30A08E74AFAB30C4'""" + +example_mode_aes_192_ofb_datatype_Float32_key_32_iv_32 = r"""'31A00E4B'""" + +example_mode_aes_192_ofb_datatype_Float64_key_32_iv_32 = r"""'31A08E74AFABC0FB'""" + +example_mode_aes_192_ofb_datatype_Decimal32_key_32_iv_32 = r"""'11EE8E74'""" + +example_mode_aes_192_ofb_datatype_Decimal64_key_32_iv_32 = r"""'11EE8E74AFAB30C4'""" + +example_mode_aes_192_ofb_datatype_Decimal128_key_32_iv_32 = r"""'11EE8E74AFAB30C4422B6D36C4A76572'""" + +example_mode_aes_192_ofb_datatype_UUID_key_32_iv_32 = r"""'D6B13D28AB6FC0A5E2F0BE5CC4011EE2'""" + +example_mode_aes_192_ofb_datatype_Date_key_32_iv_32 = r"""'67E7'""" + +example_mode_aes_192_ofb_datatype_DateTime_key_32_iv_32 = r"""'7F70822A'""" + +example_mode_aes_192_ofb_datatype_DateTime64_key_32_iv_32 = r"""'1A118316C0AA30C4'""" + +example_mode_aes_192_ofb_datatype_LowCardinality_key_32_iv_32 = r"""'00'""" + +example_mode_aes_192_ofb_datatype_Array_key_32_iv_32 = r"""'30A2'""" + +example_mode_aes_192_ofb_datatype_NULL_key_32_iv_32 = r"""'\\N'""" + +example_mode_aes_192_ofb_datatype_IPv4_key_32_iv_32 = r"""'1C226FDF'""" + +example_mode_aes_192_ofb_datatype_IPv6_key_32_iv_32 = r"""'11A183CCAFABB567422B6D3668B8E573'""" + +example_mode_aes_192_ofb_datatype_Enum8_key_32_iv_32 = r"""'30'""" + +example_mode_aes_192_ofb_datatype_Enum16_key_32_iv_32 = r"""'30A0'""" + +example_mode_aes_256_ofb_datatype_bytes_key_32_iv_16 = r"""'69'""" + +example_mode_aes_256_ofb_datatype_emptystring_key_32_iv_16 = r"""''""" + +example_mode_aes_256_ofb_datatype_utf8string_key_32_iv_16 = r"""'2E9B2BD2B8BA872DB56225F82754048CE38E2C23393CF6FD'""" + +example_mode_aes_256_ofb_datatype_utf8fixedstring_key_32_iv_16 = r"""'2E9B2BD2B8BA872DB56225F82754048CE38E2C23393CF6FD'""" + +example_mode_aes_256_ofb_datatype_String_key_32_iv_16 = r"""'58'""" + +example_mode_aes_256_ofb_datatype_FixedString_key_32_iv_16 = r"""'58'""" + +example_mode_aes_256_ofb_datatype_UInt8_key_32_iv_16 = r"""'68'""" + +example_mode_aes_256_ofb_datatype_UInt16_key_32_iv_16 = r"""'6858'""" + +example_mode_aes_256_ofb_datatype_UInt32_key_32_iv_16 = r"""'68588817'""" + +example_mode_aes_256_ofb_datatype_UInt64_key_32_iv_16 = r"""'685888173CDE4488'""" + +example_mode_aes_256_ofb_datatype_Int8_key_32_iv_16 = r"""'68'""" + +example_mode_aes_256_ofb_datatype_Int16_key_32_iv_16 = r"""'6858'""" + +example_mode_aes_256_ofb_datatype_Int32_key_32_iv_16 = r"""'68588817'""" + +example_mode_aes_256_ofb_datatype_Int64_key_32_iv_16 = r"""'685888173CDE4488'""" + +example_mode_aes_256_ofb_datatype_Float32_key_32_iv_16 = r"""'69580828'""" + +example_mode_aes_256_ofb_datatype_Float64_key_32_iv_16 = r"""'695888173CDEB4B7'""" + +example_mode_aes_256_ofb_datatype_Decimal32_key_32_iv_16 = r"""'49168817'""" + +example_mode_aes_256_ofb_datatype_Decimal64_key_32_iv_16 = r"""'491688173CDE4488'""" + +example_mode_aes_256_ofb_datatype_Decimal128_key_32_iv_16 = r"""'491688173CDE448870E043A7733CC726'""" + +example_mode_aes_256_ofb_datatype_UUID_key_32_iv_16 = r"""'8E493B4B381AB4E9D03B90CD739ABCB6'""" + +example_mode_aes_256_ofb_datatype_Date_key_32_iv_16 = r"""'3F1F'""" + +example_mode_aes_256_ofb_datatype_DateTime_key_32_iv_16 = r"""'27888449'""" + +example_mode_aes_256_ofb_datatype_DateTime64_key_32_iv_16 = r"""'42E9857553DF4488'""" + +example_mode_aes_256_ofb_datatype_LowCardinality_key_32_iv_16 = r"""'58'""" + +example_mode_aes_256_ofb_datatype_Array_key_32_iv_16 = r"""'685A'""" + +example_mode_aes_256_ofb_datatype_NULL_key_32_iv_16 = r"""'\\N'""" + +example_mode_aes_256_ofb_datatype_IPv4_key_32_iv_16 = r"""'44DA69BC'""" + +example_mode_aes_256_ofb_datatype_IPv6_key_32_iv_16 = r"""'495985AF3CDEC12B70E043A7DF234727'""" + +example_mode_aes_256_ofb_datatype_Enum8_key_32_iv_16 = r"""'68'""" + +example_mode_aes_256_ofb_datatype_Enum16_key_32_iv_16 = r"""'6858'""" + +example_mode_aes_256_ofb_datatype_bytes_key_64_iv_64 = r"""'D3'""" + +example_mode_aes_256_ofb_datatype_emptystring_key_64_iv_64 = r"""''""" + +example_mode_aes_256_ofb_datatype_utf8string_key_64_iv_64 = r"""'942D6C993F1DE6D874AD5CCF2109CE7D063DC690F1843081'""" + +example_mode_aes_256_ofb_datatype_utf8fixedstring_key_64_iv_64 = r"""'942D6C993F1DE6D874AD5CCF2109CE7D063DC690F1843081'""" + +example_mode_aes_256_ofb_datatype_String_key_64_iv_64 = r"""'E2'""" + +example_mode_aes_256_ofb_datatype_FixedString_key_64_iv_64 = r"""'E2'""" + +example_mode_aes_256_ofb_datatype_UInt8_key_64_iv_64 = r"""'D2'""" + +example_mode_aes_256_ofb_datatype_UInt16_key_64_iv_64 = r"""'D2EE'""" + +example_mode_aes_256_ofb_datatype_UInt32_key_64_iv_64 = r"""'D2EECF5C'""" + +example_mode_aes_256_ofb_datatype_UInt64_key_64_iv_64 = r"""'D2EECF5CBB79257D'""" + +example_mode_aes_256_ofb_datatype_Int8_key_64_iv_64 = r"""'D2'""" + +example_mode_aes_256_ofb_datatype_Int16_key_64_iv_64 = r"""'D2EE'""" + +example_mode_aes_256_ofb_datatype_Int32_key_64_iv_64 = r"""'D2EECF5C'""" + +example_mode_aes_256_ofb_datatype_Int64_key_64_iv_64 = r"""'D2EECF5CBB79257D'""" + +example_mode_aes_256_ofb_datatype_Float32_key_64_iv_64 = r"""'D3EE4F63'""" + +example_mode_aes_256_ofb_datatype_Float64_key_64_iv_64 = r"""'D3EECF5CBB79D542'""" + +example_mode_aes_256_ofb_datatype_Decimal32_key_64_iv_64 = r"""'F3A0CF5C'""" + +example_mode_aes_256_ofb_datatype_Decimal64_key_64_iv_64 = r"""'F3A0CF5CBB79257D'""" + +example_mode_aes_256_ofb_datatype_Decimal128_key_64_iv_64 = r"""'F3A0CF5CBB79257DB12F3A9075610DD7'""" + +example_mode_aes_256_ofb_datatype_UUID_key_64_iv_64 = r"""'34FF7C00BFBDD51C11F4E9FA75C77647'""" + +example_mode_aes_256_ofb_datatype_Date_key_64_iv_64 = r"""'85A9'""" + +example_mode_aes_256_ofb_datatype_DateTime_key_64_iv_64 = r"""'9D3EC302'""" + +example_mode_aes_256_ofb_datatype_DateTime64_key_64_iv_64 = r"""'F85FC23ED478257D'""" + +example_mode_aes_256_ofb_datatype_LowCardinality_key_64_iv_64 = r"""'E2'""" + +example_mode_aes_256_ofb_datatype_Array_key_64_iv_64 = r"""'D2EC'""" + +example_mode_aes_256_ofb_datatype_NULL_key_64_iv_64 = r"""'\\N'""" + +example_mode_aes_256_ofb_datatype_IPv4_key_64_iv_64 = r"""'FE6C2EF7'""" + +example_mode_aes_256_ofb_datatype_IPv6_key_64_iv_64 = r"""'F3EFC2E4BB79A0DEB12F3A90D97E8DD6'""" + +example_mode_aes_256_ofb_datatype_Enum8_key_64_iv_64 = r"""'D2'""" + +example_mode_aes_256_ofb_datatype_Enum16_key_64_iv_64 = r"""'D2EE'""" + diff --git a/tests/testflows/helpers/cluster.py b/tests/testflows/helpers/cluster.py index 8fda8ac43d8..01ebfa8424b 100644 --- a/tests/testflows/helpers/cluster.py +++ b/tests/testflows/helpers/cluster.py @@ -53,7 +53,7 @@ class ClickHouseNode(Node): continue assert False, "container is not healthy" - def restart(self, timeout=120, safe=True): + def restart(self, timeout=120, safe=True, wait_healthy=True): """Restart node. """ if safe: @@ -73,7 +73,8 @@ class ClickHouseNode(Node): self.cluster.command(None, f'{self.cluster.docker_compose} restart {self.name}', timeout=timeout) - self.wait_healthy(timeout) + if wait_healthy: + self.wait_healthy(timeout) def query(self, sql, message=None, exitcode=None, steps=True, no_checks=False, raise_on_exception=False, step=By, settings=None, *args, **kwargs): @@ -295,12 +296,12 @@ class Cluster(object): :param steps: don't break command into steps, default: True """ debug(f"command() {node}, {command}") - with By("executing command", description=command) if steps else NullStep(): + with By("executing command", description=command, format_description=False) if steps else NullStep(): r = self.bash(node)(command, *args, **kwargs) if exitcode is not None: - with Then(f"exitcode should be {exitcode}") if steps else NullStep(): + with Then(f"exitcode should be {exitcode}", format_name=False) if steps else NullStep(): assert r.exitcode == exitcode, error(r.output) if message is not None: - with Then(f"output should contain message", description=message) if steps else NullStep(): + with Then(f"output should contain message", description=message, format_description=False) if steps else NullStep(): assert message in r.output, error(r.output) return r diff --git a/tests/testflows/ldap/authentication/__init__.py b/tests/testflows/ldap/authentication/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/testflows/ldap/configs/CA/ca.crt b/tests/testflows/ldap/authentication/configs/CA/ca.crt similarity index 100% rename from tests/testflows/ldap/configs/CA/ca.crt rename to tests/testflows/ldap/authentication/configs/CA/ca.crt diff --git a/tests/testflows/ldap/configs/CA/ca.key b/tests/testflows/ldap/authentication/configs/CA/ca.key similarity index 100% rename from tests/testflows/ldap/configs/CA/ca.key rename to tests/testflows/ldap/authentication/configs/CA/ca.key diff --git a/tests/testflows/ldap/configs/CA/ca.srl b/tests/testflows/ldap/authentication/configs/CA/ca.srl similarity index 100% rename from tests/testflows/ldap/configs/CA/ca.srl rename to tests/testflows/ldap/authentication/configs/CA/ca.srl diff --git a/tests/testflows/ldap/configs/CA/dhparam.pem b/tests/testflows/ldap/authentication/configs/CA/dhparam.pem similarity index 100% rename from tests/testflows/ldap/configs/CA/dhparam.pem rename to tests/testflows/ldap/authentication/configs/CA/dhparam.pem diff --git a/tests/testflows/ldap/configs/CA/passphrase.txt b/tests/testflows/ldap/authentication/configs/CA/passphrase.txt similarity index 100% rename from tests/testflows/ldap/configs/CA/passphrase.txt rename to tests/testflows/ldap/authentication/configs/CA/passphrase.txt diff --git a/tests/testflows/ldap/authentication/configs/clickhouse/common.xml b/tests/testflows/ldap/authentication/configs/clickhouse/common.xml new file mode 100644 index 00000000000..df952b28c82 --- /dev/null +++ b/tests/testflows/ldap/authentication/configs/clickhouse/common.xml @@ -0,0 +1,6 @@ + + Europe/Moscow + 0.0.0.0 + /var/lib/clickhouse/ + /var/lib/clickhouse/tmp/ + diff --git a/tests/testflows/ldap/authentication/configs/clickhouse/config.d/logs.xml b/tests/testflows/ldap/authentication/configs/clickhouse/config.d/logs.xml new file mode 100644 index 00000000000..bdf1bbc11c1 --- /dev/null +++ b/tests/testflows/ldap/authentication/configs/clickhouse/config.d/logs.xml @@ -0,0 +1,17 @@ + + 3 + + trace + /var/log/clickhouse-server/log.log + /var/log/clickhouse-server/log.err.log + 1000M + 10 + /var/log/clickhouse-server/stderr.log + /var/log/clickhouse-server/stdout.log + + + system + part_log
+ 500 +
+
diff --git a/tests/testflows/ldap/authentication/configs/clickhouse/config.d/ports.xml b/tests/testflows/ldap/authentication/configs/clickhouse/config.d/ports.xml new file mode 100644 index 00000000000..fbc6cea74c0 --- /dev/null +++ b/tests/testflows/ldap/authentication/configs/clickhouse/config.d/ports.xml @@ -0,0 +1,5 @@ + + + 8443 + 9440 + \ No newline at end of file diff --git a/tests/testflows/ldap/authentication/configs/clickhouse/config.d/remote.xml b/tests/testflows/ldap/authentication/configs/clickhouse/config.d/remote.xml new file mode 100644 index 00000000000..51be2a6e8e3 --- /dev/null +++ b/tests/testflows/ldap/authentication/configs/clickhouse/config.d/remote.xml @@ -0,0 +1,107 @@ + + + + + + true + + clickhouse1 + 9000 + + + clickhouse2 + 9000 + + + clickhouse3 + 9000 + + + + + + + true + + clickhouse1 + 9440 + 1 + + + clickhouse2 + 9440 + 1 + + + clickhouse3 + 9440 + 1 + + + + + + + clickhouse1 + 9000 + + + + + clickhouse2 + 9000 + + + + + clickhouse3 + 9000 + + + + + + + clickhouse1 + 9440 + 1 + + + + + clickhouse2 + 9440 + 1 + + + + + clickhouse3 + 9440 + 1 + + + + + diff --git a/tests/testflows/ldap/authentication/configs/clickhouse/config.d/ssl.xml b/tests/testflows/ldap/authentication/configs/clickhouse/config.d/ssl.xml new file mode 100644 index 00000000000..ca65ffd5e04 --- /dev/null +++ b/tests/testflows/ldap/authentication/configs/clickhouse/config.d/ssl.xml @@ -0,0 +1,17 @@ + + + + /etc/clickhouse-server/ssl/server.crt + /etc/clickhouse-server/ssl/server.key + none + true + + + true + none + + AcceptCertificateHandler + + + + diff --git a/tests/testflows/ldap/authentication/configs/clickhouse/config.d/storage.xml b/tests/testflows/ldap/authentication/configs/clickhouse/config.d/storage.xml new file mode 100644 index 00000000000..618fd6b6d24 --- /dev/null +++ b/tests/testflows/ldap/authentication/configs/clickhouse/config.d/storage.xml @@ -0,0 +1,20 @@ + + + + + + 1024 + + + + + + + default + + + + + + + diff --git a/tests/testflows/ldap/authentication/configs/clickhouse/config.d/zookeeper.xml b/tests/testflows/ldap/authentication/configs/clickhouse/config.d/zookeeper.xml new file mode 100644 index 00000000000..96270e7b645 --- /dev/null +++ b/tests/testflows/ldap/authentication/configs/clickhouse/config.d/zookeeper.xml @@ -0,0 +1,10 @@ + + + + + zookeeper + 2181 + + 15000 + + diff --git a/tests/testflows/ldap/authentication/configs/clickhouse/config.xml b/tests/testflows/ldap/authentication/configs/clickhouse/config.xml new file mode 100644 index 00000000000..e28a0c8e255 --- /dev/null +++ b/tests/testflows/ldap/authentication/configs/clickhouse/config.xml @@ -0,0 +1,442 @@ + + + + + + trace + /var/log/clickhouse-server/clickhouse-server.log + /var/log/clickhouse-server/clickhouse-server.err.log + 1000M + 10 + + + + 8123 + 9000 + + + + + + + + + /etc/clickhouse-server/server.crt + /etc/clickhouse-server/server.key + + /etc/clickhouse-server/dhparam.pem + none + true + true + sslv2,sslv3 + true + + + + true + true + sslv2,sslv3 + true + + + + RejectCertificateHandler + + + + + + + + + 9009 + + + + + + + + + + + + + + + + + + + + 4096 + 3 + + + 100 + + + + + + 8589934592 + + + 5368709120 + + + + /var/lib/clickhouse/ + + + /var/lib/clickhouse/tmp/ + + + /var/lib/clickhouse/user_files/ + + + + + + users.xml + + + + /var/lib/clickhouse/access/ + + + + + default + + + + + + default + + + + + + + + + false + + + + + + + + localhost + 9000 + + + + + + + localhost + 9000 + + + + + localhost + 9000 + + + + + + + localhost + 9440 + 1 + + + + + + + localhost + 9000 + + + + + localhost + 1 + + + + + + + + + + + + + + + + + 3600 + + + + 3600 + + + 60 + + + + + + + + + + system + query_log
+ + toYYYYMM(event_date) + + 7500 +
+ + + + system + trace_log
+ + toYYYYMM(event_date) + 7500 +
+ + + + system + query_thread_log
+ toYYYYMM(event_date) + 7500 +
+ + + + + + + + + + + + + + + + *_dictionary.xml + + + + + + + + + + /clickhouse/task_queue/ddl + + + + + + + + + + + + + + + + click_cost + any + + 0 + 3600 + + + 86400 + 60 + + + + max + + 0 + 60 + + + 3600 + 300 + + + 86400 + 3600 + + + + + + /var/lib/clickhouse/format_schemas/ + + + +
diff --git a/tests/testflows/ldap/authentication/configs/clickhouse/ssl/dhparam.pem b/tests/testflows/ldap/authentication/configs/clickhouse/ssl/dhparam.pem new file mode 100644 index 00000000000..2e6cee0798d --- /dev/null +++ b/tests/testflows/ldap/authentication/configs/clickhouse/ssl/dhparam.pem @@ -0,0 +1,8 @@ +-----BEGIN DH PARAMETERS----- +MIIBCAKCAQEAua92DDli13gJ+//ZXyGaggjIuidqB0crXfhUlsrBk9BV1hH3i7fR +XGP9rUdk2ubnB3k2ejBStL5oBrkHm9SzUFSQHqfDjLZjKoUpOEmuDc4cHvX1XTR5 +Pr1vf5cd0yEncJWG5W4zyUB8k++SUdL2qaeslSs+f491HBLDYn/h8zCgRbBvxhxb +9qeho1xcbnWeqkN6Kc9bgGozA16P9NLuuLttNnOblkH+lMBf42BSne/TWt3AlGZf +slKmmZcySUhF8aKfJnLKbkBCFqOtFRh8zBA9a7g+BT/lSANATCDPaAk1YVih2EKb +dpc3briTDbRsiqg2JKMI7+VdULY9bh3EawIBAg== +-----END DH PARAMETERS----- diff --git a/tests/testflows/ldap/authentication/configs/clickhouse/ssl/server.crt b/tests/testflows/ldap/authentication/configs/clickhouse/ssl/server.crt new file mode 100644 index 00000000000..7ade2d96273 --- /dev/null +++ b/tests/testflows/ldap/authentication/configs/clickhouse/ssl/server.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIC/TCCAeWgAwIBAgIJANjx1QSR77HBMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV +BAMMCWxvY2FsaG9zdDAgFw0xODA3MzAxODE2MDhaGA8yMjkyMDUxNDE4MTYwOFow +FDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAs9uSo6lJG8o8pw0fbVGVu0tPOljSWcVSXH9uiJBwlZLQnhN4SFSFohfI +4K8U1tBDTnxPLUo/V1K9yzoLiRDGMkwVj6+4+hE2udS2ePTQv5oaMeJ9wrs+5c9T +4pOtlq3pLAdm04ZMB1nbrEysceVudHRkQbGHzHp6VG29Fw7Ga6YpqyHQihRmEkTU +7UCYNA+Vk7aDPdMS/khweyTpXYZimaK9f0ECU3/VOeG3fH6Sp2X6FN4tUj/aFXEj +sRmU5G2TlYiSIUMF2JPdhSihfk1hJVALrHPTU38SOL+GyyBRWdNcrIwVwbpvsvPg +pryMSNxnpr0AK0dFhjwnupIv5hJIOQIDAQABo1AwTjAdBgNVHQ4EFgQUjPLb3uYC +kcamyZHK4/EV8jAP0wQwHwYDVR0jBBgwFoAUjPLb3uYCkcamyZHK4/EV8jAP0wQw +DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAM/ocuDvfPus/KpMVD51j +4IdlU8R0vmnYLQ+ygzOAo7+hUWP5j0yvq4ILWNmQX6HNvUggCgFv9bjwDFhb/5Vr +85ieWfTd9+LTjrOzTw4avdGwpX9G+6jJJSSq15tw5ElOIFb/qNA9O4dBiu8vn03C +L/zRSXrARhSqTW5w/tZkUcSTT+M5h28+Lgn9ysx4Ff5vi44LJ1NnrbJbEAIYsAAD ++UA+4MBFKx1r6hHINULev8+lCfkpwIaeS8RL+op4fr6kQPxnULw8wT8gkuc8I4+L +P9gg/xDHB44T3ADGZ5Ib6O0DJaNiToO6rnoaaxs0KkotbvDWvRoxEytSbXKoYjYp +0g== +-----END CERTIFICATE----- diff --git a/tests/testflows/ldap/authentication/configs/clickhouse/ssl/server.key b/tests/testflows/ldap/authentication/configs/clickhouse/ssl/server.key new file mode 100644 index 00000000000..f0fb61ac443 --- /dev/null +++ b/tests/testflows/ldap/authentication/configs/clickhouse/ssl/server.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCz25KjqUkbyjyn +DR9tUZW7S086WNJZxVJcf26IkHCVktCeE3hIVIWiF8jgrxTW0ENOfE8tSj9XUr3L +OguJEMYyTBWPr7j6ETa51LZ49NC/mhox4n3Cuz7lz1Pik62WreksB2bThkwHWdus +TKxx5W50dGRBsYfMenpUbb0XDsZrpimrIdCKFGYSRNTtQJg0D5WTtoM90xL+SHB7 +JOldhmKZor1/QQJTf9U54bd8fpKnZfoU3i1SP9oVcSOxGZTkbZOViJIhQwXYk92F +KKF+TWElUAusc9NTfxI4v4bLIFFZ01ysjBXBum+y8+CmvIxI3GemvQArR0WGPCe6 +ki/mEkg5AgMBAAECggEATrbIBIxwDJOD2/BoUqWkDCY3dGevF8697vFuZKIiQ7PP +TX9j4vPq0DfsmDjHvAPFkTHiTQXzlroFik3LAp+uvhCCVzImmHq0IrwvZ9xtB43f +7Pkc5P6h1l3Ybo8HJ6zRIY3TuLtLxuPSuiOMTQSGRL0zq3SQ5DKuGwkz+kVjHXUN +MR2TECFwMHKQ5VLrC+7PMpsJYyOMlDAWhRfUalxC55xOXTpaN8TxNnwQ8K2ISVY5 +212Jz/a4hn4LdwxSz3Tiu95PN072K87HLWx3EdT6vW4Ge5P/A3y+smIuNAlanMnu +plHBRtpATLiTxZt/n6npyrfQVbYjSH7KWhB8hBHtaQKBgQDh9Cq1c/KtqDtE0Ccr +/r9tZNTUwBE6VP+3OJeKdEdtsfuxjOCkS1oAjgBJiSDOiWPh1DdoDeVZjPKq6pIu +Mq12OE3Doa8znfCXGbkSzEKOb2unKZMJxzrz99kXt40W5DtrqKPNb24CNqTiY8Aa +CjtcX+3weat82VRXvph6U8ltMwKBgQDLxjiQQzNoY7qvg7CwJCjf9qq8jmLK766g +1FHXopqS+dTxDLM8eJSRrpmxGWJvNeNc1uPhsKsKgotqAMdBUQTf7rSTbt4MyoH5 +bUcRLtr+0QTK9hDWMOOvleqNXha68vATkohWYfCueNsC60qD44o8RZAS6UNy3ENq +cM1cxqe84wKBgQDKkHutWnooJtajlTxY27O/nZKT/HA1bDgniMuKaz4R4Gr1PIez +on3YW3V0d0P7BP6PWRIm7bY79vkiMtLEKdiKUGWeyZdo3eHvhDb/3DCawtau8L2K +GZsHVp2//mS1Lfz7Qh8/L/NedqCQ+L4iWiPnZ3THjjwn3CoZ05ucpvrAMwKBgB54 +nay039MUVq44Owub3KDg+dcIU62U+cAC/9oG7qZbxYPmKkc4oL7IJSNecGHA5SbU +2268RFdl/gLz6tfRjbEOuOHzCjFPdvAdbysanpTMHLNc6FefJ+zxtgk9sJh0C4Jh +vxFrw9nTKKzfEl12gQ1SOaEaUIO0fEBGbe8ZpauRAoGAMAlGV+2/K4ebvAJKOVTa +dKAzQ+TD2SJmeR1HZmKDYddNqwtZlzg3v4ZhCk4eaUmGeC1Bdh8MDuB3QQvXz4Dr +vOIP4UVaOr+uM+7TgAgVnP4/K6IeJGzUDhX93pmpWhODfdu/oojEKVcpCojmEmS1 +KCBtmIrQLqzMpnBpLNuSY+Q= +-----END PRIVATE KEY----- diff --git a/tests/testflows/ldap/authentication/configs/clickhouse/users.xml b/tests/testflows/ldap/authentication/configs/clickhouse/users.xml new file mode 100644 index 00000000000..86b2cd9e1e3 --- /dev/null +++ b/tests/testflows/ldap/authentication/configs/clickhouse/users.xml @@ -0,0 +1,133 @@ + + + + + + + + 10000000000 + + + 0 + + + random + + + + + 1 + + + + + + + + + + + + + ::/0 + + + + default + + + default + + + 1 + + + + + + + + + + + + + + + + + 3600 + + + 0 + 0 + 0 + 0 + 0 + + + + diff --git a/tests/testflows/ldap/authentication/configs/clickhouse1/config.d/macros.xml b/tests/testflows/ldap/authentication/configs/clickhouse1/config.d/macros.xml new file mode 100644 index 00000000000..6cdcc1b440c --- /dev/null +++ b/tests/testflows/ldap/authentication/configs/clickhouse1/config.d/macros.xml @@ -0,0 +1,8 @@ + + + + clickhouse1 + 01 + 01 + + diff --git a/tests/testflows/ldap/authentication/configs/clickhouse2/config.d/macros.xml b/tests/testflows/ldap/authentication/configs/clickhouse2/config.d/macros.xml new file mode 100644 index 00000000000..a114a9ce4ab --- /dev/null +++ b/tests/testflows/ldap/authentication/configs/clickhouse2/config.d/macros.xml @@ -0,0 +1,8 @@ + + + + clickhouse2 + 01 + 02 + + diff --git a/tests/testflows/ldap/authentication/configs/clickhouse3/config.d/macros.xml b/tests/testflows/ldap/authentication/configs/clickhouse3/config.d/macros.xml new file mode 100644 index 00000000000..904a27b0172 --- /dev/null +++ b/tests/testflows/ldap/authentication/configs/clickhouse3/config.d/macros.xml @@ -0,0 +1,8 @@ + + + + clickhouse3 + 01 + 03 + + diff --git a/tests/testflows/ldap/configs/ldap1/config/export.ldif b/tests/testflows/ldap/authentication/configs/ldap1/config/export.ldif similarity index 100% rename from tests/testflows/ldap/configs/ldap1/config/export.ldif rename to tests/testflows/ldap/authentication/configs/ldap1/config/export.ldif diff --git a/tests/testflows/ldap/configs/ldap2/certs/ca.crt b/tests/testflows/ldap/authentication/configs/ldap2/certs/ca.crt similarity index 100% rename from tests/testflows/ldap/configs/ldap2/certs/ca.crt rename to tests/testflows/ldap/authentication/configs/ldap2/certs/ca.crt diff --git a/tests/testflows/ldap/configs/ldap2/certs/dhparam.pem b/tests/testflows/ldap/authentication/configs/ldap2/certs/dhparam.pem similarity index 100% rename from tests/testflows/ldap/configs/ldap2/certs/dhparam.pem rename to tests/testflows/ldap/authentication/configs/ldap2/certs/dhparam.pem diff --git a/tests/testflows/ldap/configs/ldap2/certs/ldap.crt b/tests/testflows/ldap/authentication/configs/ldap2/certs/ldap.crt similarity index 100% rename from tests/testflows/ldap/configs/ldap2/certs/ldap.crt rename to tests/testflows/ldap/authentication/configs/ldap2/certs/ldap.crt diff --git a/tests/testflows/ldap/configs/ldap2/certs/ldap.csr b/tests/testflows/ldap/authentication/configs/ldap2/certs/ldap.csr similarity index 100% rename from tests/testflows/ldap/configs/ldap2/certs/ldap.csr rename to tests/testflows/ldap/authentication/configs/ldap2/certs/ldap.csr diff --git a/tests/testflows/ldap/configs/ldap2/certs/ldap.key b/tests/testflows/ldap/authentication/configs/ldap2/certs/ldap.key similarity index 100% rename from tests/testflows/ldap/configs/ldap2/certs/ldap.key rename to tests/testflows/ldap/authentication/configs/ldap2/certs/ldap.key diff --git a/tests/testflows/ldap/configs/ldap2/config/export.ldif b/tests/testflows/ldap/authentication/configs/ldap2/config/export.ldif similarity index 100% rename from tests/testflows/ldap/configs/ldap2/config/export.ldif rename to tests/testflows/ldap/authentication/configs/ldap2/config/export.ldif diff --git a/tests/testflows/ldap/configs/ldap3/certs/ca.crt b/tests/testflows/ldap/authentication/configs/ldap3/certs/ca.crt similarity index 100% rename from tests/testflows/ldap/configs/ldap3/certs/ca.crt rename to tests/testflows/ldap/authentication/configs/ldap3/certs/ca.crt diff --git a/tests/testflows/ldap/configs/ldap3/certs/dhparam.pem b/tests/testflows/ldap/authentication/configs/ldap3/certs/dhparam.pem similarity index 100% rename from tests/testflows/ldap/configs/ldap3/certs/dhparam.pem rename to tests/testflows/ldap/authentication/configs/ldap3/certs/dhparam.pem diff --git a/tests/testflows/ldap/configs/ldap3/certs/ldap.crt b/tests/testflows/ldap/authentication/configs/ldap3/certs/ldap.crt similarity index 100% rename from tests/testflows/ldap/configs/ldap3/certs/ldap.crt rename to tests/testflows/ldap/authentication/configs/ldap3/certs/ldap.crt diff --git a/tests/testflows/ldap/configs/ldap3/certs/ldap.csr b/tests/testflows/ldap/authentication/configs/ldap3/certs/ldap.csr similarity index 100% rename from tests/testflows/ldap/configs/ldap3/certs/ldap.csr rename to tests/testflows/ldap/authentication/configs/ldap3/certs/ldap.csr diff --git a/tests/testflows/ldap/configs/ldap3/certs/ldap.key b/tests/testflows/ldap/authentication/configs/ldap3/certs/ldap.key similarity index 100% rename from tests/testflows/ldap/configs/ldap3/certs/ldap.key rename to tests/testflows/ldap/authentication/configs/ldap3/certs/ldap.key diff --git a/tests/testflows/ldap/configs/ldap3/config/export.ldif b/tests/testflows/ldap/authentication/configs/ldap3/config/export.ldif similarity index 100% rename from tests/testflows/ldap/configs/ldap3/config/export.ldif rename to tests/testflows/ldap/authentication/configs/ldap3/config/export.ldif diff --git a/tests/testflows/ldap/configs/ldap4/certs/ca.crt b/tests/testflows/ldap/authentication/configs/ldap4/certs/ca.crt similarity index 100% rename from tests/testflows/ldap/configs/ldap4/certs/ca.crt rename to tests/testflows/ldap/authentication/configs/ldap4/certs/ca.crt diff --git a/tests/testflows/ldap/configs/ldap4/certs/dhparam.pem b/tests/testflows/ldap/authentication/configs/ldap4/certs/dhparam.pem similarity index 100% rename from tests/testflows/ldap/configs/ldap4/certs/dhparam.pem rename to tests/testflows/ldap/authentication/configs/ldap4/certs/dhparam.pem diff --git a/tests/testflows/ldap/configs/ldap4/certs/ldap.crt b/tests/testflows/ldap/authentication/configs/ldap4/certs/ldap.crt similarity index 100% rename from tests/testflows/ldap/configs/ldap4/certs/ldap.crt rename to tests/testflows/ldap/authentication/configs/ldap4/certs/ldap.crt diff --git a/tests/testflows/ldap/configs/ldap4/certs/ldap.csr b/tests/testflows/ldap/authentication/configs/ldap4/certs/ldap.csr similarity index 100% rename from tests/testflows/ldap/configs/ldap4/certs/ldap.csr rename to tests/testflows/ldap/authentication/configs/ldap4/certs/ldap.csr diff --git a/tests/testflows/ldap/configs/ldap4/certs/ldap.key b/tests/testflows/ldap/authentication/configs/ldap4/certs/ldap.key similarity index 100% rename from tests/testflows/ldap/configs/ldap4/certs/ldap.key rename to tests/testflows/ldap/authentication/configs/ldap4/certs/ldap.key diff --git a/tests/testflows/ldap/configs/ldap4/config/export.ldif b/tests/testflows/ldap/authentication/configs/ldap4/config/export.ldif similarity index 100% rename from tests/testflows/ldap/configs/ldap4/config/export.ldif rename to tests/testflows/ldap/authentication/configs/ldap4/config/export.ldif diff --git a/tests/testflows/ldap/configs/ldap5/config/export.ldif b/tests/testflows/ldap/authentication/configs/ldap5/config/export.ldif similarity index 100% rename from tests/testflows/ldap/configs/ldap5/config/export.ldif rename to tests/testflows/ldap/authentication/configs/ldap5/config/export.ldif diff --git a/tests/testflows/ldap/configs/ldap5/ldap2/certs/ca.crt b/tests/testflows/ldap/authentication/configs/ldap5/ldap2/certs/ca.crt similarity index 100% rename from tests/testflows/ldap/configs/ldap5/ldap2/certs/ca.crt rename to tests/testflows/ldap/authentication/configs/ldap5/ldap2/certs/ca.crt diff --git a/tests/testflows/ldap/configs/ldap5/ldap2/certs/dhparam.pem b/tests/testflows/ldap/authentication/configs/ldap5/ldap2/certs/dhparam.pem similarity index 100% rename from tests/testflows/ldap/configs/ldap5/ldap2/certs/dhparam.pem rename to tests/testflows/ldap/authentication/configs/ldap5/ldap2/certs/dhparam.pem diff --git a/tests/testflows/ldap/configs/ldap5/ldap2/certs/ldap.crt b/tests/testflows/ldap/authentication/configs/ldap5/ldap2/certs/ldap.crt similarity index 100% rename from tests/testflows/ldap/configs/ldap5/ldap2/certs/ldap.crt rename to tests/testflows/ldap/authentication/configs/ldap5/ldap2/certs/ldap.crt diff --git a/tests/testflows/ldap/configs/ldap5/ldap2/certs/ldap.csr b/tests/testflows/ldap/authentication/configs/ldap5/ldap2/certs/ldap.csr similarity index 100% rename from tests/testflows/ldap/configs/ldap5/ldap2/certs/ldap.csr rename to tests/testflows/ldap/authentication/configs/ldap5/ldap2/certs/ldap.csr diff --git a/tests/testflows/ldap/configs/ldap5/ldap2/certs/ldap.key b/tests/testflows/ldap/authentication/configs/ldap5/ldap2/certs/ldap.key similarity index 100% rename from tests/testflows/ldap/configs/ldap5/ldap2/certs/ldap.key rename to tests/testflows/ldap/authentication/configs/ldap5/ldap2/certs/ldap.key diff --git a/tests/testflows/ldap/configs/ldap5/ldap2/config/export.ldif b/tests/testflows/ldap/authentication/configs/ldap5/ldap2/config/export.ldif similarity index 100% rename from tests/testflows/ldap/configs/ldap5/ldap2/config/export.ldif rename to tests/testflows/ldap/authentication/configs/ldap5/ldap2/config/export.ldif diff --git a/tests/testflows/ldap/docker-compose/clickhouse-service.yml b/tests/testflows/ldap/authentication/docker-compose/clickhouse-service.yml similarity index 100% rename from tests/testflows/ldap/docker-compose/clickhouse-service.yml rename to tests/testflows/ldap/authentication/docker-compose/clickhouse-service.yml diff --git a/tests/testflows/ldap/docker-compose/docker-compose.yml b/tests/testflows/ldap/authentication/docker-compose/docker-compose.yml similarity index 100% rename from tests/testflows/ldap/docker-compose/docker-compose.yml rename to tests/testflows/ldap/authentication/docker-compose/docker-compose.yml diff --git a/tests/testflows/ldap/docker-compose/openldap-service.yml b/tests/testflows/ldap/authentication/docker-compose/openldap-service.yml similarity index 100% rename from tests/testflows/ldap/docker-compose/openldap-service.yml rename to tests/testflows/ldap/authentication/docker-compose/openldap-service.yml diff --git a/tests/testflows/ldap/docker-compose/zookeeper-service.yml b/tests/testflows/ldap/authentication/docker-compose/zookeeper-service.yml similarity index 100% rename from tests/testflows/ldap/docker-compose/zookeeper-service.yml rename to tests/testflows/ldap/authentication/docker-compose/zookeeper-service.yml diff --git a/tests/testflows/ldap/authentication/regression.py b/tests/testflows/ldap/authentication/regression.py new file mode 100755 index 00000000000..9d0a5ca743f --- /dev/null +++ b/tests/testflows/ldap/authentication/regression.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +import sys +from testflows.core import * + +append_path(sys.path, "..", "..") + +from helpers.cluster import Cluster +from helpers.argparser import argparser +from ldap.authentication.requirements import * + +# Cross-outs of known fails +xfails = { + "connection protocols/tls/tls_require_cert='try'": + [(Fail, "can't be tested with self-signed certificates")], + "connection protocols/tls/tls_require_cert='demand'": + [(Fail, "can't be tested with self-signed certificates")], + "connection protocols/starttls/tls_require_cert='try'": + [(Fail, "can't be tested with self-signed certificates")], + "connection protocols/starttls/tls_require_cert='demand'": + [(Fail, "can't be tested with self-signed certificates")], + "connection protocols/tls require cert default demand": + [(Fail, "can't be tested with self-signed certificates")], + "connection protocols/starttls with custom port": + [(Fail, "it seems that starttls is not enabled by default on custom plain-text ports in LDAP server")], + "connection protocols/tls cipher suite": + [(Fail, "can't get it to work")] +} + +@TestFeature +@Name("authentication") +@ArgumentParser(argparser) +@Requirements( + RQ_SRS_007_LDAP_Authentication("1.0") +) +@XFails(xfails) +def regression(self, local, clickhouse_binary_path): + """ClickHouse integration with LDAP regression module. + """ + nodes = { + "clickhouse": ("clickhouse1", "clickhouse2", "clickhouse3"), + } + + with Cluster(local, clickhouse_binary_path, nodes=nodes) as cluster: + self.context.cluster = cluster + + Scenario(run=load("ldap.authentication.tests.sanity", "scenario")) + Scenario(run=load("ldap.authentication.tests.multiple_servers", "scenario")) + Feature(run=load("ldap.authentication.tests.connections", "feature")) + Feature(run=load("ldap.authentication.tests.server_config", "feature")) + Feature(run=load("ldap.authentication.tests.user_config", "feature")) + Feature(run=load("ldap.authentication.tests.authentications", "feature")) + +if main(): + regression() diff --git a/tests/testflows/ldap/authentication/requirements/__init__.py b/tests/testflows/ldap/authentication/requirements/__init__.py new file mode 100644 index 00000000000..02f7d430154 --- /dev/null +++ b/tests/testflows/ldap/authentication/requirements/__init__.py @@ -0,0 +1 @@ +from .requirements import * diff --git a/tests/testflows/ldap/requirements/requirements.md b/tests/testflows/ldap/authentication/requirements/requirements.md similarity index 98% rename from tests/testflows/ldap/requirements/requirements.md rename to tests/testflows/ldap/authentication/requirements/requirements.md index 6d787670138..d322db70330 100644 --- a/tests/testflows/ldap/requirements/requirements.md +++ b/tests/testflows/ldap/authentication/requirements/requirements.md @@ -524,9 +524,6 @@ used to authenticate users using an [LDAP] server. ## References * **ClickHouse:** https://clickhouse.tech -* **GitHub repository:** https://github.com/ClickHouse/ClickHouse/blob/master/tests/testflows/ldap/requirements/requirements.md -* **Revision history:** https://github.com/ClickHouse/ClickHouse/commits/master/tests/testflows/ldap/requirements/requirements.md -* **Git:** https://git-scm.com/ [Anonymous Authentication Mechanism of Simple Bind]: https://ldapwiki.com/wiki/Simple%20Authentication#section-Simple+Authentication-AnonymousAuthenticationMechanismOfSimpleBind [Unauthenticated Authentication Mechanism of Simple Bind]: https://ldapwiki.com/wiki/Simple%20Authentication#section-Simple+Authentication-UnauthenticatedAuthenticationMechanismOfSimpleBind @@ -539,6 +536,6 @@ used to authenticate users using an [LDAP] server. [LDAP]: https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol [ClickHouse]: https://clickhouse.tech [GitHub]: https://github.com -[GitHub Repository]: https://github.com/ClickHouse/ClickHouse/blob/master/tests/testflows/ldap/requirements/requirements.md -[Revision History]: https://github.com/ClickHouse/ClickHouse/commits/master/tests/testflows/ldap/requirements/requirements.md +[GitHub Repository]: https://github.com/ClickHouse/ClickHouse/blob/master/tests/testflows/ldap/authentication/requirements/requirements.md +[Revision History]: https://github.com/ClickHouse/ClickHouse/commits/master/tests/testflows/ldap/authentication/requirements/requirements.md [Git]: https://git-scm.com/ diff --git a/tests/testflows/ldap/requirements/requirements.py b/tests/testflows/ldap/authentication/requirements/requirements.py similarity index 100% rename from tests/testflows/ldap/requirements/requirements.py rename to tests/testflows/ldap/authentication/requirements/requirements.py diff --git a/tests/testflows/ldap/tests/authentications.py b/tests/testflows/ldap/authentication/tests/authentications.py similarity index 99% rename from tests/testflows/ldap/tests/authentications.py rename to tests/testflows/ldap/authentication/tests/authentications.py index a1fb27bd51a..1b21dce7cc1 100644 --- a/tests/testflows/ldap/tests/authentications.py +++ b/tests/testflows/ldap/authentication/tests/authentications.py @@ -4,8 +4,8 @@ import random from multiprocessing.dummy import Pool from testflows.core import * from testflows.asserts import error -from ldap.tests.common import * -from ldap.requirements import * +from ldap.authentication.tests.common import * +from ldap.authentication.requirements import * servers = { "openldap1": { diff --git a/tests/testflows/ldap/tests/common.py b/tests/testflows/ldap/authentication/tests/common.py similarity index 78% rename from tests/testflows/ldap/tests/common.py rename to tests/testflows/ldap/authentication/tests/common.py index c065576c9d4..cf5cfc1d573 100644 --- a/tests/testflows/ldap/tests/common.py +++ b/tests/testflows/ldap/authentication/tests/common.py @@ -47,6 +47,37 @@ ASCII_CHARS = string.ascii_lowercase + string.ascii_uppercase + string.digits def randomword(length, chars=ASCII_CHARS): return ''.join(random.choice(chars) for i in range(length)) +def restart(node=None, safe=False, timeout=20): + """Restart ClickHouse server and wait for config to be reloaded. + """ + with When("I restart ClickHouse server node"): + if node is None: + node = current().context.node + + with node.cluster.shell(node.name) as bash: + bash.expect(bash.prompt) + + with By("closing terminal to the node to be restarted"): + bash.close() + + with And("getting current log size"): + logsize = \ + node.command("ls -s --block-size=1 /var/log/clickhouse-server/clickhouse-server.log").output.split(" ")[ + 0].strip() + + with And("restarting ClickHouse server"): + node.restart(safe=safe) + + with Then("tailing the log file from using previous log size as the offset"): + bash.prompt = bash.__class__.prompt + bash.open() + bash.send(f"tail -c +{logsize} -f /var/log/clickhouse-server/clickhouse-server.log") + + with And("waiting for config reload message in the log file"): + bash.expect( + f"ConfigReloader: Loaded config '/etc/clickhouse-server/config.xml', performed update on configuration", + timeout=timeout) + def add_config(config, timeout=20, restart=False): """Add dynamic configuration file to ClickHouse. @@ -54,6 +85,48 @@ def add_config(config, timeout=20, restart=False): :param config: configuration file description :param timeout: timeout, default: 20 sec """ + def check_preprocessed_config_is_updated(): + """Check that preprocessed config is updated. + """ + started = time.time() + command = f"cat /var/lib/clickhouse/preprocessed_configs/{config.preprocessed_name} | grep {config.uid}{' > /dev/null' if not settings.debug else ''}" + while time.time() - started < timeout: + exitcode = node.command(command, steps=False).exitcode + if exitcode == 0: + break + time.sleep(1) + assert exitcode == 0, error() + + def wait_for_config_to_be_loaded(): + """Wait for config to be loaded. + """ + if restart: + with When("I close terminal to the node to be restarted"): + bash.close() + + with And("I get the current log size"): + logsize = \ + node.command("ls -s --block-size=1 /var/log/clickhouse-server/clickhouse-server.log").output.split(" ")[ + 0].strip() + + with And("I restart ClickHouse to apply the config changes"): + node.restart(safe=False) + + with Then("I tail the log file from using previous log size as the offset"): + bash.prompt = bash.__class__.prompt + bash.open() + bash.send(f"tail -c +{logsize} -f /var/log/clickhouse-server/clickhouse-server.log") + + with Then("I wait for config reload message in the log file"): + if restart: + bash.expect( + f"ConfigReloader: Loaded config '/etc/clickhouse-server/config.xml', performed update on configuration", + timeout=timeout) + else: + bash.expect( + f"ConfigReloader: Loaded config '/etc/clickhouse-server/{config.preprocessed_name}', performed update on configuration", + timeout=timeout) + node = current().context.node try: with Given(f"{config.name}"): @@ -70,29 +143,10 @@ def add_config(config, timeout=20, restart=False): node.command(command, steps=False, exitcode=0) with Then(f"{config.preprocessed_name} should be updated", description=f"timeout {timeout}"): - started = time.time() - command = f"cat /var/lib/clickhouse/preprocessed_configs/{config.preprocessed_name} | grep {config.uid}{' > /dev/null' if not settings.debug else ''}" - while time.time() - started < timeout: - exitcode = node.command(command, steps=False).exitcode - if exitcode == 0: - break - time.sleep(1) - assert exitcode == 0, error() + check_preprocessed_config_is_updated() - if restart: - bash.close() - logsize = node.command("ls -s --block-size=1 /var/log/clickhouse-server/clickhouse-server.log").output.split(" ")[0].strip() - with When("I restart ClickHouse to apply the config changes"): - node.restart(safe=False) - bash.prompt = bash.__class__.prompt - bash.open() - bash.send(f"tail -c +{logsize} -f /var/log/clickhouse-server/clickhouse-server.log") - - with When("I wait for config to be loaded"): - if restart: - bash.expect(f"ConfigReloader: Loaded config '/etc/clickhouse-server/config.xml', performed update on configuration", timeout=timeout) - else: - bash.expect(f"ConfigReloader: Loaded config '/etc/clickhouse-server/{config.preprocessed_name}', performed update on configuration", timeout=timeout) + with And("I wait for config to be reloaded"): + wait_for_config_to_be_loaded() yield finally: with Finally(f"I remove {config.name}"): @@ -103,20 +157,11 @@ def add_config(config, timeout=20, restart=False): with By("removing the config file", description=config.path): node.command(f"rm -rf {config.path}", exitcode=0) - with Then(f"{config.preprocessed_name} should be updated"): - started = time.time() - command = f"cat /var/lib/clickhouse/preprocessed_configs/{config.preprocessed_name} | grep '{config.uid}'{' > /dev/null' if not settings.debug else ''}" - while time.time() - started < timeout: - exitcode = node.command(command, steps=False).exitcode - if exitcode == 1: - break - time.sleep(1) - assert exitcode == 1, error() - - with When("I wait for config to be loaded"): - started = time.time() - bash.expect(f"ConfigReloader: Loaded config '/etc/clickhouse-server/{config.preprocessed_name}', performed update on configuration", timeout=timeout) + with Then(f"{config.preprocessed_name} should be updated", description=f"timeout {timeout}"): + check_preprocessed_config_is_updated() + with And("I wait for config to be reloaded"): + wait_for_config_to_be_loaded() def create_ldap_servers_config_content(servers, config_d_dir="/etc/clickhouse-server/config.d", config_file="ldap_servers.xml"): """Create LDAP servers configuration content. @@ -172,7 +217,7 @@ def create_ldap_users_config_content(*users, config_d_dir="/etc/clickhouse-serve return Config(content, path, name, uid, "users.xml") def add_users_identified_with_ldap(*users): - """Add one or more users that are identified via + """Add one or more users that are identified via an ldap server using RBAC. """ node = current().context.node @@ -288,6 +333,7 @@ def add_user_to_ldap(cn, userpassword, givenname=None, homedirectory=None, sn=No } lines = [] + for key, value in list(user.items()): if key.startswith("_"): continue diff --git a/tests/testflows/ldap/tests/connections.py b/tests/testflows/ldap/authentication/tests/connections.py similarity index 98% rename from tests/testflows/ldap/tests/connections.py rename to tests/testflows/ldap/authentication/tests/connections.py index 8de4b3f4d01..f16f6c29b0e 100644 --- a/tests/testflows/ldap/tests/connections.py +++ b/tests/testflows/ldap/authentication/tests/connections.py @@ -1,8 +1,8 @@ from testflows.core import * from testflows.asserts import error -from ldap.tests.common import login -from ldap.requirements import * +from ldap.authentication.tests.common import login +from ldap.authentication.requirements import * @TestScenario @Requirements( diff --git a/tests/testflows/ldap/tests/multiple_servers.py b/tests/testflows/ldap/authentication/tests/multiple_servers.py similarity index 88% rename from tests/testflows/ldap/tests/multiple_servers.py rename to tests/testflows/ldap/authentication/tests/multiple_servers.py index aefc0116fa2..6e906023b0a 100644 --- a/tests/testflows/ldap/tests/multiple_servers.py +++ b/tests/testflows/ldap/authentication/tests/multiple_servers.py @@ -1,8 +1,8 @@ from testflows.core import * from testflows.asserts import error -from ldap.tests.common import login -from ldap.requirements import RQ_SRS_007_LDAP_Authentication_MultipleServers +from ldap.authentication.tests.common import login +from ldap.authentication.requirements import RQ_SRS_007_LDAP_Authentication_MultipleServers @TestScenario @Name("multiple servers") diff --git a/tests/testflows/ldap/tests/sanity.py b/tests/testflows/ldap/authentication/tests/sanity.py similarity index 95% rename from tests/testflows/ldap/tests/sanity.py rename to tests/testflows/ldap/authentication/tests/sanity.py index 9e5d8a2ddd7..542fa2a48b1 100644 --- a/tests/testflows/ldap/tests/sanity.py +++ b/tests/testflows/ldap/authentication/tests/sanity.py @@ -1,7 +1,7 @@ from testflows.core import * from testflows.asserts import error -from ldap.tests.common import add_user_to_ldap, delete_user_from_ldap +from ldap.authentication.tests.common import add_user_to_ldap, delete_user_from_ldap @TestScenario @Name("sanity") diff --git a/tests/testflows/ldap/tests/server_config.py b/tests/testflows/ldap/authentication/tests/server_config.py similarity index 84% rename from tests/testflows/ldap/tests/server_config.py rename to tests/testflows/ldap/authentication/tests/server_config.py index f3d03434afe..80f2a496b0e 100644 --- a/tests/testflows/ldap/tests/server_config.py +++ b/tests/testflows/ldap/authentication/tests/server_config.py @@ -1,7 +1,7 @@ from testflows.core import * -from ldap.tests.common import * -from ldap.requirements import * +from ldap.authentication.tests.common import * +from ldap.authentication.requirements import * @TestScenario @Requirements( @@ -28,7 +28,8 @@ def invalid_host(self): servers = {"foo": {"host": "foo", "port": "389", "enable_tls": "no"}} users = [{ "server": "foo", "username": "user1", "password": "user1", "login": True, - "exitcode": 20, "message": "DB::Exception: Can't contact LDAP server" + "exitcode": 4, + "message": "DB::Exception: user1: Authentication failed: password is incorrect or there is no user with such name" }] login(servers, *users) @@ -44,7 +45,8 @@ def empty_host(self): servers = {"foo": {"host": "", "port": "389", "enable_tls": "no"}} users = [{ "server": "foo", "username": "user1", "password": "user1", "login": True, - "exitcode": 36, "message": "DB::Exception: LDAP server 'foo' is not configured." + "exitcode": 4, + "message": "DB::Exception: user1: Authentication failed: password is incorrect or there is no user with such name" }] login(servers, *users) @@ -60,7 +62,8 @@ def missing_host(self): servers = {"foo": {"port": "389", "enable_tls": "no"}} users = [{ "server": "foo", "username": "user1", "password": "user1", "login": True, - "exitcode": 36, "message": "DB::Exception: LDAP server 'foo' is not configured." + "exitcode": 4, + "message": "DB::Exception: user1: Authentication failed: password is incorrect or there is no user with such name" }] login(servers, *users) @@ -75,7 +78,8 @@ def invalid_port(self): servers = {"openldap1": {"host": "openldap1", "port": "3890", "enable_tls": "no"}} users = [{ "server": "openldap1", "username": "user1", "password": "user1", "login": True, - "exitcode": 20, "message": "DB::Exception: Can't contact LDAP server." + "exitcode": 4, + "message": "DB::Exception: user1: Authentication failed: password is incorrect or there is no user with such name" }] login(servers, *users) @@ -93,7 +97,8 @@ def invalid_auth_dn_prefix(self): }} users = [{ "server": "openldap1", "username": "user1", "password": "user1", "login": True, - "exitcode": 20, "message": "DB::Exception: Invalid DN syntax: invalid DN" + "exitcode": 4, + "message": "DB::Exception: user1: Authentication failed: password is incorrect or there is no user with such name" }] login(servers, *users) @@ -110,7 +115,8 @@ def invalid_auth_dn_suffix(self): }} users = [{ "server": "openldap1", "username": "user1", "password": "user1", "login": True, - "exitcode": 20, "message": "DB::Exception: Invalid DN syntax: invalid DN" + "exitcode": 4, + "message": "DB::Exception: user1: Authentication failed: password is incorrect or there is no user with such name" }] login(servers, *users) @@ -127,7 +133,8 @@ def invalid_enable_tls_value(self): }} users = [{ "server": "openldap1", "username": "user1", "password": "user1", "login": True, - "exitcode": 36, "message": "DB::Exception: LDAP server 'openldap1' is not configured" + "exitcode": 4, + "message": "DB::Exception: user1: Authentication failed: password is incorrect or there is no user with such name" }] login(servers, *users) @@ -148,7 +155,8 @@ def invalid_tls_require_cert_value(self): }} users = [{ "server": "openldap2", "username": "user2", "password": "user2", "login": True, - "exitcode": 36, "message": "DB::Exception: LDAP server 'openldap2' is not configured" + "exitcode": 4, + "message": "DB::Exception: user2: Authentication failed: password is incorrect or there is no user with such name" }] login(servers, *users) @@ -167,8 +175,8 @@ def empty_ca_cert_dir(self): }} users = [{ "server": "openldap2", "username": "user2", "password": "user2", "login": True, - "exitcode": 20, - "message": "DB::Exception: Can't contact LDAP server: error:14000086:SSL routines::certificate verify failed (self signed certificate in certificate chain" + "exitcode": 4, + "message": "DB::Exception: user2: Authentication failed: password is incorrect or there is no user with such name" }] login(servers, *users) @@ -187,8 +195,8 @@ def empty_ca_cert_file(self): }} users = [{ "server": "openldap2", "username": "user2", "password": "user2", "login": True, - "exitcode": 20, - "message": "Received from localhost:9000. DB::Exception: Can't contact LDAP server: error:14000086:SSL routines::certificate verify failed (self signed certificate in certificate chain)" + "exitcode": 4, + "message": "DB::Exception: user2: Authentication failed: password is incorrect or there is no user with such name" }] login(servers, *users) diff --git a/tests/testflows/ldap/tests/user_config.py b/tests/testflows/ldap/authentication/tests/user_config.py similarity index 96% rename from tests/testflows/ldap/tests/user_config.py rename to tests/testflows/ldap/authentication/tests/user_config.py index f609231b752..36ed33ed17a 100644 --- a/tests/testflows/ldap/tests/user_config.py +++ b/tests/testflows/ldap/authentication/tests/user_config.py @@ -2,8 +2,8 @@ import xml.etree.ElementTree as xmltree from testflows.core import * -from ldap.tests.common import * -from ldap.requirements import * +from ldap.authentication.tests.common import * +from ldap.authentication.requirements import * @TestScenario @Requirements( @@ -54,8 +54,8 @@ def empty_server_not_defined(self, timeout=20): "auth_dn_prefix": "cn=", "auth_dn_suffix": ",ou=users,dc=company,dc=com" }} users = [{"server": "foo", "username": "user1", "password": "user1", "login": True, - "errorcode": 36, - "message": "DB::Exception: LDAP server 'foo' is not configured" + "errorcode": 4, + "message": "DB::Exception: user1: Authentication failed: password is incorrect or there is no user with such name" }] login(servers, *users) diff --git a/tests/testflows/ldap/external_user_directory/__init__.py b/tests/testflows/ldap/external_user_directory/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/testflows/ldap/external_user_directory/configs/CA/ca.crt b/tests/testflows/ldap/external_user_directory/configs/CA/ca.crt new file mode 100644 index 00000000000..8c71e3afc91 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/CA/ca.crt @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDlTCCAn2gAwIBAgIUJBqw2dHM2DDCZjYSkPOESlvDH6swDQYJKoZIhvcNAQEL +BQAwWjELMAkGA1UEBhMCQ0ExCzAJBgNVBAgMAk9OMQ8wDQYDVQQHDAZPdHRhd2Ex +ETAPBgNVBAoMCEFsdGluaXR5MQswCQYDVQQLDAJRQTENMAsGA1UEAwwEcm9vdDAe +Fw0yMDA2MTExOTAzNDhaFw0zMDA2MDkxOTAzNDhaMFoxCzAJBgNVBAYTAkNBMQsw +CQYDVQQIDAJPTjEPMA0GA1UEBwwGT3R0YXdhMREwDwYDVQQKDAhBbHRpbml0eTEL +MAkGA1UECwwCUUExDTALBgNVBAMMBHJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQC9Irr0zGV+HCI2fZ0ht4hR5It4Sbjz4RwZV8ENRP/+TEz8l9eK +J6ygxhKX7SMYzIs/jS9Gsq4plX1r2ujW1qRf8yLpR4+dGLP+jBRi1drj0XjZXosT +SERjWzgPauWxL9LN8+l26eBAqz6fw5e0W8WRSTgf5iGiCcKOTmaATIUjP0CdfWKK +qpktI4vhe++CXZFJ3usR+8KZ/FwwbCLJM/3J2HnbcXfcaYPYvr1tfqLudKSTbG9H +M3+AVwjctdesc/0sbd51Zsm0ClQptMbuKnDCYauGg61kNkgbgPgRmH9Pzo67DtxF +/WW+PtOzq8xLOifciQ9Piboy9QBSQZGwf4wzAgMBAAGjUzBRMB0GA1UdDgQWBBSi +njya0RDozx3OZTLYFpwqYnlpIDAfBgNVHSMEGDAWgBSinjya0RDozx3OZTLYFpwq +YnlpIDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBAD7VyFg7F +U1C25KFvtauchAOjCW6w7U/b3z1dVZvcQ88/kH1VsLUcfGixlSilUEfPTJsi7OA0 +R5BQdh2GGcjUJv4iqEFGU05KvMVmRRKn08P62+ZhJxKMxG26VzcliRZzCMkI6d0W +lFwI6nM45yeqdHVh5k4xbuJzqpbD9BtXXLI+/Ra9Fx8S9ETA3GdidpZLU5P1VLxq +UuedfqyAVWZXpr6TAURGxouRmRzul9yFzbSUex+MLEIPrstjtEwV3+tBQZJz9xAS +TVPj+Nv3LO7GCq54bdwkq1ioWbSL2hEmABkj6kdW/JwmfhGHf/2rirDVMzrTYw07 +dFJfAZC+FEsv +-----END CERTIFICATE----- diff --git a/tests/testflows/ldap/external_user_directory/configs/CA/ca.key b/tests/testflows/ldap/external_user_directory/configs/CA/ca.key new file mode 100644 index 00000000000..e7a7f664dcf --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/CA/ca.key @@ -0,0 +1,30 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-256-CBC,D06B9754A2069EBB4E77065DC9B605A1 + +FJT794Z6AUuUB5Vp5W2iR6zzCvQUg2dtKoE+xhFdbgC7lmSfA2W/O9fx15Il67Yj +Bbpm9Y6yteUSDQpJrvBdkhXeBkYEa5K1CA+0Jdx98nzwP3KBhHNxVVrTWRc5kniB +LMV3iBQEbAafxgL7gN+EWr3eV7w7ZSqT7D5br/mlBALU62gv2UzwTXLu1CgyNWMC +HIPjIX50Zga+BnhZhtQvM4Yj1gOsn+X6AaEZ3KjTfCDqthYQf2ldswW4gAlPAq83 ++INq9Spx+QG97Z+1XO2DmmGTZL0z+OFLT+3y26/UcftM26ODY09Dcf3gt0n6RIUV +0KsD1qQL0ppu4CHVnbIkOKMBe86qBl+kG8FVmyhgZ8D9ULlF1tpyTVKvHR82V2B5 +ztbc5EY1Fhb+r7OVVJlbCeo/bWmWybODZrpN49x5gGZpM3+8ApaHupGZ+cRFkQKG +rDpqC5gflT3WwFNxtP5noWcV+Gzb3riXNM3c8G5aIpLZwmmaTLK9ahKqMcq4Ljf+ +hir8kuCMqIKt3m7Ceoj4wAHSP8xO0y/cc1WYNb3CI0Emk795aR6IPUw4vDEXHG27 +OLoCJTvl/JKRWJGkdQx8wKAs/uw/qwtbhYoQJccTjfvy4NXH3tpSgxCE8OTWuEch +TAN8ra1PDGAUu+1MeT5gZ9uI1BEU6hXMME4mVRpJdcmw9MVy3V+B6rkUqX3kFAfR +e2ueF5qgIp+A4/UlVe5cKdWAQxu4BnUESLooA7cbgcLypdao9bRx9bXH8S3aNgxW +IdgICpc/v8wAX2yqMe191KgR9Vh1p0RCw/kEGVgWfY/IaQpsaYuq5quZbvr/fN5T +d++ySAMaPysaCadLUdZJLw56uk4Y+PYzR+ygjTX9dCCHedrAU8RYM55FJ/fyD3bQ +Hn9/n7PZyWy6u/TYt6dhlcYxaS3Opzw4eAQB8tGZJRYQ3AKpHpTEC57lXoMnUPKo ++nBmb0+YulylMZdns0WIBJlcv6qzIaNhDMrjyi18n1ezzPIGH7ivUjoXy2FL23q5 +f3aqJK4UUDEDkC8IeZkS+ykYxnohjFDhUyBe5gjryLqdMdy9EerehCWPf425AztX +c/EWPzDl46qmxWhugOlz3Fiw95VlYu0MUDRayHuZiYPplgJypChuU4EHJ+q8V2z3 +BwjSo1bD4nfc8f68qEOtdZ1u/ClcolMwlZQYDJz/DiE4JOcd2Gx4QSF5vaInm0/4 +mMj/ZWna4DAYFbH8IGh7xUPDqeIWhBYlgrD69ajKyay5Vu3La/d2QW20BhX35Ro2 +ZJVR+lfioMmxn4y481H2pv+5gOlGwh02Oa8qLhZBb8W+DvFShNk6mk87eCForFFT +CDgmvfsC/cS2wZkcFTecq6vbjFlt+OF13NCKlcO3wCm44D+bwVPeMrU6HycCVQw7 +SASrnP/th5sJbv11byb2lKgVdVHWk090bqnDwB9H2hGIb9JnPC9ZpaL/mocYyzTi +H9fcBrMYkL09FJGr3Uff7qEY4XQTMlLadXue3iKd19PRgV8cRyKp37MYI9/3iLwv +eYHLtMfrifZahf1ksOPeBphnlfzWo9qqfooUCaGxfSlNPUHhrHZ4aMiRyTE8Xeh2 +-----END RSA PRIVATE KEY----- diff --git a/tests/testflows/ldap/external_user_directory/configs/CA/ca.srl b/tests/testflows/ldap/external_user_directory/configs/CA/ca.srl new file mode 100644 index 00000000000..66feb9c8a35 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/CA/ca.srl @@ -0,0 +1 @@ +227B125D27B6B1A4B5955361365DF8EC2D7098C1 diff --git a/tests/testflows/ldap/external_user_directory/configs/CA/dhparam.pem b/tests/testflows/ldap/external_user_directory/configs/CA/dhparam.pem new file mode 100644 index 00000000000..554d75696ee --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/CA/dhparam.pem @@ -0,0 +1,8 @@ +-----BEGIN DH PARAMETERS----- +MIIBCAKCAQEA1iatTn4jdw1WIu09qeLj8OEeLhzG/w2lI4RUeJT9nU+WTwegpvLN +/MvrIMIKHRmItyxgraYFau2moC7RKm7OKLmFt6e34QeMvM1vXpuwQav6mfp8GsYL +mEIw5riFcB73E32NN3g7qmfmurkTF28BohmqhuQp2et7FNoGBKQ6ePZzGHWil3yG +nEnCwyK0o3eP2IEytx2N50uUWVdfg3MN34L3wqpUivArrjBkoMpqm3/V3wdfoYG9 +ZQkH0gIxT/2FIixCLGlfBsJ1qA/Apz1BJZbGqVu5M5iiQmq+LWN5JLS3xYai4wJL +rIY8DhjbciSNVWkwTJHzaLwIQa9a6p6mUwIBAg== +-----END DH PARAMETERS----- diff --git a/tests/testflows/ldap/external_user_directory/configs/CA/passphrase.txt b/tests/testflows/ldap/external_user_directory/configs/CA/passphrase.txt new file mode 100644 index 00000000000..2cf58b2364c --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/CA/passphrase.txt @@ -0,0 +1 @@ +altinity diff --git a/tests/testflows/ldap/external_user_directory/configs/clickhouse/common.xml b/tests/testflows/ldap/external_user_directory/configs/clickhouse/common.xml new file mode 100644 index 00000000000..df952b28c82 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/clickhouse/common.xml @@ -0,0 +1,6 @@ + + Europe/Moscow + 0.0.0.0 + /var/lib/clickhouse/ + /var/lib/clickhouse/tmp/ + diff --git a/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.d/logs.xml b/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.d/logs.xml new file mode 100644 index 00000000000..bdf1bbc11c1 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.d/logs.xml @@ -0,0 +1,17 @@ + + 3 + + trace + /var/log/clickhouse-server/log.log + /var/log/clickhouse-server/log.err.log + 1000M + 10 + /var/log/clickhouse-server/stderr.log + /var/log/clickhouse-server/stdout.log + + + system + part_log
+ 500 +
+
diff --git a/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.d/ports.xml b/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.d/ports.xml new file mode 100644 index 00000000000..fbc6cea74c0 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.d/ports.xml @@ -0,0 +1,5 @@ + + + 8443 + 9440 + \ No newline at end of file diff --git a/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.d/remote.xml b/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.d/remote.xml new file mode 100644 index 00000000000..51be2a6e8e3 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.d/remote.xml @@ -0,0 +1,107 @@ + + + + + + true + + clickhouse1 + 9000 + + + clickhouse2 + 9000 + + + clickhouse3 + 9000 + + + + + + + true + + clickhouse1 + 9440 + 1 + + + clickhouse2 + 9440 + 1 + + + clickhouse3 + 9440 + 1 + + + + + + + clickhouse1 + 9000 + + + + + clickhouse2 + 9000 + + + + + clickhouse3 + 9000 + + + + + + + clickhouse1 + 9440 + 1 + + + + + clickhouse2 + 9440 + 1 + + + + + clickhouse3 + 9440 + 1 + + + + + diff --git a/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.d/ssl.xml b/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.d/ssl.xml new file mode 100644 index 00000000000..ca65ffd5e04 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.d/ssl.xml @@ -0,0 +1,17 @@ + + + + /etc/clickhouse-server/ssl/server.crt + /etc/clickhouse-server/ssl/server.key + none + true + + + true + none + + AcceptCertificateHandler + + + + diff --git a/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.d/storage.xml b/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.d/storage.xml new file mode 100644 index 00000000000..618fd6b6d24 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.d/storage.xml @@ -0,0 +1,20 @@ + + + + + + 1024 + + + + + + + default + + + + + + + diff --git a/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.d/zookeeper.xml b/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.d/zookeeper.xml new file mode 100644 index 00000000000..96270e7b645 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.d/zookeeper.xml @@ -0,0 +1,10 @@ + + + + + zookeeper + 2181 + + 15000 + + diff --git a/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.xml b/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.xml new file mode 100644 index 00000000000..e28a0c8e255 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/clickhouse/config.xml @@ -0,0 +1,442 @@ + + + + + + trace + /var/log/clickhouse-server/clickhouse-server.log + /var/log/clickhouse-server/clickhouse-server.err.log + 1000M + 10 + + + + 8123 + 9000 + + + + + + + + + /etc/clickhouse-server/server.crt + /etc/clickhouse-server/server.key + + /etc/clickhouse-server/dhparam.pem + none + true + true + sslv2,sslv3 + true + + + + true + true + sslv2,sslv3 + true + + + + RejectCertificateHandler + + + + + + + + + 9009 + + + + + + + + + + + + + + + + + + + + 4096 + 3 + + + 100 + + + + + + 8589934592 + + + 5368709120 + + + + /var/lib/clickhouse/ + + + /var/lib/clickhouse/tmp/ + + + /var/lib/clickhouse/user_files/ + + + + + + users.xml + + + + /var/lib/clickhouse/access/ + + + + + default + + + + + + default + + + + + + + + + false + + + + + + + + localhost + 9000 + + + + + + + localhost + 9000 + + + + + localhost + 9000 + + + + + + + localhost + 9440 + 1 + + + + + + + localhost + 9000 + + + + + localhost + 1 + + + + + + + + + + + + + + + + + 3600 + + + + 3600 + + + 60 + + + + + + + + + + system + query_log
+ + toYYYYMM(event_date) + + 7500 +
+ + + + system + trace_log
+ + toYYYYMM(event_date) + 7500 +
+ + + + system + query_thread_log
+ toYYYYMM(event_date) + 7500 +
+ + + + + + + + + + + + + + + + *_dictionary.xml + + + + + + + + + + /clickhouse/task_queue/ddl + + + + + + + + + + + + + + + + click_cost + any + + 0 + 3600 + + + 86400 + 60 + + + + max + + 0 + 60 + + + 3600 + 300 + + + 86400 + 3600 + + + + + + /var/lib/clickhouse/format_schemas/ + + + +
diff --git a/tests/testflows/ldap/external_user_directory/configs/clickhouse/ssl/dhparam.pem b/tests/testflows/ldap/external_user_directory/configs/clickhouse/ssl/dhparam.pem new file mode 100644 index 00000000000..2e6cee0798d --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/clickhouse/ssl/dhparam.pem @@ -0,0 +1,8 @@ +-----BEGIN DH PARAMETERS----- +MIIBCAKCAQEAua92DDli13gJ+//ZXyGaggjIuidqB0crXfhUlsrBk9BV1hH3i7fR +XGP9rUdk2ubnB3k2ejBStL5oBrkHm9SzUFSQHqfDjLZjKoUpOEmuDc4cHvX1XTR5 +Pr1vf5cd0yEncJWG5W4zyUB8k++SUdL2qaeslSs+f491HBLDYn/h8zCgRbBvxhxb +9qeho1xcbnWeqkN6Kc9bgGozA16P9NLuuLttNnOblkH+lMBf42BSne/TWt3AlGZf +slKmmZcySUhF8aKfJnLKbkBCFqOtFRh8zBA9a7g+BT/lSANATCDPaAk1YVih2EKb +dpc3briTDbRsiqg2JKMI7+VdULY9bh3EawIBAg== +-----END DH PARAMETERS----- diff --git a/tests/testflows/ldap/external_user_directory/configs/clickhouse/ssl/server.crt b/tests/testflows/ldap/external_user_directory/configs/clickhouse/ssl/server.crt new file mode 100644 index 00000000000..7ade2d96273 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/clickhouse/ssl/server.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIC/TCCAeWgAwIBAgIJANjx1QSR77HBMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV +BAMMCWxvY2FsaG9zdDAgFw0xODA3MzAxODE2MDhaGA8yMjkyMDUxNDE4MTYwOFow +FDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAs9uSo6lJG8o8pw0fbVGVu0tPOljSWcVSXH9uiJBwlZLQnhN4SFSFohfI +4K8U1tBDTnxPLUo/V1K9yzoLiRDGMkwVj6+4+hE2udS2ePTQv5oaMeJ9wrs+5c9T +4pOtlq3pLAdm04ZMB1nbrEysceVudHRkQbGHzHp6VG29Fw7Ga6YpqyHQihRmEkTU +7UCYNA+Vk7aDPdMS/khweyTpXYZimaK9f0ECU3/VOeG3fH6Sp2X6FN4tUj/aFXEj +sRmU5G2TlYiSIUMF2JPdhSihfk1hJVALrHPTU38SOL+GyyBRWdNcrIwVwbpvsvPg +pryMSNxnpr0AK0dFhjwnupIv5hJIOQIDAQABo1AwTjAdBgNVHQ4EFgQUjPLb3uYC +kcamyZHK4/EV8jAP0wQwHwYDVR0jBBgwFoAUjPLb3uYCkcamyZHK4/EV8jAP0wQw +DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAM/ocuDvfPus/KpMVD51j +4IdlU8R0vmnYLQ+ygzOAo7+hUWP5j0yvq4ILWNmQX6HNvUggCgFv9bjwDFhb/5Vr +85ieWfTd9+LTjrOzTw4avdGwpX9G+6jJJSSq15tw5ElOIFb/qNA9O4dBiu8vn03C +L/zRSXrARhSqTW5w/tZkUcSTT+M5h28+Lgn9ysx4Ff5vi44LJ1NnrbJbEAIYsAAD ++UA+4MBFKx1r6hHINULev8+lCfkpwIaeS8RL+op4fr6kQPxnULw8wT8gkuc8I4+L +P9gg/xDHB44T3ADGZ5Ib6O0DJaNiToO6rnoaaxs0KkotbvDWvRoxEytSbXKoYjYp +0g== +-----END CERTIFICATE----- diff --git a/tests/testflows/ldap/external_user_directory/configs/clickhouse/ssl/server.key b/tests/testflows/ldap/external_user_directory/configs/clickhouse/ssl/server.key new file mode 100644 index 00000000000..f0fb61ac443 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/clickhouse/ssl/server.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCz25KjqUkbyjyn +DR9tUZW7S086WNJZxVJcf26IkHCVktCeE3hIVIWiF8jgrxTW0ENOfE8tSj9XUr3L +OguJEMYyTBWPr7j6ETa51LZ49NC/mhox4n3Cuz7lz1Pik62WreksB2bThkwHWdus +TKxx5W50dGRBsYfMenpUbb0XDsZrpimrIdCKFGYSRNTtQJg0D5WTtoM90xL+SHB7 +JOldhmKZor1/QQJTf9U54bd8fpKnZfoU3i1SP9oVcSOxGZTkbZOViJIhQwXYk92F +KKF+TWElUAusc9NTfxI4v4bLIFFZ01ysjBXBum+y8+CmvIxI3GemvQArR0WGPCe6 +ki/mEkg5AgMBAAECggEATrbIBIxwDJOD2/BoUqWkDCY3dGevF8697vFuZKIiQ7PP +TX9j4vPq0DfsmDjHvAPFkTHiTQXzlroFik3LAp+uvhCCVzImmHq0IrwvZ9xtB43f +7Pkc5P6h1l3Ybo8HJ6zRIY3TuLtLxuPSuiOMTQSGRL0zq3SQ5DKuGwkz+kVjHXUN +MR2TECFwMHKQ5VLrC+7PMpsJYyOMlDAWhRfUalxC55xOXTpaN8TxNnwQ8K2ISVY5 +212Jz/a4hn4LdwxSz3Tiu95PN072K87HLWx3EdT6vW4Ge5P/A3y+smIuNAlanMnu +plHBRtpATLiTxZt/n6npyrfQVbYjSH7KWhB8hBHtaQKBgQDh9Cq1c/KtqDtE0Ccr +/r9tZNTUwBE6VP+3OJeKdEdtsfuxjOCkS1oAjgBJiSDOiWPh1DdoDeVZjPKq6pIu +Mq12OE3Doa8znfCXGbkSzEKOb2unKZMJxzrz99kXt40W5DtrqKPNb24CNqTiY8Aa +CjtcX+3weat82VRXvph6U8ltMwKBgQDLxjiQQzNoY7qvg7CwJCjf9qq8jmLK766g +1FHXopqS+dTxDLM8eJSRrpmxGWJvNeNc1uPhsKsKgotqAMdBUQTf7rSTbt4MyoH5 +bUcRLtr+0QTK9hDWMOOvleqNXha68vATkohWYfCueNsC60qD44o8RZAS6UNy3ENq +cM1cxqe84wKBgQDKkHutWnooJtajlTxY27O/nZKT/HA1bDgniMuKaz4R4Gr1PIez +on3YW3V0d0P7BP6PWRIm7bY79vkiMtLEKdiKUGWeyZdo3eHvhDb/3DCawtau8L2K +GZsHVp2//mS1Lfz7Qh8/L/NedqCQ+L4iWiPnZ3THjjwn3CoZ05ucpvrAMwKBgB54 +nay039MUVq44Owub3KDg+dcIU62U+cAC/9oG7qZbxYPmKkc4oL7IJSNecGHA5SbU +2268RFdl/gLz6tfRjbEOuOHzCjFPdvAdbysanpTMHLNc6FefJ+zxtgk9sJh0C4Jh +vxFrw9nTKKzfEl12gQ1SOaEaUIO0fEBGbe8ZpauRAoGAMAlGV+2/K4ebvAJKOVTa +dKAzQ+TD2SJmeR1HZmKDYddNqwtZlzg3v4ZhCk4eaUmGeC1Bdh8MDuB3QQvXz4Dr +vOIP4UVaOr+uM+7TgAgVnP4/K6IeJGzUDhX93pmpWhODfdu/oojEKVcpCojmEmS1 +KCBtmIrQLqzMpnBpLNuSY+Q= +-----END PRIVATE KEY----- diff --git a/tests/testflows/ldap/external_user_directory/configs/clickhouse/users.xml b/tests/testflows/ldap/external_user_directory/configs/clickhouse/users.xml new file mode 100644 index 00000000000..86b2cd9e1e3 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/clickhouse/users.xml @@ -0,0 +1,133 @@ + + + + + + + + 10000000000 + + + 0 + + + random + + + + + 1 + + + + + + + + + + + + + ::/0 + + + + default + + + default + + + 1 + + + + + + + + + + + + + + + + + 3600 + + + 0 + 0 + 0 + 0 + 0 + + + + diff --git a/tests/testflows/ldap/external_user_directory/configs/clickhouse1/config.d/macros.xml b/tests/testflows/ldap/external_user_directory/configs/clickhouse1/config.d/macros.xml new file mode 100644 index 00000000000..6cdcc1b440c --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/clickhouse1/config.d/macros.xml @@ -0,0 +1,8 @@ + + + + clickhouse1 + 01 + 01 + + diff --git a/tests/testflows/ldap/external_user_directory/configs/clickhouse2/config.d/macros.xml b/tests/testflows/ldap/external_user_directory/configs/clickhouse2/config.d/macros.xml new file mode 100644 index 00000000000..a114a9ce4ab --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/clickhouse2/config.d/macros.xml @@ -0,0 +1,8 @@ + + + + clickhouse2 + 01 + 02 + + diff --git a/tests/testflows/ldap/external_user_directory/configs/clickhouse3/config.d/macros.xml b/tests/testflows/ldap/external_user_directory/configs/clickhouse3/config.d/macros.xml new file mode 100644 index 00000000000..904a27b0172 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/clickhouse3/config.d/macros.xml @@ -0,0 +1,8 @@ + + + + clickhouse3 + 01 + 03 + + diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap1/config/export.ldif b/tests/testflows/ldap/external_user_directory/configs/ldap1/config/export.ldif new file mode 100644 index 00000000000..621dd32ca0c --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap1/config/export.ldif @@ -0,0 +1,64 @@ +# LDIF Export for dc=company,dc=com +# Server: openldap (openldap) +# Search Scope: sub +# Search Filter: (objectClass=*) +# Total Entries: 7 +# +# Generated by phpLDAPadmin (http://phpldapadmin.sourceforge.net) on May 22, 2020 5:51 pm +# Version: 1.2.5 + +# Entry 1: dc=company,dc=com +#dn: dc=company,dc=com +#dc: company +#o: company +#objectclass: top +#objectclass: dcObject +#objectclass: organization + +# Entry 2: cn=admin,dc=company,dc=com +#dn: cn=admin,dc=company,dc=com +#cn: admin +#description: LDAP administrator +#objectclass: simpleSecurityObject +#objectclass: organizationalRole +#userpassword: {SSHA}eUEupkQCTvq9SkrxfWGSe5rX+orrjVbF + +# Entry 3: ou=groups,dc=company,dc=com +dn: ou=groups,dc=company,dc=com +objectclass: organizationalUnit +objectclass: top +ou: groups + +# Entry 4: cn=admin,ou=groups,dc=company,dc=com +dn: cn=admin,ou=groups,dc=company,dc=com +cn: admin +gidnumber: 500 +objectclass: posixGroup +objectclass: top + +# Entry 5: cn=users,ou=groups,dc=company,dc=com +dn: cn=users,ou=groups,dc=company,dc=com +cn: users +gidnumber: 501 +objectclass: posixGroup +objectclass: top + +# Entry 6: ou=users,dc=company,dc=com +dn: ou=users,dc=company,dc=com +objectclass: organizationalUnit +objectclass: top +ou: users + +# Entry 7: cn=user1,ou=users,dc=company,dc=com +dn: cn=user1,ou=users,dc=company,dc=com +cn: user1 +gidnumber: 501 +givenname: John +homedirectory: /home/users/user1 +objectclass: inetOrgPerson +objectclass: posixAccount +objectclass: top +sn: User +uid: user1 +uidnumber: 1101 +userpassword: user1 diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap2/certs/ca.crt b/tests/testflows/ldap/external_user_directory/configs/ldap2/certs/ca.crt new file mode 100644 index 00000000000..8c71e3afc91 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap2/certs/ca.crt @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDlTCCAn2gAwIBAgIUJBqw2dHM2DDCZjYSkPOESlvDH6swDQYJKoZIhvcNAQEL +BQAwWjELMAkGA1UEBhMCQ0ExCzAJBgNVBAgMAk9OMQ8wDQYDVQQHDAZPdHRhd2Ex +ETAPBgNVBAoMCEFsdGluaXR5MQswCQYDVQQLDAJRQTENMAsGA1UEAwwEcm9vdDAe +Fw0yMDA2MTExOTAzNDhaFw0zMDA2MDkxOTAzNDhaMFoxCzAJBgNVBAYTAkNBMQsw +CQYDVQQIDAJPTjEPMA0GA1UEBwwGT3R0YXdhMREwDwYDVQQKDAhBbHRpbml0eTEL +MAkGA1UECwwCUUExDTALBgNVBAMMBHJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQC9Irr0zGV+HCI2fZ0ht4hR5It4Sbjz4RwZV8ENRP/+TEz8l9eK +J6ygxhKX7SMYzIs/jS9Gsq4plX1r2ujW1qRf8yLpR4+dGLP+jBRi1drj0XjZXosT +SERjWzgPauWxL9LN8+l26eBAqz6fw5e0W8WRSTgf5iGiCcKOTmaATIUjP0CdfWKK +qpktI4vhe++CXZFJ3usR+8KZ/FwwbCLJM/3J2HnbcXfcaYPYvr1tfqLudKSTbG9H +M3+AVwjctdesc/0sbd51Zsm0ClQptMbuKnDCYauGg61kNkgbgPgRmH9Pzo67DtxF +/WW+PtOzq8xLOifciQ9Piboy9QBSQZGwf4wzAgMBAAGjUzBRMB0GA1UdDgQWBBSi +njya0RDozx3OZTLYFpwqYnlpIDAfBgNVHSMEGDAWgBSinjya0RDozx3OZTLYFpwq +YnlpIDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBAD7VyFg7F +U1C25KFvtauchAOjCW6w7U/b3z1dVZvcQ88/kH1VsLUcfGixlSilUEfPTJsi7OA0 +R5BQdh2GGcjUJv4iqEFGU05KvMVmRRKn08P62+ZhJxKMxG26VzcliRZzCMkI6d0W +lFwI6nM45yeqdHVh5k4xbuJzqpbD9BtXXLI+/Ra9Fx8S9ETA3GdidpZLU5P1VLxq +UuedfqyAVWZXpr6TAURGxouRmRzul9yFzbSUex+MLEIPrstjtEwV3+tBQZJz9xAS +TVPj+Nv3LO7GCq54bdwkq1ioWbSL2hEmABkj6kdW/JwmfhGHf/2rirDVMzrTYw07 +dFJfAZC+FEsv +-----END CERTIFICATE----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap2/certs/dhparam.pem b/tests/testflows/ldap/external_user_directory/configs/ldap2/certs/dhparam.pem new file mode 100644 index 00000000000..0a96faffd62 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap2/certs/dhparam.pem @@ -0,0 +1,5 @@ +-----BEGIN DH PARAMETERS----- +MIGHAoGBAJitt2hhnpDViQ5ko2ipBMdjy+bZ6FR/WdZ987R7lQvBkKehPXmxtEyV +AO6ofv5CZSDJokc5bUeBOAtg0EhMTCH82uPdwQvt58jRXcxXBg4JTjkx+oW9LBv2 +FdZsbaX8+SYivmiZ0Jp8T/HBm/4DA9VBS0O5GFRS4C7dHhmSTPfDAgEC +-----END DH PARAMETERS----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap2/certs/ldap.crt b/tests/testflows/ldap/external_user_directory/configs/ldap2/certs/ldap.crt new file mode 100644 index 00000000000..9167cbf861d --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap2/certs/ldap.crt @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDQDCCAigCFCJ7El0ntrGktZVTYTZd+OwtcJjBMA0GCSqGSIb3DQEBCwUAMFox +CzAJBgNVBAYTAkNBMQswCQYDVQQIDAJPTjEPMA0GA1UEBwwGT3R0YXdhMREwDwYD +VQQKDAhBbHRpbml0eTELMAkGA1UECwwCUUExDTALBgNVBAMMBHJvb3QwHhcNMjAw +NjExMTkxMTQzWhcNMzAwNjA5MTkxMTQzWjBfMQswCQYDVQQGEwJDQTELMAkGA1UE +CAwCT04xDzANBgNVBAcMBk90dGF3YTERMA8GA1UECgwIQWx0aW5pdHkxCzAJBgNV +BAsMAlFBMRIwEAYDVQQDDAlvcGVubGRhcDIwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQC0Mbn//U56URavMgXm82FWP6vBdKuRydFX/L0M5XLlnAtk/IXG +/T+4t7nOBJxWmTp/xpsPtSMALE4eFJpEUEqlpVbG5DfBzVWcYOWoMeRAcHWCDkzr +PkB6I0dfF0Mm5hoaDhn+ZXjBWvoh/IlJdAnPg5mlejflJBQ7xtFC9eN6WjldXuRO +vyntGNuMfVLgITHwXuH2yZ98G0mFO6TU/9dRY/Z3D6RTSzKdb17Yk/VnG+ry92u2 +0sgXIBvhuJuC3ksWLArwwFoMl8DVa05D4O2H76goGdCcQ0KzqBV8RPXAh3UcgP2e +Zu90p2EGIhIk+sZTCkPd4dorxjL9nkRR86HdAgMBAAEwDQYJKoZIhvcNAQELBQAD +ggEBAJWiCxJaTksv/BTsh/etxlDY5eHwqStqIuiovEQ8bhGAcKJ3bfWd/YTb8DUS +hrLvXrXdOVC+U8PqPFXBpdOqcm5Dc233z52VgUCb+0EKv3lAzgKXRIo32h52skdK +NnRrCHDeDzgfEIXR4MEJ99cLEaxWyXQhremmTYWHYznry9/4NYz40gCDxHn9dJAi +KxFyDNxhtuKs58zp4PrBoo+542JurAoLPtRGOhdXpU2RkQVU/ho38HsAXDStAB5D +vAoSxPuMHKgo17ffrb0oqU3didwaA9fIsz7Mr6RxmI7X03s7hLzNBq9FCqu0U3RR +CX4zWGFNJu/ieSGVWLYKQzbYxp8= +-----END CERTIFICATE----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap2/certs/ldap.csr b/tests/testflows/ldap/external_user_directory/configs/ldap2/certs/ldap.csr new file mode 100644 index 00000000000..bf569f727d6 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap2/certs/ldap.csr @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIICpDCCAYwCAQAwXzELMAkGA1UEBhMCQ0ExCzAJBgNVBAgMAk9OMQ8wDQYDVQQH +DAZPdHRhd2ExETAPBgNVBAoMCEFsdGluaXR5MQswCQYDVQQLDAJRQTESMBAGA1UE +AwwJb3BlbmxkYXAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtDG5 +//1OelEWrzIF5vNhVj+rwXSrkcnRV/y9DOVy5ZwLZPyFxv0/uLe5zgScVpk6f8ab +D7UjACxOHhSaRFBKpaVWxuQ3wc1VnGDlqDHkQHB1gg5M6z5AeiNHXxdDJuYaGg4Z +/mV4wVr6IfyJSXQJz4OZpXo35SQUO8bRQvXjelo5XV7kTr8p7RjbjH1S4CEx8F7h +9smffBtJhTuk1P/XUWP2dw+kU0synW9e2JP1Zxvq8vdrttLIFyAb4bibgt5LFiwK +8MBaDJfA1WtOQ+Dth++oKBnQnENCs6gVfET1wId1HID9nmbvdKdhBiISJPrGUwpD +3eHaK8Yy/Z5EUfOh3QIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAEzIjZQOT5R7 +mEJg+RFpCSIoPn3xJ4/VMMyWqA3bTGZKpb4S6GxgsierY/87kPL7jZrMdGYB4Dc3 +2M3VWZGXlYo8vctH1zLE9VW6CzosUpl20lhdgydoCMz3RQqdJyK8aGeFTeLtk7G/ +TRCCUFUE6jaA+VtaCPCnOJSff3jUf76xguEu7dgTZgCKV7dtBqald8gIzF3D+AJJ +7pEN2UrC3UR0xpe2cj2GhndQJ+WsIyft3zpNFzAO13j8ZPibuVP7oDWcW3ixNCWC +213aeRVplJGof8Eo6llDxP+6Fwp1YmOoQmwB1Xm3t4ADn7FLJ14LONLB7q40KviG +RyLyqu3IVOI= +-----END CERTIFICATE REQUEST----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap2/certs/ldap.key b/tests/testflows/ldap/external_user_directory/configs/ldap2/certs/ldap.key new file mode 100644 index 00000000000..5ab3a3f8b59 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap2/certs/ldap.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEAtDG5//1OelEWrzIF5vNhVj+rwXSrkcnRV/y9DOVy5ZwLZPyF +xv0/uLe5zgScVpk6f8abD7UjACxOHhSaRFBKpaVWxuQ3wc1VnGDlqDHkQHB1gg5M +6z5AeiNHXxdDJuYaGg4Z/mV4wVr6IfyJSXQJz4OZpXo35SQUO8bRQvXjelo5XV7k +Tr8p7RjbjH1S4CEx8F7h9smffBtJhTuk1P/XUWP2dw+kU0synW9e2JP1Zxvq8vdr +ttLIFyAb4bibgt5LFiwK8MBaDJfA1WtOQ+Dth++oKBnQnENCs6gVfET1wId1HID9 +nmbvdKdhBiISJPrGUwpD3eHaK8Yy/Z5EUfOh3QIDAQABAoIBADugMMIKWcuTxYPX +c6iGZHEbxIPRTWyCcalB0nTQAAMGbabPAJ1l8432DZ+kWu806OybFXhPIfPOtVKy +0pFEWE8TtPE/V0vj3C5Qye2sBLFmBRwyCzXUdZV00wseMXRPs9dnTyalAR5KMnbI +j80kfpKSI2dkV9aU57UYBuq3Xrx/TCGItwL769D4ZZW9BvbpiTZApQQFZ0gwUFFn +btPXGU9Ti8H4mfBuZWL+5CaZdqOo76+CXvMPaUK0F9MJp4yX3XxQLRNH3qz/Tyn7 +h7QOOo0XTqoUmzRw0N9QRVH5LRdSE5yq3aF9aFKjNW59exz+62pufOFadngzkpkn +OKCzgWkCgYEA4mOWWMzdYwMn3GtfG7whqlqy7wOmMkNb81zTDQejHBV98dnj0AHr +deurfKWzHrAh3DXo6tFeqUIgXabhBPS/0dEx/S5sgLFmuUZP05EUYahfWBgzzmM9 +C6Oe5xIMLzxsZCJczolsfkEsoFe4o0vkvuLYoQrQL7InzewcDy8cUxsCgYEAy8Na +YCnanSNDY03Bulcni+5sF+opaHseeki1pv3nlw8TwsWuZF9ApS+yL7ck9jJjxBRR +RC3KGmpoqIr0vTmUYS946ngQWXPE90zfuhJfM+NRv/q0oCjH0qAcxRbTkls5On9v +oxJ8rO7gD6K85eHqasWdbCVzdZrobOXzay37tmcCgYBfyUUmw190cjReZauzH3Gb +E48b5A5gu/Fe0cqWe8G+szU7rDZgnz9SAGnpbm6QMHPTKZgoKngD42+wUFhq8Wdr +zjh5aDgOZ4EQKTjDSmI2Q7g7nNnmnESK9SrZl+BB6C3wXD2qQaj+7nKEUTlVFlpt +jaucz+dwFtASp7Djl8pDOwKBgEtr2c3ycArt/ImLRIP2spqm+7e2YvFbcSKOOz6+ +iLRvTj8v8KcSYtlB2FC1F6dRa4AujQ4RbNduP6LzHDfWUkfOzJDtNBAIPAXVnJJB +LqAEKkRHRghqT9x0i3GgS1vHDF3MwcO4mhFgserXr9ffUWeIEgbvrdcAKbv1Oa6Y +bK1NAoGAGPm8ISmboDJynjBl9wMrkcy23Pwg9kmyocdWUHh0zMLDKriZNKYB6u/U +C+/RTfkohPoHPzkeqWiHp7z3JhMItYUfTkNW6vMCxEGc0NEN6ZyMIjtiDPGN1n6O +E7jmODFmj1AQICQGdV5SHp+yKvKyb0YHKyDwETbs4SZBXxVvjEw= +-----END RSA PRIVATE KEY----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap2/config/export.ldif b/tests/testflows/ldap/external_user_directory/configs/ldap2/config/export.ldif new file mode 100644 index 00000000000..6766aaae6f1 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap2/config/export.ldif @@ -0,0 +1,64 @@ +# LDIF Export for dc=company,dc=com +# Server: openldap (openldap) +# Search Scope: sub +# Search Filter: (objectClass=*) +# Total Entries: 7 +# +# Generated by phpLDAPadmin (http://phpldapadmin.sourceforge.net) on May 22, 2020 5:51 pm +# Version: 1.2.5 + +# Entry 1: dc=company,dc=com +#dn: dc=company,dc=com +#dc: company +#o: company +#objectclass: top +#objectclass: dcObject +#objectclass: organization + +# Entry 2: cn=admin,dc=company,dc=com +#dn: cn=admin,dc=company,dc=com +#cn: admin +#description: LDAP administrator +#objectclass: simpleSecurityObject +#objectclass: organizationalRole +#userpassword: {SSHA}eUEupkQCTvq9SkrxfWGSe5rX+orrjVbF + +# Entry 3: ou=groups,dc=company,dc=com +dn: ou=groups,dc=company,dc=com +objectclass: organizationalUnit +objectclass: top +ou: groups + +# Entry 4: cn=admin,ou=groups,dc=company,dc=com +dn: cn=admin,ou=groups,dc=company,dc=com +cn: admin +gidnumber: 500 +objectclass: posixGroup +objectclass: top + +# Entry 5: cn=users,ou=groups,dc=company,dc=com +dn: cn=users,ou=groups,dc=company,dc=com +cn: users +gidnumber: 501 +objectclass: posixGroup +objectclass: top + +# Entry 6: ou=users,dc=company,dc=com +dn: ou=users,dc=company,dc=com +objectclass: organizationalUnit +objectclass: top +ou: users + +# Entry 7: cn=user2,ou=users,dc=company,dc=com +dn: cn=user2,ou=users,dc=company,dc=com +cn: user2 +gidnumber: 501 +givenname: John +homedirectory: /home/users/user2 +objectclass: inetOrgPerson +objectclass: posixAccount +objectclass: top +sn: User +uid: user2 +uidnumber: 1002 +userpassword: user2 diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap3/certs/ca.crt b/tests/testflows/ldap/external_user_directory/configs/ldap3/certs/ca.crt new file mode 100644 index 00000000000..8c71e3afc91 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap3/certs/ca.crt @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDlTCCAn2gAwIBAgIUJBqw2dHM2DDCZjYSkPOESlvDH6swDQYJKoZIhvcNAQEL +BQAwWjELMAkGA1UEBhMCQ0ExCzAJBgNVBAgMAk9OMQ8wDQYDVQQHDAZPdHRhd2Ex +ETAPBgNVBAoMCEFsdGluaXR5MQswCQYDVQQLDAJRQTENMAsGA1UEAwwEcm9vdDAe +Fw0yMDA2MTExOTAzNDhaFw0zMDA2MDkxOTAzNDhaMFoxCzAJBgNVBAYTAkNBMQsw +CQYDVQQIDAJPTjEPMA0GA1UEBwwGT3R0YXdhMREwDwYDVQQKDAhBbHRpbml0eTEL +MAkGA1UECwwCUUExDTALBgNVBAMMBHJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQC9Irr0zGV+HCI2fZ0ht4hR5It4Sbjz4RwZV8ENRP/+TEz8l9eK +J6ygxhKX7SMYzIs/jS9Gsq4plX1r2ujW1qRf8yLpR4+dGLP+jBRi1drj0XjZXosT +SERjWzgPauWxL9LN8+l26eBAqz6fw5e0W8WRSTgf5iGiCcKOTmaATIUjP0CdfWKK +qpktI4vhe++CXZFJ3usR+8KZ/FwwbCLJM/3J2HnbcXfcaYPYvr1tfqLudKSTbG9H +M3+AVwjctdesc/0sbd51Zsm0ClQptMbuKnDCYauGg61kNkgbgPgRmH9Pzo67DtxF +/WW+PtOzq8xLOifciQ9Piboy9QBSQZGwf4wzAgMBAAGjUzBRMB0GA1UdDgQWBBSi +njya0RDozx3OZTLYFpwqYnlpIDAfBgNVHSMEGDAWgBSinjya0RDozx3OZTLYFpwq +YnlpIDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBAD7VyFg7F +U1C25KFvtauchAOjCW6w7U/b3z1dVZvcQ88/kH1VsLUcfGixlSilUEfPTJsi7OA0 +R5BQdh2GGcjUJv4iqEFGU05KvMVmRRKn08P62+ZhJxKMxG26VzcliRZzCMkI6d0W +lFwI6nM45yeqdHVh5k4xbuJzqpbD9BtXXLI+/Ra9Fx8S9ETA3GdidpZLU5P1VLxq +UuedfqyAVWZXpr6TAURGxouRmRzul9yFzbSUex+MLEIPrstjtEwV3+tBQZJz9xAS +TVPj+Nv3LO7GCq54bdwkq1ioWbSL2hEmABkj6kdW/JwmfhGHf/2rirDVMzrTYw07 +dFJfAZC+FEsv +-----END CERTIFICATE----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap3/certs/dhparam.pem b/tests/testflows/ldap/external_user_directory/configs/ldap3/certs/dhparam.pem new file mode 100644 index 00000000000..0a96faffd62 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap3/certs/dhparam.pem @@ -0,0 +1,5 @@ +-----BEGIN DH PARAMETERS----- +MIGHAoGBAJitt2hhnpDViQ5ko2ipBMdjy+bZ6FR/WdZ987R7lQvBkKehPXmxtEyV +AO6ofv5CZSDJokc5bUeBOAtg0EhMTCH82uPdwQvt58jRXcxXBg4JTjkx+oW9LBv2 +FdZsbaX8+SYivmiZ0Jp8T/HBm/4DA9VBS0O5GFRS4C7dHhmSTPfDAgEC +-----END DH PARAMETERS----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap3/certs/ldap.crt b/tests/testflows/ldap/external_user_directory/configs/ldap3/certs/ldap.crt new file mode 100644 index 00000000000..9167cbf861d --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap3/certs/ldap.crt @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDQDCCAigCFCJ7El0ntrGktZVTYTZd+OwtcJjBMA0GCSqGSIb3DQEBCwUAMFox +CzAJBgNVBAYTAkNBMQswCQYDVQQIDAJPTjEPMA0GA1UEBwwGT3R0YXdhMREwDwYD +VQQKDAhBbHRpbml0eTELMAkGA1UECwwCUUExDTALBgNVBAMMBHJvb3QwHhcNMjAw +NjExMTkxMTQzWhcNMzAwNjA5MTkxMTQzWjBfMQswCQYDVQQGEwJDQTELMAkGA1UE +CAwCT04xDzANBgNVBAcMBk90dGF3YTERMA8GA1UECgwIQWx0aW5pdHkxCzAJBgNV +BAsMAlFBMRIwEAYDVQQDDAlvcGVubGRhcDIwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQC0Mbn//U56URavMgXm82FWP6vBdKuRydFX/L0M5XLlnAtk/IXG +/T+4t7nOBJxWmTp/xpsPtSMALE4eFJpEUEqlpVbG5DfBzVWcYOWoMeRAcHWCDkzr +PkB6I0dfF0Mm5hoaDhn+ZXjBWvoh/IlJdAnPg5mlejflJBQ7xtFC9eN6WjldXuRO +vyntGNuMfVLgITHwXuH2yZ98G0mFO6TU/9dRY/Z3D6RTSzKdb17Yk/VnG+ry92u2 +0sgXIBvhuJuC3ksWLArwwFoMl8DVa05D4O2H76goGdCcQ0KzqBV8RPXAh3UcgP2e +Zu90p2EGIhIk+sZTCkPd4dorxjL9nkRR86HdAgMBAAEwDQYJKoZIhvcNAQELBQAD +ggEBAJWiCxJaTksv/BTsh/etxlDY5eHwqStqIuiovEQ8bhGAcKJ3bfWd/YTb8DUS +hrLvXrXdOVC+U8PqPFXBpdOqcm5Dc233z52VgUCb+0EKv3lAzgKXRIo32h52skdK +NnRrCHDeDzgfEIXR4MEJ99cLEaxWyXQhremmTYWHYznry9/4NYz40gCDxHn9dJAi +KxFyDNxhtuKs58zp4PrBoo+542JurAoLPtRGOhdXpU2RkQVU/ho38HsAXDStAB5D +vAoSxPuMHKgo17ffrb0oqU3didwaA9fIsz7Mr6RxmI7X03s7hLzNBq9FCqu0U3RR +CX4zWGFNJu/ieSGVWLYKQzbYxp8= +-----END CERTIFICATE----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap3/certs/ldap.csr b/tests/testflows/ldap/external_user_directory/configs/ldap3/certs/ldap.csr new file mode 100644 index 00000000000..bf569f727d6 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap3/certs/ldap.csr @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIICpDCCAYwCAQAwXzELMAkGA1UEBhMCQ0ExCzAJBgNVBAgMAk9OMQ8wDQYDVQQH +DAZPdHRhd2ExETAPBgNVBAoMCEFsdGluaXR5MQswCQYDVQQLDAJRQTESMBAGA1UE +AwwJb3BlbmxkYXAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtDG5 +//1OelEWrzIF5vNhVj+rwXSrkcnRV/y9DOVy5ZwLZPyFxv0/uLe5zgScVpk6f8ab +D7UjACxOHhSaRFBKpaVWxuQ3wc1VnGDlqDHkQHB1gg5M6z5AeiNHXxdDJuYaGg4Z +/mV4wVr6IfyJSXQJz4OZpXo35SQUO8bRQvXjelo5XV7kTr8p7RjbjH1S4CEx8F7h +9smffBtJhTuk1P/XUWP2dw+kU0synW9e2JP1Zxvq8vdrttLIFyAb4bibgt5LFiwK +8MBaDJfA1WtOQ+Dth++oKBnQnENCs6gVfET1wId1HID9nmbvdKdhBiISJPrGUwpD +3eHaK8Yy/Z5EUfOh3QIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAEzIjZQOT5R7 +mEJg+RFpCSIoPn3xJ4/VMMyWqA3bTGZKpb4S6GxgsierY/87kPL7jZrMdGYB4Dc3 +2M3VWZGXlYo8vctH1zLE9VW6CzosUpl20lhdgydoCMz3RQqdJyK8aGeFTeLtk7G/ +TRCCUFUE6jaA+VtaCPCnOJSff3jUf76xguEu7dgTZgCKV7dtBqald8gIzF3D+AJJ +7pEN2UrC3UR0xpe2cj2GhndQJ+WsIyft3zpNFzAO13j8ZPibuVP7oDWcW3ixNCWC +213aeRVplJGof8Eo6llDxP+6Fwp1YmOoQmwB1Xm3t4ADn7FLJ14LONLB7q40KviG +RyLyqu3IVOI= +-----END CERTIFICATE REQUEST----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap3/certs/ldap.key b/tests/testflows/ldap/external_user_directory/configs/ldap3/certs/ldap.key new file mode 100644 index 00000000000..5ab3a3f8b59 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap3/certs/ldap.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEAtDG5//1OelEWrzIF5vNhVj+rwXSrkcnRV/y9DOVy5ZwLZPyF +xv0/uLe5zgScVpk6f8abD7UjACxOHhSaRFBKpaVWxuQ3wc1VnGDlqDHkQHB1gg5M +6z5AeiNHXxdDJuYaGg4Z/mV4wVr6IfyJSXQJz4OZpXo35SQUO8bRQvXjelo5XV7k +Tr8p7RjbjH1S4CEx8F7h9smffBtJhTuk1P/XUWP2dw+kU0synW9e2JP1Zxvq8vdr +ttLIFyAb4bibgt5LFiwK8MBaDJfA1WtOQ+Dth++oKBnQnENCs6gVfET1wId1HID9 +nmbvdKdhBiISJPrGUwpD3eHaK8Yy/Z5EUfOh3QIDAQABAoIBADugMMIKWcuTxYPX +c6iGZHEbxIPRTWyCcalB0nTQAAMGbabPAJ1l8432DZ+kWu806OybFXhPIfPOtVKy +0pFEWE8TtPE/V0vj3C5Qye2sBLFmBRwyCzXUdZV00wseMXRPs9dnTyalAR5KMnbI +j80kfpKSI2dkV9aU57UYBuq3Xrx/TCGItwL769D4ZZW9BvbpiTZApQQFZ0gwUFFn +btPXGU9Ti8H4mfBuZWL+5CaZdqOo76+CXvMPaUK0F9MJp4yX3XxQLRNH3qz/Tyn7 +h7QOOo0XTqoUmzRw0N9QRVH5LRdSE5yq3aF9aFKjNW59exz+62pufOFadngzkpkn +OKCzgWkCgYEA4mOWWMzdYwMn3GtfG7whqlqy7wOmMkNb81zTDQejHBV98dnj0AHr +deurfKWzHrAh3DXo6tFeqUIgXabhBPS/0dEx/S5sgLFmuUZP05EUYahfWBgzzmM9 +C6Oe5xIMLzxsZCJczolsfkEsoFe4o0vkvuLYoQrQL7InzewcDy8cUxsCgYEAy8Na +YCnanSNDY03Bulcni+5sF+opaHseeki1pv3nlw8TwsWuZF9ApS+yL7ck9jJjxBRR +RC3KGmpoqIr0vTmUYS946ngQWXPE90zfuhJfM+NRv/q0oCjH0qAcxRbTkls5On9v +oxJ8rO7gD6K85eHqasWdbCVzdZrobOXzay37tmcCgYBfyUUmw190cjReZauzH3Gb +E48b5A5gu/Fe0cqWe8G+szU7rDZgnz9SAGnpbm6QMHPTKZgoKngD42+wUFhq8Wdr +zjh5aDgOZ4EQKTjDSmI2Q7g7nNnmnESK9SrZl+BB6C3wXD2qQaj+7nKEUTlVFlpt +jaucz+dwFtASp7Djl8pDOwKBgEtr2c3ycArt/ImLRIP2spqm+7e2YvFbcSKOOz6+ +iLRvTj8v8KcSYtlB2FC1F6dRa4AujQ4RbNduP6LzHDfWUkfOzJDtNBAIPAXVnJJB +LqAEKkRHRghqT9x0i3GgS1vHDF3MwcO4mhFgserXr9ffUWeIEgbvrdcAKbv1Oa6Y +bK1NAoGAGPm8ISmboDJynjBl9wMrkcy23Pwg9kmyocdWUHh0zMLDKriZNKYB6u/U +C+/RTfkohPoHPzkeqWiHp7z3JhMItYUfTkNW6vMCxEGc0NEN6ZyMIjtiDPGN1n6O +E7jmODFmj1AQICQGdV5SHp+yKvKyb0YHKyDwETbs4SZBXxVvjEw= +-----END RSA PRIVATE KEY----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap3/config/export.ldif b/tests/testflows/ldap/external_user_directory/configs/ldap3/config/export.ldif new file mode 100644 index 00000000000..6ac9a995efd --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap3/config/export.ldif @@ -0,0 +1,64 @@ +# LDIF Export for dc=company,dc=com +# Server: openldap (openldap) +# Search Scope: sub +# Search Filter: (objectClass=*) +# Total Entries: 7 +# +# Generated by phpLDAPadmin (http://phpldapadmin.sourceforge.net) on May 22, 2020 5:51 pm +# Version: 1.2.5 + +# Entry 1: dc=company,dc=com +#dn: dc=company,dc=com +#dc: company +#o: company +#objectclass: top +#objectclass: dcObject +#objectclass: organization + +# Entry 2: cn=admin,dc=company,dc=com +#dn: cn=admin,dc=company,dc=com +#cn: admin +#description: LDAP administrator +#objectclass: simpleSecurityObject +#objectclass: organizationalRole +#userpassword: {SSHA}eUEupkQCTvq9SkrxfWGSe5rX+orrjVbF + +# Entry 3: ou=groups,dc=company,dc=com +dn: ou=groups,dc=company,dc=com +objectclass: organizationalUnit +objectclass: top +ou: groups + +# Entry 4: cn=admin,ou=groups,dc=company,dc=com +dn: cn=admin,ou=groups,dc=company,dc=com +cn: admin +gidnumber: 500 +objectclass: posixGroup +objectclass: top + +# Entry 5: cn=users,ou=groups,dc=company,dc=com +dn: cn=users,ou=groups,dc=company,dc=com +cn: users +gidnumber: 501 +objectclass: posixGroup +objectclass: top + +# Entry 6: ou=users,dc=company,dc=com +dn: ou=users,dc=company,dc=com +objectclass: organizationalUnit +objectclass: top +ou: users + +# Entry 7: cn=user3,ou=users,dc=company,dc=com +dn: cn=user3,ou=users,dc=company,dc=com +cn: user3 +gidnumber: 501 +givenname: John +homedirectory: /home/users/user3 +objectclass: inetOrgPerson +objectclass: posixAccount +objectclass: top +sn: User +uid: user3 +uidnumber: 1003 +userpassword: user3 diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap4/certs/ca.crt b/tests/testflows/ldap/external_user_directory/configs/ldap4/certs/ca.crt new file mode 100644 index 00000000000..8c71e3afc91 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap4/certs/ca.crt @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDlTCCAn2gAwIBAgIUJBqw2dHM2DDCZjYSkPOESlvDH6swDQYJKoZIhvcNAQEL +BQAwWjELMAkGA1UEBhMCQ0ExCzAJBgNVBAgMAk9OMQ8wDQYDVQQHDAZPdHRhd2Ex +ETAPBgNVBAoMCEFsdGluaXR5MQswCQYDVQQLDAJRQTENMAsGA1UEAwwEcm9vdDAe +Fw0yMDA2MTExOTAzNDhaFw0zMDA2MDkxOTAzNDhaMFoxCzAJBgNVBAYTAkNBMQsw +CQYDVQQIDAJPTjEPMA0GA1UEBwwGT3R0YXdhMREwDwYDVQQKDAhBbHRpbml0eTEL +MAkGA1UECwwCUUExDTALBgNVBAMMBHJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQC9Irr0zGV+HCI2fZ0ht4hR5It4Sbjz4RwZV8ENRP/+TEz8l9eK +J6ygxhKX7SMYzIs/jS9Gsq4plX1r2ujW1qRf8yLpR4+dGLP+jBRi1drj0XjZXosT +SERjWzgPauWxL9LN8+l26eBAqz6fw5e0W8WRSTgf5iGiCcKOTmaATIUjP0CdfWKK +qpktI4vhe++CXZFJ3usR+8KZ/FwwbCLJM/3J2HnbcXfcaYPYvr1tfqLudKSTbG9H +M3+AVwjctdesc/0sbd51Zsm0ClQptMbuKnDCYauGg61kNkgbgPgRmH9Pzo67DtxF +/WW+PtOzq8xLOifciQ9Piboy9QBSQZGwf4wzAgMBAAGjUzBRMB0GA1UdDgQWBBSi +njya0RDozx3OZTLYFpwqYnlpIDAfBgNVHSMEGDAWgBSinjya0RDozx3OZTLYFpwq +YnlpIDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBAD7VyFg7F +U1C25KFvtauchAOjCW6w7U/b3z1dVZvcQ88/kH1VsLUcfGixlSilUEfPTJsi7OA0 +R5BQdh2GGcjUJv4iqEFGU05KvMVmRRKn08P62+ZhJxKMxG26VzcliRZzCMkI6d0W +lFwI6nM45yeqdHVh5k4xbuJzqpbD9BtXXLI+/Ra9Fx8S9ETA3GdidpZLU5P1VLxq +UuedfqyAVWZXpr6TAURGxouRmRzul9yFzbSUex+MLEIPrstjtEwV3+tBQZJz9xAS +TVPj+Nv3LO7GCq54bdwkq1ioWbSL2hEmABkj6kdW/JwmfhGHf/2rirDVMzrTYw07 +dFJfAZC+FEsv +-----END CERTIFICATE----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap4/certs/dhparam.pem b/tests/testflows/ldap/external_user_directory/configs/ldap4/certs/dhparam.pem new file mode 100644 index 00000000000..0a96faffd62 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap4/certs/dhparam.pem @@ -0,0 +1,5 @@ +-----BEGIN DH PARAMETERS----- +MIGHAoGBAJitt2hhnpDViQ5ko2ipBMdjy+bZ6FR/WdZ987R7lQvBkKehPXmxtEyV +AO6ofv5CZSDJokc5bUeBOAtg0EhMTCH82uPdwQvt58jRXcxXBg4JTjkx+oW9LBv2 +FdZsbaX8+SYivmiZ0Jp8T/HBm/4DA9VBS0O5GFRS4C7dHhmSTPfDAgEC +-----END DH PARAMETERS----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap4/certs/ldap.crt b/tests/testflows/ldap/external_user_directory/configs/ldap4/certs/ldap.crt new file mode 100644 index 00000000000..9167cbf861d --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap4/certs/ldap.crt @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDQDCCAigCFCJ7El0ntrGktZVTYTZd+OwtcJjBMA0GCSqGSIb3DQEBCwUAMFox +CzAJBgNVBAYTAkNBMQswCQYDVQQIDAJPTjEPMA0GA1UEBwwGT3R0YXdhMREwDwYD +VQQKDAhBbHRpbml0eTELMAkGA1UECwwCUUExDTALBgNVBAMMBHJvb3QwHhcNMjAw +NjExMTkxMTQzWhcNMzAwNjA5MTkxMTQzWjBfMQswCQYDVQQGEwJDQTELMAkGA1UE +CAwCT04xDzANBgNVBAcMBk90dGF3YTERMA8GA1UECgwIQWx0aW5pdHkxCzAJBgNV +BAsMAlFBMRIwEAYDVQQDDAlvcGVubGRhcDIwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQC0Mbn//U56URavMgXm82FWP6vBdKuRydFX/L0M5XLlnAtk/IXG +/T+4t7nOBJxWmTp/xpsPtSMALE4eFJpEUEqlpVbG5DfBzVWcYOWoMeRAcHWCDkzr +PkB6I0dfF0Mm5hoaDhn+ZXjBWvoh/IlJdAnPg5mlejflJBQ7xtFC9eN6WjldXuRO +vyntGNuMfVLgITHwXuH2yZ98G0mFO6TU/9dRY/Z3D6RTSzKdb17Yk/VnG+ry92u2 +0sgXIBvhuJuC3ksWLArwwFoMl8DVa05D4O2H76goGdCcQ0KzqBV8RPXAh3UcgP2e +Zu90p2EGIhIk+sZTCkPd4dorxjL9nkRR86HdAgMBAAEwDQYJKoZIhvcNAQELBQAD +ggEBAJWiCxJaTksv/BTsh/etxlDY5eHwqStqIuiovEQ8bhGAcKJ3bfWd/YTb8DUS +hrLvXrXdOVC+U8PqPFXBpdOqcm5Dc233z52VgUCb+0EKv3lAzgKXRIo32h52skdK +NnRrCHDeDzgfEIXR4MEJ99cLEaxWyXQhremmTYWHYznry9/4NYz40gCDxHn9dJAi +KxFyDNxhtuKs58zp4PrBoo+542JurAoLPtRGOhdXpU2RkQVU/ho38HsAXDStAB5D +vAoSxPuMHKgo17ffrb0oqU3didwaA9fIsz7Mr6RxmI7X03s7hLzNBq9FCqu0U3RR +CX4zWGFNJu/ieSGVWLYKQzbYxp8= +-----END CERTIFICATE----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap4/certs/ldap.csr b/tests/testflows/ldap/external_user_directory/configs/ldap4/certs/ldap.csr new file mode 100644 index 00000000000..bf569f727d6 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap4/certs/ldap.csr @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIICpDCCAYwCAQAwXzELMAkGA1UEBhMCQ0ExCzAJBgNVBAgMAk9OMQ8wDQYDVQQH +DAZPdHRhd2ExETAPBgNVBAoMCEFsdGluaXR5MQswCQYDVQQLDAJRQTESMBAGA1UE +AwwJb3BlbmxkYXAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtDG5 +//1OelEWrzIF5vNhVj+rwXSrkcnRV/y9DOVy5ZwLZPyFxv0/uLe5zgScVpk6f8ab +D7UjACxOHhSaRFBKpaVWxuQ3wc1VnGDlqDHkQHB1gg5M6z5AeiNHXxdDJuYaGg4Z +/mV4wVr6IfyJSXQJz4OZpXo35SQUO8bRQvXjelo5XV7kTr8p7RjbjH1S4CEx8F7h +9smffBtJhTuk1P/XUWP2dw+kU0synW9e2JP1Zxvq8vdrttLIFyAb4bibgt5LFiwK +8MBaDJfA1WtOQ+Dth++oKBnQnENCs6gVfET1wId1HID9nmbvdKdhBiISJPrGUwpD +3eHaK8Yy/Z5EUfOh3QIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAEzIjZQOT5R7 +mEJg+RFpCSIoPn3xJ4/VMMyWqA3bTGZKpb4S6GxgsierY/87kPL7jZrMdGYB4Dc3 +2M3VWZGXlYo8vctH1zLE9VW6CzosUpl20lhdgydoCMz3RQqdJyK8aGeFTeLtk7G/ +TRCCUFUE6jaA+VtaCPCnOJSff3jUf76xguEu7dgTZgCKV7dtBqald8gIzF3D+AJJ +7pEN2UrC3UR0xpe2cj2GhndQJ+WsIyft3zpNFzAO13j8ZPibuVP7oDWcW3ixNCWC +213aeRVplJGof8Eo6llDxP+6Fwp1YmOoQmwB1Xm3t4ADn7FLJ14LONLB7q40KviG +RyLyqu3IVOI= +-----END CERTIFICATE REQUEST----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap4/certs/ldap.key b/tests/testflows/ldap/external_user_directory/configs/ldap4/certs/ldap.key new file mode 100644 index 00000000000..5ab3a3f8b59 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap4/certs/ldap.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEAtDG5//1OelEWrzIF5vNhVj+rwXSrkcnRV/y9DOVy5ZwLZPyF +xv0/uLe5zgScVpk6f8abD7UjACxOHhSaRFBKpaVWxuQ3wc1VnGDlqDHkQHB1gg5M +6z5AeiNHXxdDJuYaGg4Z/mV4wVr6IfyJSXQJz4OZpXo35SQUO8bRQvXjelo5XV7k +Tr8p7RjbjH1S4CEx8F7h9smffBtJhTuk1P/XUWP2dw+kU0synW9e2JP1Zxvq8vdr +ttLIFyAb4bibgt5LFiwK8MBaDJfA1WtOQ+Dth++oKBnQnENCs6gVfET1wId1HID9 +nmbvdKdhBiISJPrGUwpD3eHaK8Yy/Z5EUfOh3QIDAQABAoIBADugMMIKWcuTxYPX +c6iGZHEbxIPRTWyCcalB0nTQAAMGbabPAJ1l8432DZ+kWu806OybFXhPIfPOtVKy +0pFEWE8TtPE/V0vj3C5Qye2sBLFmBRwyCzXUdZV00wseMXRPs9dnTyalAR5KMnbI +j80kfpKSI2dkV9aU57UYBuq3Xrx/TCGItwL769D4ZZW9BvbpiTZApQQFZ0gwUFFn +btPXGU9Ti8H4mfBuZWL+5CaZdqOo76+CXvMPaUK0F9MJp4yX3XxQLRNH3qz/Tyn7 +h7QOOo0XTqoUmzRw0N9QRVH5LRdSE5yq3aF9aFKjNW59exz+62pufOFadngzkpkn +OKCzgWkCgYEA4mOWWMzdYwMn3GtfG7whqlqy7wOmMkNb81zTDQejHBV98dnj0AHr +deurfKWzHrAh3DXo6tFeqUIgXabhBPS/0dEx/S5sgLFmuUZP05EUYahfWBgzzmM9 +C6Oe5xIMLzxsZCJczolsfkEsoFe4o0vkvuLYoQrQL7InzewcDy8cUxsCgYEAy8Na +YCnanSNDY03Bulcni+5sF+opaHseeki1pv3nlw8TwsWuZF9ApS+yL7ck9jJjxBRR +RC3KGmpoqIr0vTmUYS946ngQWXPE90zfuhJfM+NRv/q0oCjH0qAcxRbTkls5On9v +oxJ8rO7gD6K85eHqasWdbCVzdZrobOXzay37tmcCgYBfyUUmw190cjReZauzH3Gb +E48b5A5gu/Fe0cqWe8G+szU7rDZgnz9SAGnpbm6QMHPTKZgoKngD42+wUFhq8Wdr +zjh5aDgOZ4EQKTjDSmI2Q7g7nNnmnESK9SrZl+BB6C3wXD2qQaj+7nKEUTlVFlpt +jaucz+dwFtASp7Djl8pDOwKBgEtr2c3ycArt/ImLRIP2spqm+7e2YvFbcSKOOz6+ +iLRvTj8v8KcSYtlB2FC1F6dRa4AujQ4RbNduP6LzHDfWUkfOzJDtNBAIPAXVnJJB +LqAEKkRHRghqT9x0i3GgS1vHDF3MwcO4mhFgserXr9ffUWeIEgbvrdcAKbv1Oa6Y +bK1NAoGAGPm8ISmboDJynjBl9wMrkcy23Pwg9kmyocdWUHh0zMLDKriZNKYB6u/U +C+/RTfkohPoHPzkeqWiHp7z3JhMItYUfTkNW6vMCxEGc0NEN6ZyMIjtiDPGN1n6O +E7jmODFmj1AQICQGdV5SHp+yKvKyb0YHKyDwETbs4SZBXxVvjEw= +-----END RSA PRIVATE KEY----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap4/config/export.ldif b/tests/testflows/ldap/external_user_directory/configs/ldap4/config/export.ldif new file mode 100644 index 00000000000..36afdb4e350 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap4/config/export.ldif @@ -0,0 +1,64 @@ +# LDIF Export for dc=company,dc=com +# Server: openldap (openldap) +# Search Scope: sub +# Search Filter: (objectClass=*) +# Total Entries: 7 +# +# Generated by phpLDAPadmin (http://phpldapadmin.sourceforge.net) on May 22, 2020 5:51 pm +# Version: 1.2.5 + +# Entry 1: dc=company,dc=com +#dn: dc=company,dc=com +#dc: company +#o: company +#objectclass: top +#objectclass: dcObject +#objectclass: organization + +# Entry 2: cn=admin,dc=company,dc=com +#dn: cn=admin,dc=company,dc=com +#cn: admin +#description: LDAP administrator +#objectclass: simpleSecurityObject +#objectclass: organizationalRole +#userpassword: {SSHA}eUEupkQCTvq9SkrxfWGSe5rX+orrjVbF + +# Entry 3: ou=groups,dc=company,dc=com +dn: ou=groups,dc=company,dc=com +objectclass: organizationalUnit +objectclass: top +ou: groups + +# Entry 4: cn=admin,ou=groups,dc=company,dc=com +dn: cn=admin,ou=groups,dc=company,dc=com +cn: admin +gidnumber: 500 +objectclass: posixGroup +objectclass: top + +# Entry 5: cn=users,ou=groups,dc=company,dc=com +dn: cn=users,ou=groups,dc=company,dc=com +cn: users +gidnumber: 501 +objectclass: posixGroup +objectclass: top + +# Entry 6: ou=users,dc=company,dc=com +dn: ou=users,dc=company,dc=com +objectclass: organizationalUnit +objectclass: top +ou: users + +# Entry 7: cn=user4,ou=users,dc=company,dc=com +dn: cn=user4,ou=users,dc=company,dc=com +cn: user4 +gidnumber: 501 +givenname: John +homedirectory: /home/users/user4 +objectclass: inetOrgPerson +objectclass: posixAccount +objectclass: top +sn: User +uid: user4 +uidnumber: 1004 +userpassword: user4 diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap5/config/export.ldif b/tests/testflows/ldap/external_user_directory/configs/ldap5/config/export.ldif new file mode 100644 index 00000000000..bc3d2ff75fc --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap5/config/export.ldif @@ -0,0 +1,64 @@ +# LDIF Export for dc=company,dc=com +# Server: openldap (openldap) +# Search Scope: sub +# Search Filter: (objectClass=*) +# Total Entries: 7 +# +# Generated by phpLDAPadmin (http://phpldapadmin.sourceforge.net) on May 22, 2020 5:51 pm +# Version: 1.2.5 + +# Entry 1: dc=company,dc=com +#dn: dc=company,dc=com +#dc: company +#o: company +#objectclass: top +#objectclass: dcObject +#objectclass: organization + +# Entry 2: cn=admin,dc=company,dc=com +#dn: cn=admin,dc=company,dc=com +#cn: admin +#description: LDAP administrator +#objectclass: simpleSecurityObject +#objectclass: organizationalRole +#userpassword: {SSHA}eUEupkQCTvq9SkrxfWGSe5rX+orrjVbF + +# Entry 3: ou=groups,dc=company,dc=com +dn: ou=groups,dc=company,dc=com +objectclass: organizationalUnit +objectclass: top +ou: groups + +# Entry 4: cn=admin,ou=groups,dc=company,dc=com +dn: cn=admin,ou=groups,dc=company,dc=com +cn: admin +gidnumber: 500 +objectclass: posixGroup +objectclass: top + +# Entry 5: cn=users,ou=groups,dc=company,dc=com +dn: cn=users,ou=groups,dc=company,dc=com +cn: users +gidnumber: 501 +objectclass: posixGroup +objectclass: top + +# Entry 6: ou=users,dc=company,dc=com +dn: ou=users,dc=company,dc=com +objectclass: organizationalUnit +objectclass: top +ou: users + +# Entry 7: cn=user5,ou=users,dc=company,dc=com +dn: cn=user5,ou=users,dc=company,dc=com +cn: user5 +gidnumber: 501 +givenname: John +homedirectory: /home/users/user5 +objectclass: inetOrgPerson +objectclass: posixAccount +objectclass: top +sn: User +uid: user5 +uidnumber: 1005 +userpassword: user5 diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap5/ldap2/certs/ca.crt b/tests/testflows/ldap/external_user_directory/configs/ldap5/ldap2/certs/ca.crt new file mode 100644 index 00000000000..8c71e3afc91 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap5/ldap2/certs/ca.crt @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDlTCCAn2gAwIBAgIUJBqw2dHM2DDCZjYSkPOESlvDH6swDQYJKoZIhvcNAQEL +BQAwWjELMAkGA1UEBhMCQ0ExCzAJBgNVBAgMAk9OMQ8wDQYDVQQHDAZPdHRhd2Ex +ETAPBgNVBAoMCEFsdGluaXR5MQswCQYDVQQLDAJRQTENMAsGA1UEAwwEcm9vdDAe +Fw0yMDA2MTExOTAzNDhaFw0zMDA2MDkxOTAzNDhaMFoxCzAJBgNVBAYTAkNBMQsw +CQYDVQQIDAJPTjEPMA0GA1UEBwwGT3R0YXdhMREwDwYDVQQKDAhBbHRpbml0eTEL +MAkGA1UECwwCUUExDTALBgNVBAMMBHJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQC9Irr0zGV+HCI2fZ0ht4hR5It4Sbjz4RwZV8ENRP/+TEz8l9eK +J6ygxhKX7SMYzIs/jS9Gsq4plX1r2ujW1qRf8yLpR4+dGLP+jBRi1drj0XjZXosT +SERjWzgPauWxL9LN8+l26eBAqz6fw5e0W8WRSTgf5iGiCcKOTmaATIUjP0CdfWKK +qpktI4vhe++CXZFJ3usR+8KZ/FwwbCLJM/3J2HnbcXfcaYPYvr1tfqLudKSTbG9H +M3+AVwjctdesc/0sbd51Zsm0ClQptMbuKnDCYauGg61kNkgbgPgRmH9Pzo67DtxF +/WW+PtOzq8xLOifciQ9Piboy9QBSQZGwf4wzAgMBAAGjUzBRMB0GA1UdDgQWBBSi +njya0RDozx3OZTLYFpwqYnlpIDAfBgNVHSMEGDAWgBSinjya0RDozx3OZTLYFpwq +YnlpIDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBAD7VyFg7F +U1C25KFvtauchAOjCW6w7U/b3z1dVZvcQ88/kH1VsLUcfGixlSilUEfPTJsi7OA0 +R5BQdh2GGcjUJv4iqEFGU05KvMVmRRKn08P62+ZhJxKMxG26VzcliRZzCMkI6d0W +lFwI6nM45yeqdHVh5k4xbuJzqpbD9BtXXLI+/Ra9Fx8S9ETA3GdidpZLU5P1VLxq +UuedfqyAVWZXpr6TAURGxouRmRzul9yFzbSUex+MLEIPrstjtEwV3+tBQZJz9xAS +TVPj+Nv3LO7GCq54bdwkq1ioWbSL2hEmABkj6kdW/JwmfhGHf/2rirDVMzrTYw07 +dFJfAZC+FEsv +-----END CERTIFICATE----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap5/ldap2/certs/dhparam.pem b/tests/testflows/ldap/external_user_directory/configs/ldap5/ldap2/certs/dhparam.pem new file mode 100644 index 00000000000..0a96faffd62 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap5/ldap2/certs/dhparam.pem @@ -0,0 +1,5 @@ +-----BEGIN DH PARAMETERS----- +MIGHAoGBAJitt2hhnpDViQ5ko2ipBMdjy+bZ6FR/WdZ987R7lQvBkKehPXmxtEyV +AO6ofv5CZSDJokc5bUeBOAtg0EhMTCH82uPdwQvt58jRXcxXBg4JTjkx+oW9LBv2 +FdZsbaX8+SYivmiZ0Jp8T/HBm/4DA9VBS0O5GFRS4C7dHhmSTPfDAgEC +-----END DH PARAMETERS----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap5/ldap2/certs/ldap.crt b/tests/testflows/ldap/external_user_directory/configs/ldap5/ldap2/certs/ldap.crt new file mode 100644 index 00000000000..9167cbf861d --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap5/ldap2/certs/ldap.crt @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDQDCCAigCFCJ7El0ntrGktZVTYTZd+OwtcJjBMA0GCSqGSIb3DQEBCwUAMFox +CzAJBgNVBAYTAkNBMQswCQYDVQQIDAJPTjEPMA0GA1UEBwwGT3R0YXdhMREwDwYD +VQQKDAhBbHRpbml0eTELMAkGA1UECwwCUUExDTALBgNVBAMMBHJvb3QwHhcNMjAw +NjExMTkxMTQzWhcNMzAwNjA5MTkxMTQzWjBfMQswCQYDVQQGEwJDQTELMAkGA1UE +CAwCT04xDzANBgNVBAcMBk90dGF3YTERMA8GA1UECgwIQWx0aW5pdHkxCzAJBgNV +BAsMAlFBMRIwEAYDVQQDDAlvcGVubGRhcDIwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQC0Mbn//U56URavMgXm82FWP6vBdKuRydFX/L0M5XLlnAtk/IXG +/T+4t7nOBJxWmTp/xpsPtSMALE4eFJpEUEqlpVbG5DfBzVWcYOWoMeRAcHWCDkzr +PkB6I0dfF0Mm5hoaDhn+ZXjBWvoh/IlJdAnPg5mlejflJBQ7xtFC9eN6WjldXuRO +vyntGNuMfVLgITHwXuH2yZ98G0mFO6TU/9dRY/Z3D6RTSzKdb17Yk/VnG+ry92u2 +0sgXIBvhuJuC3ksWLArwwFoMl8DVa05D4O2H76goGdCcQ0KzqBV8RPXAh3UcgP2e +Zu90p2EGIhIk+sZTCkPd4dorxjL9nkRR86HdAgMBAAEwDQYJKoZIhvcNAQELBQAD +ggEBAJWiCxJaTksv/BTsh/etxlDY5eHwqStqIuiovEQ8bhGAcKJ3bfWd/YTb8DUS +hrLvXrXdOVC+U8PqPFXBpdOqcm5Dc233z52VgUCb+0EKv3lAzgKXRIo32h52skdK +NnRrCHDeDzgfEIXR4MEJ99cLEaxWyXQhremmTYWHYznry9/4NYz40gCDxHn9dJAi +KxFyDNxhtuKs58zp4PrBoo+542JurAoLPtRGOhdXpU2RkQVU/ho38HsAXDStAB5D +vAoSxPuMHKgo17ffrb0oqU3didwaA9fIsz7Mr6RxmI7X03s7hLzNBq9FCqu0U3RR +CX4zWGFNJu/ieSGVWLYKQzbYxp8= +-----END CERTIFICATE----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap5/ldap2/certs/ldap.csr b/tests/testflows/ldap/external_user_directory/configs/ldap5/ldap2/certs/ldap.csr new file mode 100644 index 00000000000..bf569f727d6 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap5/ldap2/certs/ldap.csr @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIICpDCCAYwCAQAwXzELMAkGA1UEBhMCQ0ExCzAJBgNVBAgMAk9OMQ8wDQYDVQQH +DAZPdHRhd2ExETAPBgNVBAoMCEFsdGluaXR5MQswCQYDVQQLDAJRQTESMBAGA1UE +AwwJb3BlbmxkYXAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtDG5 +//1OelEWrzIF5vNhVj+rwXSrkcnRV/y9DOVy5ZwLZPyFxv0/uLe5zgScVpk6f8ab +D7UjACxOHhSaRFBKpaVWxuQ3wc1VnGDlqDHkQHB1gg5M6z5AeiNHXxdDJuYaGg4Z +/mV4wVr6IfyJSXQJz4OZpXo35SQUO8bRQvXjelo5XV7kTr8p7RjbjH1S4CEx8F7h +9smffBtJhTuk1P/XUWP2dw+kU0synW9e2JP1Zxvq8vdrttLIFyAb4bibgt5LFiwK +8MBaDJfA1WtOQ+Dth++oKBnQnENCs6gVfET1wId1HID9nmbvdKdhBiISJPrGUwpD +3eHaK8Yy/Z5EUfOh3QIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAEzIjZQOT5R7 +mEJg+RFpCSIoPn3xJ4/VMMyWqA3bTGZKpb4S6GxgsierY/87kPL7jZrMdGYB4Dc3 +2M3VWZGXlYo8vctH1zLE9VW6CzosUpl20lhdgydoCMz3RQqdJyK8aGeFTeLtk7G/ +TRCCUFUE6jaA+VtaCPCnOJSff3jUf76xguEu7dgTZgCKV7dtBqald8gIzF3D+AJJ +7pEN2UrC3UR0xpe2cj2GhndQJ+WsIyft3zpNFzAO13j8ZPibuVP7oDWcW3ixNCWC +213aeRVplJGof8Eo6llDxP+6Fwp1YmOoQmwB1Xm3t4ADn7FLJ14LONLB7q40KviG +RyLyqu3IVOI= +-----END CERTIFICATE REQUEST----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap5/ldap2/certs/ldap.key b/tests/testflows/ldap/external_user_directory/configs/ldap5/ldap2/certs/ldap.key new file mode 100644 index 00000000000..5ab3a3f8b59 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap5/ldap2/certs/ldap.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEAtDG5//1OelEWrzIF5vNhVj+rwXSrkcnRV/y9DOVy5ZwLZPyF +xv0/uLe5zgScVpk6f8abD7UjACxOHhSaRFBKpaVWxuQ3wc1VnGDlqDHkQHB1gg5M +6z5AeiNHXxdDJuYaGg4Z/mV4wVr6IfyJSXQJz4OZpXo35SQUO8bRQvXjelo5XV7k +Tr8p7RjbjH1S4CEx8F7h9smffBtJhTuk1P/XUWP2dw+kU0synW9e2JP1Zxvq8vdr +ttLIFyAb4bibgt5LFiwK8MBaDJfA1WtOQ+Dth++oKBnQnENCs6gVfET1wId1HID9 +nmbvdKdhBiISJPrGUwpD3eHaK8Yy/Z5EUfOh3QIDAQABAoIBADugMMIKWcuTxYPX +c6iGZHEbxIPRTWyCcalB0nTQAAMGbabPAJ1l8432DZ+kWu806OybFXhPIfPOtVKy +0pFEWE8TtPE/V0vj3C5Qye2sBLFmBRwyCzXUdZV00wseMXRPs9dnTyalAR5KMnbI +j80kfpKSI2dkV9aU57UYBuq3Xrx/TCGItwL769D4ZZW9BvbpiTZApQQFZ0gwUFFn +btPXGU9Ti8H4mfBuZWL+5CaZdqOo76+CXvMPaUK0F9MJp4yX3XxQLRNH3qz/Tyn7 +h7QOOo0XTqoUmzRw0N9QRVH5LRdSE5yq3aF9aFKjNW59exz+62pufOFadngzkpkn +OKCzgWkCgYEA4mOWWMzdYwMn3GtfG7whqlqy7wOmMkNb81zTDQejHBV98dnj0AHr +deurfKWzHrAh3DXo6tFeqUIgXabhBPS/0dEx/S5sgLFmuUZP05EUYahfWBgzzmM9 +C6Oe5xIMLzxsZCJczolsfkEsoFe4o0vkvuLYoQrQL7InzewcDy8cUxsCgYEAy8Na +YCnanSNDY03Bulcni+5sF+opaHseeki1pv3nlw8TwsWuZF9ApS+yL7ck9jJjxBRR +RC3KGmpoqIr0vTmUYS946ngQWXPE90zfuhJfM+NRv/q0oCjH0qAcxRbTkls5On9v +oxJ8rO7gD6K85eHqasWdbCVzdZrobOXzay37tmcCgYBfyUUmw190cjReZauzH3Gb +E48b5A5gu/Fe0cqWe8G+szU7rDZgnz9SAGnpbm6QMHPTKZgoKngD42+wUFhq8Wdr +zjh5aDgOZ4EQKTjDSmI2Q7g7nNnmnESK9SrZl+BB6C3wXD2qQaj+7nKEUTlVFlpt +jaucz+dwFtASp7Djl8pDOwKBgEtr2c3ycArt/ImLRIP2spqm+7e2YvFbcSKOOz6+ +iLRvTj8v8KcSYtlB2FC1F6dRa4AujQ4RbNduP6LzHDfWUkfOzJDtNBAIPAXVnJJB +LqAEKkRHRghqT9x0i3GgS1vHDF3MwcO4mhFgserXr9ffUWeIEgbvrdcAKbv1Oa6Y +bK1NAoGAGPm8ISmboDJynjBl9wMrkcy23Pwg9kmyocdWUHh0zMLDKriZNKYB6u/U +C+/RTfkohPoHPzkeqWiHp7z3JhMItYUfTkNW6vMCxEGc0NEN6ZyMIjtiDPGN1n6O +E7jmODFmj1AQICQGdV5SHp+yKvKyb0YHKyDwETbs4SZBXxVvjEw= +-----END RSA PRIVATE KEY----- diff --git a/tests/testflows/ldap/external_user_directory/configs/ldap5/ldap2/config/export.ldif b/tests/testflows/ldap/external_user_directory/configs/ldap5/ldap2/config/export.ldif new file mode 100644 index 00000000000..c6470176a5e --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/configs/ldap5/ldap2/config/export.ldif @@ -0,0 +1,64 @@ +# LDIF Export for dc=company,dc=com +# Server: openldap (openldap) +# Search Scope: sub +# Search Filter: (objectClass=*) +# Total Entries: 7 +# +# Generated by phpLDAPadmin (http://phpldapadmin.sourceforge.net) on May 22, 2020 5:51 pm +# Version: 1.2.5 + +# Entry 1: dc=company,dc=com +#dn: dc=company,dc=com +#dc: company +#o: company +#objectclass: top +#objectclass: dcObject +#objectclass: organization + +# Entry 2: cn=admin,dc=company,dc=com +#dn: cn=admin,dc=company,dc=com +#cn: admin +#description: LDAP administrator +#objectclass: simpleSecurityObject +#objectclass: organizationalRole +#userpassword: {SSHA}eUEupkQCTvq9SkrxfWGSe5rX+orrjVbF + +# Entry 3: ou=groups,dc=company,dc=com +dn: ou=groups,dc=company,dc=com +objectclass: organizationalUnit +objectclass: top +ou: groups + +# Entry 4: cn=admin,ou=groups,dc=company,dc=com +dn: cn=admin,ou=groups,dc=company,dc=com +cn: admin +gidnumber: 500 +objectclass: posixGroup +objectclass: top + +# Entry 5: cn=users,ou=groups,dc=company,dc=com +dn: cn=users,ou=groups,dc=company,dc=com +cn: users +gidnumber: 501 +objectclass: posixGroup +objectclass: top + +# Entry 6: ou=users,dc=company,dc=com +dn: ou=users,dc=company,dc=com +objectclass: organizationalUnit +objectclass: top +ou: users + +# Entry 7: cn=user1,ou=users,dc=company,dc=com +dn: cn=user1,ou=users,dc=company,dc=com +cn: user1 +gidnumber: 501 +givenname: John1 +homedirectory: /home/users/user1 +objectclass: inetOrgPerson +objectclass: posixAccount +objectclass: top +sn: User1 +uid: user1 +uidnumber: 1001 +userpassword: user1 diff --git a/tests/testflows/ldap/external_user_directory/docker-compose/clickhouse-service.yml b/tests/testflows/ldap/external_user_directory/docker-compose/clickhouse-service.yml new file mode 100644 index 00000000000..2a56876c72e --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/docker-compose/clickhouse-service.yml @@ -0,0 +1,28 @@ +version: '2.3' + +services: + clickhouse: + image: yandex/clickhouse-integration-test + expose: + - "9000" + - "9009" + - "8123" + volumes: + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse/config.d:/etc/clickhouse-server/config.d" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse/users.d/:/etc/clickhouse-server/users.d" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse/ssl:/etc/clickhouse-server/ssl" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse/config.xml:/etc/clickhouse-server/config.xml" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse/users.xml:/etc/clickhouse-server/users.xml" + - "${CLICKHOUSE_TESTS_SERVER_BIN_PATH:-/usr/bin/clickhouse}:/usr/bin/clickhouse" + - "${CLICKHOUSE_TESTS_ODBC_BRIDGE_BIN_PATH:-/usr/bin/clickhouse-odbc-bridge}:/usr/bin/clickhouse-odbc-bridge" + entrypoint: bash -c "clickhouse server --config-file=/etc/clickhouse-server/config.xml --log-file=/var/log/clickhouse-server/clickhouse-server.log --errorlog-file=/var/log/clickhouse-server/clickhouse-server.err.log" + healthcheck: + test: clickhouse client --query='select 1' + interval: 10s + timeout: 10s + retries: 3 + start_period: 300s + cap_add: + - SYS_PTRACE + security_opt: + - label:disable diff --git a/tests/testflows/ldap/external_user_directory/docker-compose/docker-compose.yml b/tests/testflows/ldap/external_user_directory/docker-compose/docker-compose.yml new file mode 100644 index 00000000000..c8ff683df58 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/docker-compose/docker-compose.yml @@ -0,0 +1,162 @@ +version: '2.3' + +services: + openldap1: + # plain text + extends: + file: openldap-service.yml + service: openldap + volumes: + - "${CLICKHOUSE_TESTS_DIR}/configs/ldap1/config:/container/service/slapd/assets/config/bootstrap/ldif/custom" + + openldap2: + # TLS - never + extends: + file: openldap-service.yml + service: openldap + environment: + LDAP_TLS: "true" + LDAP_TLS_CRT_FILENAME: "ldap.crt" + LDAP_TLS_KEY_FILENAME: "ldap.key" + LDAP_TLS_DH_PARAM_FILENAME: "dhparam.pem" + LDAP_TLS_CA_CRT_FILENAME: "ca.crt" + LDAP_TLS_ENFORCE: "false" + LDAP_TLS_VERIFY_CLIENT: "never" + volumes: + - "${CLICKHOUSE_TESTS_DIR}/configs/ldap2/config:/container/service/slapd/assets/config/bootstrap/ldif/custom" + - "${CLICKHOUSE_TESTS_DIR}/configs/ldap2/certs:/container/service/slapd/assets/certs/" + + openldap3: + # plain text - custom port + extends: + file: openldap-service.yml + service: openldap + expose: + - "3089" + environment: + LDAP_PORT: "3089" + volumes: + - "${CLICKHOUSE_TESTS_DIR}/configs/ldap3/config:/container/service/slapd/assets/config/bootstrap/ldif/custom" + + openldap4: + # TLS - never custom port + extends: + file: openldap-service.yml + service: openldap + expose: + - "3089" + - "6036" + environment: + LDAP_PORT: "3089" + LDAPS_PORT: "6036" + LDAP_TLS: "true" + LDAP_TLS_CRT_FILENAME: "ldap.crt" + LDAP_TLS_KEY_FILENAME: "ldap.key" + LDAP_TLS_DH_PARAM_FILENAME: "dhparam.pem" + LDAP_TLS_CA_CRT_FILENAME: "ca.crt" + LDAP_TLS_ENFORCE: "false" + LDAP_TLS_VERIFY_CLIENT: "never" + LDAP_TLS_CIPHER_SUITE: "SECURE256:+SECURE128:-VERS-TLS-ALL:+VERS-TLS1.2:-RSA:-DHE-DSS:-CAMELLIA-128-CBC:-CAMELLIA-256-CBC" + volumes: + - "${CLICKHOUSE_TESTS_DIR}/configs/ldap4/config:/container/service/slapd/assets/config/bootstrap/ldif/custom" + - "${CLICKHOUSE_TESTS_DIR}/configs/ldap4/certs:/container/service/slapd/assets/certs/" + + openldap5: + # TLS - try + extends: + file: openldap-service.yml + service: openldap + environment: + LDAP_TLS: "true" + LDAP_TLS_CRT_FILENAME: "ldap.crt" + LDAP_TLS_KEY_FILENAME: "ldap.key" + LDAP_TLS_DH_PARAM_FILENAME: "dhparam.pem" + LDAP_TLS_CA_CRT_FILENAME: "ca.crt" + LDAP_TLS_ENFORCE: "false" + LDAP_TLS_VERIFY_CLIENT: "try" + volumes: + - "${CLICKHOUSE_TESTS_DIR}/configs/ldap5/config:/container/service/slapd/assets/config/bootstrap/ldif/custom" + - "${CLICKHOUSE_TESTS_DIR}/configs/ldap5/certs:/container/service/slapd/assets/certs/" + + phpldapadmin: + extends: + file: openldap-service.yml + service: phpldapadmin + environment: + PHPLDAPADMIN_LDAP_HOSTS: "openldap1" + depends_on: + openldap1: + condition: service_healthy + + zookeeper: + extends: + file: zookeeper-service.yml + service: zookeeper + + clickhouse1: + extends: + file: clickhouse-service.yml + service: clickhouse + hostname: clickhouse1 + volumes: + - "${CLICKHOUSE_TESTS_DIR}/_instances/clickhouse1/database/:/var/lib/clickhouse/" + - "${CLICKHOUSE_TESTS_DIR}/_instances/clickhouse1/logs/:/var/log/clickhouse-server/" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse1/config.d:/etc/clickhouse-server/config.d" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse1/users.d:/etc/clickhouse-server/users.d" + depends_on: + zookeeper: + condition: service_healthy + + clickhouse2: + extends: + file: clickhouse-service.yml + service: clickhouse + hostname: clickhouse2 + volumes: + - "${CLICKHOUSE_TESTS_DIR}/_instances/clickhouse2/database/:/var/lib/clickhouse/" + - "${CLICKHOUSE_TESTS_DIR}/_instances/clickhouse2/logs/:/var/log/clickhouse-server/" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse2/config.d:/etc/clickhouse-server/config.d" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse2/users.d:/etc/clickhouse-server/users.d" + depends_on: + zookeeper: + condition: service_healthy + + clickhouse3: + extends: + file: clickhouse-service.yml + service: clickhouse + hostname: clickhouse3 + volumes: + - "${CLICKHOUSE_TESTS_DIR}/_instances/clickhouse3/database/:/var/lib/clickhouse/" + - "${CLICKHOUSE_TESTS_DIR}/_instances/clickhouse3/logs/:/var/log/clickhouse-server/" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse3/config.d:/etc/clickhouse-server/config.d" + - "${CLICKHOUSE_TESTS_DIR}/configs/clickhouse3/users.d:/etc/clickhouse-server/users.d" + depends_on: + zookeeper: + condition: service_healthy + + # dummy service which does nothing, but allows to postpone + # 'docker-compose up -d' till all dependecies will go healthy + all_services_ready: + image: hello-world + depends_on: + clickhouse1: + condition: service_healthy + clickhouse2: + condition: service_healthy + clickhouse3: + condition: service_healthy + zookeeper: + condition: service_healthy + openldap1: + condition: service_healthy + openldap2: + condition: service_healthy + openldap3: + condition: service_healthy + openldap4: + condition: service_healthy + openldap5: + condition: service_healthy + phpldapadmin: + condition: service_healthy diff --git a/tests/testflows/ldap/external_user_directory/docker-compose/openldap-service.yml b/tests/testflows/ldap/external_user_directory/docker-compose/openldap-service.yml new file mode 100644 index 00000000000..139907c513c --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/docker-compose/openldap-service.yml @@ -0,0 +1,40 @@ +version: '2.3' + +services: + openldap: + image: osixia/openldap:1.4.0 + command: "--copy-service --loglevel debug" + environment: + LDAP_ORGANIZATION: "company" + LDAP_DOMAIN: "company.com" + LDAP_ADMIN_PASSWORD: "admin" + LDAP_TLS: "false" + expose: + - "389" + - "636" + healthcheck: + test: ldapsearch -x -H ldap://localhost:$${LDAP_PORT:-389} -b "dc=company,dc=com" -D "cn=admin,dc=company,dc=com" -w admin + interval: 10s + timeout: 10s + retries: 3 + start_period: 300s + security_opt: + - label:disable + + + phpldapadmin: + image: osixia/phpldapadmin:0.9.0 + container_name: phpldapadmin + environment: + PHPLDAPADMIN_HTTPS=false: + ports: + - "8080:80" + healthcheck: + test: echo 1 + interval: 10s + timeout: 10s + retries: 3 + start_period: 300s + security_opt: + - label:disable + diff --git a/tests/testflows/ldap/external_user_directory/docker-compose/zookeeper-service.yml b/tests/testflows/ldap/external_user_directory/docker-compose/zookeeper-service.yml new file mode 100644 index 00000000000..6691a2df31c --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/docker-compose/zookeeper-service.yml @@ -0,0 +1,18 @@ +version: '2.3' + +services: + zookeeper: + image: zookeeper:3.4.12 + expose: + - "2181" + environment: + ZOO_TICK_TIME: 500 + ZOO_MY_ID: 1 + healthcheck: + test: echo stat | nc localhost 2181 + interval: 10s + timeout: 10s + retries: 3 + start_period: 300s + security_opt: + - label:disable diff --git a/tests/testflows/ldap/external_user_directory/regression.py b/tests/testflows/ldap/external_user_directory/regression.py new file mode 100755 index 00000000000..6ce860a6fd2 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/regression.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +import sys +from testflows.core import * + +append_path(sys.path, "..", "..") + +from helpers.cluster import Cluster +from helpers.argparser import argparser +from ldap.external_user_directory.requirements import * + +# Cross-outs of known fails +xfails = { + "connection protocols/tls/tls_require_cert='try'": + [(Fail, "can't be tested with self-signed certificates")], + "connection protocols/tls/tls_require_cert='demand'": + [(Fail, "can't be tested with self-signed certificates")], + "connection protocols/starttls/tls_require_cert='try'": + [(Fail, "can't be tested with self-signed certificates")], + "connection protocols/starttls/tls_require_cert='demand'": + [(Fail, "can't be tested with self-signed certificates")], + "connection protocols/tls require cert default demand": + [(Fail, "can't be tested with self-signed certificates")], + "connection protocols/starttls with custom port": + [(Fail, "it seems that starttls is not enabled by default on custom plain-text ports in LDAP server")], + "connection protocols/tls cipher suite": + [(Fail, "can't get it to work")] +} + +@TestFeature +@Name("external user directory") +@ArgumentParser(argparser) +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication("1.0") +) +@XFails(xfails) +def regression(self, local, clickhouse_binary_path): + """ClickHouse LDAP external user directory regression module. + """ + nodes = { + "clickhouse": ("clickhouse1", "clickhouse2", "clickhouse3"), + } + + with Cluster(local, clickhouse_binary_path, nodes=nodes) as cluster: + self.context.cluster = cluster + + Scenario(run=load("ldap.authentication.tests.sanity", "scenario")) + Scenario(run=load("ldap.external_user_directory.tests.simple", "scenario")) + Feature(run=load("ldap.external_user_directory.tests.restart", "feature")) + Feature(run=load("ldap.external_user_directory.tests.server_config", "feature")) + Feature(run=load("ldap.external_user_directory.tests.external_user_directory_config", "feature")) + Feature(run=load("ldap.external_user_directory.tests.connections", "feature")) + Feature(run=load("ldap.external_user_directory.tests.authentications", "feature")) + Feature(run=load("ldap.external_user_directory.tests.roles", "feature")) + +if main(): + regression() diff --git a/tests/testflows/ldap/external_user_directory/requirements/__init__.py b/tests/testflows/ldap/external_user_directory/requirements/__init__.py new file mode 100644 index 00000000000..02f7d430154 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/requirements/__init__.py @@ -0,0 +1 @@ +from .requirements import * diff --git a/tests/testflows/ldap/external_user_directory/requirements/requirements.md b/tests/testflows/ldap/external_user_directory/requirements/requirements.md new file mode 100644 index 00000000000..46532c3945d --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/requirements/requirements.md @@ -0,0 +1,734 @@ +# SRS-009 ClickHouse LDAP External User Directory +# Software Requirements Specification + +## Table of Contents + +* 1 [Revision History](#revision-history) +* 2 [Introduction](#introduction) +* 3 [Terminology](#terminology) + * 3.1 [LDAP](#ldap) +* 4 [Requirements](#requirements) + * 4.1 [Generic](#generic) + * 4.1.1 [User Authentication](#user-authentication) + * 4.1.1.1 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication](#rqsrs-009ldapexternaluserdirectoryauthentication) + * 4.1.1.2 [RQ.SRS-009.LDAP.ExternalUserDirectory.MultipleUserDirectories](#rqsrs-009ldapexternaluserdirectorymultipleuserdirectories) + * 4.1.1.3 [RQ.SRS-009.LDAP.ExternalUserDirectory.MultipleUserDirectories.Lookup](#rqsrs-009ldapexternaluserdirectorymultipleuserdirectorieslookup) + * 4.1.1.4 [RQ.SRS-009.LDAP.ExternalUserDirectory.Users.Authentication.NewUsers](#rqsrs-009ldapexternaluserdirectoryusersauthenticationnewusers) + * 4.1.1.5 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.DeletedUsers](#rqsrs-009ldapexternaluserdirectoryauthenticationdeletedusers) + * 4.1.1.6 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Valid](#rqsrs-009ldapexternaluserdirectoryauthenticationvalid) + * 4.1.1.7 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Invalid](#rqsrs-009ldapexternaluserdirectoryauthenticationinvalid) + * 4.1.1.8 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.UsernameChanged](#rqsrs-009ldapexternaluserdirectoryauthenticationusernamechanged) + * 4.1.1.9 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.PasswordChanged](#rqsrs-009ldapexternaluserdirectoryauthenticationpasswordchanged) + * 4.1.1.10 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.LDAPServerRestart](#rqsrs-009ldapexternaluserdirectoryauthenticationldapserverrestart) + * 4.1.1.11 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.ClickHouseServerRestart](#rqsrs-009ldapexternaluserdirectoryauthenticationclickhouseserverrestart) + * 4.1.1.12 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel](#rqsrs-009ldapexternaluserdirectoryauthenticationparallel) + * 4.1.1.13 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel.ValidAndInvalid](#rqsrs-009ldapexternaluserdirectoryauthenticationparallelvalidandinvalid) + * 4.1.1.14 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel.MultipleServers](#rqsrs-009ldapexternaluserdirectoryauthenticationparallelmultipleservers) + * 4.1.1.15 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel.LocalOnly](#rqsrs-009ldapexternaluserdirectoryauthenticationparallellocalonly) + * 4.1.1.16 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel.LocalAndMultipleLDAP](#rqsrs-009ldapexternaluserdirectoryauthenticationparallellocalandmultipleldap) + * 4.1.1.17 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel.SameUser](#rqsrs-009ldapexternaluserdirectoryauthenticationparallelsameuser) + * 4.1.1.18 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel.DynamicallyAddedAndRemovedUsers](#rqsrs-009ldapexternaluserdirectoryauthenticationparalleldynamicallyaddedandremovedusers) + * 4.1.2 [Connection](#connection) + * 4.1.2.1 [RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Protocol.PlainText](#rqsrs-009ldapexternaluserdirectoryconnectionprotocolplaintext) + * 4.1.2.2 [RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Protocol.TLS](#rqsrs-009ldapexternaluserdirectoryconnectionprotocoltls) + * 4.1.2.3 [RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Protocol.StartTLS](#rqsrs-009ldapexternaluserdirectoryconnectionprotocolstarttls) + * 4.1.2.4 [RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Protocol.TLS.Certificate.Validation](#rqsrs-009ldapexternaluserdirectoryconnectionprotocoltlscertificatevalidation) + * 4.1.2.5 [RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Protocol.TLS.Certificate.SelfSigned](#rqsrs-009ldapexternaluserdirectoryconnectionprotocoltlscertificateselfsigned) + * 4.1.2.6 [RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Protocol.TLS.Certificate.SpecificCertificationAuthority](#rqsrs-009ldapexternaluserdirectoryconnectionprotocoltlscertificatespecificcertificationauthority) + * 4.1.2.7 [RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Authentication.Mechanism.Anonymous](#rqsrs-009ldapexternaluserdirectoryconnectionauthenticationmechanismanonymous) + * 4.1.2.8 [RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Authentication.Mechanism.Unauthenticated](#rqsrs-009ldapexternaluserdirectoryconnectionauthenticationmechanismunauthenticated) + * 4.1.2.9 [RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Authentication.Mechanism.NamePassword](#rqsrs-009ldapexternaluserdirectoryconnectionauthenticationmechanismnamepassword) + * 4.1.2.10 [RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Authentication.UnreachableServer](#rqsrs-009ldapexternaluserdirectoryconnectionauthenticationunreachableserver) + * 4.2 [Specific](#specific) + * 4.2.1 [User Discovery](#user-discovery) + * 4.2.1.1 [RQ.SRS-009.LDAP.ExternalUserDirectory.Users.Lookup.Priority](#rqsrs-009ldapexternaluserdirectoryuserslookuppriority) + * 4.2.1.2 [RQ.SRS-009.LDAP.ExternalUserDirectory.Restart.Server](#rqsrs-009ldapexternaluserdirectoryrestartserver) + * 4.2.1.3 [RQ.SRS-009.LDAP.ExternalUserDirectory.Restart.Server.ParallelLogins](#rqsrs-009ldapexternaluserdirectoryrestartserverparallellogins) + * 4.2.2 [Roles](#roles) + * 4.2.2.1 [RQ.SRS-009.LDAP.ExternalUserDirectory.Role.Removed](#rqsrs-009ldapexternaluserdirectoryroleremoved) + * 4.2.2.2 [RQ.SRS-009.LDAP.ExternalUserDirectory.Role.Removed.Privileges](#rqsrs-009ldapexternaluserdirectoryroleremovedprivileges) + * 4.2.2.3 [RQ.SRS-009.LDAP.ExternalUserDirectory.Role.Readded.Privileges](#rqsrs-009ldapexternaluserdirectoryrolereaddedprivileges) + * 4.2.2.4 [RQ.SRS-009.LDAP.ExternalUserDirectory.Role.New](#rqsrs-009ldapexternaluserdirectoryrolenew) + * 4.2.2.5 [RQ.SRS-009.LDAP.ExternalUserDirectory.Role.NewPrivilege](#rqsrs-009ldapexternaluserdirectoryrolenewprivilege) + * 4.2.2.6 [RQ.SRS-009.LDAP.ExternalUserDirectory.Role.RemovedPrivilege](#rqsrs-009ldapexternaluserdirectoryroleremovedprivilege) + * 4.2.3 [Configuration](#configuration) + * 4.2.3.1 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Invalid](#rqsrs-009ldapexternaluserdirectoryconfigurationserverinvalid) + * 4.2.3.2 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Definition](#rqsrs-009ldapexternaluserdirectoryconfigurationserverdefinition) + * 4.2.3.3 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Name](#rqsrs-009ldapexternaluserdirectoryconfigurationservername) + * 4.2.3.4 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Host](#rqsrs-009ldapexternaluserdirectoryconfigurationserverhost) + * 4.2.3.5 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Port](#rqsrs-009ldapexternaluserdirectoryconfigurationserverport) + * 4.2.3.6 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Port.Default](#rqsrs-009ldapexternaluserdirectoryconfigurationserverportdefault) + * 4.2.3.7 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.AuthDN.Prefix](#rqsrs-009ldapexternaluserdirectoryconfigurationserverauthdnprefix) + * 4.2.3.8 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.AuthDN.Suffix](#rqsrs-009ldapexternaluserdirectoryconfigurationserverauthdnsuffix) + * 4.2.3.9 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.AuthDN.Value](#rqsrs-009ldapexternaluserdirectoryconfigurationserverauthdnvalue) + * 4.2.3.10 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.EnableTLS](#rqsrs-009ldapexternaluserdirectoryconfigurationserverenabletls) + * 4.2.3.11 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.EnableTLS.Options.Default](#rqsrs-009ldapexternaluserdirectoryconfigurationserverenabletlsoptionsdefault) + * 4.2.3.12 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.EnableTLS.Options.No](#rqsrs-009ldapexternaluserdirectoryconfigurationserverenabletlsoptionsno) + * 4.2.3.13 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.EnableTLS.Options.Yes](#rqsrs-009ldapexternaluserdirectoryconfigurationserverenabletlsoptionsyes) + * 4.2.3.14 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.EnableTLS.Options.StartTLS](#rqsrs-009ldapexternaluserdirectoryconfigurationserverenabletlsoptionsstarttls) + * 4.2.3.15 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSMinimumProtocolVersion](#rqsrs-009ldapexternaluserdirectoryconfigurationservertlsminimumprotocolversion) + * 4.2.3.16 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSMinimumProtocolVersion.Values](#rqsrs-009ldapexternaluserdirectoryconfigurationservertlsminimumprotocolversionvalues) + * 4.2.3.17 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSMinimumProtocolVersion.Default](#rqsrs-009ldapexternaluserdirectoryconfigurationservertlsminimumprotocolversiondefault) + * 4.2.3.18 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSRequireCert](#rqsrs-009ldapexternaluserdirectoryconfigurationservertlsrequirecert) + * 4.2.3.19 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSRequireCert.Options.Default](#rqsrs-009ldapexternaluserdirectoryconfigurationservertlsrequirecertoptionsdefault) + * 4.2.3.20 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSRequireCert.Options.Demand](#rqsrs-009ldapexternaluserdirectoryconfigurationservertlsrequirecertoptionsdemand) + * 4.2.3.21 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSRequireCert.Options.Allow](#rqsrs-009ldapexternaluserdirectoryconfigurationservertlsrequirecertoptionsallow) + * 4.2.3.22 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSRequireCert.Options.Try](#rqsrs-009ldapexternaluserdirectoryconfigurationservertlsrequirecertoptionstry) + * 4.2.3.23 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSRequireCert.Options.Never](#rqsrs-009ldapexternaluserdirectoryconfigurationservertlsrequirecertoptionsnever) + * 4.2.3.24 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSCertFile](#rqsrs-009ldapexternaluserdirectoryconfigurationservertlscertfile) + * 4.2.3.25 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSKeyFile](#rqsrs-009ldapexternaluserdirectoryconfigurationservertlskeyfile) + * 4.2.3.26 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSCACertDir](#rqsrs-009ldapexternaluserdirectoryconfigurationservertlscacertdir) + * 4.2.3.27 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSCACertFile](#rqsrs-009ldapexternaluserdirectoryconfigurationservertlscacertfile) + * 4.2.3.28 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSCipherSuite](#rqsrs-009ldapexternaluserdirectoryconfigurationservertlsciphersuite) + * 4.2.3.29 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Syntax](#rqsrs-009ldapexternaluserdirectoryconfigurationserversyntax) + * 4.2.3.30 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.LDAPUserDirectory](#rqsrs-009ldapexternaluserdirectoryconfigurationusersldapuserdirectory) + * 4.2.3.31 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.LDAPUserDirectory.MoreThanOne](#rqsrs-009ldapexternaluserdirectoryconfigurationusersldapuserdirectorymorethanone) + * 4.2.3.32 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Syntax](#rqsrs-009ldapexternaluserdirectoryconfigurationuserssyntax) + * 4.2.3.33 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Server](#rqsrs-009ldapexternaluserdirectoryconfigurationusersparametersserver) + * 4.2.3.34 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Server.Empty](#rqsrs-009ldapexternaluserdirectoryconfigurationusersparametersserverempty) + * 4.2.3.35 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Server.Missing](#rqsrs-009ldapexternaluserdirectoryconfigurationusersparametersservermissing) + * 4.2.3.36 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Server.MoreThanOne](#rqsrs-009ldapexternaluserdirectoryconfigurationusersparametersservermorethanone) + * 4.2.3.37 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Server.Invalid](#rqsrs-009ldapexternaluserdirectoryconfigurationusersparametersserverinvalid) + * 4.2.3.38 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Roles](#rqsrs-009ldapexternaluserdirectoryconfigurationusersparametersroles) + * 4.2.3.39 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Roles.MoreThanOne](#rqsrs-009ldapexternaluserdirectoryconfigurationusersparametersrolesmorethanone) + * 4.2.3.40 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Roles.Invalid](#rqsrs-009ldapexternaluserdirectoryconfigurationusersparametersrolesinvalid) + * 4.2.3.41 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Roles.Empty](#rqsrs-009ldapexternaluserdirectoryconfigurationusersparametersrolesempty) + * 4.2.3.42 [RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Roles.Missing](#rqsrs-009ldapexternaluserdirectoryconfigurationusersparametersrolesmissing) + * 4.2.4 [Authentication](#authentication) + * 4.2.4.1 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Username.Empty](#rqsrs-009ldapexternaluserdirectoryauthenticationusernameempty) + * 4.2.4.2 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Username.Long](#rqsrs-009ldapexternaluserdirectoryauthenticationusernamelong) + * 4.2.4.3 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Username.UTF8](#rqsrs-009ldapexternaluserdirectoryauthenticationusernameutf8) + * 4.2.4.4 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Password.Empty](#rqsrs-009ldapexternaluserdirectoryauthenticationpasswordempty) + * 4.2.4.5 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Password.Long](#rqsrs-009ldapexternaluserdirectoryauthenticationpasswordlong) + * 4.2.4.6 [RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Password.UTF8](#rqsrs-009ldapexternaluserdirectoryauthenticationpasswordutf8) +* 5 [References](#references) + +## Revision History + +This document is stored in an electronic form using [Git] source control management software +hosted in a [GitHub Repository]. +All the updates are tracked using the [Revision History]. + +## Introduction + +The [QA-SRS007 ClickHouse Authentication of Users via LDAP] enables support for authenticating +users using an [LDAP] server. This requirements specifications add addition functionality +for integrating [LDAP] with [ClickHouse]. + +This document will cover requirements to allow authenticatoin of users stored in the +external user discovery using an [LDAP] server without having to explicitly define users in [ClickHouse]'s +`users.xml` configuration file. + +## Terminology + +### LDAP + +* Lightweight Directory Access Protocol + +## Requirements + +### Generic + +#### User Authentication + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication +version: 1.0 + +[ClickHouse] SHALL support authenticating users that are defined only on the [LDAP] server. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.MultipleUserDirectories +version: 1.0 + +[ClickHouse] SHALL support authenticating users using multiple [LDAP] external user directories. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.MultipleUserDirectories.Lookup +version: 1.0 + +[ClickHouse] SHALL attempt to authenticate external [LDAP] user +using [LDAP] external user directory in the same order +in which user directories are specified in the `config.xml` file. +If a user cannot be authenticated using the first [LDAP] external user directory +then the next user directory in the list SHALL be used. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Users.Authentication.NewUsers +version: 1.0 + +[ClickHouse] SHALL support authenticating users that are defined only on the [LDAP] server +as soon as they are added to the [LDAP] server. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.DeletedUsers +version: 1.0 + +[ClickHouse] SHALL not allow authentication of users that +were previously defined only on the [LDAP] server but were removed +from the [LDAP] server. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Valid +version: 1.0 + +[ClickHouse] SHALL only allow user authentication using [LDAP] server if and only if +user name and password match [LDAP] server records for the user +when using [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Invalid +version: 1.0 + +[ClickHouse] SHALL return an error and prohibit authentication if either user name or password +do not match [LDAP] server records for the user +when using [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.UsernameChanged +version: 1.0 + +[ClickHouse] SHALL return an error and prohibit authentication if the username is changed +on the [LDAP] server when using [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.PasswordChanged +version: 1.0 + +[ClickHouse] SHALL return an error and prohibit authentication if the password +for the user is changed on the [LDAP] server when using [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.LDAPServerRestart +version: 1.0 + +[ClickHouse] SHALL support authenticating users after [LDAP] server is restarted +when using [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.ClickHouseServerRestart +version: 1.0 + +[ClickHouse] SHALL support authenticating users after server is restarted +when using [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel +version: 1.0 + +[ClickHouse] SHALL support parallel authentication of users using [LDAP] server +when using [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel.ValidAndInvalid +version: 1.0 + +[ClickHouse] SHALL support authentication of valid users and +prohibit authentication of invalid users using [LDAP] server +in parallel without having invalid attempts affecting valid authentications +when using [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel.MultipleServers +version: 1.0 + +[ClickHouse] SHALL support parallel authentication of external [LDAP] users +authenticated using multiple [LDAP] external user directories. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel.LocalOnly +version: 1.0 + +[ClickHouse] SHALL support parallel authentication of users defined only locally +when one or more [LDAP] external user directories are specified in the configuration file. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel.LocalAndMultipleLDAP +version: 1.0 + +[ClickHouse] SHALL support parallel authentication of local and external [LDAP] users +authenticated using multiple [LDAP] external user directories. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel.SameUser +version: 1.0 + +[ClickHouse] SHALL support parallel authentication of the same external [LDAP] user +authenticated using the same [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel.DynamicallyAddedAndRemovedUsers +version: 1.0 + +[ClickHouse] SHALL support parallel authentication of users using +[LDAP] external user directory when [LDAP] users are dynamically added and +removed. + +#### Connection + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Protocol.PlainText +version: 1.0 + +[ClickHouse] SHALL support user authentication using plain text `ldap://` non secure protocol +while connecting to the [LDAP] server when using [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Protocol.TLS +version: 1.0 + +[ClickHouse] SHALL support user authentication using `SSL/TLS` `ldaps://` secure protocol +while connecting to the [LDAP] server when using [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Protocol.StartTLS +version: 1.0 + +[ClickHouse] SHALL support user authentication using legacy `StartTLS` protocol which is a +plain text `ldap://` protocol that is upgraded to [TLS] when connecting to the [LDAP] server +when using [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Protocol.TLS.Certificate.Validation +version: 1.0 + +[ClickHouse] SHALL support certificate validation used for [TLS] connections +to the [LDAP] server when using [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Protocol.TLS.Certificate.SelfSigned +version: 1.0 + +[ClickHouse] SHALL support self-signed certificates for [TLS] connections +to the [LDAP] server when using [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Protocol.TLS.Certificate.SpecificCertificationAuthority +version: 1.0 + +[ClickHouse] SHALL support certificates signed by specific Certification Authority for [TLS] connections +to the [LDAP] server when using [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Authentication.Mechanism.Anonymous +version: 1.0 + +[ClickHouse] SHALL return an error and prohibit authentication using [Anonymous Authentication Mechanism of Simple Bind] +authentication mechanism when connecting to the [LDAP] server when using [LDAP] external server directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Authentication.Mechanism.Unauthenticated +version: 1.0 + +[ClickHouse] SHALL return an error and prohibit authentication using [Unauthenticated Authentication Mechanism of Simple Bind] +authentication mechanism when connecting to the [LDAP] server when using [LDAP] external server directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Authentication.Mechanism.NamePassword +version: 1.0 + +[ClickHouse] SHALL allow authentication using only [Name/Password Authentication Mechanism of Simple Bind] +authentication mechanism when connecting to the [LDAP] server when using [LDAP] external server directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Authentication.UnreachableServer +version: 1.0 + +[ClickHouse] SHALL return an error and prohibit user login if [LDAP] server is unreachable +when using [LDAP] external user directory. + +### Specific + +#### User Discovery + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Users.Lookup.Priority +version: 2.0 + +[ClickHouse] SHALL lookup user presence in the same order +as user directories are defined in the `config.xml`. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Restart.Server +version: 1.0 + +[ClickHouse] SHALL support restarting server when one or more LDAP external directories +are configured. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Restart.Server.ParallelLogins +version: 1.0 + +[ClickHouse] SHALL support restarting server when one or more LDAP external directories +are configured during parallel [LDAP] user logins. + +#### Roles + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Role.Removed +version: 1.0 + +[ClickHouse] SHALL reject authentication attempt if any of the roles that are specified in the configuration +of the external user directory are not defined at the time of the authentication attempt +with an exception that if a user was able to authenticate in past and its internal user object was created and cached +then the user SHALL be able to authenticate again, even if one of the roles is missing. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Role.Removed.Privileges +version: 1.0 + +[ClickHouse] SHALL remove the privileges provided by the role from all the LDAP +users authenticated using external user directory if it is removed +including currently cached users that are still able to authenticated where the removed +role is specified in the configuration of the external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Role.Readded.Privileges +version: 1.0 + +[ClickHouse] SHALL reassign the role and add the privileges provided by the role +when it is re-added after removal for all LDAP users authenticated using external user directory +including any cached users where the re-added role was specified in the configuration of the external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Role.New +version: 1.0 + +[ClickHouse] SHALL not allow any new roles to be assigned to any LDAP +users authenticated using external user directory unless the role is specified +in the configuration of the external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Role.NewPrivilege +version: 1.0 + +[ClickHouse] SHALL add new privilege to all the LDAP users authenticated using external user directory +including cached users when new privilege is added to one of the roles specified +in the configuration of the external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Role.RemovedPrivilege +version: 1.0 + +[ClickHouse] SHALL remove privilege from all the LDAP users authenticated using external user directory +including cached users when privilege is removed from all the roles specified +in the configuration of the external user directory. + +#### Configuration + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Invalid +version: 1.0 + +[ClickHouse] SHALL return an error and prohibit user login if [LDAP] server configuration is not valid. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Definition +version: 1.0 + +[ClickHouse] SHALL support using the [LDAP] servers defined in the +`ldap_servers` section of the `config.xml` as the server to be used +for a external user directory that uses an [LDAP] server as a source of user definitions. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Name +version: 1.0 + +[ClickHouse] SHALL not support empty string as a server name. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Host +version: 1.0 + +[ClickHouse] SHALL support `` parameter to specify [LDAP] +server hostname or IP, this parameter SHALL be mandatory and SHALL not be empty. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Port +version: 1.0 + +[ClickHouse] SHALL support `` parameter to specify [LDAP] server port. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Port.Default +version: 1.0 + +[ClickHouse] SHALL use default port number `636` if `enable_tls` is set to `yes` or `389` otherwise. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.AuthDN.Prefix +version: 1.0 + +[ClickHouse] SHALL support `` parameter to specify the prefix +of value used to construct the DN to bound to during authentication via [LDAP] server. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.AuthDN.Suffix +version: 1.0 + +[ClickHouse] SHALL support `` parameter to specify the suffix +of value used to construct the DN to bound to during authentication via [LDAP] server. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.AuthDN.Value +version: 1.0 + +[ClickHouse] SHALL construct DN as `auth_dn_prefix + escape(user_name) + auth_dn_suffix` string. + +> This implies that auth_dn_suffix should usually have comma ',' as its first non-space character. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.EnableTLS +version: 1.0 + +[ClickHouse] SHALL support `` parameter to trigger the use of secure connection to the [LDAP] server. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.EnableTLS.Options.Default +version: 1.0 + +[ClickHouse] SHALL use `yes` value as the default for `` parameter +to enable SSL/TLS `ldaps://` protocol. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.EnableTLS.Options.No +version: 1.0 + +[ClickHouse] SHALL support specifying `no` as the value of `` parameter to enable +plain text `ldap://` protocol. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.EnableTLS.Options.Yes +version: 1.0 + +[ClickHouse] SHALL support specifying `yes` as the value of `` parameter to enable +SSL/TLS `ldaps://` protocol. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.EnableTLS.Options.StartTLS +version: 1.0 + +[ClickHouse] SHALL support specifying `starttls` as the value of `` parameter to enable +legacy `StartTLS` protocol that used plain text `ldap://` protocol, upgraded to [TLS]. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSMinimumProtocolVersion +version: 1.0 + +[ClickHouse] SHALL support `` parameter to specify +the minimum protocol version of SSL/TLS. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSMinimumProtocolVersion.Values +version: 1.0 + +[ClickHouse] SHALL support specifying `ssl2`, `ssl3`, `tls1.0`, `tls1.1`, and `tls1.2` +as a value of the `` parameter. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSMinimumProtocolVersion.Default +version: 1.0 + +[ClickHouse] SHALL set `tls1.2` as the default value of the `` parameter. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSRequireCert +version: 1.0 + +[ClickHouse] SHALL support `` parameter to specify [TLS] peer +certificate verification behavior. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSRequireCert.Options.Default +version: 1.0 + +[ClickHouse] SHALL use `demand` value as the default for the `` parameter. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSRequireCert.Options.Demand +version: 1.0 + +[ClickHouse] SHALL support specifying `demand` as the value of `` parameter to +enable requesting of client certificate. If no certificate is provided, or a bad certificate is +provided, the session SHALL be immediately terminated. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSRequireCert.Options.Allow +version: 1.0 + +[ClickHouse] SHALL support specifying `allow` as the value of `` parameter to +enable requesting of client certificate. If no +certificate is provided, the session SHALL proceed normally. +If a bad certificate is provided, it SHALL be ignored and the session SHALL proceed normally. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSRequireCert.Options.Try +version: 1.0 + +[ClickHouse] SHALL support specifying `try` as the value of `` parameter to +enable requesting of client certificate. If no certificate is provided, the session +SHALL proceed normally. If a bad certificate is provided, the session SHALL be +immediately terminated. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSRequireCert.Options.Never +version: 1.0 + +[ClickHouse] SHALL support specifying `never` as the value of `` parameter to +disable requesting of client certificate. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSCertFile +version: 1.0 + +[ClickHouse] SHALL support `` to specify the path to certificate file used by +[ClickHouse] to establish connection with the [LDAP] server. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSKeyFile +version: 1.0 + +[ClickHouse] SHALL support `` to specify the path to key file for the certificate +specified by the `` parameter. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSCACertDir +version: 1.0 + +[ClickHouse] SHALL support `` parameter to specify to a path to +the directory containing [CA] certificates used to verify certificates provided by the [LDAP] server. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSCACertFile +version: 1.0 + +[ClickHouse] SHALL support `` parameter to specify a path to a specific +[CA] certificate file used to verify certificates provided by the [LDAP] server. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSCipherSuite +version: 1.0 + +[ClickHouse] SHALL support `tls_cipher_suite` parameter to specify allowed cipher suites. +The value SHALL use the same format as the `ciphersuites` in the [OpenSSL Ciphers]. + +For example, + +```xml +ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:AES256-GCM-SHA384 +``` + +The available suites SHALL depend on the [OpenSSL] library version and variant used to build +[ClickHouse] and therefore might change. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Syntax +version: 1.0 + +[ClickHouse] SHALL support the following example syntax to create an entry for an [LDAP] server inside the `config.xml` +configuration file or of any configuration file inside the `config.d` directory. + +```xml + + + localhost + 636 + cn= + , ou=users, dc=example, dc=com + yes + tls1.2 + demand + /path/to/tls_cert_file + /path/to/tls_key_file + /path/to/tls_ca_cert_file + /path/to/tls_ca_cert_dir + ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:AES256-GCM-SHA384 + + +``` + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.LDAPUserDirectory +version: 1.0 + +[ClickHouse] SHALL support `` sub-section in the `` section of the `config.xml` +that SHALL define a external user directory that uses an [LDAP] server as a source of user definitions. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.LDAPUserDirectory.MoreThanOne +version: 2.0 + +[ClickHouse] SHALL support more than one `` sub-sections in the `` section of the `config.xml` +that SHALL allow to define more than one external user directory that use an [LDAP] server as a source +of user definitions. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Syntax +version: 1.0 + +[ClickHouse] SHALL support `` section with the following syntax + +```xml + + + + my_ldap_server + + + + + + + +``` + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Server +version: 1.0 + +[ClickHouse] SHALL support `server` parameter in the `` sub-section in the `` +section of the `config.xml` that SHALL specify one of LDAP server names +defined in `` section. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Server.Empty +version: 1.0 + +[ClickHouse] SHALL return an error if the `server` parameter in the `` sub-section in the `` +is empty. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Server.Missing +version: 1.0 + +[ClickHouse] SHALL return an error if the `server` parameter in the `` sub-section in the `` +is missing. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Server.MoreThanOne +version: 1.0 + +[ClickHouse] SHALL only use the first definitition of the `server` parameter in the `` sub-section in the `` +if more than one `server` parameter is defined in the configuration. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Server.Invalid +version: 1.0 + +[ClickHouse] SHALL return an error if the server specified as the value of the `` +parameter is not defined. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Roles +version: 1.0 + +[ClickHouse] SHALL support `roles` parameter in the `` sub-section in the `` +section of the `config.xml` that SHALL specify the names of a locally defined roles that SHALL +be assigned to all users retrieved from the [LDAP] server. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Roles.MoreThanOne +version: 1.0 + +[ClickHouse] SHALL only use the first definitition of the `roles` parameter +in the `` sub-section in the `` +if more than one `roles` parameter is defined in the configuration. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Roles.Invalid +version: 1.0 + +[ClickHouse] SHALL return an error if the role specified in the `` +parameter does not exist locally. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Roles.Empty +version: 1.0 + +[ClickHouse] SHALL not allow users authenticated using LDAP external user directory +to perform any action if the `roles` parameter in the `` sub-section in the `` +section is empty. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Roles.Missing +version: 1.0 + +[ClickHouse] SHALL not allow users authenticated using LDAP external user directory +to perform any action if the `roles` parameter in the `` sub-section in the `` +section is missing. + +#### Authentication + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Username.Empty +version: 1.0 + +[ClickHouse] SHALL not support authenticating users with empty username +when using [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Username.Long +version: 1.0 + +[ClickHouse] SHALL support authenticating users with a long username of at least 256 bytes +when using [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Username.UTF8 +version: 1.0 + +[ClickHouse] SHALL support authentication users with a username that contains [UTF-8] characters +when using [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Password.Empty +version: 1.0 + +[ClickHouse] SHALL not support authenticating users with empty passwords +even if an empty password is valid for the user and +is allowed by the [LDAP] server when using [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Password.Long +version: 1.0 + +[ClickHouse] SHALL support long password of at least 256 bytes +that can be used to authenticate users when using [LDAP] external user directory. + +##### RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Password.UTF8 +version: 1.0 + +[ClickHouse] SHALL support [UTF-8] characters in passwords +used to authenticate users when using [LDAP] external user directory. + +## References + +* **Access Control and Account Management**: https://clickhouse.tech/docs/en/operations/access-rights/ +* **LDAP**: https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol +* **ClickHouse:** https://clickhouse.tech + +[SRS]: #srs +[Access Control and Account Management]: https://clickhouse.tech/docs/en/operations/access-rights/ +[SRS-007 ClickHouse Authentication of Users via LDAP]: https://github.com/ClickHouse/ClickHouse/blob/master/tests/testflows/ldap/authentication/requirements/requirements.md +[LDAP]: https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol +[ClickHouse]: https://clickhouse.tech +[GitHub Repository]: https://github.com/ClickHouse/ClickHouse/blob/master/tests/testflows/ldap/external_user_directory/requirements/requirements.md +[Revision History]: https://github.com/ClickHouse/ClickHouse/commits/master/tests/testflows/ldap/external_user_directory/requirements/requirements.md +[Git]: https://git-scm.com/ +[GitHub]: https://github.com diff --git a/tests/testflows/ldap/external_user_directory/requirements/requirements.py b/tests/testflows/ldap/external_user_directory/requirements/requirements.py new file mode 100644 index 00000000000..4c4b17d01dc --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/requirements/requirements.py @@ -0,0 +1,1260 @@ +# These requirements were auto generated +# from software requirements specification (SRS) +# document by TestFlows v1.6.201009.1190249. +# Do not edit by hand but re-generate instead +# using 'tfs requirements generate' command. +from testflows.core import Requirement + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support authenticating users that are defined only on the [LDAP] server.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_MultipleUserDirectories = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.MultipleUserDirectories', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support authenticating users using multiple [LDAP] external user directories.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_MultipleUserDirectories_Lookup = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.MultipleUserDirectories.Lookup', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL attempt to authenticate external [LDAP] user\n' + 'using [LDAP] external user directory in the same order\n' + 'in which user directories are specified in the `config.xml` file.\n' + 'If a user cannot be authenticated using the first [LDAP] external user directory\n' + 'then the next user directory in the list SHALL be used.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Users_Authentication_NewUsers = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Users.Authentication.NewUsers', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support authenticating users that are defined only on the [LDAP] server\n' + 'as soon as they are added to the [LDAP] server.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_DeletedUsers = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.DeletedUsers', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL not allow authentication of users that\n' + 'were previously defined only on the [LDAP] server but were removed\n' + 'from the [LDAP] server.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Valid = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Valid', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL only allow user authentication using [LDAP] server if and only if\n' + 'user name and password match [LDAP] server records for the user\n' + 'when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Invalid = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Invalid', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error and prohibit authentication if either user name or password\n' + 'do not match [LDAP] server records for the user\n' + 'when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_UsernameChanged = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.UsernameChanged', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error and prohibit authentication if the username is changed\n' + 'on the [LDAP] server when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_PasswordChanged = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.PasswordChanged', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error and prohibit authentication if the password\n' + 'for the user is changed on the [LDAP] server when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_LDAPServerRestart = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.LDAPServerRestart', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support authenticating users after [LDAP] server is restarted\n' + 'when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_ClickHouseServerRestart = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.ClickHouseServerRestart', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support authenticating users after server is restarted\n' + 'when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Parallel = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support parallel authentication of users using [LDAP] server\n' + 'when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Parallel_ValidAndInvalid = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel.ValidAndInvalid', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support authentication of valid users and\n' + 'prohibit authentication of invalid users using [LDAP] server\n' + 'in parallel without having invalid attempts affecting valid authentications\n' + 'when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Parallel_MultipleServers = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel.MultipleServers', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support parallel authentication of external [LDAP] users\n' + 'authenticated using multiple [LDAP] external user directories.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Parallel_LocalOnly = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel.LocalOnly', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support parallel authentication of users defined only locally\n' + 'when one or more [LDAP] external user directories are specified in the configuration file.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Parallel_LocalAndMultipleLDAP = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel.LocalAndMultipleLDAP', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support parallel authentication of local and external [LDAP] users\n' + 'authenticated using multiple [LDAP] external user directories.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Parallel_SameUser = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel.SameUser', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support parallel authentication of the same external [LDAP] user\n' + 'authenticated using the same [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Parallel_DynamicallyAddedAndRemovedUsers = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Parallel.DynamicallyAddedAndRemovedUsers', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support parallel authentication of users using\n' + '[LDAP] external user directory when [LDAP] users are dynamically added and\n' + 'removed.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Connection_Protocol_PlainText = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Protocol.PlainText', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support user authentication using plain text `ldap://` non secure protocol\n' + 'while connecting to the [LDAP] server when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Connection_Protocol_TLS = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Protocol.TLS', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support user authentication using `SSL/TLS` `ldaps://` secure protocol\n' + 'while connecting to the [LDAP] server when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Connection_Protocol_StartTLS = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Protocol.StartTLS', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support user authentication using legacy `StartTLS` protocol which is a\n' + 'plain text `ldap://` protocol that is upgraded to [TLS] when connecting to the [LDAP] server\n' + 'when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Connection_Protocol_TLS_Certificate_Validation = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Protocol.TLS.Certificate.Validation', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support certificate validation used for [TLS] connections\n' + 'to the [LDAP] server when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Connection_Protocol_TLS_Certificate_SelfSigned = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Protocol.TLS.Certificate.SelfSigned', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support self-signed certificates for [TLS] connections\n' + 'to the [LDAP] server when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Connection_Protocol_TLS_Certificate_SpecificCertificationAuthority = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Protocol.TLS.Certificate.SpecificCertificationAuthority', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support certificates signed by specific Certification Authority for [TLS] connections\n' + 'to the [LDAP] server when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Connection_Authentication_Mechanism_Anonymous = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Authentication.Mechanism.Anonymous', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error and prohibit authentication using [Anonymous Authentication Mechanism of Simple Bind]\n' + 'authentication mechanism when connecting to the [LDAP] server when using [LDAP] external server directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Connection_Authentication_Mechanism_Unauthenticated = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Authentication.Mechanism.Unauthenticated', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error and prohibit authentication using [Unauthenticated Authentication Mechanism of Simple Bind]\n' + 'authentication mechanism when connecting to the [LDAP] server when using [LDAP] external server directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Connection_Authentication_Mechanism_NamePassword = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Authentication.Mechanism.NamePassword', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL allow authentication using only [Name/Password Authentication Mechanism of Simple Bind]\n' + 'authentication mechanism when connecting to the [LDAP] server when using [LDAP] external server directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Connection_Authentication_UnreachableServer = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Connection.Authentication.UnreachableServer', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error and prohibit user login if [LDAP] server is unreachable\n' + 'when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Users_Lookup_Priority = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Users.Lookup.Priority', + version='2.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL lookup user presence in the same order\n' + 'as user directories are defined in the `config.xml`.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Restart_Server = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Restart.Server', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support restarting server when one or more LDAP external directories\n' + 'are configured.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Restart_Server_ParallelLogins = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Restart.Server.ParallelLogins', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support restarting server when one or more LDAP external directories\n' + 'are configured during parallel [LDAP] user logins.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Role_Removed = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Role.Removed', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL reject authentication attempt if any of the roles that are specified in the configuration\n' + 'of the external user directory are not defined at the time of the authentication attempt\n' + 'with an exception that if a user was able to authenticate in past and its internal user object was created and cached\n' + 'then the user SHALL be able to authenticate again, even if one of the roles is missing.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Role_Removed_Privileges = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Role.Removed.Privileges', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL remove the privileges provided by the role from all the LDAP\n' + 'users authenticated using external user directory if it is removed\n' + 'including currently cached users that are still able to authenticated where the removed\n' + 'role is specified in the configuration of the external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Role_Readded_Privileges = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Role.Readded.Privileges', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL reassign the role and add the privileges provided by the role\n' + 'when it is re-added after removal for all LDAP users authenticated using external user directory\n' + 'including any cached users where the re-added role was specified in the configuration of the external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Role_New = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Role.New', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL not allow any new roles to be assigned to any LDAP\n' + 'users authenticated using external user directory unless the role is specified\n' + 'in the configuration of the external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Role_NewPrivilege = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Role.NewPrivilege', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL add new privilege to all the LDAP users authenticated using external user directory\n' + 'including cached users when new privilege is added to one of the roles specified\n' + 'in the configuration of the external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Role_RemovedPrivilege = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Role.RemovedPrivilege', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL remove privilege from all the LDAP users authenticated using external user directory\n' + 'including cached users when privilege is removed from all the roles specified\n' + 'in the configuration of the external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Invalid = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Invalid', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error and prohibit user login if [LDAP] server configuration is not valid.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Definition = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Definition', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support using the [LDAP] servers defined in the\n' + '`ldap_servers` section of the `config.xml` as the server to be used\n' + 'for a external user directory that uses an [LDAP] server as a source of user definitions.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Name = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Name', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL not support empty string as a server name.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Host = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Host', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `` parameter to specify [LDAP]\n' + 'server hostname or IP, this parameter SHALL be mandatory and SHALL not be empty.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Port = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Port', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `` parameter to specify [LDAP] server port.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Port_Default = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Port.Default', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL use default port number `636` if `enable_tls` is set to `yes` or `389` otherwise.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_AuthDN_Prefix = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.AuthDN.Prefix', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `` parameter to specify the prefix\n' + 'of value used to construct the DN to bound to during authentication via [LDAP] server.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_AuthDN_Suffix = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.AuthDN.Suffix', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `` parameter to specify the suffix\n' + 'of value used to construct the DN to bound to during authentication via [LDAP] server.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_AuthDN_Value = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.AuthDN.Value', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL construct DN as `auth_dn_prefix + escape(user_name) + auth_dn_suffix` string.\n' + '\n' + "> This implies that auth_dn_suffix should usually have comma ',' as its first non-space character.\n" + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_EnableTLS = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.EnableTLS', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `` parameter to trigger the use of secure connection to the [LDAP] server.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_EnableTLS_Options_Default = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.EnableTLS.Options.Default', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL use `yes` value as the default for `` parameter\n' + 'to enable SSL/TLS `ldaps://` protocol.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_EnableTLS_Options_No = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.EnableTLS.Options.No', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support specifying `no` as the value of `` parameter to enable\n' + 'plain text `ldap://` protocol.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_EnableTLS_Options_Yes = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.EnableTLS.Options.Yes', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support specifying `yes` as the value of `` parameter to enable\n' + 'SSL/TLS `ldaps://` protocol.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_EnableTLS_Options_StartTLS = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.EnableTLS.Options.StartTLS', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support specifying `starttls` as the value of `` parameter to enable\n' + 'legacy `StartTLS` protocol that used plain text `ldap://` protocol, upgraded to [TLS].\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSMinimumProtocolVersion = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSMinimumProtocolVersion', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `` parameter to specify\n' + 'the minimum protocol version of SSL/TLS.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSMinimumProtocolVersion_Values = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSMinimumProtocolVersion.Values', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support specifying `ssl2`, `ssl3`, `tls1.0`, `tls1.1`, and `tls1.2`\n' + 'as a value of the `` parameter.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSMinimumProtocolVersion_Default = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSMinimumProtocolVersion.Default', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL set `tls1.2` as the default value of the `` parameter.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSRequireCert = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSRequireCert', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `` parameter to specify [TLS] peer\n' + 'certificate verification behavior.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSRequireCert_Options_Default = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSRequireCert.Options.Default', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL use `demand` value as the default for the `` parameter.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSRequireCert_Options_Demand = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSRequireCert.Options.Demand', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support specifying `demand` as the value of `` parameter to\n' + 'enable requesting of client certificate. If no certificate is provided, or a bad certificate is\n' + 'provided, the session SHALL be immediately terminated.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSRequireCert_Options_Allow = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSRequireCert.Options.Allow', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support specifying `allow` as the value of `` parameter to\n' + 'enable requesting of client certificate. If no\n' + 'certificate is provided, the session SHALL proceed normally.\n' + 'If a bad certificate is provided, it SHALL be ignored and the session SHALL proceed normally.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSRequireCert_Options_Try = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSRequireCert.Options.Try', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support specifying `try` as the value of `` parameter to\n' + 'enable requesting of client certificate. If no certificate is provided, the session\n' + 'SHALL proceed normally. If a bad certificate is provided, the session SHALL be\n' + 'immediately terminated.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSRequireCert_Options_Never = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSRequireCert.Options.Never', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support specifying `never` as the value of `` parameter to\n' + 'disable requesting of client certificate.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSCertFile = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSCertFile', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `` to specify the path to certificate file used by\n' + '[ClickHouse] to establish connection with the [LDAP] server.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSKeyFile = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSKeyFile', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `` to specify the path to key file for the certificate\n' + 'specified by the `` parameter.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSCACertDir = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSCACertDir', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `` parameter to specify to a path to\n' + 'the directory containing [CA] certificates used to verify certificates provided by the [LDAP] server.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSCACertFile = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSCACertFile', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `` parameter to specify a path to a specific\n' + '[CA] certificate file used to verify certificates provided by the [LDAP] server.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSCipherSuite = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.TLSCipherSuite', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `tls_cipher_suite` parameter to specify allowed cipher suites.\n' + 'The value SHALL use the same format as the `ciphersuites` in the [OpenSSL Ciphers].\n' + '\n' + 'For example,\n' + '\n' + '```xml\n' + 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:AES256-GCM-SHA384\n' + '```\n' + '\n' + 'The available suites SHALL depend on the [OpenSSL] library version and variant used to build\n' + '[ClickHouse] and therefore might change.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Syntax = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Server.Syntax', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support the following example syntax to create an entry for an [LDAP] server inside the `config.xml`\n' + 'configuration file or of any configuration file inside the `config.d` directory.\n' + '\n' + '```xml\n' + '\n' + ' \n' + ' localhost\n' + ' 636\n' + ' cn=\n' + ' , ou=users, dc=example, dc=com\n' + ' yes\n' + ' tls1.2\n' + ' demand\n' + ' /path/to/tls_cert_file\n' + ' /path/to/tls_key_file\n' + ' /path/to/tls_ca_cert_file\n' + ' /path/to/tls_ca_cert_dir\n' + ' ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:AES256-GCM-SHA384\n' + ' \n' + '\n' + '```\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_LDAPUserDirectory = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.LDAPUserDirectory', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `` sub-section in the `` section of the `config.xml`\n' + 'that SHALL define a external user directory that uses an [LDAP] server as a source of user definitions.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_LDAPUserDirectory_MoreThanOne = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.LDAPUserDirectory.MoreThanOne', + version='2.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support more than one `` sub-sections in the `` section of the `config.xml`\n' + 'that SHALL allow to define more than one external user directory that use an [LDAP] server as a source\n' + 'of user definitions.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Syntax = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Syntax', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `` section with the following syntax\n' + '\n' + '```xml\n' + '\n' + ' \n' + ' \n' + ' my_ldap_server\n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + '\n' + '```\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Server = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Server', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `server` parameter in the `` sub-section in the ``\n' + 'section of the `config.xml` that SHALL specify one of LDAP server names\n' + 'defined in `` section.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Server_Empty = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Server.Empty', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the `server` parameter in the `` sub-section in the ``\n' + 'is empty.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Server_Missing = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Server.Missing', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the `server` parameter in the `` sub-section in the ``\n' + 'is missing.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Server_MoreThanOne = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Server.MoreThanOne', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL only use the first definitition of the `server` parameter in the `` sub-section in the ``\n' + 'if more than one `server` parameter is defined in the configuration.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Server_Invalid = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Server.Invalid', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the server specified as the value of the ``\n' + 'parameter is not defined.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Roles = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Roles', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support `roles` parameter in the `` sub-section in the ``\n' + 'section of the `config.xml` that SHALL specify the names of a locally defined roles that SHALL\n' + 'be assigned to all users retrieved from the [LDAP] server.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Roles_MoreThanOne = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Roles.MoreThanOne', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL only use the first definitition of the `roles` parameter\n' + 'in the `` sub-section in the ``\n' + 'if more than one `roles` parameter is defined in the configuration.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Roles_Invalid = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Roles.Invalid', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL return an error if the role specified in the ``\n' + 'parameter does not exist locally.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Roles_Empty = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Roles.Empty', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL not allow users authenticated using LDAP external user directory\n' + 'to perform any action if the `roles` parameter in the `` sub-section in the ``\n' + 'section is empty.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Roles_Missing = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Configuration.Users.Parameters.Roles.Missing', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL not allow users authenticated using LDAP external user directory\n' + 'to perform any action if the `roles` parameter in the `` sub-section in the ``\n' + 'section is missing.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Username_Empty = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Username.Empty', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL not support authenticating users with empty username\n' + 'when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Username_Long = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Username.Long', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support authenticating users with a long username of at least 256 bytes\n' + 'when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Username_UTF8 = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Username.UTF8', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support authentication users with a username that contains [UTF-8] characters\n' + 'when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Password_Empty = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Password.Empty', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL not support authenticating users with empty passwords\n' + 'even if an empty password is valid for the user and\n' + 'is allowed by the [LDAP] server when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Password_Long = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Password.Long', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support long password of at least 256 bytes\n' + 'that can be used to authenticate users when using [LDAP] external user directory.\n' + '\n' + ), + link=None) + +RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Password_UTF8 = Requirement( + name='RQ.SRS-009.LDAP.ExternalUserDirectory.Authentication.Password.UTF8', + version='1.0', + priority=None, + group=None, + type=None, + uid=None, + description=( + '[ClickHouse] SHALL support [UTF-8] characters in passwords\n' + 'used to authenticate users when using [LDAP] external user directory.\n' + '\n' + ), + link=None) diff --git a/tests/testflows/ldap/external_user_directory/tests/authentications.py b/tests/testflows/ldap/external_user_directory/tests/authentications.py new file mode 100644 index 00000000000..bf5a788c4d5 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/tests/authentications.py @@ -0,0 +1,734 @@ +# -*- coding: utf-8 -*- +import random + +from multiprocessing.dummy import Pool +from testflows.core import * +from testflows.asserts import error + +from ldap.external_user_directory.tests.common import * +from ldap.external_user_directory.requirements import * + +servers = { + "openldap1": { + "host": "openldap1", + "port": "389", + "enable_tls": "no", + "auth_dn_prefix": "cn=", + "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }, + "openldap2": { + "host": "openldap2", + "port": "636", + "enable_tls": "yes", + "auth_dn_prefix": "cn=", + "auth_dn_suffix": ",ou=users,dc=company,dc=com", + "tls_require_cert": "never", + } +} + +@TestOutline +def add_user_to_ldap_and_login(self, server, user=None, ch_user=None, login=None, exitcode=None, message=None): + """Add user to LDAP and ClickHouse and then try to login.""" + self.context.ldap_node = self.context.cluster.node(server) + + if ch_user is None: + ch_user = {} + if login is None: + login = {} + if user is None: + user = {"cn": "myuser", "userpassword": "myuser"} + + with ldap_user(**user) as user: + username = login.get("username", user["cn"]) + password = login.get("password", user["userpassword"]) + + login_and_execute_query(username=username, password=password, exitcode=exitcode, message=message) + +def login_with_valid_username_and_password(users, i, iterations=10): + """Login with valid username and password. + """ + with When(f"valid users try to login #{i}"): + for i in range(iterations): + random_user = users[random.randint(0, len(users)-1)] + login_and_execute_query(username=random_user["cn"], password=random_user["userpassword"], steps=False) + +def login_with_valid_username_and_invalid_password(users, i, iterations=10): + """Login with valid username and invalid password. + """ + with When(f"users try to login with valid username and invalid password #{i}"): + for i in range(iterations): + random_user = users[random.randint(0, len(users)-1)] + login_and_execute_query(username=random_user["cn"], + password=(random_user["userpassword"] + randomword(1)), + exitcode=4, + message=f"DB::Exception: {random_user['cn']}: Authentication failed: password is incorrect or there is no user with such name", + steps=False) + +def login_with_invalid_username_and_valid_password(users, i, iterations=10): + """Login with invalid username and valid password. + """ + with When(f"users try to login with invalid username and valid password #{i}"): + for i in range(iterations): + random_user = dict(users[random.randint(0, len(users)-1)]) + random_user["cn"] += randomword(1) + login_and_execute_query(username=random_user["cn"], + password=random_user["userpassword"], + exitcode=4, + message=f"DB::Exception: {random_user['cn']}: Authentication failed: password is incorrect or there is no user with such name", + steps=False) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Parallel("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Parallel_ValidAndInvalid("1.0") +) +def parallel_login(self, server, user_count=10, timeout=200): + """Check that login of valid and invalid LDAP authenticated users works in parallel. + """ + self.context.ldap_node = self.context.cluster.node(server) + user = None + + with Given("a group of LDAP users"): + users = [{"cn": f"parallel_user{i}", "userpassword": randomword(20)} for i in range(user_count)] + + with ldap_users(*users): + tasks = [] + try: + with When("users try to login in parallel", description=""" + * with valid username and password + * with invalid username and valid password + * with valid username and invalid password + """): + p = Pool(15) + for i in range(25): + tasks.append(p.apply_async(login_with_valid_username_and_password, (users, i, 50,))) + tasks.append(p.apply_async(login_with_valid_username_and_invalid_password, (users, i, 50,))) + tasks.append(p.apply_async(login_with_invalid_username_and_valid_password, (users, i, 50,))) + + finally: + with Then("it should work"): + join(tasks, timeout) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Parallel_SameUser("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Parallel_ValidAndInvalid("1.0") +) +def parallel_login_with_the_same_user(self, server, timeout=200): + """Check that valid and invalid logins of the same + LDAP authenticated user works in parallel. + """ + self.context.ldap_node = self.context.cluster.node(server) + user = None + + with Given("only one LDAP user"): + users = [{"cn": f"parallel_user1", "userpassword": randomword(20)}] + + with ldap_users(*users): + tasks = [] + try: + with When("the same user tries to login in parallel", description=""" + * with valid username and password + * with invalid username and valid password + * with valid username and invalid password + """): + p = Pool(15) + for i in range(25): + tasks.append(p.apply_async(login_with_valid_username_and_password, (users, i, 50,))) + tasks.append(p.apply_async(login_with_valid_username_and_invalid_password, (users, i, 50,))) + tasks.append(p.apply_async(login_with_invalid_username_and_valid_password, (users, i, 50,))) + + finally: + with Then("it should work"): + join(tasks, timeout) + +@TestScenario +def login_after_ldap_external_user_directory_is_removed(self, server): + """Check that ClickHouse stops authenticating LDAP users + after LDAP external user directory is removed. + """ + with When("I attempt to login after LDAP external user directory is added"): + with ldap_external_user_directory(server="openldap2", roles=[], restart=True): + login_and_execute_query(username="user2", password="user2") + + with When("I attempt to login after LDAP external user directory is removed"): + exitcode = 4 + message = f"DB::Exception: user2: Authentication failed: password is incorrect or there is no user with such name" + login_and_execute_query(username="user2", password="user2", exitcode=exitcode, message=message) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Parallel_SameUser("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Parallel_ValidAndInvalid("1.0") +) +def parallel_login_with_the_same_user_multiple_servers(self, server, timeout=200): + """Check that valid and invalid logins of the same + user defined in multiple LDAP external user directories + works in parallel. + """ + with Given("I have two LDAP servers"): + entries = [ + (["openldap1"], []), + (["openldap2"], []) + ] + + with Given("I define only one LDAP user"): + users = [{"cn": f"parallel_user1", "userpassword": randomword(20)}] + + with And("I create config file to define LDAP external user directory for each LDAP server"): + config = create_entries_ldap_external_user_directory_config_content(entries) + + with ldap_external_user_directory(server=None, roles=None, restart=True, config=config): + with ldap_users(*users, node=self.context.cluster.node("openldap1")): + with ldap_users(*users, node=self.context.cluster.node("openldap2")): + tasks = [] + try: + with When("the same user tries to login in parallel", description=""" + * with valid username and password + * with invalid username and valid password + * with valid username and invalid password + """): + p = Pool(15) + for i in range(25): + tasks.append(p.apply_async(login_with_valid_username_and_password, (users, i, 50,))) + tasks.append(p.apply_async(login_with_valid_username_and_invalid_password, (users, i, 50,))) + tasks.append(p.apply_async(login_with_invalid_username_and_valid_password, (users, i, 50,))) + + finally: + with Then("it should work"): + join(tasks, timeout) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Parallel_MultipleServers("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Parallel_ValidAndInvalid("1.0") +) +def parallel_login_with_multiple_servers(self, server, user_count=10, timeout=200): + """Check that login of valid and invalid LDAP authenticated users works in parallel + using multiple LDAP external user directories. + """ + with Given("I have two LDAP servers"): + entries = [ + (["openldap1"], []), + (["openldap2"], []) + ] + + with And("I define a group of users to be created on each LDAP server"): + user_groups = { + "openldap1_users": [{"cn": f"openldap1_parallel_user{i}", "userpassword": randomword(20)} for i in range(user_count)], + "openldap2_users": [{"cn": f"openldap2_parallel_user{i}", "userpassword": randomword(20)} for i in range(user_count)] + } + + with And("I have a list of checks that I want to run for each user group"): + checks = [ + login_with_valid_username_and_password, + login_with_valid_username_and_invalid_password, + login_with_invalid_username_and_valid_password + ] + + with And("I create config file to define LDAP external user directory for each LDAP server"): + config = create_entries_ldap_external_user_directory_config_content(entries) + + with ldap_external_user_directory(server=None, roles=None, restart=True, config=config): + with ldap_users(*user_groups["openldap1_users"], node=self.context.cluster.node("openldap1")): + with ldap_users(*user_groups["openldap2_users"], node=self.context.cluster.node("openldap2")): + tasks = [] + + try: + with When("users in each group try to login in parallel", description=""" + * with valid username and password + * with invalid username and valid password + * with valid username and invalid password + """): + p = Pool(15) + for i in range(25): + for users in user_groups.values(): + for check in checks: + tasks.append(p.apply_async(check, (users, i, 50,))) + + finally: + with Then("it should work"): + join(tasks, timeout) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Parallel_LocalAndMultipleLDAP("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Parallel_ValidAndInvalid("1.0") +) +def parallel_login_with_rbac_and_multiple_servers(self, server, user_count=10, timeout=200): + """Check that login of valid and invalid users works in parallel + using local users defined using RBAC and LDAP users authenticated using + multiple LDAP external user directories. + """ + with Given("I have two LDAP servers"): + entries = [ + (["openldap1"], []), + (["openldap2"], []) + ] + + with And("I define a group of users to be created on each LDAP server"): + user_groups = { + "openldap1_users": [{"cn": f"openldap1_parallel_user{i}", "userpassword": randomword(20)} for i in range(user_count)], + "openldap2_users": [{"cn": f"openldap2_parallel_user{i}", "userpassword": randomword(20)} for i in range(user_count)], + "local_users": [{"cn": f"local_parallel_user{i}", "userpassword": randomword(20)} for i in range(user_count)] + } + + with And("I have a list of checks that I want to run for each user group"): + checks = [ + login_with_valid_username_and_password, + login_with_valid_username_and_invalid_password, + login_with_invalid_username_and_valid_password + ] + + with And("I create config file to define LDAP external user directory for each LDAP server"): + config = create_entries_ldap_external_user_directory_config_content(entries) + + with ldap_external_user_directory(server=None, roles=None, restart=True, config=config): + with ldap_users(*user_groups["openldap1_users"], node=self.context.cluster.node("openldap1")): + with ldap_users(*user_groups["openldap2_users"], node=self.context.cluster.node("openldap2")): + with rbac_users(*user_groups["local_users"]): + tasks = [] + + try: + with When("users in each group try to login in parallel", description=""" + * with valid username and password + * with invalid username and valid password + * with valid username and invalid password + """): + p = Pool(15) + for i in range(25): + for users in user_groups.values(): + for check in checks: + tasks.append(p.apply_async(check, (users, i, 50,))) + + finally: + with Then("it should work"): + join(tasks, timeout) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Parallel_LocalOnly("1.0") +) +def parallel_login_with_rbac_users(self, server, user_count=10, timeout=200): + """Check that login of only valid and invalid local users created using RBAC + works in parallel when server configuration includes LDAP external user directory. + """ + self.context.ldap_node = self.context.cluster.node(server) + user = None + + users = [{"cn": f"parallel_user{i}", "userpassword": randomword(20)} for i in range(user_count)] + + with rbac_users(*users): + tasks = [] + try: + with When("I login in parallel"): + p = Pool(15) + for i in range(25): + tasks.append(p.apply_async(login_with_valid_username_and_password, (users, i, 50,))) + tasks.append(p.apply_async(login_with_valid_username_and_invalid_password, (users, i, 50,))) + tasks.append(p.apply_async(login_with_invalid_username_and_valid_password, (users, i, 50,))) + finally: + with Then("it should work"): + join(tasks, timeout) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Users_Authentication_NewUsers("1.0") +) +def login_after_user_is_added_to_ldap(self, server): + """Check that user can login as soon as it is added to LDAP.""" + user = {"cn": "myuser", "userpassword": "myuser"} + + with When(f"I add user to LDAP and try to login"): + add_user_to_ldap_and_login(user=user, server=server) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Invalid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_DeletedUsers("1.0") +) +def login_after_user_is_deleted_from_ldap(self, server): + """Check that login fails after user is deleted from LDAP.""" + self.context.ldap_node = self.context.cluster.node(server) + user = None + + try: + with Given(f"I add user to LDAP"): + user = {"cn": "myuser", "userpassword": "myuser"} + user = add_user_to_ldap(**user) + + login_and_execute_query(username=user["cn"], password=user["userpassword"]) + + with When("I delete this user from LDAP"): + delete_user_from_ldap(user) + + with Then("when I try to login again it should fail"): + login_and_execute_query(username=user["cn"], password=user["userpassword"], + exitcode=4, + message=f"DB::Exception: {user['cn']}: Authentication failed: password is incorrect or there is no user with such name" + ) + finally: + with Finally("I make sure LDAP user is deleted"): + if user is not None: + delete_user_from_ldap(user, exitcode=None) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Invalid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_PasswordChanged("1.0") +) +def login_after_user_password_changed_in_ldap(self, server): + """Check that login fails after user password is changed in LDAP.""" + self.context.ldap_node = self.context.cluster.node(server) + user = None + + try: + with Given(f"I add user to LDAP"): + user = {"cn": "myuser", "userpassword": "myuser"} + user = add_user_to_ldap(**user) + + login_and_execute_query(username=user["cn"], password=user["userpassword"]) + + with When("I change user password in LDAP"): + change_user_password_in_ldap(user, "newpassword") + + with Then("when I try to login again it should fail"): + login_and_execute_query(username=user["cn"], password=user["userpassword"], + exitcode=4, + message=f"DB::Exception: {user['cn']}: Authentication failed: password is incorrect or there is no user with such name" + ) + + with And("when I try to login with the new password it should work"): + login_and_execute_query(username=user["cn"], password="newpassword") + + finally: + with Finally("I make sure LDAP user is deleted"): + if user is not None: + delete_user_from_ldap(user, exitcode=None) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Invalid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_UsernameChanged("1.0") +) +def login_after_user_cn_changed_in_ldap(self, server): + """Check that login fails after user cn is changed in LDAP.""" + self.context.ldap_node = self.context.cluster.node(server) + user = None + new_user = None + + try: + with Given(f"I add user to LDAP"): + user = {"cn": "myuser", "userpassword": "myuser"} + user = add_user_to_ldap(**user) + + login_and_execute_query(username=user["cn"], password=user["userpassword"]) + + with When("I change user password in LDAP"): + new_user = change_user_cn_in_ldap(user, "myuser2") + + with Then("when I try to login again it should fail"): + login_and_execute_query(username=user["cn"], password=user["userpassword"], + exitcode=4, + message=f"DB::Exception: {user['cn']}: Authentication failed: password is incorrect or there is no user with such name" + ) + finally: + with Finally("I make sure LDAP user is deleted"): + if new_user is not None: + delete_user_from_ldap(new_user, exitcode=None) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Valid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_LDAPServerRestart("1.0") +) +def login_after_ldap_server_is_restarted(self, server, timeout=60): + """Check that login succeeds after LDAP server is restarted.""" + self.context.ldap_node = self.context.cluster.node(server) + user = None + + try: + with Given(f"I add user to LDAP"): + user = {"cn": "myuser", "userpassword": getuid()} + user = add_user_to_ldap(**user) + + login_and_execute_query(username=user["cn"], password=user["userpassword"]) + + with When("I restart LDAP server"): + self.context.ldap_node.restart() + + with Then("I try to login until it works", description=f"timeout {timeout} sec"): + started = time.time() + while True: + r = self.context.node.query("SELECT 1", + settings=[("user", user["cn"]), ("password", user["userpassword"])], + no_checks=True) + if r.exitcode == 0: + break + assert time.time() - started < timeout, error(r.output) + finally: + with Finally("I make sure LDAP user is deleted"): + if user is not None: + delete_user_from_ldap(user, exitcode=None) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Valid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_ClickHouseServerRestart("1.0") +) +def login_after_clickhouse_server_is_restarted(self, server, timeout=60): + """Check that login succeeds after ClickHouse server is restarted.""" + self.context.ldap_node = self.context.cluster.node(server) + user = None + + try: + with Given(f"I add user to LDAP"): + user = {"cn": "myuser", "userpassword": getuid()} + user = add_user_to_ldap(**user) + + login_and_execute_query(username=user["cn"], password=user["userpassword"]) + + with When("I restart ClickHouse server"): + self.context.node.restart() + + with Then("I try to login until it works", description=f"timeout {timeout} sec"): + started = time.time() + while True: + r = self.context.node.query("SELECT 1", + settings=[("user", user["cn"]), ("password", user["userpassword"])], + no_checks=True) + if r.exitcode == 0: + break + assert time.time() - started < timeout, error(r.output) + finally: + with Finally("I make sure LDAP user is deleted"): + if user is not None: + delete_user_from_ldap(user, exitcode=None) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Invalid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Password_Empty("1.0") +) +def valid_username_with_valid_empty_password(self, server): + """Check that we can't login using valid username that has empty password.""" + user = {"cn": "empty_password", "userpassword": ""} + exitcode = 4 + message = f"DB::Exception: {user['cn']}: Authentication failed: password is incorrect or there is no user with such name" + + add_user_to_ldap_and_login(user=user, exitcode=exitcode, message=message, server=server) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Invalid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Password_Empty("1.0") +) +def valid_username_and_invalid_empty_password(self, server): + """Check that we can't login using valid username but invalid empty password.""" + username = "user_non_empty_password" + user = {"cn": username, "userpassword": username} + login = {"password": ""} + + exitcode = 4 + message = f"DB::Exception: {username}: Authentication failed: password is incorrect or there is no user with such name" + + add_user_to_ldap_and_login(user=user, login=login, exitcode=exitcode, message=message, server=server) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Valid("1.0") +) +def valid_username_and_password(self, server): + """Check that we can login using valid username and password.""" + username = "valid_username_and_password" + user = {"cn": username, "userpassword": username} + + with When(f"I add user {username} to LDAP and try to login"): + add_user_to_ldap_and_login(user=user, server=server) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Invalid("1.0") +) +def valid_username_and_password_invalid_server(self, server=None): + """Check that we can't login using valid username and valid + password but for a different server.""" + self.context.ldap_node = self.context.cluster.node("openldap1") + + exitcode = 4 + message = f"DB::Exception: user2: Authentication failed: password is incorrect or there is no user with such name" + + login_and_execute_query(username="user2", password="user2", exitcode=exitcode, message=message) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Valid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Username_Long("1.0"), +) +def valid_long_username_and_short_password(self, server): + """Check that we can login using valid very long username and short password.""" + username = "long_username_12345678901234567890123456789012345678901234567890123456789012345678901234567890" + user = {"cn": username, "userpassword": "long_username"} + + add_user_to_ldap_and_login(user=user, server=server) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Invalid("1.0") +) +def invalid_long_username_and_valid_short_password(self, server): + """Check that we can't login using slightly invalid long username but valid password.""" + username = "long_username_12345678901234567890123456789012345678901234567890123456789012345678901234567890" + user = {"cn": username, "userpassword": "long_username"} + login = {"username": f"{username}?"} + + exitcode = 4 + message=f"DB::Exception: {login['username']}: Authentication failed: password is incorrect or there is no user with such name" + + add_user_to_ldap_and_login(user=user, login=login, exitcode=exitcode, message=message, server=server) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Valid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Password_Long("1.0") +) +def valid_short_username_and_long_password(self, server): + """Check that we can login using valid short username with very long password.""" + username = "long_password" + user = {"cn": username, "userpassword": "long_password_12345678901234567890123456789012345678901234567890123456789012345678901234567890"} + add_user_to_ldap_and_login(user=user, server=server) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Invalid("1.0") +) +def valid_short_username_and_invalid_long_password(self, server): + """Check that we can't login using valid short username and invalid long password.""" + username = "long_password" + user = {"cn": username, "userpassword": "long_password_12345678901234567890123456789012345678901234567890123456789012345678901234567890"} + login = {"password": user["userpassword"] + "1"} + + exitcode = 4 + message=f"DB::Exception: {username}: Authentication failed: password is incorrect or there is no user with such name" + + add_user_to_ldap_and_login(user=user, login=login, exitcode=exitcode, message=message, server=server) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Invalid("1.0") +) +def valid_username_and_invalid_password(self, server): + """Check that we can't login using valid username and invalid password.""" + username = "valid_username_and_invalid_password" + user = {"cn": username, "userpassword": username} + login = {"password": user["userpassword"] + "1"} + + exitcode = 4 + message=f"DB::Exception: {username}: Authentication failed: password is incorrect or there is no user with such name" + + add_user_to_ldap_and_login(user=user, login=login, exitcode=exitcode, message=message, server=server) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Invalid("1.0") +) +def invalid_username_and_valid_password(self, server): + """Check that we can't login using slightly invalid username but valid password.""" + username = "invalid_username_and_valid_password" + user = {"cn": username, "userpassword": username} + login = {"username": user["cn"] + "1"} + + exitcode = 4 + message=f"DB::Exception: {login['username']}: Authentication failed: password is incorrect or there is no user with such name" + + add_user_to_ldap_and_login(user=user, login=login, exitcode=exitcode, message=message, server=server) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Valid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Username_UTF8("1.0") +) +def valid_utf8_username_and_ascii_password(self, server): + """Check that we can login using valid utf-8 username with ascii password.""" + username = "utf8_username_Gãńdåłf_Thê_Gręât" + user = {"cn": username, "userpassword": "utf8_username"} + + add_user_to_ldap_and_login(user=user, server=server) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Valid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication_Password_UTF8("1.0") +) +def valid_ascii_username_and_utf8_password(self, server): + """Check that we can login using valid ascii username with utf-8 password.""" + username = "utf8_password" + user = {"cn": username, "userpassword": "utf8_password_Gãńdåłf_Thê_Gręât"} + + add_user_to_ldap_and_login(user=user, server=server) + +@TestScenario +def empty_username_and_empty_password(self, server=None): + """Check that we can login using empty username and empty password as + it will use the default user and that has an empty password.""" + login_and_execute_query(username="", password="") + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Users_Lookup_Priority("2.0") +) +def user_lookup_priority(self, server): + """Check that users are looked up in the same priority + as they are defined in the `` section + of the `config.xml`. For this test we have the following priority list + as defined by the configuration files: + + * users.xml + * local directory + * LDAP external user directory + """ + self.context.ldap_node = self.context.cluster.node(server) + + message="DB::Exception: {username}: Authentication failed: password is incorrect or there is no user with such name" + exitcode = 4 + + users = { + "default": {"username": "default", "password": "userdefault"}, + "local": {"username": "local", "password": "userlocal"}, + "ldap": {"username": "ldap", "password": "userldap"} + } + + with ldap_users(*[{"cn": user["username"], "userpassword": user["password"]} for user in users.values()]): + with rbac_users({"cn": "local", "userpassword": "local"}): + with When("I try to login as 'default' user which is also defined in users.xml it should fail"): + login_and_execute_query(**users["default"], exitcode=exitcode, message=message.format(username="default")) + + with When("I try to login as 'local' user which is also defined in local storage it should fail"): + login_and_execute_query(**users["local"], exitcode=exitcode, message=message.format(username="local")) + + with When("I try to login as 'ldap' user defined only in LDAP it should work"): + login_and_execute_query(**users["ldap"]) + + +@TestOutline(Feature) +@Name("user authentications") +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Authentication("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Connection_Authentication_Mechanism_NamePassword("1.0") +) +def feature(self, servers=None, server=None, node="clickhouse1"): + """Check that users can be authenticated using an LDAP external user directory. + """ + self.context.node = self.context.cluster.node(node) + + if servers is None: + servers = globals()["servers"] + + if server is None: + server = "openldap1" + + with ldap_servers(servers): + with rbac_roles("ldap_role") as roles: + with ldap_external_user_directory(server=server, roles=roles, restart=True): + for scenario in loads(current_module(), Scenario): + Scenario(test=scenario, flags=TE)(server=server) diff --git a/tests/testflows/ldap/external_user_directory/tests/common.py b/tests/testflows/ldap/external_user_directory/tests/common.py new file mode 100644 index 00000000000..b4a8c9e6640 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/tests/common.py @@ -0,0 +1,204 @@ +import os +import time +from contextlib import contextmanager + +import testflows.settings as settings +from testflows.core import * +from testflows.asserts import error +from ldap.authentication.tests.common import getuid, Config, ldap_servers, add_config, restart +from ldap.authentication.tests.common import xmltree, xml_indent, xml_append, xml_with_utf8 +from ldap.authentication.tests.common import ldap_user, ldap_users, add_user_to_ldap, delete_user_from_ldap +from ldap.authentication.tests.common import change_user_password_in_ldap, change_user_cn_in_ldap +from ldap.authentication.tests.common import randomword + +def join(tasks, timeout): + """Join async tasks by waiting for their completion. + """ + task_exc = None + + for task in tasks: + try: + task.get(timeout=timeout) + except Exception as exc: + if task_exc is None: + task_exc = exc + + if task_exc is not None: + raise task_exc + +@contextmanager +def table(name, create_statement, on_cluster=False): + node = current().context.node + try: + with Given(f"I have a {name} table"): + node.query(create_statement.format(name=name)) + yield name + finally: + with Finally("I drop the table"): + if on_cluster: + node.query(f"DROP TABLE IF EXISTS {name} ON CLUSTER {on_cluster}") + else: + node.query(f"DROP TABLE IF EXISTS {name}") + +@contextmanager +def rbac_users(*users): + node = current().context.node + try: + with Given("I have local users"): + for user in users: + with By(f"creating user {user['cn']}", format_name=False): + node.query(f"CREATE USER OR REPLACE {user['cn']} IDENTIFIED WITH PLAINTEXT_PASSWORD BY '{user['userpassword']}'") + yield users + finally: + with Finally("I drop local users"): + for user in users: + with By(f"dropping user {user['cn']}", flags=TE, format_name=False): + node.query(f"DROP USER IF EXISTS {user['cn']}") + +@contextmanager +def rbac_roles(*roles): + node = current().context.node + try: + with Given("I have roles"): + for role in roles: + with By(f"creating role {role}"): + node.query(f"CREATE ROLE OR REPLACE {role}") + yield roles + finally: + with Finally("I drop the roles"): + for role in roles: + with By(f"dropping role {role}", flags=TE): + node.query(f"DROP ROLE IF EXISTS {role}") + +def create_ldap_external_user_directory_config_content(server=None, roles=None, **kwargs): + """Create LDAP external user directory configuration file content. + """ + return create_entries_ldap_external_user_directory_config_content(entries=[([server], [roles])], **kwargs) + +def create_entries_ldap_external_user_directory_config_content(entries, config_d_dir="/etc/clickhouse-server/config.d", + config_file="ldap_external_user_directories.xml"): + """Create configurattion file content that contains + one or more entries for the LDAP external user directory. + + For example, + + ```xml + + + my_ldap_server + my_user + + + ``` + """ + uid = getuid() + path = os.path.join(config_d_dir, config_file) + name = config_file + + root = xmltree.fromstring("") + xml_user_directories = root.find("user_directories") + xml_user_directories.append(xmltree.Comment(text=f"LDAP external user directories {uid}")) + + for entry in entries: + servers, roles_entries = entry + xml_directory = xmltree.Element("ldap") + for server in servers: + if server is not None: + xml_append(xml_directory, "server", server) + if roles_entries: + for roles_entry in roles_entries: + xml_roles = xmltree.Element("roles") + if roles_entry: + for role in roles_entry: + if role is not None: + xml_append(xml_roles, role, "") + xml_directory.append(xml_roles) + xml_user_directories.append(xml_directory) + + xml_indent(root) + content = xml_with_utf8 + str(xmltree.tostring(root, short_empty_elements=False, encoding="utf-8"), "utf-8") + + return Config(content, path, name, uid, "config.xml") + +def invalid_ldap_external_user_directory_config(server, roles, message, tail=20, timeout=20, config=None): + """Check that ClickHouse errors when trying to load invalid LDAP external user directory + configuration file. + """ + cluster = current().context.cluster + node = current().context.node + + if config is None: + config = create_ldap_external_user_directory_config_content(server=server, roles=roles) + + try: + with Given("I prepare the error log by writting empty lines into it"): + node.command("echo -e \"%s\" > /var/log/clickhouse-server/clickhouse-server.err.log" % ("-\\n" * tail)) + + with When("I add the config", description=config.path): + command = f"cat < {config.path}\n{config.content}\nHEREDOC" + node.command(command, steps=False, exitcode=0) + + with Then(f"{config.preprocessed_name} should be updated", description=f"timeout {timeout}"): + started = time.time() + command = f"cat /var/lib/clickhouse/preprocessed_configs/{config.preprocessed_name} | grep {config.uid}{' > /dev/null' if not settings.debug else ''}" + while time.time() - started < timeout: + exitcode = node.command(command, steps=False).exitcode + if exitcode == 0: + break + time.sleep(1) + assert exitcode == 0, error() + + with When("I restart ClickHouse to apply the config changes"): + node.restart(safe=False, wait_healthy=False) + + finally: + with Finally(f"I remove {config.name}"): + with By("removing invalid configuration file"): + system_config_path = os.path.join(current_dir(), "..", "configs", node.name, "config.d", config.path.split("config.d/")[-1]) + cluster.command(None, f'rm -rf {system_config_path}', timeout=timeout, exitcode=0) + + with And("restarting the node"): + node.restart(safe=False) + + with Then("error log should contain the expected error message"): + started = time.time() + command = f"tail -n {tail} /var/log/clickhouse-server/clickhouse-server.err.log | grep \"{message}\"" + while time.time() - started < timeout: + exitcode = node.command(command, steps=False).exitcode + if exitcode == 0: + break + time.sleep(1) + assert exitcode == 0, error() + +@contextmanager +def ldap_external_user_directory(server, roles, config_d_dir="/etc/clickhouse-server/config.d", + config_file=None, timeout=20, restart=True, config=None): + """Add LDAP external user directory. + """ + if config_file is None: + config_file = f"ldap_external_user_directory_{getuid()}.xml" + if config is None: + config = create_ldap_external_user_directory_config_content(server=server, roles=roles, config_d_dir=config_d_dir, config_file=config_file) + return add_config(config, restart=restart) + +def login(servers, directory_server, *users, config=None): + """Configure LDAP server and LDAP external user directory and + try to login and execute a query""" + with ldap_servers(servers): + with rbac_roles(f"role_{getuid()}") as roles: + with ldap_external_user_directory(server=servers[directory_server]["host"], roles=roles, restart=True, config=config): + for user in users: + if user.get("login", False): + with When(f"I login as {user['username']} and execute query"): + current().context.node.query("SELECT 1", + settings=[("user", user["username"]), ("password", user["password"])], + exitcode=user.get("exitcode", None), + message=user.get("message", None)) + +@TestStep(When) +@Name("I login as {username} and execute query") +def login_and_execute_query(self, username, password, exitcode=None, message=None, steps=True, timeout=60): + self.context.node.query("SELECT 1", + settings=[("user", username), ("password", password)], + exitcode=exitcode or 0, + message=message, steps=steps, timeout=timeout) diff --git a/tests/testflows/ldap/external_user_directory/tests/connections.py b/tests/testflows/ldap/external_user_directory/tests/connections.py new file mode 100644 index 00000000000..ba734bb6c71 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/tests/connections.py @@ -0,0 +1,270 @@ +from testflows.core import * +from testflows.asserts import error + +from ldap.external_user_directory.tests.common import login +from ldap.external_user_directory.requirements import * + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Connection_Protocol_PlainText("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_EnableTLS("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_EnableTLS_Options_No("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Port_Default("1.0") +) +def plain_text(self): + """Check that we can perform LDAP user authentication using `plain text` connection protocol. + """ + servers = { + "openldap1": { + "host": "openldap1", + "enable_tls": "no", + "auth_dn_prefix": "cn=", + "auth_dn_suffix": ",ou=users,dc=company,dc=com" + } + } + users = [ + {"server": "openldap1", "username": "user1", "password": "user1", "login": True} + ] + login(servers, "openldap1", *users) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Connection_Protocol_PlainText("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Port("1.0") +) +def plain_text_with_custom_port(self): + """Check that we can perform LDAP user authentication using `plain text` connection protocol + with the server that uses custom port. + """ + servers = { + "openldap3": { + "host": "openldap3", + "port": "3089", + "enable_tls": "no", + "auth_dn_prefix": "cn=", + "auth_dn_suffix": ",ou=users,dc=company,dc=com" + } + } + users = [ + {"server": "openldap3", "username": "user3", "password": "user3", "login": True} + ] + login(servers, "openldap3", *users) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Connection_Protocol_TLS("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Port("1.0") +) +def tls_with_custom_port(self): + """Check that we can perform LDAP user authentication using `TLS` connection protocol + with the server that uses custom port. + """ + servers = { + "openldap4": { + "host": "openldap4", + "port": "6036", + "tls_require_cert": "never", + "auth_dn_prefix": "cn=", + "auth_dn_suffix": ",ou=users,dc=company,dc=com" + } + } + users = [ + {"server": "openldap4", "username": "user4", "password": "user4", "login": True} + ] + login(servers, "openldap4", *users) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Connection_Protocol_StartTLS("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Port("1.0") +) +def starttls_with_custom_port(self): + """Check that we can perform LDAP user authentication using `StartTLS` connection protocol + with the server that uses custom port. + """ + servers = { + "openldap4": { + "host": "openldap4", + "port": "3089", + "enable_tls": "starttls", + "tls_require_cert": "never", + "auth_dn_prefix": "cn=", + "auth_dn_suffix": ",ou=users,dc=company,dc=com" + } + } + users = [ + {"server": "openldap4", "username": "user4", "password": "user4", "login": True} + ] + login(servers, "openldap4", *users) + +def tls_connection(enable_tls, tls_require_cert): + """Try to login using LDAP user authentication over a TLS connection.""" + servers = { + "openldap2": { + "host": "openldap2", + "enable_tls": enable_tls, + "tls_require_cert": tls_require_cert, + "auth_dn_prefix": "cn=", + "auth_dn_suffix": ",ou=users,dc=company,dc=com" + } + } + users = [ + {"server": "openldap2", "username": "user2", "password": "user2", "login": True} + ] + + requirements = [] + + if tls_require_cert == "never": + requirements = [RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSRequireCert_Options_Never("1.0")] + elif tls_require_cert == "allow": + requirements = [RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSRequireCert_Options_Allow("1.0")] + elif tls_require_cert == "try": + requirements = [RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSRequireCert_Options_Try("1.0")] + elif tls_require_cert == "demand": + requirements = [RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSRequireCert_Options_Demand("1.0")] + + with Example(name=f"tls_require_cert='{tls_require_cert}'", requirements=requirements): + login(servers, "openldap2", *users) + +@TestScenario +@Examples("enable_tls tls_require_cert", [ + ("yes", "never"), + ("yes", "allow"), + ("yes", "try"), + ("yes", "demand") +]) +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Connection_Protocol_TLS("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_EnableTLS("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_EnableTLS_Options_Yes("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Port_Default("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSRequireCert("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSMinimumProtocolVersion_Default("1.0") +) +def tls(self): + """Check that we can perform LDAP user authentication using `TLS` connection protocol. + """ + for example in self.examples: + tls_connection(*example) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_EnableTLS_Options_Default("1.0") +) +def tls_enable_tls_default_yes(self): + """Check that the default value for the `enable_tls` is set to `yes`.""" + servers = { + "openldap2": { + "host": "openldap2", + "tls_require_cert": "never", + "auth_dn_prefix": "cn=", + "auth_dn_suffix": ",ou=users,dc=company,dc=com" + } + } + users = [ + {"server": "openldap2", "username": "user2", "password": "user2", "login": True} + ] + login(servers, "openldap2", *users) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSRequireCert_Options_Default("1.0") +) +def tls_require_cert_default_demand(self): + """Check that the default value for the `tls_require_cert` is set to `demand`.""" + servers = { + "openldap2": { + "host": "openldap2", + "enable_tls": "yes", + "port": "636", + "auth_dn_prefix": "cn=", + "auth_dn_suffix": ",ou=users,dc=company,dc=com" + } + } + users = [ + {"server": "openldap2", "username": "user2", "password": "user2", "login": True} + ] + login(servers, "openldap2", *users) + +@TestScenario +@Examples("enable_tls tls_require_cert", [ + ("starttls", "never"), + ("starttls", "allow"), + ("starttls", "try"), + ("starttls", "demand") +]) +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Connection_Protocol_StartTLS("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_EnableTLS("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_EnableTLS_Options_StartTLS("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Port_Default("1.0") +) +def starttls(self): + """Check that we can perform LDAP user authentication using legacy `StartTLS` connection protocol. + """ + for example in self.examples: + tls_connection(*example) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSCipherSuite("1.0") +) +def tls_cipher_suite(self): + """Check that `tls_cipher_suite` parameter can be used specify allowed cipher suites.""" + servers = { + "openldap4": { + "host": "openldap4", + "port": "6036", + "tls_require_cert": "never", + "tls_cipher_suite": "SECURE256:+SECURE128:-VERS-TLS-ALL:+VERS-TLS1.2:-RSA:-DHE-DSS:-CAMELLIA-128-CBC:-CAMELLIA-256-CBC", + "tls_minimum_protocol_version": "tls1.2", + "auth_dn_prefix": "cn=", + "auth_dn_suffix": ",ou=users,dc=company,dc=com" + } + } + users = [ + {"server": "openldap4", "username": "user4", "password": "user4", "login": True} + ] + login(servers, "openldap4", *users) + +@TestOutline(Scenario) +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSMinimumProtocolVersion("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSMinimumProtocolVersion_Values("1.0") +) +@Examples("version exitcode message", [ + ("ssl2", None, None), + ("ssl3", None, None), + ("tls1.0", None, None), + ("tls1.1", None, None), + ("tls1.2", None, None) +]) +def tls_minimum_protocol_version(self, version, exitcode, message): + """Check that `tls_minimum_protocol_version` parameter can be used specify + to specify the minimum protocol version of SSL/TLS.""" + + servers = { + "openldap4": { + "host": "openldap4", + "port": "6036", + "tls_require_cert": "never", + "tls_minimum_protocol_version": version, + "auth_dn_prefix": "cn=", + "auth_dn_suffix": ",ou=users,dc=company,dc=com" + } + } + + users = [{ + "server": "openldap4", "username": "user4", "password": "user4", + "login": True, "exitcode": int(exitcode) if exitcode is not None else None, "message": message + }] + + login(servers,"openldap4", *users) + +@TestFeature +@Name("connection protocols") +def feature(self, node="clickhouse1"): + self.context.node = self.context.cluster.node(node) + + for scenario in loads(current_module(), Scenario): + scenario() diff --git a/tests/testflows/ldap/external_user_directory/tests/external_user_directory_config.py b/tests/testflows/ldap/external_user_directory/tests/external_user_directory_config.py new file mode 100644 index 00000000000..b5677eba4b2 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/tests/external_user_directory_config.py @@ -0,0 +1,293 @@ +from testflows.core import * + +from ldap.external_user_directory.tests.common import * +from ldap.external_user_directory.requirements import * + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_LDAPUserDirectory_MoreThanOne("2.0") +) +def more_than_one_user_directory(self, timeout=20): + """Check when more than one LDAP user directory is + defined inside a configuration file. + """ + message = "DB::Exception: Duplicate storage type 'ldap' at user_directories" + servers = { + "openldap1": { + "host": "openldap1", "port": "389", "enable_tls": "no", + "auth_dn_prefix": "cn=", "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }, + "openldap2": { + "host": "openldap2", "port": "636", "enable_tls": "yes", + "auth_dn_prefix": "cn=", "auth_dn_suffix": ",ou=users,dc=company,dc=com", + "tls_require_cert": "never" + } + } + users = [ + {"server": "openldap1", "username": "user1", "password": "user1", "login": True}, + {"server": "openldap2", "username": "user2", "password": "user2", "login": True} + ] + role = f"role_{getuid()}" + entries = [ + (["openldap1"], [(role,)]), + (["openldap2"], [(role,)]) + ] + + with ldap_servers(servers): + with rbac_roles(role) as roles: + config = create_entries_ldap_external_user_directory_config_content(entries) + + with ldap_external_user_directory(server=None, roles=None, restart=True, config=config): + with When(f"I login as {users[0]['username']} authenticated using openldap1"): + current().context.node.query(f"SELECT 1", + settings=[("user", users[0]["username"]), ("password", users[0]["password"])]) + + with And(f"I login as {users[1]['username']} authenticated using openldap2"): + current().context.node.query(f"SELECT 1", + settings=[("user", users[1]["username"]), ("password", users[1]["password"])]) + + + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Server_Empty("1.0") +) +def empty_server(self, timeout=20): + """Check that empty string in a `server` field is not allowed. + """ + message = "DB::Exception: Empty 'server' field for LDAP user directory" + servers = { + "openldap1": { + "host": "openldap1", "port": "389", "enable_tls": "no", + "auth_dn_prefix": "cn=", "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }, + } + + with ldap_servers(servers): + with rbac_roles(f"role_{getuid()}") as roles: + invalid_ldap_external_user_directory_config(server="", roles=roles, message=message, timeout=timeout) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Server_Missing("1.0") +) +def missing_server(self, timeout=20): + """Check that missing `server` field is not allowed. + """ + message = "DB::Exception: Missing 'server' field for LDAP user directory" + servers = { + "openldap1": { + "host": "openldap1", "port": "389", "enable_tls": "no", + "auth_dn_prefix": "cn=", "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }, + } + + with ldap_servers(servers): + with rbac_roles(f"role_{getuid()}") as roles: + invalid_ldap_external_user_directory_config(server=None, roles=roles, message=message, timeout=timeout) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Server_MoreThanOne("1.0") +) +def defined_twice_server(self, timeout=20): + """Check that when `server` field is defined twice that only the first + entry is used. + """ + servers = { + "openldap1": { + "host": "openldap1", "port": "389", "enable_tls": "no", + "auth_dn_prefix": "cn=", "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }, + } + user = {"server": "openldap1", "username": "user1", "password": "user1", "login": True} + + role = f"role_{getuid()}" + entries = [ + (["openldap1", "openldap2"], [(role,)]) + ] + + with ldap_servers(servers): + with rbac_roles(role) as roles: + config = create_entries_ldap_external_user_directory_config_content(entries) + with ldap_external_user_directory(server=None, roles=None, restart=True, config=config): + with When(f"I login as {user['username']} and execute query"): + current().context.node.query("SELECT 1", + settings=[("user", user["username"]), ("password", user["password"])]) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Server_Invalid("1.0") +) +def invalid_server(self, timeout=20): + """Check when `server` field value is invalid. + """ + servers = { + "openldap1": { + "host": "openldap1", "port": "389", "enable_tls": "no", + "auth_dn_prefix": "cn=", "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }, + } + user = {"server": "openldap1", "username": "user1", "password": "user1", "login": True} + role = f"role_{getuid()}" + + entries = [ + (["openldap2"], [(role,)]) + ] + + with ldap_servers(servers): + with rbac_roles(role) as roles: + config = create_entries_ldap_external_user_directory_config_content(entries) + with ldap_external_user_directory(server=None, roles=None, restart=True, config=config): + with When(f"I login as {user['username']} and execute query"): + current().context.node.query("SELECT 1", + settings=[("user", user["username"]), ("password", user["password"])], + exitcode=4, message="DB::Exception: user1: Authentication failed: password is incorrect or there is no user with such name.") + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Roles_Empty("1.0") +) +def empty_roles(self, timeout=20): + """Check when `roles` parameter is empty then user can't read any tables. + """ + message = "DB::Exception: user1: Not enough privileges." + exitcode = 241 + servers = { + "openldap1": { + "host": "openldap1", "port": "389", "enable_tls": "no", + "auth_dn_prefix": "cn=", "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }, + } + user = {"server": "openldap1", "username": "user1", "password": "user1"} + + entries = [ + (["openldap1"], [[]]) + ] + + with ldap_servers(servers): + with table(f"table_{getuid()}", "CREATE TABLE {name} (d DATE, s String, i UInt8) ENGINE = Memory()") as table_name: + config = create_entries_ldap_external_user_directory_config_content(entries) + with ldap_external_user_directory(server=None, roles=None, restart=True, config=config): + with When(f"I login as {user['username']} and execute query"): + current().context.node.query(f"SELECT * FROM {table_name} LIMIT 1", + settings=[("user", user["username"]), ("password", user["password"])], + exitcode=exitcode, message=message) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Roles_MoreThanOne("1.0") +) +def defined_twice_roles(self, timeout=20): + """Check that when `roles` is defined twice then only the first entry is used. + """ + node = self.context.node + + create_statement = "CREATE TABLE {name} (d DATE, s String, i UInt8) ENGINE = Memory()" + servers = { + "openldap1": { + "host": "openldap1", "port": "389", "enable_tls": "no", + "auth_dn_prefix": "cn=", "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }, + } + user = {"server": "openldap1", "username": "user1", "password": "user1", "login": True} + roles = [f"role0_{getuid()}", f"role1_{getuid()}"] + entries = [ + (["openldap1"], [[roles[0]],[roles[1]]]) + ] + + with ldap_servers(servers): + with rbac_roles(*roles): + with table(f"table0_{getuid()}", create_statement) as table0_name, \ + table(f"table1_{getuid()}", create_statement) as table1_name: + + with Given("I grant select privilege for the first table to the first role"): + node.query(f"GRANT SELECT ON {table0_name} TO {roles[0]}") + + with And("I grant select privilege for the second table to the second role"): + node.query(f"GRANT SELECT ON {table1_name} TO {roles[1]}") + + config = create_entries_ldap_external_user_directory_config_content(entries) + + with ldap_external_user_directory(server=None, roles=None, restart=True, config=config): + with When(f"I login as {user['username']} and try to read from the first table"): + current().context.node.query(f"SELECT * FROM {table0_name} LIMIT 1", + settings=[("user", user["username"]), ("password", user["password"])]) + + with And(f"I login as {user['username']} again and try to read from the second table"): + current().context.node.query(f"SELECT * FROM {table0_name} LIMIT 1", + settings=[("user", user["username"]), ("password", user["password"])]) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Roles_Invalid("1.0") +) +def invalid_role_in_roles(self, timeout=20): + """Check that an error is returned when LDAP users try to authenticate + if an invalid role is specified inside the `roles` section. + """ + exitcode = 4 + message = "DB::Exception: user1: Authentication failed" + + servers = { + "openldap1": { + "host": "openldap1", "port": "389", "enable_tls": "no", + "auth_dn_prefix": "cn=", "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }, + } + user = {"server": "openldap1", "username": "user1", "password": "user1"} + + with ldap_servers(servers): + with ldap_external_user_directory("openldap1", roles=["foo"], restart=True): + with When(f"I login as {user['username']} and execute query"): + current().context.node.query("SELECT 1", + settings=[("user", user["username"]), ("password", user["password"])], + exitcode=exitcode, message=message) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Roles_Missing("1.0") +) +def missing_roles(self, timeout=20): + """Check that when the `roles` are missing then + LDAP users can still login but can't read from any table. + """ + message = "DB::Exception: user1: Not enough privileges." + exitcode = 241 + servers = { + "openldap1": { + "host": "openldap1", "port": "389", "enable_tls": "no", + "auth_dn_prefix": "cn=", "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }, + } + user = {"server": "openldap1", "username": "user1", "password": "user1"} + entries = [ + (["openldap1"], None) + ] + + with ldap_servers(servers): + with table(f"table_{getuid()}", "CREATE TABLE {name} (d DATE, s String, i UInt8) ENGINE = Memory()") as table_name: + + config = create_entries_ldap_external_user_directory_config_content(entries) + + with ldap_external_user_directory(server=None, roles=None, restart=True, config=config): + with When(f"I login as {user['username']} and execute query"): + current().context.node.query(f"SELECT * FROM {table_name} LIMIT 1", + settings=[("user", user["username"]), ("password", user["password"])], + exitcode=exitcode, message=message) + +@TestFeature +@Name("external user directory config") +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Syntax("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Server("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_LDAPUserDirectory("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Definition("1.0") +) +def feature(self, node="clickhouse1"): + """Check LDAP external user directory configuration. + """ + self.context.node = self.context.cluster.node(node) + + for scenario in loads(current_module(), Scenario): + scenario() diff --git a/tests/testflows/ldap/external_user_directory/tests/restart.py b/tests/testflows/ldap/external_user_directory/tests/restart.py new file mode 100644 index 00000000000..9b688909cb2 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/tests/restart.py @@ -0,0 +1,300 @@ +import random + +from multiprocessing.dummy import Pool +from testflows.core import * +from testflows.asserts import error + +from ldap.external_user_directory.tests.common import * +from ldap.external_user_directory.requirements import * + +@TestScenario +def one_external_user_directory(self, node="clickhouse1"): + """Check that we can restart ClickHouse server when one + LDAP external user directory is configured. + """ + self.context.node = self.context.cluster.node(node) + + servers = { + "openldap1": { + "host": "openldap1", + "port": "389", + "enable_tls": "no", + "auth_dn_prefix": "cn=", + "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }, + } + + with ldap_servers(servers): + with rbac_roles("ldap_role") as roles: + with ldap_external_user_directory(server="openldap1", roles=roles, restart=True): + with Given("I login and execute query"): + login_and_execute_query(username="user1", password="user1") + + with When("I then restart the server"): + restart() + + with Then("I should be able to login and execute query after restart"): + login_and_execute_query(username="user1", password="user1") + +@TestScenario +def multiple_external_user_directories(self, node="clickhouse1"): + """Check that we can restart ClickHouse server when two + LDAP external user directory are configured. + """ + self.context.node = self.context.cluster.node(node) + + servers = { + "openldap1": { + "host": "openldap1", + "port": "389", + "enable_tls": "no", + "auth_dn_prefix": "cn=", + "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }, + "openldap2": { + "host": "openldap2", + "port": "636", + "enable_tls": "yes", + "auth_dn_prefix": "cn=", + "auth_dn_suffix": ",ou=users,dc=company,dc=com", + "tls_require_cert": "never", + } + } + + with Given("I have two LDAP servers"): + entries = [ + (["openldap1"], []), + (["openldap2"], []) + ] + + with And("I create config file to define LDAP external user directory for each LDAP server"): + config = create_entries_ldap_external_user_directory_config_content(entries) + + with ldap_servers(servers): + with ldap_external_user_directory(server=None, roles=None, restart=True, config=config): + with Given("I login and execute query using a user defined in the first LDAP server"): + login_and_execute_query(username="user1", password="user1") + + with And("I login and execute query using a user defined the second LDAP server"): + login_and_execute_query(username="user2", password="user2") + + with When("I restart the server"): + restart() + + with Then("I should be able to login and execute query again using a user defined in the first LDAP server"): + login_and_execute_query(username="user1", password="user1") + + with And("I should be able to login and execute query again using a user defined in the second LDAP server"): + login_and_execute_query(username="user2", password="user2") + +@TestScenario +def dynamically_added_users(self, node="clickhouse1", count=10): + """Check that we can restart ClickHouse server when one + LDAP external user directory is configured and the login + with an LDAP users that are dynamically added after restart. + """ + self.context.node = self.context.cluster.node(node) + + servers = { + "openldap1": { + "host": "openldap1", + "port": "389", + "enable_tls": "no", + "auth_dn_prefix": "cn=", + "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }, + } + + with ldap_servers(servers): + with rbac_roles("ldap_role") as roles: + with ldap_external_user_directory(server="openldap1", roles=roles, restart=True): + with Given("I login and execute query using existing LDAP user"): + login_and_execute_query(username="user1", password="user1") + + with When("I then restart the server"): + restart() + + with Then("after restart I should be able to login and execute query using existing LDAP user"): + login_and_execute_query(username="user1", password="user1") + + dynamic_users = [] + with When("I define dynamically added LDAP users"): + for i in range(count): + dynamic_users.append( + {"cn": f"dynamic_user{i}", "userpassword": randomword(20)} + ) + + with ldap_users(*dynamic_users, node=self.context.cluster.node("openldap1")): + with Then("I should be able to login and execute queries using dynamically added users"): + for dynamic_user in dynamic_users: + with When(f"using dynamically added user {dynamic_user['cn']}"): + login_and_execute_query(username=dynamic_user["cn"], password=dynamic_user["userpassword"]) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Restart_Server_ParallelLogins("1.0") +) +def parallel_login(self, server=None, user_count=10, timeout=200): + """Check that login of valid and invalid users works in parallel + using local users defined using RBAC and LDAP users authenticated using + multiple LDAP external user directories when server is restarted + in the middle of parallel login attempts. After server is restarted + makes sure that parallel logins work as expected. + """ + servers = { + "openldap1": { + "host": "openldap1", + "port": "389", + "enable_tls": "no", + "auth_dn_prefix": "cn=", + "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }, + "openldap2": { + "host": "openldap2", + "port": "636", + "enable_tls": "yes", + "auth_dn_prefix": "cn=", + "auth_dn_suffix": ",ou=users,dc=company,dc=com", + "tls_require_cert": "never", + } + } + + with Given("I have two LDAP servers"): + entries = [ + (["openldap1"], []), + (["openldap2"], []) + ] + + with And("I define a group of users to be created on each LDAP server"): + user_groups = { + "openldap1_users": [{"cn": f"openldap1_parallel_user{i}", "userpassword": randomword(20)} for i in + range(user_count)], + "openldap2_users": [{"cn": f"openldap2_parallel_user{i}", "userpassword": randomword(20)} for i in + range(user_count)], + "local_users": [{"cn": f"local_parallel_user{i}", "userpassword": randomword(20)} for i in + range(user_count)] + } + + @TestStep(When) + @Name("I login as {username} and execute query") + def login_and_execute_query_during_restart(self, username, password, exitcode, message, steps=True, timeout=60): + """Execute a query and ignore exitcode and message as + during restart exit codes and messages vary based on the state + of the restarted container and the ClickHouse server + and there are too many cases and complete list is not fully known + therefore trying to list all possible cases produces random fails. + """ + r = self.context.cluster.command(None, f"{self.context.cluster.docker_compose} exec {self.context.node.name} " + + f"clickhouse client -q \"SELECT 1\" --user {username} --password {password}", steps=steps, timeout=timeout) + + return r + + @TestStep(When) + @Name("I login as {username} and execute query") + def login_and_execute_query(self, username, password, exitcode=None, message=None, steps=True, timeout=60): + self.context.node.query("SELECT 1", + settings=[("user", username), ("password", password)], + exitcode=exitcode or 0, + message=message, steps=steps, timeout=timeout) + + def login_with_valid_username_and_password(users, i, iterations=10, during_restart=False): + """Login with valid username and password. + """ + query = login_and_execute_query + if during_restart: + query = login_and_execute_query_during_restart + + with When(f"valid users try to login #{i}"): + for i in range(iterations): + random_user = users[random.randint(0, len(users) - 1)] + + query(username=random_user["cn"], password=random_user["userpassword"], + exitcode=0, message="1", steps=False) + + def login_with_valid_username_and_invalid_password(users, i, iterations=10, during_restart=False): + """Login with valid username and invalid password. + """ + query = login_and_execute_query + if during_restart: + query = login_and_execute_query_during_restart + + with When(f"users try to login with valid username and invalid password #{i}"): + for i in range(iterations): + random_user = users[random.randint(0, len(users) - 1)] + + query(username=random_user["cn"], + password=(random_user["userpassword"] + randomword(1)), + exitcode=4, + message=f"DB::Exception: {random_user['cn']}: Authentication failed: password is incorrect or there is no user with such name", + steps=False) + + def login_with_invalid_username_and_valid_password(users, i, iterations=10, during_restart=False): + """Login with invalid username and valid password. + """ + query = login_and_execute_query + if during_restart: + query = login_and_execute_query_during_restart + + with When(f"users try to login with invalid username and valid password #{i}"): + for i in range(iterations): + random_user = dict(users[random.randint(0, len(users) - 1)]) + random_user["cn"] += randomword(1) + + query(username=random_user["cn"], + password=random_user["userpassword"], + exitcode=4, + message=f"DB::Exception: {random_user['cn']}: Authentication failed: password is incorrect or there is no user with such name", + steps=False) + + with And("I have a list of checks that I want to run for each user group"): + checks = [ + login_with_valid_username_and_password, + login_with_valid_username_and_invalid_password, + login_with_invalid_username_and_valid_password + ] + + with And("I create config file to define LDAP external user directory for each LDAP server"): + config = create_entries_ldap_external_user_directory_config_content(entries) + + with ldap_servers(servers): + with ldap_external_user_directory(server=None, roles=None, restart=True, config=config): + with ldap_users(*user_groups["openldap1_users"], node=self.context.cluster.node("openldap1")): + with ldap_users(*user_groups["openldap2_users"], node=self.context.cluster.node("openldap2")): + with rbac_users(*user_groups["local_users"]): + tasks = [] + try: + with When("I restart the server during parallel login of users in each group"): + p = Pool(10) + for users in user_groups.values(): + for check in checks: + tasks.append(p.apply_async(check, (users, 0, 25, True))) + + tasks.append(p.apply_async(restart)) + finally: + with Then("logins during restart should work"): + join(tasks, timeout) + + tasks = [] + try: + with When("I perform parallel login of users in each group after restart"): + p = Pool(10) + for users in user_groups.values(): + for check in checks: + tasks.append(p.apply_async(check, (users, 0, 10, False))) + finally: + with Then("logins after restart should work"): + join(tasks, timeout) + +@TestOutline(Feature) +@Name("restart") +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Restart_Server("1.0") +) +def feature(self, servers=None, server=None, node="clickhouse1"): + """Check that we can restart ClickHouse server + when one or more external user directories are configured. + """ + self.context.node = self.context.cluster.node(node) + + for scenario in loads(current_module(), Scenario): + Scenario(test=scenario, flags=TE)() diff --git a/tests/testflows/ldap/external_user_directory/tests/roles.py b/tests/testflows/ldap/external_user_directory/tests/roles.py new file mode 100644 index 00000000000..8a6c6f465d1 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/tests/roles.py @@ -0,0 +1,314 @@ +from testflows.core import * + +from ldap.external_user_directory.tests.common import * +from ldap.external_user_directory.requirements import * + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Role_New("1.0") +) +def new_role(self, server, timeout=20): + """Check that new roles can't be assigned to any LDAP user + authenticated using external user directory. + """ + node = self.context.node + uid = getuid() + + self.context.ldap_node = self.context.cluster.node(server) + + users = [ + {"username": f"user0_{uid}", "password": "user0_password"}, + {"username": f"user1_{uid}", "password": "user1_password"} + ] + + with rbac_roles(f"role0_{uid}", f"role1_{uid}") as roles: + with table(f"table_{getuid()}", "CREATE TABLE {name} (d DATE, s String, i UInt8) ENGINE = Memory()") as table_name: + with ldap_external_user_directory(server=server, roles=roles, restart=True): + with ldap_users(*[{"cn": user["username"], "userpassword": user["password"]} for user in users]): + + with When(f"I login and execute query simple query to cache the LDAP user"): + node.query(f"SELECT 1", + settings=[("user", users[0]["username"]), ("password", users[0]["password"])]) + + with rbac_roles(f"new_role0_{uid}") as new_roles: + + message = "DB::Exception: Cannot update user `{user}` in ldap because this storage is readonly" + exitcode = 239 + + with And("I try to grant new role to the cached LDAP user"): + node.query(f"GRANT {new_roles[0]} TO {users[0]['username']}", + exitcode=exitcode, message=message.format(user=users[0]["username"])) + + message = "DB::Exception: There is no role `{user}` in user directories" + exitcode = 255 + + with And("I try to grant new role to the non-cached LDAP user"): + node.query(f"GRANT {new_roles[0]} TO {users[1]['username']}", + exitcode=exitcode, message=message.format(user=users[1]["username"])) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Role_NewPrivilege("1.0") +) +def add_privilege(self, server, timeout=20): + """Check that we can add privilege to a role used + in the external user directory configuration. + """ + node = self.context.node + uid = getuid() + message = "DB::Exception: {user}: Not enough privileges." + exitcode = 241 + + self.context.ldap_node = self.context.cluster.node(server) + + users = [ + {"username": f"user0_{uid}", "password": "user0_password"}, + {"username": f"user1_{uid}", "password": "user1_password"} + ] + + with rbac_roles(f"role0_{uid}", f"role1_{uid}") as roles: + with table(f"table_{getuid()}", "CREATE TABLE {name} (d DATE, s String, i UInt8) ENGINE = Memory()") as table_name: + with ldap_external_user_directory(server=server, roles=roles, restart=True): + with ldap_users(*[{"cn": user["username"], "userpassword": user["password"]} for user in users]): + + with When(f"I login and execute query that requires no privileges"): + node.query(f"SELECT 1", + settings=[("user", users[0]["username"]), ("password", users[0]["password"])]) + + with And(f"I login and try to read from the table without having select privilege"): + node.query(f"SELECT * FROM {table_name} LIMIT 1", + settings=[("user", users[0]["username"]), ("password", users[0]["password"])], + exitcode=exitcode, message=message.format(user=users[0]["username"])) + + with When(f"I grant select privilege to one of the two roles assigned to LDAP users"): + node.query(f"GRANT SELECT ON {table_name} TO {roles[0]}") + + with And(f"I login again and expect that cached LDAP user can successfully read from the table"): + node.query(f"SELECT * FROM {table_name} LIMIT 1", + settings=[("user", users[0]["username"]), ("password", users[0]["password"])]) + + with And(f"I login again and expect that non-cached LDAP user can successfully read from the table"): + node.query(f"SELECT * FROM {table_name} LIMIT 1", + settings=[("user", users[1]["username"]), ("password", users[1]["password"])]) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Role_RemovedPrivilege("1.0") +) +def remove_privilege(self, server, timeout=20): + """Check that we can remove privilege from a role used + in the external user directory configuration. + """ + node = self.context.node + uid = getuid() + message = "DB::Exception: {user}: Not enough privileges." + exitcode = 241 + + self.context.ldap_node = self.context.cluster.node(server) + + users = [ + {"username": f"user0_{uid}", "password": "user0_password"}, + {"username": f"user1_{uid}", "password": "user1_password"} + ] + + with rbac_roles(f"role0_{uid}", f"role1_{uid}") as roles: + with table(f"table_{getuid()}", "CREATE TABLE {name} (d DATE, s String, i UInt8) ENGINE = Memory()") as table_name: + + with When(f"I grant select privilege to one of the two roles assigned to LDAP users"): + node.query(f"GRANT SELECT ON {table_name} TO {roles[0]}") + + with ldap_external_user_directory(server=server, roles=roles, restart=True): + with ldap_users(*[{"cn": user["username"], "userpassword": user["password"]} for user in users]): + + with When(f"I login then LDAP user should be able to read from the table"): + node.query(f"SELECT * FROM {table_name} LIMIT 1", + settings=[("user", users[0]["username"]), ("password", users[0]["password"])]) + + with When(f"I revoke select privilege from all the roles assigned to LDAP users"): + node.query(f"REVOKE SELECT ON {table_name} FROM {roles[0]}") + + with When(f"I login again then cached LDAP user should not be able to read from the table"): + node.query(f"SELECT * FROM {table_name} LIMIT 1", + settings=[("user", users[0]["username"]), ("password", users[0]["password"])], + exitcode=exitcode, message=message.format(user=users[0]["username"])) + + with When(f"I login with non-cached LDAP user then the user should also not be able to read from the table"): + node.query(f"SELECT * FROM {table_name} LIMIT 1", + settings=[("user", users[1]["username"]), ("password", users[1]["password"])], + exitcode=exitcode, message=message.format(user=users[1]["username"])) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Role_Removed("1.0") +) +def remove_role(self, server, timeout=20): + """Check that when a role used in the external user directory configuration + is dynamically removed then any non-cached LDAP users should not be authenticated using + LDAP external user directory. + """ + node = self.context.node + uid = getuid() + exitcode = 4 + message = "DB::Exception: {user}: Authentication failed: password is incorrect or there is no user with such name" + + self.context.ldap_node = self.context.cluster.node(server) + + users = [ + {"username": f"user0_{uid}", "password": "user0_password"}, + {"username": f"user1_{uid}", "password": "user1_password"} + ] + + with rbac_roles(f"role0_{uid}", f"role1_{uid}") as roles: + with ldap_external_user_directory(server=server, roles=roles, restart=True): + with ldap_users(*[{"cn": user["username"], "userpassword": user["password"]} for user in users]): + with When(f"I login and execute query that requires no privileges"): + node.query(f"SELECT 1", + settings=[("user", users[0]["username"]), ("password", users[0]["password"])]) + + with And("I remove one of the roles"): + node.query(f"DROP ROLE {roles[1]}") + + with And(f"I try to login using cached LDAP user"): + node.query(f"SELECT 1", + settings=[("user", users[0]["username"]), ("password", users[0]["password"])]) + + with And(f"I try to login again using non-cached LDAP user"): + node.query(f"SELECT 1", + settings=[("user", users[1]["username"]), ("password", users[1]["password"])], + exitcode=exitcode, message=message.format(user=users[1]["username"])) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Role_Removed_Privileges("1.0") +) +def remove_privilege_by_removing_role(self, server, timeout=20): + """Check that when the role used in the external user directory configuration + is dynamically removed then privileges are removed from all + LDAP users that are authenticated using external user directory. + """ + node = self.context.node + message = "DB::Exception: {user}: Not enough privileges." + exitcode = 241 + uid = getuid() + + self.context.ldap_node = self.context.cluster.node(server) + + users = [ + {"username": f"user0_{uid}", "password": "user0_password"}, + {"username": f"user1_{uid}", "password": "user1_password"} + ] + + with rbac_roles(f"role0_{uid}", f"role1_{uid}") as roles: + with table(f"table_{getuid()}", "CREATE TABLE {name} (d DATE, s String, i UInt8) ENGINE = Memory()") as table_name: + + with When(f"I grant select privilege to one of the two roles assigned to LDAP users"): + node.query(f"GRANT SELECT ON {table_name} TO {roles[0]}") + + with ldap_external_user_directory(server=server, roles=roles, restart=True): + with ldap_users(*[{"cn": user["username"], "userpassword": user["password"]} for user in users]): + + with When(f"I login and expect that LDAP user can read from the table"): + node.query(f"SELECT * FROM {table_name} LIMIT 1", + settings=[("user", users[0]["username"]), ("password", users[0]["password"])]) + + with And("I remove the role that grants the privilege"): + node.query(f"DROP ROLE {roles[0]}") + + with And(f"I try to relogin and expect that cached LDAP user can login " + "but does not have privilege that was provided by the removed role"): + node.query(f"SELECT * FROM {table_name} LIMIT 1", + settings=[("user", users[0]["username"]), ("password", users[0]["password"])], + exitcode=exitcode, message=message.format(user=users[0]["username"])) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Role_Readded_Privileges("1.0") +) +def readd_privilege_by_readding_role(self, server, timeout=20): + """Check that when the role used in the external user directory configuration + is dynamically removed then all the privileges are removed from any + LDAP users authenticated using external user directory but when the role is re-added + then privileges are restored and non-cached users can login again. + """ + node = self.context.node + uid = getuid() + + self.context.ldap_node = self.context.cluster.node(server) + + users = [ + {"username": f"user0_{uid}", "password": "user0_password"}, + {"username": f"user1_{uid}", "password": "user1_password"} + ] + + with rbac_roles(f"role0_{uid}", f"role1_{uid}") as roles: + with table(f"table_{getuid()}", "CREATE TABLE {name} (d DATE, s String, i UInt8) ENGINE = Memory()") as table_name: + + with When(f"I grant select privilege to one of the two roles assigned to LDAP users"): + node.query(f"GRANT SELECT ON {table_name} TO {roles[0]}") + + with ldap_external_user_directory(server=server, roles=roles, restart=True): + with ldap_users(*[{"cn": user["username"], "userpassword": user["password"]} for user in users]): + + with When(f"I login and expect that LDAP user can read from the table"): + node.query(f"SELECT * FROM {table_name} LIMIT 1", + settings=[("user", users[0]["username"]), ("password", users[0]["password"])]) + + with And("I remove the role that grants the privilege"): + node.query(f"DROP ROLE {roles[0]}") + + message = "DB::Exception: {user}: Not enough privileges." + exitcode = 241 + + with And(f"I try to relogin and expect that cached LDAP user can login " + "but does not have privilege that was provided by the removed role"): + node.query(f"SELECT * FROM {table_name} LIMIT 1", + settings=[("user", users[0]["username"]), ("password", users[0]["password"])], + exitcode=exitcode, message=message.format(user=users[0]["username"])) + + message = "DB::Exception: {user}: Authentication failed: password is incorrect or there is no user with such name" + exitcode = 4 + + with And(f"I try to login using non-cached LDAP user and expect it to fail"): + node.query(f"SELECT 1", + settings=[("user", users[1]["username"]), ("password", users[1]["password"])], + exitcode=exitcode, message=message.format(user=users[1]["username"])) + + with When("I re-add the role"): + node.query(f"CREATE ROLE {roles[0]}") + + with And(f"I grant select privilege to the re-added role"): + node.query(f"GRANT SELECT ON {table_name} TO {roles[0]}") + + with And(f"I try to relogin and expect that cached LDAP user can login " + "and again has the privilege that is provided by the role"): + node.query(f"SELECT * FROM {table_name} LIMIT 1", + settings=[("user", users[0]["username"]), ("password", users[0]["password"])]) + + with And("I try to login using non-cached LDAP expect it to work " + "with user also having privilege provided by the role"): + node.query(f"SELECT * FROM {table_name} LIMIT 1", + settings=[("user", users[1]["username"]), ("password", users[1]["password"])]) + +@TestFeature +@Name("roles") +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Users_Parameters_Roles("1.0") +) +def feature(self, node="clickhouse1"): + """Check that all the users that are authenticated using + LDAP external user directory are assigned the roles specified + in the configuration of the LDAP external user directory. + """ + self.context.node = self.context.cluster.node(node) + + servers = { + "openldap1": { + "host": "openldap1", "port": "389", "enable_tls": "no", + "auth_dn_prefix": "cn=", "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }, + } + user = {"server": "openldap1", "username": "user1", "password": "user1"} + + with ldap_servers(servers): + for scenario in loads(current_module(), Scenario): + scenario(server="openldap1") diff --git a/tests/testflows/ldap/external_user_directory/tests/server_config.py b/tests/testflows/ldap/external_user_directory/tests/server_config.py new file mode 100644 index 00000000000..5df343b53df --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/tests/server_config.py @@ -0,0 +1,286 @@ +import time + +from testflows.core import * + +from ldap.external_user_directory.tests.common import * +from ldap.external_user_directory.requirements import * + +from ldap.authentication.tests.common import invalid_server_config + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Invalid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Name("1.0") +) +def empty_server_name(self, timeout=60): + """Check that empty string as a server name is not allowed. + """ + servers = {"": {"host": "foo", "port": "389", "enable_tls": "no", + "auth_dn_prefix": "cn=", "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }} + invalid_server_config(servers, timeout=timeout) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Invalid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Connection_Authentication_UnreachableServer("1.0") +) +def invalid_host(self): + """Check that server returns an error when LDAP server + host name is invalid. + """ + servers = {"foo": {"host": "foo", "port": "389", "enable_tls": "no"}} + users = [{ + "server": "foo", "username": "user1", "password": "user1", "login": True, + "exitcode": 4, "message": "DB::Exception: user1: Authentication failed: password is incorrect or there is no user with such name." + }] + login(servers, "foo", *users) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Invalid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Host("1.0") +) +def empty_host(self, tail=20, timeout=60): + """Check that server returns an error when LDAP server + host value is empty. + """ + node = current().context.node + message = "DB::Exception: Empty 'host' entry" + + servers = {"foo": {"host": "", "port": "389", "enable_tls": "no"}} + + invalid_server_config(servers, message=message, tail=16, timeout=timeout) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Invalid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Host("1.0") +) +def missing_host(self, tail=20, timeout=60): + """Check that server returns an error when LDAP server + host is missing. + """ + node = current().context.node + message = "DB::Exception: Missing 'host' entry" + + servers = {"foo": {"port": "389", "enable_tls": "no"}} + users = [{ + "server": "foo", "username": "user1", "password": "user1", "login": True, + "exitcode": 36, "message": "DB::Exception: LDAP server 'foo' is not configured." + }] + + with Given("I prepare the error log by writting empty lines into it"): + node.command("echo -e \"%s\" > /var/log/clickhouse-server/clickhouse-server.err.log" % ("-\\n" * tail)) + + with ldap_servers(servers): + with Then("server shall fail to merge the new config"): + started = time.time() + command = f"tail -n {tail} /var/log/clickhouse-server/clickhouse-server.err.log | grep \"{message}\"" + while time.time() - started < timeout: + exitcode = node.command(command, steps=False).exitcode + if exitcode == 0: + break + time.sleep(1) + assert exitcode == 0, error() + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Invalid("1.0"), +) +def invalid_port(self): + """Check that server returns an error when LDAP server + port is not valid. + """ + servers = {"openldap1": {"host": "openldap1", "port": "3890", "enable_tls": "no"}} + users = [{ + "server": "openldap1", "username": "user1", "password": "user1", "login": True, + "exitcode": 4, "message": "DB::Exception: user1: Authentication failed: password is incorrect or there is no user with such name." + }] + login(servers, "openldap1", *users) + + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Invalid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_AuthDN_Prefix("1.0") +) +def invalid_auth_dn_prefix(self): + """Check that server returns an error when LDAP server definition + has invalid auth_dn_prefix. + """ + servers = {"openldap1": {"host": "openldap1", "port": "389", "enable_tls": "no", + "auth_dn_prefix": "foo=", "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }} + users = [{ + "server": "openldap1", "username": "user1", "password": "user1", "login": True, + "exitcode": 4, "message": "DB::Exception: user1: Authentication failed: password is incorrect or there is no user with such name." + }] + login(servers, "openldap1", *users) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Invalid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_AuthDN_Suffix("1.0") +) +def invalid_auth_dn_suffix(self): + """Check that server returns an error when LDAP server definition + has invalid auth_dn_suffix. + """ + servers = {"openldap1": {"host": "openldap1", "port": "389", "enable_tls": "no", + "auth_dn_prefix": "cn=", "auth_dn_suffix": ",foo=users,dc=company,dc=com" + }} + users = [{ + "server": "openldap1", "username": "user1", "password": "user1", "login": True, + "exitcode": 4, "message": "DB::Exception: user1: Authentication failed: password is incorrect or there is no user with such name." + }] + login(servers, "openldap1", *users) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Invalid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_EnableTLS("1.0") +) +def invalid_enable_tls_value(self, timeout=60): + """Check that server returns an error when enable_tls + option has invalid value. + """ + message = "Syntax error: Cannot convert to boolean: foo" + servers = {"openldap1": {"host": "openldap1", "port": "389", "enable_tls": "foo", + "auth_dn_prefix": "cn=", "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }} + invalid_server_config(servers, message=message, tail=17, timeout=timeout) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Invalid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSRequireCert("1.0") +) +def invalid_tls_require_cert_value(self): + """Check that server returns an error when tls_require_cert + option has invalid value. + """ + servers = {"openldap2": { + "host": "openldap2", "port": "636", "enable_tls": "yes", + "auth_dn_prefix": "cn=", "auth_dn_suffix": ",ou=users,dc=company,dc=com", + "tls_require_cert": "foo", + "ca_cert_dir": "/container/service/slapd/assets/certs/", + "ca_cert_file": "/container/service/slapd/assets/certs/ca.crt" + }} + users = [{ + "server": "openldap2", "username": "user2", "password": "user2", "login": True, + "exitcode": 4, "message": "DB::Exception: user2: Authentication failed: password is incorrect or there is no user with such name." + }] + login(servers, "openldap2", *users) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Invalid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSCACertDir("1.0") +) +def empty_ca_cert_dir(self): + """Check that server returns an error when ca_cert_dir is empty. + """ + servers = {"openldap2": {"host": "openldap2", "port": "636", "enable_tls": "yes", + "auth_dn_prefix": "cn=", "auth_dn_suffix": ",ou=users,dc=company,dc=com", + "tls_require_cert": "demand", + "ca_cert_dir": "", + "ca_cert_file": "/container/service/slapd/assets/certs/ca.crt" + }} + users = [{ + "server": "openldap2", "username": "user2", "password": "user2", "login": True, + "exitcode": 4, + "message": "DB::Exception: user2: Authentication failed: password is incorrect or there is no user with such name" + }] + login(servers, "openldap2", *users) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Invalid("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_TLSCertFile("1.0") +) +def empty_ca_cert_file(self): + """Check that server returns an error when ca_cert_file is empty. + """ + servers = {"openldap2": {"host": "openldap2", "port": "636", "enable_tls": "yes", + "auth_dn_prefix": "cn=", "auth_dn_suffix": ",ou=users,dc=company,dc=com", + "tls_require_cert": "demand", + "ca_cert_dir": "/container/service/slapd/assets/certs/", + "ca_cert_file": "" + }} + users = [{ + "server": "openldap2", "username": "user2", "password": "user2", "login": True, + "exitcode": 4, + "message": "DB::Exception: user2: Authentication failed: password is incorrect or there is no user with such name." + }] + login(servers, "openldap2", *users) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_AuthDN_Value("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_AuthDN_Prefix("1.0"), + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_AuthDN_Suffix("1.0") +) +def auth_dn_value(self): + """Check that server configuration can properly define the `dn` value of the user.""" + servers = { + "openldap1": { + "host": "openldap1", "port": "389", "enable_tls": "no", + "auth_dn_prefix": "cn=", "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }} + user = {"server": "openldap1", "username": "user1", "password": "user1", "login": True} + + login(servers, "openldap1", user) + +@TestScenario +@Requirements( + RQ_SRS_009_LDAP_ExternalUserDirectory_Configuration_Server_Syntax("1.0") +) +def syntax(self): + """Check that server configuration with valid syntax can be loaded. + ```xml + + + localhost + 636 + cn= + , ou=users, dc=example, dc=com + yes + tls1.2 + demand + /path/to/tls_cert_file + /path/to/tls_key_file + /path/to/tls_ca_cert_file + /path/to/tls_ca_cert_dir + ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:AES256-GCM-SHA384 + + + ``` + """ + servers = { + "openldap2": { + "host": "openldap2", + "port": "389", + "auth_dn_prefix": "cn=", + "auth_dn_suffix": ",ou=users,dc=company,dc=com", + "enable_tls": "yes", + "tls_minimum_protocol_version": "tls1.2" , + "tls_require_cert": "demand", + "tls_cert_file": "/container/service/slapd/assets/certs/ldap.crt", + "tls_key_file": "/container/service/slapd/assets/certs/ldap.key", + "tls_ca_cert_file": "/container/service/slapd/assets/certs/ca.crt", + "tls_ca_cert_dir": "/container/service/slapd/assets/certs/", + "tls_cipher_suite": "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:AES256-GCM-SHA384" + } + } + with ldap_servers(servers): + pass + +@TestFeature +@Name("server config") +def feature(self, node="clickhouse1"): + """Check LDAP server configuration. + """ + self.context.node = self.context.cluster.node(node) + for scenario in loads(current_module(), Scenario): + scenario() diff --git a/tests/testflows/ldap/external_user_directory/tests/simple.py b/tests/testflows/ldap/external_user_directory/tests/simple.py new file mode 100644 index 00000000000..c48048833c7 --- /dev/null +++ b/tests/testflows/ldap/external_user_directory/tests/simple.py @@ -0,0 +1,24 @@ +from testflows.core import * +from testflows.asserts import error + +from ldap.external_user_directory.tests.common import login + +@TestScenario +@Name("simple") +def scenario(self, node="clickhouse1"): + """Check that an LDAP external user directory can be used to authenticate a user. + """ + self.context.node = self.context.cluster.node(node) + servers = { + "openldap1": { + "host": "openldap1", + "port": "389", + "enable_tls": "no", + "auth_dn_prefix": "cn=", + "auth_dn_suffix": ",ou=users,dc=company,dc=com" + }, + } + users = [ + {"server": "openldap1", "username": "user1", "password": "user1", "login": True}, + ] + login(servers, "openldap1", *users) diff --git a/tests/testflows/ldap/regression.py b/tests/testflows/ldap/regression.py index 567807fc0a8..0e9d06cf84a 100755 --- a/tests/testflows/ldap/regression.py +++ b/tests/testflows/ldap/regression.py @@ -2,53 +2,20 @@ import sys from testflows.core import * -append_path(sys.path, "..") +append_path(sys.path, "..") -from helpers.cluster import Cluster from helpers.argparser import argparser -from ldap.requirements import * -# Cross-outs of known fails -xfails = { - "connection protocols/tls/tls_require_cert='try'": - [(Fail, "can't be tested with self-signed certificates")], - "connection protocols/tls/tls_require_cert='demand'": - [(Fail, "can't be tested with self-signed certificates")], - "connection protocols/starttls/tls_require_cert='try'": - [(Fail, "can't be tested with self-signed certificates")], - "connection protocols/starttls/tls_require_cert='demand'": - [(Fail, "can't be tested with self-signed certificates")], - "connection protocols/tls require cert default demand": - [(Fail, "can't be tested with self-signed certificates")], - "connection protocols/starttls with custom port": - [(Fail, "it seems that starttls is not enabled by default on custom plain-text ports in LDAP server")], - "connection protocols/tls cipher suite": - [(Fail, "can't get it to work")] -} - -@TestFeature -@Name("ldap authentication") +@TestModule +@Name("ldap") @ArgumentParser(argparser) -@Requirements( - RQ_SRS_007_LDAP_Authentication("1.0") -) -@XFails(xfails) def regression(self, local, clickhouse_binary_path): - """ClickHouse integration with LDAP regression module. + """ClickHouse LDAP integration regression module. """ - nodes = { - "clickhouse": ("clickhouse1", "clickhouse2", "clickhouse3"), - } - - with Cluster(local, clickhouse_binary_path, nodes=nodes) as cluster: - self.context.cluster = cluster + args = {"local": local, "clickhouse_binary_path": clickhouse_binary_path} - Scenario(run=load("ldap.tests.sanity", "scenario")) - Scenario(run=load("ldap.tests.multiple_servers", "scenario")) - Feature(run=load("ldap.tests.connections", "feature")) - Feature(run=load("ldap.tests.server_config", "feature")) - Feature(run=load("ldap.tests.user_config", "feature")) - Feature(run=load("ldap.tests.authentications", "feature")) + Feature(test=load("ldap.authentication.regression", "regression"))(**args) + Feature(test=load("ldap.external_user_directory.regression", "regression"))(**args) if main(): regression() diff --git a/tests/testflows/regression.py b/tests/testflows/regression.py index a80ae7fc07b..6f1a5acab14 100755 --- a/tests/testflows/regression.py +++ b/tests/testflows/regression.py @@ -17,6 +17,7 @@ def regression(self, local, clickhouse_binary_path): Feature(test=load("example.regression", "regression"))(**args) Feature(test=load("ldap.regression", "regression"))(**args) Feature(test=load("rbac.regression", "regression"))(**args) + Feature(test=load("aes_encryption.regression", "regression"))(**args) if main(): regression() diff --git a/tests/ubsan_suppressions.txt b/tests/ubsan_suppressions.txt new file mode 100644 index 00000000000..c29da437a11 --- /dev/null +++ b/tests/ubsan_suppressions.txt @@ -0,0 +1,3 @@ +# Suppress some failures in contrib so that we can enable UBSan in CI. +# Ideally, we should report these upstream. +src:*/contrib/openssl/* \ No newline at end of file