Merge remote-tracking branch 'upstream/narthex' into feat/narthex-instant-eval-pr

# Conflicts:
#	src/promql/src/lib.rs
This commit is contained in:
discord9
2026-10-18 09:55:27 +08:00
60 changed files with 35482 additions and 55 deletions
Generated
+2
View File
@@ -11370,6 +11370,8 @@ dependencies = [
"lazy_static",
"prometheus 0.14.0",
"prost 0.14.1",
"rand 0.9.4",
"regex",
"snafu 0.8.6",
"tokio",
]
+4
View File
@@ -140,6 +140,7 @@
| `procedure.retry_delay` | String | `500ms` | Initial retry delay of procedures, increases exponentially |
| `procedure.max_running_procedures` | Integer | `128` | Max running procedures.<br/>The maximum number of procedures that can be running at the same time.<br/>If the number of running procedures exceeds this limit, the procedure will be rejected. |
| `query` | -- | -- | The query engine options. |
| `query.experimental_native_promql` | Bool | `false` | Whether to enable experimental native PromQL execution.<br/>Default: false |
| `query.parallelism` | Integer | `0` | Parallelism of the query engine.<br/>Default to 0, which means the number of CPU cores. |
| `query.memory_pool_size` | String | 0 | Memory pool size for query execution operators (aggregation, sorting, join).<br/>Supports absolute size (e.g., "2GB", "4GB") or percentage of system memory (e.g., "20%").<br/>Setting it to 0 disables the limit. Defaults to 0 (unlimited); this example sets it to `50%`.<br/>When this limit is reached, queries will fail with ResourceExhausted error.<br/>NOTE: This does NOT limit memory used by table scans. |
| `query.experimental_memory_pool_policy` | String | `greedy` | Experimental memory pool allocation policy:<br/>- "greedy" (default): first-come-first-served allocation; preserves current behavior.<br/>- "fair": divides available memory among spillable operators and may spill earlier.<br/>Only effective when `memory_pool_size` is bounded (>0). |
@@ -383,6 +384,7 @@
| `meta_client.metadata_cache_ttl` | String | `10m` | TTL of the metadata cache. |
| `meta_client.metadata_cache_tti` | String | `5m` | -- |
| `query` | -- | -- | The query engine options. |
| `query.experimental_native_promql` | Bool | `false` | Whether to enable experimental native PromQL execution.<br/>Default: false |
| `query.parallelism` | Integer | `0` | Parallelism of the query engine.<br/>Default to 0, which means the number of CPU cores. |
| `query.allow_query_fallback` | Bool | `false` | Whether to allow query fallback when push down optimize fails.<br/>Default to false, meaning when push down optimize failed, return error msg |
| `query.memory_pool_size` | String | 0 | Memory pool size for query execution operators (aggregation, sorting, join).<br/>Supports absolute size (e.g., "4GB", "8GB") or percentage of system memory (e.g., "30%").<br/>Setting it to 0 disables the limit. Defaults to 0 (unlimited); this example sets it to `50%`.<br/>When this limit is reached, queries will fail with ResourceExhausted error.<br/>NOTE: This does NOT limit memory used by table scans (only applies to datanodes). |
@@ -613,6 +615,7 @@
| `wal.max_unpersisted_age` | String | `8s` | The age of the oldest unpersisted entry at which new appends stall until an upload completes, in `enqueued` mode.<br/>**It's only used when the provider is `experimental_object_store` and `ack_mode` is `enqueued`**. |
| `wal.on_corrupted_segment` | String | `skip` | What a read does with a segment that still does not decode after a second fetch, because its checksum does not match or its content disagrees with its footer entry.<br/>- `skip`: the segment is skipped and recorded as a WAL hole of its region, a metric is incremented and a warning is logged; the other regions of the object are unaffected (the default).<br/>- `fail`: the read fails, so the region does not open.<br/>**It's only used when the provider is `experimental_object_store`**. |
| `query` | -- | -- | The query engine options. |
| `query.experimental_native_promql` | Bool | `false` | Whether to enable experimental native PromQL execution.<br/>Default: false |
| `query.parallelism` | Integer | `0` | Parallelism of the query engine.<br/>Default to 0, which means the number of CPU cores. |
| `query.memory_pool_size` | String | 0 | Memory pool size for query execution operators (aggregation, sorting, join).<br/>Supports absolute size (e.g., "2GB", "4GB") or percentage of system memory (e.g., "20%").<br/>Setting it to 0 disables the limit. Defaults to 0 (unlimited); this example sets it to `50%`.<br/>When this limit is reached, queries will fail with ResourceExhausted error.<br/>NOTE: This does NOT limit memory used by table scans. |
| `query.experimental_memory_pool_policy` | String | `greedy` | Experimental memory pool allocation policy:<br/>- "greedy" (default): first-come-first-served allocation; preserves current behavior.<br/>- "fair": divides available memory among spillable operators and may spill earlier.<br/>Only effective when `memory_pool_size` is bounded (>0). |
@@ -799,6 +802,7 @@
| `tracing` | -- | -- | The tracing options. Only effect when compiled with `tokio-console` feature. |
| `tracing.tokio_console_addr` | String | Unset | The tokio console address. |
| `query` | -- | -- | -- |
| `query.experimental_native_promql` | Bool | `false` | Whether to enable experimental native PromQL execution.<br/>Default: false |
| `query.parallelism` | Integer | `1` | Parallelism of the query engine for query sent by flownode.<br/>Default to 1, so it won't use too much cpu or memory |
| `query.memory_pool_size` | String | 0 | Memory pool size for query execution operators (aggregation, sorting, join).<br/>Supports absolute size (e.g., "1GB", "2GB") or percentage of system memory (e.g., "20%").<br/>Setting it to 0 disables the limit. Defaults to 0 (unlimited); this example sets it to `50%`.<br/>When this limit is reached, queries will fail with ResourceExhausted error.<br/>NOTE: This does NOT limit memory used by table scans. |
| `query.experimental_memory_pool_policy` | String | `greedy` | Experimental memory pool allocation policy:<br/>- "greedy" (default): first-come-first-served allocation; preserves current behavior.<br/>- "fair": divides available memory among spillable operators and may spill earlier.<br/>Only effective when `memory_pool_size` is bounded (>0). |
+4
View File
@@ -326,6 +326,10 @@ overwrite_entry_start_id = false
## The query engine options.
[query]
## Whether to enable experimental native PromQL execution.
## Default: false
#+ experimental_native_promql = false
## Parallelism of the query engine.
## Default to 0, which means the number of CPU cores.
parallelism = 0
+4
View File
@@ -151,6 +151,10 @@ default_ratio = 1.0
#+ tokio_console_addr = "127.0.0.1"
[query]
## Whether to enable experimental native PromQL execution.
## Default: false
#+ experimental_native_promql = false
## Parallelism of the query engine for query sent by flownode.
## Default to 1, so it won't use too much cpu or memory
parallelism = 1
+4
View File
@@ -359,6 +359,10 @@ metadata_cache_tti = "5m"
## The query engine options.
[query]
## Whether to enable experimental native PromQL execution.
## Default: false
#+ experimental_native_promql = false
## Parallelism of the query engine.
## Default to 0, which means the number of CPU cores.
parallelism = 0
+4
View File
@@ -537,6 +537,10 @@ max_running_procedures = 128
## The query engine options.
[query]
## Whether to enable experimental native PromQL execution.
## Default: false
#+ experimental_native_promql = false
## Parallelism of the query engine.
## Default to 0, which means the number of CPU cores.
parallelism = 0
+66 -4
View File
@@ -29,9 +29,11 @@ use std::task::{Context, Poll};
use common_error::ext::BoxedError;
use common_recordbatch::{DfRecordBatch, DfSendableRecordBatchStream};
use datafusion_common::DataFusionError;
use datatypes::arrow::datatypes::{Schema as ArrowSchema, SchemaRef as ArrowSchemaRef};
use datatypes::error::InvalidSeriesSnafu;
use datatypes::series::frame::{
RawLabelMode, RawSeriesChunkCursor, RawSeriesFrameBuilder, RawSeriesFrameDecoder,
raw_series_frame_schema,
};
use datatypes::series::raw::RawSeriesChunk;
use datatypes::series::samples::SeriesSchema;
@@ -42,6 +44,48 @@ use store_api::region_engine::{RawLabelSource, RawSeriesStream, SendableRawSerie
#[cfg(test)]
mod tests;
const ORDERING_KEY: &str = "greptime.series.ordering";
/// Builds the canonical raw frame schema with the producer's guaranteed ordering.
///
/// Ordering records a producer guarantee; it is not inferred from frame contents. `Interleaved`
/// has no v1 wire representation and is rejected before the schema is assembled.
pub fn raw_series_frame_schema_with_ordering(
schema: &SeriesSchema,
mode: RawLabelMode,
ordering: SeriesOrdering,
) -> datafusion_common::Result<ArrowSchemaRef> {
let ordering = match ordering {
SeriesOrdering::Contiguous => "contiguous",
SeriesOrdering::KeyThenTime => "read_key_then_time",
SeriesOrdering::Interleaved => {
return Err(invalid(
"interleaved raw series ordering has no wire representation",
));
}
};
let schema = raw_series_frame_schema(schema, mode).map_err(codec_error)?;
let mut metadata = schema.metadata().clone();
metadata.insert(ORDERING_KEY.to_string(), ordering.to_string());
Ok(Arc::new(ArrowSchema::new_with_metadata(
schema.fields().clone(),
metadata,
)))
}
/// Reads the declared producer ordering, conservatively treating legacy frames as contiguous.
///
/// Only the two orderings representable on the wire can be returned.
pub fn raw_series_frame_ordering(
schema: &ArrowSchema,
) -> datafusion_common::Result<SeriesOrdering> {
match schema.metadata().get(ORDERING_KEY).map(String::as_str) {
None | Some("contiguous") => Ok(SeriesOrdering::Contiguous),
Some("read_key_then_time") => Ok(SeriesOrdering::KeyThenTime),
Some(_) => Err(invalid("unknown raw series ordering")),
}
}
/// Packs a storage raw-series stream into DataFusion record batches incrementally.
///
/// Only [`SeriesOrdering::Contiguous`] and [`SeriesOrdering::KeyThenTime`] streams are
@@ -59,6 +103,9 @@ pub fn pack_raw_series(
let schema = source.schema().clone();
let label_source = source.label_source().clone();
let mode = label_mode(&label_source);
// The declared frame schema carries the producer ordering; the shared builder's schema
// intentionally omits it, so every ready batch is declared before it is yielded.
let frame_schema = raw_series_frame_schema_with_ordering(&schema, mode, ordering)?;
let builder = RawSeriesFrameBuilder::try_new(
&schema,
mode,
@@ -66,7 +113,6 @@ pub fn pack_raw_series(
RawSeriesFrameBuilder::DEFAULT_MAX_BYTES,
)
.map_err(codec_error)?;
let frame_schema = builder.schema().clone();
Ok(Box::pin(PackStream {
source: Some(source),
schema,
@@ -265,6 +311,22 @@ impl PackStream {
None => Ok(None),
}
}
/// Publishes one ready builder batch under the declared frame schema, which is the shared
/// builder's schema plus the producer's ordering metadata. A batch whose fields cannot be
/// declared releases the stream instead of yielding rows with an undeclared layout.
fn declare_batch(
&mut self,
batch: DfRecordBatch,
) -> Poll<Option<datafusion_common::Result<DfRecordBatch>>> {
match batch.with_schema(self.frame_schema.clone()) {
Ok(batch) => Poll::Ready(Some(Ok(batch))),
Err(error) => {
self.finish();
Poll::Ready(Some(Err(DataFusionError::from(error))))
}
}
}
}
impl Stream for PackStream {
@@ -274,7 +336,7 @@ impl Stream for PackStream {
let this = &mut *self;
loop {
match this.advance_cursor() {
Ok(Some(batch)) => return Poll::Ready(Some(Ok(batch))),
Ok(Some(batch)) => return this.declare_batch(batch),
Ok(None) => {}
Err(error) => {
this.finish();
@@ -289,7 +351,7 @@ impl Stream for PackStream {
Poll::Pending => {
let flushed = this.flush_buffered();
return match flushed {
Ok(Some(batch)) => Poll::Ready(Some(Ok(batch))),
Ok(Some(batch)) => this.declare_batch(batch),
Ok(None) => Poll::Pending,
Err(error) => {
this.finish();
@@ -305,7 +367,7 @@ impl Stream for PackStream {
let flushed = this.flush_buffered();
this.finish();
return match flushed {
Ok(Some(batch)) => Poll::Ready(Some(Ok(batch))),
Ok(Some(batch)) => this.declare_batch(batch),
Ok(None) => Poll::Ready(None),
Err(error) => Poll::Ready(Some(Err(codec_error(error)))),
};
+138 -3
View File
@@ -14,7 +14,7 @@
mod lifecycle;
use std::collections::VecDeque;
use std::collections::{HashMap, VecDeque};
use std::io::Cursor;
use std::pin::Pin;
use std::sync::Arc;
@@ -34,6 +34,7 @@ use datatypes::arrow::record_batch::RecordBatch;
use datatypes::series::Label;
use datatypes::series::MetricName;
use datatypes::series::SeriesOrdering;
use datatypes::series::frame::{RawLabelMode, raw_series_frame_schema};
use datatypes::series::histogram::{BucketSideView, CounterResetHint, HistogramBatchBuilder};
use datatypes::series::raw::{RawSeriesChunk, RawTimestamps};
use datatypes::series::samples::{
@@ -44,7 +45,7 @@ use store_api::region_engine::{
BoundTag, RawLabelSource, RawSeriesStream, SendableRawSeriesStream,
};
use super::{pack_raw_series, unpack_raw_series};
use super::{pack_raw_series, raw_series_frame_ordering, unpack_raw_series};
fn schema() -> Arc<SeriesSchema> {
Arc::new(SeriesSchema {
@@ -2383,9 +2384,20 @@ async fn public_chunk_with_empty_times_is_rejected_without_panic() {
}
/// `Interleaved` is rejected by the constructor before any source poll, for a pack source and for
/// an empty unpack stream; no adjacent-only fallback is installed.
/// an empty unpack stream; the wire-schema helper rejects it before assembling a schema, since no
/// v1 metadata value represents it. No adjacent-only fallback is installed.
#[tokio::test]
async fn interleaved_ordering_is_rejected_before_any_poll() {
assert!(
super::raw_series_frame_schema_with_ordering(
&schema(),
datatypes::series::frame::RawLabelMode::Explicit,
SeriesOrdering::Interleaved,
)
.is_err(),
"interleaved cannot be declared on the wire schema"
);
let (source, polls, drops) = raw_never_polled(SeriesOrdering::Interleaved);
let error = match pack_raw_series(source) {
Ok(_) => panic!("interleaved pack stream must be rejected"),
@@ -2493,3 +2505,126 @@ async fn unpack_rejects_unrelated_metadata_drift_and_empty_schema_changes() {
assert!(unpacked.next().await.is_none(), "{label}");
}
}
#[test]
fn raw_series_ordering_metadata_fixture() {
#[derive(serde::Deserialize)]
struct Case {
name: String,
metadata: HashMap<String, String>,
ordering: Option<String>,
}
let cases: Vec<Case> = serde_json::from_str(include_str!(
"../../../../../tests/compatibility/wire/raw_series_ordering/v1_metadata.json"
))
.unwrap();
for case in cases {
let literal_ordering = match case.ordering.as_deref() {
Some("contiguous") => Some(SeriesOrdering::Contiguous),
Some("read_key_then_time") => Some(SeriesOrdering::KeyThenTime),
Some(value) => panic!("{} has invalid fixture ordering {value}", case.name),
None => None,
};
let frame_schema = raw_series_frame_schema(&schema(), RawLabelMode::Explicit).unwrap();
let frame_schema = frame_schema.as_ref().clone().with_metadata(case.metadata);
match literal_ordering {
Some(expected) => assert_eq!(
raw_series_frame_ordering(&frame_schema)
.unwrap_or_else(|error| panic!("{}: {error}", case.name)),
expected,
"{}",
case.name
),
None => assert!(
raw_series_frame_ordering(&frame_schema).is_err(),
"{}",
case.name
),
}
}
}
#[tokio::test]
async fn pack_declares_ordering_on_every_batch_and_ipc_roundtrips_it() {
for ordering in [SeriesOrdering::Contiguous, SeriesOrdering::KeyThenTime] {
for chunks in [
vec![
chunk_with(b"a", &[1], vec![Some(1.0)], Some(metric()), false),
chunk_with(b"a", &[2], vec![None], Some(metric()), true),
chunk_with(b"b", &[3], vec![Some(3.0)], Some(metric()), true),
],
vec![],
] {
let is_empty = chunks.is_empty();
// The bounded multi-row builder coalesces these three rows into one batch; the
// replaced single-row packing emitted one batch per chunk.
let expected_batch_count = if is_empty { 0 } else { 1 };
let canonical_schema =
raw_series_frame_schema(&schema(), RawLabelMode::Explicit).unwrap();
let mut expected_metadata = canonical_schema.metadata().clone();
expected_metadata.insert(
"greptime.series.ordering".to_string(),
match ordering {
SeriesOrdering::Contiguous => "contiguous",
SeriesOrdering::KeyThenTime => "read_key_then_time",
// The v1 wire carries exactly these two spellings, so the loop above
// admits only the two representable modes; `Interleaved` is rejected
// before any poll (see `interleaved_ordering_is_rejected_before_any_poll`).
SeriesOrdering::Interleaved => {
unreachable!("interleaved raw series ordering has no wire spelling")
}
}
.to_string(),
);
let (input, _, _) = raw(chunks, ordering);
let mut packed = pack_raw_series(input).unwrap();
let declared = packed.schema();
assert_eq!(declared.fields(), canonical_schema.fields());
assert_eq!(declared.metadata(), &expected_metadata);
assert_eq!(raw_series_frame_ordering(&declared).unwrap(), ordering);
let mut batches = Vec::new();
while let Some(batch) = packed.next().await {
let batch = batch.unwrap();
assert_eq!(batch.schema(), declared);
batches.push(batch);
}
let mut ipc = Vec::new();
{
let mut writer = StreamWriter::try_new(&mut ipc, &declared).unwrap();
for batch in &batches {
writer.write(batch).unwrap();
}
writer.finish().unwrap();
}
let reader = StreamReader::try_new(Cursor::new(ipc), None).unwrap();
assert_eq!(reader.schema(), declared);
assert_eq!(
raw_series_frame_ordering(&reader.schema()).unwrap(),
ordering
);
let ipc_batches = reader.map(Result::unwrap).collect::<Vec<_>>();
assert_eq!(ipc_batches.len(), batches.len());
assert_eq!(ipc_batches.len(), expected_batch_count);
assert!(ipc_batches.iter().all(|batch| batch.schema() == declared));
let (source, _, _) = df_source(ipc_batches, declared);
let mut decoded =
unpack_raw_series(source, schema(), RawLabelSource::Explicit, ordering).unwrap();
if is_empty {
assert!(decoded.next().await.is_none());
} else {
for (key, time, value, last) in [
(b"a".as_slice(), 1, Some(1.0), false),
(b"a".as_slice(), 2, None, true),
(b"b".as_slice(), 3, Some(3.0), true),
] {
let actual = decoded.next().await.unwrap().unwrap();
assert_chunk(&actual, key, &[time], &[value], last);
assert_metric(&actual, None);
}
assert!(decoded.next().await.is_none());
}
}
}
}
+264
View File
@@ -0,0 +1,264 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use std::collections::HashSet;
use std::sync::Arc;
use api::v1::SemanticType;
use common_telemetry::debug;
use datatypes::series::{Label, MetricName};
use datatypes::value::Value;
use snafu::OptionExt;
use store_api::codec::PrimaryKeyEncoding;
use store_api::metadata::RegionMetadataRef;
use store_api::metric_engine_consts::is_metric_engine_internal_column;
use store_api::region_engine::RawLabelSource;
use store_api::storage::{
ColumnId,
consts::{ReservedColumnId, is_internal_column},
};
use crate::error::{
InvalidDensePrimaryKeySnafu, InvalidSparsePrimaryKeySnafu, Result, UnsupportedOperationSnafu,
};
use crate::row_converter::dense::DensePrimaryKeyCodec;
use crate::row_converter::sparse::{SparseOffsetsCache, SparsePrimaryKeyView};
/// Selects labels materialized from a primary key.
///
/// `All` produces a complete metric name and label set. `Only` produces a projected
/// label vector, including `__name__` only when explicitly requested. Unexplained sparse
/// column IDs are errors with `All`; `Only` skips them after checking their framing.
#[derive(Clone, Debug, Default)]
pub enum LabelProjection {
#[default]
All,
Only(Arc<[Arc<str>]>),
}
/// Decoded labels: either a complete metric name or a possibly partial label vector.
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum DecodedLabels {
Complete(MetricName),
Projected(Vec<Label>),
}
enum Layout {
Sparse(SparseOffsetsCache),
Dense {
codec: DensePrimaryKeyCodec,
offsets: Vec<usize>,
},
}
struct BoundLabel {
id: ColumnId,
name: Arc<str>,
position: usize,
}
/// Decodes labels on demand using the metadata snapshot bound to a raw-label source.
pub struct PrimaryKeyLabelDecoder {
metric_name: Arc<str>,
physical_metadata: RegionMetadataRef,
complete: bool,
include_name: bool,
labels: Vec<BoundLabel>,
value_scratch: Vec<u8>,
layout: Layout,
}
impl PrimaryKeyLabelDecoder {
/// Binds a decoder to a primary-key source snapshot and projection.
///
/// Explicit sources already contain complete labels and are rejected. Dense decoding
/// requires the full key layout described by the bound snapshot; compatibility with
/// older key layouts must be normalized upstream.
pub fn new(source: &RawLabelSource, projection: LabelProjection) -> Result<Self> {
let RawLabelSource::PrimaryKey {
metric_name,
physical_metadata,
logical_tags,
} = source
else {
return UnsupportedOperationSnafu {
err_msg: "explicit raw labels are already complete",
}
.fail();
};
let metadata = physical_metadata.as_ref();
let mut labels = Vec::with_capacity(logical_tags.len());
let mut names = HashSet::new();
let mut ids = HashSet::new();
for tag in logical_tags.iter() {
let column = metadata.column_by_id(tag.column_id);
if !names.insert(tag.name.clone())
|| !ids.insert(tag.column_id)
|| tag.name.as_ref() == "__name__"
|| is_internal_column(&tag.name)
|| is_metric_engine_internal_column(&tag.name)
|| ReservedColumnId::is_reserved(tag.column_id)
|| !column.is_some_and(|column| {
column.semantic_type == SemanticType::Tag
&& column.column_schema.name.as_str() == tag.name.as_ref()
&& metadata.primary_key.contains(&tag.column_id)
})
{
return InvalidSparsePrimaryKeySnafu {
reason: format!("invalid logical tag binding {}", tag.name),
}
.fail();
}
let position = metadata.primary_key_index(tag.column_id).context(
InvalidSparsePrimaryKeySnafu {
reason: format!("logical tag {} is not a primary-key column", tag.name),
},
)?;
labels.push(BoundLabel {
id: tag.column_id,
name: tag.name.clone(),
position,
});
}
labels.sort_unstable_by(|a, b| a.name.cmp(&b.name));
let complete = matches!(&projection, LabelProjection::All);
let include_name = match &projection {
LabelProjection::All => false,
LabelProjection::Only(requested) => {
requested.iter().any(|name| name.as_ref() == "__name__")
}
};
if let LabelProjection::Only(requested) = &projection {
let requested: HashSet<_> = requested.iter().map(AsRef::as_ref).collect();
labels.retain(|label| requested.contains(label.name.as_ref()));
}
let layout = match metadata.primary_key_encoding {
PrimaryKeyEncoding::Sparse => Layout::Sparse(SparseOffsetsCache::new()),
PrimaryKeyEncoding::Dense => Layout::Dense {
codec: DensePrimaryKeyCodec::new(metadata),
offsets: Vec::new(),
},
};
let encoding = match metadata.primary_key_encoding {
PrimaryKeyEncoding::Sparse => "sparse",
PrimaryKeyEncoding::Dense => "dense",
};
let projection_mode = if complete { "all" } else { "only" };
debug!(
encoding,
projection_mode,
logical_tag_count = logical_tags.len(),
selected_tag_count = labels.len(),
"Constructed primary key label decoder"
);
Ok(Self {
metric_name: metric_name.clone(),
physical_metadata: physical_metadata.clone(),
complete,
include_name,
labels,
value_scratch: Vec::new(),
layout,
})
}
/// Decodes labels without modifying or consuming `read_key`.
///
/// `All` returns a complete [`MetricName`]; `Only` returns a partial vector. Dense
/// keys are fully checked against the exact snapshot layout even when decoding only
/// selected fields. Sparse keys receive a full structural audit before values are read.
pub fn decode(&mut self, read_key: &[u8]) -> Result<DecodedLabels> {
let mut values = Vec::with_capacity(self.labels.len() + usize::from(self.include_name));
let Self {
layout,
labels,
physical_metadata,
complete,
value_scratch,
..
} = self;
match layout {
Layout::Sparse(cache) => {
let mut view = SparsePrimaryKeyView::new(read_key, cache)?;
view.visit_label_ids(|id| {
if *complete
&& !physical_metadata.column_by_id(id).is_some_and(|column| {
column.semantic_type == SemanticType::Tag
&& physical_metadata.primary_key.contains(&id)
})
{
return InvalidSparsePrimaryKeySnafu {
reason: format!("unrecognized sparse tag id {id}"),
}
.fail();
}
Ok(())
})?;
for label in labels.iter() {
if let Some(value) = view.label(label.id, value_scratch)? {
values.push(Label {
name: label.name.clone(),
value: Arc::from(value),
});
}
}
}
Layout::Dense { codec, offsets } => {
offsets.clear();
let mut total = 0;
for pos in 0..codec.num_fields() {
let encoded = codec.encoded_value_at(read_key, pos, offsets)?;
total += encoded.len();
}
if total != read_key.len() {
return InvalidDensePrimaryKeySnafu {
reason: "trailing bytes after dense primary key",
}
.fail();
}
for label in labels.iter() {
let value = codec.decode_value_at(read_key, label.position, offsets)?;
if !matches!(value, Value::Null) {
values.push(Label {
name: label.name.clone(),
value: Arc::from(value.to_string()),
});
}
}
}
}
if *complete {
Ok(DecodedLabels::Complete(
MetricName::try_new(Some(self.metric_name.clone()), values).map_err(|error| {
InvalidSparsePrimaryKeySnafu {
reason: error.to_string(),
}
.build()
})?,
))
} else {
if self.include_name {
values.push(Label {
name: Arc::from("__name__"),
value: self.metric_name.clone(),
});
values.sort_unstable_by(|a, b| a.name.cmp(&b.name));
}
Ok(DecodedLabels::Projected(values))
}
}
}
#[cfg(test)]
mod tests;
+603
View File
@@ -0,0 +1,603 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use std::sync::Arc;
use api::v1::SemanticType;
use common_time::timestamp::TimeUnit;
use common_time::{Date, Timestamp};
use datatypes::data_type::ConcreteDataType;
use datatypes::prelude::Value;
use datatypes::schema::ColumnSchema;
use store_api::codec::PrimaryKeyEncoding;
use store_api::metadata::{ColumnMetadata, RegionMetadata, RegionMetadataBuilder};
use store_api::region_engine::BoundTag;
use store_api::storage::RegionId;
use crate::row_converter::{
DensePrimaryKeyCodec, PrimaryKeyCodec, SortField, SparsePrimaryKeyCodec,
};
use super::*;
fn metadata(
tags: &[(u32, &str, ConcreteDataType)],
encoding: PrimaryKeyEncoding,
) -> Arc<RegionMetadata> {
let mut builder = RegionMetadataBuilder::new(RegionId::new(7, 1));
builder.push_column_metadata(ColumnMetadata {
column_schema: ColumnSchema::new(
"ts",
ConcreteDataType::timestamp_millisecond_datatype(),
false,
),
semantic_type: SemanticType::Timestamp,
column_id: 0,
});
let mut primary_key = Vec::new();
for (id, name, data_type) in tags {
builder.push_column_metadata(ColumnMetadata {
column_schema: ColumnSchema::new(*name, data_type.clone(), true),
semantic_type: SemanticType::Tag,
column_id: *id,
});
primary_key.push(*id);
}
builder.push_column_metadata(ColumnMetadata {
column_schema: ColumnSchema::new("field", ConcreteDataType::int64_datatype(), true),
semantic_type: SemanticType::Field,
column_id: 99,
});
builder.primary_key(primary_key);
builder.primary_key_encoding(encoding);
Arc::new(builder.build().unwrap())
}
fn source(
metadata: Arc<RegionMetadata>,
metric: &str,
logical_tags: &[(u32, &str)],
) -> RawLabelSource {
RawLabelSource::PrimaryKey {
metric_name: Arc::from(metric),
physical_metadata: metadata,
logical_tags: logical_tags
.iter()
.map(|(column_id, name)| BoundTag {
column_id: *column_id,
name: Arc::from(*name),
})
.collect::<Vec<_>>()
.into(),
}
}
fn encoded(encoding: PrimaryKeyEncoding, values: &[(u32, Value)]) -> Vec<u8> {
let fields = values
.iter()
.map(|(id, value)| (*id, SortField::new(value.data_type())))
.collect::<Vec<_>>();
let mut bytes = Vec::new();
match encoding {
PrimaryKeyEncoding::Dense => DensePrimaryKeyCodec::with_fields(fields)
.encode_values(values, &mut bytes)
.unwrap(),
PrimaryKeyEncoding::Sparse => {
let codec = SparsePrimaryKeyCodec::with_fields(fields);
codec.encode_internal(42, 9, &mut bytes).unwrap();
codec.encode_values(values, &mut bytes).unwrap();
}
}
bytes
}
fn string_metadata(encoding: PrimaryKeyEncoding) -> Arc<RegionMetadata> {
metadata(
&[
(8, "zeta", ConcreteDataType::string_datatype()),
(2, "private", ConcreteDataType::string_datatype()),
(41, "alpha", ConcreteDataType::string_datatype()),
],
encoding,
)
}
fn values() -> Vec<(u32, Value)> {
vec![
(8, Value::String("last".into())),
(2, Value::String("hidden".into())),
(41, Value::String("first".into())),
]
}
#[test]
fn dense_and_sparse_decode_complete_or_projected_labels() {
for encoding in [PrimaryKeyEncoding::Dense, PrimaryKeyEncoding::Sparse] {
let source = source(
string_metadata(encoding),
"requests_total",
&[(8, "zeta"), (41, "alpha")],
);
let key = encoded(encoding, &values());
let mut all = PrimaryKeyLabelDecoder::new(&source, LabelProjection::All).unwrap();
let complete = all.decode(&key).unwrap();
let DecodedLabels::Complete(metric) = complete else {
panic!("All must return a complete metric identity")
};
assert_eq!(metric.name(), Some("requests_total"));
assert_eq!(metric.get("alpha"), Some("first"));
assert_eq!(metric.get("zeta"), Some("last"));
assert_eq!(metric.get("private"), None);
let mut projected = PrimaryKeyLabelDecoder::new(
&source,
LabelProjection::Only(Arc::from([
Arc::<str>::from("zeta"),
Arc::from("alpha"),
Arc::from("__name__"),
Arc::from("missing"),
Arc::from("alpha"),
])),
)
.unwrap();
assert_eq!(
projected.decode(&key).unwrap(),
DecodedLabels::Projected(vec![
Label {
name: Arc::from("__name__"),
value: Arc::from("requests_total")
},
Label {
name: Arc::from("alpha"),
value: Arc::from("first")
},
Label {
name: Arc::from("zeta"),
value: Arc::from("last")
},
])
);
assert_eq!(
projected.decode(&key).unwrap(),
DecodedLabels::Projected(vec![
Label {
name: Arc::from("__name__"),
value: Arc::from("requests_total")
},
Label {
name: Arc::from("alpha"),
value: Arc::from("first")
},
Label {
name: Arc::from("zeta"),
value: Arc::from("last")
},
])
);
let mut without_name = PrimaryKeyLabelDecoder::new(
&source,
LabelProjection::Only(Arc::from([Arc::<str>::from("alpha")])),
)
.unwrap();
assert_eq!(
without_name.decode(&key).unwrap(),
DecodedLabels::Projected(vec![Label {
name: Arc::from("alpha"),
value: Arc::from("first")
}])
);
let mut empty_projection =
PrimaryKeyLabelDecoder::new(&source, LabelProjection::Only(Arc::from([]))).unwrap();
assert_eq!(
empty_projection.decode(&key).unwrap(),
DecodedLabels::Projected(vec![])
);
}
}
#[test]
fn projection_is_bound_to_snapshot_and_distinguishes_missing_and_empty() {
let original = metadata(
&[
(21, "old", ConcreteDataType::string_datatype()),
(4, "added_later", ConcreteDataType::string_datatype()),
],
PrimaryKeyEncoding::Sparse,
);
let old_source = source(
original.clone(),
"old_metric",
&[(21, "old"), (4, "added_later")],
);
let weak_metadata = Arc::downgrade(&original);
let replacement = metadata(
&[(21, "renamed", ConcreteDataType::string_datatype())],
PrimaryKeyEncoding::Sparse,
);
let new_source = source(replacement, "new_metric", &[(21, "renamed")]);
assert!(PrimaryKeyLabelDecoder::new(&new_source, LabelProjection::All).is_ok());
let codec = SparsePrimaryKeyCodec::with_fields(vec![(
21,
SortField::new(ConcreteDataType::string_datatype()),
)]);
let mut key = Vec::new();
codec.encode_internal(42, 9, &mut key).unwrap();
codec
.encode_values(&[(21, Value::String("".into()))], &mut key)
.unwrap();
let mut decoder = PrimaryKeyLabelDecoder::new(
&old_source,
LabelProjection::Only(Arc::from([
Arc::<str>::from("old"),
Arc::from("added_later"),
])),
)
.unwrap();
let mut all = PrimaryKeyLabelDecoder::new(&old_source, LabelProjection::All).unwrap();
drop(old_source);
drop(original);
assert!(weak_metadata.upgrade().is_some());
assert_eq!(
decoder.decode(&key).unwrap(),
DecodedLabels::Projected(vec![Label {
name: Arc::from("old"),
value: Arc::from("")
},])
);
let mut absent = Vec::new();
codec.encode_internal(42, 9, &mut absent).unwrap();
assert_eq!(
decoder.decode(&absent).unwrap(),
DecodedLabels::Projected(vec![])
);
let DecodedLabels::Complete(absent_tags) = all.decode(&absent).unwrap() else {
panic!("All must return complete identity")
};
assert_eq!(absent_tags.get("old"), None);
let DecodedLabels::Complete(empty_tag) = all.decode(&key).unwrap() else {
panic!("All must return complete identity")
};
assert_eq!(empty_tag.get("old"), Some(""));
let mut complete = PrimaryKeyLabelDecoder::new(
&source(
metadata(
&[(21, "old", ConcreteDataType::string_datatype())],
PrimaryKeyEncoding::Sparse,
),
"",
&[(21, "old")],
),
LabelProjection::All,
)
.unwrap();
let DecodedLabels::Complete(empty_name) = complete.decode(&absent).unwrap() else {
panic!("All must return complete identity")
};
assert_eq!(empty_name.name(), Some(""));
let named_source = source(
metadata(
&[(21, "old", ConcreteDataType::string_datatype())],
PrimaryKeyEncoding::Sparse,
),
"old_metric",
&[(21, "old")],
);
let mut complete = PrimaryKeyLabelDecoder::new(&named_source, LabelProjection::All).unwrap();
let DecodedLabels::Complete(named) = complete.decode(&absent).unwrap() else {
panic!("All must return complete identity")
};
assert_eq!(named.name(), Some("old_metric"));
// A null value is represented by its sparse column ID and null marker.
let mut null = Vec::new();
codec.encode_internal(42, 9, &mut null).unwrap();
null.extend_from_slice(&21_u32.to_be_bytes());
null.push(0);
assert_eq!(
decoder.decode(&null).unwrap(),
DecodedLabels::Projected(vec![])
);
drop(decoder);
drop(all);
assert!(weak_metadata.upgrade().is_none());
}
#[test]
fn projection_does_not_hide_bad_framing_or_materialize_unselected_values() {
let meta = metadata(
&[
(11, "wanted", ConcreteDataType::string_datatype()),
(35, "unwanted", ConcreteDataType::string_datatype()),
],
PrimaryKeyEncoding::Sparse,
);
let bound = source(meta, "m", &[(11, "wanted"), (35, "unwanted")]);
let codec = SparsePrimaryKeyCodec::with_fields(vec![
(11, SortField::new(ConcreteDataType::string_datatype())),
(35, SortField::new(ConcreteDataType::string_datatype())),
]);
let mut key = Vec::new();
codec.encode_internal(42, 9, &mut key).unwrap();
codec
.encode_raw_tag_value(
[(11, b"ok".as_slice()), (35, &[0xff])].into_iter(),
&mut key,
)
.unwrap();
let mut only = PrimaryKeyLabelDecoder::new(
&bound,
LabelProjection::Only(Arc::from([Arc::<str>::from("wanted")])),
)
.unwrap();
assert_eq!(
only.decode(&key).unwrap(),
DecodedLabels::Projected(vec![Label {
name: Arc::from("wanted"),
value: Arc::from("ok")
},])
);
let mut all = PrimaryKeyLabelDecoder::new(&bound, LabelProjection::All).unwrap();
assert!(all.decode(&key).is_err());
let mut malformed = key.clone();
malformed.pop();
assert!(only.decode(&malformed).is_err());
assert!(all.decode(&malformed).is_err());
let mut empty_projection =
PrimaryKeyLabelDecoder::new(&bound, LabelProjection::Only(Arc::from([]))).unwrap();
assert!(empty_projection.decode(&malformed).is_err());
}
#[test]
fn dense_projection_still_rejects_short_and_extra_key_bytes() {
let meta = metadata(
&[(17, "label", ConcreteDataType::string_datatype())],
PrimaryKeyEncoding::Dense,
);
let bound = source(meta, "m", &[(17, "label")]);
let key = encoded(
PrimaryKeyEncoding::Dense,
&[(17, Value::String("ok".into()))],
);
let mut decoder =
PrimaryKeyLabelDecoder::new(&bound, LabelProjection::Only(Arc::from([]))).unwrap();
assert!(decoder.decode(&key[..key.len() - 1]).is_err());
let mut extra = key;
extra.push(0);
assert!(decoder.decode(&extra).is_err());
}
#[test]
fn dense_unselected_invalid_utf8_is_not_materialized() {
let meta = metadata(
&[
(17, "wanted", ConcreteDataType::string_datatype()),
(18, "unwanted", ConcreteDataType::string_datatype()),
],
PrimaryKeyEncoding::Dense,
);
let bound = source(meta, "m", &[(17, "wanted"), (18, "unwanted")]);
let first_value = encoded(
PrimaryKeyEncoding::Dense,
&[(17, Value::String("ok".into()))],
);
let mut key = encoded(
PrimaryKeyEncoding::Dense,
&[
(17, Value::String("ok".into())),
(18, Value::String("x".into())),
],
);
key[first_value.len() + 2] = 0xff;
let mut only = PrimaryKeyLabelDecoder::new(
&bound,
LabelProjection::Only(Arc::from([Arc::<str>::from("wanted")])),
)
.unwrap();
assert_eq!(
only.decode(&key).unwrap(),
DecodedLabels::Projected(vec![Label {
name: Arc::from("wanted"),
value: Arc::from("ok")
}])
);
let mut selected_invalid = PrimaryKeyLabelDecoder::new(
&bound,
LabelProjection::Only(Arc::from([Arc::<str>::from("unwanted")])),
)
.unwrap();
assert!(selected_invalid.decode(&key).is_err());
let mut all = PrimaryKeyLabelDecoder::new(&bound, LabelProjection::All).unwrap();
assert!(all.decode(&key).is_err());
}
#[test]
fn unknown_sparse_ids_are_skipped_only_for_projection_and_full_keys_stay_distinct() {
let meta = metadata(
&[(11, "wanted", ConcreteDataType::string_datatype())],
PrimaryKeyEncoding::Sparse,
);
let bound = source(meta, "m", &[(11, "wanted")]);
let codec = SparsePrimaryKeyCodec::with_fields(vec![(
11,
SortField::new(ConcreteDataType::string_datatype()),
)]);
let mut first = Vec::new();
codec.encode_internal(42, 9, &mut first).unwrap();
codec
.encode_raw_tag_value(
[
(10, b"before".as_slice()),
(11, b"one".as_slice()),
(12, b"between".as_slice()),
(90, b"after".as_slice()),
]
.into_iter(),
&mut first,
)
.unwrap();
let original_first = first.clone();
let mut second = Vec::new();
codec.encode_internal(42, 9, &mut second).unwrap();
codec
.encode_raw_tag_value(
[
(10, b"before".as_slice()),
(11, b"two".as_slice()),
(12, b"between".as_slice()),
(90, b"after".as_slice()),
]
.into_iter(),
&mut second,
)
.unwrap();
let mut only = PrimaryKeyLabelDecoder::new(
&bound,
LabelProjection::Only(Arc::from([Arc::<str>::from("wanted")])),
)
.unwrap();
assert_eq!(
only.decode(&first).unwrap(),
DecodedLabels::Projected(vec![Label {
name: Arc::from("wanted"),
value: Arc::from("one")
},])
);
assert_eq!(
only.decode(&second).unwrap(),
DecodedLabels::Projected(vec![Label {
name: Arc::from("wanted"),
value: Arc::from("two")
},])
);
assert_ne!(first, second);
assert_eq!(first, original_first);
let original_second = second.clone();
let mut all = PrimaryKeyLabelDecoder::new(&bound, LabelProjection::All).unwrap();
assert!(all.decode(&first).is_err());
assert_eq!(first, original_first);
assert_eq!(second, original_second);
}
#[test]
fn unknown_sparse_ids_before_between_and_after_known_tags_are_projected() {
let meta = metadata(
&[
(11, "wanted", ConcreteDataType::string_datatype()),
(13, "other", ConcreteDataType::string_datatype()),
],
PrimaryKeyEncoding::Sparse,
);
let bound = source(meta, "m", &[(11, "wanted"), (13, "other")]);
let codec = SparsePrimaryKeyCodec::schemaless();
let cases: [&[(u32, &[u8])]; 3] = [
&[(10, b"before"), (11, b"one"), (12, b"two")],
&[(11, b"one"), (12, b"between"), (13, b"two")],
&[(11, b"one"), (13, b"two"), (90, b"after")],
];
for tags in cases {
let mut key = Vec::new();
codec.encode_internal(42, 9, &mut key).unwrap();
codec
.encode_raw_tag_value(tags.iter().copied(), &mut key)
.unwrap();
let mut only = PrimaryKeyLabelDecoder::new(
&bound,
LabelProjection::Only(Arc::from([Arc::<str>::from("wanted")])),
)
.unwrap();
assert_eq!(
only.decode(&key).unwrap(),
DecodedLabels::Projected(vec![Label {
name: Arc::from("wanted"),
value: Arc::from("one")
}])
);
let mut all = PrimaryKeyLabelDecoder::new(&bound, LabelProjection::All).unwrap();
assert!(all.decode(&key).is_err());
}
}
#[test]
fn constructor_rejects_invalid_bindings_but_accepts_valid_control() {
let meta = metadata(
&[
(11, "wanted", ConcreteDataType::string_datatype()),
(35, "other", ConcreteDataType::string_datatype()),
],
PrimaryKeyEncoding::Sparse,
);
for bindings in [
vec![(11, "wrong")],
vec![(11, "same"), (35, "same")],
vec![(11, "wanted"), (11, "wanted")],
vec![(0, "ts")],
vec![(90, "not_a_tag")],
vec![(99, "field")],
vec![(11, "__name__")],
vec![(u32::MAX, "internal")],
] {
let invalid = source(meta.clone(), "m", &bindings);
assert!(PrimaryKeyLabelDecoder::new(&invalid, LabelProjection::All).is_err());
}
let valid = source(meta, "m", &[(11, "wanted"), (35, "other")]);
assert!(PrimaryKeyLabelDecoder::new(&valid, LabelProjection::All).is_ok());
assert!(PrimaryKeyLabelDecoder::new(&RawLabelSource::Explicit, LabelProjection::All).is_err());
}
#[test]
fn dense_typed_values_keep_exact_integer_string_representation() {
let cases = [
(
"count",
ConcreteDataType::int64_datatype(),
Value::Int64(9_007_199_254_740_993),
),
(
"binary",
ConcreteDataType::binary_datatype(),
Value::Binary(vec![0xab, 0xcd].into()),
),
(
"date",
ConcreteDataType::date_datatype(),
Value::Date(Date::new(0)),
),
(
"timestamp",
ConcreteDataType::timestamp_millisecond_datatype(),
Value::Timestamp(Timestamp::new(1234, TimeUnit::Millisecond)),
),
];
for (name, data_type, value) in cases {
let expected = value.to_string();
let meta = metadata(&[(17, name, data_type)], PrimaryKeyEncoding::Dense);
let bound = source(meta, "typed", &[(17, name)]);
let key = encoded(PrimaryKeyEncoding::Dense, &[(17, value)]);
let mut decoder = PrimaryKeyLabelDecoder::new(&bound, LabelProjection::All).unwrap();
let DecodedLabels::Complete(metric) = decoder.decode(&key).unwrap() else {
panic!("All must return a complete metric identity")
};
assert_eq!(metric.get(name), Some(expected.as_str()));
}
assert_eq!(
Value::Int64(9_007_199_254_740_993).to_string(),
"9007199254740993"
);
}
+1
View File
@@ -17,6 +17,7 @@
pub mod error;
pub mod index;
pub mod key_values;
pub mod labels;
pub mod primary_key_filter;
pub mod row_converter;
@@ -67,26 +67,53 @@ impl<'a, 'b> SparsePrimaryKeyView<'a, 'b> {
if let Some(offset) = self.cache.get(column_id) {
return encoded_label(&self.pk[offset..]).map(Some);
}
while !self.cache.finished && self.cache.cursor < self.pk.len() {
let bytes = &self.pk[self.cache.cursor..];
let id = bytes.first_chunk::<COLUMN_ID_ENCODE_SIZE>().context(
InvalidSparsePrimaryKeySnafu {
reason: "truncated label column id",
},
)?;
let id = u32::from_be_bytes(*id);
let offset = self.cache.cursor + COLUMN_ID_ENCODE_SIZE;
let value = encoded_label(&self.pk[offset..])?;
self.cache.insert(id, offset);
self.cache.cursor = offset + value.len();
while let Some((id, value)) = self.next_label()? {
if id == column_id {
return Ok(Some(value));
}
}
self.cache.finished = true;
Ok(None)
}
/// Visits every ordinary label id in encoded order, validating the complete tail.
/// Resets offset discovery for this key before traversing it.
pub fn visit_label_ids(&mut self, mut visit: impl FnMut(ColumnId) -> Result<()>) -> Result<()> {
self.cache.clear();
while let Some((id, _)) = self.next_label()? {
visit(id)?;
}
Ok(())
}
/// Parses and caches the next ordinary label, advancing the per-key cursor.
fn next_label(&mut self) -> Result<Option<(ColumnId, &'a [u8])>> {
if self.cache.finished || self.cache.cursor == self.pk.len() {
self.cache.finished = true;
return Ok(None);
}
let bytes = &self.pk[self.cache.cursor..];
let id =
bytes
.first_chunk::<COLUMN_ID_ENCODE_SIZE>()
.context(InvalidSparsePrimaryKeySnafu {
reason: "truncated label column id",
})?;
let id = u32::from_be_bytes(*id);
let offset = self.cache.cursor + COLUMN_ID_ENCODE_SIZE;
ensure!(
id != RESERVED_COLUMN_ID_TABLE_ID
&& id != RESERVED_COLUMN_ID_TSID
&& self.cache.get(id).is_none(),
InvalidSparsePrimaryKeySnafu {
reason: "duplicate or reserved label column id"
}
);
let value = encoded_label(&self.pk[offset..])?;
self.cache.insert(id, offset);
self.cache.cursor = offset + value.len();
Ok(Some((id, value)))
}
/// Extracts a UTF-8 label into a reusable buffer, validating it once.
/// Missing and null labels return `None` without modifying the buffer;
/// an empty label returns `Some("")`. Reserved numeric columns are rejected.
@@ -230,6 +257,144 @@ mod tests {
}
}
#[test]
fn visits_all_label_ids_in_order_and_resets_cache_for_each_key() {
let codec = SparsePrimaryKeyCodec::schemaless();
let mut cache = SparseOffsetsCache::new();
let mut first = Vec::new();
codec.encode_internal(1, 2, &mut first).unwrap();
codec
.encode_raw_tag_value(
[(8, b"a".as_slice()), (3, b"b"), (12, b"c")].into_iter(),
&mut first,
)
.unwrap();
let mut second = Vec::new();
codec.encode_internal(1, 2, &mut second).unwrap();
codec
.encode_raw_tag_value([(99, b"z".as_slice())].into_iter(), &mut second)
.unwrap();
let mut view = SparsePrimaryKeyView::new(&first, &mut cache).unwrap();
assert!(view.encoded_value(8).unwrap().is_some());
let mut visited = Vec::new();
view.visit_label_ids(|id| {
visited.push(id);
Ok(())
})
.unwrap();
assert_eq!(visited, [8, 3, 12]);
let mut view = SparsePrimaryKeyView::new(&second, &mut cache).unwrap();
visited.clear();
view.visit_label_ids(|id| {
visited.push(id);
Ok(())
})
.unwrap();
assert_eq!(visited, [99]);
}
#[test]
fn visits_unknown_ids_before_and_after_known_lookup() {
let codec = SparsePrimaryKeyCodec::schemaless();
let mut pk = Vec::new();
codec.encode_internal(1, 2, &mut pk).unwrap();
codec
.encode_raw_tag_value(
[(1, b"one".as_slice()), (5, b"five"), (9, b"nine")].into_iter(),
&mut pk,
)
.unwrap();
let mut cache = SparseOffsetsCache::new();
let mut view = SparsePrimaryKeyView::new(&pk, &mut cache).unwrap();
assert!(view.encoded_value(5).unwrap().is_some());
let mut visited = Vec::new();
view.visit_label_ids(|id| {
visited.push(id);
Ok(())
})
.unwrap();
assert_eq!(visited, [1, 5, 9]);
assert!(view.encoded_value(100).unwrap().is_none());
}
#[test]
fn full_visit_catches_malformed_tail_after_early_lookup() {
let codec = SparsePrimaryKeyCodec::schemaless();
let mut pk = Vec::new();
codec.encode_internal(1, 2, &mut pk).unwrap();
codec
.encode_raw_tag_value([(1, b"ok".as_slice())].into_iter(), &mut pk)
.unwrap();
pk.extend_from_slice(&2_u32.to_be_bytes());
pk.extend_from_slice(&[1, 1, 1]);
let mut cache = SparseOffsetsCache::new();
let mut view = SparsePrimaryKeyView::new(&pk, &mut cache).unwrap();
assert!(view.encoded_value(1).unwrap().is_some());
assert!(view.visit_label_ids(|_| Ok(())).is_err());
}
#[test]
fn visit_rejects_duplicate_reserved_truncated_and_bad_framing_tail() {
let codec = SparsePrimaryKeyCodec::schemaless();
let mut cache = SparseOffsetsCache::new();
let mut duplicate_tail = Vec::new();
codec
.encode_raw_tag_value(
[(1, b"duplicate".as_slice())].into_iter(),
&mut duplicate_tail,
)
.unwrap();
let cases = [
(duplicate_tail, "duplicate or reserved label column id"),
(
[
RESERVED_COLUMN_ID_TABLE_ID.to_be_bytes().as_slice(),
&[1, 1, b'x', 0],
]
.concat(),
"duplicate or reserved label column id",
),
(
[
RESERVED_COLUMN_ID_TSID.to_be_bytes().as_slice(),
&[1, 1, b'x', 0],
]
.concat(),
"duplicate or reserved label column id",
),
(
[2_u32.to_be_bytes().as_slice(), &[1, 1, b'x']].concat(),
"unexpected end of input",
),
(
[2_u32.to_be_bytes().as_slice(), &[2]].concat(),
"invalid tag encoding: 2",
),
];
for (tail, expected_reason) in cases {
let mut pk = Vec::new();
codec.encode_internal(1, 2, &mut pk).unwrap();
codec
.encode_raw_tag_value([(1, b"ok".as_slice())].into_iter(), &mut pk)
.unwrap();
pk.extend_from_slice(&tail);
let mut view = SparsePrimaryKeyView::new(&pk, &mut cache).unwrap();
let error = view.visit_label_ids(|_| Ok(())).unwrap_err();
assert!(
error.to_string().contains(expected_reason),
"expected {expected_reason:?}, got {error}"
);
}
let mut truncated_id = Vec::new();
codec.encode_internal(1, 2, &mut truncated_id).unwrap();
truncated_id.push(1);
let mut view = SparsePrimaryKeyView::new(&truncated_id, &mut cache).unwrap();
let error = view.visit_label_ids(|_| Ok(())).unwrap_err();
assert!(error.to_string().contains("truncated label column id"));
}
#[test]
fn reserved_ids_preserve_unsigned_values() {
let codec = SparsePrimaryKeyCodec::schemaless();
+2
View File
@@ -24,6 +24,7 @@ greptime-proto.workspace = true
lazy_static.workspace = true
prometheus.workspace = true
prost.workspace = true
regex.workspace = true
snafu.workspace = true
[dev-dependencies]
@@ -32,6 +33,7 @@ criterion.workspace = true
datafusion-common.workspace = true
datafusion-expr.workspace = true
datatypes.workspace = true
rand.workspace = true
tokio.workspace = true
[[bench]]
+14
View File
@@ -32,6 +32,7 @@ mod vector_matching;
use std::sync::Arc;
pub(crate) use aggr_over_time::extremum;
pub use aggr_over_time::{
AbsentOverTime, AvgOverTime, CountOverTime, LastOverTime, MaxOverTime, MinOverTime,
PresentOverTime, StddevOverTime, StdvarOverTime, SumOverTime,
@@ -47,8 +48,11 @@ use datatypes::arrow::array::Array;
use datatypes::arrow::datatypes::{DataType, Int64Type};
pub use deriv::Deriv;
pub use double_exponential_smoothing::DoubleExponentialSmoothing;
pub(crate) use edge_count::{EdgeKind, count_edges};
pub(crate) use extrapolate_rate::add_counter_resets;
pub use extrapolate_rate::{Delta, Increase, Rate};
pub use idelta::IDelta;
pub(crate) use idelta::instant_delta;
pub use ieee_float::{IeeeComparison, IeeeSqrt};
pub use native_histogram::{
MixedRange, NativeHistogramAbsentOverTime, NativeHistogramAdd, NativeHistogramAggAvg,
@@ -145,6 +149,16 @@ pub(crate) fn compensated_sum_inc(inc: f64, sum: f64, mut compensation: f64) ->
(new_sum, compensation)
}
/// Prometheus `kahansum.Inc`: [`compensated_sum_inc`] that also drops the compensation once the
/// sum is infinite.
pub(crate) fn kahan_inc(inc: f64, sum: f64, c: f64) -> (f64, f64) {
let t = sum + inc;
if t.is_infinite() {
return (t, 0.0);
}
compensated_sum_inc(inc, sum, c)
}
/// linear_regression performs a least-square linear regression analysis on the
/// times and values. It return the slope and intercept based on times and values.
/// Prometheus's implementation: <https://github.com/prometheus/prometheus/blob/90b2f7a540b8a70d8d81372e6692dcbb67ccbaaa/promql/functions.go#L793-L837>
+11 -6
View File
@@ -443,13 +443,18 @@ impl SlidingExtrema {
/// Folds one window on its own, the way the per-window scan used to.
fn scan_extremum(values: &Float64Array, start: usize, end: usize, is_min: bool) -> Option<f64> {
let mut extremum: Option<f64> = None;
for index in start..end {
if values.is_null(index) {
continue;
}
extremum(
(start..end)
.filter(|&index| values.is_valid(index))
.map(|index| values.value(index)),
is_min,
)
}
let value = values.value(index);
/// The minimum (`is_min`) or maximum of `values`, `None` when there are none.
pub(crate) fn extremum(values: impl IntoIterator<Item = f64>, is_min: bool) -> Option<f64> {
let mut extremum: Option<f64> = None;
for value in values {
let replace = match extremum {
None => true,
// A NaN only holds the slot until any other sample arrives.
+6 -4
View File
@@ -25,8 +25,9 @@ use datatypes::arrow::datatypes::DataType;
use crate::functions::extract_range_array;
use crate::range_array::RangeArray;
/// The transitions `changes` and `resets` count between consecutive samples.
#[derive(Clone, Copy)]
pub(super) enum EdgeKind {
pub(crate) enum EdgeKind {
Changes,
Resets,
}
@@ -96,7 +97,7 @@ fn calc(
0 => None,
_ if has_nulls => count_edges_skipping_nulls(values, offset, end, kind),
1 => Some(0),
_ if direct => Some(count_edges(raw_values.as_ref(), offset, end, kind)),
_ if direct => Some(count_edges(&raw_values[offset..end], kind)),
_ => {
let prefix = prefix.as_ref().unwrap();
Some(prefix[end - 1] - prefix[offset])
@@ -169,9 +170,10 @@ fn build_prefix(values: &[f64], kind: EdgeKind) -> Vec<u64> {
prefix
}
fn count_edges(values: &[f64], offset: usize, end: usize, kind: EdgeKind) -> u64 {
/// Counts `kind` edges between consecutive `values`.
pub(crate) fn count_edges(values: &[f64], kind: EdgeKind) -> u64 {
let mut count = 0;
for index in offset + 1..end {
for index in 1..values.len() {
count += u64::from(is_edge(values[index - 1], values[index], kind));
}
count
+1 -1
View File
@@ -314,7 +314,7 @@ impl<const IS_COUNTER: bool, const IS_RATE: bool> ExtrapolatedRate<IS_COUNTER, I
/// their own, and the two are not interchangeable in f64: a reset large enough to swallow a
/// later one in an isolated sum still leaves it visible once the first difference is folded
/// in first.
fn add_counter_resets(result: f64, values: &[f64]) -> f64 {
pub(crate) fn add_counter_resets(result: f64, values: &[f64]) -> f64 {
values
.windows(2)
.filter(|pair| pair[1] < pair[0])
+33 -24
View File
@@ -140,30 +140,16 @@ impl<const IS_RATE: bool> IDelta<IS_RATE> {
let last_offset = ts_offset + last_position;
let prev_offset = ts_offset + prev_position;
let sampled_interval_ms = ts_values[last_offset] - ts_values[prev_offset];
// Sub-millisecond samples round to the same ms; skip instead of dividing by zero.
if sampled_interval_ms == 0 {
result_builder.append_null();
continue;
}
let sampled_interval = sampled_interval_ms as f64 / 1000.0;
let last_value = value_values[value_offset + last_position];
let prev_value = value_values[value_offset + prev_position];
if !IS_RATE {
result_builder.append_value(last_value - prev_value);
continue;
}
let result_value = if last_value < prev_value {
// counter reset
last_value
} else {
last_value - prev_value
};
result_builder.append_value(result_value / sampled_interval);
result_builder.append_option(instant_delta::<IS_RATE>(
(
ts_values[prev_offset],
value_values[value_offset + prev_position],
),
(
ts_values[last_offset],
value_values[value_offset + last_position],
),
));
}
let result = ColumnarValue::Array(Arc::new(result_builder.finish()));
@@ -171,6 +157,29 @@ impl<const IS_RATE: bool> IDelta<IS_RATE> {
}
}
/// `irate` (`IS_RATE`) or `idelta` of the last two samples of a window, as
/// `(timestamp, value)` pairs.
pub(crate) fn instant_delta<const IS_RATE: bool>(
(prev_ts, prev_value): (i64, f64),
(last_ts, last_value): (i64, f64),
) -> Option<f64> {
let sampled_interval_ms = last_ts - prev_ts;
// Sub-millisecond samples round to the same ms; skip instead of dividing by zero.
if sampled_interval_ms == 0 {
return None;
}
if !IS_RATE {
return Some(last_value - prev_value);
}
let result_value = if last_value < prev_value {
// counter reset
last_value
} else {
last_value - prev_value
};
Some(result_value / (sampled_interval_ms as f64 / 1000.0))
}
/// Locates the last two samples inside `[offset, offset + len)`, returning their positions
/// relative to `offset`. Returns `None` when the window holds fewer than two samples.
fn last_two_samples(values: &Float64Array, offset: usize, len: usize) -> Option<(usize, usize)> {
+342
View File
@@ -0,0 +1,342 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! A port of Go's `sort.Sort` / `slices.SortFunc` (pattern-defeating quicksort, Go 1.19+).
//!
//! Prometheus orders results with these, and with comparators that are not total orders
//! (NaN ranks first in `Less` against everything, `natsort.Compare` holds both ways for "1"
//! and "01"). The order of such elements is part of the result, and Rust's sorts may panic on
//! such comparators, so the exact algorithm is reproduced.
/// Sorts `v` the way Go's `sort.Sort` does with `less` as `Less`.
pub(crate) fn sort_by<T>(v: &mut [T], mut less: impl FnMut(&T, &T) -> bool) {
let n = v.len();
if n <= 1 {
return;
}
let limit = bit_len(n);
let mut sorter = Sorter { v, less: &mut less };
sorter.pdqsort(0, n, limit);
}
fn bit_len(n: usize) -> usize {
(usize::BITS - n.leading_zeros()) as usize
}
#[derive(PartialEq, Eq)]
enum Hint {
Unknown,
Increasing,
Decreasing,
}
struct Sorter<'a, T, F> {
v: &'a mut [T],
less: &'a mut F,
}
impl<T, F: FnMut(&T, &T) -> bool> Sorter<'_, T, F> {
fn less(&mut self, i: usize, j: usize) -> bool {
(self.less)(&self.v[i], &self.v[j])
}
fn swap(&mut self, i: usize, j: usize) {
self.v.swap(i, j);
}
fn insertion_sort(&mut self, a: usize, b: usize) {
for i in a + 1..b {
let mut j = i;
while j > a && self.less(j, j - 1) {
self.swap(j, j - 1);
j -= 1;
}
}
}
fn sift_down(&mut self, lo: usize, hi: usize, first: usize) {
let mut root = lo;
loop {
let mut child = 2 * root + 1;
if child >= hi {
break;
}
if child + 1 < hi && self.less(first + child, first + child + 1) {
child += 1;
}
if !self.less(first + root, first + child) {
return;
}
self.swap(first + root, first + child);
root = child;
}
}
fn heap_sort(&mut self, a: usize, b: usize) {
let first = a;
let hi = b - a;
for i in (0..=(hi - 1) / 2).rev() {
self.sift_down(i, hi, first);
}
for i in (0..hi).rev() {
self.swap(first, first + i);
self.sift_down(0, i, first);
}
}
fn pdqsort(&mut self, mut a: usize, mut b: usize, mut limit: usize) {
const MAX_INSERTION: usize = 12;
let mut was_balanced = true;
let mut was_partitioned = true;
loop {
let length = b - a;
if length <= MAX_INSERTION {
self.insertion_sort(a, b);
return;
}
if limit == 0 {
self.heap_sort(a, b);
return;
}
if !was_balanced {
self.break_patterns(a, b);
limit -= 1;
}
let (mut pivot, mut hint) = self.choose_pivot(a, b);
if hint == Hint::Decreasing {
self.reverse_range(a, b);
pivot = (b - 1) - (pivot - a);
hint = Hint::Increasing;
}
if was_balanced
&& was_partitioned
&& hint == Hint::Increasing
&& self.partial_insertion_sort(a, b)
{
return;
}
if a > 0 && !self.less(a - 1, pivot) {
a = self.partition_equal(a, b, pivot);
continue;
}
let (mid, already_partitioned) = self.partition(a, b, pivot);
was_partitioned = already_partitioned;
let (left_len, right_len) = (mid - a, b - mid);
let balance_threshold = length / 8;
if left_len < right_len {
was_balanced = left_len >= balance_threshold;
self.pdqsort(a, mid, limit);
a = mid + 1;
} else {
was_balanced = right_len >= balance_threshold;
self.pdqsort(mid + 1, b, limit);
b = mid;
}
}
}
// Indices stay signed here: `j` can step to `a` - 1 when nothing is below the pivot.
fn partition(&mut self, a: usize, b: usize, pivot: usize) -> (usize, bool) {
self.swap(a, pivot);
let (mut i, mut j) = (a as isize + 1, b as isize - 1);
let at = |k: isize| k as usize;
while i <= j && self.less(at(i), a) {
i += 1;
}
while i <= j && !self.less(at(j), a) {
j -= 1;
}
if i > j {
self.swap(at(j), a);
return (at(j), true);
}
self.swap(at(i), at(j));
i += 1;
j -= 1;
loop {
while i <= j && self.less(at(i), a) {
i += 1;
}
while i <= j && !self.less(at(j), a) {
j -= 1;
}
if i > j {
break;
}
self.swap(at(i), at(j));
i += 1;
j -= 1;
}
self.swap(at(j), a);
(at(j), false)
}
fn partition_equal(&mut self, a: usize, b: usize, pivot: usize) -> usize {
self.swap(a, pivot);
let (mut i, mut j) = (a as isize + 1, b as isize - 1);
let at = |k: isize| k as usize;
loop {
while i <= j && !self.less(a, at(i)) {
i += 1;
}
while i <= j && self.less(a, at(j)) {
j -= 1;
}
if i > j {
break;
}
self.swap(at(i), at(j));
i += 1;
j -= 1;
}
at(i)
}
fn partial_insertion_sort(&mut self, a: usize, b: usize) -> bool {
const MAX_STEPS: usize = 5;
const SHORTEST_SHIFTING: usize = 50;
let mut i = a + 1;
for _ in 0..MAX_STEPS {
while i < b && !self.less(i, i - 1) {
i += 1;
}
if i == b {
return true;
}
if b - a < SHORTEST_SHIFTING {
return false;
}
self.swap(i, i - 1);
if i - a >= 2 {
let mut j = i - 1;
while j >= 1 {
if !self.less(j, j - 1) {
break;
}
self.swap(j, j - 1);
j -= 1;
}
}
if b - i >= 2 {
for j in i + 1..b {
if !self.less(j, j - 1) {
break;
}
self.swap(j, j - 1);
}
}
}
false
}
fn break_patterns(&mut self, a: usize, b: usize) {
let length = b - a;
if length >= 8 {
let mut random = length as u64;
let modulus = 1usize << bit_len(length);
for idx in a + (length / 4) * 2 - 1..=a + (length / 4) * 2 + 1 {
random ^= random << 13;
random ^= random >> 7;
random ^= random << 17;
let mut other = (random as usize) & (modulus - 1);
if other >= length {
other -= length;
}
self.swap(idx, a + other);
}
}
}
fn choose_pivot(&mut self, a: usize, b: usize) -> (usize, Hint) {
const SHORTEST_NINTHER: usize = 50;
const MAX_SWAPS: usize = 4 * 3;
let l = b - a;
let mut swaps = 0;
let mut i = a + l / 4;
let mut j = a + l / 4 * 2;
let mut k = a + l / 4 * 3;
if l >= 8 {
if l >= SHORTEST_NINTHER {
i = self.median(i - 1, i, i + 1, &mut swaps);
j = self.median(j - 1, j, j + 1, &mut swaps);
k = self.median(k - 1, k, k + 1, &mut swaps);
}
j = self.median(i, j, k, &mut swaps);
}
match swaps {
0 => (j, Hint::Increasing),
MAX_SWAPS => (j, Hint::Decreasing),
_ => (j, Hint::Unknown),
}
}
fn order2(&mut self, a: usize, b: usize, swaps: &mut usize) -> (usize, usize) {
if self.less(b, a) {
*swaps += 1;
return (b, a);
}
(a, b)
}
fn median(&mut self, a: usize, b: usize, c: usize, swaps: &mut usize) -> usize {
let (a, b) = self.order2(a, b, swaps);
let (b, _) = self.order2(b, c, swaps);
let (_, b) = self.order2(a, b, swaps);
b
}
fn reverse_range(&mut self, a: usize, b: usize) {
let (mut i, mut j) = (a, b - 1);
while i < j {
self.swap(i, j);
i += 1;
j -= 1;
}
}
}
#[cfg(test)]
mod tests {
/// Orders produced by Go's `sort.Sort` (and identically `slices.SortFunc`), generated by
/// promql-compat `cmd/narthex-golden-gosort`; line format: `kind keys | ids`.
#[test]
fn matches_go_sort_on_comparators_that_are_not_total_orders() {
let text = include_str!("go_sort_cases.txt");
let mut cases = 0;
for line in text.lines() {
let (head, expected) = line.split_once(" | ").unwrap();
let (kind, keys) = head.split_once(' ').unwrap();
let kind: u8 = kind.parse().unwrap();
let parse = |list: &str| -> Vec<usize> {
list.split(',')
.filter(|item| !item.is_empty())
.map(|item| item.trim().parse().unwrap())
.collect()
};
let mut items: Vec<(usize, usize)> = parse(keys).into_iter().zip(0..).collect();
super::sort_by(&mut items, |&(a, a_id), &(b, b_id)| match kind {
0 => a < b,
1 => a == 0 || a < b,
2 => a % 3 < b % 3,
_ => (a_id * 31 + b_id * 17) % 5 < 2,
});
let actual: Vec<usize> = items.iter().map(|&(_, id)| id).collect();
assert_eq!(actual, parse(expected), "{line}");
cases += 1;
}
assert!(cases >= 200);
}
}
+208
View File
@@ -0,0 +1,208 @@
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
2 |
2 |
2 |
2 |
3 |
3 |
3 |
3 |
0 0 | 0
0 0 | 0
0 1 | 0
0 0 | 0
1 0 | 0
1 0 | 0
1 1 | 0
1 0 | 0
2 0 | 0
2 0 | 0
2 1 | 0
2 0 | 0
3 0 | 0
3 0 | 0
3 1 | 0
3 0 | 0
0 1,0 | 1,0
0 0,1 | 0,1
0 2,1 | 1,0
0 0,1 | 0,1
1 1,0 | 1,0
1 0,1 | 0,1
1 2,1 | 1,0
1 0,1 | 0,1
2 0,0 | 0,1
2 0,1 | 0,1
2 2,1 | 1,0
2 0,1 | 0,1
3 0,1 | 1,0
3 0,1 | 1,0
3 2,1 | 1,0
3 0,1 | 1,0
0 0,2,1,2,0 | 0,4,2,1,3
0 0,1,2,3,4 | 0,1,2,3,4
0 5,4,3,2,1 | 4,3,2,1,0
0 0,1,2,3,4 | 0,1,2,3,4
1 2,2,2,2,0 | 4,0,1,2,3
1 0,1,2,3,4 | 0,1,2,3,4
1 5,4,3,2,1 | 4,3,2,1,0
1 0,1,2,3,4 | 0,1,2,3,4
2 2,1,0,1,1 | 2,1,3,4,0
2 0,1,2,3,4 | 0,3,1,4,2
2 5,4,3,2,1 | 2,1,4,0,3
2 0,1,2,3,4 | 0,3,1,4,2
3 1,0,0,1,0 | 1,0,2,4,3
3 0,1,2,3,4 | 1,0,2,4,3
3 5,4,3,2,1 | 1,0,2,4,3
3 0,1,2,3,4 | 1,0,2,4,3
0 6,4,3,6,0,0,5,4,6,3,6,0 | 4,5,11,2,9,1,7,6,0,3,8,10
0 0,1,2,3,4,5,6,7,8,9,10,11 | 0,1,2,3,4,5,6,7,8,9,10,11
0 12,11,10,9,8,7,6,5,4,3,2,1 | 11,10,9,8,7,6,5,4,3,2,1,0
0 0,1,2,3,4,5,6,0,1,2,3,4 | 0,7,1,8,2,9,3,10,4,11,5,6
1 6,1,1,4,6,4,6,0,5,0,1,4 | 9,7,1,2,10,3,5,11,8,0,4,6
1 0,1,2,3,4,5,6,7,8,9,10,11 | 0,1,2,3,4,5,6,7,8,9,10,11
1 12,11,10,9,8,7,6,5,4,3,2,1 | 11,10,9,8,7,6,5,4,3,2,1,0
1 0,1,2,3,4,5,6,0,1,2,3,4 | 7,0,1,8,2,9,3,10,4,11,5,6
2 2,3,5,6,5,0,1,3,5,4,0,1 | 1,3,5,7,10,6,9,11,0,2,4,8
2 0,1,2,3,4,5,6,7,8,9,10,11 | 0,3,6,9,1,4,7,10,2,5,8,11
2 12,11,10,9,8,7,6,5,4,3,2,1 | 0,3,6,9,2,5,8,11,1,4,7,10
2 0,1,2,3,4,5,6,0,1,2,3,4 | 0,3,6,7,10,1,4,8,11,2,5,9
3 5,2,1,0,1,2,3,4,0,0,6,5 | 1,0,2,4,5,3,6,7,9,10,8,11
3 0,1,2,3,4,5,6,7,8,9,10,11 | 1,0,2,4,5,3,6,7,9,10,8,11
3 12,11,10,9,8,7,6,5,4,3,2,1 | 1,0,2,4,5,3,6,7,9,10,8,11
3 0,1,2,3,4,5,6,0,1,2,3,4 | 1,0,2,4,5,3,6,7,9,10,8,11
0 0,1,0,3,5,3,4,6,1,5,6,3,6 | 2,0,8,1,3,11,5,6,9,4,7,10,12
0 0,1,2,3,4,5,6,7,8,9,10,11,12 | 0,1,2,3,4,5,6,7,8,9,10,11,12
0 13,12,11,10,9,8,7,6,5,4,3,2,1 | 12,11,10,9,8,7,6,5,4,3,2,1,0
0 0,1,2,3,4,5,6,0,1,2,3,4,5 | 7,0,1,8,2,9,3,10,4,11,5,12,6
1 5,3,4,6,6,6,2,6,3,5,3,5,3 | 6,1,12,10,8,2,9,0,11,7,5,4,3
1 0,1,2,3,4,5,6,7,8,9,10,11,12 | 0,1,2,3,4,5,6,7,8,9,10,11,12
1 13,12,11,10,9,8,7,6,5,4,3,2,1 | 12,11,10,9,8,7,6,5,4,3,2,1,0
1 0,1,2,3,4,5,6,0,1,2,3,4,5 | 0,7,1,8,2,9,3,10,4,11,5,12,6
2 0,1,0,5,4,0,6,1,5,5,6,2,0 | 10,2,0,5,6,12,1,4,7,3,9,11,8
2 0,1,2,3,4,5,6,7,8,9,10,11,12 | 6,3,0,9,12,1,4,7,10,2,5,8,11
2 13,12,11,10,9,8,7,6,5,4,3,2,1 | 4,1,10,7,6,0,3,9,12,5,8,2,11
2 0,1,2,3,4,5,6,0,1,2,3,4,5 | 6,3,0,7,10,1,4,8,11,2,5,9,12
3 3,2,6,4,6,5,6,6,4,0,4,3,4 | 10,5,9,0,4,3,6,7,8,1,11,12,2
3 0,1,2,3,4,5,6,7,8,9,10,11,12 | 10,5,9,0,4,3,6,7,8,1,11,12,2
3 13,12,11,10,9,8,7,6,5,4,3,2,1 | 10,5,9,0,4,3,6,7,8,1,11,12,2
3 0,1,2,3,4,5,6,0,1,2,3,4,5 | 10,5,9,0,4,3,6,7,8,1,11,12,2
0 9,8,10,6,6,4,0,9,2,3,3,1,6,7,4,4,6,7,6,0 | 6,19,11,8,10,9,5,14,15,16,3,12,4,18,13,17,1,0,7,2
0 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 | 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
0 20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
0 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5 | 14,0,7,1,15,8,9,2,16,10,3,17,11,4,18,12,5,19,6,13
1 4,9,1,1,3,5,7,2,8,3,6,4,0,6,9,2,7,2,2,4 | 12,2,3,18,7,17,15,4,9,19,0,11,5,13,10,16,6,8,14,1
1 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 | 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
1 20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
1 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5 | 7,0,14,1,15,8,9,2,16,10,3,17,11,4,18,12,5,19,6,13
2 8,9,7,5,10,4,2,2,2,8,6,6,4,9,0,5,8,2,9,5 | 10,1,18,14,13,11,5,12,2,4,6,0,7,9,3,15,16,17,8,19
2 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 | 9,18,15,3,12,0,6,10,7,4,13,16,1,19,8,5,11,14,2,17
2 20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 8,17,2,14,11,5,10,16,19,1,7,4,13,12,3,15,0,9,18,6
2 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5 | 10,17,0,3,14,13,6,7,15,8,11,4,1,18,9,12,5,2,16,19
3 9,1,5,6,6,10,10,8,10,7,1,5,4,1,5,4,8,2,7,3 | 1,16,11,6,5,15,0,10,9,8,12,7,13,3,17,2,18,4,14,19
3 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 | 1,16,11,6,5,15,0,10,9,8,12,7,13,3,17,2,18,4,14,19
3 20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 1,16,11,6,5,15,0,10,9,8,12,7,13,3,17,2,18,4,14,19
3 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5 | 1,16,11,6,5,15,0,10,9,8,12,7,13,3,17,2,18,4,14,19
0 3,13,18,6,19,7,7,2,0,6,3,20,17,18,20,21,11,7,20,10,22,4,11,10,20,4,4,14,10,1,6,7,16,0,14,12,8,11,4,10,9,15,19,14,15,12,15,0,9 | 33,47,8,29,7,0,10,21,26,25,38,9,30,3,17,5,31,6,36,48,40,23,19,39,28,22,16,37,35,45,1,27,34,43,41,44,46,32,12,13,2,42,4,24,18,14,11,15,20
0 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48 | 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48
0 49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
0 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6 | 7,0,28,14,35,42,21,36,8,22,1,43,15,29,44,30,16,2,37,23,9,24,31,10,38,17,45,3,25,4,39,11,32,18,46,40,5,47,33,12,19,26,34,13,27,41,20,6,48
1 23,10,18,21,15,24,19,20,11,13,22,19,20,24,12,24,18,6,23,2,20,22,21,17,1,15,7,4,17,4,6,21,5,11,18,3,16,9,17,8,8,3,3,24,9,0,24,6,12 | 45,24,19,35,41,42,29,27,32,30,47,17,26,39,40,37,44,1,33,8,14,48,9,25,4,36,38,28,23,16,2,34,6,11,7,20,12,3,31,22,10,21,0,18,13,43,15,5,46
1 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48 | 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48
1 49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
1 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6 | 21,42,35,14,28,0,7,36,8,22,1,43,15,29,44,30,16,2,37,23,9,24,31,10,38,17,45,3,25,4,39,11,32,18,46,40,5,47,33,12,19,26,34,13,27,41,20,6,48
2 11,17,14,8,9,21,23,24,12,7,24,14,6,21,8,3,16,1,2,12,11,1,5,12,14,23,12,5,9,3,9,11,2,18,20,21,3,15,20,6,5,1,9,16,6,20,5,9,2 | 36,37,47,44,4,5,42,7,8,39,10,26,12,13,35,15,33,30,29,19,28,23,17,21,43,9,41,16,3,14,20,31,32,22,27,24,0,11,38,18,40,25,6,1,34,45,46,2,48
2 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48 | 24,18,48,3,45,42,6,39,36,9,33,30,12,27,0,15,21,37,10,19,46,16,22,4,1,43,25,13,28,40,7,31,34,41,29,35,8,26,38,11,32,14,5,17,44,23,20,47,2
2 49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 16,1,46,43,4,40,37,7,34,31,10,28,25,13,22,19,24,33,18,15,48,21,45,3,0,12,42,27,39,6,30,9,36,41,26,35,32,29,38,8,11,17,5,23,44,14,2,47,20
2 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6 | 21,48,45,3,42,41,6,7,38,0,10,35,34,13,14,31,28,17,27,24,20,36,11,1,46,25,43,18,4,29,39,15,32,8,22,12,16,37,33,30,40,5,9,26,44,2,19,47,23
3 17,3,0,18,5,8,6,15,8,9,17,23,12,23,22,3,8,2,21,23,13,6,24,6,15,6,7,2,2,4,8,5,11,12,12,4,21,18,23,6,15,22,20,19,6,24,24,20,19 | 12,7,42,32,47,27,2,17,22,37,38,33,8,13,43,28,3,48,18,23,24,35,1,19,4,46,26,16,44,29,6,31,14,11,34,21,36,41,9,39,20,0,25,45,15,5,30,10,40
3 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48 | 12,7,42,32,47,27,2,17,22,37,38,33,8,13,43,28,3,48,18,23,24,35,1,19,4,46,26,16,44,29,6,31,14,11,34,21,36,41,9,39,20,0,25,45,15,5,30,10,40
3 49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 12,7,42,32,47,27,2,17,22,37,38,33,8,13,43,28,3,48,18,23,24,35,1,19,4,46,26,16,44,29,6,31,14,11,34,21,36,41,9,39,20,0,25,45,15,5,30,10,40
3 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6 | 12,7,42,32,47,27,2,17,22,37,38,33,8,13,43,28,3,48,18,23,24,35,1,19,4,46,26,16,44,29,6,31,14,11,34,21,36,41,9,39,20,0,25,45,15,5,30,10,40
0 23,25,24,5,17,14,17,14,3,12,1,13,3,17,25,13,15,13,17,22,2,9,15,12,7,3,19,9,12,7,0,24,14,17,18,20,5,20,12,0,15,18,21,6,25,7,1,11,12,24 | 30,39,46,10,20,12,25,8,3,36,43,45,29,24,27,21,47,38,9,23,28,48,11,17,15,5,32,7,16,22,40,13,18,4,6,33,41,34,26,37,35,42,19,0,31,2,49,14,44,1
0 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49 | 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49
0 50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
0 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0 | 35,21,0,49,28,14,42,7,15,22,1,36,8,29,43,9,16,30,44,2,23,37,24,17,3,10,38,45,31,46,4,18,32,39,11,25,12,5,19,33,40,47,26,20,13,27,6,41,48,34
1 24,19,4,9,21,6,22,5,5,1,1,6,6,2,13,16,1,0,4,17,4,20,13,20,25,9,16,23,12,25,14,19,0,17,11,20,19,12,24,6,12,18,21,24,1,0,3,3,21,14 | 17,32,45,9,44,10,16,13,47,46,20,18,2,8,7,39,12,11,5,25,3,34,28,37,40,22,14,49,30,26,15,19,33,41,36,1,31,21,35,23,48,4,42,6,27,38,43,0,24,29
1 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49 | 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49
1 50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
1 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0 | 7,42,14,28,49,0,21,35,15,22,1,36,8,29,43,9,16,30,44,2,23,37,24,17,3,10,38,45,31,46,4,18,32,39,11,25,12,5,19,33,40,47,26,20,13,27,6,41,48,34
2 23,8,5,18,5,6,15,24,2,10,12,23,8,20,1,4,24,19,13,3,19,9,0,24,17,17,3,4,3,12,8,24,11,15,17,20,2,9,8,14,6,9,7,24,4,21,22,1,19,2 | 16,22,31,3,37,5,6,7,33,29,10,28,43,26,40,41,45,23,21,19,20,18,14,15,17,48,42,27,44,9,46,47,24,32,34,35,36,30,38,39,25,0,13,12,11,8,4,2,1,49
2 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49 | 18,48,45,3,42,39,6,36,33,9,30,27,12,0,24,15,21,25,4,19,49,16,22,1,46,13,43,40,28,37,10,31,7,34,17,26,32,29,38,5,35,11,8,41,44,2,14,47,23,20
2 50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 17,47,2,44,41,5,38,35,8,32,29,11,26,23,14,20,25,34,49,19,1,46,22,13,43,16,4,40,28,10,37,31,7,0,42,9,36,30,6,39,27,12,33,24,3,45,21,15,48,18
2 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0 | 24,49,48,3,45,42,6,7,41,38,10,35,34,13,14,31,28,17,27,0,20,21,25,11,22,1,46,18,4,29,43,15,32,8,39,36,5,2,9,12,40,33,44,23,37,16,26,47,30,19
3 12,11,5,17,3,6,23,16,22,15,25,22,21,6,16,12,25,2,11,21,2,23,0,18,9,11,3,18,24,4,14,5,10,10,4,24,4,16,10,10,7,16,6,1,15,13,1,15,1,6 | 36,1,46,26,41,31,16,6,11,21,15,0,20,5,25,40,30,45,10,35,34,49,22,47,24,17,14,27,2,29,44,12,32,42,19,9,4,37,7,39,38,8,33,43,13,3,28,23,48,18
3 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49 | 36,1,46,26,41,31,16,6,11,21,15,0,20,5,25,40,30,45,10,35,34,49,22,47,24,17,14,27,2,29,44,12,32,42,19,9,4,37,7,39,38,8,33,43,13,3,28,23,48,18
3 50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 36,1,46,26,41,31,16,6,11,21,15,0,20,5,25,40,30,45,10,35,34,49,22,47,24,17,14,27,2,29,44,12,32,42,19,9,4,37,7,39,38,8,33,43,13,3,28,23,48,18
3 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0 | 36,1,46,26,41,31,16,6,11,21,15,0,20,5,25,40,30,45,10,35,34,49,22,47,24,17,14,27,2,29,44,12,32,42,19,9,4,37,7,39,38,8,33,43,13,3,28,23,48,18
0 7,12,11,20,8,3,9,20,12,12,15,1,7,2,18,9,12,9,9,23,25,20,0,8,8,18,13,1,0,10,16,18,22,16,15,14,16,6,13,2,25,6,0,2,25,0,8,13,11,16,11 | 28,45,22,42,27,11,39,43,13,5,37,41,0,12,24,23,4,46,15,17,18,6,29,2,48,50,1,9,8,16,26,47,38,35,10,34,33,30,36,49,14,31,25,3,7,21,32,19,40,44,20
0 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50 | 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50
0 51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
0 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1 | 42,21,0,28,49,14,35,7,15,29,8,22,36,43,1,50,16,30,9,23,2,44,37,24,10,3,45,38,31,17,11,25,32,4,46,18,39,26,47,12,40,19,33,5,6,13,34,27,48,20,41
1 8,1,0,0,19,11,24,7,3,0,14,15,14,21,5,14,10,16,8,4,23,18,5,25,23,25,17,11,2,25,19,23,2,3,9,9,5,20,24,25,7,17,2,14,21,6,15,21,21,11,6 | 9,2,3,1,28,32,42,33,8,19,36,22,14,50,45,7,40,0,18,34,35,16,49,27,5,12,15,43,10,11,46,17,26,41,21,4,30,37,13,44,47,48,20,24,31,38,6,39,23,25,29
1 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50 | 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50
1 51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
1 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1 | 7,35,14,49,28,0,21,42,15,29,8,22,36,43,1,50,16,30,9,23,2,44,37,24,10,3,45,38,31,17,11,25,32,4,46,18,39,26,47,12,40,19,33,5,6,13,34,27,48,20,41
2 18,23,0,11,6,16,0,17,12,13,4,1,25,1,5,4,11,7,23,10,25,25,5,13,0,21,19,0,24,24,16,22,25,10,16,16,5,1,20,2,16,13,9,24,22,17,13,2,6,10,10 | 24,48,2,43,4,42,6,29,8,28,27,25,0,12,32,15,50,17,49,19,20,21,46,23,13,11,26,10,9,44,30,31,5,33,34,35,41,37,40,39,38,36,14,3,7,45,22,47,1,18,16
2 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50 | 18,48,45,3,42,39,6,36,33,9,30,27,12,0,24,15,21,25,4,19,49,16,22,1,46,13,43,40,28,37,10,31,7,34,17,26,32,29,38,5,11,41,35,44,8,2,14,47,23,20,50
2 51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 18,48,45,3,42,39,6,36,33,9,30,27,12,24,0,15,21,23,17,50,20,47,2,14,44,41,26,11,5,29,38,35,32,8,34,43,7,37,10,28,40,25,4,31,13,22,46,16,1,49,19
2 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1 | 24,49,48,3,45,42,6,7,41,38,10,35,34,13,14,31,28,17,27,0,20,21,25,29,22,50,1,18,46,39,4,15,32,43,8,11,36,37,9,23,40,12,5,33,44,30,16,47,2,26,19
3 11,3,19,10,13,24,14,2,18,5,10,5,14,7,18,21,21,23,18,0,25,22,4,23,4,9,7,0,16,20,23,3,0,0,0,25,11,17,7,14,13,23,21,15,0,24,14,18,18,16,2 | 41,31,21,46,16,36,6,1,26,11,45,15,30,50,40,5,25,20,0,10,35,42,48,23,3,18,43,8,28,38,33,13,27,17,47,37,32,12,22,2,7,9,19,39,44,4,24,29,34,49,14
3 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50 | 41,31,21,46,16,36,6,1,26,11,45,15,30,50,40,5,25,20,0,10,35,42,48,23,3,18,43,8,28,38,33,13,27,17,47,37,32,12,22,2,7,9,19,39,44,4,24,29,34,49,14
3 51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 41,31,21,46,16,36,6,1,26,11,45,15,30,50,40,5,25,20,0,10,35,42,48,23,3,18,43,8,28,38,33,13,27,17,47,37,32,12,22,2,7,9,19,39,44,4,24,29,34,49,14
3 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1 | 41,31,21,46,16,36,6,1,26,11,45,15,30,50,40,5,25,20,0,10,35,42,48,23,3,18,43,8,28,38,33,13,27,17,47,37,32,12,22,2,7,9,19,39,44,4,24,29,34,49,14
0 0,5,13,1,12,30,1,25,26,18,15,21,15,0,4,21,3,16,3,5,9,24,4,21,14,18,11,0,1,5,2,13,28,6,1,22,12,23,21,29,4,15,1,5,10,9,31,17,11,14,16,0,5,6,19,23,18,26,29,2,27,17,26,10 | 27,0,51,13,6,28,3,42,34,59,30,18,16,40,14,22,52,29,1,19,43,53,33,20,45,63,44,26,48,36,4,2,31,49,24,12,41,10,50,17,61,47,56,9,25,54,23,15,11,38,35,55,37,21,7,8,57,62,60,32,58,39,5,46
0 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63 | 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63
0 64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
0 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0 | 56,28,49,21,63,42,0,7,14,35,8,57,50,43,1,15,22,29,36,9,37,2,16,23,51,58,44,30,24,10,52,31,45,59,38,3,17,32,46,39,4,60,11,53,18,25,19,5,40,61,47,26,33,12,54,55,27,13,6,34,41,20,62,48
1 14,24,10,27,16,19,18,1,21,5,21,3,22,3,20,2,1,14,10,5,1,22,22,13,0,0,21,12,9,7,21,24,1,4,8,26,19,3,15,21,24,7,20,8,24,20,32,3,6,11,1,14,21,14,30,12,14,14,17,11,11,29,26,26 | 24,25,50,32,7,20,16,15,13,47,37,11,33,9,19,48,41,29,43,34,28,2,18,49,59,60,55,27,23,51,57,0,17,56,53,38,4,58,6,5,36,45,14,42,8,30,39,10,26,52,21,12,22,31,1,44,40,62,35,63,3,61,54,46
1 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63 | 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63
1 64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
1 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0 | 56,7,0,42,14,35,21,49,28,63,29,57,8,43,50,15,22,36,1,9,37,2,16,23,51,58,44,30,24,10,52,31,45,59,38,3,17,32,46,39,4,60,11,53,18,25,19,5,40,61,47,26,33,12,54,55,27,13,6,34,41,20,62,48
2 27,13,32,1,15,10,27,9,22,21,16,3,32,6,15,15,21,24,2,31,4,26,10,24,10,17,1,17,27,26,11,12,31,14,11,28,18,2,12,16,2,12,26,5,19,22,1,27,17,17,13,13,2,6,4,3,14,5,29,8,2,19,14,32 | 23,4,6,7,9,55,53,47,41,38,11,36,0,13,14,15,16,17,31,28,32,51,22,20,24,61,26,1,19,54,3,50,5,46,45,35,44,8,10,39,52,33,42,43,2,34,21,12,48,49,37,18,56,30,29,27,40,57,58,59,60,25,62,63
2 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63 | 24,63,60,3,57,54,6,51,48,9,45,42,12,39,36,15,33,0,18,30,27,21,31,43,22,25,1,61,28,58,19,4,55,16,34,52,7,37,49,13,40,46,10,53,5,11,41,47,8,38,50,14,35,44,32,23,56,17,29,59,2,20,62,26
2 64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 22,1,61,58,4,55,52,7,49,46,10,43,40,13,37,34,16,31,28,19,25,33,6,63,24,60,3,27,18,57,30,54,21,0,15,51,36,48,9,39,12,45,42,53,17,41,38,47,14,8,50,35,32,44,5,11,56,29,26,59,20,2,62,23
2 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0 | 28,63,62,3,59,56,6,7,55,52,10,49,48,13,14,0,45,17,42,41,20,21,38,35,24,34,31,27,15,46,1,60,32,4,25,57,36,29,22,39,8,53,18,43,50,11,37,40,12,16,44,51,9,19,54,47,5,23,58,33,26,61,2,30
3 6,3,27,8,19,1,0,31,30,21,21,12,10,25,24,23,27,26,24,23,25,19,17,7,27,13,25,24,6,13,22,6,10,13,22,31,30,15,24,2,19,29,17,2,28,9,9,15,16,20,0,27,26,12,4,0,4,30,32,30,5,13,2,25 | 41,6,31,36,61,46,11,26,56,1,21,51,16,2,22,47,62,57,7,17,52,42,12,27,37,32,53,63,28,3,30,23,0,33,60,35,20,58,38,5,40,18,15,43,8,45,55,13,48,25,50,10,9,49,54,14,44,39,19,59,34,4,29,24
3 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63 | 41,6,31,36,61,46,11,26,56,1,21,51,16,2,22,47,62,57,7,17,52,42,12,27,37,32,53,63,28,3,30,23,0,33,60,35,20,58,38,5,40,18,15,43,8,45,55,13,48,25,50,10,9,49,54,14,44,39,19,59,34,4,29,24
3 64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 41,6,31,36,61,46,11,26,56,1,21,51,16,2,22,47,62,57,7,17,52,42,12,27,37,32,53,63,28,3,30,23,0,33,60,35,20,58,38,5,40,18,15,43,8,45,55,13,48,25,50,10,9,49,54,14,44,39,19,59,34,4,29,24
3 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0 | 41,6,31,36,61,46,11,26,56,1,21,51,16,2,22,47,62,57,7,17,52,42,12,27,37,32,53,63,28,3,30,23,0,33,60,35,20,58,38,5,40,18,15,43,8,45,55,13,48,25,50,10,9,49,54,14,44,39,19,59,34,4,29,24
0 19,7,7,31,49,38,37,49,50,48,20,6,43,43,13,41,27,45,2,16,31,30,5,31,31,42,47,29,43,34,21,50,36,14,45,14,22,44,11,11,26,9,31,35,24,42,1,3,22,39,41,2,3,21,9,25,0,30,50,26,30,45,20,17,19,4,44,39,16,30,17,19,35,47,37,22,11,37,6,46,13,24,23,15,46,42,24,41,31,8,15,48,8,26,45,31,8,34,11,34 | 56,46,18,51,47,52,65,22,78,11,1,2,96,92,89,54,41,38,76,98,39,14,80,33,35,90,83,19,68,70,63,71,0,64,62,10,53,30,36,75,48,82,81,44,86,55,40,93,59,16,27,60,57,69,21,42,95,24,3,20,88,23,97,29,99,43,72,32,6,74,77,5,49,67,87,50,15,45,85,25,12,13,28,37,66,34,94,61,17,79,84,26,73,91,9,7,4,31,58,8
0 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99 | 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99
0 100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
0 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1 | 21,56,63,49,70,98,42,7,35,77,28,84,0,91,14,29,99,57,1,64,85,15,22,50,43,92,71,36,8,78,44,86,79,58,30,2,51,37,23,65,72,93,16,9,24,87,31,66,73,94,52,80,45,38,10,59,3,17,25,39,60,4,95,11,53,88,18,67,81,32,46,74,89,19,61,75,5,96,33,54,12,68,82,47,26,40,20,69,48,55,90,13,27,83,6,62,34,97,76,41
1 35,27,50,10,46,32,25,24,16,24,36,50,16,38,19,19,47,37,32,1,12,38,30,39,14,15,44,45,11,50,29,8,48,40,49,31,21,36,47,24,26,40,48,15,27,14,33,41,18,28,11,30,28,19,18,20,46,28,11,48,47,4,8,26,5,14,42,17,23,20,38,0,30,45,2,0,30,38,50,31,9,49,42,11,9,36,39,45,41,49,3,36,35,45,1,7,5,14,46,27 | 75,71,94,19,74,90,61,96,64,95,62,31,80,84,3,28,83,58,50,20,65,45,97,24,25,43,12,8,67,48,54,14,15,53,69,55,36,68,39,9,7,6,40,63,99,1,44,52,49,57,30,22,51,72,76,79,35,5,18,46,92,0,91,37,85,10,17,77,13,21,70,23,86,41,33,88,47,66,82,26,87,93,73,27,4,98,56,38,16,60,42,32,59,89,81,34,29,2,78,11
1 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99 | 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99
1 100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
1 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1 | 84,28,77,35,7,91,98,70,49,63,56,0,14,21,42,29,99,57,1,64,85,15,22,50,43,92,71,36,8,78,44,86,79,58,30,2,51,37,23,65,72,93,16,9,24,87,31,66,73,94,52,80,45,38,10,59,3,17,25,39,60,4,95,11,53,88,18,67,81,32,46,74,89,19,61,75,5,96,33,54,12,68,82,47,26,40,20,69,48,55,90,13,27,83,6,62,34,97,76,41
2 7,34,22,28,34,45,37,8,37,33,46,7,29,0,17,37,43,15,19,41,27,48,7,48,6,45,20,50,30,32,1,17,10,5,12,3,31,19,17,31,35,34,19,11,16,22,16,0,34,4,12,18,7,44,44,36,35,44,5,8,0,35,19,5,47,20,0,12,15,40,28,27,13,39,18,2,27,11,27,34,39,2,34,12,50,37,49,25,12,22,35,33,50,15,32,14,43,25,49,10 | 51,74,93,50,91,5,88,83,80,9,78,76,73,13,71,68,67,17,66,60,20,21,55,23,24,25,47,35,28,34,10,6,32,99,98,97,96,37,2,18,3,41,42,4,44,45,46,89,36,72,87,0,52,86,85,22,82,8,79,11,49,1,62,30,48,70,39,16,15,69,26,14,63,12,64,75,59,77,65,58,57,81,56,7,84,54,53,92,19,31,90,43,40,38,94,95,61,27,29,33
2 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99 | 36,99,96,3,93,90,6,87,84,9,81,78,12,75,72,15,69,66,18,63,60,21,57,54,24,51,0,27,48,45,30,42,39,33,49,67,34,37,1,97,40,94,31,43,4,91,46,88,28,7,85,25,52,82,10,55,79,22,58,76,13,61,73,19,64,70,16,17,8,35,65,71,14,62,74,20,59,77,11,56,80,23,53,83,68,50,86,26,47,89,5,29,92,44,41,95,2,32,98,38
2 100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 34,1,97,94,4,91,88,7,85,82,10,79,76,13,73,70,16,67,64,19,61,58,22,55,52,25,49,46,28,43,40,31,37,51,84,99,36,96,3,39,30,93,42,90,6,45,27,87,48,33,69,0,24,9,54,81,78,57,21,12,60,75,72,63,18,15,66,26,68,17,65,71,62,14,74,20,59,77,56,11,80,23,53,83,50,8,86,47,44,89,29,5,92,41,38,95,32,2,98,35
2 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1 | 45,98,97,3,94,91,6,7,90,87,10,84,83,13,14,80,77,17,76,73,20,21,70,69,24,66,63,27,28,62,59,31,56,55,34,35,52,0,38,49,48,41,42,50,88,43,46,99,1,39,95,4,36,53,92,8,32,57,74,85,60,11,29,81,64,15,25,67,78,18,22,71,72,19,44,75,23,16,68,79,65,26,82,12,61,30,86,9,58,89,33,5,54,93,51,37,96,2,40,47
3 35,48,0,22,38,44,21,20,0,13,14,41,42,19,20,1,22,41,8,32,0,41,2,29,44,49,1,48,17,46,7,4,33,2,38,43,25,50,6,25,15,38,22,0,18,4,25,8,10,43,2,47,31,24,14,19,21,23,13,8,46,32,0,46,6,44,28,40,42,17,18,12,41,25,12,11,2,22,33,13,41,31,9,32,21,0,50,47,27,18,49,19,40,24,8,15,7,32,4,41 | 54,99,39,44,4,94,49,89,9,34,29,84,69,59,14,79,64,74,24,19,73,43,68,23,18,78,63,13,28,83,58,88,53,33,8,93,48,3,38,98,51,81,76,1,41,71,46,11,36,21,96,6,91,66,31,86,56,26,16,61,2,47,77,32,42,37,82,87,57,52,27,72,17,92,67,97,62,7,22,12,90,55,30,45,25,35,5,50,85,70,15,75,0,95,65,10,40,20,80,60
3 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99 | 54,99,39,44,4,94,49,89,9,34,29,84,69,59,14,79,64,74,24,19,73,43,68,23,18,78,63,13,28,83,58,88,53,33,8,93,48,3,38,98,51,81,76,1,41,71,46,11,36,21,96,6,91,66,31,86,56,26,16,61,2,47,77,32,42,37,82,87,57,52,27,72,17,92,67,97,62,7,22,12,90,55,30,45,25,35,5,50,85,70,15,75,0,95,65,10,40,20,80,60
3 100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 54,99,39,44,4,94,49,89,9,34,29,84,69,59,14,79,64,74,24,19,73,43,68,23,18,78,63,13,28,83,58,88,53,33,8,93,48,3,38,98,51,81,76,1,41,71,46,11,36,21,96,6,91,66,31,86,56,26,16,61,2,47,77,32,42,37,82,87,57,52,27,72,17,92,67,97,62,7,22,12,90,55,30,45,25,35,5,50,85,70,15,75,0,95,65,10,40,20,80,60
3 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1 | 54,99,39,44,4,94,49,89,9,34,29,84,69,59,14,79,64,74,24,19,73,43,68,23,18,78,63,13,28,83,58,88,53,33,8,93,48,3,38,98,51,81,76,1,41,71,46,11,36,21,96,6,91,66,31,86,56,26,16,61,2,47,77,32,42,37,82,87,57,52,27,72,17,92,67,97,62,7,22,12,90,55,30,45,25,35,5,50,85,70,15,75,0,95,65,10,40,20,80,60
0 119,72,50,19,51,100,17,38,118,15,81,72,35,31,19,127,35,93,126,86,45,38,65,87,107,78,95,14,87,83,76,30,17,94,4,103,125,94,79,115,13,67,81,76,35,51,119,68,30,105,111,79,89,93,74,56,107,5,75,28,44,2,61,36,64,39,41,110,118,75,75,101,69,113,42,77,18,50,64,109,86,104,118,111,88,31,22,41,74,96,59,10,60,73,91,89,47,54,94,61,92,95,127,111,86,109,48,3,76,119,32,75,38,36,121,2,51,118,119,119,46,109,106,53,122,84,71,49,48,111,60,72,69,115,17,108,119,44,35,47,3,24,100,19,74,96,101,62,13,10,100,81,128,79,50,90,23,88,78,102,51,71,10,84,65,33,108,91,30,122,125,41,75,102,124,18,7,49,67,76,75,126,118,49,80,95,121,68,10,117,13,9,100,67,42,68,104,77,9,99,126,99,37,27,117,64,49,3,105,90,95,61,45,47,111,70,29,113,23,48,14,15,17,24,126,56,98,45,127,93,113,46,49,112,89,32,21,17,16,35,14,45,66,87,4,9,1,76,51,15,120,107,50,74,44,53,42 | 246,61,115,207,140,107,244,34,57,176,245,191,198,91,162,149,188,190,40,148,220,240,27,9,221,249,238,237,222,134,32,6,76,175,14,143,3,236,86,156,218,223,141,203,59,216,48,31,168,85,13,110,235,165,138,16,239,12,44,113,63,202,21,7,112,65,87,171,66,74,256,194,254,137,60,227,241,212,20,231,120,139,213,96,219,106,128,127,177,206,183,232,77,154,252,2,160,45,248,116,4,123,255,97,55,225,90,130,92,62,99,211,147,64,78,205,22,164,242,178,193,41,47,195,187,72,132,215,126,161,11,131,1,93,88,144,54,253,172,69,180,70,58,111,108,179,247,30,43,75,197,25,158,153,38,51,184,151,10,42,29,163,125,104,19,80,23,28,243,157,84,52,95,234,155,209,167,94,100,17,229,53,37,98,33,101,185,26,210,89,145,226,201,199,5,150,192,142,71,146,173,159,35,196,81,208,49,122,251,56,24,135,166,79,105,121,67,103,50,83,214,129,233,73,230,217,133,39,204,189,68,82,117,182,8,119,136,109,0,118,46,250,186,114,169,124,174,36,170,181,18,224,200,102,228,15,152
0 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 | 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
0 257,256,255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 256,255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
0 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4 | 168,161,14,84,70,91,98,252,63,245,105,238,112,231,119,224,56,217,7,210,126,21,0,203,133,196,49,189,28,140,77,182,147,175,42,35,154,211,218,141,155,239,162,43,148,176,183,29,134,190,50,197,22,127,204,120,169,57,225,113,232,106,36,246,64,99,253,92,15,85,8,71,1,78,128,205,149,254,156,79,142,2,9,163,72,247,86,37,135,170,51,240,44,93,177,233,30,226,184,65,100,191,16,121,58,219,198,107,114,212,23,234,178,59,108,115,199,213,24,220,192,17,122,101,185,66,227,31,52,129,206,94,171,241,10,3,136,87,164,248,38,157,80,143,73,150,255,45,165,186,256,151,74,81,249,88,144,46,158,242,4,39,11,235,67,95,228,102,137,221,18,214,172,109,207,60,32,200,130,179,116,25,53,193,123,12,222,187,145,152,26,82,250,54,194,40,89,243,117,180,131,201,124,33,159,68,110,47,208,236,138,75,173,61,5,215,229,19,166,96,103,202,174,223,104,167,97,62,48,216,230,146,132,6,13,139,209,237,34,160,111,90,20,118,244,181,195,69,83,41,55,251,125,153,27,76,188
1 82,125,3,24,28,101,44,29,125,98,54,121,94,85,8,50,51,111,59,78,68,73,28,127,53,62,1,9,118,67,12,85,44,67,74,90,68,29,127,12,4,24,63,61,105,43,63,119,100,60,82,40,65,117,54,13,7,116,86,60,38,72,63,9,1,53,63,117,4,8,83,64,102,58,43,74,93,93,31,93,48,60,75,67,70,19,123,27,72,72,84,98,46,111,45,58,75,86,59,119,97,50,4,118,55,20,10,15,89,101,37,38,86,78,81,8,2,92,16,69,117,11,67,95,117,45,69,22,34,97,119,28,25,52,102,63,2,52,16,16,77,20,77,48,86,108,30,36,2,61,86,32,10,126,52,88,64,117,40,128,50,18,53,40,112,50,125,37,122,13,52,70,90,74,41,78,4,1,73,25,79,12,110,32,102,106,14,86,11,117,105,29,72,29,51,12,32,2,64,6,120,61,3,46,95,97,39,9,30,19,78,81,43,72,14,123,87,69,53,30,20,50,57,117,21,90,54,76,60,31,91,121,45,74,46,119,31,32,2,94,20,81,39,50,35,26,46,96,23,54,99,0,46,82,109,62,120 | 251,26,177,64,238,148,197,116,136,2,202,68,102,176,40,199,56,14,115,69,63,27,207,152,106,121,188,195,39,181,30,169,55,214,186,107,139,138,118,161,209,85,240,105,141,220,224,127,248,41,3,132,179,245,87,22,131,4,193,7,191,37,146,219,208,236,229,78,151,196,237,183,128,244,147,110,167,111,60,206,242,158,163,51,174,74,45,212,6,32,94,125,232,234,246,92,252,203,143,80,101,165,221,160,15,243,194,16,170,137,154,133,162,24,65,218,54,249,226,10,104,222,73,95,18,98,81,59,228,49,43,149,201,25,255,62,135,46,42,66,198,156,71,52,33,83,122,29,20,36,119,126,217,171,84,88,192,61,89,213,178,21,233,34,75,173,82,96,227,142,140,175,210,113,19,180,241,114,211,0,253,50,70,90,13,31,144,187,58,150,112,97,216,155,108,35,172,225,230,117,79,77,76,12,239,123,204,247,100,129,205,91,9,250,48,109,5,72,134,184,44,190,185,145,254,182,17,93,164,57,120,53,67,223,189,124,157,28,103,99,235,47,130,200,256,231,11,168,215,86,166,1,8,153,23,38,159
1 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 | 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
1 257,256,255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 256,255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
1 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4 | 42,112,105,119,196,63,14,70,49,238,147,84,154,231,28,182,189,175,7,203,217,91,140,0,98,21,133,168,210,252,245,161,56,224,77,126,35,120,218,169,155,176,57,43,148,29,141,190,134,197,50,22,204,127,211,162,36,183,225,113,232,106,239,246,64,99,253,92,15,85,8,71,1,78,128,205,149,254,156,79,142,2,9,163,72,247,86,37,135,170,51,240,44,93,177,233,30,226,184,65,100,191,16,121,58,219,198,107,114,212,23,234,178,59,108,115,199,213,24,220,192,17,122,101,185,66,227,31,52,129,206,94,171,241,10,3,136,87,164,248,38,157,80,143,73,150,255,45,165,186,256,151,74,81,249,88,144,46,158,242,4,39,11,235,67,95,228,102,137,221,18,214,172,109,207,60,32,200,130,179,116,25,53,193,123,12,222,187,145,152,26,82,250,54,194,40,89,243,117,180,131,201,124,33,159,68,110,47,208,236,138,75,173,61,5,215,229,19,166,96,103,202,174,223,104,167,97,62,48,216,230,146,132,6,13,139,209,237,34,160,111,90,20,118,244,181,195,69,83,41,55,251,125,153,27,76,188
2 54,27,83,73,111,22,36,85,31,3,97,80,94,48,95,37,3,110,100,13,59,81,23,79,73,31,62,115,60,36,81,62,91,19,1,2,52,7,64,117,116,124,23,62,85,84,34,77,12,29,2,63,71,115,121,128,39,10,80,78,2,48,100,78,0,33,120,9,128,98,22,46,78,87,109,109,30,11,91,51,4,57,16,17,24,31,92,77,90,78,85,1,109,75,95,7,59,103,39,84,108,8,10,100,7,100,108,109,36,17,10,47,32,124,98,48,48,20,82,84,69,108,94,83,112,110,124,43,60,66,47,87,118,97,76,13,56,38,118,77,49,67,45,125,113,49,76,103,82,23,108,2,22,89,10,70,105,84,117,81,59,98,106,112,104,122,71,67,80,8,102,16,45,67,15,118,33,106,77,63,25,117,92,97,4,74,126,25,43,122,96,36,57,94,32,24,54,91,91,81,98,53,5,118,79,26,12,22,74,80,32,124,23,48,44,113,37,54,88,118,8,16,22,62,94,81,64,99,15,63,59,21,127,72,78,123,40,117,25,90,84,103,64,39,4,22,33,35,127,97,127,69,5,76,74,105,104 | 129,84,255,128,4,251,6,246,243,9,240,239,237,13,235,234,16,233,231,229,228,21,227,225,217,213,206,199,28,29,30,196,195,192,191,190,186,181,179,39,176,174,172,170,159,45,158,157,48,156,150,51,142,131,1,0,56,121,120,59,119,61,116,63,64,65,66,67,115,108,106,100,72,73,99,98,76,93,89,79,88,81,3,25,82,85,253,5,80,78,90,91,92,250,249,95,248,97,75,74,71,7,102,103,104,105,70,107,245,244,110,8,242,113,241,10,62,238,118,12,236,57,122,15,124,232,126,127,18,54,19,53,132,133,134,135,226,23,138,224,140,141,222,221,219,145,146,147,148,218,24,216,152,211,154,155,207,204,46,44,203,27,162,163,198,197,32,167,193,33,34,171,188,173,41,175,187,177,36,38,180,37,184,183,220,143,178,40,42,189,35,43,169,52,194,166,31,165,164,161,200,201,202,160,47,205,26,49,208,209,210,153,212,83,214,215,151,50,149,144,185,182,168,223,139,137,136,22,20,130,230,55,125,17,123,14,58,60,117,11,68,114,112,111,109,69,101,247,96,94,77,87,252,86,254,2,256
2 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 | 87,255,252,3,249,246,6,243,240,9,237,234,12,231,228,15,225,222,18,219,216,21,213,210,24,207,204,27,201,198,30,195,192,33,189,186,36,183,180,39,177,174,42,171,168,45,165,162,48,159,156,51,153,150,54,147,144,57,141,138,60,135,132,63,129,0,66,126,123,69,120,117,72,114,111,75,108,105,78,102,99,81,96,93,84,90,127,172,88,256,85,91,1,253,94,250,82,97,4,247,100,244,79,103,7,241,106,238,76,109,10,235,112,232,73,115,13,229,118,226,70,121,16,223,124,220,67,19,217,64,130,214,22,133,211,61,136,208,25,139,205,58,142,202,28,145,199,55,148,196,31,151,193,52,154,190,34,157,187,49,160,184,37,163,181,46,166,178,40,169,175,43,131,215,41,170,176,44,167,179,38,164,182,47,161,185,35,158,188,50,155,191,32,152,194,53,149,197,29,146,200,56,143,203,26,20,206,59,137,209,23,134,212,62,173,86,140,128,218,65,125,221,17,68,224,122,119,227,14,71,230,116,113,233,11,74,236,110,107,239,8,77,242,104,101,245,5,80,248,98,95,251,2,83,254,92,89
2 257,256,255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 86,254,2,251,248,5,245,242,8,239,236,11,233,230,14,227,224,17,221,218,20,215,212,23,209,206,26,203,200,29,197,194,32,191,188,35,185,182,38,179,176,41,173,170,44,167,164,47,161,158,50,155,152,53,149,146,56,143,140,59,137,134,62,131,128,65,125,122,68,119,116,71,113,110,74,107,104,77,101,98,80,95,92,83,89,127,22,256,88,1,253,91,82,250,94,4,247,97,79,244,100,7,241,103,76,238,106,10,235,109,73,232,112,13,229,115,70,226,118,16,223,121,67,220,124,19,217,214,64,85,130,211,208,133,61,25,136,205,202,139,58,28,142,199,196,145,55,31,148,193,190,151,52,34,154,187,184,157,49,37,160,181,178,163,46,40,166,175,172,169,43,213,108,42,174,45,165,177,162,39,21,48,159,183,156,36,186,51,153,189,150,33,192,171,147,195,144,30,198,57,141,201,138,27,204,60,135,207,132,24,210,63,129,54,168,180,216,126,66,219,123,18,222,120,69,225,117,15,228,114,72,231,111,12,234,0,75,237,105,9,240,102,78,243,99,6,246,96,81,249,93,3,252,90,84,255,87
2 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4 | 111,255,252,3,251,248,6,7,245,244,10,241,238,13,14,237,234,17,231,230,20,21,227,224,24,223,220,27,28,217,216,31,213,210,34,35,209,206,38,203,202,41,42,199,196,45,195,192,48,49,189,188,52,185,182,55,56,181,178,59,175,174,62,63,171,168,66,167,164,69,70,161,160,73,157,154,76,77,153,150,80,147,146,83,84,143,140,87,139,136,90,91,133,132,94,129,0,97,98,126,125,101,122,119,104,105,118,115,108,112,127,81,109,113,256,1,116,253,106,4,120,249,102,123,246,8,99,242,11,95,130,239,15,92,134,235,232,137,18,88,228,141,22,85,144,225,25,53,148,221,218,151,29,78,214,155,32,74,158,211,36,71,162,207,204,165,39,67,200,169,43,64,172,197,46,60,176,193,190,179,50,57,186,183,54,184,110,187,51,180,58,191,47,177,194,61,44,173,198,170,65,201,40,166,68,205,37,163,208,72,33,159,212,156,75,215,30,152,79,219,26,149,222,82,23,145,226,142,86,229,19,138,89,233,16,135,236,93,12,131,240,128,96,243,9,100,124,247,5,121,250,103,2,117,254,107,114
3 18,72,21,126,57,32,93,57,0,73,124,64,90,30,1,67,121,17,65,123,63,110,29,24,34,120,102,89,66,116,8,97,99,51,101,113,48,52,60,99,62,95,103,118,36,118,47,116,128,58,104,65,73,113,79,37,122,2,41,87,82,11,3,115,11,114,107,109,120,98,74,32,61,19,96,114,16,93,38,28,125,42,122,85,43,105,6,25,120,32,25,33,64,94,80,54,21,86,118,54,53,19,54,2,83,44,34,2,30,127,78,58,8,34,112,105,107,62,65,101,16,89,46,122,114,61,69,121,115,63,119,47,61,16,107,10,123,84,0,18,95,74,48,117,93,3,27,4,2,96,64,99,116,68,54,4,58,68,90,60,94,46,76,58,9,126,37,37,89,45,103,101,61,3,40,28,127,31,125,98,123,65,6,23,41,54,76,61,95,13,102,41,24,67,119,59,14,44,105,99,11,27,90,55,81,79,38,118,65,89,116,33,123,71,94,19,64,33,42,51,94,60,102,4,103,106,77,97,78,43,88,0,53,124,109,67,56,95,2,93,2,83,118,49,48,65,48,73,87,8,58,34,32,38,43,6,116 | 51,1,106,256,111,251,6,96,116,91,121,11,126,241,86,236,16,131,81,231,136,21,141,226,76,221,26,146,71,216,151,31,246,211,156,206,36,66,181,201,161,41,61,196,191,166,46,171,186,56,101,176,242,97,62,237,22,212,102,182,202,122,17,227,207,12,2,142,217,72,177,197,147,152,57,137,157,132,232,67,127,167,222,32,82,172,52,7,27,247,87,47,252,187,112,107,37,162,42,92,117,77,192,180,104,254,4,99,249,109,9,244,239,14,114,234,94,19,229,119,224,24,89,219,124,29,214,209,34,129,204,84,39,199,134,194,44,79,189,139,184,49,179,54,144,174,74,169,59,149,164,64,69,159,154,205,100,155,190,60,145,230,255,220,200,5,110,55,50,150,210,70,235,215,140,120,75,30,195,240,45,245,10,185,250,25,165,20,170,40,95,15,125,135,130,0,35,115,65,85,225,90,80,160,105,175,103,93,208,203,38,33,83,213,88,133,198,28,218,123,43,193,138,223,188,48,23,183,228,118,78,128,18,233,68,178,53,113,238,143,173,13,58,243,98,73,168,8,248,108,148,163,63,253,153,158,3
3 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 | 51,1,106,256,111,251,6,96,116,91,121,11,126,241,86,236,16,131,81,231,136,21,141,226,76,221,26,146,71,216,151,31,246,211,156,206,36,66,181,201,161,41,61,196,191,166,46,171,186,56,101,176,242,97,62,237,22,212,102,182,202,122,17,227,207,12,2,142,217,72,177,197,147,152,57,137,157,132,232,67,127,167,222,32,82,172,52,7,27,247,87,47,252,187,112,107,37,162,42,92,117,77,192,180,104,254,4,99,249,109,9,244,239,14,114,234,94,19,229,119,224,24,89,219,124,29,214,209,34,129,204,84,39,199,134,194,44,79,189,139,184,49,179,54,144,174,74,169,59,149,164,64,69,159,154,205,100,155,190,60,145,230,255,220,200,5,110,55,50,150,210,70,235,215,140,120,75,30,195,240,45,245,10,185,250,25,165,20,170,40,95,15,125,135,130,0,35,115,65,85,225,90,80,160,105,175,103,93,208,203,38,33,83,213,88,133,198,28,218,123,43,193,138,223,188,48,23,183,228,118,78,128,18,233,68,178,53,113,238,143,173,13,58,243,98,73,168,8,248,108,148,163,63,253,153,158,3
3 257,256,255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 | 51,1,106,256,111,251,6,96,116,91,121,11,126,241,86,236,16,131,81,231,136,21,141,226,76,221,26,146,71,216,151,31,246,211,156,206,36,66,181,201,161,41,61,196,191,166,46,171,186,56,101,176,242,97,62,237,22,212,102,182,202,122,17,227,207,12,2,142,217,72,177,197,147,152,57,137,157,132,232,67,127,167,222,32,82,172,52,7,27,247,87,47,252,187,112,107,37,162,42,92,117,77,192,180,104,254,4,99,249,109,9,244,239,14,114,234,94,19,229,119,224,24,89,219,124,29,214,209,34,129,204,84,39,199,134,194,44,79,189,139,184,49,179,54,144,174,74,169,59,149,164,64,69,159,154,205,100,155,190,60,145,230,255,220,200,5,110,55,50,150,210,70,235,215,140,120,75,30,195,240,45,245,10,185,250,25,165,20,170,40,95,15,125,135,130,0,35,115,65,85,225,90,80,160,105,175,103,93,208,203,38,33,83,213,88,133,198,28,218,123,43,193,138,223,188,48,23,183,228,118,78,128,18,233,68,178,53,113,238,143,173,13,58,243,98,73,168,8,248,108,148,163,63,253,153,158,3
3 0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4 | 51,1,106,256,111,251,6,96,116,91,121,11,126,241,86,236,16,131,81,231,136,21,141,226,76,221,26,146,71,216,151,31,246,211,156,206,36,66,181,201,161,41,61,196,191,166,46,171,186,56,101,176,242,97,62,237,22,212,102,182,202,122,17,227,207,12,2,142,217,72,177,197,147,152,57,137,157,132,232,67,127,167,222,32,82,172,52,7,27,247,87,47,252,187,112,107,37,162,42,92,117,77,192,180,104,254,4,99,249,109,9,244,239,14,114,234,94,19,229,119,224,24,89,219,124,29,214,209,34,129,204,84,39,199,134,194,44,79,189,139,184,49,179,54,144,174,74,169,59,149,164,64,69,159,154,205,100,155,190,60,145,230,255,220,200,5,110,55,50,150,210,70,235,215,140,120,75,30,195,240,45,245,10,185,250,25,165,20,170,40,95,15,125,135,130,0,35,115,65,85,225,90,80,160,105,175,103,93,208,203,38,33,83,213,88,133,198,28,218,123,43,193,138,223,188,48,23,183,228,118,78,128,18,233,68,178,53,113,238,143,173,13,58,243,98,73,168,8,248,108,148,163,63,253,153,158,3
+340
View File
@@ -0,0 +1,340 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Building evaluated series that cover only their result range on a shared grid.
use std::collections::HashMap;
use std::collections::hash_map::Entry;
use std::sync::Arc;
use datafusion::arrow::array::builder::NullBufferBuilder;
use datafusion::arrow::array::{Float64Array, UInt32Array};
use datafusion::error::{DataFusionError, Result};
use datatypes::series::MetricName;
use datatypes::series::histogram::HistogramBatchBuilder;
use datatypes::series::samples::{
HistogramSamples, SampleRef, Samples, Series, SeriesFields, SeriesSchema,
};
use datatypes::series::time::{EvalGrid, GridRange, TimeAxis};
use crate::histogram_eval::float_histogram::FloatHistogram;
#[cfg(test)]
pub(crate) mod reference;
#[cfg(test)]
mod tests;
/// Builds one series on the schema's evaluation grid from rows pushed at absolute grid indices.
///
/// The output starts at the first row with a valid value in any field and ends at the last such
/// row, so a short-lived series never holds values for the whole grid. Missing rows between
/// valid ones become nulls; NaN is a valid value.
pub struct GridSeriesBuilder {
schema: Arc<SeriesSchema>,
grid: Arc<EvalGrid>,
/// Absolute index of the first valid row.
start: Option<usize>,
/// Smallest index the next push may use.
next: usize,
/// Index after the last valid row; rows from here to the next valid row are pending nulls.
valid_end: usize,
fields: Vec<FieldBuilder>,
}
struct FieldBuilder {
values: Vec<f64>,
nulls: NullBufferBuilder,
/// Created at the first histogram value; holds an index per row from then on.
histograms: Option<HistogramColumn>,
}
struct HistogramColumn {
batch: HistogramBatchBuilder,
indices: Vec<Option<u32>>,
}
/// A value of [`GridSeriesBuilder::push_samples`].
pub(crate) enum GridSample {
Float(f64),
Histogram(FloatHistogram),
}
impl GridSeriesBuilder {
/// Creates a builder for series of `schema`, which must have an evaluation grid.
pub fn try_new(schema: Arc<SeriesSchema>) -> Result<Self> {
let grid = schema.eval_grid.clone().ok_or_else(|| {
DataFusionError::Execution("grid series schema requires an evaluation grid".into())
})?;
Ok(Self {
schema,
grid,
start: None,
next: 0,
valid_end: 0,
fields: Vec::new(),
})
}
/// Pushes the field values at absolute grid `index`; `None` is a missing value.
///
/// Indices must be strictly increasing; skipped indices are missing rows.
pub fn push(&mut self, index: usize, values: &[Option<f64>]) -> Result<()> {
if !self.start_row(index, values.len(), values.iter().all(Option::is_none))? {
return Ok(());
}
for (field, value) in self.fields.iter_mut().zip(values) {
field.push_float(*value);
}
Ok(())
}
/// Like [`GridSeriesBuilder::push`], with native histogram values.
pub(crate) fn push_samples(
&mut self,
index: usize,
values: &[Option<GridSample>],
) -> Result<()> {
if !self.start_row(index, values.len(), values.iter().all(Option::is_none))? {
return Ok(());
}
for (field, value) in self.fields.iter_mut().zip(values) {
match value {
Some(GridSample::Histogram(h)) => {
field.values.push(0.0);
field.nulls.append(false);
let rows = field.values.len() - 1;
let column = field.histograms.get_or_insert_with(|| HistogramColumn {
batch: HistogramBatchBuilder::new(),
indices: vec![None; rows],
});
column.indices.push(Some(h.push_to(&mut column.batch)?));
}
Some(GridSample::Float(value)) => field.push_float(Some(*value)),
None => field.push_float(None),
}
}
Ok(())
}
/// Checks the row and pads the gap before it; returns whether the row has a value to write.
fn start_row(&mut self, index: usize, len: usize, empty: bool) -> Result<bool> {
if len != self.schema.fields.len() {
return Err(DataFusionError::Execution(format!(
"grid series row has {len} fields, schema has {}",
self.schema.fields.len()
)));
}
if index < self.next || index >= self.grid.timestamps().len() {
return Err(DataFusionError::Execution(format!(
"grid series index {index} is not increasing or exceeds grid length {}",
self.grid.timestamps().len()
)));
}
self.next = index + 1;
if empty {
return Ok(false);
}
if self.start.is_none() {
self.start = Some(index);
self.fields = (0..len)
.map(|_| FieldBuilder {
values: Vec::new(),
nulls: NullBufferBuilder::new(0),
histograms: None,
})
.collect();
} else {
let gap = index - self.valid_end;
for field in &mut self.fields {
field.values.resize(field.values.len() + gap, 0.0);
field.nulls.append_n_nulls(gap);
if let Some(column) = &mut field.histograms {
column.indices.resize(column.indices.len() + gap, None);
}
}
}
self.valid_end = index + 1;
Ok(true)
}
/// Finishes the current series and resets the builder for the next one.
///
/// Returns `None` when no pushed row had a valid value.
pub fn finish(&mut self, metric: MetricName) -> Result<Option<Series>> {
let start = self.start.take();
let fields = std::mem::take(&mut self.fields);
let valid_end = std::mem::take(&mut self.valid_end);
self.next = 0;
let Some(start) = start else {
return Ok(None);
};
let samples = fields
.into_iter()
.map(|mut field| {
let floats = Float64Array::new(field.values.into(), field.nulls.finish());
let Some(column) = field.histograms else {
return Ok(Samples::from_float(floats));
};
let batch = column.batch.finish().map_err(external)?;
let histograms =
HistogramSamples::try_new(UInt32Array::from(column.indices), batch)
.map_err(external)?;
Samples::try_from_mixed(floats, histograms).map_err(external)
})
.collect::<Result<Vec<_>>>()?;
let time =
GridRange::try_new(self.grid.clone(), start, valid_end - start).map_err(external)?;
let fields = SeriesFields::try_from_vec(samples).map_err(external)?;
Series::try_new(&self.schema, metric, TimeAxis::Grid(time), fields)
.map(Some)
.map_err(external)
}
}
impl FieldBuilder {
fn push_float(&mut self, value: Option<f64>) {
self.values.push(value.unwrap_or_default());
self.nulls.append(value.is_some());
if let Some(column) = &mut self.histograms {
column.indices.push(None);
}
}
}
/// Prometheus `schema.IsMetadataLabel`: the labels removed with the metric name.
pub(crate) const METADATA_LABELS: [&str; 3] = ["__name__", "__type__", "__unit__"];
pub(crate) type LabelSet = Vec<(Arc<str>, Arc<str>)>;
/// The label set Prometheus compares, which has no empty values.
pub(crate) fn label_set(metric: &MetricName) -> LabelSet {
let name = metric
.name()
.filter(|name| !name.is_empty())
.map(|name| (Arc::from("__name__"), Arc::from(name)));
name.into_iter()
.chain(
metric
.tags()
.iter()
.filter(|tag| !tag.value.is_empty())
.map(|tag| (tag.name.clone(), tag.value.clone())),
)
.collect()
}
/// Merges series that share a label set into one, as Prometheus does after a function that
/// rewrites labels or drops `__name__`; two of them holding one field at one point fail.
pub fn merge_same_labelset(schema: &Arc<SeriesSchema>, series: Vec<Series>) -> Result<Vec<Series>> {
let mut groups: HashMap<LabelSet, Vec<usize>> = HashMap::with_capacity(series.len());
let mut collided = false;
for (index, series) in series.iter().enumerate() {
match groups.entry(label_set(&series.metric)) {
Entry::Occupied(mut entry) => {
entry.get_mut().push(index);
collided = true;
}
Entry::Vacant(entry) => {
entry.insert(vec![index]);
}
}
}
if !collided {
return Ok(series);
}
let mut series: Vec<Option<Series>> = series.into_iter().map(Some).collect();
let mut output = Vec::with_capacity(groups.len());
let mut builder = GridSeriesBuilder::try_new(schema.clone())?;
let mut rows = Vec::new();
let mut values = vec![None; schema.fields.len()];
let mut merged = vec![None; schema.fields.len()];
for (labels, members) in groups {
if let [member] = members[..] {
output.extend(series[member].take());
continue;
}
rows.clear();
for &member in &members {
let member_series = series[member]
.as_ref()
.expect("each series is in one group");
let TimeAxis::Grid(range) = &member_series.time else {
return Err(DataFusionError::Execution(
"merging requires evaluated series".into(),
));
};
for row in 0..range.len() {
if read_row(member_series, row, &mut values)? {
rows.push((range.start() + row, member, row));
}
}
}
rows.sort_unstable_by_key(|&(point, _, _)| point);
let mut start = 0;
while start < rows.len() {
let point = rows[start].0;
let end = start + rows[start..].partition_point(|&(p, _, _)| p == point);
// Rows of one point merge field by field; only a field present twice collides.
merged.iter_mut().for_each(|value| *value = None);
for &(_, member, row) in &rows[start..end] {
read_row(series[member].as_ref().unwrap(), row, &mut values)?;
for (slot, value) in merged.iter_mut().zip(&values) {
if value.is_some() {
if slot.is_some() {
let labels: Vec<_> = labels
.iter()
.map(|(name, value)| format!("{name}=\"{value}\""))
.collect();
return Err(DataFusionError::Execution(format!(
"vector cannot contain metrics with the same labelset {{{}}}",
labels.join(", ")
)));
}
*slot = *value;
}
}
}
builder.push(point, &merged)?;
start = end;
}
let metric = series[members[0]].as_ref().unwrap().metric.clone();
output.extend(builder.finish(metric)?);
}
Ok(output)
}
/// Reads the float fields of `row`; returns whether any is present.
fn read_row(series: &Series, row: usize, values: &mut [Option<f64>]) -> Result<bool> {
let mut present = false;
for (value, samples) in values.iter_mut().zip(series.fields.iter()) {
*value = match samples.sample(row) {
SampleRef::Missing => None,
SampleRef::Float(value) => Some(value),
SampleRef::Histogram(_) => {
return Err(DataFusionError::NotImplemented(
"merging histogram series with the same label set".into(),
));
}
};
present |= value.is_some();
}
Ok(present)
}
pub(crate) fn external(error: datatypes::error::Error) -> DataFusionError {
DataFusionError::External(Box::new(error))
}
+477
View File
@@ -0,0 +1,477 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Brute-force reference for operators producing grid series: results are compared as dense
//! `[grid index][field]` matrices, so a kernel cannot pass by aligning local row numbers.
use std::collections::BTreeMap;
use std::sync::Arc;
use datafusion::arrow::array::{Float64Array, UInt32Array};
use datatypes::series::histogram::{
BucketSideView, CounterResetHint, HistogramBatchBuilder, HistogramView,
};
use datatypes::series::samples::{
HistogramSamples, SampleRef, Samples, Series, SeriesFields, SeriesSchema,
};
use datatypes::series::time::{EvalGrid, GridRange, GridSpec, TimeAxis};
use datatypes::series::{Label, MetricName};
use rand::Rng;
use crate::grid_series::GridSeriesBuilder;
use crate::histogram_eval::float_histogram::FloatHistogram;
/// Values by absolute grid index, then by field; `None` is missing.
pub(crate) type Dense = Vec<Vec<Option<f64>>>;
/// Expands a grid series to a dense matrix over its whole grid.
fn expand(series: &Series) -> Dense {
let TimeAxis::Grid(range) = &series.time else {
panic!("expected a grid series, got {:?}", series.time);
};
let fields = series.fields.as_slice();
let mut dense = vec![vec![None; fields.len()]; range.grid().timestamps().len()];
for (field_index, field) in fields.iter().enumerate() {
for (row, sample) in field.iter().enumerate() {
dense[range.start() + row][field_index] = match sample {
SampleRef::Missing => None,
SampleRef::Float(value) => Some(value),
SampleRef::Histogram(_) => panic!("unexpected histogram sample"),
};
}
}
dense
}
/// Asserts `actual` is the trimmed form of `expected`, with identical value bits and metric.
pub(crate) fn assert_series_eq(actual: Option<&Series>, expected: &Dense, metric: &MetricName) {
assert_series_matches(actual, expected, metric, f64::to_bits, "");
}
/// Like [`assert_series_eq`], but any NaN equals any NaN: Prometheus' NaN payloads depend on how
/// the Go compiler orders commutative operands, and every NaN is serialized as `NaN`.
/// `context` names the case in failure messages.
pub(crate) fn assert_series_eq_any_nan(
actual: Option<&Series>,
expected: &Dense,
metric: &MetricName,
context: &str,
) {
let any_nan = |value: f64| {
if value.is_nan() {
f64::NAN.to_bits()
} else {
value.to_bits()
}
};
assert_series_matches(actual, expected, metric, any_nan, context);
}
fn assert_series_matches(
actual: Option<&Series>,
expected: &Dense,
metric: &MetricName,
bits_of: fn(f64) -> u64,
context: &str,
) {
let valid_rows = || {
expected
.iter()
.enumerate()
.filter(|(_, row)| row.iter().any(Option::is_some))
.map(|(index, _)| index)
};
let Some((first, last)) = valid_rows().next().zip(valid_rows().next_back()) else {
assert!(
actual.is_none(),
"{context}: expected no series, got {actual:?}"
);
return;
};
let actual =
actual.unwrap_or_else(|| panic!("{context}: expected a series over [{first}, {last}]"));
let TimeAxis::Grid(range) = &actual.time else {
panic!("expected a grid series, got {:?}", actual.time);
};
assert_eq!(
(range.start(), range.len()),
(first, last + 1 - first),
"{context}: grid range is not trimmed to the valid rows"
);
assert_eq!(range.grid().timestamps().len(), expected.len());
assert_eq!(&actual.metric, metric);
let bits = |dense: &Dense| -> Vec<Vec<Option<u64>>> {
dense
.iter()
.map(|row| row.iter().map(|value| value.map(bits_of)).collect())
.collect()
};
assert_eq!(bits(&expand(actual)), bits(expected), "{context}");
}
/// Values covering the bit patterns kernels most often mishandle.
pub(crate) fn special_value(rng: &mut impl Rng) -> f64 {
const SPECIAL: [f64; 7] = [
0.0,
-0.0,
f64::NAN,
f64::INFINITY,
f64::NEG_INFINITY,
f64::MAX,
f64::MIN_POSITIVE,
];
if rng.random_bool(0.2) {
SPECIAL[rng.random_range(0..SPECIAL.len())]
} else {
rng.random_range(-1e6..1e6)
}
}
/// A dense matrix with a random start, length and holes, all other rows missing.
pub(crate) fn random_dense(rng: &mut impl Rng, grid_len: usize, fields: usize) -> Dense {
let mut dense = vec![vec![None; fields]; grid_len];
let start = rng.random_range(0..grid_len);
let end = rng.random_range(start..=grid_len);
let missing = rng.random_range(0.0..0.8);
for row in &mut dense[start..end] {
for value in row.iter_mut() {
if !rng.random_bool(missing) {
*value = Some(special_value(rng));
}
}
}
dense
}
/// Labels with `__name__` as an ordinary entry, the way Prometheus holds them.
pub(crate) type Labels = BTreeMap<String, String>;
/// Value bits by grid index.
pub(crate) type Points = BTreeMap<usize, u64>;
/// A case of a fixture written by a promql-compat `narthex-golden-*` command.
pub(crate) struct GoldenCase {
/// The operation and its tab-separated arguments.
pub(crate) spec: Vec<String>,
pub(crate) grid: Arc<EvalGrid>,
pub(crate) inputs: Vec<(Labels, Points)>,
/// Native histogram points of each input, as written by the generator.
pub(crate) histograms: Vec<BTreeMap<usize, String>>,
/// Result series by label set, or the error message.
pub(crate) outcome: Result<BTreeMap<Labels, Points>, String>,
/// Native histogram points of the result series, as written by the generator.
pub(crate) result_histograms: BTreeMap<Labels, BTreeMap<usize, String>>,
}
/// Parses a fixture whose label pairs are separated by `|`.
pub(crate) fn golden_cases(text: &str) -> Vec<GoldenCase> {
let labels = |text: &str| -> Labels {
text.split('|')
.filter(|pair| *pair != "-")
.map(|pair| {
let (name, value) = pair.split_once('=').unwrap();
(name.to_string(), value.to_string())
})
.collect()
};
let points = |text: &str| -> (Points, BTreeMap<usize, String>) {
let mut floats = Points::new();
let mut histograms = BTreeMap::new();
for point in text.split_whitespace() {
let (index, value) = point.split_once(':').unwrap();
let index = index.parse().unwrap();
if let Some(histogram) = value.strip_prefix('H') {
histograms.insert(index, histogram.to_string());
} else {
floats.insert(index, u64::from_str_radix(value, 16).unwrap());
}
}
(floats, histograms)
};
let mut cases = Vec::new();
for case in text.split("end\n").filter(|case| case.contains("case ")) {
let lines: Vec<&str> = case.lines().filter(|line| !line.starts_with('#')).collect();
let spec = lines[0].strip_prefix("case ").unwrap();
let grid: Vec<i64> = lines[1]
.split_whitespace()
.skip(1)
.map(|value| value.parse().unwrap())
.collect();
let grid = GridSpec::try_new(grid[0], grid[1], grid[2] as u64).unwrap();
let mut inputs = Vec::new();
let mut histograms = Vec::new();
let mut result_histograms = BTreeMap::new();
let mut outcome = Ok(BTreeMap::new());
for line in &lines[2..] {
if let Some(message) = line.strip_prefix("error ") {
outcome = Err(message.to_string());
continue;
}
let (kind, rest) = line.split_once(' ').unwrap();
let (series_labels, series_points) = rest.split_once(" ;").unwrap();
let (floats, histogram_points) = points(series_points);
let entry = (labels(series_labels), floats);
match kind {
"series" => {
inputs.push(entry);
histograms.push(histogram_points);
}
"result" => {
if !histogram_points.is_empty() {
result_histograms.insert(entry.0.clone(), histogram_points);
}
outcome.as_mut().unwrap().insert(entry.0, entry.1);
}
other => panic!("unexpected line {other}"),
}
}
cases.push(GoldenCase {
spec: spec.split('\t').map(str::to_string).collect(),
grid: Arc::new(EvalGrid::try_new(grid).unwrap()),
inputs,
histograms,
outcome,
result_histograms,
});
}
cases
}
pub(crate) fn metric_of(labels: &Labels) -> MetricName {
let mut labels = labels.clone();
let name = labels.remove("__name__").map(Arc::from);
MetricName::try_new(
name,
labels
.into_iter()
.map(|(name, value)| Label {
name: Arc::from(name),
value: Arc::from(value),
})
.collect(),
)
.unwrap()
}
pub(crate) fn labels_of(metric: &MetricName) -> Labels {
let mut labels: Labels = metric
.tags()
.iter()
.map(|tag| (tag.name.to_string(), tag.value.to_string()))
.collect();
if let Some(name) = metric.name() {
labels.insert("__name__".to_string(), name.to_string());
}
labels
}
/// A single-field series of `schema` holding `points`; `None` without points.
pub(crate) fn series_of(
schema: &Arc<SeriesSchema>,
labels: &Labels,
points: &Points,
) -> Option<Series> {
let mut builder = GridSeriesBuilder::try_new(schema.clone()).unwrap();
for (&index, &bits) in points {
builder.push(index, &[Some(f64::from_bits(bits))]).unwrap();
}
builder.finish(metric_of(labels)).unwrap()
}
/// The points of a single-field series, any NaN as one NaN: Prometheus' NaN payloads depend on
/// how the Go compiler orders operands.
pub(crate) fn points_of(series: &Series) -> Points {
let TimeAxis::Grid(range) = &series.time else {
panic!("expected a grid series");
};
series.fields.as_slice()[0]
.iter()
.enumerate()
.filter_map(|(row, sample)| match sample {
SampleRef::Float(value) => Some((range.start() + row, canonical_bits(value))),
_ => None,
})
.collect()
}
pub(crate) fn canonical_bits(value: f64) -> u64 {
if value.is_nan() {
f64::NAN.to_bits()
} else {
value.to_bits()
}
}
/// Prometheus `almost.Equal`, treating results below 1e-10 as equal and any NaN as equal to NaN,
/// as promql-compat compares engines.
pub(crate) fn close(a: f64, b: f64, epsilon: f64) -> bool {
if a.is_nan() || b.is_nan() {
return a.is_nan() && b.is_nan();
}
if a == b {
return true;
}
let (diff, sum) = ((a - b).abs(), a.abs() + b.abs());
let equal = if a == 0.0 || b == 0.0 || sum < f64::MIN_POSITIVE {
diff < epsilon * f64::MIN_POSITIVE
} else {
diff / sum.min(f64::MAX) < epsilon
};
equal || (a.abs() < 1e-10 && b.abs() < 1e-10)
}
/// A native histogram written by the generator as `/`-separated fields.
pub(crate) struct OwnedHistogram {
schema: i32,
zero_threshold: f64,
zero_count: f64,
count: f64,
sum: f64,
reset_hint: i32,
positive: (Vec<i32>, Vec<i32>, Vec<f64>),
negative: (Vec<i32>, Vec<i32>, Vec<f64>),
custom_values: Vec<f64>,
}
impl OwnedHistogram {
pub(crate) fn parse(text: &str) -> Self {
let fields: Vec<&str> = text.split('/').collect();
let float = |text: &str| f64::from_bits(u64::from_str_radix(text, 16).unwrap());
let floats = |text: &str| -> Vec<f64> {
text.split(',')
.filter(|v| !v.is_empty())
.map(float)
.collect()
};
let spans = |text: &str| -> (Vec<i32>, Vec<i32>) {
text.split(',')
.filter(|v| !v.is_empty())
.map(|span| {
let (offset, length) = span.split_once('_').unwrap();
(
offset.parse::<i32>().unwrap(),
length.parse::<i32>().unwrap(),
)
})
.unzip()
};
let (positive_offsets, positive_lengths) = spans(fields[6]);
let (negative_offsets, negative_lengths) = spans(fields[8]);
Self {
schema: fields[0].parse().unwrap(),
zero_threshold: float(fields[1]),
zero_count: float(fields[2]),
count: float(fields[3]),
sum: float(fields[4]),
reset_hint: fields[5].parse().unwrap(),
positive: (positive_offsets, positive_lengths, floats(fields[7])),
negative: (negative_offsets, negative_lengths, floats(fields[9])),
custom_values: floats(fields[10]),
}
}
pub(crate) fn view(&self) -> HistogramView<'_> {
fn side(
(offsets, lengths, buckets): &(Vec<i32>, Vec<i32>, Vec<f64>),
) -> BucketSideView<'_> {
BucketSideView {
span_offsets: offsets,
span_lengths: lengths,
buckets,
}
}
HistogramView {
schema: self.schema,
zero_threshold: self.zero_threshold,
sum: self.sum,
count: self.count,
zero_count: self.zero_count,
reset_hint: CounterResetHint::from(self.reset_hint),
start_timestamp: None,
custom_values: &self.custom_values,
positive: side(&self.positive),
negative: side(&self.negative),
}
}
}
/// A single-field series holding float and native histogram points.
pub(crate) fn mixed_series(
schema: &Arc<SeriesSchema>,
labels: &Labels,
floats: &Points,
histograms: &BTreeMap<usize, String>,
) -> Option<Series> {
let points = floats.keys().chain(histograms.keys());
let start = *points.clone().min()?;
let end = *points.max()? + 1;
let float_values: Float64Array = (start..end)
.map(|point| floats.get(&point).map(|bits| f64::from_bits(*bits)))
.collect();
let samples = if histograms.is_empty() {
Samples::from_float(float_values)
} else {
let mut builder = HistogramBatchBuilder::new();
let indices: Vec<_> = (start..end)
.map(|point| {
let text = histograms.get(&point)?;
Some(builder.push(OwnedHistogram::parse(text).view()).unwrap())
})
.collect();
let histograms =
HistogramSamples::try_new(UInt32Array::from(indices), builder.finish().unwrap())
.unwrap();
Samples::try_from_mixed(float_values, histograms).unwrap()
};
let range = GridRange::try_new(schema.eval_grid.clone().unwrap(), start, end - start).unwrap();
Some(
Series::try_new(
schema,
metric_of(labels),
TimeAxis::Grid(range),
SeriesFields::one(samples),
)
.unwrap(),
)
}
/// Asserts `got` equals `want` with values within `epsilon`, bucket by bucket.
pub(crate) fn assert_histogram_close(
got: &FloatHistogram,
want: &FloatHistogram,
epsilon: f64,
context: &str,
) {
let scalars = |h: &FloatHistogram| [h.zero_count, h.count, h.sum];
let ok = got.schema == want.schema
&& got.reset_hint == want.reset_hint
&& got.zero_threshold.to_bits() == want.zero_threshold.to_bits()
&& got.custom_values == want.custom_values
&& scalars(got)
.iter()
.zip(scalars(want))
.all(|(a, b)| close(*a, b, epsilon))
&& [
(&got.positive, &want.positive),
(&got.negative, &want.negative),
]
.iter()
.all(|(a, b)| {
a.len() == b.len()
&& a.iter()
.zip(b.iter())
.all(|((i, x), (j, y))| i == j && close(*x, *y, epsilon))
});
assert!(ok, "{context}: {got:?} vs {want:?}");
}
+144
View File
@@ -0,0 +1,144 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use std::sync::Arc;
use datatypes::series::samples::{FieldSpec, SeriesSchema};
use datatypes::series::time::{EvalGrid, GridSpec};
use datatypes::series::{Label, MetricName};
use rand::rngs::StdRng;
use rand::{Rng, SeedableRng};
use super::reference::{Labels, Points, assert_series_eq, points_of, random_dense, series_of};
use super::{GridSeriesBuilder, merge_same_labelset};
fn grid_schema(fields: usize, grid_len: u64) -> Arc<SeriesSchema> {
Arc::new(SeriesSchema {
fields: (0..fields)
.map(|index| FieldSpec {
name: Arc::from(format!("f{index}")),
})
.collect::<Vec<_>>()
.into(),
eval_grid: Some(Arc::new(
EvalGrid::try_new(GridSpec::try_new(-5_000, 1_000, grid_len).unwrap()).unwrap(),
)),
})
}
fn metric(host: usize) -> MetricName {
MetricName::try_new(
Some(Arc::from("cpu")),
vec![Label {
name: Arc::from("host"),
value: Arc::from(format!("h{host}")),
}],
)
.unwrap()
}
#[test]
fn builder_matches_dense_reference() {
for seed in 0..200 {
let mut rng = StdRng::seed_from_u64(seed);
let fields = rng.random_range(1..=3);
let grid_len = rng.random_range(1..64);
let mut builder = GridSeriesBuilder::try_new(grid_schema(fields, grid_len)).unwrap();
// One builder serves several series, as it does inside an operator.
for host in 0..3 {
let expected = random_dense(&mut rng, grid_len as usize, fields);
for (index, row) in expected.iter().enumerate() {
// Missing rows may be pushed as all-None or skipped entirely.
if row.iter().any(Option::is_some) || rng.random_bool(0.5) {
builder.push(index, row).unwrap();
}
}
let actual = builder.finish(metric(host)).unwrap();
assert_series_eq(actual.as_ref(), &expected, &metric(host));
}
}
}
#[test]
fn builder_rejects_invalid_rows() {
let mut builder = GridSeriesBuilder::try_new(grid_schema(2, 4)).unwrap();
builder.push(1, &[Some(1.0), None]).unwrap();
assert!(builder.push(1, &[Some(2.0), None]).is_err());
assert!(builder.push(0, &[Some(2.0), None]).is_err());
assert!(builder.push(4, &[Some(2.0), None]).is_err());
assert!(builder.push(2, &[Some(2.0)]).is_err());
let mut schema = grid_schema(1, 4).as_ref().clone();
schema.eval_grid = None;
assert!(GridSeriesBuilder::try_new(Arc::new(schema)).is_err());
}
/// Label sets compare without empty values, which Prometheus does not have: a series with
/// `host=""` and one without `host` merge.
#[test]
fn merge_treats_empty_label_values_as_absent() {
let schema = grid_schema(1, 2);
let labels = |host: Option<&str>| {
let mut labels = Labels::from([("job".to_string(), "x".to_string())]);
if let Some(host) = host {
labels.insert("host".to_string(), host.to_string());
}
labels
};
let series = vec![
series_of(
&schema,
&labels(Some("")),
&Points::from([(0, 1f64.to_bits())]),
)
.unwrap(),
series_of(&schema, &labels(None), &Points::from([(1, 2f64.to_bits())])).unwrap(),
];
let merged = merge_same_labelset(&schema, series).unwrap();
assert_eq!(merged.len(), 1);
assert_eq!(
points_of(&merged[0]),
Points::from([(0, 1f64.to_bits()), (1, 2f64.to_bits())])
);
}
/// Series of one label set merge field by field: different fields at one point combine, and
/// only one field present in both collides.
#[test]
fn merge_combines_disjoint_fields_at_one_point() {
let schema = grid_schema(2, 1);
let series = |row: [Option<f64>; 2]| {
let mut builder = GridSeriesBuilder::try_new(schema.clone()).unwrap();
builder.push(0, &row).unwrap();
builder.finish(metric(0)).unwrap().unwrap()
};
let merged = merge_same_labelset(
&schema,
vec![series([Some(1.0), None]), series([None, Some(2.0)])],
)
.unwrap();
assert_eq!(merged.len(), 1);
assert_series_eq(
Some(&merged[0]),
&vec![vec![Some(1.0), Some(2.0)]],
&metric(0),
);
assert!(
merge_same_labelset(
&schema,
vec![series([Some(1.0), None]), series([Some(2.0), None])]
)
.is_err()
);
}
+254
View File
@@ -0,0 +1,254 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Histogram functions over evaluated series: `histogram_quantile` and `histogram_fraction` over
//! classic and native histograms (Prometheus `funcHistogramQuantile`, `funcHistogramFraction`
//! and `resetHistograms`), and `histogram_count`, `histogram_sum`, `histogram_avg`,
//! `histogram_stddev` and `histogram_stdvar` over native histograms.
mod aggregate;
mod bounds;
mod classic;
// `sub`, `copy_to_schema`, `detect_reset` and `equals` are for the native histogram range
// functions and binary operators, which build on other branches.
#[cfg_attr(not(test), allow(dead_code))]
pub(crate) mod float_histogram;
mod native;
#[cfg(test)]
mod tests;
use std::collections::HashMap;
use std::sync::Arc;
use datafusion::error::{DataFusionError, Result};
use datatypes::series::MetricName;
use datatypes::series::histogram::HistogramView;
use datatypes::series::samples::{DenseSamplesRef, SampleRef, Series, SeriesSchema};
use datatypes::series::time::TimeAxis;
pub(crate) use aggregate::sum_or_avg;
pub use aggregate::{HistogramAggregate, aggregate_histograms};
use crate::go_sort;
use crate::grid_series::{
GridSeriesBuilder, LabelSet, METADATA_LABELS, label_set, merge_same_labelset,
};
const BUCKET_LABEL: &str = "le";
/// `histogram_quantile` or `histogram_fraction` with its constant arguments.
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum HistogramFunction {
/// `histogram_quantile(q, v)`.
Quantile(f64),
/// `histogram_fraction(lower, upper, v)`.
Fraction { lower: f64, upper: f64 },
}
/// Evaluates `function` over the classic and native histograms in `series`.
///
/// Float series with the same labels other than `le` form a classic histogram; a float series
/// whose `le` does not parse is ignored. Native histogram samples are evaluated one by one. At a
/// point where a native histogram and classic buckets with the same labels (`le` aside) are both
/// present, neither is evaluated. Each field is evaluated on its own. Classic results drop
/// `le`; all results drop `__name__`, `__type__` and `__unit__`. Series that then share a label
/// set are merged as [`merge_same_labelset`] does.
pub fn evaluate_histograms(
function: HistogramFunction,
schema: &Arc<SeriesSchema>,
series: &[Series],
) -> Result<Vec<Series>> {
let mut groups: HashMap<LabelSet, Group<'_>> = HashMap::new();
for series in series {
let range = grid_range(series)?;
if let Some(upper_bound) = series
.metric
.get(BUCKET_LABEL)
.and_then(classic::parse_bound)
{
let mut metric = series.metric.clone();
metric.remove(BUCKET_LABEL);
groups
.entry(label_set(&metric))
.or_insert_with(|| Group::new(metric))
.classic
.push((upper_bound, series, range));
}
if has_histograms(series) {
let metric = series.metric.clone();
groups
.entry(label_set(&metric))
.or_insert_with(|| Group::new(metric))
.native = Some((series, range));
}
}
let mut output = Vec::with_capacity(groups.len());
let mut builder = GridSeriesBuilder::try_new(schema.clone())?;
let mut classic_buckets = Vec::new();
let mut native_buckets = Vec::new();
let mut values = vec![None; schema.fields.len()];
for mut group in groups.into_values() {
let ranges = group
.classic
.iter()
.map(|member| member.2)
.chain(group.native.map(|native| native.1));
let start = ranges.clone().map(|range| range.0).min().unwrap_or(0);
let end = ranges.map(|range| range.1).max().unwrap_or(0);
for point in start..end {
for (field, value) in values.iter_mut().enumerate() {
classic_buckets.clear();
for &(upper_bound, series, range) in &group.classic {
if let Some(SampleRef::Float(count)) = sample(series, range, field, point) {
classic_buckets.push(classic::Bucket { upper_bound, count });
}
}
// Go sorts the buckets present at each point by `<`: +0 and -0 tie and NaN
// ties with everything, so which of them coalescing keeps and where a NaN
// bound lands follow its sort algorithm.
go_sort::sort_by(&mut classic_buckets, |a, b| a.upper_bound < b.upper_bound);
let native = group.native.and_then(|(series, range)| {
match sample(series, range, field, point) {
Some(SampleRef::Histogram(h)) => Some(h),
_ => None,
}
});
// A native histogram and classic buckets of one label set conflict.
*value = match (native, classic_buckets.is_empty()) {
(Some(_), false) | (None, true) => None,
(Some(h), true) => Some(match function {
HistogramFunction::Quantile(q) => {
native::quantile(q, &h, &mut native_buckets)?
}
HistogramFunction::Fraction { lower, upper } => {
native::fraction(lower, upper, &h, &mut native_buckets)?
}
}),
(None, false) => Some(match function {
HistogramFunction::Quantile(q) => {
classic::bucket_quantile(q, &mut classic_buckets)
}
HistogramFunction::Fraction { lower, upper } => {
classic::bucket_fraction(lower, upper, &mut classic_buckets)
}
}),
};
}
builder.push(point, &values)?;
}
group.metric.remove_all(&METADATA_LABELS);
output.extend(builder.finish(group.metric)?);
}
merge_same_labelset(schema, output)
}
/// The series of one label set (`le` aside): classic buckets, and the series of exactly that
/// label set when it holds native histograms.
struct Group<'a> {
metric: MetricName,
classic: Vec<(f64, &'a Series, (usize, usize))>,
native: Option<(&'a Series, (usize, usize))>,
}
impl Group<'_> {
fn new(metric: MetricName) -> Self {
Self {
metric,
classic: Vec::new(),
native: None,
}
}
}
/// The absolute grid range `[start, end)` of `series`.
fn grid_range(series: &Series) -> Result<(usize, usize)> {
let TimeAxis::Grid(range) = &series.time else {
return Err(DataFusionError::Execution(
"histogram functions require evaluated series".into(),
));
};
Ok((range.start(), range.start() + range.len()))
}
fn sample(
series: &Series,
(start, end): (usize, usize),
field: usize,
point: usize,
) -> Option<SampleRef<'_>> {
(start..end)
.contains(&point)
.then(|| series.fields.as_slice()[field].sample(point - start))
}
fn has_histograms(series: &Series) -> bool {
series.fields.iter().any(|samples| {
samples
.segments()
.iter()
.any(|segment| !matches!(segment.dense(), Some(DenseSamplesRef::Float(_))))
})
}
/// A function of one native histogram.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum NativeHistogramFunction {
Count,
Sum,
Avg,
StdDev,
StdVar,
}
/// Applies `function` to the native histogram samples of `series`; float samples are dropped and
/// so is `__name__`. The result is `None` when the series has no histogram sample.
///
/// Series that share a label set once their names are dropped must then go through
/// [`merge_same_labelset`].
pub fn map_native_histogram(
function: NativeHistogramFunction,
schema: &Arc<SeriesSchema>,
series: &Series,
) -> Result<Option<Series>> {
let range = grid_range(series)?;
let mut builder = GridSeriesBuilder::try_new(schema.clone())?;
let mut buckets = Vec::new();
let mut values = vec![None; schema.fields.len()];
for point in range.0..range.1 {
for (field, value) in values.iter_mut().enumerate() {
*value = match sample(series, range, field, point) {
Some(SampleRef::Histogram(h)) => Some(function.apply(&h, &mut buckets)?),
_ => None,
};
}
builder.push(point, &values)?;
}
let mut metric = series.metric.clone();
// Prometheus `simpleHistogramFunc` drops only `__name__`, unlike `histogram_quantile`.
metric.remove("__name__");
builder.finish(metric)
}
impl NativeHistogramFunction {
fn apply(self, h: &HistogramView<'_>, buckets: &mut Vec<native::NativeBucket>) -> Result<f64> {
Ok(match self {
Self::Count => h.count,
Self::Sum => h.sum,
Self::Avg => h.sum / h.count,
Self::StdDev => native::variance(h, buckets)?.sqrt(),
Self::StdVar => native::variance(h, buckets)?,
})
}
}
+210
View File
@@ -0,0 +1,210 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! `sum` and `avg` of native histograms within one aggregation group, following the histogram
//! paths of Prometheus `aggregation`.
use std::sync::Arc;
use datafusion::arrow::array::UInt32Array;
use datafusion::error::{DataFusionError, Result};
use datatypes::series::MetricName;
use datatypes::series::histogram::HistogramBatchBuilder;
use datatypes::series::samples::{SampleRef, Samples, Series, SeriesFields, SeriesSchema};
use datatypes::series::time::{GridRange, TimeAxis};
use crate::grid_series::external;
use crate::histogram_eval::float_histogram::FloatHistogram;
use crate::histogram_eval::grid_range;
/// A native histogram aggregation.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum HistogramAggregate {
Sum,
Avg,
}
/// Aggregates the native histograms of one group at every point, adding them in the order of
/// `group`. A point yields no histogram when the group also has a float sample there, or when
/// its histograms mix exponential and custom buckets. Float-only points are left to the float
/// aggregation. The result carries `metric`.
pub fn aggregate_histograms(
op: HistogramAggregate,
schema: &Arc<SeriesSchema>,
group: &[Series],
metric: MetricName,
) -> Result<Option<Series>> {
let grid = schema.eval_grid.clone().ok_or_else(|| {
DataFusionError::Execution("histogram aggregation requires an evaluation grid".into())
})?;
let ranges = group.iter().map(grid_range).collect::<Result<Vec<_>>>()?;
let start = ranges.iter().map(|range| range.0).min().unwrap_or(0);
let end = ranges.iter().map(|range| range.1).max().unwrap_or(0);
let fields = schema.fields.len();
// Written from the first point with a result, so a sparse group allocates no full span.
let mut builders: Vec<HistogramBatchBuilder> =
(0..fields).map(|_| HistogramBatchBuilder::new()).collect();
let mut indices: Vec<Vec<Option<u32>>> = vec![Vec::new(); fields];
let mut first = None;
let mut row: Vec<Option<FloatHistogram>> = (0..fields).map(|_| None).collect();
for point in start..end {
for (field, value) in row.iter_mut().enumerate() {
let samples = group
.iter()
.zip(&ranges)
.filter(|(_, (from, to))| (*from..*to).contains(&point))
.map(|(series, &(from, _))| series.fields.as_slice()[field].sample(point - from));
*value = aggregate_point(op, samples)?;
}
if row.iter().all(Option::is_none) {
continue;
}
let first = *first.get_or_insert(point);
for ((value, builder), indices) in row.iter().zip(&mut builders).zip(&mut indices) {
indices.resize(point - first, None);
indices.push(match value {
Some(h) => Some(h.push_to(builder)?),
None => None,
});
}
}
let Some(first) = first else {
return Ok(None);
};
let len = indices[0].len();
let mut samples = Vec::with_capacity(fields);
for (builder, indices) in builders.into_iter().zip(indices) {
let batch = builder.finish().map_err(external)?;
samples.push(
Samples::try_from_histogram(UInt32Array::from(indices), batch).map_err(external)?,
);
}
let range = GridRange::try_new(grid, first, len).map_err(external)?;
Series::try_new(
schema,
metric,
TimeAxis::Grid(range),
SeriesFields::try_from_vec(samples).map_err(external)?,
)
.map(Some)
.map_err(external)
}
/// One point of one field.
fn aggregate_point<'a>(
op: HistogramAggregate,
samples: impl Iterator<Item = SampleRef<'a>>,
) -> Result<Option<FloatHistogram>> {
let (mut histograms, mut has_float) = (Vec::new(), false);
for sample in samples {
match sample {
SampleRef::Missing => {}
SampleRef::Float(_) => has_float = true,
SampleRef::Histogram(view) => histograms.push(FloatHistogram::try_from_view(&view)?),
}
}
let Some(mut value) = sum_or_avg(op, histograms)? else {
return Ok(None);
};
if has_float {
return Ok(None);
}
value.compact();
Ok(Some(value))
}
/// The Kahan sum or the mean of `histograms` in order, without compaction; `None` when there is
/// none or they mix exponential and custom buckets. Prometheus `sum_over_time` and
/// `avg_over_time` run the same steps as the aggregations.
pub(crate) fn sum_or_avg(
op: HistogramAggregate,
histograms: impl IntoIterator<Item = FloatHistogram>,
) -> Result<Option<FloatHistogram>> {
let mut value: Option<FloatHistogram> = None;
let mut compensation: Option<FloatHistogram> = None;
let mut mean: Option<FloatHistogram> = None;
let mut count = 0.0;
for h in histograms {
count += 1.0;
let Some(current) = value.as_mut() else {
value = Some(h);
continue;
};
// Go drops the result with a warning for this addition error only; others propagate.
if current.uses_custom_buckets() != h.uses_custom_buckets() {
return Ok(None);
}
match op {
HistogramAggregate::Sum => {
let (c, _) = current.kahan_add(&h, compensation.take())?;
compensation = Some(c);
}
HistogramAggregate::Avg => {
if mean.is_none() {
let mut sum = current.clone();
let (c, _) = sum.kahan_add(&h, compensation.clone())?;
if !sum.has_overflow() {
*current = sum;
compensation = Some(c);
continue;
}
let mut started = current.clone();
started.div(count - 1.0);
if let Some(c) = compensation.as_mut() {
c.div(count - 1.0);
}
mean = Some(started);
}
// Go switches to an incremental mean once the plain sum overflows.
let q = (count - 1.0) / count;
if let Some(c) = compensation.as_mut() {
c.mul(q);
}
let mut to_add = h;
to_add.div(count);
let mean = mean.as_mut().expect("set above");
mean.mul(q);
let (c, _) = mean.kahan_add(&to_add, compensation.take())?;
compensation = Some(c);
}
}
}
let Some(mut value) = value else {
return Ok(None);
};
match op {
HistogramAggregate::Sum => {
if let Some(c) = compensation {
value.add(&c)?;
}
}
HistogramAggregate::Avg => match mean {
Some(mut mean) => {
if let Some(c) = compensation {
mean.add(&c)?;
}
value = mean;
}
None => {
value.div(count);
if let Some(mut c) = compensation {
c.div(count);
value.add(&c)?;
}
}
},
}
Ok(Some(value))
}
@@ -0,0 +1,726 @@
# Generated by promql-compat cmd/narthex-golden-histarith built for amd64 (Prometheus
# v3.15.0 model/histogram, seed 1, 80 cases per operation). Each line is
# `<operation> <argument> <inputs...> => <outputs...>`; see the command for the encoding.
add - 3/3fe0000000000000/0/4055001175c76074/40adb352ce0f464f/3/-2_1/0/-19_1,2_4/4042800000000000,3f2aa1d1faf86ea9,0,3f4c431a422a645b,4047800000000000/ -2/0/0/4070a40000000000/c05338b536f50bec/2/-2_2,2_2,1_2/0,4050e80000000000,404f800000000000,4050980000000000,4038000000000000,4046a00000000000/// => -2/3fe0000000000000/4050e80000000000/4075e4045d71d81d/40ad198d24579df0/3/0_1,1_2,1_2/0,404f800000000000,4050980000000000,4038000000000000,4046a00000000000/0_1/4055001175c76074/ false false
add - 1/3f847ae147ae147b/4043800000000000/4055c00000000000/409a41576ddcfc94/1/-9_1,1_1/4000000000000000,4047000000000000/// 8/3f50624dd2f1a9fc/4051a00000000000/4051a00000000000/4086de815c93f4eb/2///// => 1/3f847ae147ae147b/405b600000000000/4063b00000000000/40a2d84c0e137b85/0/-9_1,1_1/4000000000000000,4047000000000000/// true false
add - -1/3f847ae147ae147b/0/406308039013db44/40b9864b9433bdfa/3/-9_1,0_4/0,4053a00000000000,4014000000000000,3f3c809eda1bc597,4051300000000000/// -1/0/4058800000000000/40803e02c4469307/40d70047979f06bd/2/-7_1,1_4,1_4/0,3f43aa8dcd5315f5,4053c00000000000,4051800000000000,4055800000000000,4059700000000000,0,4055400000000000,3f4899db6326e870/// => -1/3f90000000000000/4078f4043d5ba74c/40850003a84b89d8/40dd61da7cabf63c/3/-2_1,1_4/4055800000000000,4059700000000000,0,4055400000000000,3f4899db6326e870/// false false
add - -53/0/0/0/8000000000000000/0/////bff0000000000000,0,3fe0000000000000,4024000000000000 -53/0/0/0/0/0/////3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/0/0/0/////4024000000000000 false true
add - -53/0/0/4051000000000000/409966d3ad531a66/1/0_1,0_1/4051000000000000,0///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/403e000000000000/c0893fa096ce3281/0/0_1/403e000000000000///4000000000000000 => -53/0/0/4058800000000000/40898e06c3d8024b/0/0_1/4058800000000000///4000000000000000 false true
add - 2/0/4051580000000000/4060ec00ea32dd35/c0a5fc6b8295851c/3/-15_1,0_1/4050800000000000,3f1d465ba69a2d82/// 2/255bba08cf8c979d/404f000000000000/4083000000000000/40e136d2220a7a78/1///1_3,0_4,2_2/0,4054400000000000,4057c00000000000,4057400000000000,4058000000000000,4040000000000000,404e000000000000,403d000000000000,404e000000000000/ => 2/255bba08cf8c979d/40606c0000000000/40873b003a8cb74d/40dfae16d3c2444c/3/-15_2/4050800000000000,3f1d465ba69a2d82/1_7,2_2/0,4054400000000000,4057c00000000000,4057400000000000,4058000000000000,4040000000000000,404e000000000000,403d000000000000,404e000000000000/ false false
add - 3/255bba08cf8c979d/0/4059000000000000/40b4e40ebf046b5a/0///9_2/4055400000000000,402e000000000000/ -1/3f50624dd2f1a9fc/0/406b2c11d7a201e9/40c9769978520227/0/-6_4/4056800000000000,3f4d5a8ade8ace76,3ef39f4ac3c77555,3f3bc20af1adbdf4/-5_1,0_3/3f4b85fd5a261456,4036000000000000,405a180000000000,3ff0000000000000/ => -1/3f50624dd2f1a9fc/0/4073d608ebd100f4/40d1f4506bea1bea/0/-4_2/3ef39f4ac3c77555,3f3bc20af1adbdf4/-4_3,2_1/4036000000000000,405a180000000000,3ff0000000000000,4059000000000000/ false false
add - -53/0/0/0/8000000000000000/3/////3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/405fc00000000000/c0977f2f5b288871/0/0_3,0_1/0,4047000000000000,4038000000000000,404c800000000000///3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/405fc00000000000/c0977f2f5b288871/3/1_2/4051800000000000,404c800000000000///3ff0000000000000,4014000000000000 false true
add - 2/3f847ae147ae147b/4053400000000000/4053400000000000/40b45464bac7db92/3///// 1/3f847ae147ae147b/0/404b80221ffa7737/c069c9c4b42704a7/1/-20_4/4000000000000000,3f420ae6585e5e45,404a800000000000,3f4015141ed88149/// => 1/3f847ae147ae147b/4053400000000000/4060800887fe9dce/40b386169526a36d/3///// false false
add - -4/0/4053400000000000/4067000000000000/c08c89b1e5762346/0/-3_2,2_1/4050400000000000,0,4045000000000000/// 0/3f847ae147ae147b/4058000000000000/40759400359377b2/40d082df51cf94f8/0/-12_3/3f0ac9bbd92a4212,4040000000000000,4000000000000000/-7_4,2_1/404c200000000000,0,4050400000000000,0,4057800000000000/ => -4/3f847ae147ae147b/406dc00000000000/40808a001ac9bbd9/40cf3d238547c7bc/0/0_2/40410001ac9bbd93,4045000000000000/0_1/406ae80000000000/ false false
add - -53/0/0/0/0/0/////4000000000000000 -53/0/0/4054400000000000/c0942d5c55748449/2/0_1/4054400000000000///3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/4054400000000000/c0942d5c55748449/0/0_1/4054400000000000///4000000000000000 false true
add - -4/0/4052c00000000000/40652003ba9a0d24/c08b279e8e4dc053/3/7_2,1_4/3f3dd4d069223133,0,0,0,4057800000000000,0/// 1/0/4049000000000000/40705a032b9fd255/40cb12f81835a5e3/2/9_4/3f213200cad0775c,0,4042500000000000,4055c00000000000/-20_2/4056000000000000,3f45107e5ff6aac6/ => -4/0/405f400000000000/407aea0508ecd8e7/40c9607e2f50c9de/3/1_1,5_2,1_4/405ee8022640195a,3f3dd4d069223133,0,0,0,4057800000000000,0/0_1/4056000a883f2ffb/ false false
add - 5/0/0/405600093cef3e69/40b6fcfd692ab2ba/2/-7_2,0_2/404f800000000000,3f4279de7cd2292d,0,4039000000000000/// 5/0/0/406ce0000fc9ce2e/40c8bcb7216b7dfb/0/-6_2,0_2,2_4/3edf939c5ac29b70,3ff0000000000000,0,4056000000000000,404e000000000000,0,4054800000000000,0/// => 5/0/0/4073f0025720b6b1/40d21d9aeb006bac/0/-7_2,0_3,2_4/404f800000000000,3f42b905b587ae64,3ff0000000000000,4039000000000000,4056000000000000,404e000000000000,0,4054800000000000,0/// false false
add - 1/3f847ae147ae147b/0/0/0/1///// -53/0/0/4054c00000000000/c09a16167abe8cd0/1/1_2/0,4054c00000000000///3ff0000000000000,4014000000000000,4024000000000000 => error
add - -4/3f50624dd2f1a9fc/4058800000000000/408066050f0e5c7c/40da13893c2a1e5e/0/-19_4,0_1,1_4/405c980000000000,0,3f3ed04b2e45fea6,4054800000000000,4051800000000000,0,3f1092a3cf86d3d4,3f4a23f8325b053c,4051000000000000/-17_2,0_2,0_2/4044800000000000,3f375db598c81a6f,3ff0000000000000,3f49a398b7f2696c,4041800000000000,402ec00000000000/ 0/3fe0000000000000/0/4061200000000000/40bd8a9f0f269364/1/-17_1,2_1,0_3/4041800000000000,4049000000000000,404a000000000000,0,0/// => -4/3fe0000000000000/408066050f0e5c7c/4084ae050f0e5c7c/40e0bb187ff9e19c/0/0_1/4059800000000000/// false false
add - 5/255bba08cf8c979d/3f387367ab034118/405980070425b3dc/c093688953d820fb/2/3_2,0_1/403e400000000000,4051f00000000000,3f0ce9792362aacf/// 5/3fe0000000000000/4036000000000000/40746a0000000000/40bcc3040c1902f8/3/-5_3,0_3,0_4/401c000000000000,3ff0000000000000,3ff0000000000000,4049000000000000,403aa00000000000,4034600000000000,402e000000000000,403ea00000000000,404e000000000000,4057400000000000/// => 5/3fe0000000000000/403600187367ab03/407aca01c1096cf7/40b7e8e1b722fab9/3/-5_8,0_3/401c000000000000,3ff0000000000000,3ff0000000000000,4049000000000000,403aa00000000000,4034600000000000,402e000000000000,403ea00000000000,4056900000000000,4064980000000000,3f0ce9792362aacf/// false false
add - 5/0/0/0/0/3///// 2/255bba08cf8c979d/0/4063b40000000000/40be7f19c0e231c4/0/8_4/4029400000000000,4040000000000000,4037000000000000,4056800000000000/// => 2/255bba08cf8c979d/0/4063b40000000000/40be7f19c0e231c4/3/8_4/4029400000000000,4040000000000000,4037000000000000,4056800000000000/// false false
add - -2/3fe0000000000000/0/0/0/3///// 2/3f50624dd2f1a9fc/3f4305579bb84a94/406ae006303bd8e0/c0a2d04a80336bb5/3/-13_1,2_2,2_1/3f26ee5f1f1fc606,4054f80000000000,4057c80000000000,4042000000000000/// => -2/3fe0000000000000/406ae006303bd8e0/406ae006303bd8e0/c0a2d04a80336bb5/3/0_1/406ae0016ee5f1f2/// false false
add - 5/3f50624dd2f1a9fc/0/407da004bdf97b56/40bf8a2ca0dadb2a/3/9_3,0_1,0_2/0,402e000000000000,3f4d33d2909fe965,3f3177f2941fd20e,4010000000000000,0/-1_2,0_4,2_2/4056b00000000000,404f000000000000,404d000000000000,4043000000000000,4056000000000000,4047200000000000,0,4052000000000000/ 2/255bba08cf8c979d/0/404b800000000000/40948dee462df3d0/1/1_2/0,404b800000000000/// => 2/3f50624dd2f1a9fc/0/408088025efcbdab/40c256d419332c0f/3/1_2/0,40528012f7e5ed58/0_2/4063180000000000,4072e40000000000/ false false
add - -4/3f847ae147ae147b/0/40793e013fccb52d/40923f1c699d83b6/0/2_4,1_4,1_1/4054c00000000000,0,4058000000000000,0,403fa00000000000,404fb00000000000,405ab80000000000,3f33fccb52caf68a,4037000000000000/// 1/0/4047800000000000/4055780000000000/c092b2c3d82c68d9/0/-20_2/4008000000000000,4041f00000000000/// => -4/3f847ae147ae147b/4055780000000000/407e9c013fccb52d/c03ce9dba3b948c0/0/0_1,1_4,1_4,1_1/4043700000000000,4054c00000000000,0,4058000000000000,0,403fa00000000000,404fb00000000000,405ab80000000000,3f33fccb52caf68a,4037000000000000/// false false
add - 3/0/0/4030600000000000/408ef98b943a5cd4/1/-1_1/4030600000000000/// -2/0/0/4059c00042ea2514/c091b29812ab5e82/3///-2_2,0_4,1_1/3ef0ba8944e9d17f,0,0,0,0,4053800000000000,4039000000000000/ => -2/0/0/405dd80042ea2514/c061ae92447180c0/3/0_1/4030600000000000/-2_6,1_1/3ef0ba8944e9d17f,0,0,0,0,4053800000000000,4039000000000000/ false false
add - 3/255bba08cf8c979d/4053000000000000/4062dc04b0d6f42e/40c32887d8c7d510/0///-12_4/3f3e98a09668f9e5,3f1bb85c2c3286aa,4051b80000000000,4010000000000000/ -4/255bba08cf8c979d/0/4064fc01678603a8/c095819fc87792a0/0/2_4/4039000000000000,4053800000000000,3f2678603a7aeac0,4050380000000000/// => -4/255bba08cf8c979d/4053000000000000/4073ec030c2e7beb/40c07853dfb8e2bc/0/2_4/4039000000000000,4053800000000000,3f2678603a7aeac0,4050380000000000/0_1/4052b80961ade85d/ false false
add - 0/3f847ae147ae147b/4052f00000000000/4067fc0286b3f5ee/c0ab14b6ed71f285/1/-9_2,0_2,2_1/3f34359faf6db525,4042800000000000,404b900000000000,402a000000000000,4026000000000000/// 1/255bba08cf8c979d/3f3d89082035127a/4064c015e13ae358/c0b35120489f64f8/2/-15_3/404c800000000000,0,3f501f6fb9f7a194/-17_2,0_2,1_2/0,3f41e3bcf8ed4d08,3f417d032bc28b2b,3f24831f929190f1,4050c00000000000,4045000000000000/ => 0/3f90000000000000/40730e0c33f76ca3/40765e0c33f76ca3/c0c06dbddfac2f1d/0/-3_1/4026000000000000/-5_1/4045000000000000/ true false
add - 0/255bba08cf8c979d/0/4071220222b0f14a/4077011e6192f40d/3/-4_3,0_4,0_2/403d000000000000,3f4115878a4b9106,4052d80000000000,4044000000000000,402f800000000000,0,4057000000000000,4036000000000000,0/// -1/3fe0000000000000/4050c00000000000/406680069abe4afa/40b06b930a294459/2/5_3/403b000000000000,3f4a6af92bea7589,4055800000000000/// => -1/3fe0000000000000/406a6c044561e293/407c6205701016c7/40b1dba4f042739a/3/0_3,2_3/402f800000000000,4057000000000000,4036000000000000,403b000000000000,3f4a6af92bea7589,4055800000000000/// false false
add - 0/0/0/40584006f5050aa1/40a23bdd5bec4aa7/0///8_2/3f3bd4142a83385a,4058400000000000/ 0/3fe0000000000000/0/4077740015709b87/40d87198f2915601/3/-16_2,2_4,1_2/4014000000000000,4041600000000000,4053e00000000000,3ef5709b872e7295,4055c00000000000,4054000000000000,4050400000000000,4038000000000000/// => 0/3fe0000000000000/0/407d8401d2b1de2f/40dab9149e0edf56/3///8_2/3f3bd4142a83385a,4058400000000000/ false false
add - -53/0/0/0/0/2/////4000000000000000 -53/0/0/4036000000000000/408ded9c28dbcdfe/2/1_3/0,4036000000000000,0///bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/4036000000000000/408ded9c28dbcdfe/2/0_1/4036000000000000/// false true
add - -4/3fe0000000000000/0/0/8000000000000000/2///// 2/3fe0000000000000/4044900000000000/406e2001ec055a30/40cdb834800b7bb3/0/5_3,0_3/4055c00000000000,4037e00000000000,3ff0000000000000,3f2ec055a303c4c9,0,4056000000000000/// => -4/3fe0000000000000/4044900000000000/406e2001ec055a30/40cdb834800b7bb3/0/1_1/4068fc01ec055a30/// false false
add - -53/0/0/404de00000000000/40a81b0dbc9cafc4/1/1_2/4041e00000000000,4038000000000000///bff0000000000000,0,3fe0000000000000,4024000000000000 -53/0/0/0/8000000000000000/1/////3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/404de00000000000/40a81b0dbc9cafc4/1/0_1/404de00000000000///4024000000000000 false true
add - 8/3f50624dd2f1a9fc/0/406740019b1009bc/40b922c599a2e0bc/0/-11_2,0_3,2_2/4041000000000000,4045000000000000,3f29b1009bbd3933,0,404e000000000000,4000000000000000,4041000000000000/-11_1,2_1/0,402c000000000000/ 5/3f50624dd2f1a9fc/0/4031000000000000/4079dd92499b78d2/1/-3_1/4031000000000000/// => 5/3f50624dd2f1a9fc/0/406960019b1009bc/40bac09ebe3c9849/0/-3_1,1_2/4031000000000000,4053000336201378,4058000000000000/-1_1/402c000000000000/ false false
add - 3/3fe0000000000000/0/406c180538808ddd/40bf562aee9c2d8f/0/-10_4/3f44e20237734b6b,4057000000000000,404e000000000000,4052300000000000/// 5/255bba08cf8c979d/0/40894502fb0014e0/40e6584ba5d6c9cd/3/-12_1,1_4,1_4/405f300000000000,404c800000000000,4032600000000000,404e000000000000,3f4e780f219b6a91,4056800000000000,4020000000000000,404f000000000000,4051000000000000/4_4,0_3,0_3/4056c00000000000,3f237f6be25f14cd,4033800000000000,4038000000000000,0,3f38b02e67abf255,404a000000000000,4052800000000000,4038000000000000,4042000000000000/ => 3/3fe0000000000000/0/4090258224901c2c/40ea431103aa4f7f/3/-10_4,3_4/3f44e20237734b6b,4057000000000000,404e000000000000,4052300000000000,405f300000000000,4060ec0000000000,4058800f3c0790ce,4060400000000000/1_4/4056c00000000000,4045c004dfdaf898,4062c0031605ccf6,4042000000000000/ false false
add - 1/3fe0000000000000/0/407a000b90e854da/40d2461e3deb6957/1/-8_2,0_4,0_4/3f4be6d803de982e,4051800000000000,3f25eed92421272d,4056400000000000,3f21f861d766186d,4056400000000000,4030000000000000,3f4637bc3fd02619,4039000000000000,402c000000000000/-19_4/4044000000000000,404d800000000000,402c000000000000,3f50376fd21f8a96/ -4/3f847ae147ae147b/403fa00000000000/4079ea053e2d558e/40d0116598a915b3/1///4_4,2_3,2_2/3f45eda2f45ce87c,4053480000000000,4033000000000000,4049100000000000,4053400000000000,4048000000000000,404ec00000000000,3f4403c7b812ffca,4049200000000000/ => -4/3fe0000000000000/403fa00000000000/4089f508678ad534/40e12bc1eb4a3f85/1/0_2/40721007830c6052,402c000000000000/0_1,3_4,2_3,2_2/405c4010376fd220,3f45eda2f45ce87c,4053480000000000,4033000000000000,4049100000000000,4053400000000000,4048000000000000,404ec00000000000,3f4403c7b812ffca,4049200000000000/ false false
add - -53/0/0/0/0/1/////3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/4066480000000000/40baaa9081beb33a/2/1_3/0,405a680000000000,4052280000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/4066480000000000/40baaa9081beb33a/0/1_1/4066480000000000///3ff0000000000000,4014000000000000 true true
add - -2/3f847ae147ae147b/0/3f61123dfedea1f4/3fa88b0aa6ee6511/1///-17_2,1_2/3f31d93f098fc80d,0,3f501b60201d9bcc,3f4b259836776c30/ -1/0/0/405b780ad3a0ec9b/40972b6c7f1cfc5c/3/-14_3/3f4443070282bf7a,4050d00000000000,3f0643ad6b428509/5_1/4045500000000000/ => -2/3f847ae147ae147b/4050d00ad3a0ec9b/405b782cf81cea58/40972b9d95324a39/3///-17_2,1_2,15_1/3f31d93f098fc80d,0,3f501b60201d9bcc,3f4b259836776c30,4045500000000000/ false false
add - -4/3f50624dd2f1a9fc/0/407d92016684e977/40a53b2eba1e8d31/2/3_2,2_3/0,4052400000000000,4042800000000000,4043800000000000,4054400000000000/-16_4,0_3,0_2/0,403d000000000000,4052400000000000,3f2d703a6c6e5383,4031000000000000,4056500000000000,3f1ec0c5851ca8cc,403f000000000000,400f000000000000/ 1/0/0/0/0/1///// => -4/3f50624dd2f1a9fc/0/407d92016684e977/40a53b2eba1e8d31/0/3_2,2_3/0,4052400000000000,4042800000000000,4043800000000000,4054400000000000/-16_4,0_3,0_2/0,403d000000000000,4052400000000000,3f2d703a6c6e5383,4031000000000000,4056500000000000,3f1ec0c5851ca8cc,403f000000000000,400f000000000000/ true false
add - -53/0/0/0/8000000000000000/3/////4000000000000000 -53/0/0/401c001fb679ad96/c05a2a4e629033cc/0/0_1,1_3/0,3f1fb679ad95bd95,401c000000000000,0///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/401c001fb679ad96/c05a2a4e629033cc/3/0_2/3f1fb679ad95bd95,401c000000000000///4000000000000000 false true
add - 2/255bba08cf8c979d/4031e00000000000/4031e00000000000/406bbd03d3a3dd9a/3///// 8/3f50624dd2f1a9fc/0/40600003d4b11718/c0a3795b966cb94e/1///4_4/4051c00000000000,3f3ea588b8bc7dd5,404c800000000000,0/ => 2/3f50624dd2f1a9fc/4031e00000000000/40623c03d4b11718/c0a1bd8b59327b74/3///1_1/40600003d4b11718/ false false
add - 5/3f50624dd2f1a9fc/0/4047a00000000000/c090ab6c95efff66/3///6_1,1_3,1_2/4038400000000000,4030000000000000,401c000000000000,0,0,0/ 5/255bba08cf8c979d/4047f00000000000/40633c0ca4f0028e/c09134bdcebfe835/1/1_2,0_4/4041800000000000,3f468b5c33d8eb75,4014000000000000,3f4c0863d65d5888,4050800000000000,0/// => 5/3f50624dd2f1a9fc/4047f00000000000/4069240ca4f0028e/c0a0f0153257f3ce/3/1_6/4041800000000000,3f468b5c33d8eb75,4014000000000000,3f4c0863d65d5888,4050800000000000,0/6_1,1_3,1_2/4038400000000000,4030000000000000,401c000000000000,0,0,0/ false false
add - -53/0/0/403f000000000000/40937513178e7e42/3/0_1,0_1,1_1/403f000000000000,0,0///bff0000000000000,0,3fe0000000000000,4024000000000000 -53/0/0/0/8000000000000000/2/////bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/403f000000000000/40937513178e7e42/3/0_1,0_1,1_1/403f000000000000,0,0///bff0000000000000,0,3fe0000000000000,4024000000000000 false false
add - -53/0/0/404f700eea01855e/406e36efb3b68fb4/0/1_3/4043f00000000000,4037000000000000,3f3dd4030abb461c///3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/0/0/1/////bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/404f700eea01855e/406e36efb3b68fb4/0/0_2/404f700000000000,3f3dd4030abb461c///4024000000000000 false true
add - -53/0/0/0/8000000000000000/2/////3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/4000000000000000/4038307289ce7fd5/3/1_3/0,0,4000000000000000///bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/4000000000000000/4038307289ce7fd5/3/0_1/4000000000000000///4024000000000000 false true
add - 1/255bba08cf8c979d/0/4045800000000000/408f3304459ad839/0/-10_3/4045800000000000,0,0/// -53/0/0/0/0/0/1_1/0///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => error
add - 1/3f50624dd2f1a9fc/4008000000000000/4057800061596f70/40b7622fd1b9db7c/2/4_4,1_2,2_1/0,3ef8565bdc1d57e1,0,0,4048800000000000,0,4022000000000000/2_2/4040800000000000,0/ 5/3f847ae147ae147b/403f000000000000/40615c04fa34fd3e/40c2ba8fd99b567a/0/-7_4/3f43e8d3f4f5ddd9,0,405a580000000000,4004000000000000/// => 1/3f847ae147ae147b/4041000000000000/406d1c052ae1b4f6/40ce6ba7c2784438/0/0_1,4_1,3_1,3_1/405af809f469fa7b,3ef8565bdc1d57e1,4048800000000000,4022000000000000/2_1/4040800000000000/ false false
add - -53/0/0/3f4db89e86b7e438/3f385343cc6ab3bf/1/1_1,2_1/3f4db89e86b7e438,0///bff0000000000000,0,3fe0000000000000,4024000000000000 -2/3f50624dd2f1a9fc/0/407840040befa417/c0c52a2b51e8bee6/0/-8_3,0_3,0_1/4058c00000000000,4050c00000000000,4044800000000000,403b000000000000,4050400000000000,4056400000000000,3f502fbe905def66/// => error
add - 8/3f847ae147ae147b/0/4064ec0000000000/c09068f937d187e0/0/-8_3,1_3,2_1/0,0,4044000000000000,401e800000000000,4053400000000000,401c000000000000,4041e00000000000/// -53/0/0/4061e00000000000/c07ffc9133064f61/1/0_1,0_1/4058800000000000,4046800000000000///4000000000000000 => error
add - -2/3f847ae147ae147b/404b000000000000/404b000000000000/40a599907e16b934/2///// 3/3f847ae147ae147b/0/0/0/1///// => -2/3f847ae147ae147b/404b000000000000/404b000000000000/40a599907e16b934/0///// true false
add - -53/0/0/403a0031fb3039af/408519f126c8b735/2/1_2/3f48fd981cd78e1c,403a000000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/405e800000000000/40ab45eba5a24a61/0/1_2/4058c00000000000,4037000000000000///3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/406280063f660736/40b04633f7aa3c17/0/0_3/3f48fd981cd78e1c,405f400000000000,4037000000000000///3ff0000000000000,4014000000000000 false true
add - 3/0/0/4010000000000000/c05576f88b155036/2/-18_1/4010000000000000/// 0/255bba08cf8c979d/404d800000000000/40714a0000000000/c0b558e5cdfa94b6/0/-17_3,1_2,2_3/4048700000000000,4043800000000000,403d200000000000,0,4056c00000000000,4023400000000000,0,0/// => 0/255bba08cf8c979d/404d800000000000/40718a0000000000/c0b5aec1b026e9f7/0/-17_3,1_2,2_3,4_1/4048700000000000,4043800000000000,403d200000000000,0,4056c00000000000,4023400000000000,0,0,4010000000000000/// false false
add - -53/0/0/3f534c049ce8f142/bfa0fdc70ffce0e7/1/0_3/3f24142da2ff7c83,3f3c5ffd89b48b50,3f4362ff0c37bdba///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/0/0/2/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/3f534c049ce8f142/bfa0fdc70ffce0e7/0/0_3/3f24142da2ff7c83,3f3c5ffd89b48b50,3f4362ff0c37bdba///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 true false
add - 0/3fe0000000000000/3ff0000000000000/405e580000000000/409e916dd1273ccd/1/-20_2,0_4/0,4058d80000000000,0,4018000000000000,0,402e000000000000/// 1/3f847ae147ae147b/3f1620b4f217d05e/40624000b105a791/c0a04c069a87c581/3/9_2/4045000000000000,0/-15_2,1_3,1_1/4028000000000000,4030000000000000,404e000000000000,0,0,4030000000000000/ => 0/3fe0000000000000/405a4001620b4f22/4070b6005882d3c8/c06034fb1f4271a8/3/-20_2,0_4,19_1/0,4058d80000000000,0,4018000000000000,0,402e000000000000,4045000000000000/// false false
add - -4/3f847ae147ae147b/3f1466169cb2dc9d/4070da0571003fad/40c47d54e599d88b/1/7_2,0_4/0,4058800000000000,3f30c36709905707,4052a80000000000,4010000000000000,3f30180ded5cf85f/9_4/4047000000000000,4037000000000000,3f488d84ae57cc60,4038000000000000/ 1/0/4046000000000000/4061c00000000000/40add49e362751ec/2/9_1/4058800000000000/// => -4/3f847ae147ae147b/404600028cc2d396/4079ba0571003fad/40cbf27c7323ad06/0/1_1,5_2,0_4/4058800000000000,0,4058800000000000,3f30c36709905707,4052a80000000000,4010000000000000,3f30180ded5cf85f/9_4/4047000000000000,4037000000000000,3f488d84ae57cc60,4038000000000000/ true false
add - -53/0/0/40633c0000000000/c0aab21bf1b5fa23/3/1_1,0_2/4053000000000000,403d000000000000,4048700000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/4057400000000000/409105c713c3f879/0/0_2/4052000000000000,4035000000000000///3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/406edc0000000000/c0a22f3867d3fde6/3/0_3/4062800000000000,4049000000000000,4048700000000000///3ff0000000000000,4000000000000000,4014000000000000 false true
add - 5/3fe0000000000000/4040000000000000/4073b801412850e4/c0c121225e99e9bb/1/-17_3,2_2/4000000000000000,3f205e44bb296eff,4039800000000000,4052800000000000,0/-18_1,1_1,0_2/4055400000000000,3f27c6c561687250,0,4058400000000000/ 1/3fe0000000000000/0/0/0/1///// => 1/3fe0000000000000/4040000000000000/4073b801412850e4/c0c121225e99e9bb/1/-1_2/400000417912eca6,4058e00000000000/-1_2/40554002f8d8ac2d,4058400000000000/ false false
add - -53/0/0/0/0/0/////3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/4055c004d391667d/40b5b1ed079d8c52/0/0_1,0_2,0_2/4020000000000000,3f334e4599f38f9c,403c000000000000,0,4049800000000000///bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/4055c004d391667d/40b5b1ed079d8c52/0/0_2/40420009a722ccfa,4049800000000000///4024000000000000 false true
add - 0/3fe0000000000000/0/4064e41349f789e2/40acc792ae355503/3/1_4,2_2,0_1/4053800000000000,3f3318ccb4be7988,4055800000000000,3f46ecc82432c7ed,3f47ba9ef6512d40,3f44f410b2a46979,4009000000000000/// 3/3fe0000000000000/4050c00000000000/4080e201a721fa32/c0bfab83c999564f/2/3_3,2_4,2_4/0,4052400000000000,403b000000000000,4047800000000000,402e400000000000,403f000000000000,3f4a721fa31879d6,4058000000000000,4043800000000000,4055800000000000,404d900000000000/// => 0/3fe0000000000000/4050c00000000000/40861b06799fdcaa/c0b147ba727eabce/3/1_4,2_2,0_1/406c200000000000,4070b2047fd0bfaf,4062240000000000,3f46ecc82432c7ed,3f47ba9ef6512d40,3f44f410b2a46979,4009000000000000/// false false
add - -1/3fe0000000000000/0/405380159d5c5de3/40b060a03c67105a/1/-20_1,1_3/4053800000000000,3f4c1b7a921d4cb3,3f3899f61e343204,3f169218d47058ef/// 1/3f50624dd2f1a9fc/0/40773c02aebcc982/4070b34547b7e419/0/-1_3,2_2,2_3/404b000000000000,0,3f4575e64c10bd71,404b800000000000,4052000000000000,4030000000000000,4044000000000000,4054000000000000/5_2/4042600000000000,4032000000000000/ => -1/3fe0000000000000/0/407c1c081613e0fb/40b16bd490e28e9c/0/-20_1,1_3,15_4/4053800000000000,3f4c1b7a921d4cb3,3f3899f61e343204,3f169218d47058ef,404b000000000000,404b801575e64c11,4056000000000000,405e000000000000/2_1/404b600000000000/ false false
add - -53/0/0/0/0/2/////3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/0/0/3/////3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/0/0/3/////3ff0000000000000,4014000000000000 false true
add - -1/3f847ae147ae147b/4045000000000000/4045000000000000/4091ada33453b5e3/1///// 3/0/4042000000000000/4080b702eae724d7/40d4057ee11aa96c/1/0_1,1_3,0_4/4051300000000000,0,404cc00000000000,4050c00000000000,4048600000000000,3f4bfd807a4f4c8a,0,4042000000000000/1_4,2_4/4008000000000000,3f31a99dea181cdd,4056400000000000,4041000000000000,3f33b845bc198901,404a700000000000,4045000000000000,0/ => -1/3f847ae147ae147b/4053800000000000/40820702eae724d7/40d52059145fe4ca/1/0_2/4051300000000000,406a2806ff601e94/1_1/406b9c04ac3c74c6/ false false
add - -1/3fe0000000000000/0/40684005a3d08b14/40b869592f9c5573/2/-12_4,2_3/3f468f422c4e836b,4051800000000000,4056c00000000000,401c000000000000,0,403a000000000000,0/// 2/3f847ae147ae147b/4034000000000000/4034000000000000/4075b01d9a011cf2/1///// => -1/3fe0000000000000/4034000000000000/406ac005a3d08b14/40b9c45b093c6742/0/-12_4,2_3/3f468f422c4e836b,4051800000000000,4056c00000000000,401c000000000000,0,403a000000000000,0/// true false
add - -53/0/0/0/8000000000000000/3/////4000000000000000 -53/0/0/0/8000000000000000/0/////3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/0/8000000000000000/3///// false true
add - 8/255bba08cf8c979d/0/407f5c03d10d8292/c0c1e066c91b1074/2///-11_4,0_3,2_4/4041500000000000,4018000000000000,0,4059600000000000,4054000000000000,4059800000000000,404a800000000000,4053000000000000,3f2af950180c804a,3f47ca180e8f072c,4048500000000000/ -1/0/0/406440108a108d2c/c06b15a111adc552/2/8_4,1_3,2_1/3f4aa87afda13e91,4056000000000000,4040800000000000,4044800000000000,3f369e88dbf71bcb,3f4c3082c91203be,0,0/// => -1/255bba08cf8c979d/0/4084be060b0ae494/c0c24cbd4d61c789/2/8_4,1_3,2_1/3f4aa87afda13e91,4056000000000000,4040800000000000,4044800000000000,3f369e88dbf71bcb,3f4c3082c91203be,0,0/0_2/407c5203d10d8292,4048500000000000/ false false
add - -53/0/0/0/8000000000000000/3/////3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/40604004a9d7483e/40b503444cc93a83/2/0_3/403a000000000000,405a000000000000,3f42a75d20f7697d///bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/40604004a9d7483e/40b503444cc93a83/3/0_1/40604004a9d7483e///4024000000000000 false true
add - 8/3fe0000000000000/0/4067e4008418500a/c0b502c51d66f42c/3/-16_4/4051000000000000,0,3f10830a0142b9b2,405ec80000000000/// 5/0/0/405ff00d603457a4/40b09328eff9a629/3/2_3/405b280000000000,4033200000000000,3f4ac068af48a865/// => 5/3fe0000000000000/0/4073ee039a193dee/c091be70b5b5380c/3/-2_2,2_3/4051000000000000,405ec8010830a014,405b280000000000,4033200000000000,3f4ac068af48a865/// false false
add - -53/0/0/4050080c14bbe762/40a468ba5bd1816d/0/1_3/404d900000000000,4014000000000000,3f482977cec39f38///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/4058000ad81e8dc3/c09f8224355fe28e/2/1_3/4058000000000000,0,3f45b03d1b86b359///3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/4064040b766d3a92/40829ea104864098/0/1_3/4063640000000000,4014000000000000,3f56ecda75252948///3ff0000000000000,4000000000000000,4014000000000000 false false
add - 1/3f50624dd2f1a9fc/0/4071be03488d8d1e/c0c08ab305c26eb9/3/8_4,1_1/4058000000000000,3f4a446c68f06b9f,405cb80000000000,4040000000000000,4044800000000000/// 5/3fe0000000000000/4054400000000000/4054400000000000/c0936e01f22c8051/2///// => 1/3fe0000000000000/4054400000000000/4076ce03488d8d1e/c0c2f8734407fec3/3/8_4,1_1/4058000000000000,3f4a446c68f06b9f,405cb80000000000,4040000000000000,4044800000000000/// false false
add - -53/0/0/0/0/3/1_1/0///4000000000000000 -53/0/0/0/8000000000000000/2/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/0/0/3/////4000000000000000 false true
add - 1/0/3f30c5d69eff53e9/404e8055c10eba07/40aef4afca067dd8/0/-19_1,0_4/3f4d40516c35ed27,3f4cf1ce2fdff7c2,404e800000000000,0,3f432c03ce710e7e/// 1/3f847ae147ae147b/4056400000000000/4056400000000000/408ee8a8e4ccb3ef/0///// => 1/3f847ae147ae147b/4062c0157043ae82/4062c0157043ae82/40b3576d019cd56a/0///// false false
add - -4/3f847ae147ae147b/3f4ea1d4b624b721/405f181160a0514a/40b537010d7a78af/1/5_3,0_2/4034000000000000,4024000000000000,3f207dafb1bebc4a,4022000000000000,4055580000000000/// -2/0/0/406b840422b24da1/c0b12a9d436b2765/2/-10_1,1_3/4042000000000000,4057000000000000,3f408ac936847aee,4057080000000000/// => -4/3f847ae147ae147b/406b840bcb277b2a/4075880669813b23/4090318f283d4528/0/5_3,0_2/4034000000000000,4024000000000000,3f207dafb1bebc4a,4022000000000000,4055580000000000/// true false
add - -53/0/0/4031000000000000/40922f337ddf8855/2/0_2/401c000000000000,4024000000000000///4000000000000000 -53/0/0/0/0/1/////3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/4031000000000000/40922f337ddf8855/0/0_1/4031000000000000/// true true
add - -4/255bba08cf8c979d/4054980000000000/407aae01c887d5b1/40c2f59a640da627/3/-8_2/4057400000000000,4057000000000000/-11_1,2_3,1_2/4041800000000000,3f3c887d5b0ba885,4024000000000000,4057900000000000,4034400000000000,0/ 3/255bba08cf8c979d/0/406684078751de55/40b021bd0db6c56b/2/-4_1,1_3/3f442f2876d30172,3f33dc3e0502f50e,404e000000000000,4034000000000000/-14_4/4004000000000000,0,4032a00000000000,4053c00000000000/ => -4/255bba08cf8c979d/4054980000000000/4082f802c618626e/40cb0678eae908dc/3/-8_2,6_1/4057400000000000,4057000000000000,4054000f0ea3bcaa/-11_1,2_3,1_2,2_1/4041800000000000,3f3c887d5b0ba885,4024000000000000,4057900000000000,4034400000000000,0,4059080000000000/ false false
add - -53/0/0/4056800000000000/c0a42c3a24992490/3/1_1/4056800000000000///3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/0/8000000000000000/3/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/4056800000000000/c0a42c3a24992490/3/1_1/4056800000000000///3ff0000000000000,4014000000000000 false true
add - 3/3f50624dd2f1a9fc/0/0/8000000000000000/2///// 1/255bba08cf8c979d/4042800000000000/4064400000000000/40c17db05f9352db/2/5_2/4052000000000000,404a800000000000/// => 1/3f50624dd2f1a9fc/4042800000000000/4064400000000000/40c17db05f9352db/2/5_2/4052000000000000,404a800000000000/// false false
add - 8/0/4041800000000000/4077fe0000000000/c0a03248b903c091/2///7_4,1_4,0_2/0,4008000000000000,4042700000000000,4050000000000000,404a800000000000,4018000000000000,404f800000000000,0,4044800000000000,4054800000000000/ 0/255bba08cf8c979d/0/4075ac0000000000/40bfecb8fb20a162/2/-7_4,2_1/4030000000000000,4050300000000000,4056c00000000000,4050000000000000,4041000000000000/-1_1/4053400000000000/ => 0/255bba08cf8c979d/4041800000000000/4086d50000000000/40b7d3949e9ec11a/2/-7_4,2_1/4030000000000000,4050300000000000,4056c00000000000,4050000000000000,4041000000000000/-1_1,1_1/4053400000000000,4075ce0000000000/ false false
add - -53/0/0/0/0/1/////4000000000000000 -53/0/0/0/0/3/0_1/0///bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/0/0/3///// false true
add - 8/3f847ae147ae147b/4015800000000000/406ddc0000000000/c0a5815c3d927048/3/-16_3/4051e00000000000,4050400000000000,4058400000000000/// 5/3f50624dd2f1a9fc/0/4056000000000000/40a7226d44737120/3/-19_3,0_1/4022000000000000,0,0,4053c00000000000/// => 5/3f847ae147ae147b/4015800000000000/40746e0000000000/406a11106e100d80/3/-19_4,13_2/4022000000000000,0,0,4053c00000000000,4051e00000000000,4064400000000000/// false false
add - 0/3f847ae147ae147b/0/4046000000000000/409bb050531a3593/1/-9_3/4031000000000000,401c000000000000,4034000000000000/// 8/3f50624dd2f1a9fc/0/0/8000000000000000/2///// => 0/3f847ae147ae147b/0/4046000000000000/409bb050531a3593/0/-9_3/4031000000000000,401c000000000000,4034000000000000/// true false
add - -53/0/0/0/0/2/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/3f3fea6b2b7afe27/3f774581aa45ddbf/1/1_1/3f3fea6b2b7afe27///bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/3f3fea6b2b7afe27/3f774581aa45ddbf/0/0_1/3f3fea6b2b7afe27///3fe0000000000000 true true
add - -1/3f50624dd2f1a9fc/0/407340081d836431/c0b0d0c82322ef14/3/-18_4,1_3/404a800000000000,0,4044800000000000,4046800000000000,3f4ca538f7a8d972,0,0/5_3,2_4/3f34e20fa021b1c7,404d000000000000,4042000000000000,404a000000000000,3f49d5da59ce4063,4037000000000000,0/ -4/0/4025400000000000/4056280000000000/4084cf51b1344737/1/-14_1/4053800000000000/// => -4/3f50624dd2f1a9fc/4056280000000000/4078ca081d836431/c0ac6dbbd9f8cc5a/3/-2_2/4057800000000000,4046801ca538f7a9/1_2/405780053883e808,4052c00ceaed2ce7/ false false
add - -1/255bba08cf8c979d/4048900000000000/40802808cec5ea87/40c7d723a0875b44/2/-1_2,2_4,0_2/4050c00000000000,3f43596096ef1b3d,3f4c95c5751150e3,3f3a4b3e1847ee0c,3f4bffaa7ef8f17a,4042000000000000,405ea00000000000,4035a00000000000/-14_3,1_3/4043c00000000000,4046800000000000,3f49e794703699f8,4051900000000000,3f49f05aa117ac54,4050800000000000/ 8/255bba08cf8c979d/3f4ebf88edf17bac/3f4ebf88edf17bac/3f811836b1929199/2///// => -1/255bba08cf8c979d/4048901ebf88edf1/4080280ababe7966/40c7d724b20ac65d/2/-1_2,2_4,0_2/4050c00000000000,3f43596096ef1b3d,3f4c95c5751150e3,3f3a4b3e1847ee0c,3f4bffaa7ef8f17a,4042000000000000,405ea00000000000,4035a00000000000/-14_3,1_3/4043c00000000000,4046800000000000,3f49e794703699f8,4051900000000000,3f49f05aa117ac54,4050800000000000/ false false
add - -4/3f50624dd2f1a9fc/0/405f400000000000/40b915fbe8f547d2/0/-4_1,2_2,0_1/4050c00000000000,4022000000000000,4048800000000000,0/// 8/3fe0000000000000/4043800000000000/404380114fcd9378/c0862029411704f4/1/-2_1/3f414fcd93781939/// => -4/3ff0000000000000/4064800453f364de/4064800453f364de/40b651f6c0d26734/0///// false false
add - -4/3f847ae147ae147b/0/4060800000000000/40b95be022a82b91/1/-3_1,2_3/0,4048800000000000,4033000000000000,4050000000000000/// -4/3f847ae147ae147b/0/0/8000000000000000/3///// => -4/3f847ae147ae147b/0/4060800000000000/40b95be022a82b91/3/-3_1,2_3/0,4048800000000000,4033000000000000,4050000000000000/// false false
sub - -53/0/0/4031000000000000/408334cab1c64430/2/1_1/4031000000000000///4000000000000000 -53/0/0/4037000000000000/4093d404028be48a/1/0_1/4037000000000000///3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/c018000000000000/c084733d535184e4/0/0_1/c018000000000000/// true true
sub - 5/3f50624dd2f1a9fc/404e800000000000/4074c204014bef7c/40b3089c9d09e59d/2/7_4/4057600000000000,403b000000000000,4028000000000000,3f50052fbdf18640/-6_2,1_3/0,4055400000000000,404ad00000000000,0,0/ 2/255bba08cf8c979d/0/40656c0bcc3b147e/40c05007f1527b0e/2/7_2,2_1,1_2/3f4c7cffa4dc649e,404a800000000000,3f42b3ecad1acdba,0,405d980000000000/// => 2/3f50624dd2f1a9fc/404e800000000000/406417fc365cca7a/c0ab2ee68b3620fe/2/1_2,4_2,2_1,1_2/405e200000000000,40280080297def8c,bf4c7cffa4dc649e,c04a800000000000,bf42b3ecad1acdba,8000000000000000,c05d980000000000/0_1/4061540000000000/ false false
sub - -1/3fe0000000000000/0/4058400000000000/40b728014367bfcc/1/0_1/4058400000000000/// 1/3f847ae147ae147b/0/407d4203ac059cc2/c0be5e4f15ebc66a/0/-3_3,2_1,1_4/4008000000000000,3f478b9521bd6bd8,3f27525f11469851,4041000000000000,4036e00000000000,4043000000000000,4047100000000000,4057000000000000/-15_2,2_4/0,4038000000000000,405d080000000000,403e000000000000,0,404f000000000000/ => -1/3fe0000000000000/c06d6405e2e5486f/c0773203ac059cc2/40cac3282ca9c31b/0/0_3/40577ff14fe98cf8,c04c700000000000,c066040000000000/// false false
sub - -53/0/0/0/0/2/////4000000000000000 -53/0/0/4056400000000000/40b07b798aab5411/2/0_1/4056400000000000///4000000000000000 => -53/0/0/c056400000000000/c0b07b798aab5411/2/0_1/c056400000000000///4000000000000000 false false
sub - -53/0/0/0/0/3/////3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/402a00c7a92424a6/407c1b331635e8a5/1/1_2,0_2/4018000000000000,3f501b3e31459781,3f41b3cca69e8f7f,401c000000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/c02a00c7a92424a6/c07c1b331635e8a5/3/0_3/c018000000000000,bf58f5248494df40,c01c000000000000///3ff0000000000000,4014000000000000 false true
sub - 1/3f847ae147ae147b/4018000000000000/408210002fd0058a/c092ddd52214fba6/0/-4_3/4056400000000000,4057200000000000,4054300000000000/-20_3,2_1,1_1/4054800000000000,405ef00000000000,4053400000000000,403b000000000000,3f17e802c4e58a72/ 1/0/4040800000000000/4069400574272fba/40c290688928ce06/3/2_3,2_1/403a000000000000,4059000000000000,3f45d09cbee7531e,4045800000000000/// => 1/3f847ae147ae147b/c03b000000000000/40777ffda58c7337/c0c4ec232d6b6d7b/3/-4_3,3_3,2_1/4056400000000000,4057200000000000,4054300000000000,c03a000000000000,c059000000000000,bf45d09cbee7531e,c045800000000000/-20_3,2_1,1_1/4054800000000000,405ef00000000000,4053400000000000,403b000000000000,3f17e802c4e58a72/ false false
sub - -53/0/0/4070b80000000000/4084e22b9529fa40/0/0_3/4055c00000000000,4052400000000000,405ae00000000000///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/0/0/1/////bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/4070b80000000000/4084e22b9529fa40/0/0_1/4070b80000000000/// false true
sub - 2/3f847ae147ae147b/0/4070560194b5f8b0/c0ae32461b24c413/3/-9_1,0_2,0_3/403b000000000000,4052980000000000,3ef736427aec65cb,404e800000000000,4055800000000000,402a000000000000/-19_1/3f37d7fb6348642e/ 5/0/3f4c9244d3cdcfa8/3f4c9244d3cdcfa8/3fad92e4dea982d1/3///// => 2/3f847ae147ae147b/bf4c9244d3cdcfa8/407055fe026d5e36/c0ae3263ae09a2bd/3/-9_1,0_2,0_3/403b000000000000,4052980000000000,3ef736427aec65cb,404e800000000000,4055800000000000,402a000000000000/-19_1/3f37d7fb6348642e/ false false
sub - -53/0/0/0/8000000000000000/2/////4000000000000000 -53/0/0/0/8000000000000000/0/////4000000000000000 => -53/0/0/0/0/0/////4000000000000000 false false
sub - 0/0/403e000000000000/4065c001ca334fca/40bd5f662b85a18e/1/2_3,0_1,0_2/4010000000000000,0,402a000000000000,3f2ca334fc9d0c48,404b800000000000,4052000000000000/// 1/3f847ae147ae147b/0/4075800c800e7845/c0bf657d319c1ca4/0/-5_4,0_1,2_2/4053400000000000,3f43cbb79a15e86c,4053000000000000,403d000000000000,3f1aa338fd6123b5,4058c00000000000,0/0_1,1_4,2_1/402e000000000000,4048000000000000,3f4b40c642512eca,0,3f4d45e7224bfaa4,3f4459a7a3cfa9cf/ => 0/3f847ae147ae147b/403e000000000000/c065401735e9a0c0/40ce6271ae90df19/0/-2_4,0_1,1_4/c0534009e5dbcd0b,c05a400000000000,bf1aa338fd6123b5,c058c00000000000,4010000000000000,402a000000000000,3f2ca334fc9d0c48,404b800000000000,4052000000000000/0_5/c02e000000000000,c048000000000000,bf4b40c642512eca,bf4d45e7224bfaa4,bf4459a7a3cfa9cf/ false false
sub - -53/0/0/0/8000000000000000/0/////4000000000000000 -53/0/0/4054580000000000/40b50a2196cf348e/1/0_3/4051c00000000000,4024c00000000000,0///3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/c054580000000000/c0b50a2196cf348e/0/0_1/c054580000000000/// false true
sub - -53/0/0/0/0/0/////3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/0/8000000000000000/1/0_1/0///3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/0/0/0/0_1/8000000000000000///3ff0000000000000,4000000000000000,4014000000000000 false false
sub - -1/3f50624dd2f1a9fc/4014000000000000/40821001f41a39b1/c0caef438a509d96/2/-14_4,2_2,1_4/404c000000000000,3f278af099e6ca93,4054800000000000,3f016a2fcfb0f7ba,4026000000000000,4056400000000000,4048000000000000,403f000000000000,4054800000000000,403a000000000000/4_4/4053000000000000,4024000000000000,404f000000000000,3f48484477a30b27/ -53/0/0/4038000000000000/c078d8b6f0b54486/3/0_1/4038000000000000///3ff0000000000000,4014000000000000,4024000000000000 => error
sub - -53/0/0/0/0/3/////3ff0000000000000,4014000000000000,4024000000000000 5/0/0/4072840000000000/40a6b6466e54b41d/1/-6_1,0_1,2_3/4056000000000000,0,4050680000000000,4051680000000000,4052400000000000/// => error
sub - 8/255bba08cf8c979d/404f800000000000/4076400000000000/c0c3e4a427980441/2/-19_2/4043600000000000,4056380000000000/-1_2/4047000000000000,405dd80000000000/ 0/3f847ae147ae147b/4055000000000000/4066200000000000/40a3883b26f8e10f/0///-3_1/4057400000000000/ => 0/3f847ae147ae147b/c035000000000000/4066600000000000/c0c8c6b2f1563c85/0/0_1/405fe80000000000/-3_1,2_1/c057400000000000,4064ac0000000000/ false false
sub - -53/0/0/0/0/3/////4000000000000000 -2/3f847ae147ae147b/0/40627c0daec15e02/40c384e202da3d5b/1/6_4,0_2,1_4/0,3f26d1557a8b7820,3f3171044971b246,0,4031e00000000000,3f3c5cf87b431f00,404f000000000000,0,3f4a1fb1b70c16a4,4051000000000000/// => error
sub - 1/3f50624dd2f1a9fc/0/40746c0000000000/c09593f5ac82d9ff/2/2_2,2_3/403ac00000000000,4057800000000000,4045000000000000,4014000000000000,4050400000000000/4_2,1_1,1_1/0,4043000000000000,404c000000000000,0/ 3/255bba08cf8c979d/0/0/0/0///// => 1/3f50624dd2f1a9fc/0/40746c0000000000/c09593f5ac82d9ff/0/2_2,2_3/403ac00000000000,4057800000000000,4045000000000000,4014000000000000,4050400000000000/4_2,1_1,1_1/0,4043000000000000,404c000000000000,0/ false false
sub - -2/255bba08cf8c979d/0/407dbc00e946de20/40ce4d4e88069d5d/1/8_4/4055700000000000,3edc28edcbb809af,4058c00000000000,0/-3_4,0_2/4052000000000000,3f2c479455a3adc1,4055400000000000,4050000000000000,4045000000000000,403c000000000000/ 1/3fe0000000000000/3f4060196c39dbc6/4074dc03749c3854/40d3dd65670859e1/3/-20_1,0_4/4055000000000000,403ac00000000000,3f2c841b999b9311,4054000000000000,3f208f05c015b4ce/-17_1,0_3/404f000000000000,4022000000000000,4050000000000000,4020000000000000/ => -2/3ff0000000000000/c05c300a497e569c/4061bffae9554b98/c0b2daf88c142cca/3/8_3/4055700000000000,3edc28edcbb809af,4058c00000000000/1_2/4045000000000000,403c000000000000/ false false
sub - -1/3f847ae147ae147b/4054400000000000/4054400000000000/40b5cad8a3e10b2a/1///// -2/3f50624dd2f1a9fc/0/0/0/1///// => -2/3f847ae147ae147b/4054400000000000/4054400000000000/40b5cad8a3e10b2a/1///// false false
sub - 2/3f50624dd2f1a9fc/0/4073960360d28bb7/c09c3bd0f8c1ce69/0/-8_3,2_3,0_1/4040000000000000,4053000000000000,3f46b3fd373c815d,4041000000000000,4059f00000000000,4050e80000000000,3f214a5c99ed3c4d/// -2/255bba08cf8c979d/4059b00000000000/4080e20000000000/409d3f3eb7c26fa4/1/-3_2/4049800000000000,4051400000000000/-13_1,0_2,2_3/404c000000000000,0,404e000000000000,404b400000000000,404b800000000000,4057000000000000/ => -2/3f70000000000000/c080e20000000000/c06c5bf93e5ae892/c0acbd87d8421f06/0/0_1/4073960360d28bb7/// false false
sub - -1/0/0/4060000000000000/40b5db79eeb5f98d/2/3_2,0_3/4026000000000000,4058800000000000,402e000000000000,0,4010000000000000/// 5/0/0/4046000f6c5b7f2f/4092412763b3c3ec/0/-10_1,1_2,0_2/3f3ed8b6fe5d9447,0,0,4038000000000000,4034000000000000/// => -1/0/0/4054fff849d24068/40b14b3015c90892/0/0_1,2_2,0_3/c046000f6c5b7f2f,4026000000000000,4058800000000000,402e000000000000,0,4010000000000000/// false false
sub - 2/3f847ae147ae147b/0/4060600431d1e858/40ae735bd016c109/0/-13_3/4057800000000000,4042800000000000,3f40c747a1604042/// -53/0/0/0/0/2/////bff0000000000000,0,3fe0000000000000,4024000000000000 => error
sub - -53/0/0/4064c00303becfe1/c0b25f64110ef469/1/0_1,2_2/4054400000000000,4055400000000000,3f381df67f040922///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/0/0/3/////bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/4064c00303becfe1/c0b25f64110ef469/3/0_2/4054400000000000,40554006077d9fc1///3fe0000000000000 false true
sub - -53/0/0/0/8000000000000000/1/0_1,0_1/0,0///4000000000000000 -53/0/0/0/0/0/////bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/0/8000000000000000/0///// false true
sub - 3/0/4022000000000000/4066200f72bebe39/409489b80a469c64/2/6_4/403f000000000000,4050800000000000,4046800000000000,403a000000000000/5_3/3f44f997513cce5e,3f4ac67cf9c26db6,3f3c15cd5bca1ed8/ 0/3f50624dd2f1a9fc/3f4a579be70a4719/405d08230bd68d4a/40a9c2dd0afbdcd8/3/-6_1,1_2,1_4/4009000000000000,4053400000000000,0,3f42e4cccb7c2861,4042000000000000,0,3f48db44680e916e/// => 0/3f50624dd2f1a9fc/4021ff96a19063d7/404e6ff7b34dde50/c09efc020bb11d4c/3/-6_1,1_2,1_2,0_2/c009000000000000,c053400000000000,8000000000000000,bf42e4cccb7c2861,c042000000000000,4061c00000000000,4039ffce49772fe3/1_1/3f5ee57d7c7225c0/ false false
sub - 1/0/0/4073f80000000000/40d0e786e3c7d590/2/-7_3,0_1,0_4/4031000000000000,402e000000000000,0,4057800000000000,4045000000000000,4045500000000000,4031000000000000,4056f80000000000/// 2/0/0/407470063d996299/40d2604d6bb31a99/1/7_1,2_4,1_4/4010000000000000,3f322474ebd72c31,0,4031000000000000,404a000000000000,4040800000000000,3f22e10f20bd5186,404b200000000000,3f47d33bc5c4e2be/-10_1,0_2,2_2/4031000000000000,4037000000000000,4013800000000000,405e780000000000,3f389e2221d2cc4d/ => 1/0/0/c01e018f6658a640/c0978c687eb45090/0/-7_3,0_1,0_4,3_6/4031000000000000,402e000000000000,0,4057800000000000,4045000000000000,4045500000000000,4031000000000000,4056f80000000000,c010000000000000,bf322474ebd72c31,c031000000000000,c04a000000000000,c0408004b843c82f,c04b2017d33bc5c5/-5_2,1_1/c031000000000000,c03be00000000000,c05e780627888875/ true false
sub - 0/3f50624dd2f1a9fc/0/406f040000000000/40b7be4d3c339fd3/0///-2_3/404d100000000000,4057800000000000,4058000000000000/ -1/3fe0000000000000/0/40724c016a8f3116/40c8a8398a1443ba/1/-7_4,1_3/4047800000000000,0,4046000000000000,4050800000000000,3f36a8f3116490b6,4043800000000000,4058300000000000/// => -1/3fe0000000000000/4063040000000000/c046500b547988b0/c0b99225d7f4e7a1/0/0_1/c058300000000000/0_1/4058000000000000/ false false
sub - 0/3fe0000000000000/0/4077c40000000000/40d0f2d0e4f890e2/2/4_4,1_3/4051c00000000000,4058c00000000000,4042200000000000,404c000000000000,0,4040800000000000,4055400000000000/// 0/0/0/405da021c21780e7/409e515fb3703038/1/-6_1,1_4,2_1/3f338d56124eaddc,3f37d16e9274c046,405da00000000000,3f3082e4e3970794,3f4a13907440fa59,3f36ff9392be4917/// => 0/3fe0000000000000/c05da01c02329c37/40705bf78f7a1fc6/40ce1b75d3831bbd/0/2_1,1_4,1_3/bf36ff9392be4917,4051c00000000000,4058c00000000000,4042200000000000,404c000000000000,0,4040800000000000,4055400000000000/// true false
sub - -53/0/0/4058000000000000/40a41b8e86fd0e9a/1/1_1/4058000000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/4039000000000000/409678f16152b180/1/0_1/4039000000000000///3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/4051c00000000000/4091be2baca76bb4/1/0_1/4051c00000000000///3ff0000000000000,4000000000000000,4014000000000000 false true
sub - -53/0/0/404a000000000000/40ab3c3260b12014/0/1_2/4034000000000000,4040000000000000///3ff0000000000000,4000000000000000,4014000000000000 -2/255bba08cf8c979d/4049800000000000/4049800000000000/408b92cd399fcad6/1///// => error
sub - 5/3f50624dd2f1a9fc/0/4081400000000000/c0876ab539131e4b/0/-17_2,0_2/4049800000000000,4056600000000000,404b000000000000,403b000000000000/-17_2,2_4,0_1/4045000000000000,0,402c000000000000,4030000000000000,405ea00000000000,4052400000000000,404f800000000000/ -4/3fe0000000000000/0/406e3c04dcbe9db2/c0b0211f8c33b256/1/5_2,1_1/4034200000000000,404ce00000000000,4043800000000000/4_3,0_1,0_2/404c800000000000,0,0,3f4372fa76c879b3,0,4051000000000000/ => -4/3fe0000000000000/0/407361fd91a0b127/40aa6791ca229d19/0/0_1,4_2,1_1/406bb00000000000,c034200000000000,c04ce00000000000,c043800000000000/0_1,3_6/4074a80000000000,c04c800000000000,8000000000000000,8000000000000000,bf4372fa76c879b3,8000000000000000,c051000000000000/ false false
sub - -53/0/0/0/8000000000000000/1/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/402ac00000000000/4084815b37078686/1/0_1/402ac00000000000///bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/c02ac00000000000/c084815b37078686/1/0_1/c02ac00000000000///3fe0000000000000 false true
sub - 0/3f50624dd2f1a9fc/0/4050800c8552915d/c05ecd6a44660034/2/-7_4/0,4049000000000000,4030000000000000,3f490aa522ba303d/// 3/255bba08cf8c979d/4054c00000000000/40725202d355de40/40b2c4f9133aa3b9/1///5_3,0_2/403d000000000000,0,4056c00000000000,3f469aaef1ffbea8,4056880000000000/ => 0/3f50624dd2f1a9fc/c054c00000000000/c06c63ff640273d2/c0b3402ebc4c3bba/0/-7_4/0,4049000000000000,4030000000000000,3f490aa522ba303d/1_2/c05e000b4d577900,c056880000000000/ true false
sub - 2/255bba08cf8c979d/4010000000000000/4054c00798fcca3c/40b2306d0191aa1a/0/-12_3/3f3e63f328ede380,4053c00000000000,0/// 0/255bba08cf8c979d/4014000000000000/4067f8051a990ce7/40a4cf164926e798/2/1_1,2_3,1_1/0,4059700000000000,3f446a64339b4c83,0,4055400000000000/// => 0/255bba08cf8c979d/bff0000000000000/c05b30029c354f92/409f238773f8d938/0/-3_2,2_1,2_3,1_1/3f3e63f328ede380,4053c00000000000,8000000000000000,c059700000000000,bf446a64339b4c83,8000000000000000,c055400000000000/// false false
sub - -53/0/0/4000000000000000/404b31792da8034f/0/1_1/4000000000000000///3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/4067e00000000000/409fe7ee0d884baf/2/1_3/4056400000000000,4033000000000000,4054c00000000000///3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/c067a00000000000/c09f0e62441b0b95/0/1_2/c05a800000000000,c054c00000000000///3ff0000000000000,4014000000000000 false true
sub - 0/0/0/4071c00730555055/40af320cbf6bf7d6/1/-4_2,1_3,0_3/4051000000000000,3f4783cebba72ac4,3f46a7b2c376a240,3f30bee3f5e3a079,4056800000000000,3f17bdb844ce37bc,4056000000000000,4043000000000000/// -53/0/0/0/0/1/////4000000000000000 => error
sub - -53/0/0/0/8000000000000000/0/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/0/0/3/////4000000000000000 => -53/0/0/0/8000000000000000/3/////4000000000000000 false true
sub - 2/3f847ae147ae147b/403e000000000000/403e000000000000/4092c9d844a782b0/2///// 1/3fe0000000000000/4054800000000000/40814400a1f40832/40b94754ec9f6610/3/-16_4,1_4/4010000000000000,3f343e81064bd15a,405e900000000000,4050000000000000,4056800000000000,0,4057900000000000,4058000000000000/// => 1/3fe0000000000000/c04a000000000000/c0805400a1f40832/c0b494dedb758564/3///// false false
sub - -2/0/0/40648404f5d2bd27/40c13157d0f289fb/3/-1_4,0_4/3f43d74af49ce657,4056400000000000,0,0,0,3ff0000000000000,0,4038a00000000000/8_3/0,4048c00000000000,0/ 8/3f50624dd2f1a9fc/402c000000000000/402c000000000000/40843f9056a872b7/2///// => -2/3f50624dd2f1a9fc/c02c000000000000/4062c404f5d2bd27/40bfdabd9710059f/3/-1_2,3_1,1_1/3f43d74af49ce657,4056400000000000,3ff0000000000000,4038a00000000000/9_1/4048c00000000000/ false false
sub - 1/255bba08cf8c979d/0/40735408b16a2de1/c0911b98e1465c53/0/-19_2/4054400000000000,3f1a8add5ef1de86/-13_2,1_4,2_4/0,4057c00000000000,3f3e10ea93ce64f3,3f48a341b761446c,4044800000000000,3f22d37524698bc0,4028000000000000,4054100000000000,3f45d96178c8810c,0/ -2/255bba08cf8c979d/4002000000000000/406e480000000000/40c79155fbc55395/1/7_2,2_2/4052400000000000,0,4056c00000000000,4053000000000000/// => -2/255bba08cf8c979d/c002000000000000/4050c022c5a8b784/c0c9b4c917ee1f1f/0/-2_1,8_2,2_2/40544001a8add5ef,c052400000000000,8000000000000000,c056c00000000000,c053000000000000/-1_2/40610009eaedc052,4057100d471f60f1/ false false
sub - -2/0/0/4065a00b975b46cc/40c2d453984b6978/0/-14_4,0_3/3f3f238eb98d29b6,4051400000000000,0,404a000000000000,3f4ecba5be6b0c73,403b400000000000,4038c00000000000/// 0/0/0/0/0/0///// => -2/0/0/4065a00b975b46cc/40c2d453984b6978/0/-14_4,0_3/3f3f238eb98d29b6,4051400000000000,0,404a000000000000,3f4ecba5be6b0c73,403b400000000000,4038c00000000000/// false false
sub - -53/0/0/3f3cd042ec7b9216/bf69e751aa54e7d2/3/0_1/3f3cd042ec7b9216///4000000000000000 -53/0/0/3f473ec994330a97/3f66749944fcdf58/2/0_1/3f473ec994330a97///4000000000000000 => -53/0/0/bf31ad503bea8318/bf782df577a8e395/3/0_1/bf31ad503bea8318///4000000000000000 false false
sub - -4/3f847ae147ae147b/0/4056400b15003785/c048d6495881aa90/2/2_2/3f462a006f0a87c4,4056400000000000/// -1/255bba08cf8c979d/0/40883d02338a25d9/40d3096e181182ba/1/-6_4,1_4/4055c00000000000,402e000000000000,4041f00000000000,4058000000000000,0,4054400000000000,404fe00000000000,4049800000000000/7_4,1_4,2_2/0,404c800000000000,3f48242d973a3aab,4055000000000000,401c000000000000,4054800000000000,4035000000000000,3f3628e98caab0f6,4057c00000000000,0/ => -4/3f90000000000000/c06d3c0000000000/c0857500d0ea1ee8/c0d315d93cbdc38f/0/0_2,0_2/c073ae0000000000,c05cb00000000000,3f462a006f0a87c4,4056400000000000/1_3/c04c800000000000,c0684008ce289763,c057c00000000000/ true false
sub - 1/3f847ae147ae147b/4033000000000000/406a7c0737e3d430/40c31ea9066f55b8/1/-4_4,1_1,1_3/4050c00000000000,4039e00000000000,0,0,4057c00000000000,4008000000000000,4000000000000000,3f4cdf8f50c1ba26/// 8/255bba08cf8c979d/405c100000000000/406e2804b8f607ca/40b3bfaf6b2b6505/1/8_2,2_3/404d800000000000,4049000000000000,4034000000000000,0,3f42e3d81f28c428/// => 1/3f847ae147ae147b/c057500000000000/c03d5fec08919cd0/40b27da2a1b3466b/1/-4_4,1_1,1_3/4050c00000000000,4039e00000000000,0,0,c0410012e3d81f28,4008000000000000,4000000000000000,3f4cdf8f50c1ba26/// false false
sub - -4/0/0/0/8000000000000000/1/-16_2/0,0/// 8/3f847ae147ae147b/0/406e00059a8ef492/4083f8cc3ac55f25/3/1_2,0_2,2_2/404e800000000000,3f466a3bd249e807,4043800000000000,403e000000000000,4054c00000000000,403b000000000000/// => -4/3f847ae147ae147b/0/c06e00059a8ef492/c083f8cc3ac55f25/3/1_1/c06e00059a8ef492/// false false
sub - 5/0/4035000000000000/4061b00000000000/40b600d7c9ccc02c/3/9_1,2_4/401e000000000000,0,404b800000000000,0,404d000000000000/// 1/3f847ae147ae147b/4051400000000000/4079500000000000/40d6801e0d945c6a/3/7_4,1_2,2_2/4058400000000000,0,4052c00000000000,4037000000000000,0,4041800000000000,404f000000000000,4046000000000000/// => 1/3f847ae147ae147b/c048000000000000/c070780000000000/c0d0ffe81b212c5f/3/1_1,5_4,1_2,2_2/405e200000000000,c058400000000000,8000000000000000,c052c00000000000,c037000000000000,8000000000000000,c041800000000000,c04f000000000000,c046000000000000/// false false
sub - 8/255bba08cf8c979d/0/3f1b116b044b6448/bf64a5376b8ed139/0/2_1/3f1b116b044b6448/// 1/255bba08cf8c979d/0/405a5815abb8f97c/40b5ee5d1cabe6bf/0///-9_4,0_3/3ff6000000000000,4043800000000000,3f33c9f63124be63,0,4050400000000000,3f0e2ebc162d27c0,3f4f8f8b1904b90c/ => 1/255bba08cf8c979d/0/c05a5813faa24937/c0b5ee5dc1d5a21b/0/1_1/3f1b116b044b6448/-9_7/bff6000000000000,c043800000000000,bf33c9f63124be63,8000000000000000,c050400000000000,bf0e2ebc162d27c0,bf4f8f8b1904b90c/ false false
sub - 5/3f847ae147ae147b/0/4064c80000000000/4097b8bf6e652102/1/-4_1,1_4/0,405a900000000000,4048000000000000,4028000000000000,0/// -1/3f50624dd2f1a9fc/4047d00000000000/4069b4039790be58/40b5ffa7f46dddd5/0/-2_1,0_1,2_2/4051c00000000000,3f3cbc85f2bb9fa5,4052c00000000000,4028000000000000/// => -1/3f847ae147ae147b/c047d00000000000/c043b00e5e42f960/c0b0117818d49594/0/-2_2,0_4/c051c00000000000,bf3cbc85f2bb9fa5,4064c80000000000,0,c052c00000000000,c028000000000000/// false false
sub - -53/0/0/4059200000000000/c0a255ddd414c46e/2/0_1/4059200000000000///3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/0/8000000000000000/1/////3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/4059200000000000/c0a255ddd414c46e/0/0_1/4059200000000000///3ff0000000000000,4014000000000000,4024000000000000 true false
sub - -53/0/0/0/0/1/////4000000000000000 -53/0/0/0/0/2/////3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/0/0/0///// true true
sub - -4/0/0/0/0/1///// 3/3f50624dd2f1a9fc/4051800000000000/4070e003fc50ee5f/c0a4732cee1e719f/1/1_2,1_3,1_1/3f4fe28772f9d584,0,4056c00000000000,4057000000000000,0,4031000000000000/// => -4/3f50624dd2f1a9fc/c051800000000000/c070e003fc50ee5f/40a4732cee1e719f/1/1_1/c0690007f8a1dcbe/// false false
sub - 2/3fe0000000000000/0/0/0/0///// 0/3f847ae147ae147b/0/4075100000000000/40a922d1d58a0fc7/1/-3_1/403e000000000000/4_4,1_2/4057000000000000,402e000000000000,4053c00000000000,403f000000000000,403c000000000000,404f000000000000/ => 0/3fe0000000000000/c03e000000000000/c075100000000000/c0a922d1d58a0fc7/0///4_4,1_2/c057000000000000,c02e000000000000,c053c00000000000,c03f000000000000,c03c000000000000,c04f000000000000/ false false
sub - -53/0/0/0/8000000000000000/0/////4000000000000000 -53/0/0/3f4a003019c5e8d4/3fa1b611275090ab/1/1_1/3f4a003019c5e8d4///3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/bf4a003019c5e8d4/bfa1b611275090ab/0/0_1/bf4a003019c5e8d4/// false true
sub - 0/255bba08cf8c979d/0/405c180000000000/40bbc4ac2d6e1e3f/2///7_4,2_1/0,405bd80000000000,3ff0000000000000,0,0/ -1/3f847ae147ae147b/0/407f4c053cc5ff9e/40c08f72fddb9024/1/1_4,1_4/404b800000000000,4031000000000000,4037000000000000,4030000000000000,4053800000000000,4059f00000000000,0,3f32d88b882021b1/5_1,0_3,2_4/0,3f4ca2efc5d75dc1,4041800000000000,4045000000000000,4040b00000000000,4058680000000000,0,3f1eb7d3985fbe64/ => -1/3f847ae147ae147b/0/c07846053cc5ff9e/c09568e739240824/0/1_4,1_4/c04b800000000000,c031000000000000,c037000000000000,c030000000000000,c053800000000000,c059f00000000000,8000000000000000,bf32d88b882021b1/4_5,2_4/405bd80000000000,3ff0000000000000,bf4ca2efc5d75dc1,c041800000000000,c045000000000000,c040b00000000000,c058680000000000,8000000000000000,bf1eb7d3985fbe64/ true false
sub - -1/0/0/4082e3016f099d12/40d284f205ac28f4/1/-13_3,2_2,1_3/4043000000000000,403c000000000000,4054400000000000,3f46f099d1209a69,4044000000000000,4047c00000000000,4056c00000000000,4051000000000000/-1_2,2_2/405d680000000000,4041a00000000000,4028000000000000,4047000000000000/ 3/3fe0000000000000/0/4056400000000000/40abf8dde17ea9ab/1///-8_3/0,4056400000000000,0/ => -1/3ff0000000000000/407c9602de133a24/40801b016f099d12/40ce0bac92f8a77d/1///3_2/4028000000000000,4047000000000000/ false false
sub - -53/0/0/4049000000000000/40a57900eb29895d/3/1_1/4049000000000000///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/4051380000000000/c0962fe07f4326eb/0/0_2/4051380000000000,0///bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/c032e00000000000/40b0487895658e69/3/0_1/c032e00000000000/// false true
sub - -2/0/404e000000000000/404e000000000000/c0976969038261be/1///// 0/3f847ae147ae147b/402e000000000000/406aac0000000000/4033244f204469af/3/-10_1,0_1,2_3/4034000000000000,0,4026c00000000000,4054800000000000,4055400000000000/// => -2/3f847ae147ae147b/4046800000000000/c0632c0000000000/c097b5fa40037365/3/-1_1/c0664c0000000000/// false false
sub - -2/3f847ae147ae147b/0/407a40056ef85ad2/40da56f4bfcddb4b/2/-11_1,0_1,2_3/4058000000000000,0,4053c00000000000,3f491b9532fcc7ab,4056c00000000000/0_1,0_3,2_3/402e000000000000,0,4000000000000000,4056c00000000000,3f259e251caca455,4047000000000000,3f39e948b8d2eed1/ -2/0/0/4052000000000000/40a34efff68750c8/3/-7_1/4052000000000000/// => -2/3f847ae147ae147b/c052000000000000/4075c0056ef85ad2/40d7ed14c0fcf132/3/-11_1,0_1,2_3/4058000000000000,0,4053c00000000000,3f491b9532fcc7ab,4056c00000000000/0_1,0_3,2_3/402e000000000000,0,4000000000000000,4056c00000000000,3f259e251caca455,4047000000000000,3f39e948b8d2eed1/ false false
sub - -53/0/0/403ae00000000000/c078c0b1b2ddd0f5/2/0_2/403ae00000000000,0///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/0/8000000000000000/3/////3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/403ae00000000000/c078c0b1b2ddd0f5/3/0_1/403ae00000000000///3ff0000000000000,4014000000000000 false true
sub - -1/3f847ae147ae147b/3f3901215f1bbbce/4035c01901215f1c/4093a1cd08ee51c5/3/-18_2/4026000000000000,4025800000000000/// -4/3fe0000000000000/401c000000000000/4076b6033bf3d52a/40d5f567f82c5d0a/1///2_2,1_4/3f49df9ea94e3651,4058800000000000,4055400000000000,4058000000000000,4051180000000000,4022000000000000/ => -4/3fe0000000000000/402d80320242be38/c0755a01abe1bf38/c0d4bb4b279d77ee/3///2_2,1_4/bf49df9ea94e3651,c058800000000000,c055400000000000,c058000000000000,c051180000000000,c022000000000000/ false false
sub - 8/3fe0000000000000/0/0/0/0///// 2/3fe0000000000000/0/4071c803f73bb127/40cfb2abb58be2c6/3/-19_3,2_4,1_3/0,403f000000000000,0,4018000000000000,4055000000000000,3f4fb9dd89382514,0,4044800000000000,405ea00000000000,0/// => 2/3fe0000000000000/0/c071c803f73bb127/c0cfb2abb58be2c6/3///// false false
sub - -53/0/0/403e800000000000/409655d405cefcbc/0/1_1/403e800000000000///4000000000000000 -53/0/0/0/0/0/////3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/403e800000000000/409655d405cefcbc/0/0_1/403e800000000000/// false true
sub - -53/0/0/0/0/3/////4000000000000000 5/3f847ae147ae147b/4055800000000000/40719c02e63ab006/409501ce0c04334a/2/-7_2,0_4/0,3f4731d5802fa1c2,0,4042000000000000,4049300000000000,405b580000000000/// => error
sub - 8/255bba08cf8c979d/4055800000000000/4055800000000000/409c4e23493950e2/0///// -4/3f847ae147ae147b/404b800000000000/4075e0036695e821/40d73c1781e25cd0/0/7_2,2_4/4043600000000000,0,4058900000000000,4054000000000000,3f4b34af4106d9f9,4053800000000000/// => -4/3f847ae147ae147b/403f000000000000/c07080036695e821/c0d577354d4ec7c2/0/7_2,2_4/c043600000000000,8000000000000000,c058900000000000,c054000000000000,bf4b34af4106d9f9,c053800000000000/// false false
sub - -53/0/0/4054800000000000/40b60ff04c6c3ed9/1/0_1/4054800000000000///3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/0/0/0/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/4054800000000000/40b60ff04c6c3ed9/0/0_1/4054800000000000///3ff0000000000000,4014000000000000 false true
sub - 8/255bba08cf8c979d/4051980000000000/4072e00000000000/40bc9a7136a3a549/1///-4_2,1_4,1_1/0,403f000000000000,404a800000000000,4022000000000000,4051c00000000000,4005000000000000,4050400000000000/ 8/0/0/4080cc018e0e49d8/c0bbddbf127c8a65/0/-13_2,0_4/403d000000000000,403b600000000000,3f279380362863bd,403d000000000000,4055c00000000000,4055c00000000000/9_2,2_3,0_4/0,0,4050b80000000000,0,404a800000000000,3f42fc048feddf27,4034000000000000,4057800000000000,4046200000000000/ => 8/255bba08cf8c979d/4051980000000000/c06d700638392760/40cc3c18249017d7/0/-13_6/c03d000000000000,c03b600000000000,bf279380362863bd,c03d000000000000,c055c00000000000,c055c00000000000/-4_2,1_4,1_1,4_2,2_7/0,403f000000000000,404a800000000000,4022000000000000,4051c00000000000,4005000000000000,4050400000000000,8000000000000000,8000000000000000,c050b80000000000,8000000000000000,c04a800000000000,bf42fc048feddf27,c034000000000000,c057800000000000,c046200000000000/ false false
sub - 8/3fe0000000000000/0/4075a004d13b0e04/40d4627bbba61bc3/0/-19_3,1_3/0,404c800000000000,3f26a55e114c5d7b,4038000000000000,4000000000000000,404d000000000000/-6_4,2_1,2_3/3f3dfecf5532a549,4037000000000000,403c000000000000,3f37a53952c1b5d1,3f2839f25f3f1e31,4056c00000000000,404f800000000000,0/ -53/0/0/406fd407852e1f2e/c088654c24f2fe63/3/0_1,0_2,1_1/4059680000000000,3f4e14b87cb64bd6,4057400000000000,404e000000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => error
sub - -4/3fe0000000000000/0/0/0/3///// 0/0/3f423a946c0c7d7b/4083f101ee032b15/40e1caaeca09c140/0/6_2,0_1,1_3/4026000000000000,404f800000000000,4055000000000000,4054400000000000,0,4058000000000000/3_2,2_3,1_4/404f200000000000,4045000000000000,4026000000000000,403b800000000000,4033000000000000,405c180000000000,0,3f394b3c8a746fe8,403d000000000000/ => -4/3fe0000000000000/bf423a946c0c7d7b/c083f101ee032b15/c0e1caaeca09c140/3/1_1/c074f00000000000/1_1/c072f20194b3c8a7/ false false
sub - 5/3f50624dd2f1a9fc/0/406f7408759c18c5/40c2a0b40e6e24c3/0/2_3,2_2/3f4b34e5cf71cd3b,0,0,4041000000000000,0/8_3,0_2/4043d00000000000,4058000000000000,403e000000000000,3f2a862a4e8d0249,404a000000000000/ 8/0/0/4060600657e28dff/40bd58692ac0771d/1/5_4/4056c00000000000,3f495f8a37fcfcce,0,4044000000000000/// => 5/3f50624dd2f1a9fc/0/405e28043b73158c/409fa3fbc86f49a4/0/1_4,2_2/c060600657e28dff,3f4b34e5cf71cd3b,0,0,4041000000000000,0/8_3,0_2/4043d00000000000,4058000000000000,403e000000000000,3f2a862a4e8d0249,404a000000000000/ false false
sub - -53/0/0/4064c00000000000/40c5f481d0e06f36/0/1_2/4052000000000000,4057800000000000///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/40630000829e4529/c0920a68ee745174/3/0_3/4057000000000000,404e000000000000,3f1053c8a512a3fb///3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/402bfff7d61bad70/40c835ceeeaef964/3/0_3/c057000000000000,4028000000000000,40577ffefac375af///3ff0000000000000,4000000000000000,4014000000000000 false false
sub - 0/3fe0000000000000/0/4075d00000000000/40d58eb0ca327384/0/-19_1,1_4,2_1/405b800000000000,403a000000000000,4056080000000000,4053c00000000000,4046f00000000000,0/// 2/3fe0000000000000/0/4072f80000000000/40cd23814d7ec6b4/3///5_3,0_2,0_1/405b200000000000,4050000000000000,0,404e800000000000,404b000000000000,4030000000000000/ => 0/3fe0000000000000/0/4046c00000000000/40bbf3c08dcc40a8/3/-19_1,1_4,2_1/405b800000000000,403a000000000000,4056080000000000,4053c00000000000,4046f00000000000,0/2_2/c06d300000000000,c051800000000000/ false false
sub - 3/3f50624dd2f1a9fc/0/4064000000000000/40c34de6940ec8ca/3/-19_2/4058400000000000,404f800000000000/// 2/0/4053800000000000/40864e0160a46c78/40d4fc566c20e1fe/3/9_1,2_4,2_1/4026000000000000,4046000000000000,4052c00000000000,4055c00000000000,4044000000000000,404bb00000000000/0_2,1_4,0_2/3f39be77ab6e7c67,3f325615e3a6fca1,4055000000000000,4055400000000000,4038000000000000,0,4031000000000000,405c580000000000/ => 2/3f50624dd2f1a9fc/c053800000000000/c0814e0160a46c78/c0c6aac64432fb32/3/-9_1,17_1,2_4,2_1/4064000000000000,c026000000000000,c046000000000000,c052c00000000000,c055c00000000000,c044000000000000,c04bb00000000000/0_2,1_6/bf39be77ab6e7c67,bf325615e3a6fca1,c055000000000000,c055400000000000,c038000000000000,8000000000000000,c031000000000000,c05c580000000000/ false false
sub - -53/0/0/0/8000000000000000/0/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/3f3aa9164b5e6cd9/bf82bea8a8a077e4/0/0_2/3f3aa9164b5e6cd9,0///3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/bf3aa9164b5e6cd9/3f82bea8a8a077e4/0/0_1/bf3aa9164b5e6cd9///3ff0000000000000,4000000000000000,4014000000000000 false true
sub - -1/3f847ae147ae147b/4058c00000000000/408e800000000000/40ed8249f57d153d/3/7_1,1_1,1_4/4052c00000000000,4023400000000000,405a080000000000,405d300000000000,4053c80000000000,404c800000000000/0_1,2_3,2_2/404c800000000000,4054000000000000,404f100000000000,4057000000000000,4056000000000000,404c200000000000/ 3/3f50624dd2f1a9fc/0/4044001c34efeecb/40960f6ec2e3270b/0/3_1/3f4c34efeecae292/-11_1/4044000000000000/ => -1/3f847ae147ae147b/4058c00000000000/408d3ffe3cb10113/40ecd1ce7f65fc05/3/1_1,5_1,1_1,1_4/bf4c34efeecae292,4052c00000000000,4023400000000000,405a080000000000,405d300000000000,4053c80000000000,404c800000000000/0_1,2_3,2_2/4031000000000000,4054000000000000,404f100000000000,4057000000000000,4056000000000000,404c200000000000/ false false
sub - 5/3fe0000000000000/0/4052000b6e53b54d/c07235c0ab71066c/3/3_2/4052000000000000,3f46dca76a9a91b0/// 8/0/0/0/0/3///// => 5/3fe0000000000000/0/4052000b6e53b54d/c07235c0ab71066c/3/3_2/4052000000000000,3f46dca76a9a91b0/// false false
sub - 1/3f847ae147ae147b/0/40670007bf7b2886/c09c3c49bfbc1495/2/-8_4/3f4efdeca217c6ab,4054000000000000,4057000000000000,4028000000000000/// -2/3fe0000000000000/4058280000000000/4071380000000000/40b54b4d9887a331/1/5_3/4049900000000000,0,404ce00000000000/9_3/0,4047800000000000,4037000000000000/ => -2/3fe0000000000000/4055d80f7ef6510c/c056dff08109aef4/c0bc5a600876a856/0/5_3/c049900000000000,8000000000000000,c04ce00000000000/9_3/8000000000000000,c047800000000000,c037000000000000/ true false
sub - 3/3f50624dd2f1a9fc/0/4071d20277faadb7/40cecf597c863069/1/0_4/4041d00000000000,0,4054c80000000000,402c000000000000/-18_4,2_4/0,0,0,4054000000000000,4018000000000000,404e200000000000,4018800000000000,3f43bfd56dbb58aa/ 0/0/0/4075940000000000/40a0cbf82a9d4197/1///5_3,2_1,2_3/4000000000000000,4044000000000000,4028000000000000,0,405f200000000000,4053c00000000000,4055f00000000000/ => 0/3f50624dd2f1a9fc/0/c04e0fec402a9248/40ca9c5b71dee003/1/0_2/4041d00000000000,4058480000000000/-2_2,5_3,2_1,2_3/0,40630c04eff55b6f,c000000000000000,c044000000000000,c028000000000000,8000000000000000,c05f200000000000,c053c00000000000,c055f00000000000/ false false
sub - -2/3fe0000000000000/0/40704c0453c8e6f8/40a2cf996330f46b/3/6_3/4034e00000000000,0,403d000000000000/0_3,0_1,1_4/0,404c800000000000,3f418ca394a29793,3f4111a3a322ec6c,403f000000000000,0,4043700000000000,4055000000000000/ 2/3f50624dd2f1a9fc/3f320095b9df8f6d/3f320095b9df8f6d/3f8d356e8b764ef5/1///// => -2/3fe0000000000000/bf320095b9df8f6d/40704c0333bf8b5a/40a2cf9215d5518d/3/6_3/4034e00000000000,0,403d000000000000/0_3,0_1,1_4/0,404c800000000000,3f418ca394a29793,3f4111a3a322ec6c,403f000000000000,0,4043700000000000,4055000000000000/ false false
sub - 2/0/0/406354036629d68b/c095b1eaa3efab2d/1/-10_2/405f280000000000,3f3b314eb4587cc2/-15_3/0,403e000000000000,0/ -1/3fe0000000000000/3f062309f7106a09/406c8c0f1798a47e/c06ffd21cbbc17c1/1/-18_3,1_1,2_3/404ac00000000000,3f4727a7701c59cc,4039000000000000,3f2901ecd2596a19,4032000000000000,4007000000000000,3f4d940f4dd4f474/1_2/4050400000000000,4050000000000000/ => -1/3fe0000000000000/406354030d9daeaf/c052701762dd9be6/c091b2466a782835/1///1_2/c050400000000000,c050000000000000/ false false
sub - 0/3fe0000000000000/4052d80000000000/4084320000000000/c0d04698abcf7b83/2/-5_2,0_3/4058400000000000,4022000000000000,4028000000000000,404f000000000000,4053400000000000/-20_4,1_4/405e280000000000,4051000000000000,0,4044000000000000,4010000000000000,4054500000000000,0,0/ -4/255bba08cf8c979d/0/4048000000000000/409875f9482a9e00/1/8_1,0_1/4048000000000000,0/// => -4/3fe0000000000000/4052d80000000000/4082b20000000000/c0d1cdf840522563/0/0_1,7_2/4070100000000000,c048000000000000,8000000000000000/-1_2/406c940000000000,4055500000000000/ true false
kahan - -53/0/0/4053f00b74f32685/40aa57a12b90457c/3/1_1,0_1/3f46e9e64d0ad140,4053f00000000000///bff0000000000000,0,3fe0000000000000,4024000000000000 -53/0/0/4054c00000000000/40ac8515812fd236/3/1_3/4037000000000000,404e000000000000,0///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/4061400739ab505c/c0986613c3263a50/3/1_3,0_1/404c000000000000,3f4ce6ad416dd961,4020000000000000,4052800000000000///bff0000000000000,0,3fe0000000000000,4024000000000000 -53/0/0/3f42576196c02c2a/3f91d95032ea5153/0/0_2/3f32d0501eed4a32,3f31de730e930e22///3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/4072cc08c4fea4a7/40b554dadbea8a00/3/0_1/4072cc08c4fea4a7/// -53/0/0/3d11615000000000/bd5aead000000000/3/0_1/3cfad96000000000/// false true
kahan - 3/3f50624dd2f1a9fc/3f2000fe50353fba/407974029bd65691/407652219500ddf4/1/-6_3,0_3/4341c37937e08000,0,4341c37937e08000,3fd3333333333333,3fd3333333333333,4341c37937e08000/-10_1,1_2/0,3fd3333333333333,3fd3333333333333/ -53/3f70624dd2f1a9fc/0/0/0/1/////3ff0000000000000,4014000000000000,4024000000000000 5/0/4034000000000000/4051b00000000000/40b0a8c218389bc2/2/-16_1/4049600000000000/// -1/3f847ae147ae147b/0/4073700000000000/406df6dc099fd87b/3/-7_4,2_2/4052c00000000000,4050c00000000000,4014000000000000,4052c00000000000,4000000000000000,4055c00000000000/// => error
kahan - 0/255bba08cf8c979d/0/405c080000000000/40b2c452e2ba36e9/3///-8_1,0_2/3fd3333333333333,3ffb333333333333,4341c37937e08000/ 1/257bba08cf8c979d/0/40743c0625eed67d/40c58a0e5a7bd783/0/-12_2,0_2/0,0,0,4341c37937e08000/-10_1,0_4,0_2/4341c37937e08000,4341c37937e08000,4341c37937e08000,4341c37937e08000,0,3ffb333333333333,3ffb333333333333/ 0/3f847ae147ae147b/0/407bb203a746b044/40d1db475d58f8bf/3/-4_3,2_3,1_4/402e000000000000,4055400000000000,405bf00000000000,4040000000000000,405ee80000000000,403d000000000000,0,3f1e9225ac9c4f60,4047600000000000,3f4967f0cc904174/// => 0/3f90000000000000/4341c37937e08001/408b7804e69ac360/40e0a8b1a1a2b91e/3/-4_3,2_3,1_4/4341c37937e08008,4055400000000000,405bf00000000000,4040000000000000,405ee80000000000,403d000000000000,0,3f1e9225ac9c4f60,4047600000000000,3f4967f0cc904174/-5_4/4341c37937e08000,4351c37937e08000,4341c37937e08000,400b333333333333/ 0/3f90000000000000/bca0000000000000/3d30000000000000/bd94000000000000/3/-4_3,2_3,1_4/bff0000000000000,0,0,0,0,0,0,0,0,0/-5_4/0,0,0,0/ false false
kahan - -1/3fe0000000000000/0/0/8000000000000000/3///// 8/4000000000000000/0/405dd0018b1f3e3c/40abe9b9b2491f02/0/-1_3,2_3/3ffb333333333333,0,4341c37937e08000,3fd3333333333333,4341c37937e08000,3fd3333333333333/// => -1/4000000000000000/0/405dd0018b1f3e3c/40abe9b9b2491f02/3/1_1/4351c37937e08000/// -1/4000000000000000/0/0/0/3/1_1/3fe3333333333333/// false false
kahan - 5/3fe0000000000000/3f400bb9d23408f2/404be0100bb9d234/4069c3011b8adc21/1/-1_1/404be00000000000/// 0/3fe0000000000000/0/4059000000000000/c09a5b9a9bbc35f2/1/2_2/4026000000000000,4056400000000000/// -4/3fe0000000000000/0/407d060000000000/40c33d233f6dc264/1/-11_4,1_4,0_1/403e600000000000,4055800000000000,4045800000000000,4054800000000000,4047800000000000,404f000000000000,4057000000000000,4036000000000000,0/// -1/255bba08cf8c979d/3f39c631221ca6a3/4060400c24feb430/c0a8a5666ea2a93e/1/-8_4,2_1,1_1/3f367fd7264368e4,4050000000000000,0,0,0,0/-9_2,2_1,2_2/4020000000000000,4002000000000000,3fe8000000000000,3f4870f6ac90023d,404b800000000000/ => -4/3fe0000000000000/4060401027ed28bd/4087710409fb4a2f/40b45ec4a977798d/1/0_2/405df00000000000,4059000000000000/0_1/404be01870f6ac90/ -4/3fe0000000000000/3cc2f28000000000/3d20000000000000/3d61000000000000/1/0_2/0,0/0_1/3c91e80000000000/ false false
kahan - 5/255bba08cf8c979d/0/4010000000000000/c05b6a15c679e000/1/-3_1/4010000000000000/// 2/0/0/4064f408cd100553/c0b238bdd8a7082e/3/-2_4,0_3,0_3/3f4c3bb44807485e,3f1d3c6874ce99f4,0,3f01172060e0af5a,405e280000000000,402e000000000000,4020000000000000,0,3f11fc65c4e101e1,4038000000000000/// 0/3fe0000000000000/0/40833f049983c059/c0bb5e4cc6b3959f/2/-4_4,2_2,2_1/0,404e800000000000,4041000000000000,4050b80000000000,3f4e067e9dc8ae65,4056000000000000,4047800000000000/-4_4,1_2,2_2/4056c00000000000,4055400000000000,3f4c8c1f6fe6a48a,4047000000000000,3f3e0b3befc73137,401c000000000000,4050400000000000,4039000000000000/ => 0/3fe0000000000000/0/40889c06ccc7c1ae/c0c702597b3a42a6/3/0_4,2_1/401000ff1a0ab509,4061f400445c8184,403800408c16acc9,4056000000000000,4047800000000000/1_2,2_2/3f3e0b3befc73137,401c000000000000,4050400000000000,4039000000000000/ 0/3fe0000000000000/0/bd20000000000000/bd70000000000000/3/0_4,2_1/bca18e0000000000,bd0f50a600000000,3ce3a84800000000,0,0/1_2,2_2/0,0,0,0/ false false
kahan - 1/0/0/4064980000000000/40baaf156afe59c6/2///7_3,1_4/0,3ffb333333333333,0,3ffb333333333333,3ffb333333333333,4341c37937e08000,0/ 1/0/4051800000000000/4074c40000000000/40be8da8ea51b811/0/-6_3/3fd3333333333333,3fd3333333333333,0/-20_2/3ffb333333333333,0/ 0/3fe0000000000000/3f31ed69c45ee7dc/406f48023dad388c/40a7da4cf555ca06/3/-4_1,1_1,0_4/0,405a500000000000,0,4048800000000000,0,4058000000000000/// 5/0/4048000000000000/4077f003790e8d0c/c0804cbf8a6ebd3a/3/-17_3,2_1/0,3f4bc874685e49b3,4014000000000000,4052000000000000/-9_2,0_2/4056000000000000,4037000000000000,4050800000000000,4054400000000000/ => 0/3fe0000000000000/405e1337ae8da44b/4091a90125f94a54/40d0c81337ab47cd/3/0_3/405f800de43a342f,0,4058000000000000/0_1,3_1,1_2/4070200000000000,3ffb333333333333,400b333333333333,4341c37937e08000/ 0/3fe0000000000000/bcd4090000000000/3d40000000000000/bd74000000000000/0/0_3/3ce26cc000000000,0,0/0_1,3_1,1_2/0,0,0,0/ false false
kahan - 3/0/4056c00000000000/405e800000000000/40a2a3864855c89d/1/-9_1/0/// -1/3f70624dd2f1a9fc/0/4053400000000000/40b215de07e83243/2/-20_1/0/// => -1/3f70624dd2f1a9fc/4056c00000000000/4068e00000000000/40bb67a12c131692/0///// -1/3f70624dd2f1a9fc/0/0/bd60000000000000/0///// true false
kahan - 0/3f847ae147ae147b/0/40782e03b295e805/40cef420a0372d07/3/5_3,0_4,0_2/4052400000000000,4055c00000000000,4038e00000000000,4014000000000000,0,4054c00000000000,404b000000000000,0,0/2_2/404e000000000000,3f4d94af402806ab/ 1/3fe0000000000000/0/4074e003b394568e/40a887d0dd38e514/2/-16_2,1_4/4058c00000000000,4037000000000000,4046800000000000,4051400000000000,4058800000000000,3f4d9ca2b4707a54/// -1/3fe0000000000000/0/4071160000000000/40bc17f0b16a0324/1/0_4,2_3/404d000000000000,404b600000000000,4055c00000000000,0,4047500000000000,403b000000000000,0/// 1/3f847ae147ae147b/0/4070b80396d8bd4b/c0b7f9dfc637bb69/3/-20_4,1_3,0_1/4054c00000000000,0,4039000000000000,3f126d8a76225189,0,0,3f4a69149b96d8f5,4057600000000000/9_1/4050800000000000/ => -1/3fe0000000000000/406930072db17a97/4093b702bf40bef8/40d3928ea68f4515/3/0_3,0_6/404d000000000000,404b600000000000,4055c00000000000,4064000000000000,403de00000000000,4054c00000000000,4059280000000000,403b000000000000,0/1_3/404e000000000000,3f4d94af402806ab,4050800000000000/ -1/3fe0000000000000/bcfb9b3c00000000/bd40000000000000/bd70000000000000/3/0_3,0_6/0,0,0,0,0,0,0,0,0/1_3/0,0,0/ false false
kahan - 2/3f847ae147ae147b/4053a80000000000/4053a80000000000/c092629206aed73a/0///// -4/4000000000000000/0/406d201aa40ed65e/40ae084041b2e056/3/-2_4,0_1,0_2/3ffb333333333333,4341c37937e08000,3ffb333333333333,0,3fd3333333333333,4341c37937e08000,3ffb333333333333/-4_3,0_1,2_3/4341c37937e08000,3ffb333333333333,3fd3333333333333,3ffb333333333333,0,3ffb333333333333,3ffb333333333333/ => -4/4000000000000000/4053a80000000000/40737a0d52076b2f/40a4d6f73e5b74b9/3/1_4/0,3fd3333333333333,4341c37937e08000,3ffb333333333333/2_3/0,3ffb333333333333,3ffb333333333333/ -4/4000000000000000/0/0/0/3/1_4/0,0,0,0/2_3/0,0,0/ false false
kahan - -4/3f50624dd2f1a9fc/0/406bec0da61e3900/40b348f3c5ba5b8c/0/-10_3,2_2/3fd3333333333333,0,0,4341c37937e08000,3fd3333333333333/// 1/3f70624dd2f1a9fc/404d000000000000/406d0002dfa014f0/40ca7c75f1e1a7bd/2/7_1,0_3/4341c37937e08000,4341c37937e08000,3fd3333333333333,3ffb333333333333/3_1/4341c37937e08000/ => -4/3f70624dd2f1a9fc/4341c37937e0801d/407c760842df26f8/40d21077ea5f6ac2/0/1_1/4351c37937e08000/1_1/4341c37937e08000/ -4/3f70624dd2f1a9fc/3fe3333333333333/0/bd80000000000000/0/1_1/4000000000000000/1_1/0/ false false
kahan - 5/3f847ae147ae147b/0/4068700e2c02a3f6/c0b61a4cc47034ed/3/5_4/0,0,3fd3333333333333,0/-19_3/0,0,3fd3333333333333/ 3/3fa47ae147ae147b/0/4075080000000000/40c645391355cbed/2/-10_1,1_4,2_4/3ffb333333333333,0,3fd3333333333333,3fd3333333333333,0,3fd3333333333333,3ffb333333333333,3ffb333333333333,4341c37937e08000/// -2/3f847ae147ae147b/0/4078d202cf2a3cb4/40d31dd3f23ca90c/1/-2_4,0_4,1_2/405f080000000000,4057000000000000,403f000000000000,4032000000000000,3f2f4c1c1a63cf0c,3f3c06e9f511f407,0,4044800000000000,3ef45abc8fc3b5c5,4056c00000000000/// => -2/3fb0000000000000/406b040000000000/408d0904f295c758/40d8b9dd4acb81c7/3/0_6,1_2/4042800000000000,4341c37937e08009,3f2f4c1c1a63cf0c,3f3c06e9f511f407,0,4044800000000000,3ef45abc8fc3b5c5,4056c00000000000/0_1/3fd3333333333333/ -2/3fb0000000000000/0/bd30000000000000/3d70000000000000/3/0_6,1_2/bca8000000000000,3fd3333333333333,0,0,0,0,0,0/0_1/0/ false false
kahan - 8/0/0/0/0/0///// 5/0/3f3b1490ded99edc/405d78072c6427c4/40a8758bec74f637/3/8_3/4043000000000000,3ef9cffc03305c04,4053f80000000000/// 1/3f847ae147ae147b/4026000000000000/4026000000000000/4025be081ee59979/0///// 3/255bba08cf8c979d/0/0/8000000000000000/3///// => 1/3f847ae147ae147b/402600362921bdb3/40601c03963213e2/40a88b49f493dbd0/3/1_1/405d7800673ff00d/// 1/3f847ae147ae147b/3cbedc0000000000/0/3d4e400000000000/3/1_1/bcef47f800000000/// false false
kahan - 8/255bba08cf8c979d/0/406b38027cec5a68/4090f3845916d626/1/4_1,1_2,1_3/4050400000000000,3f0134798fe20196,403a000000000000,4055800000000000,4044600000000000,3f31c0d3a13e7235/// 2/3f847ae147ae147b/3ec0419708da2bd8/4084f101495193bd/40dc8e71efbdbbd6/1/7_4,0_4,1_4/0,402e000000000000,403f000000000000,4052800000000000,4036000000000000,4055c00000000000,402a000000000000,4051400000000000,4054800000000000,4053d00000000000,4055000000000000,0/-11_2,2_4/3f4484d7a4d236a2,4029000000000000,4015000000000000,0,4030200000000000,4054000000000000/ 2/3fe0000000000000/0/0/0/1///// -2/255bba08cf8c979d/4024000000000000/4054e00000000000/c0808fa16440fc19/3/-9_2/4051600000000000,4010000000000000/// => -2/3fe0000000000000/4068ac0525464ef7/408e5b01e88caa57/40dd192d2a2d2157/3/1_2/408316009f3b169a,4064680000000000/// -2/3fe0000000000000/bcfde64500000000/0/3d83000000000000/1/1_2/bd15366100000000,0/// false false
kahan - 0/3fe0000000000000/0/4049000000000000/c08be8bf22d35e2b/1/-17_1/3fd3333333333333/// -53/4000000000000000/0/40671808219af25c/40bec254fe533d23/1/1_3/3ffb333333333333,3fd3333333333333,4341c37937e08000///3ff0000000000000,4000000000000000,4014000000000000 => error
kahan - -53/0/0/4064340000000000/c0b08ba536db1c82/3/1_3/0,4046800000000000,405d280000000000///3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/0/0/2/////4000000000000000 -53/0/0/0/0/2/////bff0000000000000,0,3fe0000000000000,4024000000000000 -53/0/0/0/8000000000000000/1/0_1/0///4000000000000000 => -53/0/0/4064340000000000/c0b08ba536db1c82/3/0_1/4064340000000000/// -53/0/0/0/0/3/0_1/0/// false true
kahan - 3/3f50624dd2f1a9fc/0/4068040000000000/40c925aa4fecc465/0/-2_3,2_4/0,3fd3333333333333,4341c37937e08000,3fd3333333333333,3ffb333333333333,0,0/// -53/3f70624dd2f1a9fc/0/0/0/0/////3ff0000000000000,4000000000000000,4014000000000000 -2/0/0/4076580000000000/c043b0b7adb2e3fa/3/-5_2,0_3/4048000000000000,4057000000000000,4053200000000000,4058000000000000,4046800000000000/// -1/3f50624dd2f1a9fc/0/407d4001d744587b/40c8ce384151d453/2/-3_2,2_1,1_4/4052000000000000,403e000000000000,0,4052800000000000,4057c00000000000,4055800000000000,3f3d744587ad8d57/-14_3/401c000000000000,4046000000000000,404e000000000000/ => error
kahan - -53/0/0/0/8000000000000000/2/////bff0000000000000,0,3fe0000000000000,4024000000000000 -53/0/0/0/0/1/////4000000000000000 -53/0/0/4066800000000000/40b6c9972f45f348/0/0_2/4055c00000000000,4057400000000000///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/4037000e467c3a39/c072d1d510e18e6c/2/0_2/3f2c8cf874715a01,4037000000000000///3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/40696001c8cf8747/40b59c79de37da61/0/0_1/40696001c8cf8747/// -53/0/0/3cf0000000000000/3d50000000000000/0/0_1/3ce5a01000000000/// true true
kahan - -4/3f50624dd2f1a9fc/3f4e2f90712ad929/407f760711bd2776/c0c8c160d300ba10/0/-6_4,1_3,0_4/4341c37937e08000,0,4341c37937e08000,3fd3333333333333,3fd3333333333333,3fd3333333333333,4341c37937e08000,4341c37937e08000,4341c37937e08000,3fd3333333333333,3fd3333333333333/// 1/3f70624dd2f1a9fc/0/0/8000000000000000/3///// -1/3f50624dd2f1a9fc/4028000000000000/4028000000000000/c05b2ebe802a2174/3///// => -4/3ff0000000000000/4351c37937e08003/40801b0388de93bb/c0c8f7be50010e53/3/1_5/4341c37937e08000,4341c37937e08000,4341c37937e08000,3fd3333333333333,3fd3333333333333/// -4/3ff0000000000000/3fecd458b0e91784/0/3d48000000000000/3/1_5/0,0,0,0,0/// false false
kahan - 3/3fe0000000000000/4056400000000000/4076240595c20b07/c0a3320ae9c75dd0/0/-1_2,0_4,2_4/3fd3333333333333,3fd3333333333333,0,4341c37937e08000,3ffb333333333333,4341c37937e08000,0,3ffb333333333333,4341c37937e08000,4341c37937e08000/-2_2/4341c37937e08000,0/ -4/4000000000000000/4008000000000000/405e480000000000/40ac39957489cadc/2/0_4/0,4341c37937e08000,4341c37937e08000,4341c37937e08000/// 1/3fe0000000000000/4028c00000000000/405a1806382cd5e4/c07a8dba16f74d64/2/1_1,1_4/0,4051c00000000000,3f38e0b3579185d0,0,4035000000000000/// 2/3f847ae147ae147b/4044000000000000/4044000000000000/4097401413b79d12/1/-3_1/0/// => -4/4000000000000000/435aa535d3d0c025/40835e0391e6a040/40a155dd51bf51e8/0/1_3/435aa535d3d0c017,4341c37937e08000,4341c37937e08000/// -4/4000000000000000/3fd7fffffffffffe/0/3d50000000000000/0/1_3/3f38e0b3579185d0,0,0/// false false
kahan - 0/0/0/4060c002fc0655e8/40b957268469ccca/3/-8_4,0_2/4054000000000000,0,0,3f37e032af439e2b,0,404b000000000000/// -4/3f847ae147ae147b/3f415e12c3092762/4070c8022bc25861/40cf2d0d79e604e6/1///-9_2,2_2,0_2/0,402e000000000000,404ec00000000000,4053800000000000,403a000000000000,4056000000000000/ => -4/3f847ae147ae147b/40540008af096185/40792803a9c58355/40d5ec505e0d75a6/3/0_1/404b000bf01957a2/// -4/3f847ae147ae147b/bcfb13c000000000/0/bd80000000000000/3/0_1/bcd8754000000000/// false false
kahan - 2/3f50624dd2f1a9fc/0/0/8000000000000000/0///// 2/3fe0000000000000/3f43a7b6c779c779/4052f011321bb6dc/40a6738dab0de185/3///-20_4/4041e00000000000,3f3d79014c7a9449,0,4044000000000000/ 8/3fe0000000000000/0/4063800000000000/40c283832895078b/0/-11_4/4045800000000000,4041800000000000,4039000000000000,404a800000000000/// 3/3fe0000000000000/0/0/8000000000000000/0///// => 2/3fe0000000000000/3f43a7b6c779c779/406cf808990ddb6e/40c8206693587fec/3/0_1/4063800000000000/// 2/3fe0000000000000/0/0/3d60000000000000/3/0_1/0/// false false
kahan - 8/0/0/407df002c913da33/40e04cc9b3fe19d2/1/-4_1,0_4/402c000000000000,404c800000000000,4056000000000000,404f800000000000,4054000000000000/9_4/4056000000000000,4052400000000000,4030000000000000,3f46489ed1963624/ 8/3f847ae147ae147b/0/0/0/3///// -1/3f50624dd2f1a9fc/0/4080c400f83ac15c/40e0825379ca2b8a/1/-4_4,2_3,0_4/0,403b000000000000,4058000000000000,4058000000000000,0,4050d80000000000,4056480000000000,4033000000000000,3f3f07582b71bf67,4046000000000000,4058800000000000/// => -1/3f90000000000000/403b000000000000/408fbc025cc4ae76/40f0678e96e422ae/3/-2_2,0_1,1_7/4058000000000000,4058000000000000,4072e00000000000,0,4050d80000000000,4056480000000000,4033000000000000,3f3f07582b71bf67,4046000000000000,4058800000000000/1_1/406620059227b466/ -1/3f90000000000000/0/bd30000000000000/0/3/-2_2,0_1,1_7/0,0,0,0,0,0,0,0,0,0/1_1/bd0c9dc000000000/ false false
kahan - 1/3fe0000000000000/4056c00000000000/407ce60000000000/40d07c96089f4a78/0/2_2,0_4,2_1/4037000000000000,404a000000000000,403c000000000000,4058800000000000,404c800000000000,4042000000000000,4053580000000000/// -53/0/0/406f880000000000/40cf67de00395bb2/3/1_3,0_1/404b000000000000,4039400000000000,4058400000000000,4053000000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 2/0/0/40721c0000000000/c0a30d8ba68931c2/2/2_2,2_4/4053c00000000000,4046600000000000,4042000000000000,4024000000000000,4052000000000000,4048000000000000/// 1/3f50624dd2f1a9fc/4040000000000000/4076c20856f99a60/c0ba10ef77759d30/3/-14_4,1_4/4056c00000000000,4055800000000000,4053000000000000,3f24581a4272d5fe,4053c80000000000,3f4d71d8b93ff506,3f5017f6c490a10b,0/// => error
kahan - -53/0/0/0/0/0/////3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/0/0/2/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/0/0/0/////3ff0000000000000,4014000000000000 -53/0/0/0/0/0/////3ff0000000000000,4014000000000000 false true
kahan - -53/0/0/40524004b4496ae7/c08cd0651840066e/1/0_1,0_1/3f32d125ab9bb498,4052400000000000///3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/0/8000000000000000/1/////4000000000000000 -53/0/0/405ca80000000000/4070910fa14cbeb5/1/1_2/4034000000000000,4057a80000000000///3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/406774025a24b574/c08487dd4799a714/1/0_1/406774025a24b574/// -53/0/0/bd10000000000000/3d30000000000000/1/0_1/bd112da000000000/// false true
kahan - -2/3f847ae147ae147b/4055400000000000/4077e0004be87ddb/c0c22b533ef2b381/0/-5_4,0_2/0,0,4341c37937e08000,4341c37937e08000,3fd3333333333333,0/// -1/3fa47ae147ae147b/0/40628c01e81fb298/c0a551a86ba21867/2/-14_2,0_3,2_1/0,3ffb333333333333,3fd3333333333333,4341c37937e08000,3fd3333333333333,3ffb333333333333/0_2/3ffb333333333333,3fd3333333333333/ -1/0/0/4068200c43d44b8c/c0a39b121c4bb94b/1/0_4,1_2,2_1/3f1fd44787c173e6,4035000000000000,3f3a1cf1628f53f7,4049800000000000,4010000000000000,3f500327c5f8d22a,405d400000000000/// 3/255bba08cf8c979d/0/405c4008f5e74c6e/c08451816bde0d3c/0/-1_1/3f41ebce98dce596/-7_3,0_1/0,403c000000000000,4055400000000000,0/ => -2/3fb0000000000000/435aa535d3d0c016/408a2304cfae2805/c0cdab99f7ac08c2/0/0_4,1_1/3f45e65789d51413,4035001a1cf1628f,4049800000000000,40100100327c5f8d,405d400000000000/0_2/405caccccccccccd,3fd3333333333333/ -2/3fb0000000000000/3ff4cccccccccccc/bd38000000000000/3d78000000000000/0/0_4,1_1/bbe0000000000000,3cd4fdc000000000,0,3ca1500000000000,0/0_2/bcea000000000000,0/ false false
kahan - 0/255bba08cf8c979d/0/40783e0000000000/40d84c5780e69d5e/3/8_3,2_4/3ffb333333333333,3fd3333333333333,4341c37937e08000,3fd3333333333333,0,0,3ffb333333333333/// -4/3fa47ae147ae147b/4014000000000000/4061e00919c41eff/40b170ad65dcce90/1/4_4,2_1/4341c37937e08000,3fd3333333333333,4341c37937e08000,3ffb333333333333,3fd3333333333333/// => -4/3fa47ae147ae147b/4014000000000000/40809702467107c0/40dca882da5dd102/3/1_1,2_4,2_1/4341c37937e08002,4341c37937e08000,3fd3333333333333,4341c37937e08000,3ffb333333333333,3fd3333333333333/// -4/3fa47ae147ae147b/0/bd20000000000000/0/3/1_1,2_4,2_1/bca0000000000000,0,0,0,0,0/// false false
kahan - 5/255bba08cf8c979d/404d800000000000/407a000666384292/40cd72a84493d63d/1/-5_3,1_3/3f4ccd71ef1c285b,404a800000000000,3f466450257609e1,4053000000000000,4020000000000000,4054000000000000/2_3/4030000000000000,4049800000000000,4052400000000000/ 8/3fe0000000000000/3f3e3a47ac5d840d/40753801e3a47ac6/4086efdb6a3ddda9/0///0_4/4053c00000000000,405ae00000000000,4055000000000000,4051400000000000/ 0/0/0/406ca0076d8ffaae/40bbf31f12b3a026/3/-9_3,1_3,2_2/4058000000000000,4057400000000000,3f4d23e7e6386d01,0,0,0,4044000000000000,3ef24b009012a77d/// => 0/3fe0000000000000/406f000b1042ef1a/408ec40600525d58/40d66d9ac248c216/3/0_2/4066200ccc708524,40540000492c0240/0_2/4053c00000000000,4079080000000000/ 0/3fe0000000000000/bcfa1f1000000000/bd30000000000000/bd87000000000000/0/0_2/3d1191e000000000,3cf2a77d00000000/0_2/0,0/ false false
kahan - 2/0/0/407ac80000000000/c0661b327086ff86/1/-19_3,0_2,2_2/4054800000000000,4055800000000000,0,405e200000000000,4022000000000000,4053000000000000,404b800000000000/// -2/3fe0000000000000/3f12221310c6926e/3f12221310c6926e/bf553de45aa9a155/0///// -2/255bba08cf8c979d/0/4071200000000000/c09c24bdb1621ac7/3/-8_4/4050c00000000000,4051800000000000,4056800000000000,4047800000000000/// -4/3f847ae147ae147b/401c000000000000/40636003de8b8cee/40a942eefd5e63af/1/-18_1/4050400000000000/-9_3,1_2/4014000000000000,3f3ef45c676b0b95,4036000000000000,404a000000000000,4010000000000000/ => -4/3fe0000000000000/408acc011be7095e/408acc011be7095e/40939db8a76b86fc/3///// -4/3fe0000000000000/bd41a7e7c0000000/bd3e5b6480000000/bd36855400000000/0///// false false
kahan - 0/255bba08cf8c979d/0/4074ac038613fd84/40d669b267e78490/0/-5_3,2_4/401c800000000000,4058800000000000,3f4c309fec1f7389,4018000000000000,0,4058c00000000000,4046700000000000/9_2/4052f00000000000,0/ 1/3fe0000000000000/0/406bcc02dd25a782/40b7afbbf66c23a7/0/-18_2,0_3,2_1/405a480000000000,4056c00000000000,3f36e92d3c123aef,0,4028800000000000,402c000000000000/// => 0/3fe0000000000000/405a480e184ff610/408149027a5368a2/40dc55a165828d7a/0/0_1,1_2/4018000000000000,4058c00000000000,4046700000000000/9_1/4052f00000000000/ 0/3fe0000000000000/bcf18ee000000000/3d30000000000000/bd70000000000000/0/0_1,1_2/0,0,0/9_1/0/ false false
kahan - 2/3fe0000000000000/0/0/0/0///// -2/4000000000000000/4058000000000000/4082af01bacc4b80/40d60073d32d5b45/3/7_2,0_3,1_1/4341c37937e08000,3ffb333333333333,3ffb333333333333,0,3fd3333333333333,0/-18_4,2_4,0_4/4341c37937e08000,4341c37937e08000,3fd3333333333333,3fd3333333333333,3ffb333333333333,3fd3333333333333,3ffb333333333333,4341c37937e08000,0,0,4341c37937e08000,3ffb333333333333/ => -2/4000000000000000/4058000000000000/4082af01bacc4b80/40d60073d32d5b45/3/7_5,1_1/4341c37937e08000,3ffb333333333333,3ffb333333333333,0,3fd3333333333333,0/// -2/4000000000000000/0/0/0/3/7_5,1_1/0,0,0,0,0,0/// false false
kahan - -1/255bba08cf8c979d/0/40720003529a0e7f/c0b5715e4a655833/1/-8_1,0_2/403f000000000000,4055c00000000000,0/-5_4/4044800000000000,3f4a94d073f89ab3,4052000000000000,404c800000000000/ -53/0/0/0/0/1/////bff0000000000000,0,3fe0000000000000,4024000000000000 8/3f847ae147ae147b/4042800000000000/407a50054e1ed570/40b4ddf696d2b326/2/3_2,1_4/3f501d911f324458,4057400000000000,3f346ba8da2c759d,4051800000000000,4047800000000000,4055400000000000/-4_2/4036000000000000,4050c00000000000/ => error
kahan - 5/3f50624dd2f1a9fc/0/405ac00000000000/40a40de98ff14c88/3///0_3,1_1/0,3fd3333333333333,0,0/ -53/3f70624dd2f1a9fc/0/4057c00000000000/40a3593d010a2014/2/0_2/0,3fd3333333333333///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => error
kahan - -1/3f847ae147ae147b/0/405d00063f5d169e/40af9dcb364c6b85/0/6_1,0_2/4041000000000000,4054800000000000,3f38fd745a79a56d/// 2/255bba08cf8c979d/0/40655c0a83e1119c/40c52eab2eca320b/2/-14_2/4053c00000000000,3f3bf53234016961/-12_3,2_1/3f4c14eb2c723791,404ef00000000000,4038000000000000,4018000000000000/ 8/3f50624dd2f1a9fc/0/0/8000000000000000/1///// 2/3f847ae147ae147b/0/408270013e1c2ea4/40e189f82d566195/1/-16_2,0_4/0,4040000000000000,3f30b9a1d25ca840,4054400000000000,4059000000000000,4055000000000000/-7_3,1_3,1_4/0,0,3f3709e4020f475f,0,4054800000000000,0,403a000000000000,404e000000000000,4054000000000000,4046800000000000/ => -1/3f847ae147ae147b/0/408b6704a70015df/40e8cf7fac6db4d0/0/-2_2,6_1,0_2/0,40778002caed4066,4041000000000000,4054800000000000,3f38fd745a79a56d/-1_3/4055780e0a759639,40560005c2790084,406a600000000000/ -1/3f847ae147ae147b/0/bd20000000000000/3d60000000000000/0/-2_2,6_1,0_2/0,bcfee5f000000000,0,0,0/-1_3/3cdbc88000000000,bce7142000000000,0/ false false
kahan - -4/3f50624dd2f1a9fc/3f439913cd86ee50/4053580d9c4fbde7/c0a0de206f1c29a5/0/-20_1,1_2/3fd3333333333333,0,3fd3333333333333/// 5/3f70624dd2f1a9fc/0/40673c0193a99729/40b9ed3ac7792e30/1/8_1,0_4,1_3/0,4341c37937e08000,0,0,4341c37937e08000,0,0,0/// -4/0/4050000000000000/4050000000000000/408d9ae8dc10a3eb/2///// => -4/3f70624dd2f1a9fc/4050267032f04d2a/4074740430e8bb0e/40b53187ab6d2ddb/0/1_1/4351c37937e08000/// -4/3f70624dd2f1a9fc/bce16c0000000000/3d10000000000000/bd40000000000000/0/1_1/0/// false false
kahan - 2/3fe0000000000000/4042000000000000/4054f800d363b620/c0a0048352376b5e/0/3_4,1_1/0,3f0a6c76c3ffc24c,4007000000000000,403b000000000000,4032000000000000/// -4/3f847ae147ae147b/0/406ca4054dfe18b7/40c2a66d4e9611a9/0/-8_3,1_4/3f3e122604fdfbd5,3f28bb9581771e91,4021000000000000,0,4028000000000000,4031600000000000,4055000000000000/-20_1/405ad00000000000/ -2/3f50624dd2f1a9fc/4050400000000000/407f880000000000/40d3c50d52b51ec6/0/5_4,0_4,0_4/4050d80000000000,4040000000000000,404f800000000000,401c000000000000,404f900000000000,0,0,4046800000000000,4026000000000000,4049800000000000,4052000000000000,403c000000000000/// => -4/3fe0000000000000/4074a202a6ff0c5c/40898c016debfcf2/40db17b38fb93a2f/0/1_4/4047f001a6c76c40,40652c0000000000,405b080000000000,4064400000000000/// -4/3fe0000000000000/bd19d38a00000000/bd20000000000000/bd70000000000000/0/1_4/bc9eda0000000000,0,0,0/// false false
kahan - -53/0/0/404b900000000000/407387da9d82965b/3/1_1/404b900000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/406d080000000000/40c3f4f48c970ee2/3/1_3/4055000000000000,405c500000000000,4041800000000000///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/40698401b4fedaf5/40c8e0e77e6a37cb/1/1_1,0_2/405d480000000000,4055c00000000000,3f2b4fedaf486f50///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/407eb800da7f6d7a/40d6b90d6ff6adb0/3/0_4/4065880000000000,4065600000000000,405c500369fdb5e9,4041800000000000///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/3d20000000000000/bd54000000000000/3/0_4/0,0,3ccbd40000000000,0///3ff0000000000000,4000000000000000,4014000000000000 false true
kahan - -53/0/0/0/0/0/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/4026000000000000/4063eb352f36fe5c/0/1_1/4026000000000000///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/405d000000000000/4075d9a4a1eac651/1/1_1/405d000000000000///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/4061c00000000000/40b664839b96331b/2/0_3/4053c00000000000,0,404f800000000000///3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/4070d00000000000/40b861778f2e9773/0/0_3/4053c00000000000,405fc00000000000,404f800000000000///3ff0000000000000,4014000000000000 -53/0/0/0/bd30000000000000/0/0_3/0,0,0///3ff0000000000000,4014000000000000 false true
kahan - -2/0/405db00000000000/405db00000000000/40b1f8f033f53471/2///// 1/257bba08cf8c979d/0/40606001c3ad3f9a/40c1ca1cbf22d92f/2/-11_1,2_3/3ffb333333333333,4341c37937e08000,4341c37937e08000,3fd3333333333333/// => -2/257bba08cf8c979d/405db00000000000/406f3801c3ad3f9a/40cac694d91d7368/2/-1_2/4341c37937e08001,4341c37937e08000/// -2/257bba08cf8c979d/0/0/bd70000000000000/2/-1_2/bfd3333333333334,3fd3333333333333/// false false
kahan - -1/0/0/404e000000000000/c05bfe2541d64f25/3/-15_4/0,3fd3333333333333,4341c37937e08000,0/// -2/3f70624dd2f1a9fc/0/0/0/3///// => -2/3f70624dd2f1a9fc/4341c37937e08000/404e000000000000/c05bfe2541d64f25/3///// -2/3f70624dd2f1a9fc/3fd3333333333333/0/0/3///// false false
kahan - -4/3fe0000000000000/0/404b800000000000/c04719b37816baff/3/-16_1/404b800000000000/// 2/255bba08cf8c979d/4056800000000000/4056800000000000/406da2e921550a01/3///// => -4/3fe0000000000000/4056800000000000/4062200000000000/4067dc7c434f5b41/3/-16_1/404b800000000000/// -4/3fe0000000000000/0/0/3d00000000000000/3/-16_1/0/// false false
kahan - 2/255bba08cf8c979d/0/407874008bd3e42d/40be7d846f529cbf/2/-7_4/3fd3333333333333,3ffb333333333333,0,3fd3333333333333/-19_3,0_3,0_1/3ffb333333333333,4341c37937e08000,4341c37937e08000,3ffb333333333333,3ffb333333333333,3fd3333333333333,0/ -1/257bba08cf8c979d/0/406a600000000000/408d120630f4fb42/0/-9_3,1_2/3fd3333333333333,0,4341c37937e08000,0,3ffb333333333333/// => -1/257bba08cf8c979d/0/4082d20045e9f216/40c10fe29ab89e14/0/-9_3,1_2,3_1/3fd3333333333333,0,4341c37937e08000,0,3ffb333333333333,4002666666666666/-2_2/4351c37937e08000,4000000000000000/ -1/257bba08cf8c979d/0/3d30000000000000/bd68000000000000/0/-9_3,1_2,3_1/0,0,0,0,0,3ca0000000000000/-2_2/400b333333333333,bc90000000000000/ false false
kahan - -2/3f847ae147ae147b/0/0/8000000000000000/3///8_1/0/ 2/0/0/0/0/1///// 3/0/4042800000000000/4046801dbb9e944d/409b15721b8441f5/2/-13_3/3f4dbb9e944d76df,0,0/-19_1/4020000000000000/ => -2/3f847ae147ae147b/4042800000000000/4046801dbb9e944d/409b15721b8441f5/3/0_1/3f4dbb9e944d76df/0_1,7_1/4020000000000000,0/ -2/3f847ae147ae147b/0/0/0/3/0_1/0/0_1,7_1/0,0/ false false
kahan - -1/3fe0000000000000/404f800000000000/4077180000000000/40be1df0bf29b685/2/-7_4,2_3/3ffb333333333333,0,0,0,3ffb333333333333,0,0/// -2/4000000000000000/0/406f440000000000/c0ba6a9a1c1947be/1///-5_2,1_2/0,4341c37937e08000,0,4341c37937e08000/ => -2/4000000000000000/405099999999999a/40835d0000000000/408d9ab518837638/0///// -2/4000000000000000/bcfa000000000000/0/0/0///// true false
kahan - -53/0/0/0/8000000000000000/1/1_1/0///bff0000000000000,0,3fe0000000000000,4024000000000000 -53/0/0/0/8000000000000000/2/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/4058300000000000/406113ac1c4da002/1/0_1/4058300000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/4058300000000000/406113ac1c4da002/0/0_1/4058300000000000///3fe0000000000000 -53/0/0/0/0/0/0_1/0///3fe0000000000000 true true
kahan - 5/3fe0000000000000/4058700000000000/4069b80000000000/c0a41c3c0ba14402/0/-11_2/3fd3333333333333,0/// 1/4000000000000000/404a000000000000/4073100000000000/c0bc3074a3d62aef/0/-13_4/3ffb333333333333,3ffb333333333333,3ffb333333333333,3ffb333333333333/// 1/255bba08cf8c979d/0/4061e00be37f8243/40a7346d95381bb8/0///-7_1,2_3,0_4/3f44df3e82935bed,4047800000000000,404b000000000000,3f4aaebf867763a9,0,4045000000000000,0,0/ 0/3f847ae147ae147b/0/40813f0104c8816e/40a2e9b584a119aa/2/-11_3,2_3/3f404c8816d979aa,0,4033000000000000,4034400000000000,405c380000000000,404e800000000000/-7_3,1_3,0_3/404a000000000000,0,4033000000000000,404c800000000000,4058480000000000,4030200000000000,4012000000000000,4028000000000000,4054400000000000/ => 0/4000000000000000/4087df6a640ec864/4092d681fed43100/c0b12f811cba323f/0///2_1/4054400000000000/ 0/4000000000000000/3d353e8000000000/bd44000000000000/0/0///2_1/0/ false false
kahan - 8/3f847ae147ae147b/4058c00000000000/407ab804818296f6/c0c766a1fd69870e/2/7_4,1_1/4341c37937e08000,3ffb333333333333,4341c37937e08000,3fd3333333333333,3fd3333333333333/-20_4,2_3/4341c37937e08000,0,3ffb333333333333,4341c37937e08000,3fd3333333333333,0,3ffb333333333333/ -53/3fa47ae147ae147b/0/40440032dccbc893/c08d40ffee5f17e9/3/0_1,0_2/3ffb333333333333,4341c37937e08000,4341c37937e08000///bff0000000000000,0,3fe0000000000000,4024000000000000 -2/3f50624dd2f1a9fc/4014000000000000/4067e00000000000/c0a51b17b07f049c/3/-10_1,0_1,1_3/0,4028000000000000,4043800000000000,404c000000000000,4053c00000000000/// -2/3fe0000000000000/4057680000000000/407d30036ddf21be/40d7b0dfda4a2586/1/-13_3,0_2,1_1/4047000000000000,4052580000000000,4022000000000000,3f33d57cd9f71842,4055000000000000,3f41843aa0eee586/-14_3,0_1/4043000000000000,4053c00000000000,4046000000000000,0/ => error
kahan - 3/0/0/0/0/0///// -4/3f847ae147ae147b/4045000000000000/4056001142a432d2/40940bc1d3d06826/3/-20_1,0_2/3f49fb687b0ea753,4047000000000000,3f3113bfd528c14e/// => -4/3f847ae147ae147b/4045000000000000/4056001142a432d2/40940bc1d3d06826/3///// -4/3f847ae147ae147b/0/0/0/3///// false false
kahan - 5/3fe0000000000000/0/406740001b08b7a6/40b505317bf4f69a/2/-4_4,2_4,2_3/3ffb333333333333,3fd3333333333333,4341c37937e08000,3ffb333333333333,3fd3333333333333,3fd3333333333333,0,3ffb333333333333,4341c37937e08000,4341c37937e08000,3ffb333333333333/// -4/4000000000000000/4022000000000000/4080cc02f64a7012/40e15bdccbca2cc9/2/-7_3,0_3,2_1/3ffb333333333333,3ffb333333333333,3ffb333333333333,4341c37937e08000,3fd3333333333333,0,4341c37937e08000/-2_4,2_3/3fd3333333333333,0,4341c37937e08000,0,0,4341c37937e08000,3fd3333333333333/ -2/3f50624dd2f1a9fc/0/4056001d0f611810/c0954a47c99d0a0e/1/-17_2,1_1/3f5030e366d6b330,3f49bcfb6271d497,4056000000000000/// => -4/4000000000000000/435aa535d3d0c01a/40895c069ef8c0fe/40e35230bcfbe34c/0/1_1/4341c37937e08000/1_1,2_3/0,0,4341c37937e08000,3fd3333333333333/ -4/4000000000000000/3fe674ee16f26e35/bd30000000000000/bd78000000000000/2/1_1/0/1_1,2_3/0,0,0,0/ true false
kahan - 0/3f50624dd2f1a9fc/405c800000000000/405c800c4cc3476b/40a43b2e3c6398a6/3/-14_1/3ffb333333333333/// -2/3fa47ae147ae147b/0/4036000000000000/40939187fd235ef0/3/4_1/3fd3333333333333/// 3/255bba08cf8c979d/0/0/8000000000000000/1///// 8/0/0/4063e00000000000/40b3e0f8a334b9ac/0///-13_3/404d800000000000,403c000000000000,4052000000000000/ => -2/3fa47ae147ae147b/405ceccccccccccd/407270031330d1db/40c17178e057aede/3/4_1/3fd3333333333333/0_1/4063e00000000000/ -2/3fa47ae147ae147b/bcea000000000000/bd10000000000000/bd70000000000000/3/4_1/0/0_1/0/ false false
kahan - -1/3f50624dd2f1a9fc/3f49d69ef316a717/404d201b83daa5aa/4074401fbde076c0/2/3_3/3f0ad3bb2932e282,0,0/9_4/4031000000000000,0,0,4044a00000000000/ 3/3f50624dd2f1a9fc/4051c00000000000/4074ae0000000000/40c50ffd21ac2b49/3/-10_2/4050000000000000,0/-6_2,2_3/404f000000000000,404dc00000000000,3ff6000000000000,404c000000000000,4031000000000000/ => -1/3f50624dd2f1a9fc/4051c00ceb4f798b/40785203707b54b5/40c5b1fe1f9b2eff/3/0_1,2_3/4050000000000000,3f0ad3bb2932e282,0,0/0_1,8_4/40687c0000000000,4031000000000000,0,0,4044a00000000000/ -1/3f50624dd2f1a9fc/3cf4e2e000000000/3d10000000000000/0/3/0_1,2_3/0,0,0,0/0_1,8_4/0,0,0,0,0/ false false
kahan - -53/0/0/0/0/2/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/404d800000000000/40ae65c821cf70a1/0/1_2/404d800000000000,0///bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/404d800000000000/40ae65c821cf70a1/0/0_1/404d800000000000///3fe0000000000000 -53/0/0/0/0/0/0_1/0///3fe0000000000000 false true
kahan - 2/3fe0000000000000/0/405a381797d3352f/409fbf8bed641cbe/1/-3_4,0_3/0,3f1139a11c0c47b0,4029c00000000000,3f1957f8ddfdec34,3f2616161f28e6e8,4057000000000000,0/7_2/3f3bb45c5f61fc9c,3f467dbf73a2bf49/ -1/3f847ae147ae147b/0/4062400e93a749f1/409298566059648a/0/-2_3/3f4decfb86e52e62,4051c00000000000,3f383c3342334f1d/-11_1,1_3,2_1/3f349eb438edfb71,4041000000000000,4034000000000000,4035000000000000,3f27d0b78d32a15c/ => -1/3ff0000000000000/4063dc0fe83419c1/406f5c1a5f90e488/40a92bf126dec0a4/0/1_1/40570002c2c2c3e5/1_1/3f522bf6d1a9decc/ -1/3ff0000000000000/bcdec1c000000000/3d10000000000000/0/0/1_1/3cdcdd0000000000/1_1/bc00000000000000/ false false
kahan - 0/255bba08cf8c979d/403da00000000000/403da00000000000/4061e31dfeaefb7a/3///// -2/3f50624dd2f1a9fc/0/0/0/1///// 2/3f50624dd2f1a9fc/4047800000000000/4047800000000000/40793b1367aead21/1///// => -2/3f50624dd2f1a9fc/4053280000000000/4053280000000000/408116513383156f/3///// -2/3f50624dd2f1a9fc/0/0/0/3///// false false
kahan - 0/3fe0000000000000/0/0/0/0///// 1/0/3f36dee20b5558cf/4060a402dbdc416b/40c08187730384f6/2/-4_2,0_2/0,404c800000000000,4052c00000000000,3ff2000000000000/// => 0/3fe0000000000000/40608002dbdc416b/4060a402dbdc416b/40c08187730384f6/0/0_1/3ff2000000000000/// 0/3fe0000000000000/bd05398800000000/0/0/0/0_1/0/// false false
kahan - -1/0/0/3f155254992937c7/3f661e4a31ab9d4a/2/-18_1/3f155254992937c7/// 5/3f847ae147ae147b/0/4052500a06d15d27/c086f9e75ff742f8/1///-11_3/4010000000000000,3f440da2ba4db9d9,4051500000000000/ => -1/3f847ae147ae147b/3f155254992937c7/4052500b5bf6a6ba/c086f9e1d864b68d/0///0_1/4052500a06d15d27/ -1/3f847ae147ae147b/0/bcfb20e400000000/bd08ad8000000000/0///0_1/bce189c000000000/ true false
kahan - -53/0/0/40677c0000000000/40bf3883c569f005/0/1_3/4058000000000000,4020000000000000,4054f80000000000///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/0/0/3/1_1/0///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/4062a00000000000/4099f97acc0acac2/0/0_3/404b800000000000,403d000000000000,4050400000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/40750e0000000000/40c2db713c36515b/3/0_4/4055000000000000,4064200000000000,4020000000000000,4054f80000000000///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/0/bd60000000000000/3/0_4/0,0,0,0///3ff0000000000000,4000000000000000,4014000000000000 false true
kahan - 2/3fe0000000000000/0/402e40357e62bf6e/c07757f14e05a772/2/-10_2/402e400000000000,3f3abf315fb70755/// 2/3f847ae147ae147b/3f44f9b759faa7ed/4064e0053e6dd67f/40a57e397c3ad2f0/2/-17_4/0,404a700000000000,405c480000000000,3ff0000000000000/// 3/3f50624dd2f1a9fc/4033000000000000/40837a0450bfd9f1/40d4f8cd58e1631e/1/-17_4,1_2,2_1/404d100000000000,4052400000000000,4041200000000000,4057c00000000000,4057400000000000,4048f00000000000,4044800000000000/2_4,1_3,1_1/4052000000000000,4047000000000000,3f40fea01c2afb71,3f487f6b641aac81,0,4045000000000000,0,3f4b8df21ec20373/ => 2/3fe0000000000000/4083b2014f9b75a0/40892b067654da8e/40d74b34c330a6de/0/-10_2/402e400000000000,3f3abf315fb70755/1_6/4052000000000000,40470010fea01c2b,3f487f6b641aac81,4045000000000000,0,3f4b8df21ec20373/ 2/3fe0000000000000/bd25604c00000000/3d2e000000000000/3d6c000000000000/2/-10_2/0,0/1_6/0,bca23c0000000000,0,0,0,0/ true false
kahan - 1/3f847ae147ae147b/4058c00000000000/4073000000000000/40b8e0810d4a9ffa/0/0_2,1_2/4030000000000000,4056000000000000,4053800000000000,4037000000000000/// 3/3f50624dd2f1a9fc/0/4070040295243a67/40c8b9a98f93b389/3/-1_2/3f44a921d3399a69,0/-1_4/4054000000000000,4048000000000000,405c100000000000,4030000000000000/ 5/255bba08cf8c979d/4058c00000000000/407b300673c9bf50/40d6fddf9aecdad6/2/-2_1,0_3/3f4eb9c83f001915,0,3f44e485bb7b8ad0,4049000000000000/-2_3,2_4/4041800000000000,4041800000000000,4040800000000000,4047800000000000,404f000000000000,4052000000000000,4000000000000000/ => 1/3f847ae147ae147b/4068c00000000000/408f1a048476fcdc/40e4c96a5304ae4c/3/0_2,1_2/403000908edf9b6a,4061400000000000,4053800000000000,4037000000000000/0_2/406ce00000000000,4073740000000000/ 1/3f847ae147ae147b/0/bd30000000000000/3d90000000000000/3/0_2,1_2/3cdf270000000000,0,0,0/0_2/0,0/ false false
kahan - -53/0/0/4056d80000000000/c0880d41ac24d5af/1/0_3/4050680000000000,4000000000000000,4037c00000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/4054000000000000/407dfb2adab1fbb1/1/0_1/4054000000000000///3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/0/0/3/////3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/40656c0000000000/c0721f587d97afad/3/0_2/4062740000000000,4037c00000000000///3ff0000000000000,4014000000000000 -53/0/0/0/0/1/0_2/0,0///3ff0000000000000,4014000000000000 false true
kahan - 8/3f50624dd2f1a9fc/405a700000000000/405a700000000000/40b2decff2cb48ab/2///// 8/3f70624dd2f1a9fc/3f387a62338086e7/40882c00c3d3119c/40e4261153016ae0/0/-20_4,1_2,0_1/4341c37937e08000,0,4341c37937e08000,0,0,0,4341c37937e08000/-17_3,1_4,2_2/3fd3333333333333,0,0,3ffb333333333333,4341c37937e08000,4341c37937e08000,0,3ffb333333333333,3fd3333333333333/ 3/3f847ae147ae147b/0/4068f00000000000/40c5aa61196fbbda/1/-4_2,2_1,0_3/3ff0000000000000,403a000000000000,4033000000000000,4048800000000000,4053600000000000,403b000000000000/// => 3/3f847ae147ae147b/405a70061e988ce0/4090db0061e988ce/40ebec8397b6c2ec/0/-4_2,2_4/3ff0000000000000,403a000000000000,435aa535d3d0c005,4048800000000000,4053600000000000,403b000000000000/0_1/4351c37937e08000/ 3/3f847ae147ae147b/3ce0dce000000000/0/bd70000000000000/0/-4_2,2_4/0,0,bff0000000000000,0,0,0/0_1/4010000000000000/ false false
kahan - -2/255bba08cf8c979d/4038000000000000/40722c0276891660/4092db3ce2f7e878/0/-1_3,1_2/0,3f43b448b2fe779a,4041000000000000,4049600000000000,0/6_1,1_2,2_1/4055000000000000,4039000000000000,4050c00000000000,4018000000000000/ 3/3f847ae147ae147b/404b800000000000/4075f6021472a5b2/40c7996cfec19532/0/-19_4,1_3/0,0,3f40a3952d8cc989,0,4051400000000000,4024000000000000,4000000000000000/1_3/405d180000000000,0,4058c00000000000/ => -2/3f847ae147ae147b/4053c00000000000/40841102457dde09/40c9f4d49b209241/0/0_2,1_1/405440122beef045,4041000000000000,4049600000000000/1_1,4_1,1_2,2_1/406aec0000000000,4055000000000000,4039000000000000,4050c00000000000,4018000000000000/ -2/3f847ae147ae147b/0/0/0/0/0_2,1_1/3d04123000000000,0,0/1_1,4_1,1_2,2_1/0,0,0,0,0/ false false
kahan - -53/0/0/0/0/1/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/4039000000000000/409597626148a8c8/2/1_1/4039000000000000///4000000000000000 -53/0/0/0/0/0/////4000000000000000 => -53/0/0/4039000000000000/409597626148a8c8/0/1_1/4039000000000000///4000000000000000 -53/0/0/0/0/0/1_1/0///4000000000000000 true true
kahan - 8/3fe0000000000000/0/4066e0039461697b/c088821a7bdb2d72/0/-17_2/0,0/-13_4,1_3/3f3ca30b4bd872f3,0,4014000000000000,4024000000000000,4052c00000000000,4050c00000000000,403a000000000000/ -1/0/0/40734201cbe0c823/c0611b8a3ce850a1/2/-10_2,2_2/4057400000000000,403c000000000000,4033000000000000,4051800000000000/-16_2/4058880000000000,3f3cbe0c822e159b/ => -1/3fe0000000000000/40734201cbe0c823/407eb20396117ce0/c08cc8fd0b15419a/0/0_1/0/0_1/4066e0039461697b/ -1/3fe0000000000000/bcfea65000000000/3d20000000000000/bd20000000000000/0/0_1/0/0_1/3cdcbcc000000000/ false false
kahan - 3/0/404c800000000000/4079200000000000/40d5c4d26eb0a0e2/2/-13_4,2_3/0,4341c37937e08000,3ffb333333333333,0,0,3ffb333333333333,3ffb333333333333/// -4/257bba08cf8c979d/4055400000000000/40604003c7bb85af/40b31b62c703ca9d/0/-12_2/3ffb333333333333,0/// -2/3f847ae147ae147b/0/4058880000000000/c076ed956a6e0a97/3/5_2,1_1,2_1/403b200000000000,4047800000000000,0,4038000000000000/// 1/255bba08cf8c979d/403c000000000000/40645c0000000000/40c3b1a7ec3d1c77/3/-20_3,2_3/4058c00000000000,0,0,0,4026000000000000,4036e00000000000/-12_1/4000000000000000/ => -4/3ff0000000000000/4341c37937e0809c/4088c800f1eee16c/40e20464607334cd/3/2_2/4052880000000000,4038000000000000/// -4/3ff0000000000000/bfd4ccccccccccd0/bd20000000000000/3d79000000000000/0/2_2/0,0/// false false
kahan - -53/0/0/4038000000000000/c0634da7877cf69c/2/0_1/4038000000000000///4000000000000000 -53/0/0/0/0/0/////4000000000000000 -53/0/0/4041000000000000/40594f63cc6f25d2/1/1_1/4041000000000000///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/0/0/3/////4000000000000000 => -53/0/0/404d000000000000/c04a97d685158ecc/3/0_1/404d000000000000///4000000000000000 -53/0/0/0/0/0/0_1/0///4000000000000000 false true
kahan - -53/0/0/4035000000000000/4061b44fb1a0c0dd/3/1_1,0_1/0,4035000000000000///3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/0/0/3/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/4035000000000000/4061b44fb1a0c0dd/3/2_1/4035000000000000///3ff0000000000000,4014000000000000 -53/0/0/0/0/3/2_1/0///3ff0000000000000,4014000000000000 false true
kahan - 1/3f847ae147ae147b/0/406e24076d33add4/40c2f49df0aecd2a/3/8_2,0_2,2_4/4341c37937e08000,3ffb333333333333,3fd3333333333333,4341c37937e08000,0,0,4341c37937e08000,0/// 0/3fa47ae147ae147b/0/405ec00000000000/40b09988a67142af/2/-8_1/3ffb333333333333/6_1/0/ -4/3f847ae147ae147b/0/403da00000000000/4090156447607784/3/-8_1/403da00000000000/// => -4/3fa47ae147ae147b/403da00000000000/40789c03b699d6ea/40cd440eccd37d72/3/1_1/435aa535d3d0c000/1_1/0/ -4/3fa47ae147ae147b/0/0/0/3/1_1/4000000000000000/1_1/0/ false false
kahan - -53/0/0/0/0/0/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/0/0/1/////bff0000000000000,0,3fe0000000000000,4024000000000000 -53/0/0/0/0/0/////3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/3f44af335fbc20ff/3f99b8af685e8bbe/0/0_2/0,3f44af335fbc20ff///bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/3f44af335fbc20ff/3f99b8af685e8bbe/0/0_1/3f44af335fbc20ff/// -53/0/0/0/0/0/0_1/0/// false true
kahan - -4/3f847ae147ae147b/0/40436010b181e601/c08c1773460b7dc6/3///0_2,0_2/0,3f3b5565e62b1f3e,3f1836779757e14a,4043600000000000/ 2/255bba08cf8c979d/4048000000000000/4071e0046813f282/c09190d7034db860/0/-12_4,1_2,0_1/3f3718420ffc42bb,4048000000000000,404b800000000000,403d000000000000,3f47b47e8c1505c5,4010000000000000,4031000000000000/-19_1/4055400000000000/ -1/3fe0000000000000/4055800000000000/406f4c0000000000/40b60b73cbde7e73/1/-11_4/402ec00000000000,4050800000000000,401c000000000000,4053000000000000/// => -4/3ff0000000000000/4080c3023409f941/4081f9033f2217a1/40ac489f44934144/3///1_3/3f3b5565e62b1f3e,3f1836779757e14a,4043600000000000/ -4/3ff0000000000000/3d19391400000000/3d00000000000000/3d50000000000000/3///1_3/0,0,0/ false false
kahan - -2/3f50624dd2f1a9fc/3f4dc047aa3e3770/4050801231eea6e5/40a8113e00e71185/1/-19_3/3ffb333333333333,3fd3333333333333,3fd3333333333333/// -53/3f70624dd2f1a9fc/0/4000010347ef3b36/404eada05df7b0dd/0/1_1,0_2/4341c37937e08000,0,0///3ff0000000000000,4014000000000000,4024000000000000 => error
kahan - 2/255bba08cf8c979d/0/406c6006258eb0d8/40c04299d29575ab/1/-10_3,2_1,0_3/0,3f4047383b91f177,4057400000000000,403c000000000000,3f309e050f9b2505,4046000000000000,404f000000000000/// -2/0/0/4050400000000000/409e59f6fc3d5884/2/3_2/4014000000000000,4045000000000000/-7_1/4032000000000000/ => -2/255bba08cf8c979d/0/4072400312c7586c/40c40dd8b21d20bc/0/0_1,2_2/406c6006258eb0d8,4014000000000000,4045000000000000/-7_1/4032000000000000/ -2/255bba08cf8c979d/0/0/bd70000000000000/0/0_1,2_2/bcef01a000000000,0,0/-7_1/0/ true false
kahan - 2/0/0/405d000000000000/40bbe66ddd6fd06e/1/-4_2/4341c37937e08000,3fd3333333333333/// -1/257bba08cf8c979d/4051400000000000/40725c0189ca785d/40c0b43fb1f37ca4/0/-8_1/3fd3333333333333/-5_3,1_3/3fd3333333333333,3fd3333333333333,3fd3333333333333,4341c37937e08000,0,0/ => -1/257bba08cf8c979d/4051400000000000/40799c0189ca785d/40cea776a0ab64db/0/-8_1,7_1/3fd3333333333333,4341c37937e08000/-5_3,1_3/3fd3333333333333,3fd3333333333333,3fd3333333333333,4341c37937e08000,0,0/ -1/257bba08cf8c979d/0/0/0/0/-8_1,7_1/0,3fd3333333333333/-5_3,1_3/0,0,0,0,0,0/ false false
kahan - -53/0/0/0/8000000000000000/1/////bff0000000000000,0,3fe0000000000000,4024000000000000 0/3fe0000000000000/403b600000000000/403b600000000000/40944e15ee554bf7/1///// -53/0/0/40340012b39a18be/406044a60a8e028f/0/0_2,0_1/3f32b39a18bd8a29,4010000000000000,4030000000000000///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/405dc00000000000/40b86c651fcde9d8/3/0_2,0_1/4045000000000000,4053400000000000,0///3ff0000000000000,4000000000000000,4014000000000000 => error
kahan - -53/0/0/4047800000000000/c090d577cb84b47f/0/0_1/4047800000000000///4000000000000000 -53/0/0/4057c000de7b53a3/40b0a57fdcc2edc3/0/0_2/3f0bcf6a74699380,4057c00000000000///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/0/0/2/////3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/4061c0006f3da9d2/40a8e043d3c38146/0/0_1/4061c0006f3da9d2/// -53/0/0/bd10000000000000/3d50000000000000/0/0_1/bd066c8000000000/// false true
kahan - -1/3f847ae147ae147b/0/4082a801b869bfa7/40c662a8ec229ba1/1/4_2,2_4/4055c80000000000,4054c00000000000,3f4b869bfa6cf1bd,404e800000000000,404d700000000000,4034000000000000/-18_2,2_2,0_1/0,4054800000000000,4054000000000000,404f000000000000,404f800000000000/ 5/0/3f40e18e096c9348/4074ba04bc637320/40b1b42c0c3bea7a/3/-11_3/0,4045000000000000,3f45018d8f9578f1/-1_4,0_4/4037200000000000,4052000000000000,0,4018000000000000,4055500000000000,4035000000000000,4022000000000000,4052500000000000/ 5/0/0/4042800000000000/c0730103bf614b70/1///-11_2/4042800000000000,0/ -1/0/0/0/0/0///// => -1/3f847ae147ae147b/3f40e18e096c9348/408e2d04169b7937/40cea4b6d4458682/3/0_1,3_2,2_4/40450015018d8f95,4055c80000000000,4054c00000000000,3f4b869bfa6cf1bd,404e800000000000,404d700000000000,4034000000000000/-18_2,2_2,0_1,11_2/0,4054800000000000,4054000000000000,404f000000000000,404f800000000000,4060840000000000,4068500000000000/ -1/3f847ae147ae147b/0/0/3d70000000000000/3/0_1,3_2,2_4/3cee3c4000000000,0,0,0,0,0,0/-18_2,2_2,0_1,11_2/0,0,0,0,0,0,0/ false false
kahan - 5/0/4050400000000000/4080ae02c9e6dd46/40cc9f305a8f71e3/0/0_3,0_4/3f381077c394f2f1,3f504b18f94c36db,4057000000000000,4056000000000000,405f300000000000,4052800000000000,4056800000000000/// 5/3fe0000000000000/4053c00000000000/4065600000000000/40c4a5ee0d72a601/0/2_1,1_1/4053c00000000000,402a000000000000/// => 5/3fe0000000000000/4062000000000000/40860602c9e6dd46/40d8a28f34010bf2/0/0_7/3f381077c394f2f1,3f504b18f94c36db,4065600000000000,4056000000000000,4061380000000000,4052800000000000,4056800000000000/// 5/3fe0000000000000/0/0/0/0/0_7/0,0,0,0,0,0,0/// false false
kahan - 2/0/0/0/8000000000000000/1///// 8/0/4051c00000000000/4051c00000000000/c05e78923fcd138d/1///// 1/0/0/4078be05295f1d23/c0963c537108ac5f/1/-9_4,2_4,1_1/4042800000000000,4055c00000000000,404c000000000000,403c000000000000,404d800000000000,4045300000000000,3f49f933876df888,3f3ea38ac35418b1,4055a00000000000/// -2/3f847ae147ae147b/4056980000000000/4056980000000000/4054cf5a94efd749/3///// => -2/3f847ae147ae147b/40642c0000000000/40816a0294af8e92/c096d6e6ebb68023/3/-1_3/405f000000000000,40672c0a52be3a46,4055a00000000000/// -2/3f847ae147ae147b/0/bd30000000000000/bd30000000000000/1/-1_3/0,3ca3820000000000,0/// false false
kahan - 2/3f50624dd2f1a9fc/3f3eaac25833cc92/4068e003d5584b06/403d75a87adbc252/3/-2_4,1_1,0_2/3fd3333333333333,3fd3333333333333,3ffb333333333333,3fd3333333333333,3ffb333333333333,3ffb333333333333,4341c37937e08000/// -53/3f70624dd2f1a9fc/0/4065380000000000/40bf1bacb41db33a/3/0_3,0_1/3ffb333333333333,3ffb333333333333,3fd3333333333333,3fd3333333333333///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 8/255bba08cf8c979d/4000000000000000/4000000000000000/c010f4bf35d77dba/2///// -4/3f50624dd2f1a9fc/0/40611803736d6d5b/c0ace9216d226a01/0/7_3,2_3/0,403dc00000000000,0,3f3b9b6b6ad828f8,0,0/-13_2/4051800000000000,4042800000000000/ => error
mul 7ff0000000000000 -53/0/0/0/0/0/////4000000000000000 => -53/0/fff8000000000000/fff8000000000000/fff8000000000000/0/////4000000000000000
mul 7ff8000000000001 5/3fe0000000000000/0/0/0/3///// => 5/3fe0000000000000/7ff8000000000001/7ff8000000000001/7ff8000000000001/3/////
mul 0 8/3fe0000000000000/0/4071aa0000000000/40cbd4e9919a00d4/2/8_2/400e000000000000,0/-4_3,2_3/404e000000000000,0,4057380000000000,402c000000000000,4039000000000000,4055c00000000000/ => 8/3fe0000000000000/0/0/0/2/8_2/0,0/-4_3,2_3/0,0,0,0,0,0/
mul 1a56e1fc2f8f359 -4/3f847ae147ae147b/0/405c000000000000/40b41ec037d40ed9/3/-9_2/402c000000000000,4058800000000000/// => -4/3f847ae147ae147b/0/212c05bca99d4ee/26af2d7a3887ad9/3/-9_2/1e2c05bca99d4ee,210685051469a50///
mul c008000000000000 -53/0/0/40570004f0c67f96/c08b1b522cba6185/1/0_2/4057000000000000,3f33c319fe56aabf///4000000000000000 => -53/0/8000000000000000/c0714003b494dfb0/40a4547da18bc924/3/0_2/c071400000000000,bf4da4a6fd82001e///4000000000000000
mul bff0000000000000 -53/0/0/405ac80000000000/c0a41e8ca6fbe0f1/0/0_1,1_2/0,4058400000000000,4024400000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/8000000000000000/c05ac80000000000/40a41e8ca6fbe0f1/3/0_1,1_2/8000000000000000,c058400000000000,c024400000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000
mul 7ff8000000000001 3/255bba08cf8c979d/403ea00000000000/40763c06ca12345b/40ba413dbcffc6a9/2/-4_1,2_3,0_4/4036000000000000,3f469177e10c1d12,4039000000000000,3f3eba5c8e73b8f1,4050c00000000000,4057400000000000,0,3f4061eb7a8eb05e/-12_1/405d880000000000/ => 3/255bba08cf8c979d/7ff8000000000001/7ff8000000000001/7ff8000000000001/2/-4_1,2_3,0_4/7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001/-12_1/7ff8000000000001/
mul 4000000000000000 5/3f50624dd2f1a9fc/4046b00000000000/4048300000000000/40a32934dcbf519f/2/-9_1,2_2,2_2/4008000000000000,0,0,0,0/// => 5/3f50624dd2f1a9fc/4056b00000000000/4058300000000000/40b32934dcbf519f/2/-9_1,2_2,2_2/4018000000000000,0,0,0,0///
mul 7ff0000000000000 -1/3f847ae147ae147b/404f500000000000/40772a047e15f233/c0c2679ca99bbea9/3/6_2,1_4,2_1/3f4ed0ea593535ae,402c000000000000,4046800000000000,4041800000000000,4010000000000000,4045800000000000,0/-20_4/4018000000000000,3f247f14e18c0a9c,4057800000000000,4050c00000000000/ => -1/3f847ae147ae147b/7ff0000000000000/7ff0000000000000/fff0000000000000/3/6_2,1_4,2_1/7ff0000000000000,7ff0000000000000,7ff0000000000000,7ff0000000000000,7ff0000000000000,7ff0000000000000,fff8000000000000/-20_4/7ff0000000000000,7ff0000000000000,7ff0000000000000,7ff0000000000000/
mul 7ff0000000000000 -53/0/0/0/0/2/////4000000000000000 => -53/0/fff8000000000000/fff8000000000000/fff8000000000000/2/////4000000000000000
mul 3fe0000000000000 5/3f847ae147ae147b/0/4067000b7d0fdedd/40b079453217bfb7/1/9_4,0_1/4042800000000000,3f2b1e65ce56f081,3e9434730ace0815,3f3b0ca8acf86ce1,3f28413d3922915f/-1_3,0_3/4026000000000000,3f43937bd4b77a82,4039000000000000,4057400000000000,4032000000000000,0/ => 5/3f847ae147ae147b/0/4057000b7d0fdedd/40a079453217bfb7/1/9_4,0_1/4032800000000000,3f1b1e65ce56f081,3e8434730ace0815,3f2b0ca8acf86ce1,3f18413d3922915f/-1_3,0_3/4016000000000000,3f33937bd4b77a82,4029000000000000,4047400000000000,4022000000000000,0/
mul c008000000000000 -53/0/0/0/0/1/////4000000000000000 => -53/0/8000000000000000/8000000000000000/8000000000000000/3/////4000000000000000
mul bff0000000000000 5/3fe0000000000000/403a000000000000/4073780000000000/40b78f9414ea4d30/0/-2_3,1_1/0,0,4022000000000000,403a000000000000/-8_2,1_3/0,403d800000000000,4044000000000000,404d800000000000,405e800000000000/ => 5/3fe0000000000000/c03a000000000000/c073780000000000/c0b78f9414ea4d30/3/-2_3,1_1/8000000000000000,8000000000000000,c022000000000000,c03a000000000000/-8_2,1_3/8000000000000000,c03d800000000000,c044000000000000,c04d800000000000,c05e800000000000/
mul c008000000000000 -53/0/0/0/0/2/////3ff0000000000000,4000000000000000,4014000000000000 => -53/0/8000000000000000/8000000000000000/8000000000000000/3/////3ff0000000000000,4000000000000000,4014000000000000
mul c008000000000000 5/0/0/40777e069229dc8d/c08072c54e773649/1/-3_2,1_4/3f4d09376c4a3e6f,4032600000000000,4051c00000000000,4018000000000000,4045000000000000,3f33c0cb6c765504/-4_1,0_2,0_3/4051c00000000000,4043600000000000,4049800000000000,0,3f3b4f6383d1e3fd,4053700000000000/ => 5/0/8000000000000000/c0919e84ed9f656a/4098ac27f5b2d16e/3/-3_2,1_4/bf65c6e99137aed3,c04b900000000000,c06aa00000000000,c032000000000000,c05f800000000000,bf4da13122b17f86/-4_1,0_2,0_3/c06aa00000000000,c05d100000000000,c063200000000000,8000000000000000,bf547b8aa2dd6afe,c06d280000000000/
mul 3fe0000000000000 8/0/0/40756e0000000000/40c84e65f9bb77b2/1/-18_4/4022000000000000,0,405c200000000000,4054c00000000000/-15_3,1_1/404b800000000000,4032000000000000,4029c00000000000,404a400000000000/ => 8/0/0/40656e0000000000/40b84e65f9bb77b2/1/-18_4/4012000000000000,0,404c200000000000,4044c00000000000/-15_3,1_1/403b800000000000,4022000000000000,4019c00000000000,403a400000000000/
mul c008000000000000 3/0/4054c00000000000/4054c00000000000/c09737049a5e403b/0///// => 3/0/c06f200000000000/c06f200000000000/40b1694373c6b02c/3/////
mul 7ff8000000000001 -53/0/0/0/0/2/////4000000000000000 => -53/0/7ff8000000000001/7ff8000000000001/7ff8000000000001/2/////4000000000000000
mul 0 -53/0/0/0/0/2/////3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/0/0/2/////3ff0000000000000,4014000000000000,4024000000000000
mul 7ff0000000000000 -53/0/0/4055800000000000/40af614dde69e182/0/1_3/4051800000000000,4030000000000000,0///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/fff8000000000000/7ff0000000000000/7ff0000000000000/0/1_3/7ff0000000000000,7ff0000000000000,fff8000000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000
mul c008000000000000 -53/0/0/406cc8051dead354/c0a8fa4654f963df/3/0_1,0_3/3f4477ab4d4d1bf5,4056480000000000,404c900000000000,4055000000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/8000000000000000/c0859603d6701e7f/40c2bbb4bfbb0ae7/3/0_1,0_3/bf5eb380f3f3a9f0,c070b60000000000,c0656c0000000000,c06f800000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000
mul 7ff0000000000000 -53/0/0/405be00c9c1a6e45/40a0b527a9c2e9d4/1/0_2,0_1/4020000000000000,4059e00000000000,3f493834dc893425///3ff0000000000000,4000000000000000,4014000000000000 => -53/0/fff8000000000000/7ff0000000000000/7ff0000000000000/1/0_2,0_1/7ff0000000000000,7ff0000000000000,7ff0000000000000///3ff0000000000000,4000000000000000,4014000000000000
mul 4000000000000000 -53/0/0/0/0/2/////3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/0/0/2/////3ff0000000000000,4000000000000000,4014000000000000
mul bff0000000000000 0/3f50624dd2f1a9fc/404f000000000000/404f000000000000/40abc96230c7128c/0///// => 0/3f50624dd2f1a9fc/c04f000000000000/c04f000000000000/c0abc96230c7128c/3/////
mul 7ff8000000000001 2/0/0/0/8000000000000000/3///// => 2/0/7ff8000000000001/7ff8000000000001/7ff8000000000001/3/////
mul 4000000000000000 2/255bba08cf8c979d/4048000000000000/4057000000000000/40b3e1d0a0154e7a/1/-18_2/0,4046000000000000/// => 2/255bba08cf8c979d/4058000000000000/4067000000000000/40c3e1d0a0154e7a/1/-18_2/0,4056000000000000///
mul 3fe0000000000000 5/0/3f4f3de79a952b6a/407f9e03e7bcf353/40db4c3196c4f185/2/-15_3,1_4/4055400000000000,402e000000000000,4044000000000000,4032000000000000,403a000000000000,4048000000000000,4044800000000000/2_4/4035000000000000,405ef80000000000,4056000000000000,0/ => 5/0/3f3f3de79a952b6a/406f9e03e7bcf353/40cb4c3196c4f185/2/-15_3,1_4/4045400000000000,401e000000000000,4034000000000000,4022000000000000,402a000000000000,4038000000000000,4034800000000000/2_4/4025000000000000,404ef80000000000,4046000000000000,0/
mul 4000000000000000 2/0/0/407214008065f247/c0b490bf557128f6/2/-8_2,2_3/4022400000000000,4055000000000000,405cc80000000000,4054400000000000,3f200cbe48d11e2a/// => 2/0/0/408214008065f247/c0c490bf557128f6/2/-8_2,2_3/4032400000000000,4065000000000000,406cc80000000000,4064400000000000,3f300cbe48d11e2a///
mul 7ff8000000000001 -2/255bba08cf8c979d/404f800000000000/4070a40000000000/40c032c7b524f848/1/9_3/0,4054d00000000000,4041800000000000/5_1/4055400000000000/ => -2/255bba08cf8c979d/7ff8000000000001/7ff8000000000001/7ff8000000000001/1/9_3/7ff8000000000001,7ff8000000000001,7ff8000000000001/5_1/7ff8000000000001/
mul 0 5/3f50624dd2f1a9fc/4046800000000000/4070420000000000/40ce97d9291f10db/0/-5_3,1_2/4044000000000000,4024000000000000,4044800000000000,4008000000000000,4037200000000000/8_3/3ff0000000000000,4041000000000000,404f800000000000/ => 5/3f50624dd2f1a9fc/0/0/0/0/-5_3,1_2/0,0,0,0,0/8_3/0,0,0/
mul 7ff0000000000000 -53/0/0/404b800000000000/407ac3e94dff5432/1/0_1/404b800000000000///3ff0000000000000,4014000000000000,4024000000000000 => -53/0/fff8000000000000/7ff0000000000000/7ff0000000000000/1/0_1/7ff0000000000000///3ff0000000000000,4014000000000000,4024000000000000
mul 7ff8000000000001 -4/3fe0000000000000/404d000000000000/406e60119cbf9488/40c11d1937d82341/3/-2_1,0_4,2_1/3f3989ab86e0c6f6,0,401c000000000000,3f3d46411cd17100,4022000000000000,4031000000000000/7_4,1_3/4038400000000000,3f4919e2ae0a186a,403a000000000000,4041800000000000,4019000000000000,3f41f125523fb5a2,404e400000000000/ => -4/3fe0000000000000/7ff8000000000001/7ff8000000000001/7ff8000000000001/3/-2_1,0_4,2_1/7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001/7_4,1_3/7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001/
mul bff0000000000000 -4/3fe0000000000000/404d800000000000/4076700000000000/409d41e88dbfcd21/0/-20_3,2_3/4056400000000000,4048000000000000,403f000000000000,4050c00000000000,403b000000000000,4043000000000000/// => -4/3fe0000000000000/c04d800000000000/c076700000000000/c09d41e88dbfcd21/3/-20_3,2_3/c056400000000000,c048000000000000,c03f000000000000,c050c00000000000,c03b000000000000,c043000000000000///
mul 7ff8000000000001 8/0/0/4071700000000000/40c7e4a337f2e161/0/-15_1,1_2,2_4/4041800000000000,4014000000000000,0,4055400000000000,404c000000000000,0,4058800000000000/// => 8/0/7ff8000000000001/7ff8000000000001/7ff8000000000001/0/-15_1,1_2,2_4/7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001///
mul c008000000000000 1/3f847ae147ae147b/0/403ee00000000000/c0651c055fdc2e38/2///-4_1/403ee00000000000/ => 1/3f847ae147ae147b/8000000000000000/c057280000000000/407faa080fca4554/3///-4_1/c057280000000000/
mul c008000000000000 -2/255bba08cf8c979d/0/40887602b2003ad0/40e44506bdff0e3b/3/3_2,2_3/4052400000000000,401c800000000000,0,405e780000000000,4058800000000000/-17_3,0_3,0_4/4052800000000000,404a800000000000,4055400000000000,4051800000000000,3f396b374a4fe5e1,4046800000000000,3f4e6a6807d8b2c8,404f000000000000,402a000000000000,4054300000000000/ => -2/255bba08cf8c979d/8000000000000000/c0a2588205802c1c/c0fe678a1cfe9558/3/3_2,2_3/c06b600000000000,c035600000000000,8000000000000000,c076da0000000000,c072600000000000/-17_3,0_3,0_4/c06bc00000000000,c063e00000000000,c06fe00000000000,c06a400000000000,bf53106977bbec69,c060e00000000000,bf66cfce05e28616,c067400000000000,c043800000000000,c06e480000000000/
mul 0 0/255bba08cf8c979d/4022000000000000/40538009133c8780/40901c0ff1b2a719/1/3_2/3f4226790eff6424,4051400000000000/// => 0/255bba08cf8c979d/0/0/0/1/3_2/0,0///
mul 7ff0000000000000 -53/0/0/0/0/3/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/fff8000000000000/fff8000000000000/fff8000000000000/3/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000
mul 7ff0000000000000 5/3f50624dd2f1a9fc/0/4073ec038450b5de/c06007b33cafd1a6/0///-8_2,1_4/404c800000000000,4053800000000000,4049000000000000,405d300000000000,3f4c2285aef0ebc9,4031000000000000/ => 5/3f50624dd2f1a9fc/fff8000000000000/7ff0000000000000/fff0000000000000/0///-8_2,1_4/7ff0000000000000,7ff0000000000000,7ff0000000000000,7ff0000000000000,7ff0000000000000,7ff0000000000000/
mul 4000000000000000 2/3f847ae147ae147b/4050000000000000/4081f00000000000/c0d0c295c8b4bc6b/1/-15_4,2_2/4032000000000000,0,0,403b000000000000,0,4055800000000000/-4_4,0_2/4056f80000000000,405f080000000000,4033000000000000,4057c00000000000,0,4048800000000000/ => 2/3f847ae147ae147b/4060000000000000/4091f00000000000/c0e0c295c8b4bc6b/1/-15_4,2_2/4042000000000000,0,0,404b000000000000,0,4065800000000000/-4_4,0_2/4066f80000000000,406f080000000000,4043000000000000,4067c00000000000,0,4058800000000000/
mul 0 8/3f50624dd2f1a9fc/3f4e858a237bfef6/40729003d0b14470/c0a1a77560d49c2a/0/-9_1/4057400000000000/5_2,1_3/404b000000000000,4058c00000000000,4046000000000000,0,401c000000000000/ => 8/3f50624dd2f1a9fc/0/0/8000000000000000/0/-9_1/0/5_2,1_3/0,0,0,0,0/
mul bff0000000000000 8/3f847ae147ae147b/403c000000000000/407a940000000000/409dae1051dae093/2/-6_1,0_1/4059e00000000000,4051c00000000000/5_1,2_1,2_3/404ee00000000000,4041000000000000,4050c00000000000,404e000000000000,0/ => 8/3f847ae147ae147b/c03c000000000000/c07a940000000000/c09dae1051dae093/3/-6_1,0_1/c059e00000000000,c051c00000000000/5_1,2_1,2_3/c04ee00000000000,c041000000000000,c050c00000000000,c04e000000000000,8000000000000000/
mul c008000000000000 5/3f50624dd2f1a9fc/0/4057800000000000/40b40d13316c3272/3/2_2,2_3/4036000000000000,4042800000000000,0,4033000000000000,4030000000000000/// => 5/3f50624dd2f1a9fc/8000000000000000/c071a00000000000/c0ce139cca224bab/3/2_2,2_3/c050800000000000,c05bc00000000000,8000000000000000,c04c800000000000,c048000000000000///
mul 3fe0000000000000 2/0/4034000000000000/406ad8034eb2e91e/40aeae7da816307f/2/0_4/3f3a759748f16fc5,4058c00000000000,4045100000000000,404ad00000000000/// => 2/0/4024000000000000/405ad8034eb2e91e/409eae7da816307f/2/0_4/3f2a759748f16fc5,4048c00000000000,4035100000000000,403ad00000000000///
mul 7ff8000000000001 2/3f847ae147ae147b/0/40639c0000000000/40a22c42e4e5e436/3/-1_3,0_1,1_4/404ef00000000000,0,0,4037000000000000,404e800000000000,0,0,4026000000000000/// => 2/3f847ae147ae147b/7ff8000000000001/7ff8000000000001/7ff8000000000001/3/-1_3,0_1,1_4/7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001///
mul c008000000000000 -53/0/0/404d800000000000/c08f304f2fcc94de/2/0_2,0_1/4044000000000000,401c000000000000,4028000000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/8000000000000000/c066200000000000/40a7643b63d96fa6/3/0_2,0_1/c05e000000000000,c035000000000000,c042000000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000
mul 1a56e1fc2f8f359 0/3f50624dd2f1a9fc/0/406a400000000000/40b90e44a377d9a0/3/-13_2,2_4/4041000000000000,0,0,4050400000000000,4049000000000000,404e800000000000/// => 0/3f50624dd2f1a9fc/0/22194560df0379f/270c796f5b47e66/3/-13_2,2_4/1f6c501bf28828f,0,0,205c3d84204d726,200be08d0527e1e,2046cf645d547f1///
mul c008000000000000 -53/0/0/0/0/0/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/8000000000000000/8000000000000000/8000000000000000/3/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000
mul 3fe0000000000000 -2/3f847ae147ae147b/3f0c71eaeaa10515/3f0c71eaeaa10515/bf46fd6d83298c37/1///// => -2/3f847ae147ae147b/3efc71eaeaa10515/3efc71eaeaa10515/bf36fd6d83298c37/1/////
mul 3fe0000000000000 1/3f50624dd2f1a9fc/4052c00000000000/407bf6055d25a18c/c0bb8eb092767fc1/0/3_4,0_3,1_2/3f3e7a3cb0749c06,4045000000000000,3f48b8c764a4bb9f,404d800000000000,3f179a3a7bed2e1d,4058400000000000,404c800000000000,4050880000000000,4049a00000000000/// => 1/3f50624dd2f1a9fc/4042c00000000000/406bf6055d25a18c/c0ab8eb092767fc1/0/3_4,0_3,1_2/3f2e7a3cb0749c06,4035000000000000,3f38b8c764a4bb9f,403d800000000000,3f079a3a7bed2e1d,4048400000000000,403c800000000000,4040880000000000,4039a00000000000///
mul c008000000000000 -53/0/0/0/0/0/////3ff0000000000000,4014000000000000,4024000000000000 => -53/0/8000000000000000/8000000000000000/8000000000000000/3/////3ff0000000000000,4014000000000000,4024000000000000
mul 4000000000000000 -53/0/0/404500102a8a3de0/40971b589284dfe4/2/1_2/4045000000000000,3f402a8a3ddfeb29///3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/405500102a8a3de0/40a71b589284dfe4/2/1_2/4055000000000000,3f502a8a3ddfeb29///3ff0000000000000,4000000000000000,4014000000000000
mul 7ff8000000000001 -53/0/0/4068a40000000000/c0afe339aa954239/3/1_2/4058b00000000000,4058980000000000///3ff0000000000000,4000000000000000,4014000000000000 => -53/0/7ff8000000000001/7ff8000000000001/7ff8000000000001/3/1_2/7ff8000000000001,7ff8000000000001///3ff0000000000000,4000000000000000,4014000000000000
mul 0 2/3f50624dd2f1a9fc/4017800000000000/4017800000000000/3fe86df5bec98d5c/3///// => 2/3f50624dd2f1a9fc/0/0/0/3/////
mul 0 2/3fe0000000000000/0/4055000000000000/40b1e62b83583f7a/2///4_1/4055000000000000/ => 2/3fe0000000000000/0/0/0/2///4_1/0/
mul 1a56e1fc2f8f359 -2/3f847ae147ae147b/0/405a080000000000/40b1e41ec3fd7aa5/0/-17_3/4044000000000000,4032000000000000,4047100000000000/// => -2/3f847ae147ae147b/0/2116ed5565b03f5/267f68c38c01060/0/-17_3/1fac9a7b3b7302f,1e81be3bb5811c4,1fee3bbc808d6c3///
mul 1a56e1fc2f8f359 3/3f50624dd2f1a9fc/404a000000000000/407d2001fb75bd29/40d56f539fbbc56a/1/-3_2,0_1,0_1/404a800000000000,4032000000000000,403d000000000000,0/-15_4,0_2,1_3/4054000000000000,401c000000000000,0,4041800000000000,0,4049000000000000,3f3fb75bd29342fa,4054000000000000,404f000000000000/ => 3/3f50624dd2f1a9fc/2016979ce6a45b8/233813c3c4c3607/28cb5a5ad75fd07/1/-3_2,0_1,0_1/201bf324d762986,1e81be3bb5811c4,1f36bccc8b19c89,0/-15_4,0_2,1_3/20ac9a7b3b7302f,1d2c05bca99d4ee,0,1f77072bd404a29,0,200be08d0527e1e,f53d7a08b3cd0e,20ac9a7b3b7302f,204c2aec4e12bbe/
mul 1a56e1fc2f8f359 1/3f50624dd2f1a9fc/3f3796339dfe3046/405a400a5bf1b337/408f5cac73d41880/1/6_1,1_3/4053800000000000,3f31d9932edc12fc,0,403b000000000000/// => 1/3f50624dd2f1a9fc/ef977b34ac05bc/211945cfded2c43/24500beddae3b93/1/6_1,1_3/20a1e36b59f6894,e7e86c70740135,0,1f214eacc820d53///
mul 1a56e1fc2f8f359 -53/0/0/0/0/0/////bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/0/0/0/////bff0000000000000,0,3fe0000000000000,4024000000000000
mul c008000000000000 -53/0/0/4064840000000000/40928d51b8747910/3/1_3/4057800000000000,0,4051880000000000///bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/8000000000000000/c07ec60000000000/c0abd3fa94aeb598/3/1_3/c071a00000000000,8000000000000000,c06a4c0000000000///bff0000000000000,0,3fe0000000000000,4024000000000000
mul 4000000000000000 -53/0/0/404a000000000000/c091168760aaa173/1/0_2/4034000000000000,4040000000000000///bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/405a000000000000/c0a1168760aaa173/1/0_2/4044000000000000,4050000000000000///bff0000000000000,0,3fe0000000000000,4024000000000000
mul 0 -1/0/4018000000000000/406da807f559a70f/40cc46d24f95b538/3/-19_1,1_1/4046800000000000,4056800000000000/5_2,1_1/3f4fd5669c3be9f9,0,4058100000000000/ => -1/0/0/0/0/3/-19_1,1_1/0,0/5_2,1_1/0,0,0/
mul 3fe0000000000000 2/3f50624dd2f1a9fc/0/4064640000000000/409c5a030db8305b/3/9_2/4008000000000000,4044800000000000/-15_3/401e000000000000,4040d00000000000,4053800000000000/ => 2/3f50624dd2f1a9fc/0/4054640000000000/408c5a030db8305b/3/9_2/3ff8000000000000,4034800000000000/-15_3/400e000000000000,4030d00000000000,4043800000000000/
mul bff0000000000000 -53/0/0/0/0/0/////3ff0000000000000,4000000000000000,4014000000000000 => -53/0/8000000000000000/8000000000000000/8000000000000000/3/////3ff0000000000000,4000000000000000,4014000000000000
mul 1a56e1fc2f8f359 -4/3f847ae147ae147b/403a000000000000/4063200ab673aca9/40bc17739b03adef/0/-1_2/3f4fdd07f736941d,4032000000000000/4_1,2_2/4056c00000000000,4032000000000000,3f35f98d76d5177a/ => -4/3f847ae147ae147b/1f16979ce6a45b8/2199db0504104cc/272d0105cfffd32/0/-1_2/10556b4a5e137e5,1e81be3bb5811c4/4_1,2_2/20e78952939fa03,1e81be3bb5811c4,ed6ec8f7d27b98/
mul 0 5/255bba08cf8c979d/0/4053181042bd50c2/407e9e6194f2bb6a/3/-2_2,0_3,0_2/4008000000000000,0,4024000000000000,3f5042bd50c1e7b6,0,0,404fb00000000000/// => 5/255bba08cf8c979d/0/0/0/3/-2_2,0_3,0_2/0,0,0,0,0,0,0///
mul 1a56e1fc2f8f359 -53/0/0/0/0/3/////3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/0/0/3/////3ff0000000000000,4000000000000000,4014000000000000
mul 0 0/3f847ae147ae147b/4050080000000000/4050080000000000/409e018ecef5d0c3/0///// => 0/3f847ae147ae147b/0/0/0/0/////
mul 7ff8000000000001 3/3f50624dd2f1a9fc/4050800000000000/406d380000000000/4090dfe976a37a3f/0/0_3,1_2/4056580000000000,4033600000000000,4047800000000000,4028000000000000,0/// => 3/3f50624dd2f1a9fc/7ff8000000000001/7ff8000000000001/7ff8000000000001/0/0_3,1_2/7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001///
mul 0 1/3f50624dd2f1a9fc/4046200000000000/4046202432d992b6/4099ec16445c10a0/0/-14_1,0_2/0,3f48e156dcaa4422,3f36a3056c1757d0/// => 1/3f50624dd2f1a9fc/0/0/0/0/-14_1,0_2/0,0,0///
mul 1a56e1fc2f8f359 -1/3fe0000000000000/0/4056c00df6f95f24/40b2699298f342cd/0/3_2/4048800000000000,3f4bedf2be47792c/-14_1,2_1/4045000000000000,0/ => -1/3fe0000000000000/0/20e78a7dd7ef1ff/268a94ac5856658/0/3_2/200685051469a50,102b444f7fbfdaa/-14_1,2_1/1fc2089afe6bf65,0/
mul 1a56e1fc2f8f359 3/3fe0000000000000/4057000000000000/407aa000648d2132/40ab21dd1a73095a/3/-5_4,0_3/404d000000000000,4055c00000000000,4056400000000000,4048000000000000,3f1923484c7391f1,404a000000000000,0/// => 3/3fe0000000000000/20ece4da845ddd0/231d4a0b08fc931/2622b986f84fc69/3/-5_4,0_3/2036bccc8b19c89,20d21b32d0a6acd,20dcd242b223268,2001297d23ab683,d0d5a9ae0a2605,2016979ce6a45b8,0///
mul c008000000000000 1/255bba08cf8c979d/4054800000000000/407e7602411087d0/40bbcddf5500fabb/1/-4_1,1_4,0_2/3f4208843e7b08c3,4050500000000000,403c000000000000,404e000000000000,4000000000000000,0,4040a00000000000/-17_1,1_3,2_1/404d700000000000,4045000000000000,404b000000000000,4000000000000000,404e000000000000/ => 1/255bba08cf8c979d/c06ec00000000000/c096d881b0cc65dc/c0d4da677fc0bc0c/3/-4_1,1_4,0_2/bf5b0cc65db88d24,c068780000000000,c055000000000000,c066800000000000,c018000000000000,8000000000000000,c058f00000000000/-17_1,1_3,2_1/c066140000000000,c05f800000000000,c064400000000000,c018000000000000,c066800000000000/
mul bff0000000000000 3/3f847ae147ae147b/0/0/0/1///// => 3/3f847ae147ae147b/8000000000000000/8000000000000000/8000000000000000/3/////
mul 4000000000000000 -4/3f847ae147ae147b/0/0/0/1///// => -4/3f847ae147ae147b/0/0/0/1/////
mul 7ff0000000000000 -4/255bba08cf8c979d/4053f00000000000/4053f00000000000/40b2f9937aa25df5/3///// => -4/255bba08cf8c979d/7ff0000000000000/7ff0000000000000/7ff0000000000000/3/////
mul c008000000000000 -2/0/0/406aa00dcccc5a47/c0a74c525c0b3e35/0/3_4,2_2,2_4/0,4033000000000000,3f430c0054e77ff8,4040000000000000,4039000000000000,0,4057000000000000,3f353427590de1f4,4046800000000000,3f498d1d67ab695e/// => -2/0/8000000000000000/c083f80a599943b5/40c1793dc5086ea8/3/3_4,2_2,2_4/8000000000000000,c04c800000000000,bf5c92007f5b3ff4,c058000000000000,c052c00000000000,8000000000000000,c071400000000000,bf4fce3b0594d2ee,c060e00000000000,bf6329d60dc08f06///
mul 3fe0000000000000 0/3fe0000000000000/403a000000000000/4074c00205b564a4/40d66f77ccd15acb/2/-14_3,0_3,2_3/4049000000000000,3f402dab251bb69b,4043800000000000,401c000000000000,4057000000000000,0,4051800000000000,4042800000000000,4026000000000000/// => 0/3fe0000000000000/402a000000000000/4064c00205b564a4/40c66f77ccd15acb/2/-14_3,0_3,2_3/4039000000000000,3f302dab251bb69b,4033800000000000,400c000000000000,4047000000000000,0,4041800000000000,4032800000000000,4016000000000000///
mul 3fe0000000000000 5/3f50624dd2f1a9fc/0/405f500df829b8e5/c09cefd9226bc51f/1/1_4/4046000000000000,0,3f4bf05371c9ca7c,4054500000000000/// => 5/3f50624dd2f1a9fc/0/404f500df829b8e5/c08cefd9226bc51f/1/1_4/4036000000000000,0,3f3bf05371c9ca7c,4044500000000000///
mul 1a56e1fc2f8f359 8/255bba08cf8c979d/0/407b300801b49efe/40dbb5b2b3dd4511/0/-18_1,2_4/0,404c000000000000,4050800000000000,4057c00000000000,4018000000000000/9_3,0_4,2_2/4053800000000000,3f46b21be9a9d8f1,3f410b936f5d2942,0,4057c00000000000,4024000000000000,0,403d000000000000,3f484ff59eeae180/ => 8/255bba08cf8c979d/0/232351558d2da69/2928e995d2dba73/0/-18_1,2_4/0,202c05bca99d4ee,2061990c110baf4,20fcf7725698938,1d01297d23ab683/9_3,0_4,2_2/20a1e36b59f6894,fe65fa303c257a,f6d482edeb20b9,0,20fcf7725698938,1dac9a7b3b7302f,0,1f36bccc8b19c89,10048242e3442fd/
div 7ff0000000000000 -53/0/0/4050800000000000/40a07ed602bf8fa0/2/0_2/3ff0000000000000,4050400000000000///3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/0/0/2/0_2/0,0///3ff0000000000000,4014000000000000,4024000000000000
div 3fe0000000000000 1/3f50624dd2f1a9fc/0/40729402bd385f43/40a2b28fdae8f9b3/0/9_2,1_3,1_2/4056000000000000,4053400000000000,0,3f45e9c2fa1607cc,0,4046800000000000,4055d00000000000/// => 1/3f50624dd2f1a9fc/0/40829402bd385f43/40b2b28fdae8f9b3/0/9_2,1_3,1_2/4066000000000000,4063400000000000,0,3f55e9c2fa1607cc,0,4056800000000000,4065d00000000000///
div 4000000000000000 2/3fe0000000000000/3f365a62920e64e2/4070a00472bb09c0/c0af61f31132aa5a/0/-20_2,2_3/4036000000000000,4056c00000000000,4056400000000000,3f4868a704f2eb68,4050000000000000/// => 2/3fe0000000000000/3f265a62920e64e2/4060a00472bb09c0/c09f61f31132aa5a/0/-20_2,2_3/4026000000000000,4046c00000000000,4046400000000000,3f3868a704f2eb68,4040000000000000///
div 1a56e1fc2f8f359 3/0/0/407f800000000000/40dd87820eaba596/1/-7_1,0_2,2_2/4054000000000000,4054400000000000,403e000000000000,4054480000000000,4052000000000000/-2_1,0_2/4018000000000000,404ff00000000000,4056800000000000/ => 3/0/0/7ec784ab95e073c5/7f260c02d4c816c7/1/-7_1,0_2,2_2/7e9ddd4baa009302,7e9e3cdc9c2094d9,7e8665f8bf806e42,7e9e48ceba649514,7e9ae0c41900844f/-2_1,0_2/7e61eb2d66005835,7e97d84a69bc7561,7ea0cc7a8fa052b1/
div bff0000000000000 0/0/0/0/8000000000000000/0///// => 0/0/8000000000000000/8000000000000000/0/3/////
div 7ff8000000000001 -2/255bba08cf8c979d/0/0/0/3///// => -2/255bba08cf8c979d/7ff8000000000001/7ff8000000000001/7ff8000000000001/3/////
div 7ff8000000000001 -1/3fe0000000000000/3f41ba08ef905d23/4079f60237411df2/409d759dfbbedaf3/2/-10_3,1_1,1_4/0,403f000000000000,0,4056400000000000,4056c00000000000,405c980000000000,4056400000000000,3ff0000000000000/// => -1/3fe0000000000000/7ff8000000000001/7ff8000000000001/7ff8000000000001/2/-10_3,1_1,1_4/7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001///
div 1a56e1fc2f8f359 -53/0/0/405e580000000000/40b5df7791406273/3/0_1/405e580000000000///3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/7ea6a7ac65f66f85/7f00549f84476e65/3/0_1/7ea6a7ac65f66f85///3ff0000000000000,4000000000000000,4014000000000000
div 1a56e1fc2f8f359 -4/0/0/4050800000000000/407375ac3efd8df7/3/-16_1/4050800000000000/// => -4/0/0/7e98a35e6c407948/7ebd0ebe0fbccc92/3/-16_1/7e98a35e6c407948///
div 3fe0000000000000 -1/3f847ae147ae147b/4041000000000000/4041000000000000/c089975fb9ef71b1/0///// => -1/3f847ae147ae147b/4051000000000000/4051000000000000/c099975fb9ef71b1/0/////
div 3fe0000000000000 -53/0/0/3f5a49653ea126b6/3f942500c6e98104/0/1_3/0,3f46f469a2a9f6c4,3f4d9e60da9856a8///3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/3f6a49653ea126b6/3fa42500c6e98104/0/1_3/0,3f56f469a2a9f6c4,3f5d9e60da9856a8///3ff0000000000000,4000000000000000,4014000000000000
div 7ff0000000000000 -2/3f50624dd2f1a9fc/0/404d000000000000/409b040bcaaacc50/1/-14_1/404d000000000000/// => -2/3f50624dd2f1a9fc/0/0/0/1/-14_1/0///
div bff0000000000000 0/3f50624dd2f1a9fc/402a000000000000/408211023c598844/c0cf2fd41370a314/3/1_4,1_4,2_3/404c800000000000,0,4049900000000000,0,4037000000000000,3f233ec89a66f774,4058c00000000000,4058000000000000,4047400000000000,3f4185520176726c,0/4_3,0_2/3f3ae128b862e830,4050280000000000,404e000000000000,403d000000000000,4043700000000000/ => 0/3f50624dd2f1a9fc/c02a000000000000/c08211023c598844/40cf2fd41370a314/3/1_4,1_4,2_3/c04c800000000000,8000000000000000,c049900000000000,8000000000000000,c037000000000000,bf233ec89a66f774,c058c00000000000,c058000000000000,c047400000000000,bf4185520176726c,8000000000000000/4_3,0_2/bf3ae128b862e830,c050280000000000,c04e000000000000,c03d000000000000,c043700000000000/
div bff0000000000000 -4/255bba08cf8c979d/0/4063cc04e2b03e08/40b8a65601edffe5/1/-19_4/3f438ac0f822403e,4058c00000000000,401d800000000000,404a000000000000/// => -4/255bba08cf8c979d/8000000000000000/c063cc04e2b03e08/c0b8a65601edffe5/3/-19_4/bf438ac0f822403e,c058c00000000000,c01d800000000000,c04a000000000000///
div 0 -53/0/0/0/8000000000000000/1/////bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/fff8000000000000/fff8000000000000/fff8000000000000/1/////bff0000000000000,0,3fe0000000000000,4024000000000000
div 3fe0000000000000 2/0/0/0/8000000000000000/0///// => 2/0/0/0/8000000000000000/0/////
div 7ff0000000000000 5/255bba08cf8c979d/3f470a203f96b7dd/407fa409a7e4bc07/40c208eececd4f58/2/-4_1,2_3/4050400000000000,4051c00000000000,3f4a68fbd3c54304,0/-18_3,1_4,2_3/0,3f3701e4e7f69250,4053000000000000,4014000000000000,3f3fce80590e5290,4051500000000000,3ee8f5cb15e231ab,4051800000000000,4058400000000000,404a800000000000/ => 5/255bba08cf8c979d/0/0/0/2/-4_1,2_3/0,0,0,0/-18_3,1_4,2_3/0,0,0,0,0,0,0,0,0,0/
div 1a56e1fc2f8f359 1/3fe0000000000000/401a000000000000/4059600000000000/c0a54a444fa91b24/3/-20_4/0,4051800000000000,0,4039000000000000/// => 1/3fe0000000000000/7e6369712e805f8e/7ea2f1fbffd85d42/feefca750b6a4ca4/3/-20_4/0,7e9a21a234c080a2,0,7e82aa4f4a405be1///
div 7ff8000000000001 -53/0/0/0/8000000000000000/0/////3ff0000000000000,4000000000000000,4014000000000000 => -53/0/7ff8000000000001/7ff8000000000001/7ff8000000000001/0/////3ff0000000000000,4000000000000000,4014000000000000
div 0 5/3f847ae147ae147b/4055c00000000000/4068100000000000/40c31a4a1dea6b6f/3/9_2/4044c00000000000,4050000000000000/// => 5/3f847ae147ae147b/7ff0000000000000/7ff0000000000000/7ff0000000000000/3/////
div c008000000000000 -53/0/0/0/0/0/////4000000000000000 => -53/0/8000000000000000/8000000000000000/8000000000000000/3/////4000000000000000
div 0 0/255bba08cf8c979d/4056f80000000000/40713e0371fb1412/c0ab40a3c7d04f6c/3/-1_3/4055c00000000000,4054c00000000000,3f4b8fd8a08f3d1d/-10_2/0,402c000000000000/ => 0/255bba08cf8c979d/7ff0000000000000/7ff0000000000000/fff0000000000000/3/////
div 1a56e1fc2f8f359 0/3fe0000000000000/403b000000000000/40827f01b90bdb88/c0b972629c1412b4/3/-18_3,1_3,1_2/4040000000000000,4039000000000000,4057800000000000,0,404c800000000000,405a500000000000,4058c00000000000,404f900000000000/5_2,2_2/4010000000000000,404f400000000000,3f4b90bdb885a6f3,4037000000000000/ => 0/3fe0000000000000/7e84289312c0633b/7ecb9e6a4c0c8112/ff02ffb60165e1b9/3/-18_3,1_3,1_2/7e87e43c8800759b,7e82aa4f4a405be1,7ea18b9c73e0565e,0,7e954745e92068be,7ea3a52bc5d460b4,7ea27a86d1305af6,7e97909db4247400/5_2,2_2/7e57e43c8800759b,7e9754e31cd072da,7d9494a3c8ee0dde,7e812c0b81c05488/
div 3fe0000000000000 -53/0/0/0/8000000000000000/2/////3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/0/8000000000000000/2/////3ff0000000000000,4014000000000000,4024000000000000
div 7ff0000000000000 8/255bba08cf8c979d/0/404b500000000000/c0830261104ef92a/3/2_1,0_3/0,0,4046d00000000000,4022000000000000/// => 8/255bba08cf8c979d/0/0/8000000000000000/3/2_1,0_3/0,0,0,0///
div 7ff8000000000001 -2/3f50624dd2f1a9fc/0/4055d00000000000/40b0bc9e2a48ecb7/3/3_1,2_1/4037000000000000,4050100000000000/// => -2/3f50624dd2f1a9fc/7ff8000000000001/7ff8000000000001/7ff8000000000001/3/3_1,2_1/7ff8000000000001,7ff8000000000001///
div c008000000000000 5/3fe0000000000000/4031000000000000/4031000000000000/40865a0d2d31b685/1///// => 5/3fe0000000000000/c016aaaaaaaaaaab/c016aaaaaaaaaaab/c06dcd66e6ecf35c/3/////
div 1a56e1fc2f8f359 2/3fe0000000000000/0/406984089b4684c0/40cb7767b0c6889e/2/-18_3,0_4,2_2/3f4be2d516196f4c,3ff0000000000000,0,3f2a2913f3a0da24,0,4055000000000000,4042000000000000,0,4054c80000000000/// => 2/3fe0000000000000/0/7eb30ce330eeab5b/7f1481b93e7881d5/2/-18_3,0_4,2_2/7d94d1ee15f3b6c2,7e37e43c8800759b,0,7d73881c8177d49a,0,7e9f5b8f72809a5c,7e8ae0c41900844f,0,7e9f07f09ea498c0///
div 4000000000000000 5/3f847ae147ae147b/4056000000000000/4073c00000000000/40bce4bee98542da/2/-4_2,1_4/4050180000000000,403dc00000000000,4045600000000000,3ff2000000000000,0,4010000000000000/-17_2/0,4055800000000000/ => 5/3f847ae147ae147b/4046000000000000/4063c00000000000/40ace4bee98542da/2/-4_2,1_4/4040180000000000,402dc00000000000,4035600000000000,3fe2000000000000,0,4000000000000000/-17_2/0,4045800000000000/
div 7ff0000000000000 -53/0/0/0/8000000000000000/1/////4000000000000000 => -53/0/0/0/8000000000000000/1/////4000000000000000
div 7ff8000000000001 3/3fe0000000000000/4047000000000000/4047000000000000/40a32fcbdd848ae9/0///// => 3/3fe0000000000000/7ff8000000000001/7ff8000000000001/7ff8000000000001/0/////
div 7ff0000000000000 1/3fe0000000000000/4057600000000000/4084e8030f1a38fc/40b9734b0a57fa87/1/-5_4,0_1,2_2/4039000000000000,3f46787729405639,0,0,4050800000000000,4049800000000000,4057800000000000/-6_4,0_1,1_4/4052580000000000,3f4a792c6676de69,4035000000000000,0,4051000000000000,4047800000000000,0,4045000000000000,4056080000000000/ => 1/3fe0000000000000/0/0/0/1/-5_4,0_1,2_2/0,0,0,0,0,0,0/-6_4,0_1,1_4/0,0,0,0,0,0,0,0,0/
div bff0000000000000 -2/3fe0000000000000/3f41765190f842ca/40460012412e5a90/40927a89134481f8/3/-1_4,0_3/0,3ef95b9932e5a003,0,4030000000000000,0,4000000000000000,403a000000000000/// => -2/3fe0000000000000/bf41765190f842ca/c0460012412e5a90/c0927a89134481f8/3/-1_4,0_3/8000000000000000,bef95b9932e5a003,8000000000000000,c030000000000000,8000000000000000,c000000000000000,c03a000000000000///
div 7ff8000000000001 2/3f847ae147ae147b/4056c00000000000/4072e00000000000/40d3938606d0a407/3/9_3/4050c00000000000,4047800000000000,4058400000000000/// => 2/3f847ae147ae147b/7ff8000000000001/7ff8000000000001/7ff8000000000001/3/9_3/7ff8000000000001,7ff8000000000001,7ff8000000000001///
div 7ff0000000000000 -1/3f847ae147ae147b/404a000000000000/406500024b281148/408d197e780f6703/3/-3_4/4026000000000000,3f3259408a3f0d59,403d000000000000,4053000000000000/// => -1/3f847ae147ae147b/0/0/0/3/-3_4/0,0,0,0///
div 4000000000000000 -53/0/0/4034800000000000/4087e8d31f1fceb8/3/1_1/4034800000000000///3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/4024800000000000/4077e8d31f1fceb8/3/1_1/4024800000000000///3ff0000000000000,4000000000000000,4014000000000000
div bff0000000000000 -53/0/0/4034000000000000/4070229d6444497f/0/0_1/4034000000000000///4000000000000000 => -53/0/8000000000000000/c034000000000000/c070229d6444497f/3/0_1/c034000000000000///4000000000000000
div 1a56e1fc2f8f359 -53/0/0/0/0/2/////3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/0/0/2/////3ff0000000000000,4014000000000000,4024000000000000
div 0 8/3f847ae147ae147b/4031800000000000/4061d40c95ed9273/c09f646086c9e47c/0///1_4,0_1/403a000000000000,4030200000000000,4054c00000000000,3f423e26ba7ef909,3f500cc7c7a6fe56/ => 8/3f847ae147ae147b/7ff0000000000000/7ff0000000000000/fff0000000000000/0/////
div 4000000000000000 1/0/4022000000000000/407d440000000000/c0b81e6c35398b81/3/-15_3/404a000000000000,4055c00000000000,4050b80000000000/-5_2,0_3/4057800000000000,0,4046400000000000,4053780000000000,4042800000000000/ => 1/0/4012000000000000/406d440000000000/c0a81e6c35398b81/3/-15_3/403a000000000000,4045c00000000000,4040b80000000000/-5_2,0_3/4047800000000000,0,4036400000000000,4043780000000000,4032800000000000/
div 4000000000000000 8/3f50624dd2f1a9fc/4020000000000000/407d4c0000000000/c097b2dbbbefa7a6/1/-15_3,0_3/403c000000000000,0,404e000000000000,4056400000000000,4052280000000000,4054400000000000/-17_2,0_3/4056c80000000000,4042800000000000,0,4000000000000000,0/ => 8/3f50624dd2f1a9fc/4010000000000000/406d4c0000000000/c087b2dbbbefa7a6/1/-15_3,0_3/402c000000000000,0,403e000000000000,4046400000000000,4042280000000000,4044400000000000/-17_2,0_3/4046c80000000000,4032800000000000,0,3ff0000000000000,0/
div 0 -2/3f847ae147ae147b/0/4074de0229b3e62d/40cf6acae7b0cdcb/2/-3_4,2_1,1_3/3f26e84132ff7eb0,404c800000000000,4049800000000000,405ef80000000000,4052400000000000,0,403d000000000000,3f37271dc95184f5/// => -2/3f847ae147ae147b/fff8000000000000/7ff0000000000000/7ff0000000000000/2/////
div 7ff8000000000001 -2/0/4055a80000000000/4065f80000000000/c0ae8b0b4416a910/1/7_4/404f800000000000,4014800000000000,4035000000000000,0/// => -2/0/7ff8000000000001/7ff8000000000001/7ff8000000000001/1/7_4/7ff8000000000001,7ff8000000000001,7ff8000000000001,7ff8000000000001///
div 4000000000000000 3/0/0/4045000000000000/40a660c513c5bc85/2/9_2/4039000000000000,4031000000000000/// => 3/0/0/4035000000000000/409660c513c5bc85/2/9_2/4029000000000000,4021000000000000///
div 3fe0000000000000 -53/0/0/405dc00000000000/409f1e24370390ab/0/0_2,0_3/0,4010000000000000,4041000000000000,4054400000000000,0///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/406dc00000000000/40af1e24370390ab/0/0_2,0_3/0,4020000000000000,4051000000000000,4064400000000000,0///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000
div 4000000000000000 -53/0/0/4008014b0f804645/4060fe773c26ee19/1/0_3/3f44b0f804644cdf,0,4008000000000000///bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/3ff8014b0f804645/4050fe773c26ee19/1/0_3/3f34b0f804644cdf,0,3ff8000000000000///bff0000000000000,0,3fe0000000000000,4024000000000000
div bff0000000000000 -4/3f847ae147ae147b/0/406198037275413b/40aac3b565541b43/0/2_1,0_2/4050c00000000000,403f000000000000,3f32d62153b2e148/-10_3,1_1/4028000000000000,0,403ec00000000000,3f217b116c51edd5/ => -4/3f847ae147ae147b/8000000000000000/c06198037275413b/c0aac3b565541b43/3/2_1,0_2/c050c00000000000,c03f000000000000,bf32d62153b2e148/-10_3,1_1/c028000000000000,8000000000000000,c03ec00000000000,bf217b116c51edd5/
div 0 1/255bba08cf8c979d/4047000000000000/407178008f54aaf4/40c5b258961e7c2c/3/-16_1,0_4/403dc00000000000,4051280000000000,4051000000000000,3f21ea955e71c4cb,4050c80000000000/// => 1/255bba08cf8c979d/7ff0000000000000/7ff0000000000000/7ff0000000000000/3/////
div 0 -53/0/0/405ac00486270629/40a9ff87debd359e/1/0_1,1_2/3f32189c18a3ea15,404c800000000000,4049000000000000///3ff0000000000000,4000000000000000,4014000000000000 => -53/0/fff8000000000000/7ff0000000000000/7ff0000000000000/1/////3ff0000000000000,4000000000000000,4014000000000000
div 3fe0000000000000 -53/0/0/0/0/0/////3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/0/0/0/////3ff0000000000000,4000000000000000,4014000000000000
div 4000000000000000 5/3fe0000000000000/0/0/0/0///// => 5/3fe0000000000000/0/0/0/0/////
div 3fe0000000000000 -53/0/0/0/0/1/////bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/0/0/1/////bff0000000000000,0,3fe0000000000000,4024000000000000
div 1a56e1fc2f8f359 5/255bba08cf8c979d/3f39f171a3339598/4060800d8f103059/40b06ee0eacd86cd/0/-8_4,0_1/0,3f4e51cf106ef985,3f35e371beb61a86,404c000000000000,4053000000000000/// => 5/255bba08cf8c979d/7d835e9309ef775e/7ea8a372ab51b136/7ef889cd8213c3a1/0/-8_4,0_1/0,7d96a30d1165384e,7d805797b2fdedff,7e94e7b4f70066e8,7e9c5f07e1808ba9///
div bff0000000000000 5/3f50624dd2f1a9fc/0/4071d40000000000/c097b1812ca5a24b/2/-20_2,1_3/4032e00000000000,0,4057000000000000,4050100000000000,4049100000000000/-12_1/404e000000000000/ => 5/3f50624dd2f1a9fc/8000000000000000/c071d40000000000/4097b1812ca5a24b/3/-20_2,1_3/c032e00000000000,8000000000000000,c057000000000000,c050100000000000,c049100000000000/-12_1/c04e000000000000/
div c008000000000000 -53/0/0/4040801809b6ba0d/c08acbc1d2a5ae46/3/1_2/3f4809b6ba0d2783,4040800000000000///bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/8000000000000000/c02600200cf3a2bc/4071dd2be1c3c984/3/1_2/bf300679d15e1a57,c026000000000000///bff0000000000000,0,3fe0000000000000,4024000000000000
div 3fe0000000000000 -53/0/0/0/0/0/////3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/0/0/0/////3ff0000000000000,4000000000000000,4014000000000000
div bff0000000000000 2/3f847ae147ae147b/0/0/0/0///// => 2/3f847ae147ae147b/8000000000000000/8000000000000000/8000000000000000/3/////
div 3fe0000000000000 -53/0/0/405a000000000000/40b8fb3d5c1fe3af/1/0_1,0_1/4057000000000000,4028000000000000///bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/406a000000000000/40c8fb3d5c1fe3af/1/0_1,0_1/4067000000000000,4038000000000000///bff0000000000000,0,3fe0000000000000,4024000000000000
div bff0000000000000 -1/3f847ae147ae147b/0/404a3036722cd802/408605197a2463a7/1/8_4,2_2/402cc00000000000,4043000000000000,3f42c6c43c712d00,0,3f231c12bebed4f0,3f4ee463ebe124cb/// => -1/3f847ae147ae147b/8000000000000000/c04a3036722cd802/c08605197a2463a7/3/8_4,2_2/c02cc00000000000,c043000000000000,bf42c6c43c712d00,8000000000000000,bf231c12bebed4f0,bf4ee463ebe124cb///
div c008000000000000 3/255bba08cf8c979d/404f000000000000/404f000000000000/4084102a10652819/1///// => 3/255bba08cf8c979d/c034aaaaaaaaaaab/c034aaaaaaaaaaab/c06ac03815dc3577/3/////
div 7ff0000000000000 5/3f847ae147ae147b/0/4057c004345349df/40b34e5aefd68e70/3/9_1,1_2/403f000000000000,4050000000000000,3f30d14d277aaa36/// => 5/3f847ae147ae147b/0/0/0/3/9_1,1_2/0,0,0///
div 1a56e1fc2f8f359 -2/0/0/40712801e670ab65/40c74a53a1608859/0/-6_4,0_1,2_1/405e600000000000,0,4058000000000000,4045000000000000,402e000000000000,3f3e670ab64ee670/// => -2/0/0/7eb99e3dbe316a54/7f116389be343967/0/-6_4,0_1,2_1/7ea6ada575186fa3,0,7ea1eb2d66005835,7e8f5b8f72809a5c,7e7665f8bf806e42,7d86b2e761c61ae2///
div 1a56e1fc2f8f359 3/3f847ae147ae147b/0/4054c80000000000/c05c01adb7e36858/2///-6_1/4054c80000000000/ => 3/3f847ae147ae147b/0/7e9f07f09ea498c0/fea4e8f5cc16e94d/2///-6_1/7e9f07f09ea498c0/
div bff0000000000000 3/3fe0000000000000/3f5058bc77f4fda0/407450065c643d6e/40c9041cf81f6207/1/8_1/4050800000000000/5_2,2_4/4051800000000000,3f3f76dc3b060e6c,404e000000000000,3f13b1d6f0139b52,404c000000000000,4052400000000000/ => 3/3fe0000000000000/bf5058bc77f4fda0/c07450065c643d6e/c0c9041cf81f6207/3/8_1/c050800000000000/5_2,2_4/c051800000000000,bf3f76dc3b060e6c,c04e000000000000,bf13b1d6f0139b52,c04c000000000000,c052400000000000/
div bff0000000000000 -2/3f847ae147ae147b/0/406e4003cf262f14/c09852734f6e1bda/0/-2_3,1_2,0_4/404e900000000000,0,0,4047700000000000,4039000000000000,3f3e7931789c0afa,4054800000000000,4036000000000000,4014000000000000/// => -2/3f847ae147ae147b/8000000000000000/c06e4003cf262f14/409852734f6e1bda/3/-2_3,1_2,0_4/c04e900000000000,8000000000000000,8000000000000000,c047700000000000,c039000000000000,bf3e7931789c0afa,c054800000000000,c036000000000000,c014000000000000///
div 1a56e1fc2f8f359 -1/255bba08cf8c979d/0/0/0/0///// => -1/255bba08cf8c979d/0/0/0/0/////
div c008000000000000 -53/0/0/404b000cf47e299e/4092684384254a03/2/0_2/3f39e8fc533c0b6a,404b000000000000///4000000000000000 => -53/0/8000000000000000/c0320008a2fec669/c0788b04b031b804/3/0_2/bf2145fd8cd2b247,c032000000000000///4000000000000000
div 1a56e1fc2f8f359 -4/3f50624dd2f1a9fc/0/4008000000000000/c0517b79739b8d0b/3/3_4/0,4008000000000000,0,0/// => -4/3f50624dd2f1a9fc/0/7e51eb2d66005835/fe9a1ae03c807db8/3/3_4/0,7e51eb2d66005835,0,0///
div bff0000000000000 1/3fe0000000000000/0/406660000dabd897/c0ac40e00ee10a9d/1/-10_2,0_1,2_1/404c000000000000,3edb57b12dfcf101,4052c00000000000,4048000000000000/// => 1/3fe0000000000000/8000000000000000/c06660000dabd897/40ac40e00ee10a9d/3/-10_2,0_1,2_1/c04c000000000000,bedb57b12dfcf101,c052c00000000000,c048000000000000///
div 7ff0000000000000 -2/0/4058080000000000/4077d40000000000/40d27ee42bde0475/1/9_2/4032e00000000000,4053400000000000/8_4/4052400000000000,0,0,405d100000000000/ => -2/0/0/0/0/1/9_2/0,0/8_4/0,0,0,0/
div bff0000000000000 2/3f50624dd2f1a9fc/0/4073080000000000/40a001e90d7594a5/3/-4_4,0_2/404b000000000000,4044a00000000000,4014000000000000,4050400000000000,4038000000000000,0/-5_2/4028000000000000,4059d00000000000/ => 2/3f50624dd2f1a9fc/8000000000000000/c073080000000000/c0a001e90d7594a5/3/-4_4,0_2/c04b000000000000,c044a00000000000,c014000000000000,c050400000000000,c038000000000000,8000000000000000/-5_2/c028000000000000,c059d00000000000/
div 7ff0000000000000 1/255bba08cf8c979d/401d000000000000/401d000000000000/40671dbdfa898d5d/3///// => 1/255bba08cf8c979d/0/0/0/3/////
div c008000000000000 -53/0/0/4054d8150b94d2b3/4078311f53d604f1/1/0_1,1_3/4008000000000000,3f3bcb24d58d0d9c,4054180000000000,3f4c31973a9f5ea5///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/8000000000000000/c03bcac6ba1bc399/c06020bf8d3958a1/3/0_1,1_3/bff0000000000000,bf22876de3b35e68,c03acaaaaaaaaaab,bf32cbba2714e9c3///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000
div 4000000000000000 -4/255bba08cf8c979d/4055c00000000000/40743002144150f4/40b416e4035b46cc/0/2_4,1_2/4047800000000000,3f40a20a87a04cec,403e000000000000,403c000000000000,404b000000000000,4053400000000000/// => -4/255bba08cf8c979d/4045c00000000000/40643002144150f4/40a416e4035b46cc/0/2_4,1_2/4037800000000000,3f30a20a87a04cec,402e000000000000,402c000000000000,403b000000000000,4043400000000000///
div 0 3/3f847ae147ae147b/0/407f9e013aeb5f3c/40b939693dd31741/2/9_2,0_3/0,3f33aeb5f3c0bf07,4055800000000000,4058280000000000,405a900000000000/-7_1,1_4/4049000000000000,4057c00000000000,4052000000000000,0,0/ => 3/3f847ae147ae147b/fff8000000000000/7ff0000000000000/7ff0000000000000/2/////
div 0 -4/3f847ae147ae147b/0/4069600000000000/40c215d36c872b38/0/-19_1,0_2,2_1/401c000000000000,0,4058c00000000000,4058400000000000/// => -4/3f847ae147ae147b/fff8000000000000/7ff0000000000000/7ff0000000000000/0/////
div 7ff0000000000000 5/255bba08cf8c979d/0/4052c80000000000/40a0010f7ee2a610/2/5_2/402e400000000000,404e000000000000/// => 5/255bba08cf8c979d/0/0/0/2/5_2/0,0///
div 4000000000000000 -53/0/0/405e400000000000/40ae5bd29c4fcf33/2/1_3/4043000000000000,4054c00000000000,0///3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/404e400000000000/409e5bd29c4fcf33/2/1_3/4033000000000000,4044c00000000000,0///3ff0000000000000,4014000000000000,4024000000000000
div 7ff0000000000000 -2/3fe0000000000000/0/0/8000000000000000/0///// => -2/3fe0000000000000/0/0/8000000000000000/0/////
div 7ff0000000000000 0/3fe0000000000000/0/407792014bd580ac/40c78e9f75c8b056/1///-17_3,1_1,1_3/405c880000000000,4054400000000000,4056800000000000,0,3f34bd580ac21b17,404e000000000000,4040000000000000/ => 0/3fe0000000000000/0/0/0/1///-17_3,1_1,1_3/0,0,0,0,0,0,0/
compact - -1/255bba08cf8c979d/3f2ff1e409c9b20b/4077de0a029ce4ac/c0a0796f4edcc7cf/2/-15_4,2_2,2_2/4054f80000000000,405a000000000000,403c000000000000,3f45bb7aaed13ac1,4038000000000000,4046000000000000,3f4778861ae7f49c,4050c00000000000/-15_1,1_2,0_1/3f1621453fa62ae6,3f482044b13dac68,403f000000000000,0/ => -1/255bba08cf8c979d/3f2ff1e409c9b20b/4077de0a029ce4ac/c0a0796f4edcc7cf/2/-15_4,2_2,2_2/4054f80000000000,405a000000000000,403c000000000000,3f45bb7aaed13ac1,4038000000000000,4046000000000000,3f4778861ae7f49c,4050c00000000000/-15_1,1_2/3f1621453fa62ae6,3f482044b13dac68,403f000000000000/
compact - 0/3f50624dd2f1a9fc/0/4071c000b8a7b41e/40d0886b4e580c56/2/6_1,1_2,2_4/4057c00000000000,0,3f2714f683c3dec5,0,4052a80000000000,4058580000000000,4031000000000000/// => 0/3f50624dd2f1a9fc/0/4071c000b8a7b41e/40d0886b4e580c56/2/6_1,2_1,3_3/4057c00000000000,3f2714f683c3dec5,4052a80000000000,4058580000000000,4031000000000000///
compact - -4/3f50624dd2f1a9fc/4049000000000000/406b400000000000/40c6e7fe56eb025a/0/-1_3,0_1/4048000000000000,4038000000000000,4041000000000000,404f000000000000/// => -4/3f50624dd2f1a9fc/4049000000000000/406b400000000000/40c6e7fe56eb025a/0/-1_4/4048000000000000,4038000000000000,4041000000000000,404f000000000000///
compact - -4/255bba08cf8c979d/0/4072a8007e1431db/40a978c7aba95040/3/0_4,0_3,2_1/3f1f850c76cb4fde,403b000000000000,4052c00000000000,4040000000000000,0,4058400000000000,404c000000000000,4027000000000000/// => -4/255bba08cf8c979d/0/4072a8007e1431db/40a978c7aba95040/3/0_4,1_2,2_1/3f1f850c76cb4fde,403b000000000000,4052c00000000000,4040000000000000,4058400000000000,404c000000000000,4027000000000000///
compact - 0/255bba08cf8c979d/0/406ffc019de6fe2d/40c0806283902bb3/3/-8_3/4054500000000000,4053c00000000000,0/-20_2,1_2/0,4053400000000000,4032a00000000000,3f29de6fe2cceea5/ => 0/255bba08cf8c979d/0/406ffc019de6fe2d/40c0806283902bb3/3/-8_2/4054500000000000,4053c00000000000/-19_1,1_2/4053400000000000,4032a00000000000,3f29de6fe2cceea5/
compact - 0/255bba08cf8c979d/0/4080780000000000/c08f59c6770210a2/2/-2_4/4052000000000000,4052800000000000,4058380000000000,404c800000000000/6_3/4054080000000000,4051c00000000000,4053000000000000/ => 0/255bba08cf8c979d/0/4080780000000000/c08f59c6770210a2/2/-2_4/4052000000000000,4052800000000000,4058380000000000,404c800000000000/6_3/4054080000000000,4051c00000000000,4053000000000000/
compact - 3/3f847ae147ae147b/0/40721001b7c03838/40c8a65f4bbb446e/1/0_3,0_4/4055000000000000,4054800000000000,404c800000000000,3f3b7c038378ea36,4046800000000000,0,4035000000000000/// => 3/3f847ae147ae147b/0/40721001b7c03838/40c8a65f4bbb446e/1/0_5,1_1/4055000000000000,4054800000000000,404c800000000000,3f3b7c038378ea36,4046800000000000,4035000000000000///
compact - -2/0/4033000000000000/4033000000000000/4092c741b67d5d53/0///// => -2/0/4033000000000000/4033000000000000/4092c741b67d5d53/0/////
compact - -2/255bba08cf8c979d/3eff53cf386ecbbb/40714a0177c23a13/c0bea4fa8a74656c/3/-9_3,0_2,2_1/404b000000000000,3f3586e6adac6a75,4037000000000000,0,405e680000000000,4053800000000000/// => -2/255bba08cf8c979d/3eff53cf386ecbbb/40714a0177c23a13/c0bea4fa8a74656c/3/-9_3,1_1,2_1/404b000000000000,3f3586e6adac6a75,4037000000000000,405e680000000000,4053800000000000///
compact - -2/3f847ae147ae147b/4041800000000000/405e400000000000/40b6ca8498a6d2d4/2///7_1/4055800000000000/ => -2/3f847ae147ae147b/4041800000000000/405e400000000000/40b6ca8498a6d2d4/2///7_1/4055800000000000/
compact - -53/0/0/0/0/2/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/0/0/2/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000
compact - 3/255bba08cf8c979d/0/403e000000000000/408b4897b2a4382e/2/-11_1/403e000000000000/// => 3/255bba08cf8c979d/0/403e000000000000/408b4897b2a4382e/2/-11_1/403e000000000000///
compact - -1/3f847ae147ae147b/4052800000000000/40789a03a6bf2ae8/40d9543fa23b8260/0/-18_2,1_2,1_2/403a000000000000,3f4d35f957443ffa,4058000000000000,4058400000000000,4045d00000000000,404c800000000000/// => -1/3f847ae147ae147b/4052800000000000/40789a03a6bf2ae8/40d9543fa23b8260/0/-18_2,1_2,1_2/403a000000000000,3f4d35f957443ffa,4058000000000000,4058400000000000,4045d00000000000,404c800000000000///
compact - -4/0/0/407710045dcd7e56/c0bc9472d8e50bae/0/-10_4,0_2/4052000000000000,0,0,0,4053000000000000,3f16fb546efeedd7/-15_2,1_4,0_2/4053000000000000,4057000000000000,0,401c000000000000,3f50035b9fb1992d,4039000000000000,3eb0944ae18ccf27,4035000000000000/ => -4/0/0/407710045dcd7e56/c0bc9472d8e50bae/0/-10_1,3_2/4052000000000000,4053000000000000,3f16fb546efeedd7/-15_2,2_5/4053000000000000,4057000000000000,401c000000000000,3f50035b9fb1992d,4039000000000000,3eb0944ae18ccf27,4035000000000000/
compact - -1/3f847ae147ae147b/0/4070fc0000000000/40c62587e7433da2/3///8_3,1_2,1_1/404f600000000000,0,4042800000000000,4058000000000000,4042000000000000,4044000000000000/ => -1/3f847ae147ae147b/0/4070fc0000000000/40c62587e7433da2/3///8_1,1_1,1_2,1_1/404f600000000000,4042800000000000,4058000000000000,4042000000000000,4044000000000000/
compact - -53/0/0/4053800000000000/409b4b815e4b3110/0/0_2/403d000000000000,4048800000000000///4000000000000000 => -53/0/0/4053800000000000/409b4b815e4b3110/0/0_2/403d000000000000,4048800000000000///4000000000000000
compact - 1/255bba08cf8c979d/0/40340054ac768d8f/4077568ec1faa58a/2/-7_3/3f4a030994666715,3f405331b2610325,4034000000000000/// => 1/255bba08cf8c979d/0/40340054ac768d8f/4077568ec1faa58a/2/-7_3/3f4a030994666715,3f405331b2610325,4034000000000000///
compact - -2/3fe0000000000000/4041800000000000/4073e401a10614d4/408463433d7d611c/2/6_3/4040c00000000000,4028400000000000,0/-5_3,1_4/4000000000000000,3f3a10614d3c58e3,4041d00000000000,4050400000000000,4046000000000000,0,4056c00000000000/ => -2/3fe0000000000000/4041800000000000/4073e401a10614d4/408463433d7d611c/2/6_2/4040c00000000000,4028400000000000/-5_3,1_2,1_1/4000000000000000,3f3a10614d3c58e3,4041d00000000000,4050400000000000,4046000000000000,4056c00000000000/
compact - -2/3f50624dd2f1a9fc/0/407a4601b3deb2e6/40bc68cf9c806fe1/2/-18_4,1_2,1_1/404b000000000000,0,0,0,3f25bbeceb21b1b5,403e000000000000,4046000000000000/-19_4,2_4,0_1/403b200000000000,3f305ff4b8c83593,0,4022000000000000,0,4018000000000000,405c900000000000,404a800000000000,4054c00000000000/ => -2/3f50624dd2f1a9fc/0/407a4601b3deb2e6/40bc68cf9c806fe1/2/-18_1,4_2,1_1/404b000000000000,3f25bbeceb21b1b5,403e000000000000,4046000000000000/-19_2,1_1,3_4/403b200000000000,3f305ff4b8c83593,4022000000000000,4018000000000000,405c900000000000,404a800000000000,4054c00000000000/
compact - -53/0/0/403000050242f2c8/c06dcea534bbfaa2/0/1_2/3f14090bcb2117da,4030000000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/403000050242f2c8/c06dcea534bbfaa2/0/1_2/3f14090bcb2117da,4030000000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000
compact - 5/255bba08cf8c979d/0/407660015d0e2e86/40cec3181814ccbf/2/-6_4,0_1,0_3/4030000000000000,4020000000000000,4028000000000000,4054800000000000,4049800000000000,404a800000000000,4052000000000000,4050000000000000/5_1/3f35d0e2e8591a4b/ => 5/255bba08cf8c979d/0/407660015d0e2e86/40cec3181814ccbf/2/-6_8/4030000000000000,4020000000000000,4028000000000000,4054800000000000,4049800000000000,404a800000000000,4052000000000000,4050000000000000/5_1/3f35d0e2e8591a4b/
compact - 1/3f50624dd2f1a9fc/0/4022000000000000/4070e79ba389878c/3/-10_1/4022000000000000/// => 1/3f50624dd2f1a9fc/0/4022000000000000/4070e79ba389878c/3/-10_1/4022000000000000///
compact - 5/0/0/0/0/3///// => 5/0/0/0/0/3/////
compact - -1/3fe0000000000000/0/406db80f11ab9459/40c21f6a773b668f/1/0_2,1_3,2_3/4057f80000000000,3f24fa8cd34cfde7,404a700000000000,3f4d7aeb5c3a5c88,3f407e47f86bd8bf,4056400000000000,0,3f321daf8fcf1e43/// => -1/3fe0000000000000/0/406db80f11ab9459/40c21f6a773b668f/1/0_2,1_3,2_1,1_1/4057f80000000000,3f24fa8cd34cfde7,404a700000000000,3f4d7aeb5c3a5c88,3f407e47f86bd8bf,4056400000000000,3f321daf8fcf1e43///
compact - 3/3fe0000000000000/4054c00000000000/4054c00000000000/40b69004e0582b10/0///// => 3/3fe0000000000000/4054c00000000000/4054c00000000000/40b69004e0582b10/0/////
compact - -2/3f50624dd2f1a9fc/4045000000000000/4045000000000000/c07aa4ed89199d43/0///// => -2/3f50624dd2f1a9fc/4045000000000000/4045000000000000/c07aa4ed89199d43/0/////
compact - -4/3fe0000000000000/0/0/0/2///// => -4/3fe0000000000000/0/0/0/2/////
compact - -53/0/0/0/8000000000000000/3/0_1/0///bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/0/8000000000000000/3/////bff0000000000000,0,3fe0000000000000,4024000000000000
compact - 0/255bba08cf8c979d/3f4292956f6ca6cc/4062600e04910742/408ac4863ac881aa/2/8_1/403d000000000000/5_4,0_1/3f4a0f822e622d99,3f36e058fe715e83,404d800000000000,4039000000000000,4041000000000000/ => 0/255bba08cf8c979d/3f4292956f6ca6cc/4062600e04910742/408ac4863ac881aa/2/8_1/403d000000000000/5_5/3f4a0f822e622d99,3f36e058fe715e83,404d800000000000,4039000000000000,4041000000000000/
compact - 2/0/0/4070700276d4a855/40d0314bb21a5d6d/1/2_1,0_3,1_3/4008000000000000,402e000000000000,4057c00000000000,3f43b6a542a5349d,4050800000000000,402c000000000000,4051800000000000/// => 2/0/0/4070700276d4a855/40d0314bb21a5d6d/1/2_4,1_3/4008000000000000,402e000000000000,4057c00000000000,3f43b6a542a5349d,4050800000000000,402c000000000000,4051800000000000///
compact - 1/3f847ae147ae147b/0/4053300b3845b085/409a3e0ed2fd4e4d/3/9_4,0_2/3f46708b610a75f7,4039000000000000,4038000000000000,0,4035000000000000,401b000000000000/// => 1/3f847ae147ae147b/0/4053300b3845b085/409a3e0ed2fd4e4d/3/9_3,1_2/3f46708b610a75f7,4039000000000000,4038000000000000,4035000000000000,401b000000000000///
compact - -1/3f847ae147ae147b/404f500000000000/404f500000000000/c07feb71faad153d/2///// => -1/3f847ae147ae147b/404f500000000000/404f500000000000/c07feb71faad153d/2/////
compact - 8/0/0/0/0/3///// => 8/0/0/0/0/3/////
compact - 2/0/0/0/0/1///// => 2/0/0/0/0/1/////
compact - -53/0/0/405f780000000000/40c02cbb3a403365/3/1_3/4039000000000000,4053380000000000,4038000000000000///bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/405f780000000000/40c02cbb3a403365/3/1_3/4039000000000000,4053380000000000,4038000000000000///bff0000000000000,0,3fe0000000000000,4024000000000000
compact - -53/0/0/4066a40000000000/408616e11de065a0/3/0_1,1_2,0_1/4045000000000000,404f100000000000,0,4053400000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/4066a40000000000/408616e11de065a0/3/0_1,1_1,1_1/4045000000000000,404f100000000000,4053400000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000
compact - -2/255bba08cf8c979d/0/405af80000000000/c0a5471224f2fd47/2/-11_3/404e800000000000,4044000000000000,401b800000000000/// => -2/255bba08cf8c979d/0/405af80000000000/c0a5471224f2fd47/2/-11_3/404e800000000000,4044000000000000,401b800000000000///
compact - -53/0/0/4064a00000000000/40b133e9cb93bcaf/0/0_1,2_1/4051c00000000000,4057800000000000///3ff0000000000000,4000000000000000,4014000000000000 => -53/0/0/4064a00000000000/40b133e9cb93bcaf/0/0_1,2_1/4051c00000000000,4057800000000000///3ff0000000000000,4000000000000000,4014000000000000
compact - -53/0/0/0/0/2/////4000000000000000 => -53/0/0/0/0/2/////4000000000000000
compact - 5/3f847ae147ae147b/0/4078400000000000/40d67a7f3d1e47f3/3/0_1,0_3/0,4058400000000000,4052400000000000,404b800000000000/-4_1,2_1,0_2/403f000000000000,4044800000000000,4044800000000000,4049000000000000/ => 5/3f847ae147ae147b/0/4078400000000000/40d67a7f3d1e47f3/3/1_3/4058400000000000,4052400000000000,404b800000000000/-4_1,2_3/403f000000000000,4044800000000000,4044800000000000,4049000000000000/
compact - 0/255bba08cf8c979d/4041800000000000/4067bc05e9996d68/c0b59c39a869906e/0/-10_2,2_3,1_4/4045500000000000,4018000000000000,402c000000000000,0,4044800000000000,4047a00000000000,0,4010000000000000,3f47a665b5a1dd79/// => 0/255bba08cf8c979d/4041800000000000/4067bc05e9996d68/c0b59c39a869906e/0/-10_2,2_1,1_1,1_1,1_2/4045500000000000,4018000000000000,402c000000000000,4044800000000000,4047a00000000000,4010000000000000,3f47a665b5a1dd79///
compact - 5/255bba08cf8c979d/4043800000000000/406c7006878461a7/40b453b90d628676/0/-15_1,0_2,1_3/404c400000000000,0,4056000000000000,4046000000000000,0,3f4a1e11869cfde2/// => 5/255bba08cf8c979d/4043800000000000/406c7006878461a7/40b453b90d628676/0/-15_1,1_1,1_1,1_1/404c400000000000,4056000000000000,4046000000000000,3f4a1e11869cfde2///
compact - -53/0/0/405c8004e14ce990/40a19cac3dc6c470/2/1_3/4057400000000000,4035000000000000,3f338533a640b650///bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/405c8004e14ce990/40a19cac3dc6c470/2/1_3/4057400000000000,4035000000000000,3f338533a640b650///bff0000000000000,0,3fe0000000000000,4024000000000000
compact - 3/3f50624dd2f1a9fc/0/405b800000000000/c0a9c78b9e62af72/0///-10_3/4045000000000000,0,4051000000000000/ => 3/3f50624dd2f1a9fc/0/405b800000000000/c0a9c78b9e62af72/0///-10_1,1_1/4045000000000000,4051000000000000/
compact - -4/255bba08cf8c979d/0/4063200f2c9968df/40b6443076a23dd1/0/4_4,1_1,0_3/3f316f226294c7dd,4035000000000000,4036000000000000,3f43906f1624f231,4047000000000000,4050000000000000,0,3f503532ae065bce/// => -4/255bba08cf8c979d/0/4063200f2c9968df/40b6443076a23dd1/0/4_4,1_2,1_1/3f316f226294c7dd,4035000000000000,4036000000000000,3f43906f1624f231,4047000000000000,4050000000000000,3f503532ae065bce///
compact - -53/0/0/0/8000000000000000/3/////4000000000000000 => -53/0/0/0/8000000000000000/3/////4000000000000000
compact - 2/3fe0000000000000/403d000000000000/407ac805dacca68e/40c4724e4014c0e1/2/-9_1,2_3/4055e00000000000,3f4b947c6d075c2f,402c800000000000,0/-8_4,1_1,1_4/4033000000000000,4008000000000000,3f4341e8c768c373,0,0,4026000000000000,4055b00000000000,4058800000000000,4054000000000000/ => 2/3fe0000000000000/403d000000000000/407ac805dacca68e/40c4724e4014c0e1/2/-9_1,2_2/4055e00000000000,3f4b947c6d075c2f,402c800000000000/-8_3,4_4/4033000000000000,4008000000000000,3f4341e8c768c373,4026000000000000,4055b00000000000,4058800000000000,4054000000000000/
compact - -1/3f847ae147ae147b/4030000000000000/40765e042d3d5e09/40cccf99cca28892/2/-4_3,1_1,2_1/3f49987224246ddc,3f2f45e330833c72,404d700000000000,4050c00000000000,4052000000000000/-10_1,0_3/4051800000000000,0,0,4052800000000000/ => -1/3f847ae147ae147b/4030000000000000/40765e042d3d5e09/40cccf99cca28892/2/-4_3,1_1,2_1/3f49987224246ddc,3f2f45e330833c72,404d700000000000,4050c00000000000,4052000000000000/-10_1,2_1/4051800000000000,4052800000000000/
compact - -1/255bba08cf8c979d/404a800000000000/4074640154381394/40be0c0fdef35dbc/3/-10_4,1_1,0_2/4055c00000000000,4025c00000000000,0,4052580000000000,403e000000000000,3f3543813938c266,4052000000000000/// => -1/255bba08cf8c979d/404a800000000000/4074640154381394/40be0c0fdef35dbc/3/-10_2,1_1,1_3/4055c00000000000,4025c00000000000,4052580000000000,403e000000000000,3f3543813938c266,4052000000000000///
compact - -1/3f847ae147ae147b/0/40674001e4e2f961/40c2490b676865e3/3/-7_2/4051c00000000000,4042800000000000/-3_1,2_1/4053800000000000,3f2e4e2f960ada05/ => -1/3f847ae147ae147b/0/40674001e4e2f961/40c2490b676865e3/3/-7_2/4051c00000000000,4042800000000000/-3_1,2_1/4053800000000000,3f2e4e2f960ada05/
compact - 3/3f50624dd2f1a9fc/0/4077ec0588dcdddd/40d6b6a967cfae33/0/9_4,1_3,2_1/0,3f479000360b4d17,0,3f44b6e6b8db3705,4058800000000000,0,4051400000000000,4054400000000000/-2_4,1_1/4047800000000000,0,4051700000000000,4032000000000000,0/ => 3/3f50624dd2f1a9fc/0/4077ec0588dcdddd/40d6b6a967cfae33/0/10_1,1_1,1_1,1_1,2_1/3f479000360b4d17,3f44b6e6b8db3705,4058800000000000,4051400000000000,4054400000000000/-2_1,1_2/4047800000000000,4051700000000000,4032000000000000/
compact - 5/255bba08cf8c979d/0/0/8000000000000000/1///// => 5/255bba08cf8c979d/0/0/8000000000000000/1/////
compact - 1/3f50624dd2f1a9fc/4025400000000000/40556804e6610178/40b175437a4b65a7/3/-9_4/3f33998405e0b592,0,4043000000000000,4042800000000000/// => 1/3f50624dd2f1a9fc/4025400000000000/40556804e6610178/40b175437a4b65a7/3/-9_1,1_2/3f33998405e0b592,4043000000000000,4042800000000000///
compact - 8/3fe0000000000000/4045000000000000/4045000000000000/407081b122690c06/3///// => 8/3fe0000000000000/4045000000000000/4045000000000000/407081b122690c06/3/////
compact - 0/3f847ae147ae147b/0/0/0/1///// => 0/3f847ae147ae147b/0/0/0/1/////
compact - 8/255bba08cf8c979d/0/406c380000000000/40b3f94f5f044178/0///-20_3,1_1/4024000000000000,405ef00000000000,4056c00000000000,3ff0000000000000/ => 8/255bba08cf8c979d/0/406c380000000000/40b3f94f5f044178/0///-20_3,1_1/4024000000000000,405ef00000000000,4056c00000000000,3ff0000000000000/
compact - -53/0/0/0/0/2/////bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/0/0/2/////bff0000000000000,0,3fe0000000000000,4024000000000000
compact - 1/3fe0000000000000/4044800000000000/4078e60157f946be/40c0d068cea7209e/0/9_2,1_4,1_3/4000000000000000,4052e80000000000,4042800000000000,404ee00000000000,3ef85b0f0ed6e947,4024000000000000,3f33f9e37af00ef0,4055000000000000,4055c00000000000/// => 1/3fe0000000000000/4044800000000000/4078e60157f946be/40c0d068cea7209e/0/9_2,1_4,1_3/4000000000000000,4052e80000000000,4042800000000000,404ee00000000000,3ef85b0f0ed6e947,4024000000000000,3f33f9e37af00ef0,4055000000000000,4055c00000000000///
compact - -1/3fe0000000000000/0/0/0/1///// => -1/3fe0000000000000/0/0/0/1/////
compact - -2/0/0/40528002cd4523e8/40b08f846d26322c/0/-9_3/0,3f266a291f3ee024,4052800000000000/// => -2/0/0/40528002cd4523e8/40b08f846d26322c/0/-8_2/3f266a291f3ee024,4052800000000000///
compact - -53/0/0/0/0/3/////bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/0/0/3/////bff0000000000000,0,3fe0000000000000,4024000000000000
compact - 2/3f50624dd2f1a9fc/0/405da00000000000/c0a97638999d3745/3/-1_3,1_4/4040800000000000,4020000000000000,401c000000000000,4041300000000000,4010800000000000,4040000000000000,0/// => 2/3f50624dd2f1a9fc/0/405da00000000000/c0a97638999d3745/3/-1_3,1_3/4040800000000000,4020000000000000,401c000000000000,4041300000000000,4010800000000000,4040000000000000///
compact - -53/0/0/0/0/0/////4000000000000000 => -53/0/0/0/0/0/////4000000000000000
compact - -53/0/0/0/0/3/////bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/0/0/3/////bff0000000000000,0,3fe0000000000000,4024000000000000
compact - 0/255bba08cf8c979d/0/0/0/3/-8_1/0/// => 0/255bba08cf8c979d/0/0/0/3/////
compact - -53/0/0/3f36f0948ce80946/bf795e6ed9368634/1/1_1/3f36f0948ce80946///4000000000000000 => -53/0/0/3f36f0948ce80946/bf795e6ed9368634/1/1_1/3f36f0948ce80946///4000000000000000
compact - -4/3f50624dd2f1a9fc/4050000000000000/405f80082aafd679/40a913f9a319b918/1///9_4/4026000000000000,3f40555facf198b1,4038000000000000,403b000000000000/ => -4/3f50624dd2f1a9fc/4050000000000000/405f80082aafd679/40a913f9a319b918/1///9_4/4026000000000000,3f40555facf198b1,4038000000000000,403b000000000000/
compact - 0/3fe0000000000000/3f218f3777c06c8b/404e0020e76fe879/c0995307d55896ad/3/-19_4/3f37d8ec907a2a4e,4049000000000000,3f40972bc24b9bfe,4024000000000000/// => 0/3fe0000000000000/3f218f3777c06c8b/404e0020e76fe879/c0995307d55896ad/3/-19_4/3f37d8ec907a2a4e,4049000000000000,3f40972bc24b9bfe,4024000000000000///
compact - -2/3f847ae147ae147b/0/4058800000000000/c08e43688e58b607/3/-4_2,2_1/4044800000000000,4031000000000000,4044000000000000/// => -2/3f847ae147ae147b/0/4058800000000000/c08e43688e58b607/3/-4_2,2_1/4044800000000000,4031000000000000,4044000000000000///
compact - 0/3f50624dd2f1a9fc/0/4034000000000000/c05877fdaa12229a/2///-7_2/4032000000000000,4000000000000000/ => 0/3f50624dd2f1a9fc/0/4034000000000000/c05877fdaa12229a/2///-7_2/4032000000000000,4000000000000000/
compact - -53/0/0/40696002dc08829d/40bf4e6ab49eca97/3/0_2,0_2,0_1/4050400000000000,3f36e04414e8f6dc,4028000000000000,4043000000000000,4056000000000000///bff0000000000000,0,3fe0000000000000,4024000000000000 => -53/0/0/40696002dc08829d/40bf4e6ab49eca97/3/0_5/4050400000000000,3f36e04414e8f6dc,4028000000000000,4043000000000000,4056000000000000///bff0000000000000,0,3fe0000000000000,4024000000000000
compact - 3/3fe0000000000000/4051c00000000000/4072f8039e8e6b8e/c0b1b9a7cf1f5710/0/6_2,2_3,0_2/0,3f27fba919547ea7,404a000000000000,3f37a543cca0417e,4055600000000000,3f3645ce5f868032,4057c00000000000/// => 3/3fe0000000000000/4051c00000000000/4072f8039e8e6b8e/c0b1b9a7cf1f5710/0/7_1,2_5/3f27fba919547ea7,404a000000000000,3f37a543cca0417e,4055600000000000,3f3645ce5f868032,4057c00000000000///
compact - -1/3f847ae147ae147b/4050000000000000/406ab00afcd4bcb0/c0b025131d529b26/0/-1_4/404b000000000000,0,3f3f787e7b060819,4024000000000000/6_1,1_2,1_2/0,4051a00000000000,3f4c3713b53de3ff,402e000000000000,0/ => -1/3f847ae147ae147b/4050000000000000/406ab00afcd4bcb0/c0b025131d529b26/0/-1_1,1_2/404b000000000000,3f3f787e7b060819,4024000000000000/8_2,1_1/4051a00000000000,3f4c3713b53de3ff,402e000000000000/
compact - -1/0/0/0/8000000000000000/2/-15_1/0/// => -1/0/0/0/8000000000000000/2/////
compact - 0/3f847ae147ae147b/0/40811e004e88deea/c0a53bd09670ca5d/0/-15_2,0_3/404ce00000000000,3f23a237ba81fc9f,4055800000000000,4042800000000000,404e000000000000/-16_2,2_2,1_4/0,403b000000000000,404b800000000000,0,4057400000000000,4055c00000000000,0,4046800000000000/ => 0/3f847ae147ae147b/0/40811e004e88deea/c0a53bd09670ca5d/0/-15_5/404ce00000000000,3f23a237ba81fc9f,4055800000000000,4042800000000000,404e000000000000/-15_1,2_1,2_2,1_1/403b000000000000,404b800000000000,4057400000000000,4055c00000000000,4046800000000000/
compact - -1/3f50624dd2f1a9fc/0/4039000000000000/4077197ec06e5f1e/3/-14_1/4039000000000000/// => -1/3f50624dd2f1a9fc/0/4039000000000000/4077197ec06e5f1e/3/-14_1/4039000000000000///
compact - -53/0/0/0/0/3/////3ff0000000000000,4014000000000000,4024000000000000 => -53/0/0/0/0/3/////3ff0000000000000,4014000000000000,4024000000000000
compact - 5/255bba08cf8c979d/0/40761801bc170baf/c0beaf6f89aef545/2/-6_1,2_3,2_4/401c000000000000,402e000000000000,4052800000000000,3f3bc170baeec5f7,4054400000000000,4013000000000000,0,403c000000000000/8_3,2_1,1_1/404e000000000000,403f000000000000,0,404a600000000000,0/ => 5/255bba08cf8c979d/0/40761801bc170baf/c0beaf6f89aef545/2/-6_1,2_3,2_2,1_1/401c000000000000,402e000000000000,4052800000000000,3f3bc170baeec5f7,4054400000000000,4013000000000000,403c000000000000/8_2,3_1/404e000000000000,403f000000000000,404a600000000000/
compact - -53/0/0/4041800000000000/40945e359c571c3e/3/1_1/4041800000000000///4000000000000000 => -53/0/0/4041800000000000/40945e359c571c3e/3/1_1/4041800000000000///4000000000000000
compact - -1/3f847ae147ae147b/4057000000000000/4073e8080a6e943c/40d11040e3c61bdf/0/-14_3,1_1/0,4035800000000000,0,4018800000000000/-8_1,0_2,1_4/3f45b5b386499efb,3f37a828f2ca91d0,4059700000000000,0,3f4ec9aca22f7d6b,4058480000000000,0/ => -1/3f847ae147ae147b/4057000000000000/4073e8080a6e943c/40d11040e3c61bdf/0/-13_1,2_1/4035800000000000,4018800000000000/-8_3,2_2/3f45b5b386499efb,3f37a828f2ca91d0,4059700000000000,3f4ec9aca22f7d6b,4058480000000000/
schema -1 -1/3f847ae147ae147b/0/4075d005a7a59ba1/40d51f9b7dd9e4de/1/-14_4/3f3245c2646ac083,4046800000000000,4058400000000000,4056000000000000/-7_4/4036000000000000,4058400000000000,3f3e0765aa21a566,3f451698d5c621af/ => -1/3f847ae147ae147b/0/4075d005a7a59ba1/40d51f9b7dd9e4de/1/-14_4/3f3245c2646ac083,4046800000000000,4058400000000000,4056000000000000/-7_4/4036000000000000,4058400000000000,3f3e0765aa21a566,3f451698d5c621af/
schema -2 -2/3f847ae147ae147b/4033400000000000/4033400000000000/4094aec1a2c8dbd8/2///// => -2/3f847ae147ae147b/4033400000000000/4033400000000000/4094aec1a2c8dbd8/2/////
schema -4 -2/255bba08cf8c979d/0/406bdc05dc2fd1af/40a49af4797d0569/3/-13_2/4058c00000000000,4053c00000000000/1_1,2_1,1_2/4033c00000000000,402c400000000000,4026000000000000,3f4770bf46bce66c/ => -4/255bba08cf8c979d/0/406bdc05dc2fd1af/40a49af4797d0569/0/-3_1/4066400000000000/1_2/4040f00000000000,4026005dc2fd1af4/
schema -4 -2/0/0/40723403bb42c688/40cd645830b0bf12/2/5_1,0_4,1_4/4056800000000000,4054c00000000000,4028000000000000,0,4038400000000000,404a800000000000,3f4dda16343f40a3,0,403d000000000000/// => -4/0/0/40723403bb42c688/40cd645830b0bf12/0/2_3/4067200000000000,4053500eed0b1a20,403d000000000000///
schema 3 5/255bba08cf8c979d/0/407386015a292f0f/40a794584af0cd53/3/-17_1,2_1,2_4/0,3f35a292f0f0063e,4028000000000000,0,0,404f800000000000/2_2,0_1/4051000000000000,405e580000000000,4048000000000000/ => 3/255bba08cf8c979d/0/407386015a292f0f/40a794584af0cd53/0/-4_3/0,3f35a292f0f0063e,4052c00000000000/1_1/406dac0000000000/
schema 3 3/0/4032000000000000/4067540000000000/c0a4e66e8fc0d5f4/3/-7_1/4031000000000000/-15_1,1_3/0,403a000000000000,4043d00000000000,4055800000000000/ => 3/0/4032000000000000/4067540000000000/c0a4e66e8fc0d5f4/3/-7_1/4031000000000000/-15_1,1_3/0,403a000000000000,4043d00000000000,4055800000000000/
schema -4 -1/255bba08cf8c979d/0/408613029ce5b708/40cc90b6a2824a80/1/-20_4,0_1/405a800000000000,4057000000000000,4033000000000000,0,0/-6_4,1_3,1_4/3f4698a5cf1a3040,3f4335b5a161d764,4055400000000000,4053000000000000,0,4055c00000000000,4057000000000000,4030000000000000,4045100000000000,4056d00000000000,0/ => -4/255bba08cf8c979d/0/408613029ce5b708/40cc90b6a2824a80/0/-2_1/406b200000000000/0_2/406f000a7396dc1f,406e2c0000000000/
schema -4 -4/3fe0000000000000/4034000000000000/4077a40000000000/c0a69343fd41b945/0///-5_3,2_4,0_1/0,4041000000000000,4050400000000000,404e800000000000,403b000000000000,404a200000000000,4051000000000000,4049800000000000/ => -4/3fe0000000000000/4034000000000000/4077a40000000000/c0a69343fd41b945/0///-5_3,2_4,0_1/0,4041000000000000,4050400000000000,404e800000000000,403b000000000000,404a200000000000,4051000000000000,4049800000000000/
schema 0 3/3f847ae147ae147b/0/4070dc0000000000/40c8893115ba663d/3/-18_1/4037600000000000/8_3,1_2,0_3/4058200000000000,404cf00000000000,0,4010000000000000,4044800000000000,4040000000000000,401c000000000000,4020000000000000/ => 0/3f847ae147ae147b/0/4070dc0000000000/40c8893115ba663d/0/-2_1/4037600000000000/1_2/4058200000000000,4062bc0000000000/
schema -1 1/255bba08cf8c979d/403b000000000000/4072420072b41d7a/c09d5fab9cee1e25/2/-4_3/4050c00000000000,0,3f1cad075e9f5f5d/-17_2,1_2,0_1/4010000000000000,4058d00000000000,4014000000000000,4055380000000000,4014000000000000/ => -1/255bba08cf8c979d/403b000000000000/4072420072b41d7a/c09d5fab9cee1e25/0/-1_2/4050c00000000000,3f1cad075e9f5f5d/-4_2/4059d00000000000,4057b80000000000/
schema -1 2/3fe0000000000000/0/4082bd0000000000/c0bd3319ef36efb0/0/-13_4,2_1,1_1/4031000000000000,4055c00000000000,404a000000000000,4010800000000000,404fd00000000000,4035000000000000/6_2,1_4,1_2/4020000000000000,0,0,4051c00000000000,4053c00000000000,402c000000000000,404e800000000000,405e780000000000/ => -1/3fe0000000000000/0/4082bd0000000000/c0bd3319ef36efb0/0/-1_2/4064040000000000,4055280000000000/1_2/4020000000000000,4075ae0000000000/
schema -4 -4/0/0/405360069bb543a9/40aea9e1f3d01172/0/-18_1,2_3,0_2/3f3a6ed50ea23194,401a000000000000,0,4051c00000000000,0,0/// => -4/0/0/405360069bb543a9/40aea9e1f3d01172/0/-18_1,2_3,0_2/3f3a6ed50ea23194,401a000000000000,0,4051c00000000000,0,0///
schema 0 0/3fe0000000000000/0/406d00025e9095d0/40cbc4c1457af593/2/-15_2,0_3/4051c00000000000,4052400000000000,4056000000000000,3f32f484ae81f198,0/// => 0/3fe0000000000000/0/406d00025e9095d0/40cbc4c1457af593/2/-15_2,0_3/4051c00000000000,4052400000000000,4056000000000000,3f32f484ae81f198,0///
schema -4 -2/255bba08cf8c979d/3f360aef87ccf47f/407dd80986f3a912/c0be127a5380d87d/1/8_4,2_3,1_4/0,3f4d7e179307486e,4047000000000000,3f2221fa495edd4c,4053c00000000000,404e000000000000,3ef137dcd585865d,4049800000000000,4057200000000000,4055400000000000,3f4ea1d0789c089f/-6_1/4050000000000000/ => -4/255bba08cf8c979d/3f360aef87ccf47f/407dd80986f3a912/c0be127a5380d87d/0/2_5/0,404700220696255f,40616000226fb9ab,406c900000000000,3f4ea1d0789c089f/-1_1/4050000000000000/
schema 8 8/3fe0000000000000/0/406950074ed128cb/40ba80a920a01d25/0///-9_2,2_4/3f4d3b44a32bf510,4043000000000000,402e000000000000,403c000000000000,4008000000000000,405da00000000000/ => 8/3fe0000000000000/0/406950074ed128cb/40ba80a920a01d25/0///-9_2,2_4/3f4d3b44a32bf510,4043000000000000,402e000000000000,403c000000000000,4008000000000000,405da00000000000/
schema 0 1/3f847ae147ae147b/0/4076420000000000/40c04a5134d386e6/2/5_1,2_1,0_3/405c800000000000,4055c00000000000,0,4048800000000000,405a880000000000/// => 0/3f847ae147ae147b/0/4076420000000000/40c04a5134d386e6/0/3_4/405c800000000000,4055c00000000000,4048800000000000,405a880000000000///
schema -2 -1/0/4051800000000000/406340034e312bb1/40a519687d8db256/0/5_3/4034000000000000,4048800000000000,3f3a71895d851e41/-16_1/402e000000000000/ => -2/0/4051800000000000/406340034e312bb1/40a519687d8db256/0/3_2/4051400000000000,3f3a71895d851e41/-8_1/402e000000000000/
schema 8 8/255bba08cf8c979d/4054800000000000/40763a03c8e0d6ac/40a032fca6d15d2d/2/-7_3,0_3/3f4e4706b55bcea7,4000000000000000,4056000000000000,404b800000000000,405ae80000000000,4035000000000000/// => 8/255bba08cf8c979d/4054800000000000/40763a03c8e0d6ac/40a032fca6d15d2d/2/-7_3,0_3/3f4e4706b55bcea7,4000000000000000,4056000000000000,404b800000000000,405ae80000000000,4035000000000000///
schema -2 -2/255bba08cf8c979d/0/4074900000000000/40ce8c0f13c5d000/2/0_3,1_3/4024000000000000,4057800000000000,403e000000000000,4058400000000000,0,4058800000000000/// => -2/255bba08cf8c979d/0/4074900000000000/40ce8c0f13c5d000/2/0_3,1_3/4024000000000000,4057800000000000,403e000000000000,4058400000000000,0,4058800000000000///
schema -1 0/3f50624dd2f1a9fc/4033000000000000/40809401b7048570/40d03ab0f8a202b3/0/6_4,1_3/405ab80000000000,4056800000000000,4056c00000000000,404d800000000000,4058000000000000,3f4b7048570b225d,4051280000000000/// => -1/3f50624dd2f1a9fc/4033000000000000/40809401b7048570/40d03ab0f8a202b3/0/3_5/405ab80000000000,4066a00000000000,404d800000000000,4058000db8242b86,4051280000000000///
schema -4 -4/255bba08cf8c979d/0/4079780000000000/40c510da0628781c/3///-2_4,0_2,1_3/4056b80000000000,4030000000000000,4041000000000000,4049600000000000,4037000000000000,4044800000000000,0,4051000000000000,4054f80000000000/ => -4/255bba08cf8c979d/0/4079780000000000/40c510da0628781c/3///-2_4,0_2,1_3/4056b80000000000,4030000000000000,4041000000000000,4049600000000000,4037000000000000,4044800000000000,0,4051000000000000,4054f80000000000/
schema -3 -2/255bba08cf8c979d/0/4050b80000000000/40b016532ef2a597/0/-13_1/4050b80000000000/// => -3/255bba08cf8c979d/0/4050b80000000000/40b016532ef2a597/0/-6_1/4050b80000000000///
schema -1 -1/0/4039000000000000/4039000000000000/4072f2d21fc49cb0/0///// => -1/0/4039000000000000/4039000000000000/4072f2d21fc49cb0/0/////
schema -2 -2/3f847ae147ae147b/4034000000000000/40805c0000000000/c0ac5f1a6783e9ab/1/8_2,0_4,2_2/4058200000000000,4049000000000000,4050800000000000,0,4053400000000000,4052400000000000,4056800000000000,4049800000000000/// => -2/3f847ae147ae147b/4034000000000000/40805c0000000000/c0ac5f1a6783e9ab/1/8_2,0_4,2_2/4058200000000000,4049000000000000,4050800000000000,0,4053400000000000,4052400000000000,4056800000000000,4049800000000000///
schema 0 1/3f50624dd2f1a9fc/0/0/0/0///// => 0/3f50624dd2f1a9fc/0/0/0/0/////
schema 1 1/3f847ae147ae147b/0/4053c00c3f4dd030/40a5dbecce29dfe8/0/-18_4/0,4031000000000000,404f000000000000,3f487e9ba05fe849/// => 1/3f847ae147ae147b/0/4053c00c3f4dd030/40a5dbecce29dfe8/0/-18_4/0,4031000000000000,404f000000000000,3f487e9ba05fe849///
schema -1 -1/255bba08cf8c979d/4052400000000000/4052400000000000/40a213b071a0444f/1///// => -1/255bba08cf8c979d/4052400000000000/4052400000000000/40a213b071a0444f/1/////
schema -1 2/3f50624dd2f1a9fc/404e800000000000/40826d02523ab24e/40e2358e289dd194/3/6_2,1_3,2_1/3f39d3cdb46f899a,4048000000000000,4050800000000000,0,404a000000000000,404c800000000000/-8_3,0_2,2_3/3f4839c44aa7be47,0,0,404e000000000000,4052280000000000,4054000000000000,4057400000000000,0/ => -1/3f50624dd2f1a9fc/404e800000000000/40826d02523ab24e/40e2358e289dd194/0/1_2/4048000ce9e6da38,4065e00000000000/-1_3/3f4839c44aa7be47,40731a0000000000,0/
schema 1 1/0/4056c00000000000/406f540000000000/c0b4fe6da09892b4/1/6_3/405aa80000000000,404a800000000000,0/// => 1/0/4056c00000000000/406f540000000000/c0b4fe6da09892b4/1/6_3/405aa80000000000,404a800000000000,0///
schema 3 5/3f50624dd2f1a9fc/0/4061c400b3a15b0a/40bde531e4f7e78d/3/-4_4/4047900000000000,4044000000000000,404b800000000000,3f16742b613959f4/// => 3/3f50624dd2f1a9fc/0/4061c400b3a15b0a/40bde531e4f7e78d/0/-1_2/4047900000000000,4057c0016742b614///
schema -4 -4/3f847ae147ae147b/0/4059000cde82815d/40b12882d44188d4/1///-19_4/404c800000000000,4038000000000000,3f49bd0502b90af6,4033000000000000/ => -4/3f847ae147ae147b/0/4059000cde82815d/40b12882d44188d4/1///-19_4/404c800000000000,4038000000000000,3f49bd0502b90af6,4033000000000000/
schema -3 -1/0/0/407250060a321ef1/40c2ff1f199a697d/1/-10_1,1_4,1_3/0,4041000000000000,3f474fa1f338d332,0,404b800000000000,3f4901ef044eeb41,4056c80000000000,404df00000000000/-7_2/404a800000000000,0/ => -3/0/0/407250060a321ef1/40c2ff1f199a697d/0/-2_3/4041000000000000,404b80174fa1f339,4062e006407bc114/-1_1/404a800000000000/
schema 3 5/0/0/406cd80ae7e2a192/40cbc60a53acfd40/0/-13_4,2_4,2_3/4051400000000000,4059b00000000000,0,3f3bee888cca6f30,3f4da8463fe479e9,4014000000000000,4047800000000000,0,401c000000000000,0,0/// => 3/0/0/406cd80ae7e2a192/40cbc60a53acfd40/0/-3_5/4065780000000000,3f3bee888cca6f30,404a001da8463fe4,401c000000000000,0///
schema 8 8/3f847ae147ae147b/3f33c3a2b5df1d16/4087d500f6859e8e/40e19a23042f6c52/3/-18_2,1_2,2_2/405d780000000000,4026800000000000,4047300000000000,405a180000000000,4048000000000000,3f22e34ad6a0419f/4_3,1_4,1_4/4008000000000000,3ef9b6bb0a0cc8e6,4043900000000000,0,405ab80000000000,4040000000000000,4053400000000000,0,405bf00000000000,402c000000000000,4049800000000000/ => 8/3f847ae147ae147b/3f33c3a2b5df1d16/4087d500f6859e8e/40e19a23042f6c52/3/-18_2,1_2,2_2/405d780000000000,4026800000000000,4047300000000000,405a180000000000,4048000000000000,3f22e34ad6a0419f/4_3,1_4,1_4/4008000000000000,3ef9b6bb0a0cc8e6,4043900000000000,0,405ab80000000000,4040000000000000,4053400000000000,0,405bf00000000000,402c000000000000,4049800000000000/
schema 4 5/0/0/40701e0000000000/c0b4b11771e1881e/3/-6_2/4048000000000000,405c780000000000/8_3/0,4049800000000000,4046800000000000/ => 4/0/0/40701e0000000000/c0b4b11771e1881e/0/-3_2/4048000000000000,405c780000000000/4_2/0,4058000000000000/
schema 2 2/255bba08cf8c979d/0/4064200000000000/40a3bfbe06bf6bc3/3/-18_3/405ca80000000000,4047300000000000,0/// => 2/255bba08cf8c979d/0/4064200000000000/40a3bfbe06bf6bc3/3/-18_3/405ca80000000000,4047300000000000,0///
schema 5 5/0/403b000000000000/407252025712ee45/40c624b554e3d00a/3/6_1,2_4,0_1/0,4058c00000000000,4051880000000000,3f06c4568e3faee2,3f414c52094294e9,4058400000000000/// => 5/0/403b000000000000/407252025712ee45/40c624b554e3d00a/3/6_1,2_4,0_1/0,4058c00000000000,4051880000000000,3f06c4568e3faee2,3f414c52094294e9,4058400000000000///
schema -3 0/3fe0000000000000/3f4abb058b8b3215/407d980a8bdb9df3/40ddde471b6de4f5/2/-19_4/4042800000000000,4056400000000000,3f4f1d81e4a106d0,0/-20_4,2_4/4059580000000000,4057c00000000000,3f39f524ebce6677,3f3b17861304de95,4049700000000000,4041000000000000,4050900000000000,0/ => -3/3fe0000000000000/3f4abb058b8b3215/407d980a8bdb9df3/40ddde471b6de4f5/0/-2_1/405f800f8ec0f251/-2_2/40688c06a1955fdb,4062e40000000000/
schema 5 5/3f847ae147ae147b/0/405a5009a7681f2f/4080b0b33c0c6dab/3/1_1,1_2,2_2/0,3f37df64000be76f,4045a00000000000,404d800000000000,3f2d7c78f96328ac/-6_1/4008000000000000/ => 5/3f847ae147ae147b/0/405a5009a7681f2f/4080b0b33c0c6dab/3/1_1,1_2,2_2/0,3f37df64000be76f,4045a00000000000,404d800000000000,3f2d7c78f96328ac/-6_1/4008000000000000/
schema -4 -4/3f50624dd2f1a9fc/4051400000000000/4051400000000000/40b045e7f51b5af9/0///// => -4/3f50624dd2f1a9fc/4051400000000000/4051400000000000/40b045e7f51b5af9/0/////
schema -4 -2/3f847ae147ae147b/4034000000000000/4070ac02969e90ee/40d017d5d6f37f37/3///-15_4,1_4/4058000000000000,4015800000000000,3f44b4f487738fed,402c000000000000,404a800000000000,4045300000000000,4031000000000000,4033000000000000/ => -4/3f847ae147ae147b/4034000000000000/4070ac02969e90ee/40d017d5d6f37f37/0///-3_3/405cd80a5a7a43ba,405c180000000000,4033000000000000/
schema -2 -2/0/0/405db809bc2c973d/40b3a1c1cef0203a/2/-3_4/3f326d30ce335153,3f3483818ec14256,402a000000000000,4030000000000000/-16_1,0_4/0,4037000000000000,0,403ee00000000000,4042000000000000/ => -2/0/0/405db809bc2c973d/40b3a1c1cef0203a/2/-3_4/3f326d30ce335153,3f3483818ec14256,402a000000000000,4030000000000000/-16_1,0_4/0,4037000000000000,0,403ee00000000000,4042000000000000/
schema -4 -4/3f847ae147ae147b/4041000000000000/4066640adb78ed8e/c0a61b29bff8311b/2/-8_2,1_2/3f3cdfd4bea58e1a,4049b00000000000,4057700000000000,3f4cfdf956e397c2/// => -4/3f847ae147ae147b/4041000000000000/4066640adb78ed8e/c0a61b29bff8311b/2/-8_2,1_2/3f3cdfd4bea58e1a,4049b00000000000,4057700000000000,3f4cfdf956e397c2///
schema -4 -1/3f847ae147ae147b/0/4061c00000000000/c09ca0dda2399580/3/6_4,0_2/4051800000000000,3ff0000000000000,404d800000000000,4028000000000000,0,0/// => -4/3f847ae147ae147b/0/4061c00000000000/c09ca0dda2399580/0/1_2/4060400000000000,4028000000000000///
schema 1 1/3f50624dd2f1a9fc/4049000000000000/404f600cd50676a7/c09756f32a52d3c3/0/-12_3/0,3f39aa0ced4da6a0,4029800000000000/// => 1/3f50624dd2f1a9fc/4049000000000000/404f600cd50676a7/c09756f32a52d3c3/0/-12_3/0,3f39aa0ced4da6a0,4029800000000000///
schema 1 3/3fe0000000000000/0/407ca002bee8d828/40b720607d2b82fb/0/-6_1,1_4/4051800000000000,4058c00000000000,404f000000000000,3ede15a6a791ea3f,4054c00000000000/-1_3,1_2/402e000000000000,403c000000000000,4031000000000000,3f45bb1b73ef93d4,4055000000000000/ => 1/3fe0000000000000/0/407ca002bee8d828/40b720607d2b82fb/0/-1_2/4065200000000000,406220000f0ad354/0_2/4045800000000000,4059400add8db9f8/
schema 5 5/255bba08cf8c979d/0/0/0/0///// => 5/255bba08cf8c979d/0/0/0/0/////
schema 8 8/3fe0000000000000/0/4066440fa704cb18/c0b040f7863e0518/1/-13_2,0_4,1_3/3f385b459c357813,0,4043000000000000,4058000000000000,4032000000000000,4030000000000000,3f433f98bb893da9,3f4f2ed7a2bbe502,4024400000000000/// => 8/3fe0000000000000/0/4066440fa704cb18/c0b040f7863e0518/1/-13_2,0_4,1_3/3f385b459c357813,0,4043000000000000,4058000000000000,4032000000000000,4030000000000000,3f433f98bb893da9,3f4f2ed7a2bbe502,4024400000000000///
schema 2 3/3f50624dd2f1a9fc/3f193076751f1248/4070e8028e3ceeb4/40a77c21db6de4c7/2/5_2,2_2,1_2/3f366f43ab83e9a4,3f2850db44dd8308,405f200000000000,4049000000000000,0,4032000000000000/-7_3/4045200000000000,4018000000000000,403dc00000000000/ => 2/3f50624dd2f1a9fc/3f193076751f1248/4070e8028e3ceeb4/40a77c21db6de4c7/0/3_1,1_3/3f414bd8a6f95594,4065d00000000000,0,4032000000000000/-3_2/4048200000000000,403dc00000000000/
schema 0 1/3f50624dd2f1a9fc/0/403a00158b66a157/4096d605e464ef95/3///-3_3/3f358b66a1571fb3,403a000000000000,0/ => 0/3f50624dd2f1a9fc/0/403a00158b66a157/4096d605e464ef95/0///-1_2/403a00158b66a157,0/
schema -2 -1/255bba08cf8c979d/0/0/0/3///// => -2/255bba08cf8c979d/0/0/0/0/////
schema -3 0/3f50624dd2f1a9fc/4053000000000000/405cc8125f8a1d1a/40b942422d34988a/3///-6_1,2_2/3f413992edee92dd,4043900000000000,3f4385814c464700/ => -3/3f50624dd2f1a9fc/4053000000000000/405cc8125f8a1d1a/40b942422d34988a/0///0_1/40439024bf143a35/
schema 1 2/3fe0000000000000/4008000000000000/40725e03a48c9a6c/408bcd20c73b1b0c/0/4_4,0_4/4050780000000000,3ffe000000000000,0,4049000000000000,3f4d2464d364c57d,4049800000000000,405a080000000000,4032000000000000/// => 1/3fe0000000000000/4008000000000000/40725e03a48c9a6c/408bcd20c73b1b0c/0/2_5/4050780000000000,3ffe000000000000,4049001d2464d365,4063640000000000,4032000000000000///
schema 0 2/3fe0000000000000/4057800000000000/406ca00b9e7deca6/c0b484987778174b/1/6_1/3f42309aa20c87c3/-6_1,0_1,2_3/402e000000000000,3f4c495d108b7bee,4044000000000000,4010000000000000,4053000000000000/ => 0/3fe0000000000000/4057800000000000/406ca00b9e7deca6/c0b484987778174b/0/2_1/3f42309aa20c87c3/-1_2/402e00712574422e,405e000000000000/
schema -4 -2/3f50624dd2f1a9fc/4054c00000000000/4054c00000000000/40b440de02b7cdca/0///// => -4/3f50624dd2f1a9fc/4054c00000000000/4054c00000000000/40b440de02b7cdca/0/////
schema 0 2/3f847ae147ae147b/0/40709c0000000000/40bde73ed50e681c/2/-20_1/403b000000000000/7_1,1_1,0_3/404a800000000000,4043800000000000,404b800000000000,4056f00000000000,0/ => 0/3f847ae147ae147b/0/40709c0000000000/40bde73ed50e681c/0/-5_1/403b000000000000/2_2/404a800000000000,4067380000000000/
schema -2 -2/3f50624dd2f1a9fc/0/406180081938ea3c/4074e771e5f12221/1/-12_1/4048800000000000/-6_4,1_3/4000000000000000,3f4cb95b4182191d,3f1d5c433b788510,0,4053400000000000,4028000000000000,0/ => -2/3f50624dd2f1a9fc/0/406180081938ea3c/4074e771e5f12221/1/-12_1/4048800000000000/-6_4,1_3/4000000000000000,3f4cb95b4182191d,3f1d5c433b788510,0,4053400000000000,4028000000000000,0/
schema -4 -4/255bba08cf8c979d/4051f80000000000/4065f40000000000/40b3dc8bbeea659f/3/-13_3/404e800000000000,0,4045600000000000/// => -4/255bba08cf8c979d/4051f80000000000/4065f40000000000/40b3dc8bbeea659f/3/-13_3/404e800000000000,0,4045600000000000///
schema 1 3/3f847ae147ae147b/0/407e06073348f30e/c096cd25db8b914c/2/-1_4,2_3/0,3f31a601b980ebd5,4050800000000000,4043000000000000,402a000000000000,3f4269b8c5ee5b12,4018000000000000/-16_4,2_2,2_4/4057180000000000,0,403c000000000000,0,3f46a343534a3789,404e800000000000,4039000000000000,404a500000000000,4058980000000000,3f2ee92a89cdb3c9/ => 1/3f847ae147ae147b/0/407e06073348f30e/c096cd25db8b914c/0/0_3/3f31a601b980ebd5,405a000000000000,40330024d3718bdc/-4_5/4057180000000000,403c000000000000,404e8016a343534a,4066000000000000,3f2ee92a89cdb3c9/
schema -3 -2/3fe0000000000000/3f1acd9084c32390/4062f806c0a1700c/404071064f58f21d/3/0_3/0,4051800000000000,4054700000000000/9_2/0,3f47a8d3af99219a/ => -3/3fe0000000000000/3f1acd9084c32390/4062f806c0a1700c/404071064f58f21d/0/0_2/0,4062f80000000000/5_1/3f47a8d3af99219a/
schema -4 -4/3f847ae147ae147b/0/0/0/2///// => -4/3f847ae147ae147b/0/0/0/2/////
schema 0 2/0/0/4060400000000000/c08bc57b2e21f581/0/0_2/0,4043800000000000/-11_1,2_1/404a800000000000,4043000000000000/ => 0/0/0/4060400000000000/c08bc57b2e21f581/0/0_2/0,4043800000000000/-2_1/4056c00000000000/
schema 3 5/3f50624dd2f1a9fc/0/0/0/1///// => 3/3f50624dd2f1a9fc/0/0/0/0/////
schema 5 8/255bba08cf8c979d/0/405cb816efdf21e1/c070a3c0584664b7/1/-3_1,2_2,0_4/4036600000000000,4051600000000000,3f3db843699a1da3,4037000000000000,3f40ad205e0d2a2e,3ea59b080e721704,3f3ca22addc55f30/// => 5/255bba08cf8c979d/0/405cb816efdf21e1/c070a3c0584664b7/0/0_2/4056f80000000000,4037005bbf7c8780///
schema 5 8/3f847ae147ae147b/4010000000000000/4056c02bd8e56a77/c09d52d80132622e/0/-7_3,1_2,2_4/3f48529a29e70074,4008000000000000,3f4bd530bfb8f542,4040000000000000,3f45389aa8b9f208,0,4041000000000000,3f3ca2ca85286280,4032000000000000/// => 5/3f847ae147ae147b/4010000000000000/4056c02bd8e56a77/c09d52d80132622e/0/0_2/404180496065925a,404a000e51654294///
schema 3 5/3f50624dd2f1a9fc/404b000000000000/4060400000000000/c095af2cb4278429/0/-8_3/4051800000000000,4018000000000000,0/// => 3/3f50624dd2f1a9fc/404b000000000000/4060400000000000/c095af2cb4278429/0/-2_2/4051800000000000,4018000000000000///
schema 1 3/3f50624dd2f1a9fc/4047000000000000/4067b8043ccb2cd5/c0b0a2e39ae85954/1/-15_1,1_4/3f40f32cb3543579,4037000000000000,4038c00000000000,4028000000000000,4055000000000000/// => 1/3f50624dd2f1a9fc/4047000000000000/4067b8043ccb2cd5/c0b0a2e39ae85954/0/-3_2/4047e010f32cb354,4058000000000000///
schema 2 2/0/0/4060400000000000/40ba8dfa061a92ab/0/-4_2,2_1/4033000000000000,4051c00000000000,4044000000000000/// => 2/0/0/4060400000000000/40ba8dfa061a92ab/0/-4_2,2_1/4033000000000000,4051c00000000000,4044000000000000///
schema -4 -2/3f847ae147ae147b/0/405ea01748021947/40b5efafdd021b41/0/-6_4,2_1/3f4a2f0b07a3914d,4033000000000000,4042800000000000,4050a00000000000,3f4460f92ae9f5fc/// => -4/3f847ae147ae147b/0/405ea01748021947/40b5efafdd021b41/0/-1_2/404c001a2f0b07a4,4050a00a307c9575///
schema 4 5/3fe0000000000000/0/0/8000000000000000/1///// => 4/3fe0000000000000/0/0/8000000000000000/0/////
schema 6 8/3fe0000000000000/4052f00000000000/405e080efc5983e6/c0a5f0101f171b1d/2/9_2/3f4df8b307cb3807,4046300000000000/// => 6/3fe0000000000000/4052f00000000000/405e080efc5983e6/c0a5f0101f171b1d/0/3_1/4046301df8b307cb///
schema 2 2/3f847ae147ae147b/0/0/0/0///// => 2/3f847ae147ae147b/0/0/0/0/////
schema -4 -4/3f50624dd2f1a9fc/0/4083fd0291f635e6/40b5dab8618cc694/1/4_4,2_4,1_1/405c900000000000,4042800000000000,404ac00000000000,4054c00000000000,4056000000000000,3f4d997b87626f23,3f11b021684239d9,3f329fc753df22af,403b000000000000/6_4/4049800000000000,4040800000000000,405ab80000000000,4047000000000000/ => -4/3f50624dd2f1a9fc/0/4083fd0291f635e6/40b5dab8618cc694/1/4_4,2_4,1_1/405c900000000000,4042800000000000,404ac00000000000,4054c00000000000,4056000000000000,3f4d997b87626f23,3f11b021684239d9,3f329fc753df22af,403b000000000000/6_4/4049800000000000,4040800000000000,405ab80000000000,4047000000000000/
schema -3 -2/0/405b000000000000/40770c0257d38d30/40c260fc1ea0e08b/2/8_1,0_3/4022000000000000,3f2cd05875cc3db4,403a000000000000,0/-12_2,0_2,2_3/3f2f0b37047ef46e,4044e00000000000,3f0ce1de581b6740,404c800000000000,4047800000000000,3f0f99aa56f0e904,4054000000000000/ => -3/0/405b000000000000/40770c0257d38d30/40c260fc1ea0e08b/0/4_3/4022000000000000,403a000e682c3ae6,0/-6_5/3f2f0b37047ef46e,4044e001ce1de582,404c800000000000,4047800000000000,40540000fccd52b8/
schema 3 5/3f50624dd2f1a9fc/4052000000000000/4074e0075dab675d/c0b34f12a2dfbb23/2///-1_4,2_4/4053400000000000,4024000000000000,3f4e3c2e289c25df,3f4cb12d124b5e48,404f000000000000,4054c00000000000,4037000000000000,401c000000000000/ => 3/3f50624dd2f1a9fc/4052000000000000/4074e0075dab675d/c0b34f12a2dfbb23/0///0_3/4055c00000000000,3f5d76ad9d73c214,4065e00000000000/
schema 2 5/3f50624dd2f1a9fc/0/406f4c14bc9aca90/40b53c2279ab7102/3/-17_3,0_3,2_2/3f464bc204777eda,402a000000000000,4033000000000000,0,3f3b23e2b10c8da3,4034000000000000,0,4053800000000000/-16_2,2_3/3f3fb27e838e3e68,0,4053180000000000,4046000000000000,3f4f3b788b76b35d/ => 2/3f50624dd2f1a9fc/0/406f4c14bc9aca90/40b53c2279ab7102/0/-2_2/402a00592f0811de,405d4006c8f8ac43/-2_2/3f3fb27e838e3e68,405e180f9dbc45bb/
schema -4 -1/255bba08cf8c979d/0/0/0/2///// => -4/255bba08cf8c979d/0/0/0/0/////
schema -3 0/0/4032000000000000/4032000000000000/40664f2c24f6dcee/3///// => -3/0/4032000000000000/4032000000000000/40664f2c24f6dcee/0/////
schema -1 1/3f50624dd2f1a9fc/0/4082740000000000/40d31617571f210a/1/-6_3,2_2,2_3/4050700000000000,4058400000000000,4055000000000000,0,404a800000000000,4057400000000000,403d600000000000,4056000000000000/1_3/0,4054180000000000,0/ => -1/3f50624dd2f1a9fc/0/4082740000000000/40d31617571f210a/0/-1_4/406ed80000000000,404a800000000000,405e980000000000,4056000000000000/1_1/4054180000000000/
schema -2 -2/0/0/407e5800c341405c/c0bad121c0942d3b/2/-15_1/405eb00000000000/-15_1,1_4,1_2/4055000000000000,4051c00000000000,404d000000000000,4058400000000000,404a600000000000,0,3f2868280b817cc9/ => -2/0/0/407e5800c341405c/c0bad121c0942d3b/2/-15_1/405eb00000000000/-15_1,1_4,1_2/4055000000000000,4051c00000000000,404d000000000000,4058400000000000,404a600000000000,0,3f2868280b817cc9/
reset - 1/255bba08cf8c979d/0/4043800000000000/40a23827af1a1a4c/0/-18_1/4043800000000000/// 1/255bba08cf8c979d/0/4043800000000000/40a23827af1a1a4c/1/-18_1/4043800000000000/// => false
reset - -4/255bba08cf8c979d/0/407178042590605e/40c21b862221608a/0/-14_1/4051400000000000/5_1,0_3,1_4/4040800000000000,4033800000000000,0,404e800000000000,0,3f4e6e4614cd461a,3f15f1e7712049c8,4058400000000000/ -4/255bba08cf8c979d/0/407178042590605e/40c21b862221608a/3/-14_1/4051400000000000/5_1,0_3,1_4/4040800000000000,4033800000000000,0,404e800000000000,0,3f4e6e4614cd461a,3f15f1e7712049c8,4058400000000000/ => false
reset - 2/0/4045d00000000000/40744e0000000000/40d3dd25e284e69c/0/-10_4,2_2/403b400000000000,0,4038000000000000,4050c00000000000,4058580000000000,4036000000000000/// 2/0/4055d00000000000/40744e0000000000/40d3dd25e284e69c/3/-10_4,2_2/403b400000000000,0,4038000000000000,4050c00000000000,4058580000000000,4036000000000000/// => true
reset - 5/3f847ae147ae147b/0/4071060000000000/40d247e9e0bd5244/1/-5_2/403c200000000000,0/-17_3/4057d00000000000,4054b80000000000,4043000000000000/ 5/3f847ae147ae147b/0/4071060000000000/40d247e9e0bd5244/3/-5_2/404c200000000000,0/-17_3/4057d00000000000,4054b80000000000,4043000000000000/ => true
reset - 3/255bba08cf8c979d/4033000000000000/40802d002a1a2b5a/40913f5f65953449/0/-4_4/405e080000000000,4052800000000000,4053000000000000,4051c00000000000/1_1,2_4,1_2/404c800000000000,404b800000000000,4020000000000000,3effb0121d8935e1,4014800000000000,402ac00000000000,3f0a42224ae2c7f3/ 3/255bba08cf8c979d/4043000000000000/40802d002a1a2b5a/40913f5f65953449/3/-4_4/405e080000000000,4052800000000000,4053000000000000,4051c00000000000/1_1,2_4,1_2/404c800000000000,404b800000000000,4020000000000000,3effb0121d8935e1,4014800000000000,402ac00000000000,3f0a42224ae2c7f3/ => true
reset - -2/0/0/4070f600254fedb2/40c445a2785b3cd0/0/-20_2,0_1/4018000000000000,4051000000000000,0/7_1,0_2,0_2/4048000000000000,4059580000000000,3f02a7f6d9527fd2,0,4048000000000000/ 1/3fe0000000000000/403d000000000000/4075fa0000000000/40c2e7df0281b13f/0///-9_1,0_3/4055800000000000,4048000000000000,405ce80000000000,4052400000000000/ => true
reset - 6/255bba08cf8c979d/0/4042802015383d71/40933ec89221f11d/0/-3_1,2_1/0,4032802015383d71/// 8/255bba08cf8c979d/0/4042802015383d71/40933ec89221f11d/3/-2_2/4042800000000000,3f500a9c1eb89cfe/// => true
reset - 3/3f50624dd2f1a9fc/0/4087c3035e4be340/40bc4196c4145f9e/0/-11_1,2_3,0_4,2_3,2_4/3f2dd2df7ee6181e,3f45b39d647a1ae8,404b000000000000,3f487c437eeec312,405c000000000000,405a800000000000,4057a00000000000,405ba00000000000,403f000000000000,4049000000000000,0,3ee0095c35bff1c7,4056080000000000,4041200000000000,4054000000000000/// 3/3f50624dd2f1a9fc/0/406bb00d692630c9/40b80591a74d6d15/3/-11_1,2_3,0_3/3f2dd2df7ee6181e,3f45b39d647a1ae8,404b000000000000,3f487c437eeec312,404d800000000000,4047800000000000,404ec00000000000/// => false
reset - -53/0/0/404b800000000000/409743fc2e65993f/0/1_1/404b800000000000///3ff0000000000000,4014000000000000 -53/0/0/404b800000000000/409743fc2e65993f/2/1_2/404b800000000000,0///3ff0000000000000,4014000000000000,4024000000000000 => false
reset - -4/3f50624dd2f1a9fc/4042000000000000/406d6403a1b35f65/40b87b5e5dca48de/1/9_3,2_4/3f3d0d9afb266285,4018000000000000,0,4051c00000000000,4046100000000000,4032000000000000,404e000000000000/// -4/0/4051400000000000/40791a03c21b2118/40c0038621369979/1/-14_2,2_4/4059680000000000,3f377b4a37f18099,0,404e800000000000,4051400000000000,404c800000000000/-13_4/3f401468d1a49c26,3f11f658d9196e04,4031000000000000,403b000000000000/ => true
reset - 8/3fe0000000000000/405ec00000000000/408ff50199e66dab/40e143e14adbd6c6/0/3_2,0_3,0_2/4053400000000000,4051c00000000000,0,401c000000000000,4053f80000000000,406b680000000000,4060080000000000/-18_4,2_1,0_3/3f41f8b58ed6249b,4057e00000000000,404ae00000000000,4054000000000000,3f2e96c52f36d820,4056000000000000,0,0/ 8/3fe0000000000000/4054000000000000/4086e40199e66dab/40def358cb533f6f/2/3_2,0_1,2_2/4053400000000000,4051c00000000000,0,4058000000000000,4056d00000000000/-18_4,2_1,0_3/3f41f8b58ed6249b,4057e00000000000,404ae00000000000,4054000000000000,3f2e96c52f36d820,4056000000000000,0,0/ => false
reset - -4/255bba08cf8c979d/0/3f3a2aefef9b2dcc/bf7edb5c328a8927/0/-8_1/3f2a2aefef9b2dcc/// -4/255bba08cf8c979d/0/0/0/3///// => false
reset - 2/3f60624dd2f1a9fc/412e848000000000/416312d000000000/c0c11abe72c580df/0/-1_2,0_1,2_1/4045800000000000,4057400000000000,4036000000000000,3f42ff168ee146c0/-14_1,2_3,2_3/4050800000000000,4057000000000000,4051000000000000,4030000000000000,0,4030000000000000,0/ 2/3f50624dd2f1a9fc/0/407a00025fe2d1dc/c0c11abe72c580df/1/-1_2,0_1,2_1/4045800000000000,4057400000000000,4036000000000000,3f42ff168ee146c0/-14_1,2_3,2_3/4050800000000000,4057000000000000,4051000000000000,4030000000000000,0,4030000000000000,0/ => false
reset - -53/0/0/4046800000000000/40a09f1dc02b717e/0/1_1/4036800000000000///3ff0000000000000,4014000000000000 -53/0/0/4046800000000000/40a09f1dc02b717e/1/1_1/4046800000000000///3ff0000000000000,4014000000000000,4024000000000000 => true
reset - 0/3f847ae147ae147b/0/40735a025a530077/409dec52f0bf39b4/0/-3_1/403a8ccccccccccd/1_3/4059c00000000000,4066240000000000,3f42d29803ba32b5/ 2/3f847ae147ae147b/0/40735a025a530077/409dec52f0bf39b4/1/-13_2/401e000000000000,4036000000000000/2_4,1_2,0_1/4041000000000000,4050c00000000000,4000000000000000,4045800000000000,405b880000000000,4038000000000000,3f42d29803ba32b5/ => true
reset - -2/3f847ae147ae147b/0/405e801375ddb4c3/40a93fb9ef710a80/0/-16_1,2_1,0_3/3f3582db06c7b3bd,3f4c2a4de6219f4f,405e800000000000,0,0/// -2/3f847ae147ae147b/0/405e801375ddb4c3/40a93fb9ef710a80/2/-16_1,2_1,0_3/3f3582db06c7b3bd,3f4c2a4de6219f4f,405e800000000000,0,0/// => false
reset - -1/3f847ae147ae147b/0/4077e00000000000/40bfa1a481a1dc29/0/-3_1/4053480000000000/-3_3/4049800000000000,4053780000000000,4066000000000000/ 1/3f847ae147ae147b/0/4077e00000000000/40bfa1a481a1dc29/3/-15_3/4047900000000000,403e000000000000,0/-14_3,0_4,0_4/0,4049800000000000,0,0,403de00000000000,4048000000000000,0,0,404c800000000000,4039000000000000,4057800000000000/ => false
reset - -2/255bba08cf8c979d/401c000000000000/40856503ad323c59/40d702b0ea714289/0/-12_2,1_2,2_3/4056000000000000,4031000000000000,4052400000000000,3f4c7e21f82eb01a,404e800000000000,4058d00000000000,4053400000000000/-16_1,1_4/404fb00000000000,404e000000000000,3f4e5501cd654c7c,4054800000000000,4048000000000000/ -2/255bba08cf8c979d/401c000000000000/40856503ad323c59/40d702b0ea714289/2/-12_2,1_3,1_4/4056000000000000,4031000000000000,4052400000000000,3f4c7e21f82eb01a,0,404e800000000000,4058d00000000000,4053400000000000,4022000000000000/-16_1,1_4/404fb00000000000,404e000000000000,3f4e5501cd654c7c,4054800000000000,4048000000000000/ => true
reset - -1/3fe0000000000000/0/40718400f419c85b/c0985cd7922fd15b/0/-4_3,1_4/403c600000000000,4051400000000000,4050380000000000,0,4042000000000000,4054800000000000,3f2e83390b5c9c43/// -1/3fe0000000000000/0/40718400f419c85b/c0985cd7922fd15b/0/-4_3,1_4/403c600000000000,4051400000000000,4050380000000000,0,4042000000000000,4054800000000000,3f2e83390b5c9c43/// => false
reset - 1/3f50624dd2f1a9fc/0/406fdc0000000000/c0a82e54c3bf290c/0/-7_4/4043800000000000,4055000000000000,405ab80000000000,4039000000000000/// 2/3f50624dd2f1a9fc/0/406fdc0000000000/c0a82e54c3bf290c/2/-15_1,2_4/4043800000000000,4055000000000000,404ef00000000000,4046800000000000,4039000000000000/// => false
reset - -53/0/0/405de00000000000/40b9e1910b9613ac/0/0_1/4026000000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/405de00000000000/40b9e1910b9613ac/2/0_2/4026000000000000,405b200000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => true
reset - -53/0/0/0/8000000000000000/0/////4000000000000000 -53/0/0/0/8000000000000000/2/////4000000000000000 => false
reset - -53/0/0/0/0/0/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/0/0/1/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => false
reset - 2/3fe0000000000000/4022000000000000/4083c201d5baf644/40c8b392fbcca4fa/0/-3_7,0_1/4000000000000000,4057800000000000,0,4062200000000000,3f2ba173735f7df6,404f800000000000,4034000000000000,4022000000000000/-3_4/3f45d236030e8189,0,4056c00000000000,3ef423908bf25d29/ 2/3fe0000000000000/0/406360072182b8f4/40a0e08ecdb33217/2/-2_4,2_1/0,0,404b800000000000,3f284ae1718880ec,4022000000000000/-3_4/3f45d236030e8189,0,4056c00000000000,3ef423908bf25d29/ => false
reset - -2/3f847ae147ae147b/0/40714003e5941c56/c0a44994947a9589/0/-5_1,1_1/0,0/-4_4/4056400000000000,4058400000000000,4053000f96507159,402c000000000000/ -1/3f847ae147ae147b/0/40714003e5941c56/c0a44994947a9589/3/-10_1,2_1/0,0/-9_3,0_4/4008000000000000,4055800000000000,404b000000000000,4045800000000000,4053000000000000,3f4f2ca0e2b2ee2a,402c000000000000/ => false
reset - -4/3f50624dd2f1a9fc/0/4069200814429140/40cae8d7c959e134/0/2_3,0_4/4020000000000000,4055800000000000,4018000000000000,3f502885227f4d43,4056000000000000,402a000000000000,0/// -4/3f50624dd2f1a9fc/0/4069200814429140/40cae8d7c959e134/1/2_3,0_4/4020000000000000,4055800000000000,4018000000000000,3f502885227f4d43,4056000000000000,402a000000000000,0/// => false
reset - -53/0/0/0/0/0/////3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/0/0/3/////3ff0000000000000,4014000000000000,4024000000000000 => false
reset - 1/255bba08cf8c979d/403c000000000000/407b9a0000000000/40d4627506e56493/0/-19_2,25_2,1_3,0_1/0,4054c00000000000,4046800000000000,404a800000000000,4038000000000000,0,4055000000000000,405f280000000000/// 1/255bba08cf8c979d/403c000000000000/40766a0000000000/40d2d9c9d1f58740/2/8_2,1_3,0_1/4046800000000000,404a800000000000,4038000000000000,0,4055000000000000,405f280000000000/// => false
reset - -1/3f50624dd2f1a9fc/0/4033801eb0f3d617/40865d359029cc30/3///-15_2,2_2/401b000000000000,4029800000000000,3f3eb0f3d61681fe,0/ 2/3f847ae147ae147b/404c800000000000/404c800000000000/c08199b0b1556d2b/3///// => true
reset - -3/0/0/4062c40f4459d01e/408978b532ba3038/0/-2_1,1_2/401d400000000000,3f42657079c7c939,404b001a506abc34/-6_1,1_1,1_2/3f405b8c0a7ae26a,4053400000000000,4026000000000000,0/ -2/0/0/4062c40f4459d01e/408978b532ba3038/0/-4_1,2_1,1_2/4020400000000000,3f42657079c7c939,3f4a506abc340ed7,404b000000000000/-12_1,2_2,2_3/3f405b8c0a7ae26a,4018000000000000,4051c00000000000,4000000000000000,4022000000000000,0/ => true
reset - -2/255bba08cf8c979d/3f297a5cc13479bc/4062600197a5cc13/c095040da874438d/0/-16_3,0_2/404b800000000000,0,0,4054400000000000,4026000000000000/// 5/3f847ae147ae147b/0/40839b0000000000/c0b838eef98841d9/0///-18_4,1_1,2_2/405a800000000000,4044000000000000,404b000000000000,405b600000000000,4058c00000000000,405f380000000000,4057800000000000/ => true
reset - -53/0/0/4026000000000000/406d7db8b4e951df/3/0_1,0_1/0,4026000000000000///bff0000000000000,0,3fe0000000000000,4024000000000000 8/3fe0000000000000/0/4076a0010f5719e8/40d2583a16979f35/3/8_4,2_3/4051c00000000000,3f30f5719e7ad704,4021800000000000,4057000000000000,4057c00000000000,0,4057d00000000000/// => true
reset - -4/3fe0000000000000/0/40813b01c69c9adf/40e2d7731803f877/0/2_2,2_4,1_4/0,3f24dc2f115738e2,405bf00000000000,4051400000000000,0,3ee3377dbc9cc25e,404f000000000000,4057000000000000,0,4053c00000000000/-11_3,1_2,0_2/4010000000000000,404d000000000000,4046000000000000,0,3f45a6b4ac4ba388,3f03f2b4655e770d,403fa00000000000/ -4/3fe0000000000000/0/40813b01c69c9adf/40e2d7731803f877/3/2_2,2_4,1_4/0,3f24dc2f115738e2,405bf00000000000,4051400000000000,0,3ee3377dbc9cc25e,404f000000000000,4057000000000000,0,4053c00000000000/-11_3,1_2,0_2/4010000000000000,404d000000000000,4046000000000000,0,3f45a6b4ac4ba388,3f03f2b4655e770d,403fa00000000000/ => false
reset - 0/0/4040100000000000/406f140000000000/c0b65f915ab75980/0/-1099_1/4010000000000000/// 0/0/4040100000000000/406f140000000000/c0b65f915ab75980/3/-1100_2/4008000000000000,4010000000000000/// => true
reset - -4/255bba08cf8c979d/402c000000000000/405ac00000000000/4099f68b8be9588e/0/-1_2/4018000000000000,4055c00000000000/// -4/255bba08cf8c979d/402c000000000000/405ac00000000000/4099f68b8be9588e/2/-1_3,2_2/4018000000000000,4055c00000000000,0,0,0/// => false
reset - 0/3fe0000000000000/0/40776602e85b9034/40d85f179288d917/0/-1_2/404e900000000000,4018000000000000/5_3,1_3/4033000000000000,3f4742dc819e363c,4011000000000000,4052280000000000,4057000000000000,4053180000000000/ 0/3fe0000000000000/0/40776602e85b9034/40d85f179288d917/3/-1_3,0_1/404e900000000000,4018000000000000,0,4045800000000000/5_4,0_3/4033000000000000,3f4742dc819e363c,4011000000000000,0,4052280000000000,4057000000000000,4053180000000000/ => true
reset - 0/255bba08cf8c979d/0/4084440000000000/40e43e7814210e6c/0/-17_2,2_1/4020000000000000,4051000000000000,404f000000000000/1_2,3_6/4035000000000000,4053800000000000,4048800000000000,4028000000000000,4035000000000000,404fb00000000000,4052980000000000,4059300000000000/ 0/255bba08cf8c979d/0/4084440000000000/40e43e7814210e6c/2/-17_2,2_2/4020000000000000,4051000000000000,404f000000000000,4056c00000000000/1_3,2_2,0_4/4035000000000000,4053800000000000,0,4048800000000000,4028000000000000,4035000000000000,404fb00000000000,4052980000000000,4059300000000000/ => true
reset - -2/255bba08cf8c979d/0/40803f02f98ec8da/40e06d117a9b32be/0/-19_4/405f080000000000,4056800000000000,4056000000000000,4054c00000000000/9_4,1_3/401e800000000000,404cc00000000000,3f4aa42a45d79547,404e500000000000,4022000000000000,3f44f4c247ba65c6,0/ -2/255bba08cf8c979d/0/40803f02f98ec8da/40e06d117a9b32be/3/-19_4/405f080000000000,4056800000000000,4056000000000000,4054c00000000000/9_4,1_3/401e800000000000,404cc00000000000,3f4aa42a45d79547,404e500000000000,4022000000000000,3f44f4c247ba65c6,0/ => false
reset - 3/3fe0000000000000/403e00004f89b8ed/408633026a6c1ef5/40d9eb692b0ecdb0/0/-1_2,1_3/4054000000000000,40526403ba9d1d64,4054000000000000,3f4794889d4a3c9e,4052900000000000/-1_2/4064000000000000,4061600000000000/ 5/3fe0000000000000/3ed3e26e3b397ac3/40634805ef135e70/c08bb36d7c67fca0/3/6_4,1_1,1_2/0,4054000000000000,0,0,3f4794889d4a3c9e,4049a00000000000,4037000000000000/// => false
reset - 8/3fe0000000000000/404d000000000000/40760007d48baa28/40bfb2e19ca758dc/0/-5_2,2_5/4053800000000000,4046000000000000,3f5004d3c79c5a3c,3f295183279f11b7,3f41f1f42e3383a5,4054c00000000000,4056400000000000/// 8/3fe0000000000000/404d000000000000/404d000000000000/40935d576adc99c0/1///// => false
reset - -53/0/0/3f308a8afdc91116/3f904ced411bdef4/1/1_1/3f308a8afdc91116///4000000000000000 -53/0/0/4033000000000000/c08144da425ab29c/1/0_1/4033000000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => true
reset - -4/3fe0000000000000/0/405c400000000000/c0907d8c073b2ebe/0///-14_4,2_1/4000000000000000,0,4020000000000000,404f000000000000,4044800000000000/ -4/3fe0000000000000/0/405c400000000000/c0907d8c073b2ebe/2///-14_4,2_1/4000000000000000,0,4020000000000000,404f000000000000,4044800000000000/ => false
reset - -4/0/0/4063a0072078a673/40bff321d6c94308/0/-1099_1/4010000000000000/9_4,0_1/0,4026000000000000,3f33e94dc124571f,4041000000000000,3f1e4f87571edf20/ -4/0/0/4063a0072078a673/40bff321d6c94308/2/-1100_2/4008000000000000,4010000000000000/9_4,0_1/0,4026000000000000,3f33e94dc124571f,4041000000000000,3f1e4f87571edf20/ => true
reset - 1/3f60624dd2f1a9fc/412e848000000000/416312d000000000/40c186022a49dfe4/0/1_1/404c000000000000/// 1/0/405b200000000000/4064900000000000/40c186022a49dfe4/3/1_1/404c000000000000/// => false
reset - -1/3f50624dd2f1a9fc/0/3f4d1b62d237281f/3f9f3c70cfcfe15c/0/2_1/3f4a323f56cb3db6/// 0/3f50624dd2f1a9fc/0/3f4d1b62d237281f/3f9f3c70cfcfe15c/0/4_1/3f4d1b62d237281f/// => true
reset - 3/3f60624dd2f1a9fc/412e848000000000/416312d000000000/40c56453244c3bcf/0/-11_4,1_1/4044800000000000,0,4053400000000000,3ff0000000000000,4055c00000000000/// 3/0/0/4069c00000000000/40c56453244c3bcf/3/-11_4,1_1/4044800000000000,0,4053400000000000,3ff0000000000000,4055c00000000000/// => false
reset - -53/0/0/4078880000000000/40d40f2fb80b9652/0/0_1/4078880000000000/// -53/0/0/4061c00000000000/40b511b8a7213f54/1/0_2/404a800000000000,4056400000000000///bff0000000000000,0,3fe0000000000000,4024000000000000 => false
reset - -3/3fe0000000000000/3f4f5a297004d77f/407ff209e22d62fe/40dd9ee665d12831/0/0_7/4053000000000000,0,4065a40000000000,4052c00000000000,404de00000000000,404a800000000000,3f4af272a19e07c6/// -2/3fe0000000000000/3f4c7935ed8ebea5/406b980ddaea23cc/40c88b176da859fa/3/4_3,0_1,2_2/4040800000000000,0,4052c00000000000,404de00000000000,404a800000000000,3f4af272a19e07c6/// => false
reset - 4/3f847ae147ae147b/405ca00000000000/4072380000000000/40c80a96be3ffcdf/0/4_1/4054400000000000/-3_1/4058000000000000/ 5/3f847ae147ae147b/405ca00000000000/4072380000000000/40c80a96be3ffcdf/3/8_1/4054400000000000/-7_1/4058000000000000/ => false
reset - 0/3f60624dd2f1a9fc/412e848000000000/416312d000000000/40a3034a81e27877/0/0_2/4018000000000000,4045800000000000/// 0/0/0/4048800000000000/40a3034a81e27877/1/0_2/4018000000000000,4045800000000000/// => false
reset - -53/0/0/3f423c3ae31ee361/bf7b65589bf8b43c/1/0_3/0,3f423c3ae31ee361,0///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/3f423c3ae31ee361/bf7b65589bf8b43c/1/0_3/0,3f423c3ae31ee361,0///3ff0000000000000,4000000000000000,4014000000000000 => true
reset - 8/3f847ae147ae147b/0/4053801af206d495/4097c3de3b6b9b21/0///-16_3,1_2/3f4e61e575b30ba4,4053800000000000,0,3f47822833768b70,0/ 8/3f847ae147ae147b/0/4053801af206d495/4097c3de3b6b9b21/2///-16_3,1_2/3f4e61e575b30ba4,4053800000000000,0,3f47822833768b70,0/ => false
reset - -2/255bba08cf8c979d/404de00000000000/4085d802a9b8f1f9/40db4d7125ad51ee/0/-20_3,2_1,1_3,14_4,2_2/4042800000000000,0,403c000000000000,4050800000000000,4047800000000000,405e080000000000,0,0,4050800000000000,4050800000000000,4055c00000000000,3f3bd109f025b890,4047300000000000/-16_4,1_2,2_2/4026000000000000,402c000000000000,403f000000000000,0,4008000000000000,3f4cb30a278192d0,401c000000000000,4023800000000000/ -2/255bba08cf8c979d/4047000000000000/407832055371e3f2/40d0ebf79a681c96/1/4_4,2_2/0,4050800000000000,4050800000000000,4055c00000000000,3f3bd109f025b890,4047300000000000/-16_4,1_2,2_2/4026000000000000,402c000000000000,403f000000000000,0,4008000000000000,3f4cb30a278192d0,401c000000000000,4023800000000000/ => false
reset - 2/3fe0000000000000/0/0/0/0///// 2/3fe0000000000000/0/0/0/2///// => false
reset - 1/3fe0000000000000/4043c00000000000/407c7c02c108b30f/40c3e3e353504773/0/-10_2/4052c00000000000,4052800000000000/-15_4,2_4/4037000000000000,3f3619cc074be96d,4054c00000000000,3f35f6bf29ae1615,0,4031c00000000000,4035000000000000,4054c00000000000/ 1/3fe0000000000000/4053c00000000000/407c7c02c108b30f/40c3e3e353504773/3/-10_2/4052c00000000000,4052800000000000/-15_4,2_4/4037000000000000,3f3619cc074be96d,4054c00000000000,3f35f6bf29ae1615,0,4031c00000000000,4035000000000000,4054c00000000000/ => true
reset - 5/3f847ae147ae147b/0/4020000000000000/407c5ce8caf04bcd/0/-12_1/4020000000000000/// -1/3f847ae147ae147b/3f2f623c6628326b/406a6001f623c662/c0a8c1f0ee48f1e3/1/-18_4/4055800000000000,4050000000000000,404e800000000000,0/// => true
reset - -53/0/0/0/0/0/////4000000000000000 -53/0/0/0/0/0/////4000000000000000 => false
reset - 2/255bba08cf8c979d/0/4063300000000000/40c2dc8bb07840b4/0/-3_2/404c000000000000,4058600000000000/// 3/255bba08cf8c979d/0/4063300000000000/40c2dc8bb07840b4/2/-6_3/404c000000000000,4054400000000000,4030800000000000/// => false
reset - -1/3f50624dd2f1a9fc/3f50a97112736f6c/4069240c21ecfe01/c0b6259adc7d2260/0/-1_1,0_4/405a080000000000,4053400000000000,4030000000000000,4010000000000000,3f3e69a3a6379fee/// -1/3f50624dd2f1a9fc/3f4b7b1c0f741447/4069240aabfb78a4/c0b6259a3213d4ea/0/-1_1,0_4/405a080000000000,4053400000000000,4030000000000000,4010000000000000,3f3e69a3a6379fee/// => false
reset - -53/0/0/4056c003f9219a09/40b33adc58be43f6/0/0_3/404c8007f2433413,0,4031000000000000///3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/3f2fc90cd04a8897/bf707404426db297/3/0_2/3f2fc90cd04a8897,0///3ff0000000000000,4014000000000000,4024000000000000 => false
reset - -53/0/0/404c701c459ce558/4094dfd6e343d585/0/0_3/4046800000000000,4027c03caac981c9,3f3a35d509cc163e///3ff0000000000000,4014000000000000 -53/0/0/0/0/0/////3ff0000000000000,4014000000000000,4024000000000000 => false
reset - -3/3f847ae147ae147b/0/406d3c06e2eeb086/40c32f29690a8a91/0/-6_1,1_4/4050000000000000,4055400000000000,402fc00000000000,4051400058c9c5f6,3f4ada27362aa8e3/// -2/3f847ae147ae147b/0/406d3c06e2eeb086/40c32f29690a8a91/0/-12_1,2_4,0_3/4050000000000000,4055000000000000,3ff0000000000000,4024000000000000,4017800000000000,3ef632717d8dec13,4051400000000000,3f4ada27362aa8e3/// => false
reset - -4/0/0/0/8000000000000000/0///// 2/3f847ae147ae147b/0/407a5a08316a71f8/40c03c7a9b3b886f/3/9_1,1_2,2_3/4051400000000000,3f470e92a37c6b80,3f4c2a31caa11c1f,0,4040800000000000,4039000000000000/5_4,2_4,0_3/0,3f3ca51e434753c9,0,0,0,4037000000000000,405c400000000000,404d000000000000,4051e80000000000,4039000000000000,4010000000000000/ => true
reset - -2/0/0/405ad81127db2fee/40b28a4cc380a1d5/0/-1099_1/4010000000000000/// -2/0/0/405ad81127db2fee/40b28a4cc380a1d5/1/-1100_2/4008000000000000,4010000000000000/// => true
reset - 3/3f847ae147ae147b/4042000000000000/4068140000000000/4090959552c103c7/0/1_3/4048000000000000,0,405b280000000000/// 5/3f847ae147ae147b/4042000000000000/4068140000000000/4090959552c103c7/3/4_1,1_1,2_3/4048000000000000,0,4018000000000000,0,4059a80000000000/// => false
reset - -2/3fe0000000000000/0/4064c00777cf3e6f/40ad81bee3982381/0/-8_1,1_3,0_1/0,4054800000000000,4055000000000000,3f2762483d6c3f6e,3f4806aaea60ad00/// -2/3fe0000000000000/0/4064c00777cf3e6f/40ad81bee3982381/1/-8_1,1_3,0_1/0,4054800000000000,4055000000000000,3f2762483d6c3f6e,3f4806aaea60ad00/// => false
reset - -4/3f847ae147ae147b/0/4058a815833b7a70/40bacef5c138f62c/0/-7_4,1_2/3f449925f55d7c30,4035000000000000,404ad00000000000,4038000000000000,0,3f466d50ff816e42/// -4/3f847ae147ae147b/0/4058a815833b7a70/40bacef5c138f62c/3/-7_4,1_2/3f449925f55d7c30,4035000000000000,404ad00000000000,4038000000000000,0,3f466d50ff816e42/// => false
reset - -2/0/0/4063bc0000000000/40af9ea900aed8f7/2/-6_1,1_4,1_1/0,4024000000000000,0,0,4039c00000000000,405e880000000000/// 5/3fe0000000000000/3f3e0461f0da5ce7/40789005ada683f8/c0c34580f54df972/1/-8_2,2_4,0_3/4052c00000000000,4026000000000000,3f4e6b03274efcf0,0,4050000000000000,4041000000000000,4057800000000000,4040800000000000,4054800000000000/// => false
reset - 0/0/0/406ea0015f53ec8c/406cb28bea6595bd/0/-1099_1/4010000000000000/// 0/0/0/406ea0015f53ec8c/406cb28bea6595bd/1/-1100_2/4008000000000000,4010000000000000/// => true
reset - 2/3ff0000000000000/412e848000000000/416312d000000000/40d35d01cd3c463a/0/8_2,0_3,1_1/4057e00000000000,4053400000000000,4035000000000000,404b200000000000,4044000000000000,4042200000000000/// 2/3fe0000000000000/0/4074400000000000/40d35d01cd3c463a/2/8_2,0_3,1_1/4057e00000000000,4053400000000000,4035000000000000,404b200000000000,4044000000000000,4042200000000000/// => false
reset - 8/3f947ae147ae147b/412e848000000000/416312d000000000/0/0///// 8/3f847ae147ae147b/0/0/0/0///// => false
reset - -1/3fe0000000000000/4050000000000000/4050000000000000/40a0a3662e2958bd/0///// 0/3fe0000000000000/4050000000000000/4050000000000000/40a0a3662e2958bd/2///// => false
reset - -53/0/0/404f000000000000/409540cbde9cb91d/0/0_1/404f000000000000///4000000000000000 -53/0/0/0/8000000000000000/3/////4000000000000000 => false
reset - 3/0/4060000000000000/406ea004126c51f8/40c0bbe850a37b19/0/-10_1,0_3,2_1/3f4049b147de77aa,0,4047800000000000,4051800000000000,0/// 3/0/4059000000000000/406b2004126c51f8/40c156c195227304/1/-10_1,0_3,2_1/3f4049b147de77aa,0,4047800000000000,4051800000000000,0/// => false
reset - -4/3f847ae147ae147b/4010800000000000/4051481185c66f6e/40a32c306fe8fe45/0/5_1/3f262e30c50f2eef/// -4/3f847ae147ae147b/0/3f262e30c50f2eef/3f80e0f16fa0f0fb/0/5_1/3f262e30c50f2eef/// => false
reset - -2/0/0/40617807f1a03a3f/40a6909b48bdbca5/0/-1099_1/4010000000000000/-13_3/401c000000000000,3f4fc680e8fb6d9b,4053200000000000/ -2/0/0/40617807f1a03a3f/40a6909b48bdbca5/3/-1100_2/4008000000000000,4010000000000000/-13_3/401c000000000000,3f4fc680e8fb6d9b,4053200000000000/ => true
reset - 8/3ff0000000000000/412e848000000000/416312d000000000/405989729aac957a/0/6_2,1_4,2_2/0,3f02e2510ebc090b,4050800000000000,4052400000000000,4054400000000000,4019800000000000,4041800000000000,4052800000000000/// 8/3fe0000000000000/0/4074f60025c4a21e/405989729aac957a/3/6_2,1_4,2_2/0,3f02e2510ebc090b,4050800000000000,4052400000000000,4054400000000000,4019800000000000,4041800000000000,4052800000000000/// => false
reset - 0/255bba08cf8c979d/0/404f000000000000/408c22d35cc84836/0/4_1,1_1/0,404f000000000000/// 1/255bba08cf8c979d/0/404f000000000000/408c22d35cc84836/0/8_1,2_1/0,404f000000000000/// => false
reset - -1/3f50624dd2f1a9fc/403c000000000000/407a8604e0a317a0/c0b01be4d45e5138/0/-6_4,3_3/4028000000000000,4058c009efe96010,4049800000000000,403a000000000000,4050000000000000,4050d00000000000,4043480000000000/4_1/3f432545fcdddac6/ 0/3f50624dd2f1a9fc/0/40678009c1462f3f/c0a32394b3b84786/1/-13_4,1_2/0,4028000000000000,3f43dfd2c020def4,4058c00000000000,4049800000000000,403a000000000000/8_1/3f432545fcdddac6/ => false
reset - -53/0/0/0/0/3/////4000000000000000 -53/0/0/0/0/0/////4000000000000000 => false
equals - -2/255bba08cf8c979d/0/4064400000000000/c0b0126199bb31ca/2/-1_3,2_3/0,0,4050400000000000,4050c00000000000,403e000000000000,0/// -2/255bba08cf8c979d/0/4064400000000000/c0b0126199bb31ca/2/-1_3,2_3/8000000000000000,0,4050400000000000,4050c00000000000,403e000000000000,0/// => false
equals - 8/3fe0000000000000/0/406f300000000000/c0b53f9b1398ab96/3/3_3,2_2,2_2/0,4043000000000000,0,0,0,4058000000000000,4048400000000000/// 8/3fe0000000000000/0/406f300000000000/c0b53f9b1398ab96/3/3_3,2_2,2_2/8000000000000000,4043000000000000,0,0,0,4058000000000000,4048400000000000/// => false
equals - -53/0/0/0/0/3/////bff0000000000000,0,3fe0000000000000,4024000000000000 -53/0/0/0/0/3/////bff0000000000000,0,3fe0000000000000,4024000000000000 => true
equals - -2/255bba08cf8c979d/3f1b9c015a4a8cac/3f1b9c015a4a8cac/3f73acc75511da9b/2///// 2/3f50624dd2f1a9fc/0/404b000000000000/40ab5e87392ee242/1/-11_2/404b000000000000,0/// => false
equals - 5/255bba08cf8c979d/4047000000000000/4047000000000000/409b7f19e51e950a/2///// 5/255bba08cf8c979d/4047000000000000/4047000000000000/409b7f19e51e950a/2///// => true
equals - 8/3f847ae147ae147b/0/40650007bdac69a3/c0b23f8c9c9d35a3/1/2_2/4042400000000000,403c000000000000/-5_3,2_3/404f400000000000,3f46f0bd1cd3662b,0,4033000000000000,4036000000000000,3f300be913702e76/ 8/3f847ae147ae147b/0/40650007bdac69a3/c0b23f8c9c9d35a3/1/2_2/4042400000000000,403c000000000000/-5_2,3_3/404f400000000000,3f46f0bd1cd3662b,4033000000000000,4036000000000000,3f300be913702e76/ => false
equals - 3/3f847ae147ae147b/4050400000000000/405cc004fb9490c8/409ec5467e0280ce/2/2_2,2_1/3f33ee52431f05cc,4047000000000000,4010000000000000/// 1/255bba08cf8c979d/0/4075d60002a51574/40a41bc256d5b04a/2///-16_1,0_4,2_2/4042300000000000,4054780000000000,4054800000000000,4010000000000000,3ec528aba2e0b760,4057800000000000,4049900000000000/ => false
equals - -53/0/0/0/0/0/////4000000000000000 -53/0/0/0/0/0/////4000000000000000 => true
equals - 0/255bba08cf8c979d/3ff0000000000000/405d180a8a16c3d7/408375e3b355f476/3/-20_1,1_2,1_3/0,3f44b046c5751d17,4050c00000000000,3ee8f9b08e013814,4043800000000000,4022c00000000000/// 0/255bba08cf8c979d/3ff0000000000000/405d180a8a16c3d7/408375e3b355f476/3/-20_1,1_2,1_3/8000000000000000,3f44b046c5751d17,4050c00000000000,3ee8f9b08e013814,4043800000000000,4022c00000000000/// => false
equals - 8/3f50624dd2f1a9fc/3f2d66a05b1ec9d5/404a0026c69b72a9/40a33343d667473e/3/-3_1,2_1/404a000000000000,3f4f6cf35be0bfae/// 8/3f50624dd2f1a9fc/3f2d66a05b1ec9d5/404a0026c69b72a9/40a33343d667473e/3/-3_1,2_1/404a000000000000,3f4f6cf35be0bfae/// => true
equals - -53/0/0/4042b00000000000/c04cdc5d6f682bc5/1/0_1/4042b00000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/4042b00000000000/c04cdc5d6f682bc5/1/0_1/4042b00000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => true
equals - 5/3fe0000000000000/0/4067300000000000/c0ab897d5fe09f3a/2/-15_1,2_3/0,4034000000000000,4059100000000000,4047a00000000000/// 5/3fe0000000000000/0/4067300000000000/c0ab897d5fe09f3a/2/-15_1,2_3/8000000000000000,4034000000000000,4059100000000000,4047a00000000000/// => false
equals - 5/255bba08cf8c979d/0/4069c00949e31bad/40b0a45461f1912b/3/1_3,2_2,2_3/4010000000000000,4042800000000000,4024000000000000,4038000000000000,4044000000000000,3f230033b16a6305,0,402c000000000000/5_1,1_1/4053400000000000,3f5033bfc12d5455/ 5/255bba08cf8c979d/0/4069c00949e31bad/40b0a45461f1912b/3/1_3,2_2,2_1,1_1/4010000000000000,4042800000000000,4024000000000000,4038000000000000,4044000000000000,3f230033b16a6305,402c000000000000/5_1,1_1/4053400000000000,3f5033bfc12d5455/ => false
equals - 2/255bba08cf8c979d/4055800000000000/406ba00000000000/40a8a1fe3c43e281/3/4_2/0,4056c00000000000/8_1/4046000000000000/ 2/255bba08cf8c979d/4055800000000000/406ba00000000000/40a8a1fe3c43e281/3/4_2/8000000000000000,4056c00000000000/8_1/4046000000000000/ => false
equals - -53/0/0/0/0/0/////3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/0/0/0/////3ff0000000000000,4000000000000000,4014000000000000 => true
equals - -2/3f50624dd2f1a9fc/404e000000000000/4065800000000000/40c685d3d2392045/0/8_3/4057000000000000,0,4034000000000000/// -2/3f50624dd2f1a9fc/404e000000000000/4065800000000000/40c685d3d2392045/0/8_1,1_1/4057000000000000,4034000000000000/// => false
equals - -53/0/0/0/0/1/1_1/0///bff0000000000000,0,3fe0000000000000,4024000000000000 -53/0/0/0/0/1/1_1/8000000000000000///bff0000000000000,0,3fe0000000000000,4024000000000000 => false
equals - 2/3f847ae147ae147b/0/40771c0000000000/40d22c550365442b/3///0_4,0_2,1_2/4055d00000000000,4056400000000000,405eb80000000000,4042500000000000,0,0,4041000000000000,0/ -4/3fe0000000000000/4057000000000000/406668033223e1be/40b7f4cdc7faf86f/3///-1_2/4055d00000000000,3f39911f0dedae2c/ => false
equals - -1/3f847ae147ae147b/0/40778207222382fa/40d3840afb034669/1/-20_4,0_3,0_2/3f4940b6691ced4d,4057c00000000000,0,3f4fd065aeafcc67,405f100000000000,4038000000000000,4031400000000000,401c000000000000,405b280000000000/// -2/0/402a800000000000/4066680000000000/40bc2f10bb7da01c/1/9_1,2_3/4044000000000000,4050800000000000,0,4044000000000000/-4_1/4034000000000000/ => false
equals - -1/0/4014000000000000/4014000000000000/406add692e2b65c1/0///// -1/0/4014000000000000/4014000000000000/406add692e2b65c1/0///// => true
equals - 1/0/3f3abcb272b72dc6/40745e0699240bf5/c094e4a1634cc93c/3/3_1,2_2,0_3/3f335b9a24a51208,4030000000000000,4045700000000000,4036000000000000,4058000000000000,0/-17_4,0_2,0_1/404f800000000000,3f35b68427a11737,3f30a477719e97d7,0,3f351ef88eb02837,4055800000000000,0/ 1/0/3f3abcb272b72dc6/40745e0699240bf5/c094e4a1634cc93c/3/3_1,2_4/3f335b9a24a51208,4030000000000000,4045700000000000,4036000000000000,4058000000000000/-17_3,1_2/404f800000000000,3f35b68427a11737,3f30a477719e97d7,3f351ef88eb02837,4055800000000000/ => false
equals - -1/255bba08cf8c979d/0/406160077b5cc802/c0a55c12090ff9e3/3/-20_4,0_2,1_1/4048000000000000,3ff0000000000000,3f4ded732007f394,0,0,0,4056800000000000/// -1/255bba08cf8c979d/0/406160077b5cc802/c0a55c12090ff9e3/3/-20_3,4_1/4048000000000000,3ff0000000000000,3f4ded732007f394,4056800000000000/// => false
equals - -53/0/0/405c000000000000/40a2099422d11d43/2/1_3/4043000000000000,4044800000000000,4040800000000000///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/405c000000000000/40a2099422d11d43/2/1_3/4043000000000000,4044800000000000,4040800000000000///3ff0000000000000,4000000000000000,4014000000000000 => true
equals - -2/0/0/0/0/3/-15_1/0/// -2/0/0/0/0/3/-15_1/8000000000000000/// => false
equals - 5/3f50624dd2f1a9fc/4034200000000000/4034200000000000/c08101fc5eff7d4b/0///// 5/3f50624dd2f1a9fc/4034200000000000/4034200000000000/c08101fc5eff7d4b/0///// => true
equals - 0/0/0/4084c603a9c75207/40e3516002ad4413/1/-5_2,1_4/4053400000000000,4055400000000000,4022000000000000,0,3f4d05efbe635f9a,4058400000000000/-7_4,2_4/4052400000000000,4058700000000000,4014000000000000,0,405cd00000000000,3f4d96856208abf9,4011000000000000,4059600000000000/ 0/0/0/4084c603a9c75207/40e3516002ad4413/1/-5_2,1_1,1_2/4053400000000000,4055400000000000,4022000000000000,3f4d05efbe635f9a,4058400000000000/-7_3,3_4/4052400000000000,4058700000000000,4014000000000000,405cd00000000000,3f4d96856208abf9,4011000000000000,4059600000000000/ => false
equals - 8/0/0/0/8000000000000000/2///// -2/3f50624dd2f1a9fc/0/4069200017f343fb/40b10719abb48945/2/3_3,2_4/0,0,3ff0000000000000,404a800000000000,4053c00000000000,3ee7f343fb4786e8,4051000000000000/// => false
equals - 2/3f847ae147ae147b/0/4055000000000000/40af3bdf4ee3d42b/3/-3_2/4047000000000000,4043000000000000/// 2/3f847ae147ae147b/0/4055000000000000/40af3bdf4ee3d42b/3/-3_2/4047000000000000,4043000000000000/// => true
equals - -53/0/0/40658c0000000000/c0a0facc2c0ebcd1/1/0_3/4053800000000000,4052b00000000000,4033a00000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/40658c0000000000/c0a0facc2c0ebcd1/1/0_3/4053800000000000,4052b00000000000,4033a00000000000///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => true
equals - 0/255bba08cf8c979d/3f453b21f4d42f4c/3f453b21f4d42f4c/3fa3c8696907ea09/2///8_1/0/ 0/255bba08cf8c979d/3f453b21f4d42f4c/3f453b21f4d42f4c/3fa3c8696907ea09/2///8_1/0/ => true
equals - -53/0/0/4038000000000000/40798905fe920e9e/2/1_1/4038000000000000///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/4038000000000000/40798905fe920e9e/2/1_1/4038000000000000///3ff0000000000000,4000000000000000,4014000000000000 => true
equals - -53/0/0/3f472db10700449c/3fa3f36dbb150444/0/0_1/3f472db10700449c///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/3f472db10700449c/3fa3f36dbb150444/0/0_1/3f472db10700449c///3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => true
equals - 5/3fe0000000000000/403e000000000000/405c800000000000/4094e700b1d74519/0/-11_2/0,4055000000000000/// 5/3fe0000000000000/403e000000000000/405c800000000000/4094e700b1d74519/0/-11_2/0,4055000000000000/// => true
equals - 1/0/3f4faf82e0158416/4059b01fb09c3428/40b23d90a95ff270/1/-12_3,1_2,1_2/0,0,3f4fb1b5883b78f0,4033000000000000,0,4044600000000000,0/// 1/0/3f4faf82e0158416/4059b01fb09c3428/40b23d90a95ff270/1/-12_3,1_2,1_2/8000000000000000,0,3f4fb1b5883b78f0,4033000000000000,0,4044600000000000,0/// => false
equals - 8/0/0/0/8000000000000000/2///1_1,0_1/0,0/ 8/0/0/0/8000000000000000/2///// => false
equals - -53/0/0/4044000000000000/c08d2a9b156837e2/1/0_2/0,4044000000000000///3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/4044000000000000/c08d2a9b156837e2/1/1_1/4044000000000000///3ff0000000000000,4014000000000000,4024000000000000 => false
equals - 5/3f847ae147ae147b/3f502cb86ccce032/40634008165c3666/c091fb48158dd12c/3/0_3/0,404e800000000000,4056800000000000/// 5/3f847ae147ae147b/3f502cb86ccce032/40634008165c3666/c091fb48158dd12c/3/0_3/8000000000000000,404e800000000000,4056800000000000/// => false
equals - -53/0/0/405b900000000000/40ba976f7f553953/2/0_2/4059d00000000000,401c000000000000///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/405b900000000000/40ba976f7f553953/2/0_2/4059d00000000000,401c000000000000///3ff0000000000000,4000000000000000,4014000000000000 => true
equals - -53/0/0/0/0/2/////4000000000000000 -53/0/0/0/0/2/////4000000000000000 => true
equals - -2/0/0/0/0/3///// -2/0/0/0/0/3///// => true
equals - 8/0/0/407d820539702c75/40d16ecab023d890/0///-9_3,1_4,1_3/4040000000000000,4036e00000000000,405cd00000000000,3f4675ba8b5777b8,404b800000000000,4052c00000000000,4047000000000000,3f4355c6d85252e4,4054400000000000,4046800000000000/ 8/0/0/407d820539702c75/40d16ecab023d890/0///-9_3,1_4,1_3/4040000000000000,4036e00000000000,405cd00000000000,3f4675ba8b5777b8,404b800000000000,4052c00000000000,4047000000000000,3f4355c6d85252e4,4054400000000000,4046800000000000/ => true
equals - -53/0/0/4056c00000000000/40b2b3b00143762e/3/0_1/4056c00000000000///4000000000000000 -53/0/0/4056c00000000000/40b2b3b00143762e/3/0_1/4056c00000000000///4000000000000000 => true
equals - 1/0/0/4064c40000000000/c0861cb896add205/2///-12_4,1_1/4030000000000000,4045800000000000,403e000000000000,4051400000000000,4020400000000000/ -1/3f50624dd2f1a9fc/0/40652002bbdfbbfe/407338515c1041ec/3/-15_4,2_3,2_1/4050000000000000,4040800000000000,0,0,3f35defddff45099,0,401c000000000000,4050400000000000/// => false
equals - 3/3f50624dd2f1a9fc/3f44caf6455707a7/3f44caf6455707a7/3f91ff9e4c85a0e1/2///// 3/3f50624dd2f1a9fc/3f44caf6455707a7/3f44caf6455707a7/3f91ff9e4c85a0e1/2///// => true
equals - 5/255bba08cf8c979d/0/0/0/3///// -1/255bba08cf8c979d/4051000000000000/4087440735f2fa5f/c0c30adcf3223021/1/-17_4,0_3,2_4/402a000000000000,3f4619b9cf6ed76b,4014000000000000,4042000000000000,3f3bd7fae25880ca,0,4058000000000000,4030000000000000,4021000000000000,4052c00000000000,3f43989eaa370450/-2_4,0_4,0_3/3f42d18ee83bb0f0,4053c00000000000,4051980000000000,4053000000000000,3f3911ed968f176c,3f2d30cfe2e6efd5,401a800000000000,4049800000000000,404e800000000000,4054c00000000000,3f451a200ef25300/ => false
equals - -1/3f847ae147ae147b/3efe089e949fd4a4/40796e05c4d7173c/40bdfee931e72249/3/-6_3/4054800000000000,3f4634db3a3d9494,4056780000000000/0_1,0_4,0_2/4058400000000000,3f40101924fda0b7,3f2bc5fd97f59eda,0,4047000000000000,4033800000000000,4052200000000000/ -2/3f50624dd2f1a9fc/404e800000000000/4074b00000000000/40d5e0c287ca29b0/1/1_3,0_1/4018000000000000,405d000000000000,4056000000000000,404e000000000000/// => false
equals - -53/0/0/4057800d5d0fb78b/40b91f062f0b7a12/2/0_2/3f4aba1f6f16c966,4057800000000000///4000000000000000 -53/0/0/4057800d5d0fb78b/40b91f062f0b7a12/2/0_2/3f4aba1f6f16c966,4057800000000000///4000000000000000 => true
equals - 8/255bba08cf8c979d/0/0/0/1///// 5/3fe0000000000000/0/4065600000000000/c0a49b798dab681e/0/-16_2,0_2/4036000000000000,404c800000000000,4050400000000000,403b000000000000/// => false
equals - 0/3fe0000000000000/4028000000000000/4028000000000000/407554a52523c74f/1///// 1/3fe0000000000000/0/0/0/0///// => false
equals - -53/0/0/0/8000000000000000/0/////4000000000000000 -53/0/0/0/8000000000000000/0/////4000000000000000 => true
equals - -53/0/0/0/0/3/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/0/0/3/////3fe0000000000000,3ff0000000000000,4000000000000000,4014000000000000 => true
equals - -4/0/3f0237972520c7ad/3f0237972520c7ad/bf2bb79f0d65e9c3/2///// 3/3f50624dd2f1a9fc/4053180000000000/4053180000000000/4091072cca239ffa/3///// => false
equals - -53/0/0/0/0/3/////4000000000000000 -53/0/0/0/0/3/////4000000000000000 => true
equals - -53/0/0/0/0/2/////3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/0/0/2/////3ff0000000000000,4014000000000000,4024000000000000 => true
equals - -53/0/0/0/0/2/////3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/0/0/2/////3ff0000000000000,4000000000000000,4014000000000000 => true
equals - 1/0/4039000000000000/4060200a4c30bee9/40c0ff348d2dc451/1/-15_2,1_2/404f800000000000,4044800000000000,3f33dcd6e1addb9e,3f4f42578acd3a8b/// 1/0/4039000000000000/4060200a4c30bee9/40c0ff348d2dc451/1/-15_2,1_2/404f800000000000,4044800000000000,3f33dcd6e1addb9e,3f4f42578acd3a8b/// => true
equals - -2/3fe0000000000000/0/40741a03fa25fadb/40b1f6c34441a3e5/2/8_1,2_2,0_2/4020000000000000,4035000000000000,402c000000000000,404c000000000000,3f40b9c714394544/7_3,1_4/0,3f3e2ed18541cc2d,4047800000000000,404d800000000000,4046800000000000,4051880000000000,3ff8000000000000/ -2/3fe0000000000000/0/40741a03fa25fadb/40b1f6c34441a3e5/2/8_1,2_2,0_2/4020000000000000,4035000000000000,402c000000000000,404c000000000000,3f40b9c714394544/7_3,1_4/0,3f3e2ed18541cc2d,4047800000000000,404d800000000000,4046800000000000,4051880000000000,3ff8000000000000/ => true
equals - 1/0/0/4072d600e475c282/40b8f007f8607875/0/-3_4,1_3,2_2/0,404f000000000000,403ea00000000000,4058000000000000,3f2c8eb8503bec6f,4045e00000000000,4039000000000000,0,0/// 1/0/0/4072d600e475c282/40b8f007f8607875/0/-3_4,1_3,2_2/8000000000000000,404f000000000000,403ea00000000000,4058000000000000,3f2c8eb8503bec6f,4045e00000000000,4039000000000000,0,0/// => false
equals - -4/3f50624dd2f1a9fc/0/4072280000000000/40c1cbb4fecb1032/1/-3_2,1_3/0,4057800000000000,4049000000000000,4044000000000000,405aa00000000000/// -4/3f50624dd2f1a9fc/0/4072280000000000/40c1cbb4fecb1032/1/-2_1,1_3/4057800000000000,4049000000000000,4044000000000000,405aa00000000000/// => false
equals - -1/3f847ae147ae147b/404e800000000000/4067540000000000/c09aaab8088c5039/0/-2_4/4031a00000000000,404b800000000000,404a800000000000,0/// -1/3f847ae147ae147b/404e800000000000/4067540000000000/c09aaab8088c5039/0/-2_4/4031a00000000000,404b800000000000,404a800000000000,0/// => true
equals - -2/3f847ae147ae147b/403e000000000000/403e000000000000/405a2bbec80ab759/2///// -2/3f847ae147ae147b/403e000000000000/403e000000000000/405a2bbec80ab759/2///// => true
equals - 3/3fe0000000000000/0/0/0/0///// 3/3fe0000000000000/0/0/0/0///// => true
equals - 2/3f50624dd2f1a9fc/3f21b68272619648/40811f015c677b8d/c0922cd0948c3aa5/1/6_2,1_4,0_4/4055000000000000,3f4158d71c39af74,4049000000000000,4058800000000000,4048000000000000,4052400000000000,4045700000000000,4044000000000000,4034000000000000,4057000000000000/// 2/3f50624dd2f1a9fc/3f21b68272619648/40811f015c677b8d/c0922cd0948c3aa5/1/6_2,1_4,0_4/4055000000000000,3f4158d71c39af74,4049000000000000,4058800000000000,4048000000000000,4052400000000000,4045700000000000,4044000000000000,4034000000000000,4057000000000000/// => true
equals - 2/3fe0000000000000/3f4dec65539189e5/4073b40c781f18b1/40d02f3c71e3baa5/1/-11_4,2_4,0_3/4040600000000000,3f426870abbee820,0,4050000000000000,3f40937fc1da3410,3f4bd1e920e14658,0,3f13add0dc95905c,3f2243ff1fa9f817,4054c00000000000,405a200000000000/-3_1/403f000000000000/ 8/3fe0000000000000/4028000000000000/4074f402d799414b/40d4427da40fefce/1///-18_4,0_2,1_3/4041200000000000,404c800000000000,404d800000000000,0,3f46bcca0a582a15,4042800000000000,4052c00000000000,4045000000000000,4033000000000000/ => false
equals - -2/3f50624dd2f1a9fc/3f340947981abd35/407f0003da46a96e/40e0e3727cb9d49b/1/5_3,0_2/0,4044000000000000,0,404d800000000000,4056800000000000/2_4,2_4,1_2/4008000000000000,404f000000000000,3f44cd917f69b32f,403b000000000000,4043000000000000,4044000000000000,4037000000000000,4055000000000000,403a000000000000,4010000000000000/ -2/3fe0000000000000/0/4071800000000000/40d26ed9539dbd64/2/-4_4,1_4/4045000000000000,4047800000000000,4024000000000000,4028000000000000,404b000000000000,4050800000000000,401c000000000000,4045000000000000/// => false
equals - 1/0/4049000000000000/40792803e5d72b40/40c1efde1901cc9e/1///-2_4,2_4,1_2/0,4052800000000000,4057c00000000000,4033000000000000,0,4039e00000000000,4042000000000000,4059a80000000000,3f4f2eb95a02be6c,0/ 0/255bba08cf8c979d/0/406bc80450ccdf90/c0b42528c8184fb4/0/3_1/3f4143337e41f043/0_1,0_4,0_1/4042800000000000,0,404d000000000000,0,4051d00000000000,404c000000000000/ => false
equals - 3/3fe0000000000000/0/0/8000000000000000/2///// 2/3fe0000000000000/4053700000000000/4062f00000000000/40b1d7a2c8ba2f5b/1/5_1,2_1,1_1/4045900000000000,0,402a000000000000/-7_1/4031a00000000000/ => false
equals - 0/0/3f491ad8ce51d0a0/3f491ad8ce51d0a0/3f976bc03837004d/0///// 0/3fe0000000000000/0/4066c40bbdd94480/40c894e31355ea51/1/-19_2,2_4/4000000000000000,0,3f4e493670f06e3e,4052000000000000,3f40ae2ea10e5816,405b080000000000/// => false
equals - 8/3f847ae147ae147b/4049300000000000/405ed80000000000/40b9c1d9f77c7397/1/-19_2/404a800000000000,4034000000000000/// 8/3f847ae147ae147b/4049300000000000/405ed80000000000/40b9c1d9f77c7397/1/-19_2/404a800000000000,4034000000000000/// => true
equals - -1/3f50624dd2f1a9fc/0/0/8000000000000000/2///// -1/3f50624dd2f1a9fc/0/0/8000000000000000/2///// => true
equals - -53/0/0/4050000000000000/40937ab7fd78645e/3/1_1/4050000000000000///3ff0000000000000,4000000000000000,4014000000000000 -53/0/0/4050000000000000/40937ab7fd78645e/3/1_1/4050000000000000///3ff0000000000000,4000000000000000,4014000000000000 => true
equals - 1/3f847ae147ae147b/3f380e6899725d94/407ca20688393176/40b8ec11f66a6e17/1/-8_2,2_1/404e700000000000,4055000000000000,3f4b759b4e23316f/-3_3,1_3/3f3989f3e1ad2946,4034000000000000,404f000000000000,4056c00000000000,405f100000000000,4030000000000000/ -53/0/0/405b4006374d3d06/40680cffe8e41eef/3/0_3,0_1/3f38dd34f41810db,4022000000000000,403a000000000000,4052800000000000///3ff0000000000000,4014000000000000,4024000000000000 => false
equals - -53/0/0/0/0/2/0_1/0///4000000000000000 -53/0/0/404cd00000000000/40793ae4920377cb/3/0_3/0,4016800000000000,404a000000000000///bff0000000000000,0,3fe0000000000000,4024000000000000 => false
equals - 8/0/0/4074220000000000/40ca4a960fddc099/0/-4_3,1_2/4058400000000000,4052880000000000,4058000000000000,404b800000000000,0/// 8/255bba08cf8c979d/4052c00000000000/4071de0407d0abeb/40c2c239d0f32216/2/-17_2,1_2/4043f00000000000,4052c00000000000,4058000000000000,3f501f42afaa71ad/// => false
equals - -53/0/0/0/0/2/////4000000000000000 -53/0/0/0/0/2/////4000000000000000 => true
equals - 5/0/0/407416038714f43e/c0b1e8c3ec0f3be1/1/3_3,0_3/3f412f7676c7f714,0,0,4052000000000000,4041800000000000,4040000000000000/-13_3/405df00000000000,404f500000000000,3f36126256570a77/ 5/0/0/407416038714f43e/c0b1e8c3ec0f3be1/1/3_3,0_3/3f412f7676c7f714,0,0,4052000000000000,4041800000000000,4040000000000000/-13_3/405df00000000000,404f500000000000,3f36126256570a77/ => true
equals - -1/3f50624dd2f1a9fc/0/0/0/0///// -1/3f50624dd2f1a9fc/0/0/0/0///// => true
equals - 8/3fe0000000000000/0/406864072e6a508e/c0a663116f242b7f/1/7_4,2_2/404b900000000000,404c000000000000,403c000000000000,404c000000000000,3f4cb9a94238558c,0/// 8/3fe0000000000000/0/406864072e6a508e/c0a663116f242b7f/1/7_4,2_2/404b900000000000,404c000000000000,403c000000000000,404c000000000000,3f4cb9a94238558c,0/// => true
equals - 1/3f847ae147ae147b/0/407dd004320a916e/c0a79fc853b70fc4/1/-9_2,0_1/4049000000000000,3f344c31b1a6b4c8,4055800000000000/-19_3,2_2,0_1/4055000000000000,404b800000000000,3f476a3bb29e3e44,4055000000000000,404e000000000000,404d000000000000/ 0/255bba08cf8c979d/404c100000000000/407d8e0000000000/40d254bc069a7b8e/3/-19_1,0_3,1_2/4032000000000000,4055b00000000000,4051000000000000,4058c00000000000,4050400000000000,4054000000000000/// => false
equals - -53/0/0/0/0/0/////4000000000000000 -53/0/0/0/0/1/////4000000000000000 => true
reset - -53/0/0/402e000000000000/0/0/0_2/4028000000000000,4008000000000000///3ff0000000000000,4014000000000000,4024000000000000 -53/0/0/402e000000000000/0/0/0_3/4024000000000000,0,4014000000000000///3ff0000000000000,4000000000000000,4014000000000000 => true
equals - 0/0/0/4018000000000000/0/0/1_1,0_2/3ff0000000000000,4000000000000000,4008000000000000/// 0/0/0/4018000000000000/0/0/1_3/3ff0000000000000,4000000000000000,4008000000000000/// => false
kahan - 0/3f50624dd2f1a9fc/0/4341c37937e08000/4341c37937e08000/0/3_1/4341c37937e08000/// 0/3f50624dd2f1a9fc/0/3fd3333333333333/3fd3333333333333/0/3_1/3fd3333333333333/// 0/3f50624dd2f1a9fc/0/4341c37937e08000/c341c37937e08000/0/3_1/c341c37937e08000/// 0/3fe0000000000000/0/3ff0000000000000/3ff0000000000000/0/3_1/3ff0000000000000/// => 0/3fe0000000000000/0/4351c37937e08000/3ff0000000000000/0/3_1/3ff0000000000000/// 0/3fe0000000000000/0/3ff4cccccccccccd/3fd3333333333333/0/3_1/3fd3333333333333/// false false
+167
View File
@@ -0,0 +1,167 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Prometheus `exponentialBounds` (`model/histogram/generic.go`): the bucket bounds in [0.5, 1)
//! of exponential schemas 0 to 8, which `getBoundExponential` scales by a power of two.
#[rustfmt::skip]
pub(super) const EXPONENTIAL_BOUNDS: [&[f64]; 9] = [
&[
0.5,
],
&[
0.5, 0.7071067811865475,
],
&[
0.5, 0.5946035575013605, 0.7071067811865475, 0.8408964152537144,
],
&[
0.5, 0.5452538663326288, 0.5946035575013605, 0.6484197773255048,
0.7071067811865475, 0.7711054127039704, 0.8408964152537144, 0.9170040432046711,
],
&[
0.5, 0.5221368912137069, 0.5452538663326288, 0.5693943173783458,
0.5946035575013605, 0.620928906036742, 0.6484197773255048, 0.6771277734684463,
0.7071067811865475, 0.7384130729697496, 0.7711054127039704, 0.805245165974627,
0.8408964152537144, 0.8781260801866495, 0.9170040432046711, 0.9576032806985735,
],
&[
0.5, 0.5109485743270583, 0.5221368912137069, 0.5335702003384117,
0.5452538663326288, 0.5571933712979462, 0.5693943173783458, 0.5818624293887887,
0.5946035575013605, 0.6076236799902344, 0.620928906036742, 0.6345254785958666,
0.6484197773255048, 0.6626183215798706, 0.6771277734684463, 0.6919549409819159,
0.7071067811865475, 0.7225904034885232, 0.7384130729697496, 0.7545822137967112,
0.7711054127039704, 0.7879904225539431, 0.805245165974627, 0.8228777390769823,
0.8408964152537144, 0.8593096490612387, 0.8781260801866495, 0.8973545375015533,
0.9170040432046711, 0.9370838170551498, 0.9576032806985735, 0.9785720620876999,
],
&[
0.5, 0.5054446430258502, 0.5109485743270583, 0.5165124395106142,
0.5221368912137069, 0.5278225891802786, 0.5335702003384117, 0.5393803988785598,
0.5452538663326288, 0.5511912916539204, 0.5571933712979462, 0.5632608093041209,
0.5693943173783458, 0.5755946149764913, 0.5818624293887887, 0.5881984958251406,
0.5946035575013605, 0.6010783657263515, 0.6076236799902344, 0.6142402680534349,
0.620928906036742, 0.6276903785123455, 0.6345254785958666, 0.6414350080393891,
0.6484197773255048, 0.6554806057623822, 0.6626183215798706, 0.6698337620266515,
0.6771277734684463, 0.6845012114872953, 0.6919549409819159, 0.6994898362691555,
0.7071067811865475, 0.7148066691959849, 0.7225904034885232, 0.7304588970903234,
0.7384130729697496, 0.7464538641456323, 0.7545822137967112, 0.762799075372269,
0.7711054127039704, 0.7795022001189185, 0.7879904225539431, 0.7965710756711334,
0.805245165974627, 0.8140137109286738, 0.8228777390769823, 0.8318382901633681,
0.8408964152537144, 0.8500531768592616, 0.8593096490612387, 0.8686669176368529,
0.8781260801866495, 0.8876882462632604, 0.8973545375015533, 0.9071260877501991,
0.9170040432046711, 0.9269895625416926, 0.9370838170551498, 0.9472879907934827,
0.9576032806985735, 0.9680308967461471, 0.9785720620876999, 0.9892280131939752,
],
&[
0.5, 0.5027149505564014, 0.5054446430258502, 0.5081891574554764,
0.5109485743270583, 0.5137229745593818, 0.5165124395106142, 0.5193170509806894,
0.5221368912137069, 0.5249720429003435, 0.5278225891802786, 0.5306886136446309,
0.5335702003384117, 0.5364674337629877, 0.5393803988785598, 0.5423091811066545,
0.5452538663326288, 0.5482145409081883, 0.5511912916539204, 0.5541842058618393,
0.5571933712979462, 0.5602188762048033, 0.5632608093041209, 0.5663192597993595,
0.5693943173783458, 0.572486072215902, 0.5755946149764913, 0.5787200368168754,
0.5818624293887887, 0.585021884841625, 0.5881984958251406, 0.5913923554921704,
0.5946035575013605, 0.5978321960199137, 0.6010783657263515, 0.6043421618132907,
0.6076236799902344, 0.6109230164863786, 0.6142402680534349, 0.6175755319684665,
0.620928906036742, 0.6243004885946023, 0.6276903785123455, 0.6310986751971253,
0.6345254785958666, 0.637970889198196, 0.6414350080393891, 0.6449179367033329,
0.6484197773255048, 0.6519406325959679, 0.6554806057623822, 0.659039800633032,
0.6626183215798706, 0.6662162735415805, 0.6698337620266515, 0.6734708931164728,
0.6771277734684463, 0.6808045103191123, 0.6845012114872953, 0.688217985377265,
0.6919549409819159, 0.6957121878859629, 0.6994898362691555, 0.7032879969095076,
0.7071067811865475, 0.7109463010845827, 0.7148066691959849, 0.718687998724491,
0.7225904034885232, 0.7265139979245261, 0.7304588970903234, 0.7344252166684908,
0.7384130729697496, 0.7424225829363761, 0.7464538641456323, 0.7505070348132126,
0.7545822137967112, 0.7586795205991071, 0.762799075372269, 0.7669409989204777,
0.7711054127039704, 0.7752924388424999, 0.7795022001189185, 0.7837348199827764,
0.7879904225539431, 0.7922691326262467, 0.7965710756711334, 0.8008963778413465,
0.805245165974627, 0.8096175675974316, 0.8140137109286738, 0.8184337248834821,
0.8228777390769823, 0.8273458838280969, 0.8318382901633681, 0.8363550898207981,
0.8408964152537144, 0.8454623996346523, 0.8500531768592616, 0.8546688815502312,
0.8593096490612387, 0.8639756154809185, 0.8686669176368529, 0.8733836930995842,
0.8781260801866495, 0.8828942179666361, 0.8876882462632604, 0.8925083056594671,
0.8973545375015533, 0.9022270839033115, 0.9071260877501991, 0.9120516927035263,
0.9170040432046711, 0.9219832844793128, 0.9269895625416926, 0.9320230241988943,
0.9370838170551498, 0.9421720895161669, 0.9472879907934827, 0.9524316709088368,
0.9576032806985735, 0.9628029718180622, 0.9680308967461471, 0.9732872087896164,
0.9785720620876999, 0.9838856116165875, 0.9892280131939752, 0.9945994234836328,
],
&[
0.5, 0.5013556375251013, 0.5027149505564014, 0.5040779490592088,
0.5054446430258502, 0.5068150424757447, 0.5081891574554764, 0.509566998038869,
0.5109485743270583, 0.5123338964485679, 0.5137229745593818, 0.5151158188430205,
0.5165124395106142, 0.5179128468009786, 0.5193170509806894, 0.520725062344158,
0.5221368912137069, 0.5235525479396449, 0.5249720429003435, 0.526395386502313,
0.5278225891802786, 0.5292536613972564, 0.5306886136446309, 0.5321274564422321,
0.5335702003384117, 0.5350168559101208, 0.5364674337629877, 0.5379219445313954,
0.5393803988785598, 0.5408428074966075, 0.5423091811066545, 0.5437795304588847,
0.5452538663326288, 0.5467321995364429, 0.5482145409081883, 0.549700901315111,
0.5511912916539204, 0.5526857228508706, 0.5541842058618393, 0.5556867516724088,
0.5571933712979462, 0.5587040757836845, 0.5602188762048033, 0.5617377836665098,
0.5632608093041209, 0.564787964283144, 0.5663192597993595, 0.5678547070789026,
0.5693943173783458, 0.5709381019847808, 0.572486072215902, 0.5740382394200894,
0.5755946149764913, 0.5771552102951081, 0.5787200368168754, 0.5802891060137493,
0.5818624293887887, 0.5834400184762408, 0.585021884841625, 0.5866080400818185,
0.5881984958251406, 0.5897932637314379, 0.5913923554921704, 0.5929957828304968,
0.5946035575013605, 0.5962156912915756, 0.5978321960199137, 0.5994530835371903,
0.6010783657263515, 0.6027080545025619, 0.6043421618132907, 0.6059806996384005,
0.6076236799902344, 0.6092711149137041, 0.6109230164863786, 0.6125793968185725,
0.6142402680534349, 0.6159056423670379, 0.6175755319684665, 0.6192499490999082,
0.620928906036742, 0.622612415087629, 0.6243004885946023, 0.6259931389331581,
0.6276903785123455, 0.6293922197748583, 0.6310986751971253, 0.6328097572894031,
0.6345254785958666, 0.6362458516947014, 0.637970889198196, 0.6397006037528346,
0.6414350080393891, 0.6431741147730128, 0.6449179367033329, 0.6466664866145447,
0.6484197773255048, 0.6501778216898253, 0.6519406325959679, 0.6537082229673385,
0.6554806057623822, 0.6572577939746774, 0.659039800633032, 0.6608266388015788,
0.6626183215798706, 0.6644148621029772, 0.6662162735415805, 0.6680225691020727,
0.6698337620266515, 0.6716498655934177, 0.6734708931164728, 0.6752968579460171,
0.6771277734684463, 0.6789636531064505, 0.6808045103191123, 0.6826503586020058,
0.6845012114872953, 0.6863570825438342, 0.688217985377265, 0.690083933630119,
0.6919549409819159, 0.6938310211492645, 0.6957121878859629, 0.6975984549830999,
0.6994898362691555, 0.7013863456101023, 0.7032879969095076, 0.7051948041086352,
0.7071067811865475, 0.7090239421602076, 0.7109463010845827, 0.7128738720527471,
0.7148066691959849, 0.7167447066838943, 0.718687998724491, 0.7206365595643126,
0.7225904034885232, 0.7245495448210174, 0.7265139979245261, 0.7284837772007218,
0.7304588970903234, 0.7324393720732029, 0.7344252166684908, 0.7364164454346837,
0.7384130729697496, 0.7404151139112358, 0.7424225829363761, 0.7444354947621984,
0.7464538641456323, 0.7484777058836176, 0.7505070348132126, 0.7525418658117031,
0.7545822137967112, 0.7566280937263048, 0.7586795205991071, 0.7607365094544071,
0.762799075372269, 0.7648672334736434, 0.7669409989204777, 0.7690203869158282,
0.7711054127039704, 0.7731960915705107, 0.7752924388424999, 0.7773944698885442,
0.7795022001189185, 0.7816156449856788, 0.7837348199827764, 0.7858597406461707,
0.7879904225539431, 0.7901268813264122, 0.7922691326262467, 0.7944171921585818,
0.7965710756711334, 0.7987307989543135, 0.8008963778413465, 0.8030678282083853,
0.805245165974627, 0.8074284071024302, 0.8096175675974316, 0.8118126635086642,
0.8140137109286738, 0.8162207259936375, 0.8184337248834821, 0.820652723822003,
0.8228777390769823, 0.8251087869603088, 0.8273458838280969, 0.8295890460808079,
0.8318382901633681, 0.8340936325652911, 0.8363550898207981, 0.8386226785089391,
0.8408964152537144, 0.8431763167241966, 0.8454623996346523, 0.8477546807446661,
0.8500531768592616, 0.8523579048290255, 0.8546688815502312, 0.8569861239649629,
0.8593096490612387, 0.8616394738731368, 0.8639756154809185, 0.8663180910111553,
0.8686669176368529, 0.871022112577578, 0.8733836930995842, 0.8757516765159389,
0.8781260801866495, 0.8805069215187917, 0.8828942179666361, 0.8852879870317771,
0.8876882462632604, 0.890095013257712, 0.8925083056594671, 0.8949281411607002,
0.8973545375015533, 0.8997875124702672, 0.9022270839033115, 0.9046732696855155,
0.9071260877501991, 0.909585556079304, 0.9120516927035263, 0.9145245157024483,
0.9170040432046711, 0.9194902933879467, 0.9219832844793128, 0.9244830347552253,
0.9269895625416926, 0.92950288621441, 0.9320230241988943, 0.9345499949706191,
0.9370838170551498, 0.93962450902828, 0.9421720895161669, 0.9447265771954693,
0.9472879907934827, 0.9498563490882775, 0.9524316709088368, 0.9550139751351947,
0.9576032806985735, 0.9601996065815236, 0.9628029718180622, 0.9654133954938133,
0.9680308967461471, 0.9706554947643201, 0.9732872087896164, 0.9759260581154889,
0.9785720620876999, 0.9812252401044634, 0.9838856116165875, 0.9865531961276168,
0.9892280131939752, 0.9919100824251095, 0.9945994234836328, 0.9972960560854698,
],
];
+235
View File
@@ -0,0 +1,235 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Prometheus `BucketQuantile` and `BucketFraction` over the buckets of a classic histogram at
//! one point.
/// Relative difference under which neighbouring bucket counts are taken as equal.
const SMALL_DELTA_TOLERANCE: f64 = 1e-12;
/// Go's `strconv.ParseFloat`, which rejects finite literals out of the f64 range and a signed
/// NaN, and accepts `_` between digits. Hexadecimal literals are not supported.
pub(super) fn parse_bound(text: &str) -> Option<f64> {
let unsigned = text.trim_start_matches(['+', '-']);
if unsigned.len() != text.len() && unsigned.eq_ignore_ascii_case("nan") {
return None;
}
let value: f64 = if text.contains('_') {
if !underscores_ok(text) {
return None;
}
text.replace('_', "").parse().ok()?
} else {
text.parse().ok()?
};
if value.is_infinite() {
let unsigned = text.trim_start_matches(['+', '-']);
if !unsigned.eq_ignore_ascii_case("inf") && !unsigned.eq_ignore_ascii_case("infinity") {
return None;
}
}
Some(value)
}
/// Go's `strconv.underscoreOK` for a decimal literal: every `_` sits between two digits.
fn underscores_ok(text: &str) -> bool {
let digits = text.strip_prefix(['+', '-']).unwrap_or(text).as_bytes();
digits.iter().enumerate().all(|(i, &byte)| {
byte != b'_'
|| (i > 0
&& digits[i - 1].is_ascii_digit()
&& digits.get(i + 1).is_some_and(u8::is_ascii_digit))
})
}
#[derive(Debug, Clone, Copy)]
pub(super) struct Bucket {
pub(super) upper_bound: f64,
pub(super) count: f64,
}
/// Prometheus `BucketQuantile` over buckets sorted by upper bound.
pub(super) fn bucket_quantile(q: f64, buckets: &mut Vec<Bucket>) -> f64 {
if q.is_nan() {
return f64::NAN;
}
if q < 0.0 {
return f64::NEG_INFINITY;
}
if q > 1.0 {
return f64::INFINITY;
}
if buckets.last().unwrap().upper_bound != f64::INFINITY {
return f64::NAN;
}
coalesce(buckets);
ensure_monotonic(buckets);
if buckets.len() < 2 {
return f64::NAN;
}
let observations = buckets.last().unwrap().count;
if observations == 0.0 {
return f64::NAN;
}
let mut rank = q * observations;
let b = go_search(buckets.len() - 1, |i| buckets[i].count >= rank);
if b == buckets.len() - 1 {
return buckets[buckets.len() - 2].upper_bound;
}
if b == 0 && buckets[0].upper_bound <= 0.0 {
return buckets[0].upper_bound;
}
let mut bucket_start = 0.0;
let bucket_end = buckets[b].upper_bound;
let mut count = buckets[b].count;
if b > 0 {
bucket_start = buckets[b - 1].upper_bound;
count -= buckets[b - 1].count;
rank -= buckets[b - 1].count;
}
bucket_start + (bucket_end - bucket_start) * (rank / count)
}
/// Prometheus `BucketFraction` over buckets sorted by upper bound.
pub(super) fn bucket_fraction(lower: f64, upper: f64, buckets: &mut Vec<Bucket>) -> f64 {
if buckets.last().unwrap().upper_bound != f64::INFINITY {
return f64::NAN;
}
coalesce(buckets);
let count = buckets.last().unwrap().count;
if count == 0.0 || lower.is_nan() || upper.is_nan() {
return f64::NAN;
}
if lower >= upper {
return 0.0;
}
let (mut rank, mut lower_rank, mut upper_rank) = (0.0, 0.0, 0.0);
let (mut lower_set, mut upper_set) = (false, false);
let mut lower_bound = if buckets[0].upper_bound <= 0.0 {
f64::NEG_INFINITY
} else {
0.0
};
for (i, bucket) in buckets.iter().enumerate() {
if i > 0 {
lower_bound = buckets[i - 1].upper_bound;
}
let upper_bound = bucket.upper_bound;
// An infinite-width bucket contributes nothing to the interpolation.
let interpolate = |value: f64| {
if lower_bound == f64::NEG_INFINITY {
bucket.count
} else {
rank + (bucket.count - rank) * (value - lower_bound) / (upper_bound - lower_bound)
}
};
if !lower_set && lower_bound >= lower {
lower_rank = rank;
lower_set = true;
}
if !upper_set && lower_bound >= upper {
upper_rank = rank;
upper_set = true;
}
if lower_set && upper_set {
break;
}
if !lower_set && lower_bound < lower && upper_bound > lower {
lower_rank = interpolate(lower);
lower_set = true;
}
if !upper_set && lower_bound < upper && upper_bound > upper {
upper_rank = interpolate(upper);
upper_set = true;
}
if lower_set && upper_set {
break;
}
rank = bucket.count;
}
if !lower_set || lower_rank > count {
lower_rank = count;
}
if !upper_set || upper_rank > count {
upper_rank = count;
}
(upper_rank - lower_rank) / count
}
/// Merges buckets with the same upper bound.
fn coalesce(buckets: &mut Vec<Bucket>) {
let mut last = buckets[0];
let mut i = 0;
for j in 1..buckets.len() {
let bucket = buckets[j];
if bucket.upper_bound == last.upper_bound {
last.count += bucket.count;
} else {
buckets[i] = last;
last = bucket;
i += 1;
}
}
buckets[i] = last;
buckets.truncate(i + 1);
}
/// Prometheus `ensureMonotonicAndIgnoreSmallDeltas`: counts that differ from the previous one by
/// a negligible relative amount, or are lower, are raised to it.
fn ensure_monotonic(buckets: &mut [Bucket]) {
let mut prev = buckets[0].count;
for bucket in &mut buckets[1..] {
let curr = bucket.count;
if curr == prev {
continue;
}
if almost_equal(prev, curr, SMALL_DELTA_TOLERANCE) || curr < prev {
bucket.count = prev;
continue;
}
prev = curr;
}
}
/// Prometheus `almost.Equal`.
fn almost_equal(a: f64, b: f64, epsilon: f64) -> bool {
if a.is_nan() && b.is_nan() {
return true;
}
if a == b {
return true;
}
let abs_sum = a.abs() + b.abs();
let diff = (a - b).abs();
if a == 0.0 || b == 0.0 || abs_sum < f64::MIN_POSITIVE {
return diff < epsilon * f64::MIN_POSITIVE;
}
diff / abs_sum.min(f64::MAX) < epsilon
}
/// Go's `sort.Search`: the smallest index in `[0, n)` where `f` holds, or `n`, found by the same
/// bisection, so a predicate that is not monotonic (NaN counts) picks the same index.
fn go_search(n: usize, f: impl Fn(usize) -> bool) -> usize {
let (mut i, mut j) = (0, n);
while i < j {
let h = (i + j) / 2;
if !f(h) {
i = h + 1;
} else {
j = h;
}
}
i
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,981 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Arithmetic on owned native histograms, following Prometheus `FloatHistogram`
//! (`model/histogram/float_histogram.go`): `Add`, `KahanAdd`, `Sub`, `Mul`, `Div`, `Compact`,
//! `CopyToSchema`, `DetectReset` and `Equals`, including zero bucket reconciliation, resolution
//! reduction and the intersection of mismatched custom bounds.
//!
//! Each side is a list of `(bucket index, count)` sorted by index. Go splices span layouts in
//! place; the bucket indices and the order of additions to each bucket do not depend on the
//! layout, so the results are the same.
use datafusion::error::{DataFusionError, Result};
use datatypes::series::histogram::{
BucketSideView, CounterResetHint, HistogramBatchBuilder, HistogramView,
};
use crate::functions::kahan_inc;
use crate::histogram_eval::native::{CUSTOM_BUCKETS_SCHEMA, bound};
type Buckets = Vec<(i32, f64)>;
/// A native histogram with absolute bucket counts.
#[derive(Debug, Clone)]
pub(crate) struct FloatHistogram {
pub(crate) reset_hint: CounterResetHint,
pub(crate) schema: i32,
pub(crate) zero_threshold: f64,
pub(crate) zero_count: f64,
pub(crate) count: f64,
pub(crate) sum: f64,
pub(crate) positive: Buckets,
pub(crate) negative: Buckets,
pub(crate) custom_values: Vec<f64>,
/// The positive and negative spans of a histogram read from a view, kept until its buckets
/// change, because Go `Equals` compares span layouts. Otherwise consecutive indices form one
/// span, the layout Go `Compact` produces.
layout: Option<[Vec<(i32, i32)>; 2]>,
}
/// What an addition or subtraction reports besides its result.
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub(crate) struct AddOutcome {
/// One side was a counter reset and the other was not.
pub(crate) counter_reset_collision: bool,
/// Custom bounds differed and the result uses their intersection.
pub(crate) custom_bounds_reconciled: bool,
}
impl FloatHistogram {
pub(crate) fn try_from_view(view: &HistogramView<'_>) -> Result<Self> {
Ok(Self {
reset_hint: view.reset_hint,
schema: view.schema,
zero_threshold: view.zero_threshold,
zero_count: view.zero_count,
count: view.count,
sum: view.sum,
positive: side_from_view(view.positive)?,
negative: side_from_view(view.negative)?,
custom_values: view.custom_values.to_vec(),
layout: Some([view.positive, view.negative].map(|side| {
side.span_offsets
.iter()
.copied()
.zip(side.span_lengths.iter().copied())
.collect()
})),
})
}
/// The spans of each side.
fn spans(&self) -> [Vec<(i32, i32)>; 2] {
self.layout
.clone()
.unwrap_or_else(|| [&self.positive, &self.negative].map(canonical_spans))
}
/// Appends the histogram to `builder`; consecutive bucket indices share a span.
pub(crate) fn push_to(&self, builder: &mut HistogramBatchBuilder) -> Result<u32> {
let [positive_spans, negative_spans] = self.spans();
let (positive_offsets, positive_lengths): (Vec<_>, Vec<_>) =
positive_spans.into_iter().unzip();
let (negative_offsets, negative_lengths): (Vec<_>, Vec<_>) =
negative_spans.into_iter().unzip();
let positive_counts: Vec<f64> = self.positive.iter().map(|&(_, count)| count).collect();
let negative_counts: Vec<f64> = self.negative.iter().map(|&(_, count)| count).collect();
builder
.push(HistogramView {
schema: self.schema,
zero_threshold: self.zero_threshold,
sum: self.sum,
count: self.count,
zero_count: self.zero_count,
reset_hint: self.reset_hint,
start_timestamp: None,
custom_values: &self.custom_values,
positive: BucketSideView {
span_offsets: &positive_offsets,
span_lengths: &positive_lengths,
buckets: &positive_counts,
},
negative: BucketSideView {
span_offsets: &negative_offsets,
span_lengths: &negative_lengths,
buckets: &negative_counts,
},
})
.map_err(|error| DataFusionError::External(Box::new(error)))
}
/// A histogram with no observations and the bucket layout of `self`, like Go's
/// `&FloatHistogram{Schema: h.Schema, CustomValues: h.CustomValues}`.
pub(crate) fn empty_like(&self) -> Self {
Self {
reset_hint: CounterResetHint::Unknown,
schema: self.schema,
zero_threshold: 0.0,
zero_count: 0.0,
count: 0.0,
sum: 0.0,
positive: Vec::new(),
negative: Vec::new(),
custom_values: self.custom_values.clone(),
layout: None,
}
}
pub(crate) fn uses_custom_buckets(&self) -> bool {
self.schema == CUSTOM_BUCKETS_SCHEMA
}
/// Go `Mul`.
pub(crate) fn mul(&mut self, factor: f64) {
self.zero_count *= factor;
self.count *= factor;
self.sum *= factor;
for (_, count) in self.positive.iter_mut().chain(self.negative.iter_mut()) {
*count *= factor;
}
if factor < 0.0 {
self.reset_hint = CounterResetHint::Gauge;
}
}
/// Go `Div`; dividing by zero removes every bucket.
pub(crate) fn div(&mut self, scalar: f64) {
self.zero_count /= scalar;
self.count /= scalar;
self.sum /= scalar;
if scalar == 0.0 {
self.positive.clear();
self.negative.clear();
self.layout = None;
return;
}
for (_, count) in self.positive.iter_mut().chain(self.negative.iter_mut()) {
*count /= scalar;
}
if scalar < 0.0 {
self.reset_hint = CounterResetHint::Gauge;
}
}
/// Go `HasOverflow`: whether any count, the sum or a custom bound is infinite.
pub(crate) fn has_overflow(&self) -> bool {
[self.zero_count, self.count, self.sum]
.into_iter()
.chain(
self.positive
.iter()
.chain(&self.negative)
.map(|&(_, count)| count),
)
.chain(self.custom_values.iter().copied())
.any(f64::is_infinite)
}
/// Go `Compact(0)`: drops empty buckets.
pub(crate) fn compact(&mut self) {
self.positive.retain(|&(_, count)| count != 0.0);
self.negative.retain(|&(_, count)| count != 0.0);
self.layout = None;
}
/// Go `CopyToSchema`; `target` must not exceed the schema.
pub(crate) fn copy_to_schema(&self, target: i32) -> Result<Self> {
if target == self.schema {
return Ok(self.clone());
}
if self.uses_custom_buckets() || target == CUSTOM_BUCKETS_SCHEMA || target > self.schema {
return Err(incompatible_schema());
}
Ok(Self {
reset_hint: CounterResetHint::Unknown,
schema: target,
zero_threshold: self.zero_threshold,
zero_count: self.zero_count,
count: self.count,
sum: self.sum,
positive: reduce_resolution(&self.positive, self.schema, target),
negative: reduce_resolution(&self.negative, self.schema, target),
custom_values: Vec::new(),
layout: None,
})
}
/// Go `Add`.
pub(crate) fn add(&mut self, other: &Self) -> Result<AddOutcome> {
self.add_or_sub(other, false)
}
/// Go `Sub`. The `-` operator also sets the hint to gauge, which is left to the caller.
pub(crate) fn sub(&mut self, other: &Self) -> Result<AddOutcome> {
self.add_or_sub(other, true)
}
fn add_or_sub(&mut self, other: &Self, subtract: bool) -> Result<AddOutcome> {
check_schemas(self, other)?;
self.layout = None;
let mut outcome = AddOutcome {
counter_reset_collision: self.adjust_counter_reset(other),
custom_bounds_reconciled: false,
};
let sign = if subtract { -1.0 } else { 1.0 };
if !self.uses_custom_buckets() {
let (other_zero_count, _) = self.reconcile_zero_buckets(other, None)?;
if subtract {
self.zero_count -= other_zero_count;
} else {
self.zero_count += other_zero_count;
}
}
if subtract {
self.count -= other.count;
self.sum -= other.sum;
} else {
self.count += other.count;
self.sum += other.sum;
}
if self.uses_custom_buckets() {
if self.custom_values == other.custom_values {
add_buckets(self, &other.positive, sign, None, None, true)?;
} else {
outcome.custom_bounds_reconciled = true;
let bounds = intersect_custom_bounds(&self.custom_values, &other.custom_values);
(self.positive, _) = add_custom_buckets_with_mismatches(
subtract,
&self.positive,
&self.custom_values,
&other.positive,
&other.custom_values,
None,
&bounds,
);
self.custom_values = bounds;
}
return Ok(outcome);
}
let reduced;
let (other_positive, other_negative) = if other.schema < self.schema {
self.positive = reduce_resolution(&self.positive, self.schema, other.schema);
self.negative = reduce_resolution(&self.negative, self.schema, other.schema);
self.schema = other.schema;
(&other.positive, &other.negative)
} else if other.schema > self.schema {
reduced = [&other.positive, &other.negative]
.map(|side| reduce_resolution(side, other.schema, self.schema));
(&reduced[0], &reduced[1])
} else {
(&other.positive, &other.negative)
};
add_buckets(self, other_positive, sign, None, None, true)?;
add_buckets(self, other_negative, sign, None, None, false)?;
Ok(outcome)
}
/// Go `KahanAdd`: adds `other` with compensation `c`, created when `None`, and returns the
/// updated compensation.
pub(crate) fn kahan_add(
&mut self,
other: &Self,
c: Option<Self>,
) -> Result<(Self, AddOutcome)> {
check_schemas(self, other)?;
self.layout = None;
let mut outcome = AddOutcome {
counter_reset_collision: self.adjust_counter_reset(other),
custom_bounds_reconciled: false,
};
let mut c = c.unwrap_or_else(|| self.new_compensation());
if !self.uses_custom_buckets() {
let (other_zero_count, other_c_zero_count) =
self.reconcile_zero_buckets(other, Some(&mut c))?;
(self.zero_count, c.zero_count) =
kahan_inc(other_zero_count, self.zero_count, c.zero_count);
(self.zero_count, c.zero_count) =
kahan_inc(other_c_zero_count, self.zero_count, c.zero_count);
}
(self.count, c.count) = kahan_inc(other.count, self.count, c.count);
(self.sum, c.sum) = kahan_inc(other.sum, self.sum, c.sum);
if self.uses_custom_buckets() {
if self.custom_values == other.custom_values {
add_buckets(self, &other.positive, 1.0, Some(&mut c), None, true)?;
} else {
outcome.custom_bounds_reconciled = true;
let bounds = intersect_custom_bounds(&self.custom_values, &other.custom_values);
let compensation: Vec<f64> = c.positive.iter().map(|&(_, c)| c).collect();
let (positive, positive_c) = add_custom_buckets_with_mismatches(
false,
&self.positive,
&self.custom_values,
&other.positive,
&other.custom_values,
Some(&compensation),
&bounds,
);
self.positive = positive;
c.positive = positive_c;
self.custom_values = bounds.clone();
c.custom_values = bounds;
}
return Ok((c, outcome));
}
let mut other_positive = None;
let mut other_negative = None;
if other.schema < self.schema {
(self.positive, c.positive) =
kahan_reduce_resolution(&self.positive, &c.positive, self.schema, other.schema);
(self.negative, c.negative) =
kahan_reduce_resolution(&self.negative, &c.negative, self.schema, other.schema);
self.schema = other.schema;
} else if other.schema > self.schema {
if !other.positive.is_empty() {
let zeros = zero_compensation(&other.positive);
other_positive = Some(kahan_reduce_resolution(
&other.positive,
&zeros,
other.schema,
self.schema,
));
}
if !other.negative.is_empty() {
let zeros = zero_compensation(&other.negative);
other_negative = Some(kahan_reduce_resolution(
&other.negative,
&zeros,
other.schema,
self.schema,
));
}
}
let (positive, positive_c) = match &other_positive {
Some((buckets, c)) => (buckets, Some(c)),
None => (&other.positive, None),
};
add_buckets(self, positive, 1.0, Some(&mut c), positive_c, true)?;
let (negative, negative_c) = match &other_negative {
Some((buckets, c)) => (buckets, Some(c)),
None => (&other.negative, None),
};
add_buckets(self, negative, 1.0, Some(&mut c), negative_c, false)?;
c.schema = self.schema;
c.zero_threshold = self.zero_threshold;
Ok((c, outcome))
}
/// Go `newCompensationHistogram`: the layout of `self` with zero counts.
fn new_compensation(&self) -> Self {
Self {
reset_hint: self.reset_hint,
schema: self.schema,
zero_threshold: self.zero_threshold,
zero_count: 0.0,
count: 0.0,
sum: 0.0,
positive: zero_compensation(&self.positive),
negative: if self.uses_custom_buckets() {
Vec::new()
} else {
zero_compensation(&self.negative)
},
custom_values: self.custom_values.clone(),
layout: None,
}
}
/// Go `adjustCounterReset`.
fn adjust_counter_reset(&mut self, other: &Self) -> bool {
use CounterResetHint::{Gauge, Unknown};
match (self.reset_hint, other.reset_hint) {
(mine, theirs) if mine == theirs => false,
(Gauge, _) => false,
(_, Gauge) => {
self.reset_hint = Gauge;
false
}
(Unknown, _) => false,
(_, Unknown) => {
self.reset_hint = Unknown;
false
}
_ => {
self.reset_hint = Unknown;
true
}
}
}
/// Go `zeroCountForLargerThreshold`: the zero count after widening the zero bucket to at
/// least `larger_threshold`, the threshold actually needed so no bucket straddles it, and
/// the Kahan compensation of the count.
fn zero_count_for_larger_threshold(
&self,
mut larger_threshold: f64,
c: Option<&Self>,
) -> Result<(f64, f64, f64)> {
let mut c_zero_count = c.map_or(0.0, |c| c.zero_count);
if larger_threshold == self.zero_threshold {
return Ok((self.zero_count, larger_threshold, c_zero_count));
}
'outer: loop {
// Go keeps the compensation accumulated by an abandoned pass.
let mut zero_count = self.zero_count;
for (position, &(idx, count)) in self.positive.iter().enumerate() {
let (lower, upper) = (self.bound(idx - 1)?, self.bound(idx)?);
if lower >= larger_threshold {
break;
}
(zero_count, c_zero_count) = kahan_inc(count, zero_count, c_zero_count);
if let Some(c) = c {
(zero_count, c_zero_count) =
kahan_inc(c.positive[position].1, zero_count, c_zero_count);
}
if upper > larger_threshold {
if count != 0.0 {
larger_threshold = upper;
}
break;
}
}
for (position, &(idx, count)) in self.negative.iter().enumerate() {
let (lower, upper) = (-self.bound(idx)?, -self.bound(idx - 1)?);
if upper <= -larger_threshold {
break;
}
(zero_count, c_zero_count) = kahan_inc(count, zero_count, c_zero_count);
if let Some(c) = c {
(zero_count, c_zero_count) =
kahan_inc(c.negative[position].1, zero_count, c_zero_count);
}
if lower < -larger_threshold {
if count != 0.0 {
larger_threshold = -lower;
continue 'outer;
}
break;
}
}
return Ok((zero_count, larger_threshold, c_zero_count));
}
}
/// Go `trimBucketsInZeroBucket`: empties the buckets inside the zero bucket, then compacts.
fn trim_buckets_in_zero_bucket(&mut self, c: Option<&mut Self>) -> Result<()> {
let mut trimmed_positive = 0;
for &(idx, _) in &self.positive {
if self.bound(idx - 1)? >= self.zero_threshold {
break;
}
trimmed_positive += 1;
}
let mut trimmed_negative = 0;
for &(idx, _) in &self.negative {
if -self.bound(idx - 1)? <= -self.zero_threshold {
break;
}
trimmed_negative += 1;
}
for bucket in &mut self.positive[..trimmed_positive] {
bucket.1 = 0.0;
}
for bucket in &mut self.negative[..trimmed_negative] {
bucket.1 = 0.0;
}
match c {
Some(c) => {
for bucket in &mut c.positive[..trimmed_positive] {
bucket.1 = 0.0;
}
for bucket in &mut c.negative[..trimmed_negative] {
bucket.1 = 0.0;
}
compact_with(&mut self.positive, &mut c.positive);
compact_with(&mut self.negative, &mut c.negative);
}
None => self.compact(),
}
Ok(())
}
/// Go `reconcileZeroBuckets`: widens whichever zero bucket is narrower until both match, and
/// returns the zero count of `other` for that threshold with its compensation.
fn reconcile_zero_buckets(
&mut self,
other: &Self,
mut c: Option<&mut Self>,
) -> Result<(f64, f64)> {
let mut other_zero_count = other.zero_count;
let mut other_zero_threshold = other.zero_threshold;
let mut other_c_zero_count = 0.0;
while other_zero_threshold != self.zero_threshold {
if self.zero_threshold > other_zero_threshold {
(other_zero_count, other_zero_threshold, other_c_zero_count) =
other.zero_count_for_larger_threshold(self.zero_threshold, None)?;
}
if other_zero_threshold > self.zero_threshold {
let (zero_count, threshold, c_zero_count) =
self.zero_count_for_larger_threshold(other_zero_threshold, c.as_deref())?;
self.zero_count = zero_count;
self.zero_threshold = threshold;
if let Some(c) = c.as_deref_mut() {
c.zero_count = c_zero_count;
}
self.trim_buckets_in_zero_bucket(c.as_deref_mut())?;
}
}
Ok((other_zero_count, other_c_zero_count))
}
fn bound(&self, idx: i32) -> Result<f64> {
bound(idx, self.schema, &self.custom_values)
}
/// Go `DetectReset`: whether `self` cannot follow `previous` without a counter reset.
pub(crate) fn detect_reset(&self, previous: &Self) -> Result<bool> {
match self.reset_hint {
CounterResetHint::CounterReset => return Ok(true),
CounterResetHint::NotCounterReset => return Ok(false),
_ => {}
}
if self.count < previous.count {
return Ok(true);
}
if self.uses_custom_buckets() {
if !previous.uses_custom_buckets() {
return Ok(true);
}
if self.custom_values != previous.custom_values {
return self.detect_reset_with_mismatched_custom_bounds(previous);
}
}
if self.schema > previous.schema || self.zero_threshold < previous.zero_threshold {
return Ok(true);
}
let (previous_zero_count, threshold, _) =
previous.zero_count_for_larger_threshold(self.zero_threshold, None)?;
if threshold != self.zero_threshold || self.zero_count < previous_zero_count {
return Ok(true);
}
for (current, earlier) in [
(&self.positive, &previous.positive),
(&self.negative, &previous.negative),
] {
let current = iterate(current, self.schema, self.schema, self.zero_threshold)?;
let earlier = iterate(earlier, previous.schema, self.schema, self.zero_threshold)?;
if side_reset(&current, &earlier) {
return Ok(true);
}
}
Ok(false)
}
/// Go `detectResetWithMismatchedCustomBounds`: compares the counts rolled up to each bound
/// both histograms share.
fn detect_reset_with_mismatched_custom_bounds(&self, previous: &Self) -> Result<bool> {
let current_bounds = &self.custom_values;
let previous_bounds = &previous.custom_values;
let mut current = RollUp::new(self);
let mut earlier = RollUp::new(previous);
let (mut i, mut j) = (0, 0);
while i <= current_bounds.len() && j <= previous_bounds.len() {
let current_bound = current_bounds.get(i).copied().unwrap_or(f64::INFINITY);
let previous_bound = previous_bounds.get(j).copied().unwrap_or(f64::INFINITY);
if current_bound == previous_bound {
let current_sum = current.sum_up_to(current_bound)?;
let previous_sum = earlier.sum_up_to(current_bound)?;
if current_sum < previous_sum {
return Ok(true);
}
i += 1;
j += 1;
} else if current_bound < previous_bound {
i += 1;
} else {
j += 1;
}
}
Ok(false)
}
/// Go `Equals`: bit equality of counts and of the bucket layout.
pub(crate) fn equals(&self, other: &Self) -> bool {
let same_side = |a: &Buckets, b: &Buckets| {
a.len() == b.len()
&& a.iter()
.zip(b)
.all(|(a, b)| a.0 == b.0 && a.1.to_bits() == b.1.to_bits())
};
self.schema == other.schema
&& self.count.to_bits() == other.count.to_bits()
&& self.sum.to_bits() == other.sum.to_bits()
&& (!self.uses_custom_buckets() || self.custom_values == other.custom_values)
&& self.zero_threshold == other.zero_threshold
&& self.zero_count.to_bits() == other.zero_count.to_bits()
&& same_side(&self.negative, &other.negative)
&& same_side(&self.positive, &other.positive)
&& {
let ([positive, negative], [other_positive, other_negative]) =
(self.spans(), other.spans());
spans_match(&negative, &other_negative) && spans_match(&positive, &other_positive)
}
}
}
/// The rolling sum of custom buckets up to a bound, as Go's `rollupSumForBound` closure keeps
/// it across calls.
struct RollUp<'a> {
histogram: &'a FloatHistogram,
next: usize,
started: bool,
has_more: bool,
}
impl<'a> RollUp<'a> {
fn new(histogram: &'a FloatHistogram) -> Self {
Self {
histogram,
next: 0,
started: false,
has_more: false,
}
}
fn sum_up_to(&mut self, bound: f64) -> Result<f64> {
if self.started && !self.has_more {
return Ok(0.0);
}
self.started = true;
let mut sum = 0.0;
while let Some(&(idx, count)) = self.histogram.positive.get(self.next) {
if self.histogram.bound(idx)? > bound {
self.has_more = true;
return Ok(sum);
}
sum += count;
self.next += 1;
}
self.has_more = false;
Ok(sum)
}
}
fn incompatible_schema() -> DataFusionError {
DataFusionError::Execution(
"cannot apply this operation to histograms with exponential and custom buckets".into(),
)
}
fn check_schemas(a: &FloatHistogram, b: &FloatHistogram) -> Result<()> {
if a.uses_custom_buckets() != b.uses_custom_buckets() {
return Err(incompatible_schema());
}
Ok(())
}
/// Go `floatBucketIterator`: the buckets of `side` merged down to `target`, without the leading
/// ones whose upper bound is at most `threshold`.
fn iterate(side: &Buckets, schema: i32, target: i32, threshold: f64) -> Result<Buckets> {
let mut out: Buckets = Vec::with_capacity(side.len());
for &(idx, count) in side {
let target_idx = target_index(idx, schema, target);
match out.last_mut() {
Some(last) if schema != target && last.0 == target_idx => last.1 += count,
_ => out.push((target_idx, count)),
}
}
// Go starts skipping only for a nonzero start value.
if target != CUSTOM_BUCKETS_SCHEMA && threshold != 0.0 {
let mut skipped = 0;
for &(idx, _) in &out {
if bound(idx, target, &[])? > threshold {
break;
}
skipped += 1;
}
out.drain(..skipped);
}
Ok(out)
}
/// Go `targetIdx`.
fn target_index(idx: i32, schema: i32, target: i32) -> i32 {
if schema == target {
return idx;
}
((idx - 1) >> (schema - target)) + 1
}
/// Go `reduceResolution` without delta encoding.
fn reduce_resolution(side: &Buckets, schema: i32, target: i32) -> Buckets {
let mut out: Buckets = Vec::with_capacity(side.len());
for &(idx, count) in side {
let target_idx = target_index(idx, schema, target);
match out.last_mut() {
Some(last) if last.0 == target_idx => last.1 += count,
_ => out.push((target_idx, count)),
}
}
out
}
/// Go `kahanReduceResolution`.
fn kahan_reduce_resolution(
side: &Buckets,
compensation: &Buckets,
schema: i32,
target: i32,
) -> (Buckets, Buckets) {
let mut out: Buckets = Vec::with_capacity(side.len());
let mut out_c: Buckets = Vec::with_capacity(side.len());
for (&(idx, count), &(_, c)) in side.iter().zip(compensation) {
let target_idx = target_index(idx, schema, target);
match (out.last_mut(), out_c.last_mut()) {
(Some(last), Some(last_c)) if last.0 == target_idx => {
(last.1, last_c.1) = kahan_inc(count, last.1, last_c.1);
(last.1, last_c.1) = kahan_inc(c, last.1, last_c.1);
}
_ => {
out.push((target_idx, count));
out_c.push((target_idx, c));
}
}
}
(out, out_c)
}
fn zero_compensation(side: &Buckets) -> Buckets {
side.iter().map(|&(idx, _)| (idx, 0.0)).collect()
}
/// Go `kahanCompact(0)`: drops the buckets whose count and compensation are both zero.
fn compact_with(side: &mut Buckets, compensation: &mut Buckets) {
let keep: Vec<bool> = side
.iter()
.zip(compensation.iter())
.map(|(&(_, count), &(_, c))| count != 0.0 || c != 0.0)
.collect();
let mut flags = keep.iter();
side.retain(|_| *flags.next().unwrap());
let mut flags = keep.iter();
compensation.retain(|_| *flags.next().unwrap());
}
/// Go `addBuckets` and `kahanAddBuckets`: adds `sign * other` to one side of `h`, inserting the
/// buckets `h` lacks. Leading buckets of `other` inside the zero bucket are skipped.
fn add_buckets(
h: &mut FloatHistogram,
other: &Buckets,
sign: f64,
c: Option<&mut FloatHistogram>,
other_c: Option<&Buckets>,
positive: bool,
) -> Result<()> {
let exponential = !h.uses_custom_buckets();
let threshold = h.zero_threshold;
let schema = h.schema;
let side = if positive {
&mut h.positive
} else {
&mut h.negative
};
let mut side_c = c.map(|c| {
if positive {
&mut c.positive
} else {
&mut c.negative
}
});
let mut below_threshold = true;
let mut position = 0;
for (k, &(idx, count)) in other.iter().enumerate() {
if below_threshold && exponential && bound(idx, schema, &[])? <= threshold {
continue;
}
below_threshold = false;
let value = count * sign;
let value_c = other_c.map_or(0.0, |other_c| other_c[k].1) * sign;
while position < side.len() && side[position].0 < idx {
position += 1;
}
if position < side.len() && side[position].0 == idx {
match side_c.as_deref_mut() {
Some(side_c) => {
let (sum, comp) = (&mut side[position].1, &mut side_c[position].1);
(*sum, *comp) = kahan_inc(value, *sum, *comp);
if value_c != 0.0 {
(*sum, *comp) = kahan_inc(value_c, *sum, *comp);
}
}
None => side[position].1 += value,
}
} else {
side.insert(position, (idx, value));
if let Some(side_c) = side_c.as_deref_mut() {
side_c.insert(position, (idx, value_c));
}
}
}
Ok(())
}
/// Go `intersectCustomBucketBounds`.
fn intersect_custom_bounds(a: &[f64], b: &[f64]) -> Vec<f64> {
let mut out = Vec::new();
let (mut i, mut j) = (0, 0);
while i < a.len() && j < b.len() {
if a[i] == b[j] {
out.push(a[i]);
i += 1;
j += 1;
} else if a[i] < b[j] {
i += 1;
} else {
j += 1;
}
}
out
}
/// Go `addCustomBucketsWithMismatches`: maps both sides onto the intersected bounds, adding
/// with Kahan summation, and drops buckets left empty. Returns the buckets and their
/// compensation.
fn add_custom_buckets_with_mismatches(
subtract: bool,
a: &Buckets,
a_bounds: &[f64],
b: &Buckets,
b_bounds: &[f64],
a_compensation: Option<&[f64]>,
bounds: &[f64],
) -> (Buckets, Buckets) {
let mut target = vec![0.0; bounds.len() + 1];
let mut target_c = vec![0.0; bounds.len() + 1];
let mut map = |side: &Buckets, side_bounds: &[f64], negate: bool, c: Option<&[f64]>| {
let mut intersect_idx = 0;
for (k, &(idx, value)) in side.iter().enumerate() {
let mut target_idx = target.len() - 1;
if let Some(&source_bound) = usize::try_from(idx).ok().and_then(|i| side_bounds.get(i))
{
while intersect_idx < bounds.len() {
if bounds[intersect_idx] >= source_bound {
target_idx = intersect_idx;
break;
}
intersect_idx += 1;
}
}
let (sum, comp) = (&mut target[target_idx], &mut target_c[target_idx]);
if negate {
(*sum, *comp) = kahan_inc(-value, *sum, *comp);
} else {
(*sum, *comp) = kahan_inc(value, *sum, *comp);
if let Some(c) = c {
(*sum, *comp) = kahan_inc(c[k], *sum, *comp);
}
}
}
};
map(a, a_bounds, false, a_compensation);
map(b, b_bounds, subtract, None);
let mut out = Vec::new();
let mut out_c = Vec::new();
for (i, (&value, &c)) in target.iter().zip(&target_c).enumerate() {
if value == 0.0 && c == 0.0 {
continue;
}
out.push((i as i32, value));
out_c.push((i as i32, c));
}
(out, out_c)
}
/// Go `detectReset` over two sides with matching indices.
fn side_reset(current: &Buckets, previous: &Buckets) -> bool {
let mut current = current.iter().peekable();
for &(idx, count) in previous {
while current.next_if(|bucket| bucket.0 < idx).is_some() {}
match current.peek() {
Some(&&(current_idx, current_count)) if current_idx == idx => {
if current_count < count {
return true;
}
}
_ if count != 0.0 => return true,
_ => {}
}
}
false
}
fn side_from_view(side: BucketSideView<'_>) -> Result<Buckets> {
let invalid = || DataFusionError::Execution("native histogram has an invalid layout".into());
if side.span_offsets.len() != side.span_lengths.len() {
return Err(invalid());
}
let mut out = Vec::with_capacity(side.buckets.len());
let mut counts = side.buckets.iter();
let mut idx = 0i64;
for (&offset, &length) in side.span_offsets.iter().zip(side.span_lengths) {
if length < 0 {
return Err(invalid());
}
idx += i64::from(offset);
for _ in 0..length {
let count = *counts.next().ok_or_else(invalid)?;
out.push((i32::try_from(idx).map_err(|_| invalid())?, count));
idx += 1;
}
}
if counts.next().is_some() {
return Err(invalid());
}
Ok(out)
}
/// Spans with one span per run of consecutive indices.
fn canonical_spans(side: &Buckets) -> Vec<(i32, i32)> {
let mut spans: Vec<(i32, i32)> = Vec::new();
let mut next = None;
for &(idx, _) in side {
match next {
Some(expected) if expected == idx => spans.last_mut().unwrap().1 += 1,
_ => spans.push((next.map_or(idx, |expected| idx - expected), 1)),
}
next = Some(idx + 1);
}
spans
}
/// Go `spansMatch`: equal layouts once zero-length spans are folded into the next span.
fn spans_match(a: &[(i32, i32)], b: &[(i32, i32)]) -> bool {
fn fold(spans: &[(i32, i32)]) -> Vec<(i32, i32)> {
let mut out = Vec::new();
let mut offset = 0;
for &(span_offset, length) in spans {
offset += span_offset;
if length != 0 {
out.push((offset, length));
offset = 0;
}
}
out
}
fold(a) == fold(b)
}
+397
View File
@@ -0,0 +1,397 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Prometheus `HistogramQuantile`, `HistogramFraction` and the `histogramVariance` estimate over
//! one native histogram, with the bucket iteration of `model/histogram`.
use datafusion::error::{DataFusionError, Result};
use datatypes::series::histogram::{BucketSideView, HistogramView};
use crate::functions::kahan_inc;
use crate::histogram_eval::bounds::EXPONENTIAL_BOUNDS;
pub(super) const CUSTOM_BUCKETS_SCHEMA: i32 = -53;
#[derive(Debug, Clone, Copy)]
pub(super) struct NativeBucket {
lower: f64,
upper: f64,
count: f64,
}
/// The buckets of `h` from the lowest to the highest, or the reverse: negative buckets, the zero
/// bucket when it has observations, then positive buckets (Go `AllBucketIterator` and
/// `AllReverseBucketIterator`). Buckets overlapping the zero bucket are clipped to it.
pub(super) fn all_buckets(
h: &HistogramView<'_>,
reverse: bool,
out: &mut Vec<NativeBucket>,
) -> Result<()> {
out.clear();
let (low, high) = if reverse {
(h.positive, h.negative)
} else {
(h.negative, h.positive)
};
// The first side runs from its highest index down, the second from its lowest index up.
side(h, low, reverse, out)?;
out.reverse();
if h.zero_count > 0.0 {
if h.schema == CUSTOM_BUCKETS_SCHEMA {
return Err(DataFusionError::Execution(
"histograms with custom buckets have no zero bucket".into(),
));
}
out.push(NativeBucket {
lower: -h.zero_threshold,
upper: h.zero_threshold,
count: h.zero_count,
});
}
side(h, high, !reverse, out)?;
for bucket in out.iter_mut() {
if bucket.upper < 0.0 && bucket.upper > -h.zero_threshold {
bucket.upper = -h.zero_threshold;
} else if bucket.lower > 0.0 && bucket.lower < h.zero_threshold {
bucket.lower = h.zero_threshold;
}
}
Ok(())
}
/// Appends the buckets of one side by increasing index.
fn side(
h: &HistogramView<'_>,
side: BucketSideView<'_>,
positive: bool,
out: &mut Vec<NativeBucket>,
) -> Result<()> {
if side.span_offsets.len() != side.span_lengths.len() {
return Err(invalid_layout());
}
let mut counts = side.buckets.iter();
let mut index = 0i64;
for (&offset, &length) in side.span_offsets.iter().zip(side.span_lengths) {
if length < 0 {
return Err(invalid_layout());
}
index += i64::from(offset);
for _ in 0..length {
let count = *counts.next().ok_or_else(invalid_layout)?;
let idx = i32::try_from(index).map_err(|_| invalid_layout())?;
out.push(bucket(h, idx, count, positive)?);
index += 1;
}
}
if counts.next().is_some() {
return Err(invalid_layout());
}
Ok(())
}
fn bucket(h: &HistogramView<'_>, idx: i32, count: f64, positive: bool) -> Result<NativeBucket> {
let bound = |idx: i32| bound(idx, h.schema, h.custom_values);
Ok(if positive {
NativeBucket {
lower: bound(idx - 1)?,
upper: bound(idx)?,
count,
}
} else {
NativeBucket {
lower: -bound(idx)?,
upper: -bound(idx - 1)?,
count,
}
})
}
/// Go `getBound`.
pub(super) fn bound(idx: i32, schema: i32, custom_values: &[f64]) -> Result<f64> {
if schema == CUSTOM_BUCKETS_SCHEMA {
let len = custom_values.len() as i64;
return match i64::from(idx) {
-1 => Ok(f64::NEG_INFINITY),
i if i == len => Ok(f64::INFINITY),
i if (0..len).contains(&i) => Ok(custom_values[i as usize]),
_ => Err(invalid_layout()),
};
}
if schema < 0 {
if schema < -4 {
return Err(invalid_layout());
}
let exp = i64::from(idx) << -schema;
if exp == 1024 {
// The last bucket of finite values; its computed bound would overflow to +Inf,
// which Go reserves for the bucket of infinite observations.
return Ok(f64::MAX);
}
return Ok(ldexp(1.0, exp));
}
// Go's table entries are not all correctly rounded, and bounds become zero thresholds that
// are compared exactly, so the table is used rather than computing `2^(idx / 2^schema)`.
let bounds = EXPONENTIAL_BOUNDS
.get(schema as usize)
.ok_or_else(invalid_layout)?;
let frac = bounds[(idx & ((1 << schema) - 1)) as usize];
let exp = i64::from(idx >> schema) + 1;
if frac == 0.5 && exp == 1025 {
return Ok(f64::MAX);
}
Ok(ldexp(frac, exp))
}
/// Go `math.Ldexp` for a positive normal `frac`.
fn ldexp(frac: f64, exp: i64) -> f64 {
let bits = frac.to_bits();
let exp = exp + ((bits >> 52) & 0x7FF) as i64 - 1023;
if exp < -1075 {
return 0.0;
}
if exp > 1023 {
return f64::INFINITY;
}
let (exp, scale) = if exp < -1022 {
(exp + 53, 1.0 / (1u64 << 53) as f64)
} else {
(exp, 1.0)
};
scale * f64::from_bits((bits & !(0x7FF << 52)) | (((exp + 1023) as u64) << 52))
}
fn invalid_layout() -> DataFusionError {
DataFusionError::Execution("native histogram has an invalid bucket layout".into())
}
/// Prometheus `HistogramQuantile`.
pub(super) fn quantile(
q: f64,
h: &HistogramView<'_>,
buckets: &mut Vec<NativeBucket>,
) -> Result<f64> {
if q < 0.0 {
return Ok(f64::NEG_INFINITY);
}
if q > 1.0 {
return Ok(f64::INFINITY);
}
if h.count == 0.0 || q.is_nan() {
return Ok(f64::NAN);
}
let custom = h.schema == CUSTOM_BUCKETS_SCHEMA;
let forward = h.sum.is_nan() || q < 0.5;
all_buckets(h, !forward, buckets)?;
let mut rank = if forward {
q * h.count
} else {
(1.0 - q) * h.count
};
// Go keeps the last bucket visited, empty or not, and a zero bucket when there is none.
let mut bucket = NativeBucket {
lower: 0.0,
upper: 0.0,
count: 0.0,
};
let mut count = 0.0;
let mut visited = 0;
for &next in buckets.iter() {
visited += 1;
bucket = next;
if bucket.count == 0.0 {
continue;
}
count += bucket.count;
if count >= rank {
break;
}
}
if !custom && bucket.lower < 0.0 && bucket.upper > 0.0 {
if h.negative.buckets.is_empty() && !h.positive.buckets.is_empty() {
bucket.lower = 0.0;
} else if h.positive.buckets.is_empty() && !h.negative.buckets.is_empty() {
bucket.upper = 0.0;
}
} else if custom {
if bucket.lower == f64::NEG_INFINITY {
if bucket.upper <= 0.0 {
return Ok(bucket.upper);
}
bucket.lower = 0.0;
} else if bucket.upper == f64::INFINITY {
return Ok(bucket.lower);
}
}
if count > h.count {
count = h.count;
}
if count < rank {
return Ok(if h.sum.is_nan() {
f64::NAN
} else {
bucket.upper
});
}
if forward {
rank -= count - bucket.count;
} else {
rank = count - rank;
}
if h.sum.is_nan() {
// Prometheus walks the remaining buckets to annotate NaN observations and leaves the last
// one in `bucket`, which the interpolation below then uses.
for &next in &buckets[visited..] {
bucket = next;
}
}
let fraction = rank / bucket.count;
if custom || (bucket.lower <= 0.0 && bucket.upper >= 0.0) {
return Ok(bucket.lower + (bucket.upper - bucket.lower) * fraction);
}
let log_lower = bucket.lower.abs().log2();
let log_upper = bucket.upper.abs().log2();
if bucket.lower > 0.0 {
return Ok((log_lower + (log_upper - log_lower) * fraction).exp2());
}
Ok(-(log_upper + (log_lower - log_upper) * (1.0 - fraction)).exp2())
}
/// Prometheus `HistogramFraction`.
pub(super) fn fraction(
lower: f64,
upper: f64,
h: &HistogramView<'_>,
buckets: &mut Vec<NativeBucket>,
) -> Result<f64> {
if h.count == 0.0 || lower.is_nan() || upper.is_nan() {
return Ok(f64::NAN);
}
if lower >= upper {
return Ok(0.0);
}
let custom = h.schema == CUSTOM_BUCKETS_SCHEMA;
all_buckets(h, false, buckets)?;
let (mut count, mut rank, mut lower_rank, mut upper_rank) = (0.0, 0.0, 0.0, 0.0);
let (mut lower_set, mut upper_set) = (false, false);
let mut visited = 0;
for b in buckets.iter() {
visited += 1;
let mut b = *b;
count += b.count;
let mut zero_bucket = false;
if b.lower <= 0.0 && b.upper >= 0.0 {
zero_bucket = true;
if h.negative.buckets.is_empty() && !h.positive.buckets.is_empty() {
b.lower = 0.0;
} else if h.positive.buckets.is_empty() && !h.negative.buckets.is_empty() {
b.upper = 0.0;
}
}
let interpolate = |v: f64| {
if custom || zero_bucket {
if b.lower == f64::NEG_INFINITY {
b.count
} else {
rank + b.count * ((v - b.lower) / (b.upper - b.lower))
}
} else {
rank + b.count * fraction_below_exponential(b, v)
}
};
if !lower_set && b.lower >= lower {
lower_rank = rank;
lower_set = true;
}
if !upper_set && b.lower >= upper {
upper_rank = rank;
upper_set = true;
}
if lower_set && upper_set {
break;
}
if !lower_set && b.lower < lower && b.upper > lower {
lower_rank = interpolate(lower);
lower_set = true;
}
if !upper_set && b.lower < upper && b.upper > upper {
upper_rank = interpolate(upper);
upper_set = true;
}
if lower_set && upper_set {
break;
}
rank += b.count;
}
if h.sum.is_nan() {
for b in &buckets[visited..] {
count += b.count;
}
} else {
count = h.count;
}
if !lower_set || lower_rank > count {
lower_rank = count;
}
if !upper_set || upper_rank > count {
upper_rank = count;
}
Ok((upper_rank - lower_rank) / h.count)
}
/// Go `Bucket.FractionBelow` with exponential interpolation.
fn fraction_below_exponential(b: NativeBucket, v: f64) -> f64 {
let log_lower = b.lower.abs().log2();
let log_upper = b.upper.abs().log2();
let log_v = v.abs().log2();
if v > 0.0 {
(log_v - log_lower) / (log_upper - log_lower)
} else {
1.0 - ((log_v - log_upper) / (log_lower - log_upper))
}
}
/// Prometheus `histogramVariance`: bucket midpoints weighted by count around the mean.
pub(super) fn variance(h: &HistogramView<'_>, buckets: &mut Vec<NativeBucket>) -> Result<f64> {
let mean = h.sum / h.count;
let custom = h.schema == CUSTOM_BUCKETS_SCHEMA;
all_buckets(h, false, buckets)?;
let (mut variance, mut compensation) = (0.0, 0.0);
for bucket in buckets.iter().filter(|bucket| bucket.count != 0.0) {
let value = if custom {
(bucket.upper + bucket.lower) / 2.0
} else if bucket.lower <= 0.0 && bucket.upper >= 0.0 {
0.0
} else {
let value = (bucket.upper * bucket.lower).sqrt();
if bucket.upper < 0.0 { -value } else { value }
};
let delta = value - mean;
(variance, compensation) = kahan_inc(bucket.count * delta * delta, variance, compensation);
}
Ok((variance + compensation) / h.count)
}
#[cfg(test)]
mod tests {
/// The last bucket of finite values ends at `f64::MAX`; only the next one, which counts
/// infinite observations, ends at +Inf.
#[test]
fn last_finite_bucket_ends_at_max() {
for schema in [-4, 0, 3, 8] {
let last = 1024i32 << schema.max(0) >> (-schema).max(0);
assert_eq!(super::bound(last, schema, &[]).unwrap(), f64::MAX);
assert_eq!(super::bound(last + 1, schema, &[]).unwrap(), f64::INFINITY);
}
}
}
File diff suppressed because it is too large Load Diff
+606
View File
@@ -0,0 +1,606 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use std::collections::BTreeMap;
use std::sync::Arc;
use datafusion::error::DataFusionError;
use datatypes::series::samples::{FieldSpec, SampleRef, Series, SeriesSchema};
use datatypes::series::time::TimeAxis;
use super::float_histogram::{AddOutcome, FloatHistogram};
use super::{
HistogramAggregate, HistogramFunction, NativeHistogramFunction, aggregate_histograms,
evaluate_histograms, map_native_histogram,
};
use crate::grid_series::merge_same_labelset;
use crate::grid_series::reference::{
GoldenCase, Labels, OwnedHistogram, Points, canonical_bits, close, golden_cases, labels_of,
metric_of, mixed_series, points_of,
};
fn schema(case: &GoldenCase) -> Arc<SeriesSchema> {
Arc::new(SeriesSchema {
fields: vec![FieldSpec {
name: Arc::from("value"),
}]
.into(),
eval_grid: Some(case.grid.clone()),
})
}
fn bits_argument(case: &GoldenCase, index: usize) -> f64 {
f64::from_bits(u64::from_str_radix(&case.spec[index], 16).unwrap())
}
/// Compares a kernel outcome with a fixture outcome; returns whether it was an error.
fn assert_outcome(
case: &GoldenCase,
actual: Result<Vec<Series>, DataFusionError>,
expected: &Result<BTreeMap<Labels, Points>, String>,
) -> bool {
match (actual, expected) {
(Ok(actual), Ok(expected)) => {
let actual: BTreeMap<_, _> = actual
.iter()
.map(|series| (labels_of(&series.metric), points_of(series)))
.collect();
let expected: BTreeMap<_, _> = expected
.iter()
.map(|(labels, points)| {
let points = points
.iter()
.map(|(&index, &bits)| (index, canonical_bits(f64::from_bits(bits))))
.collect::<Points>();
(labels.clone(), points)
})
.collect();
let keys = |series: &BTreeMap<Labels, Points>| {
series
.iter()
.map(|(labels, points)| (labels.clone(), points.keys().copied().collect()))
.collect::<Vec<(Labels, Vec<usize>)>>()
};
assert_eq!(keys(&actual), keys(&expected), "case {:?}", case.spec);
// promql-compat's tolerance for ill-conditioned evaluation covers the variance.
let epsilon = if case.spec[0].contains("stddev") || case.spec[0].contains("stdvar") {
1e-6
} else {
1e-10
};
for (labels, points) in &actual {
for (point, &bits) in points {
let got = f64::from_bits(bits);
let want = f64::from_bits(expected[labels][point]);
assert!(
close(got, want, epsilon),
"case {:?}: {labels:?} at {point}: {got} vs {want}",
case.spec
);
}
}
false
}
(Err(actual), Err(expected)) => {
assert!(actual.to_string().contains(expected), "{actual}");
true
}
(actual, expected) => panic!("case {:?}: {actual:?} is not {expected:?}", case.spec),
}
}
#[test]
fn classic_histograms_match_prometheus() {
let cases = golden_cases(include_str!("classic_cases.txt"));
assert_eq!(cases.len(), 300);
let mut failed = 0;
for case in &cases {
let schema = schema(case);
// The fixture lists buckets by bound; the kernel must not rely on input order.
let input: Vec<_> = case
.inputs
.iter()
.rev()
.filter_map(|(labels, points)| mixed_series(&schema, labels, points, &BTreeMap::new()))
.collect();
let function = match case.spec[0].as_str() {
"quantile" => HistogramFunction::Quantile(bits_argument(case, 1)),
"fraction" => HistogramFunction::Fraction {
lower: bits_argument(case, 1),
upper: bits_argument(case, 2),
},
other => panic!("unknown case {other}"),
};
let actual = evaluate_histograms(function, &schema, &input);
failed += usize::from(assert_outcome(case, actual, &case.outcome));
}
assert!(failed > 20, "{failed} failed");
}
#[test]
fn native_histograms_match_prometheus() {
let cases = golden_cases(include_str!("native_cases.txt"));
assert_eq!(cases.len(), 661);
for case in &cases {
let schema = schema(case);
let input: Vec<_> = case
.inputs
.iter()
.zip(&case.histograms)
.filter_map(|((labels, floats), histograms)| {
mixed_series(&schema, labels, floats, histograms)
})
.collect();
let map = |function| -> Result<Vec<Series>, DataFusionError> {
let mapped = input
.iter()
.filter_map(|series| map_native_histogram(function, &schema, series).transpose())
.collect::<Result<Vec<_>, _>>()?;
merge_same_labelset(&schema, mapped)
};
let actual = match case.spec[0].as_str() {
"histogram_count" => map(NativeHistogramFunction::Count),
"histogram_sum" => map(NativeHistogramFunction::Sum),
"histogram_avg" => map(NativeHistogramFunction::Avg),
"histogram_stddev" => map(NativeHistogramFunction::StdDev),
"histogram_stdvar" => map(NativeHistogramFunction::StdVar),
"histogram_quantile" => evaluate_histograms(
HistogramFunction::Quantile(bits_argument(case, 1)),
&schema,
&input,
),
"histogram_fraction" => evaluate_histograms(
HistogramFunction::Fraction {
lower: bits_argument(case, 1),
upper: bits_argument(case, 2),
},
&schema,
&input,
),
aggregate => {
let (op, by_job) = match aggregate {
"sum" => (HistogramAggregate::Sum, false),
"avg" => (HistogramAggregate::Avg, false),
"sum_by_job" => (HistogramAggregate::Sum, true),
"avg_by_job" => (HistogramAggregate::Avg, true),
other => panic!("unknown case {other}"),
};
assert_aggregates(case, &schema, &input, op, by_job);
continue;
}
};
assert_outcome(case, actual, &case.outcome);
}
}
fn canonical(value: f64) -> u64 {
canonical_bits(value)
}
/// The fields of `h` as bits, NaN as one NaN, with its bucket indices.
fn fingerprint(h: &FloatHistogram) -> String {
let side = |side: &[(i32, f64)]| -> String {
side.iter()
.map(|&(idx, count)| format!("{idx}:{:x}", canonical(count)))
.collect::<Vec<_>>()
.join(",")
};
format!(
"{} {:?} zt={:x} zc={:x} count={:x} sum={:x} +[{}] -[{}] custom={:?}",
h.schema,
h.reset_hint,
canonical(h.zero_threshold),
canonical(h.zero_count),
canonical(h.count),
canonical(h.sum),
side(&h.positive),
side(&h.negative),
h.custom_values
.iter()
.map(|v| canonical(*v))
.collect::<Vec<_>>(),
)
}
fn histogram(text: &str) -> FloatHistogram {
FloatHistogram::try_from_view(&OwnedHistogram::parse(text).view()).unwrap()
}
#[test]
fn histogram_arithmetic_matches_prometheus() {
let mut checked = 0;
for line in include_str!("arithmetic_cases.txt").lines() {
if line.starts_with('#') {
continue;
}
let (inputs, outputs) = line.split_once(" => ").unwrap();
let mut inputs = inputs.split(' ');
let (op, argument) = (inputs.next().unwrap(), inputs.next().unwrap());
let inputs: Vec<FloatHistogram> = inputs.map(histogram).collect();
let outputs: Vec<&str> = outputs.split(' ').collect();
let flags = |outcome: AddOutcome| {
vec![
outcome.counter_reset_collision.to_string(),
outcome.custom_bounds_reconciled.to_string(),
]
};
let actual: Result<Vec<String>, _> = match op {
"add" | "sub" => {
let mut result = inputs[0].clone();
let outcome = if op == "add" {
result.add(&inputs[1])
} else {
result.sub(&inputs[1])
};
outcome.map(|outcome| [vec![fingerprint(&result)], flags(outcome)].concat())
}
"kahan" => {
let mut sum = inputs[0].clone();
let mut compensation = None;
let mut any = AddOutcome::default();
let mut result = Ok(());
for h in &inputs[1..] {
match sum.kahan_add(h, compensation.take()) {
Ok((c, outcome)) => {
compensation = Some(c);
any.counter_reset_collision |= outcome.counter_reset_collision;
any.custom_bounds_reconciled |= outcome.custom_bounds_reconciled;
}
Err(error) => {
result = Err(error);
break;
}
}
}
result.map(|_| {
let c = compensation.unwrap();
[vec![fingerprint(&sum), fingerprint(&c)], flags(any)].concat()
})
}
"mul" | "div" => {
let factor = f64::from_bits(u64::from_str_radix(argument, 16).unwrap());
let mut result = inputs[0].clone();
if op == "mul" {
result.mul(factor);
} else {
result.div(factor);
}
Ok(vec![fingerprint(&result)])
}
"compact" => {
let mut result = inputs[0].clone();
result.compact();
Ok(vec![fingerprint(&result)])
}
"schema" => inputs[0]
.copy_to_schema(argument.parse().unwrap())
.map(|result| vec![fingerprint(&result)]),
"reset" => inputs[0]
.detect_reset(&inputs[1])
.map(|reset| vec![reset.to_string()]),
"equals" => Ok(vec![inputs[0].equals(&inputs[1]).to_string()]),
other => panic!("unknown operation {other}"),
};
let expected: Vec<String> = match op {
"add" | "sub" if outputs[0] != "error" => vec![
fingerprint(&histogram(outputs[0])),
outputs[1].to_string(),
outputs[2].to_string(),
],
"kahan" if outputs[0] != "error" => vec![
fingerprint(&histogram(outputs[0])),
fingerprint(&histogram(outputs[1])),
outputs[2].to_string(),
outputs[3].to_string(),
],
"mul" | "div" | "compact" | "schema" => vec![fingerprint(&histogram(outputs[0]))],
_ => outputs.iter().map(|output| output.to_string()).collect(),
};
match actual {
Ok(actual) => assert_eq!(actual, expected, "{line}"),
Err(error) => assert_eq!(expected, vec!["error".to_string()], "{line}: {error}"),
}
checked += 1;
}
assert_eq!(checked, 723);
}
/// Groups the input in its order as `sum`/`avg` with or without `by (job)` do, and compares the
/// aggregated histograms; float-only points belong to the float aggregation.
fn assert_aggregates(
case: &GoldenCase,
schema: &Arc<SeriesSchema>,
input: &[Series],
op: HistogramAggregate,
by_job: bool,
) {
assert!(
case.outcome.is_ok(),
"case {:?}: {:?}",
case.spec,
case.outcome
);
let mut groups: BTreeMap<Labels, Vec<Series>> = BTreeMap::new();
for series in input {
let mut labels = Labels::new();
if by_job {
labels.insert(
"job".to_string(),
series.metric.get("job").unwrap().to_string(),
);
}
groups.entry(labels).or_default().push(series.clone());
}
let mut actual = BTreeMap::new();
for (labels, group) in groups {
if let Some(series) = aggregate_histograms(op, schema, &group, metric_of(&labels)).unwrap()
{
actual.insert(labels, histogram_points(&series));
}
}
let expected: BTreeMap<_, _> = case
.result_histograms
.iter()
.map(|(labels, points)| {
let points: BTreeMap<_, _> = points
.iter()
.map(|(&index, text)| (index, fingerprint(&histogram(text))))
.collect();
(labels.clone(), points)
})
.collect();
assert_eq!(actual, expected, "case {:?}", case.spec);
}
fn histogram_points(series: &Series) -> BTreeMap<usize, String> {
let TimeAxis::Grid(range) = &series.time else {
panic!("expected a grid series");
};
series.fields.as_slice()[0]
.iter()
.enumerate()
.filter_map(|(row, sample)| match sample {
SampleRef::Histogram(view) => Some((
range.start() + row,
fingerprint(&FloatHistogram::try_from_view(&view).unwrap()),
)),
_ => None,
})
.collect()
}
/// `histogram_quantile` drops all metadata labels; the single-histogram functions drop only
/// `__name__`, as Prometheus does.
#[test]
fn histogram_functions_drop_metadata_labels() {
let grid = Arc::new(
datatypes::series::time::EvalGrid::try_new(
datatypes::series::time::GridSpec::try_new(0, 1_000, 1).unwrap(),
)
.unwrap(),
);
let schema = Arc::new(SeriesSchema {
fields: vec![FieldSpec {
name: Arc::from("value"),
}]
.into(),
eval_grid: Some(grid),
});
let labels = |extra: &[(&str, &str)]| -> Labels {
[
("__name__", "m"),
("__type__", "histogram"),
("__unit__", "seconds"),
("job", "x"),
]
.iter()
.chain(extra)
.map(|(name, value)| (name.to_string(), value.to_string()))
.collect()
};
let one = BTreeMap::from([(0, 1f64.to_bits())]);
let buckets = vec![
mixed_series(&schema, &labels(&[("le", "1")]), &one, &BTreeMap::new()).unwrap(),
mixed_series(&schema, &labels(&[("le", "+Inf")]), &one, &BTreeMap::new()).unwrap(),
];
let quantile =
evaluate_histograms(HistogramFunction::Quantile(0.5), &schema, &buckets).unwrap();
assert_eq!(
labels_of(&quantile[0].metric),
Labels::from([("job".to_string(), "x".to_string())])
);
let native = mixed_series(
&schema,
&labels(&[]),
&BTreeMap::new(),
&BTreeMap::from([(
0,
"0/0/0/3ff0000000000000/3ff0000000000000/0/0_1/3ff0000000000000///".to_string(),
)]),
)
.unwrap();
let count = map_native_histogram(NativeHistogramFunction::Count, &schema, &native)
.unwrap()
.unwrap();
let mut expected = labels(&[]);
expected.remove("__name__");
assert_eq!(labels_of(&count.metric), expected);
}
/// Bounds +0 and -0 compare equal and keep input order, so coalescing keeps the first one:
/// `1 / histogram_quantile(0, sort_desc(h))` over `le` "+Inf", "0", "-0" is +Inf.
#[test]
fn classic_bounds_keep_the_first_signed_zero() {
let grid = Arc::new(
datatypes::series::time::EvalGrid::try_new(
datatypes::series::time::GridSpec::try_new(0, 1_000, 1).unwrap(),
)
.unwrap(),
);
let schema = Arc::new(SeriesSchema {
fields: vec![FieldSpec {
name: Arc::from("value"),
}]
.into(),
eval_grid: Some(grid),
});
let buckets: Vec<_> = [("+Inf", 3.0), ("0", 2.0), ("-0", 1.0)]
.iter()
.map(|(le, count)| {
let labels = Labels::from([
("__name__".to_string(), "h".to_string()),
("le".to_string(), le.to_string()),
]);
let points = BTreeMap::from([(0, f64::to_bits(*count))]);
mixed_series(&schema, &labels, &points, &BTreeMap::new()).unwrap()
})
.collect();
let result = evaluate_histograms(HistogramFunction::Quantile(0.0), &schema, &buckets).unwrap();
let points = points_of(&result[0]);
assert_eq!(1.0 / f64::from_bits(points[&0]), f64::INFINITY);
}
/// Classic histograms over `le` values in input order, at one point.
fn classic_result(function: HistogramFunction, buckets: &[(&str, f64)]) -> f64 {
let grid = Arc::new(
datatypes::series::time::EvalGrid::try_new(
datatypes::series::time::GridSpec::try_new(0, 1_000, 1).unwrap(),
)
.unwrap(),
);
let schema = Arc::new(SeriesSchema {
fields: vec![FieldSpec {
name: Arc::from("value"),
}]
.into(),
eval_grid: Some(grid),
});
let series: Vec<_> = buckets
.iter()
.map(|(le, count)| {
let labels = Labels::from([
("__name__".to_string(), "h".to_string()),
("le".to_string(), le.to_string()),
]);
let points = BTreeMap::from([(0, f64::to_bits(*count))]);
mixed_series(&schema, &labels, &points, &BTreeMap::new()).unwrap()
})
.collect();
let result = evaluate_histograms(function, &schema, &series).unwrap();
f64::from_bits(points_of(&result[0])[&0])
}
/// Go's insertion sort cannot move a bucket across a NaN bound, so a NaN bucket stays where it
/// is and `+Inf` can still end the list. Values are from Prometheus v3.15.0.
#[test]
fn nan_bounds_stay_in_place() {
let buckets = [("1", 10.0), ("NaN", 20.0), ("inf", 30.0)];
let quantile = classic_result(HistogramFunction::Quantile(0.1), &buckets);
assert!((quantile - 0.3).abs() < 1e-12, "{quantile}");
let fraction = classic_result(
HistogramFunction::Fraction {
lower: 0.0,
upper: 0.5,
},
&buckets,
);
assert!((fraction - 1.0 / 6.0).abs() < 1e-12, "{fraction}");
}
/// `le` parses like Go's `strconv.ParseFloat`: a signed NaN is not a bound, and `_` may separate
/// digits. Values are from Prometheus v3.15.0.
#[test]
fn bounds_parse_like_go() {
let signed_nan = [("1", 10.0), ("+nan", 20.0), ("+Inf", 30.0)];
for (q, expected) in [(0.1, 0.3), (0.5, 1.0)] {
let quantile = classic_result(HistogramFunction::Quantile(q), &signed_nan);
assert!((quantile - expected).abs() < 1e-12, "{q}: {quantile}");
}
let underscore = [("1", 10.0), ("1_000", 20.0), ("+Inf", 30.0)];
let quantile = classic_result(HistogramFunction::Quantile(0.5), &underscore);
assert!((quantile - 500.5).abs() < 1e-9, "{quantile}");
for rejected in ["-nan", "_1", "1__0", "1_", "1_.5", "1e_5"] {
assert_eq!(super::classic::parse_bound(rejected), None, "{rejected}");
}
}
/// Widened zero thresholds take Go's table bound, one ulp below `2^0.5` for schema 1 bucket 1,
/// and later comparisons see that exact value.
#[test]
fn widened_zero_threshold_uses_go_bounds() {
let go_bound = f64::from_bits(0x3ff6a09e667f3bcc);
let mut a = histogram("1/0/0/3ff0000000000000/3ff0000000000000/0/1_1/3ff0000000000000///");
let previous = a.clone();
a.add(&histogram("1/3ff3333333333333/0/0/0/0/////"))
.unwrap();
assert_eq!(a.zero_threshold.to_bits(), go_bound.to_bits());
let current = histogram(&format!(
"1/{:x}/3ff0000000000000/3ff0000000000000/0/0/////",
go_bound.to_bits()
));
assert!(!current.detect_reset(&previous).unwrap());
}
/// Only mixing exponential and custom buckets ends a group without a result; any other
/// addition error, such as an invalid layout, fails the aggregation.
#[test]
fn aggregation_propagates_errors_other_than_mixed_schemas() {
let grid = Arc::new(
datatypes::series::time::EvalGrid::try_new(
datatypes::series::time::GridSpec::try_new(0, 1_000, 1).unwrap(),
)
.unwrap(),
);
let schema = Arc::new(SeriesSchema {
fields: vec![FieldSpec {
name: Arc::from("value"),
}]
.into(),
eval_grid: Some(grid),
});
let group = |texts: [&str; 2]| -> Vec<Series> {
texts
.iter()
.enumerate()
.map(|(host, text)| {
let labels = Labels::from([("host".to_string(), host.to_string())]);
let histograms = BTreeMap::from([(0, text.to_string())]);
mixed_series(&schema, &labels, &BTreeMap::new(), &histograms).unwrap()
})
.collect()
};
let exponential = "0/0/0/3ff0000000000000/3ff0000000000000/0/1_1/3ff0000000000000///";
let custom =
"-53/0/0/3ff0000000000000/3ff0000000000000/0/0_1/3ff0000000000000///3ff0000000000000";
let invalid =
"9/3ff0000000000000/0/3ff0000000000000/3ff0000000000000/0/1_1/3ff0000000000000///";
for op in [HistogramAggregate::Sum, HistogramAggregate::Avg] {
let mixed = aggregate_histograms(
op,
&schema,
&group([exponential, custom]),
metric_of(&Labels::new()),
);
assert!(mixed.unwrap().is_none());
let invalid = aggregate_histograms(
op,
&schema,
&group([invalid, invalid]),
metric_of(&Labels::new()),
);
assert!(invalid.is_err());
}
}
+8
View File
@@ -15,6 +15,14 @@
pub mod error;
pub mod extension_plan;
pub mod functions;
mod go_sort;
pub mod grid_series;
pub mod histogram_eval;
pub mod instant_eval;
pub mod map_label;
pub mod map_time;
mod metrics;
pub mod range_array;
pub mod range_eval;
pub mod select;
pub mod vector_match;
+157
View File
@@ -0,0 +1,157 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! `label_replace` and `label_join` over evaluated series, following Prometheus
//! `evalLabelReplace`, `evalLabelJoin` and `mergeSeriesWithSameLabelset`.
use std::sync::{Arc, LazyLock};
use datafusion::error::{DataFusionError, Result};
use datatypes::series::MetricName;
use datatypes::series::samples::{Series, SeriesSchema};
use regex::Regex;
use crate::grid_series::merge_same_labelset;
#[cfg(test)]
mod tests;
/// `label_replace(v, dst, replacement, src, regex)`: where `regex` matches the whole value of
/// `src`, `dst` is set to `replacement` with `$1`, `${name}` and `$$` expanded.
///
/// `regex` compiles with the `regex` crate, whose dialect differs from Go's RE2 used by
/// Prometheus: Perl classes (`\d`, `\w`, `\s`, `\b`) are Unicode-aware, `\Q...\E` is rejected,
/// `(?x)` and repeat counts above 1000 are accepted, and `\<`, `\>` are word boundaries instead
/// of literal characters.
pub fn label_replace(
schema: &Arc<SeriesSchema>,
mut series: Vec<Series>,
dst: &str,
replacement: &str,
src: &str,
regex: &str,
) -> Result<Vec<Series>> {
let compiled = Regex::new(&format!("^(?s:{regex})$")).map_err(|_| {
DataFusionError::Plan(format!(
"invalid regular expression in label_replace(): {regex}"
))
})?;
if dst.is_empty() {
return Err(DataFusionError::Plan(
"invalid destination label name in label_replace(): ".into(),
));
}
let mut value = String::new();
for series in &mut series {
let Some(captures) = compiled.captures(series.metric.get(src).unwrap_or_default()) else {
continue;
};
value.clear();
expand(&compiled, &captures, replacement, &mut value);
set_label(&mut series.metric, dst, &value)?;
}
merge_same_labelset(schema, series)
}
/// Go `regexp.Expand` reads a group name as Unicode letters (L), decimal digits (Nd) and `_`,
/// narrower than `char::is_alphanumeric`.
static GROUP_NAME: LazyLock<Regex> = LazyLock::new(|| Regex::new(r"^[\p{L}\p{Nd}_]*").unwrap());
/// Go `regexp.Expand`, whose template syntax differs from `regex::Captures::expand`: a numeric
/// reference with a leading zero, like `$01`, or of more than nine digits is a group name.
fn expand(regex: &Regex, captures: &regex::Captures<'_>, template: &str, out: &mut String) {
let mut rest = template;
while let Some(dollar) = rest.find('$') {
out.push_str(&rest[..dollar]);
rest = &rest[dollar + 1..];
if let Some(after) = rest.strip_prefix('$') {
out.push('$');
rest = after;
continue;
}
let (braced, body) = match rest.strip_prefix('{') {
Some(body) => (true, body),
None => (false, rest),
};
let len = GROUP_NAME.find(body).map_or(0, |name| name.end());
let name = &body[..len];
let closed = !braced || body[len..].starts_with('}');
if name.is_empty() || !closed {
// Malformed; Go keeps the `$` as text.
out.push('$');
continue;
}
rest = &body[len + usize::from(braced)..];
let number = (name.bytes().all(|b| b.is_ascii_digit())
&& !(name.len() > 1 && name.starts_with('0')))
.then(|| name.parse::<usize>().ok())
.flatten()
.filter(|_| name.len() <= 9);
let group = match number {
Some(number) => captures.get(number),
None => regex
.capture_names()
.position(|group| group == Some(name))
.and_then(|index| captures.get(index)),
};
if let Some(group) = group {
out.push_str(group.as_str());
}
}
out.push_str(rest);
}
/// `label_join(v, dst, separator, src...)`: `dst` is set to the values of `src` joined by
/// `separator`, an absent label joining as the empty string.
pub fn label_join(
schema: &Arc<SeriesSchema>,
mut series: Vec<Series>,
dst: &str,
separator: &str,
src: &[&str],
) -> Result<Vec<Series>> {
if let Some(src) = src.iter().find(|src| src.is_empty()) {
return Err(DataFusionError::Plan(format!(
"invalid source label name in label_join(): {src}"
)));
}
if dst.is_empty() {
return Err(DataFusionError::Plan(
"invalid destination label name in label_join(): ".into(),
));
}
let mut value = String::new();
for series in &mut series {
value.clear();
for (index, src) in src.iter().enumerate() {
if index > 0 {
value.push_str(separator);
}
value.push_str(series.metric.get(src).unwrap_or_default());
}
set_label(&mut series.metric, dst, &value)?;
}
merge_same_labelset(schema, series)
}
/// An empty value removes the label, as Prometheus label sets have no empty values.
fn set_label(metric: &mut MetricName, name: &str, value: &str) -> Result<()> {
if value.is_empty() {
metric.remove(name);
return Ok(());
}
metric
.set(name, Arc::from(value))
.map_err(|error| DataFusionError::External(Box::new(error)))
}
File diff suppressed because it is too large Load Diff
+115
View File
@@ -0,0 +1,115 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use std::collections::BTreeMap;
use std::sync::Arc;
use datatypes::series::samples::{FieldSpec, SeriesSchema};
use super::{label_join, label_replace};
use crate::grid_series::reference::{
canonical_bits, golden_cases, labels_of, points_of, series_of,
};
#[test]
fn label_functions_match_prometheus() {
let cases = golden_cases(include_str!("prometheus_cases.txt"));
assert_eq!(cases.len(), 200);
let (mut matched, mut merged, mut failed) = (0, 0, 0);
for case in cases {
let schema = Arc::new(SeriesSchema {
fields: vec![FieldSpec {
name: Arc::from("value"),
}]
.into(),
eval_grid: Some(case.grid.clone()),
});
let input = case
.inputs
.iter()
.filter_map(|(labels, points)| series_of(&schema, labels, points))
.collect::<Vec<_>>();
let inputs = input.len();
let spec: Vec<&str> = case.spec.iter().map(String::as_str).collect();
let actual = match spec[0] {
"label_replace" => label_replace(&schema, input, spec[1], spec[2], spec[3], spec[4]),
"label_join" => label_join(&schema, input, spec[1], spec[2], &spec[3..]),
other => panic!("unknown case {other}"),
};
match (actual, case.outcome) {
(Ok(actual), Ok(expected)) => {
if expected.len() < inputs {
merged += 1;
}
let actual: BTreeMap<_, _> = actual
.iter()
.map(|series| (labels_of(&series.metric), points_of(series)))
.collect();
let expected: BTreeMap<_, _> = expected
.into_iter()
.map(|(labels, points)| {
let points = points
.into_iter()
.map(|(index, bits)| (index, canonical_bits(f64::from_bits(bits))))
.collect();
(labels, points)
})
.collect();
assert_eq!(actual, expected, "case {spec:?}");
matched += 1;
}
(Err(actual), Err(expected)) => {
assert!(
actual.to_string().contains(&expected),
"case {spec:?}: {actual} is not {expected}"
);
failed += 1;
}
(actual, expected) => panic!("case {spec:?}: {actual:?} is not {expected:?}"),
}
}
assert!(
matched > 150 && merged > 2 && failed > 20,
"{matched} matched, {merged} merged, {failed} failed"
);
}
/// Replacement templates expand as Go's `regexp.Expand` does; expectations come from Go.
#[test]
fn replacements_expand_like_go() {
let regex = regex::Regex::new("^(?s:(?P<word>[a-z]+)-([0-9]+))$").unwrap();
let captures = regex.captures("abc-42").unwrap();
for (template, expected) in [
("$01", ""),
("${01}", ""),
("$1", "abc"),
("${1}x", "abcx"),
("$1x", ""),
("$$", "$"),
("$", "$"),
("${1", "${1"),
("$word", "abc"),
("${word}!", "abc!"),
("$2$1", "42abc"),
("$-", "$-"),
("$0", "abc-42"),
("$9", ""),
("$1234567890", ""),
("$1²", "abc²"),
] {
let mut out = String::new();
super::expand(&regex, &captures, template, &mut out);
assert_eq!(out, expected, "{template}");
}
}
+212
View File
@@ -0,0 +1,212 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! `time()` and the date functions over evaluated series, following Prometheus `funcTime` and
//! `dateWrapper`.
use std::sync::Arc;
use datafusion::arrow::array::Float64Array;
use datafusion::error::{DataFusionError, Result};
use datatypes::series::MetricName;
use datatypes::series::samples::{
DenseSamplesRef, SampleRef, Samples, Series, SeriesFields, SeriesSchema,
};
use datatypes::series::time::{GridRange, TimeAxis};
use crate::grid_series::{GridSeriesBuilder, METADATA_LABELS, external};
#[cfg(test)]
mod tests;
/// A PromQL date function: `minute(v)`, `year()` and so on.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DateFunction {
DayOfMonth,
DayOfWeek,
DayOfYear,
DaysInMonth,
Hour,
Minute,
Month,
Year,
}
/// `time()`: the evaluation time in seconds at every point of the schema's grid, unlabelled.
pub fn time(schema: &SeriesSchema) -> Result<Series> {
eval_time_series(schema, |ms| ms as f64 / 1000.0)
}
/// A date function without argument, which reads the evaluation time: one unlabelled series
/// over the whole grid.
pub fn date_of_eval_time(function: DateFunction, schema: &SeriesSchema) -> Result<Series> {
// Prometheus truncates the timestamp to whole seconds towards zero.
eval_time_series(schema, |ms| function.apply(ms / 1000))
}
/// A date function over `series`: each float value is read as Unix seconds and replaced by the
/// date component, and the metric name is dropped. Missing values stay missing; histogram
/// samples are dropped, so the result is `None` when no float remains.
///
/// Series that share a label set once their names are dropped must then go through
/// [`merge_same_labelset`](crate::grid_series::merge_same_labelset).
pub fn map_date(
function: DateFunction,
schema: &Arc<SeriesSchema>,
series: &Series,
) -> Result<Option<Series>> {
let TimeAxis::Grid(range) = &series.time else {
return Err(DataFusionError::Execution(
"date functions require an evaluated series".into(),
));
};
let mut metric = series.metric.clone();
metric.remove_all(&METADATA_LABELS);
let map = |seconds: f64| function.apply(go_int64(seconds));
let all_floats = series.fields.iter().all(|samples| {
samples
.segments()
.iter()
.all(|segment| matches!(segment.dense(), Some(DenseSamplesRef::Float(_))))
});
if all_floats {
let fields = series
.fields
.iter()
.map(|samples| {
let segments = samples
.segments()
.iter()
.map(|segment| {
let Some(DenseSamplesRef::Float(floats)) = segment.dense() else {
unreachable!("checked above");
};
Samples::from_float(floats.unary(map))
})
.collect();
Samples::try_from_chunks(segments).map_err(external)
})
.collect::<Result<Vec<_>>>()?;
let fields = SeriesFields::try_from_vec(fields).map_err(external)?;
return Series::try_new(schema, metric, series.time.clone(), fields)
.map(Some)
.map_err(external);
}
// Histogram samples leave holes, which may move the ends of the series.
let mut builder = GridSeriesBuilder::try_new(schema.clone())?;
let mut values = vec![None; series.fields.len()];
for row in 0..range.len() {
for (value, samples) in values.iter_mut().zip(series.fields.iter()) {
*value = match samples.sample(row) {
SampleRef::Float(seconds) => Some(map(seconds)),
SampleRef::Missing | SampleRef::Histogram(_) => None,
};
}
builder.push(range.start() + row, &values)?;
}
builder.finish(metric)
}
fn eval_time_series(schema: &SeriesSchema, value: impl Fn(i64) -> f64) -> Result<Series> {
let grid = schema.eval_grid.clone().ok_or_else(|| {
DataFusionError::Execution("time functions require an evaluation grid".into())
})?;
let values: Float64Array = grid.timestamps().iter().map(|&ms| value(ms)).collect();
let range = GridRange::try_new(grid.clone(), 0, values.len()).map_err(external)?;
let fields = vec![Samples::from_float(values); schema.fields.len()];
Series::try_new(
schema,
MetricName::try_new(None, Vec::new()).map_err(external)?,
TimeAxis::Grid(range),
SeriesFields::try_from_vec(fields).map_err(external)?,
)
.map_err(external)
}
/// Go's `int64(f)` on amd64: NaN and values out of range become `i64::MIN`.
fn go_int64(value: f64) -> i64 {
if (-9_223_372_036_854_775_808.0..9_223_372_036_854_775_808.0).contains(&value) {
value as i64
} else {
i64::MIN
}
}
const SECONDS_PER_DAY: u64 = 86_400;
const MARCH_THRU_DECEMBER: u32 = 306;
const ABSOLUTE_YEARS: u64 = 292_277_022_400;
/// Go's `unixToInternal + internalToAbsolute`.
const UNIX_TO_ABSOLUTE: i64 = (1969 * 365 + 1969 / 4 - 1969 / 100 + 1969 / 400) * 86_400
+ (ABSOLUTE_YEARS as i64 / 400 * 146_097 + MARCH_THRU_DECEMBER as i64) * 86_400;
impl DateFunction {
/// The component of Unix second `seconds` in UTC, computed the way Go's `time` package does,
/// including its wrapping arithmetic for instants out of its range.
fn apply(self, seconds: i64) -> f64 {
let abs = seconds.wrapping_add(UNIX_TO_ABSOLUTE) as u64;
let days = abs / SECONDS_PER_DAY;
let value = match self {
Self::Hour => (abs % SECONDS_PER_DAY / 3600) as i64,
Self::Minute => (abs % 3600 / 60) as i64,
Self::DayOfWeek => ((days + 3) % 7) as i64,
Self::Year => civil(days).year,
Self::Month => civil(days).month as i64,
Self::DayOfMonth => civil(days).day as i64,
Self::DayOfYear => civil(days).year_day,
Self::DaysInMonth => {
let Civil { year, month, .. } = civil(days);
let leap = year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
match month {
2 if leap => 29,
2 => 28,
4 | 6 | 9 | 11 => 30,
_ => 31,
}
}
};
value as f64
}
}
struct Civil {
year: i64,
month: u32,
day: u32,
year_day: i64,
}
/// Go's `absDays.split`, `date` and `yearYday`: days since March 1 of year `-ABSOLUTE_YEARS`.
fn civil(days: u64) -> Civil {
let d = days.wrapping_mul(4).wrapping_add(3);
let century = d / 146_097;
let cd = (d % 146_097) as u32 | 3;
let product = 2_939_745u64 * cd as u64;
let cyear = (product >> 32) as u32;
let ayday = product as u32 / 2_939_745 / 4;
let m = 2141 * ayday + 197_913;
let jan_feb = u32::from(ayday >= MARCH_THRU_DECEMBER);
let leap = cyear.is_multiple_of(4) && (cyear != 0 || century.is_multiple_of(4));
Civil {
year: century.wrapping_mul(100).wrapping_sub(ABSOLUTE_YEARS) as i64
+ cyear as i64
+ jan_feb as i64,
month: (m >> 16) - jan_feb * 12,
day: 1 + (m & 0xFFFF) / 2141,
year_day: ayday as i64 + (1 + 31 + 28) + i64::from(leap && jan_feb == 0)
- 365 * jan_feb as i64,
}
}
File diff suppressed because it is too large Load Diff
+175
View File
@@ -0,0 +1,175 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use std::collections::BTreeMap;
use std::sync::Arc;
use datafusion::arrow::array::{Float64Array, UInt32Array};
use datatypes::series::histogram::{
BucketSideView, CounterResetHint, HistogramBatchBuilder, HistogramView,
};
use datatypes::series::samples::{FieldSpec, Samples, Series, SeriesFields, SeriesSchema};
use datatypes::series::time::{EvalGrid, GridRange, GridSpec, TimeAxis};
use super::{DateFunction, date_of_eval_time, map_date, time};
use crate::grid_series::merge_same_labelset;
use crate::grid_series::reference::{
Labels, canonical_bits, golden_cases, labels_of, metric_of, points_of, series_of,
};
fn schema(grid: Arc<EvalGrid>) -> Arc<SeriesSchema> {
Arc::new(SeriesSchema {
fields: vec![FieldSpec {
name: Arc::from("value"),
}]
.into(),
eval_grid: Some(grid),
})
}
fn function(name: &str) -> DateFunction {
match name {
"day_of_month" => DateFunction::DayOfMonth,
"day_of_week" => DateFunction::DayOfWeek,
"day_of_year" => DateFunction::DayOfYear,
"days_in_month" => DateFunction::DaysInMonth,
"hour" => DateFunction::Hour,
"minute" => DateFunction::Minute,
"month" => DateFunction::Month,
"year" => DateFunction::Year,
other => panic!("unknown date function {other}"),
}
}
#[test]
fn time_functions_match_prometheus() {
let cases = golden_cases(include_str!("prometheus_cases.txt"));
assert_eq!(cases.len(), 200);
for case in cases {
let schema = schema(case.grid.clone());
let actual: Vec<Series> = match (case.spec[0].as_str(), case.spec[1].as_str()) {
("eval_time", "time") => vec![time(&schema).unwrap()],
("eval_time", name) => vec![date_of_eval_time(function(name), &schema).unwrap()],
("date", name) => case
.inputs
.iter()
.filter_map(|(labels, points)| series_of(&schema, labels, points))
.filter_map(|series| map_date(function(name), &schema, &series).unwrap())
.collect::<Vec<_>>(),
(kind, _) => panic!("unknown case {kind}"),
};
// Dropping `__name__` can give two series one label set.
let actual = match (merge_same_labelset(&schema, actual), case.outcome) {
(Ok(actual), Ok(expected)) => (actual, expected),
(Err(actual), Err(expected)) => {
assert!(actual.to_string().contains(&expected), "{actual}");
continue;
}
(actual, expected) => panic!("case {:?}: {actual:?} is not {expected:?}", case.spec),
};
let (actual, expected) = actual;
let actual: BTreeMap<_, _> = actual
.iter()
.map(|series| (labels_of(&series.metric), points_of(series)))
.collect();
let expected: BTreeMap<_, _> = expected
.into_iter()
.map(|(labels, points)| {
let points = points
.into_iter()
.map(|(index, bits)| (index, canonical_bits(f64::from_bits(bits))))
.collect();
(labels, points)
})
.collect();
assert_eq!(actual, expected, "case {:?}", case.spec);
}
}
/// Histogram samples are dropped and the series trimmed to the remaining floats; chunked floats
/// are mapped chunk by chunk.
#[test]
fn map_date_drops_histograms_and_maps_chunks() {
let grid = Arc::new(EvalGrid::try_new(GridSpec::try_new(0, 1000, 4).unwrap()).unwrap());
let schema = schema(grid.clone());
let range = GridRange::try_new(grid, 1, 3).unwrap();
let series = |fields: Samples| {
Series::try_new(
&schema,
metric_of(
&[
("__name__", "m"),
("__type__", "gauge"),
("__unit__", "seconds"),
("host", "a"),
]
.map(|(n, v)| (n.into(), v.into()))
.into(),
),
TimeAxis::Grid(range.clone()),
SeriesFields::one(fields),
)
.unwrap()
};
let floats = |values: &[f64]| Samples::from_float(Float64Array::from(values.to_vec()));
let empty = BucketSideView {
span_offsets: &[],
span_lengths: &[],
buckets: &[],
};
let mut histograms = HistogramBatchBuilder::new();
histograms
.push(HistogramView {
schema: 0,
zero_threshold: 0.0,
sum: 1.0,
count: 1.0,
zero_count: 1.0,
reset_hint: CounterResetHint::Unknown,
start_timestamp: None,
custom_values: &[],
positive: empty,
negative: empty,
})
.unwrap();
let histogram =
Samples::try_from_histogram(UInt32Array::from(vec![0]), histograms.finish().unwrap())
.unwrap();
let mixed = Samples::try_from_chunks(vec![histogram, floats(&[3600.0, 7200.0])]).unwrap();
let hours = map_date(DateFunction::Hour, &schema, &series(mixed))
.unwrap()
.unwrap();
assert_eq!(
points_of(&hours),
BTreeMap::from([(2, 1f64.to_bits()), (3, 2f64.to_bits())])
);
assert_eq!(
labels_of(&hours.metric),
Labels::from([("host".into(), "a".into())])
);
let chunked = Samples::try_from_chunks(vec![floats(&[60.0]), floats(&[120.0, 180.0])]).unwrap();
let minutes = map_date(DateFunction::Minute, &schema, &series(chunked))
.unwrap()
.unwrap();
assert_eq!(
points_of(&minutes),
BTreeMap::from([
(1, 1f64.to_bits()),
(2, 2f64.to_bits()),
(3, 3f64.to_bits())
])
);
}
+601
View File
@@ -0,0 +1,601 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Range-vector window evaluation of raw series onto an evaluation grid.
use std::sync::Arc;
use common_query::prometheus::is_prometheus_stale_nan;
use datafusion::arrow::buffer::Buffer;
use datafusion::error::{DataFusionError, Result};
use datatypes::series::MetricName;
use datatypes::series::raw::RawSeriesChunk;
use datatypes::series::samples::{SampleRef, Series, SeriesFields, SeriesSchema};
use datatypes::series::time::{EvalGrid, GridSpec, TimeAxis};
use crate::grid_series::{GridSample, GridSeriesBuilder, METADATA_LABELS};
use crate::histogram_eval::float_histogram::FloatHistogram;
mod function;
mod histogram;
#[cfg(test)]
mod tests;
pub use function::RangeFunction;
/// The samples a range selector reads at evaluation time `T`: source timestamps in
/// `(E - range_ms, E]`, where `E` is `T - offset_ms`, or `anchor_ms - offset_ms` with `@`.
#[derive(Clone, Copy, Debug)]
pub struct RangeWindow {
/// Positive window length in milliseconds.
pub range_ms: i64,
/// Selector offset in milliseconds; positive reads earlier samples.
pub offset_ms: i64,
/// The resolved `@` timestamp in milliseconds, with `start()` and `end()` already replaced
/// by the statement's start and end.
pub anchor_ms: Option<i64>,
}
/// The valid samples of one field inside one window, in source order.
pub(crate) struct FloatWindow<'a> {
/// Sample timestamps shifted by the offset onto the evaluation timeline; non-empty.
pub timestamps: &'a [i64],
pub values: &'a [f64],
/// Evaluation timestamp `T`. `timestamps` lie in `(T - range_ms, T]`, except for an
/// `@`-anchored `predict_linear`, which evaluates the first point's window at every `T`.
pub eval_ts: i64,
pub range_ms: i64,
}
/// Computes one window result; `None` means the window has no result.
pub(crate) type WindowKernel = Box<dyn FnMut(FloatWindow<'_>) -> Option<f64> + Send>;
/// Evaluates range windows over raw series, one series at a time.
///
/// Each series is pushed as its chunks in order and completes on the chunk marked `is_last`.
/// Fields are evaluated independently over their own valid samples; a row holding a stale
/// marker in any field is dropped, as the ordinary range selector does. Only the samples later
/// windows can still use are retained. Native histogram samples need a [`RangeFunction`]; an
/// evaluator built from a bare kernel rejects them.
pub struct RangeEvaluator {
grid: Arc<EvalGrid>,
/// The window with `offset_ms` replaced by the offset samples are shifted by.
window: RangeWindow,
replay: Replay,
kernel: WindowKernel,
function: Option<RangeFunction>,
output_schema: Arc<SeriesSchema>,
output: GridSeriesBuilder,
/// The grid of evaluated input series, such as the inner result of a subquery; `None` for
/// raw input.
input_grid: Option<GridSpec>,
series: Option<SeriesState>,
fields: Vec<FieldSamples>,
row: Vec<Option<GridSample>>,
drops_metric_name: bool,
/// Raised by the first non-empty window, where Prometheus validates function arguments.
window_error: Option<String>,
}
struct SeriesState {
/// `None` for evaluated input, which arrives as one complete series.
primary_key: Option<Buffer>,
metric: MetricName,
last_ts: i64,
/// Next grid index to evaluate.
cursor: usize,
}
/// How the windows of an `@`-anchored selector map to the grid.
///
/// Like Prometheus, an anchored selector is read once, as the window of the first grid point
/// with the offset rewritten to `start - (anchor - offset)`.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
enum Replay {
/// Not anchored: every grid point reads its own window.
PerPoint,
/// The first point's result is reported at every point (step-invariant functions).
Once,
/// The first point's window is evaluated at every point (`predict_linear`).
EveryPoint,
}
#[derive(Default)]
struct FieldSamples {
timestamps: Vec<i64>,
values: Vec<f64>,
/// Samples before `head` are behind every remaining window.
head: usize,
/// Native histogram samples, kept apart from the floats as Prometheus does.
histograms: Vec<(i64, FloatHistogram)>,
histogram_head: usize,
}
impl RangeEvaluator {
/// Creates an evaluator of `function` for the series of `input` onto `grid`.
pub fn try_new(
input: &SeriesSchema,
grid: Arc<EvalGrid>,
window: RangeWindow,
function: RangeFunction,
) -> Result<Self> {
let mut window_error = None;
if let RangeFunction::DoubleExponentialSmoothing { smoothing, trend } = function {
// Prometheus rejects factors outside (0, 1); NaN passes its check.
window_error = [("smoothing", smoothing), ("trend", trend)]
.into_iter()
.find(|(_, factor)| *factor <= 0.0 || *factor >= 1.0)
.map(|(name, factor)| {
format!("invalid {name} factor. Expected: 0 < factor < 1, got: {factor}")
});
}
let fold_offset = fold_offset(grid.spec(), window)?;
let step_invariant = !matches!(function, RangeFunction::PredictLinear(_));
if !step_invariant {
let spec = grid.spec();
let last =
i128::from(spec.start_ms) + i128::from(spec.step_ms) * (i128::from(spec.len) - 1);
for eval_ts in [i128::from(spec.start_ms), last] {
if i64::try_from(eval_ts + i128::from(fold_offset)).is_err() {
return Err(DataFusionError::Plan(format!(
"predict_linear evaluation time {eval_ts} overflows with offset {fold_offset} ms"
)));
}
}
}
let mut evaluator = Self::with_kernel(
input,
grid,
window,
function.kernel(fold_offset),
step_invariant,
)?;
evaluator.drops_metric_name = function.drops_metric_name();
evaluator.window_error = window_error;
evaluator.function = Some(function);
Ok(evaluator)
}
/// `step_invariant` tells whether an `@`-anchored result holds at every grid point.
pub(crate) fn with_kernel(
input: &SeriesSchema,
grid: Arc<EvalGrid>,
mut window: RangeWindow,
kernel: WindowKernel,
step_invariant: bool,
) -> Result<Self> {
if window.range_ms <= 0 {
return Err(DataFusionError::Plan(format!(
"range must be positive, got {} ms",
window.range_ms
)));
}
let replay = match (window.anchor_ms, step_invariant) {
(None, _) => Replay::PerPoint,
(Some(_), true) => Replay::Once,
(Some(_), false) => Replay::EveryPoint,
};
window.offset_ms = fold_offset(grid.spec(), window)?;
let output_schema = Arc::new(SeriesSchema {
fields: input.fields.clone(),
eval_grid: Some(grid.clone()),
});
Ok(Self {
grid,
window,
replay,
kernel,
function: None,
output: GridSeriesBuilder::try_new(output_schema.clone())?,
input_grid: input.eval_grid.as_ref().map(|grid| grid.spec()),
output_schema,
series: None,
fields: input
.fields
.iter()
.map(|_| FieldSamples::default())
.collect(),
row: Vec::with_capacity(input.fields.len()),
drops_metric_name: false,
window_error: None,
})
}
/// Schema of the evaluated series: the input fields on the evaluation grid.
pub fn output_schema(&self) -> &Arc<SeriesSchema> {
&self.output_schema
}
/// Consumes the next chunk of the current series, or starts a new series.
///
/// Returns the evaluated series on its `is_last` chunk, or `None` there when no grid point
/// has a result.
///
/// The evaluator must not be reused after an error.
pub fn push(&mut self, chunk: &RawSeriesChunk) -> Result<Option<Series>> {
if self.input_grid.is_some() {
return Err(DataFusionError::Execution(
"raw series chunk pushed to an evaluator of evaluated series".into(),
));
}
self.check_chunk(chunk)?;
self.ingest(chunk.time.as_buffer(), &chunk.fields, true)?;
let last_ts = chunk.time.as_buffer()[chunk.time.len() - 1];
if !chunk.is_last {
// Later chunks only hold samples after `last_ts`.
self.evaluate(Some(
i128::from(last_ts) + i128::from(self.window.offset_ms),
))?;
return Ok(None);
}
self.finish_series()
}
/// Evaluates one complete evaluated series, such as the inner result of a subquery: the
/// value at each grid point is a sample at that time. Stale markers are kept as values,
/// since the input is computed.
pub fn push_series(&mut self, series: &Series) -> Result<Option<Series>> {
let TimeAxis::Grid(range) = &series.time else {
return Err(DataFusionError::Execution(
"evaluated range input must be a grid series".into(),
));
};
if self.input_grid != Some(range.grid().spec())
|| series.fields.len() != self.fields.len()
|| series.fields.iter().any(|field| field.len() != range.len())
{
return Err(DataFusionError::Execution(
"evaluated series does not match the input schema".into(),
));
}
if self.series.is_some() {
return Err(DataFusionError::Execution(
"evaluated series pushed inside a raw series".into(),
));
}
self.series = Some(SeriesState {
primary_key: None,
metric: series.metric.clone(),
last_ts: 0,
cursor: 0,
});
self.ingest(&range.timestamps(), &series.fields, false)?;
self.finish_series()
}
fn finish_series(&mut self) -> Result<Option<Series>> {
self.evaluate(None)?;
let mut state = self.series.take().expect("set by the caller");
if self.drops_metric_name {
state.metric.remove_all(&METADATA_LABELS);
}
self.output.finish(state.metric)
}
/// Checks that the input did not end inside a series.
pub fn finish(self) -> Result<()> {
if self.series.is_some() {
return Err(DataFusionError::Execution(
"raw series input ended before the last chunk of a series".into(),
));
}
Ok(())
}
fn check_chunk(&mut self, chunk: &RawSeriesChunk) -> Result<()> {
let primary_key = Some(chunk.primary_key.as_slice());
let time = chunk.time.as_buffer();
if time.is_empty()
|| chunk.fields.len() != self.fields.len()
|| chunk.fields.iter().any(|field| field.len() != time.len())
{
return Err(DataFusionError::Execution(format!(
"raw series chunk with {} timestamps and {} fields does not match {} schema fields",
time.len(),
chunk.fields.len(),
self.fields.len()
)));
}
match &mut self.series {
None => {
let metric = chunk.metric.clone().ok_or_else(|| {
DataFusionError::Execution(
"range evaluation requires materialized series labels".into(),
)
})?;
self.series = Some(SeriesState {
primary_key: Some(chunk.primary_key.clone()),
metric,
last_ts: time[time.len() - 1],
cursor: 0,
});
}
Some(state) => {
if state.primary_key.as_ref().map(|key| key.as_slice()) != primary_key
|| chunk.metric.as_ref() != Some(&state.metric)
{
return Err(DataFusionError::Execution(
"raw series identity changed before its last chunk".into(),
));
}
if time[0] <= state.last_ts {
return Err(DataFusionError::Execution(format!(
"raw series timestamps are not increasing across chunks: {} after {}",
time[0], state.last_ts
)));
}
state.last_ts = time[time.len() - 1];
}
}
Ok(())
}
/// Retains the samples of `fields` at `timestamps`; with `drop_stale`, a row holding a stale
/// marker in any field is dropped.
fn ingest(
&mut self,
timestamps: &[i64],
fields: &SeriesFields,
drop_stale: bool,
) -> Result<()> {
let mut samples: Vec<_> = fields.iter().map(|field| field.iter()).collect();
let mut row = Vec::with_capacity(samples.len());
for &timestamp in timestamps {
row.clear();
let mut stale = false;
for field in &mut samples {
let sample = field.next().expect("field length checked by the caller");
match &sample {
SampleRef::Missing => {}
SampleRef::Float(value) => stale |= is_prometheus_stale_nan(*value),
SampleRef::Histogram(view) => {
if self.function.is_none() {
return Err(DataFusionError::NotImplemented(
"range evaluation of histogram samples".into(),
));
}
stale |= is_prometheus_stale_nan(view.sum);
}
}
row.push(sample);
}
if stale && drop_stale {
continue;
}
// Like RangeManipulate, any kept sample whose shifted time leaves i64 fails the series.
let shifted = timestamp
.checked_add(self.window.offset_ms)
.ok_or_else(|| {
DataFusionError::Execution(format!(
"sample timestamp {timestamp} overflows with offset {} ms",
self.window.offset_ms
))
})?;
for (field, sample) in self.fields.iter_mut().zip(&row) {
match sample {
SampleRef::Missing => {}
SampleRef::Float(value) => {
field.timestamps.push(shifted);
field.values.push(*value);
}
SampleRef::Histogram(view) => field
.histograms
.push((shifted, FloatHistogram::try_from_view(view)?)),
}
}
}
Ok(())
}
/// Evaluates grid points up to `ready` on the evaluation timeline, or all remaining points
/// when `ready` is `None`.
fn evaluate(&mut self, ready: Option<i128>) -> Result<()> {
let points_read = self.points_read();
let state = self.series.as_mut().expect("checked by check_chunk");
let spec = self.grid.spec();
let grid = self.grid.timestamps();
let range = i128::from(self.window.range_ms);
while state.cursor < points_read {
let eval_ts = grid[state.cursor];
let lower = i128::from(eval_ts) - range;
let mut earliest = None;
// Later windows start no earlier, so samples behind this one go even when the point
// itself is not ready yet.
for field in &mut self.fields {
field.head += field.timestamps[field.head..]
.partition_point(|&timestamp| i128::from(timestamp) <= lower);
field.histogram_head += field.histograms[field.histogram_head..]
.partition_point(|(timestamp, _)| i128::from(*timestamp) <= lower);
let first_histogram = field.histograms.get(field.histogram_head);
for &timestamp in field
.timestamps
.get(field.head)
.into_iter()
.chain(first_histogram.map(|(timestamp, _)| timestamp))
{
earliest = Some(earliest.map_or(timestamp, |min: i64| min.min(timestamp)));
}
}
if ready.is_some_and(|ready| i128::from(eval_ts) > ready) {
break;
}
// No retained sample: either the series is done or the next one is not here yet.
let Some(earliest) = earliest else {
break;
};
if earliest > eval_ts {
// Skip the points whose windows end before the earliest sample.
let step = i128::from(spec.step_ms);
let steps = (i128::from(earliest) - i128::from(spec.start_ms) + step - 1) / step;
state.cursor = usize::try_from(steps).map_or(grid.len(), |i| i.min(grid.len()));
continue;
}
if let Some(error) = &self.window_error {
return Err(DataFusionError::Execution(error.clone()));
}
let mut evaluator = RowEvaluator {
fields: &self.fields,
kernel: &mut self.kernel,
function: self.function,
range_ms: self.window.range_ms,
offset_ms: self.window.offset_ms,
};
match self.replay {
Replay::PerPoint => {
evaluator.evaluate(eval_ts, eval_ts, &mut self.row)?;
self.output.push_samples(state.cursor, &self.row)?;
}
Replay::Once => {
evaluator.evaluate(eval_ts, eval_ts, &mut self.row)?;
for index in 0..grid.len() {
self.output.push_samples(index, &self.row)?;
}
}
Replay::EveryPoint => {
for (index, &point) in grid.iter().enumerate() {
evaluator.evaluate(eval_ts, point, &mut self.row)?;
self.output.push_samples(index, &self.row)?;
}
}
}
state.cursor += 1;
}
for field in &mut self.fields {
// After the last window, samples are still ingested so that the overflow and
// histogram checks do not depend on how the series is chunked, but none are kept.
// An anchored selector can skip past the one point it reads.
if state.cursor >= points_read {
field.head = field.timestamps.len();
field.histogram_head = field.histograms.len();
}
field.timestamps.drain(..field.head);
field.values.drain(..field.head);
field.head = 0;
field.histograms.drain(..field.histogram_head);
field.histogram_head = 0;
}
Ok(())
}
/// The number of leading grid points whose windows are read; an anchored selector reads
/// only the first.
fn points_read(&self) -> usize {
match self.replay {
Replay::PerPoint => self.grid.timestamps().len(),
Replay::Once | Replay::EveryPoint => 1,
}
}
}
/// Computes the result of every field's window at one grid point.
struct RowEvaluator<'a> {
fields: &'a [FieldSamples],
kernel: &'a mut WindowKernel,
function: Option<RangeFunction>,
range_ms: i64,
offset_ms: i64,
}
impl RowEvaluator<'_> {
/// Fills `row` with the result over each field's window ending at `window_end`, evaluated
/// at `eval_ts`.
fn evaluate(
&mut self,
window_end: i64,
eval_ts: i64,
row: &mut Vec<Option<GridSample>>,
) -> Result<()> {
row.clear();
for field in self.fields {
let timestamps = &field.timestamps[field.head..];
let len = timestamps.partition_point(|&timestamp| timestamp <= window_end);
let floats = (len > 0).then(|| FloatWindow {
timestamps: &timestamps[..len],
values: &field.values[field.head..field.head + len],
eval_ts,
range_ms: self.range_ms,
});
let histograms = &field.histograms[field.histogram_head..];
let histograms = &histograms
[..histograms.partition_point(|(timestamp, _)| *timestamp <= window_end)];
row.push(match self.function {
Some(function) if !histograms.is_empty() => histogram::evaluate(
function,
floats,
histograms,
eval_ts,
self.range_ms,
self.offset_ms,
&mut *self.kernel,
)?,
_ => floats.and_then(|window| (self.kernel)(window).map(GridSample::Float)),
});
}
Ok(())
}
}
/// The offset samples are shifted by: the selector offset, or for `@` the offset that places
/// the anchored window at the first grid point.
fn fold_offset(grid: GridSpec, window: RangeWindow) -> Result<i64> {
let Some(anchor) = window.anchor_ms else {
return Ok(window.offset_ms);
};
anchor
.checked_sub(window.offset_ms)
.and_then(|end| grid.start_ms.checked_sub(end))
.ok_or_else(|| {
DataFusionError::Plan(format!(
"@ {anchor} ms with offset {} ms is out of range",
window.offset_ms
))
})
}
/// The inner grid of a subquery read by `window` from the outer grid `outer`: the multiples of
/// `step_ms` after `start - F - range` up to the last window end, where `F` is the fold offset
/// of `window`; with `@`, the only window end is `start - F`. `None` when no multiple falls in
/// the windows.
pub fn subquery_grid(
outer: GridSpec,
window: RangeWindow,
step_ms: i64,
) -> Result<Option<GridSpec>> {
if step_ms <= 0 {
return Err(DataFusionError::Plan(format!(
"subquery step must be positive, got {step_ms} ms"
)));
}
let fold_offset = i128::from(fold_offset(outer, window)?);
let step = i128::from(step_ms);
let start = i128::from(outer.start_ms);
let last_eval = match window.anchor_ms {
Some(_) => start,
None => start + i128::from(outer.step_ms) * (i128::from(outer.len) - 1),
};
let first = ((start - fold_offset - i128::from(window.range_ms)).div_euclid(step) + 1) * step;
let last = last_eval - fold_offset;
if first > last {
return Ok(None);
}
let len = u64::try_from((last - first) / step + 1)
.map_err(|_| DataFusionError::Plan("subquery grid has too many points".into()))?;
let first = i64::try_from(first).map_err(|_| {
DataFusionError::Plan(format!("subquery grid start {first} ms is out of range"))
})?;
GridSpec::try_new(first, step_ms, len)
.map(Some)
.map_err(|error| DataFusionError::External(Box::new(error)))
}
@@ -0,0 +1,804 @@
# Generated by promql-compat cmd/narthex-golden-vector built for amd64 (Prometheus v3.15.0
# engine, seed 1, 120 cases per kind). Each case lists its operation, the grid, the
# input series and either the result series or the error. Points are `grid index:hex bits`.
case absent_over_time 45000 host!="h2"
grid 100000 10000 6
series __name__=a,host=h2,job=y ; 1:7ff8000000000001
series __name__=a,host=h1,job=y,zone=z1 ; 5:c079dc0000000000
series __name__=a,host=h1,job=x,zone=z1 ; 1:4078980000000000 2:406ad00000000000 3:c08b8e0000000000
result - ; 0:3ff0000000000000
end
case absent_over_time 10000 host!="h1",job="x",zone!=""
grid 100000 10000 7
series __name__=a,host=h1,job=x ; 0:c089930000000000 1:c073020000000000
series __name__=a,host=h2,job=y ; 5:408e5f0000000000 6:4072120000000000
series __name__=a,host=h1,job=y,zone=z1 ; 4:c0666c0000000000
result job=x ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000
end
case absent_over_time 45000 -
grid 100000 10000 7
series __name__=a,host=h1,job=y,zone=z1 ; 1:c08a7d0000000000
series __name__=a,host=h2,job=x,zone=z1 ; 4:4048800000000000 5:c08e730000000000
series __name__=a,host=h1,job=x ; 0:c075140000000000 1:0
series __name__=a,host=h2,job=x ;
end
case absent_over_time 25000 job="x",zone!="z1"
grid 100000 10000 3
series __name__=a,host=h2,job=x,zone=z1 ; 0:408bfc0000000000
series __name__=a,host=h2,job=y ; 0:407a580000000000 1:408bc60000000000
series __name__=a,host=h2,job=x ; 0:c054900000000000 1:408c2a0000000000
series __name__=a,host=h1,job=x,zone=z1 ; 0:c065100000000000 2:c0886b0000000000
end
case absent_over_time 10000 zone=""
grid 100000 10000 7
series __name__=a,host=h1,job=x ; 0:408eea0000000000
series __name__=a,host=h2,job=y ; 3:4081650000000000 4:c06a840000000000 5:fff0000000000000
series __name__=a,host=h2,job=x,zone=z1 ; 3:4082530000000000 5:c08dde0000000000
series __name__=a,host=h1,job=y,zone=z1 ; 3:c05b700000000000
series __name__=a,host=h1,job=x,zone=z1 ; 6:406b7c0000000000
series __name__=a,host=h1,job=y ; 0:c080630000000000 1:7ff8000000000001 2:4081c00000000000
result - ; 6:3ff0000000000000
end
case absent_over_time 45000 host!="h2",job!="x",zone!=""
grid 100000 10000 3
series __name__=a,host=h2,job=y ;
series __name__=a,host=h1,job=y,zone=z1 ; 1:c04bb00000000000 2:406b000000000000
series __name__=a,host=h2,job=x ;
result - ; 0:3ff0000000000000
end
case absent_over_time 5000 job="x"
grid 100000 10000 5
series __name__=a,host=h2,job=y,zone=z1 ; 2:4081b90000000000
series __name__=a,host=h2,job=x ;
series __name__=a,host=h1,job=x ; 3:c0872d0000000000
result job=x ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 4:3ff0000000000000
end
case absent_over_time 25000 host="h1"
grid 100000 10000 8
series __name__=a,host=h1,job=x ; 1:c084510000000000 2:40804d0000000000 3:c0890d0000000000 4:c085580000000000
series __name__=a,host=h1,job=y ; 3:4088fe0000000000 4:4056f00000000000 5:4082b60000000000 6:7e37e43c8800759c
series __name__=a,host=h2,job=y ; 7:407c440000000000
result host=h1 ; 0:3ff0000000000000
end
case absent_over_time 45000 job="y"
grid 100000 10000 4
series __name__=a,host=h2,job=y ; 1:c087120000000000 2:7e37e43c8800759c 3:40775e0000000000
series __name__=a,host=h2,job=y,zone=z1 ; 0:405e900000000000 1:0 2:c043a00000000000 3:c08e610000000000
series __name__=a,host=h2,job=x,zone=z1 ; 0:c066140000000000 1:c0867d0000000000 2:4055a80000000000 3:408c220000000000
series __name__=a,host=h1,job=y,zone=z1 ; 0:c042b00000000000 1:c073ee0000000000
series __name__=a,host=h2,job=x ; 3:4071920000000000
end
case absent_over_time 5000 -
grid 100000 10000 10
series __name__=a,host=h1,job=x ; 3:c0797e0000000000 4:0
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000
end
case absent_over_time 5000 -
grid 100000 10000 10
series __name__=a,host=h1,job=x ;
series __name__=a,host=h2,job=x,zone=z1 ;
series __name__=a,host=h2,job=y ;
series __name__=a,host=h2,job=x ; 8:405b980000000000
series __name__=a,host=h2,job=y,zone=z1 ; 1:4089390000000000 2:c065600000000000 3:c085950000000000 4:40710e0000000000
result - ; 0:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 9:3ff0000000000000
end
case absent_over_time 10000 job!="y",zone!="z1"
grid 100000 10000 6
series __name__=a,host=h1,job=x ; 2:7e37e43c8800759c
result - ; 0:3ff0000000000000 1:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000
end
case absent_over_time 45000 job!="y",zone="z1"
grid 100000 10000 11
series __name__=a,host=h1,job=x ; 7:7ff8000000000001
result zone=z1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 10:3ff0000000000000
end
case absent_over_time 25000 host="h2",job!="x",zone!="z1"
grid 100000 10000 6
series __name__=a,host=h1,job=y ; 2:4068940000000000 3:405a580000000000
series __name__=a,host=h2,job=x ;
result host=h2 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000
end
case absent_over_time 10000 zone=""
grid 100000 10000 9
series __name__=a,host=h2,job=y ; 5:4080eb0000000000 6:4032c00000000000
series __name__=a,host=h2,job=x ;
series __name__=a,host=h1,job=x ;
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000
end
case absent_over_time 25000 job="y"
grid 100000 10000 3
series __name__=a,host=h1,job=x,zone=z1 ; 2:7ff0000000000000
result job=y ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000
end
case absent_over_time 25000 job!="y"
grid 100000 10000 6
series __name__=a,host=h1,job=x ; 5:fff0000000000000
series __name__=a,host=h1,job=y ; 1:408af90000000000 2:c079da0000000000
series __name__=a,host=h2,job=x,zone=z1 ; 5:c030a00000000000
series __name__=a,host=h1,job=y,zone=z1 ; 2:c071fc0000000000 3:c071d20000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000
end
case absent_over_time 10000 host="h2",job!="x"
grid 100000 10000 4
series __name__=a,host=h1,job=x,zone=z1 ; 1:c088900000000000
result host=h2 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000
end
case absent_over_time 5000 zone!=""
grid 100000 10000 9
series __name__=a,host=h2,job=x,zone=z1 ; 5:7ff8000000000001 7:c072680000000000
series __name__=a,host=h2,job=y,zone=z1 ; 6:c074000000000000 7:c08d6b0000000000
series __name__=a,host=h1,job=x,zone=z1 ; 8:c08efb0000000000
series __name__=a,host=h1,job=y,zone=z1 ; 1:4082330000000000
result - ; 0:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000
end
case absent_over_time 45000 job!="y",zone!="z1"
grid 100000 10000 9
series __name__=a,host=h1,job=x ; 5:408eaf0000000000 6:7ff0000000000000 7:4052180000000000
series __name__=a,host=h2,job=x ; 0:c08b0a0000000000
series __name__=a,host=h2,job=y ; 2:408cdf0000000000 3:407bd40000000000 5:408aac0000000000 6:c04ce00000000000
series __name__=a,host=h2,job=x,zone=z1 ; 1:c083620000000000 3:408ba80000000000 4:7ff8000000000001 5:c07fbe0000000000 6:c072d40000000000 8:c046c00000000000
end
case absent_over_time 5000 job!="x"
grid 100000 10000 7
series __name__=a,host=h1,job=x ; 5:405a780000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000
end
case absent_over_time 5000 host="h2",job!="x"
grid 100000 10000 12
series __name__=a,host=h1,job=y,zone=z1 ;
series __name__=a,host=h1,job=x ; 8:c065d40000000000 9:c0823e0000000000
series __name__=a,host=h2,job=x ; 1:c000000000000000 2:405ab00000000000 3:7ff0000000000000 4:407aaa0000000000 5:c083e60000000000 6:c084d00000000000 7:c053f80000000000 8:c048200000000000
series __name__=a,host=h2,job=x,zone=z1 ; 8:c08c180000000000 9:7e37e43c8800759c
result host=h2 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 10:3ff0000000000000 11:3ff0000000000000
end
case absent_over_time 45000 zone="z1"
grid 100000 10000 3
series __name__=a,host=h1,job=x,zone=z1 ;
series __name__=a,host=h2,job=y,zone=z1 ; 1:c089c80000000000
result zone=z1 ; 0:3ff0000000000000
end
case absent_over_time 10000 zone=""
grid 100000 10000 6
series __name__=a,host=h1,job=x,zone=z1 ; 0:40826d0000000000 1:c083ff0000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000
end
case absent_over_time 5000 host="h1"
grid 100000 10000 3
series __name__=a,host=h1,job=y,zone=z1 ; 1:c077060000000000
series __name__=a,host=h2,job=y ; 1:405be80000000000
series __name__=a,host=h1,job=x,zone=z1 ;
result host=h1 ; 0:3ff0000000000000 2:3ff0000000000000
end
case absent_over_time 45000 job="y"
grid 100000 10000 5
series __name__=a,host=h1,job=x ; 4:407f1a0000000000
series __name__=a,host=h2,job=x ; 4:40754a0000000000
series __name__=a,host=h1,job=x,zone=z1 ;
series __name__=a,host=h1,job=y,zone=z1 ; 1:4074580000000000 2:4084e50000000000
result job=y ; 0:3ff0000000000000
end
case absent_over_time 45000 -
grid 100000 10000 2
series __name__=a,host=h1,job=y ; 1:fff0000000000000
series __name__=a,host=h1,job=x ;
series __name__=a,host=h2,job=x ; 0:4078200000000000 1:c029000000000000
series __name__=a,host=h2,job=y ; 0:4083220000000000
end
case absent_over_time 45000 job!="x",zone=""
grid 100000 10000 8
series __name__=a,host=h2,job=y,zone=z1 ; 2:408e660000000000 3:c05eb80000000000
series __name__=a,host=h2,job=y ; 5:4077020000000000 6:c0740a0000000000
series __name__=a,host=h2,job=x ; 2:fff0000000000000 4:c0774a0000000000
series __name__=a,host=h1,job=x,zone=z1 ; 6:0
series __name__=a,host=h1,job=x ; 1:c040900000000000 2:4087350000000000 3:40735e0000000000 5:408e050000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000
end
case absent_over_time 25000 job!="y"
grid 100000 10000 7
series __name__=a,host=h1,job=y,zone=z1 ; 4:7e37e43c8800759c
series __name__=a,host=h2,job=x ; 6:c0779c0000000000
series __name__=a,host=h2,job=y ; 2:4084890000000000 3:40683c0000000000
series __name__=a,host=h1,job=y ; 4:7ff8000000000001 5:404f400000000000 6:c078e40000000000
series __name__=a,host=h1,job=x ; 3:40759a0000000000 4:40802c0000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000
end
case absent_over_time 25000 host="h2",zone=""
grid 100000 10000 11
series __name__=a,host=h2,job=x ; 4:0 5:c07bda0000000000 6:4076540000000000
series __name__=a,host=h2,job=y ; 7:c082630000000000
series __name__=a,host=h1,job=y ; 9:408a340000000000
result host=h2 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 10:3ff0000000000000
end
case absent_over_time 5000 zone="z1"
grid 100000 10000 11
series __name__=a,host=h2,job=y ; 4:4076ac0000000000
series __name__=a,host=h1,job=y,zone=z1 ; 5:c07bd60000000000 6:c065000000000000 8:7ff0000000000000 9:408c110000000000 10:c0746e0000000000
series __name__=a,host=h1,job=y ; 6:4088000000000000 7:fff0000000000000 8:4077ba0000000000
result zone=z1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 7:3ff0000000000000
end
case absent_over_time 25000 job="y",zone!=""
grid 100000 10000 12
series __name__=a,host=h2,job=x ; 2:c06c200000000000 3:4084c10000000000
series __name__=a,host=h1,job=y ;
series __name__=a,host=h2,job=y ;
result job=y ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 10:3ff0000000000000 11:3ff0000000000000
end
case absent_over_time 10000 zone!="z1"
grid 100000 10000 3
series __name__=a,host=h1,job=x ; 1:c069100000000000 2:0
series __name__=a,host=h1,job=x,zone=z1 ; 1:c086ea0000000000
series __name__=a,host=h1,job=y ; 2:c077a20000000000
result - ; 0:3ff0000000000000
end
case absent_over_time 45000 -
grid 100000 10000 3
series __name__=a,host=h1,job=y ; 0:40811f0000000000 1:4087810000000000 2:c058b80000000000
end
case absent_over_time 45000 job="y",zone!="z1"
grid 100000 10000 2
series __name__=a,host=h2,job=x ; 0:c07fa60000000000 1:40821c0000000000
series __name__=a,host=h2,job=y,zone=z1 ; 0:407a7a0000000000
result job=y ; 0:3ff0000000000000 1:3ff0000000000000
end
case absent_over_time 25000 host="h1",job="y"
grid 100000 10000 5
series __name__=a,host=h1,job=x ; 4:408d840000000000
series __name__=a,host=h2,job=x,zone=z1 ; 1:c071b40000000000 3:408b460000000000 4:c0840f0000000000
series __name__=a,host=h2,job=x ;
series __name__=a,host=h1,job=y ; 1:4054b80000000000
result host=h1,job=y ; 0:3ff0000000000000 4:3ff0000000000000
end
case absent_over_time 45000 host="h2",job!="y"
grid 100000 10000 6
series __name__=a,host=h1,job=x ; 1:c08a650000000000 3:c047200000000000 4:4060980000000000
series __name__=a,host=h2,job=x,zone=z1 ; 3:bfe4000000000000 4:c07d540000000000 5:4077dc0000000000
series __name__=a,host=h2,job=y,zone=z1 ; 5:4083d10000000000
result host=h2 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000
end
case absent_over_time 5000 -
grid 100000 10000 2
series __name__=a,host=h2,job=y ; 1:4087460000000000
series __name__=a,host=h2,job=x ; 0:c068800000000000
series __name__=a,host=h1,job=x ; 1:c089420000000000
end
case absent_over_time 25000 host="h1"
grid 100000 10000 10
series __name__=a,host=h1,job=y ; 8:4080520000000000 9:c08ef50000000000
series __name__=a,host=h1,job=x ; 5:c089710000000000 6:4074740000000000 7:40823d0000000000
series __name__=a,host=h2,job=x,zone=z1 ; 5:4089e80000000000
result host=h1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000
end
case absent_over_time 45000 -
grid 100000 10000 5
series __name__=a,host=h2,job=x,zone=z1 ; 3:c086dc0000000000
series __name__=a,host=h2,job=y,zone=z1 ; 0:c07f2a0000000000 1:0 2:408bf70000000000
end
case absent_over_time 25000 -
grid 100000 10000 3
series __name__=a,host=h2,job=y,zone=z1 ; 2:c051a80000000000
series __name__=a,host=h2,job=x ; 0:4087d80000000000
series __name__=a,host=h2,job=x,zone=z1 ; 2:fff0000000000000
series __name__=a,host=h1,job=y ; 0:40874b0000000000
end
case absent_over_time 10000 job="x"
grid 100000 10000 9
series __name__=a,host=h2,job=y,zone=z1 ; 4:c08b380000000000 5:4085140000000000 7:7ff8000000000001
series __name__=a,host=h2,job=y ; 4:0 6:c081e60000000000 7:4068f80000000000
result job=x ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000
end
case absent_over_time 45000 zone!="z1"
grid 100000 10000 12
series __name__=a,host=h1,job=x ; 4:406e3c0000000000 5:c08b7b0000000000 7:c058f00000000000 8:c08dde0000000000
series __name__=a,host=h2,job=x,zone=z1 ; 11:405a500000000000
series __name__=a,host=h1,job=y ; 11:40873f0000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000
end
case absent_over_time 45000 host!="h2",job!="x",zone="z1"
grid 100000 10000 3
series __name__=a,host=h2,job=x ; 0:7ff0000000000000 1:7ff8000000000001 2:c083120000000000
series __name__=a,host=h2,job=y ;
series __name__=a,host=h1,job=x,zone=z1 ; 1:4088c70000000000
result zone=z1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000
end
case absent_over_time 25000 zone=""
grid 100000 10000 4
series __name__=a,host=h1,job=x,zone=z1 ; 1:c082c70000000000 2:c085d40000000000
series __name__=a,host=h2,job=x,zone=z1 ;
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000
end
case absent_over_time 10000 host!="h1",zone!="z1"
grid 100000 10000 6
series __name__=a,host=h1,job=x ; 0:0 1:407e220000000000 2:c07aa60000000000 3:c083e50000000000
series __name__=a,host=h2,job=x ; 5:7ff8000000000001
series __name__=a,host=h1,job=y,zone=z1 ; 2:c07be60000000000 3:c089540000000000 4:c066740000000000 5:c07c6a0000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000
end
case absent_over_time 10000 host="h1",zone!=""
grid 100000 10000 3
series __name__=a,host=h1,job=y,zone=z1 ; 2:4087fc0000000000
series __name__=a,host=h1,job=y ; 2:4086a20000000000
series __name__=a,host=h1,job=x,zone=z1 ; 2:7ff8000000000001
series __name__=a,host=h1,job=x ; 1:4074c80000000000
result host=h1 ; 0:3ff0000000000000 1:3ff0000000000000
end
case absent_over_time 25000 host="h2",job="y",zone="z1"
grid 100000 10000 9
series __name__=a,host=h2,job=y ; 8:c087ce0000000000
series __name__=a,host=h2,job=x ; 3:c089820000000000 4:c07f2a0000000000 5:c04b700000000000 6:0
result host=h2,job=y,zone=z1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000
end
case absent_over_time 5000 -
grid 100000 10000 5
series __name__=a,host=h2,job=y,zone=z1 ; 1:407dfe0000000000 2:407c820000000000 3:c07d3c0000000000 4:7ff0000000000000
series __name__=a,host=h1,job=x ; 0:408dbd0000000000
series __name__=a,host=h1,job=x,zone=z1 ; 4:c081e60000000000
series __name__=a,host=h1,job=y,zone=z1 ; 0:408bdb0000000000
end
case absent_over_time 5000 -
grid 100000 10000 11
series __name__=a,host=h1,job=x ; 9:c085bd0000000000
series __name__=a,host=h2,job=x,zone=z1 ; 6:7ff8000000000001
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 10:3ff0000000000000
end
case absent_over_time 5000 host="h2",zone=""
grid 100000 10000 10
series __name__=a,host=h1,job=y,zone=z1 ; 4:4054900000000000
result host=h2 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000
end
case absent_over_time 5000 job!="y"
grid 100000 10000 7
series __name__=a,host=h1,job=x ; 2:4060600000000000 3:408f080000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000
end
case absent_over_time 45000 host="h2"
grid 100000 10000 8
series __name__=a,host=h1,job=x ; 2:c071e40000000000 3:c089450000000000 4:4084b40000000000
series __name__=a,host=h1,job=y ; 5:c060ac0000000000 6:408e290000000000 7:4060f00000000000
series __name__=a,host=h2,job=y,zone=z1 ; 6:c087fc0000000000
series __name__=a,host=h2,job=y ; 7:c046f00000000000
result host=h2 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000
end
case absent_over_time 25000 host="h1",job!="y"
grid 100000 10000 3
series __name__=a,host=h2,job=y,zone=z1 ; 1:4084f20000000000
series __name__=a,host=h1,job=x ; 0:c08dab0000000000 1:c0852b0000000000
series __name__=a,host=h2,job=x,zone=z1 ; 2:4035400000000000
series __name__=a,host=h2,job=y ; 1:fff0000000000000
end
case absent_over_time 5000 host!="h1"
grid 100000 10000 2
series __name__=a,host=h1,job=x,zone=z1 ;
result - ; 0:3ff0000000000000 1:3ff0000000000000
end
case absent_over_time 25000 job="x"
grid 100000 10000 11
series __name__=a,host=h2,job=y,zone=z1 ; 8:c059800000000000
series __name__=a,host=h2,job=x,zone=z1 ; 5:4071460000000000 7:4081220000000000
series __name__=a,host=h2,job=x ; 3:407cf80000000000 4:4088fb0000000000 5:40820a0000000000
result job=x ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 10:3ff0000000000000
end
case absent_over_time 25000 -
grid 100000 10000 10
series __name__=a,host=h2,job=y ;
series __name__=a,host=h2,job=x,zone=z1 ; 2:4087750000000000 3:7e37e43c8800759c
series __name__=a,host=h1,job=y,zone=z1 ; 5:0 7:c07a8c0000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000
end
case absent_over_time 25000 host="h2"
grid 100000 10000 10
series __name__=a,host=h1,job=y ; 0:4082130000000000 2:c084730000000000 3:408ac60000000000 4:4042d00000000000 5:c08daf0000000000 6:40736c0000000000
series __name__=a,host=h2,job=x ; 1:7ff8000000000001 2:4085af0000000000 3:c074820000000000 5:c0833a0000000000 6:407d660000000000 7:40837d0000000000 9:c06efc0000000000
result host=h2 ; 0:3ff0000000000000
end
case absent_over_time 45000 host="h2",zone!=""
grid 100000 10000 11
series __name__=a,host=h2,job=y,zone=z1 ; 10:4077ba0000000000
series __name__=a,host=h1,job=y ; 0:408cce0000000000 1:408bd00000000000 3:4084330000000000 5:407ff00000000000 6:c0770a0000000000 7:fff0000000000000 8:7ff0000000000000 9:406ec40000000000
series __name__=a,host=h2,job=x ; 4:7ff8000000000001 5:c06e840000000000 6:c088c20000000000 7:40813f0000000000
result host=h2 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000
end
case absent_over_time 45000 -
grid 100000 10000 8
series __name__=a,host=h1,job=x,zone=z1 ; 3:4065f80000000000
series __name__=a,host=h2,job=y,zone=z1 ; 5:c08bd20000000000 6:408c3d0000000000
series __name__=a,host=h2,job=x,zone=z1 ; 4:c08bb40000000000 7:408ccd0000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000
end
case absent_over_time 45000 host!="h2",job="x"
grid 100000 10000 4
series __name__=a,host=h1,job=x,zone=z1 ; 2:c082f20000000000 3:c0864b0000000000
series __name__=a,host=h1,job=y ; 2:40635c0000000000 3:4081d80000000000
series __name__=a,host=h2,job=y,zone=z1 ;
series __name__=a,host=h2,job=y ; 2:c087ac0000000000
result job=x ; 0:3ff0000000000000 1:3ff0000000000000
end
case absent_over_time 25000 job!="y"
grid 100000 10000 5
series __name__=a,host=h2,job=x ; 2:4057200000000000
series __name__=a,host=h1,job=y,zone=z1 ; 2:c076bc0000000000 3:c07fc40000000000 4:40883c0000000000
series __name__=a,host=h2,job=x,zone=z1 ; 0:c08b640000000000
series __name__=a,host=h2,job=y,zone=z1 ; 3:c080f00000000000 4:40754e0000000000
end
case absent_over_time 25000 zone=""
grid 100000 10000 2
series __name__=a,host=h2,job=x,zone=z1 ; 1:c084120000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000
end
case absent_over_time 10000 job="y",zone="z1"
grid 100000 10000 11
series __name__=a,host=h2,job=y ; 6:c0743c0000000000
series __name__=a,host=h2,job=x ; 7:7ff0000000000000 8:c066c00000000000
series __name__=a,host=h2,job=x,zone=z1 ; 0:c06f580000000000 2:c077d60000000000
series __name__=a,host=h1,job=y,zone=z1 ; 5:4074c40000000000 6:c08ea90000000000 7:c06ca80000000000 8:c05ed80000000000 10:4063200000000000
result job=y,zone=z1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 9:3ff0000000000000
end
case absent_over_time 45000 -
grid 100000 10000 3
series __name__=a,host=h2,job=y ; 1:4062cc0000000000 2:c089f60000000000
series __name__=a,host=h2,job=y,zone=z1 ; 1:c0711c0000000000
result - ; 0:3ff0000000000000
end
case absent_over_time 25000 zone!=""
grid 100000 10000 11
series __name__=a,host=h2,job=x ; 8:40678c0000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 10:3ff0000000000000
end
case absent_over_time 25000 job!="x"
grid 100000 10000 1
series __name__=a,host=h2,job=x,zone=z1 ;
result - ; 0:3ff0000000000000
end
case absent_over_time 5000 host="h1",job!="x"
grid 100000 10000 10
series __name__=a,host=h2,job=y ; 4:c086d20000000000 5:7ff0000000000000 6:0 7:40602c0000000000 8:7ff8000000000001
series __name__=a,host=h2,job=x,zone=z1 ; 7:4084ff0000000000 8:4086af0000000000
series __name__=a,host=h2,job=x ; 5:c08a490000000000 6:7ff8000000000001 7:c0896e0000000000 9:c082710000000000
series __name__=a,host=h1,job=x,zone=z1 ; 8:408e860000000000
series __name__=a,host=h1,job=y ; 1:c07ef40000000000 2:c0862d0000000000 3:c07d940000000000 4:c0848b0000000000 6:c05f580000000000 7:408b0a0000000000 8:4084cd0000000000
result host=h1 ; 0:3ff0000000000000 5:3ff0000000000000 9:3ff0000000000000
end
case absent_over_time 5000 zone!="z1"
grid 100000 10000 4
series __name__=a,host=h1,job=x,zone=z1 ;
series __name__=a,host=h2,job=x,zone=z1 ;
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000
end
case absent_over_time 10000 host="h1",zone!=""
grid 100000 10000 12
series __name__=a,host=h1,job=x,zone=z1 ; 6:4081980000000000
series __name__=a,host=h2,job=x ; 8:c088ee0000000000
series __name__=a,host=h1,job=x ; 4:c06b780000000000 5:c080be0000000000
series __name__=a,host=h1,job=y ; 1:4043800000000000 2:c068ec0000000000 3:4044200000000000
series __name__=a,host=h2,job=y ; 10:407e900000000000
result host=h1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 10:3ff0000000000000 11:3ff0000000000000
end
case absent_over_time 10000 job="x",zone!="z1"
grid 100000 10000 8
series __name__=a,host=h2,job=x,zone=z1 ; 0:4047700000000000 1:7ff8000000000001
series __name__=a,host=h2,job=y ; 6:c06a580000000000
result job=x ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000
end
case absent_over_time 45000 job!="x"
grid 100000 10000 5
series __name__=a,host=h1,job=y ; 4:4062340000000000
series __name__=a,host=h2,job=y ; 4:7ff8000000000001
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000
end
case absent_over_time 25000 host!="h2",zone=""
grid 100000 10000 4
series __name__=a,host=h2,job=y ; 3:c063f00000000000
series __name__=a,host=h1,job=y,zone=z1 ; 1:c077860000000000
series __name__=a,host=h1,job=y ; 0:c088540000000000 1:406c140000000000 2:4052600000000000
end
case absent_over_time 10000 host="h1",job="x"
grid 100000 10000 5
series __name__=a,host=h2,job=y,zone=z1 ; 1:c0889f0000000000 2:405fb00000000000 3:c088810000000000
series __name__=a,host=h2,job=y ; 1:c084a70000000000
result host=h1,job=x ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000
end
case absent_over_time 10000 host="h2"
grid 100000 10000 6
series __name__=a,host=h1,job=x,zone=z1 ; 5:40831c0000000000
series __name__=a,host=h2,job=x,zone=z1 ; 2:c082e40000000000
series __name__=a,host=h2,job=y ; 0:c083b30000000000 1:c087ad0000000000
result host=h2 ; 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000
end
case absent_over_time 45000 -
grid 100000 10000 6
series __name__=a,host=h2,job=y ; 1:7ff8000000000001 2:c081860000000000
series __name__=a,host=h2,job=y,zone=z1 ; 1:4087300000000000 2:c068780000000000
series __name__=a,host=h2,job=x ;
series __name__=a,host=h1,job=x ;
result - ; 0:3ff0000000000000
end
case absent_over_time 10000 zone=""
grid 100000 10000 11
series __name__=a,host=h2,job=y,zone=z1 ; 2:407d260000000000 3:7ff8000000000001 4:7ff8000000000001
series __name__=a,host=h2,job=y ; 5:407d8e0000000000
series __name__=a,host=h2,job=x ; 8:4087c30000000000 9:4079940000000000 10:7e37e43c8800759c
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000
end
case absent_over_time 25000 host="h2",job!="y"
grid 100000 10000 1
series __name__=a,host=h1,job=y ; 0:c08c650000000000
result host=h2 ; 0:3ff0000000000000
end
case absent_over_time 45000 host="h1"
grid 100000 10000 9
series __name__=a,host=h1,job=y ; 1:c06acc0000000000 2:c07ee60000000000 4:7e37e43c8800759c 5:4089760000000000 6:c08d7c0000000000 7:402b000000000000 8:4063140000000000
series __name__=a,host=h2,job=y ; 3:0 4:7ff0000000000000 5:c070a20000000000
series __name__=a,host=h1,job=y,zone=z1 ; 1:c0751e0000000000 2:408b840000000000 5:407f8c0000000000 7:7ff8000000000001 8:c089570000000000
series __name__=a,host=h2,job=x ;
result host=h1 ; 0:3ff0000000000000
end
case absent_over_time 5000 zone=""
grid 100000 10000 6
series __name__=a,host=h2,job=x,zone=z1 ; 3:7ff8000000000001 4:4074960000000000 5:4076400000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000
end
case absent_over_time 5000 job="y"
grid 100000 10000 9
series __name__=a,host=h2,job=y,zone=z1 ; 1:c06aec0000000000 2:7e37e43c8800759c 3:408e0a0000000000
series __name__=a,host=h1,job=y ; 2:c088280000000000 4:c07af60000000000
series __name__=a,host=h1,job=x,zone=z1 ;
result job=y ; 0:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000
end
case absent_over_time 25000 host="h2",job!="x"
grid 100000 10000 5
series __name__=a,host=h2,job=x ; 3:7ff8000000000001
series __name__=a,host=h2,job=y ; 2:4042b00000000000 3:7e37e43c8800759c
series __name__=a,host=h2,job=y,zone=z1 ; 3:403ba00000000000 4:4088470000000000
result host=h2 ; 0:3ff0000000000000 1:3ff0000000000000
end
case absent_over_time 45000 job!="y",zone=""
grid 100000 10000 6
series __name__=a,host=h1,job=x,zone=z1 ; 2:c084530000000000
series __name__=a,host=h2,job=x ; 0:40661c0000000000 1:c050700000000000 2:c074100000000000
series __name__=a,host=h1,job=x ; 1:7ff8000000000001
series __name__=a,host=h2,job=y ; 5:c050580000000000
end
case absent_over_time 5000 -
grid 100000 10000 8
series __name__=a,host=h2,job=y,zone=z1 ; 3:408cb00000000000 4:408c2a0000000000 5:40661c0000000000
series __name__=a,host=h1,job=x,zone=z1 ; 4:c08bbb0000000000 5:c086730000000000 6:4089800000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 7:3ff0000000000000
end
case absent_over_time 25000 job="y"
grid 100000 10000 6
series __name__=a,host=h2,job=y ; 1:0 3:408ef10000000000 4:c087950000000000 5:c075120000000000
series __name__=a,host=h1,job=x ; 5:40813d0000000000
series __name__=a,host=h2,job=x,zone=z1 ; 2:408b070000000000 3:c045400000000000
result job=y ; 0:3ff0000000000000
end
case absent_over_time 45000 zone!=""
grid 100000 10000 10
series __name__=a,host=h2,job=y ; 5:7e37e43c8800759c 6:c084330000000000 7:c073760000000000
series __name__=a,host=h1,job=x ; 2:c067a80000000000 3:406d240000000000 4:407df60000000000 5:407a100000000000 7:c073960000000000 8:4084090000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000
end
case absent_over_time 25000 host!="h1",zone=""
grid 100000 10000 2
series __name__=a,host=h2,job=y ; 1:4074da0000000000
series __name__=a,host=h1,job=y ; 1:7ff8000000000001
series __name__=a,host=h1,job=x ; 1:7ff8000000000001
result - ; 0:3ff0000000000000
end
case absent_over_time 10000 host!="h2"
grid 100000 10000 9
series __name__=a,host=h2,job=y ; 5:c08ca90000000000
series __name__=a,host=h2,job=x ; 2:4061c00000000000
series __name__=a,host=h1,job=x ;
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000
end
case absent_over_time 45000 -
grid 100000 10000 5
series __name__=a,host=h2,job=x,zone=z1 ; 2:c084e70000000000
series __name__=a,host=h1,job=y ; 2:4070760000000000
series __name__=a,host=h1,job=x,zone=z1 ; 1:40862d0000000000 2:408edc0000000000 3:c049000000000000
series __name__=a,host=h1,job=x ; 4:c06fbc0000000000
result - ; 0:3ff0000000000000
end
case absent_over_time 10000 host!="h1",zone!=""
grid 100000 10000 4
series __name__=a,host=h1,job=y ; 1:c087880000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000
end
case absent_over_time 45000 job="x"
grid 100000 10000 4
series __name__=a,host=h2,job=x ; 1:c06f800000000000
series __name__=a,host=h2,job=x,zone=z1 ; 2:c06b2c0000000000
series __name__=a,host=h1,job=x ; 3:c0782a0000000000
result job=x ; 0:3ff0000000000000
end
case absent_over_time 5000 zone!=""
grid 100000 10000 6
series __name__=a,host=h1,job=y ; 5:c089420000000000
series __name__=a,host=h1,job=x ;
series __name__=a,host=h2,job=x,zone=z1 ; 0:40707a0000000000 1:4083090000000000 2:c083440000000000
result - ; 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000
end
case absent_over_time 5000 host!="h1",zone!="z1"
grid 100000 10000 6
series __name__=a,host=h1,job=x ; 3:4063480000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000
end
case absent_over_time 5000 job!="y",zone!=""
grid 100000 10000 5
series __name__=a,host=h2,job=y ;
series __name__=a,host=h1,job=y ; 2:408e210000000000 3:c073e00000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000
end
case absent_over_time 10000 host="h1",zone=""
grid 100000 10000 6
series __name__=a,host=h1,job=x ; 3:7ff8000000000001 4:c065b40000000000
series __name__=a,host=h2,job=y ; 5:4083ab0000000000
series __name__=a,host=h2,job=x,zone=z1 ; 0:c08f2f0000000000
series __name__=a,host=h2,job=y,zone=z1 ; 1:4072700000000000 2:c08e9e0000000000
result host=h1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 5:3ff0000000000000
end
case absent_over_time 25000 host!="h2",zone=""
grid 100000 10000 12
series __name__=a,host=h2,job=y,zone=z1 ; 5:c08f160000000000 6:408bc20000000000 7:c0897f0000000000
series __name__=a,host=h1,job=y ; 2:c087330000000000 4:7ff0000000000000 5:c080850000000000 7:408b820000000000 8:7e37e43c8800759c 10:c074840000000000 11:4063c80000000000
series __name__=a,host=h2,job=y ; 9:c0877b0000000000 10:fff0000000000000 11:4057c80000000000
series __name__=a,host=h1,job=x ; 6:c03ca00000000000 7:c06e700000000000
series __name__=a,host=h1,job=y,zone=z1 ; 9:40874a0000000000
series __name__=a,host=h2,job=x,zone=z1 ; 1:407c460000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000
end
case absent_over_time 10000 -
grid 100000 10000 10
series __name__=a,host=h2,job=x,zone=z1 ; 0:c019000000000000 1:7ff8000000000001
series __name__=a,host=h1,job=x,zone=z1 ;
series __name__=a,host=h1,job=y ; 0:c082570000000000 1:c087380000000000 2:c069b80000000000
result - ; 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000
end
case absent_over_time 45000 job="x",zone="z1"
grid 100000 10000 5
series __name__=a,host=h1,job=x,zone=z1 ; 1:c0854c0000000000
result job=x,zone=z1 ; 0:3ff0000000000000
end
case absent_over_time 45000 job="y",zone!=""
grid 100000 10000 12
series __name__=a,host=h1,job=x ; 6:4067f80000000000 7:0
series __name__=a,host=h1,job=y ; 7:fff0000000000000 8:c086ba0000000000 10:4079380000000000 11:7ff8000000000001
series __name__=a,host=h2,job=y,zone=z1 ; 11:4082f50000000000
series __name__=a,host=h2,job=y ; 11:406f040000000000
result job=y ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 10:3ff0000000000000
end
case absent_over_time 10000 job!="x"
grid 100000 10000 7
series __name__=a,host=h2,job=x,zone=z1 ; 0:40817b0000000000 1:c078100000000000 3:c078320000000000 5:7ff8000000000001
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000
end
case absent_over_time 25000 job="x"
grid 100000 10000 10
series __name__=a,host=h1,job=x ; 0:4071560000000000 1:c064fc0000000000 2:4080b40000000000 7:c052e00000000000 8:408a5f0000000000
series __name__=a,host=h2,job=y ; 2:408c5b0000000000
result job=x ; 5:3ff0000000000000 6:3ff0000000000000
end
case absent_over_time 10000 -
grid 100000 10000 5
series __name__=a,host=h2,job=y ; 4:c060e80000000000
series __name__=a,host=h1,job=y,zone=z1 ; 3:c08aec0000000000
series __name__=a,host=h1,job=x ; 2:4088e80000000000 3:40876c0000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000
end
case absent_over_time 25000 host!="h2",zone="z1"
grid 100000 10000 8
series __name__=a,host=h1,job=y ;
series __name__=a,host=h1,job=x ; 6:7ff8000000000001
series __name__=a,host=h2,job=x ; 3:7e37e43c8800759c 4:406f600000000000 5:c07d7e0000000000 6:c08cd50000000000
result zone=z1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000
end
case absent_over_time 5000 host="h2",job="x",zone="z1"
grid 100000 10000 6
series __name__=a,host=h1,job=y ; 5:40725c0000000000
series __name__=a,host=h2,job=y ; 2:c082840000000000
series __name__=a,host=h2,job=x ; 2:c06eb40000000000
result host=h2,job=x,zone=z1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000
end
case absent_over_time 25000 -
grid 100000 10000 7
series __name__=a,host=h1,job=x,zone=z1 ; 4:c076a80000000000 5:4088a20000000000 6:40833b0000000000
series __name__=a,host=h2,job=y,zone=z1 ; 5:40753a0000000000 6:405d100000000000
series __name__=a,host=h1,job=x ;
series __name__=a,host=h1,job=y ; 2:4083850000000000 3:c0881b0000000000 4:4087110000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000
end
case absent_over_time 45000 -
grid 100000 10000 2
series __name__=a,host=h1,job=y ;
series __name__=a,host=h1,job=x ; 1:40813e0000000000
result - ; 0:3ff0000000000000
end
case absent_over_time 10000 -
grid 100000 10000 6
series __name__=a,host=h1,job=y ; 5:7ff8000000000001
series __name__=a,host=h1,job=x ; 0:c0867a0000000000 1:40744e0000000000 2:0 3:7ff8000000000001 4:7ff8000000000001
series __name__=a,host=h2,job=x ;
end
case absent_over_time 45000 job="y"
grid 100000 10000 3
series __name__=a,host=h2,job=x ; 1:4084e10000000000
series __name__=a,host=h2,job=y ;
series __name__=a,host=h1,job=x ;
result job=y ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000
end
case absent_over_time 5000 job="y"
grid 100000 10000 2
series __name__=a,host=h2,job=y ; 0:7ff8000000000001 1:408e570000000000
series __name__=a,host=h2,job=y,zone=z1 ; 0:4085530000000000 1:7e37e43c8800759c
end
case absent_over_time 45000 zone=""
grid 100000 10000 11
series __name__=a,host=h1,job=x ; 9:408e050000000000
series __name__=a,host=h2,job=y,zone=z1 ; 5:40806c0000000000 6:c079500000000000 7:406ef80000000000 8:c082b20000000000 9:c088410000000000
series __name__=a,host=h1,job=y,zone=z1 ; 1:7ff8000000000001 2:c08b7a0000000000 3:c068080000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000
end
case absent_over_time 10000 zone=""
grid 100000 10000 10
series __name__=a,host=h1,job=x,zone=z1 ; 0:c083b60000000000 1:4077be0000000000 2:40854d0000000000 3:4080900000000000 4:408e200000000000
series __name__=a,host=h1,job=x ; 4:4069740000000000 5:408a390000000000 6:405c080000000000
series __name__=a,host=h2,job=y,zone=z1 ; 8:4089040000000000
series __name__=a,host=h2,job=x ;
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000
end
case absent_over_time 5000 job!="x",zone="z1"
grid 100000 10000 11
series __name__=a,host=h2,job=y ; 0:4081dd0000000000 1:c08bbf0000000000 2:4069d00000000000
series __name__=a,host=h1,job=y,zone=z1 ; 5:7ff0000000000000
result zone=z1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 10:3ff0000000000000
end
case absent_over_time 25000 zone=""
grid 100000 10000 6
series __name__=a,host=h2,job=x,zone=z1 ; 0:fff0000000000000
series __name__=a,host=h2,job=x ;
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000
end
case absent_over_time 45000 -
grid 100000 10000 6
series __name__=a,host=h1,job=y,zone=z1 ; 5:4065780000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000
end
case absent_over_time 25000 host!="h2",job!="x"
grid 100000 10000 8
series __name__=a,host=h2,job=y ; 2:c058680000000000 4:c0689c0000000000
series __name__=a,host=h2,job=x ; 7:c086690000000000
series __name__=a,host=h2,job=y,zone=z1 ; 7:c087330000000000
series __name__=a,host=h1,job=y ; 0:408b130000000000 1:c07ff80000000000 2:408bd20000000000 3:c040100000000000 4:7e37e43c8800759c
result - ; 7:3ff0000000000000
end
case absent_over_time 5000 -
grid 100000 10000 3
series __name__=a,host=h2,job=x ; 2:c072160000000000
series __name__=a,host=h2,job=y,zone=z1 ; 0:c06b880000000000
series __name__=a,host=h1,job=y ;
series __name__=a,host=h1,job=x,zone=z1 ; 1:c071820000000000 2:0
end
case absent_over_time 10000 zone!="z1"
grid 100000 10000 4
series __name__=a,host=h2,job=x ; 2:408ece0000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 3:3ff0000000000000
end
case absent_over_time 10000 -
grid 100000 10000 6
series __name__=a,host=h1,job=x ;
series __name__=a,host=h2,job=y ;
series __name__=a,host=h1,job=y ; 5:fff0000000000000
result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000
end
case absent_over_time 45000 job="y",zone!="z1"
grid 100000 10000 7
series __name__=a,host=h2,job=y ; 6:c087ff0000000000
series __name__=a,host=h2,job=x ; 4:403fa00000000000 5:c08c740000000000
series __name__=a,host=h1,job=x ; 1:c08b9a0000000000 2:4086000000000000 3:407d680000000000 4:c0881e0000000000
series __name__=a,host=h2,job=x,zone=z1 ; 2:408b6e0000000000
result job=y ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000
end
case absent_over_time 25000 host="h1",job!="x"
grid 100000 10000 7
series __name__=a,host=h1,job=x ; 4:c0607c0000000000
result host=h1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000
end
@@ -0,0 +1,243 @@
# Generated by promql-compat cmd/narthex-golden built for amd64 (Prometheus v3.15.0 engine, seed 1,
# `-only first_over_time,mad_over_time,ts_of_first_over_time,ts_of_last_over_time,ts_of_min_over_time,ts_of_max_over_time -at -cases 40`).
# Each line: function params range_ms offset_ms start_ms step_ms points [anchor_ms] ; samples ; result
first_over_time - 3203 4376 19888 3203 19 ; 12166:c257759f462f60fd 13861:c027de5a16a21d0e 15136:40d17d1ded071630 17632:418148f1bdf553bf 20580:41816ba7ea66b83e 21122:7ff0000000000002 23954:4236130864b31007 25440:4257ec5b0b91d690 27004:c06eceb438438b02 28164:c0d3d031882af4e9 30364:c006378342e8b71a 31068:406e3b2aae250fc0 31225:40af03d6d29d9143 ; 19888:c027de5a16a21d0e 23091:418148f1bdf553bf 26294:41816ba7ea66b83e 29497:4236130864b31007 32700:4257ec5b0b91d690 35903:c006378342e8b71a
first_over_time - 3287 0 9150 3286 12 12050 ; 9087:405e18e4a7b1aff0 11147:405f2a8f0e098f65 12026:4062edbafd64e104 14530:4064afdbe0cf4df5 15956:406895a20db0c199 16967:7ff0000000000002 ; 9150:405e18e4a7b1aff0 12436:405e18e4a7b1aff0 15722:405e18e4a7b1aff0 19008:405e18e4a7b1aff0 22294:405e18e4a7b1aff0 25580:405e18e4a7b1aff0 28866:405e18e4a7b1aff0 32152:405e18e4a7b1aff0 35438:405e18e4a7b1aff0 38724:405e18e4a7b1aff0 42010:405e18e4a7b1aff0 45296:405e18e4a7b1aff0
first_over_time - 5321 0 31447 3887 13 15935 ; 8864:fe37e43c8800759c 9135:406727eb92980ea0 11188:408dbacc0accd5ff 13938:c07207728fcfff40 15163:c089a29f60de2300 38002:4062058e27a3d2a6 38643:408c9f433ad76d52 39827:c0871960e2d59fd5 42595:0 44819:c0854595d35fc02f 46986:403990429960f4a4 48149:407b0bc9ba296b09 48580:0 49364:c081b8762eecd485 50930:c0751437362922dd 52687:c0661d6ab062060a 54317:7e37e43c8800759c ; 31447:408dbacc0accd5ff 35334:408dbacc0accd5ff 39221:408dbacc0accd5ff 43108:408dbacc0accd5ff 46995:408dbacc0accd5ff 50882:408dbacc0accd5ff 54769:408dbacc0accd5ff 58656:408dbacc0accd5ff 62543:408dbacc0accd5ff 66430:408dbacc0accd5ff 70317:408dbacc0accd5ff 74204:408dbacc0accd5ff 78091:408dbacc0accd5ff
first_over_time - 624 5265 23252 623 20 32031 ; 21126:c245085909f470fb 22980:7ff0000000000002 23374:c0a4997354e139d3 23895:3ff4f0a47a75ac32 24956:414a831d4fb2e40a 25017:428861cb7144bc3b 27618:c291a685b11c6cf1 29423:40e7b451da042ff4 29438:c107218dca4aa413 29723:421c7c8d1cc70ecd 30114:40e65f345c3e79b7 38452:c159ac6fff7e762f 38690:c27623b13afbb75e 41043:7ff0000000000002 ;
first_over_time - 3049 0 6817 3049 1 ; 909:430c6bf5263401dd 1918:430c6bf5263401aa 3294:430c6bf526340038 4762:430c6bf5263401d6 5486:430c6bf5263402be 5526:430c6bf526340177 6043:430c6bf526340270 7095:430c6bf5263401f0 9983:430c6bf52634004d 10845:430c6bf526340094 13499:430c6bf5263400a1 15776:430c6bf526340213 16357:7ff0000000000002 18625:430c6bf526340260 21434:430c6bf526340209 23877:430c6bf5263401f3 24131:430c6bf5263400d8 ; 6817:430c6bf5263401d6
first_over_time - 1047 0 2941 1046 2 39316 ; 6733:40471b3eafa72831 7155:40517598d5100f2d 10078:401f96b44c27949d 12103:403b7075994089de 12228:4043ec98f12ac987 13969:404a9570df50d662 14551:405917919aa7234e 16755:405d51bf8eac441b 18133:40614e6ea388c8ac 20941:4062dbe63c105211 23486:40671fef12688daa 25061:4067ea1de9d8c995 27585:406be3a460de91b1 30257:406f4c9b379bd5c0 30612:4071b1ce88f61182 31534:7ff0000000000002 32384:4073b4133648eda7 34525:400ad768ba6cc83d 36636:4045820937ca1ee9 37962:40460facdd67c9c3 39399:404f4025657b0c25 41426:405bbc0e3f1c0387 43603:7ff0000000000002 44038:405f555db2888836 ;
first_over_time - 12714 4870 29546 122 7 ; 12305:4048f1ab82fc1b38 13822:404bf9556c907b77 15786:40509f7450827834 18662:4059386d44dcf7f8 20215:405fc25edfb6c866 21928:4060deb6b75ac540 24243:40659814328ad498 26583:4067b341497797e6 29478:406a14d43350a40d 30807:406ce083951cf581 32529:401a0c05995205a8 32872:403ca4dd4d363108 33785:7ff0000000000002 35238:404945aec4b42a58 37933:40586835bd3022fa 39348:7ff0000000000002 40617:4061307f3192d5d8 43386:4067225f6c516755 ; 29546:4048f1ab82fc1b38 29668:4048f1ab82fc1b38 29790:4048f1ab82fc1b38 29912:404bf9556c907b77 30034:404bf9556c907b77 30156:404bf9556c907b77 30278:404bf9556c907b77
first_over_time - 1163 4214 16037 1162 4 ; 11794:0 14476:0 17094:0 17668:0 ; 16037:0 19523:0
first_over_time - 3152 0 16896 3151 9 31976 ; 13707:c077d0556d909810 27058:40811baaa574c70b 29893:c075dd65862c3de1 29987:c08022b7d8ea1ae4 29994:7ff8000000000001 32237:c00ab30f46719512 ; 16896:c075dd65862c3de1 20047:c075dd65862c3de1 23198:c075dd65862c3de1 26349:c075dd65862c3de1 29500:c075dd65862c3de1 32651:c075dd65862c3de1 35802:c075dd65862c3de1 38953:c075dd65862c3de1 42104:c075dd65862c3de1
first_over_time - 16153 3237 31529 3097 13 34454 ; 19229:7ff8000000000001 21425:7ff8000000000001 23725:4084037caf5129e6 24669:406cdf06eec2b178 26221:c05137cbb9b8ed13 28401:406388f088c867c4 28716:c062f22ccf8c35ec 31553:4073c66f856aec38 33166:c088ed39e788a744 35699:7ff8000000000001 41889:c03a5c83c0a9e86d 42698:c075da093f572de8 ; 31529:7ff8000000000001 34626:7ff8000000000001 37723:7ff8000000000001 40820:7ff8000000000001 43917:7ff8000000000001 47014:7ff8000000000001 50111:7ff8000000000001 53208:7ff8000000000001 56305:7ff8000000000001 59402:7ff8000000000001 62499:7ff8000000000001 65596:7ff8000000000001 68693:7ff8000000000001
first_over_time - 4779 -3547 40411 2386 1 31306 ; 13142:430c6bf5263401a5 15581:430c6bf5263402c1 18253:7ff0000000000002 18781:430c6bf526340131 19019:430c6bf5263400ba 20382:430c6bf526340279 41464:430c6bf5263401c4 41537:430c6bf52634007b 42458:430c6bf526340019 42519:430c6bf5263402b9 ;
first_over_time - 3817 0 27718 3817 17 ; 19253:c087688906d0f106 28225:407f4c6570265486 28469:c07cede62fadf795 30270:c08aab4bc806bf9d 31462:7ff8000000000001 32741:7ff8000000000001 33125:40701dffe731a610 35284:4041aeb4a41922eb ; 31535:407f4c6570265486 35352:7ff8000000000001
first_over_time - 3465 0 5868 3465 6 ; 9988:405af491bdaea06a 11893:406140124545bacd 12404:4066ef0789c6a9b1 14808:406772c9c80db14f ; 12798:405af491bdaea06a 16263:406772c9c80db14f
first_over_time - 2379 -449 57475 1186 5 36397 ; 25710:4072372cd5ec0f32 27041:40830ff34a3d73ae 27540:8000000000000000 29684:405e8dcc39d454a6 48802:7e37e43c8800759c 51781:7ff0000000000002 53995:c08e60baa7b430e1 55167:c07ffb80167a05e6 57556:408e21dae9cc167a 58540:4040bce996516872 58614:fe37e43c8800759c 59578:c07a30a0c08611b2 61676:0 62460:c084890dad5d4f7c 63063:c084cd4f0f03edb9 64946:4069ae3d3b7b4840 65295:40793d5682208c9a 67372:7e37e43c8800759c 69137:408eae21d18129bd 71959:fe37e43c8800759c 73971:8000000000000000 74598:c058a9e7e147176a ;
first_over_time - 3600 -6762 45686 3600 7 25569 ; 17432:408bb7c2008cd4d2 20033:7ff8000000000001 20732:405203b0ad145210 22875:7ff0000000000002 37129:7ff8000000000001 38525:c086bafba7d9a15c 40881:7ff8000000000001 42086:7ff8000000000001 44524:4081dd0ac5288cb5 46570:7ff8000000000001 49436:408829ebfa8eacac ;
first_over_time - 3403 8497 3932 1698 5 ; 2834:c0706117d78ff098 5290:408521d66aa83bde 8003:8000000000000000 10916:405ece824d076ae6 ;
first_over_time - 1441 -1474 29531 1441 7 34414 ; 8008:430c6bf52634029a 9590:430c6bf5263400ca 9783:430c6bf5263401e1 11455:430c6bf52634014a 13480:430c6bf5263400f3 14337:430c6bf52634013a 16525:430c6bf5263401f3 33379:430c6bf526340111 34881:430c6bf526340277 36530:430c6bf5263400a6 36890:430c6bf526340016 37203:430c6bf526340084 40160:430c6bf526340206 ; 29531:430c6bf526340277 30972:430c6bf526340277 32413:430c6bf526340277 33854:430c6bf526340277 35295:430c6bf526340277 36736:430c6bf526340277 38177:430c6bf526340277
first_over_time - 12072 5309 40853 3003 18 61310 ; 14081:40661dc09dc0494f 15270:407739f4234be29c 16483:7ff8000000000001 18025:c0781473b60f2d79 20963:c083b92521352a06 21550:4076d887837be3f2 22847:40681077f1d49b06 22962:7ff8000000000001 24366:4085a720e46875ab 27141:405d8ed0800aa28e 27984:408742a5044f6311 52737:408d16addd5395e6 54079:c0795033bdcbcbbb 56114:c07392e499eebf17 57975:c08a1e619ce1fce0 ; 40853:408d16addd5395e6 43856:408d16addd5395e6 46859:408d16addd5395e6 49862:408d16addd5395e6 52865:408d16addd5395e6 55868:408d16addd5395e6 58871:408d16addd5395e6 61874:408d16addd5395e6 64877:408d16addd5395e6 67880:408d16addd5395e6 70883:408d16addd5395e6 73886:408d16addd5395e6 76889:408d16addd5395e6 79892:408d16addd5395e6 82895:408d16addd5395e6 85898:408d16addd5395e6 88901:408d16addd5395e6 91904:408d16addd5395e6
first_over_time - 13498 -2284 64971 461 10 19982 ; 13077:c06c82f71db36dbc 14051:408b918c57d84992 15105:c08d8745ea61bc5b 17666:4087ab0118b51e55 18336:c06efeabf2cccfb4 21262:c043e2b46e484032 21532:408667aaf035b2ae 22954:4067725048e78556 23203:c053eb297910e474 25221:405a55d5ee29e787 27372:c08d96a76b2e04e0 28620:7ff8000000000001 51628:c068da8cd58128ba 52043:40820308d17ea761 54898:4077a2a6fc26393f 67652:c085810afe44374f 68977:c06ed26bfaa62364 70530:c0823b9863d2bc16 72060:c088b19c35ceacfc 72815:7ff8000000000001 74922:408bb11ba7be6c59 76633:408ace6a598f2384 78649:c073ee200ca5c302 81438:7ff8000000000001 ; 64971:c06c82f71db36dbc 65432:c06c82f71db36dbc 65893:c06c82f71db36dbc 66354:c06c82f71db36dbc 66815:c06c82f71db36dbc 67276:c06c82f71db36dbc 67737:c06c82f71db36dbc 68198:c06c82f71db36dbc 68659:c06c82f71db36dbc 69120:c06c82f71db36dbc
first_over_time - 7525 9265 30700 3759 10 43320 ; 14941:41d563c9fbb8c603 16901:c107368bc8b38718 17496:41bba44350827e87 18278:4275e5154857153e 19113:41323dd3a1d22d7f 21044:c1b79fcaf52b06a7 22846:c0d5ff21a42600bf 25721:428469214f3d32d9 27685:4239cc5345b1dfc3 29744:4281a57190552487 31034:c0dffd3193fb192b 33375:42f8826dd2a13c5a 34528:c040021fcc03decc 37104:bfdcd28ce0c3b282 37253:c2b10726b7fd4ab4 40234:7ff0000000000002 41633:428a32b53fdaaa0b 43748:c10b6d2e6de916d4 45011:425c8528562b1a49 45362:c1835b54fbacb2a1 46617:bff543d2de402da6 ; 30700:4239cc5345b1dfc3 34459:4239cc5345b1dfc3 38218:4239cc5345b1dfc3 41977:4239cc5345b1dfc3 45736:4239cc5345b1dfc3 49495:4239cc5345b1dfc3 53254:4239cc5345b1dfc3 57013:4239cc5345b1dfc3 60772:4239cc5345b1dfc3 64531:4239cc5345b1dfc3
first_over_time - 4787 9628 18189 2390 16 ; 10413:4132561070188daf 12900:c1906f0790d59e9c 14009:40363ad9b9a16730 14149:42889e296158fbdd 15341:42e8fc2f1c49e06c 18174:c0443651f72a0da0 20885:c2b90c392f6360f4 ; 20579:4132561070188daf 22969:4132561070188daf 25359:c1906f0790d59e9c 27749:40363ad9b9a16730 30139:c0443651f72a0da0 32529:c0443651f72a0da0 34919:c2b90c392f6360f4
first_over_time - 2977 0 42917 1485 5 52564 ; 17308:408f0b52754ad4b5 18508:4078c3fc9518e80d 19736:c08cce789da3f890 22383:c076c3abe1867b96 24466:c0886a5043213d0d 26643:c08bef8f710b8c85 29238:c076b1b05caf78af 31372:40841267ca8ad42c 34057:4077437025b12da5 47043:c0641fe96da49c88 48420:c0864a9189204503 49921:c013da1381b1c5c9 ; 42917:c013da1381b1c5c9 44402:c013da1381b1c5c9 45887:c013da1381b1c5c9 47372:c013da1381b1c5c9 48857:c013da1381b1c5c9
first_over_time - 337 3966 10320 337 3 10344 ; 8499:40507f904c18897e 9562:4005775801abd2c7 11946:4041acb97435301f 13409:404cbeab9d2424f6 33576:4053fd47c233ba28 34952:405f615fd504f541 36957:7ff0000000000002 39496:40615df3c122bf56 40290:4066c41e1458a4df 40556:406befaaae4a0a34 41675:4070265ab05f4b38 42513:4070d1f6bd29b4f1 44424:40733d201e9ae6c7 44837:40754c3771e7de2a 45081:4075ae714e1eed1b 46315:4077d1b9249f09b5 47244:407a6b6596f630b5 ;
first_over_time - 15814 -8363 15989 2411 2 ; 11692:4054ea7373a508eb 13809:4059cd5aa99d421e 15598:40629bb493d019d2 16818:40649d261f90397a ; 15989:4054ea7373a508eb 18400:4054ea7373a508eb
first_over_time - 311 0 28588 311 20 44342 ; 17326:7e37e43c8800759c 17637:7e37e43c8800759c 18844:7e37e43c8800759c 19811:7e37e43c8800759c 22508:7e37e43c8800759c 23296:7e37e43c8800759c 25414:7e37e43c8800759c 26009:7e37e43c8800759c 26212:7e37e43c8800759c 28526:7e37e43c8800759c 29723:7e37e43c8800759c 31954:7e37e43c8800759c 33593:7e37e43c8800759c 34368:7e37e43c8800759c 36757:7e37e43c8800759c 37815:7e37e43c8800759c 39958:7e37e43c8800759c 41275:7e37e43c8800759c ;
first_over_time - 2470 -3697 30386 2470 8 34889 ; 18607:8000000000000000 19272:8000000000000000 40160:8000000000000000 40337:8000000000000000 ;
first_over_time - 1000 6726 1380 2346 9 5384 ; 5223:7ff8000000000001 5487:4073c16e8422d64f 8343:7ff8000000000001 9214:7ff8000000000001 ;
first_over_time - 1000 0 10970 1121 18 ; 7048:4058229faa9baca2 9831:405cce4ae506fdb0 12523:4062ec2abcb56448 12624:401ba8a9748a4be7 15501:403ff872cad84e09 17259:404ffcd3433853b6 17497:40540f9a63e20bfa ; 13212:4062ec2abcb56448 17696:404ffcd3433853b6
first_over_time - 6101 -4144 25171 3047 17 22129 ; 2508:c08ebb6feca3e3b7 2731:405d9723451bccd7 3850:7ff8000000000001 4850:405a77d5f1709fb6 6871:408e32730529be05 9314:c08a9230061c0e88 25055:c0634d9d9009e6a8 25848:7ff8000000000001 ; 25171:c0634d9d9009e6a8 28218:c0634d9d9009e6a8 31265:c0634d9d9009e6a8 34312:c0634d9d9009e6a8 37359:c0634d9d9009e6a8 40406:c0634d9d9009e6a8 43453:c0634d9d9009e6a8 46500:c0634d9d9009e6a8 49547:c0634d9d9009e6a8 52594:c0634d9d9009e6a8 55641:c0634d9d9009e6a8 58688:c0634d9d9009e6a8 61735:c0634d9d9009e6a8 64782:c0634d9d9009e6a8 67829:c0634d9d9009e6a8 70876:c0634d9d9009e6a8 73923:c0634d9d9009e6a8
first_over_time - 2457 0 14880 1225 10 5675 ; 9507:4081e4d5774ce1bf 10691:408a0f78ea3bb0c9 23438:7ff0000000000000 24557:40800b7443c45704 26201:7ff0000000000000 29086:c057c354e3a84536 29742:407882efbc12a486 30191:408bb02acd9c7e5f 32552:7ff8000000000001 33776:408e7bb7555ff030 34616:c08ec5bcf9fc783b ;
first_over_time - 3978 3324 18494 3977 2 ; 14395:404b61dfae6fca74 15477:404b85d911bc5581 17032:404e568eb6cfd24c 19043:40513024b42239b9 21948:40537552696b6d51 ; 18494:404b61dfae6fca74 22471:404b85d911bc5581
first_over_time - 821 -5241 17346 407 18 23631 ; 16483:41e007d9fac0cea4 17416:4225f9d88500bf50 18620:41dbcff281ee7674 18816:3fd0cf4d1855018e 20843:c1ea8f2625349258 22869:c16aed8cc078f521 ;
first_over_time - 14498 -305 15689 3475 16 ; 9069:7e37e43c8800759c 10332:7e37e43c8800759c 11383:7e37e43c8800759c 13109:7e37e43c8800759c 13648:7e37e43c8800759c 15253:7e37e43c8800759c 17710:7e37e43c8800759c 18555:7e37e43c8800759c 20995:7e37e43c8800759c 22047:7e37e43c8800759c 22193:7e37e43c8800759c 22708:7e37e43c8800759c ; 15689:7e37e43c8800759c 19164:7e37e43c8800759c 22639:7e37e43c8800759c 26114:7e37e43c8800759c 29589:7e37e43c8800759c 33064:7e37e43c8800759c 36539:7e37e43c8800759c
first_over_time - 5605 -9069 18690 2799 5 59663 ; 9020:7ff0000000000000 9661:40878d82ea0d5b7e 11653:c085acf8d51cc8b3 12422:c08e1c414bd749d4 14401:408b6cf4b9872e90 17017:405e24efda24f284 19946:c07c8c8b99faa3c9 22095:7e37e43c8800759c 23267:40802a9599208ea6 25842:7ff8000000000001 28121:408677998359969d 29740:4081f8ee7c3c778e 30560:408e5db3da2ad991 51439:408b0a1a4e633318 54417:4067039d634e091e 56834:fe37e43c8800759c 57350:4080da83123e0bb5 58566:40607d2bef6e9d6d 59393:c082ade63be96efc 61959:4023a1b2bc5991e6 ;
first_over_time - 1183 -3126 35728 1183 9 22181 ; 20262:7ff8000000000001 22857:408dc72db33ea83e 23612:7ff8000000000001 25945:c081a57acc315afe 27414:c06bb388a39d82c7 29197:7ff8000000000001 30656:c070c391f1512079 32646:7ff8000000000001 33695:c06b473243656374 35802:40886dc871510db3 36141:c07f6d189198b504 38163:406221a2611c7fde 39037:c08e591dcc0f481d 41471:c08ae97701b7b594 43177:407f1977e3587b2b ;
first_over_time - 6085 -5819 18544 3039 7 25026 ; 16224:7ff8000000000001 16570:c077d8ab5bba288b 32620:7ff8000000000001 35144:c077a41077116cd4 37603:c077a67f6fd64790 39135:407c16b43d6a727c 39965:7ff8000000000001 41887:c059a5a0f498e076 43002:40898877980af255 43744:7ff8000000000001 44869:7ff8000000000001 47644:c081f4794c1d0ed2 49215:408987ef123f42d4 50926:c07cec92b94ee661 ;
first_over_time - 1133 0 13674 563 20 ; 17827:40581f23ce7cecc8 19613:4060ca1b5238b44e 20006:406322d9de4d6757 20685:406763478833f504 22200:406be9ebe20728ba 23898:40179d54a668ceff 26461:4048cb5f94ffa459 27129:4051e730ffcfffbe 29316:40581b1ffa532274 ; 18178:40581f23ce7cecc8 18741:40581f23ce7cecc8 19867:4060ca1b5238b44e 20430:4060ca1b5238b44e 20993:406322d9de4d6757 21556:406763478833f504 22682:406be9ebe20728ba 23245:406be9ebe20728ba 24371:40179d54a668ceff
first_over_time - 5901 7295 52619 2947 18 34598 ; 9555:40710a03ee4568db 15646:c04b1b7d598da5ea 15880:0 17371:7e37e43c8800759c 17646:c08af8ef7891f91b 18060:40865c496100f273 18119:7ff0000000000000 18568:c08e6a3269428049 20156:c0408ee15f06ef78 22808:c084ee9b39a5aabe 23159:408ae8ef07e6f554 23932:40682c11ab0b6ffe 26806:40887dbbb5d0cf83 28173:c079bee1db090d5e 30992:c051b8b5ff074a20 33603:406b452f49cd1b1e 34886:7e37e43c8800759c 52499:407f79fb814a26f3 53876:c079677f0cf4b512 54031:c05dd10bcb318c54 54352:c05402a314c9bff5 ; 52619:c084ee9b39a5aabe 55566:c084ee9b39a5aabe 58513:c084ee9b39a5aabe 61460:c084ee9b39a5aabe 64407:c084ee9b39a5aabe 67354:c084ee9b39a5aabe 70301:c084ee9b39a5aabe 73248:c084ee9b39a5aabe 76195:c084ee9b39a5aabe 79142:c084ee9b39a5aabe 82089:c084ee9b39a5aabe 85036:c084ee9b39a5aabe 87983:c084ee9b39a5aabe 90930:c084ee9b39a5aabe 93877:c084ee9b39a5aabe 96824:c084ee9b39a5aabe 99771:c084ee9b39a5aabe 102718:c084ee9b39a5aabe
first_over_time - 1242 4766 38700 1241 8 88571 ; 19279:405245c53ba38472 21604:405299a7fb29faee 24018:4054728b434bf7e6 26320:405953233c6ac3ff 39797:40596d9cefd874ad 42609:40215b0f7d053939 42961:402ea3e552170e0e 43453:4042ae46d9ce30ce 46321:404e0f7920e83c48 47744:4053c029a5a6c6a2 50151:405db78271d48a1b 72521:405e755b8954fc62 72695:4062502adb7d776a 74327:406746bc482a297f 75624:406c8bcd5b211509 77138:4022d003caee2661 78495:40494097a2493e8b 93854:4056fb7b07a8bd12 96286:405deedc919d6544 98690:4020e395cb7846d1 98974:403663a1e66798b8 100648:403ded7fce8c7d97 103126:4052e73719fec899 105600:405e69c3b9806b92 ;
first_over_time - 4423 -9371 7369 2587 1 27165 ; 6834:c1869b0ccd7b670c 9061:c0878cce670ed8d9 9490:40507a905992d79d 11612:c16a67b0b76fb706 13168:407ebaa1e7f78b1e 15253:c214bff7c6363529 18060:40737e0c3d2d103a 18541:c27024b1f2d157e4 21534:c1e5eb86f9b0580d 21591:c14d2d164ca791c4 22130:407b0058d2948d88 22711:427413a07c76d77e 23024:c2a7966507320397 24714:4003571baf2f4fbf 27144:c01065a9149acbd2 28630:40e09764109812c2 31214:429b018f1786f323 32561:401117000d816a08 34997:c07042e4be2a976a ; 7369:401117000d816a08
mad_over_time - 1761 0 29595 1760 6 27277 ; 9723:7ff0000000000000 10353:7ff0000000000000 11756:7ff0000000000000 14525:7ff0000000000000 15776:7ff0000000000000 16602:7ff0000000000002 17710:7ff0000000000000 18663:7ff0000000000000 37629:7ff0000000000000 39659:7ff0000000000000 41344:7ff0000000000000 ;
mad_over_time - 5411 7033 57656 2702 8 ; 20295:c08a3600545fdf30 20439:c0869bcacd008691 21094:4084cb4671c118c8 22014:c04abbba6c434cec 24020:4079ec3557ba98b1 24491:7ff8000000000001 24673:c08b093f932f3c05 25366:7ff8000000000001 44165:c08d5becbdcf3a38 47164:c06af9602146de13 49637:c07dd5fecb61f977 51313:408924f11c267f8a 52655:7ff8000000000001 73381:406c106e466e7630 76243:c086184cd015f9d5 77972:408be828114073dd 80927:c076ce4893897c26 81183:7ff8000000000001 81278:7ff8000000000001 84111:40863cce9fb31e07 86814:40755a057bb3c390 ; 57656:4060594ebabe8a6e 60358:7ff8000000000001 63060:7ff8000000000001
mad_over_time - 2426 1310 10721 2425 15 ; 12952:411708db1b093d23 14229:c11b3f7dd74df3bf ; 15571:4119242c792b9871
mad_over_time - 1000 580 9832 11 17 16521 ; 7404:c073d462aef61f5d 10113:408c1895fa071b25 11502:407fda56b2b6b9eb 12236:c066377f32566125 13044:406085229299f53e 14421:7ff8000000000001 14563:7ff8000000000001 16717:c08651dbfb4a3e2e 18641:408d0346adb31705 19575:408ccf4be4f2e332 ;
mad_over_time - 2154 0 5146 2154 10 ; 5802:40571606fc556719 7458:405c201ceead7a82 8993:405ce2f88650a362 9499:4061b346e9b29b0f ; 7300:0 9454:3ff85b72f4651c00 11608:0
mad_over_time - 6107 -7208 16766 3050 20 ; 16003:c050f10d4d78809a 18343:0 18382:c089ab5e7ea6f48e 19003:404417297f8755fa 21349:c0690e0c90a1b7d9 23706:c086fd064d5e567b 25805:c08cee124f0c5380 27023:7ff8000000000001 28157:407c5e95932da035 29013:c08ad76048d8d549 31541:c0807f5776750615 ; 16766:406e13d6f0838d58 19816:7ff8000000000001 22866:7ff8000000000001 25916:7ff8000000000001 28966:0
mad_over_time - 1000 -3942 24734 1354 3 ; 21359:c1502f42eeb764ec 23441:42ece2f42fe25180 24200:c186db55dd5701c6 26472:c1f27f5425f35501 28817:c013c3b658ded5fe 31214:c2411a6f4224f2bd 31635:40f12d84cce6642b 34583:c0139f29aa6adc62 35293:403d44fff55fd9b4 35974:407d724110fb665c 38393:c225fdbd8af250fd 38669:41a601be3cdb7a4b 47660:41ea98965e94bf6f 49384:40249394c566fa58 55720:4222358364b691ee 56806:c10e867a9861d877 58179:42f6f8e9751991b5 60733:41bcf36265fe4de2 60931:c14c9eafaa4f1929 61397:40b09146f6f4206b ; 27442:0
mad_over_time - 1000 0 50164 3235 15 ; 15224:40601a79bdce1ba1 15370:4060fc4baca49812 17481:4062d4bc6dc24b85 19346:4065b382ec9acbc7 19470:40679287a417d714 37347:406ce0291d93646b 38859:407178ce9b4c117a 41011:4074364151441476 42783:407459a96da8ed56 45248:4077696228b87314 46658:407a32733afa4759 47816:7ff0000000000002 61532:3ff4069753b7d83c 61963:400783cb30a16e68 62175:4036ae1f82a0eac0 63147:4043cadb4996da3e 63812:404c1e0ac9053966 64867:405269e0ab1d2fe6 67109:405358ff1220d3b4 69529:4021b3d3a1fda7e4 69820:4021d5edba10dbd8 72176:403227f440f2e0c9 74904:404d28916c2bacda ; 63104:0 69574:0 72809:0
mad_over_time - 743 5812 40651 743 19 46608 ; 19722:4057062231cff56f 21664:4059a0d99b079321 22614:405d0567d37bf14e 24810:40629d4d9a490104 26422:40689c7ef008d763 28047:7ff0000000000002 29019:406b39dd0aada43d 30323:40703f5ae5815652 33253:4072e87c024278ef 34976:4073fb80d98b8218 35850:4074fc18f44ab866 37435:4077c114153ba419 39719:407a27edf6e465f2 40766:407b7f54283c2dfa 42020:407bf4286fd066f7 43766:407c5ba565649281 45971:407e1de36059d976 ; 40651:0 41394:0 42137:0 42880:0 43623:0 44366:0 45109:0 45852:0 46595:0 47338:0 48081:0 48824:0 49567:0 50310:0 51053:0 51796:0 52539:0 53282:0 54025:0
mad_over_time - 3644 5862 10276 3644 3 ; 11082:430c6bf5263402eb 12313:430c6bf526340289 15183:430c6bf5263402a6 16771:430c6bf5263401ae 17198:7ff0000000000002 17332:430c6bf526340189 19446:430c6bf5263402be 21179:430c6bf526340195 23637:430c6bf526340178 24014:430c6bf5263401b0 24091:430c6bf5263401c4 26574:430c6bf526340171 28354:430c6bf526340266 29744:430c6bf5263400ec 31703:430c6bf5263400f0 32384:430c6bf526340209 ; 17564:0
mad_over_time - 2181 5185 18938 1087 11 58157 ; 9455:c088696382c8745e 9683:c085fbc81e3ee826 31326:4068b2e6bb238c19 33915:407cc9c69d78d25b 36050:404c4fe52ee69dc6 36457:7ff0000000000002 38264:c08e187c4feb012f 40712:4060a29e6bcfab6a 42279:c07fdc13c1e5e53d 42299:7ff8000000000001 44647:c0662526e90406f1 45513:c08513ce804ab862 48390:407da0ceaa8339da 51288:7ff8000000000001 52306:40629f76de95fc3c 55233:c07bb22db26b560a 55257:c06bfe383c308182 56388:404b23077e7d629e 57676:7ff8000000000001 59370:c0547362bd4e500c 60083:408a27440cb8cae5 61690:7ff8000000000001 ; 18938:7ff8000000000001 20025:7ff8000000000001 21112:7ff8000000000001 22199:7ff8000000000001 23286:7ff8000000000001 24373:7ff8000000000001 25460:7ff8000000000001 26547:7ff8000000000001 27634:7ff8000000000001 28721:7ff8000000000001 29808:7ff8000000000001
mad_over_time - 3130 0 56780 3287 20 ; 18974:4080a49335847cf3 20759:c084fcae11f499c2 22653:4061b0f7122f1ed4 25427:c08ceb145990995d 26592:4087fb0695c74570 26892:407954c1fb89f31e 27829:408a0260f44da23f 30378:7ff8000000000001 32826:c07f593f241285a0 35179:c06aff5ea65b5668 36640:c084211ae7152472 37375:7ff8000000000001 38914:c087c948203e4cfe 41665:c0891942f0a72726 43129:c07ea2480ca18032 44493:c08a28b280ca8c0b 44937:7ff8000000000001 46954:c08626dceeaa6c91 48262:c05843da015fdc9b 50211:40815178b8acf185 50339:403cb9966ba5dc32 50811:c0876f06169c6276 52291:7ff0000000000002 54808:c067e32a8b69d8ec 57080:4082017828746b9f ; 56780:0 60067:0
mad_over_time - 1190 -8714 15626 1190 11 ; 8512:40812192977ecae8 10885:c0787cbc30826880 13484:7ff8000000000001 15842:405f1457be8dbdec 17032:4066431e4a8be592 17112:40719284a172e117 19875:7ff8000000000001 22735:c07cc02397e4d61f 23703:7ff8000000000001 26426:7ff8000000000001 27499:7ff8000000000001 ; 15626:7ff8000000000001 18006:7ff8000000000001 19196:7ff8000000000001
mad_over_time - 937 -769 7910 465 19 5378 ; 8985:fe37e43c8800759c 9089:fe37e43c8800759c 10864:fe37e43c8800759c ;
mad_over_time - 7109 -3272 -2304 3551 3 3183 ; 975:407dc3de623225c3 1416:408be325e112e66d 2975:404001ee7c45c688 5086:408b6a27572c8381 ; -2304:406a026d5ff3a718 1247:406a026d5ff3a718 4798:406a026d5ff3a718
mad_over_time - 1227 -307 36696 610 3 ; 20619:7ff8000000000001 21427:40754d1bca4b3ed6 22145:40357c44ad23e6b0 22385:c07d190e84e47220 22501:c0822ff5422fcd8b 23809:4072ed111f7a5335 26237:c084e75dc2e89948 27839:407ff0f502e1ae90 30693:40854865e3acfdc6 33587:c08dddd05017d65c 36449:7ff8000000000001 37763:7ff8000000000001 ; 36696:7ff8000000000001 37306:7ff8000000000001 37916:7ff8000000000001
mad_over_time - 1000 0 22380 1181 3 ; 5501:c07030731d90f7ed 5541:7ff8000000000001 8410:408ac5d50c1aec89 9041:c081e393adc11cb4 10912:c08ddfec8f944dea 10982:c08a4348ab342979 12962:408b452872910b11 13799:7ff8000000000001 13994:407f87a4520e0353 14838:40897cc6b631ca3e 16089:408db13f078b9127 18321:c07f79fa97fee5d8 20526:4080e7f02d55d38d 22399:c08b80d19e3a2a2a 31037:7ff8000000000001 31871:408279254371efe1 33865:c075a31633893496 35431:c08f12295cee1da1 36555:408c9e403c5c3f8b 37486:406185812ea69fa8 39027:7ff8000000000001 ;
mad_over_time - 1000 0 26238 2350 7 ; 19555:405a4fe2c6741f9b 19590:40627d0e1e29f83f 19892:4064b56799713916 19923:406679039ecf59de 20604:406b23ae2318c5b6 21509:406d6b26bd4b2cfe 23862:406e96f73d338801 25709:3fb91fda2cd8a620 27996:4039adc9c2cd02c0 29878:40495ffdcb50fa2f ; 26238:0 28588:0
mad_over_time - 2427 0 47496 2427 6 35643 ; 20513:40470585063af357 21911:4050d209f92ca1f4 24824:40534a0c04c6063a 27813:405d676900cf98d8 48781:40647bda9a2746eb 50864:4068aab5d56f79b5 52298:406adbc83cf4d103 52466:406fa11a72135044 54934:40709c7347020793 57388:3ffd12048321a479 70824:7ff0000000000002 72460:403cd0afa1aaed47 73958:405388dc56aba7cd 74163:40595506bddd124b 76022:406037aff36889b7 77799:4011e01269569b56 78270:40490c9061f1175a 80786:40584de920e71962 83154:405f7fd4eabd4276 83876:4065148c9ca2f7c2 84341:4066f6a4fdcf2032 85666:4069e399aebfec6b 87813:4020ea7cae6fe157 ;
mad_over_time - 19193 -368 16755 3979 12 12414 ; 12668:7ff0000000000000 13676:7ff0000000000000 15904:7ff0000000000000 18306:7ff0000000000000 19670:7ff0000000000000 ; 16755:7ff8000000000000 20734:7ff8000000000000 24713:7ff8000000000000 28692:7ff8000000000000 32671:7ff8000000000000 36650:7ff8000000000000 40629:7ff8000000000000 44608:7ff8000000000000 48587:7ff8000000000000 52566:7ff8000000000000 56545:7ff8000000000000 60524:7ff8000000000000
mad_over_time - 4143 6996 71145 3334 15 83019 ; 10797:407c62cd74ab7344 29896:c08180002c01183a 32869:c07f9928d54591ff 34463:7ff8000000000001 35650:c062b72e4857e773 36535:4051dbd8768516c9 37918:4087359ffeaf2c36 40079:c028e022aeaf04d2 41954:c07fc49062b26b98 44183:40616b8381d11eb7 47064:c07b1aae33fd271b 47351:c0697799ffa48180 49067:c06305e9b453952f 49131:7ff8000000000001 50321:c0889d2c7a104613 52120:c087cd92f096ac41 54932:408c7673e7afa0ff 75535:7ff8000000000001 76727:c07476a02606e76d 78485:7ff8000000000001 79797:40442fede1d19820 81384:c08295c67c34adcd 82044:c0702cecafa55180 84236:7ff8000000000001 ; 71145:7ff8000000000001 74479:7ff8000000000001 77813:7ff8000000000001 81147:7ff8000000000001 84481:7ff8000000000001 87815:7ff8000000000001 91149:7ff8000000000001 94483:7ff8000000000001 97817:7ff8000000000001 101151:7ff8000000000001 104485:7ff8000000000001 107819:7ff8000000000001 111153:7ff8000000000001 114487:7ff8000000000001 117821:7ff8000000000001
mad_over_time - 419 1699 23384 418 18 35651 ; 17204:c07e110269d7c652 20176:c0845ea28b96eaf2 21320:c0864aaca2315beb 22561:c0661e9f3018444c 23277:c08eae54997b9ccc 25643:408d345a793e073a 26536:c0814544172bb9af 29439:c077b6e0a0c3cf61 30645:fff0000000000000 32411:c07fe3362328e392 34537:4077ee0e421745c3 34730:7ff0000000000002 36506:0 37207:c049a26a1a4490b2 39429:c08a9615df5bf409 40755:c089b0d0cef2c8d0 ;
mad_over_time - 8658 0 16996 2397 10 20075 ; 9925:40497c6cb21b4a8e 12436:4049b9028eae31b3 12701:40583a2017f007a8 15214:402160188242e6cc 17761:40304d1fa49ffd5e 17918:7ff0000000000002 18901:403b014025dcb20a 20802:4040a84ebb12edc9 23483:4047b71622cb0e43 26094:404b6f5a78ee4c12 27704:40090cdf05a1510c 28012:402678e63af739b3 29236:4048be1ddb13892a 30045:404f5f11988f9482 31408:405457db17ab4a53 33208:3fdd26b8d30bc050 ; 16996:40325133e4bb3ea4 19393:40325133e4bb3ea4 21790:40325133e4bb3ea4 24187:40325133e4bb3ea4 26584:40325133e4bb3ea4 28981:40325133e4bb3ea4 31378:40325133e4bb3ea4 33775:40325133e4bb3ea4 36172:40325133e4bb3ea4 38569:40325133e4bb3ea4
mad_over_time - 3378 0 7886 3378 17 ; 11210:40781afaa105bf3c 13745:c0810a18697d2164 16532:c0801a9328ce87b6 16738:c08eaed6923e54eb 19576:7ff8000000000001 ; 11264:0 14642:0 18020:406d2886d2df9a6a 21398:7ff8000000000001
mad_over_time - 209 0 42655 101 14 ; 19967:4088877fa2daa585 22636:c05ff0a77321bd60 23692:c074ab4ab419b387 25799:404c6dfa43eb93cb 28493:c08453fe09251862 29856:408999428cf572f4 30611:7ff8000000000001 33111:c082fcdfc3e95cae 36003:c01cf1c6b1d18e96 36599:402836fd989fc100 38096:c0585e2f0653df82 38762:fff0000000000000 38843:c08b6032e8a263d3 39787:c07cd0aac8bd9e4d 41414:c065bd83b5fa7e7b 42929:40686205e4bee566 57058:4063f5de8629aef8 59618:407219dea9f6d41a 59889:0 60589:c08a34f6d211d3dc ; 42958:0 43059:0
mad_over_time - 1000 0 20244 1160 1 41798 ; 5550:c085876c37e3ddb3 5906:408a70f77809b819 25740:c0814d3e4a72b807 27125:0 28468:c087e66c8d1c2c11 28635:7ff8000000000001 29884:7ff0000000000002 30172:408e29460ed91c91 32977:4088ff8f032fb778 33514:0 35681:8000000000000000 36690:7ff8000000000001 39036:8000000000000000 40550:406b3f381d1731a5 40703:4089821534273e58 43165:4061ddedc0fc90e6 ;
mad_over_time - 1000 -696 27911 1080 1 ; 20645:4034c248a24fc2f3 20791:4023818cab84d0a8 20885:41d08c0171edae5d 21248:c299feb588069d79 23826:c242205db0b59883 25729:42e964a9ef888f7a 26841:4286ed113fa41179 29285:c0dddfbce29c3e12 30080:4243fdd376856503 32487:3fbb20fa6e927ad0 34009:c28d165078cb0806 36757:41310298fee6b2a4 38549:4152d49aea10750d 41167:429a1b38570679e7 44162:c28240e3283eadcc 45890:7ff0000000000002 47394:3feda55f244aa47a 48387:c039abb6ba8671eb 50807:c0a209d59fd9ed71 ;
mad_over_time - 13969 6597 11041 3672 17 18467 ; 5131:c0863f6af75579d7 6768:406a4127744fed34 9124:40727c5f010640b1 9295:c0822b75986fe033 10919:7ff8000000000001 13290:408777278dc78706 13401:c0635557f1c02be7 16036:c080f90c561c60aa 17067:c0515785a74e7db6 18862:40567c1344bf8349 18888:4084fcb7afb84429 30535:406178e26723505e 30830:406961384624d707 31797:c07403e9913dfc57 34445:407ce78d8325b33f 35869:7ff0000000000002 38539:c08bff5c9f29203f 39127:c077e2708dcca210 ; 11041:7ff8000000000001 14713:7ff8000000000001 18385:7ff8000000000001 22057:7ff8000000000001 25729:7ff8000000000001 29401:7ff8000000000001 33073:7ff8000000000001 36745:7ff8000000000001 40417:7ff8000000000001 44089:7ff8000000000001 47761:7ff8000000000001 51433:7ff8000000000001 55105:7ff8000000000001 58777:7ff8000000000001 62449:7ff8000000000001 66121:7ff8000000000001 69793:7ff8000000000001
mad_over_time - 1391 0 18084 1390 17 6552 ; 9672:430c6bf5263402a9 12264:430c6bf526340223 13203:430c6bf5263402b2 13490:430c6bf5263402ae 13829:430c6bf526340093 14626:430c6bf5263402ae 14857:430c6bf52634010a 15262:430c6bf52634010e 15364:430c6bf526340110 17882:430c6bf526340234 18563:430c6bf526340118 19058:430c6bf52634009a 19840:430c6bf52634002c 20014:430c6bf526340024 22145:430c6bf526340317 ;
mad_over_time - 908 6237 25555 907 1 ; 5017:8000000000000000 15745:8000000000000000 18176:8000000000000000 19196:8000000000000000 21385:8000000000000000 24225:8000000000000000 25668:8000000000000000 26998:8000000000000000 29764:8000000000000000 ; 25555:0
mad_over_time - 1000 0 17648 22 11 ; 10381:407b051b4a59f7c7 13336:4055e0967778ae39 18975:4004019faed0bd54 20137:7ff8000000000001 20804:7ff8000000000001 22821:40837636beb02645 23631:406e37e18c2e6e8c 24486:c0486a74fbbded22 27300:407f39d742b704a2 29186:7ff8000000000001 31215:4076e5a1d95306da 33982:7ff8000000000001 34046:7ff8000000000001 36761:c08e10acb69603c7 38154:7ff8000000000001 39556:c08e01e95f873259 40407:7ff8000000000001 41281:4082b0dd71d82983 42071:c06f5145088e47c0 43354:408e7f9c2170808d ;
mad_over_time - 1000 -1692 13078 713 11 13113 ; 7683:4060c2660da2cf3f 9467:406425886b854d96 12298:40657c8c29a7fa89 13708:4066ebda509c874e 15079:406b6d588582d905 17259:406d51e63eccd95c 19440:406d6713c561266c 19490:40702683f9f33320 21770:4072d7533d1851f5 22569:4073d3e0376634b1 25381:40740af2921f43be 27976:4076e60335559bb0 29941:407919fc1dbbccfa ;
mad_over_time - 862 0 22630 862 8 40307 ; 12305:fe37e43c8800759c 14059:fe37e43c8800759c 16257:fe37e43c8800759c 17106:fe37e43c8800759c 18534:fe37e43c8800759c 21518:fe37e43c8800759c 21941:fe37e43c8800759c 22052:fe37e43c8800759c 24928:fe37e43c8800759c 27273:fe37e43c8800759c 29716:fe37e43c8800759c 30145:fe37e43c8800759c 31909:fe37e43c8800759c 32321:fe37e43c8800759c 32355:fe37e43c8800759c 34645:fe37e43c8800759c 36933:fe37e43c8800759c 37430:fe37e43c8800759c 38976:fe37e43c8800759c 40970:fe37e43c8800759c 41336:fe37e43c8800759c 42033:fe37e43c8800759c 42968:fe37e43c8800759c 45038:fe37e43c8800759c 47555:fe37e43c8800759c ;
mad_over_time - 3021 0 10133 2225 9 ; 9142:430c6bf5263401fe 9434:430c6bf526340214 10008:430c6bf5263401d8 12471:7ff0000000000002 12727:430c6bf52634014a ; 10133:4006000000000000 12358:400e000000000000 14583:0
mad_over_time - 1000 0 36347 3818 8 ; 29180:40b2004ffcbaa679 32005:c213be06954860e5 32879:c072cd396ec6a3f7 33844:42a3a239b9617413 35389:c097bffc544f88ef 44264:409077994c56ec5c 45743:c047f8a3a675f624 45974:40a18b809a4ef6a7 48691:40750e1abb3ba7f0 49574:c1e9d7f834680883 52063:c0e6bf23ab506c71 52576:42c4b720f36026bf 53115:c100590666a592ba 54807:c1fedf477bfa6d5e 55383:413a080ebf749d4d 58180:c0f9b03ff8ceaf69 60194:41cf70ed1b8f463c 62184:c258ce5f90229cee 64986:c0dd99957b6b7d20 66245:c223881a6ec0d979 68299:42be96fcf0a0372a 69466:41daf1a882ef22b7 70964:42187a12fb07b837 72228:4187d77a0953444e 74570:c1eb82f17adbbf30 ; 36347:0 55437:41eee0e7fce664a8 63073:0
mad_over_time - 189 1526 4652 188 7 ; 6823:408cea991012abce 9112:40706f9e2554f57e 9253:c05f72607bd2d1b7 11726:c06a4cf1ec2af316 12508:c0833568354f15c6 ;
mad_over_time - 8883 0 8663 1200 14 18270 ; 9119:430c6bf52634015e 11842:430c6bf526340067 12329:430c6bf5263400e0 12732:430c6bf5263401f0 15529:430c6bf5263401a2 15987:430c6bf52634024a ; 8663:4035000000000000 9863:4035000000000000 11063:4035000000000000 12263:4035000000000000 13463:4035000000000000 14663:4035000000000000 15863:4035000000000000 17063:4035000000000000 18263:4035000000000000 19463:4035000000000000 20663:4035000000000000 21863:4035000000000000 23063:4035000000000000 24263:4035000000000000
mad_over_time - 2403 2959 3008 2403 2 ; 7965:c14fc5af15388a05 10771:c0b228b8ada995c3 ;
mad_over_time - 1000 0 7506 2834 11 9092 ; 10572:41abd9a2ea27f393 12331:c1700b612c739ee5 14065:4173f80a2082a98b 14544:4151efe5e8c09240 16404:c0e5b3847b418f47 17721:42407efebd883e51 18025:41af1188f803fe45 18640:42dfb23bd240563c 20624:414e7f522a2114af 22882:42b7bae972da4a4f 25029:40f9472148a275b8 26481:c0e277953ba0099e 28609:c1435ccf39fe15f3 ;
mad_over_time - 318 0 10855 318 4 17049 ; 13985:41116cc731c9385a 14754:40987e51efddbe3c 17512:41644fca24457f4b 20289:c10bafec9a253caa 23250:c119ba28fc076255 24590:c02912599a380d12 24786:c2e5ae5b85cf9ff7 27387:4070607e96205cbc ;
ts_of_first_over_time - 473 -3405 1786 472 18 ; 2476:c081709db0b9a1b9 3551:40846e32666d42ab 3940:40797b62e1bfa9b9 6628:40652ed8a83171c6 9377:c088e8f9ddbf6d3f 9813:c079b48a4fb070d7 10702:40885202eda81e14 13320:0 14626:c071fd592ac569dc 17010:c08a57c94aa45234 17654:fff0000000000000 20451:c08001d90fb89e89 23415:c05377e96b2a72cd 24668:fe37e43c8800759c 25075:4078c295af09d6c8 25079:c0792f0aa4e2a8d9 ; 3674:401a83126e978d50 6034:4022c10624dd2f1b 6506:4023a04189374bc7 7450:4025676c8b439581
ts_of_first_over_time - 4604 0 454 45 10 0 ; 2573:c0711c5e86318845 7608:c053d00f5cd6509b ;
ts_of_first_over_time - 7397 0 5043 3695 7 7468 ; 4252:42ba2e4a0af84b89 6087:bfaf336b7dc62a70 8038:424ff53886dbc0bd 8331:c25aa0bdfdc0918a 8415:c064e23ef9530bde 9292:4187a9ce0ce6cd99 11785:c2c12d2cf997b09f ; 5043:4011020c49ba5e35 8738:4011020c49ba5e35 12433:4011020c49ba5e35 16128:4011020c49ba5e35 19823:4011020c49ba5e35 23518:4011020c49ba5e35 27213:4011020c49ba5e35
ts_of_first_over_time - 6955 -3744 7605 3474 5 ; 10227:3fd83c5e59dc6bb0 11848:4027bcb35255b3cc 13046:403eebd9df50f176 15518:404d1d897c3f76c4 18158:4023313143f3cdde 19133:4045f8d1b6ded5a4 19707:405617e412e6f02a 21514:405ae06f5ca352ee 23460:40613a0453e43a96 25999:4066408028c16b1d 26312:40666e6ea897a8b6 26496:406b4c1852976ee8 28840:406d9fb2a049345b 31831:406f9f7fad427cca 34750:7ff0000000000002 45527:4071d26cc9b7c0f5 46563:40723a31863525a4 47176:4072c229e3cbe8e3 49097:4074c82a3fc0b9be 49611:4076abb507260723 ; 7605:402474395810624e 11079:402474395810624e 14553:4027b22d0e560419 18027:402f09374bc6a7f0 21501:4033220c49ba5e35
ts_of_first_over_time - 793 0 18824 792 18 ; 13920:7ff0000000000002 16504:430c6bf5263402eb 17772:430c6bf526340293 19259:430c6bf52634031c 20808:430c6bf5263402e2 21239:430c6bf526340004 24211:430c6bf526340283 25493:430c6bf52634026b 26586:430c6bf52634027b 29492:7ff0000000000002 30086:430c6bf52634028a 30564:430c6bf5263401f5 31065:430c6bf5263401c1 ; 19616:4033424dd2f1a9fc 21200:4034ced916872b02 21992:40353d2f1a9fbe77 24368:40383604189374bc 25952:40397e353f7ced91 26744:403a9604189374bc 30704:403e1604189374bc 31496:403f10a3d70a3d71
ts_of_first_over_time - 4661 4343 17167 2327 16 ; 5860:c183bddd564840db 6402:c1eefdfafff455c0 6524:7ff0000000000002 8735:c28e3948386c8a5e 10200:c03d7354ad62862f 10314:c0a83839818cb3c9 12244:c2239529c5e51c1e 14673:c2a30375a5ceb78c 15082:42491d38204b4e95 15245:4111425691df7d2a 17033:40486b434a8c6c43 19509:400acb44b571085e 19539:c0d82ddb19a5729d 21854:c180ea593f7ea85b 22420:41504c556f33b739 24119:40a26f1d0df10bc9 24779:c1e3aaaed64efb07 25434:417fbcdbddf93914 27985:c124113340717ad1 28886:3fa18265d43c4840 30573:c1751cc76f5d3533 36271:c177ece96db8c5ec ; 17167:40217851eb851eb8 19494:40287ced916872b0 21821:402d589374bc6a7f 24148:402e7d70a3d70a3d 26475:4033824dd2f1a9fc 28802:4035da9fbe76c8b4 31129:40366b851eb851ec 33456:4038c76c8b439581 35783:403bfc28f5c28f5c 38110:403e92b020c49ba6 42764:404222b020c49ba6 45091:404222b020c49ba6
ts_of_first_over_time - 7139 -729 6742 3566 19 22080 ; 8628:fe37e43c8800759c 8631:40565e8146d52a96 9676:c071f1094ff55d5d 10380:40875ea6e4922f49 12616:40738c589ff08260 14460:406eabc73cef4d35 17108:408995486e45b72b ; 6742:40311ba5e353f7cf 10308:40311ba5e353f7cf 13874:40311ba5e353f7cf 17440:40311ba5e353f7cf 21006:40311ba5e353f7cf 24572:40311ba5e353f7cf 28138:40311ba5e353f7cf 31704:40311ba5e353f7cf 35270:40311ba5e353f7cf 38836:40311ba5e353f7cf 42402:40311ba5e353f7cf 45968:40311ba5e353f7cf 49534:40311ba5e353f7cf 53100:40311ba5e353f7cf 56666:40311ba5e353f7cf 60232:40311ba5e353f7cf 63798:40311ba5e353f7cf 67364:40311ba5e353f7cf 70930:40311ba5e353f7cf
ts_of_first_over_time - 1000 0 63582 148 3 52352 ; 7376:c064d5bc421eac21 9595:c06e17c7a136b61a 10587:407750ae00999f12 12106:4060e2b3cdff3a18 12390:c07b3344421f6c38 14203:406c7195027d61d1 15713:40576aac42ef1343 16374:4086bf0c0fbdda5d 17189:c063a63a4c79888c 20115:c08002cc3d0a5062 20916:c060c0f72cd308e8 40394:4078dec57adf7a25 41657:7ff0000000000002 42391:4059732b6a1c8b71 45088:c05b9c7103d3fbed 47664:c079876d3e4c8045 48293:407783433f3f667c 51126:4081980f711808e8 52842:c0435da38840806e 75502:c088ee7b377ca3ef 76423:c0899526e85f314d 79206:40756af4c92ad8fe 80044:c084266b4d0a2a8e 80479:7e37e43c8800759c ;
ts_of_first_over_time - 4991 4746 12625 2492 1 17645 ; 9493:4058ab6d58d0de32 10926:40592f5d79580a4b 11773:405f68510cf7e6fe 13176:7ff0000000000002 ; 12625:4022fc6a7ef9db23
ts_of_first_over_time - 524 -3205 7670 523 6 ; 12251:4070bf8414bbae9b 12913:c15d1e7656ce6bd5 14754:4018c200e017e25e 17738:411c40314c4373a7 19865:4233b4ffe97486cb 21527:7ff0000000000002 21601:421e0e8131500c1b 41234:c284b6c283fd8d33 42444:c14aeeaba294426e ; 9239:40288083126e978d 9762:4029d374bc6a7efa
ts_of_first_over_time - 1000 3895 28979 1537 1 ; 16460:c08a3d9d5381547f 19146:c08a82577a2fd413 19157:c089e33fa710f2ec 19218:7ff0000000000002 19618:7ff8000000000001 21844:c0407a1841f7bcb8 23697:40811bd1c09dcba5 25925:4070565fc3dbfafd 26721:7ff8000000000001 26837:40673a442795aa07 29507:4064cf75c7cec691 30075:7ff8000000000001 32673:c066c6b8830bf2a0 34288:4088f0259b1c79d7 35551:c0735e946ba8a2e6 38402:c06aa2795a1143d4 40709:c08c62db4cc568c5 ;
ts_of_first_over_time - 478 -2514 8335 477 9 ; 2959:c07e51a73ee9a8c9 3459:408bf677f1c455f1 5476:4050cb2ed8db9c09 8241:c07b1571d9fdf87f 10389:c0778cdcc7a175e1 11403:c05e0a76b911c4bd 13496:c07eb6cb33777feb 15462:407074b1de90c19a 17684:4088e78adc590874 18477:c085c5b5769748bc 19492:406c1364014fffbe 19575:4074539dc7a59f6e 21162:4080d8b8899c084c 21493:7ff8000000000001 21994:c0818bb6499ab193 24671:407aaa277de8fa90 25504:c07188880c0cd967 ; 8335:4024c72b020c49ba 9289:4026ce5604189375 11197:402afdf3b645a1cb
ts_of_first_over_time - 1000 -2091 12977 633 12 21384 ; 8102:430c6bf5263402be 10144:430c6bf5263400e0 11423:430c6bf52634001d 11456:430c6bf526340208 11652:430c6bf5263402c6 12009:430c6bf52634016a 12115:430c6bf526340215 14599:430c6bf526340104 16982:430c6bf52634022d 17440:430c6bf5263400c8 ;
ts_of_first_over_time - 3130 2052 4577 3130 10 ; 4994:403fb121cbde0c22 5985:404d685783506e9a 7018:7ff0000000000002 8060:405a48b64b627b1e 8374:4061df250676bbeb ; 7707:4013f9db22d0e560 10837:4017f0a3d70a3d71
ts_of_first_over_time - 19145 4832 20670 812 16 ; 14571:c0852a6912799f0a 15889:7ff0000000000002 18656:408da45a85428e6c 20310:40759923277abe6e 21400:fe37e43c8800759c 21418:4081e29a666c50c3 21426:40878a51b36cf8af 23525:c08e962fca534289 24524:c0864133e2ceaa65 26727:40831b99306c560e 27879:c085cc66eb23a609 28206:c05527546d1dfabc 30630:405ec4a1ba88c177 30993:4063bce021baa00d 33357:c07ab4ce355d7303 35954:404a6a81118d1256 ; 20670:402d245a1cac0831 21482:402d245a1cac0831 22294:402d245a1cac0831 23106:402d245a1cac0831 23918:402d245a1cac0831 24730:402d245a1cac0831 25542:402d245a1cac0831 26354:402d245a1cac0831 27166:402d245a1cac0831 27978:402d245a1cac0831 28790:402d245a1cac0831 29602:402d245a1cac0831 30414:402d245a1cac0831 31226:402d245a1cac0831 32038:402d245a1cac0831 32850:402d245a1cac0831
ts_of_first_over_time - 3253 -5775 26939 1623 11 38505 ; 18838:7ff8000000000001 19300:407118c49280e63f 20818:c081958c99d50792 22682:7ff8000000000001 24251:c07a902e2a86218c 25797:405c265b3db195ac 26517:c08ac80b37d5aee9 29276:c07160775883fc69 29940:c06ee435955f87cc 31891:c089e0f253a1b32d 32495:7ff0000000000002 35033:7ff8000000000001 35131:c0872c0992b78866 37843:40725c9b3560d955 38301:c070dc9b7d6c057d 41138:4070191b42721f0b 42706:40890ba123c898c1 ; 26939:404491a9fbe76c8b 28562:404491a9fbe76c8b 30185:404491a9fbe76c8b 31808:404491a9fbe76c8b 33431:404491a9fbe76c8b 35054:404491a9fbe76c8b 36677:404491a9fbe76c8b 38300:404491a9fbe76c8b 39923:404491a9fbe76c8b 41546:404491a9fbe76c8b 43169:404491a9fbe76c8b
ts_of_first_over_time - 1000 576 18601 2097 13 19614 ; 18513:405bf6be89aee3fc 19159:4061ce2fb3e02f07 ; 18601:40328353f7ced917 20698:40328353f7ced917 22795:40328353f7ced917 24892:40328353f7ced917 26989:40328353f7ced917 29086:40328353f7ced917 31183:40328353f7ced917 33280:40328353f7ced917 35377:40328353f7ced917 37474:40328353f7ced917 39571:40328353f7ced917 41668:40328353f7ced917 43765:40328353f7ced917
ts_of_first_over_time - 6119 1528 17831 3056 20 ; 19240:c22158c8b6665818 19459:4180ff61103e0d7d 20150:40ac9f1204e9e340 20376:c2669a13b48b91e2 21510:c0640116a5983d37 21520:40e546fcbb26d956 22227:c1a484eb5445a085 24388:c17a51521c874b2a 25659:c23adbd09388929d ; 20887:40333d70a3d70a3d 23943:40333d70a3d70a3d 26999:403375810624dd2f 30055:40386353f7ced917 33111:4039a8b439581062
ts_of_first_over_time - 15927 0 2927 408 4 8735 ; 2468:7ff0000000000000 3082:7ff0000000000000 4094:7ff0000000000000 6258:7ff0000000000000 ; 2927:4003be76c8b43958 3335:4003be76c8b43958 3743:4003be76c8b43958 4151:4003be76c8b43958
ts_of_first_over_time - 15953 -5115 34250 2945 5 ; 11051:405814c34059a6c5 27412:405fd35bca6834ad 29186:40658c4f328b2dbb 31809:7ff0000000000002 32211:40660fbbfc087e1d 35066:4068d849f9f05dff 35528:406b4124615ed5ac 53934:406cb35727e7efd2 53947:40700481e05c96f0 56382:4019e4b100290d9b 57158:403f0e5caecb9059 57826:404fc8ec35db67c2 58303:40583f743e995368 60673:405c515f5b890527 ; 34250:403b6978d4fdf3b6 37195:403b6978d4fdf3b6 40140:40401b020c49ba5e 43085:40418872b020c49c 46030:4041c395810624dd
ts_of_first_over_time - 1000 -2615 11692 2958 13 ; 16219:c08d7c47688713c6 18128:c08cd09a12ebc247 20055:40840f571ff3c403 20700:7ff8000000000001 21406:c08d7cd094a70f60 23746:4059f9beae8b6061 25278:4079ac0e80fc0cbc 28210:408d22bb3b78dad8 28381:405fead01e6c206c 29848:4073f4d86d45b8ca 32364:c063a49ee786b26b 34874:7ff8000000000001 36544:40879dc2de667aa1 37975:c07742f31d55fd95 38290:407364acb5e43cd4 ; 17608:40340e147ae147ae 23524:4039472b020c49ba 26482:403c35c28f5c28f6 32398:40416fdf3b645a1d
ts_of_first_over_time - 7143 5280 29355 3568 13 ; 16334:406e9053b87cb0bd 19096:40868cd842ade8f5 20606:7ff8000000000001 21313:c088fdd40193ca06 24141:40822557485c9905 24683:c07dbae1123281b6 27476:c07d9f4687d03156 29046:4089c62f7a3caa6c 30247:4083ab1d4ede483e 31735:7ff8000000000001 33803:c076c2d3f703a829 ; 29355:4033189374bc6a7f 32923:40349b22d0e56042 36491:403824189374bc6a 40059:403d0bc6a7ef9db2 43627:403fbc28f5c28f5c
ts_of_first_over_time - 6175 9166 25247 2124 9 ; 29357:fff0000000000000 30661:fff0000000000000 31611:fff0000000000000 34493:fff0000000000000 36007:fff0000000000000 37387:fff0000000000000 39198:fff0000000000000 40946:fff0000000000000 43431:fff0000000000000 46027:fff0000000000000 48689:fff0000000000000 51333:fff0000000000000 51394:fff0000000000000 53408:fff0000000000000 54841:fff0000000000000 55056:fff0000000000000 56172:fff0000000000000 56305:fff0000000000000 58109:fff0000000000000 ; 40115:403d5b645a1cac08 42239:403d5b645a1cac08
ts_of_first_over_time - 1000 -8595 13798 580 17 ; 15140:c08218fc046a8225 15452:7ff8000000000001 17755:c0642c2e991b586b 18230:40816dd3897ff08f ;
ts_of_first_over_time - 437 0 6076 437 12 8280 ; 3305:c084d02d2923b529 5657:4070c076e4b31537 6359:c07871684163464c 9223:405d17a35c65d58d ;
ts_of_first_over_time - 85 -305 11036 85 3 ; 6246:fe37e43c8800759c 9110:fe37e43c8800759c 9200:fe37e43c8800759c 10446:fe37e43c8800759c 12562:fe37e43c8800759c 13720:fe37e43c8800759c 34563:fe37e43c8800759c 36916:fe37e43c8800759c 37782:fe37e43c8800759c 40549:7ff0000000000002 43040:fe37e43c8800759c 43142:fe37e43c8800759c 43697:fe37e43c8800759c 43745:fe37e43c8800759c 45382:fe37e43c8800759c 48289:fe37e43c8800759c 49324:fe37e43c8800759c 57849:fe37e43c8800759c 60127:fe37e43c8800759c 60419:fe37e43c8800759c 61038:fe37e43c8800759c 62043:fe37e43c8800759c 62909:fe37e43c8800759c 63122:7ff0000000000002 64335:fe37e43c8800759c ;
ts_of_first_over_time - 4035 -3132 7614 3386 1 ; 6292:430c6bf526340061 6723:430c6bf526340141 7801:430c6bf52634011e ; 7614:401ae45a1cac0831
ts_of_first_over_time - 11024 0 10214 531 1 ; 13029:406044b35291d450 13388:406382999c441219 14057:4063d212627dfd34 34060:4065c4a0417b8d78 34098:406b8d8b46642678 35617:406fec60278dfaa9 37076:407242d9df1f3f64 37094:40744a6052453aa1 ;
ts_of_first_over_time - 158 0 71924 157 14 ; 10106:7ff0000000000000 10719:7ff0000000000000 12576:7ff0000000000000 12862:7ff0000000000000 15737:7ff0000000000000 16094:7ff0000000000000 17246:7ff0000000000000 19360:7ff0000000000000 20200:7ff0000000000000 22497:7ff0000000000000 22558:7ff0000000000000 22688:7ff0000000000000 24322:7ff0000000000000 46310:7ff0000000000000 49273:7ff0000000000000 50648:7ff0000000000000 53011:7ff0000000000000 53945:7ff0000000000000 55866:7ff0000000000000 77831:7ff0000000000000 ;
ts_of_first_over_time - 3314 2509 2057 1493 16 ; 2091:4073d832548627ac 2104:c08d057ede9ea011 3859:7ff0000000000002 5470:c072bb90d914eb8e 8011:4065ddbca7435af4 8345:c07767606073f3ea 8987:c0893f7283e9a250 11539:408b753c2a79b79d 13167:c04b31c423c4c412 14564:c08e08fd2a1e6221 16114:40804d209d62a97d 26134:40813fbbd35e4e8f ; 5043:4000ba5e353f7cee 6536:4000ba5e353f7cee 8029:4015e147ae147ae1 9522:4015e147ae147ae1 11015:4015e147ae147ae1 12508:402005a1cac08312 14001:4020b0a3d70a3d71 15494:402713f7ced91687 16987:402713f7ced91687 18480:402a55810624dd2f 19973:402d20c49ba5e354 21466:40301d2f1a9fbe77
ts_of_first_over_time - 7701 -2866 10133 1695 8 7543 ; 5557:408cec9618a7647e 7025:fe37e43c8800759c 9442:c0865af1a7afa5e5 12034:40871bbb61e1af25 13220:c08b63e2e53a8e8b 15803:c08bbaac6d6103f4 17646:7e37e43c8800759c 19959:408c4bf88ab67324 21228:c0811331387e9a17 22730:7ff0000000000002 24032:bfec3b876418eff0 24957:408cd8243497e3f4 25567:c08e37ef75186e2c ; 10133:40163a5e353f7cee 11828:40163a5e353f7cee 13523:40163a5e353f7cee 15218:40163a5e353f7cee 16913:40163a5e353f7cee 18608:40163a5e353f7cee 20303:40163a5e353f7cee 21998:40163a5e353f7cee
ts_of_first_over_time - 4981 0 49513 2487 1 ; 17409:4085fd881d5862b3 20258:7ff0000000000002 21923:404ce93a1449af02 22259:4083052297cb410c 23719:c083574dcb495ea6 24180:407e3c9f67790755 24724:406c5aea93b565d1 27564:408eeafed6e4d1dc 46434:c08f004bc1a09b84 49144:c081e09da7960f80 49587:407a9475037a8e8e 51507:c07b4c6a8ded9ecb 53692:406802b2bbdff6a7 54293:7ff8000000000001 55656:8000000000000000 ; 49513:4047378d4fdf3b64
ts_of_first_over_time - 2290 0 18293 2290 5 12087 ; 16498:c0807f062948910c 17383:406279a8cd531418 17881:c04545096f632571 18501:408c2f88ed143497 19424:407d8a1b57d93329 20619:c0681dcf90547350 20941:405f560fde96f0a5 ;
ts_of_first_over_time - 1238 -1434 19836 1238 16 ; 11000:7ff0000000000000 11021:7ff0000000000000 11219:7ff0000000000000 12863:7ff0000000000000 14903:7ff0000000000000 16766:7ff0000000000000 18619:7ff0000000000000 21588:7ff0000000000000 21735:7ff0000000000000 ; 21074:403596872b020c4a
ts_of_first_over_time - 1105 0 23807 549 6 ; 21519:c07bde3027dbc509 21544:7e37e43c8800759c 24508:4064185dbd970bbf ; 24905:4038820c49ba5e35 25454:4038820c49ba5e35
ts_of_first_over_time - 1000 -2450 50146 766 19 ; 9330:c08c15ebff29ba66 9492:4065f03b6a855a7c 10721:4074d9a76fe22486 29089:4075f664e9d52dd8 30053:408afa08981791eb 31716:408699c074022400 33774:c08d3671bc638728 34265:7ff0000000000002 37035:c05778353e215116 39795:c08de4856f0617e4 40801:c075bc92728e6bc9 41605:c078f4daff32ee90 44206:c08036525242465b 45814:c0885e2fe0eeaca5 65007:c055f30ca14f3836 67448:c06a20dfe5ac021e 68516:c06371a75fc12b9b 70402:40847066ee91dbf6 89008:40626544aecf0962 89977:c0857ddb52f8597a ; 63168:40504072b020c49c
ts_of_first_over_time - 5671 0 33988 2832 20 23629 ; 14015:c079a973bfb89cfa 14376:405dfa95cb8408e0 16761:c07f76e1bd4e7178 19017:4071df87e4938b6b 20118:fff0000000000000 22026:c08554c90f1cf14b 22049:c08adce0a59ac989 22307:c0771a5e10e58ded 24796:40619d8dc71707df 26104:c0740631d6716e6c 27209:407f3c65f43bbb37 28187:408aec35850ca6c4 30372:c07c4e639bebdb53 33156:40862d112d076317 33961:c08540e744060eef 35408:4086203726c16b4e ; 33988:4033045a1cac0831 36820:4033045a1cac0831 39652:4033045a1cac0831 42484:4033045a1cac0831 45316:4033045a1cac0831 48148:4033045a1cac0831 50980:4033045a1cac0831 53812:4033045a1cac0831 56644:4033045a1cac0831 59476:4033045a1cac0831 62308:4033045a1cac0831 65140:4033045a1cac0831 67972:4033045a1cac0831 70804:4033045a1cac0831 73636:4033045a1cac0831 76468:4033045a1cac0831 79300:4033045a1cac0831 82132:4033045a1cac0831 84964:4033045a1cac0831 87796:4033045a1cac0831
ts_of_first_over_time - 1000 7398 49705 1895 6 70146 ; 1736:c06622448623d9d2 3144:c03992a0946ed14a 4561:407e3954adc376a7 7397:7ff8000000000001 8217:407f4d414a76240d 10199:40771f20171bdb8e 10910:402248aa727cb25e 31935:c072ba0c0c64f258 34166:c021c869a665684d 35477:407ee5a3b167bafd 37337:4079909862c10428 37632:408b2764a981255d 40072:405bce5c55c70c58 42020:c08794d47b688974 44053:c089ba8241701418 45075:c05824c9919f08ff 46613:c08e8c0bfd5057c2 47777:408e0d075727c1ea 68221:408c20838414e994 70655:7ff8000000000001 ;
ts_of_first_over_time - 651 -4827 5839 322 1 ; 9915:c07e313d819838a4 12649:408923c1c6b9fc65 15354:c065b06b5c152943 17847:40719e8ce49b883a 27417:408f2c9ea06d47fa 27904:40572385236944d6 30549:c0782a8f10da353a 31831:40699cea713468c4 32787:407ec54b16ab3f30 33911:7ff8000000000001 34338:c07e5ba30f413638 34801:c088ad13207710b0 36314:40831fbcd6635000 ;
ts_of_first_over_time - 76 0 43313 75 13 14984 ; 9443:404340f1d1713bc3 12256:404c233e383c9f59 14225:4053e654c82a3258 17009:4059c6aa81f59fa7 19746:405dc7708a9927f2 20793:400b510defe30488 22938:403e916c443cc131 25371:4053bee790b11596 26242:4058b347455cb38a 26917:40624633793fab08 29372:406379093c2bbbd6 31807:4065055621ce71ab 33185:4065b4286c5d5f16 36004:40698f3ab6381a1a 38313:406aee7886195d7a 40818:406fdedf6021a80f 42673:40720b1cac4a38b9 45043:4072fde709515ff0 48010:40752a5e95ba67dd 50516:407556f33bfb4587 51234:40776ffcf5200925 52839:407a852b14ec2932 ;
ts_of_last_over_time - 1000 0 3305 1247 16 17917 ; 2348:7ff8000000000001 4976:c080dae449bf7517 6841:406a3fcef97db3a7 7788:c08d622306ecd282 9870:0 11858:408d7a2965b57000 33022:c0643f35c7b96968 ;
ts_of_last_over_time - 2513 -1607 31285 2512 20 ; 10841:40627640f691f960 11633:c06c2019a8335478 12564:4087fa5604871df2 13580:40511b0ee6c1180b 13926:c082335856461557 16007:408e20d5c716e87e 17665:c0880ba5f5d036c1 20652:4087d1dfdfb5ef4d 21362:4083cd80d1015f5f 21703:407aadfe920feae7 23822:c06c466b1872b3d0 26154:7ff8000000000001 26971:c08ccb0d9e9ada92 27719:c080538741729450 29698:7ff8000000000001 31597:7ff0000000000002 32289:4045f12687f3619e 33582:4085d5f34e512616 35606:c08dc2ecfc5c0e36 35649:c08a2ccb47f4e2a1 35859:7ff0000000000002 37698:7ff8000000000001 38865:4088fa03dbe8f606 39051:4088f17fe2cfb0c9 39760:7ff8000000000001 ; 31285:404024fdf3b645a2 33797:4040ca7ef9db22d1 36309:4042d95810624dd3 38821:4043e147ae147ae1
ts_of_last_over_time - 2916 674 15510 2916 3 ; 13117:7ff0000000000002 14908:430c6bf526340121 15992:430c6bf526340002 16228:430c6bf5263400eb 17826:430c6bf5263400d7 19820:430c6bf526340112 21208:430c6bf526340088 22927:7ff0000000000002 24079:430c6bf526340259 26523:430c6bf526340084 ; 18426:40303a5e353f7cee 21342:4033d1eb851eb852
ts_of_last_over_time - 18242 -8487 62576 3720 16 15828 ; 18719:42de7ec376ac8443 42403:41852d8dd68fc1ac 42791:41a247fae4f76fed 44435:4170988d666cd156 54863:4258ba50f4a3a7bf 57638:c073aab0adef2c9d 58268:419e5ecca31645c3 59940:4248a7d0abff1c26 60807:c2b1eb5c9590d064 61237:4121039ea1fecb17 62742:428c4d6a42b54ba0 ; 62576:4032b810624dd2f2 66296:4032b810624dd2f2 70016:4032b810624dd2f2 73736:4032b810624dd2f2 77456:4032b810624dd2f2 81176:4032b810624dd2f2 84896:4032b810624dd2f2 88616:4032b810624dd2f2 92336:4032b810624dd2f2 96056:4032b810624dd2f2 99776:4032b810624dd2f2 103496:4032b810624dd2f2 107216:4032b810624dd2f2 110936:4032b810624dd2f2 114656:4032b810624dd2f2 118376:4032b810624dd2f2
ts_of_last_over_time - 2161 0 19770 811 7 858 ; 4592:405fb87a7b69e6eb 7012:7ff0000000000002 7605:406215ae88d280d1 9000:406792998a43af57 11530:406cf2f762bde153 14276:4070124e7da85267 15450:4070ca9891bc6f69 16237:407304befafdc6e2 18306:4074c04a07ddcd48 19479:40770933180da988 21666:4077a8d807f3e7af 22033:40791f70e1d6d638 ;
ts_of_last_over_time - 183 6037 41429 183 20 ; 12243:4059c693c1eb4a17 12642:405d23f29bb2d1a6 15616:40613dad27ee3597 16087:406193a00528c3bf 18162:4067b3a688666de9 19880:4069129e5955b5eb 22433:406957ecb8a6e292 22575:406c72ec4dd06e0e 23762:401e92e389a6fa63 25279:403994015778f000 25489:404d0e8e0927e77c 27630:7ff0000000000002 27761:405aa7c50a3744a8 28353:405be96f9e1eb100 30335:406005aa75e8ef76 31429:4023d2c498402ea2 42317:40474a2d4a356490 42683:40476de05891e632 42700:40232675940e0ddc 43444:4046502bc9359b8f 44650:40482def3b7a9189 47237:4057e797342cf320 48633:3ff52c7a14fdffb0 50654:4043725b051b0ad0 ;
ts_of_last_over_time - 1547 6214 14948 1546 17 17145 ; 15288:fe37e43c8800759c 17488:fe37e43c8800759c 17737:fe37e43c8800759c 18717:fe37e43c8800759c 18914:fe37e43c8800759c ;
ts_of_last_over_time - 1000 3924 10772 3475 12 ; 13698:c11a4c413979567e 14129:4184d57daebb0c0c 15125:c1147b2483eecc2d 15920:7ff0000000000002 17745:40d9f2f7bde44f48 18290:3fb245bd807e70d8 21288:4213ae69d9135ac9 23243:7ff0000000000002 24410:bfd745d65a070b41 26296:413eca0ce8a31ce1 ; 17722:402b65604189374c
ts_of_last_over_time - 1000 -1716 17833 3503 14 ; 10624:405ab2f708075e38 11032:40633a0aceda3ae7 11129:4067a94a19629566 13035:406905ceee480116 15859:406bd81073573559 16477:7ff0000000000002 18920:4070e4e954eb36e3 21439:4072c61b8510dd49 23173:4075b9da689e080e 25323:407660438b9763f8 27115:40786edaf37186d7 29340:407afaebe2022e9e 31550:407b4b2826c9093d 34547:407b66cac23ea04e ; 17833:4032eb851eb851ec 28342:403d570a3d70a3d7
ts_of_last_over_time - 3330 0 -2508 3329 10 22079 ; 2146:40872e44c540ef1c 3694:c05cc1b6a1bbb56d 4418:c084ca49f6594f7f 7047:7ff0000000000002 7947:c066aa09043d5bfd 10881:407e387d00199264 13550:407b5cfafc5f7dbd 15483:408e5bd6549ddb81 16967:c0668f575cbaefed 18898:408c04ca733e8d67 20117:c071b8c41e0c4b74 ; -2508:40341df3b645a1cb 821:40341df3b645a1cb 4150:40341df3b645a1cb 7479:40341df3b645a1cb 10808:40341df3b645a1cb 14137:40341df3b645a1cb 17466:40341df3b645a1cb 20795:40341df3b645a1cb 24124:40341df3b645a1cb 27453:40341df3b645a1cb
ts_of_last_over_time - 416 0 4006 416 11 0 ; 1507:7ff0000000000002 1802:c0896d9d12e3bb0a 4586:40817b68b91cfe07 15118:408685076e4de757 ;
ts_of_last_over_time - 3024 4039 40281 271 13 ; 15237:c04414eb231505da 15314:42b8b78461d7fe8b 17176:40438bb6581ac80b 20089:416c707b8e06385a 38654:c030500397640bbc 41161:c167786cdc31df29 46551:c230e72fc6dd4cad 47061:c05c7da0d4c92681 47764:c163f6d2af5c8621 50362:c0a26ac46035e2ca 50587:c0aa1076f9d911d0 52534:40a63249acc3e927 52760:411e32bf5675e64d 53551:4115215e276ebadc 54881:bfeadaecba9970c2 56831:c22d79b3bb650af7 59407:40e609cf1b56a0d4 60934:3fd93f55aeef151a ; 42720:404353b645a1cac1 42991:404353b645a1cac1 43262:404353b645a1cac1 43533:404353b645a1cac1
ts_of_last_over_time - 3208 -1475 52624 3207 14 ; 16171:c069ea9815b3208d 16359:c08313d55ee94dd5 17993:c07ac16d4a85c5da 18643:40791bc9fafafe07 18790:c0835094b2a98edd 20670:407fc189813ae0b1 22670:c085a890e829a4bf 42286:406e1206f57781ef 47411:c08ca4ffa34773bd 48148:c086b3455fd832ab 48976:c0726594b11bd904 49143:c079c5e75a71b773 49567:4064cc8832a9890c 49817:c0660789778f6914 49898:7e37e43c8800759c 50290:c08aeb8d63ddde24 53271:40768166586292e7 54738:405bbf2ae9d55845 ; 52624:404aa2b020c49ba6 55831:404b5e76c8b43958
ts_of_last_over_time - 3292 0 14287 3292 13 6076 ; 5154:c08a301ba2cfea63 5281:7ff0000000000002 7320:c057e7dde85d2820 8617:4053a83e89c9f948 9580:408bf043d6edc825 9784:c0449f8b49a87f28 12035:c08173c64830266f 14446:c079cfef2195b5bf ; 14287:40149db22d0e5604 17579:40149db22d0e5604 20871:40149db22d0e5604 24163:40149db22d0e5604 27455:40149db22d0e5604 30747:40149db22d0e5604 34039:40149db22d0e5604 37331:40149db22d0e5604 40623:40149db22d0e5604 43915:40149db22d0e5604 47207:40149db22d0e5604 50499:40149db22d0e5604 53791:40149db22d0e5604
ts_of_last_over_time - 1409 1188 39188 1908 17 5746 ; 6485:c280f04d46c7ca12 7422:417e7a21692f9127 9628:bff0f5b61483440a 12626:c205613ff05d4212 15380:c2ddd02cd2a00e24 18214:c00dfb1805e9ba1e 18714:414e0e61a392b0dc 21288:c0480010d699347e 22712:c1ba176f65b9bd13 43569:42e15e2c6b40fbcb 44188:c2217ddb0834778c 44627:c0e41ff4710aee12 ;
ts_of_last_over_time - 6876 4803 3441 48 20 2425 ; 3200:430c6bf5263400db 5149:430c6bf526340083 ;
ts_of_last_over_time - 336 9262 27511 336 8 ; 19827:405f582c1dcc80a2 22143:4063c0fee09e72b4 24530:4065a8b28b2ff285 26189:4068961d06d64cf7 26936:406d849e4c1541e0 29063:4071cbb6b546048a 29688:4072b169c61dd83e 29762:4074fdb9c5ceecda 30718:4075dacb49586ee2 ; 29191:4033d3b645a1cac1
ts_of_last_over_time - 121 0 19960 121 17 2677 ; 6147:c060be47aa8e9d1c 30396:c069b741e0263ec5 30409:4066875b1bb85bce 32045:407c71f818577b86 34447:fe37e43c8800759c 35501:c0758130102fd648 37876:4076475adde25075 39523:c08b06d203f1b166 42059:c046274cfdbd0750 42872:c082425ffbb9d068 45663:c08abd3b89edcfd0 48365:4089f552ac119b74 51125:4088a2597971e027 51528:c0855a533fae239a 53460:0 54463:c0721f7acb1b08b5 55704:402621269fd98873 58162:c080d1286d121082 59154:c086abc9e2e6fd59 59303:0 59540:408710ca1b090658 60545:c061326b5a2efde7 ;
ts_of_last_over_time - 1803 0 17887 1803 10 ; 14359:c081c8e662287ec8 15082:c064012348d6f925 18011:408e02e5ad0a3ec8 19502:40779cfaf6bb6202 21661:c07d995eb1172d16 23017:408bf4260e4e465c 23217:40827598687aa2fc 23685:c06562113022ee68 26472:408b6a06375f29c6 28859:c08b802e6efe8ad8 30467:c08c54f3c7e9456d 31634:4078dc325b2ccda4 34615:4085aed6cdda6bee 35693:4064211e19c02608 36931:408a063c56addd1f 39733:408d892d8a683982 40056:407c193d8703fd80 40806:c06e58f436a911d0 42201:c085445991fac7a6 42429:4076eb09fbe71810 44006:c08e2961306919ed 45339:4063a265399700db ; 19690:40338083126e978d 23296:4037378d4fdf3b64 25099:4037af5c28f5c28f 26902:403a78d4fdf3b646 30508:403e778d4fdf3b64 32311:403fa24dd2f1a9fc
ts_of_last_over_time - 3329 -3231 1938 3143 10 ; 1667:430c6bf5263401d0 2348:430c6bf5263402b2 2928:7ff0000000000002 ; 1938:4002c8b439581062
ts_of_last_over_time - 1174 5572 27710 1174 4 62764 ; 17793:c08abcb277393620 18440:7e37e43c8800759c 18582:408854a428144fa9 39324:c08ac8de7946b01f 39342:4082ed0c6268674f 40784:c08d3fdf1b7d46e0 43398:4088cf3d9af8e61f 43912:c07bbe2df2cd328e 45227:403f4fc44b94fc36 45790:7e37e43c8800759c 45821:4088339079148974 46052:404f9ab748b88764 53886:c04762f5d8b884a3 56858:408a0a7e019ce670 59686:c0828c1ead484bf2 60257:fe37e43c8800759c 67544:408ecf5311fa618b ; 27710:404c6dd2f1a9fbe7 28884:404c6dd2f1a9fbe7 30058:404c6dd2f1a9fbe7 31232:404c6dd2f1a9fbe7
ts_of_last_over_time - 19528 0 29960 1812 9 35296 ; 2650:3fcd7b1ed0e1c008 5509:c1f3168ed325a07c 5962:420009a08a1d30b7 15556:40d40230c434783d 17579:c2c17137e521f749 18487:407c2d34440dee8e 20410:c1c530ca61caf30b 22476:4267c596691515cb 23882:42839c6149a58960 26235:40428af8c9936813 27909:4077c8db98a69b27 28642:c28c17fa3f5dae81 30303:c2fc4567721c6a32 32854:c2c0706c145a90c6 33598:41d00422b33afa5b 34296:bfda871c676efacc ; 29960:404125e353f7ced9 31772:404125e353f7ced9 33584:404125e353f7ced9 35396:404125e353f7ced9 37208:404125e353f7ced9 39020:404125e353f7ced9 40832:404125e353f7ced9 42644:404125e353f7ced9 44456:404125e353f7ced9
ts_of_last_over_time - 3924 0 19343 3923 5 ; 17916:430c6bf52634006f 20379:430c6bf526340045 22920:430c6bf526340034 25069:430c6bf526340162 26101:430c6bf52634031b 28931:430c6bf52634027a 29490:430c6bf5263401e1 42442:430c6bf526340163 43457:430c6bf526340280 45235:430c6bf52634017d 46340:430c6bf5263401d6 48605:430c6bf52634018e 50948:430c6bf5263402df 53407:430c6bf526340091 55221:430c6bf526340125 55615:430c6bf526340156 57068:430c6bf5263402f2 57134:430c6bf5263400fb 58959:430c6bf52634011a 59679:430c6bf52634014c 60824:430c6bf526340206 62368:430c6bf5263400b0 64714:430c6bf526340231 ; 19343:4031ea7ef9db22d1 23266:4036eb851eb851ec 27189:403a19db22d0e560 31112:403d7d70a3d70a3d
ts_of_last_over_time - 2070 -7975 16745 2070 2 ; 8956:fff0000000000000 10228:fff0000000000000 10547:fff0000000000000 10630:fff0000000000000 22816:fff0000000000000 24918:fff0000000000000 27162:fff0000000000000 28947:fff0000000000000 30118:fff0000000000000 30400:fff0000000000000 31197:fff0000000000000 ; 16745:4036d0e560418937 18815:4038eb020c49ba5e
ts_of_last_over_time - 1000 1948 20190 2743 4 12321 ; 13694:4088cbe147723326 16433:40697593bd8776aa 17488:c0850751363257ca 18164:408bcfed6b577dd9 21060:c07ae183f191c914 ;
ts_of_last_over_time - 4181 0 19294 2087 10 ; 12693:40768029880dc2c9 14130:c08a001e27cf19cb 16014:405713b31aa803ae 18541:408dc0b4173899ce 19114:408cf7b2db6e2269 21249:4081994fcda42149 22951:407221bd8a4c8ae5 25652:c082019c70ca64ce 26760:c039424ee8e95b7d 28956:c06ad3e014dd9c76 31584:c073e121607658bf ; 19294:40331d2f1a9fbe77 21381:40353fbe76c8b439 23468:4036f374bc6a7efa 25555:4036f374bc6a7efa 27642:403ac28f5c28f5c3 29729:403cf4bc6a7ef9db 31816:403f95810624dd2f 33903:403f95810624dd2f
ts_of_last_over_time - 18901 0 12839 3178 17 ; 15674:4044dd684682dc68 17804:404a1bfba4e8011b 20167:4052631e49c7557b 22696:40588be7b3a57ea0 ; 16017:402f5916872b020c 19195:4031cdd2f1a9fbe7 22373:40342ac083126e98 25551:4036b22d0e560419 28729:4036b22d0e560419 31907:4036b22d0e560419 35085:4036b22d0e560419 38263:4036b22d0e560419 41441:4036b22d0e560419
ts_of_last_over_time - 6955 7575 30138 3474 4 44752 ; 25891:4051e3f84b2eecb0 26207:4057e360afdbae6e 28274:7ff0000000000002 29686:4060b310eabab698 30362:4061227b9993435b 31505:40673e81f44e0b8a 32215:40683c1796cc8112 32855:40104f4ae2336c2d 34705:4043cf80fcdc681e 35710:401aa5f6d46bf855 36772:7ff0000000000002 39433:4035bce7fffd6e4a 41449:403677ed313c28af 44378:404a2827e180ff3a 47084:40536c59537391d6 49765:405b29d58625d1b9 52061:40048108e285af6d 52153:401cd6f4ca443f0c 52770:4032dbd22a292222 54601:4014d219cb234625 56408:4024249ae4d240fc ; 30138:4041dae147ae147b 33612:4041dae147ae147b 37086:4041dae147ae147b 40560:4041dae147ae147b
ts_of_last_over_time - 2470 -203 54726 2469 4 40214 ; 18655:c0606c546db29c16 21576:403a2f4dc7b1616f 24064:7ff0000000000002 24277:c05f55850d6a329a 25682:c23b060a0f075ff6 25826:411bd739970db154 26863:c1f0bfba3e314397 28904:c21a003daa85da71 30266:40a6d600082f73df 33038:403b5a33c4870b63 35074:bfa51236f8ffc090 41450:41cfc89262bff1ce 41683:4288bc07190c6952 65409:c274b61a000976ca ;
ts_of_last_over_time - 1000 6852 46221 54 10 55331 ; 34070:c20283da2da8069f 34668:404342b92aa403bf 36172:4213e1d1d04992ae 37260:40a77bcd03173f7c 38006:7ff0000000000002 39307:c2f5193bbbc53a35 39336:c2064ef28b890d09 41480:c0d051453d4d5800 43880:41bc499c1b6a3e62 45808:7ff0000000000002 48530:bfc2580ed164cfd4 63769:7ff0000000000002 65567:42136413bf95f2ad 66481:42082d1c0696facf 67713:4258fe26850a1967 68545:c1638e51604c8c84 70410:c096fe60ea748c8f 70665:c11ec5a946205b5c 71758:4029a79f42cd6c6e 74203:c0ae931186938f79 76261:c0a06d5c35b52c20 79057:c1873bdf31d45ec2 81487:c0e295497af2afb2 ;
ts_of_last_over_time - 327 -8225 6559 326 20 12706 ; 10763:7ff8000000000001 12376:4087b8ce8c97f32d 14156:4082bb8501c6ba2b ;
ts_of_last_over_time - 17399 1017 5856 3593 15 ; 7655:7ff8000000000001 8895:7ff8000000000001 9296:7ff0000000000002 9433:7ff8000000000001 9575:7ff8000000000001 9617:7ff8000000000001 10964:7ff8000000000001 ; 9449:401e9eb851eb851f 13042:4025ed916872b021 16635:4025ed916872b021 20228:4025ed916872b021 23821:4025ed916872b021 27414:4025ed916872b021
ts_of_last_over_time - 1000 0 19620 245 14 ; 4954:c0819fc943e9d4f0 7760:c08cd50325c3f5d3 9864:408cb947000b506e 29856:408872ade0b49703 32345:c061de7844929077 34140:c08c01b11dd2e3b0 35852:c089c91d9994c855 ;
ts_of_last_over_time - 19907 9522 19616 3044 2 ; 20133:fff0000000000000 22334:fff0000000000000 ;
ts_of_last_over_time - 1820 -9629 23883 1819 9 9043 ; 12755:7e37e43c8800759c 13026:4074efd4f43a0a36 15205:c06cd18541f68997 16864:4067012ad76be092 19470:c086ea660b9733e1 21709:c06d57bcff8495a8 22205:7ff0000000000002 22234:408604fd664712a1 24256:c062ed1912fce369 24346:4089f44332499d17 24477:406a9ec51f49fefe 25600:c076c3f840484fbc 28235:40846fc903e686ef 28968:408667de24346ade ; 23883:4030dd2f1a9fbe77 25702:4030dd2f1a9fbe77 27521:4030dd2f1a9fbe77 29340:4030dd2f1a9fbe77 31159:4030dd2f1a9fbe77 32978:4030dd2f1a9fbe77 34797:4030dd2f1a9fbe77 36616:4030dd2f1a9fbe77 38435:4030dd2f1a9fbe77
ts_of_last_over_time - 1229 7310 27643 611 8 33358 ; 21864:4057619fbb371b1a 22017:c0812245571788ef 23324:c059a64999346fa0 25681:406f90c273ba26c9 28476:c07faac25fc9be68 30523:7ff0000000000002 32464:c07f7032a6fb13ed 34695:fe37e43c8800759c ; 27643:4039ae5604189375 28254:4039ae5604189375 28865:4039ae5604189375 29476:4039ae5604189375 30087:4039ae5604189375 30698:4039ae5604189375 31309:4039ae5604189375 31920:4039ae5604189375
ts_of_last_over_time - 7381 0 17998 3687 15 ; 11746:430c6bf52634023a 14248:430c6bf52634017b 15013:430c6bf5263401f9 17023:430c6bf526340080 17426:430c6bf52634016c 17860:430c6bf526340140 19770:430c6bf526340068 ; 17998:4031dc28f5c28f5c 21685:4033c51eb851eb85 25372:4033c51eb851eb85
ts_of_last_over_time - 1000 0 22288 1255 3 37645 ; 6613:c063abbfdf0b08ac 6663:407d5f9dc4ceab25 6773:403a27854bf0d3ce 6893:407f4588d6dbc1a8 7306:40750d38db7fccb7 8362:4079fc9160e020f9 8517:c07a02db745f5d62 10850:408412b6d260ca1c 13380:40819e1ab0097a40 16170:40573f3a4fd48be8 16912:c08451be6276125b 26548:c08817f8f1da3ed2 27786:408e226f23cc7688 30392:c085a58211e49435 30827:c041c46b3cd2d0bb 33622:4079dc9769c3d620 35969:c08820cb620b7ba3 38514:c0607df791a04cb0 41155:c068ee6c80b8830f 42199:4028d85fd11d423d 44710:c08cfe3fbcbc48ef ;
ts_of_last_over_time - 1000 0 34805 2593 11 30568 ; 4142:c0742e33a851b131 6525:4056da2397b021f9 7145:405459791be29471 9802:405022de6f59815f 10586:c08ca649fb7e8351 13441:408ab63b55c9ecd5 16061:407ad9d9fc4dd852 17107:c08cfc61f53a5d29 19820:c073844a1a7c9690 20723:408a0ad6b6cbce86 20823:4084489f55ead8ce 21242:408147f0459e529b 22423:7ff0000000000002 24788:40878ebd9847a9d6 26851:4070a82dcfd35ea3 29306:7ff0000000000000 30213:c08c32adeb144e12 53779:7e37e43c8800759c ; 34805:403e36872b020c4a 37398:403e36872b020c4a 39991:403e36872b020c4a 42584:403e36872b020c4a 45177:403e36872b020c4a 47770:403e36872b020c4a 50363:403e36872b020c4a 52956:403e36872b020c4a 55549:403e36872b020c4a 58142:403e36872b020c4a 60735:403e36872b020c4a
ts_of_last_over_time - 1000 8129 12561 3893 19 10672 ; 14006:c2b945b21943c006 16398:41e6f9cdac5df67b 16784:3fbb08f7f32323d8 24876:c2e872742f69691c 27140:c14031d8e48c6bbb 28169:421a0b35ec08f608 ;
ts_of_min_over_time - 1000 0 10640 2543 20 8680 ; 9574:40348f5434569678 9695:40461c78a909c548 10576:40518bf96c09b916 12431:40546798ff51eeb2 ;
ts_of_min_over_time - 743 -9873 42140 368 13 74121 ; 11851:403b0d977cf3d75c 14152:403b261b2958b1c2 16845:4052eee38ec163f4 17378:4008361ae812211c 19563:404a3cf074033e64 19774:40522beed0679167 20798:7ff0000000000002 44377:405c9b84722af82c 46700:406146c4c768ecf1 46736:4063d32ac456ff5a 48824:40641f67203bd324 51255:406852073fe772db 51421:406ccc169f77fcbb 52642:406f63c4fbca434c 54527:40715e1f3f14c598 55351:40747a20019ae8bc 57523:4074ee4073647dca 58306:3ff96e312c44c395 78789:40259d8e15a103a9 ;
ts_of_min_over_time - 773 0 51480 772 7 ; 14884:c116952d4732ec4c 16578:42828e47d10d3024 17525:424d6779e62944d0 20072:4046272bf778a8ff 20395:c2c052223a27864c 21171:c1fcdf6498ca4706 21919:40cc1680760b911b 24914:c2913d4b1c46dc0c 25800:c1aa1ce1b8df7794 26652:c0c0a7926021040c 29058:411823597d26616f 38433:c1856bf04ef7b468 47566:40814e67cd514aa9 47803:42bc45db36a239c2 48424:c06245603750a8a1 48516:c18207dd15d0b31c 51135:41a43d158b9a6cc8 52392:403c8bfa2a2de204 55281:3ffe241ae186a676 ; 51480:40499147ae147ae1 53024:404a322d0e560419 55340:404ba3f7ced91687
ts_of_min_over_time - 1000 4246 49119 2289 16 ; 5414:40529cb2f7b67684 5746:4058cff1a7dd615c 7018:405f943adbf187f0 24197:405fe38ea2caa2fe 25364:4023a93450a29bba 26500:4035a44e5a28f126 28677:404b22cc00457f10 29220:4057de218605d950 32034:405d12ebf456aaa3 32207:4062b1e58224d226 33815:40679f890b5a603c 49244:406b347b15a8dd8a 51111:406f700a768736b0 51611:4070bc584cb346bc ; 53697:40489f3b645a1cac 55986:40498e353f7ced91
ts_of_min_over_time - 3721 -113 5497 3721 18 ; 5191:7ff8000000000001 7442:c0608a583aa8b0ec 8504:408c161e14cc4919 8878:c08e88a3fe47a5c9 10035:406f7b12981ed420 11235:c08deb4d32403010 12279:c08000d9b2617911 12610:c086e2000f1efae7 14595:408dab07842a3109 17253:40863f6479774ee1 18613:c0483f613439bcd5 21197:c06339531f2dd213 24035:7ff8000000000001 26241:c0811e55fc6736f7 27095:c08935259b5ab0ca 28626:c08a3026c64adb28 29794:c070d788310fd6db 30981:c0290937029ee3a6 32858:4073fa30feeb3699 33530:7ff8000000000001 34854:c070466d5b6392c3 35704:c07ab59b811df09c 36843:7ff8000000000001 55954:40650b44d2c26faf ; 5497:4014c395810624dd 9218:4021c189374bc6a8 12939:40267851eb851eb8 16660:402d30a3d70a3d71 20381:40329ced916872b0 24102:4035326e978d4fdf 27823:403b1851eb851eb8 31544:403ca04189374bc7 35265:40416d4fdf3b645a 38986:4041da1cac083127 57591:404bfa1cac083127
ts_of_min_over_time - 2306 -9062 70505 2305 6 69786 ; 12826:405140527835b83e 15181:40559ae43983ff62 17875:401f259e80159817 41382:403ef2ea99edb77f 43617:404c763af9c2acfb 45865:40570ba3181c1886 46094:405fb5c464006097 48459:406131e7551685e0 50289:406596bee0e6daaf 51072:4069bc46997056dd 53574:406e463c3cf35016 53832:4071b9ba388de789 70901:4074aa62d3f1bae4 73539:40752652f39ba31c 74562:4075c5656a80514f 75137:40771b89e0d57ab0 77456:40781200f7e7c127 78756:407899d780084b73 80661:407908795062ae96 82495:4079d383a68d2e64 83077:407a376e831b661a 84071:407ac4c4e7e6b325 84180:407d091a3abd64a0 86064:407e8e7487c32f9f 87016:4080d4b3f9eefc63 ; 70505:40535d2f1a9fbe77 72810:40535d2f1a9fbe77 75115:40535d2f1a9fbe77 77420:40535d2f1a9fbe77 79725:40535d2f1a9fbe77 82030:40535d2f1a9fbe77
ts_of_min_over_time - 2603 120 29622 2602 3 ; 19948:430c6bf52634027b 20508:430c6bf52634030b 22394:430c6bf526340093 24665:430c6bf526340137 26300:430c6bf526340069 26828:430c6bf52634023b 29501:430c6bf526340009 31827:430c6bf526340225 34225:430c6bf5263400d8 35105:430c6bf52634013d 36068:430c6bf52634010c 36642:430c6bf526340287 38626:430c6bf52634018b 39068:430c6bf5263400b2 41760:430c6bf526340311 42095:430c6bf5263402a9 43206:430c6bf5263402df ; 29622:403d804189374bc7 32224:403fd3b645a1cac1 34826:40411ccccccccccd
ts_of_min_over_time - 997 0 800 997 18 ; 4631:405f07608afce792 5541:405f74f45f7b4f2b 7003:40610be9b4933fcd 8020:40644e6332e4d2ce 9690:4066500341b9888c ; 4788:40128624dd2f1aa0 5785:401629fbe76c8b44 7779:401c03126e978d50 8776:40200a3d70a3d70a 9773:40236147ae147ae1
ts_of_min_over_time - 1000 0 29504 2553 9 29906 ; 11770:40061d1888af42ee 13118:7ff0000000000002 13426:c0138a1eb6d37e20 13526:c10527208420e878 15867:4184deb437564cb1 18378:40c22dd42ee5ca7b 19537:42d038a2a5769822 20221:c075da8ff24500ab 22848:42c533a52d633a68 24636:4131a493a894f5c0 25545:4006e4d45b246878 26428:411331314a1ae712 26664:4043a4198c52e14d 28932:c0903cbfc9ab5f21 29716:3fc5afd24c0fd7a0 30763:c21ae311885eaae9 30789:c2ecc6b2c302b53b 33405:bfc4d6cacc1ff648 34365:c2b218268992c298 35222:c03d6c0ef71c4d88 37392:7ff0000000000002 37428:42b20581fa164d92 37705:4170fcd0df5207da 38371:4073c964bf0ccbe0 38537:3fd88088fbb0b4c4 ; 29504:403cee978d4fdf3b 32057:403cee978d4fdf3b 34610:403cee978d4fdf3b 37163:403cee978d4fdf3b 39716:403cee978d4fdf3b 42269:403cee978d4fdf3b 44822:403cee978d4fdf3b 47375:403cee978d4fdf3b 49928:403cee978d4fdf3b
ts_of_min_over_time - 18663 3399 25375 1117 8 26355 ; 30207:430c6bf526340129 32738:430c6bf5263401ba 33540:430c6bf5263402cc 35277:430c6bf5263401fd 36500:430c6bf52634002e 36806:430c6bf52634031b 38390:430c6bf5263402d1 40735:430c6bf52634004d 43060:430c6bf526340022 43856:430c6bf526340142 45943:430c6bf526340261 47243:430c6bf5263402bc 49236:430c6bf52634006a 50320:430c6bf52634008e 50555:430c6bf526340206 52882:430c6bf52634009f 55248:430c6bf52634028c 57380:430c6bf5263400a8 ;
ts_of_min_over_time - 15490 7181 32213 1135 1 ; 2675:430c6bf5263402d1 5522:430c6bf5263400b7 6016:430c6bf526340301 6633:430c6bf5263402cd 7840:430c6bf526340048 10703:430c6bf5263401bb 13356:430c6bf526340198 15649:430c6bf526340269 16219:430c6bf526340051 18058:430c6bf526340029 19326:430c6bf5263400a6 19853:430c6bf5263402db 21240:430c6bf526340222 23070:430c6bf5263401fc 23426:430c6bf526340086 24905:430c6bf52634009f 26636:430c6bf52634010f 26831:430c6bf526340295 27753:430c6bf526340080 30587:430c6bf5263402f7 33542:430c6bf52634019e ; 32213:40320ed916872b02
ts_of_min_over_time - 3476 6835 45816 3475 7 53109 ; 7482:430c6bf5263400bf 8713:430c6bf5263401d0 10097:7ff0000000000002 11534:430c6bf526340087 13068:430c6bf52634001d 13936:430c6bf5263400d2 16207:7ff0000000000002 36887:430c6bf5263400ab 37081:430c6bf5263402eb 38171:430c6bf5263401bd 39226:430c6bf5263401e9 41493:430c6bf5263401b2 43311:430c6bf52634002b 67516:430c6bf526340099 70467:430c6bf52634011a 71785:430c6bf526340272 71874:430c6bf526340132 73483:430c6bf526340203 74756:430c6bf5263402d5 76633:430c6bf5263402ac 76894:430c6bf526340274 78340:430c6bf5263402cb ; 45816:4045a7ced916872b 49291:4045a7ced916872b 52766:4045a7ced916872b 56241:4045a7ced916872b 59716:4045a7ced916872b 63191:4045a7ced916872b 66666:4045a7ced916872b
ts_of_min_over_time - 18882 0 14212 3405 5 ; 9375:430c6bf5263401d9 10124:430c6bf5263401ea 12361:430c6bf526340178 14586:430c6bf526340312 15815:430c6bf5263402df 15944:430c6bf5263400d3 16421:430c6bf5263402b0 18022:430c6bf526340068 19902:430c6bf526340164 21803:430c6bf526340243 22492:430c6bf526340277 24434:430c6bf526340108 25150:430c6bf52634030b ; 14212:4028b8d4fdf3b646 17617:402fe353f7ced917 21022:403205a1cac08312 24427:403205a1cac08312 27832:403205a1cac08312
ts_of_min_over_time - 17040 0 18611 3286 11 ; 18016:c0493e6c1ff02c9a 19615:40852fc022355d1a ; 18611:403204189374bc6a 21897:403204189374bc6a 25183:403204189374bc6a 28469:403204189374bc6a 31755:403204189374bc6a 35041:403204189374bc6a
ts_of_min_over_time - 9114 -7736 22103 1316 11 26453 ; 24134:405da7dc2419108a 26418:405e86452f5bf0de 26963:405fccc38ef5019e 28865:400207785dd24efa 29775:404207b254703976 30432:404a916b84578290 30915:4051832b8e2899a2 31482:7ff0000000000002 33043:4059e8307083b0d2 34610:405a6f9f1c5a8489 34753:4061bb2ef8f31e3a 36320:4064d1960a6a2aed 38166:4067cc8e5b543e7e ; 22103:403cdd70a3d70a3d 23419:403cdd70a3d70a3d 24735:403cdd70a3d70a3d 26051:403cdd70a3d70a3d 27367:403cdd70a3d70a3d 28683:403cdd70a3d70a3d 29999:403cdd70a3d70a3d 31315:403cdd70a3d70a3d 32631:403cdd70a3d70a3d 33947:403cdd70a3d70a3d 35263:403cdd70a3d70a3d
ts_of_min_over_time - 2588 8981 523 2587 8 ; 3678:c0f542e66e4224c8 5218:4140c8c27b91ff80 6218:c00decb227d0f67a 6626:c14c4885c4c02ce3 8343:c0970bc9c43e2375 10481:c209fd67ba7a91fe 12278:41e2641130a6e3eb ; 13458:400d6c8b43958106 16045:401a810624dd2f1b 18632:4020af9db22d0e56
ts_of_min_over_time - 3948 6059 14629 3947 16 19973 ; 4729:40593693497751c4 6414:40625fe008e03ad1 6690:4067bd845cc04deb 9632:400cf527d7fe8576 10965:40486a487cbd9784 11979:40520ea6661fcbe0 12924:4003debdff928b41 14274:404342f65e9addca 14446:405065e1697efc14 15433:4053f193dd0420fe ; 14629:4029d916872b020c 18576:4029d916872b020c 22523:4029d916872b020c 26470:4029d916872b020c 30417:4029d916872b020c 34364:4029d916872b020c 38311:4029d916872b020c 42258:4029d916872b020c 46205:4029d916872b020c 50152:4029d916872b020c 54099:4029d916872b020c 58046:4029d916872b020c 61993:4029d916872b020c 65940:4029d916872b020c 69887:4029d916872b020c 73834:4029d916872b020c
ts_of_min_over_time - 9126 -9551 39076 677 8 25133 ; 6775:406bfcf09ce3f618 7222:c08c55b062a8ee2d 8756:c081cb6331ef3637 10820:c05ff1ca8607f88d 10993:407976336c245cae 12271:c082751cadf4166d 12298:7e37e43c8800759c 13637:c054d0add07d6b6c 15625:0 16912:c0810dae8250b3f0 19064:c08203f1d305359f 20181:c07273433ef2a1da 34929:407ff3caeb53bdc7 35958:c0821d3beb679bf8 36776:c0794d5809e297e8 39725:c07de9da42c81ae7 39755:4051209e7d3d6ff5 40848:406793de7592b44b 43419:c08788513f790ca2 43686:0 ;
ts_of_min_over_time - 1000 -958 73968 1222 4 ; 20523:430c6bf5263400b2 22478:430c6bf5263401bc 23360:430c6bf526340131 25573:430c6bf526340262 26496:430c6bf52634017e 28134:430c6bf5263402ba 29439:430c6bf5263402c9 30805:430c6bf526340116 31900:430c6bf526340115 55938:430c6bf52634004b 56454:430c6bf52634004a 57076:430c6bf526340284 58623:430c6bf5263400c6 80303:7ff0000000000002 83050:430c6bf52634000d 85581:430c6bf526340168 85893:430c6bf526340132 86135:430c6bf52634008d ;
ts_of_min_over_time - 3603 0 48527 3603 6 ; 17182:7ff0000000000000 19483:7ff0000000000000 19975:7ff0000000000000 21817:7ff0000000000000 22106:7ff0000000000000 23726:7ff0000000000000 26083:7ff0000000000000 26311:7ff0000000000000 28521:7ff0000000000000 31325:7ff0000000000000 34251:7ff0000000000000 35074:7ff0000000000000 37961:7ff0000000000000 52129:7ff0000000000000 53900:7ff0000000000000 55425:7ff0000000000000 ; 52130:404a1083126e978d 55733:404bb66666666666
ts_of_min_over_time - 15003 -8218 27137 3681 3 28256 ; 10720:7ff8000000000001 11437:7ff8000000000001 12692:408757bd7956eae4 15367:7ff8000000000001 16347:40887d7e14ba4464 18962:408b8de7f09c8195 21900:4051f219f9a7add5 23988:c079810b552181a4 26413:4080e9e013b0e293 27639:c07e93be14b4a006 29887:4037a568e3acae46 ; 27137:403ba395810624dd 30818:403ba395810624dd 34499:403ba395810624dd
ts_of_min_over_time - 1000 -4600 19818 3974 13 ; 21295:4081f1260ef4a2dc 23634:40861c25b0ae565a 25760:408b92bbb642a25d 25781:c07d0e257f5e14b1 27768:40877e96c733beb2 28350:408975767c229450 29719:4085af995c27fbd0 31586:c07d7c622f6b1ee0 31928:c08e76b110134a53 32232:c083f5ef1147e0ae ; 19818:4037a24dd2f1a9fc 23792:403bc49ba5e353f8 27766:403fed916872b021
ts_of_min_over_time - 6733 -9932 20399 3363 11 28044 ; 17088:7ff0000000000000 17424:7ff0000000000000 19030:7ff0000000000000 19594:7ff0000000000000 29328:7ff0000000000000 29733:7ff0000000000002 29931:7ff0000000000000 30585:7ff0000000000000 31975:7ff0000000000000 32234:7ff0000000000000 35170:7ff0000000000000 35336:7ff0000000000000 35760:7ff0000000000000 37135:7ff0000000000000 38071:7ff0000000000000 40274:7ff0000000000000 41759:7ff0000000000000 44221:7ff0000000000000 44886:7ff0000000000000 45819:7ff0000000000000 47741:7ff0000000000000 49620:7ff0000000000000 50080:7ff0000000000000 50961:7ff0000000000000 ; 20399:40429147ae147ae1 23762:40429147ae147ae1 27125:40429147ae147ae1 30488:40429147ae147ae1 33851:40429147ae147ae1 37214:40429147ae147ae1 40577:40429147ae147ae1 43940:40429147ae147ae1 47303:40429147ae147ae1 50666:40429147ae147ae1 54029:40429147ae147ae1
ts_of_min_over_time - 1000 -5226 3314 1766 20 36543 ; 5560:fe37e43c8800759c 7121:fe37e43c8800759c 8212:fe37e43c8800759c 9476:fe37e43c8800759c 10956:fe37e43c8800759c 11467:fe37e43c8800759c 13725:fe37e43c8800759c 15947:fe37e43c8800759c 16483:fe37e43c8800759c 16503:fe37e43c8800759c 18497:fe37e43c8800759c 19679:fe37e43c8800759c 21286:fe37e43c8800759c 22591:fe37e43c8800759c 46228:fe37e43c8800759c 48730:fe37e43c8800759c 51390:fe37e43c8800759c 51430:fe37e43c8800759c 52668:fe37e43c8800759c 53253:fe37e43c8800759c ;
ts_of_min_over_time - 3358 -6997 20392 3358 12 80671 ; 16464:0 17678:0 28809:0 29958:0 30006:0 32681:0 34936:0 37416:0 38844:0 41818:0 44707:0 67135:0 67876:0 69619:0 71596:0 96232:0 99012:0 101583:0 ;
ts_of_min_over_time - 2275 -2954 2921 2274 14 7471 ; 5161:c086e1d9a7b54bf1 6738:c07429acc74b9ba9 8268:40682e8524e2637c 11208:c0887ff92b42b684 ; 2921:402089374bc6a7f0 5195:402089374bc6a7f0 7469:402089374bc6a7f0 9743:402089374bc6a7f0 12017:402089374bc6a7f0 14291:402089374bc6a7f0 16565:402089374bc6a7f0 18839:402089374bc6a7f0 21113:402089374bc6a7f0 23387:402089374bc6a7f0 25661:402089374bc6a7f0 27935:402089374bc6a7f0 30209:402089374bc6a7f0 32483:402089374bc6a7f0
ts_of_min_over_time - 3240 1484 18354 3239 13 16622 ; 13595:421a9097298f97db 15484:4166b0826e0d745f 18234:42b980215367d0c2 18503:c2240035d1c3c19b ; 18354:402b30a3d70a3d71 21593:402b30a3d70a3d71 24832:402b30a3d70a3d71 28071:402b30a3d70a3d71 31310:402b30a3d70a3d71 34549:402b30a3d70a3d71 37788:402b30a3d70a3d71 41027:402b30a3d70a3d71 44266:402b30a3d70a3d71 47505:402b30a3d70a3d71 50744:402b30a3d70a3d71 53983:402b30a3d70a3d71 57222:402b30a3d70a3d71
ts_of_min_over_time - 1000 0 5994 2065 14 39433 ; 4905:404e72f89bdfbf02 5246:4052052b924c5031 7610:4059e8aca21cd7f3 9818:4061536354de4ae2 9899:4062012f7af72384 12768:406549a6f48654d0 27896:4066c69649bf0ae0 30233:406c63100698261c 30940:4070c29dba97ef7a 33194:4071a4ed5c760017 35226:407368ce02208eb9 37559:407512613835e174 39347:4076d50a2a13af38 41106:407878232349506b 43313:4079c92359889117 58383:407b693778b4fcfc 60565:407de2e2aba0898e 61056:407f43f9b1e07041 62594:408124e222d79d8f 63531:4082b0d1f16c00c5 ; 5994:4043ac6a7ef9db23 8059:4043ac6a7ef9db23 10124:4043ac6a7ef9db23 12189:4043ac6a7ef9db23 14254:4043ac6a7ef9db23 16319:4043ac6a7ef9db23 18384:4043ac6a7ef9db23 20449:4043ac6a7ef9db23 22514:4043ac6a7ef9db23 24579:4043ac6a7ef9db23 26644:4043ac6a7ef9db23 28709:4043ac6a7ef9db23 30774:4043ac6a7ef9db23 32839:4043ac6a7ef9db23
ts_of_min_over_time - 1000 -4684 25738 2447 5 ; 7807:405d0339221ef45e 9241:40632d0d22828756 9303:4065d0e6edc7ef6a 10017:406abf7a3a27d0ba 11354:402276f8d8d33b83 13301:40469a5b01b51d9a 15120:405024a149c35100 15897:7ff0000000000002 17767:40589f87a7843a52 19795:3ff3695f5b4d6e32 43852:4048e39635f42e7d ;
ts_of_min_over_time - 902 -3966 24597 901 2 ; 13826:430c6bf52634027b 16175:430c6bf526340165 17201:430c6bf52634020c 27073:430c6bf526340122 28164:430c6bf5263400d1 28549:430c6bf52634000e 30348:430c6bf526340081 30433:430c6bf5263401ad 31340:430c6bf5263402a9 34057:430c6bf52634017d 56910:430c6bf526340192 59674:430c6bf526340122 ; 24597:403c8c8b43958106
ts_of_min_over_time - 1000 0 8591 1098 13 7366 ; 12297:430c6bf526340059 12756:430c6bf5263402e8 ;
ts_of_min_over_time - 5662 -3079 20470 3908 19 ; 9847:4037441b8d60bb38 10292:c289617182f304ec 11842:4196b6dfadc531f6 12001:413701af00fbf44e 14955:425203db495fb38a 17256:424003549b84ec04 19143:7ff0000000000002 20312:bf7d801bbf5dac00 21180:c1b2584c8e0d1a09 23151:4130a021a3857e8d 23460:c2de50d13c1def62 23912:422ba74f346b09a9 24793:c2dd641f9dee6319 25467:42b29475143fb1f7 25471:428ed9105433cc26 26377:4082d75c5f7d516a 29358:410bf36808f9f239 ; 20470:403775c28f5c28f6 24378:403775c28f5c28f6 28286:403a6083126e978d
ts_of_min_over_time - 6575 -2311 27538 3284 12 ; 19192:c083d55e20fd197d 26695:4056c92c95c23850 28874:40802f86bf23dcab 29034:4087255e6f1c7991 29589:406818ac070465a1 29644:4085dc2c7da51135 29732:408a60d5ce347606 31313:4081cf066edd86a4 32130:408011c19ec6fd15 32236:c08991ebb9550a85 40602:c0841bf897d18caf 42525:c081bf4a14f05b19 43272:c035816eab0e7a4c 43466:bfb77284b0f55a00 44525:c08a68ee472d083d 45848:408386cb507cba9d 48454:405bcdc9e800f60f ; 27538:403ab1eb851eb852 30822:40401e353f7ced91 34106:40401e353f7ced91 40674:40444d0e56041893 43958:4046433333333333 47242:4046433333333333 50526:40483a1cac083127
ts_of_min_over_time - 12413 1639 23724 3963 13 18275 ; 18992:c08847cb6d0634db 19544:c06e9f03f15b0015 20535:c057072435684ea4 22229:c08e5f41bab215ce 23166:408371d3501a36d7 24149:40847918fb955420 26622:40863e2bc13f9171 29327:408c83c49a814a5e ;
ts_of_min_over_time - 1463 0 21537 681 12 ; 17375:0 19837:0 21289:0 22638:0 24534:0 25370:0 25764:0 28667:0 28773:0 29880:0 31416:0 31484:0 33864:0 35054:0 59027:0 59530:0 61279:0 62036:0 63952:0 65363:0 66443:0 ; 21537:403549fbe76c8b44 22218:403549fbe76c8b44 22899:4036a353f7ced917 23580:4036a353f7ced917 24942:403888b439581062 25623:40395eb851eb851f 26304:4039c395810624dd 26985:4039c395810624dd 29028:403cc5e353f7ced9
ts_of_min_over_time - 4366 0 5124 1919 20 ; 8556:7e37e43c8800759c 9011:7e37e43c8800759c 11399:7e37e43c8800759c 12037:7e37e43c8800759c 12324:7ff0000000000002 13153:7e37e43c8800759c 13597:7e37e43c8800759c 15154:7e37e43c8800759c 17236:7e37e43c8800759c 17550:7e37e43c8800759c 19738:7e37e43c8800759c 20309:7e37e43c8800759c 21724:7e37e43c8800759c ; 8962:40211cac083126e9 10881:402205a1cac08312 12800:402812f1a9fbe76d 14719:402b31a9fbe76c8b 16638:402e4ed916872b02 18557:40318ccccccccccd 20476:40344f1a9fbe76c9 22395:4035b95810624dd3 24314:4035b95810624dd3
ts_of_min_over_time - 1390 1195 26694 1389 11 5180 ; 1242:7ff0000000000002 1580:404b37708916ab20 4499:4055011543028bb4 7413:405c78cff7dfa988 9039:7ff0000000000002 9769:40618b1f5f60df4a 16027:4064bec6d6bf37e2 17194:4068fb74c0fbc330 34079:406c5f0572f4ee04 35227:4070c1b6a62b7b07 ;
ts_of_min_over_time - 2619 -9928 17421 2618 7 23053 ; 11890:403d71992c9a7f45 14546:404360816cc4b962 17114:3ffab4df8703ef7c 19530:4037f4f213e385c7 20968:404806195c4dff18 ;
ts_of_min_over_time - 3223 0 14139 3222 9 ; 15088:c2668e7f6b7e833c 17149:c2c671a3a8ed0925 ; 17361:40312624dd2f1aa0
ts_of_min_over_time - 2301 -625 15894 1147 14 33649 ; 17985:7ff8000000000001 20478:c063a18fe5ab38bb 20674:40871453d8863595 20859:408b1e54802047f0 23568:4074f4e7e7321f5e 26230:c06ce3d122b4ade7 28633:4068282342683760 29698:7ff8000000000001 31637:406dd37be3fad63f ;
ts_of_max_over_time - 486 0 603 486 10 0 ; 2150:8000000000000000 4236:8000000000000000 5033:8000000000000000 5050:8000000000000000 6308:8000000000000000 6911:8000000000000000 ;
ts_of_max_over_time - 2167 8471 21433 3290 12 29931 ; 23816:405907f866520287 24434:406033a7c04174a8 27254:4062da5d662f1166 28238:4063094873993ea6 30281:406540b5760158ec 32113:4067976397641f81 ;
ts_of_max_over_time - 2117 -854 37328 2117 4 23118 ; 19277:4055c12cca21be30 20616:405a8e08e85ee7f1 23044:405fe995b001304a 25837:40662b1421426038 27118:4069ff1ad1e031e8 27872:406be97ea0480e6a 30385:406ed97d119792c7 31645:407125335e3eeb12 31997:4071373ff0d2943b 34503:4072c753629a5a57 34683:4073550d9a4d6866 36665:4074439bb8832274 38521:401e985f0dfed0fc 40413:40263f7960ddb549 41709:40420474d5ee919d ; 37328:40370b4395810625 39445:40370b4395810625 41562:40370b4395810625 43679:40370b4395810625
ts_of_max_over_time - 1000 0 11803 1320 4 58465 ; 16579:fff0000000000000 17733:fff0000000000000 20372:fff0000000000000 21404:fff0000000000000 24270:fff0000000000000 26479:fff0000000000000 29360:fff0000000000000 30782:fff0000000000000 33731:fff0000000000000 39592:fff0000000000000 42491:fff0000000000000 44086:fff0000000000000 46902:fff0000000000000 48821:fff0000000000000 51250:fff0000000000000 52849:fff0000000000000 53259:fff0000000000000 55850:fff0000000000000 57222:fff0000000000000 59079:fff0000000000000 61009:fff0000000000000 61773:fff0000000000000 62781:fff0000000000000 64087:fff0000000000000 ;
ts_of_max_over_time - 2387 -1607 22802 1190 13 ; 20786:4059cdfa49e5728d 21725:405c7edf3f34d28e 23435:4063fcadd88997b8 25509:401fcd8e43a4908f 27918:40354702b0a76073 30211:404c7782b5583e14 32894:40527053020bbc81 35151:401a1afaa4cc8d48 36569:404979acb66f34ce 37997:40565367d1fde814 40981:405b9cd730fd1916 43777:40617f3f318bcfb7 45285:4023d2d4716a311e 47921:4034155a197c5772 48177:4047237f7922e490 48785:4051474b06a08afd 50570:40567d2f3b9ae2da ; 22802:40376f5c28f5c28f 23992:40376f5c28f5c28f 25182:4039824dd2f1a9fc 26372:403beb020c49ba5e 27562:403beb020c49ba5e 28752:403e3604189374bc 29942:403e3604189374bc 32322:4040726e978d4fdf 33512:4040726e978d4fdf 34702:40419353f7ced917 35892:404248d4fdf3b646 37082:4042ff9db22d0e56
ts_of_max_over_time - 3927 5360 7049 3926 18 ; 10607:407d512d7680708b 27871:428371056770b49b 30196:c2bbb0375023250a 31061:c08fa6ec0f8aeb7a 32668:c23317f887988347 32835:c06c34aab321f505 51625:c0052babcedaf266 53037:7ff0000000000002 54709:c00a18b4924cfd64 56858:c2706444b9434c48 57001:c01db801cc2d9589 58417:c07ae4a73e1b7b0e ; 18827:402536c8b4395810 34531:403bdef9db22d0e5 38457:40406ae147ae147b 58087:4049d00000000000 62013:404b5ac083126e98 65939:404c8020c49ba5e3
ts_of_max_over_time - 3799 0 5683 3799 18 3433 ; 1298:40592cb741bb47d7 3162:c07df3f1baa1208a 5475:407d898c901cb063 5556:c07a2f4630d0c68c 6703:7ff8000000000001 ; 5683:3ff4c49ba5e353f8 9482:3ff4c49ba5e353f8 13281:3ff4c49ba5e353f8 17080:3ff4c49ba5e353f8 20879:3ff4c49ba5e353f8 24678:3ff4c49ba5e353f8 28477:3ff4c49ba5e353f8 32276:3ff4c49ba5e353f8 36075:3ff4c49ba5e353f8 39874:3ff4c49ba5e353f8 43673:3ff4c49ba5e353f8 47472:3ff4c49ba5e353f8 51271:3ff4c49ba5e353f8 55070:3ff4c49ba5e353f8 58869:3ff4c49ba5e353f8 62668:3ff4c49ba5e353f8 66467:3ff4c49ba5e353f8 70266:3ff4c49ba5e353f8
ts_of_max_over_time - 2458 0 45837 2457 11 24548 ; 12808:430c6bf5263400ed 14732:430c6bf52634021f 17007:430c6bf52634015f 17821:430c6bf526340046 19260:430c6bf5263401c9 20933:430c6bf526340225 22553:430c6bf5263402ac 23517:430c6bf526340243 25271:430c6bf5263401e0 26840:430c6bf5263401f6 29245:430c6bf5263400ce 29283:430c6bf52634008f 31917:430c6bf526340062 33449:430c6bf5263402ba 35197:430c6bf5263402f6 37972:430c6bf5263400d0 40239:430c6bf5263401da 41426:430c6bf52634010e 42145:430c6bf5263400d0 43681:430c6bf526340254 44091:430c6bf52634028c 44481:430c6bf5263402c3 45109:430c6bf526340014 46409:430c6bf5263402ed 57816:430c6bf52634030b ; 45837:40368d916872b021 48294:40368d916872b021 50751:40368d916872b021 53208:40368d916872b021 55665:40368d916872b021 58122:40368d916872b021 60579:40368d916872b021 63036:40368d916872b021 65493:40368d916872b021 67950:40368d916872b021 70407:40368d916872b021
ts_of_max_over_time - 3469 4963 14532 3468 10 14376 ; 12665:430c6bf52634028e 15531:430c6bf52634001d 16732:430c6bf526340063 18610:430c6bf526340097 19250:430c6bf52634018f 20332:430c6bf52634023e 20745:430c6bf52634008c 21407:430c6bf5263401c0 21818:430c6bf526340030 23115:430c6bf52634027b 24781:430c6bf526340095 25241:430c6bf52634011d 26103:430c6bf5263402e1 27088:430c6bf52634025b ;
ts_of_max_over_time - 94 0 19664 93 16 28870 ; 14454:41761e41a4aaa054 15653:42903b9322b47004 16586:c11675950b6a76d8 18593:c1d43f3819613650 18942:c1a85e133c70f4f6 20096:4033318ba5d601d7 22842:c045fa5c5c201c8a 23120:c271d718aef91962 23431:c28fe74c00a63f01 26229:c240925af47cbcbf 27202:c2f16f8fc2abc2e4 27637:42f6dc341dd92bc4 28485:c1e5f651d85f20ef 28810:c002d32568967726 30775:c1bbe0d6a480e695 ; 19664:403ccf5c28f5c28f 19757:403ccf5c28f5c28f 19850:403ccf5c28f5c28f 19943:403ccf5c28f5c28f 20036:403ccf5c28f5c28f 20129:403ccf5c28f5c28f 20222:403ccf5c28f5c28f 20315:403ccf5c28f5c28f 20408:403ccf5c28f5c28f 20501:403ccf5c28f5c28f 20594:403ccf5c28f5c28f 20687:403ccf5c28f5c28f 20780:403ccf5c28f5c28f 20873:403ccf5c28f5c28f 20966:403ccf5c28f5c28f 21059:403ccf5c28f5c28f
ts_of_max_over_time - 7983 -574 5759 3143 16 ; 4875:430c6bf526340217 5844:430c6bf526340016 8144:430c6bf52634019d 10333:430c6bf5263401d0 10942:430c6bf5263400f8 13621:430c6bf526340151 15718:430c6bf5263402ea 18036:430c6bf526340218 20188:430c6bf5263401b7 ; 5759:4013800000000000 8902:4013800000000000 12045:4013800000000000 15188:402f6f9db22d0e56 18331:402f6f9db22d0e56 21474:402f6f9db22d0e56 24617:403209374bc6a7f0
ts_of_max_over_time - 1000 0 18103 687 16 ; 6323:408c4e3cccda74e8 7506:c0861dd95633c334 9961:4082df071dc1c4e7 11209:c08199fa4d82ab30 11905:40852bed60be4a6c 13783:8000000000000000 16281:c085c3abddd8870e 19133:408aa5742e000956 19803:4087affd5adc13b2 21547:7ff0000000000002 24226:4083e43a0564127b 26464:c054ef5b29be7a3c 27696:fe37e43c8800759c 29904:405f6ab16989920c 31744:c08886430b8d2f46 32600:406959d5803e8d89 34724:7ff8000000000001 37103:405386df9f800770 39180:408a2ad500dd8617 40474:7ff8000000000001 42430:407f605cc2dc1099 ; 19477:4033220c49ba5e35 20164:4033cd916872b021 24286:403839db22d0e560 24973:403839db22d0e560 27034:403a76c8b4395810 27721:403bb22d0e560419 28408:403bb22d0e560419
ts_of_max_over_time - 687 3157 16290 687 7 ; 19591:430c6bf5263400de 21340:430c6bf52634011f 23065:430c6bf526340246 26045:7ff0000000000002 26284:430c6bf52634030d 39539:430c6bf5263402e6 40861:430c6bf526340265 ;
ts_of_max_over_time - 1653 7363 50274 823 17 36293 ; 16639:bfde730cedcb166b 17995:4222e47a7d7e115f 20423:c0118285e76373b3 21893:4286e0e02833d6a6 22367:4232c58b714fab43 22945:c03136b243521fed 25561:c2b47823e1a3ff51 28172:4259af50fb946ed7 28426:c0dd8e6333856060 30523:c0d14cdc75eb9998 30554:42917cc5941cb012 32566:c1ba3ef08b906ea8 34039:417249bf6a6f388c 36517:4269f24b570eec08 38396:40b36a3e59c669d5 41047:c0b36cd32ed74a6e 43123:429131310ae3700c 45769:c048fabf9f48c659 46163:c25c854d98260b02 49005:41bfba7455953744 50418:c11bcf546dcf8b1b ; 50274:403c2c083126e979 51097:403c2c083126e979 51920:403c2c083126e979 52743:403c2c083126e979 53566:403c2c083126e979 54389:403c2c083126e979 55212:403c2c083126e979 56035:403c2c083126e979 56858:403c2c083126e979 57681:403c2c083126e979 58504:403c2c083126e979 59327:403c2c083126e979 60150:403c2c083126e979 60973:403c2c083126e979 61796:403c2c083126e979 62619:403c2c083126e979 63442:403c2c083126e979
ts_of_max_over_time - 2480 -7605 76669 2676 20 ; 19397:c082eacb4d43edd5 21313:c0805af73d6bbcbb 22438:c079dcaac6ba7206 25176:405762de9a7aa8de 26496:4073472f5b315ed4 27784:c086e639a0118b13 29658:4018d33a3b312c50 31009:4079191033bc74bb 33890:c0825465ff83c4a9 34248:c078aa16f5b7737e 35276:7ff8000000000001 35401:404055d1974c565d 38106:407676efd5cf920a 38229:7ff8000000000001 56676:4088c8770d1a0874 68289:408d1839992fb440 70822:408ef2a352d593b0 71249:403a7393d22cc2d1 71729:c0706934e6d8a0f7 72457:7ff8000000000001 73776:40591c884937115e 74204:4039f826656d3754 75391:c048c7130745dde6 78085:407dbeb46e3d76cd ;
ts_of_max_over_time - 1000 350 11944 1695 5 ; 4714:4079fe17e01e66f1 7624:c08d00c500c71444 7874:4079c84c70164a36 10226:408871a9b2ae9baa 12500:7ff8000000000001 14929:40880ce5ced2bdf3 ; 13639:4029000000000000 15334:402ddba5e353f7cf
ts_of_max_over_time - 795 4484 17550 394 4 57402 ; 18188:7ff0000000000002 19327:430c6bf52634010b 20747:430c6bf526340062 22961:430c6bf5263401fe 25916:430c6bf52634031a 28161:430c6bf52634003a 31038:7ff0000000000002 33690:430c6bf5263401c3 35212:430c6bf526340193 37180:7ff0000000000002 38331:430c6bf5263401db 41271:430c6bf526340219 56763:430c6bf52634005a ;
ts_of_max_over_time - 9252 -906 34722 1211 1 ; 16960:c06739866b9abebd 19936:c079aa25d4c49313 20401:7ff8000000000001 22969:c08bd9efc70abdf9 23225:7ff8000000000001 25297:c07e329e98d1fa38 25316:406760a0af50d54b 27748:7ff0000000000002 27985:c08eba012d3382b6 28410:7ff8000000000001 31299:4083abdcfd22e1cb 34019:c077f2024a187b53 35806:7ff8000000000001 38685:c08861b01fe8e020 39958:c08a27065456f14e 40976:7ff8000000000001 41946:408c8485b533f422 44156:7ff8000000000001 46992:c08dda44f2dcd142 61657:408335007efa6a8c 63246:c0842ee94276efc5 63724:c086262ca162d1e8 63999:40644e3f7a3070b3 87713:c059168adf528cbd ; 34722:403f4c8b43958106
ts_of_max_over_time - 1584 -557 46221 1583 20 ; 20919:7e37e43c8800759c 22907:7e37e43c8800759c 23699:7e37e43c8800759c 26312:7e37e43c8800759c 27519:7ff0000000000002 29805:7e37e43c8800759c 42690:7e37e43c8800759c 44288:7e37e43c8800759c 45567:7e37e43c8800759c 45856:7e37e43c8800759c 48854:7e37e43c8800759c 51737:7e37e43c8800759c 53862:7e37e43c8800759c ; 46221:4046ed916872b021 49387:40486d4fdf3b645a 52553:4049de5604189375 54136:404aee5604189375
ts_of_max_over_time - 1203 -3750 33671 1202 5 ; 10327:430c6bf5263402cc 12914:430c6bf5263400be 13587:430c6bf5263402cc 15935:430c6bf5263402eb 17015:430c6bf52634021a 19395:430c6bf5263402a2 21399:430c6bf5263400a2 22437:430c6bf52634027f 23162:430c6bf526340201 25621:430c6bf526340197 26907:430c6bf5263401f7 29783:430c6bf526340219 31805:430c6bf5263401cb 34511:430c6bf52634016b 35196:430c6bf5263402dc 37282:430c6bf5263401a1 38990:430c6bf526340169 39694:430c6bf526340295 42145:430c6bf52634026f 43752:430c6bf52634002c ; 33671:4042a4189374bc6a 36075:4043d8d4fdf3b646 38479:4045128f5c28f5c3
ts_of_max_over_time - 1104 -4268 24899 1104 20 12634 ; 15947:fff0000000000000 18652:7ff0000000000002 18675:fff0000000000000 20187:fff0000000000000 21019:fff0000000000000 22443:fff0000000000000 22592:fff0000000000000 24525:fff0000000000000 26328:fff0000000000000 27193:fff0000000000000 29509:fff0000000000000 31503:fff0000000000000 32412:fff0000000000000 32809:fff0000000000000 ; 24899:402fe4dd2f1a9fbe 26003:402fe4dd2f1a9fbe 27107:402fe4dd2f1a9fbe 28211:402fe4dd2f1a9fbe 29315:402fe4dd2f1a9fbe 30419:402fe4dd2f1a9fbe 31523:402fe4dd2f1a9fbe 32627:402fe4dd2f1a9fbe 33731:402fe4dd2f1a9fbe 34835:402fe4dd2f1a9fbe 35939:402fe4dd2f1a9fbe 37043:402fe4dd2f1a9fbe 38147:402fe4dd2f1a9fbe 39251:402fe4dd2f1a9fbe 40355:402fe4dd2f1a9fbe 41459:402fe4dd2f1a9fbe 42563:402fe4dd2f1a9fbe 43667:402fe4dd2f1a9fbe 44771:402fe4dd2f1a9fbe 45875:402fe4dd2f1a9fbe
ts_of_max_over_time - 14767 6727 41173 476 6 14670 ; 17242:430c6bf5263402c8 18748:430c6bf526340103 20001:430c6bf526340259 22113:430c6bf5263402c1 22311:430c6bf526340167 24060:430c6bf526340275 25371:430c6bf52634030a 27479:430c6bf52634011b 28267:430c6bf526340210 31238:430c6bf5263401e2 56185:430c6bf5263400a0 57040:430c6bf5263401c4 ;
ts_of_max_over_time - 14095 7113 25153 334 1 41585 ; 2069:41b1da090c99f95f 4162:403ac002f9bb6164 6750:c0796c6f227bca1d 8912:3fae66f646be5f20 9285:c1bcabbf9049716e 11832:411a44e9893155ce 13777:411d19f2046cd50e 15127:420475c64c1f63e3 17380:c1405d431e68db44 19363:4283d27795142dfc 20171:c24542dde13364e7 21132:40fee968e2f3c15a 23896:c013f6a1a8307302 25483:bfda0d39204974d0 25901:bfdda5247c7c8782 26307:423bffd5c9c0d7ae 38326:405a4932ef61aadb 39734:c0a9369591b5ddfd 41693:c0b1c9712cd78888 43376:c055d6b00cf7d386 44711:c172f3167afa0174 46676:42814406f72ad63a 47614:c02e51ce76a4bef7 47756:412b8fdb69de9961 49864:c00671920aef5968 ; 25153:403a4e978d4fdf3b
ts_of_max_over_time - 2217 -2582 54955 1105 10 45648 ; 19959:408c21800693a08d 21240:c08b36a3d1368637 24068:c075641d944b267e 24861:4085837a25ec0eda 27407:406892f0cd449cb2 46203:4083e4ba497b33c6 48335:c03dbabf111ec184 51054:7ff0000000000002 51264:4083964bbffeb74d 51888:407b142d3ef7a99a 54410:c0800b9a584388e0 57021:c067a1f422f3cc4d 59429:4080dfb541465277 61486:c056d1a352fb0ca0 63206:4088eafa14d41798 64615:8000000000000000 64693:406ed99a4394fca5 ; 54955:404719fbe76c8b44 56060:404719fbe76c8b44 57165:404719fbe76c8b44 58270:404719fbe76c8b44 59375:404719fbe76c8b44 60480:404719fbe76c8b44 61585:404719fbe76c8b44 62690:404719fbe76c8b44 63795:404719fbe76c8b44 64900:404719fbe76c8b44
ts_of_max_over_time - 560 9918 48020 560 5 29289 ; 14754:c1d780831f235e39 15718:c1f278c864703a5e 15821:42bb5b8d62186b5c 17333:415803c22bee08a1 18363:425904fc64782c1a 20209:c151f46e026751d9 20579:42f44b71646d8262 23520:41070dde30a7085d 32510:7ff0000000000002 34859:4109fa37c197c5b8 36516:c17a2315d326503a 50219:c28da14bf19210ea 52288:7ff0000000000002 52923:4247575e147c87cb 54020:414906054975263a 55466:4236a0fed1b61265 57413:c0f0d9b2565f3467 60048:c11194f0aca7359e 60127:c2e32a578e05f634 62032:c291bf5733e315f2 62157:42b159d55d63947a 62223:c1bec522ea8c85b1 64297:402cd208b422ade0 65215:c05ea9e84bd50d84 66640:c2f3508979a7739c ;
ts_of_max_over_time - 2742 -5035 7838 2742 4 ; 8630:405abeb73d71ee0a 9340:40636a84109d1609 ;
ts_of_max_over_time - 575 -4524 20908 575 1 44247 ; 6181:407965ec7db11b50 7597:fe37e43c8800759c 9086:40750b7a71c46642 10226:40596eb40114ad6f 11082:7ff0000000000002 11497:7e37e43c8800759c 11610:4074b24cbd9cce8b 12878:40835327d82a44a4 14030:c077a953480114f0 14217:c0834935893175b9 17047:407a9ac67a0bca63 28341:405e86cd0265be88 31296:c08cc5f5ac3ee9f6 33024:c08e1c76eb4e093a 34322:8000000000000000 36943:4084c7ea3d38adb9 39408:40715085808413ea 39756:c0805d6d56e71d89 ;
ts_of_max_over_time - 1445 0 76279 1445 18 ; 7402:4084ef200945d963 31186:c05a2d1fc1341852 32093:7ff0000000000000 34720:408e9f8478323170 35511:408585c4f965fb52 36229:4080f67a8519963a 37238:4089a398d92e75c9 38104:4088d0f3c8537f9c 62964:8000000000000000 63651:c08e17367516ad9d 65993:c088b8498b4eec79 68498:407959c17aab2495 71194:40893c3b1425fc71 71676:c0625ed023c2c2c3 74434:7ff0000000000002 76737:c062a322a3775da8 ; 77724:40532f2b020c49ba
ts_of_max_over_time - 1620 5466 66748 1619 3 ; 20343:c08d0b41aef597e3 20468:408cead8a9547c45 22948:c07cea4141cbe87d 25427:40719d95b0a8cec2 44205:7ff0000000000002 44406:c08bd94d02e294c2 47338:c0685aeb2fbbc737 48876:c061c8d2ce267ca9 49070:408917a8f1b393b5 49187:40754c22808b1de5 49276:c080913f9ca171a7 50045:c087eda131380c64 52814:407d0efdd2a49a4b 70889:7ff8000000000001 70912:408e64a51e0841d0 73886:7ff8000000000001 75627:7ff8000000000001 77875:4072838cc68b6a7e 79667:7ff8000000000001 82350:7ff0000000000002 84316:40882fbfa7b9eebc 84639:4081c6a07b537b63 85405:7ff8000000000001 ;
ts_of_max_over_time - 1617 -6998 37054 1617 2 ; 13592:7e37e43c8800759c 14733:7e37e43c8800759c 16780:7e37e43c8800759c 18986:7e37e43c8800759c 20754:7e37e43c8800759c 21170:7e37e43c8800759c 29438:7e37e43c8800759c 31048:7e37e43c8800759c 53499:7e37e43c8800759c 53903:7e37e43c8800759c 55214:7e37e43c8800759c 57069:7e37e43c8800759c 59630:7e37e43c8800759c 61917:7e37e43c8800759c ;
ts_of_max_over_time - 11349 -9330 9118 2126 20 36113 ; 4427:c0736ebb10c769a8 7185:40740b195a32125c 8350:40765920bb322d0f 8813:c066f31ac9130852 9212:c053f1c8806b35fc 9589:c07e199dae548fc9 10561:4081109f807ab010 11050:c06d084d0c46cef1 12534:c08e71baf58a1760 35653:c0831f13bebcc90c 37956:4084cac64157573a 40658:408d001e4e170cc6 40863:3ffd668c854a3e78 41275:7ff0000000000000 41401:c081fef5b512abc4 41806:408f34577bb7c93f 43237:40870ffeb55541eb ; 9118:4044a33333333333 11244:4044a33333333333 13370:4044a33333333333 15496:4044a33333333333 17622:4044a33333333333 19748:4044a33333333333 21874:4044a33333333333 24000:4044a33333333333 26126:4044a33333333333 28252:4044a33333333333 30378:4044a33333333333 32504:4044a33333333333 34630:4044a33333333333 36756:4044a33333333333 38882:4044a33333333333 41008:4044a33333333333 43134:4044a33333333333 45260:4044a33333333333 47386:4044a33333333333 49512:4044a33333333333
ts_of_max_over_time - 1000 0 25892 3921 6 28802 ; 15209:c08f3519a50a9510 17300:c05a80f780a4edca 17722:408ea0aa1ea1c096 20474:c05db862735bdb14 23128:40868c7ea55c2b1f 23269:7ff0000000000002 24634:4057d22d6d0ed40f 26004:c07e8a49fae70639 ;
ts_of_max_over_time - 1000 -2245 26229 1553 8 ; 16728:4035ae121bd23df0 18056:4043b33f5a6ae91d 20479:404dc74015dea586 21716:405a06be47521e1c 23830:4062b51c1a608af0 24227:4063ac39ac4d4e14 26791:4063edcb2fa69321 29751:40660abbcf88b20f 30886:4066107c3d26777e 32668:4069e71ad77ae7d6 33935:406ce7f5f73f7f16 36311:406dae14d133a06a 36388:407002f4dfe803de 37962:4070ba6bcb77a829 39664:4073644b13d1251d 40601:4074abfbb7230a06 62577:40777ba6f48b0a00 ; 27782:403dc04189374bc7 29335:403ee2d0e5604189 30888:404055810624dd2f 32441:4040f7ae147ae148
ts_of_max_over_time - 5311 0 28927 2652 12 ; 19769:8000000000000000 21049:7ff0000000000002 23979:40557c35820c809d 41170:c071a06383e876d4 41385:7ff0000000000002 42985:c07fa2f5ec8640d9 44960:c0887379f48ef525 46253:8000000000000000 ; 28927:4037fa9fbe76c8b4 42187:404495c28f5c28f6 44839:404495c28f5c28f6 47491:404720624dd2f1aa 50143:404720624dd2f1aa
ts_of_max_over_time - 248 963 11665 247 1 17379 ; 15171:430c6bf5263401a2 17159:430c6bf52634023b 18673:430c6bf5263401db 18856:430c6bf526340173 20808:430c6bf52634020b 23406:430c6bf526340040 25218:430c6bf5263400a9 25730:430c6bf526340177 28207:430c6bf526340293 29591:430c6bf5263402b8 32021:430c6bf526340160 32975:430c6bf52634010e 35578:430c6bf5263402fa 37682:430c6bf52634023d ;
ts_of_max_over_time - 643 -5563 18173 642 11 ; 20154:4080429d75d4759b 22063:406c21d42983126c 33795:408eb5a0c800bb04 36442:c0649980344394e4 36814:c089d15c0cffb072 38502:40386a80d9249c08 39688:408ca2b248491604 41948:7ff8000000000001 44672:c0336b54d9ef97e3 45308:4084be3dc2a5bed8 46971:7ff8000000000001 49213:c07155eeaf92e9bd 50305:4077032253246f05 51909:c0726d75ec9a0c48 54848:404b1627526add25 56812:40737012dba88782 58390:4041f8a08044572f ;
ts_of_max_over_time - 405 1039 23305 199 7 ; 19126:430c6bf5263402e2 20102:430c6bf526340072 21535:430c6bf5263402cf 24180:430c6bf526340023 26767:430c6bf526340231 28977:430c6bf526340198 31404:430c6bf52634027a 33442:430c6bf526340089 36334:430c6bf52634002d 38219:430c6bf52634014f 40976:430c6bf5263400dd 49259:430c6bf52634010f 50059:430c6bf526340005 51304:430c6bf526340010 51430:430c6bf5263402ef 52104:430c6bf52634016c 52813:430c6bf526340281 53668:430c6bf526340310 56098:430c6bf52634013a 57904:430c6bf5263401c6 59242:430c6bf5263400d5 ;
ts_of_max_over_time - 1659 -8443 23063 1659 19 10544 ; 15075:3fbb23dfc6386760 17770:40460eb9a843a3f9 19846:c26242f7ea0207e9 20786:c220811d0d5f186c 21693:403c029a9bf36415 21938:c23be0d194294b2b 22347:41f346707a518ef2 24295:c17e9fc924c80e3b 25341:c113ddb18d61bf2c 27941:c0d88a17d3894774 28793:41a2d5cfddf1cbdf 28915:7ff0000000000002 31081:7ff0000000000002 34043:41115bb93b1c31dd 35488:42c009148194fa61 37140:c1816c01a50df54f ; 23063:4031c51eb851eb85 24722:4031c51eb851eb85 26381:4031c51eb851eb85 28040:4031c51eb851eb85 29699:4031c51eb851eb85 31358:4031c51eb851eb85 33017:4031c51eb851eb85 34676:4031c51eb851eb85 36335:4031c51eb851eb85 37994:4031c51eb851eb85 39653:4031c51eb851eb85 41312:4031c51eb851eb85 42971:4031c51eb851eb85 44630:4031c51eb851eb85 46289:4031c51eb851eb85 47948:4031c51eb851eb85 49607:4031c51eb851eb85 51266:4031c51eb851eb85 52925:4031c51eb851eb85
ts_of_max_over_time - 3662 8308 16770 3661 2 16620 ; 1800:40754c56b53a727b 3171:7ff0000000000002 5443:7ff0000000000000 6533:c06f46451985aab9 8253:4078c88bb675038f 10296:c0786eb490670132 12358:c07bd4205adccf70 13665:7ff0000000000000 14756:408e050f07c46b30 15350:407813ce9a8afa9f 16786:408773c9b3cff2d5 18497:c080c389d0dac0cb ; 16770:4015c5a1cac08312 20431:4015c5a1cac08312
ts_of_max_over_time - 10031 -4376 12408 1978 6 ; 10204:0 11321:0 14123:0 15211:0 16843:0 17470:0 19718:0 20530:7ff0000000000002 22288:0 22633:0 25035:0 25525:0 34189:0 36056:0 38757:0 39811:0 41576:0 44126:0 44380:0 45600:0 48189:0 ; 12408:402e6c083126e979 14386:40317851eb851eb8 16364:4033b7ced916872b 18342:4036a20c49ba5e35 20320:4036a20c49ba5e35 22298:4039866666666666
+391
View File
@@ -0,0 +1,391 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Float range-vector functions as window kernels.
//!
//! Each kernel follows the Prometheus function of the same name, including its floating point
//! operation order. Arithmetic that GreptimeDB's range UDFs compute the same way is shared with
//! them.
use crate::functions::{
EdgeKind, add_counter_resets, count_edges, extremum, instant_delta, kahan_inc,
};
use crate::go_sort;
use crate::range_eval::{FloatWindow, WindowKernel};
/// A PromQL range-vector function over float and native histogram samples.
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum RangeFunction {
Rate,
Increase,
Delta,
Irate,
Idelta,
AvgOverTime,
MinOverTime,
MaxOverTime,
SumOverTime,
CountOverTime,
LastOverTime,
PresentOverTime,
StddevOverTime,
StdvarOverTime,
/// `quantile_over_time` with a constant quantile.
QuantileOverTime(f64),
Resets,
Changes,
Deriv,
/// `predict_linear` with a constant horizon in seconds.
PredictLinear(f64),
/// `double_exponential_smoothing` (`holt_winters`) with constant factors in `(0, 1)`.
DoubleExponentialSmoothing {
smoothing: f64,
trend: f64,
},
// Prometheus marks the following as experimental.
FirstOverTime,
MadOverTime,
TsOfFirstOverTime,
TsOfLastOverTime,
TsOfMinOverTime,
TsOfMaxOverTime,
}
impl RangeFunction {
/// Whether the result drops the metric name, as Prometheus does for every range function
/// except `last_over_time` and `first_over_time`.
pub(crate) fn drops_metric_name(self) -> bool {
!matches!(self, Self::LastOverTime | Self::FirstOverTime)
}
/// Returns the kernel computing this function over windows read with `offset_ms`.
pub(crate) fn kernel(self, offset_ms: i64) -> WindowKernel {
match self {
Self::Rate => Box::new(extrapolated_rate::<true, true>),
Self::Increase => Box::new(extrapolated_rate::<true, false>),
Self::Delta => Box::new(extrapolated_rate::<false, false>),
Self::Irate => Box::new(last_two::<true>),
Self::Idelta => Box::new(last_two::<false>),
Self::AvgOverTime => Box::new(|window| Some(avg(window.values))),
Self::MinOverTime => Box::new(|window| extremum(window.values.iter().copied(), true)),
Self::MaxOverTime => Box::new(|window| extremum(window.values.iter().copied(), false)),
Self::SumOverTime => Box::new(|window| Some(sum(window.values))),
Self::CountOverTime => Box::new(|window| Some(window.values.len() as f64)),
Self::LastOverTime => Box::new(|window| window.values.last().copied()),
Self::PresentOverTime => Box::new(|_| Some(1.0)),
Self::StddevOverTime => Box::new(|window| Some(variance(window.values).sqrt())),
Self::StdvarOverTime => Box::new(|window| Some(variance(window.values))),
Self::QuantileOverTime(q) => {
let mut scratch = Vec::new();
Box::new(move |window| Some(quantile(q, window.values, &mut scratch)))
}
Self::Resets => {
Box::new(|window| Some(count_edges(window.values, EdgeKind::Resets) as f64))
}
Self::Changes => {
Box::new(|window| Some(count_edges(window.values, EdgeKind::Changes) as f64))
}
Self::Deriv => Box::new(|window| {
(window.values.len() >= 2)
.then(|| linear_regression(&window, window.timestamps[0]).0)
}),
// Prometheus regresses the unshifted samples around the evaluation time, which on the
// shifted timeline is `eval_ts + offset`; `RangeEvaluator::try_new` checks it fits.
Self::PredictLinear(duration) => Box::new(move |window| {
if window.values.len() < 2 {
return None;
}
let (slope, intercept) =
linear_regression(&window, window.eval_ts.checked_add(offset_ms)?);
Some(slope * duration + intercept)
}),
Self::DoubleExponentialSmoothing { smoothing, trend } => Box::new(move |window| {
double_exponential_smoothing(window.values, smoothing, trend)
}),
Self::FirstOverTime => Box::new(|window| window.values.first().copied()),
Self::MadOverTime => {
let (mut deviations, mut scratch) = (Vec::new(), Vec::new());
Box::new(move |window| {
Some(median_absolute_deviation(
window.values,
&mut deviations,
&mut scratch,
))
})
}
// Window timestamps are shifted by the offset; Prometheus reports the sample's own.
Self::TsOfFirstOverTime => {
Box::new(move |window| Some(seconds(window.timestamps[0] - offset_ms)))
}
// Prometheus takes the max with the histogram timestamp, 0 when there is none, so a
// negative timestamp reports 0.
Self::TsOfLastOverTime => Box::new(move |window| {
let last = window.timestamps[window.timestamps.len() - 1] - offset_ms;
Some(seconds(last.max(0)))
}),
Self::TsOfMinOverTime => Box::new(move |window| {
Some(seconds(timestamp_of_extremum(&window, false) - offset_ms))
}),
Self::TsOfMaxOverTime => Box::new(move |window| {
Some(seconds(timestamp_of_extremum(&window, true) - offset_ms))
}),
}
}
}
/// Prometheus `funcSumOverTime`.
fn sum(values: &[f64]) -> f64 {
let (sum, c) = values
.iter()
.fold((0.0, 0.0), |(sum, c), &value| kahan_inc(value, sum, c));
sum + c
}
/// Prometheus `funcAvgOverTime`: the Kahan sum divided by the count, switching to an
/// incremental mean once the sum would overflow.
fn avg(values: &[f64]) -> f64 {
let (mut sum, mut count) = (values[0], 1.0);
let (mut mean, mut kahan_c) = (0.0, 0.0);
let mut incremental_mean = false;
for (i, &value) in values[1..].iter().enumerate() {
count = (i + 2) as f64;
if !incremental_mean {
let (new_sum, new_c) = kahan_inc(value, sum, kahan_c);
if !new_sum.is_infinite() {
(sum, kahan_c) = (new_sum, new_c);
continue;
}
incremental_mean = true;
mean = sum / (count - 1.0);
kahan_c /= count - 1.0;
}
let q = (count - 1.0) / count;
(mean, kahan_c) = kahan_inc(value / count, q * mean, q * kahan_c);
}
if incremental_mean {
mean + kahan_c
} else {
sum / count + kahan_c / count
}
}
/// Prometheus `varianceOverTime`, the population variance.
fn variance(values: &[f64]) -> f64 {
let mut count = 0.0;
let (mut mean, mut c_mean) = (0.0, 0.0);
let (mut aux, mut c_aux) = (0.0, 0.0);
for &value in values {
count += 1.0;
let delta = value - (mean + c_mean);
(mean, c_mean) = kahan_inc(delta / count, mean, c_mean);
(aux, c_aux) = kahan_inc(delta * (value - (mean + c_mean)), aux, c_aux);
}
(aux + c_aux) / count
}
/// Prometheus `quantile`, which sorts NaN before every number.
fn quantile(q: f64, values: &[f64], sorted: &mut Vec<f64>) -> f64 {
if q.is_nan() {
return f64::NAN;
}
if q < 0.0 {
return f64::NEG_INFINITY;
}
if q > 1.0 {
return f64::INFINITY;
}
sorted.clear();
sorted.extend_from_slice(values);
// `sort.Sort` with `vectorByValueHeap.Less`: NaN first, +0 and -0 tie, and which zero
// lands at the rank decides the sign of the result.
go_sort::sort_by(sorted, |a, b| a.is_nan() || a < b);
let n = sorted.len() as f64;
let rank = q * (n - 1.0);
let lower = rank.floor().max(0.0);
let upper = (n - 1.0).min(lower + 1.0);
let weight = rank - rank.floor();
sorted[lower as usize] * (1.0 - weight) + sorted[upper as usize] * weight
}
/// Prometheus `extrapolatedRate` over floats.
fn extrapolated_rate<const IS_COUNTER: bool, const IS_RATE: bool>(
window: FloatWindow<'_>,
) -> Option<f64> {
let FloatWindow {
timestamps,
values,
eval_ts,
range_ms,
} = window;
let samples_minus_one = values.len().checked_sub(1).filter(|n| *n > 0)?;
let first = values[0];
let mut result = values[samples_minus_one] - first;
if IS_COUNTER {
result = add_counter_resets(result, values);
}
let zero_point = (IS_COUNTER && result > 0.0 && first >= 0.0).then(|| first / result);
let factor = extrapolation_factor(
(timestamps[0], timestamps[samples_minus_one]),
samples_minus_one,
eval_ts,
range_ms,
IS_COUNTER,
IS_RATE,
zero_point,
);
Some(result * factor)
}
/// The factor `extrapolatedRate` scales the sampled increase by. `zero_point` is the first
/// value over the increase, given only when Prometheus extrapolates a counter to zero.
pub(super) fn extrapolation_factor(
(first_t, last_t): (i64, i64),
samples_minus_one: usize,
eval_ts: i64,
range_ms: i64,
is_counter: bool,
is_rate: bool,
zero_point: Option<f64>,
) -> f64 {
let range_start = i128::from(eval_ts) - i128::from(range_ms);
let mut duration_to_start = (i128::from(first_t) - range_start) as f64 / 1000.0;
let mut duration_to_end = (i128::from(eval_ts) - i128::from(last_t)) as f64 / 1000.0;
let sampled_interval = (i128::from(last_t) - i128::from(first_t)) as f64 / 1000.0;
let average_interval = sampled_interval / samples_minus_one as f64;
let threshold = average_interval * 1.1;
if duration_to_start >= threshold {
duration_to_start = average_interval / 2.0;
}
if is_counter {
let mut duration_to_zero = duration_to_start;
if let Some(zero_point) = zero_point {
duration_to_zero = sampled_interval * zero_point;
}
if duration_to_zero < duration_to_start {
duration_to_start = duration_to_zero;
}
}
if duration_to_end >= threshold {
duration_to_end = average_interval / 2.0;
}
let mut factor = 1.0;
if sampled_interval != 0.0 {
factor = (sampled_interval + duration_to_start + duration_to_end) / sampled_interval;
}
if is_rate {
factor /= range_ms as f64 / 1000.0;
}
factor
}
fn last_two<const IS_RATE: bool>(window: FloatWindow<'_>) -> Option<f64> {
let [.., prev_ts, last_ts] = window.timestamps else {
return None;
};
let [.., prev, last] = window.values else {
return None;
};
instant_delta::<IS_RATE>((*prev_ts, *prev), (*last_ts, *last))
}
/// Prometheus `linearRegression`: `(slope, intercept)` with `x` in seconds from
/// `intercept_time`. Needs at least two samples.
fn linear_regression(window: &FloatWindow<'_>, intercept_time: i64) -> (f64, f64) {
let init_y = window.values[0];
let mut const_y = true;
let mut n = 0.0;
let (mut sum_x, mut c_x) = (0.0, 0.0);
let (mut sum_y, mut c_y) = (0.0, 0.0);
let (mut sum_xy, mut c_xy) = (0.0, 0.0);
let (mut sum_x2, mut c_x2) = (0.0, 0.0);
for (i, (&t, &y)) in window.timestamps.iter().zip(window.values).enumerate() {
if const_y && i > 0 && y != init_y {
const_y = false;
}
n += 1.0;
let x = (i128::from(t) - i128::from(intercept_time)) as f64 / 1e3;
(sum_x, c_x) = kahan_inc(x, sum_x, c_x);
(sum_y, c_y) = kahan_inc(y, sum_y, c_y);
(sum_xy, c_xy) = kahan_inc(x * y, sum_xy, c_xy);
(sum_x2, c_x2) = kahan_inc(x * x, sum_x2, c_x2);
}
if const_y {
if init_y.is_infinite() {
return (f64::NAN, f64::NAN);
}
return (0.0, init_y);
}
sum_x += c_x;
sum_y += c_y;
sum_xy += c_xy;
sum_x2 += c_x2;
let cov_xy = sum_xy - sum_x * sum_y / n;
let var_x = sum_x2 - sum_x * sum_x / n;
let slope = cov_xy / var_x;
let intercept = sum_y / n - slope * sum_x / n;
(slope, intercept)
}
/// Prometheus `funcDoubleExponentialSmoothing`; `RangeEvaluator` checks the factors.
fn double_exponential_smoothing(values: &[f64], sf: f64, tf: f64) -> Option<f64> {
if values.len() < 2 {
return None;
}
let (mut s0, mut s1) = (0.0, values[0]);
let mut b = values[1] - values[0];
for (i, &value) in values.iter().enumerate().skip(1) {
let x = sf * value;
b = if i == 1 {
b
} else {
tf * (s1 - s0) + (1.0 - tf) * b
};
let y = (1.0 - sf) * (s1 + b);
(s0, s1) = (s1, x + y);
}
Some(s1)
}
pub(super) fn seconds(timestamp_ms: i64) -> f64 {
timestamp_ms as f64 / 1000.0
}
/// Prometheus `compareOverTime` returning the timestamp: the last sample holding the maximum
/// (or minimum), where a NaN so far is replaced by any later sample.
fn timestamp_of_extremum(window: &FloatWindow<'_>, max: bool) -> i64 {
let (mut best, mut timestamp) = (window.values[0], window.timestamps[0]);
for (&value, &ts) in window.values.iter().zip(window.timestamps) {
let replace = if max { value >= best } else { value <= best };
if replace || best.is_nan() {
(best, timestamp) = (value, ts);
}
}
timestamp
}
/// Prometheus `funcMadOverTime`: the median of the absolute deviations from the median; NaN
/// when any sample is NaN.
fn median_absolute_deviation(
values: &[f64],
deviations: &mut Vec<f64>,
sorted: &mut Vec<f64>,
) -> f64 {
if values.iter().any(|value| value.is_nan()) {
return f64::NAN;
}
let median = quantile(0.5, values, sorted);
deviations.clear();
deviations.extend(values.iter().map(|value| (value - median).abs()));
quantile(0.5, deviations, sorted)
}
+258
View File
@@ -0,0 +1,258 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Range functions over windows that hold native histogram samples, following the histogram
//! branches of Prometheus' range functions. Windows of floats alone never get here.
use std::borrow::Cow;
use datafusion::error::Result;
use datatypes::series::histogram::CounterResetHint;
use crate::functions::{EdgeKind, count_edges, instant_delta};
use crate::grid_series::GridSample;
use crate::histogram_eval::HistogramAggregate;
use crate::histogram_eval::float_histogram::FloatHistogram;
use crate::histogram_eval::sum_or_avg;
use crate::range_eval::function::{extrapolation_factor, seconds};
use crate::range_eval::{FloatWindow, RangeFunction, WindowKernel};
/// Histogram samples of one window at their shifted timestamps, in time order.
type Histograms = [(i64, FloatHistogram)];
/// The window of one field at `eval_ts`, holding `histograms` (not empty) and `floats` when it
/// has any float sample.
pub(super) fn evaluate(
function: RangeFunction,
floats: Option<FloatWindow<'_>>,
histograms: &Histograms,
eval_ts: i64,
range_ms: i64,
offset_ms: i64,
kernel: &mut WindowKernel,
) -> Result<Option<GridSample>> {
use RangeFunction::*;
let float = |value: f64| Some(GridSample::Float(value));
let (last_ts, last) = &histograms[histograms.len() - 1];
let (first_ts, first) = &histograms[0];
Ok(match function {
// Prometheus reads only the floats of these.
MinOverTime
| MaxOverTime
| StddevOverTime
| StdvarOverTime
| QuantileOverTime(_)
| Deriv
| PredictLinear(_)
| DoubleExponentialSmoothing { .. }
| MadOverTime
| TsOfMinOverTime
| TsOfMaxOverTime => floats.and_then(kernel).map(GridSample::Float),
CountOverTime => {
float((floats.map_or(0, |window| window.values.len()) + histograms.len()) as f64)
}
PresentOverTime => float(1.0),
LastOverTime => match floats {
Some(window) if last_ts < window.timestamps.last().expect("not empty") => {
float(window.values[window.values.len() - 1])
}
_ => Some(GridSample::Histogram(last.clone())),
},
FirstOverTime => match floats {
Some(window) if window.timestamps[0] < *first_ts => float(window.values[0]),
_ => Some(GridSample::Histogram(first.clone())),
},
TsOfFirstOverTime => {
let ts = floats.map_or(*first_ts, |window| window.timestamps[0].min(*first_ts));
float(seconds(ts - offset_ms))
}
// Go takes the max with 0 for a kind of sample the window does not have.
TsOfLastOverTime => {
let histogram_ts = last_ts - offset_ms;
let ts = match floats {
Some(window) => {
(window.timestamps.last().expect("not empty") - offset_ms).max(histogram_ts)
}
None => histogram_ts.max(0),
};
float(seconds(ts))
}
Resets => float(edges(floats, histograms, EdgeKind::Resets)? as f64),
Changes => float(edges(floats, histograms, EdgeKind::Changes)? as f64),
SumOverTime | AvgOverTime if floats.is_none() => {
let op = if function == SumOverTime {
HistogramAggregate::Sum
} else {
HistogramAggregate::Avg
};
sum_or_avg(op, histograms.iter().map(|(_, h)| h.clone()))?.map(GridSample::Histogram)
}
Rate | Increase | Delta if floats.is_none() && histograms.len() > 1 => {
let is_counter = function != Delta;
let Some(mut result) = histogram_rate(histograms, is_counter)? else {
return Ok(None);
};
let zero_point = (is_counter && result.count > 0.0 && first.count >= 0.0)
.then(|| first.count / result.count);
result.mul(extrapolation_factor(
(*first_ts, *last_ts),
histograms.len() - 1,
eval_ts,
range_ms,
is_counter,
function == Rate,
zero_point,
));
Some(GridSample::Histogram(result))
}
Irate => last_two::<true>(floats, histograms)?,
Idelta => last_two::<false>(floats, histograms)?,
// Mixed windows, and rates over fewer than two histograms.
SumOverTime | AvgOverTime | Rate | Increase | Delta => None,
})
}
/// One sample of a window, in the order Prometheus merges floats and histograms.
#[derive(Clone, Copy)]
enum Sample<'a> {
Float(f64),
Histogram(&'a FloatHistogram),
}
/// The samples of both kinds in time order.
fn merged<'a>(
floats: Option<FloatWindow<'a>>,
histograms: &'a Histograms,
) -> impl Iterator<Item = (i64, Sample<'a>)> {
let mut floats = floats
.into_iter()
.flat_map(|window| window.timestamps.iter().zip(window.values))
.map(|(&ts, &value)| (ts, Sample::Float(value)))
.peekable();
let mut histograms = histograms
.iter()
.map(|(ts, h)| (*ts, Sample::Histogram(h)))
.peekable();
std::iter::from_fn(move || match (floats.peek(), histograms.peek()) {
(Some((float_ts, _)), Some((histogram_ts, _))) if float_ts < histogram_ts => floats.next(),
(_, Some(_)) => histograms.next(),
(Some(_), None) => floats.next(),
(None, None) => None,
})
}
/// Prometheus `funcResets` and `funcChanges` over floats and histograms: a change of kind
/// counts as one edge.
fn edges(floats: Option<FloatWindow<'_>>, histograms: &Histograms, kind: EdgeKind) -> Result<u64> {
let mut count = 0;
let mut previous: Option<Sample<'_>> = None;
for (_, current) in merged(floats, histograms) {
if let Some(previous) = previous {
count += match (previous, current) {
(Sample::Float(a), Sample::Float(b)) => count_edges(&[a, b], kind),
(Sample::Histogram(a), Sample::Histogram(b)) => u64::from(match kind {
EdgeKind::Resets => b.detect_reset(a)?,
EdgeKind::Changes => !b.equals(a),
}),
_ => 1,
};
}
previous = Some(current);
}
Ok(count)
}
/// Prometheus `instantValue` over the last two samples of either kind; a float and a histogram
/// give nothing.
fn last_two<const IS_RATE: bool>(
floats: Option<FloatWindow<'_>>,
histograms: &Histograms,
) -> Result<Option<GridSample>> {
let floats = floats.map(|window| {
let from = window.values.len().saturating_sub(2);
FloatWindow {
timestamps: &window.timestamps[from..],
values: &window.values[from..],
..window
}
});
let histograms = &histograms[histograms.len().saturating_sub(2)..];
let tail: Vec<_> = merged(floats, histograms).collect();
let [.., (prev_ts, prev), (last_ts, last)] = tail[..] else {
return Ok(None);
};
Ok(match (prev, last) {
(Sample::Float(prev), Sample::Float(last)) => {
instant_delta::<IS_RATE>((prev_ts, prev), (last_ts, last)).map(GridSample::Float)
}
(Sample::Histogram(prev), Sample::Histogram(last)) => {
let interval = last_ts - prev_ts;
let mut result = last.clone();
if !IS_RATE || !last.detect_reset(prev)? {
if result.uses_custom_buckets() != prev.uses_custom_buckets() {
return Ok(None);
}
result.sub(prev)?;
}
result.reset_hint = CounterResetHint::Gauge;
result.compact();
if IS_RATE {
result.div(interval as f64 / 1000.0);
}
Some(GridSample::Histogram(result))
}
_ => None,
})
}
/// Prometheus `histogramRate`: the increase from the first to the last histogram, adding back
/// what counter resets dropped. `None` when the histograms mix exponential and custom buckets.
fn histogram_rate(points: &Histograms, is_counter: bool) -> Result<Option<FloatHistogram>> {
let last = &points[points.len() - 1].1;
let mut prev = Cow::Borrowed(&points[0].1);
let mut uses_custom_buckets = prev.uses_custom_buckets();
// A reset between the first two samples makes the first one irrelevant, layout included.
if is_counter {
let second = &points[1].1;
if second.detect_reset(&prev)? {
prev = Cow::Owned(second.empty_like());
uses_custom_buckets = second.uses_custom_buckets();
}
}
if last.uses_custom_buckets() != uses_custom_buckets {
return Ok(None);
}
let mut min_schema = last.schema.min(prev.schema);
if is_counter {
for (_, current) in &points[1..points.len() - 1] {
min_schema = min_schema.min(current.schema);
if current.uses_custom_buckets() != uses_custom_buckets {
return Ok(None);
}
}
}
let mut result = last.copy_to_schema(min_schema)?;
result.sub(&prev)?;
if is_counter {
for (_, current) in &points[1..] {
if current.detect_reset(&prev)? {
result.add(&prev)?;
}
prev = Cow::Borrowed(current);
}
}
result.reset_hint = CounterResetHint::Gauge;
result.compact();
Ok(Some(result))
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,404 @@
# Generated by promql-compat cmd/narthex-golden built for amd64 (Prometheus v3.15.0 engine,
# seed 1, 20 cases per function; arm64 builds fuse multiply-adds and change low bits).
# Each line: function params range_ms offset_ms start_ms step_ms points ; samples ; result
# where params is `-` or comma-separated floats and every point is `timestamp:hex value bits`.
rate - 3203 4376 19888 3203 19 ; 12166:c257759f462f60fd 13861:c027de5a16a21d0e 15136:40d17d1ded071630 17632:418148f1bdf553bf 20580:41816ba7ea66b83e 21122:7ff0000000000002 23954:4236130864b31007 25440:4257ec5b0b91d690 27004:c06eceb438438b02 28164:c0d3d031882af4e9 30364:c006378342e8b71a 31068:406e3b2aae250fc0 31225:40af03d6d29d9143 ; 19888:40c39d2181ca0eb4 32700:c0bd72a1c75168c3 35903:409f05b26a7b8ce1
rate - 1000 -6914 -71 80 2 ; 3998:430c6bf5263401a9 5240:430c6bf52634010d 7243:430c6bf526340122 10184:430c6bf5263401a1 11783:430c6bf52634019c 14471:430c6bf526340056 17104:430c6bf5263401a8 27488:430c6bf52634021c 28383:430c6bf526340010 ;
rate - 3757 -3843 11117 2319 16 ; 7635:4034d21406576acd 8860:40394ffaec0c1b9a 31699:404af55879fcd611 32340:40597420158fe74c 33524:405b15731b652dbb 36292:4014d0b1b238afaa 38516:402a5f6920832457 40683:404369a7ea0b98f1 41846:4052a934ee09f0c6 42277:400d876865d2859f 43061:402d078367f9b3c6 44627:403f154537ec658b 46384:4049d47e571f9892 48014:401c967c3319b415 48335:40207281e6f71d36 50224:403ea598fa96d798 ; 29669:40397f728e1f5f69 31988:4007f25e0b5925bf 38945:4030843e4d739ef2 41264:40265a98b1ee0924 43583:40276c433667dcd4 45902:40097171d68d54b3
rate - 11658 0 43636 3588 7 ; 21266:40809021a5fb5c68 26526:c08ab8d387d3fe97 27947:4084c32ac131897f 29499:40702a9d37cc1d88 31539:7ff0000000000000 32225:4084ece464d3def8 34266:c083b9bfb7a568d3 36440:c064ab2566cc29a5 38015:c08e1496a56e25c2 38488:7ff0000000000002 38663:7ff8000000000001 41312:7ff8000000000001 43430:8000000000000000 45023:408232015ff793f0 47535:c0729bb3d1304175 50403:fff0000000000000 52178:c072d6c2940717fc 53716:408cf23afcc15a23 55976:40719bac9d71513d ; 43636:c02d83683dcc242a 47224:404e03237aa6aeba 50812:7ff8000000000001 54400:405bb10b98f049d6 57988:4061e3958e20a553 61576:7ff0000000000000 65164:40433f5705518d8a
rate - 2799 -9091 4601 1396 6 ; 7929:408dbe52f87ab7a3 9719:407f7204c589796f 10848:4063a341fc8ab550 11194:407e5078aa56fae4 11276:c070106d59806c83 13833:c08ef8e2ac6852c5 16101:408e921d0c88d98e 18910:c084382a8b0f2e12 21353:c0749cfaf244b8bc 21607:c08e6b6e65818965 22121:7e37e43c8800759c 24653:c08cb47b218bcb77 26137:408b4b5233c613ec 26742:c07420b93bf8c393 27508:c08c421b3ef065f1 28508:4073b02c0b1702b1 28516:4080996aa05b4b22 29992:fe37e43c8800759c 30332:7ff8000000000001 31962:40527d84d2f96512 33238:4011c43741b60e2e 34998:c05667bb73e50262 35473:40739b24ef721385 37507:4080df8905ceda02 ; 4601:c066f4feae8ce846 7393:408b22a6077f8ece
rate - 1000 0 16682 731 20 ; 8553:fe37e43c8800759c 9475:7ff0000000000002 10325:4071dabb14f265d2 12466:7ff8000000000001 14577:4082536eae584dfc 15903:c08ddde6e1f5d4df 17340:c0708da5579fb417 19367:408d4be9bdd87347 ;
rate - 7173 -6678 3440 3583 16 ; 2236:7ff0000000000002 3938:0 4027:0 4244:0 ; 3440:0
rate - 3836 -6183 25762 3835 1 ; 17397:c0c8521462b39f93 18932:c16f818202cc6f6c 19902:c1d3a78b931b48c0 20259:c0de6021a2f73228 23024:c03627d044a08f5e 25385:bff8831a486820ae 26787:c2874b55973da272 27071:c11ce60d485e76a9 28564:42ea49ea398cee43 30272:c2f6efcdcb17763b 30556:40109e8bb76acf48 30655:c1b876d9e5228e54 31026:c2596c867a0b3789 31223:c17c63c2f0cac90c 33475:c1b3e7ffc511a25a 34346:c2bc4293cbea9661 36145:41a4ec754ad2137b 38538:c14cbfec67bab0c2 39895:c04678afdfb0c3e2 41947:42555bc62077813c 44162:414b0b2f8671678f 44513:40a62adc6e74fc70 47313:c047a4e09c57368c 49980:c034d21848b95dca ; 25762:c1a1639e0e0aba00
rate - 1779 -5385 5547 1779 12 ; 9173:40546bdd0752f721 10458:7e37e43c8800759c 13294:8000000000000000 15047:407dd97c2e43b518 15749:4082bf28ff62e6c5 16795:c085146c629b9af3 19411:406c65c90957e208 19951:7ff8000000000001 ; 5547:7e326235016a8a6e 10884:4065c70772dc65bc
rate - 3109 0 25058 3108 19 ; 17454:7ff8000000000001 19583:c0872cae7cdf755e 21727:403bee1a022124c1 22553:408274bbbd7f14ab 24401:c04f39d64303bfdd 24498:407151c3332f9748 25299:7ff8000000000001 26497:40641e2205ec67f8 26561:407388c20b1f60e3 29000:c08450c9e87aab65 31672:7ff0000000000002 32200:c0890d4247d29b41 32438:7ff8000000000001 35434:406ba14a7212b86f ; 25058:4061cf23898725c2 28166:7ff8000000000001 34382:7ff8000000000001
rate - 789 0 20854 789 13 ; 21706:c05a5aba7b28af0d 22007:40607b796c814fef 22393:407032ce92847edf 24645:408a8055f7e41d59 25104:408bd05a080e0d29 ; 22432:408095a00d872261
rate - 1000 4269 32779 3979 11 ; 7235:408bfba5ee853fba 10042:7ff8000000000001 11234:7ff8000000000001 12513:7ff8000000000001 12897:40701dffe731a610 15056:4041aeb4a41922eb 16838:40684065de60fcd6 19156:40862a6acb43425c 20818:407c28d54b28237c 22002:40838d006662188d 23250:c081e072829e055b 24708:c07aa7bc7871c866 27173:406ddd60bb756ca4 27759:40896ce21a7add71 29964:7ff8000000000001 30801:4084075ddece13db 33709:4077a0ed85b6196f 36135:408da514f259dca5 37140:7ff8000000000001 40033:408e10420964c3d7 ;
rate - 2919 0 35226 2918 9 ; 18598:7ff8000000000001 21532:7ff8000000000001 24499:7ff8000000000001 26021:7ff8000000000001 28168:7ff8000000000001 29132:7ff8000000000001 31992:7ff8000000000001 34992:7ff8000000000001 37918:7ff8000000000001 38749:7ff8000000000001 ;
rate - 2964 0 11285 2964 3 ; 3467:40793d5682208c9a 5544:7ff8000000000001 6054:7ff8000000000001 8645:c05d5bb1075d9ff0 10859:7ff8000000000001 11502:c07156767b924f4a 14073:407d196995338e1a ; 11285:7ff8000000000001 14249:40720fd54f1caaf2
rate - 3004 0 21576 3004 6 ; 15359:7ff8000000000001 17677:4056f9423d52ecaa 18848:7ff8000000000001 19994:c08f1e4f570fb132 34248:7ff8000000000001 35644:c086bafba7d9a15c 38000:7ff8000000000001 39205:7ff8000000000001 41643:4081dd0ac5288cb5 ; 21576:7ff8000000000001 36596:7ff8000000000001
rate - 2063 6778 13042 2063 1 ; 4674:408d95ee6e731000 6809:407967fbfe722161 8276:406c6ca86332b730 8384:4050c3f3575a12d2 11315:408b45be8063c1a1 14299:4079301583a0d111 15788:c062d7cbd293cf59 17286:c05e2b7a44204619 19908:407820bc27d90f05 21483:c0830aad64e31af5 23689:c085ac410449b6b0 24064:7ff0000000000002 25352:407581ed5b44f5a0 25628:408d308473ac4261 26081:406415b56eb91ae5 27574:406739d15b34e566 27910:407f53a179939ae8 ;
rate - 1000 -8947 7146 2460 19 ; 7180:7ff8000000000001 9742:c08435237a68cfe5 10675:c058a4308b057409 13116:408ee5e8ed7e239e 14966:408d5d862c06670b 17054:7ff8000000000001 18256:40661dc09dc0494f 19445:407739f4234be29c 20658:7ff8000000000001 22200:c0781473b60f2d79 25138:c083b92521352a06 25725:4076d887837be3f2 27022:40681077f1d49b06 27137:7ff8000000000001 28541:4085a720e46875ab 31316:405d8ed0800aa28e 32159:408742a5044f6311 56912:408d16addd5395e6 58254:c0795033bdcbcbbb 60289:c07392e499eebf17 62150:c08a1e619ce1fce0 63222:c062c58546d1bbce 65540:c0715a73ed3e0b73 67117:c065fa91a4078529 68120:40764c56cc3b83b2 ; 16986:409a87a9267df5d4
rate - 3533 -6798 18545 3532 13 ; 20173:40842fa3fd1beee5 20596:4073577016a23cb6 21493:c07fa57314a3c419 22608:c03e9aee980e0bb9 24656:c06ef950cc17bb2f 25738:408f21e24040ada8 25796:7ff8000000000001 27057:7ff0000000000002 28305:7ff8000000000001 51313:c068da8cd58128ba 51728:40820308d17ea761 54583:4077a2a6fc26393f 67337:c085810afe44374f ; 18545:c05e3f78e74f2ccd 22077:7ff8000000000001 46801:407b6d6c5244829b
rate - 1000 1319 8707 2955 15 ; 8128:430c6bf526340216 11058:430c6bf526340261 11222:430c6bf5263400af 11889:430c6bf526340037 13460:430c6bf5263402ae 15095:430c6bf526340308 15812:430c6bf526340189 18410:430c6bf5263401b2 21197:430c6bf5263400b5 23157:430c6bf526340072 23752:430c6bf526340210 24534:430c6bf52634000d 25369:430c6bf5263400c4 27300:430c6bf526340269 ;
rate - 4787 9628 34901 2390 16 ; 19416:40ef169e7eead616 22037:42546f4f70dc86e7 23019:40b00a32272f75e4 24358:42fa53232bd24e1b 26461:400b9c84af38e4f8 28792:41b520add038e55c 30446:c2f0d5f17c4ff73e 32727:4111e996cce286ca 34340:c036c3e23008fb5f 35255:41140c20ee432603 37775:410418b64e30a1d3 53380:42b56758f5453864 54060:c0b1df5747db9e4d 54326:4001d9c510923282 55202:c0f0b8ccb302e3c6 57609:4132561070188daf 60096:c1906f0790d59e9c 61205:40363ad9b9a16730 61345:42889e296158fbdd 62537:42e8fc2f1c49e06c 65370:c0443651f72a0da0 68081:c2b90c392f6360f4 ; 34901:42deaf6fb6859937 37291:42ddadb38c955b99 39681:419b345ea836db6b 42071:c2dec38ddfcfe33c 44461:42d14b440ee842d0 46851:40f6de1ffbefdd29 49241:40efe635b0efbbc8 65971:c0d2a134a244411d 68361:4114bebaed125845 70751:c17a6e6ec7cd2146
increase - 2205 -359 19097 1099 7 ; 3076:42af857241143d0a 3247:3fbdbbe7a189d878 3384:c216622de8a01905 11267:c1e39d15b5e18d03 13022:40a99c5837673fdb 14854:bff3f0e9f09951d8 16523:c1d3e53dc960d719 18666:c0d10ce701d24068 21301:41b4efc4a54249b6 23498:4223ac266220fc1d 23670:c2bac39ddb83d857 23873:c0e77097573126a1 26358:41b0f6d4775b75f4 27883:c09521294f62a4f2 27911:c117fc8c079127f9 30272:41b4734f1a5ab9ee 32274:41e7084f9c5c99b0 32962:c1744f8460e4ad87 33190:40a51c96d42f52dc 35373:c008739e0817fd48 37590:c2f0009507b3b412 ; 23493:c2d11dd90c633408 24592:c0f1947181640000
increase - 281 -4273 15096 280 17 ; 4407:4084737e036df553 5526:4078c4d5f11af4a0 6364:c081d7cf002fbd94 8275:40811f3b9cd7e4ba 8688:4073dba50406a76f 8932:c087937acbb2d52d 10166:407703398404780c 11095:4084c178eecf0c04 12088:c08df8d0c188bc43 22570:0 23934:c0862869f04fbdec 24111:7e37e43c8800759c 24543:407c610412a92200 27232:407964160c74da3c 30067:c08943e4d0251b13 31647:c0877835a88629b9 31902:4085912119844bf0 33298:c07530f1154a26ce 33707:c0726dcc0de91b62 34674:c084e4cb8c5a68bb ;
increase - 12450 -4076 46590 1101 5 ; 18337:40062bd1942bd176 19534:c11829480573a86e 19663:413f0bb23a18d9fa 20522:c24f0f522310ba67 21580:40769c6139348a36 24026:3fd176b5ae3ad338 26353:3fd72dedf7d8f898 26520:c2f5052dfd816506 26619:411706e427d4a6ed 27284:4249eb2a60755a08 28820:4258d7403dde00fc 29052:42e854fe458c96ff 29455:c16561630417fe3d 31906:40a3ccae644885ae 54710:bfbc854e51cb0ee8 57428:7ff0000000000002 58221:c10262d6a67b547f 60567:c2b4ac35cc06a2f9 63277:c297be93aa0cce30 63543:c0e4a80bc8647b07 63980:c2111ec381d36924 64412:c27cb11a6f4f72de 65507:c2c36c9a9c80c3a6 ;
increase - 7951 0 15344 3972 8 ; 15980:4050ae1fa4396f5b 18507:4053d35b5f6da1aa 18841:4058ae30b2aab021 19081:405d6b9f2bf6492d 21948:400a85e4bfb198a8 24240:4036d33963816277 25351:40411a9995ef59f3 ; 19316:404fa87cf6208968 23288:405213e3df4d91db 27260:4044f728686c6a0d 31232:403ae6447d71d799
increase - 1000 300 17136 1397 10 ; 13595:7ff8000000000001 16190:407f42ad49666a1f 19058:c0848dec0bc81fbc 21893:7ff8000000000001 22870:c08b6db6f796db48 24248:c08c030d63117397 27184:7ff8000000000001 27662:7ff8000000000001 29127:7ff8000000000001 30246:40800b7443c45704 31890:7ff8000000000001 33264:4060935825cd7164 36129:408588d7212d9a7c 37073:c0824b2b6acaea63 37108:c085e9fa8e3b481e 37581:7ff8000000000001 38457:7ff8000000000001 38633:7ff0000000000002 38947:c084dd878ba59d87 40578:c0651d6087baae4c ; 28312:7ff8000000000001
increase - 899 523 33628 898 15 ; 28100:430c6bf526340119 30749:430c6bf5263401af 32718:430c6bf5263400ec 35695:430c6bf526340151 38075:430c6bf5263401bc ;
increase - 53 4685 37043 52 15 ; 17686:7e37e43c8800759c 18537:7e37e43c8800759c 18733:7e37e43c8800759c 18846:7e37e43c8800759c 20876:7e37e43c8800759c 22448:7e37e43c8800759c 23194:7e37e43c8800759c 23575:7e37e43c8800759c 26335:7e37e43c8800759c 28676:7e37e43c8800759c 29308:7e37e43c8800759c 30231:7e37e43c8800759c 32067:7e37e43c8800759c 34238:7e37e43c8800759c 37233:7e37e43c8800759c 37386:7e37e43c8800759c 39491:7e37e43c8800759c 41210:7e37e43c8800759c 43739:7e37e43c8800759c 43836:7e37e43c8800759c 46196:7e37e43c8800759c ;
increase - 7139 0 37477 3566 5 ; 15193:c08ae6f904aeb810 16195:40779370daa497cc 16868:c070d9702c4146e3 18946:408eb2d14d4cbe92 19921:c065a359ba62952c 22468:7e37e43c8800759c 25002:408cef5d1ff0695e 26240:408496f7dde6f075 29148:c07fd6c70907df29 29254:c0713268e6030ca8 29603:c070a0982d56d9de 32383:c053689749ae2bc6 32559:c06982c545a6346b 33039:408ec9304ed73696 34882:c08e4b0ce3a26434 35291:c079a1eeaebd7603 36192:4089a80a67b9b6d7 39126:405658e74652ada9 39543:406a9c9b4fc81465 39993:c086b26cbeb8af5d 40351:408be01f5c9e2b1f ; 37477:40a0eec4d05eada0 41043:40ad86caa610bd61 44609:4093e8a688edea52
increase - 573 6839 15728 573 3 ; 1414:407578aa49371f9f 3828:7ff8000000000001 6546:407f29597350cc92 7071:7ff8000000000001 9022:c06e5597efe93953 9988:7ff8000000000001 11687:407e6d13239509b9 14362:c08068f4382f5280 14793:4084ed84d66962b1 17070:c0825e3aa6442a6b 19107:4076f4d485aaeee3 20785:c06cf8654ed178d0 ;
increase - 6085 -5819 18709 3039 7 ; 21480:430c6bf526340241 23186:430c6bf526340016 25192:430c6bf5263402b3 27901:430c6bf52634031a 30624:430c6bf52634001d 32910:430c6bf52634016a 35308:7ff0000000000002 36538:430c6bf526340320 38545:430c6bf5263402a4 41402:430c6bf526340021 43069:430c6bf526340054 45274:430c6bf5263400af 46127:430c6bf526340077 47723:430c6bf52634014f 48155:430c6bf526340109 50930:430c6bf5263401a2 52501:430c6bf52634022f 54212:430c6bf52634014a ; 18709:43203f5d9606d7b0 21748:40688f21f237a41e 24787:403ceb876b117b83 27826:4311437715710dff 30865:4058ca5821efe5ae 33904:431da843a2179840 36943:431e445f6eb5a128
increase - 3167 1719 42889 3167 12 ; 16620:fe37e43c8800759c 17263:7ff0000000000002 19049:fe37e43c8800759c 22024:fe37e43c8800759c 22902:fe37e43c8800759c 24737:fe37e43c8800759c 27091:fe37e43c8800759c 28606:fe37e43c8800759c 30569:fe37e43c8800759c 31813:7ff0000000000002 33799:fe37e43c8800759c 35069:fe37e43c8800759c 35737:fe37e43c8800759c 38343:fe37e43c8800759c 53426:fe37e43c8800759c 55989:fe37e43c8800759c 56479:fe37e43c8800759c 58127:fe37e43c8800759c 59045:fe37e43c8800759c ; 58724:0 61891:0
increase - 1000 -8325 31552 562 7 ; 9374:404dfd3642238f2f 11136:7ff0000000000002 11467:4059b658b987fccd 13378:405bf4748386c9d1 14737:405d07f9eca0093f 17438:40624a788814f427 39647:40656ce5f9d49e76 40533:406adf037785563d 41776:406c842feffbf176 41986:406d7936e55c35d3 44527:407101d543e0992d 45149:4072a928ece4ab53 45729:40739213c06029ec 46561:40761c7045963f78 49302:407689c764664fd7 72818:40799ba276dc30da 74198:407b5c37bbda99ce 74612:407c17c3b799cf17 ; 33800:40308dcdaea7f892 34362:402d762b85c8d452
increase - 2006 -6980 75724 2006 17 ; 16752:406158861cac9c86 19286:407f719b2a3e2c20 21017:4081e42e5c1c7b0a 23424:7ff0000000000002 25838:c086038f97560f2a 28140:c06b742089980e0b 41617:c08ebb9f7edb8c9a 44429:fe37e43c8800759c 44781:c086f27a5ad4dafb 45273:c05d95f196577622 48141:c056681271f71a6f 49564:c06e977a580ad628 51971:408294bbfce4d15e 74341:c08b8ac28a7dc49e 74515:c02a4746f090f066 76147:408261ae3ebef4d2 77444:408572aabda53364 ;
increase - 1000 -8912 6239 2313 14 ; 2014:430c6bf526340195 2918:430c6bf526340294 5285:430c6bf52634015b 8005:430c6bf52634015c 8354:430c6bf5263400c9 9410:430c6bf52634030b 10166:430c6bf526340224 12914:430c6bf526340210 15045:7ff0000000000002 17137:430c6bf52634020e 38595:430c6bf5263401fb 39384:430c6bf5263402c1 39946:430c6bf526340136 42290:430c6bf526340002 44459:430c6bf5263401cb 45571:430c6bf5263402ed 47594:430c6bf526340019 49312:430c6bf526340233 52189:430c6bf5263400ba 53985:430c6bf526340059 56581:430c6bf5263400e7 59541:430c6bf526340157 ;
increase - 10586 -9561 11012 3933 10 ; 15490:430c6bf5263402c1 16816:430c6bf526340155 18055:430c6bf526340255 20417:430c6bf52634002a 21101:430c6bf5263402b8 37914:430c6bf52634027b 39158:430c6bf5263400d5 ; 11012:4321077eca2b3488 14945:4321c37937e08193 18878:4312b4bb40f5bac6 30677:4320d3abc9c190f5 34610:431c6bf5263400d5 38543:4319d709e3f7b77f
increase - 15727 1317 50067 3188 2 ; 9171:c08b503202590e68 11822:7ff8000000000001 12930:404c755f2f064464 14044:7ff0000000000002 15094:7ff8000000000001 16779:401fe443ef8bb9a6 18166:4075b71b516cd1ea 18573:4077b9d1afeb384c 21389:c08a3600545fdf30 21533:c0869bcacd008691 22188:4084cb4671c118c8 23108:c04abbba6c434cec 25114:4079ec3557ba98b1 25585:7ff8000000000001 25767:c08b093f932f3c05 26460:7ff8000000000001 45259:c08d5becbdcf3a38 48258:c06af9602146de13 50731:c07dd5fecb61f977 52407:408924f11c267f8a 53749:7ff8000000000001 ; 50067:4092d116f060f00d 53255:4076a3ca6c7a9062
increase - 1000 7934 9298 1933 9 ; 8825:4081b9f4199623dc 11650:c07b51de3d87c54c 12774:c0858b4a4f4a67e4 13251:7ff8000000000001 15017:40838a5d1571e3e0 15850:7ff8000000000001 17529:406391d6c0059622 19455:7ff8000000000001 21952:408aaec1c5a5f7e2 23478:4067e53bb31af3a3 26042:7ff8000000000001 ;
increase - 2154 0 23924 2154 10 ; 13916:430c6bf5263401ec 14723:430c6bf5263401b5 15162:430c6bf5263400e7 15231:430c6bf526340310 15952:430c6bf526340185 17664:430c6bf5263402b4 18898:430c6bf5263401a9 19509:430c6bf5263400c0 21455:430c6bf52634010e 21814:430c6bf52634011a 23395:430c6bf526340265 24332:430c6bf5263402e4 25642:430c6bf526340165 27298:430c6bf5263400e3 28833:430c6bf526340050 29339:430c6bf526340174 ; 23924:404c2f6c538d5bcf 26078:43175dd63fa70aea 30386:4052400000000000
increase - 5948 -2512 30876 3530 10 ; 6651:414469624d49c086 9404:c2240e384941016a 11180:3fddf38d26182008 13595:c0f06251e71ad5dd 15931:c1cec99b42c7027d 18711:425de1e23713a122 19948:41121c190406f0fb 38024:c116605575460bb6 38677:c03ec56e8efdf413 39360:42fb94a07e08e653 40142:3fd61d720ca67dbe 41192:c0ca4253b36f67bb 41989:c2edb4e2c72b4aca 44479:bffcb1c079180fc1 47215:40db7a3965388ce2 48063:c28898fc6eea1552 49896:7ff0000000000002 52168:c1f27f5425f35501 54513:c013c3b658ded5fe 56910:c2411a6f4224f2bd 57331:40f12d84cce6642b ; 37936:430214be8c633369 41466:42f0cdf1abcba876 44996:42f0e7c55736fd0e 48526:c29898fc6eea1552 52056:41fc2e0e62d453f5 55586:41f54f61a414be24 59116:42511a6fcb911924
increase - 3809 0 32655 3808 17 ; 30450:430c6bf526340239 32903:430c6bf5263401ab 35091:430c6bf5263401a0 35328:430c6bf52634006c 36787:430c6bf5263402d0 37887:430c6bf52634028e 39633:430c6bf5263400bc 42603:430c6bf526340163 44669:430c6bf5263402b6 47607:430c6bf5263401cf 49718:430c6bf526340224 52149:430c6bf5263401d3 52695:430c6bf52634021e 55524:430c6bf5263401ce 57004:430c6bf52634013e 59327:430c6bf52634001c 60005:430c6bf5263401ee 61412:430c6bf5263401f9 64354:430c6bf526340292 66261:430c6bf52634030a 66504:430c6bf526340099 66721:430c6bf526340017 76676:430c6bf526340029 77146:430c6bf52634015e ; 36463:4326524087d58caf 40271:432304f5dc43743d 47887:43126c7ea1428fe6 55503:4035dfffffffffff 59311:4315870bd89caa74 63119:4052c11d196a73a8 66927:4321d0ec00e23f33 78351:4053500000000000
delta - 2667 -29 22426 1330 5 ; 3689:7ff8000000000001 5616:40791bc3217324e1 6529:c088678cebb69297 6531:c080bc423d2195ac 8158:4080384cd9e633b6 9961:7e37e43c8800759c 11604:406b1f19a0ed697e 13892:7ff0000000000000 16890:408b6a11ae86772a 17178:c06cfdeda631a77c 18109:7ff8000000000001 18488:408649a37e0df447 21325:40660e07d5332c2f 23267:c0823a6af1e9eb88 24217:c07c9271cb745243 26413:40739401cadca748 28025:408cb7ed597e5fb3 ; 23756:c0904d7ce7cbbb75 25086:4076225dfd4884b9 26416:408d3d1eab8a59fc
delta - 15813 7514 16982 709 12 ; 13678:40105935be175887 14342:3fd4bfaf851d57e7 16608:403b9f787ea3f0cb 18307:40483a640359faeb 19611:4057b4984709e03f 20964:406150b845d986f4 22147:406381a7e7a64543 22189:4064deb16b117e4d 24002:40664dcefe9056ae 26465:401796cf5772e16e ; 21945:c01898510014dcaa 22654:c01e1a758b8b0611 23363:c01e1a758b8b0611 24072:c01e1a758b8b0611 24781:40415b4df3c1359b
delta - 913 0 21295 912 12 ; 19463:0 20694:0 22041:0 23912:0 26691:0 28545:0 28972:7ff0000000000002 29106:0 31590:0 34587:0 35573:0 35924:0 38382:0 41325:0 41462:0 43678:0 45935:0 ;
delta - 1000 -2431 5643 649 3 ; 6166:430c6bf5263400ec 8125:430c6bf5263400f0 8806:430c6bf526340209 9343:430c6bf526340180 9886:430c6bf5263401c4 10963:430c6bf52634002e 11033:430c6bf5263400da 11783:7ff0000000000002 12332:430c6bf5263402af 14298:430c6bf526340045 16883:430c6bf526340263 17038:430c6bf526340033 17311:430c6bf52634017b 19672:430c6bf526340211 21422:430c6bf52634009e 23284:430c6bf5263400d7 ; 6941:c03fe3df9536d2b5
delta - 1166 -6899 20507 1165 12 ; 10964:fff0000000000000 11982:fff0000000000000 12364:fff0000000000000 13362:fff0000000000000 13878:fff0000000000000 14614:fff0000000000000 15745:fff0000000000000 16475:fff0000000000000 17621:fff0000000000000 19315:fff0000000000000 20943:fff0000000000000 21090:fff0000000000000 21375:fff0000000000000 21429:fff0000000000000 23848:fff0000000000000 26244:fff0000000000000 26743:fff0000000000000 28830:fff0000000000000 30718:fff0000000000000 33244:fff0000000000000 35310:fff0000000000000 37954:fff0000000000000 40375:fff0000000000000 43149:fff0000000000000 45464:fff0000000000000 ; 20507:fff8000000000000
delta - 6459 -4325 33402 3226 5 ; 14226:fff0000000000000 16979:fff0000000000000 19427:fff0000000000000 20066:fff0000000000000 22069:fff0000000000000 23073:fff0000000000000 25416:fff0000000000000 26151:fff0000000000000 28875:fff0000000000000 30161:fff0000000000000 32912:fff0000000000000 34738:fff0000000000000 34878:fff0000000000000 ; 33402:fff8000000000000 36628:fff8000000000000
delta - 3256 -8002 14484 3255 3 ; 7440:c0218dfeaa1190ec 9621:4157351b0355d34c 11009:3fdf59b519f1e340 12416:4284527a84993b58 15011:400fb462b4c06346 15569:c2534e68718fd671 18465:42f5afe85b3d9320 18795:c19efef26925ec92 21534:413a3bb8105fe094 23451:40cd03e5c6919bd9 26441:42b8bdc07349eb65 29369:42292b0ddcb421fa 30451:c0e045b296a707c8 30556:c261dfac132680dd 32059:42f2fc16a6c7d84d 32322:41f1fecc24cda570 33973:4136428943bf893e ;
delta - 2827 0 21947 1410 14 ; 2610:407e0d3b18cc5273 2897:407d3d93110e4abc 4668:7ff8000000000001 10204:c0850fcb6d9c1e3e 10438:7ff8000000000001 10903:c088387fec9c0d02 13709:7ff0000000000002 14143:7ff8000000000001 14482:4085144ab2e79801 16038:4074b79aeffd4f00 16082:408e0e5e4b48467f 17848:c0563abdb61f511e 20313:4078c17e4c5d46b8 21042:406ef42c1089b4f2 23249:408397ef752be54a 24155:7ff8000000000001 24963:40754d1bca4b3ed6 25681:40357c44ad23e6b0 ; 21947:c0728ed08830d87e 23357:407e5eef563ec4ab 24767:7ff8000000000001 26177:7ff8000000000001 27587:c081ca49b6cb6933
delta - 3894 8077 12989 1028 2 ; 15062:4072ed111f7a5335 17490:c084e75dc2e89948 19092:407ff0f502e1ae90 21946:40854865e3acfdc6 ;
delta - 1189 -9994 23276 1189 6 ; 20778:bff4ae04e3484680 22472:c08c3d2e389d7bda 24597:c081b78ef9f31ea4 26813:408c89c85f89f222 27768:4081d439dbacd9db 29804:407fcb15fbcf02ae 32593:7ff8000000000001 34937:7ff8000000000001 35007:c08a4348ab342979 36987:408b452872910b11 37824:7ff8000000000001 38019:407f87a4520e0353 38863:40897cc6b631ca3e 40114:408db13f078b9127 42346:c07f79fa97fee5d8 44551:4080e7f02d55d38d 46424:c08b80d19e3a2a2a 55062:7ff8000000000001 55896:408279254371efe1 ; 25654:7ff8000000000001 28032:c07a82d537585e1a
delta - 1000 -6545 23869 1411 2 ; 3420:8000000000000000 4351:8000000000000000 5735:8000000000000000 8595:8000000000000000 11395:8000000000000000 11744:8000000000000000 14169:8000000000000000 16362:8000000000000000 17598:8000000000000000 19903:8000000000000000 22410:8000000000000000 22712:8000000000000000 23549:8000000000000000 24867:8000000000000000 27301:8000000000000000 29969:8000000000000000 30874:8000000000000000 32532:8000000000000000 32949:8000000000000000 34149:8000000000000000 35364:7ff0000000000002 ;
delta - 2657 9094 11836 1325 14 ; 14618:c13cdd6aaae62d17 17325:c2c24faeda9f4aa9 17872:c1bc65ac0192883c 19270:c1fc060a5f8cb889 22183:c1b207bedf48d645 25172:407352d0ec2fdd14 46140:41b956679afd3cce ; 27736:42d24fa0a7c949e0 29061:42c9027df45a497a
delta - 2644 1007 16258 2643 16 ; 18457:4051da38784642ec 21321:405570007896527c 22395:405579b5bc957354 24878:405b9a1b7106cebb 26222:405cd2de4483c8b9 27473:4061ed5dbf78b1eb 28172:4066865ef41a63a0 30048:40671deeca9ee39c 46885:406b4ad87f105f9d 46943:406d5df6cd7348ab 49080:40710ecb8a832045 51372:40731e895e925ff4 53333:4074d59cac7f4cfc 55602:3ff57f3cdd1c83b5 56094:4042462463cb313c 59004:40543eab56d37f2c 61032:406024d88da0de46 64028:406042f0f90cbe55 ; 24187:3fd7e649f545e415 29473:40560039ff4b5bbe 47974:403fc39b0865f027
delta - 12415 2444 8911 1721 9 ; 9261:7e37e43c8800759c 10236:c05edc16bf4bb17d 11693:405f1ec8c1e33535 ; 14074:fe47e43c8800759c 15795:fe41eb2d66005835 17516:fe41eb2d66005835 19237:fe41eb2d66005835 20958:fe41eb2d66005835 22679:fe41eb2d66005835
delta - 11591 -5814 20658 3594 8 ; 21182:fe37e43c8800759c 22701:fe37e43c8800759c ; 20658:0 24252:0
delta - 169 0 15827 169 18 ; 12549:430c6bf526340296 14779:430c6bf5263401e7 15655:430c6bf526340255 17348:430c6bf5263400e5 19622:430c6bf526340283 20482:430c6bf5263402b5 21779:430c6bf52634007b 24442:430c6bf5263401ff 25207:430c6bf5263402ca 27859:430c6bf52634027b ;
delta - 1000 -1772 19230 1976 9 ; 3088:430c6bf5263401db 4846:430c6bf52634024e 5840:430c6bf5263401c4 8272:430c6bf5263400e1 9331:430c6bf52634028d 11868:430c6bf526340108 12881:430c6bf5263400e2 14104:430c6bf52634010b 16056:430c6bf52634021e 18899:430c6bf526340065 20018:430c6bf5263402e3 20339:430c6bf52634014d 23312:430c6bf5263401c5 40662:430c6bf5263402b0 42060:430c6bf5263400b4 42108:430c6bf52634008a 45003:430c6bf526340150 47072:430c6bf5263401e5 ; 19230:c053a9e4e27e0199
delta - 1168 7274 43416 1216 11 ; 11329:4046c847fe3ab8a3 12335:404b88c25060cd1f 15318:4052fb4ed7cbdaa9 17728:405a91c67583ceb0 18516:405aa7426f704b89 21516:4014ae447e0e9725 21686:4039f34f41dd3be7 24459:403f9ca2f9cbfa8b 31944:404a74e5abbf1758 32473:404c08da5903365a 34980:4059595d314a3df0 35932:4023bd866b58ab1f 38417:4045766c5a13346e 39346:40489ef3deda584e 40280:4054293cba7cbf9c 43051:405e185f74b5f5fc 43470:40637df756faf796 44381:4067417612944fe8 44660:4069d521de127c4e 45148:406ae8583dac5d21 66977:406e35e27dd57cc7 68950:401787181afe5424 71420:4044d900123726f4 71843:40563a3aebfa2906 74176:405ad83fb3a5696a ; 43416:c05c12b9b0502d72
delta - 1000 3917 21131 3683 1 ; 19747:8000000000000000 33870:8000000000000000 57163:8000000000000000 57815:8000000000000000 58392:8000000000000000 58738:8000000000000000 ;
delta - 5505 -2472 16735 922 11 ; 19707:c074ab4ab419b387 21814:404c6dfa43eb93cb 24508:c08453fe09251862 25871:408999428cf572f4 26626:7ff8000000000001 ; 19501:408314c0c2537706 20423:408fa4c9acb14908 21345:408fa4c9acb14908 22267:c076eafc1cec933b 23189:c09695bf6d29fa3d 24111:4090297e2afacdd2 25033:7ff8000000000001 25955:7ff8000000000001
irate - 6783 2384 27519 3388 10 ; 16155:41f68d42887af00d 17652:c0e7cbf9ec2de845 18318:40d8e65212d9510e 18399:c045e68f2081e975 19343:c002711124506550 20970:c02164695e61fec9 22485:40586205e4bee566 36614:4088f35627b41ab6 39174:4101ad4371fb0b22 39445:42f7424bbd607f61 40145:c22386915bca5a97 41563:4135748d0d12a641 43827:c07b0d9aeee2817b 44262:7ff0000000000002 45656:c0b11b5fd1bdac4c 48057:c0423468dd605a12 ; 27519:4051878205d9bba6 44459:421b8a670f34808a 47847:c067e6069af1b46b 51235:409c43429284993c 54623:409c43429284993c
irate - 3466 -997 1969 3465 6 ; 1194:430c6bf526340216 3080:430c6bf526340180 3368:430c6bf5263402e0 6173:430c6bf526340167 6710:430c6bf526340199 8877:430c6bf5263401c2 ; 5434:42f443d93ba37bc0 8899:4002eb9001e3e23b
irate - 15037 6406 19364 430 2 ; 10250:4034e864e98dd5f4 12582:4041b9417b8bc474 12858:404e417495d9c02f 12984:4057b4fc0b9d9cea 14921:4060fcab4f8fa695 17673:406390dfb848e7bb 18152:4063e6c520ad222b 19948:4064abbc0d2434e0 20266:4066a5cfab5bc136 21162:406c71e08645a7b3 22587:40705dac794a0803 23832:40725a75851766a1 25466:7ff0000000000002 26344:407427bb74f74bd3 ; 19364:4056b3f4b18224c9 19794:407105a7087b1d40
irate - 6443 -1071 9125 3218 12 ; 10752:407323d58744bac2 13113:40874f7de933a7c6 13217:7ff8000000000001 15033:4086c3e7af6e090f 17576:c0868514c7c8237b ; 12343:7ff8000000000001 15561:7ff8000000000001 18779:c071b6142b2a8a70
irate - 5033 7462 9094 2513 14 ; 8218:fe37e43c8800759c 8298:fe37e43c8800759c 10445:fe37e43c8800759c 11906:fe37e43c8800759c 13932:fe37e43c8800759c ; 16633:0 19146:0 21659:0 24172:0
irate - 1000 9003 4248 2654 15 ; 6128:40727c5f010640b1 6299:c0822b75986fe033 7923:7ff8000000000001 10294:408777278dc78706 10405:c0635557f1c02be7 13040:c080f90c561c60aa ; 20172:c095c595c670a024
irate - 3649 0 12626 3648 4 ; 14472:c07d53ac65a8a2e7 16396:4105e326b3b01aab 17027:4174f957f85d89d7 18656:c250b8f14d151a1f ; 19922:c24487ea2e8ca0ef
irate - 1048 0 -147 1048 5 ; 2476:405d5585a7d02eda 3201:4061235bffbe0f0d 3799:4062268f88aa331a ; 4045:402b1726ed03c492
irate - 585 0 10330 585 4 ; 14677:404fd381293676ca 15616:4053a471c3512526 15903:405d88e635a2fed0 16242:4060f5eec3ae190c 17039:40656f7e05523629 ;
irate - 3251 0 10893 1495 2 ; 7598:7ff8000000000001 8349:7ff8000000000001 8920:7ff8000000000001 9601:7ff8000000000001 11260:7ff8000000000001 ; 10893:7ff8000000000001 12388:7ff8000000000001
irate - 1000 8061 18161 1111 16 ; 18572:4281be79acb34c5b 21084:c2244878995fd99e 22102:40024669a7baa072 ;
irate - 2345 0 36206 1169 2 ; 16037:c078e74cbe172082 17057:4084054b5b598ba1 17234:7ff0000000000002 17596:c08064ee64697ffc 18913:40880e4add8ae302 20489:407d10f5ead7df81 21450:4063bc4a40189d0c 23869:c082c26eb523a4e3 26860:7ff8000000000001 27288:7ff8000000000001 30163:c0522ba35645982a 31716:c07325c4e58eb30c 33631:7ff8000000000001 36287:c0816689d04c54ba 36350:c08527b5252611c2 38026:c073474f38396d7b 40343:7ff8000000000001 42743:408d0b977011013d 43311:408ac6238ad4aeab 46201:c07df4d1cc0eb22a 47264:7ff0000000000002 49827:7ff0000000000002 ; 37375:c0c4fcb9cd7d21df
irate - 1000 -790 28563 509 10 ; 14414:7ff8000000000001 14675:7ff8000000000001 17590:7ff8000000000001 18605:7ff8000000000001 19888:7ff8000000000001 21372:7ff8000000000001 23388:7ff8000000000001 24039:7ff8000000000001 26610:7ff8000000000001 27680:7ff8000000000001 29872:7ff8000000000001 31656:7ff8000000000001 ;
irate - 3075 7419 13286 2849 4 ; 9121:bfd41e65ecf13040 9885:c201206fe6680ac2 10882:422686f11aac990b 17787:c2c160f3f366b119 18057:4252a28488b40c91 20980:c0a32039e39cb893 23886:c2c74c5b6868b253 25353:3fcce2e2797953a0 27983:41d25563e1fb8b5a 28696:c0155e174355f9ca 30535:40b2647777909e31 33502:bff4fa599c81236f 33710:42531cadb7a2751b 36431:41b9af857ef28e0c ; 18984:422ae3b3c3328934
irate - 2333 5069 18781 2332 16 ; 11163:fff0000000000000 12721:fff0000000000000 14128:fff0000000000000 14446:fff0000000000000 15180:fff0000000000000 15261:fff0000000000000 17552:fff0000000000000 20060:fff0000000000000 20299:fff0000000000000 22834:fff0000000000000 23416:fff0000000000000 23889:fff0000000000000 24944:fff0000000000000 26864:fff0000000000000 28153:fff0000000000000 28872:fff0000000000000 29516:fff0000000000000 53889:fff0000000000000 55361:fff0000000000000 ; 21113:fff8000000000000 25777:fff8000000000000 30441:fff8000000000000 35105:fff8000000000000
irate - 2231 3217 17095 2848 17 ; 18547:430c6bf5263402dd 20769:430c6bf52634024d 23231:430c6bf5263401f0 23487:430c6bf52634014a 24508:430c6bf5263400e7 24732:430c6bf5263400d8 25298:430c6bf52634000b 25550:430c6bf52634017c 26365:430c6bf5263402c0 27326:430c6bf5263402b8 28111:7ff0000000000002 48507:430c6bf526340021 63927:430c6bf52634025f 65586:7ff0000000000002 ; 28487:432fb87d085a0a15 31335:430d933c5e18d18c
irate - 3167 -3586 10994 3167 5 ; 11257:c03301947166532b 12101:c14430a44b98cf2c 13279:40de3deeb9ed08fc 14970:414359d4e57e1fe9 17767:c0a2dd229af0d6ff 20208:41b4b097b9f91961 22418:42c4b833268c3bcb 24938:420f3e59ee98b558 27723:40f2317530cd91cb 29698:4043f49c51a95c22 31764:4027b1c6df1f5052 33971:c1a59d31bc24e35a ; 10994:414156fc7114be9c 17328:41a0f3b895d6646b
irate - 3684 0 17801 3683 16 ; 6626:4068fb23991f4d3c 6629:4187a8d70f8feb0a 8301:c221f8f3ca9fc702 10783:422742b6723d6c5f 11372:42b31f5f7b464c7b 13745:42f9ca007d682994 14031:3fc11e8767914348 14994:c2b568f1a0fbb445 16688:4257eb3abcdf290c 24785:c10510a1b173793d 25883:40d1ef7c6bdffa70 27775:bfd8b83540518c2d 28426:c03ee665613285a0 30116:c1eeb6b7eb688bdb 37378:c06f129b4d8337d8 39748:415006b432b0ee0e 42492:425691f692a10cf8 ; 17801:42a9b7f7551e065d 28850:c047bb92ae891d18 39899:413b0ccdf2562b68
irate - 1798 -8422 10645 1798 19 ; 14070:4086f20d645c8d41 16694:c04271c34eb5562d 18787:40754ef1d8c41462 21130:c05e2b976987bb18 21616:406031ab2a0ea61a 24234:407d33f731b9a968 25993:c075079fe3c19241 ; 14241:40801710e6815bf4
irate - 1000 0 37996 3689 16 ; 19353:430c6bf5263402a8 20787:7ff0000000000002 20909:430c6bf5263402b1 21663:430c6bf526340115 23591:430c6bf5263401a8 26512:430c6bf526340088 27617:430c6bf52634028d 28107:430c6bf5263400c6 30147:430c6bf526340315 32981:430c6bf5263400cc 33572:430c6bf5263402a8 36236:430c6bf5263401b9 37011:430c6bf5263402fa 39328:430c6bf5263400ee 40449:430c6bf52634009d 41017:430c6bf52634000b 43968:430c6bf52634021b 46579:430c6bf52634015c ;
idelta - 1385 -3851 22608 1385 4 ; 13122:430c6bf5263401fe 21001:430c6bf526340083 22961:430c6bf526340192 24036:430c6bf5263400af 24425:430c6bf526340266 27113:430c6bf52634030d 29862:430c6bf526340269 30298:430c6bf5263402aa 31187:430c6bf52634016f 33805:430c6bf5263401ee 35111:430c6bf526340053 ; 26763:4020400000000000
idelta - 19392 -8101 8124 1446 1 ; 9033:4035d20fb2ce27f2 11082:404e12ebe33238e5 12883:40562dcda594fc21 12942:40610839f52b2231 14966:40647b8cb95543cf 17374:4068cdaf78685a6a 20152:406e30c251ff0e35 22167:4071750f1def3ae2 22231:40722e9ce801d510 23276:4074326dace2e7d8 23966:4076c15ca9f9fdd7 24792:4077986eb5059868 25831:4077c52cfcc7384a 26056:4077fe22a9b9b6d0 28165:407901566569a507 28658:40790a5aad6de1c4 30398:40794c7e02410aea 32464:4015dc28917e4bf6 34167:4040ec3bbc31abe2 34246:404ed817c57a3cda 34811:405753387d082ac2 ; 8124:403b9a9621510cf0
idelta - 1651 7553 11861 822 8 ; 6825:c073479ec5b3d557 9267:4060492dc8bb8288 11881:4089e3bb8f268739 13793:c085b1d9912d67b5 16306:c088cf9f0588dbae 19108:c06924072bfe46cd 28436:c08ad3cf2343b071 29841:c08b186941a817e8 38822:7e37e43c8800759c 41156:404a00684e2b8154 42896:c07a479bcfb47838 44860:4085e584de35c5fc 46529:7ff0000000000002 47273:c080a26bc6916dbb 48440:7e37e43c8800759c 65410:c0814eceedf1c738 66821:40315fc7f747b4ae 68836:406a3ca87dd0836d ;
idelta - 793 0 18824 792 18 ; 13920:7ff0000000000002 16504:430c6bf5263402eb 17772:430c6bf526340293 19259:430c6bf52634031c 20808:430c6bf5263402e2 21239:430c6bf526340004 24211:430c6bf526340283 25493:430c6bf52634026b 26586:430c6bf52634027b 29492:7ff0000000000002 30086:430c6bf52634028a 30564:430c6bf5263401f5 31065:430c6bf5263401c1 ; 30704:c032a00000000000
idelta - 794 1804 30101 794 8 ; 10247:c0818979f3eccfb7 10608:406f75f4760e7298 11897:0 18833:0 19888:4086ae800f9565e7 26801:c05e900d49c9cdb6 28081:8000000000000000 28722:c0896d9dd466d973 30223:c08270c0da976680 32790:c0813084deb20816 34098:4084ddbca5dad28c 34183:408d32da37bb9630 36401:40835fab2891511c 37472:fff0000000000000 39674:c07bdf544aaf9bc7 39881:407586e8db79e388 41850:408b099eae902373 43693:4082ab77bedd31bd 45985:40438b18d9346e27 46263:c08670f821ef7032 48148:c08d6988877dddf7 48773:4064ad625efd8de1 49097:7ff0000000000002 49133:c08c706a53cef5ec ;
idelta - 1923 0 70798 958 4 ; 9638:c0885dff6fbc9202 11009:7e37e43c8800759c 11782:c04b1bc35895f1cc 12594:4081920fb2fd1078 14379:4072f8d1edda21ff 17079:408d3206a8475ebf 19351:4089a9ed08454af8 31924:c08453ccbf8ceac1 33253:c064d5bc421eac21 35472:c06e17c7a136b61a 36464:407750ae00999f12 37983:4060e2b3cdff3a18 38267:c07b3344421f6c38 40080:406c7195027d61d1 41590:40576aac42ef1343 42251:4086bf0c0fbdda5d 43066:c063a63a4c79888c 45992:c08002cc3d0a5062 46793:c060c0f72cd308e8 66271:4078dec57adf7a25 67534:7ff0000000000002 68268:4059732b6a1c8b71 70965:c05b9c7103d3fbed ;
idelta - 17661 9682 13464 697 1 ; 12171:4081980f711808e8 13887:c0435da38840806e ;
idelta - 1505 -5209 69247 1505 4 ; 9991:404cee0064cd50a2 12569:404f414a4b626b3c 15210:404f89da75032797 15736:4056879ca25b42c2 16033:405d08069984c279 16233:4062e9cfef08c896 18565:406923220f4054ea 38335:406e4152067e2e2b 39985:401c981c5aa66b6e 42264:4011750e2a371bc4 44561:403e797436e204e2 47305:404448d82f2c240d 47778:4050df069ae5590c 48244:4059a438b3fe03fa 50634:40603030deb03b66 51437:4064eb1d2f8b6583 52530:4064f6df6ab84f5e 52604:406a1b3e0016be1a 72237:406b73bd141d8cfa ;
idelta - 2999 7252 54941 1496 13 ; 9127:c0ad926b6dbd7cb3 9751:c05cd1f9bfe338cb 10720:4093e00af96278f0 13170:7ff0000000000002 26713:c25c032eb1cb0711 49676:c1b948b89e62fd01 51902:c20eb0d051175c9b 53755:40711bd1c09dcba5 55983:40c986f5a207b82c 56779:c007da705b7d3cae 59595:4010c07e11e2f3ee 61117:4180753f0520322e 63665:3f950457e908de80 64788:407e1cdc61a73599 66620:c0007db634acfdd3 69524:41e949a60570f33b 70556:41a455421989ac5f 70641:3fc7465e5e15f41c 86782:41a5ff9c922efa0d 89697:423a61aa0f0ded31 90692:c1acea16e37b8dbb 91192:411b4eb12219bbee 93209:4074fdfa8f12830b 95974:c06b1571d9fdf87f 98122:c245eed0cfe20b44 ; 59429:c20de68a8c2444b3 63917:40c8fe171402c9cf 65413:c0c98873490d7000 66909:401cadb63fa19245 68405:4180753ee39f360a 72893:407e1c8850479176
idelta - 1000 -814 53882 747 12 ; 19521:430c6bf5263402b2 20452:430c6bf52634015b 20983:430c6bf5263402b1 23456:430c6bf526340112 32242:430c6bf526340026 34896:430c6bf52634008a 36828:430c6bf526340026 39263:430c6bf5263400bb 41568:430c6bf5263402b7 43575:430c6bf526340267 43881:430c6bf526340022 46537:430c6bf5263400e0 49111:430c6bf5263402be 51153:430c6bf5263400e0 52432:430c6bf52634001d 52465:430c6bf526340208 52661:430c6bf5263402c6 53018:430c6bf52634016a 53124:430c6bf526340215 55608:430c6bf526340104 57991:430c6bf52634022d 58449:430c6bf5263400c8 61286:430c6bf5263401cb ;
idelta - 1331 0 29904 662 7 ; 21434:430c6bf5263402d6 23098:430c6bf526340100 24140:430c6bf52634003f 24454:430c6bf52634005e 24762:430c6bf526340121 25292:430c6bf5263402bb 27659:430c6bf52634029b 28745:430c6bf526340088 31512:430c6bf526340030 33166:430c6bf5263401f5 34256:430c6bf5263400fb 34274:430c6bf52634011e 34282:430c6bf526340217 36381:430c6bf526340210 37380:430c6bf526340211 39583:430c6bf5263401d6 40735:430c6bf5263400b9 41062:430c6bf526340014 43486:430c6bf526340194 ;
idelta - 1000 0 20814 1617 3 ; 4862:42b80676331639d2 5007:41413cfc9200b101 5763:4182662398892c25 7891:c15645e6401a5721 9507:3fdac07853940c1e 10201:c175ff53dfa90e2b 11336:c2535b75f5e3386b 12905:c248bd29555bafe5 14451:422a3771417c2403 15171:c01123de3836d658 17930:c0cb26ba7a4e3a64 18594:c0934ea17d5bb4e0 20545:c183be6ee16e4e03 21149:7ff0000000000002 23687:c2ed25941952b815 25327:c1d81e9d88c101e9 25377:421c598524d5225e 27877:c0fbd7dd44e1aea8 30007:c114b5db16acf21c 30384:4012f2f092e7f5e2 30528:c0103e88812556e4 33339:42bbb925f0ea1c96 35692:c2b57a78b653fd9b ;
idelta - 1000 1651 25168 2932 16 ; 8622:7ff8000000000001 9267:4019523a8ffda252 29448:7ff8000000000001 31740:c08c83ecfa4d6718 33281:c082cee444b7d2dc 33298:7ff8000000000001 35152:407427c8f5a85612 35564:4083344a12102a05 47209:405469b606e108b2 49915:7ff8000000000001 60449:40785bb72ea99361 60924:c08b4ea1d6c4852f ;
idelta - 15927 0 2927 408 4 ; 2468:7ff0000000000000 3082:7ff0000000000000 4094:7ff0000000000000 6258:7ff0000000000000 ; 3335:fff8000000000000 3743:fff8000000000000 4151:fff8000000000000
idelta - 1081 -9753 46140 1081 4 ; 17941:40554404189676bb 18044:4059f547cbe0fd20 18602:405a8776efe8d300 20928:405ae52915f67236 21330:405bec02a8f112f9 24185:4060be8f5260695f 24647:40632769b9cee10c 43053:4064999c8057fb32 43066:4067ef4919293941 45501:4019e4b100290d9b 46277:403f0e5caecb9059 46945:404fc8ec35db67c2 47422:40583f743e995368 49792:405c515f5b890527 50745:4061e432717c898c 51170:3ffeb6f11053c57e 54016:403eea53902989fa 55991:40495d2f7d1005e9 57075:4053e2e12e5a1753 57611:405637b0e2b8c5f0 60420:4060bdfef6595fe5 67342:4063a5ee01b6c64f 69759:406630d21c02d59c ; 48302:4022a67da2f574e8
idelta - 932 2237 17001 932 13 ; 6978:7ff0000000000000 9602:7ff0000000000000 12378:7ff0000000000000 14888:7ff0000000000000 15714:7ff0000000000000 15936:7ff0000000000000 17367:7ff0000000000000 20284:7ff0000000000000 22090:7ff0000000000000 24048:7ff0000000000000 26792:7ff0000000000000 29685:7ff0000000000000 30701:7ff0000000000000 30843:7ff0000000000000 32163:7ff0000000000000 34925:7ff0000000000000 36858:7ff0000000000000 39504:7ff0000000000000 40211:7ff0000000000000 43077:7ff0000000000000 45309:7ff0000000000000 ; 18865:fff8000000000000
idelta - 7143 5280 14870 3568 13 ; 19231:7ff8000000000001 22031:7ff8000000000001 24263:7ff8000000000001 25751:7ff8000000000001 26810:7ff8000000000001 26992:7ff8000000000001 ; 29142:7ff8000000000001 32710:7ff8000000000001 36278:7ff8000000000001
idelta - 1000 7302 11518 889 1 ; 7076:7ff0000000000002 7401:4144d72474f9bd95 8351:c1c351cd3df2f077 8988:425bd95e844cb487 20105:41db9693b7e77758 21853:c27f00f3150912e8 24492:bff646e5e6bea066 25953:40667a203e3a63c2 26014:41a3a178f626512f 26529:c111e031313d9304 27505:406027b02d0719ae 27638:3f60dd5cfc496e00 28762:c1513804453d7795 29191:40b687a744a04c6e 29897:c0998a13f6ecfcb6 32729:403df34c067e65b1 ;
idelta - 1268 0 10231 1267 12 ; 7489:430c6bf52634004e 7895:430c6bf526340083 10298:430c6bf526340217 ;
idelta - 77 0 119967 35 1 ; 17495:423dfb2af8ac4f8a 19308:417759f36e6a2206 20085:428643124d3a4cf6 22511:40771deb7d522076 24239:4073146ce16327f4 27103:425bfa1b287ccdf0 28282:c04b7e7261827e5b 28766:4291a1e97c25f472 49609:c16039fdc94bae6a 69164:bfc58f58e940b4d2 71816:c03cfac915d1f7c0 71918:42580b7a1f1ebc69 94500:c0f029a36fcb2477 95969:c1e133dd806d4294 97004:c06ad948c4e917bd 98210:c0410c577d23c264 122006:4030278775249abf 123011:c2f98b94fb8a403e 123576:c057967bcf07eb84 124331:c2a19ce2b0a293bb 126027:42a1d27200b5bdf2 127390:c1ab1dfc2156db3f 128888:c1f05bd400b1241c 129666:c070e73b43456cbc 130038:c2e94b7c1785d75c ;
avg_over_time - 1635 -2422 49962 1634 3 ; 19656:4061b660c9675127 22164:c1e4ca0b73833261 23320:41517f18751b6338 33903:428179fd854c3313 34223:4100e0c3fb68a13c 34317:c101790ee464db18 36005:403d7b6474cd3aaf 38169:40e3b81271f5fc55 40700:c1fc736e15a76a22 43601:c0e82e17bb53f877 45377:c01341a520ad41c0 45992:41066b3c8afdde99 48041:c0df36e54dc54145 50916:bfca1c93d3566636 51074:c176f00926d32e61 62690:c2d7ec258767627b 64987:c0a0a281ed11dae4 66516:c21e48ad8d25c817 ; 49962:c166f0092a16c0db
avg_over_time - 1000 4336 8399 851 8 ; 1815:fff0000000000000 2266:fff0000000000000 4861:fff0000000000000 5347:fff0000000000000 7090:fff0000000000000 7944:fff0000000000000 9426:fff0000000000000 10131:fff0000000000000 10322:fff0000000000000 10335:fff0000000000000 13142:fff0000000000000 25223:fff0000000000000 26735:fff0000000000000 ; 9250:fff0000000000000 10101:fff0000000000000 11803:fff0000000000000 12654:fff0000000000000 14356:fff0000000000000
avg_over_time - 7701 -2866 23453 1695 8 ; 1720:430c6bf526340261 4272:430c6bf5263402c8 5900:430c6bf52634004c 7297:430c6bf5263402e8 8847:430c6bf5263402fe 18867:430c6bf5263401ce 19181:430c6bf5263401df 19777:430c6bf52634006e 21109:430c6bf526340256 22685:430c6bf52634021f 33746:430c6bf526340085 36034:430c6bf5263402dd 36962:430c6bf5263402a8 38337:430c6bf526340290 40327:430c6bf526340153 42909:430c6bf526340067 45045:430c6bf526340226 45375:430c6bf526340008 46677:430c6bf526340064 47602:430c6bf526340260 48212:430c6bf5263401a8 ; 23453:430c6bf5263401b6 25148:430c6bf52634023a 26843:430c6bf52634021f 31928:430c6bf526340085 33623:430c6bf5263401b1 35318:430c6bf526340204
avg_over_time - 2188 -9047 27103 2188 19 ; 3857:407e03cbbe7439ba 6636:c08d69adf3c08d13 8301:404ce93a1449af02 8637:7ff8000000000001 8740:4086f56ee3967ef3 9768:7ff8000000000001 11987:405bc3f62d5acff7 13625:40889f2b7f233ea4 16158:7ff0000000000002 17669:7ff8000000000001 20379:c081e09da7960f80 20822:407a9475037a8e8e 22742:c07b4c6a8ded9ecb 24927:406802b2bbdff6a7 25528:7ff8000000000001 26338:c0879543eb44c4a0 26825:c06e8094822fccef 27466:4063b7f76a828ac0 28048:40839e95378c58c8 ;
avg_over_time - 41 9946 38356 40 13 ; 14126:c0109ec7df3103a7 15742:c074610ccb099e64 18356:404d0641f61714b8 19297:7ff0000000000002 19509:4082b425af45debc 20023:407e5320f12cd5fc 35787:c075f19f5fe3ab77 38195:7ff8000000000001 38216:c065f76b3cd27600 39168:c0737626d6682b7f ;
avg_over_time - 3376 0 7416 3375 2 ; 10115:406d2301b62b401a 11192:4072715243946ef1 13672:c08ad77ec7d93087 15403:c07bde3027dbc509 ; 10791:406d2301b62b401a
avg_over_time - 3965 0 36443 3964 19 ; 11163:c22299a3daa407bd 13695:42214b62f2abaae7 14763:40dfec45a7f8d951 16085:c27ac1b942b77483 17625:412af65ddce1cf12 19075:4141fe879760664f 20504:c171804deb5a4256 20927:41f143652259528a 23222:c23b6af04a787d77 44875:42f7dc03cc2be3bf 47084:c0b0d9e42c518a26 49909:4055ebade2d4166b 51201:bfec1b9d9e9726d8 52988:3fcb83c9f3113144 54194:4066c0d15f1bdff1 55056:c11e23671289c482 55851:c2187a2706006290 57299:40a36d63d3db305c 59383:40d234ca08c38556 61339:c2c68ac38b8c3b26 62777:411ab3937d89aabb 63658:c1b20c7f14056fd3 ; 48335:42e7dc03cc2ad621 52299:4045b376a796e81d 56263:c1f87a45268e7ed0 60227:40c4a276833eeb62 64191:c2ae0e66134718f7
avg_over_time - 3618 0 4011 3617 7 ; 8926:430c6bf5263401b5 9158:430c6bf52634014a 9298:430c6bf5263401d2 11170:430c6bf526340104 13476:430c6bf526340110 13754:430c6bf5263401d3 ; 11245:430c6bf526340175 14862:430c6bf526340172
avg_over_time - 3029 0 9859 3028 6 ; 13819:404a6ddd30d0d970 15632:4051004780199ba8 15887:40599bb6076ee0b0 ; 15915:40529ba40aa5a305
avg_over_time - 1000 16 3219 2022 14 ; 5191:c21b7beff5430e78 7984:407edba4cfc45438 8693:c152f42859b391ec 11525:c0be779ccccf4413 ; 5241:c21b7beff5430e78 9285:c152f42859b391ec
avg_over_time - 77 -2784 17410 2178 3 ; 20833:4059a5ee846b7bbe 21113:405fee42fa525b4c 21416:4065000403108368 23105:40670b460ba36c06 24778:406caa864b41d61f 25876:40700cda2556356a 27748:40714221a5617907 30680:40740ff1c9c7698a 32477:4075cf0f9b9a21d6 35007:407791d0be8f03a8 ;
avg_over_time - 3811 1357 6061 3811 15 ; 10818:430c6bf526340029 12851:430c6bf5263401d9 13873:430c6bf52634024c 15411:430c6bf526340160 16575:430c6bf5263401f0 37019:430c6bf5263401a8 39453:430c6bf5263401e4 39759:430c6bf526340315 41474:430c6bf526340107 43334:430c6bf52634031a 45625:430c6bf52634010c 48124:430c6bf526340028 ; 13683:430c6bf526340029 17494:430c6bf5263401d7 21305:430c6bf5263401f0 40360:430c6bf5263401a8 44171:430c6bf526340200 47982:430c6bf526340213 51793:430c6bf526340028
avg_over_time - 3772 0 23292 3772 9 ; 10656:430c6bf526340017 10864:430c6bf5263402be 11599:430c6bf5263400db 11962:430c6bf52634007e 12293:430c6bf526340268 12720:430c6bf526340142 13183:430c6bf5263400c9 14696:430c6bf526340096 16481:430c6bf52634009a 17142:430c6bf526340211 18651:430c6bf526340221 19753:430c6bf526340063 22678:430c6bf526340228 24172:430c6bf52634029f 24212:430c6bf526340121 27113:430c6bf526340175 30019:430c6bf526340163 31144:430c6bf526340106 ; 23292:430c6bf526340146 27064:430c6bf5263401e0 30836:430c6bf52634016c 34608:430c6bf526340106
avg_over_time - 11321 0 21905 3172 11 ; 17557:c086ee64d4707fe5 19531:40635bb7c7917b73 21896:4060344e33bc87dc 24275:c07083272ec30582 25135:c0825e84380560f6 27434:c081d36f482fa1f0 ; 21905:c062b8847226a96c 25077:c0664bf6ecfe81d2 28249:c0737f4e24668193 31421:c0743339c553b1d8 34593:c07da25a0fb9ae6f 37765:c081d36f482fa1f0
avg_over_time - 1139 -8660 30630 2555 4 ; 20107:430c6bf526340218 20800:430c6bf526340029 21103:430c6bf52634008a 22458:430c6bf526340023 23854:430c6bf526340093 26667:430c6bf5263401e0 28103:430c6bf52634016b 29747:430c6bf52634002d 30044:430c6bf5263401c1 32246:430c6bf526340289 34466:430c6bf52634004a 36842:430c6bf5263401f5 38377:430c6bf526340018 39390:430c6bf5263401a9 41811:430c6bf526340038 43506:7ff0000000000002 46437:430c6bf52634021e 47073:430c6bf5263402a5 49645:430c6bf52634028d 51258:430c6bf5263401ed 52400:430c6bf526340282 54484:430c6bf52634003d 56969:430c6bf526340100 58769:430c6bf52634029c 60923:430c6bf52634013c ; 30630:430c6bf526340018 33185:430c6bf526340038 38295:430c6bf52634021e
avg_over_time - 4415 0 36964 2204 16 ; 13926:4060a38145180df5 23109:4065bc5025056a22 30840:4067d99a559d2c44 33225:40683dd8a79774bc 35124:7ff0000000000002 35816:406b80f41870fa25 37109:407067f969bc8bc7 39133:40707b0729eb24ab 39176:4070bbfcffebb2f0 39386:7ff0000000000002 41225:40204b5584b4c772 41674:404236aca6787cac 42694:40463ecfdb705f2a 44531:404645b30a4ad66a 45283:405576729139d475 48137:405aae58742cdd02 49146:7ff0000000000002 50937:405cfa476d8124e2 52021:40604f30fb61ea59 52257:4062596c30e3ebf7 53855:4067adfe87042230 55849:40695f6c35c2c0c0 57237:4069725bc7bce1c5 58956:7ff0000000000002 60108:406a361da668a481 ; 36964:4069df6660043770 39168:406f17a715401e58 41372:406910ac1fdc84cf 43576:40564d073c4e74a6 45780:404a6a052ba9d6ca 47984:40504ca60b2f9fd5 50188:405aae58742cdd02 52392:405f3e768e8e6ba1 54596:406234efda82a2bc 56800:406886b55e637178 59004:406968e3febfd142 61208:4069d43cb712c323 63412:406a361da668a481
avg_over_time - 1000 686 8864 2388 10 ; 10421:4087874ec1dd1b66 12351:c08665ccabb5e73c 12913:7ff0000000000002 15860:4083f790a87f9775 ; 11252:4087874ec1dd1b66 13640:c08665ccabb5e73c
avg_over_time - 747 7170 27308 746 2 ; 18751:407d8b9aec20bd2b 20299:c08365d03c10a671 21397:c07e64bf76445a70 23826:7e37e43c8800759c 25137:c06b0becfacc2bef 26441:c08ef46ae49fd408 28071:4085c73e25f78781 29811:c0877b33da1aa8e7 30145:c087a9e60dee25ab 31432:c07c28d57e0ce147 33865:7ff0000000000000 35227:407500fb8a693a17 37492:c06e7053ea52be20 40473:406a4320f3dfaf46 ; 28054:c08365d03c10a671
avg_over_time - 2676 -3388 11826 2676 2 ; 2831:407c46d2e70f5551 3577:c06c7e0c6460dc7b 5274:4072d430361a1297 7368:c051f5185a5d51e9 9314:c08ce10f4261b80b 9753:7ff8000000000001 10702:c06f3b312dad484e 12712:407216e47328c489 13111:c07cda4b7e34b468 16085:c0622be5ecc0016f 16556:c08be4835bb6726c 18631:fff0000000000000 20349:c0818a51d6a72feb 22902:c08c8af046d44177 23044:c0190216304695fe 24231:0 25748:c071a9cadb5a047f 25958:4072d6c2d3192d6a 28099:7ff0000000000002 28230:408d62761c309491 ; 11826:c05586ce1617dfbe 14502:c08037be6b733964
avg_over_time - 1000 0 10902 1099 7 ; 3348:7ff0000000000002 5665:c2535356b6e5d8f5 6078:4152dc7921650ba5 13120:c1f1a8ac0cc845c6 14180:c043d828335cf890 14406:41129d4558808e25 16151:3fd3eb24a40e5cf0 17597:c119e43d16571434 ; 14199:c043d828335cf890 15298:41129d4558808e25 16397:3fd3eb24a40e5cf0
min_over_time - 3181 0 22274 3181 17 ; 6224:40005ab1b3bb8377 7440:40314531fb4634c8 9819:401d48dbd04f6b9c 10068:403efc1d5ef49aff 12216:40526e89d9744910 14739:405271a4be55e71e 17236:4059364bb5c39960 19213:405c105bbcf28c8c 31985:40629e4aa9770274 32460:4065e66f313eae5a 47246:4065fe11bdf9def6 49071:406ac7382025279e 49616:406e596c00883ddf 52614:407165c5a4a79082 54569:7ff0000000000002 55736:4071d2dcad423875 57622:40740449524233ce 58710:40769c2edb46bb12 60382:4078f6d23c3b6df1 61139:407a4ed8ca68bd10 63293:407c081fba3b8e29 65187:407cb6cfba6b2e14 ; 22274:405c105bbcf28c8c 34998:40629e4aa9770274 47722:4065fe11bdf9def6 50903:406ac7382025279e 54084:407165c5a4a79082 57265:4071d2dcad423875 60446:40740449524233ce 63627:407a4ed8ca68bd10 66808:407cb6cfba6b2e14
min_over_time - 1851 9345 26978 1850 11 ; 6332:c08d96149851b7e5 8775:408c319620f83440 11294:40695faf0bc3ffc9 13028:408bcae9c7075761 15178:c0823fc94484d1af 16970:4073c7a83a1572e8 19195:4083b152a34d1b81 21405:c088fb4aa076eb95 24402:c08d174bdad032a2 26349:fe37e43c8800759c 29283:7ff8000000000001 32125:40863f94a20d31da 34003:8000000000000000 34772:408231e522e8f309 37071:c08e6c399475eb2a 37971:c066aa09043d5bfd 40905:407e387d00199264 43574:407b5cfafc5f7dbd 45507:408e5bd6549ddb81 46991:c0668f575cbaefed 48922:408c04ca733e8d67 50141:c071b8c41e0c4b74 51842:c080d5bae98e26d7 ; 26978:4073c7a83a1572e8 28828:4083b152a34d1b81 32528:c088fb4aa076eb95 34378:c08d174bdad032a2 36228:fe37e43c8800759c 39928:7ff8000000000001 41778:40863f94a20d31da 43628:8000000000000000 45478:408231e522e8f309
min_over_time - 4835 -3300 24418 3798 16 ; 17979:430c6bf526340281 19108:430c6bf5263401e8 20164:430c6bf5263400b0 20751:430c6bf5263400a0 23572:430c6bf5263401c3 24199:430c6bf526340131 26787:430c6bf526340060 28944:430c6bf526340239 30816:430c6bf52634023f 31138:430c6bf5263402f0 33272:430c6bf526340158 33754:430c6bf526340162 36292:430c6bf5263400bd 38436:430c6bf526340057 40528:430c6bf5263400c0 40691:430c6bf526340154 43546:430c6bf526340244 44312:430c6bf526340019 45074:430c6bf526340185 47198:430c6bf5263401cf ; 24418:430c6bf526340060 28216:430c6bf526340060 32014:430c6bf526340158 35812:430c6bf526340057 39610:430c6bf526340057 43408:430c6bf526340019 47206:430c6bf5263401cf
min_over_time - 1789 6316 8740 735 11 ; 6862:4088a7d9acd57a9b 7886:40649a2edaebe7aa 10239:408c5b4660162eee 12152:c06d33a28b6f1102 ; 13885:4088a7d9acd57a9b 14620:40649a2edaebe7aa 15355:40649a2edaebe7aa
min_over_time - 9 -4386 5932 1 18 ; 3078:40263dddce95d172 5632:c134fac226f69242 8041:c0de81358fb4b181 9280:420b8a43e72bdb6e 10816:3ff10373f1400cc1 13708:42a092c809d09563 24775:422e04db3375f607 25759:c0d06bc8fe6aa3b1 25826:42c30ad92270664d ;
min_over_time - 3536 0 14518 3535 12 ; 4278:430c6bf5263400ee 4670:430c6bf5263402c1 7651:430c6bf5263400a5 9118:430c6bf52634024c 11571:430c6bf5263400ef 13565:430c6bf526340289 16140:430c6bf5263401b9 16827:430c6bf5263400d0 18866:430c6bf5263401d4 20163:430c6bf52634002c 21126:430c6bf5263400a0 21330:430c6bf52634002c 23581:430c6bf526340302 ; 14518:430c6bf5263400ef 18053:430c6bf5263400d0 21588:430c6bf52634002c 25123:430c6bf526340302
min_over_time - 1000 -3030 22805 3148 3 ; 17482:430c6bf5263400b9 19533:430c6bf526340102 21791:430c6bf526340127 24273:430c6bf526340029 24387:430c6bf52634030c ;
min_over_time - 7155 0 18891 3574 4 ; 19381:fff0000000000000 19388:fff0000000000000 ; 22465:fff0000000000000 26039:fff0000000000000
min_over_time - 1000 0 12495 126 8 ; 16392:430c6bf5263400bd 18288:430c6bf526340186 19173:430c6bf5263400a6 21153:430c6bf5263402c1 23798:430c6bf5263401da 25647:430c6bf5263400bd 26600:430c6bf526340180 26971:430c6bf52634025f 27775:430c6bf52634013b ;
min_over_time - 1000 7085 16474 804 5 ; 4117:7e37e43c8800759c 5050:7e37e43c8800759c 6195:7e37e43c8800759c 7854:7e37e43c8800759c 7915:7e37e43c8800759c 8858:7e37e43c8800759c 11160:7e37e43c8800759c 13667:7e37e43c8800759c 14292:7e37e43c8800759c 16128:7e37e43c8800759c 18642:7e37e43c8800759c 19487:7e37e43c8800759c 21555:7e37e43c8800759c 24462:7e37e43c8800759c ; 16474:7e37e43c8800759c 18886:7e37e43c8800759c
min_over_time - 1000 4759 13361 3432 7 ; 12017:7ff0000000000000 13923:40844db2a26b6271 14466:c08790b8bb7f19f7 17330:c088ecc13fa97212 20264:407bc152f8ac3ef5 20642:c08f34df9d5ef97d 21537:7ff0000000000000 22041:c05579d4968b1e7d 23067:408d50a63d366bcf 23216:c080b3e92a8ef1fa 24333:c06e973fd31e77a9 ; 16793:7ff0000000000000 27089:c05579d4968b1e7d
min_over_time - 1000 0 33879 3547 6 ; 20479:c07c41a8f003e9b1 25956:40753989c0aa883b 27571:c07d1752337d1305 28078:4071737a6184a724 29389:408e18f7fc1d9584 31891:407082de038daf9e 34427:c06962f770761f44 36679:8000000000000000 ; 37426:8000000000000000
min_over_time - 425 -5614 22883 209 5 ; 15260:7e37e43c8800759c 17858:7e37e43c8800759c 19797:7e37e43c8800759c 22564:7e37e43c8800759c 25300:7e37e43c8800759c 27586:7e37e43c8800759c 29077:7e37e43c8800759c 31664:7e37e43c8800759c 32411:7e37e43c8800759c 32537:7e37e43c8800759c 33530:7e37e43c8800759c 33730:7e37e43c8800759c 35225:7e37e43c8800759c 36564:7e37e43c8800759c 37370:7e37e43c8800759c ; 23510:7e37e43c8800759c 23719:7e37e43c8800759c
min_over_time - 357 310 25829 973 19 ; 20657:404b3c0681a6b79c 22493:40559ca70ad51c8d 23327:4058d09dc4efc2fa 25085:4061697e29353d6c 26048:4065b1f6762df9fa 26990:40669e9520589da4 27002:4069de968cbe49ff 28989:406a2864d04ec6cf 31542:406d3cd0e513d20a 32689:406ef5d2b01ddd13 33481:4071591f0ce6a4b3 34148:4072469ec64f6896 37000:401a7f5335b85d4f ; 34586:4072469ec64f6896 37505:401a7f5335b85d4f
min_over_time - 1000 0 11070 858 13 ; 15715:7ff8000000000001 27857:7ff8000000000001 30107:7ff8000000000001 30417:7ff8000000000001 30442:7ff8000000000001 32982:7ff8000000000001 35609:7ff8000000000001 36256:7ff8000000000001 ; 16218:7ff8000000000001
min_over_time - 6579 0 13708 3286 10 ; 18183:430c6bf52634008f 20393:430c6bf526340150 ; 20280:430c6bf52634008f 23566:430c6bf52634008f 26852:430c6bf526340150
min_over_time - 7507 0 36267 3750 20 ; 17140:c044c8bccbea4f25 19527:40373c7f19c3fc2c 22083:42bfcb04cd62c9a4 24478:c2c3977e99d000c8 25147:40336c243ef48688 25708:c0777e201a571de3 27971:406bcd72b5f4c8dc 29939:41eb32fd37a6426a 32836:c2ee35f49c4038f7 35434:42a207a037c2592b 36007:42ca89694fbc4653 36673:420ee2aeeb58e858 38432:3fcd7b1ed0e1c008 41291:c1f3168ed325a07c 41744:420009a08a1d30b7 51338:40d40230c434783d 53361:c2c17137e521f749 54269:407c2d34440dee8e 56192:c1c530ca61caf30b ; 36267:c2ee35f49c4038f7 40017:c2ee35f49c4038f7 43767:c1f3168ed325a07c 47517:c1f3168ed325a07c 55017:c2c17137e521f749 58767:c2c17137e521f749 62517:c1c530ca61caf30b
min_over_time - 16661 0 1422 134 18 ; 6270:40872db6fbf84217 7944:4087c8db98a69b27 8677:c08821dc9584807f ;
min_over_time - 1000 5846 7448 559 5 ; 6918:404ea54b73c52b1b 7616:405064422daee892 10144:401fedbf5b312790 10453:7ff0000000000002 13231:404383443bdf559e 14087:4050f8843ce65ca7 15013:40543e620780cbf6 16471:405d70d43ab5f74d 18634:4060db8791639fec 19186:4062d9e384c529d4 19386:40686b58bd322e86 ;
min_over_time - 3714 0 14204 3713 8 ; 4878:7ff8000000000001 6652:7ff8000000000001 7551:7ff8000000000001 7710:7ff8000000000001 9975:7ff8000000000001 21553:7ff8000000000001 22290:7ff8000000000001 23599:7ff8000000000001 25518:7ff8000000000001 27332:7ff8000000000001 28871:7ff8000000000001 29398:7ff8000000000001 32299:7ff8000000000001 32994:7ff8000000000001 33060:7ff8000000000001 49738:7ff8000000000001 51601:7ff8000000000001 52311:7ff8000000000001 53253:7ff8000000000001 54398:7ff8000000000001 56556:7ff8000000000001 59042:7ff8000000000001 67988:7ff8000000000001 ; 21630:7ff8000000000001 25343:7ff8000000000001 29056:7ff8000000000001 32769:7ff8000000000001 36482:7ff8000000000001
max_over_time - 5216 0 20813 3279 18 ; 12268:430c6bf5263400aa 14903:430c6bf5263400f7 15443:430c6bf5263400c0 16181:7ff0000000000002 17329:430c6bf52634000d 19573:430c6bf5263402ed 19847:430c6bf526340208 21833:430c6bf526340301 24667:430c6bf5263400b7 26729:430c6bf526340244 28989:430c6bf526340304 29844:430c6bf526340132 32266:430c6bf5263401b2 ; 20813:430c6bf5263402ed 24092:430c6bf526340301 27371:430c6bf526340244 30650:430c6bf526340304 33929:430c6bf526340304 37208:430c6bf5263401b2
max_over_time - 1000 0 7098 1540 3 ; 6038:c0b1287f45f1008d 6987:c07d0a11dcf8db52 8282:c18546c16a9724c1 10439:4032002139a49bd4 11876:c14fbd24cf984efc 13760:418602057a97e322 16287:415228ddeb2c4be0 16860:41f14419d0ef64ad 18995:3fd205707045c3e0 20697:3fc2912464a87dd8 23398:c21ad4db15993319 24506:c2a6f912b5bd5d36 ; 7098:c07d0a11dcf8db52 8638:c18546c16a9724c1
max_over_time - 6951 -7575 26649 3472 16 ; 11367:c0a869e77597ccd9 13467:c260e491e624180f 13644:42c05e1673bc65c3 13941:bfc39608fbf0ec60 15855:c2f0d4223723d2b2 17982:4038f281a10454fd 20160:4115c9e789c504af 20637:c2449f2d07f2e1da 35936:7ff0000000000002 36563:c27ef2351b2b399b 39060:c0756786117fbb4d 41214:4059d194ebe66102 42287:407d3deac814109d 42292:c2b64392f0ab8141 44874:c29098284ad082e4 47243:c2e02cd3fa14257b 54547:c18a2b2cc9eff644 55400:409dbdaccb5b7f6c 57983:c0e8080e85aa9dd7 ; 30121:c27ef2351b2b399b 33593:c0756786117fbb4d 37065:407d3deac814109d 40537:407d3deac814109d 44009:c29098284ad082e4 47481:c18a2b2cc9eff644 50953:409dbdaccb5b7f6c 54425:409dbdaccb5b7f6c
max_over_time - 10247 0 26168 3807 6 ; 19775:c089d2c6d9e90cd4 20940:4079e51c54ec7bc3 21445:c08766a41129f18f 24010:7ff0000000000002 26652:c05d702a596caffb 26920:7ff8000000000001 27243:7ff8000000000001 27998:7ff8000000000001 ; 26168:4079e51c54ec7bc3 29975:4079e51c54ec7bc3 33782:c05d702a596caffb 37589:7ff8000000000001
max_over_time - 1000 9499 21706 1159 16 ; 17628:40624b0129b9856d 19465:4089f25605474290 21493:408cdeb83aaf0553 24199:c08e0b691f17ed42 24412:c06f55850d6a329a 25817:c06d04302923201c 25961:408c8247429d619e 26998:7e37e43c8800759c 29039:c08172ed79ef6bff 30401:404d3ae152284265 33173:408118605ad4671e 35209:c05493c9af29c20d 41585:fe37e43c8800759c 41818:7ff8000000000001 65544:c071ca7876cbd3c4 65624:c08b5ff4ea78b61d 68548:c05cbac59875d0fe ; 27501:40624b0129b9856d 29819:4089f25605474290 34455:c06f55850d6a329a 35614:408c8247429d619e 36773:7e37e43c8800759c 39091:c08172ed79ef6bff
max_over_time - 160 0 57563 1665 16 ; 23230:430c6bf526340019 25246:430c6bf5263402bc 27269:430c6bf526340168 28570:430c6bf5263402f9 28599:430c6bf52634025b 30743:430c6bf52634028b 33143:430c6bf5263400b0 35071:7ff0000000000002 37793:430c6bf526340263 53032:7ff0000000000002 54830:430c6bf52634031e 55744:430c6bf52634009d 56976:430c6bf526340067 57808:430c6bf526340163 59673:430c6bf526340303 59928:430c6bf52634001c 61021:430c6bf5263401d5 63466:430c6bf526340141 65524:430c6bf526340082 68320:430c6bf5263400a0 70750:430c6bf526340089 72511:430c6bf52634020e 74421:430c6bf52634003f 74653:430c6bf526340097 74980:430c6bf526340063 ; 70883:430c6bf526340089 72548:430c6bf52634020e
max_over_time - 2240 1692 16855 2240 17 ; 18757:408c1bdbdb2c67a4 19570:c0852629561d9dc2 21912:c062b8f379608af8 ; 21335:408c1bdbdb2c67a4 25815:c062b8f379608af8
max_over_time - 1872 -7769 26778 1871 9 ; 14183:430c6bf526340070 16776:430c6bf526340202 17188:430c6bf52634015e 18226:430c6bf52634022b 20084:430c6bf5263401b6 21986:430c6bf52634023a 23190:430c6bf52634003a 23616:430c6bf5263400e4 25326:430c6bf526340219 25627:430c6bf526340253 28117:430c6bf526340161 29273:430c6bf52634006f 29742:430c6bf5263402d0 30585:430c6bf5263400e3 31629:430c6bf526340072 33961:430c6bf52634010c ; 26778:430c6bf52634010c
max_over_time - 3321 3395 482 3321 15 ; 5321:430c6bf526340277 7634:430c6bf5263401d4 8124:430c6bf52634002f 10255:430c6bf526340134 11968:430c6bf5263402f8 11997:430c6bf5263400c7 14019:430c6bf526340263 14109:430c6bf5263400cf 14240:430c6bf526340115 ; 10445:430c6bf526340277 13766:430c6bf5263401d4 17087:430c6bf5263402f8 20408:430c6bf526340263
max_over_time - 1941 6408 25485 2878 11 ; 2081:3fcffbbe7a0eac90 4469:407ea15836a048e6 18915:41bd95371e47e7da 20866:415277cfdcd981f4 23796:417f75170715dceb 25311:c043a4178d7cda65 27112:40b04e913e23a792 29234:c1d8a87cf7c8229d 31653:c2c645182a203249 ; 25485:41bd95371e47e7da 28363:415277cfdcd981f4 31241:417f75170715dceb 34119:40b04e913e23a792 36997:c1d8a87cf7c8229d 39875:c2c645182a203249
max_over_time - 2486 0 9433 2485 8 ; 10814:fe37e43c8800759c 12102:fe37e43c8800759c 24343:fe37e43c8800759c 25237:fe37e43c8800759c 27383:fe37e43c8800759c 29827:fe37e43c8800759c 30475:fe37e43c8800759c 31240:fe37e43c8800759c 33426:fe37e43c8800759c 36275:fe37e43c8800759c 48930:fe37e43c8800759c 49776:fe37e43c8800759c 50210:fe37e43c8800759c 50998:fe37e43c8800759c 51569:7ff0000000000002 60255:fe37e43c8800759c 61735:fe37e43c8800759c 62831:fe37e43c8800759c 64268:fe37e43c8800759c ; 11918:fe37e43c8800759c 14403:fe37e43c8800759c 24343:fe37e43c8800759c 26828:fe37e43c8800759c
max_over_time - 2743 -9947 28377 2743 9 ; 2653:403a27854bf0d3ce 2773:407f4588d6dbc1a8 3186:40750d38db7fccb7 4242:4079fc9160e020f9 4397:c07a02db745f5d62 6730:408412b6d260ca1c 9260:40819e1ab0097a40 12050:40573f3a4fd48be8 12792:c08451be6276125b 22428:c08817f8f1da3ed2 23666:408e226f23cc7688 26272:c085a58211e49435 26707:c041c46b3cd2d0bb 29502:4079dc9769c3d620 31849:c08820cb620b7ba3 34394:c0607df791a04cb0 37035:c068ee6c80b8830f 38079:4028d85fd11d423d 40590:c08cfe3fbcbc48ef 43041:c08616d0b3aec582 ; 28377:4028d85fd11d423d 31120:c08cfe3fbcbc48ef 33863:c08616d0b3aec582
max_over_time - 1988 0 65062 1988 11 ; 13043:c10faed9ff30a9b5 15389:c00b01a23a83620a 17606:c2533331f7f2c625 18866:c03607f80c324251 32629:7ff0000000000002 34582:c1760083aeacff99 36240:40d84cd17b1a9426 36428:428011d7fdea41d1 37810:4283c905305a7022 40079:c03c22fac8a173c0 40614:42f43dd012a687ff 42263:c016c1d39e8218cc 59158:40602115c242b10a 61529:414a31eadf2c82a2 61964:c25717ea8487d9bb 82453:400b2389ce98bfe8 104246:c2fb4cbe59d255fa 104839:c0c7f5ce3a66e57f 107450:c1147e7e28ad16c9 109123:3fd5b3f91ea6e3c2 109810:c152a6709bf31668 111525:c0d27644eee1fe83 ; 82954:400b2389ce98bfe8
max_over_time - 1251 4092 12393 1251 11 ; 13897:424570eaefd4da61 16229:40a89e11ddf7a446 16846:40622bf43eff3833 17025:418e7064b438715f 19426:4063e8fb08c2b811 19669:419f7837273069d9 21193:42388c2dc2ac2589 21312:3fd9407f72016d04 23855:c037f7e56417ada7 ; 18648:424570eaefd4da61 21150:418e7064b438715f 23652:4063e8fb08c2b811 24903:419f7837273069d9
max_over_time - 4837 0 7631 2415 9 ; 3598:c25adc2a6d721cb9 6424:40b22f076b887be7 8190:c25597c76e7f9068 ; 7631:40b22f076b887be7 10046:40b22f076b887be7 12461:c25597c76e7f9068
max_over_time - 7841 0 26748 3917 7 ; 16187:7ff0000000000000 30070:7ff0000000000000 31869:7ff0000000000000 34192:7ff0000000000000 34503:7ff0000000000000 35524:7ff0000000000000 36560:7ff0000000000002 37521:7ff0000000000000 39952:7ff0000000000000 40861:7ff0000000000000 41002:7ff0000000000000 42449:7ff0000000000000 ; 30665:7ff0000000000000 34582:7ff0000000000000 38499:7ff0000000000000 42416:7ff0000000000000 46333:7ff0000000000000 50250:7ff0000000000000
max_over_time - 1646 -2829 12474 1646 11 ; 12594:c182a525458d40a1 14718:c132693877752b3b 16327:40b8ab00cc5a6dfb 18950:42fc5e11334605b0 21353:41d1a43056aee718 23670:c22007e30e5eebf3 23842:418037d49d5c0314 24552:4215f7bcfdda46b4 26170:c214dbce48aaaf34 ; 12474:c132693877752b3b 14120:40b8ab00cc5a6dfb 17412:42fc5e11334605b0 19058:41d1a43056aee718 22350:4215f7bcfdda46b4 23996:c214dbce48aaaf34
max_over_time - 1000 6201 3753 1651 20 ; 918:c02f0072a010a27c 1666:403cc312e7786370 4661:7ff8000000000001 ; 8706:403cc312e7786370
max_over_time - 730 0 52477 729 11 ; 12539:411823597d26616f 21914:c1856bf04ef7b468 31047:40814e67cd514aa9 31284:42bc45db36a239c2 31905:c06245603750a8a1 31997:c18207dd15d0b31c 34616:41a43d158b9a6cc8 35873:403c8bfa2a2de204 38762:3ffe241ae186a676 40414:c2dc9e46461a5718 43170:40af46c87c460d9c 43739:428f0380085c7ea8 46129:c2f0ff17ca5e9130 46159:c07dcfc0449b65d6 48797:c1b24d762efd1995 69726:c2c516d0739f78ef 71852:42225357a66430eb 73787:bfd47caf443fe2f4 76200:4140eaf47315b30a 76311:c06896e100c89f8d ;
max_over_time - 4785 0 50878 2389 11 ; 20162:4073e95ed8275dbc 22860:405c57deaa0b4a14 23486:7ff0000000000002 24157:4076f6f133988cee 26206:40707d9c9ec51655 27519:c08de3c76cf8c963 30439:7ff8000000000001 32690:c0608a583aa8b0ec 33752:408c161e14cc4919 34126:c08e88a3fe47a5c9 35283:406f7b12981ed420 36483:c08deb4d32403010 37527:c08000d9b2617911 37858:c086e2000f1efae7 39843:408dab07842a3109 42501:40863f6479774ee1 43861:c0483f613439bcd5 46445:c06339531f2dd213 49283:7ff8000000000001 51489:c0811e55fc6736f7 52343:c08935259b5ab0ca 53874:c08a3026c64adb28 ; 50878:c06339531f2dd213 53267:c0811e55fc6736f7 55656:c0811e55fc6736f7 58045:c08a3026c64adb28
sum_over_time - 537 0 14542 537 10 ; 5328:4073fa30feeb3699 6000:7ff8000000000001 7324:c070466d5b6392c3 8174:c07ab59b811df09c 9313:7ff8000000000001 28424:40650b44d2c26faf 29161:c083e4dbd9cdf18b 31739:40537cfc2358e874 34571:7ff8000000000001 36517:408a66f0902eb6a8 37238:c089affec35d3ab3 38210:7ff8000000000001 38502:4084c9a768bf78c7 40736:4086647ebc6d1fdc 42661:40898a49a5f9783b 43347:c06e1fffd1bafba1 44325:c071061cdfc9ee9e 45920:c07e25b42509531e 46943:c089044fd0b22f45 49680:c07dbd945de4ba7d 50266:c08eb76a9012d060 53090:404c32a4134954d0 56063:7ff8000000000001 57086:c082d28eb6226408 ;
sum_over_time - 1000 -2213 36804 2098 7 ; 21342:fff0000000000000 22780:fff0000000000000 23508:fff0000000000000 25342:fff0000000000000 26705:fff0000000000000 29182:fff0000000000000 31304:fff0000000000000 31362:fff0000000000000 31471:fff0000000000000 32799:fff0000000000000 33933:fff0000000000000 34663:fff0000000000000 37209:fff0000000000000 37420:fff0000000000000 38359:fff0000000000000 38398:fff0000000000000 40604:7ff0000000000002 40870:fff0000000000000 41950:fff0000000000000 42510:fff0000000000000 ; 36804:fff0000000000000 38902:fff0000000000000 41000:fff0000000000000
sum_over_time - 16380 -7526 27505 1348 13 ; 2824:c0887b4fbe84a109 5430:405aca61a992ec26 5978:4086805ab88f393d 7293:408ca6bd120e8ef1 7947:4082c07f0bee94a3 17520:408a88ec24aba38c 20490:c086bdd5ce28758c 22846:c07c327c994fdfd4 24442:c052af67012ad17d 26426:4086077129ddfbe0 28271:4089c29b675e2ab3 28972:c0713abe278e825d 29617:407ef3911a0e00ad 31219:c07a8113dd40be66 31232:c0518136990e76db 34143:c08d1ffba86dc65f 36316:c076b31faf50f0e5 38433:c08514a8cdbb3e4c 40730:4032fb043e2c357e 42582:c074b3ed980abb97 42618:4070507018526d15 44269:408006d9c4d7f705 47011:40839980e76cf3b0 48607:40826056e1e63812 ; 27505:c08d17375aa9ce58 28853:c094386399292365 30201:c081b2f16429d13e 31549:c09363cd18f287c5 32897:c088ae5be53d1fa0 34245:c085c096e32663c5 35593:c096fce366704373 36941:c08df2ed08088fe1 38289:c0978c14adcfbcb3 39637:c0957c38809cc306 40985:c08b87c03f7757fe 42333:c0724ed2bb223fd7 43681:4083f8924adca673
sum_over_time - 17138 7980 24396 2966 15 ; 13917:430c6bf526340171 16078:430c6bf526340103 18459:430c6bf5263402b7 20916:430c6bf526340297 21452:430c6bf52634010a 23776:430c6bf526340192 24179:430c6bf5263400e7 26183:430c6bf5263400ce 28207:430c6bf52634017c 29478:430c6bf5263401ac 29601:430c6bf526340281 31934:430c6bf5263401b7 34206:430c6bf526340151 35953:430c6bf52634029b 36324:430c6bf526340275 36912:430c6bf5263401f4 ; 24396:431c6bf52634013a 27362:432550f7dca7014b 30328:4331c37937e0811a 33294:4338de76816d8169 36260:433ff973cafa81b2 39226:4341c37937e08105 42192:43438a388a43c125 45158:434717b72f0a416a 48124:43438a388a43c130 51090:433ff973cafa8210 54056:4338de76816d81c7 57022:4331c37937e08142 59988:432550f7dca701c1
sum_over_time - 2411 2037 16776 2410 14 ; 9548:40895f88c1024f30 12016:7ff8000000000001 14603:40800d07ca20cec7 16664:406bc64cd9896d83 16785:7ff8000000000001 19562:7ff0000000000002 22255:7ff8000000000001 24786:c0820cf4baf19ef7 25588:c044ce40ab85b90c 27325:7ff8000000000001 29248:406d729183ec474d 32087:c07f4b8e58105f87 33809:c08cd2e79f500473 34193:7ff8000000000001 ; 16776:40800d07ca20cec7 19186:7ff8000000000001 26416:7ff8000000000001 28826:c08359d8c5a9fa88 31236:7ff8000000000001 33646:406d729183ec474d 36056:c0963c5765ac1a1b 38466:7ff8000000000001
sum_over_time - 2527 0 23346 2527 7 ; 21342:c28b0c2468d64e0a 23551:42d93dad081a2afb 26481:c286695a0625f02e 26528:41f0096fb84a97cd 27365:c04611847d0684d7 29345:4010e08b82743370 30595:c00be5b7a547d629 32543:c1b3102bcd93df7c 33660:c113a1541d44f87a 35791:c10218478b52b6fb 37532:c224ac512bd03c2d 38296:3fdb16e45402a38a 39536:c0a9eda422d0b222 39983:c073a69d4b7ddccd 41009:c206d0d7cd3af29b 41038:417c4d512f28288c 41799:c2f03e32a6b1eb29 42755:42b789600e1effe5 44234:4106b7e5f405e7ac 44634:c2730af53f99fb8e 47116:c0e49a4c1cabbf65 48298:41c5c643834df5d8 ; 23346:c28b0c2468d64e0a 25873:42d93dad081a2afb 28400:c28661554e4b2bfa 30927:3fe76d7d7e8242dc 33454:c1b3102bcd93df7c 35981:c11cad77e2ee53f8 38508:c224ac512bcf6376
sum_over_time - 9597 0 11434 2079 10 ; 9231:7ff0000000000002 10011:c07faa66d43a5141 11397:4047b9f37dbf5c98 12211:c0810907c7b4179b ; 11434:c07cb328648265ae 13513:c08f629bf9f54a72 15592:c08f629bf9f54a72 17671:c08f629bf9f54a72 19750:c07f1ad11fb043a3
sum_over_time - 5135 -5680 13619 2868 15 ; 16038:430c6bf526340002 17387:430c6bf526340256 ; 13619:431c6bf52634012c 16487:430c6bf526340256
sum_over_time - 1000 2035 48608 858 19 ; 20349:0 21573:0 22804:0 23011:0 25923:0 26572:0 26778:0 29682:0 30550:0 33525:0 33616:7ff0000000000002 34559:0 35276:0 35670:0 36760:0 39631:0 41925:0 43643:0 44898:0 46716:0 48658:0 51493:0 ; 49466:0 51182:0 53756:0
sum_over_time - 2359 -9872 417 1176 7 ; 4567:430c6bf526340132 6176:430c6bf526340203 7449:430c6bf5263402d5 9326:430c6bf5263402ac 9587:430c6bf526340274 11033:430c6bf5263402cb 16296:430c6bf526340050 16603:430c6bf5263400f4 19449:430c6bf526340069 19509:430c6bf526340068 21471:430c6bf52634025a 22119:430c6bf526340298 23118:430c6bf5263400aa ; 417:431c6bf526340290 1593:432550f7dca701fb 2769:430c6bf5263402cb 7473:431c6bf5263400a2
sum_over_time - 1977 0 16688 1976 1 ; 2376:4044c8ef039bee1e 3114:c083c97471af6a3e 3573:c0599bb82567715f 4076:408992d3df5d0c2f 6971:7ff8000000000001 9104:408e756f2277165c 11302:408102d7a9fe5f2f 11396:c0808582e6e4b360 13381:c07e92e1cb806cde 14637:c081d76edddc3610 14938:c08eba31616f2988 39047:4050702eb7b5b2b0 41148:c074e307bcbcae5b 55498:408cc5c63e76f07f 57782:c08ae7f2c7b19e5a 58327:c088df882202ac40 60229:7ff8000000000001 62894:405ee80b623454cf 64526:40875caaa682bb16 65502:4089972430e64f01 67321:7ff8000000000001 68882:40757230d78ee7df 70449:c08c9ad6a4cddd6d 70592:407bc37457752f25 ; 16688:c08eba31616f2988
sum_over_time - 865 0 2139 429 2 ; 3476:430c6bf526340139 5547:430c6bf5263402ed 8188:430c6bf52634022d 9027:430c6bf52634015c ;
sum_over_time - 2937 0 33840 2937 7 ; 21540:3fda0523be08c174 21785:41b7747e4cae32e6 22645:42e7056caae9f7ac 24160:41de782cbc1ec08e 26694:3fd2b4f4ef893316 27979:c001cfe94883d819 29491:40e862e90c28ae94 31176:4010ea28e75072c8 31452:4076686b46c0bf04 34394:c06140f1be824f77 35727:42f6fa117197c6ce 36741:c2bd213e75c7188d 37686:c1adfef3d9e39a2a 39036:41e07330b9494bee 39208:428e1aa7b0d0b85b 40195:c214260f098067d9 42830:4059b26491c8886a 43046:40527fc279232b3e 44849:3fc056f86cbd0f8c 46860:40e73cd09f1217f1 49416:bfc99f7f9a949d3a 52108:c0057b09520432ea 55025:427ccd53a66373ef 55821:400ac2492f9b9092 58438:40e7b26a07cb8ff3 ; 33840:4076ac13ea5e00cf 36777:42f527fd8a3b4ca5 39714:428e1e4c812fa320 42651:c214260f098067d9 45588:40661d2943910918 48525:40e73cd09f1217f1 51462:bfc99f7f9a949d3a
sum_over_time - 1000 0 20932 1499 2 ; 11467:bfdf9a4090cc322c 21812:c0a41f54105926ce 24280:4011cb53afd6bb47 24439:4169ebda80b6df50 25995:41b8eaf2d7a119c7 26733:c07ad6fc2e52b17b 29555:c2372940ed6b0a72 30941:c105bced061fcf49 32045:c0a772e23b5ad752 34132:bff57373c904ab1a 36744:415218fc73e3c301 39173:c0af84e929014dae 41260:c287cfdd27ebe7b8 42811:4221fd14047e6977 43126:c1c960232ea73fcf 45740:41afcca72e2c4063 48256:415cfed64e71d109 50042:c2a3da2237858653 52975:40ddc527a97db8ca 54500:40d39e1cc0f268de 54765:40aaa51fd6118ace ; 22431:c0a41f54105926ce
sum_over_time - 7885 2908 39805 3939 19 ; 42072:fff0000000000000 58060:fff0000000000000 59651:fff0000000000000 61009:fff0000000000000 63690:fff0000000000000 65237:fff0000000000000 66303:7ff0000000000002 66462:fff0000000000000 67956:fff0000000000000 69495:fff0000000000000 71940:fff0000000000000 72252:fff0000000000000 73627:fff0000000000000 73921:fff0000000000000 75143:fff0000000000000 75347:fff0000000000000 ; 47683:fff0000000000000 51622:fff0000000000000 63439:fff0000000000000 67378:fff0000000000000 71317:fff0000000000000 75256:fff0000000000000 79195:fff0000000000000 83134:fff0000000000000
sum_over_time - 7781 -6239 21081 3887 11 ; 10358:8000000000000000 11665:8000000000000000 14267:8000000000000000 16359:8000000000000000 18370:8000000000000000 19862:8000000000000000 21732:8000000000000000 24367:8000000000000000 26721:8000000000000000 27352:8000000000000000 29163:8000000000000000 ; 21081:0 24968:0 28855:0
sum_over_time - 837 9591 -1768 837 1 ; 2851:405aa937f27350df 3505:40607ef0feffa262 4349:40618a67d34c1bb6 5066:406431891a38672c 7914:4065412206978880 10290:406908eeca01fbb9 10521:406b42b9ae8a75fc 12480:406d9751f100a665 14324:406dab41d50eca1b 15283:40702739c8bdfc75 17745:4070d006816d10e3 18825:40733bcb528bd87c 19817:40200197c419a67a 21679:404b60bad1dbf496 21728:404f08295d3423bc 23247:40574f8a25c5a20b 25111:405dcc17c076f488 25344:40620c606076052d 28009:4067222b635d6f2c 29434:406bce4eb1f10844 30230:406f4f3ac6f063dd 33153:40142ce972aa70ba ;
sum_over_time - 4588 -6528 65779 2992 20 ; 9203:c2f227753065e838 9783:c140076cf8781e55 11416:c250447a80e41b3b 11684:c223fcc8e842d47a 13557:c1e328465696dab4 16253:41f2482df99e87e8 25987:41c69fd71439b885 43860:41b0e7829141c974 46136:c0d2080b1181b28e 46395:c13c0d265d10a397 46683:3fe8166afb733694 48881:c2b9e3b00cdeeb63 49817:427caa2e88dac780 51401:41e8fd7d70b2d72d 54121:c1713e1b864ddb49 55054:c11adbc958e8256b 56040:41448e9f54467768 59023:bfb7a0b22a0a79f4 59221:c07b3c907e1c56e7 60912:40cda0bd97c4b1ca 62970:40407de3f495a3b7 65113:c17ceb658038fe2f 66204:c2ba5dfa6f12aeb7 ;
sum_over_time - 4407 -3869 44797 2200 3 ; 10828:40423d21aad3903e 10848:4044d7c85a0fccc7 13529:404cd1f8b4da7604 14409:404ec5754a44eb18 38046:4052a37b9307d98a 40182:405692b31b69f9d9 40904:4058e8ac8f6fb5b1 41489:405a7682792af5da 43156:405bf5a6ffcbbe00 45038:40628e0ac64ea331 48007:4068caedc7c044bc ; 44797:4075ac7c470773f6 46997:4068caedc7c044bc
sum_over_time - 3530 -9430 61093 3530 19 ; 14722:0 16977:0 19457:0 20885:0 23859:0 26748:0 49176:0 49917:0 51660:0 53637:0 78273:0 81053:0 83624:0 83655:0 84659:0 85034:0 86267:0 87166:0 87823:0 89400:0 90085:0 ; 71683:0 75213:0 78743:0 82273:0
count_over_time - 2453 -2171 18210 2453 4 ; 20349:40616b010c31055f 22092:c074623e5d7e5fc0 22161:408c57faa9997028 24265:4085eb735b625d04 25914:c0677ba88206b378 26218:c070fc3b5b44adc6 28457:7ff8000000000001 30942:c0894a93455abb60 32803:4070543e9e66bbc2 32958:c087661c2bfe0f3f ; 18210:3ff0000000000000 20663:4000000000000000 23116:3ff0000000000000 25569:4000000000000000
count_over_time - 3782 -4824 39637 3782 3 ; 6516:40741c64b7c1a239 8771:7ff8000000000001 11640:40494aabf97ecf3c 26768:c0805ea6abc8e360 29105:4088dcc1607b105d 29812:408415b251ed3878 32066:c07b238eb54d678b 34098:40603633c54c9291 36431:404ff8039aa7696e 38219:7ff8000000000001 38507:408b3c5fe253012e 38587:406bcdc8515fe6dc 40352:408a31f51223cea8 42915:c081fb81cc534f4a 43153:7ff0000000000002 45719:408b087282790b83 46033:c085761ded091522 47171:7ff8000000000001 49497:404f2c039528501c 66045:4086aeb69abd5fde 67264:4081ba39f3278bee 69304:4077009e3bc88166 71824:40535d048835268d 73339:c069ccb4225260ee 73976:c089841bf91c9ade ; 39637:3ff0000000000000 43419:4008000000000000 47201:3ff0000000000000
count_over_time - 3938 0 51384 3937 9 ; 5600:7ff0000000000002 7470:40552d662f940e0d 9498:3ff3695f5b4d6e32 33555:4048e39635f42e7d 35017:4057ff25362cf39f 37942:4059b3ebe4d8afc4 40113:40619cfefa461726 42072:4061fbac955adb54 42904:4064cbabe96dd1e2 43794:7ff0000000000002 45345:4067f356c3bee3a7 46116:3fe1c9742e62bae3 48680:4030ebeb23dba72f 50706:4020157b19832332 50904:40455357f041d2a4 52407:4023c0ae48e4debd 54970:40252f28df71f7dc 55094:404261a409e0bd1a 56189:40494b851ab8c41c 57122:405479c5ca545386 57496:7ff0000000000002 ; 51384:4008000000000000 55321:4008000000000000 59258:4000000000000000
count_over_time - 3777 7601 -2115 3777 10 ; 2168:430c6bf52634030c 2898:430c6bf5263401a2 3960:430c6bf52634008f 4590:430c6bf5263402dc ; 12993:4010000000000000
count_over_time - 7581 0 24168 3343 6 ; 14528:430c6bf526340021 15413:430c6bf526340020 15416:430c6bf526340082 17258:430c6bf526340226 18365:430c6bf52634021b 20858:430c6bf526340235 21981:430c6bf526340045 24184:430c6bf52634019e 26959:430c6bf526340282 28622:430c6bf52634024a ; 24168:4010000000000000 27511:4010000000000000 30854:4008000000000000 34197:4000000000000000
count_over_time - 56 5652 26763 55 13 ; 19836:7ff8000000000001 21523:7ff8000000000001 23683:4085d0f279a1c28d 25293:408108c9b3b726f4 28068:7ff8000000000001 29137:7ff0000000000002 31293:c07e6c5c20e00875 32205:c0517081931a808c 47983:407e93379a871029 48755:4082a5d7f00c8c30 ; 27203:3ff0000000000000
count_over_time - 3959 8893 26705 1976 11 ; 19399:7ff8000000000001 21658:7ff8000000000001 22596:7ff8000000000001 22804:7ff8000000000001 31170:7ff8000000000001 33014:7ff8000000000001 34697:7ff8000000000001 37423:7ff8000000000001 39109:7ff8000000000001 39303:7ff8000000000001 39782:7ff8000000000001 42460:7ff8000000000001 44106:7ff8000000000001 46480:7ff8000000000001 49086:7ff8000000000001 50589:7ff8000000000001 52843:7ff8000000000001 54037:7ff0000000000002 56031:7ff8000000000001 ; 28681:3ff0000000000000 30657:4000000000000000 32633:4008000000000000 34609:4000000000000000 40537:3ff0000000000000 42513:4000000000000000 44489:4000000000000000 46465:4000000000000000
count_over_time - 1697 0 17933 2836 11 ; 11829:7ff0000000000000 14592:7ff0000000000000 16698:7ff0000000000000 28936:7ff0000000000000 30770:7ff0000000000000 31753:7ff0000000000000 33788:7ff0000000000000 36674:7ff0000000000000 39535:7ff0000000000000 39621:7ff0000000000000 41034:7ff0000000000000 57673:7ff0000000000000 58066:7ff0000000000000 59362:7ff0000000000000 80533:7ff0000000000000 81641:7ff0000000000000 84328:7ff0000000000000 84913:7ff0000000000000 85081:7ff0000000000000 85427:7ff0000000000000 ; 17933:3ff0000000000000 29277:3ff0000000000000 32113:4000000000000000 34949:3ff0000000000000 37785:3ff0000000000000 40621:4000000000000000
count_over_time - 1645 -9712 40100 3807 3 ; 20085:c08579ff1d0b6719 20680:c08c64061fcb4613 23060:4076e274e1c0de00 23515:c08addc620fd1cd5 23815:7ff8000000000001 26066:7ff8000000000001 27982:c0892af79783d9cf 28755:c07297542674c231 29080:c08162ef2658dfc4 31333:7ff0000000000002 42832:c05e0ad543021d34 ;
count_over_time - 1000 0 69336 307 10 ; 6046:40877ca28102b9d0 6490:c079018355afdafa 8962:4058d2ca03366d18 9537:40881585a1837c81 10108:4088e2dc9c0adfb8 12027:7ff8000000000001 13555:c0783baaf9d89b42 14393:408408bedee7eaa0 36405:c083af343c77824a 38345:c08566e10adb0431 39116:408b9275fb0f083e 40729:7ff8000000000001 41459:404d329e26a6939a 47717:4038915535eebdee 48884:40763d964cbae218 65769:40551d379ddd625d 66917:7ff8000000000001 67306:c0504744990da157 69641:c08dd96807b850e5 ; 69643:3ff0000000000000 69950:3ff0000000000000 70257:3ff0000000000000 70564:3ff0000000000000
count_over_time - 1000 -1022 39649 103 10 ; 7076:430c6bf526340067 7707:430c6bf5263401ba 9365:430c6bf5263400b2 10671:430c6bf526340258 11744:430c6bf526340244 13983:430c6bf52634029f 14224:430c6bf5263400d4 15483:430c6bf5263401e5 16931:430c6bf52634010f 18385:430c6bf526340020 18745:430c6bf5263400dc 21528:430c6bf5263402e6 24471:430c6bf5263402fd 24592:430c6bf5263402a5 26187:430c6bf526340042 28750:430c6bf5263401f0 29138:430c6bf526340015 30192:430c6bf526340206 36018:430c6bf52634024c 36165:430c6bf52634015f 37372:430c6bf5263400e1 37510:430c6bf5263401bb 38405:430c6bf52634002d 39414:430c6bf526340241 40694:430c6bf5263401cc ; 39752:3ff0000000000000 39855:3ff0000000000000 39958:3ff0000000000000 40061:3ff0000000000000 40164:3ff0000000000000 40267:3ff0000000000000 40370:3ff0000000000000 40473:3ff0000000000000 40576:3ff0000000000000
count_over_time - 3590 474 41870 3589 4 ; 1483:430c6bf526340280 15788:430c6bf52634002d 17835:430c6bf52634030e 19038:430c6bf5263401b9 19510:430c6bf526340035 20695:430c6bf526340142 22923:430c6bf5263401d5 23858:430c6bf52634023b 25099:430c6bf526340284 26121:430c6bf526340099 26854:430c6bf526340134 27731:430c6bf5263400de 29303:430c6bf5263402e2 29409:430c6bf526340288 30218:430c6bf5263401aa 32358:430c6bf526340065 33508:430c6bf5263401e0 35606:430c6bf5263401a0 35821:430c6bf52634002c 38535:430c6bf52634027d 40161:430c6bf52634028e 41762:430c6bf5263401bc 54077:430c6bf5263402db ; 41870:4000000000000000 45459:3ff0000000000000
count_over_time - 154 8062 1298 154 12 ; 5279:40430e906820cfdd 6225:7ff8000000000001 8720:408bdb4416e7b448 ;
count_over_time - 7981 0 3616 3987 2 ; 5074:c140c552e420b422 7820:40af06d2271bcf90 9812:7ff0000000000002 12689:3ffea777611a59b6 14284:3fdc182187bbe66c 14634:42dcdb20271cd7d6 16248:c111be4455729b13 16658:4276d192bb3a174a 16663:42a4d00011e021ba 39608:c19ea0819c76597e 40372:c286ec8649cfc6bc 42554:428e113dc2045e1d 45185:c1b232fac3c02b43 47130:c00775b494aea290 48079:40eeb07efd9d9a7d 48120:c1524a9fa261964a 49618:40aa7b65bda37c96 51353:c28df8b81175ddad ; 7603:3ff0000000000000
count_over_time - 3418 7350 58420 206 13 ; 19382:7ff8000000000001 20582:c081e61a93678f99 27875:c0842b212624e3f1 28305:c0501ddd2010ca11 30153:407b4f4766da12a4 31036:c07e0af44bcbd436 31771:c08317609b50f858 33688:408d3450479cd868 35827:c07ede9a13d3e233 38194:407a9d80571d1372 40836:c0852dacb6addbaf 42224:4057dd6dbde0a0b3 44618:c07a47b33368160d 47339:40663eeabb67db05 49120:c08efc251d33eaea 49179:404307dd6d711914 49408:7ff8000000000001 50273:c03441dec2446dbf 51880:c03066bc267d564a 52047:c07c34aab321f505 70837:c0808a1e399b0d5f 72249:7ff0000000000002 73921:7ff8000000000001 76742:7ff8000000000001 ; 58420:4010000000000000 58626:4010000000000000 58832:4010000000000000 59038:4010000000000000 59244:4014000000000000 59450:4018000000000000 59656:4018000000000000 59862:4018000000000000 60068:4010000000000000 60274:4008000000000000 60480:4008000000000000 60686:4008000000000000 60892:4008000000000000
count_over_time - 1000 0 27430 3405 18 ; 2389:7ff8000000000001 4750:408822f45b9c580c 6731:4083a772a29d29e2 8717:c08bd0127665629e 11355:c088b69ab73c49bd 14029:4068cd18698d52b0 15425:408f0dcb60cd43bb 16933:c08713f0258fce03 19275:c08e4bd17028f5ca 21077:7ff8000000000001 21461:7ff8000000000001 22391:c0687bd0171ebb00 23059:c08d7ee450ae00b5 24403:c0841b99485e4a68 24512:c07d133203136736 24770:7ff8000000000001 26546:408ef2c82504f192 29153:c069aa1ab960efb9 29402:c084cff67002ef86 31959:408d2771bc00448b 33148:c062b3428b9de41c ; 27430:3ff0000000000000
count_over_time - 3457 -3590 16122 3497 7 ; 2952:40571d7b0cb13e74 4800:405ced59fe2b0df6 6677:405f1012f56d0a3f 15280:4060853f2d977ab1 18192:40615d570e8d0598 19908:40670097d10384fc 21959:7ff0000000000002 42907:406b4285fd83d290 45869:406e9b80474148ea 47971:406f1213d8102a5f 49585:4071e73e2fe3190f 51550:4074180060c97ce0 51595:4074607b9e50f050 54052:40237fc79511becd 54963:4017831f2ae50ef0 55663:4040b635e29894d6 56845:4047d22911e24a6b 78348:40508942682816a4 79261:4053b637a7801d9f 81580:3fda6c31951868ac 81930:404273d80dcffb30 82502:4050200f13051e34 83820:405c5b1e61eb6d22 ; 16122:3ff0000000000000 19619:3ff0000000000000
count_over_time - 1165 -1994 12973 1164 11 ; 7160:7ff8000000000001 10079:4074bcfec3a372a3 10715:c05c5e498affa56e 13608:7ff8000000000001 14975:4079be7351a87f30 16333:401581d11702ef20 18936:4076976e657246d3 20654:407dc8c01c16f160 20820:408eba9d456a2b68 21943:7ff8000000000001 ; 14137:3ff0000000000000 15301:3ff0000000000000 17629:3ff0000000000000 18793:3ff0000000000000 19957:4000000000000000
count_over_time - 3589 0 19176 3589 10 ; 15659:403fac50e389b110 17554:4020da6e5237ad72 17677:40410ad4d16f2174 19318:404e64c1b91635b0 21921:405181cc4f420927 24830:405b586fe47879ce 26232:405d750b6b8abac2 27870:40623cb3409febfc 28771:40662becdce7ed17 31186:406734cdb48f7766 31293:406aca3c3828cf72 31502:7ff0000000000002 31755:406c119db46a5721 34208:406f18ba54437dd9 36759:4071f2e49148834c 38525:40727d3ceb01c62f 40676:40751d759d040877 41818:40780c73128e2693 48806:40797f5060ba04d5 ; 19176:4008000000000000 22765:4000000000000000 26354:4000000000000000 29943:4000000000000000 33532:4008000000000000 37121:4000000000000000 40710:4000000000000000 44299:3ff0000000000000 51477:3ff0000000000000
count_over_time - 3443 0 28758 1718 2 ; 32792:417ddcdff3e05c27 32935:41436e954cdee48e 33432:c1bacfd52eb8ca26 34754:420de919e28d24b5 37703:c2b2cd5ae2d7b851 ;
last_over_time - 1000 -8405 40463 1407 8 ; 17730:428c7be624f74307 18033:4290a6aab622e962 18098:bff5f9fa55ed3541 19424:41b5eb4c5c98bf05 21100:c2bb440d493e6b13 23277:42b33638d9a6b1af 46267:41b404f44dff2c78 47094:c25cecd6eb1f83a9 49344:c14ca905ff337988 49672:c2a2b3aea93dd1cb 52473:427dbdd537c75292 54940:40e3cf32548536f0 54966:c220f9f618e14759 56245:4223e1c4b87a2798 58526:422a681bde35c736 61209:c1eb800e86a59f77 63463:42f50c1b846dc3a6 66150:c17454ca69134480 72285:c27c2880824f581f 73371:c232e3843fc56978 74370:409999594cc06977 75361:c0a536c1daed7aa2 76472:c07d7f798ba89257 76711:41933a4524bd2891 89966:3fcb87483e176444 ; 41870:c2a2b3aea93dd1cb 44684:427dbdd537c75292 47498:c220f9f618e14759 50312:422a681bde35c736
last_over_time - 332 0 15903 331 4 ; 13983:430c6bf52634027c 16020:430c6bf526340157 25009:430c6bf5263402a8 ; 16234:430c6bf526340157
last_over_time - 293 0 5866 143 8 ; 1619:c08bb26cbfb5d8de 2611:40815081e5f58eca 3755:406777c2ae1c3bb6 6158:c086ffd69118e943 6727:7ff8000000000001 8814:c06c08f0e59596a4 11360:403952af384903ee 11514:407235df71c88b82 13651:c0813dec7706a903 14360:7ff8000000000001 14806:405cd674ab67818e 17491:c08e92f4965df0d7 17921:c082c1f128875750 18335:4080f9fb60544eba 18394:7ff0000000000002 18788:c08e9fb6ea3551e3 ; 6295:c086ffd69118e943 6438:c086ffd69118e943 6867:7ff8000000000001
last_over_time - 2709 0 21834 1351 1 ; 9340:7ff8000000000001 12256:7ff8000000000001 14991:7ff8000000000001 38934:7ff8000000000001 39388:7ff8000000000001 42385:7ff8000000000001 43945:7ff8000000000001 45341:7ff8000000000001 45651:7ff8000000000001 48389:7ff8000000000001 51217:7ff8000000000001 53484:7ff8000000000001 54282:7ff8000000000001 57005:7ff8000000000001 58879:7ff8000000000001 59642:7ff8000000000001 ;
last_over_time - 16250 -9636 43885 3335 12 ; 19408:40e703267e89e794 21435:c0392ffea25656a8 22721:c0cb22fe761d63b4 25208:41178cdc537d122f 26553:7ff0000000000002 26831:c07e11afbca1ff95 27599:c25923b7ad88b57a 28387:c0dbf7605f3abfd1 49416:c1077041df99a297 51081:40451b105d15d41f 53697:4284c1fdcba21fe7 54123:413286c56c569ea6 56689:c252bb2cf5e68611 57797:42c5c89c039985e0 60027:4040f0df7d8e1783 60206:41dc60e625024d31 60403:414bfa8920f89c8a 61478:42135daf91a222be 64388:c151b3b83db9821e ; 43885:40451b105d15d41f 47220:c252bb2cf5e68611 50555:4040f0df7d8e1783 53890:42135daf91a222be 57225:c151b3b83db9821e 60560:c151b3b83db9821e 63895:c151b3b83db9821e 67230:c151b3b83db9821e 70565:c151b3b83db9821e
last_over_time - 19098 -3862 12476 1369 14 ; 12059:4088cbab0fa36e35 13777:4077c4498332cadc 16120:c072e0bfaf038b1c 18440:4075b7f6633140bc ; 12476:c072e0bfaf038b1c 13845:c072e0bfaf038b1c 15214:4075b7f6633140bc 16583:4075b7f6633140bc 17952:4075b7f6633140bc 19321:4075b7f6633140bc 20690:4075b7f6633140bc 22059:4075b7f6633140bc 23428:4075b7f6633140bc 24797:4075b7f6633140bc 26166:4075b7f6633140bc 27535:4075b7f6633140bc 28904:4075b7f6633140bc 30273:4075b7f6633140bc
last_over_time - 1555 -6324 36904 1555 17 ; 9355:4089b90091a5242b 24077:404e6ddc98049385 24412:c02536980a11bbf6 26382:c08ea5835829cc3e 29034:c0734c1e87604b6e 30556:c0709a132e479e3f 32524:7ff0000000000002 33675:c06e2f1a8b9dadf7 36615:c089663e8a3ea8a2 52107:c07cad89efd534e2 54922:7ff8000000000001 57285:c08e9591868add78 58703:c04b1fbea68253b1 60619:c0627dcccf9b77f3 61056:4075847dc184f8b4 63059:c07b05c74bdfe3aa 65520:c063e74a4b46cab2 65730:3ff736ab57aa3890 68461:407ef1585f7ca7df ; 46234:c07cad89efd534e2 49344:7ff8000000000001 52454:c04b1fbea68253b1 55564:4075847dc184f8b4 57119:c07b05c74bdfe3aa 60229:3ff736ab57aa3890
last_over_time - 2920 0 3807 2920 3 ; 7173:fff0000000000000 9452:fff0000000000000 11795:fff0000000000000 12483:fff0000000000000 14270:fff0000000000000 17087:fff0000000000000 18410:fff0000000000000 19683:fff0000000000000 21500:fff0000000000000 23868:7ff0000000000002 24838:fff0000000000000 27178:fff0000000000000 30043:7ff0000000000002 32879:fff0000000000000 34677:fff0000000000000 36493:fff0000000000000 37590:fff0000000000000 38235:fff0000000000000 ; 9647:fff0000000000000
last_over_time - 1222 9642 32307 1222 20 ; 35800:c059168adf528cbd 38052:407b7bd732442bf1 39093:4087896d65a65af6 ; 45749:c059168adf528cbd 48193:407b7bd732442bf1 49415:4087896d65a65af6
last_over_time - 3175 0 38637 3175 18 ; 14476:c08a5c9f0848a827 17037:c0865fc85c1c45fc 29922:4048ea25931b8c3e 31969:40563794ca627eb4 32551:c0850fb63644fab0 35434:c07252a8553d8a14 38017:7e37e43c8800759c 38176:7ff0000000000002 39692:c05c7b2298f8d412 40309:c0243b49ed3a3260 42896:407b605282025f47 43569:c05d6d66e7c4922c 45917:c06ea960f196c3ef 46997:c07e21c401a7c19e 49377:c07b32bf7a6f74d7 51381:c07e77699d6f4bf1 52419:4086e06e8659442e 53144:c08788963f9fbe23 55603:40852a32fb427e2b 56889:40886aefacd868b7 59765:c085eb75695c55d6 61787:fe37e43c8800759c 64493:c0743af7a15ec850 65178:c05311cb273ac601 67264:c08974b1b4faf778 ; 38637:7e37e43c8800759c 41812:c0243b49ed3a3260 44987:c05d6d66e7c4922c 48162:c07e21c401a7c19e 51337:c07b32bf7a6f74d7 54512:c08788963f9fbe23 57687:40886aefacd868b7 60862:c085eb75695c55d6 64037:fe37e43c8800759c 67212:c05311cb273ac601 70387:c08974b1b4faf778
last_over_time - 4405 0 27080 2199 8 ; 14633:408559be679907c0 16240:40485e61d0f973ae 18491:408668ae98a618cb 18916:7ff0000000000000 21366:c082c8885b5933cd 22350:fff0000000000000 22928:407b61b003ccbea7 23760:c06309cb59588386 25800:406cb999282b7eee 25830:7ff8000000000001 26695:c08912eeaad8df2f 29205:c08053cc86632165 31888:c0638f87087c1109 32633:c06b354844561ac5 34093:4051acf546944fc8 35405:fe37e43c8800759c 37395:c08bd4c8b2cefe12 39428:c08d2b14979d5a9b ; 27080:c08912eeaad8df2f 29279:c08053cc86632165 31478:c08053cc86632165 33677:c06b354844561ac5 35876:fe37e43c8800759c 38075:c08bd4c8b2cefe12 40274:c08d2b14979d5a9b 42473:c08d2b14979d5a9b
last_over_time - 1406 9380 15376 1406 7 ; 12083:40428ab73dcef882 13162:4044caf295a4850a 15060:4044f231d0ee43c1 17396:404880fa0dff046e 17963:7ff0000000000002 20934:404e3f8af8873f92 45881:405b4f85e0fc6fb9 ; 22406:40428ab73dcef882 23812:4044caf295a4850a
last_over_time - 1000 0 39737 2487 6 ; 18644:4221a5781be3140d 20660:42417e9f1b8311d5 22781:423d246ddc3a2680 23456:c1dbb637f290ce7b 43039:bfd46cb09b8ad53c 44468:42565e12ab8151de 44552:41dbeebc23417264 45278:bfdd393c1ebb6210 45799:40e48b0c5b02f4a1 47021:c1f8c3a1cefd3ee7 49597:42c3c9de98309716 62647:c146df5445c09b1d 64591:c1813b49d6a27864 ; 44711:41dbeebc23417264 47198:c1f8c3a1cefd3ee7 49685:42c3c9de98309716
last_over_time - 1000 -9960 21008 322 19 ; 14994:c06fa21b87586f28 15730:c04080bc007d1402 18031:7ff0000000000002 18702:405989ad1d2bbc6d 21596:7ff8000000000001 23555:c056c467e77a485c 25238:7ff8000000000001 27979:c08659739a959457 29566:407e5d904794cce2 30269:407b6a7c0117a543 30815:c08e8fa06f3a23c2 32492:408d82f71413515a 33826:40847f8386a68980 34667:4080e17baae554e9 35503:406ee75eacd9a328 38438:4086aafe760559b6 38883:7ff8000000000001 41711:c075641d944b267e 42504:4085837a25ec0eda 45050:406892f0cd449cb2 63846:4083e4ba497b33c6 ; 21008:c08e8fa06f3a23c2 21330:c08e8fa06f3a23c2 21652:c08e8fa06f3a23c2 22618:408d82f71413515a 22940:408d82f71413515a 23262:408d82f71413515a 23906:40847f8386a68980 24228:40847f8386a68980 24550:40847f8386a68980 24872:4080e17baae554e9 25194:4080e17baae554e9 25516:4080e17baae554e9 25838:406ee75eacd9a328 26160:406ee75eacd9a328 26482:406ee75eacd9a328
last_over_time - 1000 0 42998 124 16 ; 14436:c0856472bef3506f 14767:407b006b5333e7f3 17461:c07860a0f53020cb 18527:c086a37e9e1442b9 19749:c06d2a07b7481f35 20151:c08c382d18dcd35e 21759:4088929e897e1f5d 46058:c086f243ed0653d4 46452:c081950394640b8f 48871:40835ea354115bc8 51127:7ff0000000000002 51607:4079436b60e4edd3 51906:c07e14ca6c44e720 53512:8000000000000000 54019:408f337dd094d526 55482:408352731ed63f1f 56055:408d0d9a9f8d2ea7 56294:c0741cb9063443d1 58168:c087811376373cc0 58268:c08ddea283d07de9 60617:407a99d2b1c253ae ;
last_over_time - 16079 0 11200 1592 4 ; 5010:7ff0000000000002 5645:4247575e147c87cb 6742:414906054975263a 8188:4236a0fed1b61265 10135:c0f0d9b2565f3467 12770:c11194f0aca7359e ; 11200:c0f0d9b2565f3467 12792:c11194f0aca7359e 14384:c11194f0aca7359e 15976:c11194f0aca7359e
last_over_time - 1000 0 54542 1380 13 ; 20882:fe37e43c8800759c 23716:fe37e43c8800759c 23767:fe37e43c8800759c 25841:fe37e43c8800759c 26841:fe37e43c8800759c 27097:fe37e43c8800759c 28730:fe37e43c8800759c 31258:fe37e43c8800759c 33094:fe37e43c8800759c 35013:fe37e43c8800759c 37646:fe37e43c8800759c 39531:fe37e43c8800759c 42339:fe37e43c8800759c 43627:fe37e43c8800759c 44337:fe37e43c8800759c 46637:fe37e43c8800759c 47629:fe37e43c8800759c 50035:fe37e43c8800759c 50493:fe37e43c8800759c 53054:fe37e43c8800759c 55180:fe37e43c8800759c 57095:fe37e43c8800759c 58139:fe37e43c8800759c ; 55922:fe37e43c8800759c 57302:fe37e43c8800759c 58682:fe37e43c8800759c
last_over_time - 1408 0 15384 1408 16 ; 19746:7ff0000000000002 20161:c2c0c92d0c33819e ; 21016:c2c0c92d0c33819e
last_over_time - 19465 0 16052 2533 9 ; 9254:c077a953480114f0 9441:c0834935893175b9 12271:407a9ac67a0bca63 23565:405e86cd0265be88 26520:c08cc5f5ac3ee9f6 28248:c08e1c76eb4e093a 29546:8000000000000000 32167:4084c7ea3d38adb9 ; 16052:407a9ac67a0bca63 18585:407a9ac67a0bca63 21118:407a9ac67a0bca63 23651:405e86cd0265be88 26184:405e86cd0265be88 28717:c08e1c76eb4e093a 31250:8000000000000000 33783:4084c7ea3d38adb9 36316:4084c7ea3d38adb9
last_over_time - 1000 -6210 44871 3225 6 ; 20403:3fda430ce232c090 44683:41ee389f486a7814 45997:42e3c6ea8055d69d 48174:c1f13dba32a01736 49695:c07e2b307471e334 50322:4178ec2ec3417a9f ; 44871:4178ec2ec3417a9f
present_over_time - 1000 0 24031 1962 2 ; 19611:7e37e43c8800759c 20615:7e37e43c8800759c 21481:7e37e43c8800759c 22126:7ff0000000000002 22183:7e37e43c8800759c 22476:7e37e43c8800759c 23200:7ff0000000000002 25542:7e37e43c8800759c 26025:7e37e43c8800759c 28412:7e37e43c8800759c ; 25993:3ff0000000000000
present_over_time - 7634 0 75425 2093 10 ; 9979:fff0000000000000 10800:c08963ccc83c5a74 29136:4073d6674fb13e66 31019:4076c5bad98184b0 33913:c08d0b41aef597e3 34038:408cead8a9547c45 36518:c07cea4141cbe87d 38997:40719d95b0a8cec2 57775:7ff0000000000002 57976:c08bd94d02e294c2 60908:c0685aeb2fbbc737 62446:c061c8d2ce267ca9 62640:408917a8f1b393b5 62757:40754c22808b1de5 62846:c080913f9ca171a7 63615:c087eda131380c64 66384:407d0efdd2a49a4b 84459:0 84807:4070402f6f3a7b30 86612:407b8af994010cc9 86993:406c55ddfece5ba4 ; 85890:3ff0000000000000 87983:3ff0000000000000 90076:3ff0000000000000 92169:3ff0000000000000 94262:3ff0000000000000
present_over_time - 16321 0 -812 2286 17 ; 2761:c050506fa0a3f67d 4327:40867d8fc15e24e7 4719:c08805647fb53a07 6885:406b11408a15e8fb ; 3760:3ff0000000000000 6046:3ff0000000000000 8332:3ff0000000000000 10618:3ff0000000000000 12904:3ff0000000000000 15190:3ff0000000000000 17476:3ff0000000000000 19762:3ff0000000000000 22048:3ff0000000000000
present_over_time - 105 0 26459 104 15 ; 6232:42c4d480a899cedd 8438:c1e670d3cc4a82f3 9343:c2fb5c6e2c32e107 25298:3ffccc3f0fce8c5e 47749:413c51eb9477a1e4 50389:42c6652833ead261 52940:4177bd5e58413736 55227:3fbc82b0a88e07a8 58082:4114fdf0350e14b4 59224:c2f288240b2e26d6 59796:c02f1791b47242a6 62554:40cf51579cee3cb0 63719:409bef68e9feb853 64182:c201194b474b2349 64581:c2c223aeca80d902 64958:c2b5e692d0c42fa4 65930:42196dc17122b1a9 ;
present_over_time - 1000 0 35016 3921 6 ; 28997:c0831f13bebcc90c 31300:4084cac64157573a 34002:408d001e4e170cc6 34207:3ffd668c854a3e78 34619:7ff0000000000000 34745:c081fef5b512abc4 35150:408f34577bb7c93f 36581:40870ffeb55541eb 36930:408bd357ae53f66b 38350:c07e3c13c588820d 40083:7ff8000000000001 41328:7ff0000000000002 43419:c05a80f780a4edca 43841:408ea0aa1ea1c096 46593:c05db862735bdb14 49247:40868c7ea55c2b1f 49388:7ff0000000000002 50753:4057d22d6d0ed40f 52123:c07e8a49fae70639 ; 35016:3ff0000000000000 38937:3ff0000000000000 46779:3ff0000000000000
present_over_time - 1812 -225 29443 1812 15 ; 14522:407dc41515c4329b 15496:c07beff66f57d31b 16185:c07f62f0810c1d26 17491:7ff8000000000001 20353:408302d179962ea9 23230:4078e17345586ef3 25881:c07622ee2d654209 26641:c07fda957d28aa54 26794:c0787463f2792c55 28880:7ff0000000000002 30662:406c88c81d318dc2 31929:c043770c25217806 34305:c08782cb7c76b2b6 34382:c06f46bab78fdb1c 35956:c080eab598c72a2d 37658:40860571a6fdc316 38595:c06698ccf6687730 60571:4088f960cc1fff85 62467:c08c9551ed267c2d 64875:c0786e09763b2f44 67810:7ff8000000000001 68141:7ff8000000000001 69168:c0750e6e4742d2fc 70187:408ee8d5ff232a9e 71730:c08d836479e42572 ; 31255:3ff0000000000000 33067:3ff0000000000000 34879:3ff0000000000000 36691:3ff0000000000000 38503:3ff0000000000000
present_over_time - 6111 0 23989 3052 8 ; 11780:430c6bf5263401f4 12699:430c6bf5263401d5 14851:430c6bf52634010f 14889:430c6bf5263401a2 16877:430c6bf52634023b 18391:430c6bf5263401db 18574:430c6bf526340173 20526:430c6bf52634020b 23124:430c6bf526340040 24936:430c6bf5263400a9 25448:430c6bf526340177 ; 23989:3ff0000000000000 27041:3ff0000000000000 30093:3ff0000000000000
present_over_time - 1344 -1446 5997 1343 20 ; 2917:430c6bf526340160 3871:430c6bf52634010e 6474:430c6bf5263402fa 8578:430c6bf52634023d 10673:430c6bf5263400e2 ; 5997:3ff0000000000000 7340:3ff0000000000000 10026:3ff0000000000000
present_over_time - 1000 -2457 34823 1210 11 ; 14737:430c6bf526340046 14835:7ff0000000000002 14995:430c6bf526340280 17475:430c6bf526340001 18042:430c6bf526340312 18703:430c6bf526340119 19587:430c6bf52634014f 22231:430c6bf52634028b 23543:430c6bf5263401b0 24061:430c6bf526340231 25282:430c6bf52634014c 25507:430c6bf5263402dd 26647:430c6bf52634001a 27047:430c6bf526340132 27768:430c6bf5263401fc 30243:430c6bf52634026c 30924:430c6bf52634008a 32362:430c6bf5263400f8 34374:430c6bf52634015c 35281:430c6bf52634029a 35803:430c6bf5263400cd 37164:430c6bf526340199 39889:430c6bf5263402a8 42773:430c6bf52634029e ; 34823:3ff0000000000000 40873:3ff0000000000000
present_over_time - 1147 -3021 28937 1147 6 ; 6395:430c6bf52634005f 8701:430c6bf52634003a 11443:430c6bf52634025c 12471:430c6bf5263402dd 13605:430c6bf5263400fc 16206:430c6bf52634009f 17808:430c6bf52634008c 18102:430c6bf526340033 20548:430c6bf526340024 20829:430c6bf5263402e3 22527:430c6bf52634010b 23867:430c6bf5263400fa 26224:430c6bf526340023 26751:430c6bf526340317 29114:430c6bf5263402c7 29300:430c6bf5263401d7 29917:430c6bf5263401c5 32612:430c6bf5263402f8 34688:430c6bf526340154 35628:430c6bf526340039 36535:430c6bf526340236 36780:430c6bf526340143 37189:430c6bf52634021c ; 30084:3ff0000000000000 32378:3ff0000000000000 33525:3ff0000000000000 34672:3ff0000000000000
present_over_time - 1000 0 9759 234 1 ; 12616:408b8d6813397bba 15046:c054d492a12a0842 15056:c08d8a8dc4920bec 18018:4081c65f77ebb82e 19463:408609faa860aabd 21115:7ff8000000000001 23774:4083fdad82e5b0e3 25765:7ff8000000000001 26115:4082bbf38a19f8e0 26567:40754c56b53a727b ;
present_over_time - 1000 -1302 12483 307 17 ; 12428:4109a0dc7e9412d8 13707:3fd47821151ffdca 14884:c15c7cba1d05eb0c 15099:4039c5e4ebc86910 16929:4279076588142a11 18697:3ffd1b25fd97ee0a 19108:413eca568247b4b6 21394:c0b80333302d1448 22428:424c2ac8e23f9411 23523:4081925033b2883c 26498:4145b56634835445 ; 12483:3ff0000000000000 12790:3ff0000000000000 13097:3ff0000000000000 13404:3ff0000000000000 13711:3ff0000000000000 14018:3ff0000000000000 14325:3ff0000000000000 14632:3ff0000000000000 15860:3ff0000000000000 16167:3ff0000000000000 16474:3ff0000000000000 17395:3ff0000000000000
present_over_time - 246 0 19000 246 1 ; 4889:408601862cb7f4a6 7786:c085c50de3374508 9639:c08f3995516f3b1c 11397:c0889f3b64da3459 11804:c08aafe7da9dcbee 14018:c04b84aae3c9e64c 15885:c0574aea64bf0e10 16866:7ff0000000000000 17744:c079b3fd11b4ece2 17998:c081eb0399199564 20751:c054abedfdb648ec 22716:7ff0000000000000 ;
present_over_time - 13230 0 18414 295 13 ; 4689:4057846fd3493372 6333:405deddee9b12e2f 6807:40627e0b97fc04ab 7942:40649fc6427dd816 9597:4064e63602486069 19738:406a91912738360a 19828:406da9dd794e3c0e 20948:4071a63cc56a1c23 23918:4073c751b203b25f 26873:7ff0000000000002 28668:40747acb26939354 30024:407545afe8a96248 32904:4012530577394fc1 34286:4026abe01a2f80a0 35024:404ca1163429d9f3 ; 18414:3ff0000000000000 18709:3ff0000000000000 19004:3ff0000000000000 19299:3ff0000000000000 19594:3ff0000000000000 19889:3ff0000000000000 20184:3ff0000000000000 20479:3ff0000000000000 20774:3ff0000000000000 21069:3ff0000000000000 21364:3ff0000000000000 21659:3ff0000000000000 21954:3ff0000000000000
present_over_time - 1282 -4511 60770 1281 2 ; 15696:c0878e9706a04cde 18635:4080052b536d568d 20627:40712f0e233ed2e7 22828:403b3e1d164cb8fa 24694:c06bd04378deb486 27030:c08e4e4562dad5d1 28147:40739b24d06aa939 30628:c064ea67c838b9d1 33072:7ff0000000000002 33865:c0653b46fea59e88 36119:c07ac5fc4949b268 37890:c0822220305617e9 39852:c0634f0eaa1241e8 50034:407b23f290e43dcd 51582:40812e667fa716d8 53045:40828b13a087c1c0 53958:408b01d4647066d1 54648:c06706af90aae19f 54813:c078056bec269d42 61865:4083e1fc203e5c82 64536:c0897a779348666b 66397:c04132749c0f6e80 66699:7ff8000000000001 67334:c082601d067d260a 70281:4086839348a31db9 ; 60770:3ff0000000000000 62051:3ff0000000000000
present_over_time - 387 0 26790 386 6 ; 19322:bff48b3391b53cd8 39066:4167a2438e920318 41753:3f7a9bc960824100 ;
present_over_time - 2753 0 19741 2755 13 ; 14101:430c6bf52634003d 16733:430c6bf526340185 18859:430c6bf52634011c 20710:430c6bf5263402ca 22793:430c6bf526340007 23890:430c6bf5263402be 26108:430c6bf5263402e8 27377:7ff0000000000002 28828:430c6bf526340095 31024:430c6bf526340269 33681:430c6bf5263401c7 36016:430c6bf5263400c2 36115:430c6bf526340280 ; 19741:3ff0000000000000 22496:3ff0000000000000 25251:3ff0000000000000 28006:3ff0000000000000 30761:3ff0000000000000 33516:3ff0000000000000 36271:3ff0000000000000
present_over_time - 1993 -9294 2804 1993 5 ; 5277:430c6bf5263400ce 7591:430c6bf52634028a 9616:430c6bf526340159 ;
present_over_time - 1066 -2897 45534 1133 17 ; 34919:40a96df02c6b500e 37019:4185af3f1987b6bb 39490:c0e08e4e42bbbcc7 41100:414362795319e5b6 42321:4274de13e58a78f4 43597:4219979917a79406 45202:417ef0340bce49a1 46274:4221e44ec2aae090 46479:42a7aa269f4ce791 48909:c2248329bfb7cfb4 50027:c18702cf20c74503 ; 46667:3ff0000000000000 47800:3ff0000000000000
present_over_time - 1000 -8458 15670 1491 9 ; 14585:4069354668750d9a 16166:c07f60075904dc35 18795:404406911db49cf9 19544:c07ef484489126ec 21408:40603a8382368a7e 23966:408908c26e4f9ee8 26156:7ff8000000000001 ; 15670:3ff0000000000000 18652:3ff0000000000000
stddev_over_time - 775 0 10272 384 11 ; 11411:c067d44e36c42cc3 12858:c089915c82647d19 13517:408ef5b97f963b0e ; 11424:0 11808:0 12960:0 13344:0 13728:0 14112:0
stddev_over_time - 1290 -5190 19590 1289 4 ; 15770:430c6bf52634023e 16437:430c6bf5263401d8 32946:430c6bf52634001c 35490:430c6bf5263400a9 37955:430c6bf52634028a 39895:430c6bf526340095 39977:430c6bf5263400db 42161:430c6bf5263400b5 44316:430c6bf52634020e ;
stddev_over_time - 1635 1737 43442 814 5 ; 20146:405425b0a0f127e7 23105:7ff0000000000002 23654:405a9ae89956445e 24315:405e61c5f9f2f94d 24328:406382be4c07f5a0 26409:4064409442186548 28765:4066c33034fbde9c 30053:4015eedbd0899f00 32643:4045b7e8c7ef2e87 33933:4047a205445a322e 35451:40575c038db4486a 38161:4058330c736ff747 38253:40591694d8750fcc 40223:405b4aca0597d8e6 41961:406202e684c86cef 43649:4065ee83081bc7d8 44123:406b88efa38f0aa7 44707:4070bac4e08fb568 46737:4071cb0c8b1c928a 48988:40729d53886bb102 49989:40743ea15a17628d 50174:4076521571c06e40 ; 43442:0 44256:0 45070:0 45884:403669b26dcd0b3a 46698:4042d3a0e4e400f4
stddev_over_time - 2809 0 21327 1401 6 ; 16289:430c6bf52634000c 16316:430c6bf526340313 17265:430c6bf526340149 17420:430c6bf526340178 18667:430c6bf526340046 19962:430c6bf52634020d 21717:430c6bf5263400e8 23573:430c6bf5263402d3 23702:430c6bf526340150 26234:430c6bf5263401a5 27408:7ff0000000000002 27807:7ff0000000000002 30778:430c6bf52634030a 33369:430c6bf526340007 35370:430c6bf526340150 37844:430c6bf526340299 40499:430c6bf526340279 41510:430c6bf526340113 49118:430c6bf5263401b8 52023:430c6bf526340285 53683:430c6bf52634008e 54288:430c6bf5263402b8 ; 21327:403c67fedf9cd834 22728:403247fe3fe3e8cc 24129:403a6205959d8457 25530:403837feadbfe1a2 26931:0 28332:0
stddev_over_time - 3066 -1478 29756 3065 2 ; 18262:0 20328:0 22772:0 24338:0 25257:0 27647:0 29951:0 30328:0 32501:0 33330:0 35632:0 38271:0 39294:0 41477:7ff0000000000002 49596:0 50350:0 53144:0 53974:0 54839:0 55761:0 ; 29756:0 32821:0
stddev_over_time - 1000 -6860 51285 1367 8 ; 8873:40534928edc24ac1 9198:40574412e96f33ed 9218:406079351e5caea1 10414:40624b160548e62c 11731:4068333afb551082 13301:4069bb299c1e5847 15217:40123dd4f62e60b2 15387:4046112f5d91191f 16936:405176a33a173c71 18812:405d95ada5dfc4b0 27869:3ff2c7a76cc06ecf 28865:4025279c73865f76 31493:4039d73c61cfa706 42482:4042f2404ba27f36 45348:4052363c71f70253 47027:405e368acd003aee 47915:4063821113593528 50889:40696838094e907f 52867:406e7c664135cd58 54183:406f1377bc34ab2e ;
stddev_over_time - 11641 -3265 11106 3206 1 ; 6688:c07d28aed10e624b 9301:c08185f79a55fd6f 10512:c085c8b0121d4109 10614:c065b7f9cc88e8a4 11081:4085654552042cdc 13602:4086103c5a9fae10 14433:c07b36bbad406a9e ; 11106:4081eafacfa2aaf4
stddev_over_time - 1000 -6451 6457 3300 16 ; 7440:c08c4c16d63e9afd 9228:7ff8000000000001 9694:4005b39c9c570718 ;
stddev_over_time - 608 7363 27770 608 3 ; 24703:40797bce73893562 26588:40879646c1e9cf80 27500:40864c944b322cfc 29801:408a9b924868faa8 31053:c065433b1aaf20b0 34032:408840bac927fd16 36120:7ff8000000000001 36810:408692b6329836f7 38756:c076ecac8157e828 40832:4086cd1491ec9418 43225:4078bb624aade8eb 43744:408626d4b242b794 46257:c08375bd9b5a6ccd 47889:c08df1e0dc391e1d 48131:7ff8000000000001 49011:7ff8000000000001 ;
stddev_over_time - 2563 0 14522 2562 10 ; 6802:7ff8000000000001 9234:c08a64c5dc327f0b 10998:c08484828ddf6490 11195:7ff8000000000001 14031:c05eff87b8af3b23 26347:407d7335335cbd42 27938:c06911aa3e5b581d 28364:c049f5c789b12713 29082:c077fc8892146231 31292:7ff8000000000001 32818:407c421065b5f51a 33205:c0764a93bfa0bc79 35459:407e2f3fff4817d6 38039:407ee955ac72aa38 40738:c03a1505188c169c 49000:c08a89330f8ac331 51382:7ff0000000000002 51608:408f218aa8fded19 53841:c086f50d01bddf1d 55438:7ff0000000000002 56385:408e8ed810b64dfb ; 14522:0 27332:0 29894:4060f74a2771c028 32456:7ff8000000000001 35018:4079465212ab58c9 37580:0
stddev_over_time - 1000 4636 51617 3192 14 ; 4719:407aba32908f9b20 5514:c073297d3164ab56 6371:c0843036f089dc75 16442:40795201d98bd161 19276:7ff8000000000001 26394:407ecaceca380cb1 41223:7ff0000000000002 42766:7ff8000000000001 42995:7ff8000000000001 45494:c083c4d7a6348e19 58135:407e4b8e20fcc90f 59960:408542887466b69f 60902:7ff8000000000001 79162:408c019671a8a222 81940:c08e17fb94c78887 82948:c08530545e57183a 83897:7ff8000000000001 85221:4078beea9f8a02ec 85502:408a5bc868214448 86421:7ff8000000000001 ; 86729:0 89921:0
stddev_over_time - 1000 0 13217 2753 5 ; 17206:430c6bf526340166 17676:430c6bf526340089 ;
stddev_over_time - 7309 1081 43906 3651 10 ; 17148:41650e403869523b 17238:c2db17c233f0d11e 19444:41bc84d7bf0f70e8 19807:407088e4b05a6bcf 42864:41c964b6a5a6c347 43953:4262bd828ed9703f ; 47557:4252b7296130068e 51208:4252b7296130068e
stddev_over_time - 878 -8772 15986 877 9 ; 7928:40592b85a379f5a0 8862:7ff0000000000002 10858:4062a0574397bd72 11664:40203deab67494f0 12823:4041fe032f2995ac 14575:404e3c2e85f2d7ba 16603:3ff57f18cf042eb9 19074:403eb39dd699b8cd ;
stddev_over_time - 7487 8547 42697 3740 18 ; 2606:407bf3ec4642a1f2 4273:408de9418b8dd43c 7019:7ff8000000000001 8658:407a458daca37c82 10116:c0896c7426c8d946 12987:c081815f969d57eb 14289:c08b481ca326f773 16037:c0703c7b2a55c14c 16604:7ff8000000000001 19396:4081bdbfe1d8eebc 22184:408cd8bf79eec2ab 23628:7ff8000000000001 25364:4081df9dc985958a 40219:7ff8000000000001 40698:407e3c8ddbbb24f5 42616:c0812183979d645e 44367:7ff0000000000002 44981:407f375659330700 ; 50177:7ff8000000000001 53917:7ff8000000000001 57657:40805e97621b73ef
stddev_over_time - 5699 0 13792 2846 14 ; 11666:c25aa36c8a34903a 13135:c1a21ab9ad891ae5 14153:4241a9c7fc0e6024 16101:c286554177d70fa2 17761:c068401a9e5a3321 17981:4145857e9454b561 18313:c2e487671fad0be7 20688:4113f71bae8705eb 20842:3ffb152e5ff5dd1e 22703:40b186b31300d8b1 25066:42e8bc55c1f1fef0 25669:c11aefa328954e2c 25853:425cbc395b5dae9b ; 13792:424aa12932fedf17 16638:4272fb1862e424ce 19484:42d05bee52cb4057 22330:42d06c5280f1099e 25176:42d56bf684d5243d 28022:42d567d3f4a32372 30868:424cbc3b0a57e125
stddev_over_time - 1000 2519 7530 624 2 ; 10577:4087e1b4c958ccb5 12595:408e0c0e190f9ba4 13287:407b603bfbe86b5f 15645:c07985fbefdf8626 16698:c0658ab74d62b55d 19648:7ff8000000000001 21811:c07a29bd9effbda0 22385:c06cde4e75c37e15 22941:c083f36c7764eaca 25301:403ab8cddec53dc3 27467:4081de373f91daf0 29862:4032862680d8cc3e 30978:7ff0000000000002 31016:40847c82a523d153 33767:c08734d8c67fa2a4 34001:7ff8000000000001 34014:405cb93ddd705d8f 34619:c06e36fec6f6f49c ;
stddev_over_time - 2564 1717 12355 2564 14 ; 14189:404d35180e3a7bea 16152:405201c81ed8dc5a 17194:405a916a4a39f5c6 18170:405b34199ace5024 18638:405edc2e8b29bef6 ; 17483:0 20047:4030c630a62c82e0 22611:0
stddev_over_time - 1104 7441 37402 1103 8 ; 14596:430c6bf526340142 15377:430c6bf5263400da 16228:430c6bf5263402e8 18867:430c6bf5263401bf 20750:430c6bf5263401f5 23394:430c6bf526340036 23576:430c6bf526340275 25063:430c6bf5263401a6 25732:7ff0000000000002 27250:430c6bf5263401ef 27814:430c6bf526340041 29279:7ff0000000000002 31856:430c6bf5263402f5 34385:430c6bf526340247 36449:430c6bf5263402b6 39044:430c6bf5263400a8 ; 39608:0 42917:0 44020:0
stddev_over_time - 3954 -8501 29485 3953 6 ; 18937:7ff0000000000000 20003:7ff0000000000000 23000:7ff0000000000000 23581:7ff0000000000000 24397:7ff0000000000000 27138:7ff0000000000002 29666:7ff0000000000000 30579:7ff0000000000000 30618:7ff0000000000000 32452:7ff0000000000000 33579:7ff0000000000000 35354:7ff0000000000000 37083:7ff0000000000000 40068:7ff0000000000000 42758:7ff0000000000000 43991:7ff0000000000000 45895:7ff0000000000000 47817:7ff0000000000000 49282:7ff0000000000000 51178:7ff0000000000000 54125:7ff0000000000000 ; 29485:fff8000000000000 33438:fff8000000000000 37391:fff8000000000000 41344:fff8000000000000 45297:fff8000000000000 49250:fff8000000000000
stdvar_over_time - 7381 428 30877 3687 14 ; 15707:7ff0000000000000 36600:7ff0000000000000 37086:7ff0000000000000 39014:7ff0000000000000 40803:7ff0000000000000 41896:7ff0000000000000 42256:7ff0000000000000 43316:7ff0000000000000 45886:7ff0000000000000 48038:7ff0000000000000 50085:7ff0000000000000 50533:7ff0000000000000 52470:7ff0000000000000 55076:7ff0000000000000 56929:7ff0000000000000 57432:7ff0000000000000 ; 38251:fff8000000000000 41938:fff8000000000000 45625:fff8000000000000 49312:fff8000000000000 52999:fff8000000000000 56686:fff8000000000000 60373:fff8000000000000 64060:fff8000000000000
stdvar_over_time - 1478 0 29500 1478 17 ; 14583:c063f83d103025f7 16368:7ff8000000000001 17774:c062eff308e24760 20366:7ff0000000000002 22239:408b38554933336a 24800:7ff8000000000001 25085:4087136a893aadc7 27543:4067d99f907214ce 28647:7ff8000000000001 29991:c088d92dbdfaf9b2 32283:4072d1579e72e7d4 32583:c06f9082c538fa6a 34625:c0817dbf769de9bb 36526:c07256ec37dbfba0 38655:7ff8000000000001 ; 29500:7ff8000000000001 30978:0 32456:0 33934:0 35412:0 36890:0 39846:7ff8000000000001
stdvar_over_time - 3121 -2114 31223 3120 2 ; 7437:430c6bf52634025e 9068:430c6bf5263402c9 9889:430c6bf526340225 11302:430c6bf5263401a5 11940:430c6bf526340094 12358:430c6bf5263401fd 14922:430c6bf52634028b 17293:430c6bf526340176 18878:7ff0000000000002 21185:430c6bf52634012b 22264:430c6bf5263400c3 23435:430c6bf5263401aa 25893:430c6bf5263401ff 28615:430c6bf52634017e 31398:430c6bf526340248 33253:430c6bf52634013e 33463:430c6bf5263400cf 35865:430c6bf5263401b7 ; 31223:4071464000000000 34343:406a480000000000
stdvar_over_time - 688 2260 24303 688 8 ; 19127:c086b9717b28fe05 21071:c080db964097e5dc 22112:406286410df012d1 23399:c080a51b2caec400 23796:40870dcd73780467 24636:c07421c13042d03e 25771:4081f6cd82082fd2 27441:4087b4227fd07d85 29577:4086708c267c73bc 45914:c074cbe7392e8f7d 47342:408f33ed644d05f9 49617:7ff0000000000002 52367:4089ed73b660ea05 55365:c0665383e088008b 56473:c06ff25f1db9989e 57246:c0875c109e4061fe 57315:4089b493202ed1a8 ; 24991:0 25679:0 26367:0 27055:0 28431:0
stdvar_over_time - 944 0 16764 356 5 ; 20466:414ad7106d0f5696 22094:c026cdf98760ad69 24371:c19789daa65f62c0 26768:c07291a570967478 29286:3fe384b30e7190c2 30261:bfc5e0f505867892 31940:c14fc8ec2a8e7a77 32604:40b327f4a5fd6608 35147:40aadd3551128bbe 37104:c07d9c7b79f20c25 ;
stdvar_over_time - 2391 -38 6870 2391 12 ; 4111:40833136c3e4b772 5402:c078dd67205aee58 6413:c04893ce279c0982 6912:7ff8000000000001 9803:403457a3267eac5e 12622:c075817d4b63fa04 26755:c07c7b65170d4a2f 27343:c072aa4e95c4cc7e 29370:c0802f8294ccdae9 31467:7ff8000000000001 32462:4078641011bdba3e 34721:40529465bcfd3575 35053:c0753aa5614df558 35211:c05eaffb11bd81b1 35929:c07e8a5c1292ec26 36335:4085ee2f0b5e42ad 38788:406f5a291f2af001 39043:c07584291d06e7bc 40312:7ff0000000000002 41558:7ff8000000000001 42484:40808cef16e490bd ; 6870:40ddaebcc6f497ef 9261:7ff8000000000001 11652:0 14043:0 28389:40b81796b60aeb59 30780:0 33171:7ff8000000000001
stdvar_over_time - 1000 0 14881 200 12 ; 15548:430c6bf526340013 18397:430c6bf52634027f 21283:430c6bf5263400c5 21713:430c6bf5263400d5 22982:430c6bf526340311 25480:430c6bf5263402b2 27938:430c6bf526340195 28976:430c6bf526340269 29796:430c6bf526340182 32472:430c6bf526340200 32495:430c6bf5263400fd 33023:430c6bf526340247 36005:430c6bf52634030e 37249:430c6bf52634015e 38025:430c6bf5263402c6 39353:430c6bf526340079 41874:430c6bf526340072 43209:430c6bf526340249 45844:430c6bf5263400a8 47856:430c6bf526340172 ; 15681:0 15881:0 16081:0 16281:0 16481:0
stdvar_over_time - 1830 8903 36958 1829 5 ; 36655:7ff8000000000001 39473:7ff8000000000001 40658:7ff8000000000001 42976:7ff8000000000001 45776:7ff8000000000001 46701:7ff8000000000001 47144:7ff8000000000001 47974:7ff8000000000001 48752:7ff8000000000001 49958:7ff8000000000001 51153:7ff8000000000001 52515:7ff8000000000001 53677:7ff8000000000001 53889:7ff8000000000001 54708:7ff8000000000001 56774:7ff8000000000001 58863:7ff8000000000001 58928:7ff8000000000001 60044:7ff8000000000001 61521:7ff0000000000002 ;
stdvar_over_time - 1677 -7469 19277 835 3 ; 3264:c07fda513cb19f69 4783:0 5415:4079f3985c7a44d8 18538:c068d3df3de69bfb 20527:408b25f74ab8f305 20888:4089b29fb2f82d0c 23612:c0528d9468c8ae50 24249:407792d78dddda2d 26887:c0529a79cd805d81 ; 20112:0 20947:0
stdvar_over_time - 6047 7364 13033 3020 18 ; 9864:fff0000000000000 12591:fff0000000000000 13474:fff0000000000000 ; 19073:fff8000000000000 22093:fff8000000000000 25113:fff8000000000000
stdvar_over_time - 938 0 23039 937 6 ; 22082:4065997d691043cd 23895:40880ca6e3dc9751 24006:c07662920b64bc78 35394:c08c30cb6d19675a 36655:c084f2b7a5bf9103 38806:c0745f96b04c2d4c 39147:404e16abfcc0993a 39636:c08ce4825ea5f7f3 40372:7ff8000000000001 40445:7ff8000000000001 40514:404ad3c2fbe3b9a1 41353:c072813568b186d1 41853:407bfe7e305b17db 44406:7ff0000000000002 45155:c080715a5b77533e 47100:c06a2c7b0121bb32 ; 23976:0 24913:0
stdvar_over_time - 1000 0 16324 440 2 ; 14432:425a087501151e86 15801:c012df0237e426aa 18283:bffe74b23a221adf 19195:40adf069c0417342 21221:403ca86e1e52b4a7 23724:c2b270571012e27b 24684:40e4a9265f7b9006 26999:4010fe3652a87300 29898:c046c845d394adc4 32162:3fb64e3ab1509b68 ; 16324:0 16764:0
stdvar_over_time - 3686 -4424 30113 3685 14 ; 19718:4059484a129cf859 21224:405a07558122b82a 23065:4010245e916c6b60 24648:403c82f2becd5a71 25882:404abe73cd88daf7 27509:4053153a64fd3672 29025:405d84a2034faea5 39752:405e895cdf46029a 40699:4064564acbd3aa78 41249:4065e2cd71ece58d 41697:406982f72bfdeb45 52080:406f80e57a08689e 54714:4072baf6c0755db1 55007:40750d833672cb14 ; 37483:408b176414397ea9 48538:0 52223:4075934082754ccc
stdvar_over_time - 4829 -8917 17968 1473 15 ; 20149:4083b7ec1ea3bad6 23092:4061a9f38f2e20b5 25001:c08b5279557c60a0 26946:4072aa7478741390 27951:4074fc493bccf711 28839:fe37e43c8800759c 30189:408e03cd765ac6fd 31608:c086ad7a69d8a6f5 32526:fe37e43c8800759c 34870:408d80ab910366bd 51021:405b76ce7683799e 53217:408df75d95a29374 ; 17968:410f7a78e382f116 19441:4113452b5e3b5063 20914:7ff0000000000000 22387:7ff0000000000000 23860:7ff0000000000000 25333:7ff0000000000000 26806:7ff0000000000000 28279:7ff0000000000000 29752:0
stdvar_over_time - 15182 -1603 22079 2965 3 ; 15155:430c6bf52634002d 16187:430c6bf526340206 17265:430c6bf52634014a 19167:430c6bf52634004e 20226:430c6bf5263402a9 22267:430c6bf526340094 25187:430c6bf52634014e 25557:430c6bf526340185 45823:430c6bf526340305 48405:430c6bf526340068 49075:430c6bf5263400cf 51782:430c6bf5263400c7 52562:430c6bf526340100 54340:430c6bf526340245 56073:430c6bf5263401af 57430:430c6bf52634030b 57686:430c6bf5263400b5 60312:430c6bf5263401da 62406:430c6bf52634016a 62649:430c6bf52634027a 64441:430c6bf5263400a4 64928:430c6bf526340309 66349:430c6bf5263401f5 67574:7ff0000000000002 68176:430c6bf5263400e5 ; 22079:408aefc555555555 25044:4084a45c00000000 28009:4084a45c00000000
stdvar_over_time - 1000 0 9839 497 18 ; 10774:41d1c55818c3be49 10909:c26e684533351926 11100:bff1d86067bea6aa 11537:42f1d6ebc44a73a0 ; 10833:0 11330:44c9b67a29f4bb24 11827:45d1bd538ff8fae6 12324:0
stdvar_over_time - 1000 0 9176 1380 2 ; 13212:408047fd9bff7792 15244:7ff8000000000001 ;
stdvar_over_time - 1000 -3542 27202 1387 19 ; 11570:3ff510e9f76ef9c8 13718:400d1cc130cc47b6 15268:401d94fee470194b 16625:40450cd905c7507a 19159:4050e7827ad49c9e 19487:3ffc74aadf0846dc 25043:4012e05203045061 25620:404a41a7686ad0e9 25975:4050955078db7124 28001:4053ed96fd2e40b2 28312:405f59bc45d99268 29424:7ff0000000000002 ;
stdvar_over_time - 2377 -3756 2248 2376 15 ; 5118:bfbb63a9fe7fa518 7675:400f3ffc85e4cd71 10228:40d2e7934b0625ee 11551:41f1bb0de06f3d89 13327:c1ebb48373fa71f6 14907:c297c7130397bc17 16147:bff614fb0921017a 18177:404ccec80ebd084b 18950:412c96093e2633cb 18985:422650d30b5d4837 21865:4180cb69e9e72120 22470:c28a5bac382f9373 37427:41f0fd4f4162f1b0 38381:41e61b502d98e213 40031:c1f27c36ac2334a8 42832:41ea91f84b15fa5d 44485:c0403c881997b545 45746:4219ed7d1932e383 47513:40f773b129a9bbbb 48868:40af23dd8772ce7d 48932:bff3f1ce44dfb3d1 ; 2248:0 4624:0 7000:0 9376:0 11752:4521a5dca343b266 14128:0 16504:443baa67cf804640 18880:4505b61a253a5731 35512:43a19e709c475116
stdvar_over_time - 274 0 13344 1313 4 ; 1542:404d9016e04e4b5a 3033:404fc9acae5132ae 5906:405a3dee77448350 8686:4062f0aa73be16ef 10495:406412de173b9586 11036:3ffef0cc8f665c58 11830:400dd1eca4d055be 13741:403f3f59dbfddc7a 16328:405164f3b44a9f78 16628:40589ee34f5c5a72 19496:4061dd68d8c3b061 21965:4063012fd029b332 24165:4067fed3d1790322 30495:406869df07d6b761 31417:40005e22c963b3ea ;
quantile_over_time 0.5 1101 -6411 31032 1100 4 ; 32248:430c6bf5263402db 34711:430c6bf52634029c 37018:430c6bf5263400ec 37387:430c6bf5263402cb ; 31032:430c6bf5263401dc
quantile_over_time 0 1000 6918 -1155 3349 2 ; 1535:c0279ea9314831f8 2920:40833b37c83ff5be ;
quantile_over_time 0 1000 -7959 7879 2738 7 ; 6324:40822e688d364252 7237:408833f80b2a2a88 7891:408e1f7dbba2da5b 10247:408c287fa592bf4d ;
quantile_over_time 0.5 6284 0 27130 1024 17 ; 20883:c079b38bfa787eec 23070:c076aa455a77b0e1 23676:407c17941126a68b 25926:c077beb2eb7993f9 26181:4077367ae902da95 26923:8000000000000000 28148:fff0000000000000 29817:4086e440fa58fe73 32768:406b5392729af8d3 55820:4088cfce954a1929 56230:407842345cbb6d94 57704:4087cea5798778f8 57892:7ff0000000000000 ; 27130:c066aa455a77b0e1 28154:c066aa455a77b0e1 29178:c066aa455a77b0e1 30202:0 31226:0 32250:4067367ae902da95 33274:406b5392729af8d3 34298:406b5392729af8d3 35322:407db92596ffbca8 36346:406b5392729af8d3 37370:406b5392729af8d3 38394:406b5392729af8d3
quantile_over_time 1 2368 -2546 16333 2367 8 ; 9707:7e37e43c8800759c 10913:7e37e43c8800759c 12881:7ff0000000000002 14608:7e37e43c8800759c 16569:7e37e43c8800759c 17282:7e37e43c8800759c 19766:7e37e43c8800759c 20198:7e37e43c8800759c 20207:7e37e43c8800759c 21722:7e37e43c8800759c 22036:7ff0000000000002 ; 16333:7e37e43c8800759c 18700:7e37e43c8800759c 21067:7e37e43c8800759c
quantile_over_time 0 1376 0 17737 1375 11 ; 20102:c04c5915bc4a225f 22450:7ff8000000000001 23908:c08dd899d78b57aa 24067:40817cf2932262a2 26204:4087d3fc68117ffc 27480:40825bee0abc265b 29114:7ff8000000000001 31092:c080af93ea80535f 31470:4075dd4850555580 32914:4077b5afe418d0ca ; 20487:c04c5915bc4a225f 23237:7ff8000000000001 24612:c08dd899d78b57aa 27362:4087d3fc68117ffc 28737:40825bee0abc265b 30112:7ff8000000000001 31487:c080af93ea80535f
quantile_over_time 0.5 1803 -4485 1245 1802 4 ; 3789:40858d805319a257 5681:4076804526356bee 7990:c0732c9a9d16d9dc 9333:406883881a2dbde0 11175:408a5702a1ffccb2 11409:407e92f1fc020898 33963:408e25a35998b905 34550:408660b6c1962166 37276:c081b9241779a3f0 37829:c08b256045b413ed 40133:7ff0000000000002 42448:407b1543e47cf5bd 59365:408c95796959e973 61585:40743a76cb6a3027 ; 1245:4076804526356bee 4849:c04bab5a3fffebb0
quantile_over_time 0.5 7845 1152 39988 3919 9 ; 18046:c0773baa92f97dad 40707:c05f986fba1a3f16 43684:408a387222752c9c 44634:c052d1d381076d57 44740:40858ffd0aad12ce 45891:406c9742e3a3462d 47452:4085d7d9215be273 49729:c08946bdb59737f5 ; 43907:c05f986fba1a3f16 47826:406c9742e3a3462d 51745:407cb5cdc395e459 55664:c04b7724a1daac10
quantile_over_time 0.5 3342 8188 17283 3341 3 ; 13170:405b30b13d74a5eb 14720:406090f1c04d4074 15791:4060ff85691736e1 16743:4063e3fbb2002fb9 18170:406633011bb709c2 ; 23965:405e294a5f07936a
quantile_over_time 0.25 19317 0 12184 500 13 ; 10578:406578b132873381 12335:c06de82dbd1eb5d0 ; 12184:406578b132873381 12684:c0610ff601353b7c 13184:c0610ff601353b7c 13684:c0610ff601353b7c 14184:c0610ff601353b7c 14684:c0610ff601353b7c 15184:c0610ff601353b7c 15684:c0610ff601353b7c 16184:c0610ff601353b7c 16684:c0610ff601353b7c 17184:c0610ff601353b7c 17684:c0610ff601353b7c 18184:c0610ff601353b7c
quantile_over_time 0.25 2303 0 4103 2302 13 ; 3929:c17127107f87927c 3988:c27c6c80841e6e5b 6646:42901e0b3cccea97 6824:c1effc54ce756c75 7982:40c4dfb56c574b27 9390:41839ad8e2b2eee7 ; 4103:c2755164acdaf2a6 8707:c1dffc4f9688115f 11009:41839ad8e2b2eee7
quantile_over_time 0 1890 -5712 5645 1490 12 ; 6184:4053003bee193d3a 8965:4056ba8bc2e680fe 11604:4058a83f0ccb39c6 12572:405c2155f14766c1 13294:405c4f0757f73c42 13579:4063fffecbcf0846 15675:4068395e91af90ee 18008:40683f50c5bd6a69 19034:401ca8381cd5ad88 19685:400c2c8dabe1cced 21102:404224859d3da1ae 22464:4051e82d595ac58c 23617:405d84a7b03f5e9a 24580:405e35f75fe606e5 26694:4060baffd870d38d 29544:40630ad6dd34684d 31397:4065028f62e53cad 33819:4067d7cc09868bd2 ; 7135:4058a83f0ccb39c6 8625:405c2155f14766c1 10115:4068395e91af90ee 11605:4068395e91af90ee 13095:40683f50c5bd6a69 14585:400c2c8dabe1cced 16075:404224859d3da1ae 17565:4051e82d595ac58c 19055:405d84a7b03f5e9a 20545:405e35f75fe606e5 22035:4060baffd870d38d
quantile_over_time 0.5 1000 -2821 16434 1571 6 ; 18774:40494ee308cf1418 20865:40509c1ed354d7df 22126:40585b8be38fb280 24425:405bdf1bc955fe6c 24616:401d822be4b85e3a 24884:4019e8ce2ba68024 27802:4033decb85caf7a0 27855:403ecab6b0597466 30537:4053717c035031ee ; 16434:40494ee308cf1418 19576:40585b8be38fb280 22718:401bb57d082f6f2f
quantile_over_time 0.9 3218 3261 32229 3218 14 ; 3873:fff0000000000000 5241:fff0000000000000 6809:fff0000000000000 7786:fff0000000000000 8123:fff0000000000000 11114:fff0000000000000 12446:fff0000000000000 14818:fff0000000000000 17545:fff0000000000000 19526:fff0000000000000 20560:fff0000000000000 21994:fff0000000000000 24030:fff0000000000000 25248:fff0000000000000 26103:fff0000000000000 28892:fff0000000000000 30569:fff0000000000000 31380:fff0000000000000 32782:fff0000000000000 35311:fff0000000000000 35905:fff0000000000000 36629:fff0000000000000 37652:fff0000000000000 40384:fff0000000000000 41569:fff0000000000000 ; 32229:fff0000000000000 35447:fff0000000000000 38665:fff0000000000000 41883:fff0000000000000 45101:fff0000000000000
quantile_over_time 0 1000 -4901 18307 2509 17 ; 6841:7ff8000000000001 7800:7ff8000000000001 9982:7ff8000000000001 11623:7ff8000000000001 13670:7ff8000000000001 13795:7ff8000000000001 15221:7ff8000000000001 17024:7ff8000000000001 18792:7ff8000000000001 ;
quantile_over_time 0.5 398 6011 -949 398 9 ; 2678:430c6bf5263401d0 5239:430c6bf526340150 7812:430c6bf526340261 8153:430c6bf52634004c 10877:430c6bf52634011e 12193:430c6bf52634016a 13781:7ff0000000000002 35784:430c6bf5263402e0 37081:430c6bf526340051 39640:430c6bf5263400dc 45429:430c6bf5263402f1 ;
quantile_over_time 0.5 6293 4391 25601 3143 4 ; 20174:4086501499dfd567 20914:c06593f7ef673356 22650:406d2fb0d1204ab8 24397:7ff8000000000001 25704:c08c17f2bdcb33f5 28569:c08deb15c9c4cc8e 29932:c084f018c52c02f0 ; 25601:4070eb169e060892 28744:406d2fb0d1204ab8 31887:c08c17f2bdcb33f5 35030:c08d018443c80042
quantile_over_time 1 1000 0 11113 1445 15 ; 9786:40487474f2fb84f7 12064:4052ad6c7f5a9dcb 13009:40545ed85ee106cb 13115:405e2eb863e22c77 ; 12558:4052ad6c7f5a9dcb 14003:405e2eb863e22c77
quantile_over_time 0.25 1158 7640 12405 1158 4 ; 16403:405b4d6420c65dd4 16778:40625adea16001e0 ;
quantile_over_time 0.9 6937 641 18582 3465 11 ; 18352:430c6bf5263400ff 20964:430c6bf5263400ee 21904:430c6bf5263401e2 23314:430c6bf5263400a0 24870:430c6bf52634021b 27655:430c6bf5263400c5 ; 22047:430c6bf5263400fe 25512:430c6bf526340204 28977:430c6bf52634020a 32442:430c6bf5263401f8
resets - 3768 0 13718 3767 6 ; 14081:c081e14dc492a662 16656:406dd0d2f431afda 17441:4087c45d852ed036 20132:c08abab899a37f3e 23068:407d9681aa160159 25125:c072988a542672e9 26319:c067222419a4dc8f 29227:c07016e3ce63462d 29553:408354dbe25bcf93 30995:408d6aa5344ea842 31642:4073140b6340e48a 33235:c06f149ca1838161 33720:7ff0000000000002 35669:7ff0000000000002 37105:c070317724ece1af 37169:c077f7984dd786d1 40105:c08e63edb0b78dac ; 17485:0 21252:0 25019:0 28786:0 32553:3ff0000000000000
resets - 66 5354 9160 66 20 ; 2722:404f27020204dd57 4335:405652b6cef06ae3 6948:4058a653f586ca04 9505:3ff15b213ada226f 11469:400f657d58103666 12222:7ff0000000000002 14290:403548436f5deb69 ; 9754:0
resets - 1100 -283 48461 1100 1 ; 19679:430c6bf5263401f8 19900:430c6bf5263400ae 20606:430c6bf5263401fb 22342:430c6bf5263402d3 33243:430c6bf52634001f 34716:430c6bf526340293 36948:430c6bf526340204 39053:430c6bf526340308 39698:430c6bf5263401dd 39727:430c6bf5263400bb 41963:430c6bf526340064 43493:430c6bf5263400c4 45092:430c6bf5263402d4 46155:430c6bf526340156 46400:430c6bf5263400a4 47864:430c6bf526340215 50375:430c6bf52634007d 53196:430c6bf5263402c5 71860:430c6bf526340173 73165:430c6bf5263402fb 74394:430c6bf5263401b4 ; 48461:0
resets - 19293 0 17826 2303 2 ; 16015:4059f9d989bbad7c 16404:405ac385337d0eeb 17439:406097ba1ff8e7fe 17907:4063c7d9cba08e22 ; 17826:0 20129:0
resets - 3871 -481 6658 1932 1 ; 10409:430c6bf526340002 11298:430c6bf526340084 12336:7ff0000000000002 13065:430c6bf526340254 13748:430c6bf526340047 15646:430c6bf5263400d6 16838:430c6bf52634013f ;
resets - 1000 -3024 29819 3314 6 ; 7395:4015e954accfe5eb 8848:404b7b5ab56fa579 10855:40576f17c8fe2e76 28027:405ded38ced22e4f 29804:40196e0484580d46 32728:40354585964e28b5 34037:40513ea0ef118c90 35630:4052ca7670c9d117 37878:405e67a44b968ae2 50736:40640c471648fe7f 53399:7ff0000000000002 55831:4066a6d315bedef4 58113:406cac0bcb389c45 59584:406d85ab5e884e73 62215:406ffaef7bf00e97 62539:4073043c5787a3a4 64259:7ff0000000000002 66952:40751588588467b7 69771:4076da11321c4957 71768:40776ae4ceb42e27 72569:407a0bcacccbceac ; 29819:0 33133:0
resets - 6087 2320 8343 3040 3 ; 6528:404e27fa6d41f32c 6745:40577e0687d1c0fa 9018:405917e5e628ca5f 9807:405b9184da3a3d3f ; 11383:0 14423:0
resets - 595 -335 72426 595 16 ; 8773:430c6bf5263400ef 9702:430c6bf5263402e8 10817:430c6bf526340108 12028:7ff0000000000002 14608:430c6bf526340303 15052:430c6bf526340112 17525:430c6bf52634006a 38728:430c6bf5263400b7 41702:430c6bf5263400e6 43222:430c6bf526340158 45038:430c6bf526340128 45504:430c6bf526340193 48188:430c6bf5263401cd 67298:430c6bf52634006b 69108:430c6bf52634013a 70979:430c6bf52634011b 93576:430c6bf5263400ca 93709:430c6bf5263401f7 95007:430c6bf526340094 ;
resets - 8259 0 12409 3103 19 ; 13036:42fbfcc123f1cae0 13139:c2846b8af48355f7 ; 15512:3ff0000000000000 18615:3ff0000000000000
resets - 3383 -526 14406 3382 17 ; 14463:414aae5c835d27cf 17294:3fe8f236c2be0a92 18262:420fe80342e5b441 19299:c1645336c6087156 21058:c2be64c888a66df2 21989:3fddf2bff97222a8 23185:c057f8b4b62c6f2c 26105:c1b0e006f38a76d7 28466:42b1f7f5192ed965 30230:428e25283d4f1973 31284:c03afe12e83158e9 34207:c20d5dd9df4832f7 35335:4248a572cbad11b7 37100:42b3d4d55561bdad 37658:41b17ec1afc099f5 ; 14406:0 17788:0 21170:3ff0000000000000 24552:3ff0000000000000 27934:0 31316:4000000000000000 34698:0 38080:3ff0000000000000
resets - 3939 0 7228 1966 16 ; 5591:4048aa315c212b7e 6864:4050a0570282fc33 9735:4013219e119eb90a 10738:4017898a13a94066 12809:403a623762a70532 14597:404d9785f126bbbf 14949:405047ee73d96148 15319:405645dbeec4c6cf 16990:405a6f17763de587 17544:40630e2503c6580e 19823:406590c28027172b 21853:406739c404c3790f 22991:3ff9f78cad802b21 23599:403c9ba392cbca64 25954:404fb3420e81d674 28144:4058e623a8b8035c 28894:405f7a8990605772 29694:7ff0000000000002 32549:405fbe62b8fb7fe6 32755:406501af53a9b55e 34684:4068c287bb2ac46e 36306:406e8e07628104e0 37043:407103b23c37de8d ; 7228:0 9194:0 11160:0 13126:0 15092:0 17058:0 19024:0 20990:0 22956:0 24922:3ff0000000000000 26888:0 28854:0 30820:0 32786:0 34752:0 36718:0
resets - 18586 2900 30597 2135 9 ; 16994:fff0000000000000 17305:fff0000000000000 19845:fff0000000000000 21992:fff0000000000000 22835:fff0000000000000 24768:fff0000000000000 25981:fff0000000000000 28633:fff0000000000000 31627:fff0000000000000 ; 30597:0 32732:0 34867:0 37002:0 39137:0 41272:0 43407:0 45542:0 47677:0
resets - 1000 2060 23625 2282 5 ; 19146:7ff8000000000001 21983:40610d8c832a8559 22155:406679d8a668adc8 23403:40725bf5f14a1d60 26239:c085b210ec5f4f87 27829:fff0000000000000 51881:40886f993ed95d58 ; 25907:0 30471:0
resets - 198 8281 7971 197 4 ; 8178:430c6bf526340183 10591:430c6bf526340040 11036:430c6bf526340104 13421:430c6bf5263400d9 13653:7ff0000000000002 16632:430c6bf526340024 17130:430c6bf526340109 18181:430c6bf526340158 25149:430c6bf5263401c2 26577:430c6bf52634024b 29089:430c6bf52634015c 31103:7ff0000000000002 31503:430c6bf52634009b 34240:430c6bf52634031b 34876:430c6bf5263401e8 36626:430c6bf52634003f 37498:430c6bf526340257 39302:430c6bf52634010b 41484:430c6bf5263401a3 44108:430c6bf52634012b 45253:430c6bf526340013 46463:430c6bf5263402dd 48356:430c6bf526340015 50812:430c6bf526340004 ;
resets - 8129 0 7323 1283 18 ; 823:430c6bf5263401c1 3679:430c6bf52634005e 5995:430c6bf52634016c 15445:430c6bf526340060 17784:430c6bf526340063 18079:430c6bf52634011d 18243:430c6bf5263400a5 19740:430c6bf526340009 20866:430c6bf526340113 22275:430c6bf5263401d2 23632:430c6bf5263401b6 23695:430c6bf526340176 41079:430c6bf52634016e ; 7323:3ff0000000000000 8606:3ff0000000000000 9889:0 11172:0 12455:0 13738:0 16304:0 17587:0 18870:3ff0000000000000 20153:4000000000000000 21436:4000000000000000 22719:4000000000000000 24002:4010000000000000 25285:4010000000000000 26568:4000000000000000 27851:4000000000000000 29134:4000000000000000
resets - 1261 0 29673 1261 16 ; 14876:8000000000000000 15067:8000000000000000 17617:8000000000000000 17986:8000000000000000 20491:8000000000000000 22015:8000000000000000 24905:8000000000000000 25050:8000000000000000 25848:7ff0000000000002 25921:8000000000000000 25939:8000000000000000 25970:8000000000000000 26358:8000000000000000 28423:8000000000000000 29978:8000000000000000 46550:8000000000000000 46846:8000000000000000 ; 29673:0 30934:0 47327:0
resets - 1000 0 43272 2270 8 ; 30386:7ff8000000000001 32417:407e25a37fb94fd4 32920:40716f489bed7a79 35132:c0748b3be9fd6a8e 35514:4080abf10cde3bff 38264:406b9f0b9fe5fa9a 39839:407c8c12a3bc9e6f 40898:4086fd02e531b32d 42890:c088ed4ebae10e8e 44048:7ff8000000000001 ; 43272:0
resets - 1000 0 10234 3380 3 ; 6982:c17c493beac2bca0 8986:c2f457be4b9e92db 9237:c2f1d85c1a986cde 11105:419bcb06393a1764 ; 10234:0
resets - 14671 4661 19876 121 5 ; 14660:430c6bf5263401a2 15708:430c6bf5263402bc 17278:430c6bf526340204 20062:430c6bf5263401f9 21967:430c6bf5263402af 23979:430c6bf5263400a0 26888:430c6bf5263402c3 28647:430c6bf52634008a 30205:430c6bf5263402fd 32792:430c6bf526340037 33555:430c6bf5263402d7 35376:430c6bf5263401e9 ; 19876:0 19997:0 20118:0 20239:0 20360:0
resets - 1000 0 20087 1864 19 ; 20706:430c6bf52634003f 22164:430c6bf52634016c 22716:430c6bf526340068 23213:430c6bf5263401f2 23912:430c6bf526340134 25347:430c6bf5263402f8 26958:430c6bf52634024c 28941:430c6bf5263402d7 31786:430c6bf5263401e7 32510:430c6bf526340045 34040:430c6bf526340021 35993:430c6bf52634020c 36397:430c6bf52634021c 36745:430c6bf526340143 38223:430c6bf5263402e1 38765:430c6bf52634009a 41052:430c6bf526340138 41604:430c6bf526340270 43396:430c6bf5263402f7 43834:430c6bf52634027f ; 23815:0 25679:0 27543:0 29407:0 33135:0 34999:0 36863:3ff0000000000000 38727:0 42455:0 44319:3ff0000000000000
changes - 1982 -1928 25322 1982 6 ; 16336:7ff0000000000000 18087:7ff0000000000000 20957:7ff0000000000000 21526:7ff0000000000000 22307:7ff0000000000000 22512:7ff0000000000000 23640:7ff0000000000000 24955:7ff0000000000000 27476:7ff0000000000000 28401:7ff0000000000000 31344:7ff0000000000000 32515:7ff0000000000000 33484:7ff0000000000000 33618:7ff0000000000000 ; 27304:0 31268:0 33250:0
changes - 16679 -1346 12384 3946 19 ; 6113:fff0000000000000 8274:fff0000000000000 9137:fff0000000000000 11599:fff0000000000000 12723:fff0000000000000 13573:fff0000000000000 13728:fff0000000000000 ; 12384:0 16330:0 20276:0 24222:0 28168:0
changes - 15230 -4608 13849 846 8 ; 11778:408d9b954c9c7167 12167:c07a411842f99144 13545:c08b0172b82d0a84 15612:7ff0000000000002 18356:407a012d61f811d6 18743:407f2d0e5cf3a433 20447:407d2d3e9e5f1dbd 22622:c08f29d9a0f11fe4 23832:4076a4ce35cf3bc3 25546:7ff8000000000001 26187:7ff8000000000001 26344:405cb64abac025d9 26739:3fe78cebb6ccee80 29071:4083cf4f5bd60b3d 29203:40820b6682cca2f6 31545:c08c681783a47ea5 ; 13849:4008000000000000 14695:4010000000000000 15541:4010000000000000 16387:4014000000000000 17233:4014000000000000 18079:4018000000000000 18925:4018000000000000 19771:401c000000000000
changes - 3463 -9448 14791 1728 12 ; 5039:c08221f694017d77 6327:406af3f7e713ffaa 7082:40747dcdff516cd0 8345:40747faed6aac02b 10081:c086c7022c1fa245 11265:408bc8b802689a33 13636:c084a382a41b8150 15332:4056b158e44c42c2 ;
changes - 3005 4228 11203 3004 18 ; 2388:4057c836c8f03045 3275:4059a6fa9fbe8426 4202:405cd4e5472d254f 4600:4060e95a95f48090 7171:4066ddcdc6fa15a3 8584:406addabf166a819 9381:40708227270d8f91 11035:407353043c598da5 11571:4075a441f828ce2e 14040:407739d5b742a0c3 16988:4079f55f6776fc88 17049:407a2ef370704490 18250:407b593fe2822400 19000:7ff0000000000002 ; 11203:3ff0000000000000 14207:4000000000000000 17211:3ff0000000000000 20215:0 23219:4000000000000000
changes - 3011 -5931 14593 339 18 ; 5088:c08079b19f86936c 5496:408ceff523d8fb5b 6776:c05815e930311d83 9403:4075c8f41ed027d3 10540:404cbbf914be7d7d 12474:7ff8000000000001 12950:405d856ead57e2b4 25165:7ff8000000000001 26815:404a01a6c960dbfc ; 19339:0 19678:0 20017:0 20356:0
changes - 2831 7218 27940 2831 1 ; 2863:c076189ef755213a 5521:c0604c4418490f0a 7242:407ca112e18ca229 7864:408ebee2de4226cf 9662:c0794498148de244 11005:403b035bc8a88cf8 11300:c08d07f0cd55de44 12164:4055de2bd93bea88 14222:fff0000000000000 16464:7e37e43c8800759c 19447:c08f3fab5beaae24 22194:7ff0000000000000 22759:407047678eca0887 25037:7ff0000000000000 25855:408d7ad8a7d552c8 28548:40598e4390d413a4 31396:7e37e43c8800759c 34151:c088cd72d559c6fe 35112:fe37e43c8800759c 36893:c08e13b9cd41af32 ; 27940:0
changes - 1000 -9817 14212 510 6 ; 5069:0 7815:0 9130:0 9353:0 11996:0 14966:0 17243:0 19917:0 21450:0 23484:0 ; 14212:0
changes - 17762 -2504 13196 1030 19 ; 15104:7ff8000000000001 15334:408d05f834160c73 16604:408c5c0f2972ec43 17019:7ff8000000000001 ; 13196:3ff0000000000000 14226:4000000000000000 15256:4008000000000000 16286:4008000000000000 17316:4008000000000000 18346:4008000000000000 19376:4008000000000000 20406:4008000000000000 21436:4008000000000000 22466:4008000000000000 23496:4008000000000000 24526:4008000000000000 25556:4008000000000000 26586:4008000000000000 27616:4008000000000000 28646:4008000000000000 29676:4008000000000000 30706:3ff0000000000000 31736:3ff0000000000000
changes - 2015 0 15668 1004 9 ; 18693:c05e1c62ba360061 19715:fe37e43c8800759c 20627:c054cd0245e71f2c ; 19684:0 20688:4000000000000000 21692:3ff0000000000000
changes - 12448 9316 16344 2348 1 ; 12939:430c6bf5263401ca 13948:430c6bf5263401f3 15845:430c6bf52634002b 16355:430c6bf526340058 16605:430c6bf52634023a 16836:430c6bf526340082 ;
changes - 2375 -3256 71586 1184 11 ; 19190:0 20563:0 21318:0 21709:0 24280:0 44748:0 46438:0 47274:0 48408:0 50394:0 53124:0 70692:0 73688:0 75497:0 76119:0 78726:0 80388:0 80842:0 94073:0 94110:0 94210:0 ; 71586:0 72770:0 73954:0 75138:0 76322:0 77506:0 78690:0 79874:0
changes - 14792 0 13207 288 1 ; 16969:8000000000000000 19088:8000000000000000 19932:8000000000000000 ;
changes - 7282 0 33884 1328 18 ; 4588:40487384bde21b21 6125:c10dd30aa3d57ca2 6222:c20238b414630ec5 8135:410a9cdcac0fbe84 11089:4143e5c1ff9684ae 11615:4225bddce51d870f 11786:42a8c9d8b7e6c2d0 12614:411db3d62ff06778 15511:c2b1d36a42e2d91e 17768:4045f5a54f2b23fe 18659:411b6eb6e00b1a50 20189:4075548faca8676f 27533:4180a31e771b9119 27590:41ebbdbcd9d77526 28901:c1a0fe5a68327231 31330:c2a8913c0192142a 31471:c0b21558f0bd011e 31656:c0dbac2ba7727e6f 32867:7ff0000000000002 34562:c247f02b1906e5c6 36774:4094a634232eac57 37673:c12ffa6afa00cca9 ; 33884:4014000000000000 35212:4010000000000000 36540:4008000000000000 37868:4014000000000000 39196:4000000000000000 40524:4000000000000000 41852:3ff0000000000000 43180:3ff0000000000000 44508:0
changes - 1000 -1546 10776 1392 15 ; 14493:40857adef37c7e03 15580:40802de611105218 15806:7ff0000000000000 18358:c08766f20912ec3b 18951:402c317175a4c340 20668:fe37e43c8800759c 21867:fff0000000000000 22715:40674f066784267f 24514:40328faa31c78b48 27112:c08ea849e507125c 27235:c08c2fc9ee0c47b2 28327:408c00574b9140b7 30582:407324d63afd5213 32907:c069e69e9595d9ec 35791:c08ebb332ef415a9 38075:c08f3f3d4f35be24 38608:c089f67a1f78b9d0 ; 13560:0 14952:3ff0000000000000 17736:3ff0000000000000 19128:0 20520:0 21912:0 23304:0 26088:3ff0000000000000 27480:0
changes - 1000 8799 61443 3419 4 ; 12189:430c6bf5263401ca 13709:430c6bf52634003c 15291:430c6bf52634003a 16939:430c6bf526340186 25788:430c6bf52634013a 26364:430c6bf52634023d 50538:430c6bf5263402db 61118:430c6bf526340269 62454:430c6bf526340309 65113:430c6bf5263400d5 66448:430c6bf526340078 66723:430c6bf52634028d 66837:430c6bf5263402af 68494:430c6bf5263401db 69743:430c6bf526340226 69973:430c6bf5263400ed 70223:430c6bf5263402c0 71835:430c6bf526340097 73401:430c6bf526340178 74012:430c6bf526340107 75487:430c6bf52634014a 76874:430c6bf5263402f3 78797:430c6bf52634022f ; 71700:0
changes - 3213 3262 9616 3213 5 ; 12784:430c6bf526340075 15734:430c6bf5263401f4 16193:430c6bf526340007 19034:430c6bf526340213 20566:430c6bf5263400ab 23461:430c6bf5263401e9 24871:430c6bf52634022a 27115:430c6bf52634029d 28577:430c6bf5263400ff ; 19255:3ff0000000000000 22468:3ff0000000000000
changes - 1857 0 17806 1856 7 ; 21773:7ff8000000000001 22333:c07a51e4231167d4 24356:4084e0ce9a1f40e6 25967:7ff0000000000002 25978:c08163b53f0f17d8 27909:4040192319d13158 30798:408e4b33240d152d 32633:c07f38232a0e7175 34169:7ff8000000000001 34359:7ff8000000000001 36895:40886b0504c86a1a 39816:c06c0cd42ed5fd53 40092:4087150a7ec51bdb ; 23374:3ff0000000000000 25230:0 27086:0 28942:0
changes - 1102 2833 27442 1102 7 ; 14529:401aac2b1f135a13 16943:7ff0000000000002 19324:4036a0304f7575d9 21013:4046441ef8e6f334 23466:4055cfd56bd88566 25982:405bba3bb3838c36 27337:405ddd7783786142 28712:4063e497593f9c67 31430:4068018c9f9ed9a8 33216:4069013147430dc6 34155:4069d966b8f05a39 35202:4069e88ba92ee1ff 35324:406df0faf2874fa2 35748:4070323a733ffd7b 36311:40733d9eb4e939ff 36398:407553e5d69f1898 37651:4076a4d5be09a604 40432:40780065a19d4bf7 43426:407965ed34ccc782 45578:407afc8419cf9afb ; 29646:0 30748:0 31850:0
changes - 1000 8198 7893 3686 17 ; 11284:404bafdd4b09d778 13253:4056e95454bb4442 ;
deriv - 1000 -1119 7385 2636 11 ; 10944:4050ed1004a72238 13915:40114bd5b5141019 16320:4045366e8d0aaa2f 16526:40036a77893618e4 16611:401d73b0217a530b 28107:4033eefaf18b3a09 31022:3ff95e72dd164109 ;
deriv - 15100 -845 15769 3235 16 ; 17187:c0450766291b9d40 20062:7ff8000000000001 21932:4082815b0ecf8e71 24142:406d02d8d7603416 27084:7ff8000000000001 28587:407f5772308db2d4 30812:c072b62f8f3e30c5 31693:c081339ba44384a4 33566:c08ceec9f888d96d 34545:7ff0000000000002 36459:c06bb694dfaadaee 38038:40421507984f4f70 38564:c084b19fea5843b1 ; 22239:7ff8000000000001 25474:7ff8000000000001 28709:7ff8000000000001 31944:7ff8000000000001 35179:7ff8000000000001 38414:7ff8000000000001 41649:c04464506778607c 44884:403a98b713664d35 48119:c05ecf1242499c97 51354:c094bec74e615fb5
deriv - 3603 6408 23090 3602 20 ; 17389:430c6bf52634008c 17679:430c6bf52634025b 18955:430c6bf5263401bb 19515:430c6bf5263400dc 20840:430c6bf526340307 23702:430c6bf5263402ea 24038:430c6bf526340105 24398:430c6bf52634007d 25202:430c6bf52634025d 25735:430c6bf526340122 27705:430c6bf526340027 ; 26692:c004b267d515654e 30294:bff3889564768da8 33896:402d5e60add53eb5
deriv - 2931 -199 3508 2930 7 ; 867:8000000000000000 1732:8000000000000000 3890:8000000000000000 ; 3508:0
deriv - 1000 4451 24695 2007 14 ; 10855:430c6bf526340234 12900:430c6bf526340140 14087:430c6bf52634004b 14415:430c6bf5263400b0 16927:430c6bf526340006 38013:430c6bf52634019c 40809:430c6bf5263401a8 ;
deriv - 1875 0 17471 1740 11 ; 7227:408ebfd36b92ef22 8037:405d9f545d2f1558 9887:c07e7e9c17725ac2 11610:0 11777:c08b79d5194d885b 13918:c0884b476a4d6955 14594:408555d9c95edfd6 15745:c079c4927b1f53a3 18196:c06e9ff9dc93f1fb 20984:407c9e0a5a960ef9 21124:c06383f773893d3c 22388:4084059b607a5e33 39033:c08551dffd668d12 40208:c0856f1f5eded539 ; 22691:407483eaa077ae75
deriv - 3111 -6496 65471 3111 5 ; 8362:430c6bf5263400e3 10150:430c6bf526340254 10403:430c6bf5263400e6 11743:430c6bf5263401d5 12638:430c6bf526340281 13935:430c6bf5263402b6 16175:430c6bf526340005 24000:430c6bf5263402c6 24270:430c6bf526340063 25583:430c6bf526340133 28312:430c6bf5263400c1 31067:430c6bf52634004d 32392:430c6bf526340183 32922:430c6bf5263401d2 33702:430c6bf526340066 36602:430c6bf5263402ce 60838:430c6bf526340239 63075:430c6bf5263400f1 70020:430c6bf5263400f1 72473:430c6bf52634031c 74750:430c6bf5263400ad ; 68582:c04111c180ec2686
deriv - 1000 6388 24915 3025 1 ; 16053:405c8e2e4d486100 17974:4013b3f7029205ef 20784:40471f45fd8e6905 23139:4051904a7e963706 24250:405bc7f53514a87c 24755:405d4d51c01e285b 26154:406212c65e9fba92 26992:4062bd09c82a3595 28840:406301483a47226f 30395:40644efa951b7ad2 32529:40648b30c1ce4329 34740:40668bc3bc434868 37390:406bafb7aac47b98 38008:406ddedab76e2fa4 38878:40710904d1da0990 ;
deriv - 8773 3384 42577 923 19 ; 19206:430c6bf526340006 21508:430c6bf526340130 24225:430c6bf5263401bf 43558:430c6bf526340315 43861:430c6bf52634014b 45783:430c6bf526340171 47070:430c6bf52634012a 48607:430c6bf5263402d9 49081:430c6bf526340030 49313:430c6bf52634001e 67013:430c6bf5263402ee 69120:430c6bf52634016a 85682:430c6bf526340234 87506:430c6bf5263402cb 89485:430c6bf5263401ba 90070:430c6bf5263400d2 ; 48115:c067a80d18250d5f 49038:c067a80d18250d5f 49961:c02c80454a51b12d 50884:c026494da8553ad2 51807:c026494da8553ad2 52730:c01f858913ea098d 53653:c01f858913ea098d 54576:c01f858913ea098d 55499:c01f858913ea098d 56422:c01d36d5137884de 57345:c01d36d5137884de 58268:c02a32cbf1315190 59191:c02a32cbf1315190
deriv - 2106 1369 26192 2105 11 ; 20794:c1b24b10d02e6e73 21843:41a31666ea52bf98 23779:416c9e78dad83da4 25753:c18664e4d4bbb23c 28655:c0ad7bffeed94393 29722:4109365fbb100343 ;
deriv - 1000 0 20532 2117 12 ; 17273:430c6bf5263402d9 18220:430c6bf52634021b 20044:430c6bf526340149 21666:430c6bf526340124 22454:430c6bf526340104 24743:430c6bf526340312 25859:430c6bf526340255 26121:430c6bf526340198 28046:430c6bf5263402b2 29261:430c6bf52634010b ; 22649:c014ef94dfd44e2e
deriv - 3073 -2454 9989 1533 3 ; 5952:405859baf0e27e13 6052:405ac97d99aa0f62 7034:402227521e3b1b4e 8704:400c871620db712c 10886:4049f695cfd7147e 12498:405794a8ba0764ff 13672:405ffc7a775d224f 15880:4064316eef021274 18238:40696af9f8b86347 18256:406b8e18bfe75d6b 19789:406c8f81a80a4c3f 22482:406e4142af5bceff 22499:40704d801c6b2bb6 25146:3ff829d9539ed473 ; 11522:403ca394f919a936 13055:403ca394f919a936
deriv - 3728 0 21929 3727 17 ; 14280:430c6bf526340041 14984:430c6bf526340187 16125:430c6bf5263402ad 22787:430c6bf526340261 25521:430c6bf5263402a9 27284:430c6bf52634010d 29961:430c6bf526340305 32623:430c6bf5263401c1 34456:430c6bf5263402c8 36655:430c6bf5263401a3 ; 25656:4009afbba88d5435 33110:c02e3308f238de26 36837:c030c031eb1c5b9b
deriv - 1864 8373 17080 1863 11 ; 15052:c070bf8e01a704f0 17341:0 17485:c0881986fbf55ee9 19888:4071f20364fb9fdf ; 26395:c0b4eb7e100c1b47
deriv - 3479 0 10492 3479 18 ; 2878:40d7abb91f1ad690 5279:c1ac35002ff4be7c 7493:c2172b183a7cda6e 9865:bfb8b463756a9aac 23009:4149040782f5ee13 25747:4185d1f7ee182286 26697:c25086e260b37a2d 29398:422c9a1354eaaa08 32313:42fc3f3fbe1a0a1e 32662:bfc1e4b125e1ecac 33901:c140de02a353d15c 36856:41e00c315061fb57 37920:42e637b84049f552 39681:c25592b7b558210d 41090:41757dc87303de85 ; 10492:420388ec47c32c4c 27887:c2516647b9bc559c 34845:c2ea300504d442c7 38324:42e4e18ad67f1a0d 41803:424e9fada9c880b7
deriv - 8627 0 26125 1117 10 ; 15792:4070b2178285a034 18097:c08417cc7da996ac 19167:c08a8d524c0c32d9 22035:407aeb08a947f8bc 24326:c08d46b7130a49c4 27295:408c1f420ca1d384 29177:bfec089276057170 31010:404ce5201d598f24 32122:3fffe563b066e658 32124:7ff0000000000002 32691:c08ac416c6576305 35490:406af29dda0ea794 36479:7e37e43c8800759c ; 26125:4037b6f8cab75223 27242:4001d2d3d780e38e 28359:405caf90b992f9f5 29476:4042fe304ab12856 30593:4042fe304ab12856 31710:405e81f35f9642b0 32827:400a9da515b32fb4 33944:c06df560ebaa6a2b 35061:c06df560ebaa6a2b 36178:401e3c40b7e830c4
deriv - 1000 5784 16441 319 18 ; 13906:430c6bf526340292 15057:430c6bf52634009c 16339:430c6bf5263400ff 18017:430c6bf526340312 18608:430c6bf52634029e 18675:430c6bf52634031f 18738:430c6bf5263401a4 19770:430c6bf526340310 22266:430c6bf52634003a 25005:430c6bf5263400ad 26817:430c6bf526340003 29330:430c6bf526340038 30909:430c6bf526340176 31969:430c6bf52634028a 32421:430c6bf526340183 34394:430c6bf52634012b 36589:430c6bf526340039 38236:430c6bf526340311 40240:430c6bf5263400f3 ;
deriv - 1000 1257 20503 758 15 ; 12894:0 15821:0 17087:0 18553:0 19045:0 21486:0 24174:0 26065:0 26245:0 29205:7ff0000000000002 29614:0 31459:0 31689:0 33677:0 ; 20503:0 28083:0
deriv - 2586 0 8278 2586 8 ; 4477:40478e00e1e82e43 4488:4055157f04a436ab 6434:405acaff9f953749 7348:40639a7de916beea 10257:40666f916a936082 11889:406962b1aecc9316 12489:4010c771afdee311 14385:40480923f15bcc29 17344:4048e33b2dd3374e 18106:405415fdf61fb229 20088:4054b067b907d2aa 22341:4056de663146fa12 22833:400a6377f0a87773 23806:4046d9ea4eb20909 26199:405476280c754b68 26474:40591e1e579498a7 36068:405c27d7307aaedc 36877:40619eb16397e68c ; 8278:404b2a0400ea9db5 13450:c074b7b7c66b5753 18622:40440ed8a944b967 23794:c066670d373fa8a7 26380:402e3537c931ec05
deriv - 13185 -3081 16946 3742 19 ; 11970:c081170727f30d60 12322:c0810d031964c076 14317:7ff8000000000001 17214:c0897bd701777239 19365:7ff8000000000001 22114:7ff0000000000002 ; 16946:7ff8000000000001 20688:7ff8000000000001 24430:7ff8000000000001
predict_linear 3600 1000 -6703 28218 3686 2 ; 2852:40800c698ddc2543 5370:4087af037e5f6993 7582:c046573494ef6e78 10071:c080c3961cb33778 12457:c06bc8447303dd87 13588:fff0000000000000 15982:7e37e43c8800759c 17867:40387d65596bd67d 18379:c05178978836ddb7 20282:4080fa27397e3612 21949:4065a8b113ad6a23 22491:40895de7c3cf0386 23894:c080d0364eaf5dd1 26602:c07c8f3500716c97 27006:408b4ef2bee9f525 27187:7ff0000000000000 29397:c076f4e25d3105e3 31087:40883b6de0bd795b 32226:405b11bc07c1bb55 33178:7e37e43c8800759c 35050:c08234cd3a6a6962 37203:4023176a81d1c7e6 ;
predict_linear 0.5 1000 1917 3914 2763 18 ; 5531:c08726671497ca4a 6453:c0b2c6341e0ad226 7571:41a5ea12f346733a 9286:4285699fe6f70e7d 10192:41fe46221624e2fd 11913:c1f14219a1cd78ef 12277:c1b62298a8293097 13694:bfca455afd99e9a0 16367:bfccc7b4f153e178 17679:42f5d0d19f840100 18816:4062b6d8072a0e8b 21798:42c44d537c340c41 22310:c21b6bb42eaa888f 24169:41a142b0ec9e03c5 26063:42e92e692df6b731 27404:c1b788c31daaed4a 27822:c206ac66ea0b592c 30554:4022cb6ccc764dac 33176:4185efc52b44e057 ;
predict_linear -600 1219 0 31573 1219 8 ; 16019:403a44901286ed7a 18337:404389dd2186cab6 19689:4047eb6e88ead11d 22466:404a39d19811362b 25142:4053d42ae7bd173b 26569:405afa607e9b7ba9 28370:401af5156b9eee8d 28519:401e233282710a18 28766:4048ad3e3bef3755 30716:404e047610d92b1b 32406:405941421430d2d4 34299:4060ab76cf523121 35360:4062f7ed77049d25 ;
predict_linear 0.5 2342 -621 36760 2341 7 ; 17430:4032168a83d80882 17696:404bac77a0d22453 19118:4052b61e44000d1e 36888:4056c80743bbaa8b 38580:4060847870a3fedc 40396:406625f0b565fd2b 43357:4007073f61b3abb9 45544:404541e777ec4950 47766:404c1c11a9aa6b9c 49893:40524d1bb69e0053 50422:401fae62e5cba325 52794:4035b5b09bb473d3 53529:4045b70970e87906 54231:4045bd986bcc3d15 56353:404a01c3475c03eb 58227:404bac68855ca297 ; 50806:c0594b364ccd157e
predict_linear 3600 3997 2843 12685 3996 9 ; 9237:c07b6ebbc178d6d4 11476:c0802cba60224e38 11934:406880cb6d48736c 14490:4084f93ea2c03fb6 16130:40812e5e8f64e93d 19103:406896aaf91a5d7d 20053:c08096d6a78db6eb 20819:3feda53bb08e14e0 ; 16681:41556d27f5514483 20677:c1103f258ea22fc4 24673:c11ec2f7f428b623
predict_linear 0.5 2747 -2396 31148 2746 15 ; 17336:40774dd33cee7148 29445:7ff8000000000001 30147:408b2d12e88b5c51 31842:7ff8000000000001 34834:7ff8000000000001 ;
predict_linear 0 2516 1006 22137 2516 10 ; 20259:430c6bf5263401e9 22068:430c6bf526340076 23243:430c6bf526340286 24580:430c6bf52634029b 25267:430c6bf5263401a8 27955:430c6bf5263401dc 28035:430c6bf52634006d 30373:430c6bf52634016b 30931:430c6bf5263401e6 33443:430c6bf526340019 35778:430c6bf526340317 37485:430c6bf526340171 40383:430c6bf526340087 ; 24653:430c6bf526340505 27169:430c6bf52633fedd 29685:430c6bf52633e022 32201:430c6bf5263402e6
predict_linear 3600 2977 0 16785 1485 18 ; 7329:c07b9bc4154c3550 8209:c08ba2b644461558 9913:408849fcdca70328 10548:c086836d4d598549 12027:407b7fafa4dce5f1 12530:7ff8000000000001 14218:408352d6eac49af9 16304:4087b07afe909a02 16522:c0672cbc686bfbd0 16848:40868c3ed8ece002 18545:408036720d978801 18940:c05f91a702c794bd 19836:40511a459822b2ca ; 16785:c123fb5d5547e718 18270:41212615cf4413b8 19755:c13195914198ecb8 21240:c12bb49c090e06bf
predict_linear 3600 1000 5716 4927 2043 8 ; 5246:7ff8000000000001 7069:40637bdcebc1c212 ;
predict_linear 0 2562 0 27450 2562 12 ; 8020:404cd10696ec3bd6 10399:40580085fff5a74e 12886:4061c9eab1ce0d1c 15147:4061fab66b71a0ad 15755:40630cc4f66a07f4 16043:4068832039f65a76 17056:4069b733b7a298af 38429:4004a428edc78848 39946:4006aa2f664e677a ; 40260:40071568ef234689
predict_linear 0.5 3767 -2987 19896 3767 11 ; 13088:404b87980cd87839 13603:405958541553732e 14150:406177626a0f48c8 16087:4066a3209580a0b9 18640:406c06033dbbdd4a 19870:406da7fa0de70178 22853:40700f5a59bac33e 23454:407307a25729a1f0 23696:4075499e0175b1be 24327:4075dc372383c23b 24432:407740b61970e91a 25621:4077ab41e1a94328 25789:4078c9e6d72f96d1 28186:4079cd878d44ad95 31081:407bcc425693829f 33092:7ff0000000000002 ; 19896:406e1731e14a5ede 23663:407590ab3a34169b
predict_linear 0 197 0 31501 196 16 ; 20829:408f04cc161a255c 23570:408bde0af7afed8c 24969:c08021a3eb05fd9b 25407:408d17819acd315c 26438:408d42a1675221dc 27237:c0875bec7ae7e63c 28537:c06477a1b4b6151d 34982:407f155523051846 37164:c08d6c30080497f6 40121:c0508f93aa6de164 42422:c07c64557dcfc978 44639:c081cda2ab93b0fd 46878:4086c35ae7eb5865 49469:408c65eeef457e20 51566:c075d79da79c0e51 52097:406c50ff3d4e7b06 53200:4088e8d361046e27 ;
predict_linear 0.5 1000 9750 64366 1545 17 ; 18631:430c6bf52634019b 20366:430c6bf526340178 22837:430c6bf526340114 24885:430c6bf52634006e 49032:430c6bf52634006a 49098:430c6bf52634031c 51386:430c6bf5263400c8 54037:430c6bf5263401fb 54845:430c6bf52634004b 55484:430c6bf526340049 56950:430c6bf526340256 59899:430c6bf52634019d 60213:430c6bf52634021f 62153:430c6bf526340246 62763:7ff0000000000002 63533:430c6bf526340310 63669:430c6bf526340238 65044:430c6bf5263402f9 ; 70546:430c6bf5263401de 73636:430c6bf5263402a4
predict_linear 3600 1000 7661 13641 434 4 ; 12208:7ff8000000000001 12804:7ff8000000000001 14711:c07c25983fc90c20 ;
predict_linear 0 1273 2325 15618 633 3 ; 8082:c0829c3551bfb38d 9889:c089763ddb849b91 10320:c08556ede3f3b32b 11588:7ff8000000000001 14140:c0675f124f1366df 15826:c081a6dbcd6278b8 17977:405a568e141f9418 18926:406f395c1ac4986c 20053:c08288701d885a6d 21016:c067394889aec9ad 23367:408e67d3287bba9e 26052:7ff8000000000001 26261:c06039b220a368f2 27445:40817e0ef855e3bc 29770:4080fa0e99fd7c1e 30821:c0843444bbe1d213 31199:4067909969698b85 32253:c080d5ee07817427 33689:c03bfea12d91531c 34041:4079e630944d72de 36566:406b74f9f383acee 38864:c081e47d1fe66231 38892:c0657f69ba36ecc9 ;
predict_linear 3600 225 9413 4201 109 12 ; 7599:c08ce13b1150a667 9917:c081f9218edaf1d8 11279:40731f279996b375 13241:40713d7a7e4d36e1 ;
predict_linear -600 1000 0 19755 3804 17 ; 788:7ff8000000000001 2520:c08eca62440b41d5 5342:c070eef622855dda 6730:405c5b12d2f76c16 7603:c06ce74a0d92f3e3 8033:c06a73463484c9ff 10660:c0725064ecf49f30 10741:4070cddbf1364368 13215:7ff8000000000001 15499:4062b47d1cbb04c8 16397:4069d47f5dcdcafe 18084:405521836de4cc24 20771:403680187f479dce 22726:c06564bc4c6f1470 23971:4074aaaa7af82d1c 24261:4084103acc935e15 ;
predict_linear 3600 2169 0 24745 1081 8 ; 8986:c08941172c8c200b 9310:c08e1d09c1bcdaa6 12121:407f463e43337af1 35168:40764e75fb77247e 36698:7ff0000000000002 36923:c084fdd4dd06cd26 57616:7ff8000000000001 57625:c0887ed4e1d70d16 59635:4083b73aa6eb836e 62129:c083d48e0f6255f6 64196:c06cfa06b8201dcc 65163:c084450db21c127f 66421:408a40d04bb8f679 67404:fe37e43c8800759c 67953:c05a0f32809e7ee0 70514:c069df2c5e4eb04b ;
predict_linear -600 1420 0 7247 1420 16 ; 3025:c08608b99f0355cd 4403:7ff8000000000001 4611:c06bdfcf8a43d63a 6812:7ff8000000000001 8141:407c7b8fb3019e4f 8314:7ff8000000000001 8668:c089328adf07f3b2 10164:408e592c83ecae30 11982:7ff8000000000001 13436:4085d480f4f9b0dd ; 8667:7ff8000000000001
predict_linear 0 1000 0 31877 2220 3 ; 25414:430c6bf5263401ee 27070:430c6bf5263400b1 27851:430c6bf526340256 30538:430c6bf526340209 32983:430c6bf52634023a 35762:430c6bf526340222 36708:430c6bf52634030b 37444:430c6bf526340016 37741:430c6bf52634005a 38166:430c6bf526340053 ;
double_exponential_smoothing 0.5,0.9 1000 0 5244 326 20 ; 4858:c0889f797a13cf27 6674:c0527f6a5a5f1da8 8557:4087e2854caa185d 9264:c0813bb6e11e2ede 10960:40811fd9d69095c7 11577:7ff8000000000001 12900:7ff8000000000001 13907:c03efa89546ec0e7 16772:40389eb6201909a0 18087:c0312034c733fad2 19870:7ff8000000000001 20887:c0898797937acc18 21760:7ff8000000000001 22662:c08aa4648f5e26b7 25111:c0655ead5913ee44 26203:408631a2e5959cc3 26878:c08020ad7c4dbdb0 29681:4070048792241c8b 30082:c08d8cd4d95ab61b 30931:c074e604278f70e4 ; 9482:c0813bb6e11e2ede
double_exponential_smoothing 0.5,0.1 1447 3174 37257 1447 18 ; 16021:40688ccb5eee45a4 18183:40841eed453bf0c1 19902:4089511d3d8d80a5 20598:7ff8000000000001 22638:c08452c3a45261f4 23313:c058b6952d26be72 26221:c0847024b0ffed95 27209:7ff8000000000001 27375:4084c9d7f8053e1d 28583:c085d977751544a4 30243:4089ce3011cf8966 31892:c08a7a123403c942 34512:406a3dd8ccf1784f 36525:408eef4327e487b8 39367:7ff0000000000002 41409:c0899c87aab7bc52 42587:405936831778bc62 43184:c041ac19d81dfe31 45528:407ed0c8edc82d88 46528:408c63b40b5804ed 57191:c083e68c3d72738a 57580:c05d4b24acbd4cef 59994:7ff8000000000001 60923:408c1fec3d361f64 68282:c08251a26e484479 ; 45939:405936831778bc61
double_exponential_smoothing 0.1,0.1 3500 3409 56909 3500 17 ; 20810:40884a8a92da5de4 22249:7ff8000000000001 23055:404ef99e34200ecc 25691:4073eee469c7ce03 26092:c08998d6c41af527 28068:c06e06ca2402e6b7 30805:4074c737fd585c0b 30842:c08cd202a245c64f 30869:7ff8000000000001 31132:7ff8000000000001 33553:408793dcebad2adc 34210:c06605a3a9233b25 36068:40430c7b25e51b0c 50122:7ff8000000000001 53014:408a0b3803da3230 53349:7ff8000000000001 55542:c08eff4830b83a2c 57976:c085485211c6ef9e 59598:407ebb04e2ee8a0b 59747:4051c218f5a5f27a 61720:7ff8000000000001 63916:c08796f226e5fb55 65012:40637df204c59834 ; 56909:7ff8000000000001 63909:40978450e2dab378 67409:7ff8000000000001
double_exponential_smoothing 0.5,0.9 18427 -5667 17149 1518 3 ; 21453:42c1db75510b7c70 22466:c0883115e61786c6 ; 17149:c0883112f30bc363 18667:c0883112f30bc363 20185:c0883112f30bc363
double_exponential_smoothing 0.5,0.9 3495 -4421 15256 3494 8 ; 6210:406597e3c4810b63 6808:4089a42fd5617c3f 8437:408af1b14c976a9b 10565:4077a4838ff71334 13442:c075cb5e35f0ed18 14409:7ff8000000000001 16141:c07cf6f616329ccb 16504:c065a7139c12bcad 18062:40740a9dbe66ae25 18327:408f0719f1fb57bf 18575:c0876cf2aa6214a5 18938:7ff8000000000001 19670:c08773d7d7532ab8 20549:c084ef84dd957f54 21194:4061ef64d08dc61e ; 15256:7ff8000000000001 18750:4061ef64d08dc61f
double_exponential_smoothing 0.5,0.9 2069 7573 52886 2069 9 ; 38186:430c6bf52634001b 40788:430c6bf526340189 41994:430c6bf526340251 44015:430c6bf52634007e 46412:430c6bf526340062 49070:430c6bf5263402e7 50238:430c6bf5263402ed 52083:430c6bf526340036 53284:430c6bf526340221 53757:430c6bf5263402c6 56330:430c6bf5263401df ; 61162:430c6bf526340221
double_exponential_smoothing 0.9,0.5 3408 0 19379 3407 18 ; 15481:405264deb1e3af60 18099:405a4b0619af5cbf 19814:40629904ddf1f527 22285:4065de3e21e46fd3 23001:3fee1efe51cd9fab 25466:4012d8f2e777ee87 28012:7ff0000000000002 29980:4035519e683ccecd 32631:4045f8485fd54c38 33560:40550613d69de3c2 33673:4059ae8c146e5431 33764:3ffb542fd9be2e17 36735:4024124fbb9f691b 38211:4034881711472a82 39389:404964aa5b240bff 42078:405054d4535cda10 ; 22786:4065de3e21e46fd3 26193:4012d8f2e777ee87 33007:4045f8485fd54c38 36414:402b58af3d7e0279 39821:404867c008a9f938
double_exponential_smoothing 0.5,0.1 19802 -4750 23332 970 11 ; 3642:4047027b2e3e3458 6338:4051f3d144a68508 6930:4053e2f585e2ceaf 9665:405b8462345e1486 10653:40636ad4a962b878 12065:4064c8ecbaecd915 13758:40672877c09f4d3c 15945:4069e6f3cbf6a553 17596:406f87d9bff56732 18783:4070df3e69d08c88 18910:4072d47bfdc94671 19109:4074e16384e5141c 20748:40756cdb79a98839 23151:4076b58cf6eeb892 24919:4079082666b23a16 25588:407a1a499e443f7c 27730:407be4f21fb3db62 28199:407dbd5b1d97f260 ; 23332:407c46afd73b39f5 24302:407df460bd53ecd0 25272:407d457043c3774e 26242:407d73aed02683d1 27212:407d86e6a3ae9cd0 28182:407d86e6a3ae9cd0 29152:407e2f1687f6755d 30122:407e2f1687f6755d 31092:407d4f8cf7a266a1 32062:407d4f8cf7a266a1 33032:407dcc2ee09d58fd
double_exponential_smoothing 0.1,0.1 1000 592 -961 1449 13 ; 2962:430c6bf526340131 5256:430c6bf526340276 7143:430c6bf52634015f 9325:430c6bf52634010a 10165:430c6bf526340294 10222:430c6bf526340040 12096:430c6bf526340306 14463:430c6bf52634031d 16631:430c6bf52634013f ;
double_exponential_smoothing 0.9,0.1 1414 7876 44043 1313 16 ; 12622:7ff8000000000001 13996:7ff8000000000001 16508:7ff8000000000001 19213:7ff8000000000001 21160:7ff8000000000001 22353:7ff8000000000001 25024:7ff8000000000001 26750:7ff8000000000001 28052:7ff8000000000001 28131:7ff8000000000001 30362:7ff8000000000001 30744:7ff8000000000001 33672:7ff8000000000001 34390:7ff8000000000001 36015:7ff8000000000001 36895:7ff8000000000001 39876:7ff8000000000001 40607:7ff8000000000001 43460:7ff8000000000001 45306:7ff8000000000001 ;
double_exponential_smoothing 0.9,0.5 1291 7740 27490 1291 11 ; 13151:430c6bf52634002d 14527:430c6bf5263402dd 16793:430c6bf5263401ab 16919:430c6bf526340266 19208:430c6bf5263401a6 21518:430c6bf5263401e4 22497:430c6bf526340141 24963:430c6bf5263402f1 27708:430c6bf526340054 ;
double_exponential_smoothing 0.1,0.5 666 4856 3892 666 20 ; 181:406202a0ce296acc 1378:400e435a635a0855 2044:40241f24765632f9 4380:404d6507573b393b 5003:4053a012af46289a ; 9886:4053a012af46289b
double_exponential_smoothing 0.1,0.5 5743 1485 21933 2868 14 ; 15586:4047fec450210765 16620:4054abc208fcc234 18727:405a356508f0e861 18983:401956ff2ebf0cca 19635:4038fb9e0dd3f140 20441:4041607e614b058b 23038:405199b3cd26e61a 24313:402308571d132e86 25460:40333c2587c9daee 26093:40347ca991099a95 ; 21933:40636f6e615cf3ee 24801:c06981f32b4fadfa 27669:c0565cb6ec37ba37 30537:403c1b6082a3ab00
double_exponential_smoothing 0.5,0.9 3709 8081 25664 3709 2 ; 1734:42fc320d83b4314d 13184:42f3b2647c13f3c6 13798:41512851067d8ddd 15569:c0f10aee3ff7a943 15942:c1e134166828e9b9 16083:c2f9440c50149ad1 18668:c1edbaac5d3602a1 21227:bfdd617a6ab6476e 24155:41263d463e5e9777 24532:c07cd112c979dc43 24833:3fdc5e2432165b12 25918:4061102645d6df5a 27526:42ba58f25053abac 30034:4278f040a6ad8ec3 32350:40481a52867b8e91 33923:c21bef1cb99c3a72 34651:417be59e91782811 37204:40a7d6c6e8de255c 38434:c1852ab69f3ad423 39840:3ff41faca112d163 39977:c2a61706b42c5e7f 40301:42fc53611768434a ; 25664:c2e9441d8419f80c 29373:bfdd617a355b23b7
double_exponential_smoothing 0.1,0.9 3728 -2342 7029 3728 17 ; 4864:430c6bf5263402be 7081:430c6bf526340250 9986:430c6bf5263400b8 12892:430c6bf5263402a1 ; 10757:430c6bf5263402a1
double_exponential_smoothing 0.9,0.5 1000 2577 11922 2413 6 ; 5632:4042ee8244660225 7205:40437ffcd7f2c294 8249:4050c603bbd54edc 9650:4053ae48fd88035e 12376:40568f4b8dce88ff 14418:405722b7f01b5756 24246:405e51ae86f4082f ;
double_exponential_smoothing 0.9,0.1 291 0 18303 290 9 ; 15550:8000000000000000 18446:8000000000000000 20704:8000000000000000 ;
double_exponential_smoothing 0.1,0.9 6093 0 28580 3043 15 ; 3915:40056410d4c35630 5911:402d8b3a7e2d364a 19215:403f9658c0c9245c 19783:40524f4c19453e6c 21002:40549aa2de60f7f5 21713:405c851e5f8a8078 23808:4061d14ca9413b72 26271:4064ac0f942cf2a6 26292:4066397fa53e223a 27823:4066bc99f0103fd1 30695:4067c3965e037752 33072:40684dfa272e599c 35370:406ba51ccd5119b4 36466:406bca97d00a3b39 39323:7ff0000000000002 41292:4070b6ad96eb0b5c 43619:407336cb70f4ebd2 46487:407479271e92eab8 48084:40774c8d4c3d1b7c 48562:40788ff8fa321e99 50219:40793786d4d38de0 64916:4079f2bbf13e213c 67112:407afe4cdec64327 ; 28580:4069cb497db05357 31623:4068fec08de26eb5 34666:40684dfa272e599d 37709:406eaa7b7cb616bf 40752:406bca97d00a3b39 43795:407336cb70f4ebd2 46838:40759722acf40286 49881:4079f7f406bb947c 52924:4079c3ce796b92ed 68139:407afe4cdec64327
double_exponential_smoothing 0.9,0.9 1000 -7453 20248 1064 5 ; 9885:4054d5eeec35e5c2 10225:405b5dd3a94e06bb 12704:405f7b0dcd9c8edd 14244:40629fe8db229bce 15847:40114c8ec6c3f0ca 17077:4044b6c6b15d63b5 19465:4054ce363497c0e2 20473:4000181a57d512ed 22967:400924ffcc6d8146 25151:4044b67efc240ffa 26051:4053bbe30d8a3b08 ;
double_exponential_smoothing 0.5,0.5 1000 0 27283 1018 19 ; 20582:7ff8000000000001 20873:407547fa586f1675 23702:4043bee0192fec60 24952:c06ec574011cf258 26820:7ff8000000000001 28623:c07630a8a835b71b 30280:7ff8000000000001 33193:40642fdda0c265e9 34128:4062affb7121319f 36399:7ff0000000000002 36761:c07779dcd86a9c58 39537:c07806db63287556 62939:408069c73e8e8a6e 63740:408633817412aecd 65725:c0875c92df5e0b75 ;
File diff suppressed because it is too large Load Diff
+453
View File
@@ -0,0 +1,453 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Operators that depend on the whole set of evaluated series at each grid point: `topk`,
//! `bottomk`, `scalar`, `absent` and the instant-result sorts.
//!
//! Semantics follow Prometheus (`aggregationK`, `funcScalar`, `funcAbsent`,
//! `createLabelsForAbsentFunction`, `funcSort*`). A scalar is a grid series without labels that
//! has a value at every point, so `vector(s)` is `s` itself and has no kernel.
use std::cmp::Ordering;
use std::collections::HashMap;
use std::sync::Arc;
use datafusion::error::{DataFusionError, Result};
use datatypes::series::samples::{SampleRef, Series, SeriesSchema};
use datatypes::series::time::TimeAxis;
use datatypes::series::{Label, MetricName};
use crate::go_sort;
use crate::grid_series::{GridSeriesBuilder, external};
#[cfg(test)]
mod tests;
/// The labels that form an aggregation group.
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Grouping {
/// `by(...)`: only these labels, `__name__` included when listed.
By(Vec<Arc<str>>),
/// `without(...)`: every label except these and `__name__`.
Without(Vec<Arc<str>>),
}
/// The order `sort_instant` arranges an instant result in.
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum SortOrder {
/// `sort`: ascending values, NaN last.
Asc,
/// `sort_desc`: descending values, NaN last.
Desc,
/// `sort_by_label`: natural order of the listed label values, then the label sets.
ByLabel(Vec<Arc<str>>),
/// `sort_by_label_desc`.
ByLabelDesc(Vec<Arc<str>>),
}
/// `topk(k, ...)` (`top`) or `bottomk(k, ...)` with a constant `k`.
///
/// At every point each group keeps the `k` largest (or smallest) values, NaN ranking last for
/// both; the selected samples keep their series' labels and values. Prometheus breaks ties by
/// the order its storage returns series in, which is not a property of the series; here ties
/// go to the series whose label set sorts first.
pub fn topk(
k: f64,
top: bool,
grouping: &Grouping,
schema: &SeriesSchema,
series: &[Series],
) -> Result<Vec<Series>> {
single_field(schema, "topk/bottomk")?;
let points = grid_points(schema, series)?;
// Prometheus returns nothing for k below 1, rejects NaN and values out of int64, then
// truncates k and caps it at the number of input series.
if k < 1.0 {
return Ok(Vec::new());
}
if k.is_nan() {
return Err(DataFusionError::Execution("Parameter value is NaN".into()));
}
// Prometheus' `maxInt64`, the largest float64 below 2^63.
if k >= 9_223_372_036_854_774_784.0 {
return Err(DataFusionError::Execution(format!(
"Scalar value {k} overflows int64"
)));
}
let k = k.trunc().min(series.len() as f64) as usize;
let mut order: Vec<usize> = (0..series.len()).collect();
order.sort_by(|&a, &b| compare_labels(&series[a].metric, &series[b].metric));
let mut groups: HashMap<GroupKey, Vec<usize>> = HashMap::new();
for index in order {
groups
.entry(group_key(&series[index].metric, grouping))
.or_default()
.push(index);
}
let mut selected: Vec<Vec<usize>> = vec![Vec::new(); series.len()];
let mut candidates: Vec<(usize, f64)> = Vec::new();
for members in groups.values() {
for point in 0..points {
candidates.clear();
for &member in members {
if let Some(value) = value_at(&series[member], point)? {
candidates.push((member, value));
}
}
// Members are in label order, so a stable sort hands ties to the earlier label set.
candidates.sort_by(|a, b| rank(a.1, b.1, top));
for &(member, _) in candidates.iter().take(k) {
selected[member].push(point);
}
}
}
let output = Arc::new(schema.clone());
let mut builder = GridSeriesBuilder::try_new(output)?;
let mut result = Vec::new();
for (index, points) in selected.into_iter().enumerate() {
if points.is_empty() {
continue;
}
let mut sorted = points;
sorted.sort_unstable();
for point in sorted {
builder.push(point, &[value_at(&series[index], point)?])?;
}
if let Some(built) = builder.finish(series[index].metric.clone())? {
result.push(built);
}
}
Ok(result)
}
/// `scalar(v)`: the value of the only series present at each point, NaN otherwise.
pub fn scalar(schema: &SeriesSchema, series: &[Series]) -> Result<Series> {
single_field(schema, "scalar")?;
let points = grid_points(schema, series)?;
let mut values: Vec<Option<f64>> = vec![None; points];
let mut counts = vec![0u8; points];
for item in series {
let TimeAxis::Grid(range) = &item.time else {
unreachable!("checked by grid_points");
};
for point in range.start()..range.start() + range.len() {
if let Some(value) = value_at(item, point)? {
counts[point] = counts[point].saturating_add(1);
values[point] = Some(value);
}
}
}
let mut builder = GridSeriesBuilder::try_new(Arc::new(schema.clone()))?;
for (point, (value, count)) in values.into_iter().zip(counts).enumerate() {
let value = if count == 1 { value } else { Some(GO_NAN) };
builder.push(point, &[value])?;
}
let empty = MetricName::try_new(None, Vec::new()).map_err(external)?;
Ok(builder
.finish(empty)?
.expect("every point of a scalar has a value"))
}
/// `absent(v)`: 1 with `labels` at every point where no series is present.
///
/// `absent_over_time(v[r])` is this over the result of `present_over_time(v[r])`, with `labels`
/// from the matchers of `v`, as Prometheus derives them for both.
pub fn absent(
schema: &SeriesSchema,
series: &[Series],
labels: MetricName,
) -> Result<Option<Series>> {
let points = grid_points(schema, series)?;
let fields = schema.fields.len();
// Each field is absent on its own.
let mut present = vec![false; points * fields];
for item in series {
let TimeAxis::Grid(range) = &item.time else {
unreachable!("checked by grid_points");
};
for (field, samples) in item.fields.iter().enumerate() {
for row in 0..range.len() {
if !matches!(samples.sample(row), SampleRef::Missing) {
present[(range.start() + row) * fields + field] = true;
}
}
}
}
let mut builder = GridSeriesBuilder::try_new(Arc::new(schema.clone()))?;
let mut row = vec![None; fields];
for point in 0..points {
for (field, value) in row.iter_mut().enumerate() {
*value = (!present[point * fields + field]).then_some(1.0);
}
builder.push(point, &row)?;
}
builder.finish(labels)
}
/// A label matcher of the selector `absent` is applied to.
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct LabelMatcher {
pub name: Arc<str>,
pub op: MatchOp,
pub value: Arc<str>,
/// Whether the matcher accepts an empty value, i.e. a missing label; the caller evaluates
/// regular expressions.
pub matches_empty: bool,
}
/// The operator of a [`LabelMatcher`].
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum MatchOp {
Equal,
NotEqual,
Regex,
NotRegex,
}
/// The labels of an `absent` result, as Prometheus `createLabelsForAbsentFunction` derives them:
/// the first equality matcher of a name sets that label, any other matcher of the name removes
/// it, and `__name__` is skipped.
///
/// Prometheus reads the matchers after TSDB's `PostingsForMatchers` has reordered them in place,
/// moving the matchers that narrow the result before those that only subtract from it; that is
/// the order users see whenever the storage holds data, and the order used here. It changes the
/// result only when a name has both an equality and another matcher.
pub fn absent_labels(matchers: &[LabelMatcher]) -> Result<MetricName> {
let must_be_set: Vec<&str> = matchers
.iter()
.filter(|matcher| !matcher.matches_empty)
.map(|matcher| &*matcher.name)
.collect();
let subtracting = |matcher: &LabelMatcher| {
!must_be_set.contains(&&*matcher.name)
|| (matches!(matcher.op, MatchOp::NotEqual | MatchOp::NotRegex)
&& matcher.matches_empty)
};
let ordered = matchers
.iter()
.filter(|matcher| !subtracting(matcher))
.chain(matchers.iter().filter(|matcher| subtracting(matcher)));
let mut labels: Vec<Label> = Vec::new();
let mut set: Vec<&str> = Vec::new();
for matcher in ordered {
if &*matcher.name == "__name__" {
continue;
}
if matcher.op == MatchOp::Equal && !set.contains(&&*matcher.name) {
labels.retain(|label| label.name != matcher.name);
labels.push(Label {
name: matcher.name.clone(),
value: matcher.value.clone(),
});
set.push(&matcher.name);
} else {
labels.retain(|label| label.name != matcher.name);
}
}
labels.retain(|label| !label.value.is_empty());
MetricName::try_new(None, labels).map_err(external)
}
/// Orders the series of an instant result. A range result is returned unchanged: Prometheus
/// does not sort matrices.
pub fn sort_instant(
order: &SortOrder,
schema: &SeriesSchema,
mut series: Vec<Series>,
) -> Result<Vec<Series>> {
let points = grid_points(schema, &series)?;
if points != 1 {
return Ok(series);
}
match order {
SortOrder::Asc | SortOrder::Desc => {
single_field(schema, "sort")?;
let mut keyed = Vec::with_capacity(series.len());
for item in series {
let value = value_at(&item, 0)?;
keyed.push((value.unwrap_or(f64::NAN), item));
}
let descending = *order == SortOrder::Desc;
// `sort.Sort(sort.Reverse(h))` with Prometheus' heap `Less`, which holds whenever
// its first value is NaN.
go_sort::sort_by(&mut keyed, |(a, _), (b, _)| {
b.is_nan() || if descending { b < a } else { b > a }
});
Ok(keyed.into_iter().map(|(_, item)| item).collect())
}
SortOrder::ByLabel(labels) | SortOrder::ByLabelDesc(labels) => {
let descending = matches!(order, SortOrder::ByLabelDesc(_));
go_sort::sort_by(&mut series, |a, b| {
for label in labels {
let (a, b) = (
a.metric.get(label).unwrap_or(""),
b.metric.get(label).unwrap_or(""),
);
if a == b {
continue;
}
return natural_less(a, b) != descending;
}
let order = compare_labels(&a.metric, &b.metric);
if descending {
order == Ordering::Greater
} else {
order == Ordering::Less
}
});
Ok(series)
}
}
}
/// Go's `math.NaN()` bit pattern, which Prometheus returns for an undefined scalar.
const GO_NAN: f64 = f64::from_bits(0x7FF8_0000_0000_0001);
/// The order of `a` and `b` for `topk` (`top`) or `bottomk`; NaN ranks last for both.
fn rank(a: f64, b: f64, top: bool) -> Ordering {
match (a.is_nan(), b.is_nan()) {
(true, true) => Ordering::Equal,
(true, false) => Ordering::Greater,
(false, true) => Ordering::Less,
_ if top => b.partial_cmp(&a).expect("not NaN"),
_ => a.partial_cmp(&b).expect("not NaN"),
}
}
/// Label pairs identifying a group; empty values are absent, as in Prometheus.
type GroupKey = Vec<(Arc<str>, Arc<str>)>;
fn group_key(metric: &MetricName, grouping: &Grouping) -> GroupKey {
let mut key: Vec<_> = labels_with_name(metric)
.into_iter()
.filter(|(name, value)| {
!value.is_empty()
&& match grouping {
Grouping::By(names) => names.contains(name),
Grouping::Without(names) => &**name != "__name__" && !names.contains(name),
}
})
.collect();
key.sort();
key
}
/// The label pairs of `metric` with `__name__` among them, sorted by name.
fn labels_with_name(metric: &MetricName) -> Vec<(Arc<str>, Arc<str>)> {
let mut labels: Vec<_> = metric
.tags()
.iter()
.map(|tag| (tag.name.clone(), tag.value.clone()))
.collect();
if let Some(name) = metric.name() {
labels.push((Arc::from("__name__"), Arc::from(name)));
}
labels.sort();
labels
}
/// Prometheus `labels.Compare`: label pairs in name order, then the shorter set first.
fn compare_labels(a: &MetricName, b: &MetricName) -> Ordering {
labels_with_name(a).cmp(&labels_with_name(b))
}
/// `github.com/facette/natsort.Compare`, which `sort_by_label` uses: digit runs compare as
/// integers when both parse, other runs as strings.
fn natural_less(a: &str, b: &str) -> bool {
let (chunks_a, chunks_b) = (chunks(a), chunks(b));
for (i, chunk_a) in chunks_a.iter().enumerate() {
let Some(chunk_b) = chunks_b.get(i) else {
return false;
};
let equal = match (chunk_a.parse::<i64>(), chunk_b.parse::<i64>()) {
(Ok(a), Ok(b)) if a != b => return a < b,
(Ok(_), Ok(_)) => true,
_ => chunk_a == chunk_b,
};
if !equal {
return chunk_a < chunk_b;
}
if i == chunks_a.len() - 1 {
return true;
} else if i == chunks_b.len() - 1 {
return false;
}
}
false
}
/// Maximal runs of ASCII digits and of other characters, like the regexp `(\d+|\D+)`.
fn chunks(s: &str) -> Vec<&str> {
let mut chunks = Vec::new();
let mut start = 0;
let bytes = s.as_bytes();
for i in 1..=bytes.len() {
if i == bytes.len() || bytes[i].is_ascii_digit() != bytes[start].is_ascii_digit() {
chunks.push(&s[start..i]);
start = i;
}
}
chunks
}
fn single_field(schema: &SeriesSchema, operator: &str) -> Result<()> {
if schema.fields.len() != 1 {
return Err(DataFusionError::NotImplemented(format!(
"{operator} over series with {} fields",
schema.fields.len()
)));
}
Ok(())
}
/// Checks every series against `schema` and returns the grid length.
fn grid_points(schema: &SeriesSchema, series: &[Series]) -> Result<usize> {
let grid = schema.eval_grid.as_ref().ok_or_else(|| {
DataFusionError::Execution("select operators need an evaluation grid".into())
})?;
for item in series {
match &item.time {
TimeAxis::Grid(range)
if range.grid().spec() == grid.spec()
&& item.fields.len() == schema.fields.len() => {}
_ => {
return Err(DataFusionError::Execution(
"series does not match the select operator schema".into(),
));
}
}
}
Ok(grid.timestamps().len())
}
/// The first field's value of `series` at grid `point`.
fn value_at(series: &Series, point: usize) -> Result<Option<f64>> {
let TimeAxis::Grid(range) = &series.time else {
unreachable!("checked by grid_points");
};
if !(range.start()..range.start() + range.len()).contains(&point) {
return Ok(None);
}
match series.fields.as_slice()[0].sample(point - range.start()) {
SampleRef::Missing => Ok(None),
SampleRef::Float(value) => Ok(Some(value)),
SampleRef::Histogram(_) => Err(DataFusionError::NotImplemented(
"select operators over histogram samples".into(),
)),
}
}
File diff suppressed because it is too large Load Diff
+345
View File
@@ -0,0 +1,345 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use std::collections::BTreeMap;
use std::sync::Arc;
use datafusion::error::DataFusionError;
use datatypes::series::samples::{FieldSpec, Series, SeriesSchema};
use datatypes::series::time::{EvalGrid, GridSpec};
use datatypes::series::{Label, MetricName};
use super::{
Grouping, LabelMatcher, MatchOp, SortOrder, absent, absent_labels, natural_less, scalar,
sort_instant, topk,
};
use crate::grid_series::GridSeriesBuilder;
use crate::grid_series::reference::{Dense, assert_series_eq};
fn schema(points: u64, fields: usize) -> SeriesSchema {
SeriesSchema {
fields: (0..fields)
.map(|index| FieldSpec {
name: Arc::from(format!("f{index}")),
})
.collect::<Vec<_>>()
.into(),
eval_grid: Some(Arc::new(
EvalGrid::try_new(GridSpec::try_new(100_000, 10_000, points).unwrap()).unwrap(),
)),
}
}
/// Parses `name=value,...`, with `__name__` as the metric name; `-` is no labels.
fn metric(labels: &str) -> MetricName {
let mut name = None;
let mut tags = Vec::new();
for pair in labels.split(',').filter(|pair| *pair != "-") {
let (label, value) = pair.split_once('=').unwrap();
if label == "__name__" {
name = Some(Arc::from(value));
} else {
tags.push(Label {
name: Arc::from(label),
value: Arc::from(value),
});
}
}
MetricName::try_new(name, tags).unwrap()
}
fn dense(points: usize, values: &str) -> Dense {
let mut dense = vec![vec![None]; points];
for point in values.split_whitespace() {
let (index, bits) = point.split_once(':').unwrap();
dense[index.parse::<usize>().unwrap()][0] =
Some(f64::from_bits(u64::from_str_radix(bits, 16).unwrap()));
}
dense
}
fn build(schema: &SeriesSchema, metric: MetricName, dense: &Dense) -> Option<Series> {
let mut builder = GridSeriesBuilder::try_new(Arc::new(schema.clone())).unwrap();
for (index, row) in dense.iter().enumerate() {
builder.push(index, row).unwrap();
}
builder.finish(metric).unwrap()
}
fn names(list: &str) -> Vec<Arc<str>> {
list.split(',')
.filter(|name| *name != "-")
.map(Arc::from)
.collect()
}
/// `topk`/`bottomk`, `scalar` and `absent` evaluated by the Prometheus v3.15.0 engine; see the
/// header of `prometheus_cases.txt`.
#[test]
fn select_operators_match_prometheus() {
let text = include_str!("prometheus_cases.txt");
let mut checked = 0;
for case in text.split("end\n").filter(|case| case.contains("case ")) {
let lines: Vec<&str> = case.lines().filter(|line| !line.starts_with('#')).collect();
let spec: Vec<&str> = lines[0].split_whitespace().skip(1).collect();
let points: usize = lines[1].split_whitespace().nth(3).unwrap().parse().unwrap();
let schema = schema(points as u64, 1);
let mut inputs = Vec::new();
let mut expected: BTreeMap<String, Dense> = BTreeMap::new();
for line in &lines[2..] {
let (kind, rest) = line.split_once(' ').unwrap();
let (labels, values) = rest.split_once(" ;").unwrap();
match kind {
"series" => inputs.push((metric(labels), dense(points, values))),
"result" => {
expected.insert(labels.to_string(), dense(points, values));
}
other => panic!("unexpected line {other} in {case}"),
}
}
let series: Vec<Series> = inputs
.iter()
.filter_map(|(metric, dense)| build(&schema, metric.clone(), dense))
.collect();
let actual: Vec<Series> = match spec[0] {
"topk" => {
let grouping = match spec[3] {
"without" => Grouping::Without(names(spec[4])),
"by" => Grouping::By(names(spec[4])),
_ => Grouping::By(Vec::new()),
};
let k: f64 = spec[2].parse().unwrap();
topk(k, spec[1] == "topk", &grouping, &schema, &series).unwrap()
}
"scalar" => vec![scalar(&schema, &series).unwrap()],
"absent" => {
let matchers: Vec<LabelMatcher> = spec
.get(1)
.filter(|matchers| **matchers != "-")
.map(|matchers| {
matchers
.split(',')
.map(|matcher| {
let (name, op, value) = match matcher.split_once("!=") {
Some((name, value)) => (name, MatchOp::NotEqual, value),
None => {
let (name, value) = matcher.split_once('=').unwrap();
(name, MatchOp::Equal, value)
}
};
let value = value.trim_matches('"');
LabelMatcher {
name: Arc::from(name),
op,
value: Arc::from(value),
matches_empty: (op == MatchOp::Equal) == value.is_empty(),
}
})
.collect()
})
.unwrap_or_default();
let selected: Vec<Series> = series
.iter()
.filter(|item| {
matchers.iter().all(|matcher| {
let value = item.metric.get(&matcher.name).unwrap_or("");
(value == &*matcher.value) == (matcher.op == MatchOp::Equal)
})
})
.cloned()
.collect();
absent(&schema, &selected, absent_labels(&matchers).unwrap())
.unwrap()
.into_iter()
.collect()
}
other => panic!("unknown case {other}"),
};
let actual: BTreeMap<String, Series> = actual
.into_iter()
.map(|series| (render(&series.metric), series))
.collect();
assert_eq!(
actual.keys().collect::<Vec<_>>(),
expected.keys().collect::<Vec<_>>(),
"{case}"
);
for (labels, dense) in &expected {
assert_series_eq(actual.get(labels), dense, &metric(labels));
checked += 1;
}
}
assert!(checked > 200, "{checked} result series checked");
}
/// The fixture's label rendering: `name=value` pairs in name order, `-` when empty.
fn render(metric: &MetricName) -> String {
let mut labels: Vec<(String, String)> = metric
.tags()
.iter()
.map(|tag| (tag.name.to_string(), tag.value.to_string()))
.collect();
if let Some(name) = metric.name() {
labels.push(("__name__".to_string(), name.to_string()));
}
labels.sort();
if labels.is_empty() {
return "-".to_string();
}
labels
.iter()
.map(|(name, value)| format!("{name}={value}"))
.collect::<Vec<_>>()
.join(",")
}
fn instant(values: &[(&str, Option<f64>)]) -> (SeriesSchema, Vec<Series>) {
let schema = schema(1, 1);
let series = values
.iter()
.map(|(labels, value)| build(&schema, metric(labels), &vec![vec![*value]]).unwrap())
.collect();
(schema, series)
}
fn rendered(series: &[Series]) -> Vec<String> {
series.iter().map(|series| render(&series.metric)).collect()
}
#[test]
fn sorts_instant_results_like_prometheus() {
let (schema, series) = instant(&[
("host=a", Some(2.0)),
("host=b", Some(f64::NAN)),
("host=c", Some(-1.0)),
]);
let ascending = sort_instant(&SortOrder::Asc, &schema, series.clone()).unwrap();
assert_eq!(rendered(&ascending), ["host=c", "host=a", "host=b"]);
let descending = sort_instant(&SortOrder::Desc, &schema, series).unwrap();
assert_eq!(rendered(&descending), ["host=a", "host=c", "host=b"]);
// Go compares with `<`, so the zeros tie and keep their order, and `Less` holds for every
// NaN on its left, so NaNs come out reversed.
let (schema, series) = instant(&[("host=a", Some(0.0)), ("host=b", Some(-0.0))]);
let ascending = sort_instant(&SortOrder::Asc, &schema, series).unwrap();
assert_eq!(rendered(&ascending), ["host=a", "host=b"]);
let (schema, series) = instant(&[
("host=a", Some(f64::NAN)),
("host=b", Some(1.0)),
("host=c", Some(f64::NAN)),
("host=d", Some(0.0)),
]);
let ascending = sort_instant(&SortOrder::Asc, &schema, series.clone()).unwrap();
assert_eq!(
rendered(&ascending),
["host=d", "host=b", "host=c", "host=a"]
);
let descending = sort_instant(&SortOrder::Desc, &schema, series).unwrap();
assert_eq!(
rendered(&descending),
["host=b", "host=d", "host=c", "host=a"]
);
let (schema, series) = instant(&[
("host=x10", Some(1.0)),
("host=x9", Some(1.0)),
("host=x9,job=a", Some(1.0)),
("host=x", Some(1.0)),
]);
let by_host = sort_instant(&SortOrder::ByLabel(names("host")), &schema, series.clone());
assert_eq!(
rendered(&by_host.unwrap()),
["host=x", "host=x9", "host=x9,job=a", "host=x10"]
);
let by_host_desc = sort_instant(&SortOrder::ByLabelDesc(names("host")), &schema, series);
assert_eq!(
rendered(&by_host_desc.unwrap()),
["host=x10", "host=x9,job=a", "host=x9", "host=x"]
);
}
/// `natsort.Compare` holds both ways for "1" and "01"; sorting many such labels must not panic.
#[test]
fn sort_by_label_accepts_inconsistent_natural_order() {
// This input makes `slice::sort_by` panic with this comparator on Rust 1.98.
let hosts: Vec<String> = (0..100)
.map(|i| format!("host={}{}", "0".repeat(i / 3 % 3), i * 7 % 10))
.collect();
let values: Vec<(&str, Option<f64>)> = hosts
.iter()
.map(|host| (host.as_str(), Some(1.0)))
.collect();
let (schema, series) = instant(&values);
for order in [
SortOrder::ByLabel(names("host")),
SortOrder::ByLabelDesc(names("host")),
] {
let sorted = sort_instant(&order, &schema, series.clone()).unwrap();
assert_eq!(sorted.len(), 100);
}
}
#[test]
fn natural_order_follows_natsort() {
assert!(natural_less("a", "a1"));
assert!(!natural_less("a1", "a"));
assert!(natural_less("x9", "x10"));
assert!(!natural_less("10", "9"));
// A digit run too long for an i64 compares as a string, like Go's strconv.Atoi failing.
assert!(natural_less("20000000000000000000", "3"));
}
#[test]
fn rejects_value_operators_over_several_fields() {
let schema = schema(1, 2);
assert!(matches!(
topk(1.0, true, &Grouping::By(Vec::new()), &schema, &[]),
Err(DataFusionError::NotImplemented(_))
));
assert!(matches!(
scalar(&schema, &[]),
Err(DataFusionError::NotImplemented(_))
));
}
/// Prometheus returns nothing for `k` below 1 and rejects NaN and values out of int64.
#[test]
fn topk_validates_k_like_prometheus() {
let schema = schema(1, 1);
let series = vec![build(&schema, metric("__name__=a"), &vec![vec![Some(1.0)]]).unwrap()];
// Prometheus' `maxInt64` is 9223372036854774784, one float step below 2^63.
for k in [f64::NAN, f64::INFINITY, 9_223_372_036_854_774_784.0] {
assert!(
topk(k, true, &Grouping::By(Vec::new()), &schema, &series).is_err(),
"{k}"
);
}
for k in [0.5, f64::NEG_INFINITY] {
let result = topk(k, false, &Grouping::By(Vec::new()), &schema, &series).unwrap();
assert!(result.is_empty(), "{k}");
}
}
/// Each field of `absent` is 1 where that field has no sample.
#[test]
fn absent_evaluates_fields_independently() {
let schema = schema(2, 2);
let input = vec![vec![Some(3.0), None], vec![None, Some(4.0)]];
let series = vec![build(&schema, metric("__name__=a"), &input).unwrap()];
let result = absent(&schema, &series, metric("-")).unwrap();
let expected = vec![vec![None, Some(1.0)], vec![Some(1.0), None]];
assert_series_eq(result.as_ref(), &expected, &metric("-"));
}
+798
View File
@@ -0,0 +1,798 @@
// Copyright 2023 Greptime Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Vector–vector binary and set operations over evaluated series on one grid.
//!
//! Semantics follow Prometheus `VectorBinop`, `VectorAnd`, `VectorOr` and `VectorUnless`
//! evaluated at every grid point. Series are processed whole, over their own grid ranges, and
//! the cardinality rules are checked per point: series sharing a match group only conflict at
//! points where both are present. Each field is matched on its own, as if the operands held
//! only that field; the results of all fields with one label set form one series.
use std::collections::hash_map::Entry;
use std::collections::{HashMap, HashSet};
use std::sync::Arc;
use datafusion::arrow::array::Array;
use datafusion::error::{DataFusionError, Result};
use datatypes::series::MetricName;
use datatypes::series::histogram::{CounterResetHint, HistogramView};
use datatypes::series::samples::{DenseSamplesRef, SampleRef, Series, SeriesSchema};
use datatypes::series::time::{EvalGrid, TimeAxis};
use crate::grid_series::{GridSample, GridSeriesBuilder, METADATA_LABELS};
use crate::histogram_eval::float_histogram::FloatHistogram;
#[cfg(test)]
mod tests;
/// A PromQL binary operator between two instant vectors.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum BinaryOp {
Add,
Sub,
Mul,
Div,
Mod,
Pow,
Atan2,
Eq,
Ne,
Gt,
Lt,
Ge,
Le,
}
impl BinaryOp {
fn is_comparison(self) -> bool {
matches!(
self,
Self::Eq | Self::Ne | Self::Gt | Self::Lt | Self::Ge | Self::Le
)
}
/// The value and whether a comparison holds, as Prometheus `vectorElemBinop` computes them.
fn apply(self, lhs: f64, rhs: f64) -> (f64, bool) {
match self {
Self::Add => (lhs + rhs, true),
Self::Sub => (lhs - rhs, true),
Self::Mul => (lhs * rhs, true),
Self::Div => (lhs / rhs, true),
Self::Mod => (lhs % rhs, true),
Self::Pow => (lhs.powf(rhs), true),
Self::Atan2 => (lhs.atan2(rhs), true),
Self::Eq => (lhs, lhs == rhs),
Self::Ne => (lhs, lhs != rhs),
Self::Gt => (lhs, lhs > rhs),
Self::Lt => (lhs, lhs < rhs),
Self::Ge => (lhs, lhs >= rhs),
Self::Le => (lhs, lhs <= rhs),
}
}
}
/// The labels two series are matched by.
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum MatchingLabels {
/// `on(...)`: only these labels, `__name__` included when listed.
On(Vec<Arc<str>>),
/// `ignoring(...)`, and the default with no labels: every label except these and
/// `__name__`.
Ignoring(Vec<Arc<str>>),
}
/// How many series of each side may share a match group.
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Cardinality {
OneToOne,
/// `group_left(...)`: the right side is the "one" side; the listed labels are copied from it.
ManyToOne(Vec<Arc<str>>),
/// `group_right(...)`: the left side is the "one" side; the listed labels are copied from it.
OneToMany(Vec<Arc<str>>),
}
/// A vector–vector binary operation with its modifiers.
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct BinaryMatching {
pub op: BinaryOp,
/// `bool`: comparisons return 1 or 0 instead of filtering.
pub return_bool: bool,
pub labels: MatchingLabels,
pub cardinality: Cardinality,
}
/// A PromQL set operator between two instant vectors.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum SetOp {
And,
Or,
Unless,
}
/// The schema of `binary_vectors` output: fields paired by position, named after the left side.
pub fn binary_output_schema(lhs: &SeriesSchema, rhs: &SeriesSchema) -> Result<Arc<SeriesSchema>> {
let grid = same_grid(lhs, rhs)?;
let fields = lhs.fields.len().min(rhs.fields.len());
Ok(Arc::new(SeriesSchema {
fields: lhs.fields[..fields].to_vec().into(),
eval_grid: Some(grid),
}))
}
/// Applies `matching` to every pair of matched series at every grid point.
///
/// Fields are paired by position. Arithmetic and `bool` comparisons drop `__name__`, `__type__`
/// and `__unit__`; comparisons without `bool` keep the left value where they hold. Native
/// histograms support `+`, `-`, `==` and `!=` with each other, `*` with a float on either side
/// and `/` by a float; Prometheus skips any other pairing of a histogram.
pub fn binary_vectors(
matching: &BinaryMatching,
lhs_schema: &SeriesSchema,
lhs: &[Series],
rhs_schema: &SeriesSchema,
rhs: &[Series],
) -> Result<Vec<Series>> {
let output = binary_output_schema(lhs_schema, rhs_schema)?;
let grid = output
.eval_grid
.clone()
.expect("set by binary_output_schema");
let mut errors = Vec::new();
let mut fields = Vec::with_capacity(output.fields.len());
for field in 0..output.fields.len() {
let lhs = Operand::try_new(lhs_schema, lhs, field)?;
let rhs = Operand::try_new(rhs_schema, rhs, field)?;
fields.push(binary_field(matching, &grid, &lhs, &rhs, &mut errors)?);
}
earliest_error(errors)?;
merge_fields(fields, output)
}
/// Matches one field of each side, collecting the first failure of each kind as
/// `(point, rank, message)`.
fn binary_field(
matching: &BinaryMatching,
grid: &EvalGrid,
lhs: &Operand<'_>,
rhs: &Operand<'_>,
errors: &mut Vec<(usize, u8, String)>,
) -> Result<Results> {
let (many, one, include, one_is_left) = match &matching.cardinality {
Cardinality::OneToOne => (lhs, rhs, &[][..], false),
Cardinality::ManyToOne(include) => (lhs, rhs, &include[..], false),
Cardinality::OneToMany(include) => (rhs, lhs, &include[..], true),
};
let points = grid.timestamps().len();
// Prometheus short-circuits a point where either side is empty, before any check.
let both_present: Vec<bool> = lhs
.presence(points)
.into_iter()
.zip(rhs.presence(points))
.map(|(lhs, rhs)| lhs && rhs)
.collect();
let one_groups = group(one, &matching.labels);
let mut one_duplicate: Option<(usize, &GroupKey)> = None;
for (key, members) in &one_groups {
if let Some(point) = overlap(one, members, |point| both_present[point])
&& one_duplicate.is_none_or(|(first, _)| point < first)
{
one_duplicate = Some((point, key));
}
}
let drop_name = !matching.op.is_comparison() || matching.return_bool;
let mut results = Results::default();
let group_keys: Vec<&GroupKey> = one_groups.keys().collect();
let group_ids: HashMap<&GroupKey, usize> = group_keys
.iter()
.enumerate()
.map(|(id, key)| (*key, id))
.collect();
// One-to-one: a match group may be matched once per point; Prometheus counts a filtered
// comparison as a match too, but not an operation that failed.
let mut matched: HashSet<(usize, usize)> = HashSet::new();
let mut implicit_many_to_one: Option<(usize, &GroupKey)> = None;
for (many_index, many_series) in many.series.iter().enumerate() {
let key = group_key(&many_series.metric, &matching.labels);
let Some(candidates) = one_groups.get(&key) else {
continue;
};
let group_id = group_ids[&key];
for &one_index in candidates {
let metric = result_metric(
&many_series.metric,
&one.series[one_index].metric,
matching,
include,
drop_name,
)?;
let (start, end) = one.overlap_range(many, one_index, many_index);
for point in start..end {
if !(many.present(many_index, point) && one.present(one_index, point)) {
continue;
}
let (many_value, one_value) =
(many.value(many_index, point), one.value(one_index, point));
let (lhs_value, rhs_value) = if one_is_left {
(one_value, many_value)
} else {
(many_value, one_value)
};
let Some((result, keep)) = elem_binop(matching.op, lhs_value, rhs_value)? else {
continue;
};
if matching.cardinality == Cardinality::OneToOne
&& !matched.insert((group_id, point))
&& implicit_many_to_one.is_none_or(|(first, _)| point < first)
{
implicit_many_to_one = Some((point, group_keys[group_id]));
}
let value = if matching.return_bool {
Some(GridSample::Float(if keep { 1.0 } else { 0.0 }))
} else {
keep.then_some(result)
};
results.insert(&metric, group_id, point, value);
}
}
}
// Prometheus fails at the first failing step. Within a step it checks the one side, then
// matches, and only after the operator checks that result label sets are unique.
if let Some((point, key)) = one_duplicate {
let side = if one_is_left { "left" } else { "right" };
errors.push((
point,
0,
format!(
"found duplicate series for the match group {} on the {side} hand-side of the \
operation at {} ms; many-to-many matching not allowed: matching labels must be \
unique on one side",
render(key),
grid.timestamps()[point]
),
));
}
if let Some((point, key)) = implicit_many_to_one {
errors.push((
point,
1,
format!(
"multiple matches for labels {} at {} ms: many-to-one matching must be explicit \
(group_left/group_right)",
render(key),
grid.timestamps()[point]
),
));
}
if let Some(duplicate) = results.sort_rows() {
let grouping = duplicate.within_group && matching.cardinality != Cardinality::OneToOne;
errors.push(if grouping {
(
duplicate.point,
1,
format!(
"multiple matches for labels {} at {} ms: grouping labels must ensure \
unique matches",
render(&duplicate.key),
grid.timestamps()[duplicate.point]
),
)
} else {
(
duplicate.point,
2,
same_labelset(&duplicate.key, grid.timestamps()[duplicate.point]),
)
});
}
Ok(results)
}
fn earliest_error(errors: Vec<(usize, u8, String)>) -> Result<()> {
match errors
.into_iter()
.min_by_key(|(point, rank, _)| (*point, *rank))
{
Some((_, _, error)) => Err(DataFusionError::Execution(error)),
None => Ok(()),
}
}
/// Applies a set operator at every grid point. Series keep their labels and values; fields are
/// paired by position.
pub fn set_vectors(
op: SetOp,
labels: &MatchingLabels,
lhs_schema: &SeriesSchema,
lhs: &[Series],
rhs_schema: &SeriesSchema,
rhs: &[Series],
) -> Result<Vec<Series>> {
let grid = same_grid(lhs_schema, rhs_schema)?;
if lhs_schema.fields.len() != rhs_schema.fields.len() {
return Err(DataFusionError::NotImplemented(
"set operators between vectors with different field counts".into(),
));
}
let output = Arc::new(SeriesSchema {
fields: lhs_schema.fields.clone(),
eval_grid: Some(grid.clone()),
});
let mut errors = Vec::new();
let mut fields = Vec::with_capacity(output.fields.len());
for field in 0..output.fields.len() {
let lhs = Operand::try_new(lhs_schema, lhs, field)?;
let rhs = Operand::try_new(rhs_schema, rhs, field)?;
let mut results = set_field(op, labels, &lhs, &rhs)?;
if let Some(duplicate) = results.sort_rows() {
let timestamp = grid.timestamps()[duplicate.point];
errors.push((duplicate.point, 0, same_labelset(&duplicate.key, timestamp)));
}
fields.push(results);
}
earliest_error(errors)?;
merge_fields(fields, output)
}
fn set_field(
op: SetOp,
labels: &MatchingLabels,
lhs: &Operand<'_>,
rhs: &Operand<'_>,
) -> Result<Results> {
let (kept, filter, keep_matched) = match op {
SetOp::And => (lhs, rhs, true),
SetOp::Unless => (lhs, rhs, false),
SetOp::Or => (rhs, lhs, false),
};
let filter_groups = group(filter, labels);
let mut results = Results::default();
if op == SetOp::Or {
for index in 0..lhs.series.len() {
for point in lhs.range(index) {
if let Some(value) = owned(lhs.value(index, point))? {
results.insert(&lhs.series[index].metric, 0, point, Some(value));
}
}
}
}
for (index, series) in kept.series.iter().enumerate() {
let candidates = filter_groups.get(&group_key(&series.metric, labels));
for point in kept.range(index) {
if !kept.present(index, point) {
continue;
}
let mut matched = false;
for &candidate in candidates.into_iter().flatten() {
if filter.covers(candidate, point) && filter.present(candidate, point) {
matched = true;
break;
}
}
if matched == keep_matched {
results.insert(&series.metric, 0, point, owned(kept.value(index, point))?);
}
}
}
Ok(results)
}
/// Joins the per-field results into series with all fields, by label set.
fn merge_fields(fields: Vec<Results>, schema: Arc<SeriesSchema>) -> Result<Vec<Series>> {
let width = schema.fields.len();
// Per label set: the metric and its `(point, field, value)` samples.
type Merged = (MetricName, Vec<(usize, usize, GridSample)>);
let mut merged: HashMap<GroupKey, Merged> = HashMap::new();
for (field, results) in fields.into_iter().enumerate() {
for (key, rows) in results.series {
let (_, samples) = merged
.entry(key)
.or_insert_with(|| (rows.metric.clone(), Vec::new()));
for (&point, value) in rows.points.iter().zip(rows.values) {
if let Some(value) = value {
samples.push((point, field, value));
}
}
}
}
let mut builder = GridSeriesBuilder::try_new(schema)?;
let mut row: Vec<Option<GridSample>> = Vec::with_capacity(width);
let mut output = Vec::with_capacity(merged.len());
for (metric, mut samples) in merged.into_values() {
samples.sort_unstable_by_key(|(point, field, _)| (*point, *field));
let mut samples = samples.into_iter().peekable();
while let Some((point, field, value)) = samples.next() {
row.clear();
row.resize_with(width, || None);
row[field] = Some(value);
while let Some((_, field, value)) = samples.next_if(|next| next.0 == point) {
row[field] = Some(value);
}
builder.push_samples(point, &row)?;
}
if let Some(series) = builder.finish(metric)? {
output.push(series);
}
}
Ok(output)
}
fn same_grid(lhs: &SeriesSchema, rhs: &SeriesSchema) -> Result<Arc<EvalGrid>> {
match (&lhs.eval_grid, &rhs.eval_grid) {
(Some(lhs), Some(rhs)) if lhs.spec() == rhs.spec() => Ok(lhs.clone()),
_ => Err(DataFusionError::Execution(
"vector operands must be evaluated on the same grid".into(),
)),
}
}
/// Label pairs identifying a match group or a result; empty values are absent, as in
/// Prometheus.
type GroupKey = Vec<(Arc<str>, Arc<str>)>;
fn group_key(metric: &MetricName, labels: &MatchingLabels) -> GroupKey {
let mut key: GroupKey = match labels {
MatchingLabels::On(names) => names
.iter()
.filter_map(|name| {
let value = metric.get(name)?;
(!value.is_empty()).then(|| (name.clone(), Arc::from(value)))
})
.collect(),
MatchingLabels::Ignoring(names) => metric
.tags()
.iter()
.filter(|tag| !tag.value.is_empty() && !names.contains(&tag.name))
.map(|tag| (tag.name.clone(), tag.value.clone()))
.collect(),
};
key.sort();
key.dedup();
key
}
fn key_of(metric: &MetricName) -> GroupKey {
let mut key = group_key(metric, &MatchingLabels::Ignoring(Vec::new()));
if let Some(name) = metric.name() {
key.insert(0, (Arc::from("__name__"), Arc::from(name)));
}
key
}
fn render(key: &GroupKey) -> String {
let labels: Vec<_> = key
.iter()
.map(|(name, value)| format!("{name}=\"{value}\""))
.collect();
format!("{{{}}}", labels.join(", "))
}
/// Groups the series of `operand` by their match group.
fn group(operand: &Operand<'_>, labels: &MatchingLabels) -> HashMap<GroupKey, Vec<usize>> {
let mut groups: HashMap<GroupKey, Vec<usize>> = HashMap::new();
for (index, series) in operand.series.iter().enumerate() {
groups
.entry(group_key(&series.metric, labels))
.or_default()
.push(index);
}
groups
}
/// The first point where two `members` are present and `relevant` holds.
fn overlap(
operand: &Operand<'_>,
members: &[usize],
relevant: impl Fn(usize) -> bool,
) -> Option<usize> {
if members.len() < 2 {
return None;
}
// Sorting the present points keeps the cost proportional to them, not to the span.
let mut points = Vec::new();
for &member in members {
for point in operand.range(member) {
if operand.present(member, point) {
points.push(point);
}
}
}
points.sort_unstable();
for pair in points.windows(2) {
if pair[0] == pair[1] && relevant(pair[0]) {
return Some(pair[0]);
}
}
None
}
fn result_metric(
many: &MetricName,
one: &MetricName,
matching: &BinaryMatching,
include: &[Arc<str>],
drop_name: bool,
) -> Result<MetricName> {
let mut metric = many.clone();
if drop_name {
metric.remove_all(&METADATA_LABELS);
}
if matching.cardinality == Cardinality::OneToOne {
match &matching.labels {
MatchingLabels::On(names) => {
metric.keep_only(&names.iter().map(|name| &**name).collect::<Vec<_>>())
}
MatchingLabels::Ignoring(names) => {
metric.remove_all(&names.iter().map(|name| &**name).collect::<Vec<_>>())
}
}
}
for name in include {
match one.get(name) {
Some(value) if !value.is_empty() => metric
.set(name, Arc::from(value))
.map_err(|error| DataFusionError::External(Box::new(error)))?,
_ => metric.remove(name),
}
}
Ok(metric)
}
/// One field of one side's series, with checked grid ranges.
struct Operand<'a> {
series: &'a [Series],
starts: Vec<usize>,
field: usize,
}
impl<'a> Operand<'a> {
fn try_new(schema: &SeriesSchema, series: &'a [Series], field: usize) -> Result<Self> {
let grid = schema.eval_grid.as_ref().map(|grid| grid.spec());
let mut starts = Vec::with_capacity(series.len());
for item in series {
let TimeAxis::Grid(range) = &item.time else {
return Err(DataFusionError::Execution(
"vector operand series must be on the evaluation grid".into(),
));
};
if Some(range.grid().spec()) != grid
|| item.fields.len() != schema.fields.len()
|| item.fields.iter().any(|field| field.len() != range.len())
{
return Err(DataFusionError::Execution(
"vector operand series does not match its schema".into(),
));
}
starts.push(range.start());
}
Ok(Self {
series,
starts,
field,
})
}
fn start(&self, index: usize) -> usize {
self.starts[index]
}
fn end(&self, index: usize) -> usize {
self.starts[index] + self.series[index].time.len()
}
fn range(&self, index: usize) -> std::ops::Range<usize> {
self.start(index)..self.end(index)
}
fn covers(&self, index: usize, point: usize) -> bool {
self.range(index).contains(&point)
}
/// The shared points of `self[own]` and `other[theirs]`.
fn overlap_range(&self, other: &Operand<'_>, own: usize, theirs: usize) -> (usize, usize) {
let start = self.start(own).max(other.start(theirs));
let end = self.end(own).min(other.end(theirs));
(start, end.max(start))
}
fn value(&self, index: usize, point: usize) -> SampleRef<'a> {
let samples = &self.series[index].fields.as_slice()[self.field];
let row = point - self.starts[index];
if let Some(DenseSamplesRef::Float(values)) = samples.dense() {
return match values.is_valid(row) {
true => SampleRef::Float(values.value(row)),
false => SampleRef::Missing,
};
}
samples.sample(row)
}
fn present(&self, index: usize, point: usize) -> bool {
!matches!(self.value(index, point), SampleRef::Missing)
}
/// Whether any series is present at each grid point.
fn presence(&self, points: usize) -> Vec<bool> {
let mut presence = vec![false; points];
for index in 0..self.series.len() {
for point in self.range(index) {
if !presence[point] && self.present(index, point) {
presence[point] = true;
}
}
}
presence
}
}
/// `sample` as an owned value; `None` when missing.
fn owned(sample: SampleRef<'_>) -> Result<Option<GridSample>> {
Ok(match sample {
SampleRef::Missing => None,
SampleRef::Float(value) => Some(GridSample::Float(value)),
SampleRef::Histogram(view) => {
Some(GridSample::Histogram(FloatHistogram::try_from_view(&view)?))
}
})
}
/// Prometheus `vectorElemBinop` over present samples: the value and whether to keep it, or
/// `None` when Prometheus reports the pair as an annotation and skips it without counting the
/// match: an operator the sample types do not support, or histograms mixing exponential and
/// custom buckets in an addition or subtraction.
fn elem_binop(
op: BinaryOp,
lhs: SampleRef<'_>,
rhs: SampleRef<'_>,
) -> Result<Option<(GridSample, bool)>> {
let histogram = |view: &HistogramView<'_>| FloatHistogram::try_from_view(view);
let mut result = match (lhs, rhs) {
(SampleRef::Float(lhs), SampleRef::Float(rhs)) => {
let (value, keep) = op.apply(lhs, rhs);
return Ok(Some((GridSample::Float(value), keep)));
}
(SampleRef::Float(factor), SampleRef::Histogram(h))
| (SampleRef::Histogram(h), SampleRef::Float(factor))
if op == BinaryOp::Mul =>
{
let mut h = histogram(&h)?;
h.mul(factor);
h
}
(SampleRef::Histogram(h), SampleRef::Float(divisor)) if op == BinaryOp::Div => {
let mut h = histogram(&h)?;
h.div(divisor);
h
}
(SampleRef::Histogram(lhs), SampleRef::Histogram(rhs)) => {
let (mut lhs, rhs) = (histogram(&lhs)?, histogram(&rhs)?);
match op {
BinaryOp::Eq | BinaryOp::Ne => {
let keep = lhs.equals(&rhs) == (op == BinaryOp::Eq);
return Ok(Some((GridSample::Histogram(lhs), keep)));
}
BinaryOp::Add | BinaryOp::Sub => {
if lhs.uses_custom_buckets() != rhs.uses_custom_buckets() {
return Ok(None);
}
if op == BinaryOp::Add {
lhs.add(&rhs)?;
} else {
lhs.sub(&rhs)?;
lhs.reset_hint = CounterResetHint::Gauge;
}
lhs
}
_ => return Ok(None),
}
}
_ => return Ok(None),
};
result.compact();
Ok(Some((GridSample::Histogram(result), true)))
}
/// The result rows of one field by result label set.
#[derive(Default)]
struct Results {
series: HashMap<GroupKey, ResultRows>,
}
/// Rows in arrival order: their points, the match group each came from, and their values;
/// `None` is a match the operator filtered.
struct ResultRows {
metric: MetricName,
points: Vec<usize>,
groups: Vec<usize>,
values: Vec<Option<GridSample>>,
}
/// Two rows of one result label set at one point.
struct Duplicate {
point: usize,
key: GroupKey,
/// Whether two of the rows came from the same match group.
within_group: bool,
}
fn same_labelset(key: &GroupKey, timestamp: i64) -> String {
format!(
"vector cannot contain metrics with the same labelset {} at {timestamp} ms",
render(key)
)
}
impl Results {
fn insert(
&mut self,
metric: &MetricName,
group: usize,
point: usize,
value: Option<GridSample>,
) {
let rows = match self.series.entry(key_of(metric)) {
Entry::Occupied(entry) => entry.into_mut(),
Entry::Vacant(entry) => entry.insert(ResultRows {
metric: metric.clone(),
points: Vec::new(),
groups: Vec::new(),
values: Vec::new(),
}),
};
rows.points.push(point);
rows.groups.push(group);
rows.values.push(value);
}
/// Sorts the rows of each label set by point and returns the earliest point where a label
/// set has two rows, preferring one within a match group at that point. Prometheus
/// evaluates step by step and fails at the first such step.
fn sort_rows(&mut self) -> Option<Duplicate> {
let mut first: Option<(usize, bool, &GroupKey)> = None;
for (key, rows) in &mut self.series {
if !rows.points.is_sorted() {
let mut order: Vec<usize> = (0..rows.points.len()).collect();
order.sort_by_key(|&row| rows.points[row]);
rows.points = order.iter().map(|&row| rows.points[row]).collect();
rows.groups = order.iter().map(|&row| rows.groups[row]).collect();
let mut values = std::mem::take(&mut rows.values);
rows.values = order.iter().map(|&row| values[row].take()).collect();
}
let mut start = 0;
while start < rows.points.len() {
let point = rows.points[start];
let end = start + rows.points[start..].partition_point(|&p| p == point);
if end - start > 1 {
let mut groups = rows.groups[start..end].to_vec();
groups.sort_unstable();
let within_group = groups.windows(2).any(|pair| pair[0] == pair[1]);
if first.is_none_or(|(first_point, first_within, _)| {
(point, !within_group) < (first_point, !first_within)
}) {
first = Some((point, within_group, key));
}
break;
}
start = end;
}
}
first.map(|(point, within_group, key)| Duplicate {
point,
key: key.clone(),
within_group,
})
}
}
@@ -0,0 +1,454 @@
# Generated by promql-compat cmd/narthex-golden-gomath built for amd64. Each line is
# `<function> <arg1> <arg2> <result>` as hex bit patterns.
pow 400a0dac65acfea0 c024000000000000 3edf412c74aab896
pow 3ff3962ba0e9e8fc 4037800000000000 405cfbee2fe16b2d
pow 3fee07edb7998f98 c020000000000000 3ffa97c4b7fd884f
pow 3ff872e086629504 4040400000000000 412d71775ec38f39
pow 3ffe06094ec738a6 c043800000000000 3db808f121bf08d5
pow 3fedea6a3becf4a3 4025c00000000000 3fdec42a28225290
pow 3ff0a4133102ce42 c020000000000000 3fe75f2c6826ef5e
pow 4008f744d8a1ba1c c024800000000000 3ee2025a66ba9c56
pow 400aa970054f9908 403a000000000000 42c1ce86782821f4
pow 400740b53391107f 403fa00000000000 42f9a8627247c370
pow 40052dbb11735ab8 c022000000000000 3f2485da7e2f0ec2
pow 40091b2f0a5ea9b8 402bc00000000000 415db83e4daf6ce6
pow 400a9de4cdda680d 402a000000000000 415759ec4dcf58c0
pow 400a323ce898cda2 4033600000000000 4201d46200cc449e
pow 3ffe0ddcf2088230 4028000000000000 409e2574372f0ee0
pow 400ac5b6667ccc28 4040000000000000 436b32bc8bfcd6fa
pow 4006cc1dc34c95b5 c038000000000000 3daabda470d44b72
pow 40018642c4d5865e 4027400000000000 40c1c5026893ba55
pow 3fe93a1232bea904 c02a000000000000 4036040539a49c7b
pow 4003d168e043ce30 c041300000000000 3d2022655b0ce5d5
pow 40005dab668206aa 4041000000000000 422141c714a2c498
pow 3ff1034c42c7be83 4032a00000000000 4009186a85b377ca
pow 4008830dca8284bc 4043000000000000 43c4e740a9d36c1b
pow 4008fa2f53b2a50f c043900000000000 3beaa36ff8d454b6
pow 400a031c285b6109 4018000000000000 409276e92a9f96db
pow 40051e781166e7ac 4031a00000000000 4179b165242f7e66
pow 3ffa0e1b0d1aaa32 c030000000000000 3f3acc7f782b2c8d
pow 3fec4688f56a49e1 4032000000000000 3fbb99fe029fc71c
pow 3feb9522844f04fa c032000000000000 402cfe75c4b7af0f
pow 4001edcd260a7944 c043700000000000 3d1abe45a4dd0281
pow 40094052c552fae5 c008000000000000 3fa04807083568a8
pow 3ffb4a388389d810 c03ec00000000000 3e73e1c2c3c0aa08
pow 400a03d2c59e4001 4010000000000000 405bf4ab8bbe298e
pow 3ffa65dbe9f87dde c031a00000000000 3f234619fe0babaf
pow 3ff33fdec32015d3 c030000000000000 3faa93524239c2bd
pow 400b3278b0c42c70 4043300000000000 442ad86c19a814ee
pow 400af692ebe23188 c035000000000000 3da23c61d9123404
pow 3ffc80df6b5eab02 4039600000000000 41419e28eeca60c1
pow 3ff023341775792c c039000000000000 3fe9d626251c9b33
pow 3ff4f47cf42b887a c00f000000000000 3fd67f9aa2e45526
pow 400b7163690533db 4043000000000000 4427e16d6a327666
pow 400a9be2805f683e 403aa00000000000 42d1eb5980c9dda9
pow 40082a71a1ec0101 c032000000000000 3e239685b8412e38
pow 3ff0b1bc8a7f4aaa c03d200000000000 3fd292c0ce1692fb
pow 3ff74997d6e98667 c018000000000000 3fbaede905fd1ca5
pow 3fe5efaefb6f268e c03e600000000000 40f7600b6eb0cffe
pow 400a466410e309b6 c041000000000000 3c4970a21f303ad5
pow 3fe6619daa2edd28 c03ee00000000000 40ee5efbd4a46a8a
pow 4009d4e6232cfacf c024000000000000 3ee105a1b43b99df
pow 400b43bf4b180210 c043200000000000 3bb436e66d8c1f53
pow 3ff1436e67b59066 c038000000000000 3fc4a80c864f4aaf
pow 400b37e4d90a9ee0 c033a00000000000 3dc424f2188ec353
pow 3ff33e3fd038d1b7 c014000000000000 3fd96ed9df7e8634
pow 40017d164a53c672 c040300000000000 3da628c91608e682
pow 4004cdc9586fa228 4038000000000000 420109c160fe0fa1
pow 3fffa69e29ef15f8 4027c00000000000 40a9c27f5ae74fbe
pow 400670c786c18b6e 4008000000000000 403612485f374cc6
pow 3ff602f6e8aba185 c031000000000000 3f7215df07de25c0
pow 400826b3c738dbd1 4010000000000000 4054c3dc09484969
pow 400a11647a52df78 c040a00000000000 3c642f4d74c6ae78
pow 3ff7c2f1cd59315a 4041000000000000 4125185cdd0683a7
pow 3ffa842a9a3d69bc 4035800000000000 40e9720694d2aeb6
pow 3ff2767463e21fa4 403a000000000000 4044ade19a65f006
pow 40059f4adf920266 403d200000000000 428b707c056f6d1e
pow 3ff57e924346da27 c036000000000000 3f58c4a653983a7c
pow 400947c61651aa57 c03e000000000000 3cd266684354f2f7
pow 3ffb9ee6867ccf03 402c000000000000 40a04ecfc38d9f72
pow 3ffb89c0a7c6201c c03d400000000000 3e80fe085a3b53a3
pow 3ffaa43eb37e95ce c038000000000000 3ed45406364285b6
pow 4005d50543d8f57a 402ec00000000000 4153470400d6e430
pow 3ffaad952d7ccf05 0 3ff0000000000000
pow 3ff872d7ad8bb704 c03c400000000000 3eda5b063244d842
pow 40067d92f102c7a8 4041800000000000 43324c32e1668a87
pow 3ff9bc073c39fed2 c036800000000000 3ef7ce8a7d41a059
pow 3ffa8be91d646baa 403e000000000000 414e23737a41b550
pow 4004e12365efb251 c003000000000000 3fba3a12bf8ec2a9
pow 4001fbd3e7f28da6 c018000000000000 3f7fbdc877eb3e18
pow 40005cd82003fb14 c014000000000000 3f9c9b7fbdd08d8b
pow 3ff34df2c5d02b9c 4033000000000000 4041b58868bcb361
pow 3ff454dcba9c6b0d 403ae00000000000 40838d1f2f388870
pow 400844d2c3d9aee9 0 3ff0000000000000
pow 4006b33a52c249e8 4023800000000000 40d9758f48bd455b
pow 400a9d84e03b3a0b c03f000000000000 3c92e64c0e4c442e
pow 4001507f62541347 403d000000000000 41f3be08e0db74d7
pow 3ff1a9e38f39654c c031000000000000 3fc7d135088d1f9a
pow 40048acdac362326 c042200000000000 3cd9a7c98cb58685
pow 400064f6b1da9d80 4032000000000000 4118cd22ce7386e1
pow 40055244f8d97b73 c039800000000000 3daea2fe6422f4f7
pow 4002e0ea900135a2 4043800000000000 42f3d066935f284a
pow 4008901b4bdcde83 c043900000000000 3bf9a10bbab0f621
pow 40099a8037355e28 4035000000000000 4222f1ae68025437
pow 400478dfdc46f346 4038600000000000 42007a9b60fb1eb0
pow 3fe673c2961e58a8 c03d000000000000 40dc59841956fe50
pow 3fef51381ebd1320 4016000000000000 3fec6bb81b6c4ae7
pow 40089c4a06df8cd9 4041000000000000 436165fac9ec336e
pow 4008539f7d4895b8 4040400000000000 4331b184785e78da
pow 4007c6e14039a8dc 402c000000000000 415002548e3c23f5
pow 40002cb1aa56ac5f 402e800000000000 40e673b17eb9b278
pow 3ff8f84c82ceb39d 4042000000000000 416157d4f171c66a
pow 3feb84557e93861e c020000000000000 400ac29f3ae54aa4
pow 4002b1fd7979413e bff0000000000000 3fdb62f840bb08bf
pow 3ff99c83142f5be4 4042300000000000 4179c7abdb0d668a
pow 3fed092347b0299e c035000000000000 401ece4aededacef
pow 40081cac5790c4aa 4003000000000000 402b7a88e3334d84
pow 3ffc221c5c035e9e 4024000000000000 4071a7cad1f4cc3b
pow 4004a4b3c0eef500 4039a00000000000 42208186b5676e6a
pow 4005782267e89c42 c043000000000000 3c8d73f4c8e5c900
pow 3ff6cbaa289dcae2 c03ca00000000000 3f04d8c2b263c059
pow 3ff59c8b18109db8 4000000000000000 3ffd30e8bc3a144b
pow 400245f7a06308bb c021400000000000 3f4a63a80b376eb9
pow 3ffcabf0d380a14f 4041800000000000 41c5ec2cee3d9643
pow 3fe4a4964d869b2a 4030200000000000 3f4be62c92e8a2f9
pow 3fed24a088792d66 403e000000000000 3faef651ddf146ea
pow 3fe4213f9df7ea4f c007000000000000 400e5421d42c16c5
pow 3ffb841cbccd390b c01c000000000000 3f97042cf27a90de
pow 40002a7c1c739796 403fe00000000000 41f462de69d2ec31
pow 3fe6fc45ec9a061a 3ff0000000000000 3fe6fc45ec9a061a
pow 3fedd1d07e6b6f09 3ff6000000000000 3fed0a718d6612fc
pow 3ff984fb9600656b 403f000000000000 413d6e92206a7e8e
pow 40065f4a6f5a6f3a c02fc00000000000 3e75d0afaff8cd3e
pow 400949c51c9dadfa c02c000000000000 3e7afe4f2dd337c8
pow 400760224b3d4d92 402a400000000000 4133beb6b7f15322
pow 4000e2d6970eac73 c008000000000000 3fbb38e0a679e808
pow 400593d157f00c20 c03a200000000000 3d984ee363367c98
pow 3fea194ddab31010 4010000000000000 3fdc51737ccc4249
pow 40057ec4150329aa 4038c00000000000 4223970aa919e088
pow 4003ffcdcb048516 c008000000000000 3fb062c938da7d3a
pow 40055afd8e66f3c6 c036000000000000 3dfc915744913a49
pow 40000f416c40b6cc 403c000000000000 41b1c157d21a376b
pow 3feb3f8cceea5613 c02e800000000000 4027357c8c908266
pow 400504c171de92c1 4022000000000000 40b74d21167eb850
pow 4005a9c5e90aabf8 c036a00000000000 3de660966b896ab3
pow 3ff7282e4376aa68 c02e000000000000 3f6ffc8fbbb346c9
pow 4005aeaabcc95aea 4020000000000000 40a6bf10f4f3a3be
pow 3ff3480fbda3d6b0 c026000000000000 3fc0716dd4fe4c4d
pow 4007722781ef6c14 c032400000000000 3e29cd598df6c052
pow 40036e15f1460e3b 402e000000000000 41226ba143b4da43
pow 3fea44bb4d761754 c018000000000000 400a24fc340c1e57
pow 3fe80b04327a31b0 4014000000000000 3fcea5f6ac8f4fc6
pow 3ff1b4eb6d215d24 c03e800000000000 3fa7440e41774eba
pow 400b8819101382ed c022000000000000 3eeef884f70cc6d5
pow 4001c53f7496c68a c040900000000000 3d8d07a6163f51e4
pow 400bb56bd7e36672 c044000000000000 3b73d39a53245936
pow 40006bc2b5f00e59 c004000000000000 3fc534801f13a453
pow 3ff7c76da0d55824 401c000000000000 403003bfd81af49c
pow 400b9498e038e6a1 c040400000000000 3c4f50e6ad1c03f2
pow 400a06688abfcda9 c03d000000000000 3cd90de631243e3d
pow 3fe00530dc2f4115 4037600000000000 3e796ab2edb08199
pow 3ff3ec2b03c9a768 c043800000000000 3f29563d4a360f9f
pow 3febe0c5626f73ec c041500000000000 405d9e6d2b51f3b5
pow 3ff7ae8833c568ab c020000000000000 3fa63a96800c093e
pow 3ffd41803bcd9df8 c026400000000000 3f53e3daf840b56c
pow 40065867f08376b5 4031000000000000 4182481fd6ca7f75
pow 4004571abce3dd01 4039c00000000000 42196485bf645b57
pow 3fe00cbfdb75b952 c043000000000000 424c6f7d739f4de8
pow 3fede770c2867aa3 4030e00000000000 3fd4677fa8f960d4
pow 3ffb3212f02f51ef c03e000000000000 3e8075f2f29513f2
pow 40086584be9e233f c041000000000000 3c83ccba85851f21
pow 40017713b0dba75a c02e000000000000 3ee131de45e8fe84
pow 40053ef7598d0b37 402fc00000000000 4154ac7b0ac16128
pow 4001b6780a0ecbea c043000000000000 3d357a1cffa47d8d
pow 400bd56d9b42bb44 c009000000000000 3f94ce2142fb7ddc
pow 3fe78ef4e513096c 4043800000000000 3edb425ef5bb563a
pow 3ff8923c2a92f5f7 c03aa00000000000 3ee6f8f502bb8ec0
pow 3ff2e2b320144644 403f000000000000 4065573065ca2250
pow 4006bf7ec762ca3a 4031000000000000 4188c48280968464
pow 4009878766b690df c01c000000000000 3f33721bd7d2a370
pow 4005973e6b851b67 4042300000000000 43312aa6829d3137
pow 400220bdac22149c c042800000000000 3d342e08190e93bc
pow 40091a4269062114 403fe00000000000 4338055288d28675
pow 3ff2f6f1e976a626 c03a000000000000 3f88a78e6edc5884
pow 40099969f9ad0d40 c00f000000000000 3f86971c66a7723a
pow 3ff0bd72f6f38460 4037000000000000 4006a1d8969ea7c2
pow 3fffa67d1383fe88 4012000000000000 403589312bfb1f1e
pow 3ffda9cd35f357ba 4000000000000000 400b7f48f676e4e9
pow 4007699a5442e508 c025000000000000 3eea996e20b22550
pow 4001c91781a91090 4033000000000000 414ddb54f0a72440
pow 3ff77d5b8d0271fd 403d200000000000 40f18e7c9c60b8b1
pow 400063e89911353e 403f000000000000 41f0e2eddd3ecd75
pow 3fe04f91ba0cf3b9 c023000000000000 4082d8fa881010f1
pow 400642e33dddd08e c032000000000000 3e4575fb6ba59d2d
pow 4001b601a478d99c 402c800000000000 40f43ba0b87fbbb6
pow 3ff1e908e243a36a 4037000000000000 402ac4db078d1c11
pow 400b7bd048667f33 c043500000000000 3ba2bdb39e2b3c20
pow 4005c4f4e458d43b c010000000000000 3f92acfb52eaf7dc
pow 4006e7e354fb8bcb c040500000000000 3cd66c65e94dc142
pow 40054c6e4e4b0229 403e000000000000 4294d433d3186bae
pow 3ffba9c5279f0a49 4040400000000000 41897c1b7794bfda
pow 3ffc8ee539ffc3be c03b000000000000 3e8597efa80899bd
pow 3ff1995020e8f41b 4041000000000000 40397e0dd4bcaa55
pow 3fe6ba78037897e2 4040800000000000 3eea357c15ee2e99
pow 3fec41baeac596e8 c00e000000000000 3ff982c21436bfcf
pow 3ff9bccd14ff5a9a c035000000000000 3f08389c409ffec4
pow 400286753dd0bf24 c035e00000000000 3e46a16f781bc185
pow 3fe0f0fc9ebe1fe7 c038000000000000 41503abe832fecd1
pow 40077b2870d1ace4 4027c00000000000 4115cf7a3cec11e6
pow 400785b84a14a584 c040800000000000 3cb92a235a021939
pow 4002b66ca829a748 4036a00000000000 41aaaa15103b1984
pow 3ff5555447b3ebd3 c034000000000000 3f69fa9d1900d6bc
pow 3fe15b21ca3cbd70 c027c00000000000 409656286c07537f
pow 4000b55698365054 4041000000000000 423172773963764b
pow 3ffe1621967d19e0 c036a00000000000 3ea4eeba99d556eb
pow 3ff6348fa836f042 0 3ff0000000000000
pow 3ffe33aa54ab8989 4041200000000000 41e4ffee9cc3d3a4
pow 4009b23b20a1f783 bff0000000000000 3fd3ecd4407b4482
pow 4006800e269e5055 4011800000000000 40570db656baa02d
pow 3ffb81c6f7e78586 c044000000000000 3dfa8eb59b75c27c
pow 3fefb73b7b203f82 c043d00000000000 3ff6c92f7d0f968f
pow 40053eb33ef10d28 4018000000000000 4075ebe9e24a920f
pow 4005d2c5cf9a61c8 c03de00000000000 3d3ada475ef7a40a
pow 3ff704375f7f2e22 4043000000000000 412e94ebb3c5a78e
pow 3ffed9cdcbf1b3d2 4018000000000000 4049b1ea9fea306f
pow 3febc4351a9bb095 4020000000000000 3fd490ca7f97013f
pow 4006f225e4383f23 c041800000000000 3c9bbf3fcea9ed6b
pow 3fefd250f1891bfc c01c000000000000 3ff0a38541944c86
pow 4007972bc67530a4 c03d800000000000 3d0f78fa7975ba90
pow 40019defefa93e94 c043800000000000 3d27f89bc7e7f3bb
pow 3fe16d584c711b23 c037800000000000 41384eadcc44e08a
pow 40097c1e34651845 401c000000000000 40aa02728ade7bce
pow 3ffed598a65d9793 403fe00000000000 41d1fbe2b7687039
pow 3ff883d735845f2e 4032000000000000 40a0eb91caa6a5d7
pow 3ffb5fb0dcdddfbe c035000000000000 3eea8d97b6b1e6d9
pow 3fec1f7ca44f407a 4035000000000000 3fb0ff58697036aa
pow 40032ef9bbb35fc7 c03f400000000000 3d77bc24a1b5ceca
pow 400a0d6de672d89b 4043000000000000 43fa7ca78810bf46
pow 3ffa486adb7d538d c018800000000000 3fa87db78afe4844
pow 400993a345f593bc c03d000000000000 3ce4bc27b82af45a
pow 3feebedd9eec5aed 4010000000000000 3feb450a74ca564b
pow 3ffe9feab90569b9 c026000000000000 3f49f0d815b6dc3b
pow 3ffb84bed6568d42 c03e400000000000 3e742cac1cb8971c
pow 3ff76b77bb83d091 4035000000000000 40a74efe29c22840
pow 4007dca6e0b6a3dc 4026c00000000000 410e9317a45790b4
pow 40014f9d3bb2983d 403d000000000000 41f3a0e7b249299b
pow 4007079c9644c154 c043400000000000 3c434ec7f2c53da4
pow 3fff17e74cb85b49 4042000000000000 4216bde00f768a7c
pow 40041f7e7551d98f 4009000000000000 4031dc32e3226edb
pow 400a4f3bee30ca69 4040000000000000 435f222d4ebdc2be
pow 3fea8ad3499c0f02 401c800000000000 3fd0e30467067fd9
pow 3ff0195173f33312 c018000000000000 3feed6a5dc978f98
pow 3ffffc004e6ce1a9 c001000000000000 3fcd5fe530852c9f
pow 3ff32207ee858ef3 c026000000000000 3fc1e73d51921868
pow 3ff8d3ae8d1b88df c036400000000000 3f0dcce1e07e4bce
pow 3fe97148b043cc58 4043000000000000 3f25884b8b0cd5ef
pow 4009e3e850cb906a 4042a00000000000 43e1510aa07ac5a4
pow 400552cad5dc2a2a c02e000000000000 3e9b8f61df85c56b
pow 3ff481e7b21c6d73 c036400000000000 3f705e3dafea3d9a
pow 3fec67dc97cba712 4036000000000000 3fb29d7519a1f523
pow 3ff302e50ed72740 4043800000000000 408a0a32e90b39fe
pow 3fe4e510905a7580 c043800000000000 416f9bbc2b225787
pow 400506b368e43e84 c03c600000000000 3d75bc5c79f9e7f4
pow 3ffc728726615421 c010000000000000 3fb99e4c0ed05ce8
pow 3ff1c797057a9474 c027400000000000 3fd2c7ed9fed1457
pow 40007718356a6a5a 4000000000000000 4010f1a6e3140494
pow 400877ce363eedae c043700000000000 3c03b7f029f86fc6
pow 4003e7379d3490c4 bff0000000000000 3fd9b979e9bae704
pow 400102734d418c0a c03ea00000000000 3dd97c2d9dd97ec7
pow 4008d71f66330da6 403a000000000000 4296a0447ccb5739
pow 3ffd7628555205ca c00a000000000000 3fc199aaae7c5e6a
pow 40018c820d334483 4014000000000000 4049655d4b0e1180
pow 3ff99998d3ca1d3c 402a800000000000 407fa824a41792c8
pow 3ff01ce9e704a42c 3ff0000000000000 3ff01ce9e704a42c
pow 4009fd8bd627c247 4030600000000000 41ac8fb1396dc3f9
pow 4003b5a7abd8e8a7 402e000000000000 4126d2921e768bd2
pow 3feb32cd0b023cec 4032c00000000000 3fa849f66ce609f9
pow 40023510419e9587 4018000000000000 40615f22bde63d43
pow 3fe6d9c8bbd8a0da c023400000000000 403990d00dc15834
pow 3ffe79a29f82a213 402a000000000000 40b0f6712177c161
pow 3ff71d0d96bd4416 c018000000000000 3fbc2b302a0ee3c7
pow 40058dd0b468798b c034000000000000 3e25259850d9ea81
pow 400680785f740c5c c025000000000000 3ef42c1deb81e8a6
pow 3ffe09373047f62a c028000000000000 3f411b80c4e7beda
pow 3fe23fd49432da46 4040500000000000 3e47b11b72cd9587
pow 40026addf17ade7a c032000000000000 3e94560ee38b2665
pow 3fe69581d7f00000 403e600000000000 3efa82100f0d5c5d
pow 3fe1d55e3c9ab235 c02a000000000000 409f3d4ef3f0f73e
pow 3fe46d5b2d1d817b 4037c00000000000 3ef896af443345c3
pow 3ff3974b71528983 402e000000000000 4034d8e1cd244ae3
pow 4000ce6161bedb01 403be00000000000 41cce0a87df0cfbf
pow 4007adec9bc5fd79 c036000000000000 3dc78ce4ce0637ae
pow 4003db15ab45e142 bfe8000000000000 3fe02ec7c137e54a
pow 3fe58c2177a67cbd c031000000000000 4089fbaf5a099096
pow 3fe4f70b7e225610 402fc00000000000 3f53e6f74ee7ea02
pow 3ffae1ae11153842 402a000000000000 408a8ee6ea5f047a
pow 3fedab6fbd847cb2 c012000000000000 3ff67c16607b9ba6
pow 3ffe5df7636848f6 403b000000000000 417f1e9a7791c0ff
pow 3ff742c66686e528 c03e200000000000 3eeaad9644ed364b
pow 3fea5976d63ddd96 402a000000000000 3fb47ad0e17039f8
pow 3ff92b8f357d8a63 4040300000000000 4141e5b0a28f88de
pow 400b8a62553df9a9 4008000000000000 404466426e518eab
pow 400a0cdab9a7b22e 4041c00000000000 43b61386be200ba3
pow 400bab9d38325091 0 3ff0000000000000
pow 3fe396e59a7b0dc5 c033c00000000000 40cf9f8e97be42dc
pow 400b077c9eb437d2 4040000000000000 437275ea9a127241
pow 4000b801e996d2a9 c030c00000000000 3ed23a630aecdece
pow 3ffe95677596c798 403b000000000000 4182d9c53c07691e
pow 4006c92da0b85a57 c037200000000000 3dc0e8afb3292137
pow 3ffb2c7db04325aa 4043000000000000 41c06bc94ad19d7a
pow 3ff4dec24baed72c c032c00000000000 3f7c16413672346f
pow 4002822ed418d454 4031000000000000 4137c9150e406c94
pow 3ff683f1cdcae07c 4038200000000000 40ada5778fc88b39
atan2 c00ff87edec2ae32 3fd1db6f30a60f8a bff80477eccabd75
atan2 beec4b782fe9e979 400c43f89909ea12 bed0043e9ab9725a
atan2 3ea7b4ea46328332 bf3fcee56f6f8415 40091f00240311bc
atan2 3fcefa1ce4cc0250 40ae4df3524f54bd 3f105ae5b881edf4
atan2 3f1fb4bfae4c22c9 c061d2af36bc5f8d 400921fae269ff94
atan2 c0b37433ddd34a8d bf99f2a988148dca bff92200aa176c35
atan2 4046aa58ac8ccd1a bf020457c1d33b90 3ff921fc1fc364d1
atan2 bfd1b20964c5a662 3fdf7a96ef763228 bfe0633d407f36d7
atan2 3f2514ca7596d981 3f32144932764bc7 3fe0e41628055b41
atan2 bfd3d5e75e802930 c0111a28a880310c c0088dc87ff945d2
atan2 40af9751b31890be bf8660a7d6bd49f4 3ff921fe299dfab3
atan2 3ffa5ed46db398c6 403c66a77973a46e 3fadadc8168c1c56
atan2 c037b27b1ea6ed1d bff1808a7f58f336 bff9deec22949a9c
atan2 3f2dc953e77a0025 c0b3866c3cc7bd9d 400921fb4e2a0429
atan2 beb75d1f1008e0dd 40070b41c7304062 bea038d72936a857
atan2 bf3558cdd0fdce00 c04a16c4b8c6ab05 c00921f80e64b4f3
atan2 bfdefc7f3e5d2b7a 400bb86ab7a3f496 bfc1c52071150099
atan2 3f3e38728139d4f4 bfb3f413966f3888 400915dd901d2480
atan2 4012ab84546097f0 400d950b50ccefbc 3fecd365b908e281
atan2 bfd4bbd2b3d39cd1 3ffe86ad35f0a6ea bfc58789124cfb30
atan2 4092523c4c071136 bec5862da8877576 3ff921fb54da8d91
atan2 bf9346847329e464 40462e1478a20eba bf3bcf3b2f036eaa
atan2 400f473a7b746a12 bf40068c4ed35e0f 3ff9227e7e00299d
atan2 bf96a27124afc684 bf3ea386c0d92113 bff97899e2a6aa46
atan2 3ed3b11a586371f5 3f19ce96d33596b8 3fa8661ae5a5778f
atan2 c004c7be3e7f3671 bf7060fd06c19ea4 bff928498c7932d6
atan2 4002cc1460ebedaf c0002195af90f045 40023d7858979902
atan2 bf3ac7bbf00dfabb bed27ace8cd713c6 bff94e24b02e6256
atan2 bfc32fadbe7ab49c 407ca1cbdb9c5800 bf357170679e5300
atan2 c0426099182c1661 3e8ef06a7c528c6a bff921fb5295301a
atan2 c069473aeb75f9d6 4001a3f0ab4d5d4a bff8f5523a4d05de
atan2 c04400ca65c223a6 40037aef20a12dfa bff828fb117f091d
atan2 bf83930ecce8f737 402f8bde8ca32ff8 bf43db1db1e7b33b
atan2 bf733ba3652a1424 bf3ad423d0b83833 bffa862f037bd346
atan2 3eca5a49921759eb 3fffe9546af2fedc 3eba6d023535f2e6
atan2 beccba8878f33acd c0761d0d6c04707b c00921fb52f79844
atan2 3ecabdebb85c2e88 c0054cf048c086fc 400921fab3916a90
atan2 c0548b3f447abc08 3fc954c203e279e8 bff9181e1bd4818e
atan2 bf714a2105cff93a 3fa9581ec667ae80 bfb5c702e4611517
atan2 c045eee3febe7ec8 4001a7fc2d49c3dd bff854135186f1db
atan2 400bbb508c812f9b bf42c05de0a81761 3ff922a86df4de5e
atan2 c064911ff5960af0 40813755a08dc0a7 bfd2930892b44860
atan2 4044b311765a2b00 c0aea039962a1516 40090c5ab552971c
atan2 3eceb73489911e58 3fdf9e7ed08e7d28 3edf15ec7ce10d76
atan2 3fdb09ea18774cf0 400185f5cdac2498 3fc863878bc34ad1
atan2 bf30f509d2310479 bf67fa9512332baa c0086d6a3432de99
atan2 3f14a51d994fc687 c0aab7465a5c2617 400921fb512cdeca
atan2 c04227ebb0192cc8 c0ad95312d400f47 c0090e57c79155d8
atan2 bfde83a4d00e2c4e bec86ca4ddaf4ce5 bff92201bb8a00fe
atan2 c071cae0939e8c93 bfddcc0a28f904e6 bff928ae37ab57c8
atan2 4060613858c54c39 3f9592118273210a 3ff92152c3f4b489
atan2 bfe16105046da2d8 c052a9552be9e139 c0091314e2e31d73
atan2 c017e2d3c26501d1 bee6c5e9c3de0b2d bff921fd3c690316
atan2 bf959f1999557c9f 4078659b68ea5487 bf0c5c11b2e77f99
atan2 4030e7f2cf5b6e54 c0a386f78b717c59 4009142131f7d0a3
atan2 3fa42f48d6b5c61a 3eb2ef23bfaebcc9 3ff921dd4fcf920e
atan2 beb83e79f014bb7a bf08a0e1641497e0 c008e30020fc19be
atan2 3efbdaf509ea5fc9 c01447920fb6b05f 400921f89500535d
atan2 bf941db3186d5194 3fdc7a719e9c171c bfa696c541c54d56
atan2 3ed0c2f0e87ca035 bed1ce7d76f681e8 40031762b7b97157
atan2 3f0752899c0b5180 3ed19260b888bde4 3ff7a15c4552ed92
atan2 3f709af0645fbb09 bed48a96f98758df 3ff926ee0f39303c
atan2 406a3d5a9a7397b5 bf99946e51fbd562 3ff922781c3db645
atan2 3fc9e0433ec2aa10 3f8c80259b708507 3ff80875db5cb645
atan2 bf03bb67cbfce408 c04476259d342bca c00921fad8d45d6e
atan2 c03fcbd6bd11c631 bed30d72d1be9b44 bff921fb7a9d9578
atan2 c03eca4f3dd0c814 3fd5e82694a9c666 bff8f472d3c688b5
atan2 409ece312a823f92 bfddc29cd8654a14 3ff922f2a49f0fb5
atan2 bf9249b22f474cb2 3f706df6841c57b5 bff5990d72fc4d0a
atan2 3fdf18420a431f9c becafb84eeb52fd8 3ff92202456b71dd
atan2 c0a33e4361739c1e 3ec6c2fe52119ebb bff921fb53f87967
atan2 c08db2e82eb693b5 3f5f6482ea884e15 bff921f93710f4dc
atan2 3fd60ff8458cb224 3f860ef4d3a340c0 3ff8a20bdd187edf
atan2 bef57b057e04ae06 3fdc7c383cba60a0 bf08218a6a3071a9
atan2 c039bce4fc364bd1 3fe5c742dca5e3c0 bff8b5b2ce888cf6
atan2 403ed2aad2e0ce79 bf2c1f2c0ab9b90c 3ff92202a0ca6c16
atan2 bf09f3c2bccc9395 bf73649f3a2ef430 c0090c922d1d0980
atan2 bf06e173c11fadb1 c0349b15aa7988ad c00921fa38010634
atan2 40a89b7b4e2a7802 3eea755a511f6d57 3ff921fb5330eb3a
atan2 3efafaa1016d8725 c048f0f62ae45f52 400921fb0f098ff7
atan2 bfee1e528b6f96bc bfda7d0497f5bdae bfffc2e5a4764d4b
atan2 bfa2b5ef4560a037 bfdef6ca04473c34 c0088794d56b3a0c
atan2 bed3a75bf40d7cce bf71a429d57e7e43 c0091fc0ebddd3ed
atan2 c093ec2ef9f1934d 3ee21f5595cc4fdf bff921fb527270ac
atan2 3eb8429bc4d2e2a2 3eb497ea0981d6f6 3febbe30c0d8d843
atan2 c003501efdb5fa96 bf74ce637420d700 bff92a99ac1b85c9
atan2 bf266006ee56952b c022b86f4b11f649 c00921f1c47339dd
atan2 40713ade34e29b4c bf8e9cea4618f6d4 3ff922342f3a0590
atan2 40ab4164158d1790 c0283e6d82c4eb86 3ff93036baa773ad
atan2 c0ae918ebb8261cd 3f62cf9d3cb31d9f bff921fab6bb47d8
atan2 bf71e55eb580a383 bfe217064beacb65 c009122753ee75d5
atan2 bf2c18626c2e113a 403ae7938be1a547 bee0b5447d767626
atan2 4042393568ca319f 3fdd62b810e50770 3ff8ee624e0968d9
atan2 c0041c90374ef479 bf6b6f5f202c17ce bff9277035b31df0
atan2 3fd69debab44c990 bf35dcc3fa0ec5b3 3ff925d92aeafd00
atan2 3ebb2e21de778371 bfc4d1302f6e36e2 400921f61b440a68
atan2 4032af7ab931ae99 c00d86794bed292f 3ffc40b8f40791dd
atan2 3f3b4109f76f8a19 c05643b3d8303c4e 400921f8e1862e23
atan2 bf2af9a46b6ac62f 40754bb5ebc26a50 bea4445f9aca0695
atan2 bef7b1f383e1a78c bec2108128e42ce6 bffaa723f43fd520
atan2 bed493bc49535656 3f93d244dbfa099d bf309c2b0132050c
atan2 40a3e681784a78bf bf0582ac030c3b8e 3ff921fb5897059b
atan2 3ff4e2f28156d441 bed00cf19422d9f1 3ff921fe672cc11e
atan2 bfaf8016cda9f3e8 c010c6383c4dd837 c00903f007039918
atan2 3ef7452b8569761f 40096cb1c4b83644 3edd49d68b5487a7
atan2 3ed23466d801d20a 3fc786393f3bbcd8 3ef8c38549325c6c
atan2 401070662f27b7ea 4043be564a01c3fd 3fba8c71fff2d2d6
atan2 40ade0cac2f7aef4 3f524f146a72de9a 3ff921fb05d45fcc
atan2 3f32b78f7de4ccdd 3ec88908fe8731ec 3ff8f80930c64ec7
atan2 3f4317712a4f60ae bf31d0cb3534eaf8 40000f0ffaefddd6
atan2 3f9e8d386d7fc394 4010065fdb903a54 3f7e80ec50fa1d2e
atan2 3eedaf005b9d682b 40005d63fed543e9 3edd059a6930c008
atan2 3ee73bd33996435b bf84271c41af1c7a 40091fad0e4c7aa1
atan2 c07a39f8536a49dd bfd2d721ac560cc8 bff924daf147ba3f
atan2 c075d272fa6c4cfb c0562de3f7578452 bffd1d2ca667c474
atan2 c006f8fd2b171dc8 bf6fe433e182c399 bff92788e1dffb2e
atan2 3fc5271d727f4c40 409d9ffd353951ca 3f16d93f1f48d0ad
atan2 3fa42d2f09196ed2 bf86e5a6da082d27 3ffd8e4d5d02498b
atan2 3f9e679a5880a070 406afaf606ddc228 3f2207ded564bcb3
atan2 40b0fdb62000291e 40127fed22b93ad3 3ff91da0685dd7df
atan2 c0ab40b4a3aae4eb 3fa58bd47560ecc4 bff921eeadf10258
atan2 bee2c085c3977190 405f3864c04a4adf be733869d5427c33
atan2 403636a0e206e8dd 3f639a56de860303 3ff9218a5f24505b
atan2 3f25836db7801f96 bfd38ae32537dc46 400920e182f758bd
atan2 3f7236829af3cb7b c0823968f25a8624 400921f754e71c67
atan2 c06d9d31631f665e 40aae0b9ec643d47 bfb199dd57fdcf5e
atan2 40053013f5f5de8a bf2a04391d6b5104 3ff92249ea2c5198
atan2 3ebaa459698d8721 c0b33d29077108be 400921fb54391907
atan2 c034de7ca1ae9ab2 4041a390184f64c7 bfe1181c8ccde40a
atan2 3f32f83685a9e9a4 c0a4944bd7218119 400921fb45849024
atan2 c00343c90fc6f664 3fd77e3d1a7387a6 bff6b6600d49bd00
atan2 40b14eddd2afc328 404021a1d63597d2 3ff9042866917680
atan2 4018ad7df90a92ee c0b0cf44478747eb 40091f0badab7c93
atan2 bf32cb524b0caccf 3f5a3f02daa1ee43 bfc6ac9b2a94a447
atan2 bf3bfee48b43aac3 40a0b343d22e3030 be8ad2613a3a6f10
atan2 c020cf749ca0152d bfc98da268e43f54 bff9833fc82f78d3
atan2 3ecbcdff31ed93a5 bf5da5328bb5bdc5 40091e3ae89fd0fe
atan2 3ea59bc36cf7e0ff bf575a7d6609089a 4009210e75453f19
atan2 404a48a54b1a737d 4045c2299b90a95e 3fec235ae381d087
atan2 3f090cb681dee58e 3f90765f6715f40d 3f68589343b7fad5
atan2 bf3963e026b24953 3ea79712554eafb8 bff91a8c85d1c167
atan2 3fc52c3cc5c99b68 bf73ebd19146511f 3ff99a615c33b65b
atan2 3f2d79316f3d6e7b 3eb1fb2635c883da 3ff90e759d9e6c9f
atan2 3febcbc22b056cdc 3ff34553c6f70ff4 3fe3fe6d77b515ae
atan2 c09b77fd60a37b41 c01207bcc4c93a9e bff92c7be6fe5157
atan2 bf5bcd3df7c2f52e 3f303a74528cea19 bff6d071f7bda487
atan2 c0a4808584d72d25 bfd219022337d6ae bff9226c51719574
atan2 bff97ba79a34552a 3fa8ded4987de905 bff8a518f5be5ed0
atan2 c0124f6be852fbb6 3fee2baf782ba6e4 bff5e1f87008becc
atan2 3efb89bc864b26d6 40125be274f2e484 3ed7ffebd0b200d5
atan2 7ff0000000000000 fff0000000000000 4002d97c7f3321d2
atan2 fff0000000000000 fff0000000000000 c002d97c7f3321d2
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+4
View File
@@ -110,6 +110,9 @@ pub struct QueryOptions {
/// - `fair`: Fair divides memory available after unspillable reservations
/// evenly among spillable reservations and may trigger earlier spills.
pub experimental_memory_pool_policy: QueryMemoryPoolPolicy,
/// Enables the experimental native PromQL execution path for compatible
/// instant queries over shared Metric raw series. Default: `false`.
pub experimental_native_promql: bool,
}
#[allow(clippy::derivable_impls)]
@@ -125,6 +128,7 @@ impl Default for QueryOptions {
experimental_spill_max_temp_directory_size: ReadableSize::gb(1),
experimental_spill_compression: QuerySpillCompression::Uncompressed,
experimental_memory_pool_policy: QueryMemoryPoolPolicy::Greedy,
experimental_native_promql: false,
}
}
}
+1
View File
@@ -3512,6 +3512,7 @@ experimental_spill_mode = "default"
experimental_spill_max_temp_directory_size = "1GiB"
experimental_spill_compression = "uncompressed"
experimental_memory_pool_policy = "greedy"
experimental_native_promql = false
[memory]
enable_heap_profiling = true
@@ -0,0 +1,19 @@
# Raw-series ordering schema metadata compatibility
`v1_metadata.json` is a hand-authored, frozen set of Arrow schema metadata maps
for the v1 raw-series frame. It records the established layout/content/labels/
time metadata and the new optional ordering entry. The Rust unit test parses
these literal maps through `raw_series_frame_ordering`; the fixture is not
produced by the schema builder.
Run the focused check:
```shell
cargo nextest run -p common-query -E 'test(raw_series_ordering_metadata_fixture)'
```
The fixture proves that absent ordering metadata defaults to `Contiguous`, the
two known values decode, and an unknown value is rejected. It does not prove
interoperability with an old binary, nor does it test an end-to-end client or
service. Separate pack/IPC tests check the declared ordering schema and batch
schema agreement for both orderings, including empty streams.
@@ -0,0 +1,45 @@
[
{
"name": "missing_defaults_to_contiguous",
"metadata": {
"greptime.series.layout": "v1",
"greptime.series.content": "raw",
"greptime.series.labels": "explicit",
"greptime.series.time": "timestamps"
},
"ordering": "contiguous"
},
{
"name": "known_contiguous",
"metadata": {
"greptime.series.layout": "v1",
"greptime.series.content": "raw",
"greptime.series.labels": "explicit",
"greptime.series.time": "timestamps",
"greptime.series.ordering": "contiguous"
},
"ordering": "contiguous"
},
{
"name": "known_read_key_then_time",
"metadata": {
"greptime.series.layout": "v1",
"greptime.series.content": "raw",
"greptime.series.labels": "explicit",
"greptime.series.time": "timestamps",
"greptime.series.ordering": "read_key_then_time"
},
"ordering": "read_key_then_time"
},
{
"name": "unknown_ordering_rejected",
"metadata": {
"greptime.series.layout": "v1",
"greptime.series.content": "raw",
"greptime.series.labels": "explicit",
"greptime.series.time": "timestamps",
"greptime.series.ordering": "future_value"
},
"ordering": null
}
]